From e7264954a20dd480a63cfba38d45a2e3ce31d095 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Mon, 28 Oct 2024 23:35:17 -0400 Subject: [PATCH 1/7] Updating vendored modules --- libs/CHANGELOG.md | 638 + libs/Flask_Cors-4.0.0.dist-info/RECORD | 12 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 29 +- libs/Flask_Cors-5.0.0.dist-info/RECORD | 12 + .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 7 +- .../RECORD | 18 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 libs/Flask_SocketIO-5.3.6.dist-info/RECORD | 10 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 7 +- libs/Flask_SocketIO-5.4.1.dist-info/RECORD | 10 + .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 libs/Jinja2-3.1.3.dist-info/RECORD | 34 - libs/Jinja2-3.1.3.dist-info/entry_points.txt | 2 - libs/Jinja2-3.1.3.dist-info/top_level.txt | 1 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 10 +- .../RECORD | 24 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../top_level.txt | 0 libs/Markdown-3.5.2.dist-info/LICENSE.md | 29 - .../INSTALLER | 0 libs/Markdown-3.7.dist-info/LICENSE.md | 30 + .../METADATA | 49 +- .../RECORD | 30 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../top_level.txt | 0 libs/MarkupSafe-2.1.5.dist-info/RECORD | 2 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 8 +- .../RECORD | 16 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 .../METADATA => README.md} | 30 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 7 +- .../RECORD | 261 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 libs/alembic-1.13.1.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 4 +- .../METADATA | 2 +- .../RECORD | 78 +- .../REQUESTED | 0 libs/alembic-1.13.3.dist-info/WHEEL | 5 + .../entry_points.txt | 0 .../top_level.txt | 0 libs/alembic/__init__.py | 2 +- libs/alembic/autogenerate/api.py | 6 +- libs/alembic/autogenerate/compare.py | 2 +- libs/alembic/autogenerate/render.py | 51 +- libs/alembic/command.py | 39 +- libs/alembic/config.py | 15 +- libs/alembic/ddl/_autogen.py | 26 +- libs/alembic/ddl/base.py | 9 +- libs/alembic/ddl/impl.py | 47 +- libs/alembic/ddl/mysql.py | 80 +- libs/alembic/ddl/oracle.py | 8 +- libs/alembic/ddl/postgresql.py | 3 +- libs/alembic/op.pyi | 21 +- libs/alembic/operations/base.py | 34 +- libs/alembic/operations/ops.py | 28 +- libs/alembic/operations/schemaobj.py | 10 +- libs/alembic/operations/toimpl.py | 16 +- libs/alembic/runtime/environment.py | 12 +- libs/alembic/runtime/migration.py | 18 +- libs/alembic/script/base.py | 28 +- libs/alembic/script/revision.py | 43 +- libs/alembic/templates/async/alembic.ini.mako | 7 +- .../templates/generic/alembic.ini.mako | 5 +- .../templates/multidb/alembic.ini.mako | 5 +- libs/alembic/testing/assertions.py | 17 +- libs/alembic/testing/fixtures.py | 28 +- .../testing/suite/test_autogen_computed.py | 1 + .../alembic/testing/suite/test_environment.py | 6 +- libs/alembic/util/langhelpers.py | 9 +- libs/alembic/util/messaging.py | 12 +- libs/alembic/util/sqla_compat.py | 8 +- libs/apprise-1.7.6.dist-info/RECORD | 183 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 139 +- libs/apprise-1.9.0.dist-info/RECORD | 191 + .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 0 .../top_level.txt | 0 libs/apprise/Apprise.py | 14 +- libs/apprise/__init__.py | 39 +- libs/apprise/apprise.py | 887 + libs/apprise/apprise.pyi | 62 + ...iseAttachment.py => apprise_attachment.py} | 15 +- ...eAttachment.pyi => apprise_attachment.pyi} | 0 .../{AppriseConfig.py => apprise_config.py} | 4 +- .../{AppriseConfig.pyi => apprise_config.pyi} | 0 libs/apprise/{AppriseAsset.py => asset.py} | 111 +- libs/apprise/{AppriseAsset.pyi => asset.pyi} | 0 libs/apprise/attachment/__init__.py | 5 +- .../attachment/{AttachBase.py => base.py} | 86 +- .../attachment/{AttachBase.pyi => base.pyi} | 0 .../attachment/{AttachFile.py => file.py} | 15 +- .../attachment/{AttachHTTP.py => http.py} | 14 +- libs/apprise/attachment/memory.py | 231 + libs/apprise/cli.py | 475 +- libs/apprise/common.py | 36 + libs/apprise/config/__init__.py | 5 +- .../apprise/config/{ConfigBase.py => base.py} | 8 +- .../config/{ConfigBase.pyi => base.pyi} | 0 .../apprise/config/{ConfigFile.py => file.py} | 12 +- .../apprise/config/{ConfigHTTP.py => http.py} | 6 +- .../config/{ConfigMemory.py => memory.py} | 4 +- libs/apprise/conversion.py | 6 +- .../{CustomNotifyPlugin.py => base.py} | 10 +- libs/apprise/decorators/notify.py | 2 +- libs/apprise/exception.py | 53 + libs/apprise/i18n/en/LC_MESSAGES/apprise.mo | Bin 3959 -> 3959 bytes libs/apprise/{AppriseLocale.py => locale.py} | 0 libs/apprise/manager.py | 86 +- ...chmentManager.py => manager_attachment.py} | 5 + ...figurationManager.py => manager_config.py} | 5 + ...ificationManager.py => manager_plugins.py} | 6 + libs/apprise/persistent_store.py | 1676 + libs/apprise/plugins/__init__.py | 8 +- libs/apprise/plugins/africas_talking.py | 470 + .../{NotifyAppriseAPI.py => apprise_api.py} | 48 +- .../plugins/{NotifyAprs.py => aprs.py} | 15 +- .../plugins/{NotifyBark.py => bark.py} | 18 +- .../plugins/{NotifyBase.py => base.py} | 81 +- .../plugins/{NotifyBase.pyi => base.pyi} | 0 .../plugins/{NotifyBoxcar.py => boxcar.py} | 15 +- .../plugins/{NotifyBulkSMS.py => bulksms.py} | 21 +- .../plugins/{NotifyBulkVS.py => bulkvs.py} | 15 +- .../{NotifyBurstSMS.py => burstsms.py} | 15 +- .../{NotifyChantify.py => chantify.py} | 13 +- .../{NotifyClickSend.py => clicksend.py} | 36 +- .../plugins/{NotifyForm.py => custom_form.py} | 135 +- .../plugins/{NotifyJSON.py => custom_json.py} | 157 +- .../plugins/{NotifyXML.py => custom_xml.py} | 168 +- .../{NotifyD7Networks.py => d7networks.py} | 13 +- .../plugins/{NotifyDapnet.py => dapnet.py} | 15 +- .../plugins/{NotifyDBus.py => dbus.py} | 9 +- .../{NotifyDingTalk.py => dingtalk.py} | 15 +- .../plugins/{NotifyDiscord.py => discord.py} | 15 +- .../plugins/{NotifyEmail.py => email.py} | 38 +- .../plugins/{NotifyEmby.py => emby.py} | 18 +- .../plugins/{NotifyEnigma2.py => enigma2.py} | 20 +- .../plugins/{NotifyFCM => fcm}/__init__.py | 15 +- .../plugins/{NotifyFCM => fcm}/color.py | 2 +- .../plugins/{NotifyFCM => fcm}/common.py | 0 .../plugins/{NotifyFCM => fcm}/oauth.py | 0 .../plugins/{NotifyFCM => fcm}/priority.py | 0 .../plugins/{NotifyFeishu.py => feishu.py} | 13 +- .../plugins/{NotifyFlock.py => flock.py} | 13 +- .../{NotifyFreeMobile.py => freemobile.py} | 14 +- .../plugins/{NotifyGnome.py => gnome.py} | 8 +- .../{NotifyGoogleChat.py => google_chat.py} | 16 +- .../plugins/{NotifyGotify.py => gotify.py} | 18 +- .../plugins/{NotifyGrowl.py => growl.py} | 19 +- .../plugins/{NotifyGuilded.py => guilded.py} | 5 +- ...tifyHomeAssistant.py => home_assistant.py} | 28 +- .../plugins/{NotifyHttpSMS.py => httpsms.py} | 13 +- .../plugins/{NotifyIFTTT.py => ifttt.py} | 13 +- .../plugins/{NotifyJoin.py => join.py} | 13 +- .../{NotifyKavenegar.py => kavenegar.py} | 13 +- .../plugins/{NotifyKumulos.py => kumulos.py} | 13 +- .../{NotifyLametric.py => lametric.py} | 36 +- .../plugins/{NotifyLine.py => line.py} | 15 +- .../plugins/{NotifyLunaSea.py => lunasea.py} | 24 +- .../plugins/{NotifyMacOSX.py => macosx.py} | 8 +- .../plugins/{NotifyMailgun.py => mailgun.py} | 23 +- .../{NotifyMastodon.py => mastodon.py} | 20 +- .../plugins/{NotifyMatrix.py => matrix.py} | 134 +- .../{NotifyMattermost.py => mattermost.py} | 36 +- .../{NotifyMessageBird.py => messagebird.py} | 13 +- .../plugins/{NotifyMisskey.py => misskey.py} | 16 +- .../plugins/{NotifyMQTT.py => mqtt.py} | 41 +- .../plugins/{NotifyMSG91.py => msg91.py} | 13 +- .../plugins/{NotifyMSTeams.py => msteams.py} | 26 +- .../{NotifyNextcloud.py => nextcloud.py} | 18 +- ...otifyNextcloudTalk.py => nextcloudtalk.py} | 18 +- .../plugins/{NotifyNotica.py => notica.py} | 19 +- .../{NotifyNotifiarr.py => notifiarr.py} | 103 +- .../{NotifyNotifico.py => notifico.py} | 13 +- .../plugins/{NotifyNtfy.py => ntfy.py} | 84 +- .../{NotifyOffice365.py => office365.py} | 18 +- .../{NotifyOneSignal.py => one_signal.py} | 160 +- .../{NotifyOpsgenie.py => opsgenie.py} | 421 +- .../{NotifyPagerDuty.py => pagerduty.py} | 18 +- .../{NotifyPagerTree.py => pagertree.py} | 13 +- ...otifyParsePlatform.py => parseplatform.py} | 17 +- ...tifyPopcornNotify.py => popcorn_notify.py} | 13 +- .../plugins/{NotifyProwl.py => prowl.py} | 13 +- .../{NotifyPushBullet.py => pushbullet.py} | 20 +- .../{NotifyPushDeer.py => pushdeer.py} | 16 +- .../plugins/{NotifyPushed.py => pushed.py} | 15 +- .../plugins/{NotifyPushjet.py => pushjet.py} | 18 +- .../plugins/{NotifyPushMe.py => pushme.py} | 13 +- .../{NotifyPushover.py => pushover.py} | 15 +- .../{NotifyPushSafer.py => pushsafer.py} | 57 +- .../plugins/{NotifyPushy.py => pushy.py} | 13 +- .../plugins/{NotifyReddit.py => reddit.py} | 18 +- .../plugins/{NotifyRevolt.py => revolt.py} | 13 +- .../{NotifyRocketChat.py => rocketchat.py} | 23 +- .../plugins/{NotifyRSyslog.py => rsyslog.py} | 17 +- .../plugins/{NotifyRyver.py => ryver.py} | 13 +- .../{NotifySendGrid.py => sendgrid.py} | 59 +- .../{NotifyServerChan.py => serverchan.py} | 15 +- libs/apprise/plugins/{NotifySES.py => ses.py} | 25 +- libs/apprise/plugins/sfr.py | 443 + .../{NotifySignalAPI.py => signal_api.py} | 41 +- .../{NotifySimplePush.py => simplepush.py} | 15 +- .../plugins/{NotifySinch.py => sinch.py} | 18 +- .../plugins/{NotifySlack.py => slack.py} | 255 +- .../{NotifySMSEagle.py => smseagle.py} | 50 +- .../{NotifySMSManager.py => smsmanager.py} | 13 +- .../plugins/{NotifySMTP2Go.py => smtp2go.py} | 51 +- libs/apprise/plugins/{NotifySNS.py => sns.py} | 18 +- .../{NotifySparkPost.py => sparkpost.py} | 55 +- libs/apprise/plugins/splunk.py | 500 + .../{NotifyStreamlabs.py => streamlabs.py} | 17 +- .../{NotifySynology.py => synology.py} | 19 +- .../plugins/{NotifySyslog.py => syslog.py} | 8 +- ...{NotifyTechulusPush.py => techuluspush.py} | 13 +- .../{NotifyTelegram.py => telegram.py} | 52 +- .../plugins/{NotifyThreema.py => threema.py} | 15 +- .../plugins/{NotifyTwilio.py => twilio.py} | 108 +- .../plugins/{NotifyTwist.py => twist.py} | 18 +- .../plugins/{NotifyTwitter.py => twitter.py} | 30 +- .../plugins/{NotifyVoipms.py => voipms.py} | 15 +- .../plugins/{NotifyVonage.py => vonage.py} | 15 +- .../{NotifyWebexTeams.py => webexteams.py} | 13 +- .../{NotifyWeComBot.py => wecombot.py} | 13 +- .../{NotifyWhatsApp.py => whatsapp.py} | 13 +- .../plugins/{NotifyWindows.py => windows.py} | 8 +- libs/apprise/plugins/workflows.py | 577 + libs/apprise/plugins/wxpusher.py | 374 + .../plugins/{NotifyXBMC.py => xbmc.py} | 25 +- .../plugins/{NotifyZulip.py => zulip.py} | 16 +- libs/apprise/{URLBase.py => url.py} | 179 +- libs/apprise/{URLBase.pyi => url.pyi} | 0 libs/apprise/utils.py | 190 +- libs/attr/__init__.py | 47 +- libs/attr/__init__.pyi | 435 +- libs/attr/_cmp.py | 40 +- libs/attr/_cmp.pyi | 14 +- libs/attr/_compat.py | 18 +- libs/attr/_funcs.py | 309 +- libs/attr/_make.py | 1135 +- libs/attr/_next_gen.py | 464 +- libs/attr/converters.py | 93 +- libs/attr/converters.pyi | 2 +- libs/attr/filters.py | 28 +- libs/attr/filters.pyi | 6 +- libs/attr/setters.py | 14 +- libs/attr/setters.pyi | 3 +- libs/attr/validators.py | 350 +- libs/attr/validators.pyi | 49 +- libs/attrs-23.2.0.dist-info/RECORD | 37 - .../INSTALLER | 0 .../METADATA | 136 +- libs/attrs-24.2.0.dist-info/RECORD | 37 + .../REQUESTED | 0 .../WHEEL | 2 +- .../licenses/LICENSE | 0 libs/attrs/__init__.py | 2 + libs/attrs/__init__.pyi | 243 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 13 +- .../RECORD | 21 +- .../REQUESTED | 0 .../WHEEL | 2 +- libs/babelfish/compat.py | 37 + libs/babelfish/converters/__init__.py | 2 +- libs/babelfish/country.py | 2 +- libs/babelfish/language.py | 2 +- libs/babelfish/script.py | 2 +- .../RECORD | 2 +- .../WHEEL | 2 +- .../METADATA | 4 +- .../backports.zoneinfo-0.2.1.dist-info/RECORD | 6 +- libs/backports.zoneinfo-0.2.1.dist-info/WHEEL | 2 +- .../zoneinfo/_czoneinfo.cpython-38-darwin.so | Bin 0 -> 37616 bytes libs/beautifulsoup4-4.12.3.dist-info/METADATA | 2 +- libs/beautifulsoup4-4.12.3.dist-info/RECORD | 4 +- libs/beautifulsoup4-4.12.3.dist-info/WHEEL | 2 +- libs/bidict-0.23.1.dist-info/RECORD | 2 +- libs/bidict-0.23.1.dist-info/WHEEL | 2 +- libs/bin/ftfy | 8 + libs/blinker-1.7.0.dist-info/METADATA | 62 - libs/blinker-1.7.0.dist-info/RECORD | 11 - .../INSTALLER | 0 .../LICENSE.txt} | 0 libs/blinker-1.8.2.dist-info/METADATA | 60 + libs/blinker-1.8.2.dist-info/RECORD | 10 + .../REQUESTED | 0 .../WHEEL | 0 libs/blinker/__init__.py | 61 +- libs/blinker/_saferef.py | 230 - libs/blinker/_utilities.py | 119 +- libs/blinker/base.py | 707 +- libs/certifi-2024.2.2.dist-info/RECORD | 12 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 3 +- libs/certifi-2024.8.30.dist-info/RECORD | 12 + .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 libs/certifi/__init__.py | 2 +- libs/certifi/cacert.pem | 195 +- libs/chardet-5.2.0.dist-info/RECORD | 2 +- libs/chardet-5.2.0.dist-info/WHEEL | 2 +- .../charset_normalizer-3.3.2.dist-info/RECORD | 22 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 16 +- .../charset_normalizer-3.4.0.dist-info/RECORD | 22 + .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 0 .../top_level.txt | 0 libs/charset_normalizer/api.py | 78 +- libs/charset_normalizer/cli/__main__.py | 36 +- libs/charset_normalizer/constant.py | 2 + libs/charset_normalizer/legacy.py | 15 +- libs/charset_normalizer/md.py | 19 +- libs/charset_normalizer/models.py | 35 +- libs/charset_normalizer/version.py | 2 +- libs/colorama-0.4.6.dist-info/METADATA | 2 +- libs/colorama-0.4.6.dist-info/RECORD | 4 +- libs/colorama-0.4.6.dist-info/WHEEL | 2 +- libs/dateutil/__init__.py | 16 + libs/dateutil/_version.py | 4 +- libs/dateutil/parser/isoparser.py | 2 +- libs/dateutil/relativedelta.py | 2 +- libs/dateutil/rrule.py | 2 +- libs/dateutil/tz/tz.py | 2 +- .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 174394 -> 156385 bytes .../deep_translator-1.11.4.dist-info/METADATA | 1 + libs/deep_translator-1.11.4.dist-info/RECORD | 4 +- libs/deep_translator-1.11.4.dist-info/WHEEL | 2 +- libs/dnspython-2.6.1.dist-info/METADATA | 2 +- libs/dnspython-2.6.1.dist-info/RECORD | 4 +- libs/dnspython-2.6.1.dist-info/WHEEL | 2 +- libs/dogpile.cache-1.3.2.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- .../RECORD | 24 +- .../REQUESTED | 0 libs/dogpile.cache-1.3.3.dist-info/WHEEL | 5 + .../entry_points.txt | 0 .../top_level.txt | 0 libs/dogpile/__init__.py | 2 +- libs/dogpile/cache/api.py | 18 +- libs/dogpile/cache/backends/memcached.py | 88 +- libs/dogpile/cache/region.py | 14 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 7 +- .../RECORD | 78 +- .../REQUESTED | 0 .../WHEEL | 0 .../box-LICENSE.txt | 0 .../click-LICENSE.rst | 0 .../entry_points.txt | 0 .../licenses.sh | 0 .../python-dotenv-LICENSE.txt | 0 .../ruamel.yaml-LICENSE.txt | 0 .../toml-LICENSE.txt | 0 .../tomli-LICENSE.txt | 0 .../top_level.txt | 0 .../vendor_versions.txt | 0 libs/dynaconf/__init__.py | 16 +- libs/dynaconf/base.py | 26 +- libs/dynaconf/cli.py | 32 +- libs/dynaconf/contrib/__init__.py | 6 +- libs/dynaconf/contrib/django_dynaconf_v2.py | 2 +- libs/dynaconf/contrib/flask_dynaconf.py | 3 +- libs/dynaconf/default_settings.py | 8 +- libs/dynaconf/hooking.py | 65 +- libs/dynaconf/loaders/__init__.py | 9 +- libs/dynaconf/loaders/base.py | 3 +- libs/dynaconf/loaders/ini_loader.py | 1 - libs/dynaconf/loaders/json_loader.py | 1 - libs/dynaconf/loaders/py_loader.py | 1 - libs/dynaconf/loaders/vault_loader.py | 3 +- libs/dynaconf/loaders/yaml_loader.py | 10 +- libs/dynaconf/strategies/filtering.py | 16 +- libs/dynaconf/utils/__init__.py | 9 +- libs/dynaconf/utils/boxing.py | 16 +- libs/dynaconf/utils/inspect.py | 8 +- libs/dynaconf/utils/parse_conf.py | 50 +- libs/dynaconf/validator.py | 4 +- libs/dynaconf/validator_conditions.py | 1 + libs/engineio/async_client.py | 2 +- libs/engineio/async_drivers/asgi.py | 33 +- libs/engineio/async_drivers/eventlet.py | 2 +- libs/engineio/async_server.py | 46 +- libs/engineio/client.py | 5 +- libs/engineio/server.py | 39 +- libs/enzyme-0.4.1.dist-info/LICENSE | 13 - libs/enzyme-0.4.1.dist-info/METADATA | 84 - libs/enzyme-0.4.1.dist-info/RECORD | 20 - .../INSTALLER | 0 libs/enzyme-0.5.2.dist-info/LICENSE | 22 + libs/enzyme-0.5.2.dist-info/METADATA | 70 + libs/enzyme-0.5.2.dist-info/RECORD | 15 + .../REQUESTED | 0 libs/enzyme-0.5.2.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/enzyme/__init__.py | 11 +- libs/enzyme/compat.py | 13 - libs/enzyme/exceptions.py | 8 +- libs/enzyme/mkv.py | 344 +- libs/enzyme/parsers/__init__.py | 1 - libs/enzyme/parsers/ebml/__init__.py | 1 - libs/enzyme/parsers/ebml/core.py | 105 +- libs/enzyme/parsers/ebml/readers.py | 112 +- libs/enzyme/tests/__init__.py | 10 - libs/enzyme/tests/parsers/ebml/test1.mkv.yml | 2974 -- libs/enzyme/tests/test_mkv.py | 607 - libs/enzyme/tests/test_parsers.py | 122 - libs/fcache-0.5.2.dist-info/METADATA | 2 +- libs/fcache-0.5.2.dist-info/RECORD | 4 +- libs/fcache-0.5.2.dist-info/WHEEL | 2 +- libs/fese-0.3.0.dist-info/RECORD | 2 +- libs/fese-0.3.0.dist-info/WHEEL | 2 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 3 +- .../RECORD | 24 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../top_level.txt | 0 libs/ffsubsync/_version.py | 8 +- libs/ffsubsync/ffmpeg_utils.py | 4 + libs/ffsubsync/ffsubsync.py | 48 +- libs/ffsubsync/speech_transformers.py | 2 + .../INSTALLER | 0 .../LICENSE.txt} | 0 .../METADATA | 91 +- .../RECORD | 30 +- .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 0 libs/flask/app.py | 10 + libs/flask/blueprints.py | 38 + libs/flask/cli.py | 6 +- libs/flask/config.py | 6 +- libs/flask/json/tag.py | 1 + libs/flask/sansio/app.py | 4 - libs/flask/sansio/scaffold.py | 12 +- libs/flask/sessions.py | 10 +- libs/flask_cors/core.py | 8 +- libs/flask_cors/extension.py | 26 +- libs/flask_cors/version.py | 2 +- libs/flask_migrate/__init__.py | 12 +- libs/flask_migrate/cli.py | 15 +- libs/flask_socketio/__init__.py | 13 +- libs/flask_socketio/namespace.py | 2 +- libs/ftfy-6.1.3.dist-info/RECORD | 20 - .../INSTALLER | 0 .../LICENSE.txt | 0 libs/ftfy-6.2.3.dist-info/METADATA | 165 + libs/ftfy-6.2.3.dist-info/RECORD | 18 + .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 libs/ftfy/__init__.py | 53 +- libs/ftfy/bad_codecs/__init__.py | 9 +- libs/ftfy/bad_codecs/sloppy.py | 28 +- libs/ftfy/bad_codecs/utf8_variants.py | 29 +- libs/ftfy/badness.py | 6 +- libs/ftfy/chardata.py | 16 +- libs/ftfy/cli.py | 8 +- libs/ftfy/fixes.py | 61 +- libs/ftfy/formatting.py | 8 +- libs/ga4mp-2.0.4.dist-info/METADATA | 1 + libs/ga4mp-2.0.4.dist-info/RECORD | 4 +- libs/ga4mp-2.0.4.dist-info/WHEEL | 2 +- libs/guessit-3.8.0.dist-info/METADATA | 32 +- libs/guessit-3.8.0.dist-info/RECORD | 4 +- libs/guessit-3.8.0.dist-info/WHEEL | 2 +- libs/h11-0.14.0.dist-info/METADATA | 2 +- libs/h11-0.14.0.dist-info/RECORD | 4 +- libs/h11-0.14.0.dist-info/WHEEL | 2 +- .../INSTALLER | 0 .../LICENSE.md | 2 +- .../METADATA | 23 +- libs/idna-3.10.dist-info/RECORD | 15 + .../REQUESTED | 0 .../WHEEL | 0 libs/idna-3.6.dist-info/RECORD | 15 - libs/idna/__init__.py | 3 +- libs/idna/codec.py | 58 +- libs/idna/compat.py | 10 +- libs/idna/core.py | 289 +- libs/idna/idnadata.py | 5593 ++-- libs/idna/intranges.py | 11 +- libs/idna/package_data.py | 3 +- libs/idna/uts46data.py | 16439 +++++----- .../importlib_metadata-7.0.1.dist-info/RECORD | 18 - libs/importlib_metadata-7.0.1.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 55 +- .../importlib_metadata-7.2.1.dist-info/RECORD | 20 + .../REQUESTED | 0 libs/importlib_metadata-7.2.1.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/importlib_metadata/__init__.py | 142 +- libs/importlib_metadata/_meta.py | 47 +- .../compat}/__init__.py | 0 libs/importlib_metadata/compat/py311.py | 22 + .../{_py39compat.py => compat/py39.py} | 7 +- .../RECORD | 50 - .../importlib_resources-6.1.2.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 46 +- .../RECORD | 38 + .../REQUESTED | 0 .../importlib_resources-6.4.5.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/importlib_resources/__init__.py | 28 +- libs/importlib_resources/_common.py | 16 +- libs/importlib_resources/_functional.py | 81 + libs/importlib_resources/compat/py39.py | 4 +- libs/importlib_resources/future/adapters.py | 51 +- libs/importlib_resources/readers.py | 25 +- libs/importlib_resources/simple.py | 2 +- libs/importlib_resources/tests/_compat.py | 32 - libs/importlib_resources/tests/_path.py | 50 +- .../subdirectory => compat}/__init__.py | 0 .../importlib_resources/tests/compat/py312.py | 18 + libs/importlib_resources/tests/compat/py39.py | 13 + .../tests/data01/binary.file | Bin 4 -> 0 bytes .../tests/data01/subdirectory/binary.file | 1 - .../tests/data01/utf-16.file | Bin 44 -> 0 bytes .../tests/data01/utf-8.file | 1 - .../tests/data02/one/__init__.py | 0 .../tests/data02/one/resource1.txt | 1 - .../subdirectory/subsubdir/resource.txt | 1 - .../tests/data02/two/__init__.py | 0 .../tests/data02/two/resource2.txt | 1 - .../tests/namespacedata01/binary.file | Bin 4 -> 0 bytes .../namespacedata01/subdirectory/binary.file | 1 - .../tests/namespacedata01/utf-16.file | Bin 44 -> 0 bytes .../tests/namespacedata01/utf-8.file | 1 - .../tests/test_contents.py | 15 +- libs/importlib_resources/tests/test_custom.py | 2 +- libs/importlib_resources/tests/test_files.py | 161 +- .../tests/test_functional.py | 255 + libs/importlib_resources/tests/test_open.py | 15 +- libs/importlib_resources/tests/test_path.py | 5 +- libs/importlib_resources/tests/test_read.py | 14 +- libs/importlib_resources/tests/test_reader.py | 48 +- .../tests/test_resource.py | 58 +- libs/importlib_resources/tests/util.py | 77 +- libs/importlib_resources/tests/zip.py | 26 +- libs/inflect-7.0.0.dist-info/RECORD | 12 - libs/inflect-7.0.0.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 71 +- libs/inflect-7.4.0.dist-info/RECORD | 11 + .../REQUESTED | 0 libs/inflect-7.4.0.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/inflect/__init__.py | 418 +- libs/inflect/compat/py38.py | 7 + libs/inflect/compat/pydantic.py | 19 - libs/inflect/compat/pydantic1.py | 8 - libs/itsdangerous-2.1.2.dist-info/METADATA | 94 - libs/itsdangerous-2.1.2.dist-info/RECORD | 16 - .../top_level.txt | 1 - .../INSTALLER | 0 .../LICENSE.txt} | 0 libs/itsdangerous-2.2.0.dist-info/METADATA | 60 + libs/itsdangerous-2.2.0.dist-info/RECORD | 15 + .../REQUESTED | 0 .../WHEEL | 0 libs/itsdangerous/__init__.py | 21 +- libs/itsdangerous/_json.py | 8 +- libs/itsdangerous/encoding.py | 14 +- libs/itsdangerous/exc.py | 29 +- libs/itsdangerous/serializer.py | 215 +- libs/itsdangerous/signer.py | 63 +- libs/itsdangerous/timed.py | 84 +- libs/itsdangerous/url_safe.py | 23 +- .../INSTALLER | 0 .../LICENSE.txt} | 0 .../METADATA | 65 +- libs/jinja2-3.1.4.dist-info/RECORD | 33 + .../REQUESTED | 0 .../WHEEL | 0 libs/jinja2-3.1.4.dist-info/entry_points.txt | 3 + libs/jinja2/__init__.py | 3 +- libs/jinja2/async_utils.py | 2 +- libs/jinja2/bccache.py | 10 +- libs/jinja2/compiler.py | 24 +- libs/jinja2/environment.py | 48 +- libs/jinja2/ext.py | 19 +- libs/jinja2/filters.py | 80 +- libs/jinja2/lexer.py | 4 +- libs/jinja2/loaders.py | 10 +- libs/jinja2/meta.py | 1 + libs/jinja2/nodes.py | 4 +- libs/jinja2/optimizer.py | 1 + libs/jinja2/parser.py | 19 +- libs/jinja2/runtime.py | 13 +- libs/jinja2/sandbox.py | 9 +- libs/jinja2/tests.py | 5 +- libs/jinja2/utils.py | 4 +- libs/jinja2/visitor.py | 4 +- libs/jsonschema-4.17.3.dist-info/METADATA | 2 +- libs/jsonschema-4.17.3.dist-info/RECORD | 4 +- libs/jsonschema-4.17.3.dist-info/WHEEL | 2 +- libs/mako/__init__.py | 2 +- libs/mako/codegen.py | 26 +- libs/mako/lexer.py | 2 +- libs/mako/pyparser.py | 16 + libs/markdown/__meta__.py | 2 +- libs/markdown/blockprocessors.py | 5 + libs/markdown/extensions/abbr.py | 148 +- libs/markdown/extensions/attr_list.py | 86 +- libs/markdown/extensions/fenced_code.py | 15 +- libs/markdown/extensions/smarty.py | 2 +- libs/markdown/extensions/toc.py | 104 +- .../markupsafe/_speedups.cpython-38-darwin.so | Bin 0 -> 18712 bytes libs/msgpack-1.0.7.dist-info/RECORD | 23 - .../COPYING | 0 .../INSTALLER | 0 .../METADATA | 131 +- libs/msgpack-1.1.0.dist-info/RECORD | 12 + .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 libs/msgpack/__init__.py | 16 +- libs/msgpack/_cmsgpack.cpp | 25187 ---------------- libs/msgpack/_cmsgpack.cpython-38-darwin.so | Bin 0 -> 181448 bytes libs/msgpack/_cmsgpack.pyx | 11 - libs/msgpack/_packer.pyx | 374 - libs/msgpack/_unpacker.pyx | 547 - libs/msgpack/buff_converter.h | 8 - libs/msgpack/ext.py | 8 +- libs/msgpack/fallback.py | 80 +- libs/msgpack/pack.h | 89 - libs/msgpack/pack_template.h | 820 - libs/msgpack/sysdep.h | 194 - libs/msgpack/unpack.h | 391 - libs/msgpack/unpack_define.h | 95 - libs/msgpack/unpack_template.h | 464 - libs/platformdirs-4.2.0.dist-info/RECORD | 15 - .../INSTALLER | 0 .../METADATA | 38 +- libs/platformdirs-4.3.6.dist-info/RECORD | 15 + .../REQUESTED | 0 .../WHEEL | 2 +- .../licenses/LICENSE | 0 libs/platformdirs/__init__.py | 94 +- libs/platformdirs/__main__.py | 2 +- libs/platformdirs/android.py | 68 +- libs/platformdirs/api.py | 39 +- libs/platformdirs/macos.py | 25 +- libs/platformdirs/unix.py | 43 +- libs/platformdirs/version.py | 4 +- libs/platformdirs/windows.py | 35 +- libs/pvectorc.cpython-38-darwin.so | Bin 0 -> 39120 bytes libs/pycountry-23.12.11.dist-info/METADATA | 384 - libs/pycountry-23.12.11.dist-info/WHEEL | 4 - .../INSTALLER | 0 .../LICENSE.txt | 0 libs/pycountry-24.6.1.dist-info/METADATA | 410 + .../RECORD | 227 +- .../REQUESTED | 0 libs/pycountry-24.6.1.dist-info/WHEEL | 4 + libs/pycountry/COPYRIGHT.txt | 46 + libs/pycountry/__init__.py | 14 +- libs/pycountry/databases/iso3166-2.json | 3537 +-- libs/pycountry/db.py | 30 +- .../locales/ach/LC_MESSAGES/iso3166-1.mo | Bin 9088 -> 9144 bytes .../locales/ast/LC_MESSAGES/iso639-5.mo | Bin 372 -> 4029 bytes .../locales/be/LC_MESSAGES/iso3166-2.mo | Bin 201179 -> 194548 bytes .../locales/bg/LC_MESSAGES/iso3166-2.mo | Bin 15126 -> 15883 bytes .../locales/bn/LC_MESSAGES/iso639-5.mo | Bin 1205 -> 5688 bytes .../locales/bn_IN/LC_MESSAGES/iso3166-1.mo | Bin 35713 -> 36015 bytes .../locales/cs/LC_MESSAGES/iso639-5.mo | Bin 371 -> 3971 bytes .../locales/cy/LC_MESSAGES/iso3166-2.mo | Bin 35290 -> 34985 bytes .../locales/cy/LC_MESSAGES/iso639-5.mo | Bin 1419 -> 2109 bytes .../locales/da/LC_MESSAGES/iso3166-2.mo | Bin 135392 -> 134479 bytes .../locales/da/LC_MESSAGES/iso639-5.mo | Bin 910 -> 3961 bytes .../locales/de/LC_MESSAGES/iso3166-2.mo | Bin 219517 -> 212230 bytes .../locales/de/LC_MESSAGES/iso639-3.mo | Bin 395556 -> 395660 bytes .../locales/el/LC_MESSAGES/iso639-5.mo | Bin 1951 -> 2391 bytes .../locales/en/LC_MESSAGES/iso3166-2.mo | Bin 91227 -> 90768 bytes .../locales/eo/LC_MESSAGES/iso3166-2.mo | Bin 47595 -> 46967 bytes .../locales/eo/LC_MESSAGES/iso639-5.mo | Bin 5484 -> 6705 bytes .../locales/es/LC_MESSAGES/iso3166-1.mo | Bin 23741 -> 24037 bytes .../locales/es/LC_MESSAGES/iso3166-2.mo | Bin 15724 -> 15680 bytes .../locales/es/LC_MESSAGES/iso3166-3.mo | Bin 2796 -> 2927 bytes .../locales/es/LC_MESSAGES/iso4217.mo | Bin 8923 -> 9745 bytes .../locales/et/LC_MESSAGES/iso3166-2.mo | Bin 5140 -> 12218 bytes .../locales/et/LC_MESSAGES/iso4217.mo | Bin 9145 -> 9565 bytes .../locales/et/LC_MESSAGES/iso639-3.mo | Bin 30637 -> 32017 bytes .../locales/eu/LC_MESSAGES/iso3166-2.mo | Bin 23772 -> 23745 bytes .../locales/fi/LC_MESSAGES/iso3166-2.mo | Bin 5172 -> 5183 bytes .../locales/fr/LC_MESSAGES/iso15924.mo | Bin 10249 -> 10260 bytes .../locales/fr/LC_MESSAGES/iso3166-1.mo | Bin 24141 -> 24340 bytes .../locales/fr/LC_MESSAGES/iso3166-2.mo | Bin 166186 -> 160680 bytes .../locales/fr/LC_MESSAGES/iso3166-3.mo | Bin 2725 -> 2860 bytes .../locales/fr/LC_MESSAGES/iso4217.mo | Bin 9303 -> 9998 bytes .../locales/fr/LC_MESSAGES/iso639-3.mo | Bin 407281 -> 418827 bytes .../locales/fr/LC_MESSAGES/iso639-5.mo | Bin 7886 -> 7943 bytes .../locales/fur/LC_MESSAGES/iso3166-1.mo | Bin 23756 -> 23950 bytes .../locales/fur/LC_MESSAGES/iso3166-3.mo | Bin 1048 -> 1483 bytes .../locales/fur/LC_MESSAGES/iso639-5.mo | Bin 7043 -> 7791 bytes .../locales/he/LC_MESSAGES/iso3166-2.mo | Bin 34323 -> 43708 bytes .../locales/hr/LC_MESSAGES/iso3166-2.mo | Bin 26178 -> 25948 bytes .../locales/hu/LC_MESSAGES/iso3166-1.mo | Bin 24519 -> 24602 bytes .../locales/hu/LC_MESSAGES/iso3166-2.mo | Bin 69162 -> 68957 bytes .../locales/hu/LC_MESSAGES/iso4217.mo | Bin 8986 -> 9822 bytes .../locales/ia/LC_MESSAGES/iso3166-1.mo | Bin 23338 -> 23347 bytes .../locales/id/LC_MESSAGES/iso3166-2.mo | Bin 165253 -> 159848 bytes .../locales/it/LC_MESSAGES/iso3166-2.mo | Bin 163383 -> 157445 bytes .../locales/it/LC_MESSAGES/iso639-5.mo | Bin 6606 -> 6985 bytes .../locales/ja/LC_MESSAGES/iso3166-2.mo | Bin 100171 -> 99516 bytes .../locales/ka/LC_MESSAGES/iso15924.mo | Bin 4520 -> 6755 bytes .../locales/ka/LC_MESSAGES/iso3166-2.mo | Bin 109788 -> 111221 bytes .../locales/kab/LC_MESSAGES/iso3166-2.mo | Bin 572 -> 1099 bytes .../locales/km/LC_MESSAGES/iso3166-1.mo | Bin 35806 -> 36282 bytes .../locales/km/LC_MESSAGES/iso3166-2.mo | Bin 0 -> 372 bytes .../locales/km/LC_MESSAGES/iso4217.mo | Bin 0 -> 5396 bytes .../locales/ko/LC_MESSAGES/iso3166-1.mo | Bin 24204 -> 24296 bytes .../locales/ko/LC_MESSAGES/iso3166-2.mo | Bin 3047 -> 4513 bytes .../locales/ko/LC_MESSAGES/iso3166-3.mo | Bin 2577 -> 2783 bytes .../locales/ko/LC_MESSAGES/iso4217.mo | Bin 9975 -> 10767 bytes .../locales/lt/LC_MESSAGES/iso15924.mo | Bin 7253 -> 10170 bytes .../locales/lt/LC_MESSAGES/iso3166-1.mo | Bin 23186 -> 24199 bytes .../locales/lt/LC_MESSAGES/iso3166-2.mo | Bin 75936 -> 75519 bytes .../locales/lt/LC_MESSAGES/iso3166-3.mo | Bin 2767 -> 2987 bytes .../locales/lt/LC_MESSAGES/iso4217.mo | Bin 7034 -> 10089 bytes .../locales/lt/LC_MESSAGES/iso639-5.mo | Bin 0 -> 7646 bytes .../locales/nb/LC_MESSAGES/iso3166-1.mo | Bin 23349 -> 0 bytes .../locales/nb/LC_MESSAGES/iso3166-3.mo | Bin 2713 -> 0 bytes .../{nb => nb_NO}/LC_MESSAGES/iso15924.mo | Bin .../locales/nb_NO/LC_MESSAGES/iso3166-1.mo | Bin 0 -> 23547 bytes .../locales/nb_NO/LC_MESSAGES/iso3166-2.mo | Bin 1294 -> 1305 bytes .../locales/nb_NO/LC_MESSAGES/iso3166-3.mo | Bin 0 -> 2838 bytes .../{nb => nb_NO}/LC_MESSAGES/iso4217.mo | Bin .../{nb => nb_NO}/LC_MESSAGES/iso639-3.mo | Bin .../locales/nl/LC_MESSAGES/iso3166-2.mo | Bin 213685 -> 215191 bytes .../locales/oc/LC_MESSAGES/iso3166-2.mo | Bin 5714 -> 5637 bytes .../locales/oc/LC_MESSAGES/iso639-5.mo | Bin 807 -> 856 bytes .../locales/pa/LC_MESSAGES/iso3166-1.mo | Bin 30504 -> 30877 bytes .../locales/pa/LC_MESSAGES/iso3166-3.mo | Bin 3356 -> 3558 bytes .../locales/pl/LC_MESSAGES/iso3166-2.mo | Bin 188055 -> 203350 bytes .../locales/pt_BR/LC_MESSAGES/iso3166-3.mo | Bin 2728 -> 2874 bytes .../locales/ro/LC_MESSAGES/iso15924.mo | Bin 8284 -> 10632 bytes .../locales/ro/LC_MESSAGES/iso3166-1.mo | Bin 22866 -> 23486 bytes .../locales/ro/LC_MESSAGES/iso3166-2.mo | Bin 27706 -> 229998 bytes .../locales/ro/LC_MESSAGES/iso3166-3.mo | Bin 2818 -> 2987 bytes .../locales/ro/LC_MESSAGES/iso4217.mo | Bin 7042 -> 9977 bytes .../locales/ro/LC_MESSAGES/iso639-5.mo | Bin 0 -> 10650 bytes .../{mo => ro_MD}/LC_MESSAGES/iso3166-1.mo | Bin .../locales/ru/LC_MESSAGES/iso3166-2.mo | Bin 112174 -> 105964 bytes .../locales/sc/LC_MESSAGES/iso3166-2.mo | Bin 104509 -> 99178 bytes .../locales/sk/LC_MESSAGES/iso3166-1.mo | Bin 23531 -> 24190 bytes .../locales/sk/LC_MESSAGES/iso3166-2.mo | Bin 13211 -> 13180 bytes .../locales/sk/LC_MESSAGES/iso3166-3.mo | Bin 2690 -> 2887 bytes .../locales/sl/LC_MESSAGES/iso3166-2.mo | Bin 79740 -> 79342 bytes .../locales/sq/LC_MESSAGES/iso639-5.mo | Bin 371 -> 3810 bytes .../locales/sr/LC_MESSAGES/iso3166-2.mo | Bin 145300 -> 144341 bytes .../locales/sr/LC_MESSAGES/iso639-5.mo | Bin 4031 -> 6247 bytes .../locales/sr@latin/LC_MESSAGES/iso3166-2.mo | Bin 122426 -> 121630 bytes .../locales/sr@latin/LC_MESSAGES/iso639-5.mo | Bin 3277 -> 5040 bytes .../locales/sv/LC_MESSAGES/iso3166-2.mo | Bin 164336 -> 158999 bytes .../locales/ta/LC_MESSAGES/iso15924.mo | Bin 0 -> 15455 bytes .../locales/ta/LC_MESSAGES/iso3166-1.mo | Bin 31984 -> 35476 bytes .../locales/ta/LC_MESSAGES/iso3166-2.mo | Bin 0 -> 372 bytes .../locales/ta/LC_MESSAGES/iso3166-3.mo | Bin 4036 -> 4343 bytes .../locales/ta/LC_MESSAGES/iso4217.mo | Bin 0 -> 14738 bytes .../locales/ta/LC_MESSAGES/iso639-3.mo | Bin 438383 -> 438885 bytes .../locales/ta/LC_MESSAGES/iso639-5.mo | Bin 0 -> 11658 bytes .../locales/th/LC_MESSAGES/iso3166-2.mo | Bin 83632 -> 82740 bytes .../locales/tr/LC_MESSAGES/iso3166-2.mo | Bin 77264 -> 76675 bytes .../locales/uk/LC_MESSAGES/iso3166-2.mo | Bin 265202 -> 255945 bytes .../locales/vi/LC_MESSAGES/iso3166-2.mo | Bin 135733 -> 135199 bytes .../locales/zh_CN/LC_MESSAGES/iso3166-2.mo | Bin 117078 -> 116542 bytes .../locales/zh_TW/LC_MESSAGES/iso3166-2.mo | Bin 18281 -> 18208 bytes libs/pycountry/tests/test_general.py | 121 +- libs/pygments-2.17.2.dist-info/RECORD | 330 - .../INSTALLER | 0 .../METADATA | 10 +- libs/pygments-2.18.0.dist-info/RECORD | 336 + .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../licenses/AUTHORS | 6 +- .../licenses/LICENSE | 0 libs/pygments/__init__.py | 4 +- libs/pygments/__main__.py | 2 +- libs/pygments/cmdline.py | 24 +- libs/pygments/console.py | 10 +- libs/pygments/filter.py | 5 +- libs/pygments/filters/__init__.py | 8 +- libs/pygments/formatter.py | 7 +- libs/pygments/formatters/__init__.py | 13 +- libs/pygments/formatters/bbcode.py | 4 +- libs/pygments/formatters/groff.py | 6 +- libs/pygments/formatters/html.py | 75 +- libs/pygments/formatters/img.py | 21 +- libs/pygments/formatters/irc.py | 2 +- libs/pygments/formatters/latex.py | 51 +- libs/pygments/formatters/other.py | 7 +- libs/pygments/formatters/pangomarkup.py | 4 +- libs/pygments/formatters/rtf.py | 253 +- libs/pygments/formatters/svg.py | 37 +- libs/pygments/formatters/terminal.py | 2 +- libs/pygments/formatters/terminal256.py | 2 +- libs/pygments/lexer.py | 42 +- libs/pygments/lexers/__init__.py | 23 +- libs/pygments/lexers/_ada_builtins.py | 2 +- libs/pygments/lexers/_asy_builtins.py | 2 +- libs/pygments/lexers/_cl_builtins.py | 2 +- libs/pygments/lexers/_cocoa_builtins.py | 4 +- libs/pygments/lexers/_csound_builtins.py | 2 +- libs/pygments/lexers/_css_builtins.py | 2 +- libs/pygments/lexers/_julia_builtins.py | 2 +- libs/pygments/lexers/_lasso_builtins.py | 2 +- libs/pygments/lexers/_lilypond_builtins.py | 2 +- libs/pygments/lexers/_lua_builtins.py | 10 +- libs/pygments/lexers/_luau_builtins.py | 62 + libs/pygments/lexers/_mapping.py | 21 +- libs/pygments/lexers/_mql_builtins.py | 2 +- libs/pygments/lexers/_mysql_builtins.py | 6 +- libs/pygments/lexers/_openedge_builtins.py | 2 +- libs/pygments/lexers/_php_builtins.py | 6 +- libs/pygments/lexers/_postgres_builtins.py | 10 +- libs/pygments/lexers/_qlik_builtins.py | 2 +- libs/pygments/lexers/_scheme_builtins.py | 2 +- libs/pygments/lexers/_scilab_builtins.py | 8 +- libs/pygments/lexers/_sourcemod_builtins.py | 6 +- libs/pygments/lexers/_stan_builtins.py | 2 +- libs/pygments/lexers/_stata_builtins.py | 2 +- libs/pygments/lexers/_tsql_builtins.py | 2 +- libs/pygments/lexers/_usd_builtins.py | 2 +- libs/pygments/lexers/_vbscript_builtins.py | 2 +- libs/pygments/lexers/_vim_builtins.py | 2 +- libs/pygments/lexers/actionscript.py | 14 +- libs/pygments/lexers/ada.py | 6 +- libs/pygments/lexers/agile.py | 4 +- libs/pygments/lexers/algebra.py | 20 +- libs/pygments/lexers/ambient.py | 5 +- libs/pygments/lexers/amdgpu.py | 6 +- libs/pygments/lexers/ampl.py | 5 +- libs/pygments/lexers/apdlexer.py | 7 +- libs/pygments/lexers/apl.py | 5 +- libs/pygments/lexers/archetype.py | 20 +- libs/pygments/lexers/arrow.py | 5 +- libs/pygments/lexers/arturo.py | 5 +- libs/pygments/lexers/asc.py | 6 +- libs/pygments/lexers/asm.py | 43 +- libs/pygments/lexers/asn1.py | 5 +- libs/pygments/lexers/automation.py | 14 +- libs/pygments/lexers/bare.py | 5 +- libs/pygments/lexers/basic.py | 105 +- libs/pygments/lexers/bdd.py | 7 +- libs/pygments/lexers/berry.py | 8 +- libs/pygments/lexers/bibtex.py | 10 +- libs/pygments/lexers/blueprint.py | 5 +- libs/pygments/lexers/boa.py | 8 +- libs/pygments/lexers/bqn.py | 5 +- libs/pygments/lexers/business.py | 43 +- libs/pygments/lexers/c_cpp.py | 5 +- libs/pygments/lexers/c_like.py | 126 +- libs/pygments/lexers/capnproto.py | 5 +- libs/pygments/lexers/carbon.py | 7 +- libs/pygments/lexers/cddl.py | 17 +- libs/pygments/lexers/chapel.py | 5 +- libs/pygments/lexers/clean.py | 3 +- libs/pygments/lexers/comal.py | 3 +- libs/pygments/lexers/compiled.py | 3 +- libs/pygments/lexers/configs.py | 93 +- libs/pygments/lexers/console.py | 10 +- libs/pygments/lexers/cplint.py | 5 +- libs/pygments/lexers/crystal.py | 7 +- libs/pygments/lexers/csound.py | 14 +- libs/pygments/lexers/css.py | 10 +- libs/pygments/lexers/d.py | 7 +- libs/pygments/lexers/dalvik.py | 5 +- libs/pygments/lexers/data.py | 16 +- libs/pygments/lexers/dax.py | 5 +- libs/pygments/lexers/devicetree.py | 5 +- libs/pygments/lexers/diff.py | 13 +- libs/pygments/lexers/dns.py | 17 +- libs/pygments/lexers/dotnet.py | 33 +- libs/pygments/lexers/dsls.py | 54 +- libs/pygments/lexers/dylan.py | 14 +- libs/pygments/lexers/ecl.py | 5 +- libs/pygments/lexers/eiffel.py | 5 +- libs/pygments/lexers/elm.py | 5 +- libs/pygments/lexers/elpi.py | 41 +- libs/pygments/lexers/email.py | 6 +- libs/pygments/lexers/erlang.py | 46 +- libs/pygments/lexers/esoteric.py | 23 +- libs/pygments/lexers/ezhil.py | 5 +- libs/pygments/lexers/factor.py | 5 +- libs/pygments/lexers/fantom.py | 6 +- libs/pygments/lexers/felix.py | 19 +- libs/pygments/lexers/fift.py | 3 +- libs/pygments/lexers/floscript.py | 5 +- libs/pygments/lexers/forth.py | 5 +- libs/pygments/lexers/fortran.py | 9 +- libs/pygments/lexers/foxpro.py | 6 +- libs/pygments/lexers/freefem.py | 5 +- libs/pygments/lexers/func.py | 4 +- libs/pygments/lexers/functional.py | 3 +- libs/pygments/lexers/futhark.py | 13 +- libs/pygments/lexers/gcodelexer.py | 6 +- libs/pygments/lexers/gdscript.py | 3 +- libs/pygments/lexers/go.py | 5 +- libs/pygments/lexers/grammar_notation.py | 15 +- libs/pygments/lexers/graph.py | 5 +- libs/pygments/lexers/graphics.py | 30 +- libs/pygments/lexers/graphql.py | 5 +- libs/pygments/lexers/graphviz.py | 5 +- libs/pygments/lexers/gsql.py | 5 +- libs/pygments/lexers/haskell.py | 59 +- libs/pygments/lexers/haxe.py | 8 +- libs/pygments/lexers/hdl.py | 15 +- libs/pygments/lexers/hexdump.py | 6 +- libs/pygments/lexers/html.py | 31 +- libs/pygments/lexers/idl.py | 5 +- libs/pygments/lexers/igor.py | 7 +- libs/pygments/lexers/inferno.py | 5 +- libs/pygments/lexers/installers.py | 16 +- libs/pygments/lexers/int_fiction.py | 312 +- libs/pygments/lexers/iolang.py | 5 +- libs/pygments/lexers/j.py | 5 +- libs/pygments/lexers/javascript.py | 37 +- libs/pygments/lexers/jmespath.py | 3 +- libs/pygments/lexers/jslt.py | 5 +- libs/pygments/lexers/jsonnet.py | 7 +- libs/pygments/lexers/jsx.py | 5 +- libs/pygments/lexers/julia.py | 9 +- libs/pygments/lexers/jvm.py | 214 +- libs/pygments/lexers/kuin.py | 5 +- libs/pygments/lexers/kusto.py | 5 +- libs/pygments/lexers/ldap.py | 8 +- libs/pygments/lexers/lean.py | 145 +- libs/pygments/lexers/lilypond.py | 5 +- libs/pygments/lexers/lisp.py | 428 +- libs/pygments/lexers/macaulay2.py | 37 +- libs/pygments/lexers/make.py | 11 +- libs/pygments/lexers/markup.py | 232 +- libs/pygments/lexers/math.py | 3 +- libs/pygments/lexers/matlab.py | 22 +- libs/pygments/lexers/maxima.py | 5 +- libs/pygments/lexers/meson.py | 5 +- libs/pygments/lexers/mime.py | 8 +- libs/pygments/lexers/minecraft.py | 43 +- libs/pygments/lexers/mips.py | 4 +- libs/pygments/lexers/ml.py | 114 +- libs/pygments/lexers/modeling.py | 41 +- libs/pygments/lexers/modula2.py | 5 +- libs/pygments/lexers/mojo.py | 704 + libs/pygments/lexers/monte.py | 5 +- libs/pygments/lexers/mosel.py | 6 +- libs/pygments/lexers/ncl.py | 7 +- libs/pygments/lexers/nimrod.py | 15 +- libs/pygments/lexers/nit.py | 5 +- libs/pygments/lexers/nix.py | 13 +- libs/pygments/lexers/oberon.py | 6 +- libs/pygments/lexers/objective.py | 20 +- libs/pygments/lexers/ooc.py | 5 +- libs/pygments/lexers/openscad.py | 5 +- libs/pygments/lexers/other.py | 3 +- libs/pygments/lexers/parasail.py | 5 +- libs/pygments/lexers/parsers.py | 85 +- libs/pygments/lexers/pascal.py | 9 +- libs/pygments/lexers/pawn.py | 10 +- libs/pygments/lexers/perl.py | 6 +- libs/pygments/lexers/phix.py | 5 +- libs/pygments/lexers/php.py | 9 +- libs/pygments/lexers/pointless.py | 5 +- libs/pygments/lexers/pony.py | 6 +- libs/pygments/lexers/praat.py | 5 +- libs/pygments/lexers/procfile.py | 5 +- libs/pygments/lexers/prolog.py | 25 +- libs/pygments/lexers/promql.py | 3 +- libs/pygments/lexers/prql.py | 5 +- libs/pygments/lexers/ptx.py | 5 +- libs/pygments/lexers/python.py | 40 +- libs/pygments/lexers/q.py | 11 +- libs/pygments/lexers/qlik.py | 6 +- libs/pygments/lexers/qvt.py | 8 +- libs/pygments/lexers/r.py | 14 +- libs/pygments/lexers/rdf.py | 28 +- libs/pygments/lexers/rebol.py | 14 +- libs/pygments/lexers/resource.py | 11 +- libs/pygments/lexers/ride.py | 9 +- libs/pygments/lexers/rita.py | 5 +- libs/pygments/lexers/rnc.py | 5 +- libs/pygments/lexers/roboconf.py | 10 +- libs/pygments/lexers/robotframework.py | 5 +- libs/pygments/lexers/ruby.py | 10 +- libs/pygments/lexers/rust.py | 19 +- libs/pygments/lexers/sas.py | 6 +- libs/pygments/lexers/savi.py | 261 +- libs/pygments/lexers/scdoc.py | 5 +- libs/pygments/lexers/scripting.py | 396 +- libs/pygments/lexers/sgf.py | 5 +- libs/pygments/lexers/shell.py | 236 +- libs/pygments/lexers/sieve.py | 6 +- libs/pygments/lexers/slash.py | 9 +- libs/pygments/lexers/smalltalk.py | 8 +- libs/pygments/lexers/smithy.py | 5 +- libs/pygments/lexers/smv.py | 6 +- libs/pygments/lexers/snobol.py | 6 +- libs/pygments/lexers/solidity.py | 6 +- libs/pygments/lexers/soong.py | 78 + libs/pygments/lexers/sophia.py | 7 +- libs/pygments/lexers/special.py | 11 +- libs/pygments/lexers/spice.py | 16 +- libs/pygments/lexers/sql.py | 40 +- libs/pygments/lexers/srcinfo.py | 6 +- libs/pygments/lexers/stata.py | 5 +- libs/pygments/lexers/supercollider.py | 5 +- libs/pygments/lexers/tact.py | 303 + libs/pygments/lexers/tal.py | 8 +- libs/pygments/lexers/tcl.py | 5 +- libs/pygments/lexers/teal.py | 5 +- libs/pygments/lexers/templates.py | 203 +- libs/pygments/lexers/teraterm.py | 5 +- libs/pygments/lexers/testing.py | 9 +- libs/pygments/lexers/text.py | 3 +- libs/pygments/lexers/textedit.py | 15 +- libs/pygments/lexers/textfmts.py | 22 +- libs/pygments/lexers/theorem.py | 57 +- libs/pygments/lexers/thingsdb.py | 76 +- libs/pygments/lexers/tlb.py | 4 +- libs/pygments/lexers/tls.py | 5 +- libs/pygments/lexers/tnt.py | 5 +- libs/pygments/lexers/trafficscript.py | 6 +- libs/pygments/lexers/typoscript.py | 13 +- libs/pygments/lexers/typst.py | 104 + libs/pygments/lexers/ul4.py | 52 +- libs/pygments/lexers/unicon.py | 16 +- libs/pygments/lexers/urbi.py | 6 +- libs/pygments/lexers/usd.py | 17 +- libs/pygments/lexers/varnish.py | 10 +- libs/pygments/lexers/verification.py | 9 +- libs/pygments/lexers/verifpal.py | 5 +- libs/pygments/lexers/vip.py | 8 +- libs/pygments/lexers/vyper.py | 5 +- libs/pygments/lexers/web.py | 3 +- libs/pygments/lexers/webassembly.py | 5 +- libs/pygments/lexers/webidl.py | 5 +- libs/pygments/lexers/webmisc.py | 26 +- libs/pygments/lexers/wgsl.py | 13 +- libs/pygments/lexers/whiley.py | 5 +- libs/pygments/lexers/wowtoc.py | 6 +- libs/pygments/lexers/wren.py | 7 +- libs/pygments/lexers/x10.py | 13 +- libs/pygments/lexers/xorg.py | 3 +- libs/pygments/lexers/yang.py | 5 +- libs/pygments/lexers/yara.py | 5 +- libs/pygments/lexers/zig.py | 3 +- libs/pygments/modeline.py | 8 +- libs/pygments/plugin.py | 22 +- libs/pygments/regexopt.py | 2 +- libs/pygments/scanner.py | 2 +- libs/pygments/sphinxext.py | 24 +- libs/pygments/style.py | 4 +- libs/pygments/styles/__init__.py | 6 +- libs/pygments/styles/_mapping.py | 1 + libs/pygments/styles/abap.py | 2 +- libs/pygments/styles/algol.py | 2 +- libs/pygments/styles/algol_nu.py | 2 +- libs/pygments/styles/arduino.py | 2 +- libs/pygments/styles/autumn.py | 2 +- libs/pygments/styles/borland.py | 2 +- libs/pygments/styles/bw.py | 2 +- libs/pygments/styles/coffee.py | 80 + libs/pygments/styles/colorful.py | 2 +- libs/pygments/styles/default.py | 2 +- libs/pygments/styles/dracula.py | 2 +- libs/pygments/styles/emacs.py | 2 +- libs/pygments/styles/friendly.py | 2 +- libs/pygments/styles/friendly_grayscale.py | 2 +- libs/pygments/styles/fruity.py | 2 +- libs/pygments/styles/gh_dark.py | 2 +- libs/pygments/styles/gruvbox.py | 2 +- libs/pygments/styles/igor.py | 2 +- libs/pygments/styles/inkpot.py | 2 +- libs/pygments/styles/lightbulb.py | 2 +- libs/pygments/styles/lilypond.py | 2 +- libs/pygments/styles/lovelace.py | 2 +- libs/pygments/styles/manni.py | 2 +- libs/pygments/styles/material.py | 2 +- libs/pygments/styles/monokai.py | 2 +- libs/pygments/styles/murphy.py | 2 +- libs/pygments/styles/native.py | 8 +- libs/pygments/styles/nord.py | 2 +- libs/pygments/styles/onedark.py | 2 +- libs/pygments/styles/paraiso_dark.py | 2 +- libs/pygments/styles/paraiso_light.py | 2 +- libs/pygments/styles/pastie.py | 2 +- libs/pygments/styles/perldoc.py | 2 +- libs/pygments/styles/rainbow_dash.py | 38 +- libs/pygments/styles/rrt.py | 2 +- libs/pygments/styles/sas.py | 2 +- libs/pygments/styles/solarized.py | 2 +- libs/pygments/styles/staroffice.py | 2 +- libs/pygments/styles/stata_dark.py | 2 +- libs/pygments/styles/stata_light.py | 2 +- libs/pygments/styles/tango.py | 2 +- libs/pygments/styles/trac.py | 2 +- libs/pygments/styles/vim.py | 2 +- libs/pygments/styles/vs.py | 2 +- libs/pygments/styles/xcode.py | 2 +- libs/pygments/styles/zenburn.py | 2 +- libs/pygments/token.py | 2 +- libs/pygments/unistring.py | 10 +- libs/pygments/util.py | 32 +- libs/pyparsing-3.1.1.dist-info/RECORD | 18 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 3 +- libs/pyparsing-3.1.4.dist-info/RECORD | 18 + .../REQUESTED | 0 .../WHEEL | 0 libs/pyparsing/__init__.py | 6 +- libs/pyparsing/actions.py | 23 +- libs/pyparsing/common.py | 32 +- libs/pyparsing/core.py | 1137 +- libs/pyparsing/diagram/__init__.py | 47 +- libs/pyparsing/exceptions.py | 84 +- libs/pyparsing/helpers.py | 96 +- libs/pyparsing/results.py | 227 +- libs/pyparsing/testing.py | 118 +- libs/pyparsing/unicode.py | 41 +- libs/pyparsing/util.py | 15 +- libs/pyrsistent-0.20.0.dist-info/RECORD | 4 +- libs/pyrsistent-0.20.0.dist-info/WHEEL | 2 +- libs/pysubs2-1.7.2.dist-info/RECORD | 47 - libs/pysubs2-1.7.2.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE.txt | 0 .../METADATA | 2 +- libs/pysubs2-1.7.3.dist-info/RECORD | 28 + .../REQUESTED | 0 libs/pysubs2-1.7.3.dist-info/WHEEL | 5 + .../entry_points.txt | 0 .../top_level.txt | 0 libs/pysubs2/common.py | 2 +- libs/pysubs2/exceptions.py | 12 +- libs/pysubs2/formats/jsonformat.py | 5 +- libs/python_dateutil-2.8.2.dist-info/RECORD | 27 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 9 +- libs/python_dateutil-2.9.0.dist-info/RECORD | 27 + .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 .../zip-safe | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- .../RECORD | 26 +- .../REQUESTED | 0 libs/python_engineio-4.10.1.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/python_engineio-4.9.0.dist-info/WHEEL | 5 - libs/python_socketio-5.11.1.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- .../RECORD | 40 +- .../REQUESTED | 0 libs/python_socketio-5.11.4.dist-info/WHEEL | 5 + .../top_level.txt | 0 .../INSTALLER | 0 .../LICENSE.txt | 0 .../METADATA | 3 +- .../RECORD | 110 +- .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 .../zip-safe | 0 libs/pytz/__init__.py | 5 +- libs/pytz/zoneinfo/Africa/Blantyre | Bin 149 -> 149 bytes libs/pytz/zoneinfo/Africa/Bujumbura | Bin 149 -> 149 bytes libs/pytz/zoneinfo/Africa/Gaborone | Bin 149 -> 149 bytes libs/pytz/zoneinfo/Africa/Harare | Bin 149 -> 149 bytes libs/pytz/zoneinfo/Africa/Kigali | Bin 149 -> 149 bytes libs/pytz/zoneinfo/Africa/Lubumbashi | Bin 149 -> 149 bytes libs/pytz/zoneinfo/Africa/Lusaka | Bin 149 -> 149 bytes libs/pytz/zoneinfo/Africa/Maputo | Bin 149 -> 149 bytes libs/pytz/zoneinfo/America/Bahia_Banderas | Bin 1152 -> 1100 bytes libs/pytz/zoneinfo/America/Cancun | Bin 834 -> 864 bytes libs/pytz/zoneinfo/America/Chihuahua | Bin 1102 -> 1102 bytes libs/pytz/zoneinfo/America/Ciudad_Juarez | Bin 1538 -> 1538 bytes libs/pytz/zoneinfo/America/Ensenada | Bin 2374 -> 2458 bytes libs/pytz/zoneinfo/America/Hermosillo | Bin 456 -> 388 bytes libs/pytz/zoneinfo/America/Mazatlan | Bin 1128 -> 1060 bytes libs/pytz/zoneinfo/America/Merida | Bin 1004 -> 1004 bytes libs/pytz/zoneinfo/America/Mexico_City | Bin 1222 -> 1222 bytes libs/pytz/zoneinfo/America/Monterrey | Bin 980 -> 1114 bytes libs/pytz/zoneinfo/America/Ojinaga | Bin 1524 -> 1524 bytes libs/pytz/zoneinfo/America/Santa_Isabel | Bin 2374 -> 2458 bytes libs/pytz/zoneinfo/America/Tijuana | Bin 2374 -> 2458 bytes libs/pytz/zoneinfo/Asia/Choibalsan | Bin 935 -> 877 bytes libs/pytz/zoneinfo/Asia/Dili | Bin 213 -> 257 bytes libs/pytz/zoneinfo/Atlantic/Azores | Bin 3498 -> 3442 bytes libs/pytz/zoneinfo/Atlantic/Madeira | Bin 3503 -> 3377 bytes libs/pytz/zoneinfo/CET | Bin 2094 -> 2933 bytes libs/pytz/zoneinfo/CST6CDT | Bin 2310 -> 3592 bytes libs/pytz/zoneinfo/EET | Bin 1908 -> 2262 bytes libs/pytz/zoneinfo/EST | Bin 114 -> 182 bytes libs/pytz/zoneinfo/EST5EDT | Bin 2310 -> 3552 bytes libs/pytz/zoneinfo/Europe/Lisbon | Bin 3497 -> 3527 bytes libs/pytz/zoneinfo/HST | Bin 115 -> 329 bytes libs/pytz/zoneinfo/MET | Bin 2094 -> 2933 bytes libs/pytz/zoneinfo/MST | Bin 114 -> 360 bytes libs/pytz/zoneinfo/MST7MDT | Bin 2310 -> 2460 bytes libs/pytz/zoneinfo/Mexico/BajaNorte | Bin 2374 -> 2458 bytes libs/pytz/zoneinfo/Mexico/BajaSur | Bin 1128 -> 1060 bytes libs/pytz/zoneinfo/Mexico/General | Bin 1222 -> 1222 bytes libs/pytz/zoneinfo/PST8PDT | Bin 2310 -> 2852 bytes libs/pytz/zoneinfo/Portugal | Bin 3497 -> 3527 bytes libs/pytz/zoneinfo/WET | Bin 1905 -> 3527 bytes libs/pytz/zoneinfo/leapseconds | 8 +- libs/pytz/zoneinfo/tzdata.zi | 1651 +- libs/pytz/zoneinfo/zone.tab | 3 +- libs/pytz/zoneinfo/zone1970.tab | 3 +- libs/pytz/zoneinfo/zonenow.tab | 8 +- .../METADATA | 6 +- .../RECORD | 4 +- .../WHEEL | 2 +- libs/rarfile-4.1.dist-info/RECORD | 8 - libs/rarfile-4.1.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 2 +- .../METADATA | 6 +- libs/rarfile-4.2.dist-info/RECORD | 8 + .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 libs/rarfile.py | 39 +- libs/referencing-0.23.0.dist-info/METADATA | 2 +- libs/referencing-0.23.0.dist-info/RECORD | 4 +- libs/referencing-0.23.0.dist-info/WHEEL | 2 +- libs/requests-2.31.0.dist-info/RECORD | 25 - libs/requests-2.31.0.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 24 +- libs/requests-2.32.3.dist-info/RECORD | 25 + .../REQUESTED | 0 libs/requests-2.32.3.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/requests/__init__.py | 6 +- libs/requests/__version__.py | 6 +- libs/requests/adapters.py | 219 +- libs/requests/api.py | 2 +- libs/requests/auth.py | 1 - libs/requests/compat.py | 25 +- libs/requests/cookies.py | 16 +- libs/requests/exceptions.py | 10 + libs/requests/models.py | 13 +- libs/requests/packages.py | 23 +- libs/requests/sessions.py | 12 +- libs/requests/status_codes.py | 10 +- libs/requests/utils.py | 16 +- libs/requests_oauthlib-1.3.1.dist-info/RECORD | 22 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 40 +- libs/requests_oauthlib-2.0.0.dist-info/RECORD | 22 + .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 libs/requests_oauthlib/__init__.py | 3 +- .../compliance_fixes/__init__.py | 3 +- .../compliance_fixes/douban.py | 4 +- .../compliance_fixes/ebay.py | 3 +- .../compliance_fixes/facebook.py | 10 +- .../compliance_fixes/fitbit.py | 4 +- .../compliance_fixes/instagram.py | 5 +- .../compliance_fixes/mailchimp.py | 6 +- .../compliance_fixes/plentymarkets.py | 4 +- .../compliance_fixes/slack.py | 5 +- .../compliance_fixes/weibo.py | 4 +- libs/requests_oauthlib/oauth1_auth.py | 13 +- libs/requests_oauthlib/oauth1_session.py | 13 +- libs/requests_oauthlib/oauth2_auth.py | 1 - libs/requests_oauthlib/oauth2_session.py | 65 +- libs/rich-13.7.0.dist-info/WHEEL | 4 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 18 +- .../RECORD | 72 +- .../REQUESTED | 0 libs/rich-13.9.3.dist-info/WHEEL | 4 + libs/rich/_cell_widths.py | 367 +- libs/rich/_inspect.py | 2 - libs/rich/_null_file.py | 2 +- libs/rich/_win32_console.py | 7 +- libs/rich/align.py | 1 + libs/rich/ansi.py | 1 + libs/rich/cells.py | 4 +- libs/rich/color.py | 4 +- libs/rich/console.py | 82 +- libs/rich/default_styles.py | 3 +- libs/rich/filesize.py | 3 +- libs/rich/highlighter.py | 2 +- libs/rich/live.py | 2 +- libs/rich/logging.py | 8 + libs/rich/markdown.py | 102 +- libs/rich/padding.py | 10 +- libs/rich/panel.py | 20 +- libs/rich/pretty.py | 71 +- libs/rich/progress.py | 34 +- libs/rich/progress_bar.py | 2 +- libs/rich/prompt.py | 33 +- libs/rich/segment.py | 52 +- libs/rich/spinner.py | 1 + libs/rich/style.py | 2 +- libs/rich/syntax.py | 24 +- libs/rich/table.py | 23 +- libs/rich/text.py | 18 +- libs/rich/theme.py | 4 +- libs/rich/traceback.py | 96 +- libs/rich/tree.py | 24 +- libs/semver-3.0.2.dist-info/RECORD | 2 +- libs/semver-3.0.2.dist-info/WHEEL | 2 +- libs/simple_websocket-1.0.0.dist-info/RECORD | 12 - libs/simple_websocket-1.0.0.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 12 +- libs/simple_websocket-1.1.0.dist-info/RECORD | 12 + .../REQUESTED | 0 libs/simple_websocket-1.1.0.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/simple_websocket/errors.py | 10 +- libs/simple_websocket/ws.py | 18 +- libs/socketio/asgi.py | 9 +- libs/socketio/async_client.py | 31 +- libs/socketio/async_manager.py | 3 +- libs/socketio/async_namespace.py | 4 +- libs/socketio/async_pubsub_manager.py | 3 +- libs/socketio/async_server.py | 3 + libs/socketio/base_server.py | 4 +- libs/socketio/client.py | 21 +- libs/socketio/manager.py | 3 +- libs/socketio/namespace.py | 4 +- libs/socketio/packet.py | 2 +- libs/socketio/pubsub_manager.py | 3 +- libs/socketio/server.py | 3 + libs/soupsieve-2.3.2.post1.dist-info/METADATA | 2 +- libs/soupsieve-2.3.2.post1.dist-info/RECORD | 4 +- libs/soupsieve-2.3.2.post1.dist-info/WHEEL | 2 +- libs/sqlalchemy/__init__.py | 2 +- libs/sqlalchemy/connectors/asyncio.py | 19 +- libs/sqlalchemy/cyextension/.gitignore | 5 - .../collections.cpython-38-darwin.so | Bin 0 -> 233760 bytes .../immutabledict.cpython-38-darwin.so | Bin 0 -> 94672 bytes .../processors.cpython-38-darwin.so | Bin 0 -> 75976 bytes .../resultproxy.cpython-38-darwin.so | Bin 0 -> 78080 bytes .../cyextension/util.cpython-38-darwin.so | Bin 0 -> 93064 bytes libs/sqlalchemy/dialects/mssql/base.py | 36 +- libs/sqlalchemy/dialects/mssql/provision.py | 7 + libs/sqlalchemy/dialects/mssql/pymssql.py | 1 + libs/sqlalchemy/dialects/mysql/aiomysql.py | 21 +- libs/sqlalchemy/dialects/mysql/asyncmy.py | 20 +- libs/sqlalchemy/dialects/mysql/base.py | 93 +- .../dialects/mysql/mariadbconnector.py | 9 +- .../dialects/mysql/mysqlconnector.py | 1 + libs/sqlalchemy/dialects/mysql/mysqldb.py | 9 +- libs/sqlalchemy/dialects/mysql/provision.py | 3 + libs/sqlalchemy/dialects/mysql/reflection.py | 2 +- .../dialects/mysql/reserved_words.py | 4 + libs/sqlalchemy/dialects/mysql/types.py | 13 +- libs/sqlalchemy/dialects/oracle/base.py | 45 +- libs/sqlalchemy/dialects/oracle/cx_oracle.py | 21 +- libs/sqlalchemy/dialects/oracle/oracledb.py | 126 +- .../dialects/postgresql/__init__.py | 2 +- libs/sqlalchemy/dialects/postgresql/array.py | 75 +- .../sqlalchemy/dialects/postgresql/asyncpg.py | 96 +- libs/sqlalchemy/dialects/postgresql/base.py | 382 +- libs/sqlalchemy/dialects/postgresql/json.py | 28 +- .../dialects/postgresql/named_types.py | 20 +- .../dialects/postgresql/pg_catalog.py | 30 +- .../dialects/postgresql/provision.py | 2 +- .../sqlalchemy/dialects/postgresql/psycopg.py | 59 +- .../dialects/postgresql/psycopg2.py | 58 +- libs/sqlalchemy/dialects/sqlite/aiosqlite.py | 20 +- libs/sqlalchemy/dialects/sqlite/base.py | 43 +- libs/sqlalchemy/dialects/sqlite/pysqlite.py | 13 +- libs/sqlalchemy/engine/base.py | 42 +- libs/sqlalchemy/engine/characteristics.py | 78 +- libs/sqlalchemy/engine/create.py | 11 + libs/sqlalchemy/engine/cursor.py | 101 +- libs/sqlalchemy/engine/default.py | 182 +- libs/sqlalchemy/engine/interfaces.py | 16 +- libs/sqlalchemy/engine/reflection.py | 13 +- libs/sqlalchemy/engine/result.py | 16 +- libs/sqlalchemy/engine/util.py | 3 +- libs/sqlalchemy/event/api.py | 2 +- libs/sqlalchemy/event/base.py | 86 +- libs/sqlalchemy/ext/associationproxy.py | 10 +- libs/sqlalchemy/ext/asyncio/engine.py | 17 +- libs/sqlalchemy/ext/asyncio/result.py | 16 +- libs/sqlalchemy/ext/asyncio/scoping.py | 2 +- libs/sqlalchemy/ext/asyncio/session.py | 17 +- libs/sqlalchemy/ext/automap.py | 161 +- libs/sqlalchemy/ext/compiler.py | 31 +- libs/sqlalchemy/ext/hybrid.py | 2 +- libs/sqlalchemy/ext/mypy/names.py | 29 +- libs/sqlalchemy/ext/mypy/util.py | 21 +- libs/sqlalchemy/ext/serializer.py | 42 +- libs/sqlalchemy/orm/_orm_constructors.py | 135 +- libs/sqlalchemy/orm/attributes.py | 10 +- libs/sqlalchemy/orm/base.py | 5 +- libs/sqlalchemy/orm/bulk_persistence.py | 167 +- libs/sqlalchemy/orm/clsregistry.py | 5 +- libs/sqlalchemy/orm/collections.py | 8 +- libs/sqlalchemy/orm/context.py | 35 +- libs/sqlalchemy/orm/decl_api.py | 36 +- libs/sqlalchemy/orm/decl_base.py | 52 +- libs/sqlalchemy/orm/descriptor_props.py | 4 +- libs/sqlalchemy/orm/dynamic.py | 10 +- libs/sqlalchemy/orm/evaluator.py | 11 + libs/sqlalchemy/orm/events.py | 6 +- libs/sqlalchemy/orm/exc.py | 5 +- libs/sqlalchemy/orm/interfaces.py | 16 +- libs/sqlalchemy/orm/loading.py | 47 +- libs/sqlalchemy/orm/mapped_collection.py | 27 +- libs/sqlalchemy/orm/mapper.py | 16 +- libs/sqlalchemy/orm/path_registry.py | 25 +- libs/sqlalchemy/orm/properties.py | 12 +- libs/sqlalchemy/orm/query.py | 5 +- libs/sqlalchemy/orm/relationships.py | 102 +- libs/sqlalchemy/orm/scoping.py | 2 +- libs/sqlalchemy/orm/session.py | 105 +- libs/sqlalchemy/orm/state.py | 19 +- libs/sqlalchemy/orm/strategies.py | 275 +- libs/sqlalchemy/orm/strategy_options.py | 205 +- libs/sqlalchemy/orm/util.py | 33 +- libs/sqlalchemy/pool/impl.py | 38 +- libs/sqlalchemy/sql/_elements_constructors.py | 54 +- libs/sqlalchemy/sql/_typing.py | 18 +- libs/sqlalchemy/sql/base.py | 34 +- libs/sqlalchemy/sql/cache_key.py | 18 +- libs/sqlalchemy/sql/coercions.py | 72 +- libs/sqlalchemy/sql/compiler.py | 213 +- libs/sqlalchemy/sql/crud.py | 2 +- libs/sqlalchemy/sql/ddl.py | 10 +- libs/sqlalchemy/sql/elements.py | 227 +- libs/sqlalchemy/sql/functions.py | 5 +- libs/sqlalchemy/sql/lambdas.py | 2 +- libs/sqlalchemy/sql/operators.py | 6 + libs/sqlalchemy/sql/schema.py | 83 +- libs/sqlalchemy/sql/selectable.py | 195 +- libs/sqlalchemy/sql/sqltypes.py | 202 +- libs/sqlalchemy/sql/traversals.py | 2 + libs/sqlalchemy/sql/type_api.py | 92 +- libs/sqlalchemy/testing/__init__.py | 1 + libs/sqlalchemy/testing/asyncio.py | 17 +- libs/sqlalchemy/testing/engines.py | 7 +- libs/sqlalchemy/testing/fixtures/sql.py | 23 +- .../sqlalchemy/testing/plugin/pytestplugin.py | 6 + libs/sqlalchemy/testing/provision.py | 2 +- libs/sqlalchemy/testing/requirements.py | 35 + .../testing/suite/test_reflection.py | 177 +- libs/sqlalchemy/testing/suite/test_results.py | 52 +- libs/sqlalchemy/testing/suite/test_select.py | 111 + libs/sqlalchemy/testing/suite/test_types.py | 70 + libs/sqlalchemy/testing/util.py | 18 + libs/sqlalchemy/util/__init__.py | 1 + libs/sqlalchemy/util/_collections.py | 6 +- libs/sqlalchemy/util/_concurrency_py3k.py | 125 +- libs/sqlalchemy/util/compat.py | 3 +- libs/sqlalchemy/util/concurrency.py | 49 +- libs/sqlalchemy/util/langhelpers.py | 40 +- libs/sqlalchemy/util/typing.py | 53 +- libs/stevedore-5.2.0.dist-info/WHEEL | 5 - libs/stevedore-5.2.0.dist-info/pbr.json | 1 - .../AUTHORS | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 4 +- .../RECORD | 20 +- .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 0 libs/stevedore-5.3.0.dist-info/pbr.json | 1 + .../top_level.txt | 0 libs/textdistance-4.6.2.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 804 +- .../RECORD | 46 +- .../REQUESTED | 0 libs/textdistance-4.6.3.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/textdistance/algorithms/token_based.py | 2 +- libs/tld-0.13.dist-info/RECORD | 2 +- libs/tld-0.13.dist-info/WHEEL | 2 +- libs/tqdm-4.66.2.dist-info/RECORD | 43 - libs/tqdm-4.66.2.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENCE | 0 .../METADATA | 27 +- libs/tqdm-4.66.6.dist-info/RECORD | 43 + .../REQUESTED | 0 libs/tqdm-4.66.6.dist-info/WHEEL | 5 + .../entry_points.txt | 0 .../top_level.txt | 0 libs/tqdm/_dist_ver.py | 2 +- libs/tqdm/asyncio.py | 2 +- libs/tqdm/cli.py | 57 +- libs/tqdm/contrib/__init__.py | 2 +- libs/tqdm/contrib/discord.py | 8 +- libs/tqdm/contrib/logging.py | 2 +- libs/tqdm/contrib/slack.py | 8 +- libs/tqdm/contrib/telegram.py | 10 +- libs/tqdm/dask.py | 2 +- libs/tqdm/gui.py | 2 +- libs/tqdm/notebook.py | 14 +- libs/tqdm/rich.py | 7 +- libs/tqdm/std.py | 2 +- libs/tqdm/tk.py | 4 +- libs/tqdm/utils.py | 8 +- libs/trakit-0.2.1.dist-info/WHEEL | 4 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 4 +- .../RECORD | 18 +- .../REQUESTED | 0 libs/trakit-0.2.2.dist-info/WHEEL | 4 + .../entry_points.txt | 0 libs/trakit/__init__.py | 1 - libs/trakit/config.py | 8 +- .../typing_extensions-4.10.0.dist-info/RECORD | 7 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 3 +- .../typing_extensions-4.12.2.dist-info/RECORD | 7 + .../REQUESTED | 0 .../WHEEL | 2 +- libs/typing_extensions.py | 652 +- .../INSTALLER | 0 .../LICENSE | 0 .../LICENSE_APACHE | 0 .../METADATA | 2 +- .../RECORD | 112 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 libs/tzdata/__init__.py | 4 +- libs/tzdata/zoneinfo/Africa/Blantyre | Bin 131 -> 131 bytes libs/tzdata/zoneinfo/Africa/Bujumbura | Bin 131 -> 131 bytes libs/tzdata/zoneinfo/Africa/Gaborone | Bin 131 -> 131 bytes libs/tzdata/zoneinfo/Africa/Harare | Bin 131 -> 131 bytes libs/tzdata/zoneinfo/Africa/Kigali | Bin 131 -> 131 bytes libs/tzdata/zoneinfo/Africa/Lubumbashi | Bin 131 -> 131 bytes libs/tzdata/zoneinfo/Africa/Lusaka | Bin 131 -> 131 bytes libs/tzdata/zoneinfo/Africa/Maputo | Bin 131 -> 131 bytes libs/tzdata/zoneinfo/America/Bahia_Banderas | Bin 728 -> 700 bytes libs/tzdata/zoneinfo/America/Cancun | Bin 529 -> 538 bytes libs/tzdata/zoneinfo/America/Chihuahua | Bin 691 -> 691 bytes libs/tzdata/zoneinfo/America/Ciudad_Juarez | Bin 718 -> 718 bytes libs/tzdata/zoneinfo/America/Ensenada | Bin 1025 -> 1079 bytes libs/tzdata/zoneinfo/America/Hermosillo | Bin 286 -> 258 bytes libs/tzdata/zoneinfo/America/Mazatlan | Bin 718 -> 690 bytes libs/tzdata/zoneinfo/America/Merida | Bin 654 -> 654 bytes libs/tzdata/zoneinfo/America/Mexico_City | Bin 773 -> 773 bytes libs/tzdata/zoneinfo/America/Monterrey | Bin 644 -> 709 bytes libs/tzdata/zoneinfo/America/Ojinaga | Bin 718 -> 718 bytes libs/tzdata/zoneinfo/America/Santa_Isabel | Bin 1025 -> 1079 bytes libs/tzdata/zoneinfo/America/Tijuana | Bin 1025 -> 1079 bytes libs/tzdata/zoneinfo/Asia/Choibalsan | Bin 619 -> 594 bytes libs/tzdata/zoneinfo/Asia/Dili | Bin 170 -> 170 bytes libs/tzdata/zoneinfo/Atlantic/Azores | Bin 1453 -> 1401 bytes libs/tzdata/zoneinfo/Atlantic/Madeira | Bin 1453 -> 1372 bytes libs/tzdata/zoneinfo/CET | Bin 621 -> 1103 bytes libs/tzdata/zoneinfo/CST6CDT | Bin 951 -> 1754 bytes libs/tzdata/zoneinfo/EET | Bin 497 -> 682 bytes libs/tzdata/zoneinfo/EST | Bin 111 -> 149 bytes libs/tzdata/zoneinfo/EST5EDT | Bin 951 -> 1744 bytes libs/tzdata/zoneinfo/Europe/Lisbon | Bin 1454 -> 1463 bytes libs/tzdata/zoneinfo/HST | Bin 112 -> 221 bytes libs/tzdata/zoneinfo/MET | Bin 621 -> 1103 bytes libs/tzdata/zoneinfo/MST | Bin 111 -> 240 bytes libs/tzdata/zoneinfo/MST7MDT | Bin 951 -> 1042 bytes libs/tzdata/zoneinfo/Mexico/BajaNorte | Bin 1025 -> 1079 bytes libs/tzdata/zoneinfo/Mexico/BajaSur | Bin 718 -> 690 bytes libs/tzdata/zoneinfo/Mexico/General | Bin 773 -> 773 bytes libs/tzdata/zoneinfo/PST8PDT | Bin 951 -> 1294 bytes libs/tzdata/zoneinfo/Portugal | Bin 1454 -> 1463 bytes libs/tzdata/zoneinfo/WET | Bin 494 -> 1463 bytes libs/tzdata/zoneinfo/leapseconds | 8 +- libs/tzdata/zoneinfo/tzdata.zi | 1653 +- libs/tzdata/zoneinfo/zone.tab | 3 +- libs/tzdata/zoneinfo/zone1970.tab | 3 +- libs/tzdata/zoneinfo/zonenow.tab | 8 +- libs/tzdata/zones | 24 +- libs/tzlocal-5.2.dist-info/RECORD | 2 +- libs/tzlocal-5.2.dist-info/WHEEL | 2 +- libs/urllib3-2.2.1.dist-info/RECORD | 42 - .../INSTALLER | 0 .../METADATA | 5 +- libs/urllib3-2.2.3.dist-info/RECORD | 44 + .../REQUESTED | 0 libs/urllib3-2.2.3.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 0 libs/urllib3/_base_connection.py | 8 +- libs/urllib3/_collections.py | 6 +- libs/urllib3/_request_methods.py | 5 +- libs/urllib3/_version.py | 18 +- libs/urllib3/connection.py | 221 +- libs/urllib3/connectionpool.py | 18 +- libs/urllib3/contrib/emscripten/response.py | 19 +- libs/urllib3/contrib/pyopenssl.py | 4 + libs/urllib3/contrib/socks.py | 4 +- libs/urllib3/http2.py | 229 - libs/urllib3/http2/__init__.py | 53 + libs/urllib3/http2/connection.py | 356 + libs/urllib3/http2/probe.py | 87 + libs/urllib3/poolmanager.py | 11 +- libs/urllib3/response.py | 62 +- libs/urllib3/util/connection.py | 2 +- libs/urllib3/util/request.py | 4 +- libs/urllib3/util/retry.py | 10 +- libs/urllib3/util/ssl_.py | 24 +- libs/urllib3/util/ssltransport.py | 12 +- libs/version.txt | 108 +- libs/waitress-3.0.0.dist-info/RECORD | 2 +- libs/waitress-3.0.0.dist-info/WHEEL | 2 +- libs/websocket/__init__.py | 6 +- libs/websocket/_abnf.py | 4 +- libs/websocket/_app.py | 18 +- libs/websocket/_cookiejar.py | 20 +- libs/websocket/_core.py | 20 +- libs/websocket/_exceptions.py | 2 +- libs/websocket/_handshake.py | 10 +- libs/websocket/_http.py | 34 +- libs/websocket/_logging.py | 2 +- libs/websocket/_socket.py | 11 +- libs/websocket/_ssl_compat.py | 16 +- libs/websocket/_url.py | 5 +- libs/websocket/_utils.py | 2 +- libs/websocket/_wsdump.py | 2 +- libs/websocket/tests/echo-server.py | 2 +- libs/websocket/tests/test_abnf.py | 28 +- libs/websocket/tests/test_app.py | 53 +- libs/websocket/tests/test_cookiejar.py | 8 +- libs/websocket/tests/test_http.py | 29 +- libs/websocket/tests/test_url.py | 53 +- libs/websocket/tests/test_websocket.py | 82 +- libs/websocket_client-1.7.0.dist-info/RECORD | 34 - libs/websocket_client-1.7.0.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 2 +- .../METADATA | 15 +- libs/websocket_client-1.8.0.dist-info/RECORD | 34 + .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 0 .../top_level.txt | 0 libs/werkzeug-3.0.1.dist-info/RECORD | 74 - .../INSTALLER | 0 .../LICENSE.txt} | 0 .../METADATA | 71 +- libs/werkzeug-3.0.6.dist-info/RECORD | 74 + .../REQUESTED | 0 libs/werkzeug-3.0.6.dist-info/WHEEL | 4 + libs/werkzeug/_internal.py | 15 +- libs/werkzeug/_reloader.py | 31 +- libs/werkzeug/datastructures/auth.py | 8 +- .../werkzeug/datastructures/cache_control.pyi | 18 +- libs/werkzeug/datastructures/file_storage.pyi | 6 +- libs/werkzeug/datastructures/mixins.pyi | 2 +- libs/werkzeug/datastructures/structures.py | 12 +- libs/werkzeug/datastructures/structures.pyi | 28 +- libs/werkzeug/debug/__init__.py | 57 +- libs/werkzeug/debug/console.py | 2 +- libs/werkzeug/debug/repr.py | 15 +- libs/werkzeug/debug/shared/debugger.js | 36 +- libs/werkzeug/debug/tbtools.py | 21 +- libs/werkzeug/exceptions.py | 18 +- libs/werkzeug/formparser.py | 45 +- libs/werkzeug/http.py | 125 +- libs/werkzeug/local.py | 68 +- libs/werkzeug/middleware/dispatcher.py | 1 + libs/werkzeug/middleware/http_proxy.py | 1 + libs/werkzeug/middleware/lint.py | 49 +- libs/werkzeug/middleware/profiler.py | 1 + libs/werkzeug/middleware/proxy_fix.py | 1 + libs/werkzeug/middleware/shared_data.py | 11 +- libs/werkzeug/routing/__init__.py | 1 + libs/werkzeug/routing/converters.py | 16 +- libs/werkzeug/routing/exceptions.py | 16 +- libs/werkzeug/routing/map.py | 39 +- libs/werkzeug/routing/matcher.py | 2 +- libs/werkzeug/routing/rules.py | 65 +- libs/werkzeug/sansio/http.py | 4 +- libs/werkzeug/sansio/multipart.py | 2 + libs/werkzeug/sansio/request.py | 6 +- libs/werkzeug/sansio/response.py | 49 +- libs/werkzeug/sansio/utils.py | 2 +- libs/werkzeug/security.py | 14 +- libs/werkzeug/serving.py | 28 +- libs/werkzeug/test.py | 30 +- libs/werkzeug/testapp.py | 27 +- libs/werkzeug/urls.py | 25 +- libs/werkzeug/utils.py | 23 +- libs/werkzeug/wrappers/__init__.py | 2 +- libs/werkzeug/wrappers/request.py | 19 +- libs/werkzeug/wrappers/response.py | 30 +- libs/yaml/__init__.py | 2 +- libs/zipp-3.17.0.dist-info/RECORD | 10 - libs/zipp-3.17.0.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 70 +- libs/zipp-3.20.2.dist-info/RECORD | 12 + .../REQUESTED | 0 libs/zipp-3.20.2.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/zipp/__init__.py | 46 +- .../tests/data02 => zipp/compat}/__init__.py | 0 libs/zipp/compat/overlay.py | 37 + libs/zipp/{py310compat.py => compat/py310.py} | 4 +- libs/zipp/glob.py | 120 +- 1765 files changed, 48994 insertions(+), 61550 deletions(-) create mode 100644 libs/CHANGELOG.md delete mode 100644 libs/Flask_Cors-4.0.0.dist-info/RECORD rename libs/{Flask_Cors-4.0.0.dist-info => Flask_Cors-5.0.0.dist-info}/INSTALLER (100%) rename libs/{Flask_Cors-4.0.0.dist-info => Flask_Cors-5.0.0.dist-info}/LICENSE (100%) rename libs/{Flask_Cors-4.0.0.dist-info => Flask_Cors-5.0.0.dist-info}/METADATA (89%) create mode 100644 libs/Flask_Cors-5.0.0.dist-info/RECORD rename libs/{Flask_Cors-4.0.0.dist-info => Flask_Cors-5.0.0.dist-info}/REQUESTED (100%) rename libs/{Flask_Cors-4.0.0.dist-info => Flask_Cors-5.0.0.dist-info}/WHEEL (100%) rename libs/{Flask_Cors-4.0.0.dist-info => Flask_Cors-5.0.0.dist-info}/top_level.txt (100%) rename libs/{Flask_Migrate-4.0.5.dist-info => Flask_Migrate-4.0.7.dist-info}/INSTALLER (100%) rename libs/{Flask_Migrate-4.0.5.dist-info => Flask_Migrate-4.0.7.dist-info}/LICENSE (100%) rename libs/{Flask_Migrate-4.0.5.dist-info => Flask_Migrate-4.0.7.dist-info}/METADATA (95%) rename libs/{Flask_Migrate-4.0.5.dist-info => Flask_Migrate-4.0.7.dist-info}/RECORD (73%) rename libs/{Flask_Migrate-4.0.5.dist-info => Flask_Migrate-4.0.7.dist-info}/REQUESTED (100%) rename libs/{Flask_Migrate-4.0.5.dist-info => Flask_Migrate-4.0.7.dist-info}/WHEEL (65%) rename libs/{Flask_Migrate-4.0.5.dist-info => Flask_Migrate-4.0.7.dist-info}/top_level.txt (100%) delete mode 100644 libs/Flask_SocketIO-5.3.6.dist-info/RECORD rename libs/{Flask_SocketIO-5.3.6.dist-info => Flask_SocketIO-5.4.1.dist-info}/INSTALLER (100%) rename libs/{Flask_SocketIO-5.3.6.dist-info => Flask_SocketIO-5.4.1.dist-info}/LICENSE (100%) rename libs/{Flask_SocketIO-5.3.6.dist-info => Flask_SocketIO-5.4.1.dist-info}/METADATA (94%) create mode 100644 libs/Flask_SocketIO-5.4.1.dist-info/RECORD rename libs/{Flask_SocketIO-5.3.6.dist-info => Flask_SocketIO-5.4.1.dist-info}/REQUESTED (100%) rename libs/{Flask_SocketIO-5.3.6.dist-info => Flask_SocketIO-5.4.1.dist-info}/WHEEL (65%) rename libs/{Flask_SocketIO-5.3.6.dist-info => Flask_SocketIO-5.4.1.dist-info}/top_level.txt (100%) delete mode 100644 libs/Jinja2-3.1.3.dist-info/RECORD delete mode 100644 libs/Jinja2-3.1.3.dist-info/entry_points.txt delete mode 100644 libs/Jinja2-3.1.3.dist-info/top_level.txt rename libs/{Jinja2-3.1.3.dist-info => Mako-1.3.6.dist-info}/INSTALLER (100%) rename libs/{Mako-1.3.2.dist-info => Mako-1.3.6.dist-info}/LICENSE (100%) rename libs/{Mako-1.3.2.dist-info => Mako-1.3.6.dist-info}/METADATA (94%) rename libs/{Mako-1.3.2.dist-info => Mako-1.3.6.dist-info}/RECORD (74%) rename libs/{Jinja2-3.1.3.dist-info => Mako-1.3.6.dist-info}/REQUESTED (100%) rename libs/{Mako-1.3.2.dist-info => Mako-1.3.6.dist-info}/WHEEL (65%) rename libs/{Mako-1.3.2.dist-info => Mako-1.3.6.dist-info}/entry_points.txt (100%) rename libs/{Mako-1.3.2.dist-info => Mako-1.3.6.dist-info}/top_level.txt (100%) delete mode 100644 libs/Markdown-3.5.2.dist-info/LICENSE.md rename libs/{Mako-1.3.2.dist-info => Markdown-3.7.dist-info}/INSTALLER (100%) create mode 100644 libs/Markdown-3.7.dist-info/LICENSE.md rename libs/{Markdown-3.5.2.dist-info => Markdown-3.7.dist-info}/METADATA (76%) rename libs/{Markdown-3.5.2.dist-info => Markdown-3.7.dist-info}/RECORD (64%) rename libs/{Mako-1.3.2.dist-info => Markdown-3.7.dist-info}/REQUESTED (100%) rename libs/{Markdown-3.5.2.dist-info => Markdown-3.7.dist-info}/WHEEL (65%) rename libs/{Markdown-3.5.2.dist-info => Markdown-3.7.dist-info}/entry_points.txt (100%) rename libs/{Markdown-3.5.2.dist-info => Markdown-3.7.dist-info}/top_level.txt (100%) rename libs/{Markdown-3.5.2.dist-info => PyYAML-6.0.2.dist-info}/INSTALLER (100%) rename libs/{PyYAML-6.0.1.dist-info => PyYAML-6.0.2.dist-info}/LICENSE (100%) rename libs/{PyYAML-6.0.1.dist-info => PyYAML-6.0.2.dist-info}/METADATA (93%) rename libs/{PyYAML-6.0.1.dist-info => PyYAML-6.0.2.dist-info}/RECORD (71%) rename libs/{Markdown-3.5.2.dist-info => PyYAML-6.0.2.dist-info}/REQUESTED (100%) rename libs/{PyYAML-6.0.1.dist-info => PyYAML-6.0.2.dist-info}/WHEEL (70%) rename libs/{PyYAML-6.0.1.dist-info => PyYAML-6.0.2.dist-info}/top_level.txt (100%) rename libs/{ftfy-6.1.3.dist-info/METADATA => README.md} (83%) rename libs/{PyYAML-6.0.1.dist-info => SQLAlchemy-2.0.36.dist-info}/INSTALLER (100%) rename libs/{SQLAlchemy-2.0.27.dist-info => SQLAlchemy-2.0.36.dist-info}/LICENSE (100%) rename libs/{SQLAlchemy-2.0.27.dist-info => SQLAlchemy-2.0.36.dist-info}/METADATA (95%) rename libs/{SQLAlchemy-2.0.27.dist-info => SQLAlchemy-2.0.36.dist-info}/RECORD (53%) rename libs/{PyYAML-6.0.1.dist-info => SQLAlchemy-2.0.36.dist-info}/REQUESTED (100%) rename libs/{SQLAlchemy-2.0.27.dist-info => SQLAlchemy-2.0.36.dist-info}/WHEEL (70%) rename libs/{SQLAlchemy-2.0.27.dist-info => SQLAlchemy-2.0.36.dist-info}/top_level.txt (100%) delete mode 100644 libs/alembic-1.13.1.dist-info/WHEEL rename libs/{SQLAlchemy-2.0.27.dist-info => alembic-1.13.3.dist-info}/INSTALLER (100%) rename libs/{alembic-1.13.1.dist-info => alembic-1.13.3.dist-info}/LICENSE (95%) rename libs/{alembic-1.13.1.dist-info => alembic-1.13.3.dist-info}/METADATA (99%) rename libs/{alembic-1.13.1.dist-info => alembic-1.13.3.dist-info}/RECORD (56%) rename libs/{SQLAlchemy-2.0.27.dist-info => alembic-1.13.3.dist-info}/REQUESTED (100%) create mode 100644 libs/alembic-1.13.3.dist-info/WHEEL rename libs/{alembic-1.13.1.dist-info => alembic-1.13.3.dist-info}/entry_points.txt (100%) rename libs/{alembic-1.13.1.dist-info => alembic-1.13.3.dist-info}/top_level.txt (100%) delete mode 100644 libs/apprise-1.7.6.dist-info/RECORD rename libs/{alembic-1.13.1.dist-info => apprise-1.9.0.dist-info}/INSTALLER (100%) rename libs/{apprise-1.7.6.dist-info => apprise-1.9.0.dist-info}/LICENSE (100%) rename libs/{apprise-1.7.6.dist-info => apprise-1.9.0.dist-info}/METADATA (83%) create mode 100644 libs/apprise-1.9.0.dist-info/RECORD rename libs/{alembic-1.13.1.dist-info => apprise-1.9.0.dist-info}/REQUESTED (100%) rename libs/{Jinja2-3.1.3.dist-info => apprise-1.9.0.dist-info}/WHEEL (100%) rename libs/{apprise-1.7.6.dist-info => apprise-1.9.0.dist-info}/entry_points.txt (100%) rename libs/{apprise-1.7.6.dist-info => apprise-1.9.0.dist-info}/top_level.txt (100%) create mode 100644 libs/apprise/apprise.py create mode 100644 libs/apprise/apprise.pyi rename libs/apprise/{AppriseAttachment.py => apprise_attachment.py} (96%) rename libs/apprise/{AppriseAttachment.pyi => apprise_attachment.pyi} (100%) rename libs/apprise/{AppriseConfig.py => apprise_config.py} (99%) rename libs/apprise/{AppriseConfig.pyi => apprise_config.pyi} (100%) rename libs/apprise/{AppriseAsset.py => asset.py} (77%) rename libs/apprise/{AppriseAsset.pyi => asset.pyi} (100%) rename libs/apprise/attachment/{AttachBase.py => base.py} (84%) rename libs/apprise/attachment/{AttachBase.pyi => base.pyi} (100%) rename libs/apprise/attachment/{AttachFile.py => file.py} (92%) rename libs/apprise/attachment/{AttachHTTP.py => http.py} (98%) create mode 100644 libs/apprise/attachment/memory.py rename libs/apprise/config/{ConfigBase.py => base.py} (99%) rename libs/apprise/config/{ConfigBase.pyi => base.pyi} (100%) rename libs/apprise/config/{ConfigFile.py => file.py} (95%) rename libs/apprise/config/{ConfigHTTP.py => http.py} (98%) rename libs/apprise/config/{ConfigMemory.py => memory.py} (97%) rename libs/apprise/decorators/{CustomNotifyPlugin.py => base.py} (97%) create mode 100644 libs/apprise/exception.py rename libs/apprise/{AppriseLocale.py => locale.py} (100%) rename libs/apprise/{AttachmentManager.py => manager_attachment.py} (93%) rename libs/apprise/{ConfigurationManager.py => manager_config.py} (93%) rename libs/apprise/{NotificationManager.py => manager_plugins.py} (92%) create mode 100644 libs/apprise/persistent_store.py create mode 100644 libs/apprise/plugins/africas_talking.py rename libs/apprise/plugins/{NotifyAppriseAPI.py => apprise_api.py} (92%) rename libs/apprise/plugins/{NotifyAprs.py => aprs.py} (98%) rename libs/apprise/plugins/{NotifyBark.py => bark.py} (96%) rename libs/apprise/plugins/{NotifyBase.py => base.py} (92%) rename libs/apprise/plugins/{NotifyBase.pyi => base.pyi} (100%) rename libs/apprise/plugins/{NotifyBoxcar.py => boxcar.py} (97%) rename libs/apprise/plugins/{NotifyBulkSMS.py => bulksms.py} (96%) rename libs/apprise/plugins/{NotifyBulkVS.py => bulkvs.py} (97%) rename libs/apprise/plugins/{NotifyBurstSMS.py => burstsms.py} (97%) rename libs/apprise/plugins/{NotifyChantify.py => chantify.py} (94%) rename libs/apprise/plugins/{NotifyClickSend.py => clicksend.py} (92%) rename libs/apprise/plugins/{NotifyForm.py => custom_form.py} (96%) rename libs/apprise/plugins/{NotifyJSON.py => custom_json.py} (89%) rename libs/apprise/plugins/{NotifyXML.py => custom_xml.py} (89%) rename libs/apprise/plugins/{NotifyD7Networks.py => d7networks.py} (97%) rename libs/apprise/plugins/{NotifyDapnet.py => dapnet.py} (97%) rename libs/apprise/plugins/{NotifyDBus.py => dbus.py} (98%) rename libs/apprise/plugins/{NotifyDingTalk.py => dingtalk.py} (96%) rename libs/apprise/plugins/{NotifyDiscord.py => discord.py} (98%) rename libs/apprise/plugins/{NotifyEmail.py => email.py} (97%) rename libs/apprise/plugins/{NotifyEmby.py => emby.py} (97%) rename libs/apprise/plugins/{NotifyEnigma2.py => enigma2.py} (95%) rename libs/apprise/plugins/{NotifyFCM => fcm}/__init__.py (98%) rename libs/apprise/plugins/{NotifyFCM => fcm}/color.py (99%) rename libs/apprise/plugins/{NotifyFCM => fcm}/common.py (100%) rename libs/apprise/plugins/{NotifyFCM => fcm}/oauth.py (100%) rename libs/apprise/plugins/{NotifyFCM => fcm}/priority.py (100%) rename libs/apprise/plugins/{NotifyFeishu.py => feishu.py} (95%) rename libs/apprise/plugins/{NotifyFlock.py => flock.py} (97%) rename libs/apprise/plugins/{NotifyFreeMobile.py => freemobile.py} (94%) rename libs/apprise/plugins/{NotifyGnome.py => gnome.py} (97%) rename libs/apprise/plugins/{NotifyGoogleChat.py => google_chat.py} (96%) rename libs/apprise/plugins/{NotifyGotify.py => gotify.py} (94%) rename libs/apprise/plugins/{NotifyGrowl.py => growl.py} (96%) rename libs/apprise/plugins/{NotifyGuilded.py => guilded.py} (96%) rename libs/apprise/plugins/{NotifyHomeAssistant.py => home_assistant.py} (92%) rename libs/apprise/plugins/{NotifyHttpSMS.py => httpsms.py} (96%) rename libs/apprise/plugins/{NotifyIFTTT.py => ifttt.py} (97%) rename libs/apprise/plugins/{NotifyJoin.py => join.py} (97%) rename libs/apprise/plugins/{NotifyKavenegar.py => kavenegar.py} (97%) rename libs/apprise/plugins/{NotifyKumulos.py => kumulos.py} (95%) rename libs/apprise/plugins/{NotifyLametric.py => lametric.py} (97%) rename libs/apprise/plugins/{NotifyLine.py => line.py} (96%) rename libs/apprise/plugins/{NotifyLunaSea.py => lunasea.py} (94%) rename libs/apprise/plugins/{NotifyMacOSX.py => macosx.py} (97%) rename libs/apprise/plugins/{NotifyMailgun.py => mailgun.py} (97%) rename libs/apprise/plugins/{NotifyMastodon.py => mastodon.py} (98%) rename libs/apprise/plugins/{NotifyMatrix.py => matrix.py} (92%) rename libs/apprise/plugins/{NotifyMattermost.py => mattermost.py} (91%) rename libs/apprise/plugins/{NotifyMessageBird.py => messagebird.py} (97%) rename libs/apprise/plugins/{NotifyMisskey.py => misskey.py} (95%) rename libs/apprise/plugins/{NotifyMQTT.py => mqtt.py} (93%) rename libs/apprise/plugins/{NotifyMSG91.py => msg91.py} (97%) rename libs/apprise/plugins/{NotifyMSTeams.py => msteams.py} (96%) rename libs/apprise/plugins/{NotifyNextcloud.py => nextcloud.py} (96%) rename libs/apprise/plugins/{NotifyNextcloudTalk.py => nextcloudtalk.py} (95%) rename libs/apprise/plugins/{NotifyNotica.py => notica.py} (96%) rename libs/apprise/plugins/{NotifyNotifiarr.py => notifiarr.py} (86%) rename libs/apprise/plugins/{NotifyNotifico.py => notifico.py} (97%) rename libs/apprise/plugins/{NotifyNtfy.py => ntfy.py} (91%) rename libs/apprise/plugins/{NotifyOffice365.py => office365.py} (98%) rename libs/apprise/plugins/{NotifyOneSignal.py => one_signal.py} (78%) rename libs/apprise/plugins/{NotifyOpsgenie.py => opsgenie.py} (60%) rename libs/apprise/plugins/{NotifyPagerDuty.py => pagerduty.py} (97%) rename libs/apprise/plugins/{NotifyPagerTree.py => pagertree.py} (97%) rename libs/apprise/plugins/{NotifyParsePlatform.py => parseplatform.py} (95%) rename libs/apprise/plugins/{NotifyPopcornNotify.py => popcorn_notify.py} (96%) rename libs/apprise/plugins/{NotifyProwl.py => prowl.py} (96%) rename libs/apprise/plugins/{NotifyPushBullet.py => pushbullet.py} (96%) rename libs/apprise/plugins/{NotifyPushDeer.py => pushdeer.py} (93%) rename libs/apprise/plugins/{NotifyPushed.py => pushed.py} (96%) rename libs/apprise/plugins/{NotifyPushjet.py => pushjet.py} (94%) rename libs/apprise/plugins/{NotifyPushMe.py => pushme.py} (95%) rename libs/apprise/plugins/{NotifyPushover.py => pushover.py} (98%) rename libs/apprise/plugins/{NotifyPushSafer.py => pushsafer.py} (94%) rename libs/apprise/plugins/{NotifyPushy.py => pushy.py} (97%) rename libs/apprise/plugins/{NotifyReddit.py => reddit.py} (98%) rename libs/apprise/plugins/{NotifyRevolt.py => revolt.py} (97%) rename libs/apprise/plugins/{NotifyRocketChat.py => rocketchat.py} (97%) rename libs/apprise/plugins/{NotifyRSyslog.py => rsyslog.py} (96%) rename libs/apprise/plugins/{NotifyRyver.py => ryver.py} (96%) rename libs/apprise/plugins/{NotifySendGrid.py => sendgrid.py} (88%) rename libs/apprise/plugins/{NotifyServerChan.py => serverchan.py} (93%) rename libs/apprise/plugins/{NotifySES.py => ses.py} (97%) create mode 100644 libs/apprise/plugins/sfr.py rename libs/apprise/plugins/{NotifySignalAPI.py => signal_api.py} (93%) rename libs/apprise/plugins/{NotifySimplePush.py => simplepush.py} (96%) rename libs/apprise/plugins/{NotifySinch.py => sinch.py} (97%) rename libs/apprise/plugins/{NotifySlack.py => slack.py} (85%) rename libs/apprise/plugins/{NotifySMSEagle.py => smseagle.py} (94%) rename libs/apprise/plugins/{NotifySMSManager.py => smsmanager.py} (97%) rename libs/apprise/plugins/{NotifySMTP2Go.py => smtp2go.py} (93%) rename libs/apprise/plugins/{NotifySNS.py => sns.py} (98%) rename libs/apprise/plugins/{NotifySparkPost.py => sparkpost.py} (95%) create mode 100644 libs/apprise/plugins/splunk.py rename libs/apprise/plugins/{NotifyStreamlabs.py => streamlabs.py} (96%) rename libs/apprise/plugins/{NotifySynology.py => synology.py} (95%) rename libs/apprise/plugins/{NotifySyslog.py => syslog.py} (97%) rename libs/apprise/plugins/{NotifyTechulusPush.py => techuluspush.py} (95%) rename libs/apprise/plugins/{NotifyTelegram.py => telegram.py} (95%) rename libs/apprise/plugins/{NotifyThreema.py => threema.py} (96%) rename libs/apprise/plugins/{NotifyTwilio.py => twilio.py} (82%) rename libs/apprise/plugins/{NotifyTwist.py => twist.py} (98%) rename libs/apprise/plugins/{NotifyTwitter.py => twitter.py} (97%) rename libs/apprise/plugins/{NotifyVoipms.py => voipms.py} (96%) rename libs/apprise/plugins/{NotifyVonage.py => vonage.py} (97%) rename libs/apprise/plugins/{NotifyWebexTeams.py => webexteams.py} (96%) rename libs/apprise/plugins/{NotifyWeComBot.py => wecombot.py} (96%) rename libs/apprise/plugins/{NotifyWhatsApp.py => whatsapp.py} (98%) rename libs/apprise/plugins/{NotifyWindows.py => windows.py} (97%) create mode 100644 libs/apprise/plugins/workflows.py create mode 100644 libs/apprise/plugins/wxpusher.py rename libs/apprise/plugins/{NotifyXBMC.py => xbmc.py} (94%) rename libs/apprise/plugins/{NotifyZulip.py => zulip.py} (97%) rename libs/apprise/{URLBase.py => url.py} (81%) rename libs/apprise/{URLBase.pyi => url.pyi} (100%) delete mode 100644 libs/attrs-23.2.0.dist-info/RECORD rename libs/{apprise-1.7.6.dist-info => attrs-24.2.0.dist-info}/INSTALLER (100%) rename libs/{attrs-23.2.0.dist-info => attrs-24.2.0.dist-info}/METADATA (50%) create mode 100644 libs/attrs-24.2.0.dist-info/RECORD rename libs/{apprise-1.7.6.dist-info => attrs-24.2.0.dist-info}/REQUESTED (100%) rename libs/{attrs-23.2.0.dist-info => attrs-24.2.0.dist-info}/WHEEL (67%) rename libs/{attrs-23.2.0.dist-info => attrs-24.2.0.dist-info}/licenses/LICENSE (100%) rename libs/{attrs-23.2.0.dist-info => babelfish-0.6.1.dist-info}/INSTALLER (100%) rename libs/{babelfish-0.6.0.dist-info => babelfish-0.6.1.dist-info}/LICENSE (100%) rename libs/{babelfish-0.6.0.dist-info => babelfish-0.6.1.dist-info}/METADATA (89%) rename libs/{babelfish-0.6.0.dist-info => babelfish-0.6.1.dist-info}/RECORD (61%) rename libs/{attrs-23.2.0.dist-info => babelfish-0.6.1.dist-info}/REQUESTED (100%) rename libs/{babelfish-0.6.0.dist-info => babelfish-0.6.1.dist-info}/WHEEL (67%) create mode 100644 libs/babelfish/compat.py create mode 100755 libs/backports/zoneinfo/_czoneinfo.cpython-38-darwin.so create mode 100755 libs/bin/ftfy delete mode 100644 libs/blinker-1.7.0.dist-info/METADATA delete mode 100644 libs/blinker-1.7.0.dist-info/RECORD rename libs/{babelfish-0.6.0.dist-info => blinker-1.8.2.dist-info}/INSTALLER (100%) rename libs/{blinker-1.7.0.dist-info/LICENSE.rst => blinker-1.8.2.dist-info/LICENSE.txt} (100%) create mode 100644 libs/blinker-1.8.2.dist-info/METADATA create mode 100644 libs/blinker-1.8.2.dist-info/RECORD rename libs/{babelfish-0.6.0.dist-info => blinker-1.8.2.dist-info}/REQUESTED (100%) rename libs/{blinker-1.7.0.dist-info => blinker-1.8.2.dist-info}/WHEEL (100%) delete mode 100644 libs/blinker/_saferef.py delete mode 100644 libs/certifi-2024.2.2.dist-info/RECORD rename libs/{blinker-1.7.0.dist-info => certifi-2024.8.30.dist-info}/INSTALLER (100%) rename libs/{certifi-2024.2.2.dist-info => certifi-2024.8.30.dist-info}/LICENSE (100%) rename libs/{certifi-2024.2.2.dist-info => certifi-2024.8.30.dist-info}/METADATA (96%) create mode 100644 libs/certifi-2024.8.30.dist-info/RECORD rename libs/{blinker-1.7.0.dist-info => certifi-2024.8.30.dist-info}/REQUESTED (100%) rename libs/{apprise-1.7.6.dist-info => certifi-2024.8.30.dist-info}/WHEEL (100%) rename libs/{certifi-2024.2.2.dist-info => certifi-2024.8.30.dist-info}/top_level.txt (100%) delete mode 100644 libs/charset_normalizer-3.3.2.dist-info/RECORD rename libs/{certifi-2024.2.2.dist-info => charset_normalizer-3.4.0.dist-info}/INSTALLER (100%) rename libs/{charset_normalizer-3.3.2.dist-info => charset_normalizer-3.4.0.dist-info}/LICENSE (100%) rename libs/{charset_normalizer-3.3.2.dist-info => charset_normalizer-3.4.0.dist-info}/METADATA (98%) create mode 100644 libs/charset_normalizer-3.4.0.dist-info/RECORD rename libs/{certifi-2024.2.2.dist-info => charset_normalizer-3.4.0.dist-info}/REQUESTED (100%) rename libs/{certifi-2024.2.2.dist-info => charset_normalizer-3.4.0.dist-info}/WHEEL (100%) rename libs/{charset_normalizer-3.3.2.dist-info => charset_normalizer-3.4.0.dist-info}/entry_points.txt (100%) rename libs/{charset_normalizer-3.3.2.dist-info => charset_normalizer-3.4.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/dogpile.cache-1.3.2.dist-info/WHEEL rename libs/{charset_normalizer-3.3.2.dist-info => dogpile.cache-1.3.3.dist-info}/INSTALLER (100%) rename libs/{dogpile.cache-1.3.2.dist-info => dogpile.cache-1.3.3.dist-info}/LICENSE (100%) rename libs/{dogpile.cache-1.3.2.dist-info => dogpile.cache-1.3.3.dist-info}/METADATA (99%) rename libs/{dogpile.cache-1.3.2.dist-info => dogpile.cache-1.3.3.dist-info}/RECORD (70%) rename libs/{charset_normalizer-3.3.2.dist-info => dogpile.cache-1.3.3.dist-info}/REQUESTED (100%) create mode 100644 libs/dogpile.cache-1.3.3.dist-info/WHEEL rename libs/{dogpile.cache-1.3.2.dist-info => dogpile.cache-1.3.3.dist-info}/entry_points.txt (100%) rename libs/{dogpile.cache-1.3.2.dist-info => dogpile.cache-1.3.3.dist-info}/top_level.txt (100%) rename libs/{dogpile.cache-1.3.2.dist-info => dynaconf-3.2.6.dist-info}/INSTALLER (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/LICENSE (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/METADATA (97%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/RECORD (72%) rename libs/{dogpile.cache-1.3.2.dist-info => dynaconf-3.2.6.dist-info}/REQUESTED (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/WHEEL (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/box-LICENSE.txt (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/click-LICENSE.rst (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/entry_points.txt (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/licenses.sh (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/python-dotenv-LICENSE.txt (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/ruamel.yaml-LICENSE.txt (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/toml-LICENSE.txt (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/tomli-LICENSE.txt (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/top_level.txt (100%) rename libs/{dynaconf-3.2.4.dist-info => dynaconf-3.2.6.dist-info}/vendor_versions.txt (100%) delete mode 100644 libs/enzyme-0.4.1.dist-info/LICENSE delete mode 100644 libs/enzyme-0.4.1.dist-info/METADATA delete mode 100644 libs/enzyme-0.4.1.dist-info/RECORD rename libs/{dynaconf-3.2.4.dist-info => enzyme-0.5.2.dist-info}/INSTALLER (100%) create mode 100644 libs/enzyme-0.5.2.dist-info/LICENSE create mode 100644 libs/enzyme-0.5.2.dist-info/METADATA create mode 100644 libs/enzyme-0.5.2.dist-info/RECORD rename libs/{dynaconf-3.2.4.dist-info => enzyme-0.5.2.dist-info}/REQUESTED (100%) create mode 100644 libs/enzyme-0.5.2.dist-info/WHEEL rename libs/{enzyme-0.4.1.dist-info => enzyme-0.5.2.dist-info}/top_level.txt (100%) delete mode 100644 libs/enzyme/compat.py delete mode 100644 libs/enzyme/tests/__init__.py delete mode 100644 libs/enzyme/tests/parsers/ebml/test1.mkv.yml delete mode 100644 libs/enzyme/tests/test_mkv.py delete mode 100644 libs/enzyme/tests/test_parsers.py rename libs/{enzyme-0.4.1.dist-info => ffsubsync-0.4.26.dist-info}/INSTALLER (100%) rename libs/{ffsubsync-0.4.25.dist-info => ffsubsync-0.4.26.dist-info}/LICENSE (100%) rename libs/{ffsubsync-0.4.25.dist-info => ffsubsync-0.4.26.dist-info}/METADATA (99%) rename libs/{ffsubsync-0.4.25.dist-info => ffsubsync-0.4.26.dist-info}/RECORD (59%) rename libs/{enzyme-0.4.1.dist-info => ffsubsync-0.4.26.dist-info}/REQUESTED (100%) rename libs/{ffsubsync-0.4.25.dist-info => ffsubsync-0.4.26.dist-info}/WHEEL (70%) rename libs/{ffsubsync-0.4.25.dist-info => ffsubsync-0.4.26.dist-info}/entry_points.txt (100%) rename libs/{ffsubsync-0.4.25.dist-info => ffsubsync-0.4.26.dist-info}/top_level.txt (100%) rename libs/{ffsubsync-0.4.25.dist-info => flask-3.0.3.dist-info}/INSTALLER (100%) rename libs/{flask-3.0.2.dist-info/LICENSE.rst => flask-3.0.3.dist-info/LICENSE.txt} (100%) rename libs/{flask-3.0.2.dist-info => flask-3.0.3.dist-info}/METADATA (53%) rename libs/{flask-3.0.2.dist-info => flask-3.0.3.dist-info}/RECORD (59%) rename libs/{ffsubsync-0.4.25.dist-info => flask-3.0.3.dist-info}/REQUESTED (100%) rename libs/{flask-3.0.2.dist-info => flask-3.0.3.dist-info}/WHEEL (100%) rename libs/{flask-3.0.2.dist-info => flask-3.0.3.dist-info}/entry_points.txt (100%) delete mode 100644 libs/ftfy-6.1.3.dist-info/RECORD rename libs/{flask-3.0.2.dist-info => ftfy-6.2.3.dist-info}/INSTALLER (100%) rename libs/{ftfy-6.1.3.dist-info => ftfy-6.2.3.dist-info}/LICENSE.txt (100%) create mode 100644 libs/ftfy-6.2.3.dist-info/METADATA create mode 100644 libs/ftfy-6.2.3.dist-info/RECORD rename libs/{flask-3.0.2.dist-info => ftfy-6.2.3.dist-info}/REQUESTED (100%) rename libs/{ftfy-6.1.3.dist-info => ftfy-6.2.3.dist-info}/WHEEL (67%) rename libs/{ftfy-6.1.3.dist-info => ftfy-6.2.3.dist-info}/entry_points.txt (100%) rename libs/{ftfy-6.1.3.dist-info => idna-3.10.dist-info}/INSTALLER (100%) rename libs/{idna-3.6.dist-info => idna-3.10.dist-info}/LICENSE.md (96%) rename libs/{idna-3.6.dist-info => idna-3.10.dist-info}/METADATA (93%) create mode 100644 libs/idna-3.10.dist-info/RECORD rename libs/{ftfy-6.1.3.dist-info => idna-3.10.dist-info}/REQUESTED (100%) rename libs/{idna-3.6.dist-info => idna-3.10.dist-info}/WHEEL (100%) delete mode 100644 libs/idna-3.6.dist-info/RECORD delete mode 100644 libs/importlib_metadata-7.0.1.dist-info/RECORD delete mode 100644 libs/importlib_metadata-7.0.1.dist-info/WHEEL rename libs/{idna-3.6.dist-info => importlib_metadata-7.2.1.dist-info}/INSTALLER (100%) rename libs/{importlib_metadata-7.0.1.dist-info => importlib_metadata-7.2.1.dist-info}/LICENSE (100%) rename libs/{importlib_metadata-7.0.1.dist-info => importlib_metadata-7.2.1.dist-info}/METADATA (71%) create mode 100644 libs/importlib_metadata-7.2.1.dist-info/RECORD rename libs/{idna-3.6.dist-info => importlib_metadata-7.2.1.dist-info}/REQUESTED (100%) create mode 100644 libs/importlib_metadata-7.2.1.dist-info/WHEEL rename libs/{importlib_metadata-7.0.1.dist-info => importlib_metadata-7.2.1.dist-info}/top_level.txt (100%) rename libs/{importlib_resources/tests/data01 => importlib_metadata/compat}/__init__.py (100%) create mode 100644 libs/importlib_metadata/compat/py311.py rename libs/importlib_metadata/{_py39compat.py => compat/py39.py} (82%) delete mode 100644 libs/importlib_resources-6.1.2.dist-info/RECORD delete mode 100644 libs/importlib_resources-6.1.2.dist-info/WHEEL rename libs/{importlib_metadata-7.0.1.dist-info => importlib_resources-6.4.5.dist-info}/INSTALLER (100%) rename libs/{importlib_resources-6.1.2.dist-info => importlib_resources-6.4.5.dist-info}/LICENSE (100%) rename libs/{importlib_resources-6.1.2.dist-info => importlib_resources-6.4.5.dist-info}/METADATA (73%) create mode 100644 libs/importlib_resources-6.4.5.dist-info/RECORD rename libs/{importlib_metadata-7.0.1.dist-info => importlib_resources-6.4.5.dist-info}/REQUESTED (100%) create mode 100644 libs/importlib_resources-6.4.5.dist-info/WHEEL rename libs/{importlib_resources-6.1.2.dist-info => importlib_resources-6.4.5.dist-info}/top_level.txt (100%) create mode 100644 libs/importlib_resources/_functional.py delete mode 100644 libs/importlib_resources/tests/_compat.py rename libs/importlib_resources/tests/{data01/subdirectory => compat}/__init__.py (100%) create mode 100644 libs/importlib_resources/tests/compat/py312.py create mode 100644 libs/importlib_resources/tests/compat/py39.py delete mode 100644 libs/importlib_resources/tests/data01/binary.file delete mode 100644 libs/importlib_resources/tests/data01/subdirectory/binary.file delete mode 100644 libs/importlib_resources/tests/data01/utf-16.file delete mode 100644 libs/importlib_resources/tests/data01/utf-8.file delete mode 100644 libs/importlib_resources/tests/data02/one/__init__.py delete mode 100644 libs/importlib_resources/tests/data02/one/resource1.txt delete mode 100644 libs/importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt delete mode 100644 libs/importlib_resources/tests/data02/two/__init__.py delete mode 100644 libs/importlib_resources/tests/data02/two/resource2.txt delete mode 100644 libs/importlib_resources/tests/namespacedata01/binary.file delete mode 100644 libs/importlib_resources/tests/namespacedata01/subdirectory/binary.file delete mode 100644 libs/importlib_resources/tests/namespacedata01/utf-16.file delete mode 100644 libs/importlib_resources/tests/namespacedata01/utf-8.file create mode 100644 libs/importlib_resources/tests/test_functional.py delete mode 100644 libs/inflect-7.0.0.dist-info/RECORD delete mode 100644 libs/inflect-7.0.0.dist-info/WHEEL rename libs/{importlib_resources-6.1.2.dist-info => inflect-7.4.0.dist-info}/INSTALLER (100%) rename libs/{inflect-7.0.0.dist-info => inflect-7.4.0.dist-info}/LICENSE (100%) rename libs/{inflect-7.0.0.dist-info => inflect-7.4.0.dist-info}/METADATA (92%) create mode 100644 libs/inflect-7.4.0.dist-info/RECORD rename libs/{importlib_resources-6.1.2.dist-info => inflect-7.4.0.dist-info}/REQUESTED (100%) create mode 100644 libs/inflect-7.4.0.dist-info/WHEEL rename libs/{inflect-7.0.0.dist-info => inflect-7.4.0.dist-info}/top_level.txt (100%) create mode 100644 libs/inflect/compat/py38.py delete mode 100644 libs/inflect/compat/pydantic.py delete mode 100644 libs/inflect/compat/pydantic1.py delete mode 100644 libs/itsdangerous-2.1.2.dist-info/METADATA delete mode 100644 libs/itsdangerous-2.1.2.dist-info/RECORD delete mode 100644 libs/itsdangerous-2.1.2.dist-info/top_level.txt rename libs/{inflect-7.0.0.dist-info => itsdangerous-2.2.0.dist-info}/INSTALLER (100%) rename libs/{itsdangerous-2.1.2.dist-info/LICENSE.rst => itsdangerous-2.2.0.dist-info/LICENSE.txt} (100%) create mode 100644 libs/itsdangerous-2.2.0.dist-info/METADATA create mode 100644 libs/itsdangerous-2.2.0.dist-info/RECORD rename libs/{inflect-7.0.0.dist-info => itsdangerous-2.2.0.dist-info}/REQUESTED (100%) rename libs/{pyparsing-3.1.1.dist-info => itsdangerous-2.2.0.dist-info}/WHEEL (100%) rename libs/{itsdangerous-2.1.2.dist-info => jinja2-3.1.4.dist-info}/INSTALLER (100%) rename libs/{Jinja2-3.1.3.dist-info/LICENSE.rst => jinja2-3.1.4.dist-info/LICENSE.txt} (100%) rename libs/{Jinja2-3.1.3.dist-info => jinja2-3.1.4.dist-info}/METADATA (66%) create mode 100644 libs/jinja2-3.1.4.dist-info/RECORD rename libs/{itsdangerous-2.1.2.dist-info => jinja2-3.1.4.dist-info}/REQUESTED (100%) rename libs/{typing_extensions-4.10.0.dist-info => jinja2-3.1.4.dist-info}/WHEEL (100%) create mode 100644 libs/jinja2-3.1.4.dist-info/entry_points.txt create mode 100755 libs/markupsafe/_speedups.cpython-38-darwin.so delete mode 100644 libs/msgpack-1.0.7.dist-info/RECORD rename libs/{msgpack-1.0.7.dist-info => msgpack-1.1.0.dist-info}/COPYING (100%) rename libs/{msgpack-1.0.7.dist-info => msgpack-1.1.0.dist-info}/INSTALLER (100%) rename libs/{msgpack-1.0.7.dist-info => msgpack-1.1.0.dist-info}/METADATA (79%) create mode 100644 libs/msgpack-1.1.0.dist-info/RECORD rename libs/{msgpack-1.0.7.dist-info => msgpack-1.1.0.dist-info}/REQUESTED (100%) rename libs/{msgpack-1.0.7.dist-info => msgpack-1.1.0.dist-info}/WHEEL (70%) rename libs/{msgpack-1.0.7.dist-info => msgpack-1.1.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/msgpack/_cmsgpack.cpp create mode 100755 libs/msgpack/_cmsgpack.cpython-38-darwin.so delete mode 100644 libs/msgpack/_cmsgpack.pyx delete mode 100644 libs/msgpack/_packer.pyx delete mode 100644 libs/msgpack/_unpacker.pyx delete mode 100644 libs/msgpack/buff_converter.h delete mode 100644 libs/msgpack/pack.h delete mode 100644 libs/msgpack/pack_template.h delete mode 100644 libs/msgpack/sysdep.h delete mode 100644 libs/msgpack/unpack.h delete mode 100644 libs/msgpack/unpack_define.h delete mode 100644 libs/msgpack/unpack_template.h delete mode 100644 libs/platformdirs-4.2.0.dist-info/RECORD rename libs/{platformdirs-4.2.0.dist-info => platformdirs-4.3.6.dist-info}/INSTALLER (100%) rename libs/{platformdirs-4.2.0.dist-info => platformdirs-4.3.6.dist-info}/METADATA (89%) create mode 100644 libs/platformdirs-4.3.6.dist-info/RECORD rename libs/{platformdirs-4.2.0.dist-info => platformdirs-4.3.6.dist-info}/REQUESTED (100%) rename libs/{pygments-2.17.2.dist-info => platformdirs-4.3.6.dist-info}/WHEEL (67%) rename libs/{platformdirs-4.2.0.dist-info => platformdirs-4.3.6.dist-info}/licenses/LICENSE (100%) create mode 100755 libs/pvectorc.cpython-38-darwin.so delete mode 100644 libs/pycountry-23.12.11.dist-info/METADATA delete mode 100644 libs/pycountry-23.12.11.dist-info/WHEEL rename libs/{pycountry-23.12.11.dist-info => pycountry-24.6.1.dist-info}/INSTALLER (100%) rename libs/{pycountry-23.12.11.dist-info => pycountry-24.6.1.dist-info}/LICENSE.txt (100%) create mode 100644 libs/pycountry-24.6.1.dist-info/METADATA rename libs/{pycountry-23.12.11.dist-info => pycountry-24.6.1.dist-info}/RECORD (80%) rename libs/{pycountry-23.12.11.dist-info => pycountry-24.6.1.dist-info}/REQUESTED (100%) create mode 100644 libs/pycountry-24.6.1.dist-info/WHEEL create mode 100644 libs/pycountry/COPYRIGHT.txt create mode 100644 libs/pycountry/locales/km/LC_MESSAGES/iso3166-2.mo create mode 100644 libs/pycountry/locales/km/LC_MESSAGES/iso4217.mo create mode 100644 libs/pycountry/locales/lt/LC_MESSAGES/iso639-5.mo delete mode 100644 libs/pycountry/locales/nb/LC_MESSAGES/iso3166-1.mo delete mode 100644 libs/pycountry/locales/nb/LC_MESSAGES/iso3166-3.mo rename libs/pycountry/locales/{nb => nb_NO}/LC_MESSAGES/iso15924.mo (100%) create mode 100644 libs/pycountry/locales/nb_NO/LC_MESSAGES/iso3166-1.mo create mode 100644 libs/pycountry/locales/nb_NO/LC_MESSAGES/iso3166-3.mo rename libs/pycountry/locales/{nb => nb_NO}/LC_MESSAGES/iso4217.mo (100%) rename libs/pycountry/locales/{nb => nb_NO}/LC_MESSAGES/iso639-3.mo (100%) create mode 100644 libs/pycountry/locales/ro/LC_MESSAGES/iso639-5.mo rename libs/pycountry/locales/{mo => ro_MD}/LC_MESSAGES/iso3166-1.mo (100%) create mode 100644 libs/pycountry/locales/ta/LC_MESSAGES/iso15924.mo create mode 100644 libs/pycountry/locales/ta/LC_MESSAGES/iso3166-2.mo create mode 100644 libs/pycountry/locales/ta/LC_MESSAGES/iso4217.mo create mode 100644 libs/pycountry/locales/ta/LC_MESSAGES/iso639-5.mo delete mode 100644 libs/pygments-2.17.2.dist-info/RECORD rename libs/{pygments-2.17.2.dist-info => pygments-2.18.0.dist-info}/INSTALLER (100%) rename libs/{pygments-2.17.2.dist-info => pygments-2.18.0.dist-info}/METADATA (90%) create mode 100644 libs/pygments-2.18.0.dist-info/RECORD rename libs/{pygments-2.17.2.dist-info => pygments-2.18.0.dist-info}/REQUESTED (100%) rename libs/{urllib3-2.2.1.dist-info => pygments-2.18.0.dist-info}/WHEEL (67%) rename libs/{pygments-2.17.2.dist-info => pygments-2.18.0.dist-info}/entry_points.txt (100%) rename libs/{pygments-2.17.2.dist-info => pygments-2.18.0.dist-info}/licenses/AUTHORS (97%) rename libs/{pygments-2.17.2.dist-info => pygments-2.18.0.dist-info}/licenses/LICENSE (100%) create mode 100644 libs/pygments/lexers/_luau_builtins.py create mode 100644 libs/pygments/lexers/mojo.py create mode 100644 libs/pygments/lexers/soong.py create mode 100644 libs/pygments/lexers/tact.py create mode 100644 libs/pygments/lexers/typst.py create mode 100644 libs/pygments/styles/coffee.py delete mode 100644 libs/pyparsing-3.1.1.dist-info/RECORD rename libs/{pyparsing-3.1.1.dist-info => pyparsing-3.1.4.dist-info}/INSTALLER (100%) rename libs/{pyparsing-3.1.1.dist-info => pyparsing-3.1.4.dist-info}/LICENSE (100%) rename libs/{pyparsing-3.1.1.dist-info => pyparsing-3.1.4.dist-info}/METADATA (98%) create mode 100644 libs/pyparsing-3.1.4.dist-info/RECORD rename libs/{pyparsing-3.1.1.dist-info => pyparsing-3.1.4.dist-info}/REQUESTED (100%) rename libs/{werkzeug-3.0.1.dist-info => pyparsing-3.1.4.dist-info}/WHEEL (100%) delete mode 100644 libs/pysubs2-1.7.2.dist-info/RECORD delete mode 100644 libs/pysubs2-1.7.2.dist-info/WHEEL rename libs/{pysubs2-1.7.2.dist-info => pysubs2-1.7.3.dist-info}/INSTALLER (100%) rename libs/{pysubs2-1.7.2.dist-info => pysubs2-1.7.3.dist-info}/LICENSE.txt (100%) rename libs/{pysubs2-1.7.2.dist-info => pysubs2-1.7.3.dist-info}/METADATA (99%) create mode 100644 libs/pysubs2-1.7.3.dist-info/RECORD rename libs/{pysubs2-1.7.2.dist-info => pysubs2-1.7.3.dist-info}/REQUESTED (100%) create mode 100644 libs/pysubs2-1.7.3.dist-info/WHEEL rename libs/{pysubs2-1.7.2.dist-info => pysubs2-1.7.3.dist-info}/entry_points.txt (100%) rename libs/{pysubs2-1.7.2.dist-info => pysubs2-1.7.3.dist-info}/top_level.txt (100%) delete mode 100644 libs/python_dateutil-2.8.2.dist-info/RECORD rename libs/{python_dateutil-2.8.2.dist-info => python_dateutil-2.9.0.dist-info}/INSTALLER (100%) rename libs/{python_dateutil-2.8.2.dist-info => python_dateutil-2.9.0.dist-info}/LICENSE (100%) rename libs/{python_dateutil-2.8.2.dist-info => python_dateutil-2.9.0.dist-info}/METADATA (97%) create mode 100644 libs/python_dateutil-2.9.0.dist-info/RECORD rename libs/{python_dateutil-2.8.2.dist-info => python_dateutil-2.9.0.dist-info}/REQUESTED (100%) rename libs/{python_dateutil-2.8.2.dist-info => python_dateutil-2.9.0.dist-info}/WHEEL (70%) rename libs/{python_dateutil-2.8.2.dist-info => python_dateutil-2.9.0.dist-info}/top_level.txt (100%) rename libs/{python_dateutil-2.8.2.dist-info => python_dateutil-2.9.0.dist-info}/zip-safe (100%) rename libs/{python_engineio-4.9.0.dist-info => python_engineio-4.10.1.dist-info}/INSTALLER (100%) rename libs/{python_engineio-4.9.0.dist-info => python_engineio-4.10.1.dist-info}/LICENSE (100%) rename libs/{python_engineio-4.9.0.dist-info => python_engineio-4.10.1.dist-info}/METADATA (99%) rename libs/{python_engineio-4.9.0.dist-info => python_engineio-4.10.1.dist-info}/RECORD (59%) rename libs/{python_engineio-4.9.0.dist-info => python_engineio-4.10.1.dist-info}/REQUESTED (100%) create mode 100644 libs/python_engineio-4.10.1.dist-info/WHEEL rename libs/{python_engineio-4.9.0.dist-info => python_engineio-4.10.1.dist-info}/top_level.txt (100%) delete mode 100644 libs/python_engineio-4.9.0.dist-info/WHEEL delete mode 100644 libs/python_socketio-5.11.1.dist-info/WHEEL rename libs/{python_socketio-5.11.1.dist-info => python_socketio-5.11.4.dist-info}/INSTALLER (100%) rename libs/{python_socketio-5.11.1.dist-info => python_socketio-5.11.4.dist-info}/LICENSE (100%) rename libs/{python_socketio-5.11.1.dist-info => python_socketio-5.11.4.dist-info}/METADATA (99%) rename libs/{python_socketio-5.11.1.dist-info => python_socketio-5.11.4.dist-info}/RECORD (51%) rename libs/{python_socketio-5.11.1.dist-info => python_socketio-5.11.4.dist-info}/REQUESTED (100%) create mode 100644 libs/python_socketio-5.11.4.dist-info/WHEEL rename libs/{python_socketio-5.11.1.dist-info => python_socketio-5.11.4.dist-info}/top_level.txt (100%) rename libs/{pytz-2024.1.dist-info => pytz-2024.2.dist-info}/INSTALLER (100%) rename libs/{pytz-2024.1.dist-info => pytz-2024.2.dist-info}/LICENSE.txt (100%) rename libs/{pytz-2024.1.dist-info => pytz-2024.2.dist-info}/METADATA (99%) rename libs/{pytz-2024.1.dist-info => pytz-2024.2.dist-info}/RECORD (91%) rename libs/{pytz-2024.1.dist-info => pytz-2024.2.dist-info}/REQUESTED (100%) rename libs/{charset_normalizer-3.3.2.dist-info => pytz-2024.2.dist-info}/WHEEL (100%) rename libs/{pytz-2024.1.dist-info => pytz-2024.2.dist-info}/top_level.txt (100%) rename libs/{pytz-2024.1.dist-info => pytz-2024.2.dist-info}/zip-safe (100%) delete mode 100644 libs/rarfile-4.1.dist-info/RECORD delete mode 100644 libs/rarfile-4.1.dist-info/WHEEL rename libs/{rarfile-4.1.dist-info => rarfile-4.2.dist-info}/INSTALLER (100%) rename libs/{rarfile-4.1.dist-info => rarfile-4.2.dist-info}/LICENSE (92%) rename libs/{rarfile-4.1.dist-info => rarfile-4.2.dist-info}/METADATA (95%) create mode 100644 libs/rarfile-4.2.dist-info/RECORD rename libs/{rarfile-4.1.dist-info => rarfile-4.2.dist-info}/REQUESTED (100%) rename libs/{enzyme-0.4.1.dist-info => rarfile-4.2.dist-info}/WHEEL (100%) rename libs/{rarfile-4.1.dist-info => rarfile-4.2.dist-info}/top_level.txt (100%) delete mode 100644 libs/requests-2.31.0.dist-info/RECORD delete mode 100644 libs/requests-2.31.0.dist-info/WHEEL rename libs/{requests-2.31.0.dist-info => requests-2.32.3.dist-info}/INSTALLER (100%) rename libs/{requests-2.31.0.dist-info => requests-2.32.3.dist-info}/LICENSE (100%) rename libs/{requests-2.31.0.dist-info => requests-2.32.3.dist-info}/METADATA (89%) create mode 100644 libs/requests-2.32.3.dist-info/RECORD rename libs/{requests-2.31.0.dist-info => requests-2.32.3.dist-info}/REQUESTED (100%) create mode 100644 libs/requests-2.32.3.dist-info/WHEEL rename libs/{requests-2.31.0.dist-info => requests-2.32.3.dist-info}/top_level.txt (100%) delete mode 100644 libs/requests_oauthlib-1.3.1.dist-info/RECORD rename libs/{requests_oauthlib-1.3.1.dist-info => requests_oauthlib-2.0.0.dist-info}/INSTALLER (100%) rename libs/{requests_oauthlib-1.3.1.dist-info => requests_oauthlib-2.0.0.dist-info}/LICENSE (100%) rename libs/{requests_oauthlib-1.3.1.dist-info => requests_oauthlib-2.0.0.dist-info}/METADATA (88%) create mode 100644 libs/requests_oauthlib-2.0.0.dist-info/RECORD rename libs/{requests_oauthlib-1.3.1.dist-info => requests_oauthlib-2.0.0.dist-info}/REQUESTED (100%) rename libs/{requests_oauthlib-1.3.1.dist-info => requests_oauthlib-2.0.0.dist-info}/WHEEL (100%) rename libs/{requests_oauthlib-1.3.1.dist-info => requests_oauthlib-2.0.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/rich-13.7.0.dist-info/WHEEL rename libs/{rich-13.7.0.dist-info => rich-13.9.3.dist-info}/INSTALLER (100%) rename libs/{rich-13.7.0.dist-info => rich-13.9.3.dist-info}/LICENSE (100%) rename libs/{rich-13.7.0.dist-info => rich-13.9.3.dist-info}/METADATA (96%) rename libs/{rich-13.7.0.dist-info => rich-13.9.3.dist-info}/RECORD (58%) rename libs/{rich-13.7.0.dist-info => rich-13.9.3.dist-info}/REQUESTED (100%) create mode 100644 libs/rich-13.9.3.dist-info/WHEEL delete mode 100644 libs/simple_websocket-1.0.0.dist-info/RECORD delete mode 100644 libs/simple_websocket-1.0.0.dist-info/WHEEL rename libs/{simple_websocket-1.0.0.dist-info => simple_websocket-1.1.0.dist-info}/INSTALLER (100%) rename libs/{simple_websocket-1.0.0.dist-info => simple_websocket-1.1.0.dist-info}/LICENSE (100%) rename libs/{simple_websocket-1.0.0.dist-info => simple_websocket-1.1.0.dist-info}/METADATA (78%) create mode 100644 libs/simple_websocket-1.1.0.dist-info/RECORD rename libs/{simple_websocket-1.0.0.dist-info => simple_websocket-1.1.0.dist-info}/REQUESTED (100%) create mode 100644 libs/simple_websocket-1.1.0.dist-info/WHEEL rename libs/{simple_websocket-1.0.0.dist-info => simple_websocket-1.1.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/sqlalchemy/cyextension/.gitignore create mode 100755 libs/sqlalchemy/cyextension/collections.cpython-38-darwin.so create mode 100755 libs/sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so create mode 100755 libs/sqlalchemy/cyextension/processors.cpython-38-darwin.so create mode 100755 libs/sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so create mode 100755 libs/sqlalchemy/cyextension/util.cpython-38-darwin.so delete mode 100644 libs/stevedore-5.2.0.dist-info/WHEEL delete mode 100644 libs/stevedore-5.2.0.dist-info/pbr.json rename libs/{stevedore-5.2.0.dist-info => stevedore-5.3.0.dist-info}/AUTHORS (100%) rename libs/{stevedore-5.2.0.dist-info => stevedore-5.3.0.dist-info}/INSTALLER (100%) rename libs/{stevedore-5.2.0.dist-info => stevedore-5.3.0.dist-info}/LICENSE (100%) rename libs/{stevedore-5.2.0.dist-info => stevedore-5.3.0.dist-info}/METADATA (97%) rename libs/{stevedore-5.2.0.dist-info => stevedore-5.3.0.dist-info}/RECORD (82%) rename libs/{stevedore-5.2.0.dist-info => stevedore-5.3.0.dist-info}/REQUESTED (100%) rename libs/{itsdangerous-2.1.2.dist-info => stevedore-5.3.0.dist-info}/WHEEL (100%) rename libs/{stevedore-5.2.0.dist-info => stevedore-5.3.0.dist-info}/entry_points.txt (100%) create mode 100644 libs/stevedore-5.3.0.dist-info/pbr.json rename libs/{stevedore-5.2.0.dist-info => stevedore-5.3.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/textdistance-4.6.2.dist-info/WHEEL rename libs/{textdistance-4.6.2.dist-info => textdistance-4.6.3.dist-info}/INSTALLER (100%) rename libs/{textdistance-4.6.2.dist-info => textdistance-4.6.3.dist-info}/LICENSE (100%) rename libs/{textdistance-4.6.2.dist-info => textdistance-4.6.3.dist-info}/METADATA (78%) rename libs/{textdistance-4.6.2.dist-info => textdistance-4.6.3.dist-info}/RECORD (70%) rename libs/{textdistance-4.6.2.dist-info => textdistance-4.6.3.dist-info}/REQUESTED (100%) create mode 100644 libs/textdistance-4.6.3.dist-info/WHEEL rename libs/{textdistance-4.6.2.dist-info => textdistance-4.6.3.dist-info}/top_level.txt (100%) delete mode 100644 libs/tqdm-4.66.2.dist-info/RECORD delete mode 100644 libs/tqdm-4.66.2.dist-info/WHEEL rename libs/{tqdm-4.66.2.dist-info => tqdm-4.66.6.dist-info}/INSTALLER (100%) rename libs/{tqdm-4.66.2.dist-info => tqdm-4.66.6.dist-info}/LICENCE (100%) rename libs/{tqdm-4.66.2.dist-info => tqdm-4.66.6.dist-info}/METADATA (98%) create mode 100644 libs/tqdm-4.66.6.dist-info/RECORD rename libs/{tqdm-4.66.2.dist-info => tqdm-4.66.6.dist-info}/REQUESTED (100%) create mode 100644 libs/tqdm-4.66.6.dist-info/WHEEL rename libs/{tqdm-4.66.2.dist-info => tqdm-4.66.6.dist-info}/entry_points.txt (100%) rename libs/{tqdm-4.66.2.dist-info => tqdm-4.66.6.dist-info}/top_level.txt (100%) delete mode 100644 libs/trakit-0.2.1.dist-info/WHEEL rename libs/{trakit-0.2.1.dist-info => trakit-0.2.2.dist-info}/INSTALLER (100%) rename libs/{trakit-0.2.1.dist-info => trakit-0.2.2.dist-info}/LICENSE (100%) rename libs/{trakit-0.2.1.dist-info => trakit-0.2.2.dist-info}/METADATA (98%) rename libs/{trakit-0.2.1.dist-info => trakit-0.2.2.dist-info}/RECORD (60%) rename libs/{trakit-0.2.1.dist-info => trakit-0.2.2.dist-info}/REQUESTED (100%) create mode 100644 libs/trakit-0.2.2.dist-info/WHEEL rename libs/{trakit-0.2.1.dist-info => trakit-0.2.2.dist-info}/entry_points.txt (100%) delete mode 100644 libs/typing_extensions-4.10.0.dist-info/RECORD rename libs/{typing_extensions-4.10.0.dist-info => typing_extensions-4.12.2.dist-info}/INSTALLER (100%) rename libs/{typing_extensions-4.10.0.dist-info => typing_extensions-4.12.2.dist-info}/LICENSE (100%) rename libs/{typing_extensions-4.10.0.dist-info => typing_extensions-4.12.2.dist-info}/METADATA (97%) create mode 100644 libs/typing_extensions-4.12.2.dist-info/RECORD rename libs/{typing_extensions-4.10.0.dist-info => typing_extensions-4.12.2.dist-info}/REQUESTED (100%) rename libs/{platformdirs-4.2.0.dist-info => typing_extensions-4.12.2.dist-info}/WHEEL (67%) rename libs/{tzdata-2024.1.dist-info => tzdata-2024.2.dist-info}/INSTALLER (100%) rename libs/{tzdata-2024.1.dist-info => tzdata-2024.2.dist-info}/LICENSE (100%) rename libs/{tzdata-2024.1.dist-info => tzdata-2024.2.dist-info}/LICENSE_APACHE (100%) rename libs/{tzdata-2024.1.dist-info => tzdata-2024.2.dist-info}/METADATA (98%) rename libs/{tzdata-2024.1.dist-info => tzdata-2024.2.dist-info}/RECORD (91%) rename libs/{tzdata-2024.1.dist-info => tzdata-2024.2.dist-info}/REQUESTED (100%) rename libs/{tzdata-2024.1.dist-info => tzdata-2024.2.dist-info}/WHEEL (70%) rename libs/{tzdata-2024.1.dist-info => tzdata-2024.2.dist-info}/top_level.txt (100%) delete mode 100644 libs/urllib3-2.2.1.dist-info/RECORD rename libs/{urllib3-2.2.1.dist-info => urllib3-2.2.3.dist-info}/INSTALLER (100%) rename libs/{urllib3-2.2.1.dist-info => urllib3-2.2.3.dist-info}/METADATA (98%) create mode 100644 libs/urllib3-2.2.3.dist-info/RECORD rename libs/{urllib3-2.2.1.dist-info => urllib3-2.2.3.dist-info}/REQUESTED (100%) create mode 100644 libs/urllib3-2.2.3.dist-info/WHEEL rename libs/{urllib3-2.2.1.dist-info => urllib3-2.2.3.dist-info}/licenses/LICENSE.txt (100%) delete mode 100644 libs/urllib3/http2.py create mode 100644 libs/urllib3/http2/__init__.py create mode 100644 libs/urllib3/http2/connection.py create mode 100644 libs/urllib3/http2/probe.py delete mode 100644 libs/websocket_client-1.7.0.dist-info/RECORD delete mode 100644 libs/websocket_client-1.7.0.dist-info/WHEEL rename libs/{websocket_client-1.7.0.dist-info => websocket_client-1.8.0.dist-info}/INSTALLER (100%) rename libs/{websocket_client-1.7.0.dist-info => websocket_client-1.8.0.dist-info}/LICENSE (99%) rename libs/{websocket_client-1.7.0.dist-info => websocket_client-1.8.0.dist-info}/METADATA (95%) create mode 100644 libs/websocket_client-1.8.0.dist-info/RECORD rename libs/{websocket_client-1.7.0.dist-info => websocket_client-1.8.0.dist-info}/REQUESTED (100%) rename libs/{pytz-2024.1.dist-info => websocket_client-1.8.0.dist-info}/WHEEL (100%) rename libs/{websocket_client-1.7.0.dist-info => websocket_client-1.8.0.dist-info}/entry_points.txt (100%) rename libs/{websocket_client-1.7.0.dist-info => websocket_client-1.8.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/werkzeug-3.0.1.dist-info/RECORD rename libs/{werkzeug-3.0.1.dist-info => werkzeug-3.0.6.dist-info}/INSTALLER (100%) rename libs/{werkzeug-3.0.1.dist-info/LICENSE.rst => werkzeug-3.0.6.dist-info/LICENSE.txt} (100%) rename libs/{werkzeug-3.0.1.dist-info => werkzeug-3.0.6.dist-info}/METADATA (69%) create mode 100644 libs/werkzeug-3.0.6.dist-info/RECORD rename libs/{werkzeug-3.0.1.dist-info => werkzeug-3.0.6.dist-info}/REQUESTED (100%) create mode 100644 libs/werkzeug-3.0.6.dist-info/WHEEL delete mode 100644 libs/zipp-3.17.0.dist-info/RECORD delete mode 100644 libs/zipp-3.17.0.dist-info/WHEEL rename libs/{zipp-3.17.0.dist-info => zipp-3.20.2.dist-info}/INSTALLER (100%) rename libs/{zipp-3.17.0.dist-info => zipp-3.20.2.dist-info}/LICENSE (100%) rename libs/{zipp-3.17.0.dist-info => zipp-3.20.2.dist-info}/METADATA (55%) create mode 100644 libs/zipp-3.20.2.dist-info/RECORD rename libs/{zipp-3.17.0.dist-info => zipp-3.20.2.dist-info}/REQUESTED (100%) create mode 100644 libs/zipp-3.20.2.dist-info/WHEEL rename libs/{zipp-3.17.0.dist-info => zipp-3.20.2.dist-info}/top_level.txt (100%) rename libs/{importlib_resources/tests/data02 => zipp/compat}/__init__.py (100%) create mode 100644 libs/zipp/compat/overlay.py rename libs/zipp/{py310compat.py => compat/py310.py} (51%) diff --git a/libs/CHANGELOG.md b/libs/CHANGELOG.md new file mode 100644 index 000000000..042259839 --- /dev/null +++ b/libs/CHANGELOG.md @@ -0,0 +1,638 @@ +## Version 6.2.0 (March 16, 2024) + +- Fixed a case where an en-dash and a space near other mojibake would be + interpreted (probably incorrectly) as MacRoman mojibake. +- Added [project.urls] metadata to pyproject.toml. +- README contains license clarifications for entitled jerks. + +## Version 6.1.3 (November 21, 2023) + +- Updated wcwidth. +- Switched to the Apache 2.0 license. +- Dropped support for Python 3.7. + +## Version 6.1.2 (February 17, 2022) + +- Added type information for `guess_bytes`. + +## Version 6.1.1 (February 9, 2022) + +- Updated the heuristic to fix the letter ß in UTF-8/MacRoman mojibake, + which had regressed since version 5.6. + +- Packaging fixes to pyproject.toml. + +## Version 6.1 (February 9, 2022) + +- Updated the heuristic to fix the letter Ñ with more confidence. + +- Fixed type annotations and added py.typed. + +- ftfy is packaged using Poetry now, and wheels are created and uploaded to + PyPI. + +## Version 6.0.3 (May 14, 2021) + +- Allow the keyword argument `fix_entities` as a deprecated alias for + `unescape_html`, raising a warning. + +- `ftfy.formatting` functions now disregard ANSI terminal escapes when + calculating text width. + + +## Version 6.0.2 (May 4, 2021) + +This version is purely a cosmetic change, updating the maintainer's e-mail +address and the project's canonical location on GitHub. + + +## Version 6.0.1 (April 12, 2021) + +- The `remove_terminal_escapes` step was accidentally not being used. This + version restores it. + +- Specified in setup.py that ftfy 6 requires Python 3.6 or later. + +- Use a lighter link color when the docs are viewed in dark mode. + +## Version 6.0 (April 2, 2021) + +- New function: `ftfy.fix_and_explain()` can describe all the transformations + that happen when fixing a string. This is similar to what + `ftfy.fixes.fix_encoding_and_explain()` did in previous versions, but it + can fix more than the encoding. + +- `fix_and_explain()` and `fix_encoding_and_explain()` are now in the top-level + ftfy module. + +- Changed the heuristic entirely. ftfy no longer needs to categorize every + Unicode character, but only characters that are expected to appear in + mojibake. + +- Because of the new heuristic, ftfy will no longer have to release a new + version for every new version of Unicode. It should also run faster and + use less RAM when imported. + +- The heuristic `ftfy.badness.is_bad(text)` can be used to determine whether + there appears to be mojibake in a string. Some users were already using + the old function `sequence_weirdness()` for that, but this one is actually + designed for that purpose. + +- Instead of a pile of named keyword arguments, ftfy functions now take in + a TextFixerConfig object. The keyword arguments still work, and become + settings that override the defaults in TextFixerConfig. + +- Added support for UTF-8 mixups with Windows-1253 and Windows-1254. + +- Overhauled the documentation: https://ftfy.readthedocs.org + +## Version 5.9 (February 10, 2021) + +This version is brought to you by the letter à and the number 0xC3. + +- Tweaked the heuristic to decode, for example, "à" as the letter "à" + more often. + +- This combines with the non-breaking-space fixer to decode "à " as "à" as + well. However, in many cases, the text " à " was intended to be " à ", + preserving the space -- the underlying mojibake had two spaces after it, but + the Web coalesced them into one. We detect this case based on common French + and Portuguese words, and preserve the space when it appears intended. + +Thanks to @zehavoc for bringing to my attention how common this case is. + +- Updated the data file of Unicode character categories to Unicode 13, as + used in Python 3.9. (No matter what version of Python you're on, ftfy uses + the same data.) + +## Version 5.8 (July 17, 2020) + +- Improved detection of UTF-8 mojibake of Greek, Cyrillic, Hebrew, and Arabic + scripts. + +- Fixed the undeclared dependency on setuptools by removing the use of + `pkg_resources`. + +## Version 5.7 (February 18, 2020) + +- Updated the data file of Unicode character categories to Unicode 12.1, as + used in Python 3.8. (No matter what version of Python you're on, ftfy uses + the same data.) + +- Corrected an omission where short sequences involving the ACUTE ACCENT + character were not being fixed. + +## Version 5.6 (August 7, 2019) + +- The `unescape_html` function now supports all the HTML5 entities that appear + in `html.entities.html5`, including those with long names such as + `˝`. + +- Unescaping of numeric HTML entities now uses the standard library's + `html.unescape`, making edge cases consistent. + + (The reason we don't run `html.unescape` on all text is that it's not always + appropriate to apply, and can lead to false positive fixes. The text + "This&NotThat" should not have "&Not" replaced by a symbol, as + `html.unescape` would do.) + +- On top of Python's support for HTML5 entities, ftfy will also convert HTML + escapes of common Latin capital letters that are (nonstandardly) written + in all caps, such as `&NTILDE;` for `Ñ`. + + +## Version 5.5.1 (September 14, 2018) + +- Added Python 3.7 support. + +- Updated the data file of Unicode character categories to Unicode 11, as used + in Python 3.7.0. (No matter what version of Python you're on, ftfy uses the + same data.) + + +## Version 5.5 (September 6, 2018) + +- Recent versions have emphasized making a reasonable attempt to fix short, + common mojibake sequences, such as `û`. In this version, we've expanded the + heuristics to recognize these sequences in MacRoman as well as Windows-125x + encodings. + +- A related rule for fixing isolated Windows-1252/UTF-8 mixups, even when they + were inconsistent with the rest of the string, claimed to work on Latin-1/UTF-8 + mixups as well, but in practice it didn't. We've made the rule more robust. + +- Fixed a failure when testing the CLI on Windows. + +- Removed the `pytest-runner` invocation from setup.py, as it created complex + dependencies that would stop setup.py from working in some environments. + The `pytest` command still works fine. `pytest-runner` is just too clever. + + +## Version 5.4.1 (June 14, 2018) + +- Fixed a bug in the `setup.py` metadata. + + This bug was causing ftfy, a package that fixes encoding mismatches, to not + install in some environments due to an encoding mismatch. (We were really + putting the "meta" in "metadata" here.) + + +## Version 5.4 (June 1, 2018) + +- ftfy was still too conservative about fixing short mojibake sequences, + such as "août" -> "août", when the broken version contained punctuation + such as curly or angle quotation marks. + + The new heuristic observes in some cases that, even if quotation marks are + expected to appear next to letters, it is strange to have an accented capital + A before the quotation mark and more letters after the quotation mark. + +- Provides better metadata for the new PyPI. + +- Switched from nosetests to pytest. + + +## Version 5.3 (January 25, 2018) + +- A heuristic has been too conservative since version 4.2, causing a regression + compared to previous versions: ftfy would fail to fix mojibake of common + characters such as `á` when seen in isolation. A new heuristic now makes it + possible to fix more of these common cases with less evidence. + + +## Version 5.2 (November 27, 2017) + +- The command-line tool will not accept the same filename as its input + and output. (Previously, this would write a zero-length file.) + +- The `uncurl_quotes` fixer, which replaces curly quotes with straight quotes, + now also replaces MODIFIER LETTER APOSTROPHE. + +- Codepoints that contain two Latin characters crammed together for legacy + encoding reasons are replaced by those two separate characters, even in NFC + mode. We formerly did this just with ligatures such as `fi` and `IJ`, but now + this includes the Afrikaans digraph `ʼn` and Serbian/Croatian digraphs such as + `dž`. + + +## Version 5.1.1 and 4.4.3 (May 15, 2017) + +These releases fix two unrelated problems with the tests, one in each version. + +- v5.1.1: fixed the CLI tests (which are new in v5) so that they pass + on Windows, as long as the Python output encoding is UTF-8. + +- v4.4.3: added the `# coding: utf-8` declaration to two files that were + missing it, so that tests can run on Python 2. + +## Version 5.1 (April 7, 2017) + +- Removed the dependency on `html5lib` by dropping support for Python 3.2. + + We previously used the dictionary `html5lib.constants.entities` to decode + HTML entities. In Python 3.3 and later, that exact dictionary is now in the + standard library as `html.entities.html5`. + +- Moved many test cases about how particular text should be fixed into + `test_cases.json`, which may ease porting to other languages. + +The functionality of this version remains the same as 5.0.2 and 4.4.2. + + +## Version 5.0.2 and 4.4.2 (March 21, 2017) + +Added a `MANIFEST.in` that puts files such as the license file and this +changelog inside the source distribution. + + +## Version 5.0.1 and 4.4.1 (March 10, 2017) + +Bug fix: + +- The `unescape_html` fixer will decode entities between `€` and `Ÿ` + as what they would be in Windows-1252, even without the help of + `fix_encoding`. + + This better matches what Web browsers do, and fixes a regression that version + 4.4 introduced in an example that uses `…` as an ellipsis. + + +## Version 5.0 (February 17, 2017) + +Breaking changes: + +- Dropped support for Python 2. If you need Python 2 support, you should get + version 4.4, which has the same features as this version. + +- The top-level functions require their arguments to be given as keyword + arguments. + +Version 5.0 also now has tests for the command-line invocation of ftfy. + + +## Version 4.4.0 (February 17, 2017) + +Heuristic changes: + +- ftfy can now fix mojibake involving the Windows-1250 or ISO-8859-2 encodings. + +- The `fix_entities` fixer is now applied after `fix_encoding`. This makes + more situations resolvable when both fixes are needed. + +- With a few exceptions for commonly-used characters such as `^`, it is now + considered "weird" whenever a diacritic appears in non-combining form, + such as the diaeresis character `¨`. + +- It is also now weird when IPA phonetic letters, besides `ə`, appear next to + capital letters. + +- These changes to the heuristics, and others we've made in recent versions, + let us lower the "cost" for fixing mojibake in some encodings, causing them + to be fixed in more cases. + + +## Version 4.3.1 (January 12, 2017) + +Bug fix: + +- `remove_control_chars` was removing U+0D ('\r') prematurely. That's the + job of `fix_line_breaks`. + + +## Version 4.3.0 (December 29, 2016) + +ftfy has gotten by for four years without dependencies on other Python +libraries, but now we can spare ourselves some code and some maintenance burden +by delegating certain tasks to other libraries that already solve them well. +This version now depends on the `html5lib` and `wcwidth` libraries. + +Feature changes: + +- The `remove_control_chars` fixer will now remove some non-ASCII control + characters as well, such as deprecated Arabic control characters and + byte-order marks. Bidirectional controls are still left as is. + + This should have no impact on well-formed text, while cleaning up many + characters that the Unicode Consortium deems "not suitable for markup" + (see Unicode Technical Report #20). + +- The `unescape_html` fixer uses a more thorough list of HTML entities, + which it imports from `html5lib`. + +- `ftfy.formatting` now uses `wcwidth` to compute the width that a string + will occupy in a text console. + +Heuristic changes: + +- Updated the data file of Unicode character categories to Unicode 9, as used + in Python 3.6.0. (No matter what version of Python you're on, ftfy uses the + same data.) + +Pending deprecations: + +- The `remove_bom` option will become deprecated in 5.0, because it has been + superseded by `remove_control_chars`. + +- ftfy 5.0 will remove the previously deprecated name `fix_text_encoding`. It + was renamed to `fix_encoding` in 4.0. + +- ftfy 5.0 will require Python 3.2 or later, as planned. Python 2 users, please + specify `ftfy < 5` in your dependencies if you haven't already. + + +## Version 4.2.0 (September 28, 2016) + +Heuristic changes: + +- Math symbols next to currency symbols are no longer considered 'weird' by the + heuristic. This fixes a false positive where text that involved the + multiplication sign and British pounds or euros (as in '5×£35') could turn + into Hebrew letters. + +- A heuristic that used to be a bonus for certain punctuation now also gives a + bonus to successfully decoding other common codepoints, such as the + non-breaking space, the degree sign, and the byte order mark. + +- In version 4.0, we tried to "future-proof" the categorization of emoji (as a + kind of symbol) to include codepoints that would likely be assigned to emoji + later. The future happened, and there are even more emoji than we expected. + We have expanded the range to include those emoji, too. + + ftfy is still mostly based on information from Unicode 8 (as Python 3.5 is), + but this expanded range should include the emoji from Unicode 9 and 10. + +- Emoji are increasingly being modified by variation selectors and skin-tone + modifiers. Those codepoints are now grouped with 'symbols' in ftfy, so they + fit right in with emoji, instead of being considered 'marks' as their Unicode + category would suggest. + + This enables fixing mojibake that involves iOS's new diverse emoji. + +- An old heuristic that wasn't necessary anymore considered Latin text with + high-numbered codepoints to be 'weird', but this is normal in languages such + as Vietnamese and Azerbaijani. This does not seem to have caused any false + positives, but it caused ftfy to be too reluctant to fix some cases of broken + text in those languages. + + The heuristic has been changed, and all languages that use Latin letters + should be on even footing now. + + +## Version 4.1.1 (April 13, 2016) + +- Bug fix: in the command-line interface, the `-e` option had no effect on + Python 3 when using standard input. Now, it correctly lets you specify + a different encoding for standard input. + + +## Version 4.1.0 (February 25, 2016) + +Heuristic changes: + +- ftfy can now deal with "lossy" mojibake. If your text has been run through + a strict Windows-1252 decoder, such as the one in Python, it may contain + the replacement character � (U+FFFD) where there were bytes that are + unassigned in Windows-1252. + + Although ftfy won't recover the lost information, it can now detect this + situation, replace the entire lossy character with �, and decode the rest of + the characters. Previous versions would be unable to fix any string that + contained U+FFFD. + + As an example, text in curly quotes that gets corrupted `“ like this â€�` + now gets fixed to be `“ like this �`. + +- Updated the data file of Unicode character categories to Unicode 8.0, as used + in Python 3.5.0. (No matter what version of Python you're on, ftfy uses the + same data.) + +- Heuristics now count characters such as `~` and `^` as punctuation instead + of wacky math symbols, improving the detection of mojibake in some edge cases. + +New features: + +- A new module, `ftfy.formatting`, can be used to justify Unicode text in a + monospaced terminal. It takes into account that each character can take up + anywhere from 0 to 2 character cells. + +- Internally, the `utf-8-variants` codec was simplified and optimized. + + +## Version 4.0.0 (April 10, 2015) + +Breaking changes: + +- The default normalization form is now NFC, not NFKC. NFKC replaces a large + number of characters with 'equivalent' characters, and some of these + replacements are useful, but some are not desirable to do by default. + +- The `fix_text` function has some new options that perform more targeted + operations that are part of NFKC normalization, such as + `fix_character_width`, without requiring hitting all your text with the huge + mallet that is NFKC. + + - If you were already using NFC normalization, or in general if you want to + preserve the *spacing* of CJK text, you should be sure to set + `fix_character_width=False`. + +- The `remove_unsafe_private_use` parameter has been removed entirely, after + two versions of deprecation. The function name `fix_bad_encoding` is also + gone. + +New features: + +- Fixers for strange new forms of mojibake, including particularly clear cases + of mixed UTF-8 and Windows-1252. + +- New heuristics, so that ftfy can fix more stuff, while maintaining + approximately zero false positives. + +- The command-line tool trusts you to know what encoding your *input* is in, + and assumes UTF-8 by default. You can still tell it to guess with the `-g` + option. + +- The command-line tool can be configured with options, and can be used as a + pipe. + +- Recognizes characters that are new in Unicode 7.0, as well as emoji from + Unicode 8.0+ that may already be in use on iOS. + +Deprecations: + +- `fix_text_encoding` is being renamed again, for conciseness and consistency. + It's now simply called `fix_encoding`. The name `fix_text_encoding` is + available but emits a warning. + +Pending deprecations: + +- Python 2.6 support is largely coincidental. + +- Python 2.7 support is on notice. If you use Python 2, be sure to pin a + version of ftfy less than 5.0 in your requirements. + + +## Version 3.4.0 (January 15, 2015) + +New features: + +- `ftfy.fixes.fix_surrogates` will fix all 16-bit surrogate codepoints, + which would otherwise break various encoding and output functions. + +Deprecations: + +- `remove_unsafe_private_use` emits a warning, and will disappear in the + next minor or major version. + + +## Version 3.3.1 (December 12, 2014) + +This version restores compatibility with Python 2.6. + + +## Version 3.3.0 (August 16, 2014) + +Heuristic changes: + +- Certain symbols are marked as "ending punctuation" that may naturally occur + after letters. When they follow an accented capital letter and look like + mojibake, they will not be "fixed" without further evidence. + An example is that "MARQUÉ…" will become "MARQUÉ...", and not "MARQUɅ". + +New features: + +- `ftfy.explain_unicode` is a diagnostic function that shows you what's going + on in a Unicode string. It shows you a table with each code point in + hexadecimal, its glyph, its name, and its Unicode category. + +- `ftfy.fixes.decode_escapes` adds a feature missing from the standard library: + it lets you decode a Unicode string with backslashed escape sequences in it + (such as "\u2014") the same way that Python itself would. + +- `ftfy.streamtester` is a release of the code that I use to test ftfy on + an endless stream of real-world data from Twitter. With the new heuristics, + the false positive rate of ftfy is about 1 per 6 million tweets. (See + the "Accuracy" section of the documentation.) + +Deprecations: + +- Python 2.6 is no longer supported. + +- `remove_unsafe_private_use` is no longer needed in any current version of + Python. This fixer will disappear in a later version of ftfy. + + +## Version 3.2.0 (June 27, 2014) + +- `fix_line_breaks` fixes three additional characters that are considered line + breaks in some environments, such as Javascript, and Python's "codecs" + library. These are all now replaced with \n: + + U+0085 , with alias "NEXT LINE" + U+2028 LINE SEPARATOR + U+2029 PARAGRAPH SEPARATOR + + +## Version 3.1.3 (May 15, 2014) + +- Fix `utf-8-variants` so it never outputs surrogate codepoints, even on + Python 2 where that would otherwise be possible. + + +## Version 3.1.2 (January 29, 2014) + +- Fix bug in 3.1.1 where strings with backslashes in them could never be fixed + + +## Version 3.1.1 (January 29, 2014) + +- Add the `ftfy.bad_codecs` package, which registers new codecs that can + decoding things that Python may otherwise refuse to decode: + + - `utf-8-variants`, which decodes CESU-8 and its Java lookalike + + - `sloppy-windows-*`, which decodes character-map encodings while treating + unmapped characters as Latin-1 + +- Simplify the code using `ftfy.bad_codecs`. + + +## Version 3.0.6 (November 5, 2013) + +- `fix_entities` can now be True, False, or 'auto'. The new case is True, which + will decode all entities, even in text that already contains angle brackets. + This may also be faster, because it doesn't have to check. +- `build_data.py` will refuse to run on Python < 3.3, to prevent building + an inconsistent data file. + + +## Version 3.0.5 (November 1, 2013) + +- Fix the arguments to `fix_file`, because they were totally wrong. + + +## Version 3.0.4 (October 1, 2013) + +- Restore compatibility with Python 2.6. + + +## Version 3.0.3 (September 9, 2013) + +- Fixed an ugly regular expression bug that prevented ftfy from importing on a + narrow build of Python. + + +## Version 3.0.2 (September 4, 2013) + +- Fixed some false positives. + + - Basically, 3.0.1 was too eager to treat text as MacRoman or cp437 when + three consecutive characters coincidentally decoded as UTF-8. Increased the + cost of those encodings so that they have to successfully decode multiple + UTF-8 characters. + + - See `tests/test_real_tweets.py` for the new test cases that were added as a + result. + + +## Version 3.0.1 (August 30, 2013) + +- Fix bug in `fix_java_encoding` that led to only the first instance of + CESU-8 badness per line being fixed +- Add a fixer that removes unassigned characters that can break Python 3.3 + (http://bugs.python.org/issue18183) + + +## Version 3.0 (August 26, 2013) + +- Generally runs faster +- Idempotent +- Simplified decoding logic +- Understands more encodings and more kinds of mistakes +- Takes options that enable or disable particular normalization steps +- Long line handling: now the time-consuming step (`fix_text_encoding`) will be + consistently skipped on long lines, but all other fixes will apply +- Tested on millions of examples from Twitter, ensuring a near-zero rate of + false positives + + +## Version 2.0.2 (June 20, 2013) + +- Fix breaking up of long lines, so it can't go into an infinite loop + + +## Version 2.0.1 (March 19, 2013) + +- Restored Python 2.6 support + + +## Version 2.0 (January 30, 2013) + +- Python 3 support +- Use fast Python built-ins to speed up fixes +- Bugfixes + + +## Version 1.0 (August 24, 2012) + +- Made into its own package with no dependencies, instead of a part of + `metanl` diff --git a/libs/Flask_Cors-4.0.0.dist-info/RECORD b/libs/Flask_Cors-4.0.0.dist-info/RECORD deleted file mode 100644 index eae9c8673..000000000 --- a/libs/Flask_Cors-4.0.0.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -Flask_Cors-4.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_Cors-4.0.0.dist-info/LICENSE,sha256=bhob3FSDTB4HQMvOXV9vLK4chG_Sp_SCsRZJWU-vvV0,1069 -Flask_Cors-4.0.0.dist-info/METADATA,sha256=gH5CIZManWT1lJuvM-YzOlSGJNdzB03QkylAtEc24tY,5417 -Flask_Cors-4.0.0.dist-info/RECORD,, -Flask_Cors-4.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_Cors-4.0.0.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 -Flask_Cors-4.0.0.dist-info/top_level.txt,sha256=aWye_0QNZPp_QtPF4ZluLHqnyVLT9CPJsfiGhwqkWuo,11 -flask_cors/__init__.py,sha256=wZDCvPTHspA2g1VV7KyKN7R-uCdBnirTlsCzgPDcQtI,792 -flask_cors/core.py,sha256=e1u_o5SOcS_gMWGjcQrkyk91uPICnzZ3AXZvy5jQ_FE,14063 -flask_cors/decorator.py,sha256=BeJsyX1wYhVKWN04FAhb6z8YqffiRr7wKqwzHPap4bw,5009 -flask_cors/extension.py,sha256=nP4Zq_BhgDVWwPdIl_f-uucNxD38pXUo-dkL-voXc58,7832 -flask_cors/version.py,sha256=61rJjfThnbRdElpSP2tm31hPmFnHJmcwoPhtqA0Bi_Q,22 diff --git a/libs/Flask_Cors-4.0.0.dist-info/INSTALLER b/libs/Flask_Cors-5.0.0.dist-info/INSTALLER similarity index 100% rename from libs/Flask_Cors-4.0.0.dist-info/INSTALLER rename to libs/Flask_Cors-5.0.0.dist-info/INSTALLER diff --git a/libs/Flask_Cors-4.0.0.dist-info/LICENSE b/libs/Flask_Cors-5.0.0.dist-info/LICENSE similarity index 100% rename from libs/Flask_Cors-4.0.0.dist-info/LICENSE rename to libs/Flask_Cors-5.0.0.dist-info/LICENSE diff --git a/libs/Flask_Cors-4.0.0.dist-info/METADATA b/libs/Flask_Cors-5.0.0.dist-info/METADATA similarity index 89% rename from libs/Flask_Cors-4.0.0.dist-info/METADATA rename to libs/Flask_Cors-5.0.0.dist-info/METADATA index c6e2af695..99902fe9d 100644 --- a/libs/Flask_Cors-4.0.0.dist-info/METADATA +++ b/libs/Flask_Cors-5.0.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: Flask-Cors -Version: 4.0.0 +Version: 5.0.0 Summary: A Flask extension adding a decorator for CORS support Home-page: https://github.com/corydolphin/flask-cors Author: Cory Dolphin @@ -16,6 +16,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 :: 3.12 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content @@ -31,10 +32,10 @@ Flask-CORS A Flask extension for handling Cross Origin Resource Sharing (CORS), making cross-origin AJAX possible. -This package has a simple philosophy: when you want to enable CORS, you wish to enable it for all use cases on a domain. -This means no mucking around with different allowed headers, methods, etc. +This package has a simple philosophy: when you want to enable CORS, you wish to enable it for all use cases on a domain. +This means no mucking around with different allowed headers, methods, etc. -By default, submission of cookies across domains is disabled due to the security implications. +By default, submission of cookies across domains is disabled due to the security implications. Please see the documentation for how to enable credential'ed requests, and please make sure you add some sort of `CSRF `__ protection before doing so! Installation @@ -49,14 +50,14 @@ Install the extension with using pip, or easy\_install. Usage ----- -This package exposes a Flask extension which by default enables CORS support on all routes, for all origins and methods. -It allows parameterization of all CORS headers on a per-resource level. +This package exposes a Flask extension which by default enables CORS support on all routes, for all origins and methods. +It allows parameterization of all CORS headers on a per-resource level. The package also contains a decorator, for those who prefer this approach. Simple Usage ~~~~~~~~~~~~ -In the simplest case, initialize the Flask-Cors extension with default arguments in order to allow CORS for all domains on all routes. +In the simplest case, initialize the Flask-Cors extension with default arguments in order to allow CORS for all domains on all routes. See the full list of options in the `documentation `__. .. code:: python @@ -75,7 +76,7 @@ See the full list of options in the `documentation `__. .. code:: python @@ -90,8 +91,8 @@ See the full list of options in the `documentation `__. .. code:: python @@ -119,7 +120,7 @@ If things aren't working as you expect, enable logging to help understand what i Tests ----- -A simple set of tests is included in ``test/``. +A simple set of tests is included in ``test/``. To run, install nose, and simply invoke ``nosetests`` or ``python setup.py test`` to exercise the tests. If nosetests does not work for you, due to it no longer working with newer python versions. @@ -128,8 +129,8 @@ You can use pytest to run the tests instead. Contributing ------------ -Questions, comments or improvements? -Please create an issue on `Github `__, tweet at `@corydolphin `__ or send me an email. +Questions, comments or improvements? +Please create an issue on `Github `__, tweet at `@corydolphin `__ or send me an email. I do my best to include every contribution proposed in any way that I can. Credits @@ -137,7 +138,7 @@ Credits This Flask extension is based upon the `Decorator for the HTTP Access Control `__ written by Armin Ronacher. -.. |Build Status| image:: https://api.travis-ci.org/corydolphin/flask-cors.svg?branch=master +.. |Build Status| image:: https://github.com/corydolphin/flask-cors/actions/workflows/unittests.yaml/badge.svg :target: https://travis-ci.org/corydolphin/flask-cors .. |Latest Version| image:: https://img.shields.io/pypi/v/Flask-Cors.svg :target: https://pypi.python.org/pypi/Flask-Cors/ diff --git a/libs/Flask_Cors-5.0.0.dist-info/RECORD b/libs/Flask_Cors-5.0.0.dist-info/RECORD new file mode 100644 index 000000000..5e942ce53 --- /dev/null +++ b/libs/Flask_Cors-5.0.0.dist-info/RECORD @@ -0,0 +1,12 @@ +Flask_Cors-5.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Cors-5.0.0.dist-info/LICENSE,sha256=bhob3FSDTB4HQMvOXV9vLK4chG_Sp_SCsRZJWU-vvV0,1069 +Flask_Cors-5.0.0.dist-info/METADATA,sha256=V2L_s849dFlZXsOhcgXVqv5Slj_JKSVuiiuRgDOft5s,5474 +Flask_Cors-5.0.0.dist-info/RECORD,, +Flask_Cors-5.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_Cors-5.0.0.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 +Flask_Cors-5.0.0.dist-info/top_level.txt,sha256=aWye_0QNZPp_QtPF4ZluLHqnyVLT9CPJsfiGhwqkWuo,11 +flask_cors/__init__.py,sha256=wZDCvPTHspA2g1VV7KyKN7R-uCdBnirTlsCzgPDcQtI,792 +flask_cors/core.py,sha256=y76xxLasWTdV_3ka19IxpdJPOgROBZQZ5L8t20IjqRA,14252 +flask_cors/decorator.py,sha256=BeJsyX1wYhVKWN04FAhb6z8YqffiRr7wKqwzHPap4bw,5009 +flask_cors/extension.py,sha256=gzv6zWUwSDYlGHBWzMuTI_hoQ7gQmp9DlcAcrKTVHdw,8602 +flask_cors/version.py,sha256=JzYPYpvaglqIJRGCDrh5-hYmXI0ISrDDed0V1QQZAGU,22 diff --git a/libs/Flask_Cors-4.0.0.dist-info/REQUESTED b/libs/Flask_Cors-5.0.0.dist-info/REQUESTED similarity index 100% rename from libs/Flask_Cors-4.0.0.dist-info/REQUESTED rename to libs/Flask_Cors-5.0.0.dist-info/REQUESTED diff --git a/libs/Flask_Cors-4.0.0.dist-info/WHEEL b/libs/Flask_Cors-5.0.0.dist-info/WHEEL similarity index 100% rename from libs/Flask_Cors-4.0.0.dist-info/WHEEL rename to libs/Flask_Cors-5.0.0.dist-info/WHEEL diff --git a/libs/Flask_Cors-4.0.0.dist-info/top_level.txt b/libs/Flask_Cors-5.0.0.dist-info/top_level.txt similarity index 100% rename from libs/Flask_Cors-4.0.0.dist-info/top_level.txt rename to libs/Flask_Cors-5.0.0.dist-info/top_level.txt diff --git a/libs/Flask_Migrate-4.0.5.dist-info/INSTALLER b/libs/Flask_Migrate-4.0.7.dist-info/INSTALLER similarity index 100% rename from libs/Flask_Migrate-4.0.5.dist-info/INSTALLER rename to libs/Flask_Migrate-4.0.7.dist-info/INSTALLER diff --git a/libs/Flask_Migrate-4.0.5.dist-info/LICENSE b/libs/Flask_Migrate-4.0.7.dist-info/LICENSE similarity index 100% rename from libs/Flask_Migrate-4.0.5.dist-info/LICENSE rename to libs/Flask_Migrate-4.0.7.dist-info/LICENSE diff --git a/libs/Flask_Migrate-4.0.5.dist-info/METADATA b/libs/Flask_Migrate-4.0.7.dist-info/METADATA similarity index 95% rename from libs/Flask_Migrate-4.0.5.dist-info/METADATA rename to libs/Flask_Migrate-4.0.7.dist-info/METADATA index 0590a4cf5..c0c67b93e 100644 --- a/libs/Flask_Migrate-4.0.5.dist-info/METADATA +++ b/libs/Flask_Migrate-4.0.7.dist-info/METADATA @@ -1,11 +1,10 @@ Metadata-Version: 2.1 Name: Flask-Migrate -Version: 4.0.5 +Version: 4.0.7 Summary: SQLAlchemy database migrations for Flask applications using Alembic. -Home-page: https://github.com/miguelgrinberg/flask-migrate -Author: Miguel Grinberg -Author-email: miguel.grinberg@gmail.com +Author-email: Miguel Grinberg License: MIT +Project-URL: Homepage, https://github.com/miguelgrinberg/flask-migrate Project-URL: Bug Tracker, https://github.com/miguelgrinberg/flask-migrate/issues Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers diff --git a/libs/Flask_Migrate-4.0.5.dist-info/RECORD b/libs/Flask_Migrate-4.0.7.dist-info/RECORD similarity index 73% rename from libs/Flask_Migrate-4.0.5.dist-info/RECORD rename to libs/Flask_Migrate-4.0.7.dist-info/RECORD index 740ada03e..c5f8dfe55 100644 --- a/libs/Flask_Migrate-4.0.5.dist-info/RECORD +++ b/libs/Flask_Migrate-4.0.7.dist-info/RECORD @@ -1,12 +1,12 @@ -Flask_Migrate-4.0.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_Migrate-4.0.5.dist-info/LICENSE,sha256=kfkXGlJQvKy3Y__6tAJ8ynIp1HQfeROXhL8jZU1d-DI,1082 -Flask_Migrate-4.0.5.dist-info/METADATA,sha256=d-EcnhZa_vyVAph2u84OpGIteJaBmqLQxO5Rf6wUI7Y,3095 -Flask_Migrate-4.0.5.dist-info/RECORD,, -Flask_Migrate-4.0.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_Migrate-4.0.5.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -Flask_Migrate-4.0.5.dist-info/top_level.txt,sha256=jLoPgiMG6oR4ugNteXn3IHskVVIyIXVStZOVq-AWLdU,14 -flask_migrate/__init__.py,sha256=-JFdExGtr7UrwCpmjYvTfzFHqMjE7AmP0Rr3T53tBNU,10037 -flask_migrate/cli.py,sha256=H-N4NNS5HyEB61HpUADLU8pW3naejyDPgeEbzEqG5-w,10298 +Flask_Migrate-4.0.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Migrate-4.0.7.dist-info/LICENSE,sha256=kfkXGlJQvKy3Y__6tAJ8ynIp1HQfeROXhL8jZU1d-DI,1082 +Flask_Migrate-4.0.7.dist-info/METADATA,sha256=3WW5StkAdKx66iP12BXfTzoUsSB4rqEGxVs3qoollRg,3101 +Flask_Migrate-4.0.7.dist-info/RECORD,, +Flask_Migrate-4.0.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_Migrate-4.0.7.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +Flask_Migrate-4.0.7.dist-info/top_level.txt,sha256=jLoPgiMG6oR4ugNteXn3IHskVVIyIXVStZOVq-AWLdU,14 +flask_migrate/__init__.py,sha256=JMySGA55Y8Gxy3HviWu7qq5rPUNQBWc2NID2OicpDyw,10082 +flask_migrate/cli.py,sha256=v1fOqjpUI8ZniSt0NAxdaU4gFMoZys5yLAofwmBdMHU,10689 flask_migrate/templates/aioflask-multidb/README,sha256=Ek4cJqTaxneVjtkue--BXMlfpfp3MmJRjqoZvnSizww,43 flask_migrate/templates/aioflask-multidb/alembic.ini.mako,sha256=SjYEmJKzz6K8QfuZWtLJAJWcCKOdRbfUhsVlpgv8ock,857 flask_migrate/templates/aioflask-multidb/env.py,sha256=UcjeqkAbyUjTkuQFmCFPG7QOvqhco8-uGp8QEbto0T8,6573 diff --git a/libs/Flask_Migrate-4.0.5.dist-info/REQUESTED b/libs/Flask_Migrate-4.0.7.dist-info/REQUESTED similarity index 100% rename from libs/Flask_Migrate-4.0.5.dist-info/REQUESTED rename to libs/Flask_Migrate-4.0.7.dist-info/REQUESTED diff --git a/libs/Flask_Migrate-4.0.5.dist-info/WHEEL b/libs/Flask_Migrate-4.0.7.dist-info/WHEEL similarity index 65% rename from libs/Flask_Migrate-4.0.5.dist-info/WHEEL rename to libs/Flask_Migrate-4.0.7.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/Flask_Migrate-4.0.5.dist-info/WHEEL +++ b/libs/Flask_Migrate-4.0.7.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/Flask_Migrate-4.0.5.dist-info/top_level.txt b/libs/Flask_Migrate-4.0.7.dist-info/top_level.txt similarity index 100% rename from libs/Flask_Migrate-4.0.5.dist-info/top_level.txt rename to libs/Flask_Migrate-4.0.7.dist-info/top_level.txt diff --git a/libs/Flask_SocketIO-5.3.6.dist-info/RECORD b/libs/Flask_SocketIO-5.3.6.dist-info/RECORD deleted file mode 100644 index 4a6082118..000000000 --- a/libs/Flask_SocketIO-5.3.6.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -Flask_SocketIO-5.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_SocketIO-5.3.6.dist-info/LICENSE,sha256=aNCWbkgKjS_T1cJtACyZbvCM36KxWnfQ0LWTuavuYKQ,1082 -Flask_SocketIO-5.3.6.dist-info/METADATA,sha256=vmIOzjkNLXRjmocRXtso6hLV27aiJgH7_A55TVJyD4k,2631 -Flask_SocketIO-5.3.6.dist-info/RECORD,, -Flask_SocketIO-5.3.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_SocketIO-5.3.6.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -Flask_SocketIO-5.3.6.dist-info/top_level.txt,sha256=C1ugzQBJ3HHUJsWGzyt70XRVOX-y4CUAR8MWKjwJOQ8,15 -flask_socketio/__init__.py,sha256=ea3QXRYKBje4JQGcNSEOmj42qlf2peRNbCzZZWfD9DE,54731 -flask_socketio/namespace.py,sha256=b3oyXEemu2po-wpoy4ILTHQMVuVQqicogCDxfymfz_w,2020 -flask_socketio/test_client.py,sha256=9_R1y_vP8yr8wzimQUEMAUyVqX12FMXurLj8t1ecDdc,11034 diff --git a/libs/Flask_SocketIO-5.3.6.dist-info/INSTALLER b/libs/Flask_SocketIO-5.4.1.dist-info/INSTALLER similarity index 100% rename from libs/Flask_SocketIO-5.3.6.dist-info/INSTALLER rename to libs/Flask_SocketIO-5.4.1.dist-info/INSTALLER diff --git a/libs/Flask_SocketIO-5.3.6.dist-info/LICENSE b/libs/Flask_SocketIO-5.4.1.dist-info/LICENSE similarity index 100% rename from libs/Flask_SocketIO-5.3.6.dist-info/LICENSE rename to libs/Flask_SocketIO-5.4.1.dist-info/LICENSE diff --git a/libs/Flask_SocketIO-5.3.6.dist-info/METADATA b/libs/Flask_SocketIO-5.4.1.dist-info/METADATA similarity index 94% rename from libs/Flask_SocketIO-5.3.6.dist-info/METADATA rename to libs/Flask_SocketIO-5.4.1.dist-info/METADATA index ddec6b09a..fba427379 100644 --- a/libs/Flask_SocketIO-5.3.6.dist-info/METADATA +++ b/libs/Flask_SocketIO-5.4.1.dist-info/METADATA @@ -1,10 +1,9 @@ Metadata-Version: 2.1 Name: Flask-SocketIO -Version: 5.3.6 +Version: 5.4.1 Summary: Socket.IO integration for Flask applications -Home-page: https://github.com/miguelgrinberg/flask-socketio -Author: Miguel Grinberg -Author-email: miguel.grinberg@gmail.com +Author-email: Miguel Grinberg +Project-URL: Homepage, https://github.com/miguelgrinberg/flask-socketio Project-URL: Bug Tracker, https://github.com/miguelgrinberg/flask-socketio/issues Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers diff --git a/libs/Flask_SocketIO-5.4.1.dist-info/RECORD b/libs/Flask_SocketIO-5.4.1.dist-info/RECORD new file mode 100644 index 000000000..41359c3ae --- /dev/null +++ b/libs/Flask_SocketIO-5.4.1.dist-info/RECORD @@ -0,0 +1,10 @@ +Flask_SocketIO-5.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_SocketIO-5.4.1.dist-info/LICENSE,sha256=aNCWbkgKjS_T1cJtACyZbvCM36KxWnfQ0LWTuavuYKQ,1082 +Flask_SocketIO-5.4.1.dist-info/METADATA,sha256=mySfdtGXW8DrfdcqpYk_ENRoDASLlechS67F_kpdY78,2637 +Flask_SocketIO-5.4.1.dist-info/RECORD,, +Flask_SocketIO-5.4.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_SocketIO-5.4.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +Flask_SocketIO-5.4.1.dist-info/top_level.txt,sha256=C1ugzQBJ3HHUJsWGzyt70XRVOX-y4CUAR8MWKjwJOQ8,15 +flask_socketio/__init__.py,sha256=jwNzwRoorTH6Q5A5KgHJPoCJ_xYKD4P5R8Z3BS2HH1Q,55135 +flask_socketio/namespace.py,sha256=Zv0k0q5KiOn8SF1Nk1CKtPYRSx8jM6Ht75Lp0QusdM0,2028 +flask_socketio/test_client.py,sha256=9_R1y_vP8yr8wzimQUEMAUyVqX12FMXurLj8t1ecDdc,11034 diff --git a/libs/Flask_SocketIO-5.3.6.dist-info/REQUESTED b/libs/Flask_SocketIO-5.4.1.dist-info/REQUESTED similarity index 100% rename from libs/Flask_SocketIO-5.3.6.dist-info/REQUESTED rename to libs/Flask_SocketIO-5.4.1.dist-info/REQUESTED diff --git a/libs/Flask_SocketIO-5.3.6.dist-info/WHEEL b/libs/Flask_SocketIO-5.4.1.dist-info/WHEEL similarity index 65% rename from libs/Flask_SocketIO-5.3.6.dist-info/WHEEL rename to libs/Flask_SocketIO-5.4.1.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/Flask_SocketIO-5.3.6.dist-info/WHEEL +++ b/libs/Flask_SocketIO-5.4.1.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/Flask_SocketIO-5.3.6.dist-info/top_level.txt b/libs/Flask_SocketIO-5.4.1.dist-info/top_level.txt similarity index 100% rename from libs/Flask_SocketIO-5.3.6.dist-info/top_level.txt rename to libs/Flask_SocketIO-5.4.1.dist-info/top_level.txt diff --git a/libs/Jinja2-3.1.3.dist-info/RECORD b/libs/Jinja2-3.1.3.dist-info/RECORD deleted file mode 100644 index e80904634..000000000 --- a/libs/Jinja2-3.1.3.dist-info/RECORD +++ /dev/null @@ -1,34 +0,0 @@ -Jinja2-3.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Jinja2-3.1.3.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -Jinja2-3.1.3.dist-info/METADATA,sha256=0cLNbRCI91jytc7Bzv3XAQfZzFDF2gxkJuH46eF5vew,3301 -Jinja2-3.1.3.dist-info/RECORD,, -Jinja2-3.1.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Jinja2-3.1.3.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -Jinja2-3.1.3.dist-info/entry_points.txt,sha256=zRd62fbqIyfUpsRtU7EVIFyiu1tPwfgO7EvPErnxgTE,59 -Jinja2-3.1.3.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 -jinja2/__init__.py,sha256=NTBwMwsECrdHmxeXF7seusHLzrh6Ldn1A9qhS5cDuf0,1927 -jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 -jinja2/async_utils.py,sha256=dFcmh6lMNfbh7eLKrBio8JqAKLHdZbpCuurFN4OERtY,2447 -jinja2/bccache.py,sha256=mhz5xtLxCcHRAa56azOhphIAe19u1we0ojifNMClDio,14061 -jinja2/compiler.py,sha256=PJzYdRLStlEOqmnQs1YxlizPrJoj3jTZuUleREn6AIQ,72199 -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=0qldX3VQKZcm6lgn7zHz94oRFow7YPYERiqkquomNjU,61253 -jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 -jinja2/ext.py,sha256=5fnMpllaXkfm2P_93RIvi-OnK7Tk8mCW8Du-GcD12Hc,31844 -jinja2/filters.py,sha256=vYjKb2zaPShvYtn_LpSmqfS8SScbrA_KOanNibsMDIE,53862 -jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 -jinja2/lexer.py,sha256=DW2nX9zk-6MWp65YR2bqqj0xqCvLtD-u9NWT8AnFRxQ,29726 -jinja2/loaders.py,sha256=ayAwxfrA1SAffQta0nwSDm3TDT4KYiIGN_D9Z45B310,23085 -jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 -jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 -jinja2/nodes.py,sha256=i34GPRAZexXMT6bwuf5SEyvdmS-bRCy9KMjwN5O6pjk,34550 -jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 -jinja2/parser.py,sha256=Y199wPL-G67gJoi5G_5sHuu9uEP1PJkjjLEW_xTH8-k,39736 -jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2/runtime.py,sha256=_6LkKIWFJjQdqlrgA3K39zBFQ-7Orm3wGDm96RwxQoE,33406 -jinja2/sandbox.py,sha256=Y0xZeXQnH6EX5VjaV2YixESxoepnRbW_3UeQosaBU3M,14584 -jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 -jinja2/utils.py,sha256=IMwRIcN1SsTw2-jdQtlH2KzNABsXZBW_-tnFXafQBvY,23933 -jinja2/visitor.py,sha256=MH14C6yq24G_KVtWzjwaI7Wg14PCJIYlWW1kpkxYak0,3568 diff --git a/libs/Jinja2-3.1.3.dist-info/entry_points.txt b/libs/Jinja2-3.1.3.dist-info/entry_points.txt deleted file mode 100644 index 7b9666c8e..000000000 --- a/libs/Jinja2-3.1.3.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[babel.extractors] -jinja2 = jinja2.ext:babel_extract[i18n] diff --git a/libs/Jinja2-3.1.3.dist-info/top_level.txt b/libs/Jinja2-3.1.3.dist-info/top_level.txt deleted file mode 100644 index 7f7afbf3b..000000000 --- a/libs/Jinja2-3.1.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -jinja2 diff --git a/libs/Jinja2-3.1.3.dist-info/INSTALLER b/libs/Mako-1.3.6.dist-info/INSTALLER similarity index 100% rename from libs/Jinja2-3.1.3.dist-info/INSTALLER rename to libs/Mako-1.3.6.dist-info/INSTALLER diff --git a/libs/Mako-1.3.2.dist-info/LICENSE b/libs/Mako-1.3.6.dist-info/LICENSE similarity index 100% rename from libs/Mako-1.3.2.dist-info/LICENSE rename to libs/Mako-1.3.6.dist-info/LICENSE diff --git a/libs/Mako-1.3.2.dist-info/METADATA b/libs/Mako-1.3.6.dist-info/METADATA similarity index 94% rename from libs/Mako-1.3.2.dist-info/METADATA rename to libs/Mako-1.3.6.dist-info/METADATA index 4558ed984..404f6dc2b 100644 --- a/libs/Mako-1.3.2.dist-info/METADATA +++ b/libs/Mako-1.3.6.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: Mako -Version: 1.3.2 +Version: 1.3.6 Summary: A super-fast templating language that borrows the best ideas from the existing templating languages. Home-page: https://www.makotemplates.org/ Author: Mike Bayer @@ -25,13 +25,13 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Requires-Python: >=3.8 Description-Content-Type: text/x-rst License-File: LICENSE -Requires-Dist: MarkupSafe >=0.9.2 +Requires-Dist: MarkupSafe>=0.9.2 Provides-Extra: babel -Requires-Dist: Babel ; extra == 'babel' +Requires-Dist: Babel; extra == "babel" Provides-Extra: lingua -Requires-Dist: lingua ; extra == 'lingua' +Requires-Dist: lingua; extra == "lingua" Provides-Extra: testing -Requires-Dist: pytest ; extra == 'testing' +Requires-Dist: pytest; extra == "testing" ========================= Mako Templates for Python diff --git a/libs/Mako-1.3.2.dist-info/RECORD b/libs/Mako-1.3.6.dist-info/RECORD similarity index 74% rename from libs/Mako-1.3.2.dist-info/RECORD rename to libs/Mako-1.3.6.dist-info/RECORD index fed8f2c56..132f7f753 100644 --- a/libs/Mako-1.3.2.dist-info/RECORD +++ b/libs/Mako-1.3.6.dist-info/RECORD @@ -1,18 +1,18 @@ ../../bin/mako-render,sha256=NK39DgCmw8pz5T7ALDcW2MB6hFGNVOpWXAHq3-GKyss,236 -Mako-1.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Mako-1.3.2.dist-info/LICENSE,sha256=FWJ7NrONBynN1obfmr9gZQPZnWJLL17FyyVKddWvqJE,1098 -Mako-1.3.2.dist-info/METADATA,sha256=G3lsPTYAPanaYdk-_e8yek5DZpuOjT3Qcf-RMLrlMU0,2900 -Mako-1.3.2.dist-info/RECORD,, -Mako-1.3.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Mako-1.3.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -Mako-1.3.2.dist-info/entry_points.txt,sha256=LsKkUsOsJQYbJ2M72hZCm968wi5K8Ywb5uFxCuN8Obk,512 -Mako-1.3.2.dist-info/top_level.txt,sha256=LItdH8cDPetpUu8rUyBG3DObS6h9Gcpr9j_WLj2S-R0,5 -mako/__init__.py,sha256=brA7o1ju8zST1YWfFRXDxaKmMlKiRHVqefjxeUN6YjI,242 +Mako-1.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Mako-1.3.6.dist-info/LICENSE,sha256=FWJ7NrONBynN1obfmr9gZQPZnWJLL17FyyVKddWvqJE,1098 +Mako-1.3.6.dist-info/METADATA,sha256=acS60Hd7WhYKop08nPD7xyTeA7K0BvI5tZ1bFDzu_eI,2896 +Mako-1.3.6.dist-info/RECORD,, +Mako-1.3.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Mako-1.3.6.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +Mako-1.3.6.dist-info/entry_points.txt,sha256=LsKkUsOsJQYbJ2M72hZCm968wi5K8Ywb5uFxCuN8Obk,512 +Mako-1.3.6.dist-info/top_level.txt,sha256=LItdH8cDPetpUu8rUyBG3DObS6h9Gcpr9j_WLj2S-R0,5 +mako/__init__.py,sha256=tBgTwfysRucStb1CjE0XkNmFru0tZ_O0G6d_hZu6Psw,242 mako/_ast_util.py,sha256=CenxCrdES1irHDhOQU6Ldta4rdsytfYaMkN6s0TlveM,20247 mako/ast.py,sha256=pY7MH-5cLnUuVz5YAwoGhWgWfgoVvLQkRDtc_s9qqw0,6642 mako/cache.py,sha256=5DBBorj1NqiWDqNhN3ZJ8tMCm-h6Mew541276kdsxAU,7680 mako/cmd.py,sha256=vP5M5g9yc5sjAT5owVTQu056YwyS-YkpulFSDb0IMGw,2813 -mako/codegen.py,sha256=UgB8K6BMNiBTUGucR4UYkqFqlbNUJfErKI9A-n4Wteg,47307 +mako/codegen.py,sha256=XRhzcuGEleDUXTfmOjw4alb6TkczbmEfBCLqID8x4bA,47736 mako/compat.py,sha256=wjVMf7uMg0TlC_aI5hdwWizza99nqJuGNdrnTNrZbt0,1820 mako/exceptions.py,sha256=pfdd5-1lCZ--I2YqQ_oHODZLmo62bn_lO5Kz_1__72w,12530 mako/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 @@ -25,11 +25,11 @@ mako/ext/preprocessors.py,sha256=zKQy42Ce6dOmU0Yk_rUVDAAn38-RUUfQolVKTJjLotA,576 mako/ext/pygmentplugin.py,sha256=qBdsAhKktlQX7d5Yv1sAXufUNOZqcnJmKuC7V4D_srM,4753 mako/ext/turbogears.py,sha256=0emY1WiMnuY8Pf6ARv5JBArKtouUdmuTljI-w6rE3J4,2141 mako/filters.py,sha256=F7aDIKTUxnT-Og4rgboQtnML7Q87DJTHQyhi_dY_Ih4,4658 -mako/lexer.py,sha256=dtCZU1eoF3ymEdiCwCzEIw5SH0lgJkDsHJy9VHI_2XY,16324 +mako/lexer.py,sha256=Xi6Lk8CnASf3UYAaPoYrfjuPkrYauNjvYvULCUkKYaY,16321 mako/lookup.py,sha256=rkMvT5T7EOS5KRvPtgYii-sjh1nWWyKok_mEk-cEzrM,12428 mako/parsetree.py,sha256=7RNVRTsKcsMt8vU4NQi5C7e4vhdUyA9tqyd1yIkvAAQ,19007 mako/pygen.py,sha256=d4f_ugRACCXuV9hJgEk6Ncoj38EaRHA3RTxkr_tK7UQ,10416 -mako/pyparser.py,sha256=81rIcSn4PoALpZF0WO6D5rB65TvF8R9Qn_hBSfTGS5Q,7029 +mako/pyparser.py,sha256=eY_a94QDXaK3vIA2jZYT9so7oXKKJLT0SO_Yrl3IOb8,7478 mako/runtime.py,sha256=ZsUEN22nX3d3dECQujF69mBKDQS6yVv2nvz_0eTvFGg,27804 mako/template.py,sha256=4xQzwruZd5XzPw7iONZMZJj4SdFsctYYg4PfBYs2PLk,23857 mako/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/Jinja2-3.1.3.dist-info/REQUESTED b/libs/Mako-1.3.6.dist-info/REQUESTED similarity index 100% rename from libs/Jinja2-3.1.3.dist-info/REQUESTED rename to libs/Mako-1.3.6.dist-info/REQUESTED diff --git a/libs/Mako-1.3.2.dist-info/WHEEL b/libs/Mako-1.3.6.dist-info/WHEEL similarity index 65% rename from libs/Mako-1.3.2.dist-info/WHEEL rename to libs/Mako-1.3.6.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/Mako-1.3.2.dist-info/WHEEL +++ b/libs/Mako-1.3.6.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/Mako-1.3.2.dist-info/entry_points.txt b/libs/Mako-1.3.6.dist-info/entry_points.txt similarity index 100% rename from libs/Mako-1.3.2.dist-info/entry_points.txt rename to libs/Mako-1.3.6.dist-info/entry_points.txt diff --git a/libs/Mako-1.3.2.dist-info/top_level.txt b/libs/Mako-1.3.6.dist-info/top_level.txt similarity index 100% rename from libs/Mako-1.3.2.dist-info/top_level.txt rename to libs/Mako-1.3.6.dist-info/top_level.txt diff --git a/libs/Markdown-3.5.2.dist-info/LICENSE.md b/libs/Markdown-3.5.2.dist-info/LICENSE.md deleted file mode 100644 index 2652d97ad..000000000 --- a/libs/Markdown-3.5.2.dist-info/LICENSE.md +++ /dev/null @@ -1,29 +0,0 @@ -Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) -Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) -Copyright 2004 Manfred Stienstra (the original version) - -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 Python Markdown Project 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 PYTHON MARKDOWN PROJECT ''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 ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT -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/libs/Mako-1.3.2.dist-info/INSTALLER b/libs/Markdown-3.7.dist-info/INSTALLER similarity index 100% rename from libs/Mako-1.3.2.dist-info/INSTALLER rename to libs/Markdown-3.7.dist-info/INSTALLER diff --git a/libs/Markdown-3.7.dist-info/LICENSE.md b/libs/Markdown-3.7.dist-info/LICENSE.md new file mode 100644 index 000000000..6249d60ce --- /dev/null +++ b/libs/Markdown-3.7.dist-info/LICENSE.md @@ -0,0 +1,30 @@ +BSD 3-Clause License + +Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) +Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) +Copyright 2004 Manfred Stienstra (the original version) + +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/libs/Markdown-3.5.2.dist-info/METADATA b/libs/Markdown-3.7.dist-info/METADATA similarity index 76% rename from libs/Markdown-3.5.2.dist-info/METADATA rename to libs/Markdown-3.7.dist-info/METADATA index 866453f0b..233bc55ba 100644 --- a/libs/Markdown-3.5.2.dist-info/METADATA +++ b/libs/Markdown-3.7.dist-info/METADATA @@ -1,40 +1,41 @@ Metadata-Version: 2.1 Name: Markdown -Version: 3.5.2 +Version: 3.7 Summary: Python implementation of John Gruber's Markdown. Author: Manfred Stienstra, Yuri Takhteyev Author-email: Waylan limberg Maintainer: Isaac Muse Maintainer-email: Waylan Limberg -License: Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) - Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) - Copyright 2004 Manfred Stienstra (the original version) +License: BSD 3-Clause License - All rights reserved. + Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later) + Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b) + Copyright 2004 Manfred Stienstra (the original version) 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 Python Markdown Project nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. + 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 PYTHON MARKDOWN PROJECT ''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 ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT - 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. + 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. Project-URL: Homepage, https://Python-Markdown.github.io/ Project-URL: Documentation, https://Python-Markdown.github.io/ diff --git a/libs/Markdown-3.5.2.dist-info/RECORD b/libs/Markdown-3.7.dist-info/RECORD similarity index 64% rename from libs/Markdown-3.5.2.dist-info/RECORD rename to libs/Markdown-3.7.dist-info/RECORD index a3e6a9479..34d25a0c7 100644 --- a/libs/Markdown-3.5.2.dist-info/RECORD +++ b/libs/Markdown-3.7.dist-info/RECORD @@ -1,26 +1,26 @@ ../../bin/markdown_py,sha256=a0a3HrUHepb4z4hcrRdCfAEQ8SiB-QoWxf9g1e-KLv8,237 -Markdown-3.5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Markdown-3.5.2.dist-info/LICENSE.md,sha256=bxGTy2NHGOZcOlN9biXr1hSCDsDvaTz8EiSBEmONZNo,1645 -Markdown-3.5.2.dist-info/METADATA,sha256=9pbPWhPBzgBE-uAwHn0vC0CGT-mw0KC8-SanIkqAFUo,7029 -Markdown-3.5.2.dist-info/RECORD,, -Markdown-3.5.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Markdown-3.5.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -Markdown-3.5.2.dist-info/entry_points.txt,sha256=lMEyiiA_ZZyfPCBlDviBl-SiU0cfoeuEKpwxw361sKQ,1102 -Markdown-3.5.2.dist-info/top_level.txt,sha256=IAxs8x618RXoH1uCqeLLxXsDefJvE_mIibr_M4sOlyk,9 +Markdown-3.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Markdown-3.7.dist-info/LICENSE.md,sha256=e6TrbRCzKy0R3OE4ITQDUc27swuozMZ4Qdsv_Ybnmso,1650 +Markdown-3.7.dist-info/METADATA,sha256=nY8sewcY6R1akyROqkyO-Jk_eUDY8am_C4MkRP79sWA,7040 +Markdown-3.7.dist-info/RECORD,, +Markdown-3.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Markdown-3.7.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +Markdown-3.7.dist-info/entry_points.txt,sha256=lMEyiiA_ZZyfPCBlDviBl-SiU0cfoeuEKpwxw361sKQ,1102 +Markdown-3.7.dist-info/top_level.txt,sha256=IAxs8x618RXoH1uCqeLLxXsDefJvE_mIibr_M4sOlyk,9 markdown/__init__.py,sha256=dfzwwdpG9L8QLEPBpLFPIHx_BN056aZXp9xZifTxYIU,1777 markdown/__main__.py,sha256=innFBxRqwPBNxG1zhKktJji4bnRKtVyYYd30ID13Tcw,5859 -markdown/__meta__.py,sha256=K-Yr6cieMQWMYt9f7Rx8PGkX2PYqz4aVJdupZf_CE2Q,1712 +markdown/__meta__.py,sha256=RhwfJ30zyGvJaJXLHwQdNH5jw69-5fVKu2p-CVaJz0U,1712 markdown/blockparser.py,sha256=j4CQImVpiq7g9pz8wCxvzT61X_T2iSAjXupHJk8P3eA,5728 -markdown/blockprocessors.py,sha256=dZFoOXABuOs5AFNpWrrsVEmPe1i8_JVe4rOusdRRPAA,26648 +markdown/blockprocessors.py,sha256=koY5rq8DixzBCHcquvZJp6x2JYyBGjrwxMWNZhd6D2U,27013 markdown/core.py,sha256=DyyzDsmd-KcuEp8ZWUKJAeUCt7B7G3J3NeqZqp3LphI,21335 markdown/extensions/__init__.py,sha256=9z1khsdKCVrmrJ_2GfxtPAdjD3FyMe5vhC7wmM4O9m0,4822 -markdown/extensions/abbr.py,sha256=J27cKf_vKY5wdKA_Bunwk83c3RpxwfgDeGarFF0FCuk,3540 +markdown/extensions/abbr.py,sha256=Gqt9TUtLWez2cbsy3SQk5152RZekops2fUJj01bfkfw,6903 markdown/extensions/admonition.py,sha256=Hqcn3I8JG0i-OPWdoqI189TmlQRgH6bs5PmpCANyLlg,6547 -markdown/extensions/attr_list.py,sha256=6PzqkH7N_U5lks7PGH7dSGmEGVuMCYR9MaR3g8c9Spw,6584 +markdown/extensions/attr_list.py,sha256=t3PrgAr5Ebldnq3nJNbteBt79bN0ccXS5RemmQfUZ9g,7820 markdown/extensions/codehilite.py,sha256=ChlmpM6S--j-UK7t82859UpYjm8EftdiLqmgDnknyes,13503 markdown/extensions/def_list.py,sha256=J3NVa6CllfZPsboJCEycPyRhtjBHnOn8ET6omEvVlDo,4029 markdown/extensions/extra.py,sha256=1vleT284kued4HQBtF83IjSumJVo0q3ng6MjTkVNfNQ,2163 -markdown/extensions/fenced_code.py,sha256=Xy4sQDjEsSJuShiAf9bwpv8Khtyf7Y6QDjNlH7QVM-Q,7817 +markdown/extensions/fenced_code.py,sha256=-fYSmRZ9DTYQ8HO9b_78i47kVyVu6mcVJlqVTMdzvo4,8300 markdown/extensions/footnotes.py,sha256=bRFlmIBOKDI5efG1jZfDkMoV2osfqWip1rN1j2P-mMg,16710 markdown/extensions/legacy_attrs.py,sha256=oWcyNrfP0F6zsBoBOaD5NiwrJyy4kCpgQLl12HA7JGU,2788 markdown/extensions/legacy_em.py,sha256=-Z_w4PEGSS-Xg-2-BtGAnXwwy5g5GDgv2tngASnPgxg,1693 @@ -28,9 +28,9 @@ markdown/extensions/md_in_html.py,sha256=y4HEWEnkvfih22fojcaJeAmjx1AtF8N-a_jb6ID markdown/extensions/meta.py,sha256=v_4Uq7nbcQ76V1YAvqVPiNLbRLIQHJsnfsk-tN70RmY,2600 markdown/extensions/nl2br.py,sha256=9KKcrPs62c3ENNnmOJZs0rrXXqUtTCfd43j1_OPpmgU,1090 markdown/extensions/sane_lists.py,sha256=ogAKcm7gEpcXV7fSTf8JZH5YdKAssPCEOUzdGM3C9Tw,2150 -markdown/extensions/smarty.py,sha256=DLmH22prpdZLDkV7GOCC1OTlCbTknKPHT9UNPs5-TwQ,11048 +markdown/extensions/smarty.py,sha256=yqT0OiE2AqYrqqZtcUFFmp2eJsQHomiKzgyG2JFb9rI,11048 markdown/extensions/tables.py,sha256=oTDvGD1qp9xjVWPGYNgDBWe9NqsX5gS6UU5wUsQ1bC8,8741 -markdown/extensions/toc.py,sha256=Vo2PFW4I0-ixOxTXzhoMhUTIAGiDeLPT7l0LNc9ZcBI,15293 +markdown/extensions/toc.py,sha256=PGg-EqbBubm3n0b633r8Xa9kc6JIdbo20HGAOZ6GEl8,18322 markdown/extensions/wikilinks.py,sha256=j7D2sozica6sqXOUa_GuAXqIzxp-7Hi60bfXymiuma8,3285 markdown/htmlparser.py,sha256=dEr6IE7i9b6Tc1gdCLZGeWw6g6-E-jK1Z4KPj8yGk8Q,14332 markdown/inlinepatterns.py,sha256=7_HF5nTOyQag_CyBgU4wwmuI6aMjtadvGadyS9IP21w,38256 diff --git a/libs/Mako-1.3.2.dist-info/REQUESTED b/libs/Markdown-3.7.dist-info/REQUESTED similarity index 100% rename from libs/Mako-1.3.2.dist-info/REQUESTED rename to libs/Markdown-3.7.dist-info/REQUESTED diff --git a/libs/Markdown-3.5.2.dist-info/WHEEL b/libs/Markdown-3.7.dist-info/WHEEL similarity index 65% rename from libs/Markdown-3.5.2.dist-info/WHEEL rename to libs/Markdown-3.7.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/Markdown-3.5.2.dist-info/WHEEL +++ b/libs/Markdown-3.7.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/Markdown-3.5.2.dist-info/entry_points.txt b/libs/Markdown-3.7.dist-info/entry_points.txt similarity index 100% rename from libs/Markdown-3.5.2.dist-info/entry_points.txt rename to libs/Markdown-3.7.dist-info/entry_points.txt diff --git a/libs/Markdown-3.5.2.dist-info/top_level.txt b/libs/Markdown-3.7.dist-info/top_level.txt similarity index 100% rename from libs/Markdown-3.5.2.dist-info/top_level.txt rename to libs/Markdown-3.7.dist-info/top_level.txt diff --git a/libs/MarkupSafe-2.1.5.dist-info/RECORD b/libs/MarkupSafe-2.1.5.dist-info/RECORD index 2b3c4338b..57cd62847 100644 --- a/libs/MarkupSafe-2.1.5.dist-info/RECORD +++ b/libs/MarkupSafe-2.1.5.dist-info/RECORD @@ -8,6 +8,6 @@ MarkupSafe-2.1.5.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_ markupsafe/__init__.py,sha256=r7VOTjUq7EMQ4v3p4R1LoVOGJg6ysfYRncLr34laRBs,10958 markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713 markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083 -markupsafe/_speedups.cpython-38-darwin.so,sha256=_9uBZXDBin5PdKhWn3XnAUpjp031_nC6MFOMuSDD-3g,51480 +markupsafe/_speedups.cpython-38-darwin.so,sha256=1yfD14PZ-QrFSi3XHMHazowfHExBdp5WS7IC86gAuRc,18712 markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229 markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/Markdown-3.5.2.dist-info/INSTALLER b/libs/PyYAML-6.0.2.dist-info/INSTALLER similarity index 100% rename from libs/Markdown-3.5.2.dist-info/INSTALLER rename to libs/PyYAML-6.0.2.dist-info/INSTALLER diff --git a/libs/PyYAML-6.0.1.dist-info/LICENSE b/libs/PyYAML-6.0.2.dist-info/LICENSE similarity index 100% rename from libs/PyYAML-6.0.1.dist-info/LICENSE rename to libs/PyYAML-6.0.2.dist-info/LICENSE diff --git a/libs/PyYAML-6.0.1.dist-info/METADATA b/libs/PyYAML-6.0.2.dist-info/METADATA similarity index 93% rename from libs/PyYAML-6.0.1.dist-info/METADATA rename to libs/PyYAML-6.0.2.dist-info/METADATA index c8905983e..db029b770 100644 --- a/libs/PyYAML-6.0.1.dist-info/METADATA +++ b/libs/PyYAML-6.0.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: PyYAML -Version: 6.0.1 +Version: 6.0.2 Summary: YAML parser and emitter for Python Home-page: https://pyyaml.org/ Download-URL: https://pypi.org/project/PyYAML/ @@ -20,17 +20,17 @@ Classifier: Operating System :: OS Independent Classifier: Programming Language :: Cython Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -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 :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Text Processing :: Markup -Requires-Python: >=3.6 +Requires-Python: >=3.8 License-File: LICENSE YAML is a data serialization format designed for human readability diff --git a/libs/PyYAML-6.0.1.dist-info/RECORD b/libs/PyYAML-6.0.2.dist-info/RECORD similarity index 71% rename from libs/PyYAML-6.0.1.dist-info/RECORD rename to libs/PyYAML-6.0.2.dist-info/RECORD index 079577cf1..f01fe7622 100644 --- a/libs/PyYAML-6.0.1.dist-info/RECORD +++ b/libs/PyYAML-6.0.2.dist-info/RECORD @@ -1,12 +1,12 @@ -PyYAML-6.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -PyYAML-6.0.1.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101 -PyYAML-6.0.1.dist-info/METADATA,sha256=UNNF8-SzzwOKXVo-kV5lXUGH2_wDWMBmGxqISpp5HQk,2058 -PyYAML-6.0.1.dist-info/RECORD,, -PyYAML-6.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -PyYAML-6.0.1.dist-info/WHEEL,sha256=UkJU7GAEhyIKVwGX1j1L5OGjUFT--MirwyCseqfCpZU,109 -PyYAML-6.0.1.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 +PyYAML-6.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyYAML-6.0.2.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101 +PyYAML-6.0.2.dist-info/METADATA,sha256=9-odFB5seu4pGPcEv7E8iyxNF51_uKnaNGjLAhz2lto,2060 +PyYAML-6.0.2.dist-info/RECORD,, +PyYAML-6.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +PyYAML-6.0.2.dist-info/WHEEL,sha256=39uaw0gKzAUihvDPhgMAk_aKXc5F8smdVlzAUVAVruU,109 +PyYAML-6.0.2.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 _yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402 -yaml/__init__.py,sha256=bhl05qSeO-1ZxlSRjGrvl2m9nrXb1n9-GQatTN0Mrqc,12311 +yaml/__init__.py,sha256=N35S01HMesFTe0aRRMWkPj0Pa8IEbHpE9FK7cr5Bdtw,12311 yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639 yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851 diff --git a/libs/Markdown-3.5.2.dist-info/REQUESTED b/libs/PyYAML-6.0.2.dist-info/REQUESTED similarity index 100% rename from libs/Markdown-3.5.2.dist-info/REQUESTED rename to libs/PyYAML-6.0.2.dist-info/REQUESTED diff --git a/libs/PyYAML-6.0.1.dist-info/WHEEL b/libs/PyYAML-6.0.2.dist-info/WHEEL similarity index 70% rename from libs/PyYAML-6.0.1.dist-info/WHEEL rename to libs/PyYAML-6.0.2.dist-info/WHEEL index 844cf17ca..b8b9cfd4c 100644 --- a/libs/PyYAML-6.0.1.dist-info/WHEEL +++ b/libs/PyYAML-6.0.2.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: bdist_wheel (0.44.0) Root-Is-Purelib: false Tag: cp38-cp38-macosx_12_0_x86_64 diff --git a/libs/PyYAML-6.0.1.dist-info/top_level.txt b/libs/PyYAML-6.0.2.dist-info/top_level.txt similarity index 100% rename from libs/PyYAML-6.0.1.dist-info/top_level.txt rename to libs/PyYAML-6.0.2.dist-info/top_level.txt diff --git a/libs/ftfy-6.1.3.dist-info/METADATA b/libs/README.md similarity index 83% rename from libs/ftfy-6.1.3.dist-info/METADATA rename to libs/README.md index 93187261a..7da285da5 100644 --- a/libs/ftfy-6.1.3.dist-info/METADATA +++ b/libs/README.md @@ -1,21 +1,3 @@ -Metadata-Version: 2.1 -Name: ftfy -Version: 6.1.3 -Summary: Fixes mojibake and other problems with Unicode, after the fact -License: Apache-2.0 -Author: Robyn Speer -Author-email: rspeer@arborelia.net -Requires-Python: >=3.8,<4 -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Programming Language :: Python :: 3 -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 :: 3.12 -Requires-Dist: wcwidth (>=0.2.12,<0.3.0) -Description-Content-Type: text/markdown - # ftfy: fixes text for you [![PyPI package](https://badge.fury.io/py/ftfy.svg)](https://badge.fury.io/py/ftfy) @@ -147,3 +129,15 @@ In BibTeX format, the citation is:: url = {https://doi.org/10.5281/zenodo.2591652} } +## Important license clarifications + +If you do not follow ftfy's license, you do not have a license to ftfy. + +This sounds obvious and tautological, but there are people who think open source licenses mean that they can just do what they want, especially in the field of generative AI. It's a permissive license but you still have to follow it. The [Apache license](https://www.apache.org/licenses/LICENSE-2.0) is the only thing that gives you permission to use and copy ftfy; otherwise, all rights are reserved. + +If you use or distribute ftfy, you must follow the terms of the [Apache license](https://www.apache.org/licenses/LICENSE-2.0), including that you must attribute the author of ftfy (Robyn Speer) correctly. + +You _may not_ make a derived work of ftfy that obscures its authorship, such as by putting its code in an AI training dataset, including the code in AI training at runtime, or using a generative AI that copies code from such a dataset. + +At my discretion, I may notify you of a license violation, and give you a chance to either remedy it or delete all copies of ftfy in your possession. + diff --git a/libs/PyYAML-6.0.1.dist-info/INSTALLER b/libs/SQLAlchemy-2.0.36.dist-info/INSTALLER similarity index 100% rename from libs/PyYAML-6.0.1.dist-info/INSTALLER rename to libs/SQLAlchemy-2.0.36.dist-info/INSTALLER diff --git a/libs/SQLAlchemy-2.0.27.dist-info/LICENSE b/libs/SQLAlchemy-2.0.36.dist-info/LICENSE similarity index 100% rename from libs/SQLAlchemy-2.0.27.dist-info/LICENSE rename to libs/SQLAlchemy-2.0.36.dist-info/LICENSE diff --git a/libs/SQLAlchemy-2.0.27.dist-info/METADATA b/libs/SQLAlchemy-2.0.36.dist-info/METADATA similarity index 95% rename from libs/SQLAlchemy-2.0.27.dist-info/METADATA rename to libs/SQLAlchemy-2.0.36.dist-info/METADATA index e43a4599d..0c802c4dc 100644 --- a/libs/SQLAlchemy-2.0.27.dist-info/METADATA +++ b/libs/SQLAlchemy-2.0.36.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: SQLAlchemy -Version: 2.0.27 +Version: 2.0.36 Summary: Database Abstraction Library Home-page: https://www.sqlalchemy.org Author: Mike Bayer @@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Database :: Front-Ends @@ -27,7 +28,7 @@ Requires-Python: >=3.7 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: typing-extensions >=4.6.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: greenlet !=0.4.17 ; python_version < "3.13" and (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' @@ -45,7 +46,7 @@ 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' +Requires-Dist: mariadb !=1.1.10,!=1.1.2,!=1.1.5,>=1.0.1 ; extra == 'mariadb_connector' Provides-Extra: mssql Requires-Dist: pyodbc ; extra == 'mssql' Provides-Extra: mssql_pymssql diff --git a/libs/SQLAlchemy-2.0.27.dist-info/RECORD b/libs/SQLAlchemy-2.0.36.dist-info/RECORD similarity index 53% rename from libs/SQLAlchemy-2.0.27.dist-info/RECORD rename to libs/SQLAlchemy-2.0.36.dist-info/RECORD index 1563d2d52..5444bcc7c 100644 --- a/libs/SQLAlchemy-2.0.27.dist-info/RECORD +++ b/libs/SQLAlchemy-2.0.36.dist-info/RECORD @@ -1,135 +1,134 @@ -SQLAlchemy-2.0.27.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -SQLAlchemy-2.0.27.dist-info/LICENSE,sha256=PA9Zq4h9BB3mpOUv_j6e212VIt6Qn66abNettue-MpM,1100 -SQLAlchemy-2.0.27.dist-info/METADATA,sha256=fZGrNxgSqoY_vLjP6pXy7Ax_9Fvpy6P0SN_Qmjpaf8M,9602 -SQLAlchemy-2.0.27.dist-info/RECORD,, -SQLAlchemy-2.0.27.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -SQLAlchemy-2.0.27.dist-info/WHEEL,sha256=UkJU7GAEhyIKVwGX1j1L5OGjUFT--MirwyCseqfCpZU,109 -SQLAlchemy-2.0.27.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 -sqlalchemy/__init__.py,sha256=s94qQVe-QqqRL9xhlih382KZikm_5rCLehCmTVeMkxo,13033 +SQLAlchemy-2.0.36.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +SQLAlchemy-2.0.36.dist-info/LICENSE,sha256=PA9Zq4h9BB3mpOUv_j6e212VIt6Qn66abNettue-MpM,1100 +SQLAlchemy-2.0.36.dist-info/METADATA,sha256=EZH514FydYtyOhgoZk_OF1ZQEtI4eTAEddlnUlRjzac,9692 +SQLAlchemy-2.0.36.dist-info/RECORD,, +SQLAlchemy-2.0.36.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +SQLAlchemy-2.0.36.dist-info/WHEEL,sha256=8MbRJsGMYV6Ym1_SoG8YuJPvArpN2Z2wVWusEpp3feg,108 +SQLAlchemy-2.0.36.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 +sqlalchemy/__init__.py,sha256=J2PsdiJiNW93Etxk6YN8o_C3TcpR1_DckU71r4LBcGE,13033 sqlalchemy/connectors/__init__.py,sha256=PzXPqZqi3BzEnrs1eW0DcsR4lyknAzhhN9rWcQ97hb4,476 sqlalchemy/connectors/aioodbc.py,sha256=GSTiNMO9h0qjPxgqaxDwWZ8HvhWMFNVR6MJQnN1oc40,5288 -sqlalchemy/connectors/asyncio.py,sha256=6s4hDYfuMjJ9KbJ4s7bF1fp5DmcgV77ozgZ5-bwZ0wc,5955 +sqlalchemy/connectors/asyncio.py,sha256=Hq2bkXmG6-KO_RfCrwMqx4oGH-uH1Z1WWKqPWNjz8p4,6138 sqlalchemy/connectors/pyodbc.py,sha256=t7AjyxIOnaWg3CrlUEpBs4Y5l0HFdNt3P_cSSKhbi0Y,8501 -sqlalchemy/cyextension/.gitignore,sha256=_4eLZEBj5Ht5WoM-WvbiDSycdViEzM62ucOZYPQWw9c,64 sqlalchemy/cyextension/__init__.py,sha256=GzhhN8cjMnDTE0qerlUlpbrNmFPHQWCZ4Gk74OAxl04,244 -sqlalchemy/cyextension/collections.cpython-38-darwin.so,sha256=T-PB8ecKVTCk2cZ2puq_f5XZg9d7gJEfgWTUEVD6sEo,258336 +sqlalchemy/cyextension/collections.cpython-38-darwin.so,sha256=JPCislATQznenBRmWIX9Ihqvfx99z04UDes848VPCfY,233760 sqlalchemy/cyextension/collections.pyx,sha256=L7DZ3DGKpgw2MT2ZZRRxCnrcyE5pU1NAFowWgAzQPEc,12571 -sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so,sha256=hNhW_0eX4BbJKF-YaZoWSh8nFzoh-iWjs5pzdakZr5A,127440 +sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so,sha256=vDvIl2ML414S5ZnbquknvGUbR52dNAfhltV86WMXnUA,94672 sqlalchemy/cyextension/immutabledict.pxd,sha256=3x3-rXG5eRQ7bBnktZ-OJ9-6ft8zToPmTDOd92iXpB0,291 sqlalchemy/cyextension/immutabledict.pyx,sha256=KfDTYbTfebstE8xuqAtuXsHNAK0_b5q_ymUiinUe_xs,3535 -sqlalchemy/cyextension/processors.cpython-38-darwin.so,sha256=NF8ouwV4ffK6AnAUb4ms9VaXC_5rc32Q16_cIy3HKKg,104648 +sqlalchemy/cyextension/processors.cpython-38-darwin.so,sha256=tl0ZZ_a97ftC1o6YcDdPwZRpvRgiAqiy3rz9SUo3a54,75976 sqlalchemy/cyextension/processors.pyx,sha256=R1rHsGLEaGeBq5VeCydjClzYlivERIJ9B-XLOJlf2MQ,1792 -sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so,sha256=4UKCNsTKsvERmKn5kSDC3cT06p0t1kwjtJ1FrSslVcA,106752 +sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so,sha256=cD-2VsfKRoe6o5w_iBR7bHGxAyqCF4pqMqeLjhqzu8o,78080 sqlalchemy/cyextension/resultproxy.pyx,sha256=eWLdyBXiBy_CLQrF5ScfWJm7X0NeelscSXedtj1zv9Q,2725 -sqlalchemy/cyextension/util.cpython-38-darwin.so,sha256=i39G3r6E1dWN3wVt0n-j_uQE074_rcD9uFxOMs5vFYY,125832 +sqlalchemy/cyextension/util.cpython-38-darwin.so,sha256=1ExFkSKS8idn9jWSlRTCI4v92JKAOrGZuS_Aoexd9fo,93064 sqlalchemy/cyextension/util.pyx,sha256=B85orxa9LddLuQEaDoVSq1XmAXIbLKxrxpvuB8ogV_o,2530 sqlalchemy/dialects/__init__.py,sha256=Kos9Gf5JZg1Vg6GWaCqEbD6e0r1jCwCmcnJIfcxDdcY,1770 sqlalchemy/dialects/_typing.py,sha256=hyv0nKucX2gI8ispB1IsvaUgrEPn9zEcq9hS7kfstEw,888 sqlalchemy/dialects/mssql/__init__.py,sha256=r5t8wFRNtBQoiUWh0WfIEWzXZW6f3D0uDt6NZTW_7Cc,1880 sqlalchemy/dialects/mssql/aioodbc.py,sha256=UQd9ecSMIML713TDnLAviuBVJle7P7i1FtqGZZePk2Y,2022 -sqlalchemy/dialects/mssql/base.py,sha256=2Tx9sC5bOd0JbweaMaqnjGOgESur7ZaaN1S66KMTwHk,133298 +sqlalchemy/dialects/mssql/base.py,sha256=msl_N_a_z8ali7Nthx55AGoV7b5wakCWvWu560BvH9o,132423 sqlalchemy/dialects/mssql/information_schema.py,sha256=HswjDc6y0mPXCf_x6VyylHlBdBa4PSY6Evxmmlch700,8084 sqlalchemy/dialects/mssql/json.py,sha256=evUACW2O62TAPq8B7QIPagz7jfc664ql9ms68JqiYzg,4816 -sqlalchemy/dialects/mssql/provision.py,sha256=RTVbgYLFAHzEnpVQDJroU8ji_10MqBTiZfyP9_-QNT4,5362 -sqlalchemy/dialects/mssql/pymssql.py,sha256=eZRLz7HGt3SdoZUjFBmA9BS43N7AhIASw7VPBPEJuG0,4038 +sqlalchemy/dialects/mssql/provision.py,sha256=ZAtt6Div9NLIngMs8kyloxfphw0KDNMsnRCAVd7-esE,5593 +sqlalchemy/dialects/mssql/pymssql.py,sha256=LAv43q4vBCB85OsAwHQItaQUYTYIO0QJ-jvzaBrswmY,4097 sqlalchemy/dialects/mssql/pyodbc.py,sha256=vwM-vBlmRwrqxOc73P0sFOrBSwn24wzc5IkEOpalbXQ,27056 sqlalchemy/dialects/mysql/__init__.py,sha256=bxbi4hkysUK2OOVvr1F49akUj1cky27kKb07tgFzI9U,2153 -sqlalchemy/dialects/mysql/aiomysql.py,sha256=67JrSUD1BmN88k_ASk6GvrttZFQiFjDY0wBiwdllxMk,9964 -sqlalchemy/dialects/mysql/asyncmy.py,sha256=CGILIRKf_2Ut9Ng2yBlmdg62laL-ockEm6GMuN7xlKE,10033 -sqlalchemy/dialects/mysql/base.py,sha256=KA7tvRxKUw0KwHwMth2rz-NWV0xMkVbYvPoBM9wrAFw,120850 +sqlalchemy/dialects/mysql/aiomysql.py,sha256=-oMZnCqNsSki8mlQRTWIwiQPT1OVdZIuANkb90q8LAs,9999 +sqlalchemy/dialects/mysql/asyncmy.py,sha256=YpuuOh8VknEeqHqUXQGfQ3jhfO3Xb-vZv78Jq5cscJ0,10067 +sqlalchemy/dialects/mysql/base.py,sha256=giGlZNGrKsNMoSkbzY0PGgfamKjA9rOkSq1o5vKvno4,122755 sqlalchemy/dialects/mysql/cymysql.py,sha256=eXT1ry0w_qRxjiO24M980c-8PZ9qSsbhqBHntjEiKB0,2300 sqlalchemy/dialects/mysql/dml.py,sha256=HXJMAvimJsqvhj3UZO4vW_6LkF5RqaKbHvklAjor7yU,7645 sqlalchemy/dialects/mysql/enumerated.py,sha256=ipEPPQqoXfFwcywNdcLlZCEzHBtnitHRah1Gn6nItcg,8448 sqlalchemy/dialects/mysql/expression.py,sha256=lsmQCHKwfPezUnt27d2kR6ohk4IRFCA64KBS16kx5dc,4097 sqlalchemy/dialects/mysql/json.py,sha256=l6MEZ0qp8FgiRrIQvOMhyEJq0q6OqiEnvDTx5Cbt9uQ,2269 sqlalchemy/dialects/mysql/mariadb.py,sha256=kTfBLioLKk4JFFst4TY_iWqPtnvvQXFHknLfm89H2N8,853 -sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=VVRwKLb6GzDmitOM4wLNvmZw6RdhnIwkLl7IZfAmUy8,8734 -sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=qiQdfLPze3QHuASAZ9iqRzD0hDW8FbKoQnfAEQCF7tM,5675 -sqlalchemy/dialects/mysql/mysqldb.py,sha256=9x_JiY4hj4tykG1ckuEGPyH4jCtsh4fgBhNukVnjUos,9658 -sqlalchemy/dialects/mysql/provision.py,sha256=4oGkClQ8jC3YLPF54sB4kCjFc8HRTwf5zl5zftAAXGo,3474 +sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=_S1aV93kyP52Nvj7HR9weThML4oUvSLsLqiVFdoLR2o,8623 +sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=oq3mtsNOMldUjs32JbJG2u3Hy3DObyVzUUMYfOkwkHg,5729 +sqlalchemy/dialects/mysql/mysqldb.py,sha256=qUBbA6STeYGozutyTxHCo5p1W3p59QFFS2FwCgPrjBA,9503 +sqlalchemy/dialects/mysql/provision.py,sha256=Jnk8UO9_Apd2odR2IQFLrscCfAmYxuBKcB8giS3bBog,3575 sqlalchemy/dialects/mysql/pymysql.py,sha256=GUnSHd2M2uKjmN46Hheymtm26g7phEgwYOXrX0zLY8M,4083 sqlalchemy/dialects/mysql/pyodbc.py,sha256=072crI4qVyPhajYvHnsfFeSrNjLFVPIjBQKo5uyz5yk,4297 -sqlalchemy/dialects/mysql/reflection.py,sha256=XXM8AGpaRTqDvuObg89Bzn_4h2ETG03viYBpWZJM3vc,22822 -sqlalchemy/dialects/mysql/reserved_words.py,sha256=Dm7FINIAkrKLoXmdu26SpE6V8LDCGyp734nmHV2tMd0,9154 -sqlalchemy/dialects/mysql/types.py,sha256=aPzx7hqqZ21aGwByEC-yWZUl6OpMvkbxwTqdN3OUGGI,24267 +sqlalchemy/dialects/mysql/reflection.py,sha256=3u34YwT1JJh3uThGZJZ3FKdnUcT7v08QB-tAl1r7VRk,22834 +sqlalchemy/dialects/mysql/reserved_words.py,sha256=ucKX2p2c3UnMq2ayZuOHuf73eXhu7SKsOsTlIN1Q83I,9258 +sqlalchemy/dialects/mysql/types.py,sha256=L5cTCsMT1pTedszNEM3jSxFNZEMcHQLprYCZ0vmfsnA,24343 sqlalchemy/dialects/oracle/__init__.py,sha256=p4-2gw7TT0bX_MoJXTGD4i8WHctYsK9kCRbkpzykBrc,1493 -sqlalchemy/dialects/oracle/base.py,sha256=-7b5iubFPxJyDRoLXlxj8rk8eBRN2_IdZlB2zzzrrbw,118246 -sqlalchemy/dialects/oracle/cx_oracle.py,sha256=t5yH4svVz7xoDSITF958blgZ01hbCUEWUKrAXwiCiAE,55566 +sqlalchemy/dialects/oracle/base.py,sha256=zLMZedrr6j1LvJz4qYnoSjikI5RZY92YFeQHiZ_YvW0,119676 +sqlalchemy/dialects/oracle/cx_oracle.py,sha256=q8Nyj15UZCE2TWOmxuWp5ZsxiCiGMzqfd_9UkmjIja0,55235 sqlalchemy/dialects/oracle/dictionary.py,sha256=7WMrbPkqo8ZdGjaEZyQr-5f2pajSOF1OTGb8P97z8-g,19519 -sqlalchemy/dialects/oracle/oracledb.py,sha256=UFcZwrrk0pWfAp_SKJZ1B5rIQHtNhOvuu73_JaSnTbI,9487 +sqlalchemy/dialects/oracle/oracledb.py,sha256=fZRKGqNIwW9LG4i8yDOXABrucbfzn_yC86Od-BJ3PcM,13619 sqlalchemy/dialects/oracle/provision.py,sha256=O9ZpF4OG6Cx4mMzLRfZwhs8dZjrJETWR402n9c7726A,8304 sqlalchemy/dialects/oracle/types.py,sha256=QK3hJvWzKnnCe3oD3rItwEEIwcoBze8qGg7VFOvVlIk,8231 -sqlalchemy/dialects/postgresql/__init__.py,sha256=kwgzMhtZKDHD12HMGo5MtdKCnDdy6wLezDGZPOEoU3Q,3895 +sqlalchemy/dialects/postgresql/__init__.py,sha256=wwnNAq4wDQzrlPRzDNB06ayuq3L2HNO99nzeEvq-YcU,3892 sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=7TudtgsPiSB8O5kX8W8KxcNYR8t5h_UHb86b_ChL0P8,5696 -sqlalchemy/dialects/postgresql/array.py,sha256=9dJ_1WjWSBX1-MGDZtJACJ38vtRO3da7d4UId79WsnQ,13713 -sqlalchemy/dialects/postgresql/asyncpg.py,sha256=12DN8hlK-Na_bEFmQ5kXK7MRqu87ze2IMX8aDyiSddU,40183 -sqlalchemy/dialects/postgresql/base.py,sha256=ogY8rcQvT9jjYdtStxZ_nhTl8LmhB_zeJyhZIaUyMLk,176486 +sqlalchemy/dialects/postgresql/array.py,sha256=bWcame7ntmI_Kx6gmBX0-chwADFdLHeCvaDQ4iX8id8,13734 +sqlalchemy/dialects/postgresql/asyncpg.py,sha256=9P0Itn9eeSBu67kGSsHuzx8xd4YYwRKdiZ5m7bF5onU,41074 +sqlalchemy/dialects/postgresql/base.py,sha256=dGPsaV3Esw6-AwE3QcgHF0Fray3Yw5-gLLgCvgdxvS0,179083 sqlalchemy/dialects/postgresql/dml.py,sha256=Pc69Le6qzmUHHb1FT5zeUSD31dWm6SBgdCAGW89cs3s,11212 sqlalchemy/dialects/postgresql/ext.py,sha256=1bZ--iNh2O9ym7l2gXZX48yP3yMO4dqb9RpYro2Mj2Q,16262 sqlalchemy/dialects/postgresql/hstore.py,sha256=otAx-RTDfpi_tcXkMuQV0JOIXtYgevgnsikLKKOkI6U,11541 -sqlalchemy/dialects/postgresql/json.py,sha256=-ffnp85fQBOyt0Bjb7XAupmOxloUdzFZZgixUG3Wj5w,11212 -sqlalchemy/dialects/postgresql/named_types.py,sha256=SFhs9_l108errKNuAMPl761RQ2imTO9PbUAnSv-WtRg,17100 +sqlalchemy/dialects/postgresql/json.py,sha256=53rQWon9cUXd1yCjIvUpJjWwNyRSy3U7Kz0HV70ftrc,11618 +sqlalchemy/dialects/postgresql/named_types.py,sha256=3IV1ufo7zJjKmX4VtGDEnoXE6xEqLJAtGG82IiqHXwY,17594 sqlalchemy/dialects/postgresql/operators.py,sha256=NsAaWun_tL3d_be0fs9YL6T4LPKK6crnmFxxIJHgyeY,2808 sqlalchemy/dialects/postgresql/pg8000.py,sha256=3yoekiWSF-xnaWMqG76XrYPMqerg-42TdmfsW_ivK9E,18640 -sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=nAKavWTE_4cqxiDKDTdo-ivkCxxRIlzD5GO9Wl1yrG4,8884 -sqlalchemy/dialects/postgresql/provision.py,sha256=yqyx-aDFO9l2YcL9f4T5HBP_Lnt5dHsMjpuXUG8mi7A,5762 -sqlalchemy/dialects/postgresql/psycopg.py,sha256=TF53axr1EkTBAZD85JCq6wA7XTcJTzXueSz26txDbgc,22364 -sqlalchemy/dialects/postgresql/psycopg2.py,sha256=gAP3poHDUxEB6iut6sxe9PhBiOrV_iIMvnP0NUlC-Rw,31607 +sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=hY3NXEUHxTWD4umhd2aowNu3laC-61Q_qQ_pReyXTUM,9254 +sqlalchemy/dialects/postgresql/provision.py,sha256=t6TZj0XaWG9zrpCjNr0oJRjAC_WQzaNdp3kaKJIbS8I,5770 +sqlalchemy/dialects/postgresql/psycopg.py,sha256=Uwf45f9fInOtaExiEdwiP9xzRo7hw0XyZTkRtgdom44,23168 +sqlalchemy/dialects/postgresql/psycopg2.py,sha256=kwEnflz5bAqJcuO_20eYiCtha_a4m_tg5_lppdDnaeU,31998 sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=M7wAYSL6Pvt-4nbfacAHGyyw4XMKJ_bQZ1tc1pBtIdg,1756 sqlalchemy/dialects/postgresql/ranges.py,sha256=6CgV7qkxEMJ9AQsiibo_XBLJYzGh-2ZxpG83sRaesVY,32949 sqlalchemy/dialects/postgresql/types.py,sha256=Jfxqw9JaKNOq29JRWBublywgb3lLMyzx8YZI7CXpS2s,7300 sqlalchemy/dialects/sqlite/__init__.py,sha256=lp9DIggNn349M-7IYhUA8et8--e8FRExWD2V_r1LJk4,1182 -sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=OMvxP2eWyqk5beF-sHhzxRmjzO4VCQp55q7NH2XPVTE,12305 -sqlalchemy/dialects/sqlite/base.py,sha256=lUtigjn7NdPBq831zQsLcBwdwRJqdgKM_tUaDrMElOE,96794 +sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=g3qGV6jmiXabWyb3282g_Nmxtj1jThxGSe9C9yalb-U,12345 +sqlalchemy/dialects/sqlite/base.py,sha256=LcnW6hzxqTtPlDBOInHumvuDt8a31THA5Jnm4vFvdFI,97811 sqlalchemy/dialects/sqlite/dml.py,sha256=9GE55WvwoktKy2fHeT-Wbc9xPHgsbh5oBfd_fckMH5Q,8443 sqlalchemy/dialects/sqlite/json.py,sha256=Eoplbb_4dYlfrtmQaI8Xddd2suAIHA-IdbDQYM-LIhs,2777 sqlalchemy/dialects/sqlite/provision.py,sha256=UCpmwxf4IWlrpb2eLHGbPTpCFVbdI_KAh2mKtjiLYao,5632 sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=OL2S_05DK9kllZj6DOz7QtEl7jI7syxjW6woS725ii4,5356 -sqlalchemy/dialects/sqlite/pysqlite.py,sha256=TAOqsHIjhbUZOF_Qk7UooiekkVZNhYJNduxlGQjokeA,27900 +sqlalchemy/dialects/sqlite/pysqlite.py,sha256=aDp47n0J509kl2hDchoaBKXEQVZtkux54DwfKytUAe4,28068 sqlalchemy/dialects/type_migration_guidelines.txt,sha256=-uHNdmYFGB7bzUNT6i8M5nb4j6j9YUKAtW4lcBZqsMg,8239 sqlalchemy/engine/__init__.py,sha256=Stb2oV6l8w65JvqEo6J4qtKoApcmOpXy3AAxQud4C1o,2818 sqlalchemy/engine/_py_processors.py,sha256=j9i_lcYYQOYJMcsDerPxI0sVFBIlX5sqoYMdMJlgWPI,3744 sqlalchemy/engine/_py_row.py,sha256=wSqoUFzLOJ1f89kgDb6sJm9LUrF5LMFpXPcK1vUsKcs,3787 sqlalchemy/engine/_py_util.py,sha256=f2DI3AN1kv6EplelowesCVpwS8hSXNufRkZoQmJtSH8,2484 -sqlalchemy/engine/base.py,sha256=NGD1iokXsJBw_6sBOpX4STo_05fQFd52qUl1YiJZsdU,122038 -sqlalchemy/engine/characteristics.py,sha256=Qbvt4CPrggJ3GfxHl0hOAxopjnCQy-W_pjtwLIe-Q1g,2590 -sqlalchemy/engine/create.py,sha256=5Me7rgLvmZVJM6QzoH8aBHz0lIratA2vXN8cW6kUgdY,32872 -sqlalchemy/engine/cursor.py,sha256=jSjpGM5DiwX1pwEHGx3wyqgHrgj8rwU5ZpVvMv5GaJs,74443 -sqlalchemy/engine/default.py,sha256=VSqSm-juosz-5WqZPWjgDQf8Fra27M-YsrVVcs7RwPU,84672 +sqlalchemy/engine/base.py,sha256=frWSMmt3dlentYH4QNN3cijdGzp8NbunColUZwWsWgI,122958 +sqlalchemy/engine/characteristics.py,sha256=N3kbvw_ApMh86wb5yAGnxtPYD4YRhYMWion1H_aVZBI,4765 +sqlalchemy/engine/create.py,sha256=mYJtOG2ZKM8sgyfjpGpamW15RDU7JXi5s6iibbJHMIs,33206 +sqlalchemy/engine/cursor.py,sha256=cFq61yrw76k-QR_xNUBWuL-Zeyb14ltG-6jo2Q2iuuw,76392 +sqlalchemy/engine/default.py,sha256=2wwKKdsagb3QTajRSEw8Hl-EnQ-LmRxy822xOGyenHc,84648 sqlalchemy/engine/events.py,sha256=c0unNFFiHzTAvkUtXoJaxzMFMDwurBkHiiUhuN8qluc,37381 -sqlalchemy/engine/interfaces.py,sha256=gktNzgLjNK-KrYMU__Lk0h85SXQI8LCjDakkuLxagNE,112688 +sqlalchemy/engine/interfaces.py,sha256=fcVHOmnMo7JZLHzgSKoK3QsdVHH7kJ_AmrDvwW9Ka3k,112936 sqlalchemy/engine/mock.py,sha256=yvpxgFmRw5G4QsHeF-ZwQGHKES-HqQOucTxFtN1uzdk,4179 sqlalchemy/engine/processors.py,sha256=XyfINKbo-2fjN-mW55YybvFyQMOil50_kVqsunahkNs,2379 -sqlalchemy/engine/reflection.py,sha256=FlT5kPpKm7Lah50GNt5XcnlJWojTL3LD_x0SoCF9kfY,75127 -sqlalchemy/engine/result.py,sha256=j6BI4Wj2bziQNQG5OlG_Cm4KcNWY9AoYvTXVlJUU-D8,77603 +sqlalchemy/engine/reflection.py,sha256=gwGs8y7x6py5z-ZWx3hQqQrwpHepMCTJyQcFwWJjPlw,75364 +sqlalchemy/engine/result.py,sha256=NZEskTMAcDzK-vjE96Fw8VvBL58s5Y6rt9vXcmZdM4w,77651 sqlalchemy/engine/row.py,sha256=9AAQo9zYDL88GcZ3bjcQTwMT-YIcuGTSMAyTfmBJ_yM,12032 sqlalchemy/engine/strategies.py,sha256=DqFSWaXJPL-29Omot9O0aOcuGL8KmCGyOvnPGDkAJoE,442 sqlalchemy/engine/url.py,sha256=8eWkUaIUyDExOcJ2D4xJXRcn4OY1GQJ3Q2duSX6UGAg,30784 -sqlalchemy/engine/util.py,sha256=hkEql1t19WHl6uzR55-F-Fs_VMCJ7p02KKQVNUDSXTk,5667 +sqlalchemy/engine/util.py,sha256=bNirO8k1S8yOW61uNH-a9QrWtAJ9VGFgbiR0lk1lUQU,5682 sqlalchemy/event/__init__.py,sha256=KBrp622xojnC3FFquxa2JsMamwAbfkvzfv6Op0NKiYc,997 -sqlalchemy/event/api.py,sha256=BUTAZjSlzvq4Hn2v2pihP_P1yo3lvCVDczK8lV_XJ80,8227 +sqlalchemy/event/api.py,sha256=DtDVgjKSorOfp9MGJ7fgMWrj4seC_hkwF4D8CW1RFZU,8226 sqlalchemy/event/attr.py,sha256=X8QeHGK4ioSYht1vkhc11f606_mq_t91jMNIT314ubs,20751 -sqlalchemy/event/base.py,sha256=3n9FmUkcXYHHyGzfpjKDsrIUVCNST_hq4zOtrNm0_a4,14954 +sqlalchemy/event/base.py,sha256=270OShTD17-bSFUFnPtKdVnB0NFJZ2AouYPo1wT0aJw,15127 sqlalchemy/event/legacy.py,sha256=teMPs00fO-4g8a_z2omcVKkYce5wj_1uvJO2n2MIeuo,8227 sqlalchemy/event/registry.py,sha256=nfTSSyhjZZXc5wseWB4sXn-YibSc0LKX8mg17XlWmAo,10835 sqlalchemy/events.py,sha256=k-ZD38aSPD29LYhED7CBqttp5MDVVx_YSaWC2-cu9ec,525 sqlalchemy/exc.py,sha256=M_8-O1hd8i6gbyx-TapV400p_Lxq2QqTGMXUAO-YgCc,23976 sqlalchemy/ext/__init__.py,sha256=S1fGKAbycnQDV01gs-JWGaFQ9GCD4QHwKcU2wnugg_o,322 -sqlalchemy/ext/associationproxy.py,sha256=5O5ANHARO8jytvqBQmOu-QjNVE4Hh3tfYquqKAj5ajs,65771 +sqlalchemy/ext/associationproxy.py,sha256=ZGc_ssGf7FC6eKrja1iTvnWEKLkFZQA8CiVAjR8iVRw,66062 sqlalchemy/ext/asyncio/__init__.py,sha256=1OqSxEyIUn7RWLGyO12F-jAUIvk1I6DXlVy80-Gvkds,1317 sqlalchemy/ext/asyncio/base.py,sha256=fl7wxZD9KjgFiCtG3WXrYjHEvanamcsodCqq9pH9lOk,8905 -sqlalchemy/ext/asyncio/engine.py,sha256=vQRdpBnGuyzyG48ZssDZvFlcS6Y6ZXUYI0GEOQqdDxk,47941 +sqlalchemy/ext/asyncio/engine.py,sha256=S_IRWX4QAjj2veLSu4Y3gKBIXkKQt7_2StJAK2_KUDY,48190 sqlalchemy/ext/asyncio/exc.py,sha256=8sII7VMXzs2TrhizhFQMzSfcroRtiesq8o3UwLfXSgQ,639 -sqlalchemy/ext/asyncio/result.py,sha256=ID2eh-NHW-lnNFTxbKhje8fr-tnsucUsiw_jcpGcSPc,30409 -sqlalchemy/ext/asyncio/scoping.py,sha256=BmE1UbFV_C4BXB4WngJc523DeMH-nTchNb8ORiSPYfE,52597 -sqlalchemy/ext/asyncio/session.py,sha256=Zhkrwwc4rqZJntUpzbgruQNgpuOwaRmjrBQb8ol19z0,62894 -sqlalchemy/ext/automap.py,sha256=hBlKAfZn2fgAAQh7vh4f2kClbb5ryOgV59tzVHEObQM,61389 +sqlalchemy/ext/asyncio/result.py,sha256=3rbVIY_wySi50JwaK3Kf2qa3c5Fc8W84FtUpt-9i9Vk,30477 +sqlalchemy/ext/asyncio/scoping.py,sha256=UxHAFxtWKqA7TEozyN2h7MJyzSspTCrS-1SlgQLTExo,52608 +sqlalchemy/ext/asyncio/session.py,sha256=QpXnqspwYnT28znD1EdpUIaVjQOO1BirtS0BJeBxeZk,63087 +sqlalchemy/ext/automap.py,sha256=r0mUSyogNyqdBL4m9AA1NXbLiTLQmtvyQymsssNEipo,61581 sqlalchemy/ext/baked.py,sha256=H6T1il7GY84BhzPFj49UECSpZh_eBuiHomA-QIsYOYQ,17807 -sqlalchemy/ext/compiler.py,sha256=ONPoxoKD2yUS9R2-oOhmPsA7efm-Bs0BXo7HE1dGlsU,20391 +sqlalchemy/ext/compiler.py,sha256=6X6sZCAo9v-PQfLbwBSYQUK0-XH2xTE5Jm0Zg6Ka6eM,20877 sqlalchemy/ext/declarative/__init__.py,sha256=20psLdFQbbOWfpdXHZ0CTY6I1k4UqXvKemNVu1LvPOI,1818 sqlalchemy/ext/declarative/extensions.py,sha256=uCjN1GisQt54AjqYnKYzJdUjnGd2pZBW47WWdPlS7FE,19547 sqlalchemy/ext/horizontal_shard.py,sha256=wuwAPnHymln0unSBnyx-cpX0AfESKSsypaSQTYCvzDk,16750 -sqlalchemy/ext/hybrid.py,sha256=LXph2NOtBQj6rZMi5ar-WCxkY7qaFp-o-UFIvCy-ep0,52432 +sqlalchemy/ext/hybrid.py,sha256=IYkCaPZ29gm2cPKPg0cWMkLCEqMykD8-JJTvgacGbmc,52458 sqlalchemy/ext/indexable.py,sha256=UkTelbydKCdKelzbv3HWFFavoET9WocKaGRPGEOVfN8,11032 sqlalchemy/ext/instrumentation.py,sha256=sg8ghDjdHSODFXh_jAmpgemnNX1rxCeeXEG3-PMdrNk,15707 sqlalchemy/ext/mutable.py,sha256=L5ZkHBGYhMaqO75Xtyrk2DBR44RDk0g6Rz2HzHH0F8Q,37355 @@ -137,111 +136,111 @@ sqlalchemy/ext/mypy/__init__.py,sha256=0WebDIZmqBD0OTq5JLtd_PmfF9JGxe4d4Qv3Ml3PK sqlalchemy/ext/mypy/apply.py,sha256=Aek_-XA1eXihT4attxhfE43yBKtCgsxBSb--qgZKUqc,10550 sqlalchemy/ext/mypy/decl_class.py,sha256=1vVJRII2apnLTUbc5HkJS6Z2GueaUv_eKvhbqh7Wik4,17384 sqlalchemy/ext/mypy/infer.py,sha256=KVnmLFEVS33Al8pUKI7MJbJQu3KeveBUMl78EluBORw,19369 -sqlalchemy/ext/mypy/names.py,sha256=IQ16GLZFqKxfYxIZxkbTurBqOUYbUV-64V_DSRns1tc,10630 +sqlalchemy/ext/mypy/names.py,sha256=Q3ef8XQBgVm9WUwlItqlYCXDNi_kbV5DdLEgbtEMEI8,10479 sqlalchemy/ext/mypy/plugin.py,sha256=74ML8LI9xar0V86oCxnPFv5FQGEEfUzK64vOay4BKFs,9750 -sqlalchemy/ext/mypy/util.py,sha256=1zuDQG8ezmF-XhJmAQU_lcBHiD--sL-lq20clg8t4lE,9448 +sqlalchemy/ext/mypy/util.py,sha256=DKRaurkXHI2lAMAAcEO5GLXbX_m2Xqy7l_juh8Byf5U,9960 sqlalchemy/ext/orderinglist.py,sha256=TGYbsGH72wEZcFNQDYDsZg9OSPuzf__P8YX8_2HtYUo,14384 -sqlalchemy/ext/serializer.py,sha256=YemanWdeMVUDweHCnQc-iMO6mVVXNo2qQ5NK0Eb2_Es,6178 +sqlalchemy/ext/serializer.py,sha256=D0g4jMZkRk0Gjr0L-FZe81SR63h0Zs-9JzuWtT_SD7k,6140 sqlalchemy/future/__init__.py,sha256=q2mw-gxk_xoxJLEvRoyMha3vO1xSRHrslcExOHZwmPA,512 sqlalchemy/future/engine.py,sha256=AgIw6vMsef8W6tynOTkxsjd6o_OQDwGjLdbpoMD8ue8,495 sqlalchemy/inspection.py,sha256=MF-LE358wZDUEl1IH8-Uwt2HI65EsQpQW5o5udHkZwA,5063 sqlalchemy/log.py,sha256=8x9UR3nj0uFm6or6bQF-JWb4fYv2zOeQjG_w-0wOJFA,8607 sqlalchemy/orm/__init__.py,sha256=ZYys5nL3RFUDCMOLFDBrRI52F6er3S1U1OY9TeORuKs,8463 -sqlalchemy/orm/_orm_constructors.py,sha256=VWY_MotbcQlECGx2uwEu3IcRkZ4RgLM_ufPad3IA9ZM,99354 +sqlalchemy/orm/_orm_constructors.py,sha256=8EQfYsDL2k_ev0eK-wxMl3algouczN38Gu43CrRlAlo,103434 sqlalchemy/orm/_typing.py,sha256=DVBfpHmDVK4x1zxaGJPY2GoTrAsyR6uexv20Lzf1afc,4973 -sqlalchemy/orm/attributes.py,sha256=-IGg2RFjOPwAEr-boohvlZfitz7OtaXz1v8-7uG8ekw,92520 -sqlalchemy/orm/base.py,sha256=HhuarpRU-BpKSHE1LeeBaG8CpdkwwLrvTkUVRK-ofjg,27424 -sqlalchemy/orm/bulk_persistence.py,sha256=SSSR0Omv8A8BzpsOdSo4x75XICoqGpO1sUkyEWUVGso,70022 -sqlalchemy/orm/clsregistry.py,sha256=29LyYiuj0qbebOpgW6DbBPNB2ikTweFQar1byCst7I0,17958 -sqlalchemy/orm/collections.py,sha256=jpMsJGVixmrW9kfT8wevm9kpatKRqyDLcqWd7CjKPxE,52179 -sqlalchemy/orm/context.py,sha256=Wjx0d1Rkxd-wsX1mP2V2_4VbOxdNY6S_HijdXJ-TtKg,112001 -sqlalchemy/orm/decl_api.py,sha256=0gCZWM2sOXb_4OzUXfevVUisZWOUrErQTAHyaSQQL5k,63674 -sqlalchemy/orm/decl_base.py,sha256=Tq6I3Jm3bkM01mmoiHfdFXLE94YDk1ik2u2dXL1RxLc,81601 +sqlalchemy/orm/attributes.py,sha256=lorOHBJvJJYndOuafWJhHBbQ1pR6FAyimhqz-mErBRQ,92534 +sqlalchemy/orm/base.py,sha256=FXkYTSCDUJFQSB5pcyPt2wG-dRctf5P6ySjyjVxQsX0,27502 +sqlalchemy/orm/bulk_persistence.py,sha256=1FC23bRJKjpfbp2D5hYuV1qOVIKGSswu9XPXbbSJ5Mo,72663 +sqlalchemy/orm/clsregistry.py,sha256=IjoDZwWpjG42ji59L4M1EZvjBEoXPZykzENDtKWxU8A,17974 +sqlalchemy/orm/collections.py,sha256=WEKuUCRgLhDhJEIBhZ21UrE0pBOyRm2zxD20GvbgA9g,52243 +sqlalchemy/orm/context.py,sha256=FMPyw07OA9OXWQ32RQx52AEa2xTLSkqdYgx9R_yN1x0,112955 +sqlalchemy/orm/decl_api.py,sha256=_WPKQ_vSE5k2TLtNmkaxxYmvbhZvkRMrrvCeDxdqDQE,63998 +sqlalchemy/orm/decl_base.py,sha256=8R7go5sULTYNRlhYiEjXIJkQ34oPp7DY_fC2nS5D5is,83343 sqlalchemy/orm/dependency.py,sha256=hgjksUWhgbmgHK5GdJdiDCBgDAIGQXIrY-Tj79tbL2k,47631 -sqlalchemy/orm/descriptor_props.py,sha256=pKtpP7H1LB_YuHRVrEYpfFZybEnUUdPwQXxduYFe2hA,37180 -sqlalchemy/orm/dynamic.py,sha256=jksBDCOsm6EBMVParcNGuMeaAv12hX4IzouKspC-HPA,9786 -sqlalchemy/orm/evaluator.py,sha256=q292K5vdpP69G7Z9y1RqI5GFAk2diUPwnsXE8De_Wgw,11925 -sqlalchemy/orm/events.py,sha256=_Ttun_bCSGgvsfg-VzAeEcsGpacf8p4c5z12JkSQkjM,127697 -sqlalchemy/orm/exc.py,sha256=w7MZkJMGGlu5J6jOFSmi9XXzc02ctnTv34jrEWpI-eM,7356 +sqlalchemy/orm/descriptor_props.py,sha256=dR_h4Gvdtpcdp4sj_ZOR4P5Nng2J2vhsvFHouRLlntc,37244 +sqlalchemy/orm/dynamic.py,sha256=rWAZ-nfAkREuNjt8e_FRdqYrvHDdbODn1CcfyP8Y18k,9816 +sqlalchemy/orm/evaluator.py,sha256=tRETz4dNZ71VsEA8nG0hpefByB-W0zBt02IxcSR5H2g,12353 +sqlalchemy/orm/events.py,sha256=1PiGT7JMUWTDAb3X1T79P02BMVDmcWEpatz1FwpLqoA,127777 +sqlalchemy/orm/exc.py,sha256=IP40P-wOeXhkYk0YizuTC3wqm6W9cPTaQU08f5MMaQ0,7413 sqlalchemy/orm/identity.py,sha256=jHdCxCpCyda_8mFOfGmN_Pr0XZdKiU-2hFZshlNxbHs,9249 sqlalchemy/orm/instrumentation.py,sha256=M-kZmkUvHUxtf-0mCA8RIM5QmMH1hWlYR_pKMwaidjA,24321 -sqlalchemy/orm/interfaces.py,sha256=1yyppjMHcP5NPXjxfOlSeFNmc-3_T_o2upeF3KFZtc0,48378 -sqlalchemy/orm/loading.py,sha256=JN2zLnPjNnk7K9DERbyerxESCXin7m7X1XP0gfdWLOE,57537 -sqlalchemy/orm/mapped_collection.py,sha256=3cneB1dfPTLrsTvKoo9_oCY2xtq4UAHfe5WSXPyqIS4,19690 -sqlalchemy/orm/mapper.py,sha256=8SVHr7tO-DDNpNGi68usc7PLQ7mTwzkZNEJu1aMb6dQ,171059 -sqlalchemy/orm/path_registry.py,sha256=bIXllBRevK7Ic5irajYnZgl2iazJ0rKNRkhXJSlfxjY,25850 +sqlalchemy/orm/interfaces.py,sha256=7Lni4Cue41b1CsmN4VbeUyWwzuNMcKtkrpihc9U-WIw,48690 +sqlalchemy/orm/loading.py,sha256=9RacpzFOWbuKgPRWHFmyIvD4fYCLAnkpwBFASyQ2CoI,58277 +sqlalchemy/orm/mapped_collection.py,sha256=zK3d3iozORzDruBUrAmkVC0RR3Orj5szk-TSQ24xzIU,19682 +sqlalchemy/orm/mapper.py,sha256=W-srpoEc3UIYv_6qTXTd_dG_TVeQcToG77VGrXt85PM,171738 +sqlalchemy/orm/path_registry.py,sha256=sJZMv_WPqUpHfQtKWaX3WYFeKBcNJ8C3wOM2mkBGkTE,25920 sqlalchemy/orm/persistence.py,sha256=dzyB2JOXNwQgaCbN8kh0sEz00WFePr48qf8NWVCUZH8,61701 -sqlalchemy/orm/properties.py,sha256=81I-PIF7f7bB0qdH4BCYMWzCzRpe57yUiEIPv2tzBoA,29127 -sqlalchemy/orm/query.py,sha256=UVNWn_Rq4a8agh5UUWNeu0DJQtPceCWVpXx1-uW7A4E,117555 -sqlalchemy/orm/relationships.py,sha256=DqD3WBKpeVQ59ldh6eCxar_sIToA3tc2-bJPtp3zfpM,127709 -sqlalchemy/orm/scoping.py,sha256=gFYywLeMmd5qjFdVPzeuCX727mTaChrCv8aqn4wPke0,78677 -sqlalchemy/orm/session.py,sha256=yiKyoJBARQj4I1ZBjsIxc6ecCpt2Upjvlxruo2A5HRc,193181 -sqlalchemy/orm/state.py,sha256=mW2f1hMSNeTJ89foutOE1EqLLD6DZkrSeO-pgagZweg,37520 +sqlalchemy/orm/properties.py,sha256=eDPFzxYUgdM3uWjHywnb1XW-i0tVKKyx7A2MCD31GQU,29306 +sqlalchemy/orm/query.py,sha256=Cf0e94-u1XyoXJoOAmr4iFvtCwNY98kxUYyMPenaWTE,117708 +sqlalchemy/orm/relationships.py,sha256=dS5SY0v1MiD7iCNnAQlHaI6prUQhL5EkXT7ijc8FR8E,128644 +sqlalchemy/orm/scoping.py,sha256=rJVc7_Lic4V00HZ-UvYFWkVpXqdrMayRmIs4fIwH1UA,78688 +sqlalchemy/orm/session.py,sha256=CZJTQ-wPwIy0c3AMFxgJnBgaft6eEf4JzcCLcaaCSjg,195979 +sqlalchemy/orm/state.py,sha256=327-F4TG29s6mLC8oWRiO2PuvYIUZzY1MqUPjtUy7M4,37670 sqlalchemy/orm/state_changes.py,sha256=qKYg7NxwrDkuUY3EPygAztym6oAVUFcP2wXn7QD3Mz4,6815 -sqlalchemy/orm/strategies.py,sha256=OtmMtWpCDk4ZiaM_ipzGn80sPOi6Opwj3Co4lUHpd_w,114206 -sqlalchemy/orm/strategy_options.py,sha256=RbFl-79Lrh8XIVUnZFmQ5GVvR586SG_szs3prw5DZLQ,84204 +sqlalchemy/orm/strategies.py,sha256=-tsBRsmEqkaxAAIn4t2F-U5SrRIPoPCyzpqFYGTAwNs,119866 +sqlalchemy/orm/strategy_options.py,sha256=oeDl_rMDNAC_90N7ytsni-psXWAeQMhABQFyKBSmai0,85353 sqlalchemy/orm/sync.py,sha256=g7iZfSge1HgxMk9SKRgUgtHEbpbZ1kP_CBqOIdTOXqc,5779 sqlalchemy/orm/unitofwork.py,sha256=fiVaqcymbDDHRa1NjS90N9Z466nd5pkJOEi1dHO6QLY,27033 -sqlalchemy/orm/util.py,sha256=MSLKAWZNw3FzFTH094xpfrhoA2Ov5pJQinK_dU_M0zo,80351 +sqlalchemy/orm/util.py,sha256=5SC4MOVU0cPObexDjpMvXvetueiU5pze42raL94gj24,81021 sqlalchemy/orm/writeonly.py,sha256=SYu2sAaHZONk2pW4PmtE871LG-O0P_bjidvKzY1H_zI,22305 sqlalchemy/pool/__init__.py,sha256=qiDdq4r4FFAoDrK6ncugF_i6usi_X1LeJt-CuBHey0s,1804 sqlalchemy/pool/base.py,sha256=WF4az4ZKuzQGuKeSJeyexaYjmWZUvYdC6KIi8zTGodw,52236 sqlalchemy/pool/events.py,sha256=xGjkIUZl490ZDtCHqnQF9ZCwe2Jv93eGXmnQxftB11E,13147 -sqlalchemy/pool/impl.py,sha256=2k2YMY9AepEoqGD_ClP_sUodSoa6atkt3GLPPWI49i4,17717 +sqlalchemy/pool/impl.py,sha256=JwpALSkH-pCoO_6oENbkHYY00Jx9nlttyoI61LivRNc,18944 sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 sqlalchemy/schema.py,sha256=dKiWmgHYjcKQ4TiiD6vD0UMmIsD8u0Fsor1M9AAeGUs,3194 sqlalchemy/sql/__init__.py,sha256=UNa9EUiYWoPayf-FzNcwVgQvpsBdInPZfpJesAStN9o,5820 sqlalchemy/sql/_dml_constructors.py,sha256=YdBJex0MCVACv4q2nl_ii3uhxzwU6aDB8zAsratX5UQ,3867 -sqlalchemy/sql/_elements_constructors.py,sha256=rrxq5Nzyo7GbLaGxb8VRZxko2nW0z7SYEli8ArfMIXI,62550 +sqlalchemy/sql/_elements_constructors.py,sha256=833Flez92odZkE2Vy6SXK8LcoO1AwkfVzOnATJLWFsA,63168 sqlalchemy/sql/_orm_types.py,sha256=T-vjcry4C1y0GToFKVxQCnmly_-Zsq4IO4SHN6bvUF4,625 sqlalchemy/sql/_py_util.py,sha256=hiM9ePbRSGs60bAMxPFuJCIC_p9SQ1VzqXGiPchiYwE,2173 sqlalchemy/sql/_selectable_constructors.py,sha256=wjE6HrLm9cR7bxvZXT8sFLUqT6t_J9G1XyQCnYmBDl0,18780 -sqlalchemy/sql/_typing.py,sha256=Z3tBzapYRP0sKL7IwqnzPE9b8Bbq9vQtc4iV9tvxDoU,12494 +sqlalchemy/sql/_typing.py,sha256=oqwrYHVMtK-AuKGH9c4SgfiOEJUt5vjkzSEzzscMHkM,12771 sqlalchemy/sql/annotation.py,sha256=aqbbVz9kfbCT3_66CZ9GEirVN197Cukoqt8rq48FgkQ,18245 -sqlalchemy/sql/base.py,sha256=2MVQnIL0b8xuzp1Fcv0NAye6h_OcgYpsUgLB4sy8Ahk,73756 -sqlalchemy/sql/cache_key.py,sha256=sJhAA-2jovIteeIU7mw9hSL1liPP9Ez89CZZJFC3h6E,33548 -sqlalchemy/sql/coercions.py,sha256=1xzN_9U5BCJGgokdc5iYj5o2cMAfEEZkr1Oa9Q-JYj8,40493 -sqlalchemy/sql/compiler.py,sha256=aDD100xmz8WpBq8oe7PJ5ar8lk9emd54gEE5K2Hr76g,271187 -sqlalchemy/sql/crud.py,sha256=g9xcol2KRGjZi1qsb2-bVz8zgVy_53gfMtJcnNO2vyQ,56521 -sqlalchemy/sql/ddl.py,sha256=CIqMilCKfuQnF0lrZsQdTxgrbXqcTauKr0Ojzj77PFQ,45602 +sqlalchemy/sql/base.py,sha256=M1b-Tg49ikUW2mnZv0aI38oASG6dgeo4jBNWDgJgAg8,73925 +sqlalchemy/sql/cache_key.py,sha256=0Db8mR8IrpBgdzXs4TGTt98LOpL3c7KABd72MAPKUQQ,33668 +sqlalchemy/sql/coercions.py,sha256=hAEou9Ycyswzu8yz_Q7QkwL2_c3nctzBJQS2oDEr4iE,40664 +sqlalchemy/sql/compiler.py,sha256=hrTptbOKIgVIHapywj4Lk5OMwpXvHS-KGg3odFwlo-I,274687 +sqlalchemy/sql/crud.py,sha256=HBX4QPtW_PYYJmIKfNr-wE8IdEr963N24WXzFBUZOo0,56514 +sqlalchemy/sql/ddl.py,sha256=lKqvOigbcYrDG0euxd5F4tu9HbBi1kmp3eFPc45HH-8,45636 sqlalchemy/sql/default_comparator.py,sha256=utXWsZVGEjflhFfCT4ywa6RnhORc1Rryo87Hga71Rps,16707 sqlalchemy/sql/dml.py,sha256=pn0Lm1ofC5qVZzwGWFW73lPCiNba8OsTeemurJgwRyg,65614 -sqlalchemy/sql/elements.py,sha256=kGRUilpx-rr6TTZgZpC5b71OnxxmCgDJRF2fYjDtxh8,172025 +sqlalchemy/sql/elements.py,sha256=YfccXzQc9DlgF8q15kDf-zKBUY_vpIe0FGaVDBPoic4,176544 sqlalchemy/sql/events.py,sha256=iC_Q1Htm1Aobt5tOYxWfHHqNpoytrULORmUKcusH_-E,18290 sqlalchemy/sql/expression.py,sha256=VMX-dLpsZYnVRJpYNDozDUgaj7iQ0HuewUKVefD57PE,7586 -sqlalchemy/sql/functions.py,sha256=MjXK0IVv45Y4n96_TMDZGJ7fwAhGHPRbFP8hOJgaplQ,63689 -sqlalchemy/sql/lambdas.py,sha256=6P__bsWsFnrD7M18FPiBXI0L0OdWZOEV25FAijT4bwo,49289 +sqlalchemy/sql/functions.py,sha256=kMMYplvuIHFAPwxBI03SizwaLcYEHzysecWk-R1V-JM,63762 +sqlalchemy/sql/lambdas.py,sha256=DP0Qz7Ypo8QhzMwygGHYgRhwJMx-rNezO1euouH3iYU,49292 sqlalchemy/sql/naming.py,sha256=ZHs1qSV3ou8TYmZ92uvU3sfdklUQlIz4uhe330n05SU,6858 -sqlalchemy/sql/operators.py,sha256=r4oQp4h5zTMFFOpiFNV56joIK-QIjJCobatsmaZ-724,75935 +sqlalchemy/sql/operators.py,sha256=himArRqBzrljob3Zfhi_ZS-Jleg1u6YFp0g3d7Co6IM,76106 sqlalchemy/sql/roles.py,sha256=pOsVn_OZD7mF2gJByHf24Rjopt0_Hu3dUCEOK5t4KS8,7662 -sqlalchemy/sql/schema.py,sha256=WOIBaDVdg-zahrP95CPYgY4--3OQN56DH6xm28JDF-Y,228262 -sqlalchemy/sql/selectable.py,sha256=7lxe79hZvnHyzHe1DobodI1lZ1eo8quSLZ6phw10Zj4,232848 -sqlalchemy/sql/sqltypes.py,sha256=UV46KTkgxSin48oPckPOqk3Gx0tZT1l60qXwk7SbKlo,127101 -sqlalchemy/sql/traversals.py,sha256=NFgJrVJzInO3HrnG90CklxrDXhFydZohPs2vRJkh3Bo,33589 -sqlalchemy/sql/type_api.py,sha256=5DzdVquCJomFfpfMyLYbCb66PWxjxbSRdjh6UYB1Yv4,83841 +sqlalchemy/sql/schema.py,sha256=iFleWHkxi-3mKGiK_N1TzUqxnNwOpypB4bWDuAVQe8c,229717 +sqlalchemy/sql/selectable.py,sha256=cgyV0AsPy4CXAFdhMiTCkbgaHiFilW9sclzxlHJKH3o,236460 +sqlalchemy/sql/sqltypes.py,sha256=5_N9MhprQFWYc3yjcXgFC_DmvkQU-Jz-Ok9nIMYp2Q4,127469 +sqlalchemy/sql/traversals.py,sha256=3ScTC1fh1-y8Y478h_2Azmd2xdQdWPWkDve4YgrwMf8,33664 +sqlalchemy/sql/type_api.py,sha256=SN16_oNZG6G65cvG6ABPcptz_YV5vfB2fknwJZxrkOs,84464 sqlalchemy/sql/util.py,sha256=qGHQF-tPCj-m1FBerzT7weCanGcXU7dK5m-W7NHio-4,48077 sqlalchemy/sql/visitors.py,sha256=71wdVvhhZL4nJvVwFAs6ssaW-qZgNRSmKjpAcOzF_TA,36317 -sqlalchemy/testing/__init__.py,sha256=VsrEHrORpAF5n7Vfl43YQgABh6EP1xBx_gHxs7pSXeE,3126 +sqlalchemy/testing/__init__.py,sha256=zgitAYzsCWT_U48ZiifXHHLJFo8nZBYmI-5TueA4_lE,3160 sqlalchemy/testing/assertions.py,sha256=gL0rA7CCZJbcVgvWOPV91tTZTRwQc1_Ta0-ykBn83Ew,31439 sqlalchemy/testing/assertsql.py,sha256=IgQG7l94WaiRP8nTbilJh1ZHZl125g7GPq-S5kmQZN0,16817 -sqlalchemy/testing/asyncio.py,sha256=fkdRz-E37d5OrQKw5hdjmglOTJyXGnJzaJpvNXOBLxg,3728 +sqlalchemy/testing/asyncio.py,sha256=kM8uuOqDBagZF0r9xvGmsiirUVLUQ_KBzjUFU67W-b8,3830 sqlalchemy/testing/config.py,sha256=AqyH1qub_gDqX0BvlL-JBQe7N-t2wo8655FtwblUNOY,12090 -sqlalchemy/testing/engines.py,sha256=UnH-8--3zLlYz4IbbCPwC375Za_DC61Spz-oKulbs9Q,13347 +sqlalchemy/testing/engines.py,sha256=HFJceEBD3Q_TTFQMTtIV5wGWO_a7oUgoKtUF_z636SM,13481 sqlalchemy/testing/entities.py,sha256=IphFegPKbff3Un47jY6bi7_MQXy6qkx_50jX2tHZJR4,3354 sqlalchemy/testing/exclusions.py,sha256=T8B01hmm8WVs-EKcUOQRzabahPqblWJfOidi6bHJ6GA,12460 sqlalchemy/testing/fixtures/__init__.py,sha256=dMClrIoxqlYIFpk2ia4RZpkbfxsS_3EBigr9QsPJ66g,1198 sqlalchemy/testing/fixtures/base.py,sha256=9r_J2ksiTzClpUxW0TczICHrWR7Ny8PV8IsBz6TsGFI,12256 sqlalchemy/testing/fixtures/mypy.py,sha256=gdxiwNFIzDlNGSOdvM3gbwDceVCC9t8oM5kKbwyhGBk,11973 sqlalchemy/testing/fixtures/orm.py,sha256=8EFbnaBbXX_Bf4FcCzBUaAHgyVpsLGBHX16SGLqE3Fg,6095 -sqlalchemy/testing/fixtures/sql.py,sha256=MFOuYBUyPIpHJzjRCHL9vU-IT4bD6LXGGMvsp0v1FY8,15704 +sqlalchemy/testing/fixtures/sql.py,sha256=KZMjco9_3dsuspmkew5Ejp88Wlr9PsSBB1qeJGFxQAk,15900 sqlalchemy/testing/pickleable.py,sha256=U9mIqk-zaxq9Xfy7HErP7UrKgTov-A3QFnhZh-NiOjI,2833 sqlalchemy/testing/plugin/__init__.py,sha256=79F--BIY_NTBzVRIlJGgAY5LNJJ3cD19XvrAo4X0W9A,247 sqlalchemy/testing/plugin/bootstrap.py,sha256=oYScMbEW4pCnWlPEAq1insFruCXFQeEVBwo__i4McpU,1685 sqlalchemy/testing/plugin/plugin_base.py,sha256=BgNzWNEmgpK4CwhyblQQKnH-7FDKVi_Uul5vw8fFjBU,21578 -sqlalchemy/testing/plugin/pytestplugin.py,sha256=Jtj073ArTcAmetv81sHmrUhlH0SblcSK4wyN8S4hmvo,27554 +sqlalchemy/testing/plugin/pytestplugin.py,sha256=6jkQHH2VQMD75k2As9CuWXmEy9jrscoFRhCNg6-PaTw,27656 sqlalchemy/testing/profiling.py,sha256=PbuPhRFbauFilUONeY3tV_Y_5lBkD7iCa8VVyH2Sk9Y,10148 -sqlalchemy/testing/provision.py,sha256=zXsw2D2Xpmw_chmYLsE1GXQqKQ-so3V8xU_joTcKan0,14619 -sqlalchemy/testing/requirements.py,sha256=N9pSj7z2wVMkBif-DQfPVa_cl9k6p9g_J5FY1OsWtrY,51817 +sqlalchemy/testing/provision.py,sha256=3qFor_sN1FFlS7odUGkKqLUxGmQZC9XM67I9vQ_zeXo,14626 +sqlalchemy/testing/requirements.py,sha256=Z__o-1Rj9B7dI8E_l3qsKTvsg0rK198vB0A1p7A5dcM,52832 sqlalchemy/testing/schema.py,sha256=lr4GkGrGwagaHMuSGzWdzkMaj3HnS7dgfLLWfxt__-U,6513 sqlalchemy/testing/suite/__init__.py,sha256=Y5DRNG0Yl1u3ypt9zVF0Z9suPZeuO_UQGLl-wRgvTjU,722 sqlalchemy/testing/suite/test_cte.py,sha256=6zBC3W2OwX1Xs-HedzchcKN2S7EaLNkgkvV_JSZ_Pq0,6451 @@ -249,28 +248,28 @@ sqlalchemy/testing/suite/test_ddl.py,sha256=1Npkf0C_4UNxphthAGjG078n0vPEgnSIHpDu sqlalchemy/testing/suite/test_deprecations.py,sha256=BcJxZTcjYqeOAENVElCg3hVvU6fkGEW3KGBMfnW8bng,5337 sqlalchemy/testing/suite/test_dialect.py,sha256=EH4ZQWbnGdtjmx5amZtTyhYmrkXJCvW1SQoLahoE7uk,22923 sqlalchemy/testing/suite/test_insert.py,sha256=9azifj6-OCD7s8h_tAO1uPw100ibQv8YoKc_VA3hn3c,18824 -sqlalchemy/testing/suite/test_reflection.py,sha256=tJSbJFg5fw0sSUv3I_FPmhN7rWWeJtq3YyxmylWJUlM,106466 -sqlalchemy/testing/suite/test_results.py,sha256=NQ23m8FDVd0ub751jN4PswGoAhk5nrqvjHvpYULZXnc,15937 +sqlalchemy/testing/suite/test_reflection.py,sha256=7sML8-owubSQeEM7Ve6LbnB8uIVlNV00WWepKwII2a8,109648 +sqlalchemy/testing/suite/test_results.py,sha256=X720GafdA4p75SOGS93j-dXkt6QDEnnJbU2bh18VCcg,16914 sqlalchemy/testing/suite/test_rowcount.py,sha256=3KDTlRgjpQ1OVfp__1cv8Hvq4CsDKzmrhJQ_WIJWoJg,7900 -sqlalchemy/testing/suite/test_select.py,sha256=FvMFYQW9IJpDWGYZiJk46is6YrtmdSghBdTjZCG8T0Y,58574 +sqlalchemy/testing/suite/test_select.py,sha256=ulRZQJlzkwwcewEyisuBEXVWFR0Wshz9MEDxYYiYLwQ,61732 sqlalchemy/testing/suite/test_sequence.py,sha256=66bCoy4xo99GBSaX6Hxb88foANAykLGRz1YEKbvpfuA,9923 -sqlalchemy/testing/suite/test_types.py,sha256=rFmTOg6XuMch9L2-XthfLJRCTTwpZbMfrNss2g09gmc,65677 +sqlalchemy/testing/suite/test_types.py,sha256=K4MGHvnTtgqeksoQOBCZRVQYC7HoYO6Z6rVt5vj2t9o,67805 sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=c3_eIxLyORuSOhNDP0jWKxPyUf3SwMFpdalxtquwqlM,6141 sqlalchemy/testing/suite/test_update_delete.py,sha256=yTiM2unnfOK9rK8ZkqeTTU_MkT-RsKFLmdYliniZfAY,3994 -sqlalchemy/testing/util.py,sha256=BFiSp3CEX95Dr-vv4l_7ZRu5vjZi9hjjnp-JKNfuS5E,14080 +sqlalchemy/testing/util.py,sha256=qldXKw8gRJ4I2x3uXsBssYMqwatmcMFMTOveRQCmfDU,14469 sqlalchemy/testing/warnings.py,sha256=fJ-QJUY2zY2PPxZJKv9medW-BKKbCNbA4Ns_V3YwFXM,1546 sqlalchemy/types.py,sha256=cQFM-hFRmaf1GErun1qqgEs6QxufvzMuwKqj9tuMPpE,3168 -sqlalchemy/util/__init__.py,sha256=B3bedg-LSQEscwqgmYYU-VENUX8_zAE3q9vb7tkfJNY,8277 -sqlalchemy/util/_collections.py,sha256=NE9dGJo8UNXIMbY3l3k8AO9BdPW04DlKTYraKCinchI,20063 -sqlalchemy/util/_concurrency_py3k.py,sha256=v8VVoBfFvFHe4j8mMkVLfdUrTbV897p8RWGAm73Ue9U,8574 +sqlalchemy/util/__init__.py,sha256=5D5Mquvx3SOmud0QErKzzGvBTkqMdhrrd_sXijOILeo,8312 +sqlalchemy/util/_collections.py,sha256=aZoSAVOXnHBoYEsxDOi0O9odg9wqLbGb7PGjaWQKiyY,20078 +sqlalchemy/util/_concurrency_py3k.py,sha256=zb0Bow2Y_QjTdaACEviBEEaFvqDuVvpJfmwCjaw8xNE,9170 sqlalchemy/util/_has_cy.py,sha256=wCQmeSjT3jaH_oxfCEtGk-1g0gbSpt5MCK5UcWdMWqk,1247 sqlalchemy/util/_py_collections.py,sha256=U6L5AoyLdgSv7cdqB4xxQbw1rpeJjyOZVXffgxgga8I,16714 -sqlalchemy/util/compat.py,sha256=R6bpBydldtbr6h7oJePihQxFb7jKiI-YDsK465MSOzk,8714 -sqlalchemy/util/concurrency.py,sha256=mhwHm0utriD14DRqxTBWgIW7QuwdSEiLgLiJdUjiR3w,2427 +sqlalchemy/util/compat.py,sha256=cnucBQOKspo58vjRpQXUBrHGguHOSFvftpD-I8vfUy0,8760 +sqlalchemy/util/concurrency.py,sha256=9lT_cMoO1fZNdY8QTUZ22oeSf-L5I-79Ke7chcBNPA0,3304 sqlalchemy/util/deprecations.py,sha256=YBwvvYhSB8LhasIZRKvg_-WNoVhPUcaYI1ZrnjDn868,11971 -sqlalchemy/util/langhelpers.py,sha256=khoFN05HjHiWY9ddeehCYxYG2u8LDzuiIKLOGLSAihU,64905 +sqlalchemy/util/langhelpers.py,sha256=uIK3szZuq9aMnO-vEpSlNekNWv4I-E391e56bkTnUm0,65090 sqlalchemy/util/preloaded.py,sha256=az7NmLJLsqs0mtM9uBkIu10-841RYDq8wOyqJ7xXvqE,5904 sqlalchemy/util/queue.py,sha256=CaeSEaYZ57YwtmLdNdOIjT5PK_LCuwMFiO0mpp39ybM,10185 sqlalchemy/util/tool_support.py,sha256=9braZyidaiNrZVsWtGmkSmus50-byhuYrlAqvhjcmnA,6135 sqlalchemy/util/topological.py,sha256=N3M3Le7KzGHCmqPGg0ZBqixTDGwmFLhOZvBtc4rHL_g,3458 -sqlalchemy/util/typing.py,sha256=FqH6WjV3p-8rz68YaXktpiZrPu3kmug2-gktJxBQSnI,16641 +sqlalchemy/util/typing.py,sha256=lFcGo1dJbZIZ9drAnvef-PzP0cX4LMxMSwgk3lJBb0g,18182 diff --git a/libs/PyYAML-6.0.1.dist-info/REQUESTED b/libs/SQLAlchemy-2.0.36.dist-info/REQUESTED similarity index 100% rename from libs/PyYAML-6.0.1.dist-info/REQUESTED rename to libs/SQLAlchemy-2.0.36.dist-info/REQUESTED diff --git a/libs/SQLAlchemy-2.0.27.dist-info/WHEEL b/libs/SQLAlchemy-2.0.36.dist-info/WHEEL similarity index 70% rename from libs/SQLAlchemy-2.0.27.dist-info/WHEEL rename to libs/SQLAlchemy-2.0.36.dist-info/WHEEL index 844cf17ca..be75fa70d 100644 --- a/libs/SQLAlchemy-2.0.27.dist-info/WHEEL +++ b/libs/SQLAlchemy-2.0.36.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: false Tag: cp38-cp38-macosx_12_0_x86_64 diff --git a/libs/SQLAlchemy-2.0.27.dist-info/top_level.txt b/libs/SQLAlchemy-2.0.36.dist-info/top_level.txt similarity index 100% rename from libs/SQLAlchemy-2.0.27.dist-info/top_level.txt rename to libs/SQLAlchemy-2.0.36.dist-info/top_level.txt diff --git a/libs/alembic-1.13.1.dist-info/WHEEL b/libs/alembic-1.13.1.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/alembic-1.13.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/SQLAlchemy-2.0.27.dist-info/INSTALLER b/libs/alembic-1.13.3.dist-info/INSTALLER similarity index 100% rename from libs/SQLAlchemy-2.0.27.dist-info/INSTALLER rename to libs/alembic-1.13.3.dist-info/INSTALLER diff --git a/libs/alembic-1.13.1.dist-info/LICENSE b/libs/alembic-1.13.3.dist-info/LICENSE similarity index 95% rename from libs/alembic-1.13.1.dist-info/LICENSE rename to libs/alembic-1.13.3.dist-info/LICENSE index 74b9ce342..be8de0089 100644 --- a/libs/alembic-1.13.1.dist-info/LICENSE +++ b/libs/alembic-1.13.3.dist-info/LICENSE @@ -1,4 +1,4 @@ -Copyright 2009-2023 Michael Bayer. +Copyright 2009-2024 Michael Bayer. 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 @@ -16,4 +16,4 @@ 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. \ No newline at end of file +SOFTWARE. diff --git a/libs/alembic-1.13.1.dist-info/METADATA b/libs/alembic-1.13.3.dist-info/METADATA similarity index 99% rename from libs/alembic-1.13.1.dist-info/METADATA rename to libs/alembic-1.13.3.dist-info/METADATA index 7a6884d93..2754bc050 100644 --- a/libs/alembic-1.13.1.dist-info/METADATA +++ b/libs/alembic-1.13.3.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: alembic -Version: 1.13.1 +Version: 1.13.3 Summary: A database migration tool for SQLAlchemy. Home-page: https://alembic.sqlalchemy.org Author: Mike Bayer diff --git a/libs/alembic-1.13.1.dist-info/RECORD b/libs/alembic-1.13.3.dist-info/RECORD similarity index 56% rename from libs/alembic-1.13.1.dist-info/RECORD rename to libs/alembic-1.13.3.dist-info/RECORD index f4dee8948..74fbae089 100644 --- a/libs/alembic-1.13.1.dist-info/RECORD +++ b/libs/alembic-1.13.3.dist-info/RECORD @@ -1,66 +1,66 @@ ../../bin/alembic,sha256=xqPGhIsDow0IG3BUa3a_VtCtKJgqxLpVJuFe1PQcGoA,236 -alembic-1.13.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -alembic-1.13.1.dist-info/LICENSE,sha256=soUmiob0QW6vTQWyrjiAwVb3xZqPk1pAK8BW6vszrwg,1058 -alembic-1.13.1.dist-info/METADATA,sha256=W1F2NBRkhqW55HiGmEIpdmiRt2skU5wwJd21UHFbSdQ,7390 -alembic-1.13.1.dist-info/RECORD,, -alembic-1.13.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -alembic-1.13.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -alembic-1.13.1.dist-info/entry_points.txt,sha256=aykM30soxwGN0pB7etLc1q0cHJbL9dy46RnK9VX4LLw,48 -alembic-1.13.1.dist-info/top_level.txt,sha256=FwKWd5VsPFC8iQjpu1u9Cn-JnK3-V1RhUCmWqz1cl-s,8 -alembic/__init__.py,sha256=PMiQT_1tHyC_Od3GDBArBk7r14v8F62_xkzliPq9tLU,63 +alembic-1.13.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +alembic-1.13.3.dist-info/LICENSE,sha256=zhnnuit3ylhLgqZ5KFbhOOswsxHIlrB2wJpAXuRfvuk,1059 +alembic-1.13.3.dist-info/METADATA,sha256=6CGNPkq-FufkoGWO6PUhx64LztmqCUAyhbObbop42yQ,7390 +alembic-1.13.3.dist-info/RECORD,, +alembic-1.13.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +alembic-1.13.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +alembic-1.13.3.dist-info/entry_points.txt,sha256=aykM30soxwGN0pB7etLc1q0cHJbL9dy46RnK9VX4LLw,48 +alembic-1.13.3.dist-info/top_level.txt,sha256=FwKWd5VsPFC8iQjpu1u9Cn-JnK3-V1RhUCmWqz1cl-s,8 +alembic/__init__.py,sha256=IZLF4dqHa7mXm10zXXAxFsXBP7yE27ZxghGv3BhN-Jw,63 alembic/__main__.py,sha256=373m7-TBh72JqrSMYviGrxCHZo-cnweM8AGF8A22PmY,78 alembic/autogenerate/__init__.py,sha256=ntmUTXhjLm4_zmqIwyVaECdpPDn6_u1yM9vYk6-553E,543 -alembic/autogenerate/api.py,sha256=Oc7MRtDhkSICsQ82fYP9bBMYaAjzzW2X_izM3AQU-OY,22171 -alembic/autogenerate/compare.py,sha256=3QLK2yCDW37bXbAIXcHGz4YOFlOW8bSfLHJ8bmzgG1M,44938 -alembic/autogenerate/render.py,sha256=uSbCpkh72mo00xGZ8CJa3teM_gqulCoNtxH0Ey8Ny1k,34939 +alembic/autogenerate/api.py,sha256=Bh-37G0PSFeT9WSfEQ-3TZoainXGLL2nsl4okv_xYc0,22173 +alembic/autogenerate/compare.py,sha256=cdUBH6qsedaJsnToSOu4MfcJaI4bjUJ4VWqtBlqsSr8,44944 +alembic/autogenerate/render.py,sha256=YB3C90rq7XDhjTia9GAnK6yfnVVzCROziZrbArmG9SE,35481 alembic/autogenerate/rewriter.py,sha256=uZWRkTYJoncoEJ5WY1QBRiozjyChqZDJPy4LtcRibjM,7846 -alembic/command.py,sha256=jWFNS-wPWA-Klfm0GsPfWh_8sPj4n7rKROJ0zrwhoR0,21712 -alembic/config.py,sha256=I12lm4V-AXSt-7nvub-Vtx5Zfa68pYP5xSrFQQd45rQ,22256 +alembic/command.py,sha256=2tkKrIoEgPfXrGgvMRGrUXH4l-7z466DOxd7Q2XOfL8,22169 +alembic/config.py,sha256=BZ7mwFRk2gq8GFNxxy9qvMUFx43YbDbQTC99OnjqiKY,22216 alembic/context.py,sha256=hK1AJOQXJ29Bhn276GYcosxeG7pC5aZRT5E8c4bMJ4Q,195 alembic/context.pyi,sha256=hUHbSnbSeEEMVkk0gDSXOq4_9edSjYzsjmmf-mL9Iao,31737 alembic/ddl/__init__.py,sha256=Df8fy4Vn_abP8B7q3x8gyFwEwnLw6hs2Ljt_bV3EZWE,152 -alembic/ddl/_autogen.py,sha256=0no9ywWP8gjvO57Ozc2naab4qNusVNn2fiJekjc275g,9179 -alembic/ddl/base.py,sha256=Jd7oPoAOGjOMcdMUIzSKnTjd8NKnTd7IjBXXyVpDCkU,9955 -alembic/ddl/impl.py,sha256=vkhkXFpLPJBG9jW2kv_sR5CC5czNd1ERLjLtfLuOFP0,28778 +alembic/ddl/_autogen.py,sha256=Blv2RrHNyF4cE6znCQXNXG5T9aO-YmiwD4Fz-qfoaWA,9275 +alembic/ddl/base.py,sha256=fzGvWyvpSluIOKDQ7Ajc-i_jlDpH4j-JZFOOPxxYS-s,9986 +alembic/ddl/impl.py,sha256=VggQMr6aqeVw12Cj4EqJpiETMhbrwIiG22HEJtPcR4s,29067 alembic/ddl/mssql.py,sha256=ydvgBSaftKYjaBaMyqius66Ta4CICQSj79Og3Ed2atY,14219 -alembic/ddl/mysql.py,sha256=am221U_UK3wX33tNcXNiOObZV-Pa4CXuv7vN-epF9IU,16788 -alembic/ddl/oracle.py,sha256=TmoCq_FlbfyWAAk3e_q6mMQU0YmlfIcgKHpRfNMmgr0,6211 -alembic/ddl/postgresql.py,sha256=dcWLdDSqivzizVCce_H6RnOVAayPXDFfns-NC4-UaA8,29842 +alembic/ddl/mysql.py,sha256=kXOGYmpnL_9WL3ijXNsG4aAwy3m1HWJOoLZSePzmJF0,17316 +alembic/ddl/oracle.py,sha256=669YlkcZihlXFbnXhH2krdrvDry8q5pcUGfoqkg_R6Y,6243 +alembic/ddl/postgresql.py,sha256=GNCnx-N8UsCIstfW49J8ivYcKgRB8KFNPRgNtORC_AM,29883 alembic/ddl/sqlite.py,sha256=wLXhb8bJWRspKQTb-iVfepR4LXYgOuEbUWKX5qwDhIQ,7570 alembic/environment.py,sha256=MM5lPayGT04H3aeng1H7GQ8HEAs3VGX5yy6mDLCPLT4,43 alembic/migration.py,sha256=MV6Fju6rZtn2fTREKzXrCZM6aIBGII4OMZFix0X-GLs,41 alembic/op.py,sha256=flHtcsVqOD-ZgZKK2pv-CJ5Cwh-KJ7puMUNXzishxLw,167 -alembic/op.pyi,sha256=8R6SJr1dQharU0blmMJJj23XFO_hk9ZmAQBJBQOeXRU,49816 +alembic/op.pyi,sha256=QZ1ERetxIrpZNTyg48Btn5OJhhpMId-_MLMP36RauOw,50168 alembic/operations/__init__.py,sha256=e0KQSZAgLpTWvyvreB7DWg7RJV_MWSOPVDgCqsd2FzY,318 -alembic/operations/base.py,sha256=LCx4NH5NA2NLWQFaZTqE_p2KgLtqJ76oVcp1Grj-zFM,74004 +alembic/operations/base.py,sha256=JRaOtPqyqfaPjzGHxuP9VMcO1KsJNmbbLOvwG82qxGA,74474 alembic/operations/batch.py,sha256=YqtD4hJ3_RkFxvI7zbmBwxcLEyLHYyWQpsz4l5L85yI,26943 -alembic/operations/ops.py,sha256=2vtYFhYFDEVq158HwORfGTsobDM7c-t0lewuR7JKw7g,94353 -alembic/operations/schemaobj.py,sha256=vjoD57QvjbzzA-jyPIXulbOmb5_bGPtxoq58KsKI4Y0,9424 -alembic/operations/toimpl.py,sha256=SoNY2_gZX2baXTD-pNjpCWnON8D2QBSYQBIjo13-WKA,7115 +alembic/operations/ops.py,sha256=guIpLQzlqgkdP2LGDW8vWg_DXeAouEldiVZDgRas7YI,94953 +alembic/operations/schemaobj.py,sha256=Wp-bBe4a8lXPTvIHJttBY0ejtpVR5Jvtb2kI-U2PztQ,9468 +alembic/operations/toimpl.py,sha256=Fx-UKcq6S8pVtsEwPFjTKtEcAVKjfptn-BfpE1k3_ck,7517 alembic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 alembic/runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -alembic/runtime/environment.py,sha256=9wSJaePNAXBXvirif_85ql7dSq4bXM1E6pSb2k-6uGI,41508 -alembic/runtime/migration.py,sha256=Yfv2fa11wiQ0WgoZaFldlWxCPq4dVDOCEOxST_-1VB0,50066 +alembic/runtime/environment.py,sha256=SkYB_am1h3FSG8IsExAQxGP_7WwzOVigqjlO747Aokc,41497 +alembic/runtime/migration.py,sha256=sku7-2_TralZQnNeoDaEFlydTStL-SJechbr9K8AHJs,50093 alembic/script/__init__.py,sha256=lSj06O391Iy5avWAiq8SPs6N8RBgxkSPjP8wpXcNDGg,100 -alembic/script/base.py,sha256=4gkppn2FKCYDoBgzGkTslcwdyxSabmHvGq0uGKulwbI,37586 -alembic/script/revision.py,sha256=sfnXQw2UwiXs0E6gEPHBKWuSsB5KyuxZPTrFn__hIEk,62060 +alembic/script/base.py,sha256=XLNpdsLnBBSz4ZKMFUArFUdtL1HcjtuUDHNbA-5VlZA,37809 +alembic/script/revision.py,sha256=NTu-eu5Y78u4NoVXpT0alpD2oL40SGATA2sEMEf1el4,62306 alembic/script/write_hooks.py,sha256=NGB6NGgfdf7HK6XNNpSKqUCfzxazj-NRUePgFx7MJSM,5036 alembic/templates/async/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58 -alembic/templates/async/alembic.ini.mako,sha256=uuhJETLWQuiYcs_jAOXHEjshEJ7VslEc1q4RRj0HWbE,3525 +alembic/templates/async/alembic.ini.mako,sha256=7VfUJqH9tEsydKOOmpnGFTsERHWhs7ghORuASnJb_Co,3632 alembic/templates/async/env.py,sha256=zbOCf3Y7w2lg92hxSwmG1MM_7y56i_oRH4AKp0pQBYo,2389 alembic/templates/async/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635 alembic/templates/generic/README,sha256=MVlc9TYmr57RbhXET6QxgyCcwWP7w-vLkEsirENqiIQ,38 -alembic/templates/generic/alembic.ini.mako,sha256=sT7F852yN3c8X1-GKFlhuWExXxw9hY1eb1ZZ9flFSzc,3634 +alembic/templates/generic/alembic.ini.mako,sha256=5wy1rOdDJjHbeEnieycSaZ9tz6AM6hONYk4RiOVXnmk,3740 alembic/templates/generic/env.py,sha256=TLRWOVW3Xpt_Tpf8JFzlnoPn_qoUu8UV77Y4o9XD6yI,2103 alembic/templates/generic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635 alembic/templates/multidb/README,sha256=dWLDhnBgphA4Nzb7sNlMfCS3_06YqVbHhz-9O5JNqyI,606 -alembic/templates/multidb/alembic.ini.mako,sha256=mPh8JFJfWiGs6tMtL8_HAQ-Dz1QOoJgE5Vm76nIMqgU,3728 +alembic/templates/multidb/alembic.ini.mako,sha256=oThPQgzkg-NOcbsSXIemi-Lg4nib3G6hDHKdejjtJIM,3834 alembic/templates/multidb/env.py,sha256=6zNjnW8mXGUk7erTsAvrfhvqoczJ-gagjVq1Ypg2YIQ,4230 alembic/templates/multidb/script.py.mako,sha256=N06nMtNSwHkgl0EBXDyMt8njp9tlOesR583gfq21nbY,1090 alembic/testing/__init__.py,sha256=kOxOh5nwmui9d-_CCq9WA4Udwy7ITjm453w74CTLZDo,1159 -alembic/testing/assertions.py,sha256=1CbJk8c8-WO9eJ0XJ0jJvMsNRLUrXV41NOeIJUAlOBk,5015 +alembic/testing/assertions.py,sha256=ScUb1sVopIl70BirfHUJDvwswC70Q93CiIWwkiZbhHg,5207 alembic/testing/env.py,sha256=zJacVb_z6uLs2U1TtkmnFH9P3_F-3IfYbVv4UEPOvfo,10754 -alembic/testing/fixtures.py,sha256=NyP4wE_dFN9ZzSGiBagRu1cdzkka03nwJYJYHYrrkSY,9112 +alembic/testing/fixtures.py,sha256=nBntOynOmVCFc7IYiN3DIQ3TBNTfiGCvL_1-FyCry8o,9462 alembic/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 alembic/testing/plugin/bootstrap.py,sha256=9C6wtjGrIVztZ928w27hsQE0KcjDLIUtUN3dvZKsMVk,50 alembic/testing/requirements.py,sha256=dKeAO1l5TwBqXarJN-IPORlCqCJv-41Dj6oXoEikxHQ,5133 @@ -68,11 +68,11 @@ alembic/testing/schemacompare.py,sha256=N5UqSNCOJetIKC4vKhpYzQEpj08XkdgIoqBmEPQ3 alembic/testing/suite/__init__.py,sha256=MvE7-hwbaVN1q3NM-ztGxORU9dnIelUCINKqNxewn7Y,288 alembic/testing/suite/_autogen_fixtures.py,sha256=cDq1pmzHe15S6dZPGNC6sqFaCQ3hLT_oPV2IDigUGQ0,9880 alembic/testing/suite/test_autogen_comments.py,sha256=aEGqKUDw4kHjnDk298aoGcQvXJWmZXcIX_2FxH4cJK8,6283 -alembic/testing/suite/test_autogen_computed.py,sha256=qJeBpc8urnwTFvbwWrSTIbHVkRUuCXP-dKaNbUK2U2U,6077 +alembic/testing/suite/test_autogen_computed.py,sha256=CXAeF-5Wr2cmW8PB7ztHG_4ZQsn1gSWrHWfxi72grNU,6147 alembic/testing/suite/test_autogen_diffs.py,sha256=T4SR1n_kmcOKYhR4W1-dA0e5sddJ69DSVL2HW96kAkE,8394 alembic/testing/suite/test_autogen_fks.py,sha256=AqFmb26Buex167HYa9dZWOk8x-JlB1OK3bwcvvjDFaU,32927 alembic/testing/suite/test_autogen_identity.py,sha256=kcuqngG7qXAKPJDX4U8sRzPKHEJECHuZ0DtuaS6tVkk,5824 -alembic/testing/suite/test_environment.py,sha256=w9F0xnLEbALeR8k6_-Tz6JHvy91IqiTSypNasVzXfZQ,11877 +alembic/testing/suite/test_environment.py,sha256=OwD-kpESdLoc4byBrGrXbZHvqtPbzhFCG4W9hJOJXPQ,11877 alembic/testing/suite/test_op.py,sha256=2XQCdm_NmnPxHGuGj7hmxMzIhKxXNotUsKdACXzE1mM,1343 alembic/testing/util.py,sha256=CQrcQDA8fs_7ME85z5ydb-Bt70soIIID-qNY1vbR2dg,3350 alembic/testing/warnings.py,sha256=RxA7x_8GseANgw07Us8JN_1iGbANxaw6_VitX2ZGQH4,1078 @@ -80,7 +80,7 @@ alembic/util/__init__.py,sha256=KSZ7UT2YzH6CietgUtljVoE3QnGjoFKOi7RL5sgUxrk,1688 alembic/util/compat.py,sha256=RjHdQa1NomU3Zlvgfvza0OMiSRQSLRL3xVl3OdUy2UE,2594 alembic/util/editor.py,sha256=JIz6_BdgV8_oKtnheR6DZoB7qnrHrlRgWjx09AsTsUw,2546 alembic/util/exc.py,sha256=KQTru4zcgAmN4IxLMwLFS56XToUewaXB7oOLcPNjPwg,98 -alembic/util/langhelpers.py,sha256=KYyOjFjJ26evPmrwhdTvLQNXN0bK7AIy5sRdKD91Fvg,10038 -alembic/util/messaging.py,sha256=BM5OCZ6qmLftFRw5yPSxj539_QmfVwNYoU8qYsDqoJY,3132 +alembic/util/langhelpers.py,sha256=LpOcovnhMnP45kTt8zNJ4BHpyQrlF40OL6yDXjqKtsE,10026 +alembic/util/messaging.py,sha256=BxAHiJsYHBPb2m8zv4yaueSRAlVuYXWkRCeN02JXhqw,3250 alembic/util/pyfiles.py,sha256=zltVdcwEJJCPS2gHsQvkHkQakuF6wXiZ6zfwHbGNT0g,3489 -alembic/util/sqla_compat.py,sha256=toD1S63PgZ6iEteP9bwIf5E7DIUdQPo0UQ_Fn18qWnI,19536 +alembic/util/sqla_compat.py,sha256=XMfZaLdbVbJoniNUyI3RUUXu4gCWljjVBbJ7db6vCgc,19526 diff --git a/libs/SQLAlchemy-2.0.27.dist-info/REQUESTED b/libs/alembic-1.13.3.dist-info/REQUESTED similarity index 100% rename from libs/SQLAlchemy-2.0.27.dist-info/REQUESTED rename to libs/alembic-1.13.3.dist-info/REQUESTED diff --git a/libs/alembic-1.13.3.dist-info/WHEEL b/libs/alembic-1.13.3.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/alembic-1.13.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/alembic-1.13.1.dist-info/entry_points.txt b/libs/alembic-1.13.3.dist-info/entry_points.txt similarity index 100% rename from libs/alembic-1.13.1.dist-info/entry_points.txt rename to libs/alembic-1.13.3.dist-info/entry_points.txt diff --git a/libs/alembic-1.13.1.dist-info/top_level.txt b/libs/alembic-1.13.3.dist-info/top_level.txt similarity index 100% rename from libs/alembic-1.13.1.dist-info/top_level.txt rename to libs/alembic-1.13.3.dist-info/top_level.txt diff --git a/libs/alembic/__init__.py b/libs/alembic/__init__.py index c153c8aaf..acf69a623 100644 --- a/libs/alembic/__init__.py +++ b/libs/alembic/__init__.py @@ -1,4 +1,4 @@ from . import context from . import op -__version__ = "1.13.1" +__version__ = "1.13.3" diff --git a/libs/alembic/autogenerate/api.py b/libs/alembic/autogenerate/api.py index aa8f32f65..4c0391628 100644 --- a/libs/alembic/autogenerate/api.py +++ b/libs/alembic/autogenerate/api.py @@ -596,9 +596,9 @@ def _run_environment( migration_script = self.generated_revisions[-1] if not getattr(migration_script, "_needs_render", False): migration_script.upgrade_ops_list[-1].upgrade_token = upgrade_token - migration_script.downgrade_ops_list[ - -1 - ].downgrade_token = downgrade_token + migration_script.downgrade_ops_list[-1].downgrade_token = ( + downgrade_token + ) migration_script._needs_render = True else: migration_script._upgrade_ops.append( diff --git a/libs/alembic/autogenerate/compare.py b/libs/alembic/autogenerate/compare.py index fcef531a5..0d9851964 100644 --- a/libs/alembic/autogenerate/compare.py +++ b/libs/alembic/autogenerate/compare.py @@ -983,7 +983,7 @@ def _normalize_computed_default(sqltext: str) -> str: """ - return re.sub(r"[ \(\)'\"`\[\]]", "", sqltext).lower() + return re.sub(r"[ \(\)'\"`\[\]\t\r\n]", "", sqltext).lower() def _compare_computed_default( diff --git a/libs/alembic/autogenerate/render.py b/libs/alembic/autogenerate/render.py index 317a6dbed..38bdbfca2 100644 --- a/libs/alembic/autogenerate/render.py +++ b/libs/alembic/autogenerate/render.py @@ -187,9 +187,11 @@ def _render_create_table_comment( prefix=_alembic_autogenerate_prefix(autogen_context), tname=op.table_name, comment="%r" % op.comment if op.comment is not None else None, - existing="%r" % op.existing_comment - if op.existing_comment is not None - else None, + existing=( + "%r" % op.existing_comment + if op.existing_comment is not None + else None + ), schema="'%s'" % op.schema if op.schema is not None else None, indent=" ", ) @@ -216,9 +218,11 @@ def _render_drop_table_comment( return templ.format( prefix=_alembic_autogenerate_prefix(autogen_context), tname=op.table_name, - existing="%r" % op.existing_comment - if op.existing_comment is not None - else None, + existing=( + "%r" % op.existing_comment + if op.existing_comment is not None + else None + ), schema="'%s'" % op.schema if op.schema is not None else None, indent=" ", ) @@ -275,6 +279,9 @@ def _add_table(autogen_context: AutogenContext, op: ops.CreateTableOp) -> str: prefixes = ", ".join("'%s'" % p for p in table._prefixes) text += ",\nprefixes=[%s]" % prefixes + if op.if_not_exists is not None: + text += ",\nif_not_exists=%r" % bool(op.if_not_exists) + text += "\n)" return text @@ -287,6 +294,10 @@ def _drop_table(autogen_context: AutogenContext, op: ops.DropTableOp) -> str: } if op.schema: text += ", schema=%r" % _ident(op.schema) + + if op.if_exists is not None: + text += ", if_exists=%r" % bool(op.if_exists) + text += ")" return text @@ -320,6 +331,8 @@ def _add_index(autogen_context: AutogenContext, op: ops.CreateIndexOp) -> str: assert index.table is not None opts = _render_dialect_kwargs_items(autogen_context, index) + if op.if_not_exists is not None: + opts.append("if_not_exists=%r" % bool(op.if_not_exists)) text = tmpl % { "prefix": _alembic_autogenerate_prefix(autogen_context), "name": _render_gen_name(autogen_context, index.name), @@ -328,9 +341,11 @@ def _add_index(autogen_context: AutogenContext, op: ops.CreateIndexOp) -> str: _get_index_rendered_expressions(index, autogen_context) ), "unique": index.unique or False, - "schema": (", schema=%r" % _ident(index.table.schema)) - if index.table.schema - else "", + "schema": ( + (", schema=%r" % _ident(index.table.schema)) + if index.table.schema + else "" + ), "kwargs": ", " + ", ".join(opts) if opts else "", } return text @@ -350,6 +365,8 @@ def _drop_index(autogen_context: AutogenContext, op: ops.DropIndexOp) -> str: "table_name=%(table_name)r%(schema)s%(kwargs)s)" ) opts = _render_dialect_kwargs_items(autogen_context, index) + if op.if_exists is not None: + opts.append("if_exists=%r" % bool(op.if_exists)) text = tmpl % { "prefix": _alembic_autogenerate_prefix(autogen_context), "name": _render_gen_name(autogen_context, op.index_name), @@ -592,9 +609,11 @@ def _get_index_rendered_expressions( idx: Index, autogen_context: AutogenContext ) -> List[str]: return [ - repr(_ident(getattr(exp, "name", None))) - if isinstance(exp, sa_schema.Column) - else _render_potential_expr(exp, autogen_context, is_index=True) + ( + repr(_ident(getattr(exp, "name", None))) + if isinstance(exp, sa_schema.Column) + else _render_potential_expr(exp, autogen_context, is_index=True) + ) for exp in idx.expressions ] @@ -1075,9 +1094,11 @@ def _render_check_constraint( ) return "%(prefix)sCheckConstraint(%(sqltext)s%(opts)s)" % { "prefix": _sqlalchemy_autogenerate_prefix(autogen_context), - "opts": ", " + (", ".join("%s=%s" % (k, v) for k, v in opts)) - if opts - else "", + "opts": ( + ", " + (", ".join("%s=%s" % (k, v) for k, v in opts)) + if opts + else "" + ), "sqltext": _render_potential_expr( constraint.sqltext, autogen_context, wrap_in_text=False ), diff --git a/libs/alembic/command.py b/libs/alembic/command.py index 37aa6e67e..89c12354a 100644 --- a/libs/alembic/command.py +++ b/libs/alembic/command.py @@ -49,7 +49,7 @@ def init( :param config: a :class:`.Config` object. - :param directory: string path of the target directory + :param directory: string path of the target directory. :param template: string name of the migration environment template to use. @@ -174,7 +174,7 @@ def revision( will be applied to the structure generated by the revision process where it can be altered programmatically. Note that unlike all the other parameters, this option is only available via programmatic - use of :func:`.command.revision` + use of :func:`.command.revision`. """ @@ -315,9 +315,11 @@ def merge( :param config: a :class:`.Config` instance - :param message: string message to apply to the revision + :param revisions: The revisions to merge. - :param branch_label: string label name to apply to the new revision + :param message: string message to apply to the revision. + + :param branch_label: string label name to apply to the new revision. :param rev_id: hardcoded revision identifier instead of generating a new one. @@ -370,9 +372,10 @@ def upgrade( :param config: a :class:`.Config` instance. - :param revision: string revision target or range for --sql mode + :param revision: string revision target or range for --sql mode. May be + ``"heads"`` to target the most recent revision(s). - :param sql: if True, use ``--sql`` mode + :param sql: if True, use ``--sql`` mode. :param tag: an arbitrary "tag" that can be intercepted by custom ``env.py`` scripts via the :meth:`.EnvironmentContext.get_tag_argument` @@ -413,9 +416,10 @@ def downgrade( :param config: a :class:`.Config` instance. - :param revision: string revision target or range for --sql mode + :param revision: string revision target or range for --sql mode. May + be ``"base"`` to target the first revision. - :param sql: if True, use ``--sql`` mode + :param sql: if True, use ``--sql`` mode. :param tag: an arbitrary "tag" that can be intercepted by custom ``env.py`` scripts via the :meth:`.EnvironmentContext.get_tag_argument` @@ -449,12 +453,13 @@ def downgrade(rev, context): script.run_env() -def show(config, rev): +def show(config: Config, rev: str) -> None: """Show the revision(s) denoted by the given symbol. :param config: a :class:`.Config` instance. - :param revision: string revision target + :param rev: string revision target. May be ``"current"`` to show the + revision(s) currently applied in the database. """ @@ -484,7 +489,7 @@ def history( :param config: a :class:`.Config` instance. - :param rev_range: string revision range + :param rev_range: string revision range. :param verbose: output in verbose mode. @@ -543,7 +548,9 @@ def _display_current_history(rev, context): _display_history(config, script, base, head) -def heads(config, verbose=False, resolve_dependencies=False): +def heads( + config: Config, verbose: bool = False, resolve_dependencies: bool = False +) -> None: """Show current available heads in the script directory. :param config: a :class:`.Config` instance. @@ -568,7 +575,7 @@ def heads(config, verbose=False, resolve_dependencies=False): ) -def branches(config, verbose=False): +def branches(config: Config, verbose: bool = False) -> None: """Show current branch points. :param config: a :class:`.Config` instance. @@ -638,7 +645,9 @@ def stamp( :param config: a :class:`.Config` instance. :param revision: target revision or list of revisions. May be a list - to indicate stamping of multiple branch heads. + to indicate stamping of multiple branch heads; may be ``"base"`` + to remove all revisions from the table or ``"heads"`` to stamp the + most recent revision(s). .. note:: this parameter is called "revisions" in the command line interface. @@ -728,7 +737,7 @@ def ensure_version(config: Config, sql: bool = False) -> None: :param config: a :class:`.Config` instance. - :param sql: use ``--sql`` mode + :param sql: use ``--sql`` mode. .. versionadded:: 1.7.6 diff --git a/libs/alembic/config.py b/libs/alembic/config.py index 4b2263fdd..2c52e7cd1 100644 --- a/libs/alembic/config.py +++ b/libs/alembic/config.py @@ -221,8 +221,7 @@ def get_template_directory(self) -> str: @overload def get_section( self, name: str, default: None = ... - ) -> Optional[Dict[str, str]]: - ... + ) -> Optional[Dict[str, str]]: ... # "default" here could also be a TypeVar # _MT = TypeVar("_MT", bound=Mapping[str, str]), @@ -230,14 +229,12 @@ def get_section( @overload def get_section( self, name: str, default: Dict[str, str] - ) -> Dict[str, str]: - ... + ) -> Dict[str, str]: ... @overload def get_section( self, name: str, default: Mapping[str, str] - ) -> Union[Dict[str, str], Mapping[str, str]]: - ... + ) -> Union[Dict[str, str], Mapping[str, str]]: ... def get_section( self, name: str, default: Optional[Mapping[str, str]] = None @@ -313,14 +310,12 @@ def get_section_option( return default @overload - def get_main_option(self, name: str, default: str) -> str: - ... + def get_main_option(self, name: str, default: str) -> str: ... @overload def get_main_option( self, name: str, default: Optional[str] = None - ) -> Optional[str]: - ... + ) -> Optional[str]: ... def get_main_option( self, name: str, default: Optional[str] = None diff --git a/libs/alembic/ddl/_autogen.py b/libs/alembic/ddl/_autogen.py index e22153c49..74715b18a 100644 --- a/libs/alembic/ddl/_autogen.py +++ b/libs/alembic/ddl/_autogen.py @@ -287,18 +287,22 @@ def __init__( self.target_table, tuple(self.target_columns), ) + ( - (None if onupdate.lower() == "no action" else onupdate.lower()) - if onupdate - else None, - (None if ondelete.lower() == "no action" else ondelete.lower()) - if ondelete - else None, + ( + (None if onupdate.lower() == "no action" else onupdate.lower()) + if onupdate + else None + ), + ( + (None if ondelete.lower() == "no action" else ondelete.lower()) + if ondelete + else None + ), # convert initially + deferrable into one three-state value - "initially_deferrable" - if initially and initially.lower() == "deferred" - else "deferrable" - if deferrable - else "not deferrable", + ( + "initially_deferrable" + if initially and initially.lower() == "deferred" + else "deferrable" if deferrable else "not deferrable" + ), ) @util.memoized_property diff --git a/libs/alembic/ddl/base.py b/libs/alembic/ddl/base.py index 7a85a5c19..690c15376 100644 --- a/libs/alembic/ddl/base.py +++ b/libs/alembic/ddl/base.py @@ -40,7 +40,6 @@ class AlterTable(DDLElement): - """Represent an ALTER TABLE statement. Only the string name and optional schema name of the table @@ -238,9 +237,11 @@ def visit_column_default( return "%s %s %s" % ( alter_table(compiler, element.table_name, element.schema), alter_column(compiler, element.column_name), - "SET DEFAULT %s" % format_server_default(compiler, element.default) - if element.default is not None - else "DROP DEFAULT", + ( + "SET DEFAULT %s" % format_server_default(compiler, element.default) + if element.default is not None + else "DROP DEFAULT" + ), ) diff --git a/libs/alembic/ddl/impl.py b/libs/alembic/ddl/impl.py index 2e4f1ae94..25746889a 100644 --- a/libs/alembic/ddl/impl.py +++ b/libs/alembic/ddl/impl.py @@ -77,7 +77,6 @@ def __init__( class DefaultImpl(metaclass=ImplMeta): - """Provide the entrypoint for major migration operations, including database-specific behavioral variances. @@ -168,16 +167,15 @@ def bind(self) -> Optional[Connection]: def _exec( self, construct: Union[Executable, str], - execution_options: Optional[dict[str, Any]] = None, - multiparams: Sequence[dict] = (), - params: Dict[str, Any] = util.immutabledict(), + execution_options: Optional[Mapping[str, Any]] = None, + multiparams: Optional[Sequence[Mapping[str, Any]]] = None, + params: Mapping[str, Any] = util.immutabledict(), ) -> Optional[CursorResult]: if isinstance(construct, str): construct = text(construct) if self.as_sql: - if multiparams or params: - # TODO: coverage - raise Exception("Execution arguments not allowed with as_sql") + if multiparams is not None or params: + raise TypeError("SQL parameters not allowed with as_sql") compile_kw: dict[str, Any] if self.literal_binds and not isinstance( @@ -200,11 +198,16 @@ def _exec( assert conn is not None if execution_options: conn = conn.execution_options(**execution_options) - if params: - assert isinstance(multiparams, tuple) - multiparams += (params,) - return conn.execute(construct, multiparams) + if params and multiparams is not None: + raise TypeError( + "Can't send params and multiparams at the same time" + ) + + if multiparams: + return conn.execute(construct, multiparams) + else: + return conn.execute(construct, params) def execute( self, @@ -359,11 +362,11 @@ def rename_table( base.RenameTable(old_table_name, new_table_name, schema=schema) ) - def create_table(self, table: Table) -> None: + def create_table(self, table: Table, **kw: Any) -> None: table.dispatch.before_create( table, self.connection, checkfirst=False, _ddl_runner=self ) - self._exec(schema.CreateTable(table)) + self._exec(schema.CreateTable(table, **kw)) table.dispatch.after_create( table, self.connection, checkfirst=False, _ddl_runner=self ) @@ -382,11 +385,11 @@ def create_table(self, table: Table) -> None: if comment and with_comment: self.create_column_comment(column) - def drop_table(self, table: Table) -> None: + def drop_table(self, table: Table, **kw: Any) -> None: table.dispatch.before_drop( table, self.connection, checkfirst=False, _ddl_runner=self ) - self._exec(schema.DropTable(table)) + self._exec(schema.DropTable(table, **kw)) table.dispatch.after_drop( table, self.connection, checkfirst=False, _ddl_runner=self ) @@ -421,13 +424,15 @@ def bulk_insert( self._exec( sqla_compat._insert_inline(table).values( **{ - k: sqla_compat._literal_bindparam( - k, v, type_=table.c[k].type - ) - if not isinstance( - v, sqla_compat._literal_bindparam + k: ( + sqla_compat._literal_bindparam( + k, v, type_=table.c[k].type + ) + if not isinstance( + v, sqla_compat._literal_bindparam + ) + else v ) - else v for k, v in row.items() } ) diff --git a/libs/alembic/ddl/mysql.py b/libs/alembic/ddl/mysql.py index f312173e9..3482f672d 100644 --- a/libs/alembic/ddl/mysql.py +++ b/libs/alembic/ddl/mysql.py @@ -94,21 +94,29 @@ def alter_column( # type:ignore[override] column_name, schema=schema, newname=name if name is not None else column_name, - nullable=nullable - if nullable is not None - else existing_nullable - if existing_nullable is not None - else True, + nullable=( + nullable + if nullable is not None + else ( + existing_nullable + if existing_nullable is not None + else True + ) + ), type_=type_ if type_ is not None else existing_type, - default=server_default - if server_default is not False - else existing_server_default, - autoincrement=autoincrement - if autoincrement is not None - else existing_autoincrement, - comment=comment - if comment is not False - else existing_comment, + default=( + server_default + if server_default is not False + else existing_server_default + ), + autoincrement=( + autoincrement + if autoincrement is not None + else existing_autoincrement + ), + comment=( + comment if comment is not False else existing_comment + ), ) ) elif ( @@ -123,21 +131,29 @@ def alter_column( # type:ignore[override] column_name, schema=schema, newname=name if name is not None else column_name, - nullable=nullable - if nullable is not None - else existing_nullable - if existing_nullable is not None - else True, + nullable=( + nullable + if nullable is not None + else ( + existing_nullable + if existing_nullable is not None + else True + ) + ), type_=type_ if type_ is not None else existing_type, - default=server_default - if server_default is not False - else existing_server_default, - autoincrement=autoincrement - if autoincrement is not None - else existing_autoincrement, - comment=comment - if comment is not False - else existing_comment, + default=( + server_default + if server_default is not False + else existing_server_default + ), + autoincrement=( + autoincrement + if autoincrement is not None + else existing_autoincrement + ), + comment=( + comment if comment is not False else existing_comment + ), ) ) elif server_default is not False: @@ -368,9 +384,11 @@ def _mysql_alter_default( return "%s ALTER COLUMN %s %s" % ( alter_table(compiler, element.table_name, element.schema), format_column_name(compiler, element.column_name), - "SET DEFAULT %s" % format_server_default(compiler, element.default) - if element.default is not None - else "DROP DEFAULT", + ( + "SET DEFAULT %s" % format_server_default(compiler, element.default) + if element.default is not None + else "DROP DEFAULT" + ), ) diff --git a/libs/alembic/ddl/oracle.py b/libs/alembic/ddl/oracle.py index 540117407..eac99124f 100644 --- a/libs/alembic/ddl/oracle.py +++ b/libs/alembic/ddl/oracle.py @@ -141,9 +141,11 @@ def visit_column_default( return "%s %s %s" % ( alter_table(compiler, element.table_name, element.schema), alter_column(compiler, element.column_name), - "DEFAULT %s" % format_server_default(compiler, element.default) - if element.default is not None - else "DEFAULT NULL", + ( + "DEFAULT %s" % format_server_default(compiler, element.default) + if element.default is not None + else "DEFAULT NULL" + ), ) diff --git a/libs/alembic/ddl/postgresql.py b/libs/alembic/ddl/postgresql.py index 6507fcbdd..de64a4e05 100644 --- a/libs/alembic/ddl/postgresql.py +++ b/libs/alembic/ddl/postgresql.py @@ -218,7 +218,8 @@ def autogen_column_reflect(self, inspector, table, column_info): "join pg_class t on t.oid=d.refobjid " "join pg_attribute a on a.attrelid=t.oid and " "a.attnum=d.refobjsubid " - "where c.relkind='S' and c.relname=:seqname" + "where c.relkind='S' and " + "c.oid=cast(:seqname as regclass)" ), seqname=seq_match.group(1), ).first() diff --git a/libs/alembic/op.pyi b/libs/alembic/op.pyi index 83deac1eb..920444696 100644 --- a/libs/alembic/op.pyi +++ b/libs/alembic/op.pyi @@ -747,7 +747,12 @@ def create_primary_key( """ -def create_table(table_name: str, *columns: SchemaItem, **kw: Any) -> Table: +def create_table( + table_name: str, + *columns: SchemaItem, + if_not_exists: Optional[bool] = None, + **kw: Any, +) -> Table: r"""Issue a "create table" instruction using the current migration context. @@ -818,6 +823,10 @@ def create_table(table_name: str, *columns: SchemaItem, **kw: Any) -> Table: quoting of the schema outside of the default behavior, use the SQLAlchemy construct :class:`~sqlalchemy.sql.elements.quoted_name`. + :param if_not_exists: If True, adds IF NOT EXISTS operator when + creating the new table. + + .. versionadded:: 1.13.3 :param \**kw: Other keyword arguments are passed to the underlying :class:`sqlalchemy.schema.Table` object created for the command. @@ -998,7 +1007,11 @@ def drop_index( """ def drop_table( - table_name: str, *, schema: Optional[str] = None, **kw: Any + table_name: str, + *, + schema: Optional[str] = None, + if_exists: Optional[bool] = None, + **kw: Any, ) -> None: r"""Issue a "drop table" instruction using the current migration context. @@ -1013,6 +1026,10 @@ def drop_table( quoting of the schema outside of the default behavior, use the SQLAlchemy construct :class:`~sqlalchemy.sql.elements.quoted_name`. + :param if_exists: If True, adds IF EXISTS operator when + dropping the table. + + .. versionadded:: 1.13.3 :param \**kw: Other keyword arguments are passed to the underlying :class:`sqlalchemy.schema.Table` object created for the command. diff --git a/libs/alembic/operations/base.py b/libs/alembic/operations/base.py index bafe441a6..9b52fa6f2 100644 --- a/libs/alembic/operations/base.py +++ b/libs/alembic/operations/base.py @@ -406,8 +406,7 @@ def get_context(self) -> MigrationContext: return self.migration_context @overload - def invoke(self, operation: CreateTableOp) -> Table: - ... + def invoke(self, operation: CreateTableOp) -> Table: ... @overload def invoke( @@ -427,12 +426,10 @@ def invoke( DropTableOp, ExecuteSQLOp, ], - ) -> None: - ... + ) -> None: ... @overload - def invoke(self, operation: MigrateOperation) -> Any: - ... + def invoke(self, operation: MigrateOperation) -> Any: ... def invoke(self, operation: MigrateOperation) -> Any: """Given a :class:`.MigrateOperation`, invoke it in terms of @@ -1178,7 +1175,11 @@ def create_primary_key( ... def create_table( - self, table_name: str, *columns: SchemaItem, **kw: Any + self, + table_name: str, + *columns: SchemaItem, + if_not_exists: Optional[bool] = None, + **kw: Any, ) -> Table: r"""Issue a "create table" instruction using the current migration context. @@ -1250,6 +1251,10 @@ def create_table( quoting of the schema outside of the default behavior, use the SQLAlchemy construct :class:`~sqlalchemy.sql.elements.quoted_name`. + :param if_not_exists: If True, adds IF NOT EXISTS operator when + creating the new table. + + .. versionadded:: 1.13.3 :param \**kw: Other keyword arguments are passed to the underlying :class:`sqlalchemy.schema.Table` object created for the command. @@ -1441,7 +1446,12 @@ def drop_index( ... def drop_table( - self, table_name: str, *, schema: Optional[str] = None, **kw: Any + self, + table_name: str, + *, + schema: Optional[str] = None, + if_exists: Optional[bool] = None, + **kw: Any, ) -> None: r"""Issue a "drop table" instruction using the current migration context. @@ -1456,6 +1466,10 @@ def drop_table( quoting of the schema outside of the default behavior, use the SQLAlchemy construct :class:`~sqlalchemy.sql.elements.quoted_name`. + :param if_exists: If True, adds IF EXISTS operator when + dropping the table. + + .. versionadded:: 1.13.3 :param \**kw: Other keyword arguments are passed to the underlying :class:`sqlalchemy.schema.Table` object created for the command. @@ -1724,7 +1738,7 @@ def create_exclude_constraint( def create_foreign_key( self, - constraint_name: str, + constraint_name: Optional[str], referent_table: str, local_cols: List[str], remote_cols: List[str], @@ -1774,7 +1788,7 @@ def create_index( ... def create_primary_key( - self, constraint_name: str, columns: List[str] + self, constraint_name: Optional[str], columns: List[str] ) -> None: """Issue a "create primary key" instruction using the current batch migration context. diff --git a/libs/alembic/operations/ops.py b/libs/alembic/operations/ops.py index 7b65191cf..60b856a8f 100644 --- a/libs/alembic/operations/ops.py +++ b/libs/alembic/operations/ops.py @@ -349,7 +349,7 @@ def create_primary_key( def batch_create_primary_key( cls, operations: BatchOperations, - constraint_name: str, + constraint_name: Optional[str], columns: List[str], ) -> None: """Issue a "create primary key" instruction using the @@ -681,7 +681,7 @@ def create_foreign_key( def batch_create_foreign_key( cls, operations: BatchOperations, - constraint_name: str, + constraint_name: Optional[str], referent_table: str, local_cols: List[str], remote_cols: List[str], @@ -1159,6 +1159,7 @@ def __init__( columns: Sequence[SchemaItem], *, schema: Optional[str] = None, + if_not_exists: Optional[bool] = None, _namespace_metadata: Optional[MetaData] = None, _constraints_included: bool = False, **kw: Any, @@ -1166,6 +1167,7 @@ def __init__( self.table_name = table_name self.columns = columns self.schema = schema + self.if_not_exists = if_not_exists self.info = kw.pop("info", {}) self.comment = kw.pop("comment", None) self.prefixes = kw.pop("prefixes", None) @@ -1228,6 +1230,7 @@ def create_table( operations: Operations, table_name: str, *columns: SchemaItem, + if_not_exists: Optional[bool] = None, **kw: Any, ) -> Table: r"""Issue a "create table" instruction using the current migration @@ -1300,6 +1303,10 @@ def create_table( quoting of the schema outside of the default behavior, use the SQLAlchemy construct :class:`~sqlalchemy.sql.elements.quoted_name`. + :param if_not_exists: If True, adds IF NOT EXISTS operator when + creating the new table. + + .. versionadded:: 1.13.3 :param \**kw: Other keyword arguments are passed to the underlying :class:`sqlalchemy.schema.Table` object created for the command. @@ -1307,7 +1314,7 @@ def create_table( to the parameters given. """ - op = cls(table_name, columns, **kw) + op = cls(table_name, columns, if_not_exists=if_not_exists, **kw) return operations.invoke(op) @@ -1320,11 +1327,13 @@ def __init__( table_name: str, *, schema: Optional[str] = None, + if_exists: Optional[bool] = None, table_kw: Optional[MutableMapping[Any, Any]] = None, _reverse: Optional[CreateTableOp] = None, ) -> None: self.table_name = table_name self.schema = schema + self.if_exists = if_exists self.table_kw = table_kw or {} self.comment = self.table_kw.pop("comment", None) self.info = self.table_kw.pop("info", None) @@ -1371,9 +1380,9 @@ def to_table( info=self.info.copy() if self.info else {}, prefixes=list(self.prefixes) if self.prefixes else [], schema=self.schema, - _constraints_included=self._reverse._constraints_included - if self._reverse - else False, + _constraints_included=( + self._reverse._constraints_included if self._reverse else False + ), **self.table_kw, ) return t @@ -1385,6 +1394,7 @@ def drop_table( table_name: str, *, schema: Optional[str] = None, + if_exists: Optional[bool] = None, **kw: Any, ) -> None: r"""Issue a "drop table" instruction using the current @@ -1400,11 +1410,15 @@ def drop_table( quoting of the schema outside of the default behavior, use the SQLAlchemy construct :class:`~sqlalchemy.sql.elements.quoted_name`. + :param if_exists: If True, adds IF EXISTS operator when + dropping the table. + + .. versionadded:: 1.13.3 :param \**kw: Other keyword arguments are passed to the underlying :class:`sqlalchemy.schema.Table` object created for the command. """ - op = cls(table_name, schema=schema, table_kw=kw) + op = cls(table_name, schema=schema, if_exists=if_exists, table_kw=kw) operations.invoke(op) diff --git a/libs/alembic/operations/schemaobj.py b/libs/alembic/operations/schemaobj.py index 32b26e9b9..59c1002f1 100644 --- a/libs/alembic/operations/schemaobj.py +++ b/libs/alembic/operations/schemaobj.py @@ -223,10 +223,12 @@ def table(self, name: str, *columns, **kw) -> Table: t = sa_schema.Table(name, m, *cols, **kw) constraints = [ - sqla_compat._copy(elem, target_table=t) - if getattr(elem, "parent", None) is not t - and getattr(elem, "parent", None) is not None - else elem + ( + sqla_compat._copy(elem, target_table=t) + if getattr(elem, "parent", None) is not t + and getattr(elem, "parent", None) is not None + else elem + ) for elem in columns if isinstance(elem, (Constraint, Index)) ] diff --git a/libs/alembic/operations/toimpl.py b/libs/alembic/operations/toimpl.py index 4759f7fd2..4b960049c 100644 --- a/libs/alembic/operations/toimpl.py +++ b/libs/alembic/operations/toimpl.py @@ -79,8 +79,14 @@ def _count_constraint(constraint): @Operations.implementation_for(ops.DropTableOp) def drop_table(operations: "Operations", operation: "ops.DropTableOp") -> None: + kw = {} + if operation.if_exists is not None: + if not sqla_14: + raise NotImplementedError("SQLAlchemy 1.4+ required") + + kw["if_exists"] = operation.if_exists operations.impl.drop_table( - operation.to_table(operations.migration_context) + operation.to_table(operations.migration_context), **kw ) @@ -127,8 +133,14 @@ def drop_index(operations: "Operations", operation: "ops.DropIndexOp") -> None: def create_table( operations: "Operations", operation: "ops.CreateTableOp" ) -> "Table": + kw = {} + if operation.if_not_exists is not None: + if not sqla_14: + raise NotImplementedError("SQLAlchemy 1.4+ required") + + kw["if_not_exists"] = operation.if_not_exists table = operation.to_table(operations.migration_context) - operations.impl.create_table(table) + operations.impl.create_table(table, **kw) return table diff --git a/libs/alembic/runtime/environment.py b/libs/alembic/runtime/environment.py index d64b2adc2..a30972ec9 100644 --- a/libs/alembic/runtime/environment.py +++ b/libs/alembic/runtime/environment.py @@ -108,7 +108,6 @@ class EnvironmentContext(util.ModuleClsProxy): - """A configurational facade made available in an ``env.py`` script. The :class:`.EnvironmentContext` acts as a *facade* to the more @@ -342,18 +341,17 @@ def get_tag_argument(self) -> Optional[str]: return self.context_opts.get("tag", None) # type: ignore[no-any-return] # noqa: E501 @overload - def get_x_argument(self, as_dictionary: Literal[False]) -> List[str]: - ... + def get_x_argument(self, as_dictionary: Literal[False]) -> List[str]: ... @overload - def get_x_argument(self, as_dictionary: Literal[True]) -> Dict[str, str]: - ... + def get_x_argument( + self, as_dictionary: Literal[True] + ) -> Dict[str, str]: ... @overload def get_x_argument( self, as_dictionary: bool = ... - ) -> Union[List[str], Dict[str, str]]: - ... + ) -> Union[List[str], Dict[str, str]]: ... def get_x_argument( self, as_dictionary: bool = False diff --git a/libs/alembic/runtime/migration.py b/libs/alembic/runtime/migration.py index 95c69bc69..6cfe5e23e 100644 --- a/libs/alembic/runtime/migration.py +++ b/libs/alembic/runtime/migration.py @@ -86,7 +86,6 @@ def __exit__(self, type_: Any, value: Any, traceback: Any) -> None: class MigrationContext: - """Represent the database state made available to a migration script. @@ -218,9 +217,11 @@ def __init__( log.info("Generating static SQL") log.info( "Will assume %s DDL.", - "transactional" - if self.impl.transactional_ddl - else "non-transactional", + ( + "transactional" + if self.impl.transactional_ddl + else "non-transactional" + ), ) @classmethod @@ -345,9 +346,9 @@ def upgrade(): # except that it will not know it's in "autocommit" and will # emit deprecation warnings when an autocommit action takes # place. - self.connection = ( - self.impl.connection - ) = base_connection.execution_options(isolation_level="AUTOCOMMIT") + self.connection = self.impl.connection = ( + base_connection.execution_options(isolation_level="AUTOCOMMIT") + ) # sqlalchemy future mode will "autobegin" in any case, so take # control of that "transaction" here @@ -1006,8 +1007,7 @@ class MigrationStep: if TYPE_CHECKING: @property - def doc(self) -> Optional[str]: - ... + def doc(self) -> Optional[str]: ... @property def name(self) -> str: diff --git a/libs/alembic/script/base.py b/libs/alembic/script/base.py index 5945ca591..30df6ddb2 100644 --- a/libs/alembic/script/base.py +++ b/libs/alembic/script/base.py @@ -56,7 +56,6 @@ class ScriptDirectory: - """Provides operations upon an Alembic script directory. This object is useful to get information as to current revisions, @@ -188,6 +187,7 @@ def from_config(cls, config: Config) -> ScriptDirectory: split_on_path = { None: None, "space": " ", + "newline": "\n", "os": os.pathsep, ":": ":", ";": ";", @@ -201,7 +201,8 @@ def from_config(cls, config: Config) -> ScriptDirectory: raise ValueError( "'%s' is not a valid value for " "version_path_separator; " - "expected 'space', 'os', ':', ';'" % version_path_separator + "expected 'space', 'newline', 'os', ':', ';'" + % version_path_separator ) from ke else: if split_char is None: @@ -211,7 +212,9 @@ def from_config(cls, config: Config) -> ScriptDirectory: ) else: version_locations = [ - x for x in version_locations_str.split(split_char) if x + x.strip() + for x in version_locations_str.split(split_char) + if x ] else: version_locations = None @@ -610,7 +613,7 @@ def _generate_create_date(self) -> datetime.datetime: if self.timezone is not None: if ZoneInfo is None: raise util.CommandError( - "Python >= 3.9 is required for timezone support or" + "Python >= 3.9 is required for timezone support or " "the 'backports.zoneinfo' package must be installed." ) # First, assume correct capitalization @@ -732,9 +735,11 @@ def generate_revision( if depends_on: with self._catch_revision_errors(): resolved_depends_on = [ - dep - if dep in rev.branch_labels # maintain branch labels - else rev.revision # resolve partial revision identifiers + ( + dep + if dep in rev.branch_labels # maintain branch labels + else rev.revision + ) # resolve partial revision identifiers for rev, dep in [ (not_none(self.revision_map.get_revision(dep)), dep) for dep in util.to_list(depends_on) @@ -808,7 +813,6 @@ def _rev_path( class Script(revision.Revision): - """Represent a single revision file in a ``versions/`` directory. The :class:`.Script` instance is returned by methods @@ -930,9 +934,11 @@ def _head_only( if head_indicators or tree_indicators: text += "%s%s%s" % ( " (head)" if self._is_real_head else "", - " (effective head)" - if self.is_head and not self._is_real_head - else "", + ( + " (effective head)" + if self.is_head and not self._is_real_head + else "" + ), " (current)" if self._db_current_indicator else "", ) if tree_indicators: diff --git a/libs/alembic/script/revision.py b/libs/alembic/script/revision.py index 77a802cdc..c3108e985 100644 --- a/libs/alembic/script/revision.py +++ b/libs/alembic/script/revision.py @@ -56,8 +56,7 @@ def __call__( inclusive: bool, implicit_base: bool, assert_relative_length: bool, - ) -> Tuple[Set[Revision], Tuple[Optional[_RevisionOrBase], ...]]: - ... + ) -> Tuple[Set[Revision], Tuple[Optional[_RevisionOrBase], ...]]: ... class RevisionError(Exception): @@ -720,9 +719,11 @@ def _shares_lineage( resolved_target = target resolved_test_against_revs = [ - self._revision_for_ident(test_against_rev) - if not isinstance(test_against_rev, Revision) - else test_against_rev + ( + self._revision_for_ident(test_against_rev) + if not isinstance(test_against_rev, Revision) + else test_against_rev + ) for test_against_rev in util.to_tuple( test_against_revs, default=() ) @@ -1016,9 +1017,9 @@ def get_ancestors(rev_id: str) -> Set[str]: # each time but it was getting complicated current_heads[current_candidate_idx] = heads_to_add[0] current_heads.extend(heads_to_add[1:]) - ancestors_by_idx[ - current_candidate_idx - ] = get_ancestors(heads_to_add[0]) + ancestors_by_idx[current_candidate_idx] = ( + get_ancestors(heads_to_add[0]) + ) ancestors_by_idx.extend( get_ancestors(head) for head in heads_to_add[1:] ) @@ -1183,9 +1184,13 @@ def _parse_downgrade_target( branch_label = symbol # Walk down the tree to find downgrade target. rev = self._walk( - start=self.get_revision(symbol) - if branch_label is None - else self.get_revision("%s@%s" % (branch_label, symbol)), + start=( + self.get_revision(symbol) + if branch_label is None + else self.get_revision( + "%s@%s" % (branch_label, symbol) + ) + ), steps=rel_int, no_overwalk=assert_relative_length, ) @@ -1303,9 +1308,13 @@ def _parse_upgrade_target( ) return ( self._walk( - start=self.get_revision(symbol) - if branch_label is None - else self.get_revision("%s@%s" % (branch_label, symbol)), + start=( + self.get_revision(symbol) + if branch_label is None + else self.get_revision( + "%s@%s" % (branch_label, symbol) + ) + ), steps=relative, no_overwalk=assert_relative_length, ), @@ -1694,15 +1703,13 @@ def is_merge_point(self) -> bool: @overload -def tuple_rev_as_scalar(rev: None) -> None: - ... +def tuple_rev_as_scalar(rev: None) -> None: ... @overload def tuple_rev_as_scalar( rev: Union[Tuple[_T, ...], List[_T]] -) -> Union[_T, Tuple[_T, ...], List[_T]]: - ... +) -> Union[_T, Tuple[_T, ...], List[_T]]: ... def tuple_rev_as_scalar( diff --git a/libs/alembic/templates/async/alembic.ini.mako b/libs/alembic/templates/async/alembic.ini.mako index 0e5f43fde..46a0904ed 100644 --- a/libs/alembic/templates/async/alembic.ini.mako +++ b/libs/alembic/templates/async/alembic.ini.mako @@ -1,7 +1,8 @@ # A generic, single database configuration. [alembic] -# path to migration scripts +# path to migration scripts. +# Use forward slashes (/) also on windows to provide an os agnostic path script_location = ${script_location} # template used to generate migration file names; The default value is %%(rev)s_%%(slug)s @@ -20,8 +21,7 @@ prepend_sys_path = . # leave blank for localtime # timezone = -# max length of characters to apply to the -# "slug" field +# max length of characters to apply to the "slug" field # truncate_slug_length = 40 # set to 'true' to run the environment during @@ -47,6 +47,7 @@ prepend_sys_path = . # version_path_separator = : # version_path_separator = ; # version_path_separator = space +# version_path_separator = newline version_path_separator = os # Use os.pathsep. Default configuration used for new projects. # set to 'true' to search source files recursively diff --git a/libs/alembic/templates/generic/alembic.ini.mako b/libs/alembic/templates/generic/alembic.ini.mako index 29245dd3f..dd4ea588e 100644 --- a/libs/alembic/templates/generic/alembic.ini.mako +++ b/libs/alembic/templates/generic/alembic.ini.mako @@ -2,6 +2,7 @@ [alembic] # path to migration scripts +# Use forward slashes (/) also on windows to provide an os agnostic path script_location = ${script_location} # template used to generate migration file names; The default value is %%(rev)s_%%(slug)s @@ -22,8 +23,7 @@ prepend_sys_path = . # leave blank for localtime # timezone = -# max length of characters to apply to the -# "slug" field +# max length of characters to apply to the "slug" field # truncate_slug_length = 40 # set to 'true' to run the environment during @@ -49,6 +49,7 @@ prepend_sys_path = . # version_path_separator = : # version_path_separator = ; # version_path_separator = space +# version_path_separator = newline version_path_separator = os # Use os.pathsep. Default configuration used for new projects. # set to 'true' to search source files recursively diff --git a/libs/alembic/templates/multidb/alembic.ini.mako b/libs/alembic/templates/multidb/alembic.ini.mako index c7fbe4822..d5cc86f1e 100644 --- a/libs/alembic/templates/multidb/alembic.ini.mako +++ b/libs/alembic/templates/multidb/alembic.ini.mako @@ -2,6 +2,7 @@ [alembic] # path to migration scripts +# Use forward slashes (/) also on windows to provide an os agnostic path script_location = ${script_location} # template used to generate migration file names; The default value is %%(rev)s_%%(slug)s @@ -22,8 +23,7 @@ prepend_sys_path = . # leave blank for localtime # timezone = -# max length of characters to apply to the -# "slug" field +# max length of characters to apply to the "slug" field # truncate_slug_length = 40 # set to 'true' to run the environment during @@ -49,6 +49,7 @@ prepend_sys_path = . # version_path_separator = : # version_path_separator = ; # version_path_separator = space +# version_path_separator = newline version_path_separator = os # Use os.pathsep. Default configuration used for new projects. # set to 'true' to search source files recursively diff --git a/libs/alembic/testing/assertions.py b/libs/alembic/testing/assertions.py index ec9593b71..e071697cd 100644 --- a/libs/alembic/testing/assertions.py +++ b/libs/alembic/testing/assertions.py @@ -74,7 +74,9 @@ class _ErrorContainer: @contextlib.contextmanager -def _expect_raises(except_cls, msg=None, check_context=False): +def _expect_raises( + except_cls, msg=None, check_context=False, text_exact=False +): ec = _ErrorContainer() if check_context: are_we_already_in_a_traceback = sys.exc_info()[0] @@ -85,7 +87,10 @@ def _expect_raises(except_cls, msg=None, check_context=False): ec.error = err success = True if msg is not None: - assert re.search(msg, str(err), re.UNICODE), f"{msg} !~ {err}" + if text_exact: + assert str(err) == msg, f"{msg} != {err}" + else: + assert re.search(msg, str(err), re.UNICODE), f"{msg} !~ {err}" if check_context and not are_we_already_in_a_traceback: _assert_proper_exception_context(err) print(str(err).encode("utf-8")) @@ -98,8 +103,12 @@ def expect_raises(except_cls, check_context=True): return _expect_raises(except_cls, check_context=check_context) -def expect_raises_message(except_cls, msg, check_context=True): - return _expect_raises(except_cls, msg=msg, check_context=check_context) +def expect_raises_message( + except_cls, msg, check_context=True, text_exact=False +): + return _expect_raises( + except_cls, msg=msg, check_context=check_context, text_exact=text_exact + ) def eq_ignore_whitespace(a, b, msg=None): diff --git a/libs/alembic/testing/fixtures.py b/libs/alembic/testing/fixtures.py index 4b83a745f..3b5ce596e 100644 --- a/libs/alembic/testing/fixtures.py +++ b/libs/alembic/testing/fixtures.py @@ -49,6 +49,12 @@ def migration_context(self, connection): connection, opts=dict(transaction_per_migration=True) ) + @testing.fixture + def as_sql_migration_context(self, connection): + return MigrationContext.configure( + connection, opts=dict(transaction_per_migration=True, as_sql=True) + ) + @testing.fixture def connection(self): with config.db.connect() as conn: @@ -268,9 +274,11 @@ def _run_alter_col(self, from_, to_, compare=None): "x", column.name, existing_type=column.type, - existing_server_default=column.server_default - if column.server_default is not None - else False, + existing_server_default=( + column.server_default + if column.server_default is not None + else False + ), existing_nullable=True if column.nullable else False, # existing_comment=column.comment, nullable=to_.get("nullable", None), @@ -298,9 +306,13 @@ def _run_alter_col(self, from_, to_, compare=None): new_col["type"], new_col.get("default", None), compare.get("type", old_col["type"]), - compare["server_default"].text - if "server_default" in compare - else column.server_default.arg.text - if column.server_default is not None - else None, + ( + compare["server_default"].text + if "server_default" in compare + else ( + column.server_default.arg.text + if column.server_default is not None + else None + ) + ), ) diff --git a/libs/alembic/testing/suite/test_autogen_computed.py b/libs/alembic/testing/suite/test_autogen_computed.py index 01a89a1fe..04a3caf07 100644 --- a/libs/alembic/testing/suite/test_autogen_computed.py +++ b/libs/alembic/testing/suite/test_autogen_computed.py @@ -124,6 +124,7 @@ def test_cant_change_computed_warning(self, test_case): lambda: (None, None), lambda: (sa.Computed("5"), sa.Computed("5")), lambda: (sa.Computed("bar*5"), sa.Computed("bar*5")), + lambda: (sa.Computed("bar*5"), sa.Computed("bar * \r\n\t5")), ( lambda: (sa.Computed("bar*5"), None), config.requirements.computed_doesnt_reflect_as_server_default, diff --git a/libs/alembic/testing/suite/test_environment.py b/libs/alembic/testing/suite/test_environment.py index 8c86859ae..df2d9afbd 100644 --- a/libs/alembic/testing/suite/test_environment.py +++ b/libs/alembic/testing/suite/test_environment.py @@ -24,9 +24,9 @@ def _fixture(self, opts): self.context = MigrationContext.configure( dialect=conn.dialect, opts=opts ) - self.context.output_buffer = ( - self.context.impl.output_buffer - ) = io.StringIO() + self.context.output_buffer = self.context.impl.output_buffer = ( + io.StringIO() + ) else: self.context = MigrationContext.configure( connection=conn, opts=opts diff --git a/libs/alembic/util/langhelpers.py b/libs/alembic/util/langhelpers.py index 4a5bf09a9..80d88cbce 100644 --- a/libs/alembic/util/langhelpers.py +++ b/libs/alembic/util/langhelpers.py @@ -234,20 +234,17 @@ def rev_id() -> str: @overload -def to_tuple(x: Any, default: Tuple[Any, ...]) -> Tuple[Any, ...]: - ... +def to_tuple(x: Any, default: Tuple[Any, ...]) -> Tuple[Any, ...]: ... @overload -def to_tuple(x: None, default: Optional[_T] = ...) -> _T: - ... +def to_tuple(x: None, default: Optional[_T] = ...) -> _T: ... @overload def to_tuple( x: Any, default: Optional[Tuple[Any, ...]] = None -) -> Tuple[Any, ...]: - ... +) -> Tuple[Any, ...]: ... def to_tuple( diff --git a/libs/alembic/util/messaging.py b/libs/alembic/util/messaging.py index 5f14d5975..6618fa7fa 100644 --- a/libs/alembic/util/messaging.py +++ b/libs/alembic/util/messaging.py @@ -95,11 +95,17 @@ def msg( write_outstream(sys.stdout, "\n") else: # left indent output lines - lines = textwrap.wrap(msg, TERMWIDTH) + indent = " " + lines = textwrap.wrap( + msg, + TERMWIDTH, + initial_indent=indent, + subsequent_indent=indent, + ) if len(lines) > 1: for line in lines[0:-1]: - write_outstream(sys.stdout, " ", line, "\n") - write_outstream(sys.stdout, " ", lines[-1], ("\n" if newline else "")) + write_outstream(sys.stdout, line, "\n") + write_outstream(sys.stdout, lines[-1], ("\n" if newline else "")) if flush: sys.stdout.flush() diff --git a/libs/alembic/util/sqla_compat.py b/libs/alembic/util/sqla_compat.py index 8489c19fa..d4ed0fdd5 100644 --- a/libs/alembic/util/sqla_compat.py +++ b/libs/alembic/util/sqla_compat.py @@ -59,8 +59,7 @@ class _CompilerProtocol(Protocol): - def __call__(self, element: Any, compiler: Any, **kw: Any) -> str: - ... + def __call__(self, element: Any, compiler: Any, **kw: Any) -> str: ... def _safe_int(value: str) -> Union[int, str]: @@ -95,8 +94,7 @@ class _Unsupported: def compiles( element: Type[ClauseElement], *dialects: str - ) -> Callable[[_CompilerProtocol], _CompilerProtocol]: - ... + ) -> Callable[[_CompilerProtocol], _CompilerProtocol]: ... else: from sqlalchemy.ext.compiler import compiles @@ -529,7 +527,7 @@ def __init__(self, table: Table, text: TextClause) -> None: self.fake_column = schema.Column(self.text.text, sqltypes.NULLTYPE) table.append_column(self.fake_column) - def get_children(self): + def get_children(self, **kw): return [self.fake_column] diff --git a/libs/apprise-1.7.6.dist-info/RECORD b/libs/apprise-1.7.6.dist-info/RECORD deleted file mode 100644 index 250648105..000000000 --- a/libs/apprise-1.7.6.dist-info/RECORD +++ /dev/null @@ -1,183 +0,0 @@ -../../bin/apprise,sha256=ZJ-e4qqxNLtdW_DAvpuPPX5iROIiQd8I6nvg7vtAv-g,233 -apprise-1.7.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -apprise-1.7.6.dist-info/LICENSE,sha256=gt7qKBxRhVcdmXCYVtrWP6DtYjD0DzONet600dkU994,1343 -apprise-1.7.6.dist-info/METADATA,sha256=z_gaX2IdNJqw4T9q7AYQri9jcIs-OTGCo3t2EgEY-mw,44823 -apprise-1.7.6.dist-info/RECORD,, -apprise-1.7.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise-1.7.6.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -apprise-1.7.6.dist-info/entry_points.txt,sha256=71YypBuNdjAKiaLsiMG40HEfLHxkU4Mi7o_S0s0d8wI,45 -apprise-1.7.6.dist-info/top_level.txt,sha256=JrCRn-_rXw5LMKXkIgMSE4E0t1Ks9TYrBH54Pflwjkk,8 -apprise/Apprise.py,sha256=Stm2NhJprWRaMwQfTiIQG_nR1bLpHi_zcdwEcsCpa-A,32865 -apprise/Apprise.pyi,sha256=_4TBKvT-QVj3s6PuTh3YX-BbQMeJTdBGdVpubLMY4_k,2203 -apprise/AppriseAsset.py,sha256=jRW8Y1EcAvjVA9h_mINmsjO4DM3S0aDl6INIFVMcUCs,11647 -apprise/AppriseAsset.pyi,sha256=NYLXXYbScgRkspP27XGpRRM_uliPu1OCdWdZBPPvLng,979 -apprise/AppriseAttachment.py,sha256=vhrktSrp8GLr32aK4KqV6BX83IpI1lxZe-pGo1wiSFM,12540 -apprise/AppriseAttachment.pyi,sha256=R9-0dVqWpeaFrVpcREwPhGy3qHWztG5jEjYIOsbE5dM,1145 -apprise/AppriseConfig.py,sha256=wfuR6Mb3ZLHvjvqWdFp9lVmjjDRWs65unY9qa92RkCg,16909 -apprise/AppriseConfig.pyi,sha256=_mUlCnncqAq8sL01WxQTgZjnb2ic9kZXvtqZmVl-fc8,1568 -apprise/AppriseLocale.py,sha256=4uSr4Nj_rz6ISMMAfRVRk58wZVLKOofJgk2x0_E8NkQ,8994 -apprise/AttachmentManager.py,sha256=EwlnjuKn3fv_pioWcmMCkyDTsO178t6vkEOD8AjAPsw,2053 -apprise/ConfigurationManager.py,sha256=MUmGajxjgnr6FGN7xb3q0nD0VVgdTdvapBBR7CsI-rc,2058 -apprise/NotificationManager.py,sha256=ZJgkiCgcJ7Bz_6bwQ47flrcxvLMbA4Vbw0HG_yTsGdE,2041 -apprise/URLBase.py,sha256=xRP0-blocp9UudYh04Hb3fIEmTZWJaTv_tzjrqaB9fg,29423 -apprise/URLBase.pyi,sha256=WLaRREH7FzZ5x3-qkDkupojWGFC4uFwJ1EDt02lVs8c,520 -apprise/__init__.py,sha256=ArtvoarAMnBcSfXF7L_hzq5CUJ9TUnHopiC7xafCe3c,3368 -apprise/assets/NotifyXML-1.0.xsd,sha256=292qQ_IUl5EWDhPyzm9UTT0C2rVvJkyGar8jiODkJs8,986 -apprise/assets/NotifyXML-1.1.xsd,sha256=bjR3CGG4AEXoJjYkGCbDttKHSkPP1FlIWO02E7G59g4,1758 -apprise/assets/themes/default/apprise-failure-128x128.ico,sha256=Mt0ptfHJaN3Wsv5UCNDn9_3lyEDHxVDv1JdaDEI_xCA,67646 -apprise/assets/themes/default/apprise-failure-128x128.png,sha256=66ps8TDPxVH3g9PlObJqF-0x952CjnqQyN3zvpRcOT8,16135 -apprise/assets/themes/default/apprise-failure-256x256.png,sha256=bQBsKKCsKfR9EqgYOZrcVcVa5y8qG58PN2mEqO5eNRI,41931 -apprise/assets/themes/default/apprise-failure-32x32.png,sha256=vH0pZffIDCvkejpr3fJHGXW__8Yc3R_p0bacX6t6l18,2437 -apprise/assets/themes/default/apprise-failure-72x72.png,sha256=EP5A8DHRDr9srgupFSwOoyQ308bNJ8aL192J_L4K-ec,7600 -apprise/assets/themes/default/apprise-info-128x128.ico,sha256=F5_CirmXueRCRI5Z_Crf6TS6jVIXTJlRD83zw1oJ66g,67646 -apprise/assets/themes/default/apprise-info-128x128.png,sha256=bBqRZAgQey-gkmJrnFhPbzjILSrljE59mRkgj3raMQo,16671 -apprise/assets/themes/default/apprise-info-256x256.png,sha256=B5r_O4d9MHCmSWZwfbqQgZSp-ZetTdiBSwKcMTF1aFA,43331 -apprise/assets/themes/default/apprise-info-32x32.png,sha256=lt3NZ95TzkiCNVNlurrB2fE2nriMa1wftl7nrNXmb6c,2485 -apprise/assets/themes/default/apprise-info-72x72.png,sha256=kDnsZpqNUZGqs9t1ECUup7FOfXUIL-rupnQCYJp9So4,7875 -apprise/assets/themes/default/apprise-logo.png,sha256=85ttALudKkLmiqilJT7mUQLUXRFmM1AK89rnwLm313s,160907 -apprise/assets/themes/default/apprise-success-128x128.ico,sha256=uCopPwdQjxgfohKazHaDzYs9y4oiaOpL048PYC6WRlg,67646 -apprise/assets/themes/default/apprise-success-128x128.png,sha256=nvDuU_QqhGlw6cMtdj7Mv-gPgqCEx-0DaaXn1KBLVYg,17446 -apprise/assets/themes/default/apprise-success-256x256.png,sha256=vXfKuxY3n0eeXHKdb9hTxICxOEn7HjAQ4IZpX0HSLzc,48729 -apprise/assets/themes/default/apprise-success-32x32.png,sha256=Jg9pFJh3YPI-LiPBebyJ7Z4Vt7BRecaE8AsRjQVIkME,2471 -apprise/assets/themes/default/apprise-success-72x72.png,sha256=FQbgvIhqKOhEK0yvrhaSpai0R7hrkTt_-GaC2KUgCCk,7858 -apprise/assets/themes/default/apprise-warning-128x128.ico,sha256=6XaQPOx0oWK_xbhr4Yhb7qNazCWwSs9lk2SYR2MHTrQ,67646 -apprise/assets/themes/default/apprise-warning-128x128.png,sha256=pf5c4Ph7jWH7gf39dJoieSj8TzAsY3TXI-sGISGVIW4,16784 -apprise/assets/themes/default/apprise-warning-256x256.png,sha256=SY-xlaiXaj420iEYKC2_fJxU-yj2SuaQg6xfPNi83bw,43708 -apprise/assets/themes/default/apprise-warning-32x32.png,sha256=97R2ywNvcwczhBoWEIgajVtWjgT8fLs4FCCz4wu0dwc,2472 -apprise/assets/themes/default/apprise-warning-72x72.png,sha256=L8moEInkO_OLxoOcuvN7rmrGZo64iJeH20o-24MQghE,7913 -apprise/attachment/AttachBase.py,sha256=T3WreGrTsqqGplXJO36jm-N14X7ymSc9xt7XdTYuXVE,13656 -apprise/attachment/AttachBase.pyi,sha256=w0XG_QKauiMLJ7eQ4S57IiLIURZHm_Snw7l6-ih9GP8,961 -apprise/attachment/AttachFile.py,sha256=MbHY_av0GeM_AIBKV02Hq7SHiZ9eCr1yTfvDMUgi2I4,4765 -apprise/attachment/AttachHTTP.py,sha256=_CMPp4QGLATfGO2-Nw57sxsQyed9z3ywgoB0vpK3KZk,13779 -apprise/attachment/__init__.py,sha256=xabgXpvV05X-YRuqIt3uGYMXwYNXjHyF6Dwd8HfZCFE,1658 -apprise/cli.py,sha256=h-pWSQPqQficH6J-OEp3MTGydWyt6vMYnDZvHCeAt4Y,20697 -apprise/common.py,sha256=I6wfrndggCL7l7KAl7Cm4uwAX9n0l3SN4-BVvTE0L0M,5593 -apprise/common.pyi,sha256=luF3QRiClDCk8Z23rI6FCGYsVmodOt_JYfYyzGogdNM,447 -apprise/config/ConfigBase.py,sha256=d1efIuQFCJr66WgpudV2DWtxY3-tuZAyMAhHXBzJ8p0,53194 -apprise/config/ConfigBase.pyi,sha256=cngfobwH6v2vxYbQrObDi5Z-t5wcquWF-wR0kBCr3Eg,54 -apprise/config/ConfigFile.py,sha256=u_SDaN3OHMyaAq2X7k_T4_PRKkVsDwleqBz9YIN5lbA,6138 -apprise/config/ConfigHTTP.py,sha256=Iy6Ji8_nX3xDjFgJGLrz4ftrMlMiyKiFGzYGJ7rMSMQ,9457 -apprise/config/ConfigMemory.py,sha256=epEAgNy-eJVWoQaUOvjivMWxXTofy6wAQ-NbCqYmuyE,2829 -apprise/config/__init__.py,sha256=lbsxrUpB1IYM2q7kjYhsXQGgPF-yZXJrKFE361tdIPY,1663 -apprise/conversion.py,sha256=0VZ0eCZfksN-97Vl0TjVjwnCTgus3XTRioceSFnP-gc,6277 -apprise/decorators/CustomNotifyPlugin.py,sha256=i4D-sgOsBWsxO5auWCN2bgXLLPuADaaLlJ1gUKLj2bU,7972 -apprise/decorators/__init__.py,sha256=e_PDAm0kQNzwDPx-NJZLPfLMd2VAABvNZtxx_iDviRM,1487 -apprise/decorators/notify.py,sha256=a2WupErNw1_SMAld7jPC273bskiChMpYy95BOog5A9w,5111 -apprise/emojis.py,sha256=ONF0t8dY9f2XlEkLUG79-ybKVAj2GqbPj2-Be97vAoI,87738 -apprise/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise/i18n/en/LC_MESSAGES/apprise.mo,sha256=oUTuHREmLEYN07oqYqRMJ_kU71-o5o37NsF4RXlC5AU,3959 -apprise/logger.py,sha256=131hqhed8cUj9x_mfXDEvwA2YbcYDFAYiWVK1HgxRVY,6921 -apprise/manager.py,sha256=R9w8jxQRNy6Z_XDcobkt4JYbrC4jtj2OwRw9Zrib3CA,26857 -apprise/plugins/NotifyAppriseAPI.py,sha256=ISBE0brD3eQdyw3XrGXd4Uc4kSYvIuI3SSUVCt-bkdo,16654 -apprise/plugins/NotifyAprs.py,sha256=xdL_aIVgb4ggxRFeCdkZAbgHYZ8DWLw9pRpLZQ0rHoE,25523 -apprise/plugins/NotifyBark.py,sha256=bsDvKooRy4k1Gg7tvBjv3DIx7-WZiV_mbTrkTwMtd9Q,15698 -apprise/plugins/NotifyBase.py,sha256=G3xkF_a2BWqNSxsrnOW7NUgHjOqBCYC5zihCifWemo8,30360 -apprise/plugins/NotifyBase.pyi,sha256=aKlZXRYUgG8lz_ZgGkYYJ_GKhuf18youTmMU-FlG7z8,21 -apprise/plugins/NotifyBoxcar.py,sha256=vR00-WggHa1nHYWyb-f5P2V-G4f683fU_-GBlIeJvD0,12867 -apprise/plugins/NotifyBulkSMS.py,sha256=stPWAFCfhBP617zYK9Dgk6pNJBN_WcyJtODzo0jR1QQ,16005 -apprise/plugins/NotifyBulkVS.py,sha256=viLGeyUDiirRRM7CgRqqElHSLYFnMugDtWE6Ytjqfaw,13290 -apprise/plugins/NotifyBurstSMS.py,sha256=cN2kRETKIK5LhwpQEA8C68LKv8KEUPmXYe-nTSegGls,15550 -apprise/plugins/NotifyChantify.py,sha256=GJJOAtSnVoIfKbJF_W1DTu7WsvS_zHdjO4T1XTKT87g,6673 -apprise/plugins/NotifyClickSend.py,sha256=UfOJqsas6WLjQskojuJE7I_-lrb5QrkMiBZv-po_Q9c,11229 -apprise/plugins/NotifyD7Networks.py,sha256=4E6Fh0kQoDlMMwgZJDOXky7c7KrdMMvqprcfm29scWU,15043 -apprise/plugins/NotifyDBus.py,sha256=1eVJHIL3XkFjDePMqfcll35Ie1vxggJ1iBsVFAIaF00,14379 -apprise/plugins/NotifyDapnet.py,sha256=KuXjBU0ZrIYtoDei85NeLZ-IP810T4w5oFXH9sWiSh0,13624 -apprise/plugins/NotifyDingTalk.py,sha256=NJyETgN6QjtRqtxQjfBLFVuFpURyWykRftm6WpQJVbY,12009 -apprise/plugins/NotifyDiscord.py,sha256=M_qmTzB7NNL5_agjYDX38KBN1jRzDBp2EMSNwEF_9Tw,26072 -apprise/plugins/NotifyEmail.py,sha256=Y_ZOrdK6hTUKHLvogKpV5VqD8byzDyDSvwIVmfdsC2g,39789 -apprise/plugins/NotifyEmby.py,sha256=OMVO8XsVl_XCBYNNNQi8ni2lS4voLfU8Puk1xJOAvHs,24039 -apprise/plugins/NotifyEnigma2.py,sha256=Hj0Q9YOeljSwbfiuMKLqXTVX_1g_mjNUGEts7wfrwno,11498 -apprise/plugins/NotifyFCM/__init__.py,sha256=mBFtIgIJuLIFnMB5ndx5Makjs9orVMc2oLoD7LaVT48,21669 -apprise/plugins/NotifyFCM/color.py,sha256=8iqDtadloQh2TMxkFmIFwenHqKp1pHHn1bwyWOzZ6TY,4592 -apprise/plugins/NotifyFCM/common.py,sha256=978uBUoNdtopCtylipGiKQdsQ8FTONxkFBp7uJMZHc8,1718 -apprise/plugins/NotifyFCM/oauth.py,sha256=Vvbd0-rd5BPIjAneG3rILU153JIzfSZ0kaDov6hm96M,11197 -apprise/plugins/NotifyFCM/priority.py,sha256=0WuRW1y1HVnybgjlTeCZPHzt7j8SwWnC7faNcjioAOc,8163 -apprise/plugins/NotifyFeishu.py,sha256=IpcABdLZJ1vcQdZHlmASVbNOiOCIrmgKFhz1hbdskY4,7266 -apprise/plugins/NotifyFlock.py,sha256=0rUIa9nToGsO8BTUgixh8Z_qdVixJeH479UNYjcE4EM,12748 -apprise/plugins/NotifyForm.py,sha256=38nL-2m1cf4gEQFQ4NpvA4j9i5_nNUgelReWFSjyV5U,17905 -apprise/plugins/NotifyFreeMobile.py,sha256=XCkgZLc3KKGlx_9UdeoMJVcHpeQrOml9T93S-DGf4bs,6644 -apprise/plugins/NotifyGnome.py,sha256=8MXTa8gZg1wTgNJfLlmq7_fl3WaYK-SX6VR91u308C4,9059 -apprise/plugins/NotifyGoogleChat.py,sha256=lnoN17m6lZANaXcElDTP8lcuVWjIZEK8C6_iqJNAnw4,12622 -apprise/plugins/NotifyGotify.py,sha256=DNlOIHyuYitO5use9oa_REPm2Fant7y9QSaatrZFNI0,10551 -apprise/plugins/NotifyGrowl.py,sha256=M6ViUz967VhEHtXrE7lbCKF3aB4pIXNEzJLjjGAmvhM,14023 -apprise/plugins/NotifyGuilded.py,sha256=eCMCoFFuE0XNY8HlLM21zoxgBNgqEKQ8dwYj8LihfRU,3641 -apprise/plugins/NotifyHomeAssistant.py,sha256=zqWu7TtdXhTbGNuflC8WfydbHsCLiEBw4uBUcF7YZtw,10739 -apprise/plugins/NotifyHttpSMS.py,sha256=pDEUHCCB18IhOgDcVK3_FFDJdAcrdTIfPzj0jNnZZBo,11136 -apprise/plugins/NotifyIFTTT.py,sha256=oMvTQ0bEu2eJQgw9BwxAwTNOtbZ_ER-zleJvWpWTj7w,13425 -apprise/plugins/NotifyJSON.py,sha256=70ctjmArGzuvM1gHNt1bCiQVWE7Fp9vd2nWhSXwFvw0,13851 -apprise/plugins/NotifyJoin.py,sha256=B8FHp7cblZBkxTgfrka6mNnf6oQVBXVuGISgSau00z0,13581 -apprise/plugins/NotifyKavenegar.py,sha256=F5xTUdebM1lK6yGFbZJQB9Zgw2LTI0angeA-3Nu-89w,12620 -apprise/plugins/NotifyKumulos.py,sha256=eCEW2ZverZqETOLHVWMC4E8Ll6rEhhEWOSD73RD80SM,8214 -apprise/plugins/NotifyLametric.py,sha256=h8vZoX-Ll5NBZRprBlxTO2H9w0lOiMxglGvUgJtK4_8,37534 -apprise/plugins/NotifyLine.py,sha256=OVI0ozMJcq_-dI8dodVX52dzUzgENlAbOik-Kw4l-rI,10676 -apprise/plugins/NotifyLunaSea.py,sha256=woN8XdkwAjhgxAXp7Zj4XsWLybNL80l4W3Dx5BvobZg,14459 -apprise/plugins/NotifyMQTT.py,sha256=cnuG4f3bYYNPhEj9qDX8SLmnxLVT9G1b8J5w6-mQGKY,19545 -apprise/plugins/NotifyMSG91.py,sha256=P7JPyT1xmucnaEeCZPf_6aJfe1gS_STYYwEM7hJ7QBw,12677 -apprise/plugins/NotifyMSTeams.py,sha256=dFH575hoLL3zRddbBKfozlYjxvPJGbj3BKvfJSIkvD0,22976 -apprise/plugins/NotifyMacOSX.py,sha256=y2fGpSZXomFiNwKbWImrXQUMVM4JR4uPCnsWpnxQrFA,8271 -apprise/plugins/NotifyMailgun.py,sha256=FNS_QLOQWMo62yVO-mMZkpiXudUtSdbHOjfSrLC4oIo,25409 -apprise/plugins/NotifyMastodon.py,sha256=2ovjQIOOITHH8lOinC8QCFCJN2QA8foIM2pjdknbblc,35277 -apprise/plugins/NotifyMatrix.py,sha256=I8kdaZUZS-drew0JExBbChQVe7Ib4EwAjQd0xE30XT0,50049 -apprise/plugins/NotifyMattermost.py,sha256=JgEc-wC-43FBMItezDJ62zv1Nc9ROFjDiwD_8bt8rgM,12722 -apprise/plugins/NotifyMessageBird.py,sha256=EUPwhs1PHiPZpluIrLiNKQMUPcdlKnx1sdnllCtN_Ns,12248 -apprise/plugins/NotifyMisskey.py,sha256=zYZkBKv0p3jJpm_HLDBugUgKeGb0qpLoPqy0ffwwxVg,9600 -apprise/plugins/NotifyNextcloud.py,sha256=M3EyvUzBMHbTKU3gxW_7fPA6vmQUF5x8GTMZQ78sWCA,12759 -apprise/plugins/NotifyNextcloudTalk.py,sha256=dLl_g7Knq5PVcadbzDuQsxbGHTZlC4r-pQC8wzYnmAo,11011 -apprise/plugins/NotifyNotica.py,sha256=yHmk8HiNFjzoI4Gewo_nBRrx9liEmhT95k1d10wqhYg,12990 -apprise/plugins/NotifyNotifiarr.py,sha256=ADwLJO9eenfLkNa09tXMGSBTM4c3zTY0SEePvyB8WYA,15857 -apprise/plugins/NotifyNotifico.py,sha256=Qe9jMN_M3GL4XlYIWkAf-w_Hf65g9Hde4bVuytGhUW4,12035 -apprise/plugins/NotifyNtfy.py,sha256=AtJt2zH35mMQTwRDxKia93NPy6-4rtixplP53zIYV2M,27979 -apprise/plugins/NotifyOffice365.py,sha256=8TxsVsdbUghmNj0kceMlmoZzTOKQTgn3priI8JuRuHE,25190 -apprise/plugins/NotifyOneSignal.py,sha256=gsw7ckW7xLiJDRUb7eJHNe_4bvdBXmt6_YsB1u_ghjw,18153 -apprise/plugins/NotifyOpsgenie.py,sha256=zJWpknjoHq35Iv9w88ucR62odaeIN3nrGFPtYnhDdjA,20515 -apprise/plugins/NotifyPagerDuty.py,sha256=lu6oNdygrs6UezYm6xgiQxQDeDz8EVUtfP-xsArRvyw,17874 -apprise/plugins/NotifyPagerTree.py,sha256=mPl6ejdelNlWUWGVs46kZT0VV4uFZoeCdcv4VJ_f_XQ,13849 -apprise/plugins/NotifyParsePlatform.py,sha256=6oFOTpu-HMhesaYXRBvu5oaESYlFrKBNYTHE-ItCBRk,10291 -apprise/plugins/NotifyPopcornNotify.py,sha256=kRstzG0tWBdxSRfn2RN2J7FhvIj2qYWlwUyLxxZCbPc,10587 -apprise/plugins/NotifyProwl.py,sha256=EGOdmiZq8CFbjxTtWWKLQEdYiSvr4czZfE_8aCMEokw,9782 -apprise/plugins/NotifyPushBullet.py,sha256=JVd2GQH-DWmPaKjuGBpsE6DXNCcZEUDH7tA5zbM1qEU,15372 -apprise/plugins/NotifyPushDeer.py,sha256=cG1UFG06PfzbmI1RxtrMqmfaHK_Ojk_W-QMEdtkEuUI,6922 -apprise/plugins/NotifyPushMe.py,sha256=ioRzeXbd2X5miTd3h3m7AwCqkIIfbXNm4PjYk0OOXZ0,7134 -apprise/plugins/NotifyPushSafer.py,sha256=hIcYHwUZapmC-VDvaO_UkDY9RSPTxHgF7m2FL-6JBZw,26756 -apprise/plugins/NotifyPushed.py,sha256=NqLMXD9gvihXLfLUtCcMfz5oUAhPM7sKXECqKgD0v-U,12270 -apprise/plugins/NotifyPushjet.py,sha256=8qWpIqM4dKWjO-BjOrRJXZYtvtJBt_mikdBWRxfibnE,8952 -apprise/plugins/NotifyPushover.py,sha256=MJDquV4zl1cNrGZOC55hLlt6lOb6625WeUcgS5ceCbk,21213 -apprise/plugins/NotifyPushy.py,sha256=mmWcnu905Fvc8ihYXvZ7lVYErGZH5Q-GbBNS20v5r48,12496 -apprise/plugins/NotifyRSyslog.py,sha256=W42LT90X65-pNoU7KdhdX1PBcmsz9RyV376CDa_H3CI,11982 -apprise/plugins/NotifyReddit.py,sha256=E78OSyDQfUalBEcg71sdMsNBOwdj7cVBnELrhrZEAXY,25785 -apprise/plugins/NotifyRevolt.py,sha256=DRA9Xylwl6leVjVFuJcP4L1cG49CIBtnQdxh4BKnAZ4,14500 -apprise/plugins/NotifyRocketChat.py,sha256=Cb_nasX0-G3FoPMYvNk55RJ-tHuXUCTLUn2wTSi4IcI,25738 -apprise/plugins/NotifyRyver.py,sha256=yhHPMLGeJtcHwBKSPPk0OBfp59DgTvXio1R59JhrJu4,11823 -apprise/plugins/NotifySES.py,sha256=wtRmpAZkS5mQma6sdiaPT6U1xcgoj77CB9mNFvSEAw8,33545 -apprise/plugins/NotifySMSEagle.py,sha256=voFNqOewD9OC1eRctD0YdUB_ZSWsb06rjUwBfCcxPYA,24161 -apprise/plugins/NotifySMSManager.py,sha256=DbVc35qLfYkNL7eq43_rPD6k-PELL9apf3S09S6qvDA,14125 -apprise/plugins/NotifySMTP2Go.py,sha256=foQ7aMMmNc5Oree8YwrxZJgMnF6yVMFAfqShm_nLbx0,19711 -apprise/plugins/NotifySNS.py,sha256=ZEBWf0ZJ9w_ftzUikKEvQWJ2fkxrUbrLhPmTRD2DvRQ,24159 -apprise/plugins/NotifySendGrid.py,sha256=IBdYmZcthkvGCz1N_Fs8vDnImtHug6LpuKv1mWT_Cdo,16213 -apprise/plugins/NotifyServerChan.py,sha256=WsrClO9f0xi-KpnLZGTUHV7PxeU3l1D875gvMaZRG_M,5779 -apprise/plugins/NotifySignalAPI.py,sha256=OwJ7qjJ-ZJyS8GS-dBWAtgizHMnGegg76GuwFobyWkw,16733 -apprise/plugins/NotifySimplePush.py,sha256=dUC6O8IGuUIAz5z6_H7A7jdv5Gj1plytNm5QyKnHAYg,10876 -apprise/plugins/NotifySinch.py,sha256=tmHLwQa9lWHEI3EcRfigl4i7JU46A6gKAi_GbY0PrX4,16813 -apprise/plugins/NotifySlack.py,sha256=3VdjruU5FPr3jT_s3axwRJKMcBYXP0lvJnyuKedIlcE,42521 -apprise/plugins/NotifySparkPost.py,sha256=6dRTwnYU50Lvmp6AlwCyePe0TMbVEXaSwNeGkg__EYo,27878 -apprise/plugins/NotifyStreamlabs.py,sha256=lx3N8T2ufUWFYIZ-kU_rOv50YyGWBqLSCKk7xim2_Io,16023 -apprise/plugins/NotifySynology.py,sha256=_jTqfgWeOuSi_I8geMOraHBVFtDkvm9mempzymrmeAo,11105 -apprise/plugins/NotifySyslog.py,sha256=J9Kain2bb-PDNiG5Ydb0q678cYjNE_NjZFqMG9oEXM0,10617 -apprise/plugins/NotifyTechulusPush.py,sha256=m43_Qj1scPcgCRX5Dr2Ul7nxMbaiVxNzm_HRuNmfgoA,7253 -apprise/plugins/NotifyTelegram.py,sha256=XE7PC9LRzcrfE2bpLKyor5lO_7B9LS4Xw1UlUmA4a2A,37187 -apprise/plugins/NotifyThreema.py,sha256=C_C3j0fJWgeF2uB7ceJFXOdC6Lt0TFBInFMs5Xlg04M,11885 -apprise/plugins/NotifyTwilio.py,sha256=WCo8eTI9OF1rtg3ueHHRDXt4Lp45eZ6h3IdTZVf5HM8,15976 -apprise/plugins/NotifyTwist.py,sha256=nZA73CYVe-p0tkVMy5q3vFRyflLM4yjUo9LECvkUwgc,28841 -apprise/plugins/NotifyTwitter.py,sha256=qML0jlBkLZMHrkKRxBpVUnBwAz8MWGYyI3cvwi-hrgM,30152 -apprise/plugins/NotifyVoipms.py,sha256=msy_D32YhP8OP4_Mj_L3OYd4iablqQETN-DvilGZeVQ,12552 -apprise/plugins/NotifyVonage.py,sha256=xmzZgobFaGA_whpQ5fDuG2poUrK9W4T77yP7dusHcSo,13431 -apprise/plugins/NotifyWeComBot.py,sha256=5lkhXDgyJ1edzknemKsO1sJVv7miR9F_7xI40Ag7ICI,8789 -apprise/plugins/NotifyWebexTeams.py,sha256=gbbRlHiPuOvUIZexE5m2QNd1dN_5_x0OdT5m6NSrcso,9164 -apprise/plugins/NotifyWhatsApp.py,sha256=PtzW0ue3d2wZ8Pva_LG29jUcpRRP03TFxO5SME_8Juo,19924 -apprise/plugins/NotifyWindows.py,sha256=QgWJfJF8AE6RWr-L81YYVZNWrnImK9Qr3B991HWanqU,8563 -apprise/plugins/NotifyXBMC.py,sha256=5hDuOTP3Kwtp4NEMaokNjWyEKEkQcN_fSx-cUPJvhaU,12096 -apprise/plugins/NotifyXML.py,sha256=WJnmdvXseuTRgioVMRqpR8a09cDfTpPTfuFlTnT_TfI,16973 -apprise/plugins/NotifyZulip.py,sha256=M8cSL7nZvtBYyTX6045g34tyn2vyybltgD1CoI4Xa7A,13968 -apprise/plugins/__init__.py,sha256=jTfLmW47kZC_Wf5eFFta2NoD2J-7_E7JaPrrVMIECkU,18725 -apprise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise/utils.py,sha256=SjRU2tb1UsVnTCTXPUyXVz3WpRbDWwAHH-d3ll38EHY,53185 diff --git a/libs/alembic-1.13.1.dist-info/INSTALLER b/libs/apprise-1.9.0.dist-info/INSTALLER similarity index 100% rename from libs/alembic-1.13.1.dist-info/INSTALLER rename to libs/apprise-1.9.0.dist-info/INSTALLER diff --git a/libs/apprise-1.7.6.dist-info/LICENSE b/libs/apprise-1.9.0.dist-info/LICENSE similarity index 100% rename from libs/apprise-1.7.6.dist-info/LICENSE rename to libs/apprise-1.9.0.dist-info/LICENSE diff --git a/libs/apprise-1.7.6.dist-info/METADATA b/libs/apprise-1.9.0.dist-info/METADATA similarity index 83% rename from libs/apprise-1.7.6.dist-info/METADATA rename to libs/apprise-1.9.0.dist-info/METADATA index ac7cb9aac..66f9ce0ea 100644 --- a/libs/apprise-1.7.6.dist-info/METADATA +++ b/libs/apprise-1.9.0.dist-info/METADATA @@ -1,12 +1,12 @@ Metadata-Version: 2.1 Name: apprise -Version: 1.7.6 +Version: 1.9.0 Summary: Push Notifications that work with just about every platform! Home-page: https://github.com/caronc/apprise Author: Chris Caron Author-email: lead2gold@gmail.com License: BSD -Keywords: Alerts Apprise API Automated Packet Reporting System AWS Boxcar BulkSMS BulkVS Burst SMS Chantify Chat CLI ClickSend D7Networks Dapnet DBus DingTalk Discord Email Emby Enigma2 FCM Feishu Flock Form Free Mobile Gnome Google Chat Gotify Growl Guilded Home Assistant httpSMS IFTTT Join JSON Kavenegar KODI Kumulos LaMetric Line LunaSea MacOSX Mailgun Mastodon Matrix Mattermost MessageBird Microsoft Misskey MQTT MSG91 MSTeams Nextcloud NextcloudTalk Notica Notifiarr Notifico Ntfy Office365 OneSignal Opsgenie PagerDuty PagerTree ParsePlatform PopcornNotify Prowl PushBullet Pushed Pushjet PushMe Push Notifications Pushover PushSafer Pushy PushDeer Reddit Revolt Rocket.Chat RSyslog Ryver SendGrid ServerChan SES Signal SimplePush Sinch Slack SMSEagle SMS Manager SMTP2Go SNS SparkPost Streamlabs Stride Synology Chat Syslog Techulus Telegram Threema Gateway Twilio Twist Twitter Voipms Vonage Webex WeCom Bot WhatsApp Windows XBMC XML Zulip +Keywords: Africas Talking Alerts Apprise API Automated Packet Reporting System AWS Boxcar BulkSMS BulkVS Burst SMS Chantify Chat CLI ClickSend D7Networks Dapnet DBus DingTalk Discord Email Emby Enigma2 FCM Feishu Flock Form Free Mobile Gnome Google Chat Gotify Growl Guilded Home Assistant httpSMS IFTTT Join JSON Kavenegar KODI Kumulos LaMetric Line LunaSea MacOSX Mailgun Mastodon Matrix Mattermost MessageBird Microsoft Misskey MQTT MSG91 MSTeams Nextcloud NextcloudTalk Notica Notifiarr Notifico Ntfy Office365 OneSignal Opsgenie PagerDuty PagerTree ParsePlatform PopcornNotify Power Automate Prowl PushBullet Pushed Pushjet PushMe Push Notifications Pushover PushSafer Pushy PushDeer Reddit Revolt Rocket.Chat RSyslog Ryver SendGrid ServerChan SES SFR Signal SimplePush Sinch Slack SMSEagle SMS Manager SMTP2Go SNS SparkPost Splunk Streamlabs Stride Synology Chat Syslog Techulus Telegram Threema Gateway Twilio Twist Twitter VictorOps Voipms Vonage Webex WeCom Bot WhatsApp Windows Workflows WxPusher XBMC XML Zulip Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators @@ -35,7 +35,6 @@ Requires-Dist: requests-oauthlib Requires-Dist: click >=5.0 Requires-Dist: markdown Requires-Dist: PyYAML -Requires-Dist: dataclasses ; python_version < "3.7" ![Apprise Logo](https://raw.githubusercontent.com/caronc/apprise/master/apprise/assets/themes/default/apprise-logo.png) @@ -82,6 +81,7 @@ System Administrators and DevOps who wish to send a notification now no longer n * [Configuration Files](#api-configuration-files) * [File Attachments](#api-file-attachments) * [Loading Custom Notifications/Hooks](#api-loading-custom-notificationshooks) +* [Persistent Storage](#persistent-storage) * [More Supported Links and Documentation](#want-to-learn-more) @@ -122,6 +122,7 @@ The table below identifies the services this tool supports and some example serv | [Mastodon](https://github.com/caronc/apprise/wiki/Notify_mastodon) | mastodon:// or mastodons://| (TCP) 80 or 443 | mastodon://access_key@hostname
mastodon://access_key@hostname/@user
mastodon://access_key@hostname/@user1/@user2/@userN | [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix) | matrix:// or matrixs:// | (TCP) 80 or 443 | matrix://hostname
matrix://user@hostname
matrixs://user:pass@hostname:port/#room_alias
matrixs://user:pass@hostname:port/!room_id
matrixs://user:pass@hostname:port/#room_alias/!room_id/#room2
matrixs://token@hostname:port/?webhook=matrix
matrix://user:token@hostname/?webhook=slack&format=markdown | [Mattermost](https://github.com/caronc/apprise/wiki/Notify_mattermost) | mmost:// or mmosts:// | (TCP) 8065 | mmost://hostname/authkey
mmost://hostname:80/authkey
mmost://user@hostname:80/authkey
mmost://hostname/authkey?channel=channel
mmosts://hostname/authkey
mmosts://user@hostname/authkey
+| [Microsoft Power Automate / Workflows (MSTeams)](https://github.com/caronc/apprise/wiki/Notify_workflows) | workflows:// | (TCP) 443 | workflows://WorkflowID/Signature/ | [Microsoft Teams](https://github.com/caronc/apprise/wiki/Notify_msteams) | msteams:// | (TCP) 443 | msteams://TokenA/TokenB/TokenC/ | [Misskey](https://github.com/caronc/apprise/wiki/Notify_misskey) | misskey:// or misskeys://| (TCP) 80 or 443 | misskey://access_token@hostname | [MQTT](https://github.com/caronc/apprise/wiki/Notify_mqtt) | mqtt:// or mqtts:// | (TCP) 1883 or 8883 | mqtt://hostname/topic
mqtt://user@hostname/topic
mqtts://user:pass@hostname:9883/topic @@ -159,23 +160,26 @@ The table below identifies the services this tool supports and some example serv | [SimplePush](https://github.com/caronc/apprise/wiki/Notify_simplepush) | spush:// | (TCP) 443 | spush://apikey
spush://salt:password@apikey
spush://apikey?event=Apprise | [Slack](https://github.com/caronc/apprise/wiki/Notify_slack) | slack:// | (TCP) 443 | slack://TokenA/TokenB/TokenC/
slack://TokenA/TokenB/TokenC/Channel
slack://botname@TokenA/TokenB/TokenC/Channel
slack://user@TokenA/TokenB/TokenC/Channel1/Channel2/ChannelN | [SMTP2Go](https://github.com/caronc/apprise/wiki/Notify_smtp2go) | smtp2go:// | (TCP) 443 | smtp2go://user@hostname/apikey
smtp2go://user@hostname/apikey/email
smtp2go://user@hostname/apikey/email1/email2/emailN
smtp2go://user@hostname/apikey/?name="From%20User" -| [Streamlabs](https://github.com/caronc/apprise/wiki/Notify_streamlabs) | strmlabs:// | (TCP) 443 | strmlabs://AccessToken/
strmlabs://AccessToken/?name=name&identifier=identifier&amount=0¤cy=USD | [SparkPost](https://github.com/caronc/apprise/wiki/Notify_sparkpost) | sparkpost:// | (TCP) 443 | sparkpost://user@hostname/apikey
sparkpost://user@hostname/apikey/email
sparkpost://user@hostname/apikey/email1/email2/emailN
sparkpost://user@hostname/apikey/?name="From%20User" +| [Splunk](https://github.com/caronc/apprise/wiki/Notify_splunk) | splunk:// or victorops:/ | (TCP) 443 | splunk://route_key@apikey
splunk://route_key@apikey/entity_id +| [Streamlabs](https://github.com/caronc/apprise/wiki/Notify_streamlabs) | strmlabs:// | (TCP) 443 | strmlabs://AccessToken/
strmlabs://AccessToken/?name=name&identifier=identifier&amount=0¤cy=USD | [Synology Chat](https://github.com/caronc/apprise/wiki/Notify_synology_chat) | synology:// or synologys:// | (TCP) 80 or 443 | synology://hostname/token
synology://hostname:port/token | [Syslog](https://github.com/caronc/apprise/wiki/Notify_syslog) | syslog:// | n/a | syslog://
syslog://Facility | [Telegram](https://github.com/caronc/apprise/wiki/Notify_telegram) | tgram:// | (TCP) 443 | tgram://bottoken/ChatID
tgram://bottoken/ChatID1/ChatID2/ChatIDN | [Twitter](https://github.com/caronc/apprise/wiki/Notify_twitter) | twitter:// | (TCP) 443 | twitter://CKey/CSecret/AKey/ASecret
twitter://user@CKey/CSecret/AKey/ASecret
twitter://CKey/CSecret/AKey/ASecret/User1/User2/User2
twitter://CKey/CSecret/AKey/ASecret?mode=tweet | [Twist](https://github.com/caronc/apprise/wiki/Notify_twist) | twist:// | (TCP) 443 | twist://pasword:login
twist://password:login/#channel
twist://password:login/#team:channel
twist://password:login/#team:channel1/channel2/#team3:channel -| [XBMC](https://github.com/caronc/apprise/wiki/Notify_xbmc) | xbmc:// or xbmcs:// | (TCP) 8080 or 443 | xbmc://hostname
xbmc://user@hostname
xbmc://user:password@hostname:port | [Webex Teams (Cisco)](https://github.com/caronc/apprise/wiki/Notify_wxteams) | wxteams:// | (TCP) 443 | wxteams://Token | [WeCom Bot](https://github.com/caronc/apprise/wiki/Notify_wecombot) | wecombot:// | (TCP) 443 | wecombot://BotKey -| [WhatsApp](https://github.com/caronc/apprise/wiki/Notify_whatsapp) | whatsapp:// | (TCP) 443 | whatsapp://AccessToken@FromPhoneID/ToPhoneNo
whatsapp://Template:AccessToken@FromPhoneID/ToPhoneNo +| [WhatsApp](https://github.com/caronc/apprise/wiki/Notify_whatsapp) | whatsapp:// | (TCP) 443 | whatsapp://AccessToken@FromPhoneID/ToPhoneNo
whatsapp://Template:AccessToken@FromPhoneID/ToPhoneNo +| [WxPusher](https://github.com/caronc/apprise/wiki/Notify_wxpusher) | wxpusher:// | (TCP) 443 | wxpusher://AppToken@UserID1/UserID2/UserIDN
wxpusher://AppToken@Topic1/Topic2/Topic3
wxpusher://AppToken@UserID1/Topic1/ +| [XBMC](https://github.com/caronc/apprise/wiki/Notify_xbmc) | xbmc:// or xbmcs:// | (TCP) 8080 or 443 | xbmc://hostname
xbmc://user@hostname
xbmc://user:password@hostname:port | [Zulip Chat](https://github.com/caronc/apprise/wiki/Notify_zulip) | zulip:// | (TCP) 443 | zulip://botname@Organization/Token
zulip://botname@Organization/Token/Stream
zulip://botname@Organization/Token/Email ## SMS Notifications | Notification Service | Service ID | Default Port | Example Syntax | | -------------------- | ---------- | ------------ | -------------- | +| [Africas Talking](https://github.com/caronc/apprise/wiki/Notify_africas_talking) | atalk:// | (TCP) 443 | atalk://AppUser@ApiKey/ToPhoneNo
atalk://AppUser@ApiKey/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Automated Packet Reporting System (ARPS)](https://github.com/caronc/apprise/wiki/Notify_aprs) | aprs:// | (TCP) 10152 | aprs://user:pass@callsign
aprs://user:pass@callsign1/callsign2/callsignN | [AWS SNS](https://github.com/caronc/apprise/wiki/Notify_sns) | sns:// | (TCP) 443 | sns://AccessKeyID/AccessSecretKey/RegionName/+PhoneNo
sns://AccessKeyID/AccessSecretKey/RegionName/+PhoneNo1/+PhoneNo2/+PhoneNoN
sns://AccessKeyID/AccessSecretKey/RegionName/Topic
sns://AccessKeyID/AccessSecretKey/RegionName/Topic1/Topic2/TopicN | [BulkSMS](https://github.com/caronc/apprise/wiki/Notify_bulksms) | bulksms:// | (TCP) 443 | bulksms://user:password@ToPhoneNo
bulksms://User:Password@ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ @@ -187,14 +191,15 @@ The table below identifies the services this tool supports and some example serv | [D7 Networks](https://github.com/caronc/apprise/wiki/Notify_d7networks) | d7sms:// | (TCP) 443 | d7sms://token@PhoneNo
d7sms://token@ToPhoneNo1/ToPhoneNo2/ToPhoneNoN | [DingTalk](https://github.com/caronc/apprise/wiki/Notify_dingtalk) | dingtalk:// | (TCP) 443 | dingtalk://token/
dingtalk://token/ToPhoneNo
dingtalk://token/ToPhoneNo1/ToPhoneNo2/ToPhoneNo1/ | [Free-Mobile](https://github.com/caronc/apprise/wiki/Notify_freemobile) | freemobile:// | (TCP) 443 | freemobile://user@password/ - [httpSMS](https://github.com/caronc/apprise/wiki/Notify_httpsms) | httpsms:// | (TCP) 443 | httpsms://ApiKey@FromPhoneNo
httpsms://ApiKey@FromPhoneNo/ToPhoneNo
httpsms://ApiKey@FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ +| [httpSMS](https://github.com/caronc/apprise/wiki/Notify_httpsms) | httpsms:// | (TCP) 443 | httpsms://ApiKey@FromPhoneNo
httpsms://ApiKey@FromPhoneNo/ToPhoneNo
httpsms://ApiKey@FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Kavenegar](https://github.com/caronc/apprise/wiki/Notify_kavenegar) | kavenegar:// | (TCP) 443 | kavenegar://ApiKey/ToPhoneNo
kavenegar://FromPhoneNo@ApiKey/ToPhoneNo
kavenegar://ApiKey/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN | [MessageBird](https://github.com/caronc/apprise/wiki/Notify_messagebird) | msgbird:// | (TCP) 443 | msgbird://ApiKey/FromPhoneNo
msgbird://ApiKey/FromPhoneNo/ToPhoneNo
msgbird://ApiKey/FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [MSG91](https://github.com/caronc/apprise/wiki/Notify_msg91) | msg91:// | (TCP) 443 | msg91://TemplateID@AuthKey/ToPhoneNo
msg91://TemplateID@AuthKey/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ +| [Société Française du Radiotéléphone (SFR)](https://github.com/caronc/apprise/wiki/Notify_sfr) | sfr:// | (TCP) 443 | sfr://user:password>@spaceId/ToPhoneNo
sfr://user:password>@spaceId/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Signal API](https://github.com/caronc/apprise/wiki/Notify_signal) | signal:// or signals:// | (TCP) 80 or 443 | signal://hostname:port/FromPhoneNo
signal://hostname:port/FromPhoneNo/ToPhoneNo
signal://hostname:port/FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Sinch](https://github.com/caronc/apprise/wiki/Notify_sinch) | sinch:// | (TCP) 443 | sinch://ServicePlanId:ApiToken@FromPhoneNo
sinch://ServicePlanId:ApiToken@FromPhoneNo/ToPhoneNo
sinch://ServicePlanId:ApiToken@FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/
sinch://ServicePlanId:ApiToken@ShortCode/ToPhoneNo
sinch://ServicePlanId:ApiToken@ShortCode/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [SMSEagle](https://github.com/caronc/apprise/wiki/Notify_smseagle) | smseagle:// or smseagles:// | (TCP) 80 or 443 | smseagles://hostname:port/ToPhoneNo
smseagles://hostname:port/@ToContact
smseagles://hostname:port/#ToGroup
smseagles://hostname:port/ToPhoneNo1/#ToGroup/@ToContact/ - [SMS Manager](https://github.com/caronc/apprise/wiki/Notify_sms_manager) | smsmgr:// | (TCP) 443 | smsmgr://ApiKey@ToPhoneNo
smsmgr://ApiKey@ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ +| [SMS Manager](https://github.com/caronc/apprise/wiki/Notify_sms_manager) | smsmgr:// | (TCP) 443 | smsmgr://ApiKey@ToPhoneNo
smsmgr://ApiKey@ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Threema Gateway](https://github.com/caronc/apprise/wiki/Notify_threema) | threema:// | (TCP) 443 | threema://GatewayID@secret/ToPhoneNo
threema://GatewayID@secret/ToEmail
threema://GatewayID@secret/ToThreemaID/
threema://GatewayID@secret/ToEmail/ToThreemaID/ToPhoneNo/... | [Twilio](https://github.com/caronc/apprise/wiki/Notify_twilio) | twilio:// | (TCP) 443 | twilio://AccountSid:AuthToken@FromPhoneNo
twilio://AccountSid:AuthToken@FromPhoneNo/ToPhoneNo
twilio://AccountSid:AuthToken@FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/
twilio://AccountSid:AuthToken@FromPhoneNo/ToPhoneNo?apikey=Key
twilio://AccountSid:AuthToken@ShortCode/ToPhoneNo
twilio://AccountSid:AuthToken@ShortCode/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Voipms](https://github.com/caronc/apprise/wiki/Notify_voipms) | voipms:// | (TCP) 443 | voipms://password:email/FromPhoneNo
voipms://password:email/FromPhoneNo/ToPhoneNo
voipms://password:email/FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ @@ -572,6 +577,123 @@ aobj.notify("test") You can read more about creating your own custom notifications and/or hooks [here](https://github.com/caronc/apprise/wiki/decorator_notify). +# Persistent Storage + +Persistent storage allows Apprise to cache re-occurring actions optionaly to disk. This can greatly reduce the overhead used to send a notification. + +There are 3 Persistent Storage operational states Apprise can operate using: +1. `auto`: Flush gathered cache information to the filesystem on demand. This option is incredibly light weight. This is the default behavior for all CLI usage. + * Developers who choose to use this operational mode can also force cached information manually if they choose. + * The CLI will use this operational mode by default. +1. `flush`: Flushes any cache information to the filesystem during every transaction. +1. `memory`: Effectively disable Persistent Storage. Any caching of data required by each plugin used is done in memory. Apprise effectively operates as it always did before peristent storage was available. This setting ensures no content is every written to disk. + * By default this is the mode Apprise will operate under for those developing with it unless they configure it to otherwise operate as `auto` or `flush`. This is done through the `AppriseAsset()` object and is explained further on in this documentation. + +## CLI Persistent Storage Commands + +You can provide the keyword `storage` on your CLI call to see the persistent storage options available to you. +```bash +# List all of the occupied space used by Apprise's Persistent Storage: +apprise storage list + +# list is the default option, so the following does the same thing: +apprise storage + +# You can prune all of your storage older then 30 days +# and not accessed for this period like so: +apprise storage prune + +# You can do a hard reset (and wipe all persistent storage) with: +apprise storage clean + +``` + +You can also filter your results by adding tags and/or URL Identifiers. When you get a listing (`apprise storage list`), you may see: +``` + # example output of 'apprise storage list': + 1. f7077a65 0.00B unused + - matrixs://abcdef:****@synapse.example12.com/%23general?image=no&mode=off&version=3&msgtype... + tags: team + + 2. 0e873a46 81.10B active + - tgram://W...U//?image=False&detect=yes&silent=no&preview=no&content=before&mdv=v1&format=m... + tags: personal + + 3. abcd123 12.00B stale + +``` +The (persistent storage) cache states are: + - `unused`: This plugin has not commited anything to disk for reuse/cache purposes + - `active`: This plugin has written content to disk. Or at the very least, it has prepared a persistent storage location it can write into. + - `stale`: The system detected a location where a URL may have possibly written to in the past, but there is nothing linking to it using the URLs provided. It is likely wasting space or is no longer of any use. + +You can use this information to filter your results by specifying _URL ID_ (UID) values after your command. For example: +```bash +# The below commands continue with the example already identified above +# the following would match abcd123 (even though just ab was provided) +# The output would only list the 'stale' entry above +apprise storage list ab + +# knowing our filter is safe, we could remove it +# the below command would not obstruct our other to URLs and would only +# remove our stale one: +apprise storage clean ab + +# Entries can be filtered by tag as well: +apprise storage list --tag=team + +# You can match on multiple URL ID's as well: +# The followin would actually match the URL ID's of 1. and .2 above +apprise storage list f 0 +``` +When using the CLI, Persistent storage is set to the operational mode of `auto` by default, you can change this by providing `--storage-mode=` (`-SM`) during your calls. If you want to ensure it's always set to a value of your choice. + +For more information on persistent storage, [visit here](https://github.com/caronc/apprise/wiki/persistent_storage). + +## API Persistent Storage Commands +For developers, persistent storage is set in the operational mode of `memory` by default. + +It's at the developers discretion to enable it (by switching it to either `auto` or `flush`). Should you choose to do so: it's as easy as including the information in the `AppriseAsset()` object prior to the initialization of your `Apprise()` instance. + +For example: +```python +from apprise import Apprise +from apprise import AppriseAsset +from apprise import PersistentStoreMode + +# Prepare a location the persistent storage can write it's cached content to. +# By setting this path, this immediately assumes you wish to operate the +# persistent storage in the operational 'auto' mode +asset = AppriseAsset(storage_path="/path/to/save/data") + +# If you want to be more explicit and set more options, then you may do the +# following +asset = AppriseAsset( + # Set our storage path directory (minimum requirement to enable it) + storage_path="/path/to/save/data", + + # Set the mode... the options are: + # 1. PersistentStoreMode.MEMORY + # - disable persistent storage from writing to disk + # 2. PersistentStoreMode.AUTO + # - write to disk on demand + # 3. PersistentStoreMode.FLUSH + # - write to disk always and often + storage_mode=PersistentStoreMode.FLUSH + + # The URL IDs are by default 8 characters in length. You can increase and + # decrease it's value here. The value must be > 2. The default value is 8 + # if not otherwise specified + storage_idlen=8, +) + +# Now that we've got our asset, we just work with our Apprise object as we +# normally do +aobj = Apprise(asset=asset) +``` + +For more information on persistent storage, [visit here](https://github.com/caronc/apprise/wiki/persistent_storage). + # Want To Learn More? If you're interested in reading more about this and other methods on how to customize your own notifications, please check out the following links: @@ -580,6 +702,7 @@ If you're interested in reading more about this and other methods on how to cust * 🔧 [Troubleshooting](https://github.com/caronc/apprise/wiki/Troubleshooting) * ⚙️ [Configuration File Help](https://github.com/caronc/apprise/wiki/config) * ⚡ [Create Your Own Custom Notifications](https://github.com/caronc/apprise/wiki/decorator_notify) +* 💾 [Persistent Storage](https://github.com/caronc/apprise/wiki/persistent_storage) * 🌎 [Apprise API/Web Interface](https://github.com/caronc/apprise-api) * 🎉 [Showcase](https://github.com/caronc/apprise/wiki/showcase) diff --git a/libs/apprise-1.9.0.dist-info/RECORD b/libs/apprise-1.9.0.dist-info/RECORD new file mode 100644 index 000000000..2a31ed0fb --- /dev/null +++ b/libs/apprise-1.9.0.dist-info/RECORD @@ -0,0 +1,191 @@ +../../bin/apprise,sha256=ZJ-e4qqxNLtdW_DAvpuPPX5iROIiQd8I6nvg7vtAv-g,233 +apprise-1.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +apprise-1.9.0.dist-info/LICENSE,sha256=gt7qKBxRhVcdmXCYVtrWP6DtYjD0DzONet600dkU994,1343 +apprise-1.9.0.dist-info/METADATA,sha256=UWcGYd35BH6HUvjk3YkguNH_-4qwmPA04q5zTL6OW3c,51747 +apprise-1.9.0.dist-info/RECORD,, +apprise-1.9.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise-1.9.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +apprise-1.9.0.dist-info/entry_points.txt,sha256=71YypBuNdjAKiaLsiMG40HEfLHxkU4Mi7o_S0s0d8wI,45 +apprise-1.9.0.dist-info/top_level.txt,sha256=JrCRn-_rXw5LMKXkIgMSE4E0t1Ks9TYrBH54Pflwjkk,8 +apprise/__init__.py,sha256=FnBwBB3Csp_wvdSC6dFs9SUEZKddewLe8PUYeBWxtWc,3887 +apprise/apprise.py,sha256=JWSqg5pYJOydubQyaIjR9gIPhb2okcrGe2mQ_NhPNS0,32837 +apprise/apprise.pyi,sha256=_4TBKvT-QVj3s6PuTh3YX-BbQMeJTdBGdVpubLMY4_k,2203 +apprise/apprise_attachment.py,sha256=h-JAC9_v076heEWmOH-qbqm_IvMJvQf8hOG9e8zMov4,12357 +apprise/apprise_attachment.pyi,sha256=R9-0dVqWpeaFrVpcREwPhGy3qHWztG5jEjYIOsbE5dM,1145 +apprise/apprise_config.py,sha256=qlNtd-OkldrY9rE9vT67fVPHINx9fkkbwQinhbBjQ_I,16896 +apprise/apprise_config.pyi,sha256=_mUlCnncqAq8sL01WxQTgZjnb2ic9kZXvtqZmVl-fc8,1568 +apprise/asset.py,sha256=Abk3Fe58CYrSSPPK5KaZp0-zz2jgUuDaBY9NK-6eL4E,14812 +apprise/asset.pyi,sha256=NYLXXYbScgRkspP27XGpRRM_uliPu1OCdWdZBPPvLng,979 +apprise/assets/NotifyXML-1.0.xsd,sha256=292qQ_IUl5EWDhPyzm9UTT0C2rVvJkyGar8jiODkJs8,986 +apprise/assets/NotifyXML-1.1.xsd,sha256=bjR3CGG4AEXoJjYkGCbDttKHSkPP1FlIWO02E7G59g4,1758 +apprise/assets/themes/default/apprise-failure-128x128.ico,sha256=Mt0ptfHJaN3Wsv5UCNDn9_3lyEDHxVDv1JdaDEI_xCA,67646 +apprise/assets/themes/default/apprise-failure-128x128.png,sha256=66ps8TDPxVH3g9PlObJqF-0x952CjnqQyN3zvpRcOT8,16135 +apprise/assets/themes/default/apprise-failure-256x256.png,sha256=bQBsKKCsKfR9EqgYOZrcVcVa5y8qG58PN2mEqO5eNRI,41931 +apprise/assets/themes/default/apprise-failure-32x32.png,sha256=vH0pZffIDCvkejpr3fJHGXW__8Yc3R_p0bacX6t6l18,2437 +apprise/assets/themes/default/apprise-failure-72x72.png,sha256=EP5A8DHRDr9srgupFSwOoyQ308bNJ8aL192J_L4K-ec,7600 +apprise/assets/themes/default/apprise-info-128x128.ico,sha256=F5_CirmXueRCRI5Z_Crf6TS6jVIXTJlRD83zw1oJ66g,67646 +apprise/assets/themes/default/apprise-info-128x128.png,sha256=bBqRZAgQey-gkmJrnFhPbzjILSrljE59mRkgj3raMQo,16671 +apprise/assets/themes/default/apprise-info-256x256.png,sha256=B5r_O4d9MHCmSWZwfbqQgZSp-ZetTdiBSwKcMTF1aFA,43331 +apprise/assets/themes/default/apprise-info-32x32.png,sha256=lt3NZ95TzkiCNVNlurrB2fE2nriMa1wftl7nrNXmb6c,2485 +apprise/assets/themes/default/apprise-info-72x72.png,sha256=kDnsZpqNUZGqs9t1ECUup7FOfXUIL-rupnQCYJp9So4,7875 +apprise/assets/themes/default/apprise-logo.png,sha256=85ttALudKkLmiqilJT7mUQLUXRFmM1AK89rnwLm313s,160907 +apprise/assets/themes/default/apprise-success-128x128.ico,sha256=uCopPwdQjxgfohKazHaDzYs9y4oiaOpL048PYC6WRlg,67646 +apprise/assets/themes/default/apprise-success-128x128.png,sha256=nvDuU_QqhGlw6cMtdj7Mv-gPgqCEx-0DaaXn1KBLVYg,17446 +apprise/assets/themes/default/apprise-success-256x256.png,sha256=vXfKuxY3n0eeXHKdb9hTxICxOEn7HjAQ4IZpX0HSLzc,48729 +apprise/assets/themes/default/apprise-success-32x32.png,sha256=Jg9pFJh3YPI-LiPBebyJ7Z4Vt7BRecaE8AsRjQVIkME,2471 +apprise/assets/themes/default/apprise-success-72x72.png,sha256=FQbgvIhqKOhEK0yvrhaSpai0R7hrkTt_-GaC2KUgCCk,7858 +apprise/assets/themes/default/apprise-warning-128x128.ico,sha256=6XaQPOx0oWK_xbhr4Yhb7qNazCWwSs9lk2SYR2MHTrQ,67646 +apprise/assets/themes/default/apprise-warning-128x128.png,sha256=pf5c4Ph7jWH7gf39dJoieSj8TzAsY3TXI-sGISGVIW4,16784 +apprise/assets/themes/default/apprise-warning-256x256.png,sha256=SY-xlaiXaj420iEYKC2_fJxU-yj2SuaQg6xfPNi83bw,43708 +apprise/assets/themes/default/apprise-warning-32x32.png,sha256=97R2ywNvcwczhBoWEIgajVtWjgT8fLs4FCCz4wu0dwc,2472 +apprise/assets/themes/default/apprise-warning-72x72.png,sha256=L8moEInkO_OLxoOcuvN7rmrGZo64iJeH20o-24MQghE,7913 +apprise/attachment/__init__.py,sha256=9jSiGEbLllS-0Vbpgxo4MCpZfIJ-saezWWgQ1PofZ9I,1678 +apprise/attachment/base.py,sha256=ndvbqEh-Q6y5A_MQFVXlofgjkpcl-iECcaVYwqEy5Sg,15912 +apprise/attachment/base.pyi,sha256=w0XG_QKauiMLJ7eQ4S57IiLIURZHm_Snw7l6-ih9GP8,961 +apprise/attachment/file.py,sha256=JGEMYXktKF9qBfomhJIDLdS_Tc-asbBlO2l7r-4E2hQ,4900 +apprise/attachment/http.py,sha256=o9341E3G8SZGQ1uDkN6Rto1WeKXHRibkraocOiUvm8Y,13758 +apprise/attachment/memory.py,sha256=TlDRGqoelOhaFkKW6bMDm8mw7gJLYMNHH4aDAL2MvHg,6999 +apprise/cli.py,sha256=VHR4r7IHa1RD9kWxv56pwnMieCXHw6IfpbgKM5u84NM,33471 +apprise/common.py,sha256=B_4Nwo8HejUDnqdeya6Vvn-y6pkFXBpeHJy9uejEujc,6524 +apprise/common.pyi,sha256=luF3QRiClDCk8Z23rI6FCGYsVmodOt_JYfYyzGogdNM,447 +apprise/config/__init__.py,sha256=oDxdoqG2NEYu_bbpLsLaM3L9WKY3gNn5gjIwb2h3LU4,1679 +apprise/config/base.py,sha256=iWgrBk4-wm_SHtNbe7dCQOYnbkI3oKWP_b60qwjGSoU,53173 +apprise/config/base.pyi,sha256=cngfobwH6v2vxYbQrObDi5Z-t5wcquWF-wR0kBCr3Eg,54 +apprise/config/file.py,sha256=Hir8MvTN-_5lMRnhaGM8jgIz9TDrjVYLLpycmwUbhIE,6240 +apprise/config/http.py,sha256=CjQtv_OQJykMxD4ssiwbFI3P8CeQiPdYV_ZIiL_XqMw,9440 +apprise/config/memory.py,sha256=8VICU-WLux8KnW6i9sf9fgmns90J-MfVYI3pvTiyTno,2816 +apprise/conversion.py,sha256=7q00QmrT0TCWu49j6TnPc0l_vfCIWCdDT3KiSq3SLJc,6350 +apprise/decorators/__init__.py,sha256=e_PDAm0kQNzwDPx-NJZLPfLMd2VAABvNZtxx_iDviRM,1487 +apprise/decorators/base.py,sha256=1yqJsHehHvTTsFnt4vmPDA8xYyoEfvt4L9uPgAROlBM,8110 +apprise/decorators/notify.py,sha256=FzIa7m-G5KnVVa__rjyn990zt2lqE8sdHW-XY79lbAU,5097 +apprise/emojis.py,sha256=ONF0t8dY9f2XlEkLUG79-ybKVAj2GqbPj2-Be97vAoI,87738 +apprise/exception.py,sha256=rOAfvCogjDOvCuRd5fKTTOtMLpj4wYfF6AAIdXJrdCE,2096 +apprise/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise/i18n/en/LC_MESSAGES/apprise.mo,sha256=H5qH3ZKbfyD_-2cS2sqK-ti35f-sQgZeNOkB14TngkM,3959 +apprise/locale.py,sha256=4uSr4Nj_rz6ISMMAfRVRk58wZVLKOofJgk2x0_E8NkQ,8994 +apprise/logger.py,sha256=131hqhed8cUj9x_mfXDEvwA2YbcYDFAYiWVK1HgxRVY,6921 +apprise/manager.py,sha256=vz-GARIhcnPT6FYDa3SrYnjPWOZ8WF01DckUMIYAKk8,27228 +apprise/manager_attachment.py,sha256=EkrcKtKjbxTXXyDaKyiu4XSfDu9wKFSdJD7TOTpyOUc,2200 +apprise/manager_config.py,sha256=sCIOlBTH13bQ1cuhQVpUq2vyKWBArA8YRyPnXIB1iWQ,2205 +apprise/manager_plugins.py,sha256=Xbg5-xr-06zMIDoWviz-zKcbzusHj0iBBMchKPpUOkg,2211 +apprise/persistent_store.py,sha256=kJ0XdcJC287NcvkYijVhuj45doAX5MNF658QfYK7LfI,56441 +apprise/plugins/__init__.py,sha256=Hm-vt-Xtxir5mgOdehqlGLhIlc45LA31zjqV42uRnB8,18701 +apprise/plugins/africas_talking.py,sha256=54mpTFY2C5d8Iv_iuqTuuhDcWiYt2dl6F8pFQwIj2hI,16072 +apprise/plugins/apprise_api.py,sha256=yMlBjBELVBgTTsnksu8s73xVHu0laqfyiSBuOrQM26M,16815 +apprise/plugins/aprs.py,sha256=7CAiHhSNsbVOJXn22Z7aFBDclI2jTvAsMex43oBQZgQ,25792 +apprise/plugins/bark.py,sha256=R-FR2H-S-FuOPSH1oHkLwv5pRBB-Ke7tfli1ATpgc9Y,16067 +apprise/plugins/base.py,sha256=ykZpvOrD-30JV6nFXlNvcM1yH2aWCCJYsu7Lw20dwNw,32778 +apprise/plugins/base.pyi,sha256=aKlZXRYUgG8lz_ZgGkYYJ_GKhuf18youTmMU-FlG7z8,21 +apprise/plugins/boxcar.py,sha256=rHN5ttKfZGniG0c7wjpv1m36PF6apoLG56NUxzB8nvY,13145 +apprise/plugins/bulksms.py,sha256=Um9YAmcXlZsJYkgfj_QbzdVZbokdXlO-Ig4tRKas9w0,16378 +apprise/plugins/bulkvs.py,sha256=gwFu1svKVZkHGDwZKbN8ZjtGnf3gt_WvMd2pnNC7JFc,13581 +apprise/plugins/burstsms.py,sha256=eIYvpkIR7MeTk3NkCa2Iid0ev5v00mLGgVXiXrTLsCw,15841 +apprise/plugins/chantify.py,sha256=NNGbUmA3NKOBwYVeDFJ-qBqwW2Sp_FaG2Pp6x3h_b40,6941 +apprise/plugins/clicksend.py,sha256=-dsuPploihlUQ5hWBQvr8XOXOQ0anWHE3ok_rFhJnY4,11703 +apprise/plugins/custom_form.py,sha256=BV1adXR5NMcB5JMuylUXYIiRqy2cm8P5kRoM86EGpXY,18443 +apprise/plugins/custom_json.py,sha256=9v9r8EEA6tPEt5sfLubpLNVbgFT1jkomT383monPeYA,14312 +apprise/plugins/custom_xml.py,sha256=ihl0uYOTYO9e80RashRj2lIiIYtjAb9PPywKNy4xOi8,17569 +apprise/plugins/d7networks.py,sha256=NRu1SyzOKwS_H0lujMjbpwTTpk9SaBCZjfoQ5VmfuPQ,15311 +apprise/plugins/dapnet.py,sha256=Eh-HPtc--7UP1XzUfvX1pl_yrL31Hw7WPbXcubWUzOU,13902 +apprise/plugins/dbus.py,sha256=5PBknIvhY90UjNgp3OUGPmheMnofRs0xTnyTGjLwzMU,14485 +apprise/plugins/dingtalk.py,sha256=dsoaMfnmSG8fJw7-q2tuWg1qmq-WvT_3bhRdkxFDlkU,12286 +apprise/plugins/discord.py,sha256=SUanqne3EhBGfBL967LYgjxEie9yT343Wihw8UKwijU,26359 +apprise/plugins/email.py,sha256=87rwjdxF_CRCkyvaJgXcEiGIgxNePtS7CluxcwIx5DU,40583 +apprise/plugins/emby.py,sha256=rhnO36Av_lyJWe7REsSIy-N8RLAITl5OxeiT9Jj3ATg,24421 +apprise/plugins/enigma2.py,sha256=s3cKfNUGVe7_IcRCvdPMZ4hv_A5g7dcOvW6-aKz6-dI,11931 +apprise/plugins/fcm/__init__.py,sha256=wyV1kQtRDCcjECXKr2tPyqcFiFa5OvqcRh1whartLu0,21964 +apprise/plugins/fcm/color.py,sha256=rQxVRL_CcRlgnNTQXkjB1Bfs0Xc933zOB1tURSdhi7Y,4585 +apprise/plugins/fcm/common.py,sha256=978uBUoNdtopCtylipGiKQdsQ8FTONxkFBp7uJMZHc8,1718 +apprise/plugins/fcm/oauth.py,sha256=Vvbd0-rd5BPIjAneG3rILU153JIzfSZ0kaDov6hm96M,11197 +apprise/plugins/fcm/priority.py,sha256=0WuRW1y1HVnybgjlTeCZPHzt7j8SwWnC7faNcjioAOc,8163 +apprise/plugins/feishu.py,sha256=qqoymGpe2LKdlO72IzaBChj39o7gVBRZTpBGjRSoJGQ,7534 +apprise/plugins/flock.py,sha256=aNpV1V1989rdpiA2NP3d2VHRr1-QKmOj40fUOxtcra4,13016 +apprise/plugins/freemobile.py,sha256=Wefq8No34MKfLewanvvOlREFZhjWFTcLxJDpD2_R7Eo,6974 +apprise/plugins/gnome.py,sha256=XJjVOu66HtslNQNzPODoL0iC14kvY5BaWGEnf9hAgoA,9221 +apprise/plugins/google_chat.py,sha256=pxVNeXbFVmsrKylUrsUXuwHaf5OX66Z4SHlUX1JPmhM,12967 +apprise/plugins/gotify.py,sha256=ocFzfk4yNt91bcgxivA-eQhvxIy2WhQksq6xXA3d87s,11022 +apprise/plugins/growl.py,sha256=3wupm2ELbtbnXTU9JVtw_zfTtYa2WbaYs9HKclsfeEk,14440 +apprise/plugins/guilded.py,sha256=lhE6gK7laQNYEubD9lBGRemFK-IHis_u2tNekbUoGgM,3707 +apprise/plugins/home_assistant.py,sha256=jC9W8ZKbRZPCAElsYbkvH9kyTV4cn28Kl12Q7m2RsnQ,11270 +apprise/plugins/httpsms.py,sha256=cLlqg1SNajYOF9uLcKHDYJJouGInjrMimYqJ8ZxBJ4Y,11418 +apprise/plugins/ifttt.py,sha256=WMQEvVXNQksAEk9B_F7xKE0cdNDMDVyAM4BMCCBP4MI,13698 +apprise/plugins/join.py,sha256=1sEKsW2H6n8kmLj1_hMoQiOV6nRMIYBybtJMddQMR7k,13850 +apprise/plugins/kavenegar.py,sha256=obx_J_AxdSEDB4_l8Zn4ipEioSA4_PVVLQK8mXQgyDk,12902 +apprise/plugins/kumulos.py,sha256=cAsZl6eqkm1_s-SMo7yjGLhpRUEwatUWp2raDZUj0LE,8499 +apprise/plugins/lametric.py,sha256=_vfV-EEImcegkdLRulYRk4AhFz5TXAGdE-oGwbuLks8,38481 +apprise/plugins/line.py,sha256=IlEQ6KDhbnIs0wki2BT2zEDyy0TxOZXBIEC19g1TzEs,10940 +apprise/plugins/lunasea.py,sha256=PegbhfspU19zuamH7rb_yIu3loE_XRANpiUmqQQN9K0,15133 +apprise/plugins/macosx.py,sha256=-lg52pquesSsWzZwe2w5QHnebEVDomvz9wEoDOgMIKQ,8433 +apprise/plugins/mailgun.py,sha256=qAOeiKUOdTCkiy64upBYpbCAPwgkc4hEGehthCI0BB0,25912 +apprise/plugins/mastodon.py,sha256=fEtgIDocAhOPyRhAy17O_lOw9uvGbbCWjGIvEHosQ30,35642 +apprise/plugins/matrix.py,sha256=EmBzADUkiSak_dEqrSEwYOHxQFQt-SnfpkrINUHLoOY,53198 +apprise/plugins/mattermost.py,sha256=7PJFRi8cWro-97zzFDiEPzdL7gzgJDpoXYjBrwAcJtg,13474 +apprise/plugins/messagebird.py,sha256=79FsQhwLlhokrWpUn6GdODmcmwS75Y53h8fmuywHljA,12530 +apprise/plugins/misskey.py,sha256=4kGrN_LA-3bytKyYYCENCxgyzsgQT2e4oh_IdFrJVYY,9959 +apprise/plugins/mqtt.py,sha256=4CO9cxuo4DE8i1yVVr2Z9HypPr9TZQopavrIoGo8F8I,20642 +apprise/plugins/msg91.py,sha256=yhuT9BQsp52p982ePlg_Hw3USUvijJIeK8Kw1BpaURg,12962 +apprise/plugins/msteams.py,sha256=SznuXuUSvW2uiSgexRoW1YSH5ocHuJwT5aQRWA_W0VQ,23687 +apprise/plugins/nextcloud.py,sha256=Z1F8FQzbCgJbsz1tT2jMVoVKoaBCz1Wz8QTETi8NhGE,13128 +apprise/plugins/nextcloudtalk.py,sha256=xVNihpeaAePlSjps1H950221OHCxeKd6JvGSxDTiIYA,11380 +apprise/plugins/notica.py,sha256=Gn8-y9dxx4yfMEG6Fj07b7-7ELNq8j3M6w6pIJ2I0_0,13394 +apprise/plugins/notifiarr.py,sha256=BVbJBLZLt3WYqMa59Oo5soA6gc66UzVjKZgmjs_eYL4,15529 +apprise/plugins/notifico.py,sha256=nmhRGymTvNlHScHy21yb_-cDt0Q9VU2wmYYR0n6ZEB0,12322 +apprise/plugins/ntfy.py,sha256=m4CtamCHXVcJYzNHZAha6F5eTMDZSnX5LkgMlt3qHPo,30226 +apprise/plugins/office365.py,sha256=VGPPBy9n_KVBDhfCswGYGQU9Swjr17VAPtStNCjxE2s,25531 +apprise/plugins/one_signal.py,sha256=FPsAhD2u3iognOgHkFVMg0Hads6Ff4HiCX5f8iKLaKs,22618 +apprise/plugins/opsgenie.py,sha256=o10KCij84XHH2qT_m_q3mb8631C6f4NbIOn9knVZx9Q,28479 +apprise/plugins/pagerduty.py,sha256=GzsSgOWhwwSIhBwai5BrNuMle-vhTkBbEJsbWHgB68Q,18209 +apprise/plugins/pagertree.py,sha256=mvw2QOtZjVQkL_5HjJ8PRp5x7BYRnQDty_juxSXUbow,14123 +apprise/plugins/parseplatform.py,sha256=5uBBqvTrIhR5VvfJh6oxeAvhOLVT0zWZWrOPr3fOhJQ,10703 +apprise/plugins/popcorn_notify.py,sha256=Fa4gfJe4BR0t2_jBzlfrN0_ei14Ircp2-dY4DSI36yc,10856 +apprise/plugins/prowl.py,sha256=7_YuEFN18ivXU4Votl1ccTyqcA6aom13a1n88ad9QA4,10069 +apprise/plugins/pushbullet.py,sha256=lLFBkP_GzcxxzF_kigqZLK7KNJSLHSUCc0zXWEL-AUA,15727 +apprise/plugins/pushdeer.py,sha256=oQxwCXq30V2ny-8JgdG-tl_FyKl6G1ZViQ1iyzhDfaA,7284 +apprise/plugins/pushed.py,sha256=9V3NbVLV9CGs2bdFsy18PxRAOsLzlCI0IXbslHDzkcg,12553 +apprise/plugins/pushjet.py,sha256=tOmOB8VsRrb_2DoBM2kBFeX1A5x-KUUE3FisUugLyTg,9338 +apprise/plugins/pushme.py,sha256=A7GsoPglvLRoxt-yyUpv7Lyf8O3tFwgecgT6t1FOK7Q,7402 +apprise/plugins/pushover.py,sha256=th9yBrL-6hvqCMdCdi-Zxb_imwAciQvQqGVndHQH0Wo,21490 +apprise/plugins/pushsafer.py,sha256=qpz5DGvRyDeO1keOhFRDANuR07DibUMsCn_JaTqSbx0,27179 +apprise/plugins/pushy.py,sha256=FyqqsB_AFpIuw7JXmZejZ7CgMP7ozEe0EEtdOmfX_tQ,12765 +apprise/plugins/reddit.py,sha256=3286wpB7nMnNwvOMD3TWRJFKX9tIkPTZ8qHgqboUt5M,26134 +apprise/plugins/revolt.py,sha256=T8NTXYzMOim0ekrcu1Wb7YLx58z96KDCzQipfOUNSCQ,14772 +apprise/plugins/rocketchat.py,sha256=6AkdQao3ONh-TPB7l6xP5dLdKdI9Hux7wZK-jHEYd3E,26306 +apprise/plugins/rsyslog.py,sha256=YXd-A4apTnQRM573HZwJayeLS3Ab6qm_AFie-tQ0zPo,12358 +apprise/plugins/ryver.py,sha256=n7c6RRgJ7gfmDy6CZHBZO1pcCbNoFXN5NoVyrHyGszg,12110 +apprise/plugins/sendgrid.py,sha256=j-gGkm27XXMUUpaYCqCgbCamJtd67SWzkYDC2gUSyaQ,18119 +apprise/plugins/serverchan.py,sha256=Ac4syJAZvbo_doWqWu_qfkNbCvTLecyh2nN4JI_noxw,6048 +apprise/plugins/ses.py,sha256=Ph8lotJ3u8s9vgKs1z72JxJnGlZsUmpAJ8gh7wt8SwM,34064 +apprise/plugins/sfr.py,sha256=AlS8Y8kO0LLHNcYHdMsm1Ut_KBs78B0ujwHp1m1EbCQ,15205 +apprise/plugins/signal_api.py,sha256=P0LFhoXzize9HpPmJS-YR54RlOKA-LtXPSvS8CcuyXs,17093 +apprise/plugins/simplepush.py,sha256=Tlu_VkrtGe5Y9tLY3vYyqDBb5oRnk4DmFLtAij-RVko,11167 +apprise/plugins/sinch.py,sha256=LuVfVnp3oqgdwJ6lRWGQUNAd0hIiviPCUlaXqC8A6uk,17185 +apprise/plugins/slack.py,sha256=E8yvU9qmTujmy55RKPXFjef7BaY_UcVQs0uRt-emLqs,44348 +apprise/plugins/smseagle.py,sha256=uFnDCyp54anQ5s1dT9GJS0wtdGKny9C1tY6qfkUniv0,24527 +apprise/plugins/smsmanager.py,sha256=Fe1rGmJSZ4WZqj6rMjX0HaUf2Q_cysK2_Gl3QonX9CU,14397 +apprise/plugins/smtp2go.py,sha256=TIHuIlblj4IwwIA2v_DhyiULnvlzPoHlozPofhivTao,20028 +apprise/plugins/sns.py,sha256=zkx6fzpTTQWiIR2vlgLPEOsdJ4DFumBP-u_Ui5H1oM0,24520 +apprise/plugins/sparkpost.py,sha256=20ox2JFUFRvvHn5_k7KAvREGTYzSGjoJnLwTAVCOA_Y,28157 +apprise/plugins/splunk.py,sha256=Tp0KTEJCYhwtYCVmbsVdeJdlJCuRtnCPokJSDEvS3vg,16601 +apprise/plugins/streamlabs.py,sha256=dAfw9Jjvv1wH9ixRGqUAQ0wcIVxUVoU99k0fcEa_YRI,16300 +apprise/plugins/synology.py,sha256=VLoZU-UZnO2wxIbsc9UhN34zJ7H7ZRmjrcm_xTZsx2Q,11525 +apprise/plugins/syslog.py,sha256=oNMs_iOtYn6s5eApfV6I7CBGJ7AX1PSedQsfLV-3he0,10779 +apprise/plugins/techuluspush.py,sha256=Ogl9gOk49Gf37NFXX7GifQukUxZnXycL_LJxTEvCNhI,7522 +apprise/plugins/telegram.py,sha256=dAn4GKSzY8iegDN4JYRW8XNv-qh2n4k1MWLC_u1Olu8,38519 +apprise/plugins/threema.py,sha256=bv9jsyOZcYbwRjxL9EdpKriH953UHcwc_0GhT3TLUYc,12161 +apprise/plugins/twilio.py,sha256=xa5PnVtPUDRSwCDTVw699T8WKqOik3ij_OMA3Yp9b64,18500 +apprise/plugins/twist.py,sha256=gZPuB02SoTeEL7I7tOwooHdUrGYQi6Qea_MINpDu3R4,29210 +apprise/plugins/twitter.py,sha256=eca8Fj1K7O-zXXGgfyRviHkG7wCP4F2Oz89oIlxx7WE,30644 +apprise/plugins/voipms.py,sha256=lSglAyzyEUQPsNne9MbmyPqzmfD1uq5xnprFjY6ctw4,12871 +apprise/plugins/vonage.py,sha256=KR6Mm4nPCcsuCXsGfpo3AYoEpm7aPpSbNoRTk9f70rE,13712 +apprise/plugins/webexteams.py,sha256=tWRGiX3jS-AhnyrU2-PBg_oWN59JRJ4V9kXbgJoHJJU,9435 +apprise/plugins/wecombot.py,sha256=0_hza9urwnFXBE85Zd-KOyrhg-g1aH8JBh_29KcoVbI,9055 +apprise/plugins/whatsapp.py,sha256=VkDOQDeW9Kfm5rD5sovLNT9FFv9rcWlM0ZKxQ7Qa2ww,20212 +apprise/plugins/windows.py,sha256=RemtHy0jnhHFx8zvFcZsXYTJ7MKN8PAPCn4h9IEEu3Y,8725 +apprise/plugins/workflows.py,sha256=T8sImroqDcAXELG138Sf6gUfBz-5jK54ARFF4OkqiDg,19872 +apprise/plugins/wxpusher.py,sha256=DBgdXqGZMALh4fgvHKvTlGYoexHh6hcrCOWBulw8_Bw,12701 +apprise/plugins/xbmc.py,sha256=cSLPG5RPQUID7SvOKo0nkF8XP1MUFFyZguvE97z6nCw,12736 +apprise/plugins/zulip.py,sha256=3wZAeFb1B1Q60uIgcMIBIEX8kUuvCY2QCfYYqF_PQ2A,14305 +apprise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise/url.py,sha256=KVvUUkJe3ugNfo9tJRjWu4PX7wmytbU3n1JvA6anV5s,35085 +apprise/url.pyi,sha256=WLaRREH7FzZ5x3-qkDkupojWGFC4uFwJ1EDt02lVs8c,520 +apprise/utils.py,sha256=2FghO1ETBWjvjqOBSmBPI2FPLa6vNv7FUS636QORoMs,58581 diff --git a/libs/alembic-1.13.1.dist-info/REQUESTED b/libs/apprise-1.9.0.dist-info/REQUESTED similarity index 100% rename from libs/alembic-1.13.1.dist-info/REQUESTED rename to libs/apprise-1.9.0.dist-info/REQUESTED diff --git a/libs/Jinja2-3.1.3.dist-info/WHEEL b/libs/apprise-1.9.0.dist-info/WHEEL similarity index 100% rename from libs/Jinja2-3.1.3.dist-info/WHEEL rename to libs/apprise-1.9.0.dist-info/WHEEL diff --git a/libs/apprise-1.7.6.dist-info/entry_points.txt b/libs/apprise-1.9.0.dist-info/entry_points.txt similarity index 100% rename from libs/apprise-1.7.6.dist-info/entry_points.txt rename to libs/apprise-1.9.0.dist-info/entry_points.txt diff --git a/libs/apprise-1.7.6.dist-info/top_level.txt b/libs/apprise-1.9.0.dist-info/top_level.txt similarity index 100% rename from libs/apprise-1.7.6.dist-info/top_level.txt rename to libs/apprise-1.9.0.dist-info/top_level.txt diff --git a/libs/apprise/Apprise.py b/libs/apprise/Apprise.py index 9a3e8dfc7..05a2ee3cc 100644 --- a/libs/apprise/Apprise.py +++ b/libs/apprise/Apprise.py @@ -33,18 +33,18 @@ from . import common from .conversion import convert_between from .utils import is_exclusive_match -from .NotificationManager import NotificationManager +from .manager_plugins import NotificationManager from .utils import parse_list from .utils import parse_urls from .utils import cwe312_url from .emojis import apply_emojis from .logger import logger -from .AppriseAsset import AppriseAsset -from .AppriseConfig import AppriseConfig -from .AppriseAttachment import AppriseAttachment -from .AppriseLocale import AppriseLocale -from .config.ConfigBase import ConfigBase -from .plugins.NotifyBase import NotifyBase +from .asset import AppriseAsset +from .apprise_config import AppriseConfig +from .apprise_attachment import AppriseAttachment +from .locale import AppriseLocale +from .config.base import ConfigBase +from .plugins.base import NotifyBase from . import plugins from . import __version__ diff --git a/libs/apprise/__init__.py b/libs/apprise/__init__.py index 81373c75b..6feaffbae 100644 --- a/libs/apprise/__init__.py +++ b/libs/apprise/__init__.py @@ -27,7 +27,7 @@ # POSSIBILITY OF SUCH DAMAGE. __title__ = 'Apprise' -__version__ = '1.7.6' +__version__ = '1.9.0' __author__ = 'Chris Caron' __license__ = 'BSD' __copywrite__ = 'Copyright (C) 2024 Chris Caron ' @@ -48,18 +48,25 @@ from .common import CONTENT_INCLUDE_MODES from .common import ContentLocation from .common import CONTENT_LOCATIONS +from .common import PersistentStoreMode +from .common import PERSISTENT_STORE_MODES -from .URLBase import URLBase -from .URLBase import PrivacyMode -from .plugins.NotifyBase import NotifyBase -from .config.ConfigBase import ConfigBase -from .attachment.AttachBase import AttachBase - -from .Apprise import Apprise -from .AppriseAsset import AppriseAsset -from .AppriseConfig import AppriseConfig -from .AppriseAttachment import AppriseAttachment +from .url import URLBase +from .url import PrivacyMode +from .plugins.base import NotifyBase +from .config.base import ConfigBase +from .attachment.base import AttachBase +from . import exception +from .apprise import Apprise +from .locale import AppriseLocale +from .asset import AppriseAsset +from .persistent_store import PersistentStore +from .apprise_config import AppriseConfig +from .apprise_attachment import AppriseAttachment +from .manager_attachment import AttachmentManager +from .manager_config import ConfigurationManager +from .manager_plugins import NotificationManager from . import decorators # Inherit our logging with our additional entries added to it @@ -73,7 +80,11 @@ __all__ = [ # Core 'Apprise', 'AppriseAsset', 'AppriseConfig', 'AppriseAttachment', 'URLBase', - 'NotifyBase', 'ConfigBase', 'AttachBase', + 'NotifyBase', 'ConfigBase', 'AttachBase', 'AppriseLocale', + 'PersistentStore', + + # Exceptions + 'exception', # Reference 'NotifyType', 'NotifyImageSize', 'NotifyFormat', 'OverflowMode', @@ -81,8 +92,12 @@ 'ConfigFormat', 'CONFIG_FORMATS', 'ContentIncludeMode', 'CONTENT_INCLUDE_MODES', 'ContentLocation', 'CONTENT_LOCATIONS', + 'PersistentStoreMode', 'PERSISTENT_STORE_MODES', 'PrivacyMode', + # Managers + 'NotificationManager', 'ConfigurationManager', 'AttachmentManager', + # Decorator 'decorators', diff --git a/libs/apprise/apprise.py b/libs/apprise/apprise.py new file mode 100644 index 000000000..05a2ee3cc --- /dev/null +++ b/libs/apprise/apprise.py @@ -0,0 +1,887 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron +# +# 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. +# +# 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. + +import asyncio +import concurrent.futures as cf +import os +from itertools import chain +from . import common +from .conversion import convert_between +from .utils import is_exclusive_match +from .manager_plugins import NotificationManager +from .utils import parse_list +from .utils import parse_urls +from .utils import cwe312_url +from .emojis import apply_emojis +from .logger import logger +from .asset import AppriseAsset +from .apprise_config import AppriseConfig +from .apprise_attachment import AppriseAttachment +from .locale import AppriseLocale +from .config.base import ConfigBase +from .plugins.base import NotifyBase + +from . import plugins +from . import __version__ + +# Grant access to our Notification Manager Singleton +N_MGR = NotificationManager() + + +class Apprise: + """ + Our Notification Manager + + """ + + def __init__(self, servers=None, asset=None, location=None, debug=False): + """ + Loads a set of server urls while applying the Asset() module to each + if specified. + + If no asset is provided, then the default asset is used. + + Optionally specify a global ContentLocation for a more strict means + of handling Attachments. + """ + + # Initialize a server list of URLs + self.servers = list() + + # Assigns an central asset object that will be later passed into each + # notification plugin. Assets contain information such as the local + # directory images can be found in. It can also identify remote + # URL paths that contain the images you want to present to the end + # user. If no asset is specified, then the default one is used. + self.asset = \ + asset if isinstance(asset, AppriseAsset) else AppriseAsset() + + if servers: + self.add(servers) + + # Initialize our locale object + self.locale = AppriseLocale() + + # Set our debug flag + self.debug = debug + + # Store our hosting location for optional strict rule handling + # of Attachments. Setting this to None removes any attachment + # restrictions. + self.location = location + + @staticmethod + def instantiate(url, asset=None, tag=None, suppress_exceptions=True): + """ + Returns the instance of a instantiated plugin based on the provided + Server URL. If the url fails to be parsed, then None is returned. + + The specified url can be either a string (the URL itself) or a + dictionary containing all of the components needed to istantiate + the notification service. If identifying a dictionary, at the bare + minimum, one must specify the schema. + + An example of a url dictionary object might look like: + { + schema: 'mailto', + host: 'google.com', + user: 'myuser', + password: 'mypassword', + } + + Alternatively the string is much easier to specify: + mailto://user:mypassword@google.com + + The dictionary works well for people who are calling details() to + extract the components they need to build the URL manually. + """ + + # Initialize our result set + results = None + + # Prepare our Asset Object + asset = asset if isinstance(asset, AppriseAsset) else AppriseAsset() + + if isinstance(url, str): + # Acquire our url tokens + results = plugins.url_to_dict( + url, secure_logging=asset.secure_logging) + + if results is None: + # Failed to parse the server URL; detailed logging handled + # inside url_to_dict - nothing to report here. + return None + + elif isinstance(url, dict): + # We already have our result set + results = url + + if results.get('schema') not in N_MGR: + # schema is a mandatory dictionary item as it is the only way + # we can index into our loaded plugins + logger.error('Dictionary does not include a "schema" entry.') + logger.trace( + 'Invalid dictionary unpacked as:{}{}'.format( + os.linesep, os.linesep.join( + ['{}="{}"'.format(k, v) + for k, v in results.items()]))) + return None + + logger.trace( + 'Dictionary unpacked as:{}{}'.format( + os.linesep, os.linesep.join( + ['{}="{}"'.format(k, v) for k, v in results.items()]))) + + # Otherwise we handle the invalid input specified + else: + logger.error( + 'An invalid URL type (%s) was specified for instantiation', + type(url)) + return None + + if not N_MGR[results['schema']].enabled: + # + # First Plugin Enable Check (Pre Initialization) + # + + # Plugin has been disabled at a global level + logger.error( + '%s:// is disabled on this system.', results['schema']) + return None + + # Build a list of tags to associate with the newly added notifications + results['tag'] = set(parse_list(tag)) + + # Set our Asset Object + results['asset'] = asset + + if suppress_exceptions: + try: + # Attempt to create an instance of our plugin using the parsed + # URL information + plugin = N_MGR[results['schema']](**results) + + # Create log entry of loaded URL + logger.debug( + 'Loaded {} URL: {}'.format( + N_MGR[results['schema']].service_name, + plugin.url(privacy=asset.secure_logging))) + + except Exception: + # CWE-312 (Secure Logging) Handling + loggable_url = url if not asset.secure_logging \ + else cwe312_url(url) + + # the arguments are invalid or can not be used. + logger.error( + 'Could not load {} URL: {}'.format( + N_MGR[results['schema']].service_name, + loggable_url)) + return None + + else: + # Attempt to create an instance of our plugin using the parsed + # URL information but don't wrap it in a try catch + plugin = N_MGR[results['schema']](**results) + + if not plugin.enabled: + # + # Second Plugin Enable Check (Post Initialization) + # + + # Service/Plugin is disabled (on a more local level). This is a + # case where the plugin was initially enabled but then after the + # __init__() was called under the hood something pre-determined + # that it could no longer be used. + + # The only downside to doing it this way is services are + # initialized prior to returning the details() if 3rd party tools + # are polling what is available. These services that become + # disabled thereafter are shown initially that they can be used. + logger.error( + '%s:// has become disabled on this system.', results['schema']) + return None + + return plugin + + def add(self, servers, asset=None, tag=None): + """ + Adds one or more server URLs into our list. + + You can override the global asset if you wish by including it with the + server(s) that you add. + + The tag allows you to associate 1 or more tag values to the server(s) + being added. tagging a service allows you to exclusively access them + when calling the notify() function. + """ + + # Initialize our return status + return_status = True + + if asset is None: + # prepare default asset + asset = self.asset + + if isinstance(servers, str): + # build our server list + servers = parse_urls(servers) + if len(servers) == 0: + return False + + elif isinstance(servers, dict): + # no problem, we support kwargs, convert it to a list + servers = [servers] + + elif isinstance(servers, (ConfigBase, NotifyBase, AppriseConfig)): + # Go ahead and just add our plugin into our list + self.servers.append(servers) + return True + + elif not isinstance(servers, (tuple, set, list)): + logger.error( + "An invalid notification (type={}) was specified.".format( + type(servers))) + return False + + for _server in servers: + + if isinstance(_server, (ConfigBase, NotifyBase, AppriseConfig)): + # Go ahead and just add our plugin into our list + self.servers.append(_server) + continue + + elif not isinstance(_server, (str, dict)): + logger.error( + "An invalid notification (type={}) was specified.".format( + type(_server))) + return_status = False + continue + + # Instantiate ourselves an object, this function throws or + # returns None if it fails + instance = Apprise.instantiate(_server, asset=asset, tag=tag) + if not isinstance(instance, NotifyBase): + # No logging is required as instantiate() handles failure + # and/or success reasons for us + return_status = False + continue + + # Add our initialized plugin to our server listings + self.servers.append(instance) + + # Return our status + return return_status + + def clear(self): + """ + Empties our server list + + """ + self.servers[:] = [] + + def find(self, tag=common.MATCH_ALL_TAG, match_always=True): + """ + Returns a list of all servers matching against the tag specified. + + """ + + # Build our tag setup + # - top level entries are treated as an 'or' + # - second level (or more) entries are treated as 'and' + # + # examples: + # tag="tagA, tagB" = tagA or tagB + # tag=['tagA', 'tagB'] = tagA or tagB + # tag=[('tagA', 'tagC'), 'tagB'] = (tagA and tagC) or tagB + # tag=[('tagB', 'tagC')] = tagB and tagC + + # A match_always flag allows us to pick up on our 'any' keyword + # and notify these services under all circumstances + match_always = common.MATCH_ALWAYS_TAG if match_always else None + + # Iterate over our loaded plugins + for entry in self.servers: + + if isinstance(entry, (ConfigBase, AppriseConfig)): + # load our servers + servers = entry.servers() + + else: + servers = [entry, ] + + for server in servers: + # Apply our tag matching based on our defined logic + if is_exclusive_match( + logic=tag, data=server.tags, + match_all=common.MATCH_ALL_TAG, + match_always=match_always): + yield server + return + + def notify(self, body, title='', notify_type=common.NotifyType.INFO, + body_format=None, tag=common.MATCH_ALL_TAG, match_always=True, + attach=None, interpret_escapes=None): + """ + Send a notification to all the plugins previously loaded. + + If the body_format specified is NotifyFormat.MARKDOWN, it will + be converted to HTML if the Notification type expects this. + + if the tag is specified (either a string or a set/list/tuple + of strings), then only the notifications flagged with that + tagged value are notified. By default, all added services + are notified (tag=MATCH_ALL_TAG) + + This function returns True if all notifications were successfully + sent, False if even just one of them fails, and None if no + notifications were sent at all as a result of tag filtering and/or + simply having empty configuration files that were read. + + Attach can contain a list of attachment URLs. attach can also be + represented by an AttachBase() (or list of) object(s). This + identifies the products you wish to notify + + Set interpret_escapes to True if you want to pre-escape a string + such as turning a \n into an actual new line, etc. + """ + + try: + # Process arguments and build synchronous and asynchronous calls + # (this step can throw internal errors). + sequential_calls, parallel_calls = self._create_notify_calls( + body, title, + notify_type=notify_type, body_format=body_format, + tag=tag, match_always=match_always, attach=attach, + interpret_escapes=interpret_escapes, + ) + + except TypeError: + # No notifications sent, and there was an internal error. + return False + + if not sequential_calls and not parallel_calls: + # Nothing to send + return None + + sequential_result = Apprise._notify_sequential(*sequential_calls) + parallel_result = Apprise._notify_parallel_threadpool(*parallel_calls) + return sequential_result and parallel_result + + async def async_notify(self, *args, **kwargs): + """ + Send a notification to all the plugins previously loaded, for + asynchronous callers. + + The arguments are identical to those of Apprise.notify(). + + """ + try: + # Process arguments and build synchronous and asynchronous calls + # (this step can throw internal errors). + sequential_calls, parallel_calls = self._create_notify_calls( + *args, **kwargs) + + except TypeError: + # No notifications sent, and there was an internal error. + return False + + if not sequential_calls and not parallel_calls: + # Nothing to send + return None + + sequential_result = Apprise._notify_sequential(*sequential_calls) + parallel_result = \ + await Apprise._notify_parallel_asyncio(*parallel_calls) + return sequential_result and parallel_result + + def _create_notify_calls(self, *args, **kwargs): + """ + Creates notifications for all the plugins loaded. + + Returns a list of (server, notify() kwargs) tuples for plugins with + parallelism disabled and another list for plugins with parallelism + enabled. + """ + + all_calls = list(self._create_notify_gen(*args, **kwargs)) + + # Split into sequential and parallel notify() calls. + sequential, parallel = [], [] + for (server, notify_kwargs) in all_calls: + if server.asset.async_mode: + parallel.append((server, notify_kwargs)) + else: + sequential.append((server, notify_kwargs)) + + return sequential, parallel + + def _create_notify_gen(self, body, title='', + notify_type=common.NotifyType.INFO, + body_format=None, tag=common.MATCH_ALL_TAG, + match_always=True, attach=None, + interpret_escapes=None): + """ + Internal generator function for _create_notify_calls(). + """ + + if len(self) == 0: + # Nothing to notify + msg = "There are no service(s) to notify" + logger.error(msg) + raise TypeError(msg) + + if not (title or body or attach): + msg = "No message content specified to deliver" + logger.error(msg) + raise TypeError(msg) + + try: + if title and isinstance(title, bytes): + title = title.decode(self.asset.encoding) + + if body and isinstance(body, bytes): + body = body.decode(self.asset.encoding) + + except UnicodeDecodeError: + msg = 'The content passed into Apprise was not of encoding ' \ + 'type: {}'.format(self.asset.encoding) + logger.error(msg) + raise TypeError(msg) + + # Tracks conversions + conversion_body_map = dict() + conversion_title_map = dict() + + # Prepare attachments if required + if attach is not None and not isinstance(attach, AppriseAttachment): + attach = AppriseAttachment( + attach, asset=self.asset, location=self.location) + + # Allow Asset default value + body_format = self.asset.body_format \ + if body_format is None else body_format + + # Allow Asset default value + interpret_escapes = self.asset.interpret_escapes \ + if interpret_escapes is None else interpret_escapes + + # Iterate over our loaded plugins + for server in self.find(tag, match_always=match_always): + # If our code reaches here, we either did not define a tag (it + # was set to None), or we did define a tag and the logic above + # determined we need to notify the service it's associated with + + # First we need to generate a key we will use to determine if we + # need to build our data out. Entries without are merged with + # the body at this stage. + key = server.notify_format if server.title_maxlen > 0\ + else f'_{server.notify_format}' + + if server.interpret_emojis: + # alter our key slightly to handle emojis since their value is + # pulled out of the notification + key += "-emojis" + + if key not in conversion_title_map: + + # Prepare our title + conversion_title_map[key] = '' if not title else title + + # Conversion of title only occurs for services where the title + # is blended with the body (title_maxlen <= 0) + if conversion_title_map[key] and server.title_maxlen <= 0: + conversion_title_map[key] = convert_between( + body_format, server.notify_format, + content=conversion_title_map[key]) + + # Our body is always converted no matter what + conversion_body_map[key] = \ + convert_between( + body_format, server.notify_format, content=body) + + if interpret_escapes: + # + # Escape our content + # + + try: + # Added overhead required due to Python 3 Encoding Bug + # identified here: https://bugs.python.org/issue21331 + conversion_body_map[key] = \ + conversion_body_map[key]\ + .encode('ascii', 'backslashreplace')\ + .decode('unicode-escape') + + conversion_title_map[key] = \ + conversion_title_map[key]\ + .encode('ascii', 'backslashreplace')\ + .decode('unicode-escape') + + except AttributeError: + # Must be of string type + msg = 'Failed to escape message body' + logger.error(msg) + raise TypeError(msg) + + if server.interpret_emojis: + # + # Convert our :emoji: definitions + # + + conversion_body_map[key] = \ + apply_emojis(conversion_body_map[key]) + conversion_title_map[key] = \ + apply_emojis(conversion_title_map[key]) + + kwargs = dict( + body=conversion_body_map[key], + title=conversion_title_map[key], + notify_type=notify_type, + attach=attach, + body_format=body_format + ) + yield (server, kwargs) + + @staticmethod + def _notify_sequential(*servers_kwargs): + """ + Process a list of notify() calls sequentially and synchronously. + """ + + success = True + + for (server, kwargs) in servers_kwargs: + try: + # Send notification + result = server.notify(**kwargs) + success = success and result + + except TypeError: + # These are our internally thrown notifications. + success = False + + except Exception: + # A catch all so we don't have to abort early + # just because one of our plugins has a bug in it. + logger.exception("Unhandled Notification Exception") + success = False + + return success + + @staticmethod + def _notify_parallel_threadpool(*servers_kwargs): + """ + Process a list of notify() calls in parallel and synchronously. + """ + + n_calls = len(servers_kwargs) + + # 0-length case + if n_calls == 0: + return True + + # There's no need to use a thread pool for just a single notification + if n_calls == 1: + return Apprise._notify_sequential(servers_kwargs[0]) + + # Create log entry + logger.info( + 'Notifying %d service(s) with threads.', len(servers_kwargs)) + + with cf.ThreadPoolExecutor() as executor: + success = True + futures = [executor.submit(server.notify, **kwargs) + for (server, kwargs) in servers_kwargs] + + for future in cf.as_completed(futures): + try: + result = future.result() + success = success and result + + except TypeError: + # These are our internally thrown notifications. + success = False + + except Exception: + # A catch all so we don't have to abort early + # just because one of our plugins has a bug in it. + logger.exception("Unhandled Notification Exception") + success = False + + return success + + @staticmethod + async def _notify_parallel_asyncio(*servers_kwargs): + """ + Process a list of async_notify() calls in parallel and asynchronously. + """ + + n_calls = len(servers_kwargs) + + # 0-length case + if n_calls == 0: + return True + + # (Unlike with the thread pool, we don't optimize for the single- + # notification case because asyncio can do useful work while waiting + # for that thread to complete) + + # Create log entry + logger.info( + 'Notifying %d service(s) asynchronously.', len(servers_kwargs)) + + async def do_call(server, kwargs): + return await server.async_notify(**kwargs) + + cors = (do_call(server, kwargs) for (server, kwargs) in servers_kwargs) + results = await asyncio.gather(*cors, return_exceptions=True) + + if any(isinstance(status, Exception) + and not isinstance(status, TypeError) for status in results): + # A catch all so we don't have to abort early just because + # one of our plugins has a bug in it. + logger.exception("Unhandled Notification Exception") + return False + + if any(isinstance(status, TypeError) for status in results): + # These are our internally thrown notifications. + return False + + return all(results) + + def details(self, lang=None, show_requirements=False, show_disabled=False): + """ + Returns the details associated with the Apprise object + + """ + + # general object returned + response = { + # Defines the current version of Apprise + 'version': __version__, + # Lists all of the currently supported Notifications + 'schemas': [], + # Includes the configured asset details + 'asset': self.asset.details(), + } + + for plugin in N_MGR.plugins(): + # Iterate over our hashed plugins and dynamically build details on + # their status: + + content = { + 'service_name': getattr(plugin, 'service_name', None), + 'service_url': getattr(plugin, 'service_url', None), + 'setup_url': getattr(plugin, 'setup_url', None), + # Placeholder - populated below + 'details': None, + + # Let upstream service know of the plugins that support + # attachments + 'attachment_support': getattr( + plugin, 'attachment_support', False), + + # Differentiat between what is a custom loaded plugin and + # which is native. + 'category': getattr(plugin, 'category', None) + } + + # Standard protocol(s) should be None or a tuple + enabled = getattr(plugin, 'enabled', True) + if not show_disabled and not enabled: + # Do not show inactive plugins + continue + + elif show_disabled: + # Add current state to response + content['enabled'] = enabled + + # Standard protocol(s) should be None or a tuple + protocols = getattr(plugin, 'protocol', None) + if isinstance(protocols, str): + protocols = (protocols, ) + + # Secure protocol(s) should be None or a tuple + secure_protocols = getattr(plugin, 'secure_protocol', None) + if isinstance(secure_protocols, str): + secure_protocols = (secure_protocols, ) + + # Add our protocol details to our content + content.update({ + 'protocols': protocols, + 'secure_protocols': secure_protocols, + }) + + if not lang: + # Simply return our results + content['details'] = plugins.details(plugin) + if show_requirements: + content['requirements'] = plugins.requirements(plugin) + + else: + # Emulate the specified language when returning our results + with self.locale.lang_at(lang): + content['details'] = plugins.details(plugin) + if show_requirements: + content['requirements'] = plugins.requirements(plugin) + + # Build our response object + response['schemas'].append(content) + + return response + + def urls(self, privacy=False): + """ + Returns all of the loaded URLs defined in this apprise object. + """ + return [x.url(privacy=privacy) for x in self.servers] + + def pop(self, index): + """ + Removes an indexed Notification Service from the stack and returns it. + + The thing is we can never pop AppriseConfig() entries, only what was + loaded within them. So pop needs to carefully iterate over our list + and only track actual entries. + """ + + # Tracking variables + prev_offset = -1 + offset = prev_offset + + for idx, s in enumerate(self.servers): + if isinstance(s, (ConfigBase, AppriseConfig)): + servers = s.servers() + if len(servers) > 0: + # Acquire a new maximum offset to work with + offset = prev_offset + len(servers) + + if offset >= index: + # we can pop an element from our config stack + fn = s.pop if isinstance(s, ConfigBase) \ + else s.server_pop + + return fn(index if prev_offset == -1 + else (index - prev_offset - 1)) + + else: + offset = prev_offset + 1 + if offset == index: + return self.servers.pop(idx) + + # Update our old offset + prev_offset = offset + + # If we reach here, then we indexed out of range + raise IndexError('list index out of range') + + def __getitem__(self, index): + """ + Returns the indexed server entry of a loaded notification server + """ + # Tracking variables + prev_offset = -1 + offset = prev_offset + + for idx, s in enumerate(self.servers): + if isinstance(s, (ConfigBase, AppriseConfig)): + # Get our list of servers associate with our config object + servers = s.servers() + if len(servers) > 0: + # Acquire a new maximum offset to work with + offset = prev_offset + len(servers) + + if offset >= index: + return servers[index if prev_offset == -1 + else (index - prev_offset - 1)] + + else: + offset = prev_offset + 1 + if offset == index: + return self.servers[idx] + + # Update our old offset + prev_offset = offset + + # If we reach here, then we indexed out of range + raise IndexError('list index out of range') + + def __getstate__(self): + """ + Pickle Support dumps() + """ + attributes = { + 'asset': self.asset, + # Prepare our URL list as we need to extract the associated tags + # and asset details associated with it + 'urls': [{ + 'url': server.url(privacy=False), + 'tag': server.tags if server.tags else None, + 'asset': server.asset} for server in self.servers], + 'locale': self.locale, + 'debug': self.debug, + 'location': self.location, + } + + return attributes + + def __setstate__(self, state): + """ + Pickle Support loads() + """ + self.servers = list() + self.asset = state['asset'] + self.locale = state['locale'] + self.location = state['location'] + for entry in state['urls']: + self.add(entry['url'], asset=entry['asset'], tag=entry['tag']) + + def __bool__(self): + """ + Allows the Apprise object to be wrapped in an 'if statement'. + True is returned if at least one service has been loaded. + """ + return len(self) > 0 + + def __iter__(self): + """ + Returns an iterator to each of our servers loaded. This includes those + found inside configuration. + """ + return chain(*[[s] if not isinstance(s, (ConfigBase, AppriseConfig)) + else iter(s.servers()) for s in self.servers]) + + def __len__(self): + """ + Returns the number of servers loaded; this includes those found within + loaded configuration. This funtion nnever actually counts the + Config entry themselves (if they exist), only what they contain. + """ + return sum([1 if not isinstance(s, (ConfigBase, AppriseConfig)) + else len(s.servers()) for s in self.servers]) diff --git a/libs/apprise/apprise.pyi b/libs/apprise/apprise.pyi new file mode 100644 index 000000000..5a34c9c65 --- /dev/null +++ b/libs/apprise/apprise.pyi @@ -0,0 +1,62 @@ +from typing import Any, Dict, List, Iterable, Iterator, Optional + +from . import (AppriseAsset, AppriseAttachment, AppriseConfig, ConfigBase, + NotifyBase, NotifyFormat, NotifyType) +from .common import ContentLocation + +_Server = Union[str, ConfigBase, NotifyBase, AppriseConfig] +_Servers = Union[_Server, Dict[Any, _Server], Iterable[_Server]] +# Can't define this recursively as mypy doesn't support recursive types: +# https://github.com/python/mypy/issues/731 +_Tag = Union[str, Iterable[Union[str, Iterable[str]]]] + +class Apprise: + def __init__( + self, + servers: _Servers = ..., + asset: Optional[AppriseAsset] = ..., + location: Optional[ContentLocation] = ..., + debug: bool = ... + ) -> None: ... + @staticmethod + def instantiate( + url: Union[str, Dict[str, NotifyBase]], + asset: Optional[AppriseAsset] = ..., + tag: Optional[_Tag] = ..., + suppress_exceptions: bool = ... + ) -> NotifyBase: ... + def add( + self, + servers: _Servers = ..., + asset: Optional[AppriseAsset] = ..., + tag: Optional[_Tag] = ... + ) -> bool: ... + def clear(self) -> None: ... + def find(self, tag: str = ...) -> Iterator[Apprise]: ... + def notify( + self, + body: str, + title: str = ..., + notify_type: NotifyType = ..., + body_format: NotifyFormat = ..., + tag: _Tag = ..., + attach: Optional[AppriseAttachment] = ..., + interpret_escapes: Optional[bool] = ... + ) -> bool: ... + async def async_notify( + self, + body: str, + title: str = ..., + notify_type: NotifyType = ..., + body_format: NotifyFormat = ..., + tag: _Tag = ..., + attach: Optional[AppriseAttachment] = ..., + interpret_escapes: Optional[bool] = ... + ) -> bool: ... + def details(self, lang: Optional[str] = ...) -> Dict[str, Any]: ... + def urls(self, privacy: bool = ...) -> Iterable[str]: ... + def pop(self, index: int) -> ConfigBase: ... + def __getitem__(self, index: int) -> ConfigBase: ... + def __bool__(self) -> bool: ... + def __iter__(self) -> Iterator[ConfigBase]: ... + def __len__(self) -> int: ... \ No newline at end of file diff --git a/libs/apprise/AppriseAttachment.py b/libs/apprise/apprise_attachment.py similarity index 96% rename from libs/apprise/AppriseAttachment.py rename to libs/apprise/apprise_attachment.py index fcfed3af6..ecf415ec9 100644 --- a/libs/apprise/AppriseAttachment.py +++ b/libs/apprise/apprise_attachment.py @@ -27,9 +27,9 @@ # POSSIBILITY OF SUCH DAMAGE. from . import URLBase -from .attachment.AttachBase import AttachBase -from .AppriseAsset import AppriseAsset -from .AttachmentManager import AttachmentManager +from .attachment.base import AttachBase +from .asset import AppriseAsset +from .manager_attachment import AttachmentManager from .logger import logger from .common import ContentLocation from .common import CONTENT_LOCATIONS @@ -142,13 +142,8 @@ def add(self, attachments, asset=None, cache=None): # prepare default asset asset = self.asset - if isinstance(attachments, AttachBase): - # Go ahead and just add our attachments into our list - self.attachments.append(attachments) - return True - - elif isinstance(attachments, str): - # Save our path + if isinstance(attachments, (AttachBase, str)): + # store our instance attachments = (attachments, ) elif not isinstance(attachments, (tuple, set, list)): diff --git a/libs/apprise/AppriseAttachment.pyi b/libs/apprise/apprise_attachment.pyi similarity index 100% rename from libs/apprise/AppriseAttachment.pyi rename to libs/apprise/apprise_attachment.pyi diff --git a/libs/apprise/AppriseConfig.py b/libs/apprise/apprise_config.py similarity index 99% rename from libs/apprise/AppriseConfig.py rename to libs/apprise/apprise_config.py index 7e5a9126f..080f70d30 100644 --- a/libs/apprise/AppriseConfig.py +++ b/libs/apprise/apprise_config.py @@ -28,9 +28,9 @@ from . import ConfigBase from . import CONFIG_FORMATS -from .ConfigurationManager import ConfigurationManager +from .manager_config import ConfigurationManager from . import URLBase -from .AppriseAsset import AppriseAsset +from .asset import AppriseAsset from . import common from .utils import GET_SCHEMA_RE from .utils import parse_list diff --git a/libs/apprise/AppriseConfig.pyi b/libs/apprise/apprise_config.pyi similarity index 100% rename from libs/apprise/AppriseConfig.pyi rename to libs/apprise/apprise_config.pyi diff --git a/libs/apprise/AppriseAsset.py b/libs/apprise/asset.py similarity index 77% rename from libs/apprise/AppriseAsset.py rename to libs/apprise/asset.py index 97a7bccfb..2f08a6661 100644 --- a/libs/apprise/AppriseAsset.py +++ b/libs/apprise/asset.py @@ -33,7 +33,8 @@ from os.path import isfile from os.path import abspath from .common import NotifyType -from .NotificationManager import NotificationManager +from .common import PersistentStoreMode +from .manager_plugins import NotificationManager # Grant access to our Notification Manager Singleton @@ -70,6 +71,9 @@ class AppriseAsset: NotifyType.WARNING: '#CACF29', } + # The default color to return if a mapping isn't found in our table above + default_html_color = '#888888' + # Ascii Notification ascii_notify_map = { NotifyType.INFO: '[i]', @@ -78,8 +82,8 @@ class AppriseAsset: NotifyType.WARNING: '[~]', } - # The default color to return if a mapping isn't found in our table above - default_html_color = '#888888' + # The default ascii to return if a mapping isn't found in our table above + default_ascii_chars = '[?]' # The default image extension to use default_extension = '.png' @@ -154,6 +158,22 @@ class AppriseAsset: # By default, no paths are scanned. __plugin_paths = [] + # Optionally set the location of the persistent storage + # By default there is no path and thus persistent storage is not used + __storage_path = None + + # Optionally define the default salt to apply to all persistent storage + # namespace generation (unless over-ridden) + __storage_salt = b'' + + # Optionally define the namespace length of the directories created by + # the storage. If this is set to zero, then the length is pre-determined + # by the generator (sha1, md5, sha256, etc) + __storage_idlen = 8 + + # Set storage to auto + __storage_mode = PersistentStoreMode.AUTO + # All internal/system flags are prefixed with an underscore (_) # These can only be initialized using Python libraries and are not picked # up from (yaml) configuration files (if set) @@ -168,7 +188,9 @@ class AppriseAsset: # A unique identifer we can use to associate our calling source _uid = str(uuid4()) - def __init__(self, plugin_paths=None, **kwargs): + def __init__(self, plugin_paths=None, storage_path=None, + storage_mode=None, storage_salt=None, + storage_idlen=None, **kwargs): """ Asset Initialization @@ -184,8 +206,49 @@ def __init__(self, plugin_paths=None, **kwargs): if plugin_paths: # Load any decorated modules if defined + self.__plugin_paths = plugin_paths N_MGR.module_detection(plugin_paths) + if storage_path: + # Define our persistent storage path + self.__storage_path = storage_path + + if storage_mode: + # Define how our persistent storage behaves + self.__storage_mode = storage_mode + + if isinstance(storage_idlen, int): + # Define the number of characters utilized from our namespace lengh + if storage_idlen < 0: + # Unsupported type + raise ValueError( + 'AppriseAsset storage_idlen(): Value must ' + 'be an integer and > 0') + + # Store value + self.__storage_idlen = storage_idlen + + if storage_salt is not None: + # Define the number of characters utilized from our namespace lengh + + if isinstance(storage_salt, bytes): + self.__storage_salt = storage_salt + + elif isinstance(storage_salt, str): + try: + self.__storage_salt = storage_salt.encode(self.encoding) + + except UnicodeEncodeError: + # Bad data; don't pass it along + raise ValueError( + 'AppriseAsset namespace_salt(): ' + 'Value provided could not be encoded') + + else: # Unsupported + raise ValueError( + 'AppriseAsset namespace_salt(): Value provided must be ' + 'string or bytes object') + def color(self, notify_type, color_type=None): """ Returns an HTML mapped color based on passed in notify type @@ -223,9 +286,8 @@ def ascii(self, notify_type): Returns an ascii representation based on passed in notify type """ - # look our response up - return self.ascii_notify_map.get(notify_type, self.default_html_color) + return self.ascii_notify_map.get(notify_type, self.default_ascii_chars) def image_url(self, notify_type, image_size, logo=False, extension=None): """ @@ -354,3 +416,40 @@ def hex_to_int(value): """ return int(value.lstrip('#'), 16) + + @property + def plugin_paths(self): + """ + Return the plugin paths defined + """ + return self.__plugin_paths + + @property + def storage_path(self): + """ + Return the persistent storage path defined + """ + return self.__storage_path + + @property + def storage_mode(self): + """ + Return the persistent storage mode defined + """ + + return self.__storage_mode + + @property + def storage_salt(self): + """ + Return the provided namespace salt; this is always of type bytes + """ + return self.__storage_salt + + @property + def storage_idlen(self): + """ + Return the persistent storage id length + """ + + return self.__storage_idlen diff --git a/libs/apprise/AppriseAsset.pyi b/libs/apprise/asset.pyi similarity index 100% rename from libs/apprise/AppriseAsset.pyi rename to libs/apprise/asset.pyi diff --git a/libs/apprise/attachment/__init__.py b/libs/apprise/attachment/__init__.py index 0a88313d6..c2aef1eec 100644 --- a/libs/apprise/attachment/__init__.py +++ b/libs/apprise/attachment/__init__.py @@ -27,8 +27,8 @@ # POSSIBILITY OF SUCH DAMAGE. # Used for testing -from .AttachBase import AttachBase -from ..AttachmentManager import AttachmentManager +from .base import AttachBase +from ..manager_attachment import AttachmentManager # Initalize our Attachment Manager Singleton A_MGR = AttachmentManager() @@ -36,4 +36,5 @@ __all__ = [ # Reference 'AttachBase', + 'AttachmentManager', ] diff --git a/libs/apprise/attachment/AttachBase.py b/libs/apprise/attachment/base.py similarity index 84% rename from libs/apprise/attachment/AttachBase.py rename to libs/apprise/attachment/base.py index 8cb6bd5cb..a0f74f9a9 100644 --- a/libs/apprise/attachment/AttachBase.py +++ b/libs/apprise/attachment/base.py @@ -29,10 +29,12 @@ import os import time import mimetypes -from ..URLBase import URLBase +import base64 +from .. import exception +from ..url import URLBase from ..utils import parse_bool from ..common import ContentLocation -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class AttachBase(URLBase): @@ -148,6 +150,9 @@ def __init__(self, name=None, mimetype=None, cache=None, **kwargs): # Absolute path to attachment self.download_path = None + # Track open file pointers + self.__pointers = set() + # Set our cache flag; it can be True, False, None, or a (positive) # integer... nothing else if cache is not None: @@ -226,15 +231,14 @@ def mimetype(self): Content is cached once determied to prevent overhead of future calls. """ + if not self.exists(): + # we could not obtain our attachment + return None if self._mimetype: # return our pre-calculated cached content return self._mimetype - if not self.exists(): - # we could not obtain our attachment - return None - if not self.detected_mimetype: # guess_type() returns: (type, encoding) and sets type to None # if it can't otherwise determine it. @@ -258,6 +262,9 @@ def exists(self, retrieve_if_missing=True): Simply returns true if the object has downloaded and stored the attachment AND the attachment has not expired. """ + if self.location == ContentLocation.INACCESSIBLE: + # our content is inaccessible + return False cache = self.template_args['cache']['default'] \ if self.cache is None else self.cache @@ -284,6 +291,37 @@ def exists(self, retrieve_if_missing=True): return False if not retrieve_if_missing else self.download() + def base64(self, encoding='ascii'): + """ + Returns the attachment object as a base64 string otherwise + None is returned if an error occurs. + + If encoding is set to None, then it is not encoded when returned + """ + if not self: + # We could not access the attachment + self.logger.error( + 'Could not access attachment {}.'.format( + self.url(privacy=True))) + raise exception.AppriseFileNotFound("Attachment Missing") + + try: + with self.open() as f: + # Prepare our Attachment in Base64 + return base64.b64encode(f.read()).decode(encoding) \ + if encoding else base64.b64encode(f.read()) + + except (TypeError, FileNotFoundError): + # We no longer have a path to open + raise exception.AppriseFileNotFound("Attachment Missing") + + except (TypeError, OSError, IOError) as e: + self.logger.warning( + 'An I/O error occurred while reading {}.'.format( + self.name if self else 'attachment')) + self.logger.debug('I/O Exception: %s' % str(e)) + raise exception.AppriseDiskIOError("Attachment Access Error") + def invalidate(self): """ Release any temporary data that may be open by child classes. @@ -295,6 +333,11 @@ def invalidate(self): - download_path: Must contain a absolute path to content - detected_mimetype: Should identify mimetype of content """ + + # Remove all open pointers + while self.__pointers: + self.__pointers.pop().close() + self.detected_name = None self.download_path = None self.detected_mimetype = None @@ -314,8 +357,28 @@ def download(self): raise NotImplementedError( "download() is implimented by the child class.") + def open(self, mode='rb'): + """ + return our file pointer and track it (we'll auto close later + """ + pointer = open(self.path, mode=mode) + self.__pointers.add(pointer) + return pointer + + def __enter__(self): + """ + support with keyword + """ + return self.open() + + def __exit__(self, value_type, value, traceback): + """ + stub to do nothing; but support exit of with statement gracefully + """ + return + @staticmethod - def parse_url(url, verify_host=True, mimetype_db=None): + def parse_url(url, verify_host=True, mimetype_db=None, sanitize=True): """Parses the URL and returns it broken apart into a dictionary. This is very specific and customized for Apprise. @@ -333,7 +396,8 @@ def parse_url(url, verify_host=True, mimetype_db=None): successful, otherwise None is returned. """ - results = URLBase.parse_url(url, verify_host=verify_host) + results = URLBase.parse_url( + url, verify_host=verify_host, sanitize=sanitize) if not results: # We're done; we failed to parse our url @@ -375,3 +439,9 @@ def __bool__(self): True is returned if our content was downloaded correctly. """ return True if self.path else False + + def __del__(self): + """ + Perform any house cleaning + """ + self.invalidate() diff --git a/libs/apprise/attachment/AttachBase.pyi b/libs/apprise/attachment/base.pyi similarity index 100% rename from libs/apprise/attachment/AttachBase.pyi rename to libs/apprise/attachment/base.pyi diff --git a/libs/apprise/attachment/AttachFile.py b/libs/apprise/attachment/file.py similarity index 92% rename from libs/apprise/attachment/AttachFile.py rename to libs/apprise/attachment/file.py index 4c9c8f136..e24e1fbed 100644 --- a/libs/apprise/attachment/AttachFile.py +++ b/libs/apprise/attachment/file.py @@ -28,9 +28,10 @@ import re import os -from .AttachBase import AttachBase +from .base import AttachBase +from ..utils import path_decode from ..common import ContentLocation -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class AttachFile(AttachBase): @@ -57,7 +58,10 @@ def __init__(self, path, **kwargs): # Store path but mark it dirty since we have not performed any # verification at this point. - self.dirty_path = os.path.expanduser(path) + self.dirty_path = path_decode(path) + + # Track our file as it was saved + self.__original_path = os.path.normpath(path) return def url(self, privacy=False, *args, **kwargs): @@ -77,8 +81,9 @@ def url(self, privacy=False, *args, **kwargs): params['name'] = self._name return 'file://{path}{params}'.format( - path=self.quote(self.dirty_path), - params='?{}'.format(self.urlencode(params)) if params else '', + path=self.quote(self.__original_path), + params='?{}'.format(self.urlencode(params, safe='/')) + if params else '', ) def download(self, **kwargs): diff --git a/libs/apprise/attachment/AttachHTTP.py b/libs/apprise/attachment/http.py similarity index 98% rename from libs/apprise/attachment/AttachHTTP.py rename to libs/apprise/attachment/http.py index 5a3af9467..870f7cc2b 100644 --- a/libs/apprise/attachment/AttachHTTP.py +++ b/libs/apprise/attachment/http.py @@ -31,10 +31,10 @@ import requests import threading from tempfile import NamedTemporaryFile -from .AttachBase import AttachBase +from .base import AttachBase from ..common import ContentLocation -from ..URLBase import PrivacyMode -from ..AppriseLocale import gettext_lazy as _ +from ..url import PrivacyMode +from ..locale import gettext_lazy as _ class AttachHTTP(AttachBase): @@ -296,8 +296,7 @@ def __del__(self): """ Tidy memory if open """ - with self._lock: - self.invalidate() + self.invalidate() def url(self, privacy=False, *args, **kwargs): """ @@ -353,7 +352,7 @@ def url(self, privacy=False, *args, **kwargs): port='' if self.port is None or self.port == default_port else ':{}'.format(self.port), fullpath=self.quote(self.fullpath, safe='/'), - params=self.urlencode(params), + params=self.urlencode(params, safe='/'), ) @staticmethod @@ -363,8 +362,7 @@ def parse_url(url): us to re-instantiate this object. """ - results = AttachBase.parse_url(url) - + results = AttachBase.parse_url(url, sanitize=False) if not results: # We're done early as we couldn't load the results return results diff --git a/libs/apprise/attachment/memory.py b/libs/apprise/attachment/memory.py new file mode 100644 index 000000000..c7d5dca24 --- /dev/null +++ b/libs/apprise/attachment/memory.py @@ -0,0 +1,231 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron +# +# 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. +# +# 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. + +import re +import os +import io +import base64 +from .base import AttachBase +from .. import exception +from ..common import ContentLocation +from ..locale import gettext_lazy as _ +import uuid + + +class AttachMemory(AttachBase): + """ + A wrapper for Memory based attachment sources + """ + + # The default descriptive name associated with the service + service_name = _('Memory') + + # The default protocol + protocol = 'memory' + + # Content is local to the same location as the apprise instance + # being called (server-side) + location = ContentLocation.LOCAL + + def __init__(self, content=None, name=None, mimetype=None, + encoding='utf-8', **kwargs): + """ + Initialize Memory Based Attachment Object + + """ + # Create our BytesIO object + self._data = io.BytesIO() + + if content is None: + # Empty; do nothing + pass + + elif isinstance(content, str): + content = content.encode(encoding) + if mimetype is None: + mimetype = 'text/plain' + + if not name: + # Generate a unique filename + name = str(uuid.uuid4()) + '.txt' + + elif not isinstance(content, bytes): + raise TypeError( + 'Provided content for memory attachment is invalid') + + # Store our content + if content: + self._data.write(content) + + if mimetype is None: + # Default mimetype + mimetype = 'application/octet-stream' + + if not name: + # Generate a unique filename + name = str(uuid.uuid4()) + '.dat' + + # Initialize our base object + super().__init__(name=name, mimetype=mimetype, **kwargs) + + return + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any URL parameters + params = { + 'mime': self._mimetype, + } + + return 'memory://{name}?{params}'.format( + name=self.quote(self._name), + params=self.urlencode(params, safe='/') + ) + + def open(self, *args, **kwargs): + """ + return our memory object + """ + # Return our object + self._data.seek(0, 0) + return self._data + + def __enter__(self): + """ + support with clause + """ + # Return our object + self._data.seek(0, 0) + return self._data + + def download(self, **kwargs): + """ + Handle memory download() call + """ + + if self.location == ContentLocation.INACCESSIBLE: + # our content is inaccessible + return False + + if self.max_file_size > 0 and len(self) > self.max_file_size: + # The content to attach is to large + self.logger.error( + 'Content exceeds allowable maximum memory size ' + '({}KB): {}'.format( + int(self.max_file_size / 1024), self.url(privacy=True))) + + # Return False (signifying a failure) + return False + + return True + + def base64(self, encoding='ascii'): + """ + We need to over-ride this since the base64 sub-library seems to close + our file descriptor making it no longer referencable. + """ + + if not self: + # We could not access the attachment + self.logger.error( + 'Could not access attachment {}.'.format( + self.url(privacy=True))) + raise exception.AppriseFileNotFound("Attachment Missing") + self._data.seek(0, 0) + + return base64.b64encode(self._data.read()).decode(encoding) \ + if encoding else base64.b64encode(self._data.read()) + + def invalidate(self): + """ + Removes data + """ + self._data.truncate(0) + return + + def exists(self): + """ + over-ride exists() call + """ + size = len(self) + return True if self.location != ContentLocation.INACCESSIBLE \ + and size > 0 and ( + self.max_file_size <= 0 or + (self.max_file_size > 0 and size <= self.max_file_size)) \ + else False + + @staticmethod + def parse_url(url): + """ + Parses the URL so that we can handle all different file paths + and return it as our path object + + """ + + results = AttachBase.parse_url(url, verify_host=False) + if not results: + # We're done early; it's not a good URL + return results + + if 'name' not in results: + # Allow fall-back to be from URL + match = re.match(r'memory://(?P[^?]+)(\?.*)?', url, re.I) + if match: + # Store our filename only (ignore any defined paths) + results['name'] = \ + os.path.basename(AttachMemory.unquote(match.group('path'))) + return results + + @property + def path(self): + """ + return the filename + """ + if not self.exists(): + # we could not obtain our path + return None + + return self._name + + def __len__(self): + """ + Returns the size of he memory attachment + + """ + return self._data.getbuffer().nbytes + + def __bool__(self): + """ + Allows the Apprise object to be wrapped in an based 'if statement'. + True is returned if our content was downloaded correctly. + """ + + return self.exists() diff --git a/libs/apprise/cli.py b/libs/apprise/cli.py index 11a6cbc2b..78a9853c2 100644 --- a/libs/apprise/cli.py +++ b/libs/apprise/cli.py @@ -27,26 +27,27 @@ # POSSIBILITY OF SUCH DAMAGE. import click +import textwrap import logging import platform import sys import os +import shutil import re from os.path import isfile from os.path import exists -from os.path import expanduser -from os.path import expandvars -from . import NotifyType -from . import NotifyFormat from . import Apprise from . import AppriseAsset from . import AppriseConfig +from . import PersistentStore -from .utils import parse_list +from .utils import dir_size, bytes_to_str, parse_list, path_decode from .common import NOTIFY_TYPES from .common import NOTIFY_FORMATS +from .common import PERSISTENT_STORE_MODES +from .common import PersistentStoreState from .common import ContentLocation from .logger import logger @@ -59,6 +60,14 @@ # files. DEFAULT_RECURSION_DEPTH = 1 +# Default number of days to prune persistent storage +DEFAULT_STORAGE_PRUNE_DAYS = \ + int(os.environ.get('APPRISE_STORAGE_PRUNE_DAYS', 30)) + +# The default URL ID Length +DEFAULT_STORAGE_UID_LENGTH = \ + int(os.environ.get('APPRISE_STORAGE_UID_LENGTH', 8)) + # Defines our click context settings adding -h to the additional options that # can be specified to get the help menu to come up CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) @@ -104,67 +113,94 @@ '/var/lib/apprise/plugins', ) +# +# Persistent Storage +# +DEFAULT_STORAGE_PATH = '~/.local/share/apprise/cache' + # Detect Windows if platform.system() == 'Windows': # Default Config Search Path for Windows Users DEFAULT_CONFIG_PATHS = ( - expandvars('%APPDATA%\\Apprise\\apprise'), - expandvars('%APPDATA%\\Apprise\\apprise.conf'), - expandvars('%APPDATA%\\Apprise\\apprise.yml'), - expandvars('%APPDATA%\\Apprise\\apprise.yaml'), - expandvars('%LOCALAPPDATA%\\Apprise\\apprise'), - expandvars('%LOCALAPPDATA%\\Apprise\\apprise.conf'), - expandvars('%LOCALAPPDATA%\\Apprise\\apprise.yml'), - expandvars('%LOCALAPPDATA%\\Apprise\\apprise.yaml'), + '%APPDATA%\\Apprise\\apprise', + '%APPDATA%\\Apprise\\apprise.conf', + '%APPDATA%\\Apprise\\apprise.yml', + '%APPDATA%\\Apprise\\apprise.yaml', + '%LOCALAPPDATA%\\Apprise\\apprise', + '%LOCALAPPDATA%\\Apprise\\apprise.conf', + '%LOCALAPPDATA%\\Apprise\\apprise.yml', + '%LOCALAPPDATA%\\Apprise\\apprise.yaml', # # Global Support # - # C:\ProgramData\Apprise\ - expandvars('%ALLUSERSPROFILE%\\Apprise\\apprise'), - expandvars('%ALLUSERSPROFILE%\\Apprise\\apprise.conf'), - expandvars('%ALLUSERSPROFILE%\\Apprise\\apprise.yml'), - expandvars('%ALLUSERSPROFILE%\\Apprise\\apprise.yaml'), + # C:\ProgramData\Apprise + '%ALLUSERSPROFILE%\\Apprise\\apprise', + '%ALLUSERSPROFILE%\\Apprise\\apprise.conf', + '%ALLUSERSPROFILE%\\Apprise\\apprise.yml', + '%ALLUSERSPROFILE%\\Apprise\\apprise.yaml', # C:\Program Files\Apprise - expandvars('%PROGRAMFILES%\\Apprise\\apprise'), - expandvars('%PROGRAMFILES%\\Apprise\\apprise.conf'), - expandvars('%PROGRAMFILES%\\Apprise\\apprise.yml'), - expandvars('%PROGRAMFILES%\\Apprise\\apprise.yaml'), + '%PROGRAMFILES%\\Apprise\\apprise', + '%PROGRAMFILES%\\Apprise\\apprise.conf', + '%PROGRAMFILES%\\Apprise\\apprise.yml', + '%PROGRAMFILES%\\Apprise\\apprise.yaml', # C:\Program Files\Common Files - expandvars('%COMMONPROGRAMFILES%\\Apprise\\apprise'), - expandvars('%COMMONPROGRAMFILES%\\Apprise\\apprise.conf'), - expandvars('%COMMONPROGRAMFILES%\\Apprise\\apprise.yml'), - expandvars('%COMMONPROGRAMFILES%\\Apprise\\apprise.yaml'), + '%COMMONPROGRAMFILES%\\Apprise\\apprise', + '%COMMONPROGRAMFILES%\\Apprise\\apprise.conf', + '%COMMONPROGRAMFILES%\\Apprise\\apprise.yml', + '%COMMONPROGRAMFILES%\\Apprise\\apprise.yaml', ) # Default Plugin Search Path for Windows Users DEFAULT_PLUGIN_PATHS = ( - expandvars('%APPDATA%\\Apprise\\plugins'), - expandvars('%LOCALAPPDATA%\\Apprise\\plugins'), + '%APPDATA%\\Apprise\\plugins', + '%LOCALAPPDATA%\\Apprise\\plugins', # # Global Support # # C:\ProgramData\Apprise\plugins - expandvars('%ALLUSERSPROFILE%\\Apprise\\plugins'), + '%ALLUSERSPROFILE%\\Apprise\\plugins', # C:\Program Files\Apprise\plugins - expandvars('%PROGRAMFILES%\\Apprise\\plugins'), + '%PROGRAMFILES%\\Apprise\\plugins', # C:\Program Files\Common Files - expandvars('%COMMONPROGRAMFILES%\\Apprise\\plugins'), + '%COMMONPROGRAMFILES%\\Apprise\\plugins', ) + # + # Persistent Storage + # + DEFAULT_STORAGE_PATH = '%APPDATA%/Apprise/cache' -def print_help_msg(command): - """ - Prints help message when -h or --help is specified. +class PersistentStorageMode: + """ + Persistent Storage Modes """ - with click.Context(command) as ctx: - click.echo(command.get_help(ctx)) + # List all detected configuration loaded + LIST = 'list' + + # Prune persistent storage based on age + PRUNE = 'prune' + + # Reset all (reguardless of age) + CLEAR = 'clear' + + +# Define the types in a list for validation purposes +PERSISTENT_STORAGE_MODES = ( + PersistentStorageMode.LIST, + PersistentStorageMode.PRUNE, + PersistentStorageMode.CLEAR, +) + +if os.environ.get('APPRISE_STORAGE_PATH', '').strip(): + # Over-ride Default Storage Path + DEFAULT_STORAGE_PATH = os.environ.get('APPRISE_STORAGE_PATH') def print_version_msg(): @@ -180,7 +216,113 @@ def print_version_msg(): click.echo('\n'.join(result)) -@click.command(context_settings=CONTEXT_SETTINGS) +class CustomHelpCommand(click.Command): + def format_help(self, ctx, formatter): + formatter.write_text('Usage:') + formatter.write_text( + ' apprise [OPTIONS] [APPRISE_URL [APPRISE_URL2 [APPRISE_URL3]]]') + formatter.write_text( + ' apprise storage [OPTIONS] [ACTION] [UID1 [UID2 [UID3]]]') + + # Custom help message + formatter.write_text('') + content = ( + 'Send a notification to all of the specified servers ' + 'identified by their URLs', + 'the content provided within the title, body and ' + 'notification-type.', + '', + 'For a list of all of the supported services and information on ' + 'how to use ', + 'them, check out at https://github.com/caronc/apprise') + + for line in content: + formatter.write_text(line) + + # Display options and arguments in the default format + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + # Custom 'Actions:' section after the 'Options:' + formatter.write_text('') + formatter.write_text('Actions:') + + actions = [( + 'storage', 'Access the persistent storage disk administration', + [( + 'list', + 'List all URL IDs associated with detected URL(s). ' + 'This is also the default action ran if nothing is provided', + ), ( + 'prune', + 'Eliminates stale entries found based on ' + '--storage-prune-days (-SPD)', + ), ( + 'clean', + 'Removes any persistent data created by Apprise', + )], + )] + + # + # Some variables + # + + # actions are indented this many spaces + # sub actions double this value + action_indent = 2 + + # label padding (for alignment) + action_label_width = 10 + + space = ' ' + space_re = re.compile(r'\r*\n') + cols = 80 + indent = 10 + + # Format each action and its subactions + for action, description, sub_actions in actions: + # Our action indent + ai = ' ' * action_indent + # Format the main action description + formatted_description = space_re.split(textwrap.fill( + description, width=(cols - indent - action_indent), + initial_indent=space * indent, + subsequent_indent=space * indent)) + for no, line in enumerate(formatted_description): + if not no: + formatter.write_text( + f'{ai}{action:<{action_label_width}}{line}') + + else: # pragma: no cover + # Note: no branch is set intentionally since this is not + # tested since in 2024.08.13 when this was set up + # it never entered this area of the code. But we + # know it works because we repeat this process with + # our sub-options below + formatter.write_text( + f'{ai}{space:<{action_label_width}}{line}') + + # Format each subaction + ai = ' ' * (action_indent * 2) + for action, description in sub_actions: + formatted_description = space_re.split(textwrap.fill( + description, width=(cols - indent - (action_indent * 3)), + initial_indent=space * (indent - action_indent), + subsequent_indent=space * (indent - action_indent))) + + for no, line in enumerate(formatted_description): + if not no: + formatter.write_text( + f'{ai}{action:<{action_label_width}}{line}') + else: + formatter.write_text( + f'{ai}{space:<{action_label_width}}{line}') + + # Include any epilog or additional text + self.format_epilog(ctx, formatter) + + +@click.command(context_settings=CONTEXT_SETTINGS, cls=CustomHelpCommand) @click.option('--body', '-b', default=None, type=str, help='Specify the message body. If no body is specified then ' 'content is read from .') @@ -188,25 +330,47 @@ def print_version_msg(): help='Specify the message title. This field is complete ' 'optional.') @click.option('--plugin-path', '-P', default=None, type=str, multiple=True, - metavar='PLUGIN_PATH', + metavar='PATH', help='Specify one or more plugin paths to scan.') +@click.option('--storage-path', '-S', default=DEFAULT_STORAGE_PATH, type=str, + metavar='PATH', + help='Specify the path to the persistent storage location ' + '(default={}).'.format(DEFAULT_STORAGE_PATH)) +@click.option('--storage-prune-days', '-SPD', + default=DEFAULT_STORAGE_PRUNE_DAYS, type=int, + help='Define the number of days the storage prune ' + 'should run using. Setting this to zero (0) will eliminate ' + 'all accumulated content. By default this value is {} days.' + .format(DEFAULT_STORAGE_PRUNE_DAYS)) +@click.option('--storage-uid-length', '-SUL', + default=DEFAULT_STORAGE_UID_LENGTH, type=int, + help='Define the number of unique characters to store persistent' + 'cache in. By default this value is {} characters.' + .format(DEFAULT_STORAGE_UID_LENGTH)) +@click.option('--storage-mode', '-SM', default=PERSISTENT_STORE_MODES[0], + type=str, metavar='MODE', + help='Specify the persistent storage operational mode ' + '(default={}). Possible values are "{}", and "{}".'.format( + PERSISTENT_STORE_MODES[0], '", "'.join( + PERSISTENT_STORE_MODES[:-1]), + PERSISTENT_STORE_MODES[-1])) @click.option('--config', '-c', default=None, type=str, multiple=True, metavar='CONFIG_URL', help='Specify one or more configuration locations.') @click.option('--attach', '-a', default=None, type=str, multiple=True, metavar='ATTACHMENT_URL', help='Specify one or more attachment.') -@click.option('--notification-type', '-n', default=NotifyType.INFO, type=str, +@click.option('--notification-type', '-n', default=NOTIFY_TYPES[0], type=str, metavar='TYPE', help='Specify the message type (default={}). ' 'Possible values are "{}", and "{}".'.format( - NotifyType.INFO, '", "'.join(NOTIFY_TYPES[:-1]), + NOTIFY_TYPES[0], '", "'.join(NOTIFY_TYPES[:-1]), NOTIFY_TYPES[-1])) -@click.option('--input-format', '-i', default=NotifyFormat.TEXT, type=str, +@click.option('--input-format', '-i', default=NOTIFY_FORMATS[0], type=str, metavar='FORMAT', help='Specify the message input format (default={}). ' 'Possible values are "{}", and "{}".'.format( - NotifyFormat.TEXT, '", "'.join(NOTIFY_FORMATS[:-1]), + NOTIFY_FORMATS[0], '", "'.join(NOTIFY_FORMATS[:-1]), NOTIFY_FORMATS[-1])) @click.option('--theme', '-T', default='default', type=str, metavar='THEME', help='Specify the default theme.') @@ -241,10 +405,12 @@ def print_version_msg(): help='Display the apprise version and exit.') @click.argument('urls', nargs=-1, metavar='SERVER_URL [SERVER_URL2 [SERVER_URL3]]',) -def main(body, title, config, attach, urls, notification_type, theme, tag, +@click.pass_context +def main(ctx, body, title, config, attach, urls, notification_type, theme, tag, input_format, dry_run, recursion_depth, verbose, disable_async, - details, interpret_escapes, interpret_emojis, plugin_path, debug, - version): + details, interpret_escapes, interpret_emojis, plugin_path, + storage_path, storage_mode, storage_prune_days, storage_uid_length, + debug, version): """ Send a notification to all of the specified servers identified by their URLs the content provided within the title, body and notification-type. @@ -253,7 +419,7 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, use them, check out at https://github.com/caronc/apprise """ # Note: Click ignores the return values of functions it wraps, If you - # want to return a specific error code, you must call sys.exit() + # want to return a specific error code, you must call ctx.exit() # as you will see below. debug = True if debug else False @@ -297,32 +463,54 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, if version: print_version_msg() - sys.exit(0) + ctx.exit(0) # Simple Error Checking notification_type = notification_type.strip().lower() if notification_type not in NOTIFY_TYPES: - logger.error( + click.echo( 'The --notification-type (-n) value of {} is not supported.' .format(notification_type)) + click.echo("Try 'apprise --help' for more information.") # 2 is the same exit code returned by Click if there is a parameter # issue. For consistency, we also return a 2 - sys.exit(2) + ctx.exit(2) input_format = input_format.strip().lower() if input_format not in NOTIFY_FORMATS: - logger.error( + click.echo( 'The --input-format (-i) value of {} is not supported.' .format(input_format)) + click.echo("Try 'apprise --help' for more information.") + # 2 is the same exit code returned by Click if there is a parameter + # issue. For consistency, we also return a 2 + ctx.exit(2) + + storage_mode = storage_mode.strip().lower() + if storage_mode not in PERSISTENT_STORE_MODES: + click.echo( + 'The --storage-mode (-SM) value of {} is not supported.' + .format(storage_mode)) + click.echo("Try 'apprise --help' for more information.") # 2 is the same exit code returned by Click if there is a parameter # issue. For consistency, we also return a 2 - sys.exit(2) + ctx.exit(2) if not plugin_path: # Prepare a default set of plugin path plugin_path = \ - next((path for path in DEFAULT_PLUGIN_PATHS - if exists(expanduser(path))), None) + [path for path in DEFAULT_PLUGIN_PATHS + if exists(path_decode(path))] + + if storage_uid_length < 2: + click.echo( + 'The --storage-uid-length (-SUL) value can not be lower ' + 'then two (2).') + click.echo("Try 'apprise --help' for more information.") + + # 2 is the same exit code returned by Click if there is a + # parameter issue. For consistency, we also return a 2 + ctx.exit(2) # Prepare our asset asset = AppriseAsset( @@ -346,11 +534,23 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, # Load our plugins plugin_paths=plugin_path, + + # Load our persistent storage path + storage_path=path_decode(storage_path), + + # Our storage URL ID Length + storage_idlen=storage_uid_length, + + # Define if we flush to disk as soon as possible or not when required + storage_mode=storage_mode ) # Create our Apprise object a = Apprise(asset=asset, debug=debug, location=ContentLocation.LOCAL) + # Track if we are performing a storage action + storage_action = True if urls and 'storage'.startswith(urls[0]) else False + if details: # Print details and exit results = a.details(show_requirements=True, show_disabled=True) @@ -429,7 +629,7 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, # new line padding between entries click.echo() - sys.exit(0) + ctx.exit(0) # end if details() # The priorities of what is accepted are parsed in order below: @@ -439,7 +639,7 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, # 4. Configuration by environment variable: APPRISE_CONFIG # 5. Default Configuration File(s) (if found) # - if urls: + elif urls and not storage_action: if tag: # Ignore any tags specified logger.warning( @@ -483,20 +683,148 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, else: # Load default configuration a.add(AppriseConfig( - paths=[f for f in DEFAULT_CONFIG_PATHS if isfile(expanduser(f))], + paths=[f for f in DEFAULT_CONFIG_PATHS if isfile(path_decode(f))], asset=asset, recursion=recursion_depth)) - if len(a) == 0 and not urls: - logger.error( + if not dry_run and not (a or storage_action): + click.echo( 'You must specify at least one server URL or populated ' 'configuration file.') - print_help_msg(main) - sys.exit(1) + click.echo("Try 'apprise --help' for more information.") + ctx.exit(1) # each --tag entry comprises of a comma separated 'and' list # we or each of of the --tag and sets specified. tags = None if not tag else [parse_list(t) for t in tag] + # Determine if we're dealing with URLs or url_ids based on the first + # entry provided. + if storage_action: + # + # Storage Mode + # - urls are now to be interpreted as best matching namespaces + # + if storage_prune_days < 0: + click.echo( + 'The --storage-prune-days (-SPD) value can not be lower ' + 'then zero (0).') + click.echo("Try 'apprise --help' for more information.") + + # 2 is the same exit code returned by Click if there is a + # parameter issue. For consistency, we also return a 2 + ctx.exit(2) + + # Number of columns to assume in the terminal. In future, maybe this + # can be detected and made dynamic. The actual column count is 80, but + # 5 characters are already reserved for the counter on the left + (columns, _) = shutil.get_terminal_size(fallback=(80, 24)) + + # Pop 'storage' off of the head of our list + filter_uids = urls[1:] + + action = PERSISTENT_STORAGE_MODES[0] + if filter_uids: + _action = next( # pragma: no branch + (a for a in PERSISTENT_STORAGE_MODES + if a.startswith(filter_uids[0])), None) + + if _action: + # pop 'action' off the head of our list + filter_uids = filter_uids[1:] + action = _action + + # Get our detected URL IDs + uids = {} + for plugin in (a if not tags else a.find(tag=tags)): + _id = plugin.url_id() + if not _id: + continue + + if filter_uids and next( + (False for n in filter_uids if _id.startswith(n)), True): + continue + + if _id not in uids: + uids[_id] = { + 'plugins': [plugin], + 'state': PersistentStoreState.UNUSED, + 'size': 0, + } + + else: + # It's possible to have more then one URL point to the same + # location (thus match against the same url id more then once + uids[_id]['plugins'].append(plugin) + + if action == PersistentStorageMode.LIST: + detected_uid = PersistentStore.disk_scan( + # Use our asset path as it has already been properly parsed + path=asset.storage_path, + + # Provide filter if specified + namespace=filter_uids, + ) + for _id in detected_uid: + size, _ = dir_size(os.path.join(asset.storage_path, _id)) + if _id in uids: + uids[_id]['state'] = PersistentStoreState.ACTIVE + uids[_id]['size'] = size + + elif not tags: + uids[_id] = { + 'plugins': [], + # No cross reference (wasted space?) + 'state': PersistentStoreState.STALE, + # Acquire disk space + 'size': size, + } + + for idx, (uid, meta) in enumerate(uids.items()): + fg = "green" \ + if meta['state'] == PersistentStoreState.ACTIVE else ( + "red" + if meta['state'] == PersistentStoreState.STALE else + "white") + + if idx > 0: + # New line + click.echo() + click.echo("{: 4d}. ".format(idx + 1), nl=False) + click.echo(click.style("{:<52} {:<8} {}".format( + uid, bytes_to_str(meta['size']), meta['state']), + fg=fg, bold=True)) + + for entry in meta['plugins']: + url = entry.url(privacy=True) + click.echo("{:>7} {}".format( + '-', + url if len(url) <= (columns - 8) else '{}...'.format( + url[:columns - 11]))) + + if entry.tags: + click.echo("{:>10}: {}".format( + 'tags', ', '.join(entry.tags))) + + else: # PersistentStorageMode.PRUNE or PersistentStorageMode.CLEAR + if action == PersistentStorageMode.CLEAR: + storage_prune_days = 0 + + # clean up storage + results = PersistentStore.disk_prune( + # Use our asset path as it has already been properly parsed + path=asset.storage_path, + # Provide our namespaces if they exist + namespace=None if not filter_uids else filter_uids, + # Convert expiry from days to seconds + expires=storage_prune_days * 60 * 60 * 24, + action=not dry_run) + + ctx.exit(0) + # end if disk_prune() + + ctx.exit(0) + # end if storage() + if not dry_run: if body is None: logger.trace('No --body (-b) specified; reading from stdin') @@ -508,10 +836,10 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, body=body, title=title, notify_type=notification_type, tag=tags, attach=attach) else: - # Number of rows to assume in the terminal. In future, maybe this can - # be detected and made dynamic. The actual row count is 80, but 5 - # characters are already reserved for the counter on the left - rows = 75 + # Number of columns to assume in the terminal. In future, maybe this + # can be detected and made dynamic. The actual column count is 80, but + # 5 characters are already reserved for the counter on the left + (columns, _) = shutil.get_terminal_size(fallback=(80, 24)) # Initialize our URL response; This is populated within the for/loop # below; but plays a factor at the end when we need to determine if @@ -520,11 +848,18 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, for idx, server in enumerate(a.find(tag=tags)): url = server.url(privacy=True) - click.echo("{: 3d}. {}".format( + click.echo("{: 4d}. {}".format( idx + 1, - url if len(url) <= rows else '{}...'.format(url[:rows - 3]))) + url if len(url) <= (columns - 8) else '{}...'.format( + url[:columns - 9]))) + + # Share our URL ID + click.echo("{:>10}: {}".format( + 'uid', '- n/a -' if not server.url_id() + else server.url_id())) + if server.tags: - click.echo("{} - {}".format(' ' * 5, ', '.join(server.tags))) + click.echo("{:>10}: {}".format('tags', ', '.join(server.tags))) # Initialize a default response of nothing matched, otherwise # if we matched at least one entry, we can return True @@ -537,11 +872,11 @@ def main(body, title, config, attach, urls, notification_type, theme, tag, # Exit code 3 is used since Click uses exit code 2 if there is an # error with the parameters specified - sys.exit(3) + ctx.exit(3) elif result is False: # At least 1 notification service failed to send - sys.exit(1) + ctx.exit(1) # else: We're good! - sys.exit(0) + ctx.exit(0) diff --git a/libs/apprise/common.py b/libs/apprise/common.py index d6fe2cd0d..a8e9cd34e 100644 --- a/libs/apprise/common.py +++ b/libs/apprise/common.py @@ -187,6 +187,42 @@ class ContentLocation: ContentLocation.INACCESSIBLE, ) + +class PersistentStoreMode: + # Allow persistent storage; write on demand + AUTO = 'auto' + + # Always flush every change to disk after it's saved. This has higher i/o + # but enforces disk reflects what was set immediately + FLUSH = 'flush' + + # memory based store only + MEMORY = 'memory' + + +PERSISTENT_STORE_MODES = ( + PersistentStoreMode.AUTO, + PersistentStoreMode.FLUSH, + PersistentStoreMode.MEMORY, +) + + +class PersistentStoreState: + """ + Defines the persistent states describing what has been cached + """ + # Persistent Directory is actively cross-referenced against a matching URL + ACTIVE = 'active' + + # Persistent Directory is no longer being used or has no cross-reference + STALE = 'stale' + + # Persistent Directory is not utilizing any disk space at all, however + # it potentially could if the plugin it successfully cross-references + # is utilized + UNUSED = 'unused' + + # This is a reserved tag that is automatically assigned to every # Notification Plugin MATCH_ALL_TAG = 'all' diff --git a/libs/apprise/config/__init__.py b/libs/apprise/config/__init__.py index efbace687..24957e88e 100644 --- a/libs/apprise/config/__init__.py +++ b/libs/apprise/config/__init__.py @@ -27,8 +27,8 @@ # POSSIBILITY OF SUCH DAMAGE. # Used for testing -from .ConfigBase import ConfigBase -from ..ConfigurationManager import ConfigurationManager +from .base import ConfigBase +from ..manager_config import ConfigurationManager # Initalize our Config Manager Singleton C_MGR = ConfigurationManager() @@ -36,4 +36,5 @@ __all__ = [ # Reference 'ConfigBase', + 'ConfigurationManager', ] diff --git a/libs/apprise/config/ConfigBase.py b/libs/apprise/config/base.py similarity index 99% rename from libs/apprise/config/ConfigBase.py rename to libs/apprise/config/base.py index 32e1bde34..953cee394 100644 --- a/libs/apprise/config/ConfigBase.py +++ b/libs/apprise/config/base.py @@ -33,15 +33,15 @@ from .. import plugins from .. import common -from ..AppriseAsset import AppriseAsset -from ..URLBase import URLBase -from ..ConfigurationManager import ConfigurationManager +from ..asset import AppriseAsset +from ..url import URLBase from ..utils import GET_SCHEMA_RE from ..utils import parse_list from ..utils import parse_bool from ..utils import parse_urls from ..utils import cwe312_url -from ..NotificationManager import NotificationManager +from ..manager_config import ConfigurationManager +from ..manager_plugins import NotificationManager # Test whether token is valid or not VALID_TOKEN = re.compile( diff --git a/libs/apprise/config/ConfigBase.pyi b/libs/apprise/config/base.pyi similarity index 100% rename from libs/apprise/config/ConfigBase.pyi rename to libs/apprise/config/base.pyi diff --git a/libs/apprise/config/ConfigFile.py b/libs/apprise/config/file.py similarity index 95% rename from libs/apprise/config/ConfigFile.py rename to libs/apprise/config/file.py index 172d699f8..9340f62bb 100644 --- a/libs/apprise/config/ConfigFile.py +++ b/libs/apprise/config/file.py @@ -28,10 +28,11 @@ import re import os -from .ConfigBase import ConfigBase +from .base import ConfigBase +from ..utils import path_decode from ..common import ConfigFormat from ..common import ContentIncludeMode -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class ConfigFile(ConfigBase): @@ -59,7 +60,10 @@ def __init__(self, path, **kwargs): super().__init__(**kwargs) # Store our file path as it was set - self.path = os.path.abspath(os.path.expanduser(path)) + self.path = path_decode(path) + + # Track the file as it was saved + self.__original_path = os.path.normpath(path) # Update the config path to be relative to our file we just loaded self.config_path = os.path.dirname(self.path) @@ -89,7 +93,7 @@ def url(self, privacy=False, *args, **kwargs): params['format'] = self.config_format return 'file://{path}{params}'.format( - path=self.quote(self.path), + path=self.quote(self.__original_path), params='?{}'.format(self.urlencode(params)) if params else '', ) diff --git a/libs/apprise/config/ConfigHTTP.py b/libs/apprise/config/http.py similarity index 98% rename from libs/apprise/config/ConfigHTTP.py rename to libs/apprise/config/http.py index f6faba8d4..2e2ba299b 100644 --- a/libs/apprise/config/ConfigHTTP.py +++ b/libs/apprise/config/http.py @@ -28,11 +28,11 @@ import re import requests -from .ConfigBase import ConfigBase +from .base import ConfigBase from ..common import ConfigFormat from ..common import ContentIncludeMode -from ..URLBase import PrivacyMode -from ..AppriseLocale import gettext_lazy as _ +from ..url import PrivacyMode +from ..locale import gettext_lazy as _ # Support YAML formats # text/yaml diff --git a/libs/apprise/config/ConfigMemory.py b/libs/apprise/config/memory.py similarity index 97% rename from libs/apprise/config/ConfigMemory.py rename to libs/apprise/config/memory.py index 413956dfc..181d76236 100644 --- a/libs/apprise/config/ConfigMemory.py +++ b/libs/apprise/config/memory.py @@ -26,8 +26,8 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from .ConfigBase import ConfigBase -from ..AppriseLocale import gettext_lazy as _ +from .base import ConfigBase +from ..locale import gettext_lazy as _ class ConfigMemory(ConfigBase): diff --git a/libs/apprise/conversion.py b/libs/apprise/conversion.py index 4d5632f59..366fe8e3e 100644 --- a/libs/apprise/conversion.py +++ b/libs/apprise/conversion.py @@ -29,7 +29,7 @@ import re from markdown import markdown from .common import NotifyFormat -from .URLBase import URLBase +from .url import URLBase from html.parser import HTMLParser @@ -180,8 +180,10 @@ def handle_starttag(self, tag, attrs): self._result.append('\n') elif tag == 'hr': - if self._result: + if self._result and isinstance(self._result[-1], str): self._result[-1] = self._result[-1].rstrip(' ') + else: + pass self._result.append('\n---\n') diff --git a/libs/apprise/decorators/CustomNotifyPlugin.py b/libs/apprise/decorators/base.py similarity index 97% rename from libs/apprise/decorators/CustomNotifyPlugin.py rename to libs/apprise/decorators/base.py index eb5f17b78..688fd96dc 100644 --- a/libs/apprise/decorators/CustomNotifyPlugin.py +++ b/libs/apprise/decorators/base.py @@ -27,8 +27,8 @@ # POSSIBILITY OF SUCH DAMAGE.USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from ..plugins.NotifyBase import NotifyBase -from ..NotificationManager import NotificationManager +from ..plugins.base import NotifyBase +from ..manager_plugins import NotificationManager from ..utils import URL_DETAILS_RE from ..utils import parse_url from ..utils import url_assembly @@ -55,6 +55,12 @@ class CustomNotifyPlugin(NotifyBase): # should be treated differently. category = 'custom' + # Support Attachments + attachment_support = True + + # Allow persistent storage support + storage_mode = common.PersistentStoreMode.AUTO + # Define object templates templates = ( '{schema}://', diff --git a/libs/apprise/decorators/notify.py b/libs/apprise/decorators/notify.py index 2dd5f5099..892c3adfe 100644 --- a/libs/apprise/decorators/notify.py +++ b/libs/apprise/decorators/notify.py @@ -26,7 +26,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from .CustomNotifyPlugin import CustomNotifyPlugin +from .base import CustomNotifyPlugin def notify(on, name=None): diff --git a/libs/apprise/exception.py b/libs/apprise/exception.py new file mode 100644 index 000000000..40967f5aa --- /dev/null +++ b/libs/apprise/exception.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron +# +# 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. +# +# 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. +import errno + + +class AppriseException(Exception): + """ + Base Apprise Exception Class + """ + def __init__(self, message, error_code=0): + super().__init__(message) + self.error_code = error_code + + +class AppriseDiskIOError(AppriseException): + """ + Thrown when an disk i/o error occurs + """ + def __init__(self, message, error_code=errno.EIO): + super().__init__(message, error_code=error_code) + + +class AppriseFileNotFound(AppriseDiskIOError, FileNotFoundError): + """ + Thrown when a persistent write occured in MEMORY mode + """ + def __init__(self, message): + super().__init__(message, error_code=errno.ENOENT) diff --git a/libs/apprise/i18n/en/LC_MESSAGES/apprise.mo b/libs/apprise/i18n/en/LC_MESSAGES/apprise.mo index 1d22b89a68a0bcb2532b945c30a51bab4eccad96..d916aab40e3f164fffefe0be0e98480fd743b984 100644 GIT binary patch delta 16 Xcmew^_g!v7HaD}Wp26lkZcY{eHzWlh delta 16 Xcmew^_g!v7HaD}8p5f*^ZcY{eHxdON diff --git a/libs/apprise/AppriseLocale.py b/libs/apprise/locale.py similarity index 100% rename from libs/apprise/AppriseLocale.py rename to libs/apprise/locale.py diff --git a/libs/apprise/manager.py b/libs/apprise/manager.py index c2b715d4f..ab7f6c994 100644 --- a/libs/apprise/manager.py +++ b/libs/apprise/manager.py @@ -36,6 +36,7 @@ from .utils import import_module from .utils import Singleton from .utils import parse_list +from .utils import path_decode from os.path import dirname from os.path import abspath from os.path import join @@ -61,6 +62,9 @@ class PluginManager(metaclass=Singleton): # The module path to scan module_path = join(abspath(dirname(__file__)), _id) + # For filtering our result when scanning a module + module_filter_re = re.compile(r'^(?P((?!_)[A-Za-z0-9]+))$') + # thread safe loading _lock = threading.Lock() @@ -177,7 +181,7 @@ def load_modules(self, path=None, name=None, force=False): # The .py extension is optional as we support loading directories # too module_re = re.compile( - r'^(?P' + self.fname_prefix + r'[a-z0-9]+)(\.py)?$', + r'^(?P(?!base|_)[a-z0-9_]+)(\.py)?$', re.I) t_start = time.time() @@ -188,10 +192,6 @@ def load_modules(self, path=None, name=None, force=False): # keep going continue - elif match.group('name') == f'{self.fname_prefix}Base': - # keep going - continue - # Store our notification/plugin name: module_name = match.group('name') module_pyname = '{}.{}'.format(module_name_prefix, module_name) @@ -216,7 +216,47 @@ def load_modules(self, path=None, name=None, force=False): # logging found in import_module and not needed here continue - if not hasattr(module, module_name): + module_class = None + for m_class in [obj for obj in dir(module) + if self.module_filter_re.match(obj)]: + # Get our plugin + plugin = getattr(module, m_class) + if not hasattr(plugin, 'app_id'): + # Filter out non-notification modules + logger.trace( + "(%s.%s) import failed; no app_id defined in %s", + self.name, m_class, os.path.join(module_path, f)) + continue + + # Add our plugin name to our module map + self._module_map[module_name] = { + 'plugin': set([plugin]), + 'module': module, + 'path': '{}.{}'.format( + module_name_prefix, module_name), + 'native': True, + } + + fn = getattr(plugin, 'schemas', None) + schemas = set([]) if not callable(fn) else fn(plugin) + + # map our schema to our plugin + for schema in schemas: + if schema in self._schema_map: + logger.error( + "{} schema ({}) mismatch detected - {} to {}" + .format(self.name, schema, self._schema_map, + plugin)) + continue + + # Assign plugin + self._schema_map[schema] = plugin + + # Store our class + module_class = m_class + break + + if not module_class: # Not a library we can load as it doesn't follow the simple # rule that the class must bear the same name as the # notification file itself. @@ -226,38 +266,6 @@ def load_modules(self, path=None, name=None, force=False): self.name, module_name, os.path.join(module_path, f)) continue - # Get our plugin - plugin = getattr(module, module_name) - if not hasattr(plugin, 'app_id'): - # Filter out non-notification modules - logger.trace( - "(%s) import failed; no app_id defined in %s", - self.name, module_name, os.path.join(module_path, f)) - continue - - # Add our plugin name to our module map - self._module_map[module_name] = { - 'plugin': set([plugin]), - 'module': module, - 'path': '{}.{}'.format(module_name_prefix, module_name), - 'native': True, - } - - fn = getattr(plugin, 'schemas', None) - schemas = set([]) if not callable(fn) else fn(plugin) - - # map our schema to our plugin - for schema in schemas: - if schema in self._schema_map: - logger.error( - "{} schema ({}) mismatch detected - {} to {}" - .format(self.name, schema, self._schema_map, - plugin)) - continue - - # Assign plugin - self._schema_map[schema] = plugin - logger.trace( '{} {} loaded in {:.6f}s'.format( self.name, module_name, (time.time() - tl_start))) @@ -366,7 +374,7 @@ def _import_module(path): return for _path in paths: - path = os.path.abspath(os.path.expanduser(_path)) + path = path_decode(_path) if (cache and path in self._paths_previously_scanned) \ or not os.path.exists(path): # We're done as we've already scanned this diff --git a/libs/apprise/AttachmentManager.py b/libs/apprise/manager_attachment.py similarity index 93% rename from libs/apprise/AttachmentManager.py rename to libs/apprise/manager_attachment.py index d296a4996..d1288a943 100644 --- a/libs/apprise/AttachmentManager.py +++ b/libs/apprise/manager_attachment.py @@ -26,6 +26,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +import re from os.path import dirname from os.path import abspath from os.path import join @@ -52,3 +53,7 @@ class AttachmentManager(PluginManager): # The module path to scan module_path = join(abspath(dirname(__file__)), _id) + + # For filtering our result set + module_filter_re = re.compile( + r'^(?P' + fname_prefix + r'(?!Base)[A-Za-z0-9]+)$') diff --git a/libs/apprise/ConfigurationManager.py b/libs/apprise/manager_config.py similarity index 93% rename from libs/apprise/ConfigurationManager.py rename to libs/apprise/manager_config.py index 6696895b9..69a6bedb9 100644 --- a/libs/apprise/ConfigurationManager.py +++ b/libs/apprise/manager_config.py @@ -26,6 +26,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +import re from os.path import dirname from os.path import abspath from os.path import join @@ -52,3 +53,7 @@ class ConfigurationManager(PluginManager): # The module path to scan module_path = join(abspath(dirname(__file__)), _id) + + # For filtering our result set + module_filter_re = re.compile( + r'^(?P' + fname_prefix + r'(?!Base)[A-Za-z0-9]+)$') diff --git a/libs/apprise/NotificationManager.py b/libs/apprise/manager_plugins.py similarity index 92% rename from libs/apprise/NotificationManager.py rename to libs/apprise/manager_plugins.py index abbbdd203..74ed370ea 100644 --- a/libs/apprise/NotificationManager.py +++ b/libs/apprise/manager_plugins.py @@ -26,6 +26,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +import re from os.path import dirname from os.path import abspath from os.path import join @@ -52,3 +53,8 @@ class NotificationManager(PluginManager): # The module path to scan module_path = join(abspath(dirname(__file__)), _id) + + # For filtering our result set + module_filter_re = re.compile( + r'^(?P' + fname_prefix + + r'(?!Base|ImageSize|Type)[A-Za-z0-9]+)$') diff --git a/libs/apprise/persistent_store.py b/libs/apprise/persistent_store.py new file mode 100644 index 000000000..ca7048517 --- /dev/null +++ b/libs/apprise/persistent_store.py @@ -0,0 +1,1676 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2024 Chris Caron +# All rights reserved. +# +# This code is licensed under the MIT License. +# +# 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. +import os +import re +import gzip +import zlib +import base64 +import glob +import tempfile +import json +import binascii +from . import exception +from itertools import chain +from datetime import datetime, timezone, timedelta +import time +import hashlib +from .common import PersistentStoreMode, PERSISTENT_STORE_MODES +from .utils import path_decode +from .logger import logger + +# Used for writing/reading time stored in cache file +EPOCH = datetime(1970, 1, 1, tzinfo=timezone.utc) + +# isoformat is spelled out for compatibility with Python v3.6 +AWARE_DATE_ISO_FORMAT = '%Y-%m-%dT%H:%M:%S.%f%z' +NAIVE_DATE_ISO_FORMAT = '%Y-%m-%dT%H:%M:%S.%f' + + +def _ntf_tidy(ntf): + """ + Reusable NamedTemporaryFile cleanup + """ + if ntf: + # Cleanup + try: + ntf.close() + + except OSError: + # Already closed + pass + + try: + os.unlink(ntf.name) + logger.trace( + 'Persistent temporary file removed: %s', ntf.name) + + except (FileNotFoundError, AttributeError): + # AttributeError: something weird was passed in, no action required + # FileNotFound: no worries; we were removing it anyway + pass + + except (OSError, IOError) as e: + logger.error( + 'Persistent temporary file removal failed: %s', + ntf.name) + logger.debug( + 'Persistent Storage Exception: %s', str(e)) + + +class CacheObject: + + hash_engine = hashlib.sha256 + hash_length = 6 + + def __init__(self, value=None, expires=False, persistent=True): + """ + Tracks our objects and associates a time limit with them + """ + + self.__value = value + self.__class_name = value.__class__.__name__ + self.__expires = None + + if expires: + self.set_expiry(expires) + + # Whether or not we persist this object to disk or not + self.__persistent = True if persistent else False + + def set(self, value, expires=None, persistent=None): + """ + Sets fields on demand, if set to none, then they are left as is + + The intent of set is that it allows you to set a new a value + and optionally alter meta information against it. + + If expires or persistent isn't specified then their previous values + are used. + + """ + + self.__value = value + self.__class_name = value.__class__.__name__ + if expires is not None: + self.set_expiry(expires) + + if persistent is not None: + self.__persistent = True if persistent else False + + def set_expiry(self, expires=None): + """ + Sets a new expiry + """ + + if isinstance(expires, datetime): + self.__expires = expires.astimezone(timezone.utc) + + elif expires in (None, False): + # Accepted - no expiry + self.__expires = None + + elif expires is True: + # Force expiry to now + self.__expires = datetime.now(tz=timezone.utc) + + elif isinstance(expires, (float, int)): + self.__expires = \ + datetime.now(tz=timezone.utc) + timedelta(seconds=expires) + + else: # Unsupported + raise AttributeError( + f"An invalid expiry time ({expires} was specified") + + def hash(self): + """ + Our checksum to track the validity of our data + """ + try: + return self.hash_engine( + str(self).encode('utf-8'), usedforsecurity=False).hexdigest() + + except TypeError: + # Python <= v3.8 - usedforsecurity flag does not work + return self.hash_engine(str(self).encode('utf-8')).hexdigest() + + def json(self): + """ + Returns our preparable json object + """ + + return { + 'v': self.__value, + 'x': (self.__expires - EPOCH).total_seconds() + if self.__expires else None, + 'c': self.__class_name if not isinstance(self.__value, datetime) + else ( + 'aware_datetime' if self.__value.tzinfo else 'naive_datetime'), + '!': self.hash()[:self.hash_length], + } + + @staticmethod + def instantiate(content, persistent=True, verify=True): + """ + Loads back data read in and returns a CacheObject or None if it could + not be loaded. You can pass in the contents of CacheObject.json() and + you'll receive a copy assuming the hash checks okay + + """ + try: + value = content['v'] + expires = content['x'] + if expires is not None: + expires = datetime.fromtimestamp(expires, timezone.utc) + + # Acquire some useful integrity objects + class_name = content.get('c', '') + if not isinstance(class_name, str): + raise TypeError('Class name not expected string') + + hashsum = content.get('!', '') + if not isinstance(hashsum, str): + raise TypeError('SHA1SUM not expected string') + + except (TypeError, KeyError) as e: + logger.trace(f'CacheObject could not be parsed from {content}') + logger.trace('CacheObject exception: %s', str(e)) + return None + + if class_name in ('aware_datetime', 'naive_datetime', 'datetime'): + # If datetime is detected, it will fall under the naive category + iso_format = AWARE_DATE_ISO_FORMAT \ + if class_name[0] == 'a' else NAIVE_DATE_ISO_FORMAT + try: + # Python v3.6 Support + value = datetime.strptime(value, iso_format) + + except (TypeError, ValueError): + # TypeError is thrown if content is not string + # ValueError is thrown if the string is not a valid format + logger.trace( + f'CacheObject (dt) corrupted loading from {content}') + return None + + elif class_name == 'bytes': + try: + # Convert our object back to a bytes + value = base64.b64decode(value) + + except binascii.Error: + logger.trace( + f'CacheObject (bin) corrupted loading from {content}') + return None + + # Initialize our object + co = CacheObject(value, expires, persistent=persistent) + if verify and co.hash()[:co.hash_length] != hashsum: + # Our object was tampered with + logger.debug(f'Tampering detected with cache entry {co}') + del co + return None + + return co + + @property + def value(self): + """ + Returns our value + """ + return self.__value + + @property + def persistent(self): + """ + Returns our persistent value + """ + return self.__persistent + + @property + def expires(self): + """ + Returns the datetime the object will expire + """ + return self.__expires + + @property + def expires_sec(self): + """ + Returns the number of seconds from now the object will expire + """ + + return None if self.__expires is None else max( + 0.0, (self.__expires - datetime.now(tz=timezone.utc)) + .total_seconds()) + + def __bool__(self): + """ + Returns True it the object hasn't expired, and False if it has + """ + if self.__expires is None: + # No Expiry + return True + + # Calculate if we've expired or not + return self.__expires > datetime.now(tz=timezone.utc) + + def __eq__(self, other): + """ + Handles equality == flag + """ + if isinstance(other, CacheObject): + return str(self) == str(other) + + return self.__value == other + + def __str__(self): + """ + string output of our data + """ + persistent = '+' if self.persistent else '-' + return f'{self.__class_name}:{persistent}:{self.__value} expires: ' +\ + ('never' if self.__expires is None + else self.__expires.strftime(NAIVE_DATE_ISO_FORMAT)) + + +class CacheJSONEncoder(json.JSONEncoder): + """ + A JSON Encoder for handling each of our cache objects + """ + + def default(self, entry): + if isinstance(entry, datetime): + return entry.strftime( + AWARE_DATE_ISO_FORMAT if entry.tzinfo is not None + else NAIVE_DATE_ISO_FORMAT) + + elif isinstance(entry, CacheObject): + return entry.json() + + elif isinstance(entry, bytes): + return base64.b64encode(entry).decode('utf-8') + + return super().default(entry) + + +class PersistentStore: + """ + An object to make working with persistent storage easier + + read() and write() are used for direct file i/o + + set(), get() are used for caching + """ + + # The maximum file-size we will allow the persistent store to grow to + # 1 MB = 1048576 bytes + max_file_size = 1048576 + + # 30 days in seconds + default_file_expiry = 2678400 + + # File encoding to use + encoding = 'utf-8' + + # Default data set + base_key = 'default' + + # Directory to store cache + __cache_key = 'cache' + + # Our Temporary working directory + temp_dir = 'tmp' + + # The directory our persistent store content gets placed in + data_dir = 'var' + + # Our Persistent Store File Extension + __extension = '.psdata' + + # Identify our backup file extension + __backup_extension = '._psbak' + + # Used to verify the key specified is valid + # - must start with an alpha_numeric + # - following optional characters can include period, underscore and + # equal + __valid_key = re.compile(r'[a-z0-9][a-z0-9._-]*', re.I) + + # Reference only + __not_found_ref = (None, None) + + def __init__(self, path=None, namespace='default', mode=None): + """ + Provide the namespace to work within. namespaces can only contain + alpha-numeric characters with the exception of '-' (dash), '_' + (underscore), and '.' (period). The namespace must be be relative + to the current URL being controlled. + """ + # Initalize our mode so __del__() calls don't go bad on the + # error checking below + self.__mode = None + + # Populated only once and after size() is called + self.__exclude_list = None + + # Files to renew on calls to flush + self.__renew = set() + + if not isinstance(namespace, str) \ + or not self.__valid_key.match(namespace): + raise AttributeError( + f"Persistent Storage namespace ({namespace}) provided is" + " invalid") + + if isinstance(path, str): + # A storage path has been defined + if mode is None: + # Store Default if no mode was provided along side of it + mode = PERSISTENT_STORE_MODES[0] + + # Store our information + self.__base_path = os.path.join(path_decode(path), namespace) + self.__temp_path = os.path.join(self.__base_path, self.temp_dir) + self.__data_path = os.path.join(self.__base_path, self.data_dir) + + else: # If no storage path is provide we set our mode to MEMORY + mode = PersistentStoreMode.MEMORY + self.__base_path = None + self.__temp_path = None + self.__data_path = None + + if mode not in PERSISTENT_STORE_MODES: + raise AttributeError( + f"Persistent Storage mode ({mode}) provided is invalid") + + # Store our mode + self.__mode = mode + + # Tracks when we have content to flush + self.__dirty = False + + # A caching value to track persistent storage disk size + self.__cache_size = None + self.__cache_files = {} + + # Internal Cache + self._cache = None + + # Prepare our environment + self.__prepare() + + def read(self, key=None, compress=True, expires=False): + """ + Returns the content of the persistent store object + + if refresh is set to True, then the file's modify time is updated + preventing it from getting caught in prune calls. It's a means + of allowing it to persist and not get cleaned up in later prune + calls. + + Content is always returned as a byte object + """ + try: + with self.open(key, mode="rb", compress=compress) as fd: + results = fd.read(self.max_file_size) + if expires is False: + self.__renew.add(os.path.join( + self.__data_path, f"{key}{self.__extension}")) + + return results + + except (FileNotFoundError, exception.AppriseDiskIOError): + # FileNotFoundError: No problem + # exception.AppriseDiskIOError: + # - Logging of error already occurred inside self.open() + pass + + except (OSError, zlib.error, EOFError, UnicodeDecodeError, + IOError) as e: + # We can't access the file or it does not exist + logger.warning('Could not read with persistent key: %s', key) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # return none + return None + + def write(self, data, key=None, compress=True, _recovery=False): + """ + Writes the content to the persistent store if it doesn't exceed our + filesize limit. + + Content is always written as a byte object + + _recovery is reserved for internal usage and should not be changed + """ + + if key is None: + key = self.base_key + + elif not isinstance(key, str) or not self.__valid_key.match(key): + raise AttributeError( + f"Persistent Storage key ({key} provided is invalid") + + if not isinstance(data, (bytes, str)): + # One last check, we will accept read() objets with the expectation + # it will return a binary dataset + if not (hasattr(data, 'read') and callable(getattr(data, 'read'))): + raise AttributeError( + "Invalid data type {} provided to Persistent Storage" + .format(type(data))) + + try: + # Read in our data + data = data.read() + if not isinstance(data, (bytes, str)): + raise AttributeError( + "Invalid data type {} provided to Persistent Storage" + .format(type(data))) + + except Exception as e: + logger.warning( + 'Could read() from potential iostream with persistent ' + 'key: %s', key) + logger.debug('Persistent Storage Exception: %s', str(e)) + raise exception.AppriseDiskIOError( + "Invalid data type {} provided to Persistent Storage" + .format(type(data))) + + if self.__mode == PersistentStoreMode.MEMORY: + # Nothing further can be done + return False + + if _recovery: + # Attempt to recover from a bad directory structure or setup + self.__prepare() + + # generate our filename based on the key provided + io_file = os.path.join(self.__data_path, f"{key}{self.__extension}") + + # Calculate the files current filesize + try: + prev_size = os.stat(io_file).st_size + + except FileNotFoundError: + # No worries, no size to accomodate + prev_size = 0 + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.warning('Could not write with persistent key: %s', key) + logger.debug('Persistent Storage Exception: %s', str(e)) + return False + + # Create a temporary file to write our content into + # ntf = NamedTemporaryFile + ntf = None + new_file_size = 0 + try: + if isinstance(data, str): + data = data.encode(self.encoding) + + ntf = tempfile.NamedTemporaryFile( + mode="wb", dir=self.__temp_path, + delete=False) + + # Close our file + ntf.close() + + # Pointer to our open call + _open = open if not compress else gzip.open + + with _open(ntf.name, mode='wb') as fd: + # Write our content + fd.write(data) + + # Get our file size + new_file_size = os.stat(ntf.name).st_size + + # Log our progress + logger.trace( + 'Wrote %d bytes of data to persistent key: %s', + new_file_size, key) + + except FileNotFoundError: + # This happens if the directory path is gone preventing the file + # from being created... + if not _recovery: + return self.write( + data=data, key=key, compress=compress, _recovery=True) + + # We've already made our best effort to recover if we are here in + # our code base... we're going to have to exit + + # Tidy our Named Temporary File + _ntf_tidy(ntf) + + # Early Exit + return False + + except (OSError, UnicodeEncodeError, IOError, zlib.error) as e: + # We can't access the file or it does not exist + logger.warning('Could not write to persistent key: %s', key) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # Tidy our Named Temporary File + _ntf_tidy(ntf) + + return False + + if self.max_file_size > 0 and ( + new_file_size + self.size() - prev_size) > self.max_file_size: + # The content to store is to large + logger.warning( + 'Persistent content exceeds allowable maximum file length ' + '({}KB); provide {}KB'.format( + int(self.max_file_size / 1024), + int(new_file_size / 1024))) + return False + + # Return our final move + if not self.__move(ntf.name, io_file): + # Attempt to restore things as they were + + # Tidy our Named Temporary File + _ntf_tidy(ntf) + return False + + # Resetour reference variables + self.__cache_size = None + self.__cache_files.clear() + + # Content installed + return True + + def __move(self, src, dst): + """ + Moves the new file in place and handles the old if it exists already + If the transaction fails in any way, the old file is swapped back. + + Function returns True if successful and False if not. + """ + + # A temporary backup of the file we want to move in place + dst_backup = dst[:-len(self.__backup_extension)] + \ + self.__backup_extension + + # + # Backup the old file (if it exists) allowing us to have a restore + # point in the event of a failure + # + try: + # make sure the file isn't already present; if it is; remove it + os.unlink(dst_backup) + logger.trace( + 'Removed previous persistent backup file: %s', dst_backup) + + except FileNotFoundError: + # no worries; we were removing it anyway + pass + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.warning( + 'Could not previous persistent data backup: %s', dst_backup) + logger.debug('Persistent Storage Exception: %s', str(e)) + return False + + try: + # Back our file up so we have a fallback + os.rename(dst, dst_backup) + logger.trace( + 'Persistent storage backup file created: %s', dst_backup) + + except FileNotFoundError: + # Not a problem; this is a brand new file we're writing + # There is nothing to backup + pass + + except (OSError, IOError) as e: + # This isn't good... we couldn't put our new file in place + logger.warning( + 'Could not install persistent content %s -> %s', + dst, os.path.basename(dst_backup)) + logger.debug('Persistent Storage Exception: %s', str(e)) + return False + + # + # Now place the new file + # + try: + os.rename(src, dst) + logger.trace('Persistent file installed: %s', dst) + + except (OSError, IOError) as e: + # This isn't good... we couldn't put our new file in place + # Begin fall-back process before leaving the funtion + logger.warning( + 'Could not install persistent content %s -> %s', + src, os.path.basename(dst)) + logger.debug('Persistent Storage Exception: %s', str(e)) + try: + # Restore our old backup (if it exists) + os.rename(dst_backup, dst) + logger.trace( + 'Restoring original persistent content: %s', dst) + + except FileNotFoundError: + # Not a problem + pass + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.warning( + 'Failed to restore original persistent file: %s', dst) + logger.debug('Persistent Storage Exception: %s', str(e)) + + return False + + return True + + def open(self, key=None, mode='r', buffering=-1, encoding=None, + errors=None, newline=None, closefd=True, opener=None, + compress=False, compresslevel=9): + """ + Returns an iterator to our our file within our namespace identified + by the key provided. + + If no key is provided, then the default is used + """ + + if key is None: + key = self.base_key + + elif not isinstance(key, str) or not self.__valid_key.match(key): + raise AttributeError( + f"Persistent Storage key ({key} provided is invalid") + + if self.__mode == PersistentStoreMode.MEMORY: + # Nothing further can be done + raise FileNotFoundError() + + io_file = os.path.join(self.__data_path, f"{key}{self.__extension}") + try: + return open( + io_file, mode=mode, buffering=buffering, encoding=encoding, + errors=errors, newline=newline, closefd=closefd, + opener=opener) \ + if not compress else gzip.open( + io_file, compresslevel=compresslevel, encoding=encoding, + errors=errors, newline=newline) + + except FileNotFoundError: + # pass along (but wrap with Apprise exception) + raise exception.AppriseFileNotFound( + f"No such file or directory: '{io_file}'") + + except (OSError, IOError, zlib.error) as e: + # We can't access the file or it does not exist + logger.warning('Could not read with persistent key: %s', key) + logger.debug('Persistent Storage Exception: %s', str(e)) + raise exception.AppriseDiskIOError(str(e)) + + def get(self, key, default=None, lazy=True): + """ + Fetches from cache + """ + + if self._cache is None and not self.__load_cache(): + return default + + if key in self._cache and \ + not self.__mode == PersistentStoreMode.MEMORY and \ + not self.__dirty: + + # ensure we renew our content + self.__renew.add(self.cache_file) + + return self._cache[key].value \ + if key in self._cache and self._cache[key] else default + + def set(self, key, value, expires=None, persistent=True, lazy=True): + """ + Cache reference + """ + + if self._cache is None and not self.__load_cache(): + return False + + cache = CacheObject(value, expires, persistent=persistent) + # Fetch our cache value + try: + if lazy and cache == self._cache[key]: + # We're done; nothing further to do + return True + + except KeyError: + pass + + # Store our new cache + self._cache[key] = CacheObject(value, expires, persistent=persistent) + + # Set our dirty flag + self.__dirty = persistent + + if self.__dirty and self.__mode == PersistentStoreMode.FLUSH: + # Flush changes to disk + return self.flush() + + return True + + def clear(self, *args): + """ + Remove one or more cache entry by it's key + + e.g: clear('key') + clear('key1', 'key2', key-12') + + Or clear everything: + clear() + """ + if self._cache is None and not self.__load_cache(): + return False + + if args: + for arg in args: + + try: + del self._cache[arg] + + # Set our dirty flag (if not set already) + self.__dirty = True + + except KeyError: + pass + + elif self._cache: + # Request to remove everything and there is something to remove + + # Set our dirty flag (if not set already) + self.__dirty = True + + # Reset our object + self._cache.clear() + + if self.__dirty and self.__mode == PersistentStoreMode.FLUSH: + # Flush changes to disk + return self.flush() + + def prune(self): + """ + Eliminates expired cache entries + """ + if self._cache is None and not self.__load_cache(): + return False + + change = False + for key in list(self._cache.keys()): + if key not in self: + # It's identified as being expired + if not change and self._cache[key].persistent: + # track change only if content was persistent + change = True + + # Set our dirty flag + self.__dirty = True + + del self._cache[key] + + if self.__dirty and self.__mode == PersistentStoreMode.FLUSH: + # Flush changes to disk + return self.flush() + + return change + + def __load_cache(self, _recovery=False): + """ + Loads our cache + + _recovery is reserved for internal usage and should not be changed + """ + + # Prepare our dirty flag + self.__dirty = False + + if self.__mode == PersistentStoreMode.MEMORY: + # Nothing further to do + self._cache = {} + return True + + # Prepare our cache file + cache_file = self.cache_file + try: + with gzip.open(cache_file, 'rb') as f: + # Read our ontent from disk + self._cache = {} + for k, v in json.loads(f.read().decode(self.encoding)).items(): + co = CacheObject.instantiate(v) + if co: + # Verify our object before assigning it + self._cache[k] = co + + elif not self.__dirty: + # Track changes from our loadset + self.__dirty = True + + except (UnicodeDecodeError, json.decoder.JSONDecodeError, zlib.error, + TypeError, AttributeError, EOFError): + + # Let users known there was a problem + logger.warning( + 'Corrupted access persistent cache content: %s', + cache_file) + + if not _recovery: + try: + os.unlink(cache_file) + logger.trace( + 'Removed previous persistent cache content: %s', + cache_file) + + except FileNotFoundError: + # no worries; we were removing it anyway + pass + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.warning( + 'Could not remove persistent cache content: %s', + cache_file) + logger.debug('Persistent Storage Exception: %s', str(e)) + return False + return self.__load_cache(_recovery=True) + + return False + + except FileNotFoundError: + # No problem; no cache to load + self._cache = {} + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.warning( + 'Could not load persistent cache for namespace %s', + os.path.basename(self.__base_path)) + logger.debug('Persistent Storage Exception: %s', str(e)) + return False + + # Ensure our dirty flag is set to False + return True + + def __prepare(self, flush=True): + """ + Prepares a working environment + """ + if self.__mode != PersistentStoreMode.MEMORY: + # Ensure our path exists + try: + os.makedirs(self.__base_path, mode=0o770, exist_ok=True) + + except (OSError, IOError) as e: + # Permission error + logger.debug( + 'Could not create persistent store directory %s', + self.__base_path) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # Mode changed back to MEMORY + self.__mode = PersistentStoreMode.MEMORY + + # Ensure our path exists + try: + os.makedirs(self.__temp_path, mode=0o770, exist_ok=True) + + except (OSError, IOError) as e: + # Permission error + logger.debug( + 'Could not create persistent store directory %s', + self.__temp_path) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # Mode changed back to MEMORY + self.__mode = PersistentStoreMode.MEMORY + + try: + os.makedirs(self.__data_path, mode=0o770, exist_ok=True) + + except (OSError, IOError) as e: + # Permission error + logger.debug( + 'Could not create persistent store directory %s', + self.__data_path) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # Mode changed back to MEMORY + self.__mode = PersistentStoreMode.MEMORY + + if self.__mode is PersistentStoreMode.MEMORY: + logger.warning( + 'The persistent storage could not be fully initialized; ' + 'operating in MEMORY mode') + + else: + if self._cache: + # Recovery taking place + self.__dirty = True + logger.warning( + 'The persistent storage environment was disrupted') + + if self.__mode is PersistentStoreMode.FLUSH and flush: + # Flush changes to disk + return self.flush(_recovery=True) + + def flush(self, force=False, _recovery=False): + """ + Save's our cache to disk + """ + + if self._cache is None or self.__mode == PersistentStoreMode.MEMORY: + # nothing to do + return True + + while self.__renew: + # update our files + path = self.__renew.pop() + ftime = time.time() + + try: + # (access_time, modify_time) + os.utime(path, (ftime, ftime)) + logger.trace('file timestamp updated: %s', path) + + except FileNotFoundError: + # No worries... move along + pass + + except (OSError, IOError) as e: + # We can't access the file or it does not exist + logger.debug('Could not update file timestamp: %s', path) + logger.debug('Persistent Storage Exception: %s', str(e)) + + if not force and self.__dirty is False: + # Nothing further to do + logger.trace('Persistent cache is consistent with memory map') + return True + + if _recovery: + # Attempt to recover from a bad directory structure or setup + self.__prepare(flush=False) + + # Unset our size lazy setting + self.__cache_size = None + self.__cache_files.clear() + + # Prepare our cache file + cache_file = self.cache_file + if not self._cache: + # + # We're deleting the cache file s there are no entries left in it + # + backup_file = cache_file[:-len(self.__backup_extension)] + \ + self.__backup_extension + + try: + os.unlink(backup_file) + logger.trace( + 'Removed previous persistent cache backup: %s', + backup_file) + + except FileNotFoundError: + # no worries; we were removing it anyway + pass + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.warning( + 'Could not remove persistent cache backup: %s', + backup_file) + logger.debug('Persistent Storage Exception: %s', str(e)) + return False + + try: + os.rename(cache_file, backup_file) + logger.trace( + 'Persistent cache backup file created: %s', + backup_file) + + except FileNotFoundError: + # Not a problem; do not create a log entry + pass + + except (OSError, IOError) as e: + # This isn't good... we couldn't put our new file in place + logger.warning( + 'Could not remove stale persistent cache file: %s', + cache_file) + logger.debug('Persistent Storage Exception: %s', str(e)) + return False + return True + + # + # If we get here, we need to update our file based cache + # + + # ntf = NamedTemporaryFile + ntf = None + + try: + ntf = tempfile.NamedTemporaryFile( + mode="w+", encoding=self.encoding, dir=self.__temp_path, + delete=False) + + ntf.close() + + except FileNotFoundError: + # This happens if the directory path is gone preventing the file + # from being created... + if not _recovery: + return self.flush(force=True, _recovery=True) + + # We've already made our best effort to recover if we are here in + # our code base... we're going to have to exit + + # Tidy our Named Temporary File + _ntf_tidy(ntf) + + # Early Exit + return False + + except OSError as e: + logger.error( + 'Persistent temporary directory inaccessible: %s', + self.__temp_path) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # Tidy our Named Temporary File + _ntf_tidy(ntf) + + # Early Exit + return False + + try: + # write our content currently saved to disk to our temporary file + with gzip.open(ntf.name, 'wb') as f: + # Write our content to disk + f.write(json.dumps( + {k: v for k, v in self._cache.items() + if v and v.persistent}, + separators=(',', ':'), + cls=CacheJSONEncoder).encode(self.encoding)) + + except TypeError as e: + # JSON object contains content that can not be encoded to disk + logger.error( + 'Persistent temporary file can not be written to ' + 'due to bad input data: %s', ntf.name) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # Tidy our Named Temporary File + _ntf_tidy(ntf) + + # Early Exit + return False + + except (OSError, EOFError, zlib.error) as e: + logger.error( + 'Persistent temporary file inaccessible: %s', + ntf.name) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # Tidy our Named Temporary File + _ntf_tidy(ntf) + + # Early Exit + return False + + if not self.__move(ntf.name, cache_file): + # Attempt to restore things as they were + + # Tidy our Named Temporary File + _ntf_tidy(ntf) + return False + + # Ensure our dirty flag is set to False + self.__dirty = False + + return True + + def files(self, exclude=True, lazy=True): + """ + Returns the total files + """ + + if lazy and exclude in self.__cache_files: + # Take an early exit with our cached results + return self.__cache_files[exclude] + + elif self.__mode == PersistentStoreMode.MEMORY: + # Take an early exit + # exclude is our cache switch and can be either True or False. + # For the below, we just set both cases and set them up as an + # empty record + self.__cache_files.update({True: [], False: []}) + return [] + + if not lazy or self.__exclude_list is None: + # A list of criteria that should be excluded from the size count + self.__exclude_list = ( + # Exclude backup cache file from count + re.compile(re.escape(os.path.join( + self.__base_path, + f'{self.__cache_key}{self.__backup_extension}'))), + + # Exclude temporary files + re.compile(re.escape(self.__temp_path) + r'[/\\].+'), + + # Exclude custom backup persistent files + re.compile( + re.escape(self.__data_path) + r'[/\\].+' + re.escape( + self.__backup_extension)), + ) + + try: + if exclude: + self.__cache_files[exclude] = \ + [path for path in filter(os.path.isfile, glob.glob( + os.path.join(self.__base_path, '**', '*'), + recursive=True)) + if next((False for p in self.__exclude_list + if p.match(path)), True)] + + else: # No exclusion list applied + self.__cache_files[exclude] = \ + [path for path in filter(os.path.isfile, glob.glob( + os.path.join(self.__base_path, '**', '*'), + recursive=True))] + + except (OSError, IOError): + # We can't access the directory or it does not exist + self.__cache_files[exclude] = [] + + return self.__cache_files[exclude] + + @staticmethod + def disk_scan(path, namespace=None, closest=True): + """ + Scansk a path provided and returns namespaces detected + """ + + logger.trace('Persistent path can of: %s', path) + + def is_namespace(x): + """ + Validate what was detected is a valid namespace + """ + return os.path.isdir(os.path.join(path, x)) \ + and PersistentStore.__valid_key.match(x) + + # Handle our namespace searching + if namespace: + if isinstance(namespace, str): + namespace = [namespace] + + elif not isinstance(namespace, (tuple, set, list)): + raise AttributeError( + "namespace must be None, a string, or a tuple/set/list " + "of strings") + + try: + # Acquire all of the files in question + namespaces = \ + [ns for ns in filter(is_namespace, os.listdir(path)) + if not namespace or next( + (True for n in namespace if ns.startswith(n)), False)] \ + if closest else \ + [ns for ns in filter(is_namespace, os.listdir(path)) + if not namespace or ns in namespace] + + except FileNotFoundError: + # no worries; Nothing to do + logger.debug('Disk Prune path not found; nothing to clean.') + return [] + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.error( + 'Disk Scan detetcted inaccessible path: %s', path) + logger.debug( + 'Persistent Storage Exception: %s', str(e)) + return [] + + return namespaces + + @staticmethod + def disk_prune(path, namespace=None, expires=None, action=False): + """ + Prune persistent disk storage entries that are old and/or unreferenced + + you must specify a path to perform the prune within + + if one or more namespaces are provided, then pruning focuses ONLY on + those entries (if matched). + + if action is not set to False, directories to be removed are returned + only + + """ + + # Prepare our File Expiry + expires = datetime.now() - timedelta(seconds=expires) \ + if isinstance(expires, (float, int)) and expires >= 0 \ + else PersistentStore.default_file_expiry + + # Get our namespaces + namespaces = PersistentStore.disk_scan(path, namespace) + + # Track matches + _map = {} + + for namespace in namespaces: + # Prepare our map + _map[namespace] = [] + + # Reference Directories + base_dir = os.path.join(path, namespace) + data_dir = os.path.join(base_dir, PersistentStore.data_dir) + temp_dir = os.path.join(base_dir, PersistentStore.temp_dir) + + # Careful to only focus on files created by this Persistent Store + # object + files = [ + os.path.join(base_dir, f'{PersistentStore.__cache_key}' + f'{PersistentStore.__extension}'), + os.path.join(base_dir, f'{PersistentStore.__cache_key}' + f'{PersistentStore.__backup_extension}'), + ] + + # Update our files (applying what was defined above too) + valid_data_re = re.compile( + r'.*(' + re.escape(PersistentStore.__extension) + + r'|' + re.escape(PersistentStore.__backup_extension) + r')$') + + files = [path for path in filter( + os.path.isfile, chain(glob.glob( + os.path.join(data_dir, '*'), recursive=False), files)) + if valid_data_re.match(path)] + + # Now all temporary files + files.extend([path for path in filter( + os.path.isfile, glob.glob( + os.path.join(temp_dir, '*'), recursive=False))]) + + # Track if we should do a directory sweep later on + dir_sweep = True + + # Scan our files + for file in files: + try: + mtime = datetime.fromtimestamp(os.path.getmtime(file)) + + except FileNotFoundError: + # no worries; we were removing it anyway + continue + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.error( + 'Disk Prune (ns=%s, clean=%s) detetcted inaccessible ' + 'file: %s', namespace, 'yes' if action else 'no', file) + logger.debug( + 'Persistent Storage Exception: %s', str(e)) + + # No longer worth doing a directory sweep + dir_sweep = False + continue + + if expires < mtime: + continue + + # + # Handle Removing + # + record = { + 'path': file, + 'removed': False, + } + + if action: + try: + os.unlink(file) + # Update our record + record['removed'] = True + logger.info( + 'Disk Prune (ns=%s, clean=%s) removed persistent ' + 'file: %s', namespace, + 'yes' if action else 'no', file) + + except FileNotFoundError: + # no longer worth doing a directory sweep + dir_sweep = False + + # otherwise, no worries; we were removing the file + # anyway + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + logger.error( + 'Disk Prune (ns=%s, clean=%s) failed to remove ' + 'persistent file: %s', namespace, + 'yes' if action else 'no', file) + + logger.debug( + 'Persistent Storage Exception: %s', str(e)) + + # No longer worth doing a directory sweep + dir_sweep = False + + # Store our record + _map[namespace].append(record) + + # Memory tidy + del files + + if dir_sweep: + # Gracefully cleanup our namespace directory. It's okay if we + # fail; This just means there were files in the directory. + for dirpath in (temp_dir, data_dir, base_dir): + if action: + try: + os.rmdir(dirpath) + logger.info( + 'Disk Prune (ns=%s, clean=%s) removed ' + 'persistent dir: %s', namespace, + 'yes' if action else 'no', dirpath) + except OSError: + # do nothing; + pass + return _map + + def size(self, exclude=True, lazy=True): + """ + Returns the total size of the persistent storage in bytes + """ + + if lazy and self.__cache_size is not None: + # Take an early exit + return self.__cache_size + + elif self.__mode == PersistentStoreMode.MEMORY: + # Take an early exit + self.__cache_size = 0 + return self.__cache_size + + # Get a list of files (file paths) in the given directory + try: + self.__cache_size = sum( + [os.stat(path).st_size for path in + self.files(exclude=exclude, lazy=lazy)]) + + except (OSError, IOError): + # We can't access the directory or it does not exist + self.__cache_size = 0 + + return self.__cache_size + + def __del__(self): + """ + Deconstruction of our object + """ + + if self.__mode == PersistentStoreMode.AUTO: + # Flush changes to disk + self.flush() + + def __delitem__(self, key): + """ + Remove a cache entry by it's key + """ + if self._cache is None and not self.__load_cache(): + raise KeyError("Could not initialize cache") + + try: + if self._cache[key].persistent: + # Set our dirty flag in advance + self.__dirty = True + + # Store our new cache + del self._cache[key] + + except KeyError: + # Nothing to do + raise + + if self.__dirty and self.__mode == PersistentStoreMode.FLUSH: + # Flush changes to disk + self.flush() + + return + + def __contains__(self, key): + """ + Verify if our storage contains the key specified or not. + In additiont to this, if the content is expired, it is considered + to be not contained in the storage. + """ + if self._cache is None and not self.__load_cache(): + return False + + return key in self._cache and self._cache[key] + + def __setitem__(self, key, value): + """ + Sets a cache value without disrupting existing settings in place + """ + + if self._cache is None and not self.__load_cache(): + raise KeyError("Could not initialize cache") + + if key not in self._cache and not self.set(key, value): + raise KeyError("Could not set cache") + + else: + # Update our value + self._cache[key].set(value) + + if self._cache[key].persistent: + # Set our dirty flag in advance + self.__dirty = True + + if self.__dirty and self.__mode == PersistentStoreMode.FLUSH: + # Flush changes to disk + self.flush() + + return + + def __getitem__(self, key): + """ + Returns the indexed value + """ + + if self._cache is None and not self.__load_cache(): + raise KeyError("Could not initialize cache") + + result = self.get(key, default=self.__not_found_ref, lazy=False) + if result is self.__not_found_ref: + raise KeyError(f" {key} not found in cache") + + return result + + def keys(self): + """ + Returns our keys + """ + if self._cache is None and not self.__load_cache(): + # There are no keys to return + return {}.keys() + + return self._cache.keys() + + def delete(self, *args, all=None, temp=None, cache=None, validate=True): + """ + Manages our file space and tidys it up + + delete('key', 'key2') + delete(all=True) + delete(temp=True, cache=True) + """ + + # Our failure flag + has_error = False + + valid_key_re = re.compile( + r'^(?P.+)(' + + re.escape(self.__backup_extension) + + r'|' + re.escape(self.__extension) + r')$', re.I) + + # Default asignments + if all is None: + all = True if not (len(args) or temp or cache) else False + if temp is None: + temp = True if all else False + if cache is None: + cache = True if all else False + + if cache and self._cache: + # Reset our object + self._cache.clear() + # Reset dirt flag + self.__dirty = False + + for path in self.files(exclude=False): + + # Some information we use to validate the actions of our clean() + # call. This is so we don't remove anything we shouldn't + base = os.path.dirname(path) + fname = os.path.basename(path) + + # Clean printable path details + ppath = os.path.join(os.path.dirname(base), fname) + + if base == self.__base_path and cache: + # We're handling a cache file (hopefully) + result = valid_key_re.match(fname) + key = None if not result else ( + result['key'] if self.__valid_key.match(result['key']) + else None) + + if validate and key != self.__cache_key: + # We're not dealing with a cache key + logger.debug( + 'Persistent File cleanup ignoring file: %s', path) + continue + + # + # We should proceed with removing the file if we get here + # + + elif base == self.__data_path and (args or all): + # We're handling a file found in our custom data path + result = valid_key_re.match(fname) + key = None if not result else ( + result['key'] if self.__valid_key.match(result['key']) + else None) + + if validate and key is None: + # we're set to validate and a non-valid file was found + logger.debug( + 'Persistent File cleanup ignoring file: %s', path) + continue + + elif not all and (key is None or key not in args): + # no match found + logger.debug( + 'Persistent File cleanup ignoring file: %s', path) + continue + + # + # We should proceed with removing the file if we get here + # + + elif base == self.__temp_path and temp: + # + # This directory is a temporary path and nothing in here needs + # to be further verified. Proceed with the removing of the file + # + pass + + else: + # No match; move on + logger.debug('Persistent File cleanup ignoring file: %s', path) + continue + + try: + os.unlink(path) + logger.info('Removed persistent file: %s', ppath) + + except FileNotFoundError: + # no worries; we were removing it anyway + pass + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + has_error = True + logger.error( + 'Failed to remove persistent file: %s', ppath) + logger.debug('Persistent Storage Exception: %s', str(e)) + + # Reset our reference variables + self.__cache_size = None + self.__cache_files.clear() + + return not has_error + + @property + def cache_file(self): + """ + Returns the full path to the namespace directory + """ + return os.path.join( + self.__base_path, + f'{self.__cache_key}{self.__extension}', + ) + + @property + def path(self): + """ + Returns the full path to the namespace directory + """ + return self.__base_path + + @property + def mode(self): + """ + Returns the full path to the namespace directory + """ + return self.__mode diff --git a/libs/apprise/plugins/__init__.py b/libs/apprise/plugins/__init__.py index 72cb08fbf..bfce14371 100644 --- a/libs/apprise/plugins/__init__.py +++ b/libs/apprise/plugins/__init__.py @@ -30,7 +30,7 @@ import copy # Used for testing -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NOTIFY_IMAGE_SIZES @@ -40,9 +40,9 @@ from ..utils import cwe312_url from ..utils import GET_SCHEMA_RE from ..logger import logger -from ..AppriseLocale import gettext_lazy as _ -from ..AppriseLocale import LazyTranslation -from ..NotificationManager import NotificationManager +from ..locale import gettext_lazy as _ +from ..locale import LazyTranslation +from ..manager_plugins import NotificationManager # Grant access to our Notification Manager Singleton diff --git a/libs/apprise/plugins/africas_talking.py b/libs/apprise/plugins/africas_talking.py new file mode 100644 index 000000000..af8a78577 --- /dev/null +++ b/libs/apprise/plugins/africas_talking.py @@ -0,0 +1,470 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron +# +# 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. +# +# 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. + +# To use this plugin, you must have a Africas Talking Account setup; See here: +# https://account.africastalking.com/ +# From here... acquire your APIKey +# +# API Details: https://developers.africastalking.com/docs/sms/sending/bulk +import requests + +from .base import NotifyBase +from ..common import NotifyType +from ..utils import is_phone_no +from ..utils import parse_bool +from ..utils import parse_phone_no +from ..utils import validate_regex +from ..locale import gettext_lazy as _ + + +class AfricasTalkingSMSMode: + """ + Africas Talking SMS Mode + """ + # BulkSMS Mode + BULKSMS = 'bulksms' + + # Premium Mode + PREMIUM = 'premium' + + # Sandbox Mode + SANDBOX = 'sandbox' + + +# Define the types in a list for validation purposes +AFRICAS_TALKING_SMS_MODES = ( + AfricasTalkingSMSMode.BULKSMS, + AfricasTalkingSMSMode.PREMIUM, + AfricasTalkingSMSMode.SANDBOX, +) + + +# Extend HTTP Error Messages +AFRICAS_TALKING_HTTP_ERROR_MAP = { + 100: 'Processed', + 101: 'Sent', + 102: 'Queued', + 401: 'Risk Hold', + 402: 'Invalid Sender ID', + 403: 'Invalid Phone Number', + 404: 'Unsupported Number Type', + 405: 'Insufficient Balance', + 406: 'User In Blacklist', + 407: 'Could Not Route', + 409: 'Do Not Disturb Rejection', + 500: 'Internal Server Error', + 501: 'Gateway Error', + 502: 'Rejected By Gateway', +} + + +class NotifyAfricasTalking(NotifyBase): + """ + A wrapper for Africas Talking Notifications + """ + + # The default descriptive name associated with the Notification + service_name = 'Africas Talking' + + # The services URL + service_url = 'https://africastalking.com/' + + # The default secure protocol + secure_protocol = 'atalk' + + # A URL that takes you to the setup/help of the specific protocol + setup_url = 'https://github.com/caronc/apprise/wiki/Notify_africas_talking' + + # Africas Talking API Request URLs + notify_url = { + AfricasTalkingSMSMode.BULKSMS: + 'https://api.africastalking.com/version1/messaging', + AfricasTalkingSMSMode.PREMIUM: + 'https://content.africastalking.com/version1/messaging', + AfricasTalkingSMSMode.SANDBOX: + 'https://api.sandbox.africastalking.com/version1/messaging', + } + + # The maximum allowable characters allowed in the title per message + title_maxlen = 0 + + # The maximum allowable characters allowed in the body per message + body_maxlen = 160 + + # The maximum amount of phone numbers that can reside within a single + # batch transfer + default_batch_size = 50 + + # Define object templates + templates = ( + '{schema}://{appuser}@{apikey}/{targets}', + ) + + # Define our template tokens + template_tokens = dict(NotifyBase.template_tokens, **{ + 'appuser': { + 'name': _('App User Name'), + 'type': 'string', + 'regex': (r'^[A-Z0-9_-]+$', 'i'), + 'required': True, + }, + 'apikey': { + 'name': _('API Key'), + 'type': 'string', + 'required': True, + 'private': True, + 'regex': (r'^[A-Z0-9_-]+$', 'i'), + }, + 'target_phone': { + 'name': _('Target Phone'), + 'type': 'string', + 'map_to': 'targets', + }, + 'targets': { + 'name': _('Targets'), + 'type': 'list:string', + }, + }) + + # Define our template arguments + template_args = dict(NotifyBase.template_args, **{ + 'to': { + 'alias_of': 'targets', + }, + 'apikey': { + 'alias_of': 'apikey', + }, + 'from': { + # Your registered short code or alphanumeric + 'name': _('From'), + 'type': 'string', + 'default': 'AFRICASTKNG', + 'map_to': 'sender', + }, + 'batch': { + 'name': _('Batch Mode'), + 'type': 'bool', + 'default': False, + }, + 'mode': { + 'name': _('SMS Mode'), + 'type': 'choice:string', + 'values': AFRICAS_TALKING_SMS_MODES, + 'default': AFRICAS_TALKING_SMS_MODES[0], + }, + }) + + def __init__(self, appuser, apikey, targets=None, sender=None, batch=None, + mode=None, **kwargs): + """ + Initialize Africas Talking Object + """ + super().__init__(**kwargs) + + self.appuser = validate_regex( + appuser, *self.template_tokens['appuser']['regex']) + if not self.appuser: + msg = 'The Africas Talking appuser specified ({}) is invalid.'\ + .format(appuser) + self.logger.warning(msg) + raise TypeError(msg) + + self.apikey = validate_regex( + apikey, *self.template_tokens['apikey']['regex']) + if not self.apikey: + msg = 'The Africas Talking apikey specified ({}) is invalid.'\ + .format(apikey) + self.logger.warning(msg) + raise TypeError(msg) + + # Prepare Sender + self.sender = self.template_args['from']['default'] \ + if sender is None else sender + + # Prepare Batch Mode Flag + self.batch = self.template_args['batch']['default'] \ + if batch is None else batch + + self.mode = self.template_args['mode']['default'] \ + if not isinstance(mode, str) else mode.lower() + + if isinstance(mode, str) and mode: + self.mode = next( + (a for a in AFRICAS_TALKING_SMS_MODES if a.startswith( + mode.lower())), None) + + if self.mode not in AFRICAS_TALKING_SMS_MODES: + msg = 'The Africas Talking mode specified ({}) is invalid.'\ + .format(mode) + self.logger.warning(msg) + raise TypeError(msg) + else: + self.mode = self.template_args['mode']['default'] + + # Parse our targets + self.targets = list() + + for target in parse_phone_no(targets): + # Validate targets and drop bad ones: + result = is_phone_no(target) + if not result: + self.logger.warning( + 'Dropped invalid phone # ' + '({}) specified.'.format(target), + ) + continue + + # store valid phone number + # Carry forward '+' if defined, otherwise do not... + self.targets.append( + ('+' + result['full']) + if target.lstrip()[0] == '+' else result['full']) + + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + """ + Perform Africas Talking Notification + """ + + if not self.targets: + # There is no one to email; we're done + self.logger.warning( + 'There are no Africas Talking recipients to notify') + return False + + headers = { + 'User-Agent': self.app_id, + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json', + 'apiKey': self.apikey, + } + + # error tracking (used for function return) + has_error = False + + # Send in batches if identified to do so + batch_size = 1 if not self.batch else self.default_batch_size + + # Create a copy of the target list + for index in range(0, len(self.targets), batch_size): + # Prepare our payload + payload = { + 'username': self.appuser, + 'to': ','.join(self.targets[index:index + batch_size]), + 'from': self.sender, + 'message': body, + } + + # Acquire our URL + notify_url = self.notify_url[self.mode] + + self.logger.debug( + 'Africas Talking POST URL: %s (cert_verify=%r)' % ( + notify_url, self.verify_certificate)) + self.logger.debug('Africas Talking Payload: %s' % str(payload)) + + # Printable target detail + p_target = self.targets[index] if batch_size == 1 \ + else '{} target(s)'.format( + len(self.targets[index:index + batch_size])) + + # Always call throttle before any remote server i/o is made + self.throttle() + try: + r = requests.post( + notify_url, + data=payload, + headers=headers, + verify=self.verify_certificate, + timeout=self.request_timeout, + ) + # Sample response + # { + # "SMSMessageData": { + # "Message": "Sent to 1/1 Total Cost: KES 0.8000", + # "Recipients": [{ + # "statusCode": 101, + # "number": "+254711XXXYYY", + # "status": "Success", + # "cost": "KES 0.8000", + # "messageId": "ATPid_SampleTxnId123" + # }] + # } + # } + + if r.status_code not in (100, 101, 102, requests.codes.ok): + # We had a problem + status_str = \ + NotifyAfricasTalking.http_response_code_lookup( + r.status_code, AFRICAS_TALKING_HTTP_ERROR_MAP) + + self.logger.warning( + 'Failed to send Africas Talking notification to {}: ' + '{}{}error={}.'.format( + p_target, + status_str, + ', ' if status_str else '', + r.status_code)) + + self.logger.debug( + 'Response Details:\r\n{}'.format(r.content)) + + # Mark our failure + has_error = True + continue + + else: + self.logger.info( + 'Sent Africas Talking notification to {}.' + .format(p_target)) + + except requests.RequestException as e: + self.logger.warning( + 'A Connection error occurred sending Africas Talking ' + 'notification to {}.'.format(p_target)) + self.logger.debug('Socket Exception: %s' % str(e)) + + # Mark our failure + has_error = True + continue + + return not has_error + + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.appuser, self.apikey) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any URL parameters + params = { + 'batch': 'yes' if self.batch else 'no', + } + + if self.sender != self.template_args['from']['default']: + # Set our sender if it was set + params['from'] = self.sender + + if self.mode != self.template_args['mode']['default']: + # Set our mode + params['mode'] = self.mode + + # Extend our parameters + params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + + return '{schema}://{appuser}@{apikey}/{targets}?{params}'.format( + schema=self.secure_protocol, + appuser=NotifyAfricasTalking.quote(self.appuser, safe=''), + apikey=self.pprint(self.apikey, privacy, safe=''), + targets='/'.join( + [NotifyAfricasTalking.quote(x, safe='+') + for x in self.targets]), + params=NotifyAfricasTalking.urlencode(params), + ) + + def __len__(self): + """ + Returns the number of targets associated with this notification + """ + # + # Factor batch into calculation + # + batch_size = 1 if not self.batch else self.default_batch_size + targets = len(self.targets) + if batch_size > 1: + targets = int(targets / batch_size) + \ + (1 if targets % batch_size else 0) + + return targets if targets > 0 else 1 + + @staticmethod + def parse_url(url): + """ + Parses the URL and returns enough arguments that can allow + us to re-instantiate this object. + + """ + results = NotifyBase.parse_url(url, verify_host=False) + if not results: + # We're done early as we couldn't load the results + return results + + # The Application User ID + results['appuser'] = NotifyAfricasTalking.unquote(results['user']) + + # Prepare our targets + results['targets'] = [] + + # Our Application APIKey + if 'apikey' in results['qsd'] and len(results['qsd']['apikey']): + # Store our apikey if specified as keyword + results['apikey'] = \ + NotifyAfricasTalking.unquote(results['qsd']['apikey']) + + # This means our host is actually a phone number (target) + results['targets'].append( + NotifyAfricasTalking.unquote(results['host'])) + + else: + # First item is our apikey + results['apikey'] = NotifyAfricasTalking.unquote(results['host']) + + # Store our remaining targets found on path + results['targets'].extend( + NotifyAfricasTalking.split_path(results['fullpath'])) + + # The 'from' makes it easier to use yaml configuration + if 'from' in results['qsd'] and len(results['qsd']['from']): + results['sender'] = \ + NotifyAfricasTalking.unquote(results['qsd']['from']) + + # Support the 'to' variable so that we can support targets this way too + # The 'to' makes it easier to use yaml configuration + if 'to' in results['qsd'] and len(results['qsd']['to']): + results['targets'] += \ + NotifyAfricasTalking.parse_phone_no(results['qsd']['to']) + + # Get our Mode + if 'mode' in results['qsd'] and len(results['qsd']['mode']): + results['mode'] = \ + NotifyAfricasTalking.unquote(results['qsd']['mode']) + + # Get Batch Mode Flag + results['batch'] = \ + parse_bool(results['qsd'].get( + 'batch', + NotifyAfricasTalking.template_args['batch']['default'])) + + return results diff --git a/libs/apprise/plugins/NotifyAppriseAPI.py b/libs/apprise/plugins/apprise_api.py similarity index 92% rename from libs/apprise/plugins/NotifyAppriseAPI.py rename to libs/apprise/plugins/apprise_api.py index 34c34a6d4..d6156438f 100644 --- a/libs/apprise/plugins/NotifyAppriseAPI.py +++ b/libs/apprise/plugins/apprise_api.py @@ -29,14 +29,14 @@ import re import requests from json import dumps -import base64 -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .. import exception +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class AppriseAPIMethod: @@ -123,7 +123,7 @@ class NotifyAppriseAPI(NotifyBase): 'type': 'string', 'required': True, 'private': True, - 'regex': (r'^[A-Z0-9_-]{1,32}$', 'i'), + 'regex': (r'^[A-Z0-9_-]{1,128}$', 'i'), }, }) @@ -261,39 +261,45 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, if not attachment: # We could not access the attachment self.logger.error( - 'Could not access attachment {}.'.format( + 'Could not access Apprise API attachment {}.'.format( attachment.url(privacy=True))) return False try: + # Our Attachment filename + filename = attachment.name \ + if attachment.name else f'file{no:03}.dat' + if self.method == AppriseAPIMethod.JSON: - with open(attachment.path, 'rb') as f: - # Output must be in a DataURL format (that's what - # PushSafer calls it): - attachments.append({ - 'filename': attachment.name, - 'base64': base64.b64encode(f.read()) - .decode('utf-8'), - 'mimetype': attachment.mimetype, - }) + # Output must be in a DataURL format (that's what + # PushSafer calls it): + attachments.append({ + "filename": filename, + 'base64': attachment.base64(), + 'mimetype': attachment.mimetype, + }) else: # AppriseAPIMethod.FORM files.append(( 'file{:02d}'.format(no), ( - attachment.name, + filename, open(attachment.path, 'rb'), attachment.mimetype, ) )) - except (OSError, IOError) as e: - self.logger.warning( - 'An I/O error occurred while reading {}.'.format( - attachment.name if attachment else 'attachment')) - self.logger.debug('I/O Exception: %s' % str(e)) + except (TypeError, OSError, exception.AppriseException): + # We could not access the attachment + self.logger.error( + 'Could not access AppriseAPI attachment {}.'.format( + attachment.url(privacy=True))) return False + self.logger.debug( + 'Appending AppriseAPI attachment {}'.format( + attachment.url(privacy=True))) + # prepare Apprise API Object payload = { # Apprise API Payload diff --git a/libs/apprise/plugins/NotifyAprs.py b/libs/apprise/plugins/aprs.py similarity index 98% rename from libs/apprise/plugins/NotifyAprs.py rename to libs/apprise/plugins/aprs.py index 5d8c3c100..d87025fee 100644 --- a/libs/apprise/plugins/NotifyAprs.py +++ b/libs/apprise/plugins/aprs.py @@ -70,9 +70,9 @@ import socket import sys from itertools import chain -from .NotifyBase import NotifyBase -from ..AppriseLocale import gettext_lazy as _ -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..locale import gettext_lazy as _ +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_call_sign from ..utils import parse_call_sign @@ -729,6 +729,15 @@ def url(self, privacy=False, *args, **kwargs): params=NotifyAprs.urlencode(params), ) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.user, self.password, self.locale) + def __len__(self): """ Returns the number of targets associated with this notification diff --git a/libs/apprise/plugins/NotifyBark.py b/libs/apprise/plugins/bark.py similarity index 96% rename from libs/apprise/plugins/NotifyBark.py rename to libs/apprise/plugins/bark.py index 781a1515e..e676e0c31 100644 --- a/libs/apprise/plugins/NotifyBark.py +++ b/libs/apprise/plugins/bark.py @@ -32,13 +32,13 @@ import requests import json -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_list from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Sounds generated off of: https://github.com/Finb/Bark/tree/master/Sounds @@ -395,6 +395,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, self.port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyBase.py b/libs/apprise/plugins/base.py similarity index 92% rename from libs/apprise/plugins/NotifyBase.py rename to libs/apprise/plugins/base.py index c29417c60..1c490defa 100644 --- a/libs/apprise/plugins/NotifyBase.py +++ b/libs/apprise/plugins/base.py @@ -30,7 +30,7 @@ import re from functools import partial -from ..URLBase import URLBase +from ..url import URLBase from ..common import NotifyType from ..utils import parse_bool from ..common import NOTIFY_TYPES @@ -38,8 +38,10 @@ from ..common import NOTIFY_FORMATS from ..common import OverflowMode from ..common import OVERFLOW_MODES -from ..AppriseLocale import gettext_lazy as _ -from ..AppriseAttachment import AppriseAttachment +from ..common import PersistentStoreMode +from ..locale import gettext_lazy as _ +from ..persistent_store import PersistentStore +from ..apprise_attachment import AppriseAttachment class NotifyBase(URLBase): @@ -130,12 +132,19 @@ class NotifyBase(URLBase): # of lines. Setting this to zero disables this feature. body_max_line_count = 0 + # Persistent storage default settings + persistent_storage = True + # Default Notify Format notify_format = NotifyFormat.TEXT # Default Overflow Mode overflow_mode = OverflowMode.UPSTREAM + # Our default is to no not use persistent storage beyond in-memory + # reference + storage_mode = PersistentStoreMode.MEMORY + # Default Emoji Interpretation interpret_emojis = False @@ -197,6 +206,16 @@ class NotifyBase(URLBase): # runtime. '_lookup_default': 'interpret_emojis', }, + 'store': { + 'name': _('Persistent Storage'), + # Use Persistent Storage + 'type': 'bool', + # Provide a default + 'default': persistent_storage, + # look up default using the following parent class value at + # runtime. + '_lookup_default': 'persistent_storage', + }, }) # @@ -268,6 +287,9 @@ def __init__(self, **kwargs): # are turned off (no user over-rides allowed) # + # Our Persistent Storage object is initialized on demand + self.__store = None + # Take a default self.interpret_emojis = self.asset.interpret_emojis if 'emojis' in kwargs: @@ -301,6 +323,14 @@ def __init__(self, **kwargs): # Provide override self.overflow_mode = overflow + # Prepare our Persistent Storage switch + self.persistent_storage = parse_bool( + kwargs.get('store', NotifyBase.persistent_storage)) + if not self.persistent_storage: + # Enforce the disabling of cache (ortherwise defaults are use) + self.url_identifier = False + self.__cached_url_identifier = None + def image_url(self, notify_type, logo=False, extension=None, image_size=None): """ @@ -364,6 +394,17 @@ def color(self, notify_type, color_type=None): color_type=color_type, ) + def ascii(self, notify_type): + """ + Returns the ascii characters associated with the notify_type + """ + if notify_type not in NOTIFY_TYPES: + return None + + return self.asset.ascii( + notify_type=notify_type, + ) + def notify(self, *args, **kwargs): """ Performs notification @@ -715,6 +756,10 @@ def url_parameters(self, *args, **kwargs): 'overflow': self.overflow_mode, } + # Persistent Storage Setting + if self.persistent_storage != NotifyBase.persistent_storage: + params['store'] = 'yes' if self.persistent_storage else 'no' + params.update(super().url_parameters(*args, **kwargs)) # return default parameters @@ -767,6 +812,10 @@ def parse_url(url, verify_host=True, plus_to_space=False): # Allow emoji's override if 'emojis' in results['qsd']: results['emojis'] = parse_bool(results['qsd'].get('emojis')) + # Store our persistent storage boolean + + if 'store' in results['qsd']: + results['store'] = results['qsd']['store'] return results @@ -787,3 +836,29 @@ def parse_native_url(url): should return the same set of results that parse_url() does. """ return None + + @property + def store(self): + """ + Returns a pointer to our persistent store for use. + + The best use cases are: + self.store.get('key') + self.store.set('key', 'value') + self.store.delete('key1', 'key2', ...) + + You can also access the keys this way: + self.store['key'] + + And clear them: + del self.store['key'] + + """ + if self.__store is None: + # Initialize our persistent store for use + self.__store = PersistentStore( + namespace=self.url_id(), + path=self.asset.storage_path, + mode=self.asset.storage_mode) + + return self.__store diff --git a/libs/apprise/plugins/NotifyBase.pyi b/libs/apprise/plugins/base.pyi similarity index 100% rename from libs/apprise/plugins/NotifyBase.pyi rename to libs/apprise/plugins/base.pyi diff --git a/libs/apprise/plugins/NotifyBoxcar.py b/libs/apprise/plugins/boxcar.py similarity index 97% rename from libs/apprise/plugins/NotifyBoxcar.py rename to libs/apprise/plugins/boxcar.py index 808920ed5..f7f16b04a 100644 --- a/libs/apprise/plugins/NotifyBoxcar.py +++ b/libs/apprise/plugins/boxcar.py @@ -35,14 +35,14 @@ from itertools import chain from urllib.parse import urlparse -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..utils import parse_bool from ..utils import parse_list from ..utils import validate_regex from ..common import NotifyType from ..common import NotifyImageSize -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Default to sending to all devices if nothing is specified DEFAULT_TAG = '@all' @@ -341,6 +341,15 @@ def url(self, privacy=False, *args, **kwargs): params=NotifyBoxcar.urlencode(params), ) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.access, self.secret) + def __len__(self): """ Returns the number of targets associated with this notification diff --git a/libs/apprise/plugins/NotifyBulkSMS.py b/libs/apprise/plugins/bulksms.py similarity index 96% rename from libs/apprise/plugins/NotifyBulkSMS.py rename to libs/apprise/plugins/bulksms.py index 33664fb00..f53f61267 100644 --- a/libs/apprise/plugins/NotifyBulkSMS.py +++ b/libs/apprise/plugins/bulksms.py @@ -36,13 +36,13 @@ import requests import json from itertools import chain -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ IS_GROUP_RE = re.compile( @@ -269,7 +269,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): 'to': None, 'body': body, 'routingGroup': self.route, - 'encoding': BulkSMSEncoding.UNICODE \ + 'encoding': BulkSMSEncoding.UNICODE if self.unicode else BulkSMSEncoding.TEXT, # Options are NONE, ALL and ERRORS 'deliveryReports': "ERRORS" @@ -413,6 +413,19 @@ def url(self, privacy=False, *args, **kwargs): for x in self.groups])), params=NotifyBulkSMS.urlencode(params)) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, + self.user if self.user else None, + self.password if self.password else None, + ) + def __len__(self): """ Returns the number of targets associated with this notification diff --git a/libs/apprise/plugins/NotifyBulkVS.py b/libs/apprise/plugins/bulkvs.py similarity index 97% rename from libs/apprise/plugins/NotifyBulkVS.py rename to libs/apprise/plugins/bulkvs.py index e912dff25..a02d8ab8c 100644 --- a/libs/apprise/plugins/NotifyBulkVS.py +++ b/libs/apprise/plugins/bulkvs.py @@ -35,13 +35,13 @@ # Messaging/post_messageSend import requests import json -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyBulkVS(NotifyBase): @@ -304,6 +304,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.source, self.user, self.password) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyBurstSMS.py b/libs/apprise/plugins/burstsms.py similarity index 97% rename from libs/apprise/plugins/NotifyBurstSMS.py rename to libs/apprise/plugins/burstsms.py index 39606abba..3b6f2669a 100644 --- a/libs/apprise/plugins/NotifyBurstSMS.py +++ b/libs/apprise/plugins/burstsms.py @@ -33,14 +33,14 @@ # import requests -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class BurstSMSCountryCode: @@ -378,6 +378,15 @@ def url(self, privacy=False, *args, **kwargs): [NotifyBurstSMS.quote(x, safe='') for x in self.targets]), params=NotifyBurstSMS.urlencode(params)) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey, self.secret, self.source) + def __len__(self): """ Returns the number of targets associated with this notification diff --git a/libs/apprise/plugins/NotifyChantify.py b/libs/apprise/plugins/chantify.py similarity index 94% rename from libs/apprise/plugins/NotifyChantify.py rename to libs/apprise/plugins/chantify.py index d912bd257..e7c5f63e9 100644 --- a/libs/apprise/plugins/NotifyChantify.py +++ b/libs/apprise/plugins/chantify.py @@ -35,10 +35,10 @@ import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyChantify(NotifyBase): @@ -181,6 +181,15 @@ def url(self, privacy=False, *args, **kwargs): params=NotifyChantify.urlencode(params), ) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.token) + @staticmethod def parse_url(url): """ diff --git a/libs/apprise/plugins/NotifyClickSend.py b/libs/apprise/plugins/clicksend.py similarity index 92% rename from libs/apprise/plugins/NotifyClickSend.py rename to libs/apprise/plugins/clicksend.py index 5e345fe10..7f28ac913 100644 --- a/libs/apprise/plugins/NotifyClickSend.py +++ b/libs/apprise/plugins/clicksend.py @@ -41,15 +41,14 @@ # import requests from json import dumps -from base64 import b64encode -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Extend HTTP Error Messages CLICKSEND_HTTP_ERROR_MAP = { @@ -89,7 +88,7 @@ class NotifyClickSend(NotifyBase): # Define object templates templates = ( - '{schema}://{user}:{password}@{targets}', + '{schema}://{user}:{apikey}@{targets}', ) # Define our template tokens @@ -99,11 +98,12 @@ class NotifyClickSend(NotifyBase): 'type': 'string', 'required': True, }, - 'password': { - 'name': _('Password'), + 'apikey': { + 'name': _('API Key'), 'type': 'string', 'private': True, 'required': True, + 'map_to': 'password', }, 'target_phone': { 'name': _('Target Phone No'), @@ -124,6 +124,9 @@ class NotifyClickSend(NotifyBase): 'to': { 'alias_of': 'targets', }, + 'key': { + 'alias_of': 'apikey', + }, 'batch': { 'name': _('Batch Mode'), 'type': 'bool', @@ -174,9 +177,6 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): headers = { 'User-Agent': self.app_id, 'Content-Type': 'application/json; charset=utf-8', - 'Authorization': 'Basic {}'.format( - b64encode('{}:{}'.format( - self.user, self.password).encode('utf-8'))), } # error tracking (used for function return) @@ -208,6 +208,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): r = requests.post( self.notify_url, data=dumps(payload), + auth=(self.user, self.password), headers=headers, verify=self.verify_certificate, timeout=self.request_timeout, @@ -284,6 +285,15 @@ def url(self, privacy=False, *args, **kwargs): params=NotifyClickSend.urlencode(params), ) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.user, self.password) + def __len__(self): """ Returns the number of targets associated with this notification @@ -322,6 +332,12 @@ def parse_url(url): results['batch'] = \ parse_bool(results['qsd'].get('batch', False)) + # API Key + if 'key' in results['qsd'] and len(results['qsd']['key']): + # Extract the API Key from an argument + results['password'] = \ + NotifyClickSend.unquote(results['qsd']['key']) + # Support the 'to' variable so that we can support rooms this way too # The 'to' makes it easier to use yaml configuration if 'to' in results['qsd'] and len(results['qsd']['to']): diff --git a/libs/apprise/plugins/NotifyForm.py b/libs/apprise/plugins/custom_form.py similarity index 96% rename from libs/apprise/plugins/NotifyForm.py rename to libs/apprise/plugins/custom_form.py index 9690cd4f5..e9ffcbbb4 100644 --- a/libs/apprise/plugins/NotifyForm.py +++ b/libs/apprise/plugins/custom_form.py @@ -29,11 +29,11 @@ import re import requests -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyType -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class FORMPayloadField: @@ -272,62 +272,6 @@ def __init__(self, headers=None, method=None, payload=None, params=None, return - def url(self, privacy=False, *args, **kwargs): - """ - Returns the URL built dynamically based on specified arguments. - """ - - # Define any URL parameters - params = { - 'method': self.method, - } - - # Extend our parameters - params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) - - # Append our headers into our parameters - params.update({'+{}'.format(k): v for k, v in self.headers.items()}) - - # Append our GET params into our parameters - params.update({'-{}'.format(k): v for k, v in self.params.items()}) - - # Append our payload extra's into our parameters - params.update( - {':{}'.format(k): v for k, v in self.payload_extras.items()}) - params.update( - {':{}'.format(k): v for k, v in self.payload_overrides.items()}) - - if self.attach_as != self.attach_as_default: - # Provide Attach-As extension details - params['attach-as'] = self.attach_as - - # Determine Authentication - auth = '' - if self.user and self.password: - auth = '{user}:{password}@'.format( - user=NotifyForm.quote(self.user, safe=''), - password=self.pprint( - self.password, privacy, mode=PrivacyMode.Secret, safe=''), - ) - elif self.user: - auth = '{user}@'.format( - user=NotifyForm.quote(self.user, safe=''), - ) - - default_port = 443 if self.secure else 80 - - return '{schema}://{auth}{hostname}{port}{fullpath}?{params}'.format( - schema=self.secure_protocol if self.secure else self.protocol, - auth=auth, - # never encode hostname since we're expecting it to be a valid one - hostname=self.host, - port='' if self.port is None or self.port == default_port - else ':{}'.format(self.port), - fullpath=NotifyForm.quote(self.fullpath, safe='/') - if self.fullpath else '/', - params=NotifyForm.urlencode(params), - ) - def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, **kwargs): """ @@ -358,7 +302,8 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, files.append(( self.attach_as.format(no) if self.attach_multi_support else self.attach_as, ( - attachment.name, + attachment.name + if attachment.name else f'file{no:03}.dat', open(attachment.path, 'rb'), attachment.mimetype) )) @@ -486,6 +431,76 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, + self.port if self.port else (443 if self.secure else 80), + self.fullpath.rstrip('/'), + ) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any URL parameters + params = { + 'method': self.method, + } + + # Extend our parameters + params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + + # Append our headers into our parameters + params.update({'+{}'.format(k): v for k, v in self.headers.items()}) + + # Append our GET params into our parameters + params.update({'-{}'.format(k): v for k, v in self.params.items()}) + + # Append our payload extra's into our parameters + params.update( + {':{}'.format(k): v for k, v in self.payload_extras.items()}) + params.update( + {':{}'.format(k): v for k, v in self.payload_overrides.items()}) + + if self.attach_as != self.attach_as_default: + # Provide Attach-As extension details + params['attach-as'] = self.attach_as + + # Determine Authentication + auth = '' + if self.user and self.password: + auth = '{user}:{password}@'.format( + user=NotifyForm.quote(self.user, safe=''), + password=self.pprint( + self.password, privacy, mode=PrivacyMode.Secret, safe=''), + ) + elif self.user: + auth = '{user}@'.format( + user=NotifyForm.quote(self.user, safe=''), + ) + + default_port = 443 if self.secure else 80 + + return '{schema}://{auth}{hostname}{port}{fullpath}?{params}'.format( + schema=self.secure_protocol if self.secure else self.protocol, + auth=auth, + # never encode hostname since we're expecting it to be a valid one + hostname=self.host, + port='' if self.port is None or self.port == default_port + else ':{}'.format(self.port), + fullpath=NotifyForm.quote(self.fullpath, safe='/') + if self.fullpath else '/', + params=NotifyForm.urlencode(params), + ) + @staticmethod def parse_url(url): """ diff --git a/libs/apprise/plugins/NotifyJSON.py b/libs/apprise/plugins/custom_json.py similarity index 89% rename from libs/apprise/plugins/NotifyJSON.py rename to libs/apprise/plugins/custom_json.py index 182ff77cf..03585c9ef 100644 --- a/libs/apprise/plugins/NotifyJSON.py +++ b/libs/apprise/plugins/custom_json.py @@ -27,14 +27,14 @@ # POSSIBILITY OF SUCH DAMAGE. import requests -import base64 from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .. import exception +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyType -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class JSONPayloadField: @@ -195,56 +195,6 @@ def __init__(self, headers=None, method=None, payload=None, params=None, return - def url(self, privacy=False, *args, **kwargs): - """ - Returns the URL built dynamically based on specified arguments. - """ - - # Define any URL parameters - params = { - 'method': self.method, - } - - # Extend our parameters - params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) - - # Append our headers into our parameters - params.update({'+{}'.format(k): v for k, v in self.headers.items()}) - - # Append our GET params into our parameters - params.update({'-{}'.format(k): v for k, v in self.params.items()}) - - # Append our payload extra's into our parameters - params.update( - {':{}'.format(k): v for k, v in self.payload_extras.items()}) - - # Determine Authentication - auth = '' - if self.user and self.password: - auth = '{user}:{password}@'.format( - user=NotifyJSON.quote(self.user, safe=''), - password=self.pprint( - self.password, privacy, mode=PrivacyMode.Secret, safe=''), - ) - elif self.user: - auth = '{user}@'.format( - user=NotifyJSON.quote(self.user, safe=''), - ) - - default_port = 443 if self.secure else 80 - - return '{schema}://{auth}{hostname}{port}{fullpath}?{params}'.format( - schema=self.secure_protocol if self.secure else self.protocol, - auth=auth, - # never encode hostname since we're expecting it to be a valid one - hostname=self.host, - port='' if self.port is None or self.port == default_port - else ':{}'.format(self.port), - fullpath=NotifyJSON.quote(self.fullpath, safe='/') - if self.fullpath else '/', - params=NotifyJSON.urlencode(params), - ) - def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, **kwargs): """ @@ -263,33 +213,34 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, # Track our potential attachments attachments = [] if attach and self.attachment_support: - for attachment in attach: + for no, attachment in enumerate(attach, start=1): # Perform some simple error checking if not attachment: # We could not access the attachment self.logger.error( - 'Could not access attachment {}.'.format( + 'Could not access Custom JSON attachment {}.'.format( attachment.url(privacy=True))) return False try: - with open(attachment.path, 'rb') as f: - # Output must be in a DataURL format (that's what - # PushSafer calls it): - attachments.append({ - 'filename': attachment.name, - 'base64': base64.b64encode(f.read()) - .decode('utf-8'), - 'mimetype': attachment.mimetype, - }) - - except (OSError, IOError) as e: - self.logger.warning( - 'An I/O error occurred while reading {}.'.format( - attachment.name if attachment else 'attachment')) - self.logger.debug('I/O Exception: %s' % str(e)) + attachments.append({ + "filename": attachment.name + if attachment.name else f'file{no:03}.dat', + 'base64': attachment.base64(), + 'mimetype': attachment.mimetype, + }) + + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access Custom JSON attachment {}.'.format( + attachment.url(privacy=True))) return False + self.logger.debug( + 'Appending Custom JSON attachment {}'.format( + attachment.url(privacy=True))) + # Prepare JSON Object payload = { JSONPayloadField.VERSION: self.json_version, @@ -395,6 +346,70 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, + self.port if self.port else (443 if self.secure else 80), + self.fullpath.rstrip('/'), + ) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any URL parameters + params = { + 'method': self.method, + } + + # Extend our parameters + params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + + # Append our headers into our parameters + params.update({'+{}'.format(k): v for k, v in self.headers.items()}) + + # Append our GET params into our parameters + params.update({'-{}'.format(k): v for k, v in self.params.items()}) + + # Append our payload extra's into our parameters + params.update( + {':{}'.format(k): v for k, v in self.payload_extras.items()}) + + # Determine Authentication + auth = '' + if self.user and self.password: + auth = '{user}:{password}@'.format( + user=NotifyJSON.quote(self.user, safe=''), + password=self.pprint( + self.password, privacy, mode=PrivacyMode.Secret, safe=''), + ) + elif self.user: + auth = '{user}@'.format( + user=NotifyJSON.quote(self.user, safe=''), + ) + + default_port = 443 if self.secure else 80 + + return '{schema}://{auth}{hostname}{port}{fullpath}?{params}'.format( + schema=self.secure_protocol if self.secure else self.protocol, + auth=auth, + # never encode hostname since we're expecting it to be a valid one + hostname=self.host, + port='' if self.port is None or self.port == default_port + else ':{}'.format(self.port), + fullpath=NotifyJSON.quote(self.fullpath, safe='/') + if self.fullpath else '/', + params=NotifyJSON.urlencode(params), + ) + @staticmethod def parse_url(url): """ diff --git a/libs/apprise/plugins/NotifyXML.py b/libs/apprise/plugins/custom_xml.py similarity index 89% rename from libs/apprise/plugins/NotifyXML.py rename to libs/apprise/plugins/custom_xml.py index 21ccb79d3..8bfff3ece 100644 --- a/libs/apprise/plugins/NotifyXML.py +++ b/libs/apprise/plugins/custom_xml.py @@ -28,13 +28,13 @@ import re import requests -import base64 -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .. import exception +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyType -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class XMLPayloadField: @@ -242,58 +242,6 @@ def __init__(self, headers=None, method=None, payload=None, params=None, return - def url(self, privacy=False, *args, **kwargs): - """ - Returns the URL built dynamically based on specified arguments. - """ - - # Define any URL parameters - params = { - 'method': self.method, - } - - # Extend our parameters - params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) - - # Append our headers into our parameters - params.update({'+{}'.format(k): v for k, v in self.headers.items()}) - - # Append our GET params into our parameters - params.update({'-{}'.format(k): v for k, v in self.params.items()}) - - # Append our payload extra's into our parameters - params.update( - {':{}'.format(k): v for k, v in self.payload_extras.items()}) - params.update( - {':{}'.format(k): v for k, v in self.payload_overrides.items()}) - - # Determine Authentication - auth = '' - if self.user and self.password: - auth = '{user}:{password}@'.format( - user=NotifyXML.quote(self.user, safe=''), - password=self.pprint( - self.password, privacy, mode=PrivacyMode.Secret, safe=''), - ) - elif self.user: - auth = '{user}@'.format( - user=NotifyXML.quote(self.user, safe=''), - ) - - default_port = 443 if self.secure else 80 - - return '{schema}://{auth}{hostname}{port}{fullpath}?{params}'.format( - schema=self.secure_protocol if self.secure else self.protocol, - auth=auth, - # never encode hostname since we're expecting it to be a valid one - hostname=self.host, - port='' if self.port is None or self.port == default_port - else ':{}'.format(self.port), - fullpath=NotifyXML.quote(self.fullpath, safe='/') - if self.fullpath else '/', - params=NotifyXML.urlencode(params), - ) - def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, **kwargs): """ @@ -339,35 +287,39 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, attachments = [] if attach and self.attachment_support: - for attachment in attach: + for no, attachment in enumerate(attach, start=1): # Perform some simple error checking if not attachment: # We could not access the attachment self.logger.error( - 'Could not access attachment {}.'.format( + 'Could not access Custom XML attachment {}.'.format( attachment.url(privacy=True))) return False try: - with open(attachment.path, 'rb') as f: - # Prepare our Attachment in Base64 - entry = \ - ''.format( - NotifyXML.escape_html( - attachment.name, whitespace=False), - NotifyXML.escape_html( - attachment.mimetype, whitespace=False)) - entry += base64.b64encode(f.read()).decode('utf-8') - entry += '' - attachments.append(entry) - - except (OSError, IOError) as e: - self.logger.warning( - 'An I/O error occurred while reading {}.'.format( - attachment.name if attachment else 'attachment')) - self.logger.debug('I/O Exception: %s' % str(e)) + # Prepare our Attachment in Base64 + entry = \ + ''.format( + NotifyXML.escape_html( + attachment.name if attachment.name + else f'file{no:03}.dat', whitespace=False), + NotifyXML.escape_html( + attachment.mimetype, whitespace=False)) + entry += attachment.base64() + entry += '' + attachments.append(entry) + + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access Custom XML attachment {}.'.format( + attachment.url(privacy=True))) return False + self.logger.debug( + 'Appending Custom XML attachment {}'.format( + attachment.url(privacy=True))) + # Update our xml_attachments record: xml_attachments = \ '' + \ @@ -467,6 +419,72 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, + self.port if self.port else (443 if self.secure else 80), + self.fullpath.rstrip('/'), + ) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any URL parameters + params = { + 'method': self.method, + } + + # Extend our parameters + params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + + # Append our headers into our parameters + params.update({'+{}'.format(k): v for k, v in self.headers.items()}) + + # Append our GET params into our parameters + params.update({'-{}'.format(k): v for k, v in self.params.items()}) + + # Append our payload extra's into our parameters + params.update( + {':{}'.format(k): v for k, v in self.payload_extras.items()}) + params.update( + {':{}'.format(k): v for k, v in self.payload_overrides.items()}) + + # Determine Authentication + auth = '' + if self.user and self.password: + auth = '{user}:{password}@'.format( + user=NotifyXML.quote(self.user, safe=''), + password=self.pprint( + self.password, privacy, mode=PrivacyMode.Secret, safe=''), + ) + elif self.user: + auth = '{user}@'.format( + user=NotifyXML.quote(self.user, safe=''), + ) + + default_port = 443 if self.secure else 80 + + return '{schema}://{auth}{hostname}{port}{fullpath}?{params}'.format( + schema=self.secure_protocol if self.secure else self.protocol, + auth=auth, + # never encode hostname since we're expecting it to be a valid one + hostname=self.host, + port='' if self.port is None or self.port == default_port + else ':{}'.format(self.port), + fullpath=NotifyXML.quote(self.fullpath, safe='/') + if self.fullpath else '/', + params=NotifyXML.urlencode(params), + ) + @staticmethod def parse_url(url): """ diff --git a/libs/apprise/plugins/NotifyD7Networks.py b/libs/apprise/plugins/d7networks.py similarity index 97% rename from libs/apprise/plugins/NotifyD7Networks.py rename to libs/apprise/plugins/d7networks.py index 906ec2fb9..ff2e31b05 100644 --- a/libs/apprise/plugins/NotifyD7Networks.py +++ b/libs/apprise/plugins/d7networks.py @@ -39,13 +39,13 @@ from json import dumps from json import loads -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import validate_regex from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Extend HTTP Error Messages D7NETWORKS_HTTP_ERROR_MAP = { @@ -354,6 +354,15 @@ def url(self, privacy=False, *args, **kwargs): [NotifyD7Networks.quote(x, safe='') for x in self.targets]), params=NotifyD7Networks.urlencode(params)) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.token) + def __len__(self): """ Returns the number of targets associated with this notification diff --git a/libs/apprise/plugins/NotifyDapnet.py b/libs/apprise/plugins/dapnet.py similarity index 97% rename from libs/apprise/plugins/NotifyDapnet.py rename to libs/apprise/plugins/dapnet.py index ae7199c94..725174c14 100644 --- a/libs/apprise/plugins/NotifyDapnet.py +++ b/libs/apprise/plugins/dapnet.py @@ -51,9 +51,9 @@ import requests from requests.auth import HTTPBasicAuth -from .NotifyBase import NotifyBase -from ..AppriseLocale import gettext_lazy as _ -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..locale import gettext_lazy as _ +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_call_sign from ..utils import parse_call_sign @@ -346,6 +346,15 @@ def url(self, privacy=False, *args, **kwargs): params=NotifyDapnet.urlencode(params), ) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.user, self.password) + def __len__(self): """ Returns the number of targets associated with this notification diff --git a/libs/apprise/plugins/NotifyDBus.py b/libs/apprise/plugins/dbus.py similarity index 98% rename from libs/apprise/plugins/NotifyDBus.py rename to libs/apprise/plugins/dbus.py index 52e119813..9a22a85f8 100644 --- a/libs/apprise/plugins/NotifyDBus.py +++ b/libs/apprise/plugins/dbus.py @@ -27,11 +27,11 @@ # POSSIBILITY OF SUCH DAMAGE. import sys -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Default our global support flag NOTIFY_DBUS_SUPPORT_ENABLED = False @@ -173,7 +173,6 @@ class NotifyDBus(NotifyBase): # object if we were to reference, we wouldn't be backwards compatible with # Python v2. So converting the result set back into a list makes us # compatible - # TODO: Review after dropping support for Python 2. protocol = list(MAINLOOP_MAP.keys()) # A URL that takes you to the setup/help of the specific protocol @@ -196,6 +195,10 @@ class NotifyDBus(NotifyBase): dbus_interface = 'org.freedesktop.Notifications' dbus_setting_location = '/org/freedesktop/Notifications' + # No URL Identifier will be defined for this service as there simply isn't + # enough details to uniquely identify one dbus:// from another. + url_identifier = False + # Define object templates templates = ( '{schema}://', diff --git a/libs/apprise/plugins/NotifyDingTalk.py b/libs/apprise/plugins/dingtalk.py similarity index 96% rename from libs/apprise/plugins/NotifyDingTalk.py rename to libs/apprise/plugins/dingtalk.py index d4a492fc7..e675f5302 100644 --- a/libs/apprise/plugins/NotifyDingTalk.py +++ b/libs/apprise/plugins/dingtalk.py @@ -34,13 +34,13 @@ import requests from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Register at https://dingtalk.com # - Download their PC based software as it is the only way you can create @@ -310,6 +310,15 @@ def url(self, privacy=False, *args, **kwargs): [NotifyDingTalk.quote(x, safe='') for x in self.targets]), args=NotifyDingTalk.urlencode(args)) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.secret, self.token) + def __len__(self): """ Returns the number of targets associated with this notification diff --git a/libs/apprise/plugins/NotifyDiscord.py b/libs/apprise/plugins/discord.py similarity index 98% rename from libs/apprise/plugins/NotifyDiscord.py rename to libs/apprise/plugins/discord.py index 82d764f50..e41e22cdc 100644 --- a/libs/apprise/plugins/NotifyDiscord.py +++ b/libs/apprise/plugins/discord.py @@ -50,14 +50,14 @@ from datetime import datetime from datetime import timezone -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import NotifyType from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ -from ..attachment.AttachBase import AttachBase +from ..locale import gettext_lazy as _ +from ..attachment.base import AttachBase # Used to detect user/role IDs @@ -607,6 +607,15 @@ def url(self, privacy=False, *args, **kwargs): params=NotifyDiscord.urlencode(params), ) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.webhook_id, self.webhook_token) + @staticmethod def parse_url(url): """ diff --git a/libs/apprise/plugins/NotifyEmail.py b/libs/apprise/plugins/email.py similarity index 97% rename from libs/apprise/plugins/NotifyEmail.py rename to libs/apprise/plugins/email.py index 80f88bf61..2e423916a 100644 --- a/libs/apprise/plugins/NotifyEmail.py +++ b/libs/apprise/plugins/email.py @@ -41,12 +41,12 @@ from datetime import datetime from datetime import timezone -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyFormat, NotifyType from ..conversion import convert_between -from ..utils import is_email, parse_emails, is_hostname -from ..AppriseLocale import gettext_lazy as _ +from ..utils import is_ipaddr, is_email, parse_emails, is_hostname +from ..locale import gettext_lazy as _ from ..logger import logger # Globally Default encoding mode set to Quoted Printable. @@ -799,7 +799,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, mixed = MIMEMultipart("mixed") mixed.attach(base) # Now store our attachments - for attachment in attach: + for no, attachment in enumerate(attach, start=1): if not attachment: # We could not load the attachment; take an early # exit since this isn't what the end user wanted @@ -819,10 +819,14 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, app = MIMEApplication(abody.read()) app.set_type(attachment.mimetype) + # Prepare our attachment name + filename = attachment.name \ + if attachment.name else f'file{no:03}.dat' + app.add_header( 'Content-Disposition', 'attachment; filename="{}"'.format( - Header(attachment.name, 'utf-8')), + Header(filename, 'utf-8')), ) mixed.attach(app) base = mixed @@ -1031,6 +1035,20 @@ def url(self, privacy=False, *args, **kwargs): params=NotifyEmail.urlencode(params), ) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, + self.port if self.port + else SECURE_MODES[self.secure_mode]['default_port'], + ) + def __len__(self): """ Returns the number of targets associated with this notification @@ -1053,8 +1071,12 @@ def parse_url(url): # Prepare our target lists results['targets'] = [] - if not is_hostname(results['host'], ipv4=False, ipv6=False, - underscore=False): + if is_ipaddr(results['host']): + # Silently move on and do not disrupt any configuration + pass + + elif not is_hostname(results['host'], ipv4=False, ipv6=False, + underscore=False): if is_email(NotifyEmail.unquote(results['host'])): # Don't lose defined email addresses diff --git a/libs/apprise/plugins/NotifyEmby.py b/libs/apprise/plugins/emby.py similarity index 97% rename from libs/apprise/plugins/NotifyEmby.py rename to libs/apprise/plugins/emby.py index ce96553a2..5824932e8 100644 --- a/libs/apprise/plugins/NotifyEmby.py +++ b/libs/apprise/plugins/emby.py @@ -34,12 +34,12 @@ from json import dumps from json import loads -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..utils import parse_bool from ..common import NotifyType from .. import __version__ as VERSION -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyEmby(NotifyBase): @@ -593,6 +593,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.user, self.password, self.host, + self.port if self.port else (443 if self.secure else 80), + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyEnigma2.py b/libs/apprise/plugins/enigma2.py similarity index 95% rename from libs/apprise/plugins/NotifyEnigma2.py rename to libs/apprise/plugins/enigma2.py index 313149993..a79d3b57e 100644 --- a/libs/apprise/plugins/NotifyEnigma2.py +++ b/libs/apprise/plugins/enigma2.py @@ -37,10 +37,10 @@ import requests from json import loads -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class Enigma2MessageType: @@ -181,6 +181,20 @@ def __init__(self, timeout=None, headers=None, **kwargs): return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, + self.user, self.password, self.host, + self.port if self.port else (443 if self.secure else 80), + self.fullpath.rstrip('/'), + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyFCM/__init__.py b/libs/apprise/plugins/fcm/__init__.py similarity index 98% rename from libs/apprise/plugins/NotifyFCM/__init__.py rename to libs/apprise/plugins/fcm/__init__.py index 54b6c9cc7..e5db817e2 100644 --- a/libs/apprise/plugins/NotifyFCM/__init__.py +++ b/libs/apprise/plugins/fcm/__init__.py @@ -50,15 +50,15 @@ # You will need this in order to send an apprise messag import requests from json import dumps -from ..NotifyBase import NotifyBase +from ..base import NotifyBase from ...common import NotifyType from ...utils import validate_regex from ...utils import parse_list from ...utils import parse_bool from ...utils import dict_full_update from ...common import NotifyImageSize -from ...AppriseAttachment import AppriseAttachment -from ...AppriseLocale import gettext_lazy as _ +from ...apprise_attachment import AppriseAttachment +from ...locale import gettext_lazy as _ from .common import (FCMMode, FCM_MODES) from .priority import (FCM_PRIORITIES, FCMPriorityManager) from .color import FCMColorManager @@ -507,6 +507,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.mode, self.apikey, self.project) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyFCM/color.py b/libs/apprise/plugins/fcm/color.py similarity index 99% rename from libs/apprise/plugins/NotifyFCM/color.py rename to libs/apprise/plugins/fcm/color.py index c7da209a7..20149eedd 100644 --- a/libs/apprise/plugins/NotifyFCM/color.py +++ b/libs/apprise/plugins/fcm/color.py @@ -36,7 +36,7 @@ import re from ...utils import parse_bool from ...common import NotifyType -from ...AppriseAsset import AppriseAsset +from ...asset import AppriseAsset class FCMColorManager: diff --git a/libs/apprise/plugins/NotifyFCM/common.py b/libs/apprise/plugins/fcm/common.py similarity index 100% rename from libs/apprise/plugins/NotifyFCM/common.py rename to libs/apprise/plugins/fcm/common.py diff --git a/libs/apprise/plugins/NotifyFCM/oauth.py b/libs/apprise/plugins/fcm/oauth.py similarity index 100% rename from libs/apprise/plugins/NotifyFCM/oauth.py rename to libs/apprise/plugins/fcm/oauth.py diff --git a/libs/apprise/plugins/NotifyFCM/priority.py b/libs/apprise/plugins/fcm/priority.py similarity index 100% rename from libs/apprise/plugins/NotifyFCM/priority.py rename to libs/apprise/plugins/fcm/priority.py diff --git a/libs/apprise/plugins/NotifyFeishu.py b/libs/apprise/plugins/feishu.py similarity index 95% rename from libs/apprise/plugins/NotifyFeishu.py rename to libs/apprise/plugins/feishu.py index e6988333c..9b3c74ea4 100644 --- a/libs/apprise/plugins/NotifyFeishu.py +++ b/libs/apprise/plugins/feishu.py @@ -36,10 +36,10 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyFeishu(NotifyBase): @@ -192,6 +192,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyFlock.py b/libs/apprise/plugins/flock.py similarity index 97% rename from libs/apprise/plugins/NotifyFlock.py rename to libs/apprise/plugins/flock.py index f1d12067e..99ce3582b 100644 --- a/libs/apprise/plugins/NotifyFlock.py +++ b/libs/apprise/plugins/flock.py @@ -44,14 +44,14 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..common import NotifyFormat from ..common import NotifyImageSize from ..utils import parse_list from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Extend HTTP Error Messages @@ -308,6 +308,15 @@ def _post(self, url, headers, payload): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyFreeMobile.py b/libs/apprise/plugins/freemobile.py similarity index 94% rename from libs/apprise/plugins/NotifyFreeMobile.py rename to libs/apprise/plugins/freemobile.py index 4aad8db3d..5208d5664 100644 --- a/libs/apprise/plugins/NotifyFreeMobile.py +++ b/libs/apprise/plugins/freemobile.py @@ -36,9 +36,9 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyFreeMobile(NotifyBase): @@ -103,6 +103,15 @@ def __init__(self, **kwargs): return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.user, self.password) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -126,6 +135,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): # prepare our headers headers = { 'User-Agent': self.app_id, + 'Content-Type': 'application/json', } # Prepare our payload diff --git a/libs/apprise/plugins/NotifyGnome.py b/libs/apprise/plugins/gnome.py similarity index 97% rename from libs/apprise/plugins/NotifyGnome.py rename to libs/apprise/plugins/gnome.py index 67129216d..0a4133731 100644 --- a/libs/apprise/plugins/NotifyGnome.py +++ b/libs/apprise/plugins/gnome.py @@ -26,11 +26,11 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Default our global support flag NOTIFY_GNOME_SUPPORT_ENABLED = False @@ -132,6 +132,10 @@ class NotifyGnome(NotifyBase): # cause any title (if defined) to get placed into the message body. title_maxlen = 0 + # No URL Identifier will be defined for this service as there simply isn't + # enough details to uniquely identify one dbus:// from another. + url_identifier = False + # Define object templates templates = ( '{schema}://', diff --git a/libs/apprise/plugins/NotifyGoogleChat.py b/libs/apprise/plugins/google_chat.py similarity index 96% rename from libs/apprise/plugins/NotifyGoogleChat.py rename to libs/apprise/plugins/google_chat.py index d2a6cc8a8..f12e24029 100644 --- a/libs/apprise/plugins/NotifyGoogleChat.py +++ b/libs/apprise/plugins/google_chat.py @@ -58,11 +58,11 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyFormat from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyGoogleChat(NotifyBase): @@ -265,6 +265,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.workspace, self.webhook_key, + self.webhook_token, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyGotify.py b/libs/apprise/plugins/gotify.py similarity index 94% rename from libs/apprise/plugins/NotifyGotify.py rename to libs/apprise/plugins/gotify.py index 3f4ce132d..1be2d0052 100644 --- a/libs/apprise/plugins/NotifyGotify.py +++ b/libs/apprise/plugins/gotify.py @@ -34,10 +34,10 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType, NotifyFormat from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Priorities @@ -265,6 +265,20 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, + self.port if self.port else (443 if self.secure else 80), + self.fullpath.rstrip('/'), + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyGrowl.py b/libs/apprise/plugins/growl.py similarity index 96% rename from libs/apprise/plugins/NotifyGrowl.py rename to libs/apprise/plugins/growl.py index 0b42e3bec..e6f6237e3 100644 --- a/libs/apprise/plugins/NotifyGrowl.py +++ b/libs/apprise/plugins/growl.py @@ -26,12 +26,12 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Default our global support flag NOTIFY_GROWL_SUPPORT_ENABLED = False @@ -338,6 +338,19 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, + self.port if self.port else self.default_port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyGuilded.py b/libs/apprise/plugins/guilded.py similarity index 96% rename from libs/apprise/plugins/NotifyGuilded.py rename to libs/apprise/plugins/guilded.py index 0ea36d9f8..0ee07018e 100644 --- a/libs/apprise/plugins/NotifyGuilded.py +++ b/libs/apprise/plugins/guilded.py @@ -45,10 +45,11 @@ # import re -from .NotifyDiscord import NotifyDiscord +# Import namespace so the class won't conflict with the actual Notify object +from . import discord -class NotifyGuilded(NotifyDiscord): +class NotifyGuilded(discord.NotifyDiscord): """ A wrapper to Guilded Notifications diff --git a/libs/apprise/plugins/NotifyHomeAssistant.py b/libs/apprise/plugins/home_assistant.py similarity index 92% rename from libs/apprise/plugins/NotifyHomeAssistant.py rename to libs/apprise/plugins/home_assistant.py index 0829381b9..c59b58a9a 100644 --- a/libs/apprise/plugins/NotifyHomeAssistant.py +++ b/libs/apprise/plugins/home_assistant.py @@ -34,11 +34,11 @@ from uuid import uuid4 -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyHomeAssistant(NotifyBase): @@ -179,8 +179,8 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): if isinstance(self.port, int): url += ':%d' % self.port - url += '' if not self.fullpath else '/' + self.fullpath.strip('/') - url += '/api/services/persistent_notification/create' + url += self.fullpath.rstrip('/') + \ + '/api/services/persistent_notification/create' self.logger.debug('Home Assistant POST URL: %s (cert_verify=%r)' % ( url, self.verify_certificate, @@ -231,6 +231,22 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, + self.port if self.port else ( + 443 if self.secure else self.default_insecure_port), + self.fullpath.rstrip('/'), + self.accesstoken, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -302,7 +318,7 @@ def parse_url(url): results['accesstoken'] = fullpath.pop() if fullpath else None # Re-assemble our full path - results['fullpath'] = '/'.join(fullpath) + results['fullpath'] = '/' + '/'.join(fullpath) if fullpath else '' # Allow the specification of a unique notification_id so that # it will always replace the last one sent. diff --git a/libs/apprise/plugins/NotifyHttpSMS.py b/libs/apprise/plugins/httpsms.py similarity index 96% rename from libs/apprise/plugins/NotifyHttpSMS.py rename to libs/apprise/plugins/httpsms.py index 647100949..b4da6c627 100644 --- a/libs/apprise/plugins/NotifyHttpSMS.py +++ b/libs/apprise/plugins/httpsms.py @@ -31,12 +31,12 @@ # https://httpsms.com import requests import json -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyHttpSMS(NotifyBase): @@ -253,6 +253,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.source, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyIFTTT.py b/libs/apprise/plugins/ifttt.py similarity index 97% rename from libs/apprise/plugins/NotifyIFTTT.py rename to libs/apprise/plugins/ifttt.py index 9174640d0..64d9cc31b 100644 --- a/libs/apprise/plugins/NotifyIFTTT.py +++ b/libs/apprise/plugins/ifttt.py @@ -44,11 +44,11 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyIFTTT(NotifyBase): @@ -287,6 +287,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.webhook_id) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyJoin.py b/libs/apprise/plugins/join.py similarity index 97% rename from libs/apprise/plugins/NotifyJoin.py rename to libs/apprise/plugins/join.py index c6b0d91e9..239f9682f 100644 --- a/libs/apprise/plugins/NotifyJoin.py +++ b/libs/apprise/plugins/join.py @@ -39,13 +39,13 @@ import re import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_list from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Extend HTTP Error Messages JOIN_HTTP_ERROR_MAP = { @@ -345,6 +345,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyKavenegar.py b/libs/apprise/plugins/kavenegar.py similarity index 97% rename from libs/apprise/plugins/NotifyKavenegar.py rename to libs/apprise/plugins/kavenegar.py index 2a9c169d7..ea3bd8ed3 100644 --- a/libs/apprise/plugins/NotifyKavenegar.py +++ b/libs/apprise/plugins/kavenegar.py @@ -38,12 +38,12 @@ import requests from json import loads -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Extend HTTP Error Messages # Based on https://kavenegar.com/rest.html @@ -304,6 +304,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.source, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyKumulos.py b/libs/apprise/plugins/kumulos.py similarity index 95% rename from libs/apprise/plugins/NotifyKumulos.py rename to libs/apprise/plugins/kumulos.py index da372e773..941f163db 100644 --- a/libs/apprise/plugins/NotifyKumulos.py +++ b/libs/apprise/plugins/kumulos.py @@ -39,10 +39,10 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Extend HTTP Error Messages KUMULOS_HTTP_ERROR_MAP = { @@ -198,6 +198,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return False return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey, self.serverkey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyLametric.py b/libs/apprise/plugins/lametric.py similarity index 97% rename from libs/apprise/plugins/NotifyLametric.py rename to libs/apprise/plugins/lametric.py index 5825d9176..b6124a91f 100644 --- a/libs/apprise/plugins/NotifyLametric.py +++ b/libs/apprise/plugins/lametric.py @@ -90,10 +90,10 @@ import re import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ from ..utils import is_hostname from ..utils import is_ipaddr @@ -783,6 +783,29 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + if self.mode == LametricMode.DEVICE: + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.lametric_apikey, self.host, + self.port if self.port else ( + 443 if self.secure else + self.template_tokens['port']['default']), + ) + + return ( + self.protocol, + self.lametric_app_access_token, + self.lametric_app_id, + self.lametric_app_ver, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -871,6 +894,9 @@ def parse_url(url): results['password'] = results['user'] results['user'] = None + # Get unquoted entries + entries = NotifyLametric.split_path(results['fullpath']) + # Priority Handling if 'priority' in results['qsd'] and results['qsd']['priority']: results['priority'] = NotifyLametric.unquote( @@ -913,6 +939,10 @@ def parse_url(url): results['app_ver'] = \ NotifyLametric.unquote(results['qsd']['app_ver']) + elif entries: + # Store our app id + results['app_ver'] = entries.pop(0) + if 'token' in results['qsd'] and results['qsd']['token']: # Extract Application Access Token from an argument results['app_token'] = \ @@ -938,7 +968,7 @@ def parse_url(url): LAMETRIC_IS_APP_TOKEN.match(results['password'])) and # Scan for app_ flags - next((f for f in results.keys() \ + next((f for f in results.keys() if f.startswith('app_')), None) is None) \ else LametricMode.CLOUD diff --git a/libs/apprise/plugins/NotifyLine.py b/libs/apprise/plugins/line.py similarity index 96% rename from libs/apprise/plugins/NotifyLine.py rename to libs/apprise/plugins/line.py index 61e4f3703..c177e26f8 100644 --- a/libs/apprise/plugins/NotifyLine.py +++ b/libs/apprise/plugins/line.py @@ -33,14 +33,14 @@ import re from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..common import NotifyImageSize from ..utils import validate_regex from ..utils import parse_list from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Used to break path apart into list of streams @@ -241,6 +241,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyLunaSea.py b/libs/apprise/plugins/lunasea.py similarity index 94% rename from libs/apprise/plugins/NotifyLunaSea.py rename to libs/apprise/plugins/lunasea.py index 51d820915..97291fc9e 100644 --- a/libs/apprise/plugins/NotifyLunaSea.py +++ b/libs/apprise/plugins/lunasea.py @@ -33,15 +33,15 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..common import NotifyImageSize from ..utils import parse_list from ..utils import is_hostname from ..utils import is_ipaddr from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ -from ..URLBase import PrivacyMode +from ..locale import gettext_lazy as _ +from ..url import PrivacyMode class LunaSeaMode: @@ -324,6 +324,24 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + secure = self.secure_protocol[0] \ + if self.mode == LunaSeaMode.CLOUD else ( + self.secure_protocol[0] if self.secure else self.protocol[0]) + return ( + secure, + self.host if self.mode == LunaSeaMode.PRIVATE else None, + self.port if self.port else (443 if self.secure else 80), + self.user if self.user else None, + self.password if self.password else None, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyMacOSX.py b/libs/apprise/plugins/macosx.py similarity index 97% rename from libs/apprise/plugins/NotifyMacOSX.py rename to libs/apprise/plugins/macosx.py index dd53369fe..153a88a21 100644 --- a/libs/apprise/plugins/NotifyMacOSX.py +++ b/libs/apprise/plugins/macosx.py @@ -30,11 +30,11 @@ import subprocess import os -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Default our global support flag NOTIFY_MACOSX_SUPPORT_ENABLED = False @@ -92,6 +92,10 @@ class NotifyMacOSX(NotifyBase): # content to display body_max_line_count = 10 + # No URL Identifier will be defined for this service as there simply isn't + # enough details to uniquely identify one dbus:// from another. + url_identifier = False + # The possible paths to the terminal-notifier notify_paths = ( '/opt/homebrew/bin/terminal-notifier', diff --git a/libs/apprise/plugins/NotifyMailgun.py b/libs/apprise/plugins/mailgun.py similarity index 97% rename from libs/apprise/plugins/NotifyMailgun.py rename to libs/apprise/plugins/mailgun.py index 82cf970bf..b68183957 100644 --- a/libs/apprise/plugins/NotifyMailgun.py +++ b/libs/apprise/plugins/mailgun.py @@ -56,7 +56,7 @@ # import requests from email.utils import formataddr -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..common import NotifyFormat from ..utils import parse_emails @@ -64,7 +64,7 @@ from ..utils import is_email from ..utils import validate_regex from ..logger import logger -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Provide some known codes Mailgun uses and what they translate to: # Based on https://documentation.mailgun.com/en/latest/api-intro.html#errors @@ -383,9 +383,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, self.logger.debug( 'Preparing Mailgun attachment {}'.format( attachment.url(privacy=True))) + + # Prepare our filename + filename = attachment.name \ + if attachment.name \ + else 'file{no:03}.dat'.format(no=idx + 1) + try: files['attachment[{}]'.format(idx)] = \ - (attachment.name, open(attachment.path, 'rb')) + (filename, open(attachment.path, 'rb')) except (OSError, IOError) as e: self.logger.warning( @@ -579,6 +585,17 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.host, self.apikey, self.region_name, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyMastodon.py b/libs/apprise/plugins/mastodon.py similarity index 98% rename from libs/apprise/plugins/NotifyMastodon.py rename to libs/apprise/plugins/mastodon.py index 0d2f27df3..85379ba0a 100644 --- a/libs/apprise/plugins/NotifyMastodon.py +++ b/libs/apprise/plugins/mastodon.py @@ -33,16 +33,16 @@ from datetime import datetime from datetime import timezone -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import NotifyType from ..utils import parse_list from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ -from ..attachment.AttachBase import AttachBase +from ..locale import gettext_lazy as _ +from ..attachment.base import AttachBase # Accept: # - @username @@ -336,6 +336,18 @@ def __init__(self, token=None, targets=None, batch=True, return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol[0], self.token, self.host, + self.port if self.port else (443 if self.secure else 80), + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyMatrix.py b/libs/apprise/plugins/matrix.py similarity index 92% rename from libs/apprise/plugins/NotifyMatrix.py rename to libs/apprise/plugins/matrix.py index 594274761..bb9c6dbb2 100644 --- a/libs/apprise/plugins/NotifyMatrix.py +++ b/libs/apprise/plugins/matrix.py @@ -37,16 +37,17 @@ from json import loads from time import time -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..common import NotifyImageSize from ..common import NotifyFormat +from ..common import PersistentStoreMode from ..utils import parse_bool from ..utils import parse_list from ..utils import is_hostname from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Define default path MATRIX_V1_WEBHOOK_PATH = '/api/v1/matrix/hook' @@ -175,6 +176,13 @@ class NotifyMatrix(NotifyBase): # the server doesn't remind us how long we shoul wait for default_wait_ms = 1000 + # Our default is to no not use persistent storage beyond in-memory + # reference + storage_mode = PersistentStoreMode.AUTO + + # Keep our cache for 20 days + default_cache_expiry_sec = 60 * 60 * 24 * 20 + # Define object templates templates = ( # Targets are ignored when using t2bot mode; only a token is required @@ -293,13 +301,12 @@ def __init__(self, targets=None, mode=None, msgtype=None, version=None, # This gets initialized after a login/registration self.access_token = None + # This gets incremented for each request made against the v3 API + self.transaction_id = 0 + # Place an image inline with the message body self.include_image = include_image - # maintain a lookup of room alias's we already paired with their id - # to speed up future requests - self._room_cache = {} - # Setup our mode self.mode = self.template_args['mode']['default'] \ if not isinstance(mode, str) else mode.lower() @@ -339,6 +346,7 @@ def __init__(self, targets=None, mode=None, msgtype=None, version=None, .format(self.host) self.logger.warning(msg) raise TypeError(msg) + else: # Verify port if specified if self.port is not None and not ( @@ -350,6 +358,23 @@ def __init__(self, targets=None, mode=None, msgtype=None, version=None, self.logger.warning(msg) raise TypeError(msg) + # + # Initialize from cache if present + # + if self.mode != MatrixWebhookMode.T2BOT: + # our home server gets populated after a login/registration + self.home_server = self.store.get('home_server') + + # our user_id gets populated after a login/registration + self.user_id = self.store.get('user_id') + + # This gets initialized after a login/registration + self.access_token = self.store.get('access_token') + + # This gets incremented for each request made against the v3 API + self.transaction_id = 0 if not self.access_token \ + else self.store.get('transaction_id', 0) + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): """ Perform Matrix Notification @@ -612,8 +637,10 @@ def _send_server_notification(self, body, title='', # Build our path if self.version == MatrixVersion.V3: - path = '/rooms/{}/send/m.room.message/0'.format( - NotifyMatrix.quote(room_id)) + path = '/rooms/{}/send/m.room.message/{}'.format( + NotifyMatrix.quote(room_id), + self.transaction_id, + ) else: path = '/rooms/{}/send/m.room.message'.format( @@ -685,6 +712,15 @@ def _send_server_notification(self, body, title='', method = 'PUT' if self.version == MatrixVersion.V3 else 'POST' postokay, response = self._fetch( path, payload=payload, method=method) + + # Increment the transaction ID to avoid future messages being + # recognized as retransmissions and ignored + if self.version == MatrixVersion.V3: + self.transaction_id += 1 + self.store.set( + 'transaction_id', self.transaction_id, + expires=self.default_cache_expiry_sec) + if not postokay: # Notify our user self.logger.warning( @@ -800,7 +836,18 @@ def _register(self): self.home_server = response.get('home_server') self.user_id = response.get('user_id') + self.store.set( + 'access_token', self.access_token, + expires=self.default_cache_expiry_sec) + self.store.set( + 'home_server', self.home_server, + expires=self.default_cache_expiry_sec) + self.store.set( + 'user_id', self.user_id, + expires=self.default_cache_expiry_sec) + if self.access_token is not None: + # Store our token into our store self.logger.debug( 'Registered successfully with Matrix server.') return True @@ -859,6 +906,18 @@ def _login(self): self.logger.debug( 'Authenticated successfully with Matrix server.') + + # Store our token into our store + self.store.set( + 'access_token', self.access_token, + expires=self.default_cache_expiry_sec) + self.store.set( + 'home_server', self.home_server, + expires=self.default_cache_expiry_sec) + self.store.set( + 'user_id', self.user_id, + expires=self.default_cache_expiry_sec) + return True def _logout(self): @@ -896,8 +955,9 @@ def _logout(self): self.home_server = None self.user_id = None - # Clear our room cache - self._room_cache = {} + # clear our tokens + self.store.clear( + 'access_token', 'home_server', 'user_id', 'transaction_id') self.logger.debug( 'Unauthenticated successfully with Matrix server.') @@ -937,9 +997,13 @@ def _room_join(self, room): ) # Check our cache for speed: - if room_id in self._room_cache: + try: # We're done as we've already joined the channel - return self._room_cache[room_id]['id'] + return self.store[room_id]['id'] + + except KeyError: + # No worries, we'll try to acquire the info + pass # Build our URL path = '/join/{}'.format(NotifyMatrix.quote(room_id)) @@ -948,10 +1012,10 @@ def _room_join(self, room): postokay, _ = self._fetch(path, payload=payload) if postokay: # Cache our entry for fast access later - self._room_cache[room_id] = { + self.store.set(room_id, { 'id': room_id, 'home_server': home_server, - } + }) return room_id if postokay else None @@ -973,9 +1037,13 @@ def _room_join(self, room): room = '#{}:{}'.format(result.group('room'), home_server) # Check our cache for speed: - if room in self._room_cache: + try: # We're done as we've already joined the channel - return self._room_cache[room]['id'] + return self.store[room]['id'] + + except KeyError: + # No worries, we'll try to acquire the info + pass # If we reach here, we need to join the channel @@ -986,11 +1054,12 @@ def _room_join(self, room): postokay, response = self._fetch(path, payload=payload) if postokay: # Cache our entry for fast access later - self._room_cache[room] = { + self.store.set(room, { 'id': response.get('room_id'), 'home_server': home_server, - } - return self._room_cache[room]['id'] + }) + + return response.get('room_id') # Try to create the channel return self._room_create(room) @@ -1045,10 +1114,10 @@ def _room_create(self, room): return None # Cache our entry for fast access later - self._room_cache[response.get('room_alias')] = { + self.store.set(response.get('room_alias'), { 'id': response.get('room_id'), 'home_server': home_server, - } + }) return response.get('room_id') @@ -1281,6 +1350,11 @@ def __del__(self): # nothing to do return + if self.store.mode != PersistentStoreMode.MEMORY: + # We no longer have to log out as we have persistant storage to + # re-use our credentials with + return + try: self._logout() @@ -1325,6 +1399,22 @@ def __del__(self): # the end user if we don't have to. pass + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.host if self.mode != MatrixWebhookMode.T2BOT + else self.access_token, + self.port if self.port else (443 if self.secure else 80), + self.user if self.mode != MatrixWebhookMode.T2BOT else None, + self.password if self.mode != MatrixWebhookMode.T2BOT else None, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyMattermost.py b/libs/apprise/plugins/mattermost.py similarity index 91% rename from libs/apprise/plugins/NotifyMattermost.py rename to libs/apprise/plugins/mattermost.py index dbb5f0dd3..a9a3ee62b 100644 --- a/libs/apprise/plugins/NotifyMattermost.py +++ b/libs/apprise/plugins/mattermost.py @@ -39,13 +39,13 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_bool from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Some Reference Locations: # - https://docs.mattermost.com/developer/webhooks-incoming.html @@ -132,6 +132,9 @@ class NotifyMattermost(NotifyBase): 'name': _('Channels'), 'type': 'list:string', }, + 'channel': { + 'alias_of': 'channels', + }, 'image': { 'name': _('Include Image'), 'type': 'bool', @@ -220,8 +223,8 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): payload['channel'] = channel url = '{}://{}:{}{}/hooks/{}'.format( - self.schema, self.host, self.port, self.fullpath, - self.token) + self.schema, self.host, self.port, + self.fullpath.rstrip('/'), self.token) self.logger.debug('Mattermost POST URL: %s (cert_verify=%r)' % ( url, self.verify_certificate, @@ -283,6 +286,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): # Return our overall status return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.token, self.host, self.port, self.fullpath, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -357,16 +372,21 @@ def parse_url(url): # Support both 'to' (for yaml configuration) and channel= if 'to' in results['qsd'] and len(results['qsd']['to']): # Allow the user to specify the channel to post to - results['channels'].append( + results['channels'].extend( NotifyMattermost.parse_list(results['qsd']['to'])) if 'channel' in results['qsd'] and len(results['qsd']['channel']): # Allow the user to specify the channel to post to - results['channels'].append( + results['channels'].extend( NotifyMattermost.parse_list(results['qsd']['channel'])) + if 'channels' in results['qsd'] and len(results['qsd']['channels']): + # Allow the user to specify the channel to post to + results['channels'].extend( + NotifyMattermost.parse_list(results['qsd']['channels'])) + # Image manipulation - results['include_image'] = \ - parse_bool(results['qsd'].get('image', False)) + results['include_image'] = parse_bool(results['qsd'].get( + 'image', NotifyMattermost.template_args['image']['default'])) return results diff --git a/libs/apprise/plugins/NotifyMessageBird.py b/libs/apprise/plugins/messagebird.py similarity index 97% rename from libs/apprise/plugins/NotifyMessageBird.py rename to libs/apprise/plugins/messagebird.py index 42d880acd..053c59303 100644 --- a/libs/apprise/plugins/NotifyMessageBird.py +++ b/libs/apprise/plugins/messagebird.py @@ -34,12 +34,12 @@ import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyMessageBird(NotifyBase): @@ -291,6 +291,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey, self.source) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyMisskey.py b/libs/apprise/plugins/misskey.py similarity index 95% rename from libs/apprise/plugins/NotifyMisskey.py rename to libs/apprise/plugins/misskey.py index 8965a0f7b..21d0250df 100644 --- a/libs/apprise/plugins/NotifyMisskey.py +++ b/libs/apprise/plugins/misskey.py @@ -47,10 +47,10 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class MisskeyVisibility: @@ -191,6 +191,18 @@ def __init__(self, token=None, visibility=None, **kwargs): return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.token, self.host, self.port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyMQTT.py b/libs/apprise/plugins/mqtt.py similarity index 93% rename from libs/apprise/plugins/NotifyMQTT.py rename to libs/apprise/plugins/mqtt.py index 49380d330..4b21bf288 100644 --- a/libs/apprise/plugins/NotifyMQTT.py +++ b/libs/apprise/plugins/mqtt.py @@ -38,12 +38,12 @@ from time import sleep from datetime import datetime from os.path import isfile -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import parse_list from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Default our global support flag NOTIFY_MQTT_SUPPORT_ENABLED = False @@ -204,10 +204,15 @@ class NotifyMQTT(NotifyBase): 'type': 'bool', 'default': False, }, + 'retain': { + 'name': _('Retain Messages'), + 'type': 'bool', + 'default': False, + }, }) def __init__(self, targets=None, version=None, qos=None, - client_id=None, session=None, **kwargs): + client_id=None, session=None, retain=None, **kwargs): """ Initialize MQTT Object """ @@ -230,6 +235,10 @@ def __init__(self, targets=None, version=None, qos=None, if session is None or not self.client_id \ else parse_bool(session) + # Our Retain Message Flag + self.retain = self.template_args['retain']['default'] \ + if retain is None else parse_bool(retain) + # Set up our Quality of Service (QoS) try: self.qos = self.template_args['qos']['default'] \ @@ -376,7 +385,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): self.logger.debug('MQTT Payload: %s' % str(body)) result = self.client.publish( - topic, payload=body, qos=self.qos, retain=False) + topic, payload=body, qos=self.qos, retain=self.retain) if result.rc != mqtt.MQTT_ERR_SUCCESS: # Toggle our status @@ -429,6 +438,23 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, + self.port if self.port else ( + self.mqtt_secure_port if self.secure + else self.mqtt_insecure_port), + self.fullpath.rstrip('/'), + self.client_id, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -439,6 +465,7 @@ def url(self, privacy=False, *args, **kwargs): 'version': self.version, 'qos': str(self.qos), 'session': 'yes' if self.session else 'no', + 'retain': 'yes' if self.retain else 'no', } if self.client_id: @@ -518,6 +545,10 @@ def parse_url(url): if 'session' in results['qsd'] and len(results['qsd']['session']): results['session'] = parse_bool(results['qsd']['session']) + # Message Retain Flag + if 'retain' in results['qsd'] and len(results['qsd']['retain']): + results['retain'] = parse_bool(results['qsd']['retain']) + # The MQTT Quality of Service to use if 'qos' in results['qsd'] and len(results['qsd']['qos']): results['qos'] = \ diff --git a/libs/apprise/plugins/NotifyMSG91.py b/libs/apprise/plugins/msg91.py similarity index 97% rename from libs/apprise/plugins/NotifyMSG91.py rename to libs/apprise/plugins/msg91.py index a7bd9c473..cf5fea9b6 100644 --- a/libs/apprise/plugins/NotifyMSG91.py +++ b/libs/apprise/plugins/msg91.py @@ -38,12 +38,12 @@ import re import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no, parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class MSG91PayloadField: @@ -310,6 +310,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.template, self.authkey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyMSTeams.py b/libs/apprise/plugins/msteams.py similarity index 96% rename from libs/apprise/plugins/NotifyMSTeams.py rename to libs/apprise/plugins/msteams.py index 06572c3e6..83f85c79b 100644 --- a/libs/apprise/plugins/NotifyMSTeams.py +++ b/libs/apprise/plugins/msteams.py @@ -81,7 +81,7 @@ import json from json.decoder import JSONDecodeError -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..common import NotifyFormat @@ -89,8 +89,8 @@ from ..utils import validate_regex from ..utils import apply_template from ..utils import TemplateType -from ..AppriseAttachment import AppriseAttachment -from ..AppriseLocale import gettext_lazy as _ +from ..apprise_attachment import AppriseAttachment +from ..locale import gettext_lazy as _ class NotifyMSTeams(NotifyBase): @@ -293,7 +293,12 @@ def __init__(self, token_a, token_b, token_c, team=None, version=None, self.logger.warning(msg) raise TypeError(msg) - # else: NoneType - this is okay + self.logger.deprecate( + "Microsoft is depricating their MSTeams webhooks on " + "December 31, 2024. It is advised that you switch to " + "Microsoft Power Automate (already supported by Apprise as " + "workflows://. For more information visit: " + "https://github.com/caronc/apprise/wiki/Notify_workflows") return def gen_payload(self, body, title='', notify_type=NotifyType.INFO, @@ -463,6 +468,19 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, + self.team if self.version > 1 else None, + self.token_a, self.token_b, self.token_c, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyNextcloud.py b/libs/apprise/plugins/nextcloud.py similarity index 96% rename from libs/apprise/plugins/NotifyNextcloud.py rename to libs/apprise/plugins/nextcloud.py index fd471d9eb..7afe2d9af 100644 --- a/libs/apprise/plugins/NotifyNextcloud.py +++ b/libs/apprise/plugins/nextcloud.py @@ -28,11 +28,11 @@ import requests -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import parse_list -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyNextcloud(NotifyBase): @@ -278,6 +278,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, self.port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyNextcloudTalk.py b/libs/apprise/plugins/nextcloudtalk.py similarity index 95% rename from libs/apprise/plugins/NotifyNextcloudTalk.py rename to libs/apprise/plugins/nextcloudtalk.py index 4bfced282..7ba953c3d 100644 --- a/libs/apprise/plugins/NotifyNextcloudTalk.py +++ b/libs/apprise/plugins/nextcloudtalk.py @@ -29,11 +29,11 @@ import requests from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import parse_list -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyNextcloudTalk(NotifyBase): @@ -253,6 +253,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, self.port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyNotica.py b/libs/apprise/plugins/notica.py similarity index 96% rename from libs/apprise/plugins/NotifyNotica.py rename to libs/apprise/plugins/notica.py index 33a94fc96..9c5778af2 100644 --- a/libs/apprise/plugins/NotifyNotica.py +++ b/libs/apprise/plugins/notica.py @@ -43,11 +43,11 @@ import re import requests -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NoticaMode: @@ -278,6 +278,19 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.mode, self.token, self.user, self.password, self.host, + self.port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyNotifiarr.py b/libs/apprise/plugins/notifiarr.py similarity index 86% rename from libs/apprise/plugins/NotifyNotifiarr.py rename to libs/apprise/plugins/notifiarr.py index e195cbd32..dcb940a2b 100644 --- a/libs/apprise/plugins/NotifyNotifiarr.py +++ b/libs/apprise/plugins/notifiarr.py @@ -31,12 +31,13 @@ from json import dumps from itertools import chain -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ from ..common import NotifyImageSize from ..utils import parse_list, parse_bool from ..utils import validate_regex +from .discord import USER_ROLE_DETECTION_RE # Used to break path apart into list of channels CHANNEL_LIST_DELIM = re.compile(r'[ \t\r\n,#\\/]+') @@ -118,14 +119,6 @@ class NotifyNotifiarr(NotifyBase): 'apikey': { 'alias_of': 'apikey', }, - 'discord_user': { - 'name': _('Ping Discord User'), - 'type': 'int', - }, - 'discord_role': { - 'name': _('Ping Discord Role'), - 'type': 'int', - }, 'event': { 'name': _('Discord Event ID'), 'type': 'int', @@ -149,7 +142,6 @@ class NotifyNotifiarr(NotifyBase): }) def __init__(self, apikey=None, include_image=None, - discord_user=None, discord_role=None, event=None, targets=None, source=None, **kwargs): """ Initialize Notifiarr Object @@ -172,30 +164,6 @@ def __init__(self, apikey=None, include_image=None, if isinstance(include_image, bool) \ else self.template_args['image']['default'] - # Set up our user if specified - self.discord_user = 0 - if discord_user: - try: - self.discord_user = int(discord_user) - - except (ValueError, TypeError): - msg = 'An invalid Notifiarr User ID ' \ - '({}) was specified.'.format(discord_user) - self.logger.warning(msg) - raise TypeError(msg) - - # Set up our role if specified - self.discord_role = 0 - if discord_role: - try: - self.discord_role = int(discord_role) - - except (ValueError, TypeError): - msg = 'An invalid Notifiarr Role ID ' \ - '({}) was specified.'.format(discord_role) - self.logger.warning(msg) - raise TypeError(msg) - # Prepare our source (if set) self.source = validate_regex(source) @@ -231,6 +199,18 @@ def __init__(self, apikey=None, include_image=None, return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.apikey, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -244,12 +224,6 @@ def url(self, privacy=False, *args, **kwargs): if self.source: params['source'] = self.source - if self.discord_user: - params['discord_user'] = self.discord_user - - if self.discord_role: - params['discord_role'] = self.discord_role - if self.event: params['event'] = self.event @@ -287,6 +261,29 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): # Acquire image_url image_url = self.image_url(notify_type) + # Define our mentions + mentions = { + 'pingUser': [], + 'pingRole': [], + 'content': [], + } + + # parse for user id's <@123> and role IDs <@&456> + results = USER_ROLE_DETECTION_RE.findall(body) + if results: + for (is_role, no, value) in results: + if value: + # @everybody, @admin, etc - unsupported + mentions['content'].append(f'@{value}') + + elif is_role: + mentions['pingRole'].append(no) + mentions['content'].append(f'<@&{no}>') + + else: # is_user + mentions['pingUser'].append(no) + mentions['content'].append(f'<@{no}>') + for idx, channel in enumerate(self.targets['channels']): # prepare Notifiarr Object payload = { @@ -301,14 +298,17 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): 'discord': { 'color': self.color(notify_type), 'ping': { - 'pingUser': self.discord_user - if not idx and self.discord_user else 0, - 'pingRole': self.discord_role - if not idx and self.discord_role else 0, + # Only 1 user is supported, so truncate the rest + 'pingUser': 0 if not mentions['pingUser'] + else mentions['pingUser'][0], + # Only 1 role is supported, so truncate the rest + 'pingRole': 0 if not mentions['pingRole'] + else mentions['pingRole'][0], }, 'text': { 'title': title, - 'content': '', + 'content': '' if not mentions['content'] + else '👉 ' + ' '.join(mentions['content']), 'description': body, 'footer': self.app_desc, }, @@ -410,17 +410,6 @@ def parse_url(url): # Get channels results['targets'] = NotifyNotifiarr.split_path(results['fullpath']) - if 'discord_user' in results['qsd'] and \ - len(results['qsd']['discord_user']): - results['discord_user'] = \ - NotifyNotifiarr.unquote( - results['qsd']['discord_user']) - - if 'discord_role' in results['qsd'] and \ - len(results['qsd']['discord_role']): - results['discord_role'] = \ - NotifyNotifiarr.unquote(results['qsd']['discord_role']) - if 'event' in results['qsd'] and \ len(results['qsd']['event']): results['event'] = \ diff --git a/libs/apprise/plugins/NotifyNotifico.py b/libs/apprise/plugins/notifico.py similarity index 97% rename from libs/apprise/plugins/NotifyNotifico.py rename to libs/apprise/plugins/notifico.py index 27ce29a6e..db88bf6b2 100644 --- a/libs/apprise/plugins/NotifyNotifico.py +++ b/libs/apprise/plugins/notifico.py @@ -44,11 +44,11 @@ import re import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotificoFormat: @@ -197,6 +197,15 @@ def __init__(self, project_id, msghook, color=True, prefix=True, ) return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.project_id, self.msghook) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyNtfy.py b/libs/apprise/plugins/ntfy.py similarity index 91% rename from libs/apprise/plugins/NotifyNtfy.py rename to libs/apprise/plugins/ntfy.py index 40834eece..76ee2118b 100644 --- a/libs/apprise/plugins/NotifyNtfy.py +++ b/libs/apprise/plugins/ntfy.py @@ -41,18 +41,19 @@ from json import dumps from os.path import basename -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyFormat from ..common import NotifyType from ..common import NotifyImageSize -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ from ..utils import parse_list from ..utils import parse_bool from ..utils import is_hostname from ..utils import is_ipaddr from ..utils import validate_regex -from ..URLBase import PrivacyMode -from ..attachment.AttachBase import AttachBase +from ..url import PrivacyMode +from ..attachment.base import AttachBase +from ..attachment.memory import AttachMemory class NtfyMode: @@ -172,6 +173,20 @@ class NotifyNtfy(NotifyBase): # Support attachments attachment_support = True + # Maximum title length + title_maxlen = 200 + + # Maximum body length + body_maxlen = 7800 + + # Message size calculates title and body together + overflow_amalgamate_title = True + + # Defines the number of bytes our JSON object can not exceed in size or we + # know the upstream server will reject it. We convert these into + # attachments + ntfy_json_upstream_size_limit = 8000 + # Allows the user to specify the NotifyImageSize object image_size = NotifyImageSize.XY_256 @@ -504,7 +519,7 @@ def _send(self, topic, body=None, title=None, attach=None, image_url=None, # Prepare our Header virt_payload['filename'] = attach.name - with open(attach.path, 'rb') as fp: + with attach as fp: data = fp.read() if image_url: @@ -538,18 +553,39 @@ def _send(self, topic, body=None, title=None, attach=None, image_url=None, self.logger.debug('ntfy POST URL: %s (cert_verify=%r)' % ( notify_url, self.verify_certificate, )) - self.logger.debug('ntfy Payload: %s' % str(virt_payload)) - self.logger.debug('ntfy Headers: %s' % str(headers)) - - # Always call throttle before any remote server i/o is made - self.throttle() # Default response type response = None if not attach: data = dumps(data) + if len(data) > self.ntfy_json_upstream_size_limit: + # Convert to an attachment + + if self.notify_format == NotifyFormat.MARKDOWN: + mimetype = 'text/markdown' + + elif self.notify_format == NotifyFormat.TEXT: + mimetype = 'text/plain' + + else: # self.notify_format == NotifyFormat.HTML: + mimetype = 'text/html' + + attach = AttachMemory( + mimetype=mimetype, + content='{title}{body}'.format( + title=title + '\n' if title else '', body=body)) + + # Recursively send the message body as an attachment instead + return self._send( + topic=topic, body='', title='', attach=attach, + image_url=image_url, **kwargs) + self.logger.debug('ntfy Payload: %s' % str(virt_payload)) + self.logger.debug('ntfy Headers: %s' % str(headers)) + + # Always call throttle before any remote server i/o is made + self.throttle() try: r = requests.post( notify_url, @@ -620,6 +656,34 @@ def _send(self, topic, body=None, title=None, attach=None, image_url=None, return False, response + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + + kwargs = [ + self.secure_protocol if self.mode == NtfyMode.CLOUD else ( + self.secure_protocol if self.secure else self.protocol), + self.host if self.mode == NtfyMode.PRIVATE else '', + 443 if self.mode == NtfyMode.CLOUD else ( + self.port if self.port else (443 if self.secure else 80)), + ] + + if self.mode == NtfyMode.PRIVATE: + if self.auth == NtfyAuth.BASIC: + kwargs.extend([ + self.user if self.user else None, + self.password if self.password else None, + ]) + + elif self.token: # NtfyAuth.TOKEN also + kwargs.append(self.token) + + return kwargs + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyOffice365.py b/libs/apprise/plugins/office365.py similarity index 98% rename from libs/apprise/plugins/NotifyOffice365.py rename to libs/apprise/plugins/office365.py index 0c62279f9..21a1d6fa0 100644 --- a/libs/apprise/plugins/NotifyOffice365.py +++ b/libs/apprise/plugins/office365.py @@ -64,14 +64,14 @@ from datetime import timedelta from json import loads from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType from ..utils import is_email from ..utils import parse_emails from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyOffice365(NotifyBase): @@ -558,6 +558,18 @@ def _fetch(self, url, payload, return (True, content) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.email, self.tenant, self.client_id, + self.secret, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyOneSignal.py b/libs/apprise/plugins/one_signal.py similarity index 78% rename from libs/apprise/plugins/NotifyOneSignal.py rename to libs/apprise/plugins/one_signal.py index eb1e10f7a..0bac77ee2 100644 --- a/libs/apprise/plugins/NotifyOneSignal.py +++ b/libs/apprise/plugins/one_signal.py @@ -37,14 +37,16 @@ from json import dumps from itertools import chain -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..common import NotifyImageSize +from ..utils import decode_b64_dict +from ..utils import encode_b64_dict from ..utils import validate_regex from ..utils import parse_list from ..utils import parse_bool from ..utils import is_email -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class OneSignalCategory: @@ -82,7 +84,7 @@ class NotifyOneSignal(NotifyBase): setup_url = 'https://github.com/caronc/apprise/wiki/Notify_onesignal' # Notification - notify_url = "https://onesignal.com/api/v1/notifications" + notify_url = "https://api.onesignal.com/notifications" # Allows the user to specify the NotifyImageSize object image_size = NotifyImageSize.XY_72 @@ -161,6 +163,18 @@ class NotifyOneSignal(NotifyBase): 'type': 'bool', 'default': False, }, + 'contents': { + 'name': _('Enable Contents'), + 'type': 'bool', + 'default': True, + 'map_to': 'use_contents', + }, + 'decode': { + 'name': _('Decode Template Args'), + 'type': 'bool', + 'default': False, + 'map_to': 'decode_tpl_args', + }, 'template': { 'alias_of': 'template', }, @@ -175,9 +189,22 @@ class NotifyOneSignal(NotifyBase): }, }) + # Define our token control + template_kwargs = { + 'custom': { + 'name': _('Custom Data'), + 'prefix': ':', + }, + 'postback': { + 'name': _('Postback Data'), + 'prefix': '+', + }, + } + def __init__(self, app, apikey, targets=None, include_image=True, - template=None, subtitle=None, language=None, batch=False, - **kwargs): + template=None, subtitle=None, language=None, batch=None, + use_contents=None, decode_tpl_args=None, + custom=None, postback=None, **kwargs): """ Initialize OneSignal @@ -201,7 +228,19 @@ def __init__(self, app, apikey, targets=None, include_image=True, raise TypeError(msg) # Prepare Batch Mode Flag - self.batch_size = self.default_batch_size if batch else 1 + self.batch_size = self.default_batch_size if ( + batch if batch is not None else + self.template_args['batch']['default']) else 1 + + # Prepare Use Contents Flag + self.use_contents = True if ( + use_contents if use_contents is not None else + self.template_args['contents']['default']) else False + + # Prepare Decode Template Arguments Flag + self.decode_tpl_args = True if ( + decode_tpl_args if decode_tpl_args is not None else + self.template_args['decode']['default']) else False # Place a thumbnail image inline with the message body self.include_image = include_image @@ -273,6 +312,30 @@ def __init__(self, app, apikey, targets=None, include_image=True, 'Detected OneSignal Player ID: %s' % self.targets[OneSignalCategory.PLAYER][-1]) + # Custom Data + self.custom_data = {} + if custom and isinstance(custom, dict): + if self.decode_tpl_args: + custom = decode_b64_dict(custom) + + self.custom_data.update(custom) + + elif custom: + msg = 'The specified OneSignal Custom Data ' \ + '({}) are not identified as a dictionary.'.format(custom) + self.logger.warning(msg) + raise TypeError(msg) + + # Postback Data + self.postback_data = {} + if postback and isinstance(postback, dict): + self.postback_data.update(postback) + + elif postback: + msg = 'The specified OneSignal Postback Data ' \ + '({}) are not identified as a dictionary.'.format(postback) + self.logger.warning(msg) + raise TypeError(msg) return def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): @@ -291,14 +354,9 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): payload = { 'app_id': self.app, - - 'headings': { - self.language: title if title else self.app_desc, - }, 'contents': { self.language: body, }, - # Sending true wakes your app from background to run custom native # code (Apple interprets this as content-available=1). # Note: Not applicable if the app is in the "force-quit" state @@ -307,6 +365,33 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): 'content_available': True, } + if self.template_id: + # Store template information + payload['template_id'] = self.template_id + + if not self.use_contents: + # Only if a template is defined can contents be removed + del payload['contents'] + + # Set our data if defined + if self.custom_data: + payload.update({ + 'custom_data': self.custom_data, + }) + + # Set our postback data if defined + if self.postback_data: + payload.update({ + 'data': self.postback_data, + }) + + if title: + # Display our title if defined + payload.update({ + 'headings': { + self.language: title, + }}) + if self.subtitle: payload.update({ 'subtitle': { @@ -314,9 +399,6 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): }, }) - if self.template_id: - payload['template_id'] = self.template_id - # Acquire our large_icon image URL (if set) image_url = None if not self.include_image \ else self.image_url(notify_type) @@ -392,6 +474,17 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.template_id, self.app, self.apikey, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -406,6 +499,25 @@ def url(self, privacy=False, *args, **kwargs): # Extend our parameters params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + custom_data, needs_decoding = encode_b64_dict(self.custom_data) + # custom_data, needs_decoding = self.custom_data, False + # Save our template data + params.update( + {':{}'.format(k): v for k, v in custom_data.items()} + ) + + # Save our postback data + params.update( + {'+{}'.format(k): v for k, v in self.postback_data.items()}) + + if self.use_contents != self.template_args['contents']['default']: + params['contents'] = 'yes' if self.use_contents else 'no' + + if (self.decode_tpl_args != self.template_args['decode']['default'] + or needs_decoding): + params['decode'] = 'yes' if (self.decode_tpl_args or + needs_decoding) else 'no' + return '{schema}://{tp_id}{app}@{apikey}/{targets}?{params}'.format( schema=self.secure_protocol, tp_id='{}:'.format( @@ -485,6 +597,20 @@ def parse_url(url): 'batch', NotifyOneSignal.template_args['batch']['default'])) + # Get Use Contents Boolean (if set) + results['use_contents'] = \ + parse_bool( + results['qsd'].get( + 'contents', + NotifyOneSignal.template_args['contents']['default'])) + + # Get Use Contents Boolean (if set) + results['decode_tpl_args'] = \ + parse_bool( + results['qsd'].get( + 'decode', + NotifyOneSignal.template_args['decode']['default'])) + # The API Key is stored in the hostname results['apikey'] = NotifyOneSignal.unquote(results['host']) @@ -516,4 +642,10 @@ def parse_url(url): results['language'] = \ NotifyOneSignal.unquote(results['qsd']['lang']) + # Store our custom data + results['custom'] = results['qsd:'] + + # Store our postback data + results['postback'] = results['qsd+'] + return results diff --git a/libs/apprise/plugins/NotifyOpsgenie.py b/libs/apprise/plugins/opsgenie.py similarity index 60% rename from libs/apprise/plugins/NotifyOpsgenie.py rename to libs/apprise/plugins/opsgenie.py index c2dfed232..228ba7557 100644 --- a/libs/apprise/plugins/NotifyOpsgenie.py +++ b/libs/apprise/plugins/opsgenie.py @@ -47,15 +47,17 @@ # API Integration Docs: https://docs.opsgenie.com/docs/api-integration import requests -from json import dumps +from json import dumps, loads +import hashlib -from .NotifyBase import NotifyBase -from ..common import NotifyType +from .base import NotifyBase +from ..common import NotifyType, NOTIFY_TYPES +from ..common import PersistentStoreMode from ..utils import validate_regex from ..utils import is_uuid from ..utils import parse_list from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class OpsgenieCategory(NotifyBase): @@ -76,6 +78,47 @@ class OpsgenieCategory(NotifyBase): ) +class OpsgenieAlertAction: + """ + Defines the supported actions + """ + # Use mapping (specify :key=arg to over-ride) + MAP = 'map' + + # Create new alert (default) + NEW = 'new' + + # Close Alert + CLOSE = 'close' + + # Delete Alert + DELETE = 'delete' + + # Acknowledge Alert + ACKNOWLEDGE = 'acknowledge' + + # Add note to alert + NOTE = 'note' + + +OPSGENIE_ACTIONS = ( + OpsgenieAlertAction.MAP, + OpsgenieAlertAction.NEW, + OpsgenieAlertAction.CLOSE, + OpsgenieAlertAction.DELETE, + OpsgenieAlertAction.ACKNOWLEDGE, + OpsgenieAlertAction.NOTE, +) + +# Map all support Apprise Categories to Opsgenie Categories +OPSGENIE_ALERT_MAP = { + NotifyType.INFO: OpsgenieAlertAction.CLOSE, + NotifyType.SUCCESS: OpsgenieAlertAction.CLOSE, + NotifyType.WARNING: OpsgenieAlertAction.NEW, + NotifyType.FAILURE: OpsgenieAlertAction.NEW, +} + + # Regions class OpsgenieRegion: US = 'us' @@ -160,6 +203,10 @@ class NotifyOpsgenie(NotifyBase): # The maximum length of the body body_maxlen = 15000 + # Our default is to no not use persistent storage beyond in-memory + # reference + storage_mode = PersistentStoreMode.AUTO + # If we don't have the specified min length, then we don't bother using # the body directive opsgenie_body_minlen = 130 @@ -170,10 +217,24 @@ class NotifyOpsgenie(NotifyBase): # The maximum allowable targets within a notification default_batch_size = 50 + # Defines our default message mapping + opsgenie_message_map = { + # Add a note to existing alert + NotifyType.INFO: OpsgenieAlertAction.NOTE, + # Close existing alert + NotifyType.SUCCESS: OpsgenieAlertAction.CLOSE, + # Create notice + NotifyType.WARNING: OpsgenieAlertAction.NEW, + # Create notice + NotifyType.FAILURE: OpsgenieAlertAction.NEW, + } + # Define object templates templates = ( '{schema}://{apikey}', + '{schema}://{user}@{apikey}', '{schema}://{apikey}/{targets}', + '{schema}://{user}@{apikey}/{targets}', ) # Define our template tokens @@ -184,6 +245,10 @@ class NotifyOpsgenie(NotifyBase): 'private': True, 'required': True, }, + 'user': { + 'name': _('Username'), + 'type': 'string', + }, 'target_escalation': { 'name': _('Target Escalation'), 'prefix': '^', @@ -249,6 +314,12 @@ class NotifyOpsgenie(NotifyBase): 'to': { 'alias_of': 'targets', }, + 'action': { + 'name': _('Action'), + 'type': 'choice:string', + 'values': OPSGENIE_ACTIONS, + 'default': OPSGENIE_ACTIONS[0], + } }) # Map of key-value pairs to use as custom properties of the alert. @@ -257,11 +328,15 @@ class NotifyOpsgenie(NotifyBase): 'name': _('Details'), 'prefix': '+', }, + 'mapping': { + 'name': _('Action Mapping'), + 'prefix': ':', + }, } def __init__(self, apikey, targets, region_name=None, details=None, priority=None, alias=None, entity=None, batch=False, - tags=None, **kwargs): + tags=None, action=None, mapping=None, **kwargs): """ Initialize Opsgenie Object """ @@ -298,6 +373,41 @@ def __init__(self, apikey, targets, region_name=None, details=None, self.logger.warning(msg) raise TypeError(msg) + if action and isinstance(action, str): + self.action = next( + (a for a in OPSGENIE_ACTIONS if a.startswith(action)), None) + if self.action not in OPSGENIE_ACTIONS: + msg = 'The Opsgenie action specified ({}) is invalid.'\ + .format(action) + self.logger.warning(msg) + raise TypeError(msg) + else: + self.action = self.template_args['action']['default'] + + # Store our mappings + self.mapping = self.opsgenie_message_map.copy() + if mapping and isinstance(mapping, dict): + for _k, _v in mapping.items(): + # Get our mapping + k = next((t for t in NOTIFY_TYPES if t.startswith(_k)), None) + if not k: + msg = 'The Opsgenie mapping key specified ({}) ' \ + 'is invalid.'.format(_k) + self.logger.warning(msg) + raise TypeError(msg) + + _v_lower = _v.lower() + v = next((v for v in OPSGENIE_ACTIONS[1:] + if v.startswith(_v_lower)), None) + if not v: + msg = 'The Opsgenie mapping value (assigned to {}) ' \ + 'specified ({}) is invalid.'.format(k, _v) + self.logger.warning(msg) + raise TypeError(msg) + + # Update our mapping + self.mapping[k] = v + self.details = {} if details: # Store our extra details @@ -367,115 +477,234 @@ def __init__(self, apikey, targets, region_name=None, details=None, if is_uuid(target) else {'type': OpsgenieCategory.USER, 'username': target}) - def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + def _fetch(self, method, url, payload, params=None): """ - Perform Opsgenie Notification + Performs server retrieval/update and returns JSON Response """ - headers = { 'User-Agent': self.app_id, 'Content-Type': 'application/json', 'Authorization': 'GenieKey {}'.format(self.apikey), } + # Some Debug Logging + self.logger.debug( + 'Opsgenie POST URL: {} (cert_verify={})'.format( + url, self.verify_certificate)) + self.logger.debug('Opsgenie Payload: {}' .format(payload)) + + # Initialize our response object + content = {} + + # Always call throttle before any remote server i/o is made + self.throttle() + try: + r = method( + url, + data=dumps(payload), + params=params, + headers=headers, + verify=self.verify_certificate, + timeout=self.request_timeout, + ) + + # A Response might look like: + # { + # "result": "Request will be processed", + # "took": 0.302, + # "requestId": "43a29c5c-3dbf-4fa4-9c26-f4f71023e120" + # } + + try: + # Update our response object + content = loads(r.content) + + except (AttributeError, TypeError, ValueError): + # ValueError = r.content is Unparsable + # TypeError = r.content is None + # AttributeError = r is None + content = {} + + if r.status_code not in ( + requests.codes.accepted, requests.codes.ok): + status_str = \ + NotifyBase.http_response_code_lookup( + r.status_code) + + self.logger.warning( + 'Failed to send Opsgenie notification:' + '{}{}error={}.'.format( + status_str, + ', ' if status_str else '', + r.status_code)) + + self.logger.debug( + 'Response Details:\r\n{}'.format(r.content)) + + return (False, content.get('requestId')) + + # If we reach here; the message was sent + self.logger.info('Sent Opsgenie notification') + self.logger.debug( + 'Response Details:\r\n{}'.format(r.content)) + + return (True, content.get('requestId')) + + except requests.RequestException as e: + self.logger.warning( + 'A Connection error occurred sending Opsgenie ' + 'notification.') + self.logger.debug('Socket Exception: %s' % str(e)) + + return (False, content.get('requestId')) + + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + """ + Perform Opsgenie Notification + """ + + # Get our Opsgenie Action + action = OPSGENIE_ALERT_MAP[notify_type] \ + if self.action == OpsgenieAlertAction.MAP else self.action + # Prepare our URL as it's based on our hostname notify_url = OPSGENIE_API_LOOKUP[self.region_name] # Initialize our has_error flag has_error = False - # Use body if title not set - title_body = body if not title else title - - # Create a copy ouf our details object - details = self.details.copy() - if 'type' not in details: - details['type'] = notify_type - - # Prepare our payload - payload = { - 'source': self.app_desc, - 'message': title_body, - 'description': body, - 'details': details, - 'priority': 'P{}'.format(self.priority), - } + # Default method is to post + method = requests.post + + # For indexing in persistent store + key = hashlib.sha1( + (self.entity if self.entity else ( + self.alias if self.alias else ( + title if title else self.app_id))) + .encode('utf-8')).hexdigest()[0:10] + + # Get our Opsgenie Request IDs + request_ids = self.store.get(key, []) + if not isinstance(request_ids, list): + request_ids = [] + + if action == OpsgenieAlertAction.NEW: + # Create a copy ouf our details object + details = self.details.copy() + if 'type' not in details: + details['type'] = notify_type + + # Use body if title not set + title_body = body if not title else title + + # Prepare our payload + payload = { + 'source': self.app_desc, + 'message': title_body, + 'description': body, + 'details': details, + 'priority': 'P{}'.format(self.priority), + } + + # Use our body directive if we exceed the minimum message + # limitation + if len(payload['message']) > self.opsgenie_body_minlen: + payload['message'] = '{}...'.format( + title_body[:self.opsgenie_body_minlen - 3]) + + if self.__tags: + payload['tags'] = self.__tags + + if self.entity: + payload['entity'] = self.entity + + if self.alias: + payload['alias'] = self.alias + + if self.user: + payload['user'] = self.user + + # reset our request IDs - we will re-populate them + request_ids = [] + + length = len(self.targets) if self.targets else 1 + for index in range(0, length, self.batch_size): + if self.targets: + # If there were no targets identified, then we simply + # just iterate once without the responders set + payload['responders'] = \ + self.targets[index:index + self.batch_size] + + # Perform our post + success, request_id = self._fetch( + method, notify_url, payload) + + if success and request_id: + # Save our response + request_ids.append(request_id) + + else: + has_error = True - # Use our body directive if we exceed the minimum message - # limitation - if len(payload['message']) > self.opsgenie_body_minlen: - payload['message'] = '{}...'.format( - title_body[:self.opsgenie_body_minlen - 3]) + # Store our entries for a maximum of 60 days + self.store.set(key, request_ids, expires=60 * 60 * 24 * 60) - if self.__tags: - payload['tags'] = self.__tags + elif request_ids: + # Prepare our payload + payload = { + 'source': self.app_desc, + 'note': body, + } - if self.entity: - payload['entity'] = self.entity + if self.user: + payload['user'] = self.user - if self.alias: - payload['alias'] = self.alias + # Prepare our Identifier type + params = { + 'identifierType': 'id', + } - length = len(self.targets) if self.targets else 1 - for index in range(0, length, self.batch_size): - if self.targets: - # If there were no targets identified, then we simply - # just iterate once without the responders set - payload['responders'] = \ - self.targets[index:index + self.batch_size] + for request_id in request_ids: + if action == OpsgenieAlertAction.DELETE: + # Update our URL + url = f'{notify_url}/{request_id}' + method = requests.delete - # Some Debug Logging - self.logger.debug( - 'Opsgenie POST URL: {} (cert_verify={})'.format( - notify_url, self.verify_certificate)) - self.logger.debug('Opsgenie Payload: {}' .format(payload)) + elif action == OpsgenieAlertAction.ACKNOWLEDGE: + url = f'{notify_url}/{request_id}/acknowledge' - # Always call throttle before any remote server i/o is made - self.throttle() - try: - r = requests.post( - notify_url, - data=dumps(payload), - headers=headers, - verify=self.verify_certificate, - timeout=self.request_timeout, - ) - - if r.status_code not in ( - requests.codes.accepted, requests.codes.ok): - status_str = \ - NotifyBase.http_response_code_lookup( - r.status_code) - - self.logger.warning( - 'Failed to send Opsgenie notification:' - '{}{}error={}.'.format( - status_str, - ', ' if status_str else '', - r.status_code)) - - self.logger.debug( - 'Response Details:\r\n{}'.format(r.content)) - - # Mark our failure + elif action == OpsgenieAlertAction.CLOSE: + url = f'{notify_url}/{request_id}/close' + + else: # action == OpsgenieAlertAction.CLOSE: + url = f'{notify_url}/{request_id}/notes' + + # Perform our post + success, _ = self._fetch(method, url, payload, params) + + if not success: has_error = True - continue - # If we reach here; the message was sent - self.logger.info('Sent Opsgenie notification') - self.logger.debug( - 'Response Details:\r\n{}'.format(r.content)) + if not has_error and action == OpsgenieAlertAction.DELETE: + # Remove cached entry + self.store.clear(key) - except requests.RequestException as e: - self.logger.warning( - 'A Connection error occurred sending Opsgenie ' - 'notification.') - self.logger.debug('Socket Exception: %s' % str(e)) - # Mark our failure - has_error = True + else: + self.logger.info( + 'No Opsgenie notification sent due to (nothing to %s) ' + 'condition', self.action) return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.region_name, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -483,6 +712,7 @@ def url(self, privacy=False, *args, **kwargs): # Define any URL parameters params = { + 'action': self.action, 'region': self.region_name, 'priority': OPSGENIE_PRIORITIES[self.template_args['priority']['default']] @@ -506,6 +736,10 @@ def url(self, privacy=False, *args, **kwargs): # Append our details into our parameters params.update({'+{}'.format(k): v for k, v in self.details.items()}) + # Append our assignment extra's into our parameters + params.update( + {':{}'.format(k): v for k, v in self.mapping.items()}) + # Extend our parameters params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) @@ -522,8 +756,9 @@ def url(self, privacy=False, *args, **kwargs): NotifyOpsgenie.template_tokens['target_team']['prefix'], } - return '{schema}://{apikey}/{targets}/?{params}'.format( + return '{schema}://{user}{apikey}/{targets}/?{params}'.format( schema=self.secure_protocol, + user='{}@'.format(self.user) if self.user else '', apikey=self.pprint(self.apikey, privacy, safe=''), targets='/'.join( [NotifyOpsgenie.quote('{}{}'.format( @@ -608,4 +843,14 @@ def parse_url(url): if 'to' in results['qsd'] and len(results['qsd']['to']): results['targets'].append(results['qsd']['to']) + # Store our action (if defined) + if 'action' in results['qsd'] and len(results['qsd']['action']): + results['action'] = \ + NotifyOpsgenie.unquote(results['qsd']['action']) + + # store any custom mapping defined + results['mapping'] = \ + {NotifyOpsgenie.unquote(x): NotifyOpsgenie.unquote(y) + for x, y in results['qsd:'].items()} + return results diff --git a/libs/apprise/plugins/NotifyPagerDuty.py b/libs/apprise/plugins/pagerduty.py similarity index 97% rename from libs/apprise/plugins/NotifyPagerDuty.py rename to libs/apprise/plugins/pagerduty.py index 0896b41b1..51bd38887 100644 --- a/libs/apprise/plugins/NotifyPagerDuty.py +++ b/libs/apprise/plugins/pagerduty.py @@ -34,13 +34,13 @@ import requests from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..common import NotifyImageSize from ..utils import validate_regex from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class PagerDutySeverity: @@ -412,6 +412,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.integration_key, self.apikey, + self.source, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPagerTree.py b/libs/apprise/plugins/pagertree.py similarity index 97% rename from libs/apprise/plugins/NotifyPagerTree.py rename to libs/apprise/plugins/pagertree.py index c9290f2f7..7d82f677c 100644 --- a/libs/apprise/plugins/NotifyPagerTree.py +++ b/libs/apprise/plugins/pagertree.py @@ -31,11 +31,11 @@ from uuid import uuid4 -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Actions @@ -299,6 +299,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.integration) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyParsePlatform.py b/libs/apprise/plugins/parseplatform.py similarity index 95% rename from libs/apprise/plugins/NotifyParsePlatform.py rename to libs/apprise/plugins/parseplatform.py index 2a182ed31..808c3099c 100644 --- a/libs/apprise/plugins/NotifyParsePlatform.py +++ b/libs/apprise/plugins/parseplatform.py @@ -30,10 +30,10 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Used to break path apart into list of targets TARGET_LIST_DELIM = re.compile(r'[ \t\r\n,\\/]+') @@ -257,6 +257,19 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.application_id, self.master_key, self.host, self.port, + self.fullpath, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPopcornNotify.py b/libs/apprise/plugins/popcorn_notify.py similarity index 96% rename from libs/apprise/plugins/NotifyPopcornNotify.py rename to libs/apprise/plugins/popcorn_notify.py index 0ecd8af68..16d34ab09 100644 --- a/libs/apprise/plugins/NotifyPopcornNotify.py +++ b/libs/apprise/plugins/popcorn_notify.py @@ -28,14 +28,14 @@ import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_email from ..utils import is_phone_no from ..utils import parse_list from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyPopcornNotify(NotifyBase): @@ -242,6 +242,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyProwl.py b/libs/apprise/plugins/prowl.py similarity index 96% rename from libs/apprise/plugins/NotifyProwl.py rename to libs/apprise/plugins/prowl.py index e5c07bf4e..55c4c6be2 100644 --- a/libs/apprise/plugins/NotifyProwl.py +++ b/libs/apprise/plugins/prowl.py @@ -28,10 +28,10 @@ import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Priorities @@ -250,6 +250,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey, self.providerkey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPushBullet.py b/libs/apprise/plugins/pushbullet.py similarity index 96% rename from libs/apprise/plugins/NotifyPushBullet.py rename to libs/apprise/plugins/pushbullet.py index 5e9c43fbf..2b88bbeda 100644 --- a/libs/apprise/plugins/NotifyPushBullet.py +++ b/libs/apprise/plugins/pushbullet.py @@ -30,13 +30,13 @@ from json import dumps from json import loads -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..utils import is_email from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ -from ..attachment.AttachBase import AttachBase +from ..locale import gettext_lazy as _ +from ..attachment.base import AttachBase # Flag used as a placeholder to sending to all devices PUSHBULLET_SEND_TO_ALL = 'ALL_DEVICES' @@ -152,7 +152,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, if attach and self.attachment_support: # We need to upload our payload first so that we can source it # in remaining messages - for attachment in attach: + for no, attachment in enumerate(attach, start=1): # Perform some simple error checking if not attachment: @@ -168,7 +168,8 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, # prepare payload payload = { - 'file_name': attachment.name, + 'file_name': attachment.name + if attachment.name else f'file{no:03}.dat', 'file_type': attachment.mimetype, } # First thing we need to do is make a request so that we can @@ -386,6 +387,15 @@ def _send(self, url, payload, **kwargs): if files: files['file'][1].close() + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.accesstoken) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPushDeer.py b/libs/apprise/plugins/pushdeer.py similarity index 93% rename from libs/apprise/plugins/NotifyPushDeer.py rename to libs/apprise/plugins/pushdeer.py index 6766dc7ff..226e3f210 100644 --- a/libs/apprise/plugins/NotifyPushDeer.py +++ b/libs/apprise/plugins/pushdeer.py @@ -29,9 +29,9 @@ import requests from ..common import NotifyType -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Syntax: # schan://{key}/ @@ -180,6 +180,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.push_key, self.host, self.port, + ) + def url(self, privacy=False): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPushed.py b/libs/apprise/plugins/pushed.py similarity index 96% rename from libs/apprise/plugins/NotifyPushed.py rename to libs/apprise/plugins/pushed.py index a50970f99..c0727ad15 100644 --- a/libs/apprise/plugins/NotifyPushed.py +++ b/libs/apprise/plugins/pushed.py @@ -31,12 +31,12 @@ from json import dumps from itertools import chain -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Used to detect and parse channels IS_CHANNEL = re.compile(r'^#?(?P[A-Za-z0-9]+)$') @@ -303,6 +303,15 @@ def _send(self, payload, notify_type, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.app_key, self.app_secret) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPushjet.py b/libs/apprise/plugins/pushjet.py similarity index 94% rename from libs/apprise/plugins/NotifyPushjet.py rename to libs/apprise/plugins/pushjet.py index 253ac6818..bc368b109 100644 --- a/libs/apprise/plugins/NotifyPushjet.py +++ b/libs/apprise/plugins/pushjet.py @@ -29,11 +29,11 @@ import requests from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyPushjet(NotifyBase): @@ -117,6 +117,18 @@ def __init__(self, secret_key, **kwargs): return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, self.port, self.secret_key, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPushMe.py b/libs/apprise/plugins/pushme.py similarity index 95% rename from libs/apprise/plugins/NotifyPushMe.py rename to libs/apprise/plugins/pushme.py index 30889f868..54d4032de 100644 --- a/libs/apprise/plugins/NotifyPushMe.py +++ b/libs/apprise/plugins/pushme.py @@ -28,12 +28,12 @@ import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..common import NotifyFormat from ..utils import validate_regex from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyPushMe(NotifyBase): @@ -171,6 +171,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPushover.py b/libs/apprise/plugins/pushover.py similarity index 98% rename from libs/apprise/plugins/NotifyPushover.py rename to libs/apprise/plugins/pushover.py index be6ada289..07881884a 100644 --- a/libs/apprise/plugins/NotifyPushover.py +++ b/libs/apprise/plugins/pushover.py @@ -30,14 +30,14 @@ import requests from itertools import chain -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..common import NotifyFormat from ..conversion import convert_between from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ -from ..attachment.AttachBase import AttachBase +from ..locale import gettext_lazy as _ +from ..attachment.base import AttachBase # Flag used as a placeholder to sending to all devices PUSHOVER_SEND_TO_ALL = 'ALL_DEVICES' @@ -549,6 +549,15 @@ def _send(self, payload, attach=None): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.user_key, self.token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPushSafer.py b/libs/apprise/plugins/pushsafer.py similarity index 94% rename from libs/apprise/plugins/NotifyPushSafer.py rename to libs/apprise/plugins/pushsafer.py index 32cfa82fe..dd5a6c82c 100644 --- a/libs/apprise/plugins/NotifyPushSafer.py +++ b/libs/apprise/plugins/pushsafer.py @@ -26,15 +26,15 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -import base64 import requests from json import loads -from .NotifyBase import NotifyBase +from .base import NotifyBase +from .. import exception from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class PushSaferSound: @@ -548,12 +548,12 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, if attach and self.attachment_support: # We need to upload our payload first so that we can source it # in remaining messages - for attachment in attach: + for no, attachment in enumerate(attach, start=1): # prepare payload if not attachment: # We could not access the attachment self.logger.error( - 'Could not access attachment {}.'.format( + 'Could not access PushSafer attachment {}.'.format( attachment.url(privacy=True))) return False @@ -569,24 +569,27 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, attachment.url(privacy=True))) try: - with open(attachment.path, 'rb') as f: - # Output must be in a DataURL format (that's what - # PushSafer calls it): - attachment = ( - attachment.name, - 'data:{};base64,{}'.format( - attachment.mimetype, - base64.b64encode(f.read()))) - - except (OSError, IOError) as e: - self.logger.warning( - 'An I/O error occurred while reading {}.'.format( - attachment.name if attachment else 'attachment')) - self.logger.debug('I/O Exception: %s' % str(e)) + # Output must be in a DataURL format (that's what + # PushSafer calls it): + attachments.append(( + attachment.name + if attachment.name else f'file{no:03}.dat', + 'data:{};base64,{}'.format( + attachment.mimetype, + attachment.base64(), + ) + )) + + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access PushSafer attachment {}.'.format( + attachment.url(privacy=True))) return False - # Save our pre-prepared payload for attachment posting - attachments.append(attachment) + self.logger.debug( + 'Appending PushSafer attachment {}'.format( + attachment.url(privacy=True))) # Create a copy of the targets list targets = list(self.targets) @@ -756,6 +759,18 @@ def _send(self, payload, **kwargs): return False, response + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.privatekey, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyPushy.py b/libs/apprise/plugins/pushy.py similarity index 97% rename from libs/apprise/plugins/NotifyPushy.py rename to libs/apprise/plugins/pushy.py index 097017dac..d0995df3b 100644 --- a/libs/apprise/plugins/NotifyPushy.py +++ b/libs/apprise/plugins/pushy.py @@ -32,11 +32,11 @@ from itertools import chain from json import dumps, loads -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Used to detect a Device and Topic VALIDATE_DEVICE = re.compile(r'^@(?P[a-z0-9]+)$', re.I) @@ -310,6 +310,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyReddit.py b/libs/apprise/plugins/reddit.py similarity index 98% rename from libs/apprise/plugins/NotifyReddit.py rename to libs/apprise/plugins/reddit.py index 022a0a50d..1c261be9c 100644 --- a/libs/apprise/plugins/NotifyReddit.py +++ b/libs/apprise/plugins/reddit.py @@ -53,14 +53,14 @@ from datetime import datetime from datetime import timezone -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType from ..utils import parse_list from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ from .. import __title__, __version__ # Extend HTTP Error Messages @@ -324,6 +324,18 @@ def __init__(self, app_id=None, app_secret=None, targets=None, return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.client_id, self.client_secret, + self.user, self.password, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyRevolt.py b/libs/apprise/plugins/revolt.py similarity index 97% rename from libs/apprise/plugins/NotifyRevolt.py rename to libs/apprise/plugins/revolt.py index ae0a43b10..2edbed330 100644 --- a/libs/apprise/plugins/NotifyRevolt.py +++ b/libs/apprise/plugins/revolt.py @@ -42,13 +42,13 @@ from datetime import datetime from datetime import timezone -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import NotifyType from ..utils import validate_regex from ..utils import parse_list -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyRevolt(NotifyBase): @@ -354,6 +354,15 @@ def _send(self, payload, channel_id, retries=1, **kwargs): return (True, content) + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.bot_token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyRocketChat.py b/libs/apprise/plugins/rocketchat.py similarity index 97% rename from libs/apprise/plugins/NotifyRocketChat.py rename to libs/apprise/plugins/rocketchat.py index 9011a5e71..7850c3d05 100644 --- a/libs/apprise/plugins/NotifyRocketChat.py +++ b/libs/apprise/plugins/rocketchat.py @@ -32,14 +32,14 @@ from json import dumps from itertools import chain -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import NotifyType from ..utils import parse_list from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ IS_CHANNEL = re.compile(r'^#(?P[A-Za-z0-9_-]+)$') IS_USER = re.compile(r'^@(?P[A-Za-z0-9._-]+)$') @@ -319,6 +319,23 @@ def __init__(self, webhook=None, targets=None, mode=None, avatar=None, return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.host, + self.port if self.port else (443 if self.secure else 80), + self.user, + self.password if self.mode in ( + RocketChatAuthMode.BASIC, RocketChatAuthMode.TOKEN) + else self.webhook, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyRSyslog.py b/libs/apprise/plugins/rsyslog.py similarity index 96% rename from libs/apprise/plugins/NotifyRSyslog.py rename to libs/apprise/plugins/rsyslog.py index e39744627..195a2f3ca 100644 --- a/libs/apprise/plugins/NotifyRSyslog.py +++ b/libs/apprise/plugins/rsyslog.py @@ -29,10 +29,10 @@ import os import socket -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class syslog: @@ -300,6 +300,19 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.protocol, self.host, + self.port if self.port + else self.template_tokens['port']['default'], + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyRyver.py b/libs/apprise/plugins/ryver.py similarity index 96% rename from libs/apprise/plugins/NotifyRyver.py rename to libs/apprise/plugins/ryver.py index 0872f3e52..c792c3d78 100644 --- a/libs/apprise/plugins/NotifyRyver.py +++ b/libs/apprise/plugins/ryver.py @@ -38,12 +38,12 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class RyverWebhookMode: @@ -272,6 +272,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.organization, self.token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySendGrid.py b/libs/apprise/plugins/sendgrid.py similarity index 88% rename from libs/apprise/plugins/NotifySendGrid.py rename to libs/apprise/plugins/sendgrid.py index b82e3e60d..b4f92e9f4 100644 --- a/libs/apprise/plugins/NotifySendGrid.py +++ b/libs/apprise/plugins/sendgrid.py @@ -49,13 +49,15 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase +from .. import exception from ..common import NotifyFormat from ..common import NotifyType from ..utils import parse_list from ..utils import is_email from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ + # Extend HTTP Error Messages SENDGRID_HTTP_ERROR_MAP = { @@ -90,6 +92,9 @@ class NotifySendGrid(NotifyBase): # The default Email API URL to use notify_url = 'https://api.sendgrid.com/v3/mail/send' + # Support attachments + attachment_support = True + # Allow 300 requests per minute. # 60/300 = 0.2 request_rate_per_sec = 0.2 @@ -243,6 +248,15 @@ def __init__(self, apikey, from_email, targets=None, cc=None, return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey, self.from_email) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -288,7 +302,8 @@ def __len__(self): """ return len(self.targets) - def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, + **kwargs): """ Perform SendGrid Notification """ @@ -322,6 +337,44 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): }], } + if attach and self.attachment_support: + attachments = [] + + # Send our attachments + for no, attachment in enumerate(attach, start=1): + # Perform some simple error checking + if not attachment: + # We could not access the attachment + self.logger.error( + 'Could not access SendGrid attachment {}.'.format( + attachment.url(privacy=True))) + return False + + try: + attachments.append({ + "content": attachment.base64(), + "filename": attachment.name + if attachment.name else f'file{no:03}.dat', + "type": "application/octet-stream", + "disposition": "attachment" + }) + + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access SendGrid attachment {}.'.format( + attachment.url(privacy=True))) + return False + + self.logger.debug( + 'Appending SendGrid attachment {}'.format( + attachment.url(privacy=True))) + + # Append our attachments to the payload + _payload.update({ + 'attachments': attachments, + }) + if self.template: _payload['template_id'] = self.template diff --git a/libs/apprise/plugins/NotifyServerChan.py b/libs/apprise/plugins/serverchan.py similarity index 93% rename from libs/apprise/plugins/NotifyServerChan.py rename to libs/apprise/plugins/serverchan.py index cf250cf5b..db1571417 100644 --- a/libs/apprise/plugins/NotifyServerChan.py +++ b/libs/apprise/plugins/serverchan.py @@ -30,9 +30,9 @@ import requests from ..common import NotifyType -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Register at https://sct.ftqq.com/ @@ -74,7 +74,7 @@ class NotifyServerChan(NotifyBase): 'type': 'string', 'private': True, 'required': True, - 'regex': (r'^[a-z0-9]+$', 'i'), + 'regex': (r'^[a-z0-9-]+$', 'i'), }, }) @@ -149,6 +149,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.token) + def url(self, privacy=False): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySES.py b/libs/apprise/plugins/ses.py similarity index 97% rename from libs/apprise/plugins/NotifySES.py rename to libs/apprise/plugins/ses.py index b580b14d6..30e59702d 100644 --- a/libs/apprise/plugins/NotifySES.py +++ b/libs/apprise/plugins/ses.py @@ -95,13 +95,13 @@ from email.header import Header from urllib.parse import quote -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType from ..utils import parse_emails from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ from ..utils import is_email # Our Regin Identifier @@ -448,7 +448,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, base.attach(content) # Now store our attachments - for attachment in attach: + for no, attachment in enumerate(attach, start=1): if not attachment: # We could not load the attachment; take an early # exit since this isn't what the end user wanted @@ -468,10 +468,13 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, app = MIMEApplication(abody.read()) app.set_type(attachment.mimetype) + filename = attachment.name \ + if attachment.name else f'file{no:03}.dat' + app.add_header( 'Content-Disposition', 'attachment; filename="{}"'.format( - Header(attachment.name, 'utf-8')), + Header(filename, 'utf-8')), ) base.attach(app) @@ -770,6 +773,18 @@ def _xml_iter(root, response): return response + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.from_addr, self.aws_access_key_id, + self.aws_secret_access_key, self.aws_region_name, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/sfr.py b/libs/apprise/plugins/sfr.py new file mode 100644 index 000000000..27ea0fb0b --- /dev/null +++ b/libs/apprise/plugins/sfr.py @@ -0,0 +1,443 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron +# +# 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. +# +# 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. + +# For this to work correctly you need to have a valid SFR DMC service account +# to whicthe API password can be generated. A "space" is also necessary +# (space = a logical separation between clients), which will give you a +# specific spaceId +# +# Expected credentials looks a little like this: +# serviceId: 84920958892 - Random numbers +# servicePassword: XxXXxXXx - Random characters +# spaceId: 984348 - Random numbers +# +# 1. Visit https://www.sfr.fr/ +# +# 2. Url will look like this +# https://www.dmc.sfr-sh.fr/DmcWS/1.5.8/JsonService// + +import requests +import json + +from .base import NotifyBase +from ..common import NotifyType +from ..locale import gettext_lazy as _ +from ..utils import is_phone_no +from ..utils import parse_phone_no +from ..url import PrivacyMode + + +class NotifySFR(NotifyBase): + """ + A wrapper for SFR French Telecom DMC API + """ + + # The default descriptive name associated with the Notification + service_name = _('Société Française du Radiotéléphone') + + # The services URL + service_url = 'https://www.sfr.fr/' + + # The default protocol + protocol = 'sfr' + + # A URL that takes you to the setup/help of the specific protocol + setup_url = 'https://github.com/caronc/apprise/wiki/Notify_sfr' + + # SFR api + notify_url = ( + 'https://www.dmc.sfr-sh.fr/DmcWS/1.5.8/JsonService/' + 'MessagesUnitairesWS/addSingleCall' # this is the actual api call + ) + + # The maximum length of the body + body_maxlen = 160 + + # A title can not be used for SMS Messages. Setting this to zero will + # cause any title (if defined) to get placed into the message body. + title_maxlen = 0 + + # Define object templates + templates = ( + '{schema}://{user}:{password}@{space_id}/{targets}', + ) + + # Define our tokens + template_tokens = dict( + NotifyBase.template_tokens, **{ + 'user': { + 'name': _('Service ID'), + 'type': 'string', + 'required': True, + }, + 'password': { + 'name': _('Service Password'), + 'type': 'string', + 'private': True, + 'required': True, + }, + 'space_id': { + 'name': _('Space ID'), + 'type': 'string', + 'private': True, + 'required': True, + }, + 'target': { + 'name': _('Recipient Phone Number'), + 'type': 'string', + 'regex': (r'^\+?[0-9\s)(+-]+$', 'i'), + 'map_to': 'targets', + }, + 'targets': { + 'name': _('Targets'), + 'type': 'list:string', + 'required': True, + }, + } + ) + + # Define our template arguments + template_args = dict( + NotifyBase.template_args, **{ + 'lang': { + 'name': _('Language'), + 'type': 'string', + 'default': 'fr_FR', + 'required': True, + }, + 'sender': { + 'name': _('Sender Name'), + 'type': 'string', + 'required': True, + 'default': '', + }, + 'from': { + 'alias_of': 'sender' + }, + 'media': { + 'name': _('Media Type'), + 'type': 'string', + 'required': True, + 'default': 'SMSUnicode', + 'values': ['SMS', 'SMSLong', 'SMSUnicode', 'SMSUnicodeLong'], + }, + 'timeout': { + 'name': _('Timeout'), + 'type': 'int', + 'default': 2880, + 'required': False, + }, + 'voice': { + 'name': _('TTS Voice'), + 'type': 'string', + 'default': 'claire08s', + 'values': ['claire08s', 'laura8k'], + 'required': False, + }, + 'to': { + 'alias_of': 'targets', + }, + } + ) + + def __init__(self, space_id=None, targets=None, lang=None, sender=None, + media=None, timeout=None, voice=None, **kwargs): + """ + Initialize SFR Object + """ + super().__init__(**kwargs) + + if not (self.user and self.password): + msg = 'A SFR user (serviceId) and password (servicePassword) ' \ + 'combination was not provided.' + self.logger.warning(msg) + raise TypeError(msg) + + self.space_id = space_id + if not self.space_id: + msg = 'A SFR Space ID is required.' + self.logger.warning(msg) + raise TypeError(msg) + + self.voice = voice \ + if voice else self.template_args['voice']['default'] + self.lang = lang \ + if lang else self.template_args['lang']['default'] + self.media = media \ + if media else self.template_args['media']['default'] + self.sender = sender \ + if sender else self.template_args['sender']['default'] + + # Set our Time to Live Flag + self.timeout = self.template_args['timeout']['default'] + try: + self.timeout = int(timeout) + + except (ValueError, TypeError): + # set default timeout + self.timeout = 2880 + pass + + # Parse our targets + self.targets = list() + + for target in parse_phone_no(targets): + # Validate targets and drop bad ones: + result = is_phone_no(target) + if not result: + self.logger.warning( + 'Dropped invalid phone # ' + '({}) specified.'.format(target), + ) + continue + + # store valid phone number + self.targets.append(result['full']) + + if not self.targets: + msg = ('No receiver phone number has been provided. Please ' + 'provide as least one valid phone number.') + self.logger.warning(msg) + raise TypeError(msg) + + return + + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + """ + Perform the SFR notification + """ + + # error tracking (used for function return) + has_error = False + + # Create a copy of the targets list + targets = list(self.targets) + + # Construct the authentication JSON + auth_payload = json.dumps({ + 'serviceId': self.user, + 'servicePassword': self.password, + 'spaceId': self.space_id, + 'lang': self.lang, + }) + + base_payload = { + # Can be 'SMS', 'SMSLong', 'SMSUnicode', or 'SMSUnicodeLong' + 'media': self.media, + # Content of the message + 'textMsg': body, + # Receiver's phone number (set below) + 'to': None, + # Optional, default to '' + 'from': self.sender, + # Optional, default 2880 minutes + 'timeout': self.timeout, + # Optional, default to French voice + 'ttsVoice': self.voice, + } + + while len(targets): + # Get our target to notify + target = targets.pop(0) + + # Prepare our target phone no + base_payload['to'] = target + + # Always call throttle before any remote server i/o is made + self.throttle() + + # Finalize our payload + payload = { + 'authenticate': auth_payload, + 'messageUnitaire': json.dumps(base_payload, ensure_ascii=True) + } + + # Some Debug Logging + self.logger.debug('SFR POST URL: {} (cert_verify={})'.format( + self.notify_url, self.verify_certificate)) + self.logger.debug('SFR Payload: {}' .format(payload)) + + try: + r = requests.post( + self.notify_url, + params=payload, + verify=self.verify_certificate, + timeout=self.request_timeout, + ) + + try: + content = json.loads(r.content) + + except (AttributeError, TypeError, ValueError): + # ValueError = r.content is Unparsable + # TypeError = r.content is None + # AttributeError = r is None + content = {} + + # Check if the request was successfull + if r.status_code not in ( + requests.codes.ok, + requests.codes.no_content, + ): + # We had a problem + status_str = \ + NotifySFR.http_response_code_lookup( + r.status_code) + + self.logger.warning( + 'Failed to send SFR notification to {}: ' + '{}{}error={}.'.format( + target, + status_str, + ', ' if status_str else '', + r.status_code)) + + self.logger.debug( + 'Response Details:\r\n{}'.format(r.content)) + + # Mark our failure + has_error = True + continue + + # SFR returns a code 200 even if the authentication fails + # It then indicates in the content['success'] field the + # Actual state of the transaction + if not content.get('success', False): + self.logger.warning( + 'SFR Notification to {} was not sent by the server: ' + 'server_error={}, fatal={}.'.format( + target, + content.get('errorCode', 'UNKNOWN'), + content.get('fatal', 'True'), + )) + + # Mark our failure + has_error = True + continue + + self.logger.info( + 'Sent SFR notification to %s.' % target) + + except requests.RequestException as e: + self.logger.warning( + 'A Connection error occurred sending SFR:%s ' + 'notification.' % target + ) + self.logger.debug('Socket Exception: %s' % str(e)) + + # Mark our failure + has_error = True + continue + + return not has_error + + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.space_id, + ) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + # Define any URL parameters + params = { + 'from': self.sender, + 'timeout': str(self.timeout), + 'voice': self.voice, + 'lang': self.lang, + 'media': self.media, + } + + # Extend our parameters + params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + + return '{schema}://{user}:{password}@{sid}/{targets}?{params}'.format( + schema=self.secure_protocol if self.secure else self.protocol, + user=self.user, + password=self.pprint( + self.password, + privacy, + mode=PrivacyMode.Secret, + safe='', + ), + sid=self.pprint(self.space_id, privacy, safe=''), + targets='/'.join( + [NotifySFR.quote(x, safe='') for x in self.targets]), + params=self.urlencode(params), + ) + + def __len__(self): + """ + Returns the number of targets associated with this notification + """ + return len(self.targets) + + @staticmethod + def parse_url(url): + """ + Parse the URL and return arguments required to initialize this plugin + """ + # NotifyBase.parse_url() will make the initial parsing of your string + # very easy to use. It will tokenize the entire URL for you. The + # tokens are then passed into your __init__() function you defined to + # generate you're object + + results = NotifyBase.parse_url(url, verify_host=False) + + if not results: + # We're done early as we couldn't load the results + return results + + # Extract user and password + results['space_id'] = results.get('host') + results['targets'] = NotifySFR.split_path(results['fullpath']) + + # Extract additional parameters + qsd = results.get('qsd', {}) + results['sender'] = \ + NotifySFR.unquote(qsd.get('sender', qsd.get('from'))) + results['timeout'] = NotifySFR.unquote(qsd.get('timeout')) + results['voice'] = NotifySFR.unquote(qsd.get('voice')) + results['lang'] = NotifySFR.unquote(qsd.get('lang')) + results['media'] = NotifySFR.unquote(qsd.get('media')) + + # Support the 'to' variable so that we can support rooms this way too + # The 'to' makes it easier to use yaml configuration + if 'to' in results['qsd'] and len(results['qsd']['to']): + results['targets'] += \ + NotifySFR.parse_phone_no(results['qsd']['to']) + + return results diff --git a/libs/apprise/plugins/NotifySignalAPI.py b/libs/apprise/plugins/signal_api.py similarity index 93% rename from libs/apprise/plugins/NotifySignalAPI.py rename to libs/apprise/plugins/signal_api.py index b35b4989e..9a0191237 100644 --- a/libs/apprise/plugins/NotifySignalAPI.py +++ b/libs/apprise/plugins/signal_api.py @@ -29,15 +29,15 @@ import re import requests from json import dumps -import base64 -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType +from .. import exception from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import parse_bool -from ..URLBase import PrivacyMode -from ..AppriseLocale import gettext_lazy as _ +from ..url import PrivacyMode +from ..locale import gettext_lazy as _ GROUP_REGEX = re.compile( @@ -239,23 +239,24 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, if not attachment: # We could not access the attachment self.logger.error( - 'Could not access attachment {}.'.format( + 'Could not access Signal API attachment {}.'.format( attachment.url(privacy=True))) return False try: - with open(attachment.path, 'rb') as f: - # Prepare our Attachment in Base64 - attachments.append( - base64.b64encode(f.read()).decode('utf-8')) + attachments.append(attachment.base64()) - except (OSError, IOError) as e: - self.logger.warning( - 'An I/O error occurred while reading {}.'.format( - attachment.name if attachment else 'attachment')) - self.logger.debug('I/O Exception: %s' % str(e)) + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access Signal API attachment {}.'.format( + attachment.url(privacy=True))) return False + self.logger.debug( + 'Appending Signal API attachment {}'.format( + attachment.url(privacy=True))) + # Prepare our headers headers = { 'User-Agent': self.app_id, @@ -372,6 +373,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, self.port, self.source, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySimplePush.py b/libs/apprise/plugins/simplepush.py similarity index 96% rename from libs/apprise/plugins/NotifySimplePush.py rename to libs/apprise/plugins/simplepush.py index 3851e1e3c..023fcf9d5 100644 --- a/libs/apprise/plugins/NotifySimplePush.py +++ b/libs/apprise/plugins/simplepush.py @@ -30,11 +30,11 @@ from json import loads import requests -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ from base64 import urlsafe_b64encode import hashlib @@ -283,6 +283,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.user, self.password, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySinch.py b/libs/apprise/plugins/sinch.py similarity index 97% rename from libs/apprise/plugins/NotifySinch.py rename to libs/apprise/plugins/sinch.py index 74b3c452a..51cdea32b 100644 --- a/libs/apprise/plugins/NotifySinch.py +++ b/libs/apprise/plugins/sinch.py @@ -39,13 +39,13 @@ import requests import json -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class SinchRegion: @@ -381,6 +381,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.service_plan_id, self.api_token, self.source, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySlack.py b/libs/apprise/plugins/slack.py similarity index 85% rename from libs/apprise/plugins/NotifySlack.py rename to libs/apprise/plugins/slack.py index b66fe99f4..11d78e4c1 100644 --- a/libs/apprise/plugins/NotifySlack.py +++ b/libs/apprise/plugins/slack.py @@ -78,7 +78,7 @@ from json import loads from time import time -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..common import NotifyFormat @@ -86,7 +86,7 @@ from ..utils import parse_bool from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Extend HTTP Error Messages SLACK_HTTP_ERROR_MAP = { @@ -280,6 +280,40 @@ class NotifySlack(NotifyBase): }, }) + # Formatting requirements are defined here: + # https://api.slack.com/docs/message-formatting + _re_formatting_map = { + # New lines must become the string version + r'\r\*\n': '\\n', + # Escape other special characters + r'&': '&', + r'<': '<', + r'>': '>', + } + + # To notify a channel, one uses + _re_channel_support = re.compile( + r'(?P(?:<|\<)?[ \t]*' + r'!(?P[^| \n]+)' + r'(?:[ \t]*\|[ \t]*(?:(?P[^\n]+?)[ \t]*)?(?:>|\>)' + r'|(?:>|\>)))', re.IGNORECASE) + + # To notify a user by their ID, one uses <@U6TTX1F9R> + _re_user_id_support = re.compile( + r'(?P(?:<|\<)?[ \t]*' + r'@(?P[^| \n]+)' + r'(?:[ \t]*\|[ \t]*(?:(?P[^\n]+?)[ \t]*)?(?:>|\>)' + r'|(?:>|\>)))', re.IGNORECASE) + + # The markdown in slack isn't [desc](url), it's + # + # To accomodate this, we need to ensure we don't escape URLs that match + _re_url_support = re.compile( + r'(?P(?:<|\<)?[ \t]*' + r'(?P(?:https?|mailto)://[^| \n]+)' + r'(?:[ \t]*\|[ \t]*(?:(?P[^\n]+?)[ \t]*)?(?:>|\>)' + r'|(?:>|\>)))', re.IGNORECASE) + def __init__(self, access_token=None, token_a=None, token_b=None, token_c=None, targets=None, include_image=True, include_footer=True, use_blocks=None, **kwargs): @@ -292,6 +326,7 @@ def __init__(self, access_token=None, token_a=None, token_b=None, self.mode = SlackMode.BOT if access_token else SlackMode.WEBHOOK if self.mode is SlackMode.WEBHOOK: + self.access_token = None self.token_a = validate_regex( token_a, *self.template_tokens['token_a']['regex']) if not self.token_a: @@ -316,6 +351,9 @@ def __init__(self, access_token=None, token_a=None, token_b=None, self.logger.warning(msg) raise TypeError(msg) else: + self.token_a = None + self.token_b = None + self.token_c = None self.access_token = validate_regex( access_token, *self.template_tokens['access_token']['regex']) if not self.access_token: @@ -344,39 +382,11 @@ def __init__(self, access_token=None, token_a=None, token_b=None, None if self.mode is SlackMode.WEBHOOK else self.default_notification_channel) - # Formatting requirements are defined here: - # https://api.slack.com/docs/message-formatting - self._re_formatting_map = { - # New lines must become the string version - r'\r\*\n': '\\n', - # Escape other special characters - r'&': '&', - r'<': '<', - r'>': '>', - } - - # To notify a channel, one uses - self._re_channel_support = re.compile( - r'(?P(?:<|\<)?[ \t]*' - r'!(?P[^| \n]+)' - r'(?:[ \t]*\|[ \t]*(?:(?P[^\n]+?)[ \t]*)?(?:>|\>)' - r'|(?:>|\>)))', re.IGNORECASE) - - # The markdown in slack isn't [desc](url), it's - # - # To accomodate this, we need to ensure we don't escape URLs that match - self._re_url_support = re.compile( - r'(?P(?:<|\<)?[ \t]*' - r'(?P(?:https?|mailto)://[^| \n]+)' - r'(?:[ \t]*\|[ \t]*(?:(?P[^\n]+?)[ \t]*)?(?:>|\>)' - r'|(?:>|\>)))', re.IGNORECASE) - # Iterate over above list and store content accordingly self._re_formatting_rules = re.compile( r'(' + '|'.join(self._re_formatting_map.keys()) + r')', re.IGNORECASE, ) - # Place a thumbnail image inline with the message body self.include_image = include_image @@ -478,6 +488,20 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, body, re.IGNORECASE) + # Support <@userid|desc>, <@channel> entries + for match in self._re_user_id_support.findall(body): + # Swap back any ampersands previously updaated + user = match[1].strip() + desc = match[2].strip() + + # Update our string + body = re.sub( + re.escape(match[0]), + '<@{user}|{desc}>'.format(user=user, desc=desc) + if desc else '<@{user}>'.format(user=user), + body, + re.IGNORECASE) + # Support , entries for match in self._re_url_support.findall(body): # Swap back any ampersands previously updaated @@ -603,16 +627,17 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, channel if channel[0] == '#' \ else '#{}'.format(channel) - # Store the valid and massaged payload that is recognizable by - # slack. This list is used for sending attachments later. - attach_channel_list.append(payload['channel']) - response = self._send(url, payload) if not response: # Handle any error has_error = True continue + # Store the valid channel or chat ID (for DMs) that will + # be accepted by Slack's attachment method later. + if response.get('channel'): + attach_channel_list.append(response.get('channel')) + self.logger.info( 'Sent Slack notification{}.'.format( ' to {}'.format(channel) @@ -621,7 +646,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, if attach and self.attachment_support and \ self.mode is SlackMode.BOT and attach_channel_list: # Send our attachments (can only be done in bot mode) - for attachment in attach: + for no, attachment in enumerate(attach, start=1): # Perform some simple error checking if not attachment: @@ -635,21 +660,59 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, 'Posting Slack attachment {}'.format( attachment.url(privacy=True))) - # Prepare API Upload Payload - _payload = { - 'filename': attachment.name, - 'channels': ','.join(attach_channel_list) + # Get the URL to which to upload the file. + # https://api.slack.com/methods/files.getUploadURLExternal + _params = { + 'filename': attachment.name + if attachment.name else f'file{no:03}.dat', + 'length': len(attachment), } - - # Our URL - _url = self.api_url.format('files.upload') - - response = self._send(_url, _payload, attach=attachment) - if not (response and response.get('file') and - response['file'].get('url_private')): - # We failed to post our attachments, take an early exit + _url = self.api_url.format('files.getUploadURLExternal') + response = self._send( + _url, {}, http_method='get', params=_params + ) + if not ( + response and response.get('file_id') + and response.get('upload_url') + ): + self.logger.error('Could retrieve file upload URL.') + # We failed to get an upload URL, take an early exit return False + file_id = response.get('file_id') + upload_url = response.get('upload_url') + + # Upload file + response = self._send(upload_url, {}, attach=attachment) + + # Send file to channels + # https://api.slack.com/methods/files.completeUploadExternal + for channel_id in attach_channel_list: + _payload = { + 'files': [{ + "id": file_id, + "title": attachment.name, + }], + 'channel_id': channel_id + } + _url = self.api_url.format('files.completeUploadExternal') + response = self._send(_url, _payload) + # Expected response + # { + # "ok": true, + # "files": [ + # { + # "id": "F123ABC456", + # "title": "slack-test" + # } + # ] + # } + if not (response and response.get('files')): + self.logger.error('Failed to send file to channel.') + # We failed to send the file to the channel, + # take an early exit + return False + return not has_error def lookup_userid(self, email): @@ -808,7 +871,8 @@ def lookup_userid(self, email): return user_id - def _send(self, url, payload, attach=None, **kwargs): + def _send(self, url, payload, attach=None, http_method='post', params=None, + **kwargs): """ Wrapper to the requests (post) object """ @@ -842,13 +906,15 @@ def _send(self, url, payload, attach=None, **kwargs): if attach: files = {'file': (attach.name, open(attach.path, 'rb'))} - r = requests.post( + r = requests.request( + http_method, url, data=payload if attach else dumps(payload), headers=headers, files=files, verify=self.verify_certificate, timeout=self.request_timeout, + params=params if params else None, ) # Posts return a JSON string @@ -866,11 +932,22 @@ def _send(self, url, payload, attach=None, **kwargs): # 'ok': False, # 'error': 'not_in_channel', # } - # - # The text 'ok' is returned if this is a Webhook request - # So the below captures that as well. - status_okay = (response and response.get('ok', False)) \ - if self.mode is SlackMode.BOT else r.content == b'ok' + status_okay = False + if self.mode is SlackMode.BOT: + status_okay = ( + (response and response.get('ok', False)) or + # Responses for file uploads look like this + # 'OK - ' + ( + r.content and + isinstance(r.content, bytes) and + b'OK' in r.content + ) + ) + elif r.content == b'ok': + # The text 'ok' is returned if this is a Webhook request + # So the below captures that as well. + status_okay = True if r.status_code != requests.codes.ok or not status_okay: # We had a problem @@ -879,9 +956,9 @@ def _send(self, url, payload, attach=None, **kwargs): r.status_code, SLACK_HTTP_ERROR_MAP) self.logger.warning( - 'Failed to send {}to Slack: ' + 'Failed to send{} to Slack: ' '{}{}error={}.'.format( - attach.name if attach else '', + (' ' + attach.name) if attach else '', status_str, ', ' if status_str else '', r.status_code)) @@ -913,53 +990,15 @@ def _send(self, url, payload, attach=None, **kwargs): # "username": "Apprise" # } - # File Attachment Responses look like this + # files.completeUploadExternal responses look like this: # { - # "file": { - # "channels": [], - # "comments_count": 0, - # "created": 1573617523, - # "display_as_bot": false, - # "editable": false, - # "external_type": "", - # "filetype": "png", - # "groups": [], - # "has_rich_preview": false, - # "id": "FQJJLDAHM", - # "image_exif_rotation": 1, - # "ims": [], - # "is_external": false, - # "is_public": false, - # "is_starred": false, - # "mimetype": "image/png", - # "mode": "hosted", - # "name": "apprise-test.png", - # "original_h": 640, - # "original_w": 640, - # "permalink": "https://{name}.slack.com/files/... - # "permalink_public": "https://slack-files.com/... - # "pretty_type": "PNG", - # "public_url_shared": false, - # "shares": {}, - # "size": 238810, - # "thumb_160": "https://files.slack.com/files-tmb/... - # "thumb_360": "https://files.slack.com/files-tmb/... - # "thumb_360_h": 360, - # "thumb_360_w": 360, - # "thumb_480": "https://files.slack.com/files-tmb/... - # "thumb_480_h": 480, - # "thumb_480_w": 480, - # "thumb_64": "https://files.slack.com/files-tmb/... - # "thumb_80": "https://files.slack.com/files-tmb/... - # "thumb_tiny": abcd... - # "timestamp": 1573617523, - # "title": "apprise-test", - # "url_private": "https://files.slack.com/files-pri/... - # "url_private_download": "https://files.slack.com/files-... - # "user": "UADKLLMJT", - # "username": "" - # }, - # "ok": true + # "ok": true, + # "files": [ + # { + # "id": "F123ABC456", + # "title": "slack-test" + # } + # ] # } except requests.RequestException as e: self.logger.warning( @@ -984,6 +1023,18 @@ def _send(self, url, payload, attach=None, **kwargs): # Return the response for processing return response + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.token_a, self.token_b, self.token_c, + self.access_token, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySMSEagle.py b/libs/apprise/plugins/smseagle.py similarity index 94% rename from libs/apprise/plugins/NotifySMSEagle.py rename to libs/apprise/plugins/smseagle.py index 33b4af752..159433106 100644 --- a/libs/apprise/plugins/NotifySMSEagle.py +++ b/libs/apprise/plugins/smseagle.py @@ -29,17 +29,17 @@ import re import requests from json import dumps, loads -import base64 from itertools import chain -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType +from .. import exception from ..utils import validate_regex from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import parse_bool -from ..URLBase import PrivacyMode -from ..AppriseLocale import gettext_lazy as _ +from ..url import PrivacyMode +from ..locale import gettext_lazy as _ GROUP_REGEX = re.compile( @@ -345,7 +345,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, if not attachment: # We could not access the attachment self.logger.error( - 'Could not access attachment {}.'.format( + 'Could not access SMSEagle attachment {}.'.format( attachment.url(privacy=True))) return False @@ -357,21 +357,23 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, continue try: - with open(attachment.path, 'rb') as f: - # Prepare our Attachment in Base64 - attachments.append({ - 'content_type': attachment.mimetype, - 'content': base64.b64encode( - f.read()).decode('utf-8'), - }) - - except (OSError, IOError) as e: - self.logger.warning( - 'An I/O error occurred while reading {}.'.format( - attachment.name if attachment else 'attachment')) - self.logger.debug('I/O Exception: %s' % str(e)) + # Prepare our Attachment in Base64 + attachments.append({ + 'content_type': attachment.mimetype, + 'content': attachment.base64(), + }) + + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access SMSEagle attachment {}.'.format( + attachment.url(privacy=True))) return False + self.logger.debug( + 'Appending SMSEagle attachment {}'.format( + attachment.url(privacy=True))) + # Prepare our headers headers = { 'User-Agent': self.app_id, @@ -564,6 +566,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.token, self.host, self.port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySMSManager.py b/libs/apprise/plugins/smsmanager.py similarity index 97% rename from libs/apprise/plugins/NotifySMSManager.py rename to libs/apprise/plugins/smsmanager.py index efc158b62..a4552ad4b 100644 --- a/libs/apprise/plugins/NotifySMSManager.py +++ b/libs/apprise/plugins/smsmanager.py @@ -35,13 +35,13 @@ # 2. Generate an API key in web administration. import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class SMSManagerGateway(object): @@ -314,6 +314,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol[0], self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySMTP2Go.py b/libs/apprise/plugins/smtp2go.py similarity index 93% rename from libs/apprise/plugins/NotifySMTP2Go.py rename to libs/apprise/plugins/smtp2go.py index a34492d05..a19e523fc 100644 --- a/libs/apprise/plugins/NotifySMTP2Go.py +++ b/libs/apprise/plugins/smtp2go.py @@ -45,18 +45,18 @@ # the email will be transmitted from. If no email address is specified # then it will also become the 'to' address as well. # -import base64 import requests from json import dumps from email.utils import formataddr -from .NotifyBase import NotifyBase +from .base import NotifyBase +from .. import exception from ..common import NotifyType from ..common import NotifyFormat from ..utils import parse_emails from ..utils import parse_bool from ..utils import is_email from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ SMTP2GO_HTTP_ERROR_MAP = { 429: 'To many requests.', @@ -294,33 +294,35 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, attachments = [] if attach and self.attachment_support: - for attachment in attach: + for no, attachment in enumerate(attach, start=1): # Perform some simple error checking if not attachment: # We could not access the attachment self.logger.error( - 'Could not access attachment {}.'.format( + 'Could not access SMTP2Go attachment {}.'.format( attachment.url(privacy=True))) return False try: - with open(attachment.path, 'rb') as f: - # Output must be in a DataURL format (that's what - # PushSafer calls it): - attachments.append({ - 'filename': attachment.name, - 'fileblob': base64.b64encode(f.read()) - .decode('utf-8'), - 'mimetype': attachment.mimetype, - }) - - except (OSError, IOError) as e: - self.logger.warning( - 'An I/O error occurred while reading {}.'.format( - attachment.name if attachment else 'attachment')) - self.logger.debug('I/O Exception: %s' % str(e)) + # Format our attachment + attachments.append({ + 'filename': attachment.name + if attachment.name else f'file{no:03}.dat', + 'fileblob': attachment.base64(), + 'mimetype': attachment.mimetype, + }) + + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access SMTP2Go attachment {}.'.format( + attachment.url(privacy=True))) return False + self.logger.debug( + 'Appending SMTP2Go attachment {}'.format( + attachment.url(privacy=True))) + sender = formataddr( (self.from_name if self.from_name else False, self.from_addr), charset='utf-8') @@ -464,6 +466,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.user, self.host, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySNS.py b/libs/apprise/plugins/sns.py similarity index 98% rename from libs/apprise/plugins/NotifySNS.py rename to libs/apprise/plugins/sns.py index 5a287e37e..9deb9f7b0 100644 --- a/libs/apprise/plugins/NotifySNS.py +++ b/libs/apprise/plugins/sns.py @@ -36,13 +36,13 @@ from xml.etree import ElementTree from itertools import chain -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Topic Detection # Summary: 256 Characters max, only alpha/numeric plus underscore (_) and @@ -573,6 +573,18 @@ def _xml_iter(root, response): return response + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.aws_access_key_id, + self.aws_secret_access_key, self.aws_region_name, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySparkPost.py b/libs/apprise/plugins/sparkpost.py similarity index 95% rename from libs/apprise/plugins/NotifySparkPost.py rename to libs/apprise/plugins/sparkpost.py index 255db0709..4e4233cad 100644 --- a/libs/apprise/plugins/NotifySparkPost.py +++ b/libs/apprise/plugins/sparkpost.py @@ -55,10 +55,10 @@ # API Documentation: https://developers.sparkpost.com/api/ # Specifically: https://developers.sparkpost.com/api/transmissions/ import requests -import base64 from json import loads from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase +from .. import exception from ..common import NotifyType from ..common import NotifyFormat from ..utils import is_email @@ -66,7 +66,7 @@ from ..utils import validate_regex from ..utils import parse_emails from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Provide some known codes SparkPost uses and what they translate to: # Based on https://www.sparkpost.com/docs/tech-resources/extended-error-codes/ @@ -500,7 +500,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, if not self.targets: # There is no one to email; we're done self.logger.warning( - 'There are no Email recipients to notify') + 'There are no SparkPost Email recipients to notify') return False # Initialize our has_error flag @@ -546,35 +546,35 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, # Prepare ourselves an attachment object payload['content']['attachments'] = [] - for attachment in attach: + for no, attachment in enumerate(attach, start=1): # Perform some simple error checking if not attachment: # We could not access the attachment self.logger.error( - 'Could not access attachment {}.'.format( + 'Could not access SparkPost attachment {}.'.format( attachment.url(privacy=True))) return False - self.logger.debug( - 'Preparing SparkPost attachment {}'.format( - attachment.url(privacy=True))) - try: - with open(attachment.path, 'rb') as fp: - # Prepare API Upload Payload - payload['content']['attachments'].append({ - 'name': attachment.name, - 'type': attachment.mimetype, - 'data': base64.b64encode(fp.read()).decode("ascii") - }) - - except (OSError, IOError) as e: - self.logger.warning( - 'An I/O error occurred while reading {}.'.format( - attachment.name if attachment else 'attachment')) - self.logger.debug('I/O Exception: %s' % str(e)) + # Prepare API Upload Payload + payload['content']['attachments'].append({ + 'name': attachment.name + if attachment.name else f'file{no:03}.dat', + 'type': attachment.mimetype, + 'data': attachment.base64(), + }) + + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access SparkPost attachment {}.'.format( + attachment.url(privacy=True))) return False + self.logger.debug( + 'Appending SparkPost attachment {}'.format( + attachment.url(privacy=True))) + # Take a copy of our token dictionary tokens = self.tokens.copy() @@ -670,6 +670,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.user, self.apikey, self.host) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/splunk.py b/libs/apprise/plugins/splunk.py new file mode 100644 index 000000000..3c39e7a4b --- /dev/null +++ b/libs/apprise/plugins/splunk.py @@ -0,0 +1,500 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron +# +# 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. +# +# 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. + +# Splunk On-Call +# API: https://portal.victorops.com/public/api-docs.html +# Main: https://www.splunk.com/en_us/products/on-call.html +# Routing Keys https://help.victorops.com/knowledge-base/routing-keys/ +# Setup: https://help.victorops.com/knowledge-base/rest-endpoint-integration\ +# -guide/ + + +import re +import requests +from json import dumps + +from .base import NotifyBase +from ..common import NotifyType, NOTIFY_TYPES +from ..utils import validate_regex +from ..locale import gettext_lazy as _ + + +class SplunkAction: + """ + Tracks the actions supported by Apprise Splunk Plugin + + """ + # Use mapping (specify :key=arg to over-ride) + MAP = 'map' + + # Creates a timeline event but does not trigger an incident + INFO = 'info' + + # Triggers a warning (possibly causing incident) in all cases + WARNING = 'warning' + + # Triggers an incident in all cases + CRITICAL = 'critical' + + # Acknowldege entity_id provided in all cases + ACKNOWLEDGE = 'acknowledgement' + + # Recovery entity_id provided in all cases + RECOVERY = 'recovery' + + # Resolve (aliase of Recover) + RESOLVE = 'resolve' + + +# Define our Splunk Actions +SPLUNK_ACTIONS = ( + SplunkAction.MAP, + SplunkAction.INFO, + SplunkAction.ACKNOWLEDGE, + SplunkAction.WARNING, + SplunkAction.RECOVERY, + SplunkAction.RESOLVE, + SplunkAction.CRITICAL, +) + + +class SplunkMessageType: + """ + Defines the supported splunk message types + """ + # Triggers an incident + CRITICAL = 'CRITICAL' + + # May trigger an incident, depending on your settings + WARNING = 'WARNING' + + # Acks an incident + ACKNOWLEDGEMENT = 'ACKNOWLEDGEMENT' + + # Creates a timeline event but does not trigger an incident + INFO = 'INFO' + + # Resolves an incident + RECOVERY = 'RECOVERY' + + +# Defines our supported message types +SPLUNK_MESSAGE_TYPES = ( + SplunkMessageType.CRITICAL, + SplunkMessageType.WARNING, + SplunkMessageType.ACKNOWLEDGEMENT, + SplunkMessageType.INFO, + SplunkMessageType.RECOVERY, +) + + +class NotifySplunk(NotifyBase): + """ + A wrapper for Splunk Notifications + """ + + # The default descriptive name associated with the Notification + service_name = _('Splunk On-Call') + + # The services URL + service_url = 'https://www.splunk.com/en_us/products/on-call.html' + + # The default secure protocol + secure_protocol = ('splunk', 'victorops') + + # A URL that takes you to the setup/help of the specific protocol + setup_url = 'https://github.com/caronc/apprise/wiki/Notify_splunk' + + # Notification URL + notify_url = 'https://alert.victorops.com/integrations/generic/20131114/'\ + 'alert/{apikey}/{routing_key}' + + # Define object templates + templates = ( + '{schema}://{routing_key}@{apikey}', + '{schema}://{routing_key}@{apikey}/{entity_id}', + ) + + # The title is not used + title_maxlen = 60 + + # body limit + body_maxlen = 400 + + # Defines our default message mapping + splunk_message_map = { + # Creates a timeline event but doesnot trigger an incident + NotifyType.INFO: SplunkMessageType.INFO, + # Resolves an incident + NotifyType.SUCCESS: SplunkMessageType.RECOVERY, + # May trigger an incident, depending on your settings + NotifyType.WARNING: SplunkMessageType.WARNING, + # Triggers an incident + NotifyType.FAILURE: SplunkMessageType.CRITICAL, + } + + # Define our tokens; these are the minimum tokens required required to + # be passed into this function (as arguments). The syntax appends any + # previously defined in the base package and builds onto them + template_tokens = dict(NotifyBase.template_tokens, **{ + 'apikey': { + 'name': _('API Key'), + 'type': 'string', + 'private': True, + 'required': True, + 'regex': (r'^[A-Z0-9_-]+$', 'i'), + }, + 'routing_key': { + 'name': _('Target Routing Key'), + 'type': 'string', + 'required': True, + 'regex': (r'^[A-Z0-9_-]+$', 'i'), + }, + 'entity_id': { + # Provide a value such as: "disk space/db01.mycompany.com" + 'name': _('Entity ID'), + 'type': 'string', + }, + }) + + # Define our template arguments + template_args = dict(NotifyBase.template_args, **{ + 'apikey': { + 'alias_of': 'apikey', + }, + 'routing_key': { + 'alias_of': 'routing_key', + }, + 'route': { + 'alias_of': 'routing_key', + }, + 'entity_id': { + 'alias_of': 'entity_id', + }, + 'action': { + 'name': _('Action'), + 'type': 'choice:string', + 'values': SPLUNK_ACTIONS, + 'default': SPLUNK_ACTIONS[0], + } + }) + + # Define any kwargs we're using + template_kwargs = { + 'mapping': { + 'name': _('Action Mapping'), + 'prefix': ':', + }, + } + + def __init__(self, apikey, routing_key, entity_id=None, action=None, + mapping=None, **kwargs): + """ + Initialize Splunk Object + """ + super().__init__(**kwargs) + + self.apikey = validate_regex( + apikey, *self.template_tokens['apikey']['regex']) + if not self.apikey: + msg = 'The Splunk API Key specified ({}) is invalid.'\ + .format(apikey) + self.logger.warning(msg) + raise TypeError(msg) + + self.routing_key = validate_regex( + routing_key, *self.template_tokens['routing_key']['regex']) + if not self.routing_key: + msg = 'The Splunk Routing Key specified ({}) is invalid.'\ + .format(routing_key) + self.logger.warning(msg) + raise TypeError(msg) + + if not (isinstance(entity_id, str) + and len(entity_id.strip(' \r\n\t\v/'))): + # Use routing key + self.entity_id = f"{self.app_id}/{self.routing_key}" + + else: + # Assign what was defined: + self.entity_id = entity_id.strip(' \r\n\t\v/') + + if action and isinstance(action, str): + self.action = next( + (a for a in SPLUNK_ACTIONS if a.startswith(action)), None) + if self.action not in SPLUNK_ACTIONS: + msg = 'The Splunk action specified ({}) is invalid.'\ + .format(action) + self.logger.warning(msg) + raise TypeError(msg) + else: + self.action = self.template_args['action']['default'] + + # Store our mappings + self.mapping = self.splunk_message_map.copy() + if mapping and isinstance(mapping, dict): + for _k, _v in mapping.items(): + # Get our mapping + k = next((t for t in NOTIFY_TYPES if t.startswith(_k)), None) + if not k: + msg = 'The Splunk mapping key specified ({}) is invalid.'\ + .format(_k) + self.logger.warning(msg) + raise TypeError(msg) + + _v_upper = _v.upper() + v = next((v for v in SPLUNK_MESSAGE_TYPES + if v.startswith(_v_upper)), None) + if not v: + msg = 'The Splunk mapping value (assigned to {}) ' \ + 'specified ({}) is invalid.'.format(k, _v) + self.logger.warning(msg) + raise TypeError(msg) + + # Update our mapping + self.mapping[k] = v + + return + + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + """ + Send our notification + """ + + # prepare our headers + headers = { + 'User-Agent': self.app_id, + 'Content-Type': "application/json", + } + + # Set up our message type + if self.action == SplunkAction.MAP: + # Use Mapping + message_type = self.mapping[notify_type] + + elif self.action == SplunkAction.ACKNOWLEDGE: + # Always Acknowledge + message_type = SplunkMessageType.ACKNOWLEDGEMENT + + elif self.action == SplunkAction.INFO: + # Creates a timeline event but does not trigger an incident + message_type = SplunkMessageType.INFO + + elif self.action == SplunkAction.CRITICAL: + # Always create Incident + message_type = SplunkMessageType.CRITICAL + + elif self.action == SplunkAction.WARNING: + # Always trigger warning (potentially creating incident) + message_type = SplunkMessageType.WARNING + + else: # self.action == SplunkAction.RECOVERY or SplunkAction.RESOLVE + # Always Recover + message_type = SplunkMessageType.RECOVERY + + # Prepare our payload + payload = { + "entity_id": self.entity_id, + "message_type": message_type, + "entity_display_name": title if title else self.app_desc, + "state_message": body, + "monitoring_tool": self.app_id, + } + + notify_url = self.notify_url.format( + apikey=self.apikey, + routing_key=self.routing_key) + + self.logger.debug('Splunk GET URL: %s (cert_verify=%r)' % ( + notify_url, self.verify_certificate)) + self.logger.debug('Splunk Payload: %s' % str(payload)) + + # Always call throttle before any remote server i/o is made + self.throttle() + + try: + r = requests.post( + notify_url, + data=dumps(payload).encode('utf-8'), + headers=headers, + verify=self.verify_certificate, + timeout=self.request_timeout, + ) + # Sample Response + # { + # "result" : "success", + # "entity_id" : "disk space/db01.mycompany.com" + # } + + if r.status_code != requests.codes.ok: + # We had a problem + status_str = \ + NotifySplunk.http_response_code_lookup(r.status_code) + + self.logger.warning( + 'Failed to send Splunk notification: ' + '{}{}error={}.'.format( + status_str, + ', ' if status_str else '', + r.status_code)) + + self.logger.debug('Response Details:\r\n{}'.format(r.content)) + + # Return; we're done + return False + + else: + self.logger.info('Sent Splunk notification.') + + except requests.RequestException as e: + self.logger.warning( + 'A Connection error occurred sending Splunk ' + 'notification.') + self.logger.debug('Socket Exception: %s' % str(e)) + + # Return; we're done + return False + + return True + + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol[0], self.routing_key, self.entity_id, + self.apikey, + ) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any URL parameters + params = { + 'action': self.action, + } + + # Extend our parameters + params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + + # Append our assignment extra's into our parameters + params.update( + {':{}'.format(k): v for k, v in self.mapping.items()}) + + return '{schema}://{routing_key}@{apikey}/{entity_id}?{params}'.format( + schema=self.secure_protocol[0], + routing_key=self.routing_key, + entity_id='' if self.entity_id == self.routing_key + else self.entity_id, + apikey=self.pprint(self.apikey, privacy, safe=''), + params=NotifySplunk.urlencode(params), + ) + + @staticmethod + def parse_url(url): + """ + Parses the URL and returns enough arguments that can allow + us to re-instantiate this object. + + """ + + # parse_url already handles getting the `user` and `password` fields + # populated. + results = NotifyBase.parse_url(url, verify_host=False) + if not results: + # We're done early as we couldn't load the results + return results + + # Entity ID + if 'entity_id' in results['qsd'] and len(results['qsd']['entity_id']): + results['entity_id'] = \ + NotifySplunk.unquote(results['qsd']['entity_id']) + else: + results['entity_id'] = NotifySplunk.unquote(results['fullpath']) + + # API Key + if 'apikey' in results['qsd'] and len(results['qsd']['apikey']): + results['apikey'] = NotifySplunk.unquote(results['qsd']['apikey']) + + else: + results['apikey'] = NotifySplunk.unquote(results['host']) + + # Routing Key + if 'routing_key' in results['qsd'] \ + and len(results['qsd']['routing_key']): + results['routing_key'] = \ + NotifySplunk.unquote(results['qsd']['routing_key']) + + elif 'route' in results['qsd'] and len(results['qsd']['route']): + results['routing_key'] = \ + NotifySplunk.unquote(results['qsd']['route']) + + else: + results['routing_key'] = NotifySplunk.unquote(results['user']) + + # Store our action (if defined) + if 'action' in results['qsd'] and len(results['qsd']['action']): + results['action'] = NotifySplunk.unquote(results['qsd']['action']) + + # store any custom mapping defined + results['mapping'] = {NotifySplunk.unquote(x): NotifySplunk.unquote(y) + for x, y in results['qsd:'].items()} + + return results + + @staticmethod + def parse_native_url(url): + """ + Support https://alert.victorops.com/integrations/generic/20131114/ \ + alert/apikey/routing_key + """ + + result = re.match( + r'^https?://alert\.victorops\.com/integrations/generic/' + r'(?P[0-9]+)/alert/(?P[0-9a-z_-]+)' + r'(/(?P[^?/]+))' + r'(/(?P[^?]+))?/*' + r'(?P\?.+)?$', url, re.I) + + if result: + return NotifySplunk.parse_url( + '{schema}://{routing_key}@{apikey}/{entity_id}{params}'.format( + schema=NotifySplunk.secure_protocol[0], + apikey=result.group('apikey'), + routing_key=result.group('routing_key'), + entity_id='' if not result.group('entity_id') + else result.group('entity_id'), + params='' if not result.group('params') + else result.group('params'))) + + return None diff --git a/libs/apprise/plugins/NotifyStreamlabs.py b/libs/apprise/plugins/streamlabs.py similarity index 96% rename from libs/apprise/plugins/NotifyStreamlabs.py rename to libs/apprise/plugins/streamlabs.py index d1e4186a6..ba48c170e 100644 --- a/libs/apprise/plugins/NotifyStreamlabs.py +++ b/libs/apprise/plugins/streamlabs.py @@ -38,10 +38,10 @@ # import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # calls @@ -323,7 +323,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): except requests.RequestException as e: self.logger.warning( - 'A Connection error occured sending Streamlabs ' + 'A Connection error occurred sending Streamlabs ' 'alert.' ) self.logger.debug('Socket Exception: %s' % str(e)) @@ -368,7 +368,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): except requests.RequestException as e: self.logger.warning( - 'A Connection error occured sending Streamlabs ' + 'A Connection error occurred sending Streamlabs ' 'donation.' ) self.logger.debug('Socket Exception: %s' % str(e)) @@ -376,6 +376,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.access_token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySynology.py b/libs/apprise/plugins/synology.py similarity index 95% rename from libs/apprise/plugins/NotifySynology.py rename to libs/apprise/plugins/synology.py index be58c0643..d29440b45 100644 --- a/libs/apprise/plugins/NotifySynology.py +++ b/libs/apprise/plugins/synology.py @@ -29,10 +29,10 @@ import requests from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # For API Details see: # https://kb.synology.com/en-au/DSM/help/Chat/chat_integration @@ -156,6 +156,19 @@ def __init__(self, token=None, headers=None, file_url=None, **kwargs): return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, self.port, self.token, + self.fullpath.rstrip('/'), + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifySyslog.py b/libs/apprise/plugins/syslog.py similarity index 97% rename from libs/apprise/plugins/NotifySyslog.py rename to libs/apprise/plugins/syslog.py index 5540fc758..f0be5d4f6 100644 --- a/libs/apprise/plugins/NotifySyslog.py +++ b/libs/apprise/plugins/syslog.py @@ -28,10 +28,10 @@ import syslog -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class SyslogFacility: @@ -126,6 +126,10 @@ class NotifySyslog(NotifyBase): # A URL that takes you to the setup/help of the specific protocol setup_url = 'https://github.com/caronc/apprise/wiki/Notify_syslog' + # No URL Identifier will be defined for this service as there simply isn't + # enough details to uniquely identify one dbus:// from another. + url_identifier = False + # Disable throttle rate for Syslog requests since they are normally # local anyway request_rate_per_sec = 0 diff --git a/libs/apprise/plugins/NotifyTechulusPush.py b/libs/apprise/plugins/techuluspush.py similarity index 95% rename from libs/apprise/plugins/NotifyTechulusPush.py rename to libs/apprise/plugins/techuluspush.py index 4d0b99348..629650148 100644 --- a/libs/apprise/plugins/NotifyTechulusPush.py +++ b/libs/apprise/plugins/techuluspush.py @@ -53,10 +53,10 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Token required as part of the API request # Used to prepare our UUID regex matching @@ -184,6 +184,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyTelegram.py b/libs/apprise/plugins/telegram.py similarity index 95% rename from libs/apprise/plugins/NotifyTelegram.py rename to libs/apprise/plugins/telegram.py index cce8af625..fba4b6609 100644 --- a/libs/apprise/plugins/NotifyTelegram.py +++ b/libs/apprise/plugins/telegram.py @@ -59,15 +59,16 @@ from json import loads from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..common import NotifyImageSize from ..common import NotifyFormat +from ..common import PersistentStoreMode from ..utils import parse_bool from ..utils import parse_list from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ -from ..attachment.AttachBase import AttachBase +from ..locale import gettext_lazy as _ +from ..attachment.base import AttachBase TELEGRAM_IMAGE_XY = NotifyImageSize.XY_256 @@ -164,6 +165,10 @@ class NotifyTelegram(NotifyBase): # Telegram is limited to sending a maximum of 100 requests per second. request_rate_per_sec = 0.001 + # Our default is to no not use persistent storage beyond in-memory + # reference + storage_mode = PersistentStoreMode.AUTO + # Define object templates templates = ( '{schema}://{bot_token}', @@ -361,11 +366,14 @@ class NotifyTelegram(NotifyBase): 'name': _('Topic Thread ID'), 'type': 'int', }, + 'thread': { + 'alias_of': 'topic', + }, 'mdv': { 'name': _('Markdown Version'), 'type': 'choice:string', 'values': ('v1', 'v2'), - 'default': 'v2', + 'default': 'v1', }, 'to': { 'alias_of': 'targets', @@ -460,14 +468,13 @@ def __init__(self, bot_token, targets, detect_owner=True, self.detect_owner = False continue - try: + if results.group('topic'): topic = int( results.group('topic') if results.group('topic') else self.topic) - - except TypeError: - # No worries - topic = None + else: + # Default (if one set) + topic = self.topic if results.group('name') is not None: # Name @@ -713,6 +720,7 @@ def detect_bot_owner(self): self.logger.info( 'Detected Telegram user %s (userid=%d)' % (_user, _id)) # Return our detected userid + self.store.set('bot_owner', _id) return _id self.logger.warning( @@ -727,10 +735,10 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, """ if len(self.targets) == 0 and self.detect_owner: - _id = self.detect_bot_owner() + _id = self.store.get('bot_owner') or self.detect_bot_owner() if _id: # Permanently store our id in our target list for next time - self.targets.append((str(_id), None)) + self.targets.append((str(_id), self.topic)) self.logger.info( 'Update your Telegram Apprise URL to read: ' '{}'.format(self.url(privacy=True))) @@ -762,6 +770,16 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, # Prepare Message Body if self.notify_format == NotifyFormat.MARKDOWN: + + if body_format not in (None, NotifyFormat.MARKDOWN) \ + and self.markdown_ver == TelegramMarkdownVersion.TWO: + # Telegram Markdown v2 is not very accomodating to some + # characters such as the hashtag (#) which is fine in v1. + # To try and be accomodating we escape them in advance + # See: https://stackoverflow.com/a/69892704/355584 + # Also: https://core.telegram.org/bots/api#markdownv2-style + body = re.sub(r'(?#+=|{}.!-])', r'\\\1', body) + _payload['parse_mode'] = self.markdown_ver _payload['text'] = body @@ -918,6 +936,15 @@ def _send_attachments(self, target, notify_type, attach): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.bot_token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -1043,6 +1070,9 @@ def parse_url(url): if 'topic' in results['qsd'] and len(results['qsd']['topic']): results['topic'] = results['qsd']['topic'] + elif 'thread' in results['qsd'] and len(results['qsd']['thread']): + results['topic'] = results['qsd']['thread'] + # Silent (Sends the message Silently); users will receive # notification with no sound. results['silent'] = \ diff --git a/libs/apprise/plugins/NotifyThreema.py b/libs/apprise/plugins/threema.py similarity index 96% rename from libs/apprise/plugins/NotifyThreema.py rename to libs/apprise/plugins/threema.py index c2ad82e2e..55293a1cb 100644 --- a/libs/apprise/plugins/NotifyThreema.py +++ b/libs/apprise/plugins/threema.py @@ -35,14 +35,14 @@ import requests from itertools import chain -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import validate_regex from ..utils import is_email -from ..URLBase import PrivacyMode +from ..url import PrivacyMode from ..utils import parse_list -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class ThreemaRecipientTypes: @@ -302,6 +302,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.user, self.secret) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyTwilio.py b/libs/apprise/plugins/twilio.py similarity index 82% rename from libs/apprise/plugins/NotifyTwilio.py rename to libs/apprise/plugins/twilio.py index 863b09a94..d8666199c 100644 --- a/libs/apprise/plugins/NotifyTwilio.py +++ b/libs/apprise/plugins/twilio.py @@ -43,16 +43,33 @@ # or consider purchasing a short-code from here: # https://www.twilio.com/docs/glossary/what-is-a-short-code # +import re import requests from json import loads -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ + + +# Twilio Mode Detection +MODE_DETECT_RE = re.compile( + r'\s*((?P[^:]+)\s*:\s*)?(?P.+)$', re.I) + + +class TwilioMessageMode: + """ + Twilio Message Mode + """ + # SMS/MMS + TEXT = 'T' + + # via WhatsApp + WHATSAPP = 'W' class NotifyTwilio(NotifyBase): @@ -117,14 +134,14 @@ class NotifyTwilio(NotifyBase): 'name': _('From Phone No'), 'type': 'string', 'required': True, - 'regex': (r'^\+?[0-9\s)(+-]+$', 'i'), + 'regex': (r'^([a-z]+:)?\+?[0-9\s)(+-]+$', 'i'), 'map_to': 'source', }, 'target_phone': { 'name': _('Target Phone No'), 'type': 'string', 'prefix': '+', - 'regex': (r'^[0-9\s)(+-]+$', 'i'), + 'regex': (r'^([a-z]+:)?[0-9\s)(+-]+$', 'i'), 'map_to': 'targets', }, 'short_code': { @@ -190,7 +207,22 @@ def __init__(self, account_sid, auth_token, source, targets=None, self.apikey = validate_regex( apikey, *self.template_args['apikey']['regex']) - result = is_phone_no(source, min_len=5) + # Detect mode + result = MODE_DETECT_RE.match(source) + if not result: + msg = 'The Account (From) Phone # or Short-code specified ' \ + '({}) is invalid.'.format(source) + self.logger.warning(msg) + raise TypeError(msg) + + # prepare our default mode to use for all numbers that follow in + # target definitions + self.default_mode = TwilioMessageMode.WHATSAPP \ + if result.group('mode') and \ + result.group('mode')[0].lower() == 'w' \ + else TwilioMessageMode.TEXT + + result = is_phone_no(result.group('phoneno'), min_len=5) if not result: msg = 'The Account (From) Phone # or Short-code specified ' \ '({}) is invalid.'.format(source) @@ -220,18 +252,35 @@ def __init__(self, account_sid, auth_token, source, targets=None, # Parse our targets self.targets = list() - for target in parse_phone_no(targets): + for entry in parse_phone_no(targets, prefix=True): + # Detect mode + # w: (or whatsapp:) will trigger whatsapp message otherwise + # sms/mms as normal + result = MODE_DETECT_RE.match(entry) + mode = TwilioMessageMode.WHATSAPP if result.group('mode') and \ + result.group('mode')[0].lower() == 'w' else self.default_mode + # Validate targets and drop bad ones: - result = is_phone_no(target) + result = is_phone_no(result.group('phoneno')) if not result: self.logger.warning( 'Dropped invalid phone # ' - '({}) specified.'.format(target), + '({}) specified.'.format(entry), + ) + continue + + # We can't send twilio messages using short-codes as our source + if len(self.source) in (5, 6) and mode is \ + TwilioMessageMode.WHATSAPP: + self.logger.warning( + 'Dropped WhatsApp phone # ' + '({}) because source provided was a short-code.'.format( + entry), ) continue # store valid phone number - self.targets.append('+{}'.format(result['full'])) + self.targets.append((mode, '+{}'.format(result['full']))) return @@ -260,9 +309,8 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): # Prepare our payload payload = { 'Body': body, - 'From': self.source, - - # The To gets populated in the loop below + # The From and To gets populated in the loop below + 'From': None, 'To': None, } @@ -277,14 +325,20 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): if len(targets) == 0: # No sources specified, use our own phone no - targets.append(self.source) + targets.append((self.default_mode, self.source)) while len(targets): # Get our target to notify - target = targets.pop(0) + (mode, target) = targets.pop(0) # Prepare our user - payload['To'] = target + if mode is TwilioMessageMode.TEXT: + payload['From'] = self.source + payload['To'] = target + + else: # WhatsApp support (via Twilio) + payload['From'] = f'whatsapp:{self.source}' + payload['To'] = f'whatsapp:{target}' # Some Debug Logging self.logger.debug('Twilio POST URL: {} (cert_verify={})'.format( @@ -359,6 +413,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.account_sid, self.auth_token, + self.source, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. @@ -376,9 +442,13 @@ def url(self, privacy=False, *args, **kwargs): sid=self.pprint( self.account_sid, privacy, mode=PrivacyMode.Tail, safe=''), token=self.pprint(self.auth_token, privacy, safe=''), - source=NotifyTwilio.quote(self.source, safe=''), + source=NotifyTwilio.quote( + self.source if self.default_mode is TwilioMessageMode.TEXT + else 'w:{}'.format(self.source), safe=''), targets='/'.join( - [NotifyTwilio.quote(x, safe='') for x in self.targets]), + [NotifyTwilio.quote( + x[1] if x[0] is TwilioMessageMode.TEXT + else 'w:{}'.format(x[1]), safe='') for x in self.targets]), params=NotifyTwilio.urlencode(params)) def __len__(self): @@ -442,6 +512,6 @@ def parse_url(url): # The 'to' makes it easier to use yaml configuration if 'to' in results['qsd'] and len(results['qsd']['to']): results['targets'] += \ - NotifyTwilio.parse_phone_no(results['qsd']['to']) + NotifyTwilio.parse_phone_no(results['qsd']['to'], prefix=True) return results diff --git a/libs/apprise/plugins/NotifyTwist.py b/libs/apprise/plugins/twist.py similarity index 98% rename from libs/apprise/plugins/NotifyTwist.py rename to libs/apprise/plugins/twist.py index fa26feb84..66f70f525 100644 --- a/libs/apprise/plugins/NotifyTwist.py +++ b/libs/apprise/plugins/twist.py @@ -35,13 +35,13 @@ from json import loads from itertools import chain -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType from ..utils import parse_list from ..utils import is_email -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # A workspace can also be interpreted as a team name too! @@ -229,6 +229,18 @@ def __init__(self, email=None, targets=None, **kwargs): self.default_notification_channel)) return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.user, self.password, self.host, self.port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyTwitter.py b/libs/apprise/plugins/twitter.py similarity index 97% rename from libs/apprise/plugins/NotifyTwitter.py rename to libs/apprise/plugins/twitter.py index 7a0813c1f..6d352ea66 100644 --- a/libs/apprise/plugins/NotifyTwitter.py +++ b/libs/apprise/plugins/twitter.py @@ -36,14 +36,14 @@ from requests_oauthlib import OAuth1 from json import dumps from json import loads -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import parse_list from ..utils import parse_bool from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ -from ..attachment.AttachBase import AttachBase +from ..locale import gettext_lazy as _ +from ..attachment.base import AttachBase IS_USER = re.compile(r'^\s*@?(?P[A-Z0-9_]+)$', re.I) @@ -287,7 +287,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, if attach and self.attachment_support: # We need to upload our payload first so that we can source it # in remaining messages - for attachment in attach: + for no, attachment in enumerate(attach, start=1): # Perform some simple error checking if not attachment: @@ -320,11 +320,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, # We can't post our attachment return False + # Prepare our filename + filename = attachment.name \ + if attachment.name else f'file{no:03}.dat' + if not (isinstance(response, dict) and response.get('media_id')): self.logger.debug( 'Could not attach the file to Twitter: %s (mime=%s)', - attachment.name, attachment.mimetype) + filename, attachment.mimetype) continue # If we get here, our output will look something like this: @@ -344,7 +348,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, response.update({ # Update our response to additionally include the # attachment details - 'file_name': attachment.name, + 'file_name': filename, 'file_mime': attachment.mimetype, 'file_path': attachment.path, }) @@ -780,6 +784,18 @@ def body_maxlen(self): """ return 10000 if self.mode == TwitterMessageMode.DM else 280 + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol[0], self.ckey, self.csecret, self.akey, + self.asecret, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyVoipms.py b/libs/apprise/plugins/voipms.py similarity index 96% rename from libs/apprise/plugins/NotifyVoipms.py rename to libs/apprise/plugins/voipms.py index a023589a7..6a5d4d5a8 100644 --- a/libs/apprise/plugins/NotifyVoipms.py +++ b/libs/apprise/plugins/voipms.py @@ -37,12 +37,12 @@ import requests from json import loads -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import is_email from ..utils import parse_phone_no -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyVoipms(NotifyBase): @@ -306,6 +306,17 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.email, self.password, self.source, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyVonage.py b/libs/apprise/plugins/vonage.py similarity index 97% rename from libs/apprise/plugins/NotifyVonage.py rename to libs/apprise/plugins/vonage.py index e9b1422ad..3a9b23417 100644 --- a/libs/apprise/plugins/NotifyVonage.py +++ b/libs/apprise/plugins/vonage.py @@ -33,13 +33,13 @@ # import requests -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyVonage(NotifyBase): @@ -307,6 +307,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol[0], self.apikey, self.secret) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyWebexTeams.py b/libs/apprise/plugins/webexteams.py similarity index 96% rename from libs/apprise/plugins/NotifyWebexTeams.py rename to libs/apprise/plugins/webexteams.py index c91864bad..ccee386b5 100644 --- a/libs/apprise/plugins/NotifyWebexTeams.py +++ b/libs/apprise/plugins/webexteams.py @@ -63,11 +63,11 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..common import NotifyFormat from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Extend HTTP Error Messages # Based on: https://developer.webex.com/docs/api/basics/rate-limiting @@ -207,6 +207,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol[0], self.token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyWeComBot.py b/libs/apprise/plugins/wecombot.py similarity index 96% rename from libs/apprise/plugins/NotifyWeComBot.py rename to libs/apprise/plugins/wecombot.py index 4289b39e9..03282cd9f 100644 --- a/libs/apprise/plugins/NotifyWeComBot.py +++ b/libs/apprise/plugins/wecombot.py @@ -59,10 +59,10 @@ import requests from json import dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyWeComBot(NotifyBase): @@ -134,6 +134,15 @@ def __init__(self, key, **kwargs): ) return + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.key) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyWhatsApp.py b/libs/apprise/plugins/whatsapp.py similarity index 98% rename from libs/apprise/plugins/NotifyWhatsApp.py rename to libs/apprise/plugins/whatsapp.py index 4ccbcbdaf..e0322b80d 100644 --- a/libs/apprise/plugins/NotifyWhatsApp.py +++ b/libs/apprise/plugins/whatsapp.py @@ -44,12 +44,12 @@ import re import requests from json import loads, dumps -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import is_phone_no from ..utils import parse_phone_no from ..utils import validate_regex -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyWhatsApp(NotifyBase): @@ -446,6 +446,15 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.from_phone_id, self.token) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyWindows.py b/libs/apprise/plugins/windows.py similarity index 97% rename from libs/apprise/plugins/NotifyWindows.py rename to libs/apprise/plugins/windows.py index 207e0f221..fd9454b28 100644 --- a/libs/apprise/plugins/NotifyWindows.py +++ b/libs/apprise/plugins/windows.py @@ -28,11 +28,11 @@ from time import sleep -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # Default our global support flag NOTIFY_WINDOWS_SUPPORT_ENABLED = False @@ -87,6 +87,10 @@ class NotifyWindows(NotifyBase): # The number of seconds to display the popup for default_popup_duration_sec = 12 + # No URL Identifier will be defined for this service as there simply isn't + # enough details to uniquely identify one dbus:// from another. + url_identifier = False + # Define object templates templates = ( '{schema}://', diff --git a/libs/apprise/plugins/workflows.py b/libs/apprise/plugins/workflows.py new file mode 100644 index 000000000..e047a9f5c --- /dev/null +++ b/libs/apprise/plugins/workflows.py @@ -0,0 +1,577 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron +# +# 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. +# +# 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. + +# To use this plugin, you need to create a MS Teams Azure Webhook Workflow: +# https://support.microsoft.com/en-us/office/browse-and-add-workflows-\ +# in-microsoft-teams-4998095c-8b72-4b0e-984c-f2ad39e6ba9a + +# Your webhook will look somthing like this: +# https://prod-161.westeurope.logic.azure.com:443/\ +# workflows/643e69f83c8944438d68119179a10a64/triggers/manual/\ +# paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&\ +# sv=1.0&sig=KODuebWbDGYFr0z0eu-6Rj8aUKz7108W3wrNJZxFE5A +# +# Yes... The URL is that big... But it looks like this (greatly simplified): +# https://HOST:PORT/workflows/ABCD/triggers/manual/path/...sig=DEFG +# ^ ^ ^ ^ +# | | | | +# These are important <---------^------------------------------^ +# +# +# Apprise can support this webhook as is (directly passed into it) +# Alternatively it can be shortend to: + +# These 3 tokens need to be placed in the URL after the Team +# workflows://HOST:PORT/ABCD/DEFG/ +# + +import re +import requests +import json +from json.decoder import JSONDecodeError + +from .base import NotifyBase +from ..common import NotifyImageSize +from ..common import NotifyType +from ..common import NotifyFormat +from ..utils import parse_bool +from ..utils import validate_regex +from ..utils import apply_template +from ..utils import TemplateType +from ..apprise_attachment import AppriseAttachment +from ..locale import gettext_lazy as _ + + +class NotifyWorkflows(NotifyBase): + """ + A wrapper for Microsoft Workflows (MS Teams) Notifications + """ + + # The default descriptive name associated with the Notification + service_name = 'Power Automate / Workflows (for MSTeams)' + + # The services URL + service_url = 'https://www.microsoft.com/power-platform/' \ + 'products/power-automate' + + # The default secure protocol + secure_protocol = ('workflow', 'workflows') + + # A URL that takes you to the setup/help of the specific protocol + setup_url = 'https://github.com/caronc/apprise/wiki/Notify_workflows' + + # Allows the user to specify the NotifyImageSize object + image_size = NotifyImageSize.XY_32 + + # The maximum allowable characters allowed in the body per message + body_maxlen = 1000 + + # Default Notification Format + notify_format = NotifyFormat.MARKDOWN + + # There is no reason we should exceed 35KB when reading in a JSON file. + # If it is more than this, then it is not accepted + max_workflows_template_size = 35000 + + # Adaptive Card Version + adaptive_card_version = '1.4' + + # Define object templates + templates = ( + '{schema}://{host}/{workflow}/{signature}', + '{schema}://{host}:{port}/{workflow}/{signature}', + ) + + # Define our template tokens + template_tokens = dict(NotifyBase.template_tokens, **{ + 'host': { + 'name': _('Hostname'), + 'type': 'string', + 'required': True, + }, + 'port': { + 'name': _('Port'), + 'type': 'int', + 'min': 1, + 'max': 65535, + }, + # workflow identifier + 'workflow': { + 'name': _('Workflow ID'), + 'type': 'string', + 'private': True, + 'required': True, + 'regex': (r'^[A-Z0-9_-]+$', 'i'), + }, + # Signature + 'signature': { + 'name': _('Signature'), + 'type': 'string', + 'private': True, + 'required': True, + 'regex': (r'^[a-z0-9_-]+$', 'i'), + }, + }) + + # Define our template arguments + template_args = dict(NotifyBase.template_args, **{ + 'id': { + 'alias_of': 'workflow', + }, + 'image': { + 'name': _('Include Image'), + 'type': 'bool', + 'default': True, + 'map_to': 'include_image', + }, + 'wrap': { + 'name': _('Wrap Text'), + 'type': 'bool', + 'default': True, + 'map_to': 'wrap', + }, + 'template': { + 'name': _('Template Path'), + 'type': 'string', + 'private': True, + }, + # Below variable shortforms are taken from the Workflows webhook + # for consistency + 'sig': { + 'alias_of': 'signature', + }, + 'ver': { + 'name': _('API Version'), + 'type': 'string', + 'default': '2016-06-01', + 'map_to': 'version', + }, + 'api-version': { + 'alias_of': 'ver' + }, + }) + + # Define our token control + template_kwargs = { + 'tokens': { + 'name': _('Template Tokens'), + 'prefix': ':', + }, + } + + def __init__(self, workflow, signature, include_image=None, + version=None, template=None, tokens=None, wrap=None, + **kwargs): + """ + Initialize Microsoft Workflows Object + + """ + super().__init__(**kwargs) + + self.workflow = validate_regex( + workflow, *self.template_tokens['workflow']['regex']) + if not self.workflow: + msg = 'An invalid Workflows ID ' \ + '({}) was specified.'.format(workflow) + self.logger.warning(msg) + raise TypeError(msg) + + self.signature = validate_regex( + signature, *self.template_tokens['signature']['regex']) + if not self.signature: + msg = 'An invalid Signature ' \ + '({}) was specified.'.format(signature) + self.logger.warning(msg) + raise TypeError(msg) + + # Place a thumbnail image inline with the message body + self.include_image = True if ( + include_image if include_image is not None else + self.template_args['image']['default']) else False + + # Wrap Text + self.wrap = True if ( + wrap if wrap is not None else + self.template_args['wrap']['default']) else False + + # Our template object is just an AppriseAttachment object + self.template = AppriseAttachment(asset=self.asset) + if template: + # Add our definition to our template + self.template.add(template) + # Enforce maximum file size + self.template[0].max_file_size = self.max_workflows_template_size + + # Prepare Version + self.api_version = version if version is not None \ + else self.template_args['ver']['default'] + + # Template functionality + self.tokens = {} + if isinstance(tokens, dict): + self.tokens.update(tokens) + + elif tokens: + msg = 'The specified Workflows Template Tokens ' \ + '({}) are not identified as a dictionary.'.format(tokens) + self.logger.warning(msg) + raise TypeError(msg) + + # else: NoneType - this is okay + return + + def gen_payload(self, body, title='', notify_type=NotifyType.INFO, + **kwargs): + """ + This function generates our payload whether it be the generic one + Apprise generates by default, or one provided by a specified + external template. + """ + + # Acquire our to-be footer icon if configured to do so + image_url = None if not self.include_image \ + else self.image_url(notify_type) + + body_content = [] + if image_url: + body_content.append({ + "type": "Image", + "url": image_url, + "height": "32px", + "altText": notify_type, + }) + + if title: + body_content.append({ + "type": "TextBlock", + "text": f'{title}', + "style": "heading", + "weight": "Bolder", + "size": "Large", + "id": "title", + }) + + body_content.append({ + "type": "TextBlock", + "text": body, + "style": "default", + "wrap": self.wrap, + "id": "body", + }) + + if not self.template: + # By default we use a generic working payload if there was + # no template specified + schema = "http://adaptivecards.io/schemas/adaptive-card.json" + payload = { + "type": "message", + "attachments": [ + { + "contentType": + "application/vnd.microsoft.card.adaptive", + "contentUrl": None, + "content": { + "$schema": schema, + "type": "AdaptiveCard", + "version": self.adaptive_card_version, + "body": body_content, + # Additionally + "msteams": {"width": "full"}, + } + } + ] + } + + return payload + + # If our code reaches here, then we generate ourselves the payload + template = self.template[0] + if not template: + # We could not access the attachment + self.logger.error( + 'Could not access Workflow template {}.'.format( + template.url(privacy=True))) + return False + + # Take a copy of our token dictionary + tokens = self.tokens.copy() + + # Apply some defaults template values + tokens['app_body'] = body + tokens['app_title'] = title + tokens['app_type'] = notify_type + tokens['app_id'] = self.app_id + tokens['app_desc'] = self.app_desc + tokens['app_color'] = self.color(notify_type) + tokens['app_image_url'] = image_url + tokens['app_url'] = self.app_url + + # Enforce Application mode + tokens['app_mode'] = TemplateType.JSON + + try: + with open(template.path, 'r') as fp: + content = json.loads(apply_template(fp.read(), **tokens)) + + except (OSError, IOError): + self.logger.error( + 'MSTeam template {} could not be read.'.format( + template.url(privacy=True))) + return None + + except JSONDecodeError as e: + self.logger.error( + 'MSTeam template {} contains invalid JSON.'.format( + template.url(privacy=True))) + self.logger.debug('JSONDecodeError: {}'.format(e)) + return None + + return content + + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + """ + Perform Microsoft Teams Notification + """ + + headers = { + 'User-Agent': self.app_id, + 'Content-Type': 'application/json', + } + + params = { + 'api-version': self.api_version, + 'sp': '/triggers/manual/run', + 'sv': '1.0', + 'sig': self.signature, + } + + notify_url = 'https://{host}{port}/workflows/{workflow}/' \ + 'triggers/manual/paths/invoke'.format( + host=self.host, + port='' if not self.port else f':{self.port}', + workflow=self.workflow) + + # Generate our payload if it's possible + payload = self.gen_payload( + body=body, title=title, notify_type=notify_type, **kwargs) + if not payload: + # No need to present a reason; that will come from the + # gen_payload() function itself + return False + + self.logger.debug('Workflows POST URL: %s (cert_verify=%r)' % ( + notify_url, self.verify_certificate, + )) + self.logger.debug('Workflows Payload: %s' % str(payload)) + + # Always call throttle before any remote server i/o is made + self.throttle() + try: + r = requests.post( + notify_url, + params=params, + data=json.dumps(payload), + headers=headers, + verify=self.verify_certificate, + timeout=self.request_timeout, + ) + if r.status_code not in ( + requests.codes.ok, requests.codes.accepted): + # We had a problem + status_str = \ + NotifyWorkflows.http_response_code_lookup(r.status_code) + + self.logger.warning( + 'Failed to send Workflows notification: ' + '{}{}error={}.'.format( + status_str, + ', ' if status_str else '', + r.status_code)) + + self.logger.debug( + 'Response Details:\r\n{}'.format(r.content)) + + # We failed + return False + + else: + self.logger.info('Sent Workflows notification.') + + except requests.RequestException as e: + self.logger.warning( + 'A Connection error occurred sending Workflows notification.') + self.logger.debug('Socket Exception: %s' % str(e)) + + # We failed + return False + + return True + + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol[0], self.host, self.port, self.workflow, + self.signature, + ) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any URL parameters + params = { + 'image': 'yes' if self.include_image else 'no', + 'wrap': 'yes' if self.wrap else 'no', + } + + if self.template: + params['template'] = NotifyWorkflows.quote( + self.template[0].url(), safe='') + + # Store our version if it differs from default + if self.api_version != self.template_args['ver']['default']: + params['ver'] = self.api_version + + # Extend our parameters + params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + # Store any template entries if specified + params.update({':{}'.format(k): v for k, v in self.tokens.items()}) + + return '{schema}://{host}{port}/{workflow}/{signature}/' \ + '?{params}'.format( + schema=self.secure_protocol[0], + host=self.host, + port='' if not self.port else f':{self.port}', + workflow=self.pprint(self.workflow, privacy, safe=''), + signature=self.pprint(self.signature, privacy, safe=''), + params=NotifyWorkflows.urlencode(params), + ) + + @staticmethod + def parse_url(url): + """ + Parses the URL and returns enough arguments that can allow + us to re-instantiate this object. + + """ + + results = NotifyBase.parse_url(url) + if not results: + # We're done early as we couldn't load the results + return results + + # store values if provided + entries = NotifyWorkflows.split_path(results['fullpath']) + + # Display image? + results['include_image'] = parse_bool(results['qsd'].get( + 'image', NotifyWorkflows.template_args['image']['default'])) + + # Wrap Text? + results['wrap'] = parse_bool(results['qsd'].get( + 'wrap', NotifyWorkflows.template_args['wrap']['default'])) + + # Template Handling + if 'template' in results['qsd'] and results['qsd']['template']: + results['template'] = \ + NotifyWorkflows.unquote(results['qsd']['template']) + + if 'workflow' in results['qsd'] and results['qsd']['workflow']: + results['workflow'] = \ + NotifyWorkflows.unquote(results['qsd']['workflow']) + + elif 'id' in results['qsd'] and results['qsd']['id']: + results['workflow'] = \ + NotifyWorkflows.unquote(results['qsd']['id']) + + else: + results['workflow'] = None if not entries \ + else NotifyWorkflows.unquote(entries.pop(0)) + + # Signature + if 'signature' in results['qsd'] and results['qsd']['signature']: + results['signature'] = \ + NotifyWorkflows.unquote(results['qsd']['signature']) + + elif 'sig' in results['qsd'] and results['qsd']['sig']: + results['signature'] = \ + NotifyWorkflows.unquote(results['qsd']['sig']) + + else: + # Read information from path + results['signature'] = None if not entries \ + else NotifyWorkflows.unquote(entries.pop(0)) + + # Version + if 'api-version' in results['qsd'] and results['qsd']['api-version']: + results['version'] = \ + NotifyWorkflows.unquote(results['qsd']['api-version']) + + elif 'ver' in results['qsd'] and results['qsd']['ver']: + results['version'] = \ + NotifyWorkflows.unquote(results['qsd']['ver']) + + # Store our tokens + results['tokens'] = results['qsd:'] + + return results + + @staticmethod + def parse_native_url(url): + """ + Support parsing the webhook straight out of workflows + https://HOST:443/workflows/WORKFLOWID/triggers/manual/paths/invoke + """ + + # Match our workflows webhook URL and re-assemble + result = re.match( + r'^https?://(?P[A-Z0-9_.-]+)' + r'(?P:[1-9][0-9]{0,5})?' + r'/workflows/' + r'(?P[A-Z0-9_-]+)' + r'/triggers/manual/paths/invoke/?' + r'(?P\?.+)$', url, re.I) + + if result: + # Construct our URL + return NotifyWorkflows.parse_url( + '{schema}://{host}{port}/{workflow}' + '/{params}'.format( + schema=NotifyWorkflows.secure_protocol[0], + host=result.group('host'), + port='' if not result.group('port') + else result.group('port'), + workflow=result.group('workflow'), + params=result.group('params'))) + return None diff --git a/libs/apprise/plugins/wxpusher.py b/libs/apprise/plugins/wxpusher.py new file mode 100644 index 000000000..e7c9bd672 --- /dev/null +++ b/libs/apprise/plugins/wxpusher.py @@ -0,0 +1,374 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron +# +# 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. +# +# 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. +# +# Sign-up at https://wxpusher.zjiecode.com/ +# +# Login and acquire your App Token +# - Open the backend of the application: +# https://wxpusher.zjiecode.com/admin/ +# - Find the appToken menu from the left menu bar, here you can reset the +# appToken, please note that after resetting, the old appToken will be +# invalid immediately and the call interface will fail. +import re +import json +import requests +from itertools import chain +from .base import NotifyBase +from ..url import PrivacyMode +from ..common import NotifyType +from ..common import NotifyFormat +from ..utils import parse_list +from ..utils import validate_regex +from ..locale import gettext_lazy as _ + + +# Topics are always numerical +IS_TOPIC = re.compile(r'^\s*(?P[1-9][0-9]{0,20})\s*$') + +# users always start with UID_ +IS_USER = re.compile( + r'^\s*(?P(?PUID_)(?P[^\s]+))\s*$', re.I) + + +WXPUSHER_RESPONSE_CODES = { + 1000: "The request was processed successfully.", + 1001: "The token provided in the request is missing.", + 1002: "The token provided in the request is incorrect or expired.", + 1003: "The body of the message was not provided.", + 1004: "The user or topic you're trying to send the message to does not " + "exist", + 1005: "The app or topic binding process failed.", + 1006: "There was an error in sending the message.", + 1007: "The message content exceeds the allowed length.", + 1008: "The API call frequency is too high and the server rejected the " + "request.", + 1009: "There might be other issues that are not explicitly covered by " + "the above codes", + 1010: "The IP address making the request is not whitelisted.", +} + + +class WxPusherContentType: + """ + Defines the different supported content types + """ + TEXT = 1 + HTML = 2 + MARKDOWN = 3 + + +class SubscriptionType: + # Verify Subscription Time + UNVERIFIED = 0 + PAID_USERS = 1 + UNSUBSCRIBED = 2 + + +class NotifyWxPusher(NotifyBase): + """ + A wrapper for WxPusher Notifications + """ + + # The default descriptive name associated with the Notification + service_name = 'WxPusher' + + # The services URL + service_url = 'https://wxpusher.zjiecode.com/' + + # The default protocol + secure_protocol = 'wxpusher' + + # A URL that takes you to the setup/help of the specific protocol + setup_url = 'https://github.com/caronc/apprise/wiki/Notify_wxpusher' + + # WxPusher notification endpoint + notify_url = 'https://wxpusher.zjiecode.com/api/send/message' + + # Define object templates + templates = ( + '{schema}://{token}/{targets}', + ) + + # Define our template tokens + template_tokens = dict(NotifyBase.template_tokens, **{ + 'token': { + 'name': _('App Token'), + 'type': 'string', + 'required': True, + 'regex': (r'^AT_[^\s]+$', 'i'), + 'private': True, + }, + 'target_topic': { + 'name': _('Target Topic'), + 'type': 'int', + 'map_to': 'targets', + }, + 'target_user': { + 'name': _('Target User ID'), + 'type': 'string', + 'regex': (r'^UID_[^\s]+$', 'i'), + 'map_to': 'targets', + }, + 'targets': { + 'name': _('Targets'), + 'type': 'list:string', + }, + }) + + # Define our template arguments + template_args = dict(NotifyBase.template_args, **{ + 'to': { + 'alias_of': 'targets', + }, + 'token': { + 'alias_of': 'token', + }, + }) + + # Used for mapping the content type to our output since Apprise supports + # The same formats that WxPusher does. + __content_type_map = { + NotifyFormat.MARKDOWN: WxPusherContentType.MARKDOWN, + NotifyFormat.TEXT: WxPusherContentType.TEXT, + NotifyFormat.HTML: WxPusherContentType.HTML, + } + + def __init__(self, token, targets=None, **kwargs): + """ + Initialize WxPusher Object + """ + super().__init__(**kwargs) + + # App Token (associated with WxPusher account) + self.token = validate_regex( + token, *self.template_tokens['token']['regex']) + if not self.token: + msg = 'An invalid WxPusher App Token ' \ + '({}) was specified.'.format(token) + self.logger.warning(msg) + raise TypeError(msg) + + # Used for URL generation afterwards only + self._invalid_targets = list() + + # For storing what is detected + self._users = list() + self._topics = list() + + # Parse our targets + for target in parse_list(targets): + # Validate targets and drop bad ones: + result = IS_USER.match(target) + if result: + # store valid user + self._users.append(result['full']) + continue + + result = IS_TOPIC.match(target) + if result: + # store valid topic + self._topics.append(int(result['topic'])) + continue + + self.logger.warning( + 'Dropped invalid WxPusher user/topic ' + '(%s) specified.' % target, + ) + self._invalid_targets.append(target) + + return + + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + """ + Perform WxPusher Notification + """ + + if not self._users and not self._topics: + # There were no services to notify + self.logger.warning( + 'There were no WxPusher targets to notify') + return False + + # Prepare our headers + headers = { + 'User-Agent': self.app_id, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + # Prepare our payload + payload = { + 'appToken': self.token, + 'content': body, + 'summary': title, + 'contentType': self.__content_type_map[self.notify_format], + 'topicIds': self._topics, + 'uids': self._users, + + # unsupported at this time + # 'verifyPay': False, + # 'verifyPayType': 0, + 'url': None, + } + + # Some Debug Logging + self.logger.debug('WxPusher POST URL: {} (cert_verify={})'.format( + self.notify_url, self.verify_certificate)) + self.logger.debug('WxPusher Payload: {}' .format(payload)) + + # Always call throttle before any remote server i/o is made + self.throttle() + + try: + r = requests.post( + self.notify_url, + data=json.dumps(payload).encode('utf-8'), + headers=headers, + verify=self.verify_certificate, + timeout=self.request_timeout, + ) + + try: + content = json.loads(r.content) + + except (AttributeError, TypeError, ValueError): + # ValueError = r.content is Unparsable + # TypeError = r.content is None + # AttributeError = r is None + content = {} + + # 1000 is the expected return code for a successful query + if r.status_code == requests.codes.ok and \ + content and content.get("code") == 1000: + + # We're good! + self.logger.info( + 'Sent WxPusher notification to %d targets.' % ( + len(self._users) + len(self._topics))) + + else: + error_str = content.get('msg') if content else ( + WXPUSHER_RESPONSE_CODES.get( + content.get("code") if content else None, + "An unknown error occured.")) + + # We had a problem + status_str = \ + NotifyWxPusher.http_response_code_lookup( + r.status_code) if not error_str else error_str + + self.logger.warning( + 'Failed to send WxPusher notification, ' + 'code={}/{}: {}'.format( + r.status_code, + 'unk' if not content else content.get("code"), + status_str)) + + self.logger.debug( + 'Response Details:\r\n{}'.format( + content if content else r.content)) + + # Mark our failure + return False + + except requests.RequestException as e: + self.logger.warning( + 'A Connection error occurred sending WxPusher ' + 'notification.' + ) + self.logger.debug('Socket Exception: %s' % str(e)) + + return False + + return True + + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.token) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any URL parameters + params = self.url_parameters(privacy=privacy, *args, **kwargs) + + return '{schema}://{token}/{targets}/?{params}'.format( + schema=self.secure_protocol, + token=self.pprint( + self.token, privacy, mode=PrivacyMode.Secret, safe=''), + targets='/'.join(chain( + [str(t) for t in self._topics], self._users, + [NotifyWxPusher.quote(x, safe='') + for x in self._invalid_targets])), + params=NotifyWxPusher.urlencode(params)) + + @staticmethod + def parse_url(url): + """ + Parses the URL and returns enough arguments that can allow + us to re-instantiate this object. + + """ + results = NotifyBase.parse_url(url, verify_host=False) + if not results: + # We're done early as we couldn't load the results + return results + + # Get our entries; split_path() looks after unquoting content for us + # by default + results['targets'] = NotifyWxPusher.split_path(results['fullpath']) + + # App Token + if 'token' in results['qsd'] and len(results['qsd']['token']): + # Extract the App token from an argument + results['token'] = \ + NotifyWxPusher.unquote(results['qsd']['token']) + # Any host entry defined is actually part of the path + # store it's element (if defined) + if results['host']: + results['targets'].append( + NotifyWxPusher.split_path(results['host'])) + + else: + # The hostname is our source number + results['token'] = NotifyWxPusher.unquote(results['host']) + + # Support the 'to' variable so that we can support rooms this way too + # The 'to' makes it easier to use yaml configuration + if 'to' in results['qsd'] and len(results['qsd']['to']): + results['targets'] += \ + NotifyWxPusher.parse_list(results['qsd']['to']) + + return results diff --git a/libs/apprise/plugins/NotifyXBMC.py b/libs/apprise/plugins/xbmc.py similarity index 94% rename from libs/apprise/plugins/NotifyXBMC.py rename to libs/apprise/plugins/xbmc.py index 7d4462e41..61e7b1e2e 100644 --- a/libs/apprise/plugins/NotifyXBMC.py +++ b/libs/apprise/plugins/xbmc.py @@ -29,12 +29,12 @@ import requests from json import dumps -from .NotifyBase import NotifyBase -from ..URLBase import PrivacyMode +from .base import NotifyBase +from ..url import PrivacyMode from ..common import NotifyType from ..common import NotifyImageSize from ..utils import parse_bool -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ class NotifyXBMC(NotifyBase): @@ -299,6 +299,25 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return True + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + default_schema = self.xbmc_protocol if ( + self.protocol <= self.xbmc_remote_protocol) else self.kodi_protocol + if self.secure: + # Append 's' to schema + default_schema += 's' + + port = self.port if self.port else ( + 443 if self.secure else self.xbmc_default_port) + return ( + default_schema, self.user, self.password, self.host, port, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/plugins/NotifyZulip.py b/libs/apprise/plugins/zulip.py similarity index 97% rename from libs/apprise/plugins/NotifyZulip.py rename to libs/apprise/plugins/zulip.py index 54fe2d062..34c6d813e 100644 --- a/libs/apprise/plugins/NotifyZulip.py +++ b/libs/apprise/plugins/zulip.py @@ -61,13 +61,13 @@ import re import requests -from .NotifyBase import NotifyBase +from .base import NotifyBase from ..common import NotifyType from ..utils import parse_list from ..utils import validate_regex from ..utils import is_email from ..utils import remove_suffix -from ..AppriseLocale import gettext_lazy as _ +from ..locale import gettext_lazy as _ # A Valid Bot Name VALIDATE_BOTNAME = re.compile(r'(?P[A-Z0-9_-]{1,32})', re.I) @@ -334,6 +334,18 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return not has_error + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol, self.organization, self.hostname, + self.token, + ) + def url(self, privacy=False, *args, **kwargs): """ Returns the URL built dynamically based on specified arguments. diff --git a/libs/apprise/URLBase.py b/libs/apprise/url.py similarity index 81% rename from libs/apprise/URLBase.py rename to libs/apprise/url.py index 90ea85c66..e3c9c17d8 100644 --- a/libs/apprise/URLBase.py +++ b/libs/apprise/url.py @@ -26,17 +26,19 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. +import sys import re from .logger import logger import time +import hashlib from datetime import datetime from xml.sax.saxutils import escape as sax_escape from urllib.parse import unquote as _unquote from urllib.parse import quote as _quote -from .AppriseLocale import gettext_lazy as _ -from .AppriseAsset import AppriseAsset +from .locale import gettext_lazy as _ +from .asset import AppriseAsset from .utils import urlencode from .utils import parse_url from .utils import parse_bool @@ -103,6 +105,16 @@ class URLBase: # server to send a response. socket_read_timeout = 4.0 + # provide the information required to allow for unique id generation when + # calling url_id(). Over-ride this in calling classes. Calling classes + # should set this to false if there can be no url_id generated + url_identifier = None + + # Tracks the last generated url_id() to prevent regeneration; initializes + # to False and is set thereafter. This is an internal value for this class + # only and should not be set to anything other then False below... + __cached_url_identifier = False + # Handle # Maintain a set of tags to associate with this specific notification tags = set() @@ -185,6 +197,8 @@ class URLBase: template_kwargs = {} + # Internal Values + def __init__(self, asset=None, **kwargs): """ Initialize some general logging and common server arguments that will @@ -197,17 +211,17 @@ def __init__(self, asset=None, **kwargs): asset if isinstance(asset, AppriseAsset) else AppriseAsset() # Certificate Verification (for SSL calls); default to being enabled - self.verify_certificate = parse_bool(kwargs.get('verify', True)) + self.verify_certificate = parse_bool( + kwargs.get('verify', URLBase.verify_certificate)) + + # Schema + self.schema = kwargs.get('schema', 'unknown').lower() # Secure Mode self.secure = kwargs.get('secure', None) - try: - if not isinstance(self.secure, bool): - # Attempt to detect - self.secure = kwargs.get('schema', '')[-1].lower() == 's' - - except (TypeError, IndexError): - self.secure = False + if not isinstance(self.secure, bool): + # Attempt to detect + self.secure = self.schema[-1:] == 's' self.host = URLBase.unquote(kwargs.get('host')) self.port = kwargs.get('port') @@ -334,7 +348,7 @@ def url(self, privacy=False, *args, **kwargs): default_port = 443 if self.secure else 80 - return '{schema}://{auth}{hostname}{port}{fullpath}?{params}'.format( + return '{schema}://{auth}{hostname}{port}{fullpath}{params}'.format( schema='https' if self.secure else 'http', auth=auth, # never encode hostname since we're expecting it to be a valid one @@ -343,9 +357,117 @@ def url(self, privacy=False, *args, **kwargs): else ':{}'.format(self.port), fullpath=URLBase.quote(self.fullpath, safe='/') if self.fullpath else '/', - params=URLBase.urlencode(params), + params=('?' + URLBase.urlencode(params) if params else ''), ) + def url_id(self, lazy=True, hash_engine=hashlib.sha256): + """ + Returns a unique URL identifier that representing the Apprise URL + itself. The url_id is always a hash string or None if it can't + be generated. + + The idea is to only build the ID based on the credentials or specific + elements relative to the URL itself. The URL ID should never factor in + (or else it's a bug) the following: + - any targets defined + - all GET parameters options unless they explicitly change the + complete function of the code. + + For example: GET parameters like ?image=false&avatar=no should + have no bearing in the uniqueness of the Apprise URL Identifier. + + Consider plugins where some get parameters completely change + how the entire upstream comunication works such as slack:// and + matrix:// which has a mode. In these circumstances, they should + be considered in he unique generation. + + The intention of this function is to help align Apprise URLs that are + common with one another and therefore can share the same persistent + storage even when subtle changes are made to them. + + Hence the following would all return the same URL Identifier: + json://abc/def/ghi?image=no + json://abc/def/ghi/?test=yes&image=yes + + """ + + if lazy and self.__cached_url_identifier is not False: + return self.__cached_url_identifier \ + if not (self.__cached_url_identifier + and self.asset.storage_idlen) \ + else self.__cached_url_identifier[:self.asset.storage_idlen] + + # Python v3.9 introduces usedforsecurity argument + kwargs = {'usedforsecurity': False} \ + if sys.version_info >= (3, 9) else {} + + if self.url_identifier is False: + # Disabled + self.__cached_url_identifier = None + + elif self.url_identifier in (None, True): + + # Prepare our object + engine = hash_engine( + self.asset.storage_salt + self.schema.encode( + self.asset.encoding), **kwargs) + + # We want to treat `None` differently then a blank entry + engine.update( + b'\0' if self.password is None + else self.password.encode(self.asset.encoding)) + engine.update( + b'\0' if self.user is None + else self.user.encode(self.asset.encoding)) + engine.update( + b'\0' if not self.host + else self.host.encode(self.asset.encoding)) + engine.update( + b'\0' if self.port is None + else f'{self.port}'.encode(self.asset.encoding)) + engine.update( + self.fullpath.rstrip('/').encode(self.asset.encoding)) + engine.update(b's' if self.secure else b'i') + + # Save our generated content + self.__cached_url_identifier = engine.hexdigest() + + elif isinstance(self.url_identifier, str): + self.__cached_url_identifier = hash_engine( + self.asset.storage_salt + self.url_identifier.encode( + self.asset.encoding), **kwargs).hexdigest() + + elif isinstance(self.url_identifier, bytes): + self.__cached_url_identifier = hash_engine( + self.asset.storage_salt + self.url_identifier, + **kwargs).hexdigest() + + elif isinstance(self.url_identifier, (list, tuple, set)): + self.__cached_url_identifier = hash_engine( + self.asset.storage_salt + b''.join([ + (x if isinstance(x, bytes) + else str(x).encode(self.asset.encoding)) + for x in self.url_identifier]), **kwargs).hexdigest() + + elif isinstance(self.url_identifier, dict): + self.__cached_url_identifier = hash_engine( + self.asset.storage_salt + b''.join([ + (x if isinstance(x, bytes) + else str(x).encode(self.asset.encoding)) + for x in self.url_identifier.values()]), + **kwargs).hexdigest() + + else: + self.__cached_url_identifier = hash_engine( + self.asset.storage_salt + str( + self.url_identifier).encode(self.asset.encoding), + **kwargs).hexdigest() + + return self.__cached_url_identifier \ + if not (self.__cached_url_identifier + and self.asset.storage_idlen) \ + else self.__cached_url_identifier[:self.asset.storage_idlen] + def __contains__(self, tags): """ Returns true if the tag specified is associated with this notification. @@ -577,7 +699,7 @@ def parse_list(content, allow_whitespace=True, unquote=True): return content @staticmethod - def parse_phone_no(content, unquote=True): + def parse_phone_no(content, unquote=True, prefix=False): """A wrapper to utils.parse_phone_no() with unquoting support Parses a specified set of data and breaks it into a list. @@ -600,7 +722,7 @@ def parse_phone_no(content, unquote=True): # Nothing further to do return [] - content = parse_phone_no(content) + content = parse_phone_no(content, prefix=prefix) return content @@ -660,14 +782,22 @@ def url_parameters(self, *args, **kwargs): this class. """ - return { - # The socket read timeout - 'rto': str(self.socket_read_timeout), - # The request/socket connect timeout - 'cto': str(self.socket_connect_timeout), - # Certificate verification - 'verify': 'yes' if self.verify_certificate else 'no', - } + # parameters are only provided on demand to keep the URL short + params = {} + + # The socket read timeout + if self.socket_read_timeout != URLBase.socket_read_timeout: + params['rto'] = str(self.socket_read_timeout) + + # The request/socket connect timeout + if self.socket_connect_timeout != URLBase.socket_connect_timeout: + params['cto'] = str(self.socket_connect_timeout) + + # Certificate verification + if self.verify_certificate != URLBase.verify_certificate: + params['verify'] = 'yes' if self.verify_certificate else 'no' + + return params @staticmethod def post_process_parse_url_results(results): @@ -744,7 +874,7 @@ def post_process_parse_url_results(results): @staticmethod def parse_url(url, verify_host=True, plus_to_space=False, - strict_port=False): + strict_port=False, sanitize=True): """Parses the URL and returns it broken apart into a dictionary. This is very specific and customized for Apprise. @@ -765,7 +895,8 @@ def parse_url(url, verify_host=True, plus_to_space=False, results = parse_url( url, default_schema='unknown', verify_host=verify_host, - plus_to_space=plus_to_space, strict_port=strict_port) + plus_to_space=plus_to_space, strict_port=strict_port, + sanitize=sanitize) if not results: # We're done; we failed to parse our url diff --git a/libs/apprise/URLBase.pyi b/libs/apprise/url.pyi similarity index 100% rename from libs/apprise/URLBase.pyi rename to libs/apprise/url.pyi diff --git a/libs/apprise/utils.py b/libs/apprise/utils.py index e1881f314..b33ad63a5 100644 --- a/libs/apprise/utils.py +++ b/libs/apprise/utils.py @@ -25,13 +25,17 @@ # 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. - +import copy import re import sys import json import contextlib import os +import binascii import locale +import platform +import typing +import base64 from itertools import chain from os.path import expanduser from functools import reduce @@ -45,6 +49,20 @@ import importlib.util +# A simple path decoder we can re-use which looks after +# ensuring our file info is expanded correctly when provided +# a path. +__PATH_DECODER = os.path.expandvars if \ + platform.system() == 'Windows' else os.path.expanduser + + +def path_decode(path): + """ + Returns the fully decoded path based on the operating system + """ + return os.path.abspath(__PATH_DECODER(path)) + + def import_module(path, name): """ Load our module based on path @@ -174,6 +192,11 @@ def import_module(path, name): PHONE_NO_DETECTION_RE = re.compile( r'\s*([+(\s]*[0-9][0-9()\s-]+[0-9])(?=$|[\s,+(]+[0-9])', re.I) +# Support for prefix: (string followed by colon) infront of phone no +PHONE_NO_WPREFIX_DETECTION_RE = re.compile( + r'\s*((?:[a-z]+:)?[+(\s]*[0-9][0-9()\s-]+[0-9])' + r'(?=$|(?:[a-z]+:)?[\s,+(]+[0-9])', re.I) + # A simple verification check to make sure the content specified # rougly conforms to a ham radio call sign before we parse it further IS_CALL_SIGN = re.compile( @@ -541,7 +564,7 @@ def tidy_path(path): return path -def parse_qsd(qs, simple=False, plus_to_space=False): +def parse_qsd(qs, simple=False, plus_to_space=False, sanitize=True): """ Query String Dictionary Builder @@ -568,6 +591,8 @@ def parse_qsd(qs, simple=False, plus_to_space=False): per normal URL Encoded defininition. Normal URL parsing applies this, but `+` is very actively used character with passwords, api keys, tokens, etc. So Apprise does not do this by default. + + if sanitize is set to False, then kwargs are not placed into lowercase """ # Our return result set: @@ -608,7 +633,7 @@ def parse_qsd(qs, simple=False, plus_to_space=False): # Always Query String Dictionary (qsd) for every entry we have # content is always made lowercase for easy indexing - result['qsd'][key.lower().strip()] = val + result['qsd'][key.lower().strip() if sanitize else key] = val if simple: # move along @@ -636,7 +661,7 @@ def parse_qsd(qs, simple=False, plus_to_space=False): def parse_url(url, default_schema='http', verify_host=True, strict_port=False, - simple=False, plus_to_space=False): + simple=False, plus_to_space=False, sanitize=True): """A function that greatly simplifies the parsing of a url specified by the end user. @@ -691,6 +716,8 @@ def parse_url(url, default_schema='http', verify_host=True, strict_port=False, If the URL can't be parsed then None is returned + If sanitize is set to False, then kwargs are not placed in lowercase + and wrapping whitespace is not removed """ if not isinstance(url, str): @@ -750,7 +777,8 @@ def parse_url(url, default_schema='http', verify_host=True, strict_port=False, # while ensuring that all keys are lowercase if qsdata: result.update(parse_qsd( - qsdata, simple=simple, plus_to_space=plus_to_space)) + qsdata, simple=simple, plus_to_space=plus_to_space, + sanitize=sanitize)) # Now do a proper extraction of data; http:// is just substitued in place # to allow urlparse() to function as expected, we'll swap this back to the @@ -934,7 +962,7 @@ def parse_bool(arg, default=False): return bool(arg) -def parse_phone_no(*args, store_unparseable=True, **kwargs): +def parse_phone_no(*args, store_unparseable=True, prefix=False, **kwargs): """ Takes a string containing phone numbers separated by comma's and/or spaces and returns a list. @@ -943,7 +971,8 @@ def parse_phone_no(*args, store_unparseable=True, **kwargs): result = [] for arg in args: if isinstance(arg, str) and arg: - _result = PHONE_NO_DETECTION_RE.findall(arg) + _result = (PHONE_NO_DETECTION_RE if not prefix + else PHONE_NO_WPREFIX_DETECTION_RE).findall(arg) if _result: result += _result @@ -961,7 +990,7 @@ def parse_phone_no(*args, store_unparseable=True, **kwargs): elif isinstance(arg, (set, list, tuple)): # Use recursion to handle the list of phone numbers result += parse_phone_no( - *arg, store_unparseable=store_unparseable) + *arg, store_unparseable=store_unparseable, prefix=prefix) return result @@ -1518,7 +1547,7 @@ def environ(*remove, **update): locale.setlocale(locale.LC_ALL, loc_orig) except locale.Error: - # Thrown in py3.6 + # Handle this case pass @@ -1589,3 +1618,146 @@ def _merge(dict1, dict2): _merge(dict1, dict2) return + + +def dir_size(path, max_depth=3, missing_okay=True, _depth=0, _errors=None): + """ + Scans a provided path an returns it's size (in bytes) of path provided + """ + + if _errors is None: + _errors = set() + + if _depth > max_depth: + _errors.add(path) + return (0, _errors) + + total = 0 + try: + with os.scandir(path) as it: + for entry in it: + try: + if entry.is_file(follow_symlinks=False): + total += entry.stat(follow_symlinks=False).st_size + + elif entry.is_dir(follow_symlinks=False): + (totals, _) = dir_size( + entry.path, + max_depth=max_depth, + _depth=_depth + 1, + _errors=_errors) + total += totals + + except FileNotFoundError: + # no worries; Nothing to do + continue + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + _errors.add(entry.path) + logger.warning( + 'dir_size detetcted inaccessible path: %s', + os.fsdecode(entry.path)) + logger.debug('dir_size Exception: %s' % str(e)) + continue + + except FileNotFoundError: + if not missing_okay: + # Conditional error situation + _errors.add(path) + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + _errors.add(path) + logger.warning( + 'dir_size detetcted inaccessible path: %s', + os.fsdecode(path)) + logger.debug('dir_size Exception: %s' % str(e)) + + return (total, _errors) + + +def bytes_to_str(value): + """ + Covert an integer (in bytes) into it's string representation with + acompanied unit value (such as B, KB, MB, GB, TB, etc) + """ + unit = 'B' + try: + value = float(value) + + except (ValueError, TypeError): + return None + + if value >= 1024.0: + value = value / 1024.0 + unit = 'KB' + if value >= 1024.0: + value = value / 1024.0 + unit = 'MB' + if value >= 1024.0: + value = value / 1024.0 + unit = 'GB' + if value >= 1024.0: + value = value / 1024.0 + unit = 'TB' + + return '%.2f%s' % (round(value, 2), unit) + + +def decode_b64_dict(di: dict) -> dict: + """ + decodes base64 dictionary previously encoded + + string entries prefixed with `b64:` are targeted + """ + di = copy.deepcopy(di) + for k, v in di.items(): + if not isinstance(v, str) or not v.startswith("b64:"): + continue + + try: + parsed_v = base64.b64decode(v[4:]) + parsed_v = json.loads(parsed_v) + + except (ValueError, TypeError, binascii.Error, + json.decoder.JSONDecodeError): + # ValueError: the length of altchars is not 2. + # TypeError: invalid input + # binascii.Error: not base64 (bad padding) + # json.decoder.JSONDecodeError: Bad JSON object + + parsed_v = v + di[k] = parsed_v + return di + + +def encode_b64_dict(di: dict, encoding='utf-8') -> typing.Tuple[dict, bool]: + """ + Encodes dictionary entries containing binary types (int, float) into base64 + + Final product is always string based values + """ + di = copy.deepcopy(di) + needs_decoding = False + for k, v in di.items(): + if isinstance(v, str): + continue + + try: + encoded = base64.urlsafe_b64encode(json.dumps(v).encode(encoding)) + encoded = "b64:{}".format(encoded.decode(encoding)) + needs_decoding = True + + except (ValueError, TypeError): + # ValueError: + # - the length of altchars is not 2. + # TypeError: + # - json not searializable or + # - bytes object not passed into urlsafe_b64encode() + encoded = str(v) + + di[k] = encoded + return di, needs_decoding diff --git a/libs/attr/__init__.py b/libs/attr/__init__.py index 9226258a2..51b1c2559 100644 --- a/libs/attr/__init__.py +++ b/libs/attr/__init__.py @@ -15,6 +15,7 @@ from ._make import ( NOTHING, Attribute, + Converter, Factory, attrib, attrs, @@ -39,6 +40,7 @@ class AttrsInstance(Protocol): __all__ = [ "Attribute", "AttrsInstance", + "Converter", "Factory", "NOTHING", "asdict", @@ -79,54 +81,21 @@ def _make_getattr(mod_name: str) -> Callable: """ def __getattr__(name: str) -> str: - dunder_to_metadata = { - "__title__": "Name", - "__copyright__": "", - "__version__": "version", - "__version_info__": "version", - "__description__": "summary", - "__uri__": "", - "__url__": "", - "__author__": "", - "__email__": "", - "__license__": "license", - } - if name not in dunder_to_metadata: + if name not in ("__version__", "__version_info__"): msg = f"module {mod_name} has no attribute {name}" raise AttributeError(msg) - import sys - import warnings - - if sys.version_info < (3, 8): - from importlib_metadata import metadata - else: + try: from importlib.metadata import metadata - - if name not in ("__version__", "__version_info__"): - warnings.warn( - f"Accessing {mod_name}.{name} is deprecated and will be " - "removed in a future release. Use importlib.metadata directly " - "to query for attrs's packaging metadata.", - DeprecationWarning, - stacklevel=2, - ) + except ImportError: + from importlib_metadata import metadata meta = metadata("attrs") - if name == "__license__": - return "MIT" - if name == "__copyright__": - return "Copyright (c) 2015 Hynek Schlawack" - if name in ("__uri__", "__url__"): - return meta["Project-URL"].split(" ", 1)[-1] + if name == "__version_info__": return VersionInfo._from_version_string(meta["version"]) - if name == "__author__": - return meta["Author-email"].rsplit(" ", 1)[0] - if name == "__email__": - return meta["Author-email"].rsplit("<", 1)[1][:-1] - return meta[dunder_to_metadata[name]] + return meta["version"] return __getattr__ diff --git a/libs/attr/__init__.pyi b/libs/attr/__init__.pyi index 37a208732..6ae0a83de 100644 --- a/libs/attr/__init__.pyi +++ b/libs/attr/__init__.pyi @@ -4,17 +4,11 @@ import sys from typing import ( Any, Callable, - Dict, Generic, - List, Mapping, - Optional, Protocol, Sequence, - Tuple, - Type, TypeVar, - Union, overload, ) @@ -27,6 +21,20 @@ from . import validators as validators from ._cmp import cmp_using as cmp_using from ._typing_compat import AttrsInstance_ from ._version_info import VersionInfo +from attrs import ( + define as define, + field as field, + mutable as mutable, + frozen as frozen, + _EqOrderType, + _ValidatorType, + _ConverterType, + _ReprArgType, + _OnSetAttrType, + _OnSetAttrArgType, + _FieldTransformer, + _ValidatorArgType, +) if sys.version_info >= (3, 10): from typing import TypeGuard @@ -52,23 +60,7 @@ __copyright__: str _T = TypeVar("_T") _C = TypeVar("_C", bound=type) -_EqOrderType = Union[bool, Callable[[Any], Any]] -_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] -_ConverterType = Callable[[Any], Any] _FilterType = Callable[["Attribute[_T]", _T], bool] -_ReprType = Callable[[Any], str] -_ReprArgType = Union[bool, _ReprType] -_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] -_OnSetAttrArgType = Union[ - _OnSetAttrType, List[_OnSetAttrType], setters._NoOpType -] -_FieldTransformer = Callable[ - [type, List["Attribute[Any]"]], List["Attribute[Any]"] -] -# FIXME: in reality, if multiple validators are passed they must be in a list -# or tuple, but those are invariant and so would prevent subtypes of -# _ValidatorType from working when passed in a list or tuple. -_ValidatorArgType = Union[_ValidatorType[_T], Sequence[_ValidatorType[_T]]] # We subclass this here to keep the protocol's qualified name clean. class AttrsInstance(AttrsInstance_, Protocol): @@ -108,22 +100,51 @@ else: takes_self: bool = ..., ) -> _T: ... +In = TypeVar("In") +Out = TypeVar("Out") + +class Converter(Generic[In, Out]): + @overload + def __init__(self, converter: Callable[[In], Out]) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance, Attribute], Out], + *, + takes_self: Literal[True], + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, Attribute], Out], + *, + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance], Out], + *, + takes_self: Literal[True], + ) -> None: ... + class Attribute(Generic[_T]): name: str - default: Optional[_T] - validator: Optional[_ValidatorType[_T]] + default: _T | None + validator: _ValidatorType[_T] | None repr: _ReprArgType cmp: _EqOrderType eq: _EqOrderType order: _EqOrderType - hash: Optional[bool] + hash: bool | None init: bool - converter: Optional[_ConverterType] - metadata: Dict[Any, Any] - type: Optional[Type[_T]] + converter: _ConverterType | Converter[Any, _T] | None + metadata: dict[Any, Any] + type: type[_T] | None kw_only: bool on_setattr: _OnSetAttrType - alias: Optional[str] + alias: str | None def evolve(self, **changes: Any) -> "Attribute[Any]": ... @@ -156,18 +177,18 @@ def attrib( default: None = ..., validator: None = ..., repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., + metadata: Mapping[Any, Any] | None = ..., type: None = ..., converter: None = ..., factory: None = ..., kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., ) -> Any: ... # This form catches an explicit None or no default and infers the type from the @@ -175,149 +196,70 @@ def attrib( @overload def attrib( default: None = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., + validator: _ValidatorArgType[_T] | None = ..., repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: Optional[Type[_T]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., ) -> _T: ... # This form catches an explicit default argument. @overload def attrib( default: _T, - validator: Optional[_ValidatorArgType[_T]] = ..., + validator: _ValidatorArgType[_T] | None = ..., repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: Optional[Type[_T]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., ) -> _T: ... # This form covers type=non-Type: e.g. forward references (str), Any @overload def attrib( - default: Optional[_T] = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., + metadata: Mapping[Any, Any] | None = ..., type: object = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., -) -> Any: ... -@overload -def field( - *, - default: None = ..., - validator: None = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., - type: Optional[type] = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def field( - *, - default: None = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., - type: Optional[type] = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def field( - *, - default: _T, - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., - type: Optional[type] = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def field( - *, - default: Optional[_T] = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - alias: Optional[str] = ..., - type: Optional[type] = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., ) -> Any: ... @overload @dataclass_transform(order_default=True, field_specifiers=(attrib, field)) def attrs( maybe_cls: _C, - these: Optional[Dict[str, Any]] = ..., - repr_ns: Optional[str] = ..., + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., init: bool = ..., slots: bool = ..., frozen: bool = ..., @@ -327,25 +269,25 @@ def attrs( kw_only: bool = ..., cache_hash: bool = ..., auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., auto_detect: bool = ..., collect_by_mro: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., match_args: bool = ..., - unsafe_hash: Optional[bool] = ..., + unsafe_hash: bool | None = ..., ) -> _C: ... @overload @dataclass_transform(order_default=True, field_specifiers=(attrib, field)) def attrs( maybe_cls: None = ..., - these: Optional[Dict[str, Any]] = ..., - repr_ns: Optional[str] = ..., + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., init: bool = ..., slots: bool = ..., frozen: bool = ..., @@ -355,131 +297,24 @@ def attrs( kw_only: bool = ..., cache_hash: bool = ..., auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., auto_detect: bool = ..., collect_by_mro: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., - unsafe_hash: Optional[bool] = ..., -) -> Callable[[_C], _C]: ... -@overload -@dataclass_transform(field_specifiers=(attrib, field)) -def define( - maybe_cls: _C, - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - unsafe_hash: Optional[bool] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@dataclass_transform(field_specifiers=(attrib, field)) -def define( - maybe_cls: None = ..., - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - unsafe_hash: Optional[bool] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> Callable[[_C], _C]: ... - -mutable = define - -@overload -@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) -def frozen( - maybe_cls: _C, - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - unsafe_hash: Optional[bool] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) -def frozen( - maybe_cls: None = ..., - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - unsafe_hash: Optional[bool] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., match_args: bool = ..., + unsafe_hash: bool | None = ..., ) -> Callable[[_C], _C]: ... -def fields(cls: Type[AttrsInstance]) -> Any: ... -def fields_dict(cls: Type[AttrsInstance]) -> Dict[str, Attribute[Any]]: ... +def fields(cls: type[AttrsInstance]) -> Any: ... +def fields_dict(cls: type[AttrsInstance]) -> dict[str, Attribute[Any]]: ... def validate(inst: AttrsInstance) -> None: ... def resolve_types( cls: _A, - globalns: Optional[Dict[str, Any]] = ..., - localns: Optional[Dict[str, Any]] = ..., - attribs: Optional[List[Attribute[Any]]] = ..., + globalns: dict[str, Any] | None = ..., + localns: dict[str, Any] | None = ..., + attribs: list[Attribute[Any]] | None = ..., include_extras: bool = ..., ) -> _A: ... @@ -488,13 +323,13 @@ def resolve_types( # [attr.ib()])` is valid def make_class( name: str, - attrs: Union[List[str], Tuple[str, ...], Dict[str, Any]], - bases: Tuple[type, ...] = ..., - class_body: Optional[Dict[str, Any]] = ..., - repr_ns: Optional[str] = ..., + attrs: list[str] | tuple[str, ...] | dict[str, Any], + bases: tuple[type, ...] = ..., + class_body: dict[str, Any] | None = ..., + repr_ns: str | None = ..., repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., init: bool = ..., slots: bool = ..., frozen: bool = ..., @@ -504,11 +339,11 @@ def make_class( kw_only: bool = ..., cache_hash: bool = ..., auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., collect_by_mro: bool = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., ) -> type: ... # _funcs -- @@ -522,24 +357,22 @@ def make_class( def asdict( inst: AttrsInstance, recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - dict_factory: Type[Mapping[Any, Any]] = ..., + filter: _FilterType[Any] | None = ..., + dict_factory: type[Mapping[Any, Any]] = ..., retain_collection_types: bool = ..., - value_serializer: Optional[ - Callable[[type, Attribute[Any], Any], Any] - ] = ..., - tuple_keys: Optional[bool] = ..., -) -> Dict[str, Any]: ... + value_serializer: Callable[[type, Attribute[Any], Any], Any] | None = ..., + tuple_keys: bool | None = ..., +) -> dict[str, Any]: ... # TODO: add support for returning NamedTuple from the mypy plugin def astuple( inst: AttrsInstance, recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - tuple_factory: Type[Sequence[Any]] = ..., + filter: _FilterType[Any] | None = ..., + tuple_factory: type[Sequence[Any]] = ..., retain_collection_types: bool = ..., -) -> Tuple[Any, ...]: ... -def has(cls: type) -> TypeGuard[Type[AttrsInstance]]: ... +) -> tuple[Any, ...]: ... +def has(cls: type) -> TypeGuard[type[AttrsInstance]]: ... def assoc(inst: _T, **changes: Any) -> _T: ... def evolve(inst: _T, **changes: Any) -> _T: ... diff --git a/libs/attr/_cmp.py b/libs/attr/_cmp.py index a4a35e08f..f367bb3a7 100644 --- a/libs/attr/_cmp.py +++ b/libs/attr/_cmp.py @@ -26,21 +26,31 @@ def cmp_using( The resulting class will have a full set of ordering methods if at least one of ``{lt, le, gt, ge}`` and ``eq`` are provided. - :param Optional[callable] eq: `callable` used to evaluate equality of two - objects. - :param Optional[callable] lt: `callable` used to evaluate whether one - object is less than another object. - :param Optional[callable] le: `callable` used to evaluate whether one - object is less than or equal to another object. - :param Optional[callable] gt: `callable` used to evaluate whether one - object is greater than another object. - :param Optional[callable] ge: `callable` used to evaluate whether one - object is greater than or equal to another object. - - :param bool require_same_type: When `True`, equality and ordering methods - will return `NotImplemented` if objects are not of the same type. - - :param Optional[str] class_name: Name of class. Defaults to 'Comparable'. + Args: + eq (typing.Callable | None): + Callable used to evaluate equality of two objects. + + lt (typing.Callable | None): + Callable used to evaluate whether one object is less than another + object. + + le (typing.Callable | None): + Callable used to evaluate whether one object is less than or equal + to another object. + + gt (typing.Callable | None): + Callable used to evaluate whether one object is greater than + another object. + + ge (typing.Callable | None): + Callable used to evaluate whether one object is greater than or + equal to another object. + + require_same_type (bool): + When `True`, equality and ordering methods will return + `NotImplemented` if objects are not of the same type. + + class_name (str | None): Name of class. Defaults to "Comparable". See `comparison` for more details. diff --git a/libs/attr/_cmp.pyi b/libs/attr/_cmp.pyi index f3dcdc1a7..cc7893b04 100644 --- a/libs/attr/_cmp.pyi +++ b/libs/attr/_cmp.pyi @@ -1,13 +1,13 @@ -from typing import Any, Callable, Optional, Type +from typing import Any, Callable _CompareWithType = Callable[[Any, Any], bool] def cmp_using( - eq: Optional[_CompareWithType] = ..., - lt: Optional[_CompareWithType] = ..., - le: Optional[_CompareWithType] = ..., - gt: Optional[_CompareWithType] = ..., - ge: Optional[_CompareWithType] = ..., + eq: _CompareWithType | None = ..., + lt: _CompareWithType | None = ..., + le: _CompareWithType | None = ..., + gt: _CompareWithType | None = ..., + ge: _CompareWithType | None = ..., require_same_type: bool = ..., class_name: str = ..., -) -> Type: ... +) -> type: ... diff --git a/libs/attr/_compat.py b/libs/attr/_compat.py index 46b05ca45..104eeb07e 100644 --- a/libs/attr/_compat.py +++ b/libs/attr/_compat.py @@ -12,8 +12,11 @@ PYPY = platform.python_implementation() == "PyPy" PY_3_8_PLUS = sys.version_info[:2] >= (3, 8) PY_3_9_PLUS = sys.version_info[:2] >= (3, 9) -PY310 = sys.version_info[:2] >= (3, 10) +PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) +PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) +PY_3_13_PLUS = sys.version_info[:2] >= (3, 13) +PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) if sys.version_info < (3, 8): @@ -24,6 +27,19 @@ else: from typing import Protocol # noqa: F401 +if PY_3_14_PLUS: # pragma: no cover + import annotationlib + + _get_annotations = annotationlib.get_annotations + +else: + + def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + return cls.__dict__.get("__annotations__", {}) + class _AnnotationExtractor: """ diff --git a/libs/attr/_funcs.py b/libs/attr/_funcs.py index a888991d9..355cef442 100644 --- a/libs/attr/_funcs.py +++ b/libs/attr/_funcs.py @@ -4,7 +4,7 @@ import copy from ._compat import PY_3_9_PLUS, get_generic_base -from ._make import NOTHING, _obj_setattr, fields +from ._make import _OBJ_SETATTR, NOTHING, fields from .exceptions import AttrsAttributeNotFoundError @@ -21,34 +21,44 @@ def asdict( Optionally recurse into other *attrs*-decorated classes. - :param inst: Instance of an *attrs*-decorated class. - :param bool recurse: Recurse into classes that are also - *attrs*-decorated. - :param callable filter: A callable whose return code determines whether an - attribute or element is included (``True``) or dropped (``False``). Is - called with the `attrs.Attribute` as the first argument and the - value as the second argument. - :param callable dict_factory: A callable to produce dictionaries from. For - example, to produce ordered dictionaries instead of normal Python - dictionaries, pass in ``collections.OrderedDict``. - :param bool retain_collection_types: Do not convert to ``list`` when - encountering an attribute whose type is ``tuple`` or ``set``. Only - meaningful if ``recurse`` is ``True``. - :param Optional[callable] value_serializer: A hook that is called for every - attribute or dict key/value. It receives the current instance, field - and value and must return the (updated) value. The hook is run *after* - the optional *filter* has been applied. - - :rtype: return type of *dict_factory* - - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class. + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + dict_factory (~typing.Callable): + A callable to produce dictionaries from. For example, to produce + ordered dictionaries instead of normal Python dictionaries, pass in + ``collections.OrderedDict``. + + retain_collection_types (bool): + Do not convert to `list` when encountering an attribute whose type + is `tuple` or `set`. Only meaningful if *recurse* is `True`. + + value_serializer (typing.Callable | None): + A hook that is called for every attribute or dict key/value. It + receives the current instance, field and value and must return the + (updated) value. The hook is run *after* the optional *filter* has + been applied. + + Returns: + Return type of *dict_factory*. + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. .. versionadded:: 16.0.0 *dict_factory* .. versionadded:: 16.1.0 *retain_collection_types* .. versionadded:: 20.3.0 *value_serializer* - .. versionadded:: 21.3.0 If a dict has a collection for a key, it is - serialized as a tuple. + .. versionadded:: 21.3.0 + If a dict has a collection for a key, it is serialized as a tuple. """ attrs = fields(inst.__class__) rv = dict_factory() @@ -206,24 +216,33 @@ def astuple( Optionally recurse into other *attrs*-decorated classes. - :param inst: Instance of an *attrs*-decorated class. - :param bool recurse: Recurse into classes that are also - *attrs*-decorated. - :param callable filter: A callable whose return code determines whether an - attribute or element is included (``True``) or dropped (``False``). Is - called with the `attrs.Attribute` as the first argument and the - value as the second argument. - :param callable tuple_factory: A callable to produce tuples from. For - example, to produce lists instead of tuples. - :param bool retain_collection_types: Do not convert to ``list`` - or ``dict`` when encountering an attribute which type is - ``tuple``, ``dict`` or ``set``. Only meaningful if ``recurse`` is - ``True``. - - :rtype: return type of *tuple_factory* - - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class. + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): + Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + tuple_factory (~typing.Callable): + A callable to produce tuples from. For example, to produce lists + instead of tuples. + + retain_collection_types (bool): + Do not convert to `list` or `dict` when encountering an attribute + which type is `tuple`, `dict` or `set`. Only meaningful if + *recurse* is `True`. + + Returns: + Return type of *tuple_factory* + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. .. versionadded:: 16.2.0 """ @@ -248,15 +267,17 @@ def astuple( elif isinstance(v, (tuple, list, set, frozenset)): cf = v.__class__ if retain is True else list items = [ - astuple( - j, - recurse=True, - filter=filter, - tuple_factory=tuple_factory, - retain_collection_types=retain, + ( + astuple( + j, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(j.__class__) + else j ) - if has(j.__class__) - else j for j in v ] try: @@ -272,20 +293,24 @@ def astuple( rv.append( df( ( - astuple( - kk, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(kk.__class__) - else kk, - astuple( - vv, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(vv.__class__) - else vv, + ( + astuple( + kk, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(kk.__class__) + else kk + ), + ( + astuple( + vv, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(vv.__class__) + else vv + ), ) for kk, vv in v.items() ) @@ -302,10 +327,14 @@ def has(cls): """ Check whether *cls* is a class with *attrs* attributes. - :param type cls: Class to introspect. - :raise TypeError: If *cls* is not a class. + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. - :rtype: bool + Returns: + bool: """ attrs = getattr(cls, "__attrs_attrs__", None) if attrs is not None: @@ -334,20 +363,25 @@ def assoc(inst, **changes): .. _`edge cases`: https://github.com/python-attrs/attrs/issues/251 - :param inst: Instance of a class with *attrs* attributes. - :param changes: Keyword changes in the new copy. + Args: + inst: Instance of a class with *attrs* attributes. + + changes: Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. - :return: A copy of inst with *changes* incorporated. + Raises: + attrs.exceptions.AttrsAttributeNotFoundError: + If *attr_name* couldn't be found on *cls*. - :raise attrs.exceptions.AttrsAttributeNotFoundError: If *attr_name* - couldn't be found on *cls*. - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class. + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. .. deprecated:: 17.1.0 - Use `attrs.evolve` instead if you can. - This function will not be removed du to the slightly different approach - compared to `attrs.evolve`. + Use `attrs.evolve` instead if you can. This function will not be + removed du to the slightly different approach compared to + `attrs.evolve`, though. """ new = copy.copy(inst) attrs = fields(inst.__class__) @@ -356,7 +390,7 @@ def assoc(inst, **changes): if a is NOTHING: msg = f"{k} is not an attrs attribute on {new.__class__}." raise AttrsAttributeNotFoundError(msg) - _obj_setattr(new, k, v) + _OBJ_SETATTR(new, k, v) return new @@ -365,15 +399,24 @@ def evolve(*args, **changes): Create a new instance, based on the first positional argument with *changes* applied. - :param inst: Instance of a class with *attrs* attributes. - :param changes: Keyword changes in the new copy. + Args: - :return: A copy of inst with *changes* incorporated. + inst: + Instance of a class with *attrs* attributes. *inst* must be passed + as a positional argument. - :raise TypeError: If *attr_name* couldn't be found in the class - ``__init__``. - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class. + changes: + Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + TypeError: + If *attr_name* couldn't be found in the class ``__init__``. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. .. versionadded:: 17.1.0 .. deprecated:: 23.1.0 @@ -381,30 +424,16 @@ def evolve(*args, **changes): *inst*. It will raise a warning until at least April 2024, after which it will become an error. Always pass the instance as a positional argument. + .. versionchanged:: 24.1.0 + *inst* can't be passed as a keyword argument anymore. """ - # Try to get instance by positional argument first. - # Use changes otherwise and warn it'll break. - if args: - try: - (inst,) = args - except ValueError: - msg = f"evolve() takes 1 positional argument, but {len(args)} were given" - raise TypeError(msg) from None - else: - try: - inst = changes.pop("inst") - except KeyError: - msg = "evolve() missing 1 required positional argument: 'inst'" - raise TypeError(msg) from None - - import warnings - - warnings.warn( - "Passing the instance per keyword argument is deprecated and " - "will stop working in, or after, April 2024.", - DeprecationWarning, - stacklevel=2, + try: + (inst,) = args + except ValueError: + msg = ( + f"evolve() takes 1 positional argument, but {len(args)} were given" ) + raise TypeError(msg) from None cls = inst.__class__ attrs = fields(cls) @@ -425,40 +454,50 @@ def resolve_types( """ Resolve any strings and forward annotations in type annotations. - This is only required if you need concrete types in `Attribute`'s *type* - field. In other words, you don't need to resolve your types if you only - use them for static type checking. + This is only required if you need concrete types in :class:`Attribute`'s + *type* field. In other words, you don't need to resolve your types if you + only use them for static type checking. With no arguments, names will be looked up in the module in which the class - was created. If this is not what you want, e.g. if the name only exists - inside a method, you may pass *globalns* or *localns* to specify other - dictionaries in which to look up these names. See the docs of + was created. If this is not what you want, for example, if the name only + exists inside a method, you may pass *globalns* or *localns* to specify + other dictionaries in which to look up these names. See the docs of `typing.get_type_hints` for more details. - :param type cls: Class to resolve. - :param Optional[dict] globalns: Dictionary containing global variables. - :param Optional[dict] localns: Dictionary containing local variables. - :param Optional[list] attribs: List of attribs for the given class. - This is necessary when calling from inside a ``field_transformer`` - since *cls* is not an *attrs* class yet. - :param bool include_extras: Resolve more accurately, if possible. - Pass ``include_extras`` to ``typing.get_hints``, if supported by the - typing module. On supported Python versions (3.9+), this resolves the - types more accurately. - - :raise TypeError: If *cls* is not a class. - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class and you didn't pass any attribs. - :raise NameError: If types cannot be resolved because of missing variables. - - :returns: *cls* so you can use this function also as a class decorator. - Please note that you have to apply it **after** `attrs.define`. That - means the decorator has to come in the line **before** `attrs.define`. + Args: + cls (type): Class to resolve. + + globalns (dict | None): Dictionary containing global variables. + + localns (dict | None): Dictionary containing local variables. + + attribs (list | None): + List of attribs for the given class. This is necessary when calling + from inside a ``field_transformer`` since *cls* is not an *attrs* + class yet. + + include_extras (bool): + Resolve more accurately, if possible. Pass ``include_extras`` to + ``typing.get_hints``, if supported by the typing module. On + supported Python versions (3.9+), this resolves the types more + accurately. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class and you didn't pass any attribs. + + NameError: If types cannot be resolved because of missing variables. + + Returns: + *cls* so you can use this function also as a class decorator. Please + note that you have to apply it **after** `attrs.define`. That means the + decorator has to come in the line **before** `attrs.define`. .. versionadded:: 20.1.0 .. versionadded:: 21.1.0 *attribs* .. versionadded:: 23.1.0 *include_extras* - """ # Since calling get_type_hints is expensive we cache whether we've # done it already. @@ -474,7 +513,7 @@ class and you didn't pass any attribs. for field in fields(cls) if attribs is None else attribs: if field.name in hints: # Since fields have been frozen we must work around it. - _obj_setattr(field, "type", hints[field.name]) + _OBJ_SETATTR(field, "type", hints[field.name]) # We store the class we resolved so that subclasses know they haven't # been resolved. cls.__attrs_types_resolved__ = cls diff --git a/libs/attr/_make.py b/libs/attr/_make.py index 10b4eca77..bf00c5f8c 100644 --- a/libs/attr/_make.py +++ b/libs/attr/_make.py @@ -1,5 +1,8 @@ # SPDX-License-Identifier: MIT +from __future__ import annotations + +import abc import contextlib import copy import enum @@ -17,9 +20,11 @@ # having the thread-local in the globals here. from . import _compat, _config, setters from ._compat import ( - PY310, PY_3_8_PLUS, + PY_3_10_PLUS, + PY_3_11_PLUS, _AnnotationExtractor, + _get_annotations, get_generic_base, ) from .exceptions import ( @@ -31,10 +36,9 @@ # This is used at least twice, so cache it here. -_obj_setattr = object.__setattr__ -_init_converter_pat = "__attr_converter_%s" -_init_factory_pat = "__attr_factory_%s" -_classvar_prefixes = ( +_OBJ_SETATTR = object.__setattr__ +_INIT_FACTORY_PAT = "__attr_factory_%s" +_CLASSVAR_PREFIXES = ( "typing.ClassVar", "t.ClassVar", "ClassVar", @@ -43,19 +47,19 @@ # we don't use a double-underscore prefix because that triggers # name mangling when trying to create a slot for the field # (when slots=True) -_hash_cache_field = "_attrs_cached_hash" +_HASH_CACHE_FIELD = "_attrs_cached_hash" -_empty_metadata_singleton = types.MappingProxyType({}) +_EMPTY_METADATA_SINGLETON = types.MappingProxyType({}) # Unique object for unequivocal getattr() defaults. -_sentinel = object() +_SENTINEL = object() -_ng_default_on_setattr = setters.pipe(setters.convert, setters.validate) +_DEFAULT_ON_SETATTR = setters.pipe(setters.convert, setters.validate) class _Nothing(enum.Enum): """ - Sentinel to indicate the lack of a value when ``None`` is ambiguous. + Sentinel to indicate the lack of a value when `None` is ambiguous. If extending attrs, you can use ``typing.Literal[NOTHING]`` to show that a value may be ``NOTHING``. @@ -75,7 +79,7 @@ def __bool__(self): NOTHING = _Nothing.NOTHING """ -Sentinel to indicate the lack of a value when ``None`` is ambiguous. +Sentinel to indicate the lack of a value when `None` is ambiguous. """ @@ -84,7 +88,7 @@ class _CacheHashWrapper(int): An integer subclass that pickles / copies as None This is used for non-slots classes with ``cache_hash=True``, to avoid - serializing a potentially (even likely) invalid hash value. Since ``None`` + serializing a potentially (even likely) invalid hash value. Since `None` is the default value for uncalculated hashes, whenever this is copied, the copy's value for the hash should automatically reset. @@ -113,137 +117,29 @@ def attrib( alias=None, ): """ - Create a new attribute on a class. - - .. warning:: - - Does *not* do anything unless the class is also decorated with `attr.s` - / `attrs.define` / and so on! - - Please consider using `attrs.field` in new code (``attr.ib`` will *never* - go away, though). - - :param default: A value that is used if an *attrs*-generated ``__init__`` - is used and no value is passed while instantiating or the attribute is - excluded using ``init=False``. - - If the value is an instance of `attrs.Factory`, its callable will be - used to construct a new value (useful for mutable data types like lists - or dicts). - - If a default is not set (or set manually to `attrs.NOTHING`), a value - *must* be supplied when instantiating; otherwise a `TypeError` will be - raised. - - The default can also be set using decorator notation as shown below. - - .. seealso:: `defaults` - - :param callable factory: Syntactic sugar for - ``default=attr.Factory(factory)``. - - :param validator: `callable` that is called by *attrs*-generated - ``__init__`` methods after the instance has been initialized. They - receive the initialized instance, the :func:`~attrs.Attribute`, and the - passed value. - - The return value is *not* inspected so the validator has to throw an - exception itself. - - If a `list` is passed, its items are treated as validators and must all - pass. - - Validators can be globally disabled and re-enabled using - `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. - - The validator can also be set using decorator notation as shown below. - - .. seealso:: :ref:`validators` - - :type validator: `callable` or a `list` of `callable`\\ s. - - :param repr: Include this attribute in the generated ``__repr__`` method. - If ``True``, include the attribute; if ``False``, omit it. By default, - the built-in ``repr()`` function is used. To override how the attribute - value is formatted, pass a ``callable`` that takes a single value and - returns a string. Note that the resulting string is used as-is, i.e. it - will be used directly *instead* of calling ``repr()`` (the default). - :type repr: a `bool` or a `callable` to use a custom function. - - :param eq: If ``True`` (default), include this attribute in the generated - ``__eq__`` and ``__ne__`` methods that check two instances for - equality. To override how the attribute value is compared, pass a - ``callable`` that takes a single value and returns the value to be - compared. - - .. seealso:: `comparison` - :type eq: a `bool` or a `callable`. - - :param order: If ``True`` (default), include this attributes in the - generated ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To - override how the attribute value is ordered, pass a ``callable`` that - takes a single value and returns the value to be ordered. - - .. seealso:: `comparison` - :type order: a `bool` or a `callable`. - - :param cmp: Setting *cmp* is equivalent to setting *eq* and *order* to the - same value. Must not be mixed with *eq* or *order*. + Create a new field / attribute on a class. - .. seealso:: `comparison` - :type cmp: a `bool` or a `callable`. + Identical to `attrs.field`, except it's not keyword-only. - :param bool | None hash: Include this attribute in the generated - ``__hash__`` method. If ``None`` (default), mirror *eq*'s value. This - is the correct behavior according the Python spec. Setting this value - to anything else than ``None`` is *discouraged*. + Consider using `attrs.field` in new code (``attr.ib`` will *never* go away, + though). - .. seealso:: `hashing` - :param bool init: Include this attribute in the generated ``__init__`` - method. It is possible to set this to ``False`` and set a default - value. In that case this attributed is unconditionally initialized - with the specified default value or factory. - - .. seealso:: `init` - :param callable converter: `callable` that is called by *attrs*-generated - ``__init__`` methods to convert attribute's value to the desired - format. It is given the passed-in value, and the returned value will - be used as the new value of the attribute. The value is converted - before being passed to the validator, if any. + .. warning:: - .. seealso:: :ref:`converters` - :param dict | None metadata: An arbitrary mapping, to be used by - third-party components. See `extending-metadata`. + Does **nothing** unless the class is also decorated with + `attr.s` (or similar)! - :param type: The type of the attribute. Nowadays, the preferred method to - specify the type is using a variable annotation (see :pep:`526`). This - argument is provided for backward compatibility. Regardless of the - approach used, the type will be stored on ``Attribute.type``. - - Please note that *attrs* doesn't do anything with this metadata by - itself. You can use it as part of your own code or for `static type - checking `. - :param bool kw_only: Make this attribute keyword-only in the generated - ``__init__`` (if ``init`` is ``False``, this parameter is ignored). - :param on_setattr: Allows to overwrite the *on_setattr* setting from - `attr.s`. If left `None`, the *on_setattr* value from `attr.s` is used. - Set to `attrs.setters.NO_OP` to run **no** `setattr` hooks for this - attribute -- regardless of the setting in `attr.s`. - :type on_setattr: `callable`, or a list of callables, or `None`, or - `attrs.setters.NO_OP` - :param str | None alias: Override this attribute's parameter name in the - generated ``__init__`` method. If left `None`, default to ``name`` - stripped of leading underscores. See `private-attributes`. .. versionadded:: 15.2.0 *convert* .. versionadded:: 16.3.0 *metadata* .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. .. versionchanged:: 17.1.0 - *hash* is ``None`` and therefore mirrors *eq* by default. + *hash* is `None` and therefore mirrors *eq* by default. .. versionadded:: 17.3.0 *type* .. deprecated:: 17.4.0 *convert* - .. versionadded:: 17.4.0 *converter* as a replacement for the deprecated - *convert* to achieve consistency with other noun-based arguments. + .. versionadded:: 17.4.0 + *converter* as a replacement for the deprecated *convert* to achieve + consistency with other noun-based arguments. .. versionadded:: 18.1.0 ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. .. versionadded:: 18.2.0 *kw_only* @@ -312,17 +208,18 @@ def attrib( def _compile_and_eval(script, globs, locs=None, filename=""): """ - "Exec" the script with the given global (globs) and local (locs) variables. + Evaluate the script with the given global (globs) and local (locs) + variables. """ bytecode = compile(script, filename, "exec") eval(bytecode, globs, locs) -def _make_method(name, script, filename, globs): +def _make_method(name, script, filename, globs, locals=None): """ Create the method with the script given and return the method object. """ - locs = {} + locs = {} if locals is None else locals # In order of debuggers like PDB being able to step through the code, # we add a fake linecache entry. @@ -403,33 +300,14 @@ def _is_class_var(annot): if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): annot = annot[1:-1] - return annot.startswith(_classvar_prefixes) + return annot.startswith(_CLASSVAR_PREFIXES) def _has_own_attribute(cls, attrib_name): """ Check whether *cls* defines *attrib_name* (and doesn't just inherit it). """ - attr = getattr(cls, attrib_name, _sentinel) - if attr is _sentinel: - return False - - for base_cls in cls.__mro__[1:]: - a = getattr(base_cls, attrib_name, None) - if attr is a: - return False - - return True - - -def _get_annotations(cls): - """ - Get annotations for *cls*. - """ - if _has_own_attribute(cls, "__annotations__"): - return cls.__annotations__ - - return {} + return attrib_name in cls.__dict__ def _collect_base_attrs(cls, taken_attr_names): @@ -499,8 +377,8 @@ def _transform_attrs( If *these* is passed, use that and don't look for them on the class. - *collect_by_mro* is True, collect them in the correct MRO order, otherwise - use the old -- incorrect -- order. See #428. + If *collect_by_mro* is True, collect them in the correct MRO order, + otherwise use the old -- incorrect -- order. See #428. Return an `_Attributes`. """ @@ -600,15 +478,11 @@ def _transform_attrs( return _Attributes((AttrsClass(attrs), base_attrs, base_attr_map)) -def _make_cached_property_getattr( - cached_properties, - original_getattr, - cls, -): +def _make_cached_property_getattr(cached_properties, original_getattr, cls): lines = [ # Wrapped to get `__class__` into closure cell for super() # (It will be replaced with the newly constructed class after construction). - "def wrapper():", + "def wrapper(_cls):", " __class__ = _cls", " def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):", " func = cached_properties.get(item)", @@ -625,8 +499,12 @@ def _make_cached_property_getattr( else: lines.extend( [ - " if hasattr(super(), '__getattr__'):", - " return super().__getattr__(item)", + " try:", + " return super().__getattribute__(item)", + " except AttributeError:", + " if not hasattr(super(), '__getattr__'):", + " raise", + " return super().__getattr__(item)", " original_error = f\"'{self.__class__.__name__}' object has no attribute '{item}'\"", " raise AttributeError(original_error)", ] @@ -635,7 +513,7 @@ def _make_cached_property_getattr( lines.extend( [ " return __getattr__", - "__getattr__ = wrapper()", + "__getattr__ = wrapper(_cls)", ] ) @@ -643,8 +521,7 @@ def _make_cached_property_getattr( glob = { "cached_properties": cached_properties, - "_cached_setattr_get": _obj_setattr.__get__, - "_cls": cls, + "_cached_setattr_get": _OBJ_SETATTR.__get__, "original_getattr": original_getattr, } @@ -653,6 +530,9 @@ def _make_cached_property_getattr( "\n".join(lines), unique_filename, glob, + locals={ + "_cls": cls, + }, ) @@ -764,7 +644,7 @@ def __init__( self._wrote_own_setattr = True elif on_setattr in ( - _ng_default_on_setattr, + _DEFAULT_ON_SETATTR, setters.validate, setters.convert, ): @@ -779,7 +659,7 @@ def __init__( break if ( ( - on_setattr == _ng_default_on_setattr + on_setattr == _DEFAULT_ON_SETATTR and not (has_validator or has_converter) ) or (on_setattr == setters.validate and not has_validator) @@ -799,34 +679,28 @@ def __init__( def __repr__(self): return f"<_ClassBuilder(cls={self._cls.__name__})>" - if PY310: - import abc - - def build_class(self): - """ - Finalize class based on the accumulated configuration. - - Builder cannot be used after calling this method. - """ - if self._slots is True: - return self._create_slots_class() - - return self.abc.update_abstractmethods( - self._patch_original_class() - ) - - else: + def build_class(self): + """ + Finalize class based on the accumulated configuration. - def build_class(self): - """ - Finalize class based on the accumulated configuration. + Builder cannot be used after calling this method. + """ + if self._slots is True: + cls = self._create_slots_class() + else: + cls = self._patch_original_class() + if PY_3_10_PLUS: + cls = abc.update_abstractmethods(cls) - Builder cannot be used after calling this method. - """ - if self._slots is True: - return self._create_slots_class() + # The method gets only called if it's not inherited from a base class. + # _has_own_attribute does NOT work properly for classmethods. + if ( + getattr(cls, "__attrs_init_subclass__", None) + and "__attrs_init_subclass__" not in cls.__dict__ + ): + cls.__attrs_init_subclass__() - return self._patch_original_class() + return cls def _patch_original_class(self): """ @@ -840,7 +714,7 @@ def _patch_original_class(self): for name in self._attr_names: if ( name not in base_names - and getattr(cls, name, _sentinel) is not _sentinel + and getattr(cls, name, _SENTINEL) is not _SENTINEL ): # An AttributeError can happen if a base class defines a # class variable and we want to set an attribute with the @@ -860,7 +734,7 @@ def _patch_original_class(self): cls.__attrs_own_setattr__ = False if not self._has_custom_setattr: - cls.__setattr__ = _obj_setattr + cls.__setattr__ = _OBJ_SETATTR return cls @@ -888,7 +762,7 @@ def _create_slots_class(self): if not self._has_custom_setattr: for base_cls in self._cls.__bases__: if base_cls.__dict__.get("__attrs_own_setattr__", False): - cd["__setattr__"] = _obj_setattr + cd["__setattr__"] = _OBJ_SETATTR break # Traverse the MRO to collect existing slots @@ -931,15 +805,13 @@ def _create_slots_class(self): # To know to update them. additional_closure_functions_to_update = [] if cached_properties: - # Add cached properties to names for slotting. - names += tuple(cached_properties.keys()) - - for name in cached_properties: - # Clear out function from class to avoid clashing. - del cd[name] - class_annotations = _get_annotations(self._cls) for name, func in cached_properties.items(): + # Add cached properties to names for slotting. + names += (name,) + # Clear out function from class to avoid clashing. + del cd[name] + additional_closure_functions_to_update.append(func) annotation = inspect.signature(func).return_annotation if annotation is not inspect.Parameter.empty: class_annotations[name] = annotation @@ -968,7 +840,7 @@ def _create_slots_class(self): slot_names = [name for name in slot_names if name not in reused_slots] cd.update(reused_slots) if self._cache_hash: - slot_names.append(_hash_cache_field) + slot_names.append(_HASH_CACHE_FIELD) cd["__slots__"] = tuple(slot_names) @@ -1049,7 +921,7 @@ def slots_setstate(self, state): """ Automatically created by attrs. """ - __bound_setattr = _obj_setattr.__get__(self) + __bound_setattr = _OBJ_SETATTR.__get__(self) if isinstance(state, tuple): # Backward compatibility with attrs instances pickled with # attrs versions before v22.2.0 which stored tuples. @@ -1065,7 +937,7 @@ def slots_setstate(self, state): # indicate that the first call to __hash__ should be a cache # miss. if hash_caching_enabled: - __bound_setattr(_hash_cache_field, None) + __bound_setattr(_HASH_CACHE_FIELD, None) return slots_getstate, slots_setstate @@ -1179,7 +1051,7 @@ def __setattr__(self, name, val): else: nval = hook(self, a, val) - _obj_setattr(self, name, nval) + _OBJ_SETATTR(self, name, nval) self._cls_dict["__attrs_own_setattr__"] = True self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) @@ -1333,238 +1205,28 @@ def attrs( A class decorator that adds :term:`dunder methods` according to the specified attributes using `attr.ib` or the *these* argument. - Please consider using `attrs.define` / `attrs.frozen` in new code - (``attr.s`` will *never* go away, though). - - :param these: A dictionary of name to `attr.ib` mappings. This is useful - to avoid the definition of your attributes within the class body - because you can't (e.g. if you want to add ``__repr__`` methods to - Django models) or don't want to. - - If *these* is not ``None``, *attrs* will *not* search the class body - for attributes and will *not* remove any attributes from it. - - The order is deduced from the order of the attributes inside *these*. - - :type these: `dict` of `str` to `attr.ib` - - :param str repr_ns: When using nested classes, there's no way in Python 2 - to automatically detect that. Therefore it's possible to set the - namespace explicitly for a more meaningful ``repr`` output. - :param bool auto_detect: Instead of setting the *init*, *repr*, *eq*, - *order*, and *hash* arguments explicitly, assume they are set to - ``True`` **unless any** of the involved methods for one of the - arguments is implemented in the *current* class (i.e. it is *not* - inherited from some base class). - - So for example by implementing ``__eq__`` on a class yourself, *attrs* - will deduce ``eq=False`` and will create *neither* ``__eq__`` *nor* - ``__ne__`` (but Python classes come with a sensible ``__ne__`` by - default, so it *should* be enough to only implement ``__eq__`` in most - cases). - - .. warning:: - - If you prevent *attrs* from creating the ordering methods for you - (``order=False``, e.g. by implementing ``__le__``), it becomes - *your* responsibility to make sure its ordering is sound. The best - way is to use the `functools.total_ordering` decorator. - - - Passing ``True`` or ``False`` to *init*, *repr*, *eq*, *order*, *cmp*, - or *hash* overrides whatever *auto_detect* would determine. - - :param bool repr: Create a ``__repr__`` method with a human readable - representation of *attrs* attributes.. - :param bool str: Create a ``__str__`` method that is identical to - ``__repr__``. This is usually not necessary except for `Exception`\ s. - :param bool | None eq: If ``True`` or ``None`` (default), add ``__eq__`` - and ``__ne__`` methods that check two instances for equality. - - They compare the instances as if they were tuples of their *attrs* - attributes if and only if the types of both classes are *identical*! - - .. seealso:: `comparison` - :param bool | None order: If ``True``, add ``__lt__``, ``__le__``, - ``__gt__``, and ``__ge__`` methods that behave like *eq* above and - allow instances to be ordered. If ``None`` (default) mirror value of - *eq*. - - .. seealso:: `comparison` - :param bool | None cmp: Setting *cmp* is equivalent to setting *eq* and - *order* to the same value. Must not be mixed with *eq* or *order*. - - .. seealso:: `comparison` - :param bool | None unsafe_hash: If ``None`` (default), the ``__hash__`` - method is generated according how *eq* and *frozen* are set. - - 1. If *both* are True, *attrs* will generate a ``__hash__`` for you. - 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set to - None, marking it unhashable (which it is). - 3. If *eq* is False, ``__hash__`` will be left untouched meaning the - ``__hash__`` method of the base class will be used (if base class is - ``object``, this means it will fall back to id-based hashing.). - - Although not recommended, you can decide for yourself and force *attrs* - to create one (e.g. if the class is immutable even though you didn't - freeze it programmatically) by passing ``True`` or not. Both of these - cases are rather special and should be used carefully. - - .. seealso:: - - - Our documentation on `hashing`, - - Python's documentation on `object.__hash__`, - - and the `GitHub issue that led to the default \ - behavior `_ for - more details. - - :param bool | None hash: Alias for *unsafe_hash*. *unsafe_hash* takes - precedence. - :param bool init: Create a ``__init__`` method that initializes the *attrs* - attributes. Leading underscores are stripped for the argument name. If - a ``__attrs_pre_init__`` method exists on the class, it will be called - before the class is initialized. If a ``__attrs_post_init__`` method - exists on the class, it will be called after the class is fully - initialized. - - If ``init`` is ``False``, an ``__attrs_init__`` method will be injected - instead. This allows you to define a custom ``__init__`` method that - can do pre-init work such as ``super().__init__()``, and then call - ``__attrs_init__()`` and ``__attrs_post_init__()``. - - .. seealso:: `init` - :param bool slots: Create a :term:`slotted class ` that's - more memory-efficient. Slotted classes are generally superior to the - default dict classes, but have some gotchas you should know about, so - we encourage you to read the :term:`glossary entry `. - :param bool frozen: Make instances immutable after initialization. If - someone attempts to modify a frozen instance, - `attrs.exceptions.FrozenInstanceError` is raised. - - .. note:: - - 1. This is achieved by installing a custom ``__setattr__`` method - on your class, so you can't implement your own. - - 2. True immutability is impossible in Python. - - 3. This *does* have a minor a runtime performance `impact - ` when initializing new instances. In other words: - ``__init__`` is slightly slower with ``frozen=True``. - - 4. If a class is frozen, you cannot modify ``self`` in - ``__attrs_post_init__`` or a self-written ``__init__``. You can - circumvent that limitation by using ``object.__setattr__(self, - "attribute_name", value)``. - - 5. Subclasses of a frozen class are frozen too. - - :param bool weakref_slot: Make instances weak-referenceable. This has no - effect unless ``slots`` is also enabled. - :param bool auto_attribs: If ``True``, collect :pep:`526`-annotated - attributes from the class body. - - In this case, you **must** annotate every field. If *attrs* encounters - a field that is set to an `attr.ib` but lacks a type annotation, an - `attr.exceptions.UnannotatedAttributeError` is raised. Use - ``field_name: typing.Any = attr.ib(...)`` if you don't want to set a - type. - - If you assign a value to those attributes (e.g. ``x: int = 42``), that - value becomes the default value like if it were passed using - ``attr.ib(default=42)``. Passing an instance of `attrs.Factory` also - works as expected in most cases (see warning below). - - Attributes annotated as `typing.ClassVar`, and attributes that are - neither annotated nor set to an `attr.ib` are **ignored**. - - .. warning:: - For features that use the attribute name to create decorators (e.g. - :ref:`validators `), you still *must* assign `attr.ib` - to them. Otherwise Python will either not find the name or try to - use the default value to call e.g. ``validator`` on it. - - These errors can be quite confusing and probably the most common bug - report on our bug tracker. - - :param bool kw_only: Make all attributes keyword-only in the generated - ``__init__`` (if ``init`` is ``False``, this parameter is ignored). - :param bool cache_hash: Ensure that the object's hash code is computed only - once and stored on the object. If this is set to ``True``, hashing - must be either explicitly or implicitly enabled for this class. If the - hash code is cached, avoid any reassignments of fields involved in hash - code computation or mutations of the objects those fields point to - after object creation. If such changes occur, the behavior of the - object's hash code is undefined. - :param bool auto_exc: If the class subclasses `BaseException` (which - implicitly includes any subclass of any exception), the following - happens to behave like a well-behaved Python exceptions class: - - - the values for *eq*, *order*, and *hash* are ignored and the - instances compare and hash by the instance's ids (N.B. *attrs* will - *not* remove existing implementations of ``__hash__`` or the equality - methods. It just won't add own ones.), - - all attributes that are either passed into ``__init__`` or have a - default value are additionally available as a tuple in the ``args`` - attribute, - - the value of *str* is ignored leaving ``__str__`` to base classes. - :param bool collect_by_mro: Setting this to `True` fixes the way *attrs* - collects attributes from base classes. The default behavior is - incorrect in certain cases of multiple inheritance. It should be on by - default but is kept off for backward-compatibility. - - .. seealso:: - Issue `#428 `_ - - :param bool | None getstate_setstate: - .. note:: - This is usually only interesting for slotted classes and you should - probably just set *auto_detect* to `True`. - - If `True`, ``__getstate__`` and ``__setstate__`` are generated and - attached to the class. This is necessary for slotted classes to be - pickleable. If left `None`, it's `True` by default for slotted classes - and ``False`` for dict classes. - - If *auto_detect* is `True`, and *getstate_setstate* is left `None`, and - **either** ``__getstate__`` or ``__setstate__`` is detected directly on - the class (i.e. not inherited), it is set to `False` (this is usually - what you want). - - :param on_setattr: A callable that is run whenever the user attempts to set - an attribute (either by assignment like ``i.x = 42`` or by using - `setattr` like ``setattr(i, "x", 42)``). It receives the same arguments - as validators: the instance, the attribute that is being modified, and - the new value. - - If no exception is raised, the attribute is set to the return value of - the callable. - - If a list of callables is passed, they're automatically wrapped in an - `attrs.setters.pipe`. - :type on_setattr: `callable`, or a list of callables, or `None`, or - `attrs.setters.NO_OP` - - :param callable | None field_transformer: - A function that is called with the original class object and all fields - right before *attrs* finalizes the class. You can use this, e.g., to - automatically add converters or validators to fields based on their - types. - - .. seealso:: `transform-fields` - - :param bool match_args: - If `True` (default), set ``__match_args__`` on the class to support - :pep:`634` (Structural Pattern Matching). It is a tuple of all - non-keyword-only ``__init__`` parameter names on Python 3.10 and later. - Ignored on older Python versions. + Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will + *never* go away, though). + + Args: + repr_ns (str): + When using nested classes, there was no way in Python 2 to + automatically detect that. This argument allows to set a custom + name for a more meaningful ``repr`` output. This argument is + pointless in Python 3 and is therefore deprecated. + + .. caution:: + Refer to `attrs.define` for the rest of the parameters, but note that they + can have different defaults. + + Notably, leaving *on_setattr* as `None` will **not** add any hooks. .. versionadded:: 16.0.0 *slots* .. versionadded:: 16.1.0 *frozen* .. versionadded:: 16.3.0 *str* .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. .. versionchanged:: 17.1.0 - *hash* supports ``None`` as value which is also the default now. + *hash* supports `None` as value which is also the default now. .. versionadded:: 17.3.0 *auto_attribs* .. versionchanged:: 18.1.0 If *these* is passed, no attributes are deleted from the class body. @@ -1595,10 +1257,29 @@ def attrs( .. versionadded:: 21.3.0 *match_args* .. versionadded:: 22.2.0 *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). - """ + .. deprecated:: 24.1.0 *repr_ns* + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + """ + if repr_ns is not None: + import warnings + + warnings.warn( + DeprecationWarning( + "The `repr_ns` argument is deprecated and will be removed in or after August 2025." + ), + stacklevel=2, + ) + eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) - # unsafe_hash takes precedence due to PEP 681. + # unsafe_hash takes precedence due to PEP 681. if unsafe_hash is not None: hash = unsafe_hash @@ -1699,7 +1380,7 @@ def wrap(cls): raise TypeError(msg) if ( - PY310 + PY_3_10_PLUS and match_args and not _has_own_attribute(cls, "__match_args__") ): @@ -1708,7 +1389,7 @@ def wrap(cls): return builder.build_class() # maybe_cls's type depends on the usage of the decorator. It's a class - # if it's used as `@attrs` but ``None`` if used as `@attrs()`. + # if it's used as `@attrs` but `None` if used as `@attrs()`. if maybe_cls is None: return wrap @@ -1793,17 +1474,17 @@ def append_hash_computation_lines(prefix, indent): method_lines.append(indent + " " + closing_braces) if cache_hash: - method_lines.append(tab + f"if self.{_hash_cache_field} is None:") + method_lines.append(tab + f"if self.{_HASH_CACHE_FIELD} is None:") if frozen: append_hash_computation_lines( - f"object.__setattr__(self, '{_hash_cache_field}', ", tab * 2 + f"object.__setattr__(self, '{_HASH_CACHE_FIELD}', ", tab * 2 ) method_lines.append(tab * 2 + ")") # close __setattr__ else: append_hash_computation_lines( - f"self.{_hash_cache_field} = ", tab * 2 + f"self.{_HASH_CACHE_FIELD} = ", tab * 2 ) - method_lines.append(tab + f"return self.{_hash_cache_field}") + method_lines.append(tab + f"return self.{_HASH_CACHE_FIELD}") else: append_hash_computation_lines("return ", tab) @@ -1856,20 +1537,20 @@ def _make_eq(cls, attrs): globs = {} if attrs: lines.append(" return (") - others = [" ) == ("] for a in attrs: if a.eq_key: cmp_name = f"_{a.name}_key" # Add the key function to the global namespace # of the evaluated function. globs[cmp_name] = a.eq_key - lines.append(f" {cmp_name}(self.{a.name}),") - others.append(f" {cmp_name}(other.{a.name}),") + lines.append( + f" {cmp_name}(self.{a.name}) == {cmp_name}(other.{a.name})" + ) else: - lines.append(f" self.{a.name},") - others.append(f" other.{a.name},") - - lines += [*others, " )"] + lines.append(f" self.{a.name} == other.{a.name}") + if a is not attrs[-1]: + lines[-1] = f"{lines[-1]} and" + lines.append(" )") else: lines.append(" return True") @@ -2022,13 +1703,17 @@ def fields(cls): The tuple also allows accessing the fields by their names (see below for examples). - :param type cls: Class to introspect. + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. - :raise TypeError: If *cls* is not a class. - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class. + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. - :rtype: tuple (with name accessors) of `attrs.Attribute` + Returns: + tuple (with name accessors) of `attrs.Attribute` .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields by name. @@ -2059,16 +1744,20 @@ def fields(cls): def fields_dict(cls): """ - Return an ordered dictionary of *attrs* attributes for a class, whose - keys are the attribute names. + Return an ordered dictionary of *attrs* attributes for a class, whose keys + are the attribute names. + + Args: + cls (type): Class to introspect. - :param type cls: Class to introspect. + Raises: + TypeError: If *cls* is not a class. - :raise TypeError: If *cls* is not a class. - :raise attrs.exceptions.NotAnAttrsClassError: If *cls* is not an *attrs* - class. + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. - :rtype: dict + Returns: + dict[str, attrs.Attribute]: Dict of attribute name to definition .. versionadded:: 18.1.0 """ @@ -2088,7 +1777,8 @@ def validate(inst): Leaves all exceptions through. - :param inst: Instance of a class with *attrs* attributes. + Args: + inst: Instance of a class with *attrs* attributes. """ if _config._run_validators is False: return @@ -2099,15 +1789,12 @@ def validate(inst): v(inst, a, getattr(inst, a.name)) -def _is_slot_cls(cls): - return "__slots__" in cls.__dict__ - - def _is_slot_attr(a_name, base_attr_map): """ Check if the attribute name comes from a slot class. """ - return a_name in base_attr_map and _is_slot_cls(base_attr_map[a_name]) + cls = base_attr_map.get(a_name) + return cls and "__slots__" in cls.__dict__ def _make_init( @@ -2165,7 +1852,7 @@ def _make_init( is_exc, needs_cached_setattr, has_cls_on_setattr, - attrs_init, + "__attrs_init__" if attrs_init else "__init__", ) if cls.__module__ in sys.modules: # This makes typing.get_type_hints(CLS.__init__) resolve string types. @@ -2176,7 +1863,7 @@ def _make_init( if needs_cached_setattr: # Save the lookup overhead in __init__ if we need to circumvent # setattr hooks. - globs["_cached_setattr_get"] = _obj_setattr.__get__ + globs["_cached_setattr_get"] = _OBJ_SETATTR.__get__ init = _make_method( "__attrs_init__" if attrs_init else "__init__", @@ -2189,26 +1876,24 @@ def _make_init( return init -def _setattr(attr_name, value_var, has_on_setattr): +def _setattr(attr_name: str, value_var: str, has_on_setattr: bool) -> str: """ Use the cached object.setattr to set *attr_name* to *value_var*. """ return f"_setattr('{attr_name}', {value_var})" -def _setattr_with_converter(attr_name, value_var, has_on_setattr): +def _setattr_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: """ Use the cached object.setattr to set *attr_name* to *value_var*, but run its converter first. """ - return "_setattr('%s', %s(%s))" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) + return f"_setattr('{attr_name}', {converter._fmt_converter_call(attr_name, value_var)})" -def _assign(attr_name, value, has_on_setattr): +def _assign(attr_name: str, value: str, has_on_setattr: bool) -> str: """ Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise relegate to _setattr. @@ -2219,90 +1904,100 @@ def _assign(attr_name, value, has_on_setattr): return f"self.{attr_name} = {value}" -def _assign_with_converter(attr_name, value_var, has_on_setattr): +def _assign_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: """ Unless *attr_name* has an on_setattr hook, use normal assignment after conversion. Otherwise relegate to _setattr_with_converter. """ if has_on_setattr: - return _setattr_with_converter(attr_name, value_var, True) + return _setattr_with_converter(attr_name, value_var, True, converter) - return "self.%s = %s(%s)" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) + return f"self.{attr_name} = {converter._fmt_converter_call(attr_name, value_var)}" -def _attrs_to_init_script( - attrs, - frozen, - slots, - pre_init, - pre_init_has_args, - post_init, - cache_hash, - base_attr_map, - is_exc, - needs_cached_setattr, - has_cls_on_setattr, - attrs_init, +def _determine_setters( + frozen: bool, slots: bool, base_attr_map: dict[str, type] ): """ - Return a script of an initializer for *attrs* and a dict of globals. + Determine the correct setter functions based on whether a class is frozen + and/or slotted. + """ + if frozen is True: + if slots is True: + return (), _setattr, _setattr_with_converter + + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + + def fmt_setter( + attr_name: str, value_var: str, has_on_setattr: bool + ) -> str: + if _is_slot_attr(attr_name, base_attr_map): + return _setattr(attr_name, value_var, has_on_setattr) + + return f"_inst_dict['{attr_name}'] = {value_var}" + + def fmt_setter_with_converter( + attr_name: str, + value_var: str, + has_on_setattr: bool, + converter: Converter, + ) -> str: + if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): + return _setattr_with_converter( + attr_name, value_var, has_on_setattr, converter + ) - The globals are expected by the generated script. + return f"_inst_dict['{attr_name}'] = {converter._fmt_converter_call(attr_name, value_var)}" - If *frozen* is True, we cannot set the attributes directly so we use - a cached ``object.__setattr__``. - """ - lines = [] - if pre_init: - lines.append("self.__attrs_pre_init__()") + return ( + ("_inst_dict = self.__dict__",), + fmt_setter, + fmt_setter_with_converter, + ) + + # Not frozen -- we can just assign directly. + return (), _assign, _assign_with_converter + + +def _attrs_to_init_script( + attrs: list[Attribute], + is_frozen: bool, + is_slotted: bool, + call_pre_init: bool, + pre_init_has_args: bool, + call_post_init: bool, + does_cache_hash: bool, + base_attr_map: dict[str, type], + is_exc: bool, + needs_cached_setattr: bool, + has_cls_on_setattr: bool, + method_name: str, +) -> tuple[str, dict, dict]: + """ + Return a script of an initializer for *attrs*, a dict of globals, and + annotations for the initializer. + + The globals are required by the generated script. + """ + lines = ["self.__attrs_pre_init__()"] if call_pre_init else [] if needs_cached_setattr: lines.append( # Circumvent the __setattr__ descriptor to save one lookup per - # assignment. - # Note _setattr will be used again below if cache_hash is True + # assignment. Note _setattr will be used again below if + # does_cache_hash is True. "_setattr = _cached_setattr_get(self)" ) - if frozen is True: - if slots is True: - fmt_setter = _setattr - fmt_setter_with_converter = _setattr_with_converter - else: - # Dict frozen classes assign directly to __dict__. - # But only if the attribute doesn't come from an ancestor slot - # class. - # Note _inst_dict will be used again below if cache_hash is True - lines.append("_inst_dict = self.__dict__") - - def fmt_setter(attr_name, value_var, has_on_setattr): - if _is_slot_attr(attr_name, base_attr_map): - return _setattr(attr_name, value_var, has_on_setattr) - - return f"_inst_dict['{attr_name}'] = {value_var}" - - def fmt_setter_with_converter( - attr_name, value_var, has_on_setattr - ): - if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): - return _setattr_with_converter( - attr_name, value_var, has_on_setattr - ) - - return "_inst_dict['%s'] = %s(%s)" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) - - else: - # Not frozen. - fmt_setter = _assign - fmt_setter_with_converter = _assign_with_converter + extra_lines, fmt_setter, fmt_setter_with_converter = _determine_setters( + is_frozen, is_slotted, base_attr_map + ) + lines.extend(extra_lines) args = [] kw_only_args = [] @@ -2328,19 +2023,26 @@ def fmt_setter_with_converter( has_factory = isinstance(a.default, Factory) maybe_self = "self" if has_factory and a.default.takes_self else "" + if a.converter and not isinstance(a.converter, Converter): + converter = Converter(a.converter) + else: + converter = a.converter + if a.init is False: if has_factory: - init_factory_name = _init_factory_pat % (a.name,) - if a.converter is not None: + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: lines.append( fmt_setter_with_converter( attr_name, init_factory_name + f"({maybe_self})", has_on_setattr, + converter, ) ) - conv_name = _init_converter_pat % (a.name,) - names_for_globals[conv_name] = a.converter + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) else: lines.append( fmt_setter( @@ -2350,16 +2052,18 @@ def fmt_setter_with_converter( ) ) names_for_globals[init_factory_name] = a.default.factory - elif a.converter is not None: + elif converter is not None: lines.append( fmt_setter_with_converter( attr_name, f"attr_dict['{attr_name}'].default", has_on_setattr, + converter, ) ) - conv_name = _init_converter_pat % (a.name,) - names_for_globals[conv_name] = a.converter + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) else: lines.append( fmt_setter( @@ -2375,15 +2079,15 @@ def fmt_setter_with_converter( else: args.append(arg) - if a.converter is not None: + if converter is not None: lines.append( fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr + attr_name, arg_name, has_on_setattr, converter ) ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.converter + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) else: lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) @@ -2395,12 +2099,12 @@ def fmt_setter_with_converter( args.append(arg) lines.append(f"if {arg_name} is not NOTHING:") - init_factory_name = _init_factory_pat % (a.name,) - if a.converter is not None: + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: lines.append( " " + fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr + attr_name, arg_name, has_on_setattr, converter ) ) lines.append("else:") @@ -2410,11 +2114,12 @@ def fmt_setter_with_converter( attr_name, init_factory_name + "(" + maybe_self + ")", has_on_setattr, + converter, ) ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.converter + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) else: lines.append( " " + fmt_setter(attr_name, arg_name, has_on_setattr) @@ -2435,26 +2140,24 @@ def fmt_setter_with_converter( else: args.append(arg_name) - if a.converter is not None: + if converter is not None: lines.append( fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr + attr_name, arg_name, has_on_setattr, converter ) ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.converter + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) else: lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) if a.init is True: - if a.type is not None and a.converter is None: + if a.type is not None and converter is None: annotations[arg_name] = a.type - elif a.converter is not None: - # Try to get the type from the converter. - t = _AnnotationExtractor(a.converter).get_first_param_type() - if t: - annotations[arg_name] = t + elif converter is not None and converter._first_param_type: + # Use the type from the converter if present. + annotations[arg_name] = converter._first_param_type if attrs_to_validate: # we can skip this if there are no validators. names_for_globals["_config"] = _config @@ -2466,25 +2169,23 @@ def fmt_setter_with_converter( names_for_globals[val_name] = a.validator names_for_globals[attr_name] = a - if post_init: + if call_post_init: lines.append("self.__attrs_post_init__()") - # because this is set only after __attrs_post_init__ is called, a crash + # Because this is set only after __attrs_post_init__ is called, a crash # will result if post-init tries to access the hash code. This seemed - # preferable to setting this beforehand, in which case alteration to - # field values during post-init combined with post-init accessing the - # hash code would result in silent bugs. - if cache_hash: - if frozen: - if slots: # noqa: SIM108 - # if frozen and slots, then _setattr defined above - init_hash_cache = "_setattr('%s', %s)" + # preferable to setting this beforehand, in which case alteration to field + # values during post-init combined with post-init accessing the hash code + # would result in silent bugs. + if does_cache_hash: + if is_frozen: + if is_slotted: + init_hash_cache = f"_setattr('{_HASH_CACHE_FIELD}', None)" else: - # if frozen and not slots, then _inst_dict defined above - init_hash_cache = "_inst_dict['%s'] = %s" + init_hash_cache = f"_inst_dict['{_HASH_CACHE_FIELD}'] = None" else: - init_hash_cache = "self.%s = %s" - lines.append(init_hash_cache % (_hash_cache_field, "None")) + init_hash_cache = f"self.{_HASH_CACHE_FIELD} = None" + lines.append(init_hash_cache) # For exceptions we rely on BaseException.__init__ for proper # initialization. @@ -2496,29 +2197,28 @@ def fmt_setter_with_converter( args = ", ".join(args) pre_init_args = args if kw_only_args: - args += "%s*, %s" % ( - ", " if args else "", # leading comma - ", ".join(kw_only_args), # kw_only args - ) + # leading comma & kw_only args + args += f"{', ' if args else ''}*, {', '.join(kw_only_args)}" pre_init_kw_only_args = ", ".join( - ["%s=%s" % (kw_arg, kw_arg) for kw_arg in kw_only_args] + [ + f"{kw_arg_name}={kw_arg_name}" + # We need to remove the defaults from the kw_only_args. + for kw_arg_name in (kwa.split("=")[0] for kwa in kw_only_args) + ] ) - pre_init_args += ( - ", " if pre_init_args else "" - ) # handle only kwargs and no regular args + pre_init_args += ", " if pre_init_args else "" pre_init_args += pre_init_kw_only_args - if pre_init and pre_init_has_args: - # If pre init method has arguments, pass same arguments as `__init__` - lines[0] = "self.__attrs_pre_init__(%s)" % pre_init_args + if call_pre_init and pre_init_has_args: + # If pre init method has arguments, pass same arguments as `__init__`. + lines[0] = f"self.__attrs_pre_init__({pre_init_args})" + # Python 3.7 doesn't allow backslashes in f strings. + NL = "\n " return ( - "def %s(self, %s):\n %s\n" - % ( - ("__attrs_init__" if attrs_init else "__init__"), - args, - "\n ".join(lines) if lines else "pass", - ), + f"""def {method_name}(self, {args}): + {NL.join(lines) if lines else 'pass'} +""", names_for_globals, annotations, ) @@ -2543,20 +2243,19 @@ class Attribute: You should never instantiate this class yourself. - The class has *all* arguments of `attr.ib` (except for ``factory`` - which is only syntactic sugar for ``default=Factory(...)`` plus the - following: + The class has *all* arguments of `attr.ib` (except for ``factory`` which is + only syntactic sugar for ``default=Factory(...)`` plus the following: - ``name`` (`str`): The name of the attribute. - ``alias`` (`str`): The __init__ parameter name of the attribute, after any explicit overrides and default private-attribute-name handling. - ``inherited`` (`bool`): Whether or not that attribute has been inherited from a base class. - - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The callables - that are used for comparing and ordering objects by this attribute, - respectively. These are set by passing a callable to `attr.ib`'s ``eq``, - ``order``, or ``cmp`` arguments. See also :ref:`comparison customization - `. + - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The + callables that are used for comparing and ordering objects by this + attribute, respectively. These are set by passing a callable to + `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also + :ref:`comparison customization `. Instances of this class are frequently used for introspection purposes like: @@ -2625,7 +2324,7 @@ def __init__( ) # Cache this descriptor here to speed things up later. - bound_setattr = _obj_setattr.__get__(self) + bound_setattr = _OBJ_SETATTR.__get__(self) # Despite the big red warning, people *do* instantiate `Attribute` # themselves. @@ -2645,7 +2344,7 @@ def __init__( ( types.MappingProxyType(dict(metadata)) # Shallow copy if metadata - else _empty_metadata_singleton + else _EMPTY_METADATA_SINGLETON ), ) bound_setattr("type", type) @@ -2693,7 +2392,7 @@ def evolve(self, **changes): Copy *self* and apply *changes*. This works similarly to `attrs.evolve` but that function does not work - with `Attribute`. + with {class}`Attribute`. It is mainly meant to be used for `transform-fields`. @@ -2722,16 +2421,18 @@ def __setstate__(self, state): self._setattrs(zip(self.__slots__, state)) def _setattrs(self, name_values_pairs): - bound_setattr = _obj_setattr.__get__(self) + bound_setattr = _OBJ_SETATTR.__get__(self) for name, value in name_values_pairs: if name != "metadata": bound_setattr(name, value) else: bound_setattr( name, - types.MappingProxyType(dict(value)) - if value - else _empty_metadata_singleton, + ( + types.MappingProxyType(dict(value)) + if value + else _EMPTY_METADATA_SINGLETON + ), ) @@ -2896,7 +2597,8 @@ def default(self, meth): Returns *meth* unchanged. - :raises DefaultAlreadySetError: If default has been set before. + Raises: + DefaultAlreadySetError: If default has been set before. .. versionadded:: 17.1.0 """ @@ -2918,10 +2620,14 @@ class Factory: If passed as the default value to `attrs.field`, the factory is used to generate a new value. - :param callable factory: A callable that takes either none or exactly one - mandatory positional argument depending on *takes_self*. - :param bool takes_self: Pass the partially initialized instance that is - being initialized as a positional argument. + Args: + factory (typing.Callable): + A callable that takes either none or exactly one mandatory + positional argument depending on *takes_self*. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. .. versionadded:: 17.1.0 *takes_self* """ @@ -2965,30 +2671,153 @@ def __setstate__(self, state): Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) +class Converter: + """ + Stores a converter callable. + + Allows for the wrapped converter to take additional arguments. The + arguments are passed in the order they are documented. + + Args: + converter (Callable): A callable that converts the passed value. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. (default: `False`) + + takes_field (bool): + Pass the field definition (an :class:`Attribute`) into the + converter as a positional argument. (default: `False`) + + .. versionadded:: 24.1.0 + """ + + __slots__ = ( + "converter", + "takes_self", + "takes_field", + "_first_param_type", + "_global_name", + "__call__", + ) + + def __init__(self, converter, *, takes_self=False, takes_field=False): + self.converter = converter + self.takes_self = takes_self + self.takes_field = takes_field + + ex = _AnnotationExtractor(converter) + self._first_param_type = ex.get_first_param_type() + + if not (self.takes_self or self.takes_field): + self.__call__ = lambda value, _, __: self.converter(value) + elif self.takes_self and not self.takes_field: + self.__call__ = lambda value, instance, __: self.converter( + value, instance + ) + elif not self.takes_self and self.takes_field: + self.__call__ = lambda value, __, field: self.converter( + value, field + ) + else: + self.__call__ = lambda value, instance, field: self.converter( + value, instance, field + ) + + rt = ex.get_return_type() + if rt is not None: + self.__call__.__annotations__["return"] = rt + + @staticmethod + def _get_global_name(attr_name: str) -> str: + """ + Return the name that a converter for an attribute name *attr_name* + would have. + """ + return f"__attr_converter_{attr_name}" + + def _fmt_converter_call(self, attr_name: str, value_var: str) -> str: + """ + Return a string that calls the converter for an attribute name + *attr_name* and the value in variable named *value_var* according to + `self.takes_self` and `self.takes_field`. + """ + if not (self.takes_self or self.takes_field): + return f"{self._get_global_name(attr_name)}({value_var})" + + if self.takes_self and self.takes_field: + return f"{self._get_global_name(attr_name)}({value_var}, self, attr_dict['{attr_name}'])" + + if self.takes_self: + return f"{self._get_global_name(attr_name)}({value_var}, self)" + + return f"{self._get_global_name(attr_name)}({value_var}, attr_dict['{attr_name}'])" + + def __getstate__(self): + """ + Return a dict containing only converter and takes_self -- the rest gets + computed when loading. + """ + return { + "converter": self.converter, + "takes_self": self.takes_self, + "takes_field": self.takes_field, + } + + def __setstate__(self, state): + """ + Load instance from state. + """ + self.__init__(**state) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in ("converter", "takes_self", "takes_field") +] + +Converter = _add_hash( + _add_eq(_add_repr(Converter, attrs=_f), attrs=_f), attrs=_f +) + + def make_class( name, attrs, bases=(object,), class_body=None, **attributes_arguments ): r""" A quick way to create a new class called *name* with *attrs*. - :param str name: The name for the new class. + Args: + name (str): The name for the new class. - :param attrs: A list of names or a dictionary of mappings of names to - `attr.ib`\ s / `attrs.field`\ s. + attrs( list | dict): + A list of names or a dictionary of mappings of names to `attr.ib`\ + s / `attrs.field`\ s. - The order is deduced from the order of the names or attributes inside - *attrs*. Otherwise the order of the definition of the attributes is - used. - :type attrs: `list` or `dict` + The order is deduced from the order of the names or attributes + inside *attrs*. Otherwise the order of the definition of the + attributes is used. - :param tuple bases: Classes that the new class will subclass. + bases (tuple[type, ...]): Classes that the new class will subclass. - :param dict class_body: An optional dictionary of class attributes for the new class. + class_body (dict): + An optional dictionary of class attributes for the new class. - :param attributes_arguments: Passed unmodified to `attr.s`. + attributes_arguments: Passed unmodified to `attr.s`. - :return: A new class with *attrs*. - :rtype: type + Returns: + type: A new class with *attrs*. .. versionadded:: 17.1.0 *bases* .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. @@ -3039,14 +2868,19 @@ def make_class( True, ) - return _attrs(these=cls_dict, **attributes_arguments)(type_) + cls = _attrs(these=cls_dict, **attributes_arguments)(type_) + # Only add type annotations now or "_attrs()" will complain: + cls.__annotations__ = { + k: v.type for k, v in cls_dict.items() if v.type is not None + } + return cls # These are required by within this module so we define them here and merely # import into .validators / .converters. -@attrs(slots=True, hash=True) +@attrs(slots=True, unsafe_hash=True) class _AndValidator: """ Compose many validators to a single one. @@ -3065,7 +2899,9 @@ def and_(*validators): When called on a value, it runs all wrapped validators. - :param callables validators: Arbitrary number of validators. + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. .. versionadded:: 17.1.0 """ @@ -3087,33 +2923,38 @@ def pipe(*converters): When called on a value, it runs all wrapped converters, returning the *last* value. - Type annotations will be inferred from the wrapped converters', if - they have any. + Type annotations will be inferred from the wrapped converters', if they + have any. - :param callables converters: Arbitrary number of converters. + converters (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of converters. .. versionadded:: 20.1.0 """ - def pipe_converter(val): - for converter in converters: - val = converter(val) + def pipe_converter(val, inst, field): + for c in converters: + val = c(val, inst, field) if isinstance(c, Converter) else c(val) return val if not converters: # If the converter list is empty, pipe_converter is the identity. A = typing.TypeVar("A") - pipe_converter.__annotations__ = {"val": A, "return": A} + pipe_converter.__annotations__.update({"val": A, "return": A}) else: # Get parameter type from first converter. t = _AnnotationExtractor(converters[0]).get_first_param_type() if t: pipe_converter.__annotations__["val"] = t + last = converters[-1] + if not PY_3_11_PLUS and isinstance(last, Converter): + last = last.__call__ + # Get return type from last converter. - rt = _AnnotationExtractor(converters[-1]).get_return_type() + rt = _AnnotationExtractor(last).get_return_type() if rt: pipe_converter.__annotations__["return"] = rt - return pipe_converter + return Converter(pipe_converter, takes_self=True, takes_field=True) diff --git a/libs/attr/_next_gen.py b/libs/attr/_next_gen.py index 1fb9f259b..dbb65cc97 100644 --- a/libs/attr/_next_gen.py +++ b/libs/attr/_next_gen.py @@ -12,9 +12,9 @@ from ._funcs import asdict as _asdict from ._funcs import astuple as _astuple from ._make import ( + _DEFAULT_ON_SETATTR, NOTHING, _frozen_setattrs, - _ng_default_on_setattr, attrib, attrs, ) @@ -46,44 +46,302 @@ def define( match_args=True, ): r""" - Define an *attrs* class. + A class decorator that adds :term:`dunder methods` according to + :term:`fields ` specified using :doc:`type annotations `, + `field()` calls, or the *these* argument. + + Since *attrs* patches or replaces an existing class, you cannot use + `object.__init_subclass__` with *attrs* classes, because it runs too early. + As a replacement, you can define ``__attrs_init_subclass__`` on your class. + It will be called by *attrs* classes that subclass it after they're + created. See also :ref:`init-subclass`. + + Args: + slots (bool): + Create a :term:`slotted class ` that's more + memory-efficient. Slotted classes are generally superior to the + default dict classes, but have some gotchas you should know about, + so we encourage you to read the :term:`glossary entry `. + + auto_detect (bool): + Instead of setting the *init*, *repr*, *eq*, and *hash* arguments + explicitly, assume they are set to True **unless any** of the + involved methods for one of the arguments is implemented in the + *current* class (meaning, it is *not* inherited from some base + class). + + So, for example by implementing ``__eq__`` on a class yourself, + *attrs* will deduce ``eq=False`` and will create *neither* + ``__eq__`` *nor* ``__ne__`` (but Python classes come with a + sensible ``__ne__`` by default, so it *should* be enough to only + implement ``__eq__`` in most cases). + + Passing True or False` to *init*, *repr*, *eq*, *cmp*, or *hash* + overrides whatever *auto_detect* would determine. + + auto_exc (bool): + If the class subclasses `BaseException` (which implicitly includes + any subclass of any exception), the following happens to behave + like a well-behaved Python exception class: + + - the values for *eq*, *order*, and *hash* are ignored and the + instances compare and hash by the instance's ids [#]_ , + - all attributes that are either passed into ``__init__`` or have a + default value are additionally available as a tuple in the + ``args`` attribute, + - the value of *str* is ignored leaving ``__str__`` to base + classes. + + .. [#] + Note that *attrs* will *not* remove existing implementations of + ``__hash__`` or the equality methods. It just won't add own + ones. + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + A callable that is run whenever the user attempts to set an + attribute (either by assignment like ``i.x = 42`` or by using + `setattr` like ``setattr(i, "x", 42)``). It receives the same + arguments as validators: the instance, the attribute that is being + modified, and the new value. + + If no exception is raised, the attribute is set to the return value + of the callable. + + If a list of callables is passed, they're automatically wrapped in + an `attrs.setters.pipe`. + + If left None, the default behavior is to run converters and + validators whenever an attribute is set. + + init (bool): + Create a ``__init__`` method that initializes the *attrs* + attributes. Leading underscores are stripped for the argument name, + unless an alias is set on the attribute. + + .. seealso:: + `init` shows advanced ways to customize the generated + ``__init__`` method, including executing code before and after. + + repr(bool): + Create a ``__repr__`` method with a human readable representation + of *attrs* attributes. + + str (bool): + Create a ``__str__`` method that is identical to ``__repr__``. This + is usually not necessary except for `Exception`\ s. + + eq (bool | None): + If True or None (default), add ``__eq__`` and ``__ne__`` methods + that check two instances for equality. + + .. seealso:: + `comparison` describes how to customize the comparison behavior + going as far comparing NumPy arrays. + + order (bool | None): + If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` + methods that behave like *eq* above and allow instances to be + ordered. + + They compare the instances as if they were tuples of their *attrs* + attributes if and only if the types of both classes are + *identical*. + + If `None` mirror value of *eq*. + + .. seealso:: `comparison` + + cmp (bool | None): + Setting *cmp* is equivalent to setting *eq* and *order* to the same + value. Must not be mixed with *eq* or *order*. + + unsafe_hash (bool | None): + If None (default), the ``__hash__`` method is generated according + how *eq* and *frozen* are set. + + 1. If *both* are True, *attrs* will generate a ``__hash__`` for + you. + 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set + to None, marking it unhashable (which it is). + 3. If *eq* is False, ``__hash__`` will be left untouched meaning + the ``__hash__`` method of the base class will be used. If the + base class is `object`, this means it will fall back to id-based + hashing. + + Although not recommended, you can decide for yourself and force + *attrs* to create one (for example, if the class is immutable even + though you didn't freeze it programmatically) by passing True or + not. Both of these cases are rather special and should be used + carefully. + + .. seealso:: + + - Our documentation on `hashing`, + - Python's documentation on `object.__hash__`, + - and the `GitHub issue that led to the default \ behavior + `_ for more + details. + + hash (bool | None): + Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence. + + cache_hash (bool): + Ensure that the object's hash code is computed only once and stored + on the object. If this is set to True, hashing must be either + explicitly or implicitly enabled for this class. If the hash code + is cached, avoid any reassignments of fields involved in hash code + computation or mutations of the objects those fields point to after + object creation. If such changes occur, the behavior of the + object's hash code is undefined. + + frozen (bool): + Make instances immutable after initialization. If someone attempts + to modify a frozen instance, `attrs.exceptions.FrozenInstanceError` + is raised. + + .. note:: + + 1. This is achieved by installing a custom ``__setattr__`` + method on your class, so you can't implement your own. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance `impact + ` when initializing new instances. In other + words: ``__init__`` is slightly slower with ``frozen=True``. - Differences to the classic `attr.s` that it uses underneath: + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You + can circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + 5. Subclasses of a frozen class are frozen too. + + kw_only (bool): + Make all attributes keyword-only in the generated ``__init__`` (if + *init* is False, this parameter is ignored). + + weakref_slot (bool): + Make instances weak-referenceable. This has no effect unless + *slots* is True. + + field_transformer (~typing.Callable | None): + A function that is called with the original class object and all + fields right before *attrs* finalizes the class. You can use this, + for example, to automatically add converters or validators to + fields based on their types. + + .. seealso:: `transform-fields` + + match_args (bool): + If True (default), set ``__match_args__`` on the class to support + :pep:`634` (*Structural Pattern Matching*). It is a tuple of all + non-keyword-only ``__init__`` parameter names on Python 3.10 and + later. Ignored on older Python versions. + + collect_by_mro (bool): + If True, *attrs* collects attributes from base classes correctly + according to the `method resolution order + `_. If False, *attrs* + will mimic the (wrong) behavior of `dataclasses` and :pep:`681`. + + See also `issue #428 + `_. + + getstate_setstate (bool | None): + .. note:: + + This is usually only interesting for slotted classes and you + should probably just set *auto_detect* to True. + + If True, ``__getstate__`` and ``__setstate__`` are generated and + attached to the class. This is necessary for slotted classes to be + pickleable. If left None, it's True by default for slotted classes + and False for dict classes. + + If *auto_detect* is True, and *getstate_setstate* is left None, and + **either** ``__getstate__`` or ``__setstate__`` is detected + directly on the class (meaning: not inherited), it is set to False + (this is usually what you want). + + auto_attribs (bool | None): + If True, look at type annotations to determine which attributes to + use, like `dataclasses`. If False, it will only look for explicit + :func:`field` class attributes, like classic *attrs*. + + If left None, it will guess: - - Automatically detect whether or not *auto_attribs* should be `True` (c.f. - *auto_attribs* parameter). - - Converters and validators run when attributes are set by default -- if - *frozen* is `False`. - - *slots=True* + 1. If any attributes are annotated and no unannotated + `attrs.field`\ s are found, it assumes *auto_attribs=True*. + 2. Otherwise it assumes *auto_attribs=False* and tries to collect + `attrs.field`\ s. - .. caution:: + If *attrs* decides to look at type annotations, **all** fields + **must** be annotated. If *attrs* encounters a field that is set to + a :func:`field` / `attr.ib` but lacks a type annotation, an + `attrs.exceptions.UnannotatedAttributeError` is raised. Use + ``field_name: typing.Any = field(...)`` if you don't want to set a + type. - Usually this has only upsides and few visible effects in everyday - programming. But it *can* lead to some surprising behaviors, so please - make sure to read :term:`slotted classes`. - - *auto_exc=True* - - *auto_detect=True* - - *order=False* - - Some options that were only relevant on Python 2 or were kept around for - backwards-compatibility have been removed. + .. warning:: - Please note that these are all defaults and you can change them as you - wish. + For features that use the attribute name to create decorators + (for example, :ref:`validators `), you still *must* + assign :func:`field` / `attr.ib` to them. Otherwise Python will + either not find the name or try to use the default value to + call, for example, ``validator`` on it. - :param Optional[bool] auto_attribs: If set to `True` or `False`, it behaves - exactly like `attr.s`. If left `None`, `attr.s` will try to guess: + Attributes annotated as `typing.ClassVar`, and attributes that are + neither annotated nor set to an `field()` are **ignored**. - 1. If any attributes are annotated and no unannotated `attrs.fields`\ s - are found, it assumes *auto_attribs=True*. - 2. Otherwise it assumes *auto_attribs=False* and tries to collect - `attrs.fields`\ s. + these (dict[str, object]): + A dictionary of name to the (private) return value of `field()` + mappings. This is useful to avoid the definition of your attributes + within the class body because you can't (for example, if you want + to add ``__repr__`` methods to Django models) or don't want to. - For now, please refer to `attr.s` for the rest of the parameters. + If *these* is not `None`, *attrs* will *not* search the class body + for attributes and will *not* remove any attributes from it. + + The order is deduced from the order of the attributes inside + *these*. + + Arguably, this is a rather obscure feature. .. versionadded:: 20.1.0 .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. .. versionadded:: 22.2.0 *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + + .. note:: + + The main differences to the classic `attr.s` are: + + - Automatically detect whether or not *auto_attribs* should be `True` + (c.f. *auto_attribs* parameter). + - Converters and validators run when attributes are set by default -- + if *frozen* is `False`. + - *slots=True* + + Usually, this has only upsides and few visible effects in everyday + programming. But it *can* lead to some surprising behaviors, so + please make sure to read :term:`slotted classes`. + + - *auto_exc=True* + - *auto_detect=True* + - *order=False* + - Some options that were only relevant on Python 2 or were kept around + for backwards-compatibility have been removed. + """ def do_it(cls, auto_attribs): @@ -124,7 +382,7 @@ def wrap(cls): # By default, mutable classes convert & validate on setattr. if frozen is False and on_setattr is None: - on_setattr = _ng_default_on_setattr + on_setattr = _DEFAULT_ON_SETATTR # However, if we subclass a frozen class, we inherit the immutability # and disable on_setattr. @@ -146,7 +404,7 @@ def wrap(cls): return do_it(cls, False) # maybe_cls's type depends on the usage of the decorator. It's a class - # if it's used as `@attrs` but ``None`` if used as `@attrs()`. + # if it's used as `@attrs` but `None` if used as `@attrs()`. if maybe_cls is None: return wrap @@ -175,13 +433,157 @@ def field( alias=None, ): """ - Identical to `attr.ib`, except keyword-only and with some arguments - removed. + Create a new :term:`field` / :term:`attribute` on a class. + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attrs.define` (or similar)! + + Args: + default: + A value that is used if an *attrs*-generated ``__init__`` is used + and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of `attrs.Factory`, its callable will + be used to construct a new value (useful for mutable data types + like lists or dicts). + + If a default is not set (or set manually to `attrs.NOTHING`), a + value *must* be supplied when instantiating; otherwise a + `TypeError` will be raised. + + .. seealso:: `defaults` + + factory (~typing.Callable): + Syntactic sugar for ``default=attr.Factory(factory)``. + + validator (~typing.Callable | list[~typing.Callable]): + Callable that is called by *attrs*-generated ``__init__`` methods + after the instance has been initialized. They receive the + initialized instance, the :func:`~attrs.Attribute`, and the passed + value. + + The return value is *not* inspected so the validator has to throw + an exception itself. + + If a `list` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. + + The validator can also be set using decorator notation as shown + below. + + .. seealso:: :ref:`validators` + + repr (bool | ~typing.Callable): + Include this attribute in the generated ``__repr__`` method. If + True, include the attribute; if False, omit it. By default, the + built-in ``repr()`` function is used. To override how the attribute + value is formatted, pass a ``callable`` that takes a single value + and returns a string. Note that the resulting string is used as-is, + which means it will be used directly *instead* of calling + ``repr()`` (the default). + + eq (bool | ~typing.Callable): + If True (default), include this attribute in the generated + ``__eq__`` and ``__ne__`` methods that check two instances for + equality. To override how the attribute value is compared, pass a + callable that takes a single value and returns the value to be + compared. + + .. seealso:: `comparison` + + order (bool | ~typing.Callable): + If True (default), include this attributes in the generated + ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To + override how the attribute value is ordered, pass a callable that + takes a single value and returns the value to be ordered. + + .. seealso:: `comparison` + + cmp(bool | ~typing.Callable): + Setting *cmp* is equivalent to setting *eq* and *order* to the same + value. Must not be mixed with *eq* or *order*. + .. seealso:: `comparison` + + hash (bool | None): + Include this attribute in the generated ``__hash__`` method. If + None (default), mirror *eq*'s value. This is the correct behavior + according the Python spec. Setting this value to anything else + than None is *discouraged*. + + .. seealso:: `hashing` + + init (bool): + Include this attribute in the generated ``__init__`` method. + + It is possible to set this to False and set a default value. In + that case this attributed is unconditionally initialized with the + specified default value or factory. + + .. seealso:: `init` + + converter (typing.Callable | Converter): + A callable that is called by *attrs*-generated ``__init__`` methods + to convert attribute's value to the desired format. + + If a vanilla callable is passed, it is given the passed-in value as + the only positional argument. It is possible to receive additional + arguments by wrapping the callable in a `Converter`. + + Either way, the returned value will be used as the new value of the + attribute. The value is converted before being passed to the + validator, if any. + + .. seealso:: :ref:`converters` + + metadata (dict | None): + An arbitrary mapping, to be used by third-party code. + + .. seealso:: `extending-metadata`. + + type (type): + The type of the attribute. Nowadays, the preferred method to + specify the type is using a variable annotation (see :pep:`526`). + This argument is provided for backwards-compatibility and for usage + with `make_class`. Regardless of the approach used, the type will + be stored on ``Attribute.type``. + + Please note that *attrs* doesn't do anything with this metadata by + itself. You can use it as part of your own code or for `static type + checking `. + + kw_only (bool): + Make this attribute keyword-only in the generated ``__init__`` (if + ``init`` is False, this parameter is ignored). + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + Allows to overwrite the *on_setattr* setting from `attr.s`. If left + None, the *on_setattr* value from `attr.s` is used. Set to + `attrs.setters.NO_OP` to run **no** `setattr` hooks for this + attribute -- regardless of the setting in `define()`. + + alias (str | None): + Override this attribute's parameter name in the generated + ``__init__`` method. If left None, default to ``name`` stripped + of leading underscores. See `private-attributes`. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionadded:: 22.2.0 *alias* .. versionadded:: 23.1.0 The *type* parameter has been re-added; mostly for `attrs.make_class`. Please note that type checkers ignore this metadata. - .. versionadded:: 20.1.0 + + .. seealso:: + + `attr.ib` """ return attrib( default=default, diff --git a/libs/attr/converters.py b/libs/attr/converters.py index 2bf4c902a..92383110a 100644 --- a/libs/attr/converters.py +++ b/libs/attr/converters.py @@ -22,13 +22,14 @@ def optional(converter): """ A converter that allows an attribute to be optional. An optional attribute - is one which can be set to ``None``. + is one which can be set to `None`. - Type annotations will be inferred from the wrapped converter's, if it - has any. + Type annotations will be inferred from the wrapped converter's, if it has + any. - :param callable converter: the converter that is used for non-``None`` - values. + Args: + converter (typing.Callable): + the converter that is used for non-`None` values. .. versionadded:: 17.1.0 """ @@ -53,19 +54,27 @@ def optional_converter(val): def default_if_none(default=NOTHING, factory=None): """ - A converter that allows to replace ``None`` values by *default* or the - result of *factory*. + A converter that allows to replace `None` values by *default* or the result + of *factory*. - :param default: Value to be used if ``None`` is passed. Passing an instance - of `attrs.Factory` is supported, however the ``takes_self`` option - is *not*. - :param callable factory: A callable that takes no parameters whose result - is used if ``None`` is passed. + Args: + default: + Value to be used if `None` is passed. Passing an instance of + `attrs.Factory` is supported, however the ``takes_self`` option is + *not*. - :raises TypeError: If **neither** *default* or *factory* is passed. - :raises TypeError: If **both** *default* and *factory* are passed. - :raises ValueError: If an instance of `attrs.Factory` is passed with - ``takes_self=True``. + factory (typing.Callable): + A callable that takes no parameters whose result is used if `None` + is passed. + + Raises: + TypeError: If **neither** *default* or *factory* is passed. + + TypeError: If **both** *default* and *factory* are passed. + + ValueError: + If an instance of `attrs.Factory` is passed with + ``takes_self=True``. .. versionadded:: 18.2.0 """ @@ -104,41 +113,39 @@ def default_if_none_converter(val): def to_bool(val): """ - Convert "boolean" strings (e.g., from env. vars.) to real booleans. + Convert "boolean" strings (for example, from environment variables) to real + booleans. - Values mapping to :code:`True`: + Values mapping to `True`: - - :code:`True` - - :code:`"true"` / :code:`"t"` - - :code:`"yes"` / :code:`"y"` - - :code:`"on"` - - :code:`"1"` - - :code:`1` + - ``True`` + - ``"true"`` / ``"t"`` + - ``"yes"`` / ``"y"`` + - ``"on"`` + - ``"1"`` + - ``1`` - Values mapping to :code:`False`: + Values mapping to `False`: - - :code:`False` - - :code:`"false"` / :code:`"f"` - - :code:`"no"` / :code:`"n"` - - :code:`"off"` - - :code:`"0"` - - :code:`0` + - ``False`` + - ``"false"`` / ``"f"`` + - ``"no"`` / ``"n"`` + - ``"off"`` + - ``"0"`` + - ``0`` - :raises ValueError: for any other value. + Raises: + ValueError: For any other value. .. versionadded:: 21.3.0 """ if isinstance(val, str): val = val.lower() - truthy = {True, "true", "t", "yes", "y", "on", "1", 1} - falsy = {False, "false", "f", "no", "n", "off", "0", 0} - try: - if val in truthy: - return True - if val in falsy: - return False - except TypeError: - # Raised when "val" is not hashable (e.g., lists) - pass - msg = f"Cannot convert value to bool: {val}" + + if val in (True, "true", "t", "yes", "y", "on", "1", 1): + return True + if val in (False, "false", "f", "no", "n", "off", "0", 0): + return False + + msg = f"Cannot convert value to bool: {val!r}" raise ValueError(msg) diff --git a/libs/attr/converters.pyi b/libs/attr/converters.pyi index 5abb49f6d..9ef478f21 100644 --- a/libs/attr/converters.pyi +++ b/libs/attr/converters.pyi @@ -1,6 +1,6 @@ from typing import Callable, TypeVar, overload -from . import _ConverterType +from attrs import _ConverterType _T = TypeVar("_T") diff --git a/libs/attr/filters.py b/libs/attr/filters.py index a1e40c98d..689b1705a 100644 --- a/libs/attr/filters.py +++ b/libs/attr/filters.py @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT """ -Commonly useful filters for `attr.asdict`. +Commonly useful filters for `attrs.asdict` and `attrs.astuple`. """ from ._make import Attribute @@ -20,13 +20,16 @@ def _split_what(what): def include(*what): """ - Include *what*. + Create a filter that only allows *what*. - :param what: What to include. - :type what: `list` of classes `type`, field names `str` or - `attrs.Attribute`\\ s + Args: + what (list[type, str, attrs.Attribute]): + What to include. Can be a type, a name, or an attribute. - :rtype: `callable` + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. .. versionchanged:: 23.1.0 Accept strings with field names. """ @@ -44,13 +47,16 @@ def include_(attribute, value): def exclude(*what): """ - Exclude *what*. + Create a filter that does **not** allow *what*. - :param what: What to exclude. - :type what: `list` of classes `type`, field names `str` or - `attrs.Attribute`\\ s. + Args: + what (list[type, str, attrs.Attribute]): + What to exclude. Can be a type, a name, or an attribute. - :rtype: `callable` + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. .. versionchanged:: 23.3.0 Accept field name string as input argument """ diff --git a/libs/attr/filters.pyi b/libs/attr/filters.pyi index 8a02fa0fc..974abdcdb 100644 --- a/libs/attr/filters.pyi +++ b/libs/attr/filters.pyi @@ -1,6 +1,6 @@ -from typing import Any, Union +from typing import Any from . import Attribute, _FilterType -def include(*what: Union[type, str, Attribute[Any]]) -> _FilterType[Any]: ... -def exclude(*what: Union[type, str, Attribute[Any]]) -> _FilterType[Any]: ... +def include(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... +def exclude(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... diff --git a/libs/attr/setters.py b/libs/attr/setters.py index 12ed6750d..a9ce01698 100644 --- a/libs/attr/setters.py +++ b/libs/attr/setters.py @@ -4,7 +4,6 @@ Commonly used hooks for on_setattr. """ - from . import _config from .exceptions import FrozenAttributeError @@ -56,18 +55,25 @@ def validate(instance, attrib, new_value): def convert(instance, attrib, new_value): """ - Run *attrib*'s converter -- if it has one -- on *new_value* and return the + Run *attrib*'s converter -- if it has one -- on *new_value* and return the result. .. versionadded:: 20.1.0 """ c = attrib.converter if c: - return c(new_value) + # This can be removed once we drop 3.8 and use attrs.Converter instead. + from ._make import Converter + + if not isinstance(c, Converter): + return c(new_value) + + return c(new_value, instance, attrib) return new_value # Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. -# autodata stopped working, so the docstring is inlined in the API docs. +# Sphinx's autodata stopped working, so the docstring is inlined in the API +# docs. NO_OP = object() diff --git a/libs/attr/setters.pyi b/libs/attr/setters.pyi index 72f7ce476..73abf36e7 100644 --- a/libs/attr/setters.pyi +++ b/libs/attr/setters.pyi @@ -1,6 +1,7 @@ from typing import Any, NewType, NoReturn, TypeVar -from . import Attribute, _OnSetAttrType +from . import Attribute +from attrs import _OnSetAttrType _T = TypeVar("_T") diff --git a/libs/attr/validators.py b/libs/attr/validators.py index 34d6b761d..8a56717df 100644 --- a/libs/attr/validators.py +++ b/libs/attr/validators.py @@ -35,7 +35,7 @@ "min_len", "not_", "optional", - "provides", + "or_", "set_disabled", ] @@ -46,8 +46,8 @@ def set_disabled(disabled): By default, they are run. - :param disabled: If ``True``, disable running all validators. - :type disabled: bool + Args: + disabled (bool): If `True`, disable running all validators. .. warning:: @@ -62,8 +62,8 @@ def get_disabled(): """ Return a bool indicating whether validators are currently disabled or not. - :return: ``True`` if validators are currently disabled. - :rtype: bool + Returns: + bool:`True` if validators are currently disabled. .. versionadded:: 21.3.0 """ @@ -88,7 +88,7 @@ def disabled(): set_run_validators(True) -@attrs(repr=False, slots=True, hash=True) +@attrs(repr=False, slots=True, unsafe_hash=True) class _InstanceOfValidator: type = attrib() @@ -97,12 +97,7 @@ def __call__(self, inst, attr, value): We use a callable class to be able to change the ``__repr__``. """ if not isinstance(value, self.type): - msg = "'{name}' must be {type!r} (got {value!r} that is a {actual!r}).".format( - name=attr.name, - type=self.type, - actual=value.__class__, - value=value, - ) + msg = f"'{attr.name}' must be {self.type!r} (got {value!r} that is a {value.__class__!r})." raise TypeError( msg, attr, @@ -116,16 +111,17 @@ def __repr__(self): def instance_of(type): """ - A validator that raises a `TypeError` if the initializer is called - with a wrong type for this particular attribute (checks are performed using + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using `isinstance` therefore it's also valid to pass a tuple of types). - :param type: The type to check for. - :type type: type or tuple of type + Args: + type (type | tuple[type]): The type to check for. - :raises TypeError: With a human readable error message, the attribute - (of type `attrs.Attribute`), the expected type, and the value it - got. + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. """ return _InstanceOfValidator(type) @@ -140,9 +136,7 @@ def __call__(self, inst, attr, value): We use a callable class to be able to change the ``__repr__``. """ if not self.match_func(value): - msg = "'{name}' must match regex {pattern!r} ({value!r} doesn't)".format( - name=attr.name, pattern=self.pattern.pattern, value=value - ) + msg = f"'{attr.name}' must match regex {self.pattern.pattern!r} ({value!r} doesn't)" raise ValueError( msg, attr, @@ -156,16 +150,21 @@ def __repr__(self): def matches_re(regex, flags=0, func=None): r""" - A validator that raises `ValueError` if the initializer is called - with a string that doesn't match *regex*. + A validator that raises `ValueError` if the initializer is called with a + string that doesn't match *regex*. + + Args: + regex (str, re.Pattern): + A regex string or precompiled pattern to match against - :param regex: a regex string or precompiled pattern to match against - :param int flags: flags that will be passed to the underlying re function - (default 0) - :param callable func: which underlying `re` function to call. Valid options - are `re.fullmatch`, `re.search`, and `re.match`; the default ``None`` - means `re.fullmatch`. For performance reasons, the pattern is always - precompiled using `re.compile`. + flags (int): + Flags that will be passed to the underlying re function (default 0) + + func (typing.Callable): + Which underlying `re` function to call. Valid options are + `re.fullmatch`, `re.search`, and `re.match`; the default `None` + means `re.fullmatch`. For performance reasons, the pattern is + always precompiled using `re.compile`. .. versionadded:: 19.2.0 .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. @@ -197,57 +196,7 @@ def matches_re(regex, flags=0, func=None): return _MatchesReValidator(pattern, match_func) -@attrs(repr=False, slots=True, hash=True) -class _ProvidesValidator: - interface = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.interface.providedBy(value): - msg = "'{name}' must provide {interface!r} which {value!r} doesn't.".format( - name=attr.name, interface=self.interface, value=value - ) - raise TypeError( - msg, - attr, - self.interface, - value, - ) - - def __repr__(self): - return f"" - - -def provides(interface): - """ - A validator that raises a `TypeError` if the initializer is called - with an object that does not provide the requested *interface* (checks are - performed using ``interface.providedBy(value)`` (see `zope.interface - `_). - - :param interface: The interface to check for. - :type interface: ``zope.interface.Interface`` - - :raises TypeError: With a human readable error message, the attribute - (of type `attrs.Attribute`), the expected interface, and the - value it got. - - .. deprecated:: 23.1.0 - """ - import warnings - - warnings.warn( - "attrs's zope-interface support is deprecated and will be removed in, " - "or after, April 2024.", - DeprecationWarning, - stacklevel=2, - ) - return _ProvidesValidator(interface) - - -@attrs(repr=False, slots=True, hash=True) +@attrs(repr=False, slots=True, unsafe_hash=True) class _OptionalValidator: validator = attrib() @@ -264,11 +213,13 @@ def __repr__(self): def optional(validator): """ A validator that makes an attribute optional. An optional attribute is one - which can be set to ``None`` in addition to satisfying the requirements of + which can be set to `None` in addition to satisfying the requirements of the sub-validator. - :param Callable | tuple[Callable] | list[Callable] validator: A validator - (or validators) that is used for non-``None`` values. + Args: + validator + (typing.Callable | tuple[typing.Callable] | list[typing.Callable]): + A validator (or validators) that is used for non-`None` values. .. versionadded:: 15.1.0 .. versionchanged:: 17.1.0 *validator* can be a list of validators. @@ -280,9 +231,10 @@ def optional(validator): return _OptionalValidator(validator) -@attrs(repr=False, slots=True, hash=True) +@attrs(repr=False, slots=True, unsafe_hash=True) class _InValidator: options = attrib() + _original_options = attrib(hash=False) def __call__(self, inst, attr, value): try: @@ -291,41 +243,54 @@ def __call__(self, inst, attr, value): in_options = False if not in_options: - msg = f"'{attr.name}' must be in {self.options!r} (got {value!r})" + msg = f"'{attr.name}' must be in {self._original_options!r} (got {value!r})" raise ValueError( msg, attr, - self.options, + self._original_options, value, ) def __repr__(self): - return f"" + return f"" def in_(options): """ - A validator that raises a `ValueError` if the initializer is called - with a value that does not belong in the options provided. The check is - performed using ``value in options``. + A validator that raises a `ValueError` if the initializer is called with a + value that does not belong in the *options* provided. - :param options: Allowed options. - :type options: list, tuple, `enum.Enum`, ... + The check is performed using ``value in options``, so *options* has to + support that operation. - :raises ValueError: With a human readable error message, the attribute (of - type `attrs.Attribute`), the expected options, and the value it - got. + To keep the validator hashable, dicts, lists, and sets are transparently + transformed into a `tuple`. + + Args: + options: Allowed options. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected options, and the value it got. .. versionadded:: 17.1.0 .. versionchanged:: 22.1.0 The ValueError was incomplete until now and only contained the human readable error message. Now it contains all the information that has been promised since 17.1.0. + .. versionchanged:: 24.1.0 + *options* that are a list, dict, or a set are now transformed into a + tuple to keep the validator hashable. """ - return _InValidator(options) + repr_options = options + if isinstance(options, (list, dict, set)): + options = tuple(options) + return _InValidator(options, repr_options) -@attrs(repr=False, slots=False, hash=True) + +@attrs(repr=False, slots=False, unsafe_hash=True) class _IsCallableValidator: def __call__(self, inst, attr, value): """ @@ -350,19 +315,20 @@ def __repr__(self): def is_callable(): """ A validator that raises a `attrs.exceptions.NotCallableError` if the - initializer is called with a value for this particular attribute - that is not callable. + initializer is called with a value for this particular attribute that is + not callable. .. versionadded:: 19.1.0 - :raises attrs.exceptions.NotCallableError: With a human readable error - message containing the attribute (`attrs.Attribute`) name, - and the value it got. + Raises: + attrs.exceptions.NotCallableError: + With a human readable error message containing the attribute + (`attrs.Attribute`) name, and the value it got. """ return _IsCallableValidator() -@attrs(repr=False, slots=True, hash=True) +@attrs(repr=False, slots=True, unsafe_hash=True) class _DeepIterable: member_validator = attrib(validator=is_callable()) iterable_validator = attrib( @@ -395,20 +361,23 @@ def deep_iterable(member_validator, iterable_validator=None): """ A validator that performs deep validation of an iterable. - :param member_validator: Validator(s) to apply to iterable members - :param iterable_validator: Validator to apply to iterable itself - (optional) + Args: + member_validator: Validator to apply to iterable members. - .. versionadded:: 19.1.0 + iterable_validator: + Validator to apply to iterable itself (optional). - :raises TypeError: if any sub-validators fail + Raises + TypeError: if any sub-validators fail + + .. versionadded:: 19.1.0 """ if isinstance(member_validator, (list, tuple)): member_validator = and_(*member_validator) return _DeepIterable(member_validator, iterable_validator) -@attrs(repr=False, slots=True, hash=True) +@attrs(repr=False, slots=True, unsafe_hash=True) class _DeepMapping: key_validator = attrib(validator=is_callable()) value_validator = attrib(validator=is_callable()) @@ -426,23 +395,25 @@ def __call__(self, inst, attr, value): self.value_validator(inst, attr, value[key]) def __repr__(self): - return ( - "" - ).format(key=self.key_validator, value=self.value_validator) + return f"" def deep_mapping(key_validator, value_validator, mapping_validator=None): """ A validator that performs deep validation of a dictionary. - :param key_validator: Validator to apply to dictionary keys - :param value_validator: Validator to apply to dictionary values - :param mapping_validator: Validator to apply to top-level mapping - attribute (optional) + Args: + key_validator: Validator to apply to dictionary keys. + + value_validator: Validator to apply to dictionary values. + + mapping_validator: + Validator to apply to top-level mapping attribute (optional). .. versionadded:: 19.1.0 - :raises TypeError: if any sub-validators fail + Raises: + TypeError: if any sub-validators fail """ return _DeepMapping(key_validator, value_validator, mapping_validator) @@ -467,10 +438,13 @@ def __repr__(self): def lt(val): """ - A validator that raises `ValueError` if the initializer is called - with a number larger or equal to *val*. + A validator that raises `ValueError` if the initializer is called with a + number larger or equal to *val*. + + The validator uses `operator.lt` to compare the values. - :param val: Exclusive upper bound for values + Args: + val: Exclusive upper bound for values. .. versionadded:: 21.3.0 """ @@ -479,10 +453,13 @@ def lt(val): def le(val): """ - A validator that raises `ValueError` if the initializer is called - with a number greater than *val*. + A validator that raises `ValueError` if the initializer is called with a + number greater than *val*. + + The validator uses `operator.le` to compare the values. - :param val: Inclusive upper bound for values + Args: + val: Inclusive upper bound for values. .. versionadded:: 21.3.0 """ @@ -491,10 +468,13 @@ def le(val): def ge(val): """ - A validator that raises `ValueError` if the initializer is called - with a number smaller than *val*. + A validator that raises `ValueError` if the initializer is called with a + number smaller than *val*. + + The validator uses `operator.ge` to compare the values. - :param val: Inclusive lower bound for values + Args: + val: Inclusive lower bound for values .. versionadded:: 21.3.0 """ @@ -503,10 +483,13 @@ def ge(val): def gt(val): """ - A validator that raises `ValueError` if the initializer is called - with a number smaller or equal to *val*. + A validator that raises `ValueError` if the initializer is called with a + number smaller or equal to *val*. + + The validator uses `operator.ge` to compare the values. - :param val: Exclusive lower bound for values + Args: + val: Exclusive lower bound for values .. versionadded:: 21.3.0 """ @@ -534,7 +517,8 @@ def max_len(length): A validator that raises `ValueError` if the initializer is called with a string or iterable that is longer than *length*. - :param int length: Maximum length of the string or iterable + Args: + length (int): Maximum length of the string or iterable .. versionadded:: 21.3.0 """ @@ -562,14 +546,15 @@ def min_len(length): A validator that raises `ValueError` if the initializer is called with a string or iterable that is shorter than *length*. - :param int length: Minimum length of the string or iterable + Args: + length (int): Minimum length of the string or iterable .. versionadded:: 22.1.0 """ return _MinLengthValidator(length) -@attrs(repr=False, slots=True, hash=True) +@attrs(repr=False, slots=True, unsafe_hash=True) class _SubclassOfValidator: type = attrib() @@ -592,21 +577,22 @@ def __repr__(self): def _subclass_of(type): """ - A validator that raises a `TypeError` if the initializer is called - with a wrong type for this particular attribute (checks are performed using + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using `issubclass` therefore it's also valid to pass a tuple of types). - :param type: The type to check for. - :type type: type or tuple of types + Args: + type (type | tuple[type, ...]): The type(s) to check for. - :raises TypeError: With a human readable error message, the attribute - (of type `attrs.Attribute`), the expected type, and the value it - got. + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. """ return _SubclassOfValidator(type) -@attrs(repr=False, slots=True, hash=True) +@attrs(repr=False, slots=True, unsafe_hash=True) class _NotValidator: validator = attrib() msg = attrib( @@ -640,12 +626,7 @@ def __call__(self, inst, attr, value): ) def __repr__(self): - return ( - "" - ).format( - what=self.validator, - exc_types=self.exc_types, - ) + return f"" def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): @@ -658,19 +639,22 @@ def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): Intended to be used with existing validators to compose logic without needing to create inverted variants, for example, ``not_(in_(...))``. - :param validator: A validator to be logically inverted. - :param msg: Message to raise if validator fails. - Formatted with keys ``exc_types`` and ``validator``. - :type msg: str - :param exc_types: Exception type(s) to capture. - Other types raised by child validators will not be intercepted and - pass through. + Args: + validator: A validator to be logically inverted. + + msg (str): + Message to raise if validator fails. Formatted with keys + ``exc_types`` and ``validator``. + + exc_types (tuple[type, ...]): + Exception type(s) to capture. Other types raised by child + validators will not be intercepted and pass through. - :raises ValueError: With a human readable error message, - the attribute (of type `attrs.Attribute`), - the validator that failed to raise an exception, - the value it got, - and the expected exception types. + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the validator that failed to raise an + exception, the value it got, and the expected exception types. .. versionadded:: 22.2.0 """ @@ -679,3 +663,49 @@ def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): except TypeError: exc_types = (exc_types,) return _NotValidator(validator, msg, exc_types) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OrValidator: + validators = attrib() + + def __call__(self, inst, attr, value): + for v in self.validators: + try: + v(inst, attr, value) + except Exception: # noqa: BLE001, PERF203, S112 + continue + else: + return + + msg = f"None of {self.validators!r} satisfied for value {value!r}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def or_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators until one of them is + satisfied. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + Raises: + ValueError: + If no validator is satisfied. Raised with a human-readable error + message listing all the wrapped validators and the value that + failed all of them. + + .. versionadded:: 24.1.0 + """ + vals = [] + for v in validators: + vals.extend(v.validators if isinstance(v, _OrValidator) else [v]) + + return _OrValidator(tuple(vals)) diff --git a/libs/attr/validators.pyi b/libs/attr/validators.pyi index d194a75ab..a314110e6 100644 --- a/libs/attr/validators.pyi +++ b/libs/attr/validators.pyi @@ -5,20 +5,15 @@ from typing import ( Container, ContextManager, Iterable, - List, Mapping, Match, - Optional, Pattern, - Tuple, - Type, TypeVar, - Union, overload, ) -from . import _ValidatorType -from . import _ValidatorArgType +from attrs import _ValidatorType +from attrs import _ValidatorArgType _T = TypeVar("_T") _T1 = TypeVar("_T1") @@ -36,42 +31,41 @@ def disabled() -> ContextManager[None]: ... # To be more precise on instance_of use some overloads. # If there are more than 3 items in the tuple then we fall back to Any @overload -def instance_of(type: Type[_T]) -> _ValidatorType[_T]: ... +def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... @overload -def instance_of(type: Tuple[Type[_T]]) -> _ValidatorType[_T]: ... +def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... @overload def instance_of( - type: Tuple[Type[_T1], Type[_T2]] -) -> _ValidatorType[Union[_T1, _T2]]: ... + type: tuple[type[_T1], type[_T2]] +) -> _ValidatorType[_T1 | _T2]: ... @overload def instance_of( - type: Tuple[Type[_T1], Type[_T2], Type[_T3]] -) -> _ValidatorType[Union[_T1, _T2, _T3]]: ... + type: tuple[type[_T1], type[_T2], type[_T3]] +) -> _ValidatorType[_T1 | _T2 | _T3]: ... @overload -def instance_of(type: Tuple[type, ...]) -> _ValidatorType[Any]: ... -def provides(interface: Any) -> _ValidatorType[Any]: ... +def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... def optional( - validator: Union[ - _ValidatorType[_T], List[_ValidatorType[_T]], Tuple[_ValidatorType[_T]] - ] -) -> _ValidatorType[Optional[_T]]: ... + validator: ( + _ValidatorType[_T] + | list[_ValidatorType[_T]] + | tuple[_ValidatorType[_T]] + ), +) -> _ValidatorType[_T | None]: ... def in_(options: Container[_T]) -> _ValidatorType[_T]: ... def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... def matches_re( - regex: Union[Pattern[AnyStr], AnyStr], + regex: Pattern[AnyStr] | AnyStr, flags: int = ..., - func: Optional[ - Callable[[AnyStr, AnyStr, int], Optional[Match[AnyStr]]] - ] = ..., + func: Callable[[AnyStr, AnyStr, int], Match[AnyStr] | None] | None = ..., ) -> _ValidatorType[AnyStr]: ... def deep_iterable( member_validator: _ValidatorArgType[_T], - iterable_validator: Optional[_ValidatorType[_I]] = ..., + iterable_validator: _ValidatorType[_I] | None = ..., ) -> _ValidatorType[_I]: ... def deep_mapping( key_validator: _ValidatorType[_K], value_validator: _ValidatorType[_V], - mapping_validator: Optional[_ValidatorType[_M]] = ..., + mapping_validator: _ValidatorType[_M] | None = ..., ) -> _ValidatorType[_M]: ... def is_callable() -> _ValidatorType[_T]: ... def lt(val: _T) -> _ValidatorType[_T]: ... @@ -83,6 +77,7 @@ def min_len(length: int) -> _ValidatorType[_T]: ... def not_( validator: _ValidatorType[_T], *, - msg: Optional[str] = None, - exc_types: Union[Type[Exception], Iterable[Type[Exception]]] = ..., + msg: str | None = None, + exc_types: type[Exception] | Iterable[type[Exception]] = ..., ) -> _ValidatorType[_T]: ... +def or_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... diff --git a/libs/attrs-23.2.0.dist-info/RECORD b/libs/attrs-23.2.0.dist-info/RECORD deleted file mode 100644 index 92edee9ee..000000000 --- a/libs/attrs-23.2.0.dist-info/RECORD +++ /dev/null @@ -1,37 +0,0 @@ -attr/__init__.py,sha256=WlXJN6ICB0Y_HZ0lmuTUgia0kuSdn2p67d4N6cYxNZM,3307 -attr/__init__.pyi,sha256=u08EujYHy_rSyebNn-I9Xv2S_cXmtA9xWGc0cBsyl18,16976 -attr/_cmp.py,sha256=OQZlWdFX74z18adGEUp40Ojqm0NNu1Flqnv2JE8B2ng,4025 -attr/_cmp.pyi,sha256=sGQmOM0w3_K4-X8cTXR7g0Hqr290E8PTObA9JQxWQqc,399 -attr/_compat.py,sha256=QmRyxii295wcQfaugWqxuIumAPsNQ2-RUF82QZPqMKw,2540 -attr/_config.py,sha256=z81Vt-GeT_2taxs1XZfmHx9TWlSxjPb6eZH1LTGsS54,843 -attr/_funcs.py,sha256=VBTUFKLklsmqxys3qWSTK_Ac9Z4s0mAJWwgW9nA7Llk,17173 -attr/_make.py,sha256=LnVy2e0HygoqaZknhC19z7JmOt7qGkAadf2LZgWVJWI,101923 -attr/_next_gen.py,sha256=as1voi8siAI_o2OQG8YIiZvmn0G7-S3_j_774rnoZ_g,6203 -attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 -attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 -attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 -attr/converters.py,sha256=Kyw5MY0yfnUR_RwN1Vydf0EiE---htDxOgSc_-NYL6A,3622 -attr/converters.pyi,sha256=jKlpHBEt6HVKJvgrMFJRrHq8p61GXg4-Nd5RZWKJX7M,406 -attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 -attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 -attr/filters.py,sha256=9pYvXqdg6mtLvKIIb56oALRMoHFnQTcGCO4EXTc1qyM,1470 -attr/filters.pyi,sha256=0mRCjLKxdcvAo0vD-Cr81HfRXXCp9j_cAXjOoAHtPGM,225 -attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attr/setters.py,sha256=pbCZQ-pE6ZxjDqZfWWUhUFefXtpekIU4qS_YDMLPQ50,1400 -attr/setters.pyi,sha256=pyY8TVNBu8TWhOldv_RxHzmGvdgFQH981db70r0fn5I,567 -attr/validators.py,sha256=LGVpbiNg_KGzYrKUD5JPiZkx8TMfynDZGoQoLJNCIMo,19676 -attr/validators.pyi,sha256=167Dl9nt7NUhE9wht1I-buo039qyUT1nEUT_nKjSWr4,2580 -attrs-23.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -attrs-23.2.0.dist-info/METADATA,sha256=WwvG7OHyKjEPpyFUZCCYt1n0E_CcqdRb7bliGEdcm-A,9531 -attrs-23.2.0.dist-info/RECORD,, -attrs-23.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attrs-23.2.0.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 -attrs-23.2.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 -attrs/__init__.py,sha256=9_5waVbFs7rLqtXZ73tNDrxhezyZ8VZeX4BbvQ3EeJw,1039 -attrs/__init__.pyi,sha256=s_ajQ_U14DOsOz0JbmAKDOi46B3v2PcdO0UAV1MY6Ek,2168 -attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 -attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 -attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 -attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 -attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/libs/apprise-1.7.6.dist-info/INSTALLER b/libs/attrs-24.2.0.dist-info/INSTALLER similarity index 100% rename from libs/apprise-1.7.6.dist-info/INSTALLER rename to libs/attrs-24.2.0.dist-info/INSTALLER diff --git a/libs/attrs-23.2.0.dist-info/METADATA b/libs/attrs-24.2.0.dist-info/METADATA similarity index 50% rename from libs/attrs-23.2.0.dist-info/METADATA rename to libs/attrs-24.2.0.dist-info/METADATA index c20be76c7..a85b37863 100644 --- a/libs/attrs-23.2.0.dist-info/METADATA +++ b/libs/attrs-24.2.0.dist-info/METADATA @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: attrs -Version: 23.2.0 +Version: 24.2.0 Summary: Classes Without Boilerplate Project-URL: Documentation, https://www.attrs.org/ Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html @@ -19,38 +19,58 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Typing :: Typed Requires-Python: >=3.7 Requires-Dist: importlib-metadata; python_version < '3.8' +Provides-Extra: benchmark +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark' +Requires-Dist: hypothesis; extra == 'benchmark' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'benchmark' +Requires-Dist: pympler; extra == 'benchmark' +Requires-Dist: pytest-codspeed; extra == 'benchmark' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'benchmark' +Requires-Dist: pytest-xdist[psutil]; extra == 'benchmark' +Requires-Dist: pytest>=4.3.0; extra == 'benchmark' Provides-Extra: cov -Requires-Dist: attrs[tests]; extra == 'cov' +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov' Requires-Dist: coverage[toml]>=5.3; extra == 'cov' +Requires-Dist: hypothesis; extra == 'cov' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'cov' +Requires-Dist: pympler; extra == 'cov' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'cov' +Requires-Dist: pytest-xdist[psutil]; extra == 'cov' +Requires-Dist: pytest>=4.3.0; extra == 'cov' Provides-Extra: dev -Requires-Dist: attrs[tests]; extra == 'dev' +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev' +Requires-Dist: hypothesis; extra == 'dev' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'dev' Requires-Dist: pre-commit; extra == 'dev' +Requires-Dist: pympler; extra == 'dev' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'dev' +Requires-Dist: pytest-xdist[psutil]; extra == 'dev' +Requires-Dist: pytest>=4.3.0; extra == 'dev' Provides-Extra: docs +Requires-Dist: cogapp; extra == 'docs' Requires-Dist: furo; extra == 'docs' Requires-Dist: myst-parser; extra == 'docs' Requires-Dist: sphinx; extra == 'docs' Requires-Dist: sphinx-notfound-page; extra == 'docs' Requires-Dist: sphinxcontrib-towncrier; extra == 'docs' -Requires-Dist: towncrier; extra == 'docs' -Requires-Dist: zope-interface; extra == 'docs' +Requires-Dist: towncrier<24.7; extra == 'docs' Provides-Extra: tests -Requires-Dist: attrs[tests-no-zope]; extra == 'tests' -Requires-Dist: zope-interface; extra == 'tests' +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests' +Requires-Dist: hypothesis; extra == 'tests' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests' +Requires-Dist: pympler; extra == 'tests' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests' +Requires-Dist: pytest-xdist[psutil]; extra == 'tests' +Requires-Dist: pytest>=4.3.0; extra == 'tests' Provides-Extra: tests-mypy -Requires-Dist: mypy>=1.6; (platform_python_implementation == 'CPython' and python_version >= '3.8') and extra == 'tests-mypy' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.8') and extra == 'tests-mypy' -Provides-Extra: tests-no-zope -Requires-Dist: attrs[tests-mypy]; extra == 'tests-no-zope' -Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests-no-zope' -Requires-Dist: hypothesis; extra == 'tests-no-zope' -Requires-Dist: pympler; extra == 'tests-no-zope' -Requires-Dist: pytest-xdist[psutil]; extra == 'tests-no-zope' -Requires-Dist: pytest>=4.3.0; extra == 'tests-no-zope' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests-mypy' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests-mypy' Description-Content-Type: text/markdown

@@ -71,12 +91,26 @@ Its main goal is to help you to write **concise** and **correct** software witho *attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek). Especially those generously supporting us at the *The Organization* tier and higher: + +

- - - + + + + + + + +

+ +

Please consider joining them to help make attrs’s maintenance more sustainable!

@@ -133,26 +167,37 @@ After *declaring* your attributes, *attrs* gives you: *without* writing dull boilerplate code again and again and *without* runtime performance penalties. -**Hate type annotations**!? -No problem! -Types are entirely **optional** with *attrs*. -Simply assign `attrs.field()` to the attributes instead of annotating them with types. - --- This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0. The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**. -Please check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for a more in-depth explanation. +Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation! + + +### Hate Type Annotations!? + +No problem! +Types are entirely **optional** with *attrs*. +Simply assign `attrs.field()` to the attributes instead of annotating them with types: + +```python +from attrs import define, field + +@define +class SomeClass: + a_number = field(default=42) + list_of_numbers = field(factory=list) +``` ## Data Classes On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*). In practice it does a lot more and is more flexible. -For instance it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), and allows for stepping through the generated methods using a debugger. +For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger. -For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes). +For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice. ## Project Information @@ -163,7 +208,7 @@ For more details, please refer to our [comparison page](https://www.attrs.org/en - [**Source Code**](https://github.com/python-attrs/attrs) - [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md) - [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs) -- **Get Help**: please use the `python-attrs` tag on [StackOverflow](https://stackoverflow.com/questions/tagged/python-attrs) +- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs) ### *attrs* for Enterprise @@ -172,31 +217,26 @@ Available as part of the Tidelift Subscription. The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. -[Learn more.](https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) +[Learn more](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). ## Release Information +### Deprecations + +- Given the amount of warnings raised in the broader ecosystem, we've decided to only soft-deprecate the *hash* argument to `@define` / `@attr.s`. + Please don't use it in new code, but we don't intend to remove it anymore. + [#1330](https://github.com/python-attrs/attrs/issues/1330) + + ### Changes -- The type annotation for `attrs.resolve_types()` is now correct. - [#1141](https://github.com/python-attrs/attrs/issues/1141) -- Type stubs now use `typing.dataclass_transform` to decorate dataclass-like decorators, instead of the non-standard `__dataclass_transform__` special form, which is only supported by Pyright. - [#1158](https://github.com/python-attrs/attrs/issues/1158) -- Fixed serialization of namedtuple fields using `attrs.asdict/astuple()` with `retain_collection_types=True`. - [#1165](https://github.com/python-attrs/attrs/issues/1165) -- `attrs.AttrsInstance` is now a `typing.Protocol` in both type hints and code. - This allows you to subclass it along with another `Protocol`. - [#1172](https://github.com/python-attrs/attrs/issues/1172) -- If *attrs* detects that `__attrs_pre_init__` accepts more than just `self`, it will call it with the same arguments as `__init__` was called. - This allows you to, for example, pass arguments to `super().__init__()`. - [#1187](https://github.com/python-attrs/attrs/issues/1187) -- Slotted classes now transform `functools.cached_property` decorated methods to support equivalent semantics. - [#1200](https://github.com/python-attrs/attrs/issues/1200) -- Added *class_body* argument to `attrs.make_class()` to provide additional attributes for newly created classes. - It is, for example, now possible to attach methods. - [#1203](https://github.com/python-attrs/attrs/issues/1203) +- `attrs.converters.pipe()` (and its syntactic sugar of passing a list for `attrs.field()`'s / `attr.ib()`'s *converter* argument) works again when passing `attrs.setters.convert` to *on_setattr* (which is default for `attrs.define`). + [#1328](https://github.com/python-attrs/attrs/issues/1328) +- Restored support for PEP [649](https://peps.python.org/pep-0649/) / [749](https://peps.python.org/pep-0749/)-implementing Pythons -- currently 3.14-dev. + [#1329](https://github.com/python-attrs/attrs/issues/1329) + --- -[Full changelog](https://www.attrs.org/en/stable/changelog.html) +[Full changelog →](https://www.attrs.org/en/stable/changelog.html) diff --git a/libs/attrs-24.2.0.dist-info/RECORD b/libs/attrs-24.2.0.dist-info/RECORD new file mode 100644 index 000000000..3a10fcaff --- /dev/null +++ b/libs/attrs-24.2.0.dist-info/RECORD @@ -0,0 +1,37 @@ +attr/__init__.py,sha256=l8Ewh5KZE7CCY0i1iDfSCnFiUTIkBVoqsXjX9EZnIVA,2087 +attr/__init__.pyi,sha256=aTVHBPX6krCGvbQvOl_UKqEzmi2HFsaIVm2WKmAiqVs,11434 +attr/_cmp.py,sha256=3umHiBtgsEYtvNP_8XrQwTCdFoZIX4DEur76N-2a3X8,4123 +attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 +attr/_compat.py,sha256=n2Uk3c-ywv0PkFfGlvqR7SzDXp4NOhWmNV_ZK6YfWoM,2958 +attr/_config.py,sha256=z81Vt-GeT_2taxs1XZfmHx9TWlSxjPb6eZH1LTGsS54,843 +attr/_funcs.py,sha256=SGDmNlED1TM3tgO9Ap2mfRfVI24XEAcrNQs7o2eBXHQ,17386 +attr/_make.py,sha256=BjENJz5eJoojJVbCoupWjXLLEZJ7VID89lisLbQUlmQ,91479 +attr/_next_gen.py,sha256=dhGb96VFg4kXBkS9Zdz1A2uxVJ99q_RT1hw3kLA9-uI,24630 +attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 +attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 +attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 +attr/converters.py,sha256=vNa58pZi9V6uxBzl4t1QrHbQfkT4iRFAodyXe7lcgg0,3506 +attr/converters.pyi,sha256=mpDoVFO3Cpx8xYSSV0iZFl7IAHuoNBglxKfxHvLj_sY,410 +attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 +attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 +attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 +attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/setters.py,sha256=faMQeiBo_nbXYnPaQ1pq8PXeA7Zr-uNsVsPMiKCmxhc,1619 +attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 +attr/validators.py,sha256=985eTP6RHyon61YEauMJgyNy1rEOhJWiSXMJgRxPtrQ,20045 +attr/validators.pyi,sha256=LjKf7AoXZfvGSfT3LRs61Qfln94konYyMUPoJJjOxK4,2502 +attrs-24.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-24.2.0.dist-info/METADATA,sha256=3Jgk4lr9Y1SAqAcwOLPN_mpW0wc6VOGm-yHt1LsPIHw,11524 +attrs-24.2.0.dist-info/RECORD,, +attrs-24.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs-24.2.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +attrs-24.2.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 +attrs/__init__.py,sha256=5FHo-EMFOX-g4ialSK4fwOjuoHzLISJDZCwoOl02Ty8,1071 +attrs/__init__.pyi,sha256=o3l92VsD9kHz8sldEtb_tllBTs3TeL-vIBMTxo2Zc_4,7703 +attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 +attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 +attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 +attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 +attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/libs/apprise-1.7.6.dist-info/REQUESTED b/libs/attrs-24.2.0.dist-info/REQUESTED similarity index 100% rename from libs/apprise-1.7.6.dist-info/REQUESTED rename to libs/attrs-24.2.0.dist-info/REQUESTED diff --git a/libs/attrs-23.2.0.dist-info/WHEEL b/libs/attrs-24.2.0.dist-info/WHEEL similarity index 67% rename from libs/attrs-23.2.0.dist-info/WHEEL rename to libs/attrs-24.2.0.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/attrs-23.2.0.dist-info/WHEEL +++ b/libs/attrs-24.2.0.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/attrs-23.2.0.dist-info/licenses/LICENSE b/libs/attrs-24.2.0.dist-info/licenses/LICENSE similarity index 100% rename from libs/attrs-23.2.0.dist-info/licenses/LICENSE rename to libs/attrs-24.2.0.dist-info/licenses/LICENSE diff --git a/libs/attrs/__init__.py b/libs/attrs/__init__.py index 0c2481561..963b1972d 100644 --- a/libs/attrs/__init__.py +++ b/libs/attrs/__init__.py @@ -4,6 +4,7 @@ NOTHING, Attribute, AttrsInstance, + Converter, Factory, _make_getattr, assoc, @@ -42,6 +43,7 @@ "Attribute", "AttrsInstance", "cmp_using", + "Converter", "converters", "define", "evolve", diff --git a/libs/attrs/__init__.pyi b/libs/attrs/__init__.pyi index 9372cfea1..b2670de21 100644 --- a/libs/attrs/__init__.pyi +++ b/libs/attrs/__init__.pyi @@ -1,12 +1,12 @@ +import sys + from typing import ( Any, Callable, - Dict, Mapping, - Optional, Sequence, - Tuple, - Type, + overload, + TypeVar, ) # Because we need to type our own stuff, we have to make everything from @@ -20,48 +20,233 @@ from attr import __title__ as __title__ from attr import __url__ as __url__ from attr import __version__ as __version__ from attr import __version_info__ as __version_info__ -from attr import _FilterType from attr import assoc as assoc from attr import Attribute as Attribute from attr import AttrsInstance as AttrsInstance from attr import cmp_using as cmp_using from attr import converters as converters -from attr import define as define +from attr import Converter as Converter from attr import evolve as evolve from attr import exceptions as exceptions from attr import Factory as Factory -from attr import field as field from attr import fields as fields from attr import fields_dict as fields_dict from attr import filters as filters -from attr import frozen as frozen from attr import has as has from attr import make_class as make_class -from attr import mutable as mutable from attr import NOTHING as NOTHING from attr import resolve_types as resolve_types from attr import setters as setters from attr import validate as validate from attr import validators as validators +from attr import attrib, asdict as asdict, astuple as astuple + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_EqOrderType = bool | Callable[[Any], Any] +_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] +_ConverterType = Callable[[Any], Any] +_ReprType = Callable[[Any], str] +_ReprArgType = bool | _ReprType +_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] +_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType +_FieldTransformer = Callable[ + [type, list["Attribute[Any]"]], list["Attribute[Any]"] +] +# FIXME: in reality, if multiple validators are passed they must be in a list +# or tuple, but those are invariant and so would prevent subtypes of +# _ValidatorType from working when passed in a list or tuple. +_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]] + +@overload +def field( + *, + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def field( + *, + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def field( + *, + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def field( + *, + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... -# TODO: see definition of attr.asdict/astuple -def asdict( - inst: AttrsInstance, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - dict_factory: Type[Mapping[Any, Any]] = ..., - retain_collection_types: bool = ..., - value_serializer: Optional[ - Callable[[type, Attribute[Any], Any], Any] - ] = ..., - tuple_keys: bool = ..., -) -> Dict[str, Any]: ... +mutable = define -# TODO: add support for returning NamedTuple from the mypy plugin -def astuple( - inst: AttrsInstance, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - tuple_factory: Type[Sequence[Any]] = ..., - retain_collection_types: bool = ..., -) -> Tuple[Any, ...]: ... +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... diff --git a/libs/attrs-23.2.0.dist-info/INSTALLER b/libs/babelfish-0.6.1.dist-info/INSTALLER similarity index 100% rename from libs/attrs-23.2.0.dist-info/INSTALLER rename to libs/babelfish-0.6.1.dist-info/INSTALLER diff --git a/libs/babelfish-0.6.0.dist-info/LICENSE b/libs/babelfish-0.6.1.dist-info/LICENSE similarity index 100% rename from libs/babelfish-0.6.0.dist-info/LICENSE rename to libs/babelfish-0.6.1.dist-info/LICENSE diff --git a/libs/babelfish-0.6.0.dist-info/METADATA b/libs/babelfish-0.6.1.dist-info/METADATA similarity index 89% rename from libs/babelfish-0.6.0.dist-info/METADATA rename to libs/babelfish-0.6.1.dist-info/METADATA index 5ed0d4c5c..ef3d36c55 100644 --- a/libs/babelfish-0.6.0.dist-info/METADATA +++ b/libs/babelfish-0.6.1.dist-info/METADATA @@ -1,29 +1,30 @@ Metadata-Version: 2.1 Name: babelfish -Version: 0.6.0 +Version: 0.6.1 Summary: A module to work with countries and languages Home-page: https://github.com/Diaoul/babelfish License: BSD-3-Clause Keywords: language,country,locale Author: Antoine Bertin Author-email: ant.bertin@gmail.com -Requires-Python: >=3.6,<4.0 +Requires-Python: >=3.8,<4.0 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 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -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 :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Topic :: Software Development :: Internationalization Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: importlib-metadata (>=4.6,<5.0) ; python_version < "3.10" +Requires-Dist: importlib-resources (>=5.0,<6.0) ; python_version < "3.9" Project-URL: Repository, https://github.com/Diaoul/babelfish Description-Content-Type: text/markdown @@ -55,7 +56,7 @@ Country representation from 2-letter code (ISO-3166): Built-in country converters (name): ```python ->>> country = babelfish.Country('GB') +>>> country = babelfish.Country.fromname('United Kingdom') >>> country ``` @@ -88,6 +89,8 @@ Built-in language converters (alpha2, alpha3b, alpha3t, name, scope, type and op >>> language = babelfish.Language('por', 'BR') >>> language.alpha2 'pt' +>>> language.name +'Portuguese' >>> language.scope 'individual' >>> language.type diff --git a/libs/babelfish-0.6.0.dist-info/RECORD b/libs/babelfish-0.6.1.dist-info/RECORD similarity index 61% rename from libs/babelfish-0.6.0.dist-info/RECORD rename to libs/babelfish-0.6.1.dist-info/RECORD index d880fa869..24e923f69 100644 --- a/libs/babelfish-0.6.0.dist-info/RECORD +++ b/libs/babelfish-0.6.1.dist-info/RECORD @@ -1,11 +1,12 @@ -babelfish-0.6.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -babelfish-0.6.0.dist-info/LICENSE,sha256=Oks1Oz6Ct0po2CM5dQD3S8oXrnJOJ1jMNj28Y5yXpao,1529 -babelfish-0.6.0.dist-info/METADATA,sha256=8jYo3WO5AI6-SQfqvix3zYsPwqPVo__07TBgLlKT12A,3003 -babelfish-0.6.0.dist-info/RECORD,, -babelfish-0.6.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -babelfish-0.6.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 +babelfish-0.6.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +babelfish-0.6.1.dist-info/LICENSE,sha256=Oks1Oz6Ct0po2CM5dQD3S8oXrnJOJ1jMNj28Y5yXpao,1529 +babelfish-0.6.1.dist-info/METADATA,sha256=NrLR07hncTt09YG_BwYLy5FFw-UR_H7EPsTHgjd5gRk,3152 +babelfish-0.6.1.dist-info/RECORD,, +babelfish-0.6.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +babelfish-0.6.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 babelfish/__init__.py,sha256=acwjM_qKby8EzOkPVT-R1Usakhba0s7mO-Q4QXFPZgs,761 -babelfish/converters/__init__.py,sha256=T4lfWFLaCXEHGhS86k4v9PWGhn4Hbf0I2LvFs-M3tCs,9366 +babelfish/compat.py,sha256=nobpsm7Iv2QLBBg1af4OxgzcNAwRJP642Juyai_6UMg,976 +babelfish/converters/__init__.py,sha256=N2z65eoHo0_9ZHgipi-9cVpd2lMX3Dk8ro2YEStbETA,9361 babelfish/converters/alpha2.py,sha256=4eeZPb4tDZ7pF2D9AUvk4UAUupYAOnjJFHGScn_UWeM,556 babelfish/converters/alpha3b.py,sha256=1PAhxBeWurFGct1LqA-nx5nW9WezbsfM-Zxkm5Iy2ns,559 babelfish/converters/alpha3t.py,sha256=kC-UfDRHQSKLAdgMJ2vFTE9PabSJewHyTBsSXXnNfqM,559 @@ -14,11 +15,11 @@ babelfish/converters/name.py,sha256=GO23olijoeer60dWfvIdCl3LK_FaMIwktlt10XMiGq8, babelfish/converters/opensubtitles.py,sha256=Y6b7eusAuOeqC8YoFIRZNGfzWfr8V9fxvbjIsDu7Vak,1774 babelfish/converters/scope.py,sha256=IHGigVNrytzebKkgEZIdHxjCPid8LIUnQXTbnHQ2uGE,847 babelfish/converters/type.py,sha256=RoiSQalynx8aoGYInHBZJL1YkHiMeVvrOK3WYLP0w0A,898 -babelfish/country.py,sha256=jZplgI8JwhMb2b4RO0HK30LMpmq3Fl1uoygA0D0_s_8,3242 +babelfish/country.py,sha256=aUX4_QBhEosYcukpUqYYynC56OsKh9I4wI96w_zbRHw,3215 babelfish/data/iso-3166-1.txt,sha256=CxUAGynPLTb8dpzrpvhp2e9unItP-2WmBuHnPKYXajI,4113 babelfish/data/iso-639-3.tab,sha256=CI7Kbv498zK2uAcZLVFAMVQitBOlOTjVq7f_7OXekAI,184527 babelfish/data/iso15924-utf8-20131012.txt,sha256=fthbRClXJbbXIIDS7hXyhQUOXopfHQSWlrFf0rQNEc4,9872 babelfish/data/opensubtitles_languages.txt,sha256=qLfynAWhzWqTHU8D4A6aWSXcN10UDl7Ekw1lVJgllJw,9582 babelfish/exceptions.py,sha256=G1oSC4BkZZakJPIgnkNZrLsTFam_eT9jYiER4naTdYs,2332 -babelfish/language.py,sha256=z7rCd8ERzFs07_w7ZTIepo-0-dJ2KEz9AV1bSgXGozQ,6874 -babelfish/script.py,sha256=wX9JZRYqgnx9vaB7KW2KAmAZMlenUFSy2M-J__M4xpM,2054 +babelfish/language.py,sha256=XIBWQwNVeRHhYllCauHSVrc8So6eV6cr7ZINndbm-tQ,6847 +babelfish/script.py,sha256=A_D1T7n1KVl8U2HwSuIbgksZj-LU7EQZMdY1nKVe2pU,2027 diff --git a/libs/attrs-23.2.0.dist-info/REQUESTED b/libs/babelfish-0.6.1.dist-info/REQUESTED similarity index 100% rename from libs/attrs-23.2.0.dist-info/REQUESTED rename to libs/babelfish-0.6.1.dist-info/REQUESTED diff --git a/libs/babelfish-0.6.0.dist-info/WHEEL b/libs/babelfish-0.6.1.dist-info/WHEEL similarity index 67% rename from libs/babelfish-0.6.0.dist-info/WHEEL rename to libs/babelfish-0.6.1.dist-info/WHEEL index d73ccaae8..8b9b3a1bf 100644 --- a/libs/babelfish-0.6.0.dist-info/WHEEL +++ b/libs/babelfish-0.6.1.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 +Generator: poetry-core 1.9.1 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/babelfish/compat.py b/libs/babelfish/compat.py new file mode 100644 index 000000000..a546b983f --- /dev/null +++ b/libs/babelfish/compat.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from sys import version_info as _python + +if _python >= (3, 9): + # introduced in python 3.9 + from importlib.resources import files +else: + from importlib_resources import files + + +if _python >= (3, 10): + # .select() was introduced in 3.10 + from importlib.metadata import entry_points, EntryPoint as _EntryPoint +else: + from importlib_metadata import entry_points, EntryPoint as _EntryPoint + + +def resource_stream(pkg, path): + return files(pkg).joinpath(f'{path}').open('rb') + + +def iter_entry_points(group, **kwargs): + return entry_points().select(group=group, **kwargs) + + +class EntryPoint(_EntryPoint): + @staticmethod + def parse(eps): + return EntryPoint(*map(str.strip, eps.split('=')), None) + + def resolve(self): + return self.load() diff --git a/libs/babelfish/converters/__init__.py b/libs/babelfish/converters/__init__.py index d27f84900..13c0aa0d7 100644 --- a/libs/babelfish/converters/__init__.py +++ b/libs/babelfish/converters/__init__.py @@ -2,7 +2,7 @@ # Use of this source code is governed by the 3-clause BSD license # that can be found in the LICENSE file. # -from pkg_resources import iter_entry_points, EntryPoint +from ..compat import iter_entry_points, EntryPoint from ..exceptions import LanguageConvertError, LanguageReverseError try: diff --git a/libs/babelfish/country.py b/libs/babelfish/country.py index 4c24b52b2..618585676 100644 --- a/libs/babelfish/country.py +++ b/libs/babelfish/country.py @@ -7,9 +7,9 @@ from __future__ import unicode_literals from collections import namedtuple from functools import partial -from pkg_resources import resource_stream # @UnresolvedImport from .converters import ConverterManager from . import basestr +from .compat import resource_stream COUNTRIES = {} diff --git a/libs/babelfish/language.py b/libs/babelfish/language.py index b4b251937..fe5bfb69a 100644 --- a/libs/babelfish/language.py +++ b/libs/babelfish/language.py @@ -7,12 +7,12 @@ from __future__ import unicode_literals from collections import namedtuple from functools import partial -from pkg_resources import resource_stream # @UnresolvedImport from .converters import ConverterManager from .country import Country from .exceptions import LanguageConvertError from .script import Script from . import basestr +from .compat import resource_stream LANGUAGES = set() diff --git a/libs/babelfish/script.py b/libs/babelfish/script.py index 4b59ce016..f073e95e2 100644 --- a/libs/babelfish/script.py +++ b/libs/babelfish/script.py @@ -6,8 +6,8 @@ # from __future__ import unicode_literals from collections import namedtuple -from pkg_resources import resource_stream # @UnresolvedImport from . import basestr +from .compat import resource_stream #: Script code to script name mapping SCRIPTS = {} diff --git a/libs/backports.functools_lru_cache-2.0.0.dist-info/RECORD b/libs/backports.functools_lru_cache-2.0.0.dist-info/RECORD index 66475a126..23cc977d3 100644 --- a/libs/backports.functools_lru_cache-2.0.0.dist-info/RECORD +++ b/libs/backports.functools_lru_cache-2.0.0.dist-info/RECORD @@ -3,7 +3,7 @@ backports.functools_lru_cache-2.0.0.dist-info/LICENSE,sha256=htoPAa6uRjSKPD1GUZX backports.functools_lru_cache-2.0.0.dist-info/METADATA,sha256=XKyoE2hDkAbEjNN1N5v9864HhFRWfeWarZglz_-o9bY,3493 backports.functools_lru_cache-2.0.0.dist-info/RECORD,, backports.functools_lru_cache-2.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -backports.functools_lru_cache-2.0.0.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110 +backports.functools_lru_cache-2.0.0.dist-info/WHEEL,sha256=TJ49d73sNs10F0aze1W_bTW2P_X7-F4YXOlBqoqA-jY,109 backports.functools_lru_cache-2.0.0.dist-info/top_level.txt,sha256=cGjaLMOoBR1FK0ApojtzWVmViTtJ7JGIK_HwXiEsvtU,10 backports/__init__.py,sha256=iOEMwnlORWezdO8-2vxBIPSR37D7JGjluZ8f55vzxls,81 backports/functools_lru_cache.py,sha256=IwQSQZ26u76HImCyxb5sHso1n9md1K82DP28KLvw31I,9152 diff --git a/libs/backports.functools_lru_cache-2.0.0.dist-info/WHEEL b/libs/backports.functools_lru_cache-2.0.0.dist-info/WHEEL index 4724c4573..17c0299e4 100644 --- a/libs/backports.functools_lru_cache-2.0.0.dist-info/WHEEL +++ b/libs/backports.functools_lru_cache-2.0.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/libs/backports.zoneinfo-0.2.1.dist-info/METADATA b/libs/backports.zoneinfo-0.2.1.dist-info/METADATA index 7b525d1a1..d8835ccf6 100644 --- a/libs/backports.zoneinfo-0.2.1.dist-info/METADATA +++ b/libs/backports.zoneinfo-0.2.1.dist-info/METADATA @@ -21,9 +21,9 @@ Requires-Python: >=3.6 Description-Content-Type: text/markdown License-File: LICENSE License-File: licenses/LICENSE_APACHE -Requires-Dist: importlib-resources ; python_version < "3.7" +Requires-Dist: importlib-resources; python_version < "3.7" Provides-Extra: tzdata -Requires-Dist: tzdata ; extra == 'tzdata' +Requires-Dist: tzdata; extra == "tzdata" # `backports.zoneinfo`: Backport of the standard library module `zoneinfo` diff --git a/libs/backports.zoneinfo-0.2.1.dist-info/RECORD b/libs/backports.zoneinfo-0.2.1.dist-info/RECORD index 03fdbec2f..f470c9c96 100644 --- a/libs/backports.zoneinfo-0.2.1.dist-info/RECORD +++ b/libs/backports.zoneinfo-0.2.1.dist-info/RECORD @@ -1,16 +1,16 @@ backports.zoneinfo-0.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 backports.zoneinfo-0.2.1.dist-info/LICENSE,sha256=M-jlAC01EtP8wigrmV5rrZ0zR4G5xawxhD9ASQDh87Q,592 backports.zoneinfo-0.2.1.dist-info/LICENSE_APACHE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357 -backports.zoneinfo-0.2.1.dist-info/METADATA,sha256=S7c5jZ1GkrxjGZYinAJC-hHrwKVky2Fjr9x92y1rQXg,4761 +backports.zoneinfo-0.2.1.dist-info/METADATA,sha256=kTzmkvHH1uwhH6KqhiCqH2q1Ffb_y2-PkG92E_-Yu08,4759 backports.zoneinfo-0.2.1.dist-info/RECORD,, backports.zoneinfo-0.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -backports.zoneinfo-0.2.1.dist-info/WHEEL,sha256=UkJU7GAEhyIKVwGX1j1L5OGjUFT--MirwyCseqfCpZU,109 +backports.zoneinfo-0.2.1.dist-info/WHEEL,sha256=8MbRJsGMYV6Ym1_SoG8YuJPvArpN2Z2wVWusEpp3feg,108 backports.zoneinfo-0.2.1.dist-info/top_level.txt,sha256=cGjaLMOoBR1FK0ApojtzWVmViTtJ7JGIK_HwXiEsvtU,10 backports/__init__.py,sha256=KNscjLyptBUeU07KtwwRFdTJqAVURMf4GjM9CqXnxMI,227 backports/zoneinfo/__init__.py,sha256=atCU_fMgkQIE-DCjSJOist9GAqaWQAGhrDA5bCXPQxU,1235 backports/zoneinfo/__init__.pyi,sha256=1_T7dB1-Fh1s7f2zNa1QrP9pO_aBHemeaIiJBPQz3Fs,1234 backports/zoneinfo/_common.py,sha256=gKuY_V-YKbaabT5VRw1MWYJxfuiDDLCg7UolYYI42rw,5469 -backports/zoneinfo/_czoneinfo.cpython-38-darwin.so,sha256=9MZ7hR2rFXStRKAy7qnL1NQIDTK98U_5w3TBbifnDHs,74480 +backports/zoneinfo/_czoneinfo.cpython-38-darwin.so,sha256=B5Dfalnebg4-d6RHxgViObqUi8YRy_dLNl8EyYSlevI,37616 backports/zoneinfo/_tzpath.py,sha256=yFkwr6qKvcC6wtuhrJRh487x57L39up8bpl9w-gOGX8,5860 backports/zoneinfo/_version.py,sha256=HfjVOrpTnmZ-xVFCYSVmX50EXaBQeJteUHG-PD6iQs8,22 backports/zoneinfo/_zoneinfo.py,sha256=B1W3KlPeUHjk1qpBybGHorPMvfcLwGF7dtYj-IFAxY4,24353 diff --git a/libs/backports.zoneinfo-0.2.1.dist-info/WHEEL b/libs/backports.zoneinfo-0.2.1.dist-info/WHEEL index 844cf17ca..be75fa70d 100644 --- a/libs/backports.zoneinfo-0.2.1.dist-info/WHEEL +++ b/libs/backports.zoneinfo-0.2.1.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: false Tag: cp38-cp38-macosx_12_0_x86_64 diff --git a/libs/backports/zoneinfo/_czoneinfo.cpython-38-darwin.so b/libs/backports/zoneinfo/_czoneinfo.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..b8561438696255724045484466db49cc7dc08bfd GIT binary patch literal 37616 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 literal 0 HcmV?d00001 diff --git a/libs/beautifulsoup4-4.12.3.dist-info/METADATA b/libs/beautifulsoup4-4.12.3.dist-info/METADATA index a2681d725..13acac383 100644 --- a/libs/beautifulsoup4-4.12.3.dist-info/METADATA +++ b/libs/beautifulsoup4-4.12.3.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: beautifulsoup4 Version: 4.12.3 Summary: Screen-scraping library diff --git a/libs/beautifulsoup4-4.12.3.dist-info/RECORD b/libs/beautifulsoup4-4.12.3.dist-info/RECORD index 9f7024d2d..78a653b9f 100644 --- a/libs/beautifulsoup4-4.12.3.dist-info/RECORD +++ b/libs/beautifulsoup4-4.12.3.dist-info/RECORD @@ -1,8 +1,8 @@ beautifulsoup4-4.12.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -beautifulsoup4-4.12.3.dist-info/METADATA,sha256=UkOS1koIjlakIy9Q1u2yCNwDEFOUZSrLcsbV-mTInz4,3790 +beautifulsoup4-4.12.3.dist-info/METADATA,sha256=I6QhXDveDrSac0vyCKxsPJZJLZS6FW5jCCKKeBm5u2A,3790 beautifulsoup4-4.12.3.dist-info/RECORD,, beautifulsoup4-4.12.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -beautifulsoup4-4.12.3.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 +beautifulsoup4-4.12.3.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 beautifulsoup4-4.12.3.dist-info/licenses/AUTHORS,sha256=uSIdbrBb1sobdXl7VrlUvuvim2dN9kF3MH4Edn0WKGE,2176 beautifulsoup4-4.12.3.dist-info/licenses/LICENSE,sha256=VbTY1LHlvIbRDvrJG3TIe8t3UmsPW57a-LnNKtxzl7I,1441 bs4/__init__.py,sha256=kq32cCtQiNjjU9XwjD0b1jdXN5WEC87nJqSSW3PhVkM,33822 diff --git a/libs/beautifulsoup4-4.12.3.dist-info/WHEEL b/libs/beautifulsoup4-4.12.3.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/beautifulsoup4-4.12.3.dist-info/WHEEL +++ b/libs/beautifulsoup4-4.12.3.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/bidict-0.23.1.dist-info/RECORD b/libs/bidict-0.23.1.dist-info/RECORD index db89d0582..4f4482ad2 100644 --- a/libs/bidict-0.23.1.dist-info/RECORD +++ b/libs/bidict-0.23.1.dist-info/RECORD @@ -3,7 +3,7 @@ bidict-0.23.1.dist-info/LICENSE,sha256=8_U63OyqSNc6ZuI4-lupBstBh2eDtF0ooTRrMULuv bidict-0.23.1.dist-info/METADATA,sha256=2ovIRm6Df8gdwAMekGqkeBSF5TWj2mv1jpmh4W4ks7o,8704 bidict-0.23.1.dist-info/RECORD,, bidict-0.23.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -bidict-0.23.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +bidict-0.23.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 bidict-0.23.1.dist-info/top_level.txt,sha256=WuQO02jp0ODioS7sJoaHg3JJ5_3h6Sxo9RITvNGPYmc,7 bidict/__init__.py,sha256=pL87KsrDpBsl3AG09LQk1t1TSFt0hIJVYa2POMdErN8,4398 bidict/_abc.py,sha256=SMCNdCsmqSWg0OGnMZtnnXY8edjXcyZup5tva4HBm_c,3172 diff --git a/libs/bidict-0.23.1.dist-info/WHEEL b/libs/bidict-0.23.1.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/bidict-0.23.1.dist-info/WHEEL +++ b/libs/bidict-0.23.1.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/bin/ftfy b/libs/bin/ftfy new file mode 100755 index 000000000..2c1de6a2b --- /dev/null +++ b/libs/bin/ftfy @@ -0,0 +1,8 @@ +#!/usr/local/opt/python@3.8/bin/python3.8 +# -*- coding: utf-8 -*- +import re +import sys +from ftfy.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/libs/blinker-1.7.0.dist-info/METADATA b/libs/blinker-1.7.0.dist-info/METADATA deleted file mode 100644 index f96613c4b..000000000 --- a/libs/blinker-1.7.0.dist-info/METADATA +++ /dev/null @@ -1,62 +0,0 @@ -Metadata-Version: 2.1 -Name: blinker -Version: 1.7.0 -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.8 -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/libs/blinker-1.7.0.dist-info/RECORD b/libs/blinker-1.7.0.dist-info/RECORD deleted file mode 100644 index c7ee02670..000000000 --- a/libs/blinker-1.7.0.dist-info/RECORD +++ /dev/null @@ -1,11 +0,0 @@ -blinker-1.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -blinker-1.7.0.dist-info/LICENSE.rst,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 -blinker-1.7.0.dist-info/METADATA,sha256=kDgzPgrw4he78pEX88bSAqwYMVWrfUMk8QmNjekjg_U,1918 -blinker-1.7.0.dist-info/RECORD,, -blinker-1.7.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -blinker-1.7.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -blinker/__init__.py,sha256=s75XaRDHwSDzZ21BZUOEkQDQIcQEyT8hT7vk3EhYFQU,408 -blinker/_saferef.py,sha256=kWOTIWnCY3kOb8lZP74Rbx7bR_BLVg4TjwzNCRLhKHs,9096 -blinker/_utilities.py,sha256=S2njKDmlBpK_yCK4RT8hq98hEj30I0TQCC5mNhtY22I,2856 -blinker/base.py,sha256=FqZmAI5YzuRrvRmye1Jb-utyVOjXtF5vUVP3-1u-HtU,20544 -blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/babelfish-0.6.0.dist-info/INSTALLER b/libs/blinker-1.8.2.dist-info/INSTALLER similarity index 100% rename from libs/babelfish-0.6.0.dist-info/INSTALLER rename to libs/blinker-1.8.2.dist-info/INSTALLER diff --git a/libs/blinker-1.7.0.dist-info/LICENSE.rst b/libs/blinker-1.8.2.dist-info/LICENSE.txt similarity index 100% rename from libs/blinker-1.7.0.dist-info/LICENSE.rst rename to libs/blinker-1.8.2.dist-info/LICENSE.txt diff --git a/libs/blinker-1.8.2.dist-info/METADATA b/libs/blinker-1.8.2.dist-info/METADATA new file mode 100644 index 000000000..efa45f598 --- /dev/null +++ b/libs/blinker-1.8.2.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: blinker +Version: 1.8.2 +Summary: Fast, simple object-to-object and broadcast signaling +Author: Jason Kirtland +Maintainer-email: Pallets Ecosystem +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Typing :: Typed +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://blinker.readthedocs.io +Project-URL: Source, 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". + + +## Pallets Community Ecosystem + +> [!IMPORTANT]\ +> This project is part of the Pallets Community Ecosystem. Pallets is the open +> source organization that maintains Flask; Pallets-Eco enables community +> maintenance of related projects. If you are interested in helping maintain +> this project, please reach out on [the Pallets Discord server][discord]. +> +> [discord]: https://discord.gg/pallets + + +## Example + +Signal receivers can subscribe to specific senders or receive signals +sent by any sender. + +```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! +``` + diff --git a/libs/blinker-1.8.2.dist-info/RECORD b/libs/blinker-1.8.2.dist-info/RECORD new file mode 100644 index 000000000..9aa4e59bf --- /dev/null +++ b/libs/blinker-1.8.2.dist-info/RECORD @@ -0,0 +1,10 @@ +blinker-1.8.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +blinker-1.8.2.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 +blinker-1.8.2.dist-info/METADATA,sha256=3tEx40hm9IEofyFqDPJsDPE9MAIEhtifapoSp7FqzuA,1633 +blinker-1.8.2.dist-info/RECORD,, +blinker-1.8.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +blinker-1.8.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +blinker/__init__.py,sha256=ymyJY_PoTgBzaPgdr4dq-RRsGh7D-sYQIGMNp8Rx4qc,1577 +blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675 +blinker/base.py,sha256=nIZJEtXQ8LLZZJrwVp2wQcdfCzDixvAHR9VpSWiyVcQ,22574 +blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/babelfish-0.6.0.dist-info/REQUESTED b/libs/blinker-1.8.2.dist-info/REQUESTED similarity index 100% rename from libs/babelfish-0.6.0.dist-info/REQUESTED rename to libs/blinker-1.8.2.dist-info/REQUESTED diff --git a/libs/blinker-1.7.0.dist-info/WHEEL b/libs/blinker-1.8.2.dist-info/WHEEL similarity index 100% rename from libs/blinker-1.7.0.dist-info/WHEEL rename to libs/blinker-1.8.2.dist-info/WHEEL diff --git a/libs/blinker/__init__.py b/libs/blinker/__init__.py index d014caa0f..c93527eca 100644 --- a/libs/blinker/__init__.py +++ b/libs/blinker/__init__.py @@ -1,19 +1,60 @@ -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 +from __future__ import annotations + +import typing as t + +from .base import ANY +from .base import default_namespace +from .base import NamedSignal +from .base import Namespace +from .base import Signal +from .base import signal __all__ = [ "ANY", + "default_namespace", "NamedSignal", "Namespace", "Signal", - "WeakNamespace", - "receiver_connected", "signal", ] -__version__ = "1.7.0" + +def __getattr__(name: str) -> t.Any: + import warnings + + if name == "__version__": + import importlib.metadata + + warnings.warn( + "The '__version__' attribute is deprecated and will be removed in" + " Blinker 1.9.0. Use feature detection or" + " 'importlib.metadata.version(\"blinker\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("blinker") + + if name == "receiver_connected": + from .base import _receiver_connected + + warnings.warn( + "The global 'receiver_connected' signal is deprecated and will be" + " removed in Blinker 1.9. Use 'Signal.receiver_connected' and" + " 'Signal.receiver_disconnected' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _receiver_connected + + if name == "WeakNamespace": + from .base import _WeakNamespace + + warnings.warn( + "'WeakNamespace' is deprecated and will be removed in Blinker 1.9." + " Use 'Namespace' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _WeakNamespace + + raise AttributeError(name) diff --git a/libs/blinker/_saferef.py b/libs/blinker/_saferef.py deleted file mode 100644 index dcb70c189..000000000 --- a/libs/blinker/_saferef.py +++ /dev/null @@ -1,230 +0,0 @@ -# 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/libs/blinker/_utilities.py b/libs/blinker/_utilities.py index 4b711c67d..000c902a2 100644 --- a/libs/blinker/_utilities.py +++ b/libs/blinker/_utilities.py @@ -1,105 +1,64 @@ from __future__ import annotations +import collections.abc as c +import inspect import typing as t from weakref import ref +from weakref import WeakMethod -from blinker._saferef import BoundMethodWeakref +T = t.TypeVar("T") -IdentityType = t.Union[t.Tuple[int, int], str, int] +class Symbol: + """A constant symbol, nicer than ``object()``. Repeated calls return the + same instance. -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') + >>> Symbol('foo') is Symbol('foo') True - >>> symbol('foo') + >>> 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] + symbols: t.ClassVar[dict[str, Symbol]] = {} - def __new__(cls, name): - try: + def __new__(cls, name: str) -> Symbol: + if name in cls.symbols: 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)): + obj = super().__new__(cls) + cls.symbols[name] = obj 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 __init__(self, name: str) -> None: + self.name = name + def __repr__(self) -> str: + return self.name -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 __getnewargs__(self) -> tuple[t.Any, ...]: + return (self.name,) -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) +def make_id(obj: object) -> c.Hashable: + """Get a stable identifier for a receiver or sender, to be used as a dict + key or in a set. + """ + if inspect.ismethod(obj): + # The id of a bound method is not stable, but the id of the unbound + # function and instance are. + return id(obj.__func__), id(obj.__self__) + + if isinstance(obj, (str, int)): + # Instances with the same value always compare equal and have the same + # hash, even if the id may change. + return obj + # Assume other types are not hashable but will always be the same instance. + return id(obj) -class lazy_property: - """A @property that is only evaluated once.""" - def __init__(self, deferred): - self._deferred = deferred - self.__doc__ = deferred.__doc__ +def make_ref(obj: T, callback: c.Callable[[ref[T]], None] | None = None) -> ref[T]: + if inspect.ismethod(obj): + return WeakMethod(obj, callback) # type: ignore[arg-type, return-value] - def __get__(self, obj, cls): - if obj is None: - return self - value = self._deferred(obj) - setattr(obj, self._deferred.__name__, value) - return value + return ref(obj, callback) diff --git a/libs/blinker/base.py b/libs/blinker/base.py index b9d703586..ec494b141 100644 --- a/libs/blinker/base.py +++ b/libs/blinker/base.py @@ -1,213 +1,176 @@ -"""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 collections.abc as c import typing as t +import warnings +import weakref from collections import defaultdict +from contextlib import AbstractContextManager from contextlib import contextmanager +from functools import cached_property from inspect import iscoroutinefunction -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 lazy_property -from blinker._utilities import reference -from blinker._utilities import symbol -from blinker._utilities import WeakTypes +from ._utilities import make_id +from ._utilities import make_ref +from ._utilities import Symbol if t.TYPE_CHECKING: - import typing_extensions as te + F = t.TypeVar("F", bound=c.Callable[..., t.Any]) - T_callable = t.TypeVar("T_callable", bound=t.Callable[..., t.Any]) +ANY = Symbol("ANY") +"""Symbol for "any sender".""" - 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 -# NOTE: We need a reference to cast for use in weakref callbacks otherwise -# t.cast may have already been set to None during finalization. -cast = t.cast - class Signal: - """A notification emitter.""" + """A notification emitter. + + :param doc: The docstring for the signal. + """ - #: An :obj:`ANY` convenience synonym, allows ``Signal.ANY`` - #: without an additional import. ANY = ANY + """An alias for the :data:`~blinker.ANY` sender symbol.""" + + set_class: type[set[t.Any]] = set + """The set class to use for tracking connected receivers and senders. + Python's ``set`` is unordered. If receivers must be dispatched in the order + they were connected, an ordered set implementation can be used. - set_class: type[set] = set + .. versionadded:: 1.7 + """ - @lazy_property + @cached_property def receiver_connected(self) -> Signal: - """Emitted after each :meth:`connect`. + """Emitted at the end of each :meth:`connect` call. The signal sender is the signal instance, and the :meth:`connect` - arguments are passed through: *receiver*, *sender*, and *weak*. + arguments are passed through: ``receiver``, ``sender``, and ``weak``. .. versionadded:: 1.2 - """ return Signal(doc="Emitted after a receiver connects.") - @lazy_property + @cached_property def receiver_disconnected(self) -> Signal: - """Emitted after :meth:`disconnect`. + """Emitted at the end of each :meth:`disconnect` call. The sender is the signal instance, and the :meth:`disconnect` arguments - are passed through: *receiver* and *sender*. + 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. + This signal is emitted **only** when :meth:`disconnect` is called + explicitly. This signal cannot be emitted by an automatic disconnect + when a weakly referenced receiver or sender goes out of scope, as the + instance is no longer be available to be used as the sender for this + signal. 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( - self.set_class - ) - self._by_sender: dict[IdentityType, set[IdentityType]] = defaultdict( - self.set_class - ) - 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. + self.receivers: dict[ + t.Any, weakref.ref[c.Callable[..., t.Any]] | c.Callable[..., t.Any] + ] = {} + """The map of connected receivers. Useful to quickly check if any + receivers are connected to the signal: ``if s.receivers:``. The + structure and data is not part of the public API, but checking its + boolean value is. + """ + self.is_muted: bool = False + self._by_receiver: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) + self._by_sender: dict[t.Any, set[t.Any]] = defaultdict(self.set_class) + self._weak_senders: dict[t.Any, weakref.ref[t.Any]] = {} + + def connect(self, receiver: F, sender: t.Any = ANY, weak: bool = True) -> F: + """Connect ``receiver`` to be called when the signal is sent by + ``sender``. + + :param receiver: The callable to call when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument + along with any extra keyword arguments. + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. A receiver may be connected + to multiple senders by calling :meth:`connect` multiple times. + :param weak: Track the receiver with a :mod:`weakref`. The receiver will + be automatically disconnected when it is garbage collected. When + connecting a receiver defined within a function, set to ``False``, + otherwise it will be disconnected when the function scope ends. """ - receiver_id = hashable_identity(receiver) - receiver_ref: T_callable | annotatable_weakref + receiver_id = make_id(receiver) + sender_id = ANY_ID if sender is ANY else make_id(sender) 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 + self.receivers[receiver_id] = make_ref( + receiver, self._make_cleanup_receiver(receiver_id) + ) else: - sender_id = hashable_identity(sender) + self.receivers[receiver_id] = receiver - 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 + # store a cleanup for weakref-able senders try: - sender_ref = reference(sender, self._cleanup_sender) - sender_ref.sender_id = sender_id + self._weak_senders[sender_id] = make_ref( + sender, self._make_cleanup_sender(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: + except TypeError: + # TODO no explanation or test for this self.disconnect(receiver, sender) - raise e - if receiver_connected.receivers and self is not receiver_connected: + raise + + if _receiver_connected.receivers and self is not _receiver_connected: try: - receiver_connected.send( + _receiver_connected.send( self, receiver_arg=receiver, sender_arg=sender, weak_arg=weak ) - except TypeError as e: + except TypeError: 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*. + raise - :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. + return receiver - :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. + def connect_via(self, sender: t.Any, weak: bool = False) -> c.Callable[[F], F]: + """Connect the decorated function to be called when the signal is sent + by ``sender``. - 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`. + The decorated function will be called when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument along + with any extra keyword arguments. + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. A receiver may be connected + to multiple senders by calling :meth:`connect` multiple times. + :param weak: Track the receiver with a :mod:`weakref`. The receiver will + be automatically disconnected when it is garbage collected. When + connecting a receiver defined within a function, set to ``False``, + otherwise it will be disconnected when the function scope ends.= .. versionadded:: 1.1 - """ - def decorator(fn: T_callable) -> T_callable: + def decorator(fn: F) -> F: self.connect(fn, sender, weak) return fn @@ -215,208 +178,235 @@ def decorator(fn: T_callable) -> T_callable: @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) + self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY + ) -> c.Generator[None, None, None]: + """A context manager that temporarily connects ``receiver`` to the + signal while a ``with`` block executes. When the block exits, the + receiver is disconnected. Useful for tests. + + :param receiver: The callable to call when :meth:`send` is called with + the given ``sender``, passing ``sender`` as a positional argument + along with any extra keyword arguments. + :param sender: Any object or :data:`ANY`. ``receiver`` will only be + called when :meth:`send` is called with this sender. If ``ANY``, the + receiver will be called for any sender. .. 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. + def muted(self) -> c.Generator[None, None, None]: + """A context manager that temporarily disables the signal. No receivers + will be called if the signal is sent, until the ``with`` block exits. + Useful for tests. """ 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`. + self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY + ) -> AbstractContextManager[None]: + """Deprecated alias for :meth:`connected_to`. - :param receiver: a receiver callable - :param sender: optional, a sender to filter on + .. deprecated:: 1.1 + Renamed to ``connected_to``. Will be removed in Blinker 1.9. .. 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.", + warnings.warn( + "'temporarily_connected_to' is renamed to 'connected_to'. The old name is" + " deprecated and will be removed in Blinker 1.9.", DeprecationWarning, + stacklevel=2, ) return self.connected_to(receiver, sender) def send( self, - *sender: t.Any, - _async_wrapper: AsyncWrapperType | None = None, + sender: t.Any | None = None, + /, + *, + _async_wrapper: c.Callable[ + [c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]]], c.Callable[..., t.Any] + ] + | 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. + ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: + """Call all receivers that are connected to the given ``sender`` + or :data:`ANY`. Each receiver is called with ``sender`` as a positional + argument along with any extra keyword arguments. Return a list of + ``(receiver, return value)`` tuples. + + The order receivers are called is undefined, but can be influenced by + setting :attr:`set_class`. + + If a receiver raises an exception, that exception will propagate up. + This makes debugging straightforward, with an assumption that correctly + implemented receivers will not raise. + + :param sender: Call receivers connected to this sender, in addition to + those connected to :data:`ANY`. + :param _async_wrapper: Will be called on any receivers that are async + coroutines to turn them into sync callables. For example, could run + the receiver with an event loop. + :param kwargs: Extra keyword arguments to pass to each receiver. + + .. versionchanged:: 1.7 + Added the ``_async_wrapper`` argument. """ if self.is_muted: return [] - sender = self._extract_sender(sender) results = [] + for receiver in self.receivers_for(sender): if iscoroutinefunction(receiver): if _async_wrapper is None: - raise RuntimeError("Cannot send to a coroutine function") - receiver = _async_wrapper(receiver) - result = receiver(sender, **kwargs) + raise RuntimeError("Cannot send to a coroutine function.") + + result = _async_wrapper(receiver)(sender, **kwargs) + else: + result = receiver(sender, **kwargs) + results.append((receiver, result)) + return results async def send_async( self, - *sender: t.Any, - _sync_wrapper: SyncWrapperType | None = None, + sender: t.Any | None = None, + /, + *, + _sync_wrapper: c.Callable[ + [c.Callable[..., t.Any]], c.Callable[..., c.Coroutine[t.Any, t.Any, t.Any]] + ] + | 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. + ) -> list[tuple[c.Callable[..., t.Any], t.Any]]: + """Await all receivers that are connected to the given ``sender`` + or :data:`ANY`. Each receiver is called with ``sender`` as a positional + argument along with any extra keyword arguments. Return a list of + ``(receiver, return value)`` tuples. + + The order receivers are called is undefined, but can be influenced by + setting :attr:`set_class`. + + If a receiver raises an exception, that exception will propagate up. + This makes debugging straightforward, with an assumption that correctly + implemented receivers will not raise. + + :param sender: Call receivers connected to this sender, in addition to + those connected to :data:`ANY`. + :param _sync_wrapper: Will be called on any receivers that are sync + callables to turn them into async coroutines. For example, + could call the receiver in a thread. + :param kwargs: Extra keyword arguments to pass to each receiver. + + .. versionadded:: 1.7 """ if self.is_muted: return [] - sender = self._extract_sender(sender) results = [] + for receiver in self.receivers_for(sender): if not iscoroutinefunction(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 [] + raise RuntimeError("Cannot send to a non-coroutine function.") - # 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 + result = await _sync_wrapper(receiver)(sender, **kwargs) + else: + result = await receiver(sender, **kwargs) - def has_receivers_for(self, sender: t.Any) -> bool: - """True if there is probably a receiver for *sender*. + results.append((receiver, result)) - Performs an optimistic check only. Does not guarantee that all - weakly referenced receivers are still alive. See - :meth:`receivers_for` for a stronger search. + return results + def has_receivers_for(self, sender: t.Any) -> bool: + """Check if there is at least one receiver that will be called with the + given ``sender``. A receiver connected to :data:`ANY` will always be + called, regardless of sender. Does not check if weakly referenced + receivers are still live. See :meth:`receivers_for` for a stronger + search. + + :param sender: Check for receivers connected to this sender, in addition + to those connected to :data:`ANY`. """ 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 + + return make_id(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*.""" + ) -> c.Generator[c.Callable[..., t.Any], None, None]: + """Yield each receiver to be called for ``sender``, in addition to those + to be called for :data:`ANY`. Weakly referenced receivers that are not + live will be disconnected and skipped. + + :param sender: Yield receivers connected to this sender, in addition + to those connected to :data:`ANY`. + """ # 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] + if not self.receivers: + return + + sender_id = make_id(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, weakref.ref): + strong = receiver() - def disconnect(self, receiver: t.Callable, sender: t.Any = ANY) -> None: - """Disconnect *receiver* from this signal's events. + if strong is None: + self._disconnect(receiver_id, ANY_ID) + continue - :param receiver: a previously :meth:`connected` callable + yield strong + else: + yield receiver - :param sender: a specific sender to disconnect from, or :obj:`ANY` - to disconnect from all senders. Defaults to ``ANY``. + def disconnect(self, receiver: c.Callable[..., t.Any], sender: t.Any = ANY) -> None: + """Disconnect ``receiver`` from being called when the signal is sent by + ``sender``. + :param receiver: A connected receiver callable. + :param sender: Disconnect from only this sender. By default, disconnect + from all senders. """ - sender_id: IdentityType + sender_id: c.Hashable + if sender is ANY: sender_id = ANY_ID else: - sender_id = hashable_identity(sender) - receiver_id = hashable_identity(receiver) + sender_id = make_id(sender) + + receiver_id = make_id(receiver) self._disconnect(receiver_id, sender_id) if ( @@ -425,63 +415,80 @@ def disconnect(self, receiver: t.Callable, sender: t.Any = ANY) -> None: ): self.receiver_disconnected.send(self, receiver=receiver, sender=sender) - def _disconnect(self, receiver_id: IdentityType, sender_id: IdentityType) -> None: + def _disconnect(self, receiver_id: c.Hashable, sender_id: c.Hashable) -> None: if sender_id == ANY_ID: - if self._by_receiver.pop(receiver_id, False): + if self._by_receiver.pop(receiver_id, None) is not None: 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(cast(IdentityType, receiver_ref.receiver_id), ANY_ID) + def _make_cleanup_receiver( + self, receiver_id: c.Hashable + ) -> c.Callable[[weakref.ref[c.Callable[..., t.Any]]], None]: + """Create a callback function to disconnect a weakly referenced + receiver when it is garbage collected. + """ + + def cleanup(ref: weakref.ref[c.Callable[..., t.Any]]) -> None: + self._disconnect(receiver_id, ANY_ID) + + return cleanup - def _cleanup_sender(self, sender_ref: annotatable_weakref) -> None: - """Disconnect all receivers from a sender.""" - sender_id = cast(IdentityType, sender_ref.sender_id) + def _make_cleanup_sender( + self, sender_id: c.Hashable + ) -> c.Callable[[weakref.ref[t.Any]], None]: + """Create a callback function to disconnect all receivers for a weakly + referenced sender when it is garbage collected. + """ 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(ref: weakref.ref[t.Any]) -> None: + 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) + + return cleanup 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. + Connecting & disconnecting leaves behind a small amount of bookkeeping + data. 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.) + With a long-running process performing dynamic signal routing with high + volume, e.g. connecting to function closures, senders are all unique + object instances. Doing all of this over and over may cause memory usage + to 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. + 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()): + for ident, bucket in list(mapping.items()): if not bucket: - mapping.pop(_id, None) + mapping.pop(ident, None) def _clear_state(self) -> None: - """Throw away all signal state. Useful for unit tests.""" + """Disconnect all receivers and senders. Useful for tests.""" self._weak_senders.clear() self.receivers.clear() self._by_sender.clear() self._by_receiver.clear() -receiver_connected = Signal( +_receiver_connected = Signal( """\ Sent by a :class:`Signal` after a receiver connects. @@ -491,68 +498,124 @@ def _clear_state(self) -> None: :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. - + Individual signals have their own :attr:`~Signal.receiver_connected` and + :attr:`~Signal.receiver_disconnected` signals with a slightly simplified + call signature. This global signal will be removed in Blinker 1.9. """ ) class NamedSignal(Signal): - """A named generic notification emitter.""" + """A named generic notification emitter. The name is not used by the signal + itself, but matches the key in the :class:`Namespace` that it belongs to. + + :param name: The name of the signal within the namespace. + :param doc: The docstring for the signal. + """ def __init__(self, name: str, doc: str | None = None) -> None: - Signal.__init__(self, doc) + super().__init__(doc) #: The name of this signal. - self.name = name + self.name: str = name def __repr__(self) -> str: - base = Signal.__repr__(self) + base = super().__repr__() return f"{base[:-1]}; {self.name!r}>" # noqa: E702 -class Namespace(dict): - """A mapping of signal names to signals.""" +if t.TYPE_CHECKING: + + class PNamespaceSignal(t.Protocol): + def __call__(self, name: str, doc: str | None = None) -> NamedSignal: ... - def signal(self, name: str, doc: str | None = None) -> NamedSignal: - """Return the :class:`NamedSignal` *name*, creating it if required. + # Python < 3.9 + _NamespaceBase = dict[str, NamedSignal] # type: ignore[misc] +else: + _NamespaceBase = dict - Repeated calls to this function will return the same signal object. +class Namespace(_NamespaceBase): + """A dict mapping names to signals.""" + + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` for the given ``name``, creating it + if required. Repeated calls with the same name return the same signal. + + :param name: The name of the signal. + :param doc: The docstring of the signal. """ - 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] + if name not in self: + self[name] = NamedSignal(name, doc) + return self[name] -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. +class _WeakNamespace(WeakValueDictionary): # type: ignore[type-arg] + """A weak mapping of names to signals. - .. versionadded:: 1.3 + Automatically cleans up unused signals when the last reference goes out + of scope. This namespace implementation provides similar behavior to Blinker + <= 1.2. + + .. deprecated:: 1.3 + Will be removed in Blinker 1.9. + .. versionadded:: 1.3 """ - def signal(self, name: str, doc: str | None = None) -> NamedSignal: - """Return the :class:`NamedSignal` *name*, creating it if required. + def __init__(self) -> None: + warnings.warn( + "'WeakNamespace' is deprecated and will be removed in Blinker 1.9." + " Use 'Namespace' instead.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__() - Repeated calls to this function will return the same signal object. + def signal(self, name: str, doc: str | None = None) -> NamedSignal: + """Return the :class:`NamedSignal` for the given ``name``, creating it + if required. Repeated calls with the same name return the same signal. + :param name: The name of the signal. + :param doc: The docstring of the signal. """ - 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] + if name not in self: + self[name] = NamedSignal(name, doc) + + return self[name] # type: ignore[no-any-return] + + +default_namespace: Namespace = Namespace() +"""A default :class:`Namespace` for creating named signals. :func:`signal` +creates a :class:`NamedSignal` in this namespace. +""" +signal: PNamespaceSignal = default_namespace.signal +"""Return a :class:`NamedSignal` in :data:`default_namespace` with the given +``name``, creating it if required. Repeated calls with the same name return the +same signal. +""" + + +def __getattr__(name: str) -> t.Any: + if name == "receiver_connected": + warnings.warn( + "The global 'receiver_connected' signal is deprecated and will be" + " removed in Blinker 1.9. Use 'Signal.receiver_connected' and" + " 'Signal.receiver_disconnected' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _receiver_connected + + if name == "WeakNamespace": + warnings.warn( + "'WeakNamespace' is deprecated and will be removed in Blinker 1.9." + " Use 'Namespace' instead.", + DeprecationWarning, + stacklevel=2, + ) + return _WeakNamespace -signal = Namespace().signal + raise AttributeError(name) diff --git a/libs/certifi-2024.2.2.dist-info/RECORD b/libs/certifi-2024.2.2.dist-info/RECORD deleted file mode 100644 index 6b9028bec..000000000 --- a/libs/certifi-2024.2.2.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -certifi-2024.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2024.2.2.dist-info/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -certifi-2024.2.2.dist-info/METADATA,sha256=1noreLRChpOgeSj0uJT1mehiBl8ngh33Guc7KdvzYYM,2170 -certifi-2024.2.2.dist-info/RECORD,, -certifi-2024.2.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -certifi-2024.2.2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -certifi-2024.2.2.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=ljtEx-EmmPpTe2SOd5Kzsujm_lUD0fKJVnE9gzce320,94 -certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 -certifi/cacert.pem,sha256=ejR8qP724p-CtuR4U1WmY1wX-nVeCUD2XxWqj8e9f5I,292541 -certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426 -certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/blinker-1.7.0.dist-info/INSTALLER b/libs/certifi-2024.8.30.dist-info/INSTALLER similarity index 100% rename from libs/blinker-1.7.0.dist-info/INSTALLER rename to libs/certifi-2024.8.30.dist-info/INSTALLER diff --git a/libs/certifi-2024.2.2.dist-info/LICENSE b/libs/certifi-2024.8.30.dist-info/LICENSE similarity index 100% rename from libs/certifi-2024.2.2.dist-info/LICENSE rename to libs/certifi-2024.8.30.dist-info/LICENSE diff --git a/libs/certifi-2024.2.2.dist-info/METADATA b/libs/certifi-2024.8.30.dist-info/METADATA similarity index 96% rename from libs/certifi-2024.2.2.dist-info/METADATA rename to libs/certifi-2024.8.30.dist-info/METADATA index c688a6284..0a3a772a1 100644 --- a/libs/certifi-2024.2.2.dist-info/METADATA +++ b/libs/certifi-2024.8.30.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: certifi -Version: 2024.2.2 +Version: 2024.8.30 Summary: Python package for providing Mozilla's CA Bundle. Home-page: https://github.com/certifi/python-certifi Author: Kenneth Reitz @@ -20,6 +20,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 :: 3.12 Requires-Python: >=3.6 License-File: LICENSE diff --git a/libs/certifi-2024.8.30.dist-info/RECORD b/libs/certifi-2024.8.30.dist-info/RECORD new file mode 100644 index 000000000..66dcdfaaf --- /dev/null +++ b/libs/certifi-2024.8.30.dist-info/RECORD @@ -0,0 +1,12 @@ +certifi-2024.8.30.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2024.8.30.dist-info/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 +certifi-2024.8.30.dist-info/METADATA,sha256=GhBHRVUN6a4ZdUgE_N5wmukJfyuoE-QyIl8Y3ifNQBM,2222 +certifi-2024.8.30.dist-info/RECORD,, +certifi-2024.8.30.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +certifi-2024.8.30.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +certifi-2024.8.30.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=p_GYZrjUwPBUhpLlCZoGb0miKBKSqDAyZC5DvIuqbHQ,94 +certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 +certifi/cacert.pem,sha256=lO3rZukXdPyuk6BWUJFOKQliWaXH6HGh9l1GGrUgG0c,299427 +certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426 +certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/blinker-1.7.0.dist-info/REQUESTED b/libs/certifi-2024.8.30.dist-info/REQUESTED similarity index 100% rename from libs/blinker-1.7.0.dist-info/REQUESTED rename to libs/certifi-2024.8.30.dist-info/REQUESTED diff --git a/libs/apprise-1.7.6.dist-info/WHEEL b/libs/certifi-2024.8.30.dist-info/WHEEL similarity index 100% rename from libs/apprise-1.7.6.dist-info/WHEEL rename to libs/certifi-2024.8.30.dist-info/WHEEL diff --git a/libs/certifi-2024.2.2.dist-info/top_level.txt b/libs/certifi-2024.8.30.dist-info/top_level.txt similarity index 100% rename from libs/certifi-2024.2.2.dist-info/top_level.txt rename to libs/certifi-2024.8.30.dist-info/top_level.txt diff --git a/libs/certifi/__init__.py b/libs/certifi/__init__.py index 1c91f3ec9..f61d77fa3 100644 --- a/libs/certifi/__init__.py +++ b/libs/certifi/__init__.py @@ -1,4 +1,4 @@ from .core import contents, where __all__ = ["contents", "where"] -__version__ = "2024.02.02" +__version__ = "2024.08.30" diff --git a/libs/certifi/cacert.pem b/libs/certifi/cacert.pem index fac3c3190..3c165a1b8 100644 --- a/libs/certifi/cacert.pem +++ b/libs/certifi/cacert.pem @@ -3485,46 +3485,6 @@ DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- -# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH -# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH -# Label: "GLOBALTRUST 2020" -# Serial: 109160994242082918454945253 -# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 -# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 -# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG -A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw -FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx -MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u -aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b -RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z -YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 -QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw -yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ -BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ -SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH -r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 -4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me -dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw -q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 -nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu -H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA -VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC -XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd -6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf -+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi -kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 -wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB -TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C -MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn -4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I -aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy -qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== ------END CERTIFICATE----- - # Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz # Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz # Label: "ANF Secure Server Root CA" @@ -4812,3 +4772,158 @@ X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= -----END CERTIFICATE----- + +# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" +# Serial: 65916896770016886708751106294915943533 +# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 +# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 +# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf +e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C +cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O +BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw +hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG +XSaQpYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA CYBER Root CA" +# Serial: 85076849864375384482682434040119489222 +# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 +# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 +# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ +MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 +IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 +WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO +LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P +40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF +avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ +34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i +JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu +j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf +Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP +2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA +S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA +oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC +kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW +5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd +BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t +tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn +68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn +TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t +RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx +f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI +Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz +8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 +NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX +xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 +t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA12" +# Serial: 587887345431707215246142177076162061960426065942 +# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 +# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 +# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw +NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF +KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt +p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd +J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur +FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J +hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K +h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF +AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld +mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ +mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA +8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV +55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ +yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA14" +# Serial: 575790784512929437950770173562378038616896959179 +# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 +# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f +# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw +NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ +FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg +vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy +6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo +/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J +kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ +0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib +y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac +18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs +0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB +SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL +ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk +86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib +ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT +zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS +DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 +2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo +FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy +K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 +dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl +Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB +365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c +JRNItX+S +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA15" +# Serial: 126083514594751269499665114766174399806381178503 +# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 +# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d +# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw +UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM +dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy +NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl +cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 +IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 +wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR +ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT +9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp +4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 +bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- diff --git a/libs/chardet-5.2.0.dist-info/RECORD b/libs/chardet-5.2.0.dist-info/RECORD index 44d209b0e..34638cb2e 100644 --- a/libs/chardet-5.2.0.dist-info/RECORD +++ b/libs/chardet-5.2.0.dist-info/RECORD @@ -4,7 +4,7 @@ chardet-5.2.0.dist-info/LICENSE,sha256=3GJlINzVOiL3J68-5Cx3DlbJemT-OtsGN5nYqwMv5 chardet-5.2.0.dist-info/METADATA,sha256=PAr2NQ6hQWpjyFnwlI7MoxHt2S_6oRiUsucOKMNhzGw,3418 chardet-5.2.0.dist-info/RECORD,, chardet-5.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -chardet-5.2.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +chardet-5.2.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 chardet-5.2.0.dist-info/entry_points.txt,sha256=_cdvYc4jyY68GYfsQAAthNMxO-yodcGkvNC1xOEsLmI,59 chardet-5.2.0.dist-info/top_level.txt,sha256=AowzBbZy4x8EirABDdJSLJZMkJ_53iIag8xfKR6D7kI,8 chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797 diff --git a/libs/chardet-5.2.0.dist-info/WHEEL b/libs/chardet-5.2.0.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/chardet-5.2.0.dist-info/WHEEL +++ b/libs/chardet-5.2.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/charset_normalizer-3.3.2.dist-info/RECORD b/libs/charset_normalizer-3.3.2.dist-info/RECORD deleted file mode 100644 index 2ae6a4762..000000000 --- a/libs/charset_normalizer-3.3.2.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -../../bin/normalizer,sha256=DGK3Yd9Fs5jr7E7dCqKi353EqQgSyiH9aYN4XCZJnjk,256 -charset_normalizer-3.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -charset_normalizer-3.3.2.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 -charset_normalizer-3.3.2.dist-info/METADATA,sha256=cfLhl5A6SI-F0oclm8w8ux9wshL1nipdeCdVnYb4AaA,33550 -charset_normalizer-3.3.2.dist-info/RECORD,, -charset_normalizer-3.3.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer-3.3.2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -charset_normalizer-3.3.2.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 -charset_normalizer-3.3.2.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 -charset_normalizer/__init__.py,sha256=UzI3xC8PhmcLRMzSgPb6minTmRq0kWznnCBJ8ZCc2XI,1577 -charset_normalizer/__main__.py,sha256=JxY8bleaENOFlLRb9HfoeZCzAMnn2A1oGR5Xm2eyqg0,73 -charset_normalizer/api.py,sha256=WOlWjy6wT8SeMYFpaGbXZFN1TMXa-s8vZYfkL4G29iQ,21097 -charset_normalizer/cd.py,sha256=xwZliZcTQFA3jU0c00PRiu9MNxXTFxQkFLWmMW24ZzI,12560 -charset_normalizer/cli/__init__.py,sha256=D5ERp8P62llm2FuoMzydZ7d9rs8cvvLXqE-1_6oViPc,100 -charset_normalizer/cli/__main__.py,sha256=2F-xURZJzo063Ye-2RLJ2wcmURpbKeAzKwpiws65dAs,9744 -charset_normalizer/constant.py,sha256=p0IsOVcEbPWYPOdWhnhRbjK1YVBy6fs05C5vKC-zoxU,40481 -charset_normalizer/legacy.py,sha256=T-QuVMsMeDiQEk8WSszMrzVJg_14AMeSkmHdRYhdl1k,2071 -charset_normalizer/md.py,sha256=NkSuVLK13_a8c7BxZ4cGIQ5vOtGIWOdh22WZEvjp-7U,19624 -charset_normalizer/models.py,sha256=I5i0s4aKCCgLPY2tUY3pwkgFA-BUbbNxQ7hVkVTt62s,11624 -charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer/utils.py,sha256=teiosMqzKjXyAHXnGdjSBOgnBZwx-SkBbCLrx0UXy8M,11894 -charset_normalizer/version.py,sha256=iHKUfHD3kDRSyrh_BN2ojh43TA5-UZQjvbVIEFfpHDs,79 diff --git a/libs/certifi-2024.2.2.dist-info/INSTALLER b/libs/charset_normalizer-3.4.0.dist-info/INSTALLER similarity index 100% rename from libs/certifi-2024.2.2.dist-info/INSTALLER rename to libs/charset_normalizer-3.4.0.dist-info/INSTALLER diff --git a/libs/charset_normalizer-3.3.2.dist-info/LICENSE b/libs/charset_normalizer-3.4.0.dist-info/LICENSE similarity index 100% rename from libs/charset_normalizer-3.3.2.dist-info/LICENSE rename to libs/charset_normalizer-3.4.0.dist-info/LICENSE diff --git a/libs/charset_normalizer-3.3.2.dist-info/METADATA b/libs/charset_normalizer-3.4.0.dist-info/METADATA similarity index 98% rename from libs/charset_normalizer-3.3.2.dist-info/METADATA rename to libs/charset_normalizer-3.4.0.dist-info/METADATA index 822550e36..b19096b11 100644 --- a/libs/charset_normalizer-3.3.2.dist-info/METADATA +++ b/libs/charset_normalizer-3.4.0.dist-info/METADATA @@ -1,10 +1,10 @@ Metadata-Version: 2.1 Name: charset-normalizer -Version: 3.3.2 +Version: 3.4.0 Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. Home-page: https://github.com/Ousret/charset_normalizer Author: Ahmed TAHRI -Author-email: ahmed.tahri@cloudnursery.dev +Author-email: tahri.ahmed@proton.me License: MIT Project-URL: Bug Reports, https://github.com/Ousret/charset_normalizer/issues Project-URL: Documentation, https://charset-normalizer.readthedocs.io/en/latest @@ -22,6 +22,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Text Processing :: Linguistic Classifier: Topic :: Utilities @@ -293,6 +294,17 @@ tools. All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) + +### Added +- Argument `--no-preemptive` in the CLI to prevent the detector to search for hints. +- Support for Python 3.13 (#512) + +### Fixed +- Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch. +- Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537) +- Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381) + ## [3.3.2](https://github.com/Ousret/charset_normalizer/compare/3.3.1...3.3.2) (2023-10-31) ### Fixed diff --git a/libs/charset_normalizer-3.4.0.dist-info/RECORD b/libs/charset_normalizer-3.4.0.dist-info/RECORD new file mode 100644 index 000000000..8a6b94942 --- /dev/null +++ b/libs/charset_normalizer-3.4.0.dist-info/RECORD @@ -0,0 +1,22 @@ +../../bin/normalizer,sha256=DGK3Yd9Fs5jr7E7dCqKi353EqQgSyiH9aYN4XCZJnjk,256 +charset_normalizer-3.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-3.4.0.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 +charset_normalizer-3.4.0.dist-info/METADATA,sha256=WGbEW9ehh2spNJxo1M6sEGGZWmsQ-oj2DsMjV29zoms,34159 +charset_normalizer-3.4.0.dist-info/RECORD,, +charset_normalizer-3.4.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer-3.4.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +charset_normalizer-3.4.0.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 +charset_normalizer-3.4.0.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=UzI3xC8PhmcLRMzSgPb6minTmRq0kWznnCBJ8ZCc2XI,1577 +charset_normalizer/__main__.py,sha256=JxY8bleaENOFlLRb9HfoeZCzAMnn2A1oGR5Xm2eyqg0,73 +charset_normalizer/api.py,sha256=kMyNUqrfBZU22PP0pYKrSldtYUGA24wsGlXGLAKra7c,22559 +charset_normalizer/cd.py,sha256=xwZliZcTQFA3jU0c00PRiu9MNxXTFxQkFLWmMW24ZzI,12560 +charset_normalizer/cli/__init__.py,sha256=D5ERp8P62llm2FuoMzydZ7d9rs8cvvLXqE-1_6oViPc,100 +charset_normalizer/cli/__main__.py,sha256=zX9sV_ApU1d96Wb0cS04vulstdB4F0Eh7kLn-gevfw4,10411 +charset_normalizer/constant.py,sha256=uwoW87NicWZDTLviX7le0wdoYBbhBQDA4n1JtJo77ts,40499 +charset_normalizer/legacy.py,sha256=XJjkT0hejMH8qfAKz1ts8OUiBT18t2FJP3tJgLwUWwc,2327 +charset_normalizer/md.py,sha256=SIIZcENrslI7h3v4GigbFN61fRyE_wiCN1z9Ii3fBRo,20138 +charset_normalizer/models.py,sha256=oAMAcBSEY7CngbUXJp34Wc4Rl9NKJJjGmUwW3EPtk6g,12425 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=teiosMqzKjXyAHXnGdjSBOgnBZwx-SkBbCLrx0UXy8M,11894 +charset_normalizer/version.py,sha256=AX66S4ytQFdd6F5jbVU2OPMqYwFS5M3BkMvyX-3BKF8,79 diff --git a/libs/certifi-2024.2.2.dist-info/REQUESTED b/libs/charset_normalizer-3.4.0.dist-info/REQUESTED similarity index 100% rename from libs/certifi-2024.2.2.dist-info/REQUESTED rename to libs/charset_normalizer-3.4.0.dist-info/REQUESTED diff --git a/libs/certifi-2024.2.2.dist-info/WHEEL b/libs/charset_normalizer-3.4.0.dist-info/WHEEL similarity index 100% rename from libs/certifi-2024.2.2.dist-info/WHEEL rename to libs/charset_normalizer-3.4.0.dist-info/WHEEL diff --git a/libs/charset_normalizer-3.3.2.dist-info/entry_points.txt b/libs/charset_normalizer-3.4.0.dist-info/entry_points.txt similarity index 100% rename from libs/charset_normalizer-3.3.2.dist-info/entry_points.txt rename to libs/charset_normalizer-3.4.0.dist-info/entry_points.txt diff --git a/libs/charset_normalizer-3.3.2.dist-info/top_level.txt b/libs/charset_normalizer-3.4.0.dist-info/top_level.txt similarity index 100% rename from libs/charset_normalizer-3.3.2.dist-info/top_level.txt rename to libs/charset_normalizer-3.4.0.dist-info/top_level.txt diff --git a/libs/charset_normalizer/api.py b/libs/charset_normalizer/api.py index 0ba08e3a5..e3f2283b9 100644 --- a/libs/charset_normalizer/api.py +++ b/libs/charset_normalizer/api.py @@ -159,6 +159,8 @@ def from_bytes( results: CharsetMatches = CharsetMatches() + early_stop_results: CharsetMatches = CharsetMatches() + sig_encoding, sig_payload = identify_sig_or_bom(sequences) if sig_encoding is not None: @@ -221,16 +223,20 @@ def from_bytes( try: if is_too_large_sequence and is_multi_byte_decoder is False: str( - sequences[: int(50e4)] - if strip_sig_or_bom is False - else sequences[len(sig_payload) : int(50e4)], + ( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)] + ), encoding=encoding_iana, ) else: decoded_payload = str( - sequences - if strip_sig_or_bom is False - else sequences[len(sig_payload) :], + ( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :] + ), encoding=encoding_iana, ) except (UnicodeDecodeError, LookupError) as e: @@ -367,7 +373,13 @@ def from_bytes( and not lazy_str_hard_failure ): fallback_entry = CharsetMatch( - sequences, encoding_iana, threshold, False, [], decoded_payload + sequences, + encoding_iana, + threshold, + False, + [], + decoded_payload, + preemptive_declaration=specified_encoding, ) if encoding_iana == specified_encoding: fallback_specified = fallback_entry @@ -421,28 +433,58 @@ def from_bytes( ), ) - results.append( - CharsetMatch( - sequences, - encoding_iana, - mean_mess_ratio, - bom_or_sig_available, - cd_ratios_merged, - decoded_payload, - ) + current_match = CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + ( + decoded_payload + if ( + is_too_large_sequence is False + or encoding_iana in [specified_encoding, "ascii", "utf_8"] + ) + else None + ), + preemptive_declaration=specified_encoding, ) + results.append(current_match) + if ( encoding_iana in [specified_encoding, "ascii", "utf_8"] and mean_mess_ratio < 0.1 ): + # If md says nothing to worry about, then... stop immediately! + if mean_mess_ratio == 0.0: + logger.debug( + "Encoding detection: %s is most likely the one.", + current_match.encoding, + ) + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([current_match]) + + early_stop_results.append(current_match) + + if ( + len(early_stop_results) + and (specified_encoding is None or specified_encoding in tested) + and "ascii" in tested + and "utf_8" in tested + ): + probable_result: CharsetMatch = early_stop_results.best() # type: ignore[assignment] logger.debug( - "Encoding detection: %s is most likely the one.", encoding_iana + "Encoding detection: %s is most likely the one.", + probable_result.encoding, ) if explain: logger.removeHandler(explain_handler) logger.setLevel(previous_logger_level) - return CharsetMatches([results[encoding_iana]]) + + return CharsetMatches([probable_result]) if encoding_iana == sig_encoding: logger.debug( diff --git a/libs/charset_normalizer/cli/__main__.py b/libs/charset_normalizer/cli/__main__.py index f4bcbaac0..e7edd0fc8 100644 --- a/libs/charset_normalizer/cli/__main__.py +++ b/libs/charset_normalizer/cli/__main__.py @@ -109,6 +109,14 @@ def cli_detect(argv: Optional[List[str]] = None) -> int: dest="force", help="Replace file without asking if you are sure, use this flag with caution.", ) + parser.add_argument( + "-i", + "--no-preemptive", + action="store_true", + default=False, + dest="no_preemptive", + help="Disable looking at a charset declaration to hint the detector.", + ) parser.add_argument( "-t", "--threshold", @@ -133,21 +141,35 @@ def cli_detect(argv: Optional[List[str]] = None) -> int: args = parser.parse_args(argv) if args.replace is True and args.normalize is False: + if args.files: + for my_file in args.files: + my_file.close() print("Use --replace in addition of --normalize only.", file=sys.stderr) return 1 if args.force is True and args.replace is False: + if args.files: + for my_file in args.files: + my_file.close() print("Use --force in addition of --replace only.", file=sys.stderr) return 1 if args.threshold < 0.0 or args.threshold > 1.0: + if args.files: + for my_file in args.files: + my_file.close() print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) return 1 x_ = [] for my_file in args.files: - matches = from_fp(my_file, threshold=args.threshold, explain=args.verbose) + matches = from_fp( + my_file, + threshold=args.threshold, + explain=args.verbose, + preemptive_behaviour=args.no_preemptive is False, + ) best_guess = matches.best() @@ -155,9 +177,11 @@ def cli_detect(argv: Optional[List[str]] = None) -> int: print( 'Unable to identify originating encoding for "{}". {}'.format( my_file.name, - "Maybe try increasing maximum amount of chaos." - if args.threshold < 1.0 - else "", + ( + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "" + ), ), file=sys.stderr, ) @@ -258,8 +282,8 @@ def cli_detect(argv: Optional[List[str]] = None) -> int: try: x_[0].unicode_path = join(dir_path, ".".join(o_)) - with open(x_[0].unicode_path, "w", encoding="utf-8") as fp: - fp.write(str(best_guess)) + with open(x_[0].unicode_path, "wb") as fp: + fp.write(best_guess.output()) except IOError as e: print(str(e), file=sys.stderr) if my_file.closed is False: diff --git a/libs/charset_normalizer/constant.py b/libs/charset_normalizer/constant.py index 863490461..f8f2a811f 100644 --- a/libs/charset_normalizer/constant.py +++ b/libs/charset_normalizer/constant.py @@ -544,6 +544,8 @@ "|", '"', "-", + "(", + ")", } diff --git a/libs/charset_normalizer/legacy.py b/libs/charset_normalizer/legacy.py index 43aad21a9..3f6d49079 100644 --- a/libs/charset_normalizer/legacy.py +++ b/libs/charset_normalizer/legacy.py @@ -1,13 +1,24 @@ -from typing import Any, Dict, Optional, Union +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Optional from warnings import warn from .api import from_bytes from .constant import CHARDET_CORRESPONDENCE +# TODO: remove this check when dropping Python 3.7 support +if TYPE_CHECKING: + from typing_extensions import TypedDict + + class ResultDict(TypedDict): + encoding: Optional[str] + language: str + confidence: Optional[float] + def detect( byte_str: bytes, should_rename_legacy: bool = False, **kwargs: Any -) -> Dict[str, Optional[Union[str, float]]]: +) -> ResultDict: """ chardet legacy method Detect the encoding of the given byte string. It should be mostly backward-compatible. diff --git a/libs/charset_normalizer/md.py b/libs/charset_normalizer/md.py index 77897aae4..d834db0e4 100644 --- a/libs/charset_normalizer/md.py +++ b/libs/charset_normalizer/md.py @@ -236,7 +236,7 @@ def reset(self) -> None: # pragma: no cover @property def ratio(self) -> float: - if self._character_count <= 24: + if self._character_count <= 13: return 0.0 ratio_of_suspicious_range_usage: float = ( @@ -260,6 +260,7 @@ def __init__(self) -> None: self._buffer: str = "" self._buffer_accent_count: int = 0 + self._buffer_glyph_count: int = 0 def eligible(self, character: str) -> bool: return True @@ -279,6 +280,14 @@ def feed(self, character: str) -> None: and is_thai(character) is False ): self._foreign_long_watch = True + if ( + is_cjk(character) + or is_hangul(character) + or is_katakana(character) + or is_hiragana(character) + or is_thai(character) + ): + self._buffer_glyph_count += 1 return if not self._buffer: return @@ -291,17 +300,20 @@ def feed(self, character: str) -> None: self._character_count += buffer_length if buffer_length >= 4: - if self._buffer_accent_count / buffer_length > 0.34: + if self._buffer_accent_count / buffer_length >= 0.5: self._is_current_word_bad = True # Word/Buffer ending with an upper case accentuated letter are so rare, # that we will consider them all as suspicious. Same weight as foreign_long suspicious. - if ( + elif ( is_accentuated(self._buffer[-1]) and self._buffer[-1].isupper() and all(_.isupper() for _ in self._buffer) is False ): self._foreign_long_count += 1 self._is_current_word_bad = True + elif self._buffer_glyph_count == 1: + self._is_current_word_bad = True + self._foreign_long_count += 1 if buffer_length >= 24 and self._foreign_long_watch: camel_case_dst = [ i @@ -325,6 +337,7 @@ def feed(self, character: str) -> None: self._foreign_long_watch = False self._buffer = "" self._buffer_accent_count = 0 + self._buffer_glyph_count = 0 elif ( character not in {"<", ">", "-", "=", "~", "|", "_"} and character.isdigit() is False diff --git a/libs/charset_normalizer/models.py b/libs/charset_normalizer/models.py index a760b9c55..6f6b86b38 100644 --- a/libs/charset_normalizer/models.py +++ b/libs/charset_normalizer/models.py @@ -1,9 +1,10 @@ from encodings.aliases import aliases from hashlib import sha256 from json import dumps +from re import sub from typing import Any, Dict, Iterator, List, Optional, Tuple, Union -from .constant import TOO_BIG_SEQUENCE +from .constant import RE_POSSIBLE_ENCODING_INDICATION, TOO_BIG_SEQUENCE from .utils import iana_name, is_multi_byte_encoding, unicode_range @@ -16,6 +17,7 @@ def __init__( has_sig_or_bom: bool, languages: "CoherenceMatches", decoded_payload: Optional[str] = None, + preemptive_declaration: Optional[str] = None, ): self._payload: bytes = payload @@ -33,13 +35,13 @@ def __init__( self._string: Optional[str] = decoded_payload + self._preemptive_declaration: Optional[str] = preemptive_declaration + def __eq__(self, other: object) -> bool: if not isinstance(other, CharsetMatch): - raise TypeError( - "__eq__ cannot be invoked on {} and {}.".format( - str(other.__class__), str(self.__class__) - ) - ) + if isinstance(other, str): + return iana_name(other) == self.encoding + return False return self.encoding == other.encoding and self.fingerprint == other.fingerprint def __lt__(self, other: object) -> bool: @@ -210,7 +212,24 @@ def output(self, encoding: str = "utf_8") -> bytes: """ if self._output_encoding is None or self._output_encoding != encoding: self._output_encoding = encoding - self._output_payload = str(self).encode(encoding, "replace") + decoded_string = str(self) + if ( + self._preemptive_declaration is not None + and self._preemptive_declaration.lower() + not in ["utf-8", "utf8", "utf_8"] + ): + patched_header = sub( + RE_POSSIBLE_ENCODING_INDICATION, + lambda m: m.string[m.span()[0] : m.span()[1]].replace( + m.groups()[0], iana_name(self._output_encoding) # type: ignore[arg-type] + ), + decoded_string[:8192], + 1, + ) + + decoded_string = patched_header + decoded_string[8192:] + + self._output_payload = decoded_string.encode(encoding, "replace") return self._output_payload # type: ignore @@ -266,7 +285,7 @@ def append(self, item: CharsetMatch) -> None: ) ) # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) - if len(item.raw) <= TOO_BIG_SEQUENCE: + if len(item.raw) < TOO_BIG_SEQUENCE: for match in self._results: if match.fingerprint == item.fingerprint and match.chaos == item.chaos: match.add_submatch(item) diff --git a/libs/charset_normalizer/version.py b/libs/charset_normalizer/version.py index 5a4da4ff4..699990ee2 100644 --- a/libs/charset_normalizer/version.py +++ b/libs/charset_normalizer/version.py @@ -2,5 +2,5 @@ Expose version """ -__version__ = "3.3.2" +__version__ = "3.4.0" VERSION = __version__.split(".") diff --git a/libs/colorama-0.4.6.dist-info/METADATA b/libs/colorama-0.4.6.dist-info/METADATA index 1578fb858..da6978d09 100644 --- a/libs/colorama-0.4.6.dist-info/METADATA +++ b/libs/colorama-0.4.6.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: colorama Version: 0.4.6 Summary: Cross-platform colored terminal text. diff --git a/libs/colorama-0.4.6.dist-info/RECORD b/libs/colorama-0.4.6.dist-info/RECORD index 6322d5289..609081b0d 100644 --- a/libs/colorama-0.4.6.dist-info/RECORD +++ b/libs/colorama-0.4.6.dist-info/RECORD @@ -1,8 +1,8 @@ colorama-0.4.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -colorama-0.4.6.dist-info/METADATA,sha256=ubxV5cANysw4jk90b-M6Lce_srsXfiORXZbYR5TcZpY,17191 +colorama-0.4.6.dist-info/METADATA,sha256=xqjWR7jNwuay0CWKzleP1SyyTj78i_e2mdgXlnqrJcA,17191 colorama-0.4.6.dist-info/RECORD,, colorama-0.4.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -colorama-0.4.6.dist-info/WHEEL,sha256=ccEkY-EGGllEs7ySpwBlD8G4u70wR77CNej8Q6tzIqA,105 +colorama-0.4.6.dist-info/WHEEL,sha256=fl6v0VwpzfGBVsGtkAkhILUlJxROXbA3HvRL6Fe3140,105 colorama-0.4.6.dist-info/licenses/LICENSE.txt,sha256=ysNcAmhuXQSlpxQL-zs25zrtSWZW6JEQLkKIhteTAxg,1491 colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 diff --git a/libs/colorama-0.4.6.dist-info/WHEEL b/libs/colorama-0.4.6.dist-info/WHEEL index b57fd92ff..24a7087ee 100644 --- a/libs/colorama-0.4.6.dist-info/WHEEL +++ b/libs/colorama-0.4.6.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/libs/dateutil/__init__.py b/libs/dateutil/__init__.py index 0defb82e2..a2c19c06f 100644 --- a/libs/dateutil/__init__.py +++ b/libs/dateutil/__init__.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import sys + try: from ._version import version as __version__ except ImportError: @@ -6,3 +8,17 @@ __all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz', 'utils', 'zoneinfo'] + +def __getattr__(name): + import importlib + + if name in __all__: + return importlib.import_module("." + name, __name__) + raise AttributeError( + "module {!r} has not attribute {!r}".format(__name__, name) + ) + + +def __dir__(): + # __dir__ should include all the lazy-importable modules as well. + return [x for x in globals() if x not in sys.modules] + __all__ diff --git a/libs/dateutil/_version.py b/libs/dateutil/_version.py index f6e010501..a229152e8 100644 --- a/libs/dateutil/_version.py +++ b/libs/dateutil/_version.py @@ -12,5 +12,5 @@ __version_tuple__: VERSION_TUPLE version_tuple: VERSION_TUPLE -__version__ = version = '2.8.2' -__version_tuple__ = version_tuple = (2, 8, 2) +__version__ = version = '2.9.0' +__version_tuple__ = version_tuple = (2, 9, 0) diff --git a/libs/dateutil/parser/isoparser.py b/libs/dateutil/parser/isoparser.py index 5d7bee380..7060087df 100644 --- a/libs/dateutil/parser/isoparser.py +++ b/libs/dateutil/parser/isoparser.py @@ -72,7 +72,7 @@ def isoparse(self, dt_str): Common: - ``YYYY`` - - ``YYYY-MM`` or ``YYYYMM`` + - ``YYYY-MM`` - ``YYYY-MM-DD`` or ``YYYYMMDD`` Uncommon: diff --git a/libs/dateutil/relativedelta.py b/libs/dateutil/relativedelta.py index a9e85f7e6..cd323a549 100644 --- a/libs/dateutil/relativedelta.py +++ b/libs/dateutil/relativedelta.py @@ -48,7 +48,7 @@ class relativedelta(object): the corresponding arithmetic operation on the original datetime value with the information in the relativedelta. - weekday: + weekday: One of the weekday instances (MO, TU, etc) available in the relativedelta module. These instances may receive a parameter N, specifying the Nth weekday, which could be positive or negative diff --git a/libs/dateutil/rrule.py b/libs/dateutil/rrule.py index b3203393c..571a0d2bc 100644 --- a/libs/dateutil/rrule.py +++ b/libs/dateutil/rrule.py @@ -182,7 +182,7 @@ def __contains__(self, item): # __len__() introduces a large performance penalty. def count(self): """ Returns the number of recurrences in this set. It will have go - trough the whole recurrence, if this hasn't been done before. """ + through the whole recurrence, if this hasn't been done before. """ if self._len is None: for x in self: pass diff --git a/libs/dateutil/tz/tz.py b/libs/dateutil/tz/tz.py index c67f56d46..617591446 100644 --- a/libs/dateutil/tz/tz.py +++ b/libs/dateutil/tz/tz.py @@ -34,7 +34,7 @@ from warnings import warn ZERO = datetime.timedelta(0) -EPOCH = datetime.datetime.utcfromtimestamp(0) +EPOCH = datetime.datetime(1970, 1, 1, 0, 0) EPOCHORDINAL = EPOCH.toordinal() diff --git a/libs/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/libs/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz index 524c48e12db7dfe159f282e4664f71ce249e1970..c2c4c1a047ff05c130bd1a88d1e43f3ffab32b3b 100644 GIT binary patch literal 156385 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 _5`h#8Swld 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 literal 174394 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 z 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 z zG_&YHk%{B;0H2AKT{Uvgwt9f$HE-V+O}^G!6<6jo^*NPkD_$-b){w!_6fpD+705EeJyk!_cBI^j#QQ0*01? zp=DrbIT%`DSX$9rKpf7o{`Tohlyg+E)2ll-Ur9p=Uw^vHHm^K=Ta0++4=sv<7G*p> zBF~INVejP=2{S+{GmGeIEMaJC82YJ3jV%mquTkTOeV|&5K)b@wZZNb54DAI&`@qnC zEDKigHdTI9Fu#a%?)wAR9X*B#aHl~T8vh#=-f zkhesTNg@a{F~po0@|GAfNep4W1~HGsiQgrM){#RcD7b1Upc0hOI!dU-4QSmBs003A2~-+4$y)>UN8indXpSh1Rh`CD@>KY)}byXdOFL zf&*H|vA*@~Mb_Fj;K2fGRVj8SD?52mM6~?j<%4BMpY)IOAGm@R?63ZJL)Y+(u&e9b zU_&U#mJ$qpVyV6a_&9sba~uGiPQaW6xJ_h_V)d(Ypr|h%vubmpHIp-A7<~Gdbz5zQ zV~p7Q&i0Qe3P!=lXfux;eRSLzLp?2cgL<1O^&2=%OuujZQO)>T-uxtK{^k675`)63 z-dWUvHSl9x(0deL=HVUR#UUm;LHT5C7XL z>)(x9TiC|O+tPTXF@Pjz^t$xq+yGvNT}UBR6`pCh4kyOygY#$qdy9zY7_ZR$gDNKa z1W=?!M2J=c6s|i70E0att4*ogYBt#AH?Yzs^~=+@Nf&WgEo#?$%5{J+FB>l0lRhZ) z?C&WsQML_lE@?ZOJdXo+iWXi!9LP_tTzk6SMbfll*l}H7HFROQ-T}cf*_z!w>A9WR zf6jh)pt4)0A8BFvb+4^VJF$Ty3t@n3|L72z{dh0@{mG@CPu}Cu#OB%}^V5%lL##!;Lk-EHf#js{ znyN`2EX95IOYDn9J-C-H_|81or^5pm=w_|qY@2O)weNnq(7Uqz7CT>V+jMT*dT!eh zZrej{TSm2Z4>dBYtNRUl41;%QkvaBPt%&~NQ)`L?3N!IhSpqX1iz%YK9up!VV2k zg>Ah;$(G$#NSE^{1=mph?>BS70>H(#&`CtuUSf&70MgG?nF#wnmpTC_NdCbyRlv3= z;;`QZ?{p3>KEOD2!mDp2KeFBqQk%3?xIc;Cym2v;zWDmL{B3vjhnW9=kM#M`__8mv z8yPf_*bmjSj+?$3)01->+YAPDmOZaunu>A-7Csg+VOvoC$7&XJOA!(_!+-+$+8LfB5;0x4a{mJ+EFiHs>$U? zvCqtwUd%#d&m76b=~wKdMo*-C=&xa}sZr^<>2;dV;~$jspHT+yTcm1e0ZWf6_U1yD zR#X@h#sB&??@iZ?yHUlXtYv~G${&)1bJ%r!R8cxxj&^#&$A07DLRk>W5}`~931#dv zj$zmK9V^Uw1SeKb9LZspp;}f?)?BiViTU)Xk-9Zm>GqKt#dsm(<2TgG5J)I@)cPQ| z!2K9&y=MwX_chk?ZdGa0lz6d)2t;iT8VOj&%-;K}aAXFK7=P?>U73+)tF^siFalD` z$Zcz=-9DRuQf7gKN<&ZFG}dNN6FVrXOT}GP|hwWXLppdH_F)`&a{EqBZNXs9keRd{s@D(*h=Y$ADe=R?x*Y-+%$AjkH}tUQlt8E1n(WmLF@ z2fu8fr~eK8`3%^q#vNxzqDtP;t4@4s^ZOUK2#AY&=X7Lv*Vmli#=$KYg>L>BhqYJ7 zp==l-Z4%IMcNl&H1?+7CEm%&ke~ZojE9Igle^2M}+NLEApt*s!yVUV|X9PS-0n50C z)J6WL;gUy3bF2XGdB))4HvMw)a94EzZ*U5T;G2Xr z$7lI@YP@Vmet-ELX$FXo4k0O|2)(L9K4!DQ(h0x{wTiO}@LZ^O?T?V}KAHua_QB3B zi@G0^nc?3h>KWP&4_Dwn(E?bPJ5Gh#tBz`4XOtt8!q(3WmX}GEB~4o~_s#Q8>{hZF zo%j)UD*aMUNe{76?){e41`RS#LU?`Ohc;sNR|VcycUx7Msvs2t>LHX99R~KoEqhlui zNzb2Qp2PX^>DQWuS$#^+=TnZ?c@z)pkE<=rYe^+kk+!K07(n!-JE%_qei1Pt7D9vh zDvahjDSu~xHPy*aP_|Y!kpF6DyA^xLmQl@knyegrCc2!X!)qVjGNvOhT{j2R28z58 zw?dq@3$<@LYehVLIGl1f`2NieaUK}$b;zS%%s1C*ds0p59>{xSG`m;7zg20?)-Y8L zv{t%cSi+ofgB#mI{H7U9=ndCVbq;}4d}x^BRHR7>{g7k9`tNM=49V5!i0#&|t)~sA z;g@T`>-3)&Tha_Negzvt;k)bWHq8T4@@=O%-KT%%@VoP~yUm2&%bEV+$TS>HvwptV zy|cf%*%w=yB;>0qL23dI0G(H>=z&`UB2h9N7pxttHh({F7+$NKd&h!&OT(vPr|GnN zPDQ`@tks#UmZWu7t=c{4l!pAzFCkm88+T0Xq<53mO-iowQ_8?QdWon}?}(v$A1jn8 zRXB-gQJlqP*Mw=w&F>OHQX+-<1;Cd=rl*kb(O#v1r4T_rs$CPJy{d0SXEsO#X;ix= zMtk)JjFuSE9Vz_AMUa@%S%YD8iPP*UUEMq{-*=+i+-sCRf-M6?dB1k*pO)5L2+x;o zsZfUeg9<=s9)uFEJP9aBeer8Y68dm5O#8ZE!vL9jx32o~39~pEv-}HAGA?fNj2S0b zp#VdIuo~@$U!PpGSvk8kyUAci;!Lq*%&9Lp>Exl>{G7U4NhnA>D}^I#9Nr{jg*4x~&@-o_9?Mk`^-6-m7 zljOkvA?&ZCqWZr0VO&xW2}M9a1f&E66r^ha=>}E|| zo4L>R{rP@>YyH-G)_VTAGxxRkew}kB?m1`geaA5?PxE`p;XAhvY`E-77VbZ5ur}~s? ziZK108Qj9ODhGA^ufE0ak7>;QiPjevVWRP|HS1$H-oR(Gm&Khm-f%?M)dNj#-OyZJ zzWde>LOxm0u=5fnya*m3xU2Xn&~yh`KyL?*(HFFiH9tPfCRL2s2EL=92NysmO4+#_ zNJx!0FXKl+c>v;P-aA+Df^A^(D^PawHRPLG?m2Z4ad(mMuIY@sO-mXQ>m$P8{-zj_ zo$UtK*}7G6RoPh2h?hBPVR|!pog0>up|kRCqe5lZdWHUoD;0-`>D176oj2`?0ChZ? zv&!X%TaGz+6!7E#`1@X33SSYpoxG=J%cM;x25@kR58!OIKwMEx@h?|o$OZgBy(2XO zv05TXc5YYdapvLG@h2+pGU5IBwFr^O*lhHh>xBx;LMJ5V_1#6QnvOShgQq{o9$$5W zFlmD9`JoWUbjG-n-s(7uu;MKzWyh$^Yfq+@@1K5hyKVB%4qOFIO|&T4UhM3t zo%(s4k?Kv!vSqmRpU_>(l*Hdjw$k#-HjYNUu1kN;=GOB#ZvN~z!R7=32JtyRSk8CK z+h~m_Tf!QfmQZ%YLoidrmJUj&IaP)rxLMm}rb+)H4a}fib&s?4)1kmA#*WDVZNvPL zY3|{YZJ)QWQ(xKs&qHJ!`!!ih<|W_Do<>sTZM3G3Y<34N?q!OGHA|<_&Zj4TSj+6s zhNn+TGFlwExWm7t&N50r+>{+{LNWKe&v?~krTdCd^h=zS&_#}j!-x?Zk8OpB#pwg< zGov6IJ@c{dGs?_}q0;=YQ~ZgwZg^=|TJ`kBaZKf5iIgcTyO@0+(%P0CrK`>%o^`K;{*1r- z;&*stRmh*dQ#2yvE|*f{;Fqd4Bc7bLD6O<;CS!hlVC=l3WFEfJoSJ^&7rWx6GW?=N zt^bW+zNxfOnK2pFA4gA3Gk!hjw4;1wO@rn14(vej&&lRu_Hx>?RthhJYzAUZYb_>n zm)C4&yU{&1fy1^>{uhmX&BqS26-4Sw(fE(oP3)?&B!tvwZ>&{GHa;?z=Z7U|e=p(W zeq@IgtLNqGpy7_dpHsCVe3sLuBqfnd(pMl;^@^Oz_a{BRAE&P7;$CMEib^Hc!9O%F zmeS}WmR~6(>&?AHD~aiN`Xd70RzAoVx#;0c^0uc13L?IvNsWi0V`qWSOK{0+e1G!N zX7imlkPrF(6d-cyLF>m5^LX)7gy^gX4flaKwjJb=Pb9{RNK6_dw1+upIBpNbU-?Ah ziZhZxda;P2#Tv$VUBA%FJlv3*K5mzZBuZ!92#lg(h<$D1;D-^79#H((r}_acM}Wdt zpGb0XM(%Z!@KYJz^#`X<-ATpr&N9<2GZ7tzs_d*eT5sb99*NHu@6F5O0vvaUBcL51 z9F~()97q)CjY^MICB7@0LMgXpX7&OP@9X(B+#S>`^5|+9mDKkE`ZMS@;twED3PfGZ zj*n4&?~_%3IPX|ykD7kr(g%|Lp@{-Yy6$Ype=uD){kUBGdpMPbQYlJB-nU*_TlBGA zQcQb^T$m+IY%Rb;Tk%n*#Qd|Y1ATJm6<@QwJ6Jtjc`Wv4%Tbf=pJY5Z@suo8-}#Iv zTt}q5tIBX4zpbrStHHoW!dj0U?}i|G^cwgc6Uu?56|Ql}`Tb+{KOT3aY9ELH_`OIN zX!d*aUN7c}lo5NG_~yy$5gGrP*ao9@QgVf;w&q{tgN-bH@Ls1pz5sv>1-*jXe_RHN z%+<5UE6^6WhXL%Mz##p7K1fTs%%RgINN$epgw4HO;9_kGExZ2{2DODr z&4oh~Hk*wRmFKvd<9edF<@)8rA&IXCSP~0cpGHeGwX>n_?Lzy-MKmUpEt@O1FIk>v zmNkJlHuP}sj$ZkVzEi3?NPoQdT)o-MlOC; zDu4|qA5|x~t*&59%^$MzD6`11C3^NqZ!RNNkY(%xw}1VM%EeE59uzi;JJ^`%Ytw%J zOK*fGx0Hm%OpEvNWblnPuFmghQxh@yUi1Wyt&6kEC%@OzbckYLCcX+(?@0&28%RuI z^OOG2_W_}NkjNkqCjyOLfkrZ*Q4(k* z9%X8h^J-);SQ2Cn0TrHu3Y?&V*)v3_RY0iSdK~!<4*78}E7!kKAlL+YdQiJp*pcO4 zgeY2Q&O6Z1K*XV09#iU0j54}aGK=sCBwwp~N z?#A_(%z3_b6ji*k6yEC|&L6z1ofvL~dc0gAjpe>t7!gp92@Vdp3&u#Lrao(bRk4{T zvnoYbOs+y7<2i~V0ws0+5dla1H}!0u^Z_HIJqIgvw0PGz zI8BO>1(w~Rig`)xc2K$Y$>GK<=7PxXaF?aK%!M-%S6{|f9V7h^4p@Oyn z$+_`^@dI-1ZeU;vz`<{<2gpd@>>?&j0OXdO{en+C%&o`Ad%1-DC8_WZt+RMtzQ!*! zwTOfT*Nz{x=V7m_OR%n=E;H3&)%_#>BW@1Mm44*Na_sCtRH?^e63*fOkZh zp%^QVKgg^>v@xE{@ewUS0{935_!kLDcln48Apt@J0m4L?%DwH>IFBBPVKnN5K7#x~ z!;yO+hDTF?hAHgx6NlgrCeE+F5A=P0J|_5sjk8O{dGkPw_QlU9L?7GH1kl8o)%2xU zX$r6~TYP>#Cwht02-_DcS{0Q)&z+Pntfibk`)KpYxazvZ zfweBjhW!k2s@Me#DdVy3+Lwdho+E9qVTD$5^TudErOr@P69uo(MLy@mBwtz{nNt34 zPQ}X#Na{=PZ|d|$`M8~hPbyuqm(_^ioe zGB(P~oq7&%2m7(zET2wU#QX-JkO>P~*g zmbf3>1YT+|`YZ30wLa=B%WWB%Eh{}l=J~$OH2Xhu`>tcW19*IgfyB--bQz$1e-(WW zB~=A#c)*E$Q8lBi#s$3IQc`~wSQ%+RO0=AuT&kD0mlBG8lbqD2KGdak@wz%axS?@z ztKWRq%!7sVzwYmzX%vVU6u)2IGrBh|=YRdax&JPrIQfL}D=O&UxAOHKu0IXD_Sm)Z zxG4@5+@CGv2G6%U0EnL&wHg7+6@YTdCY*(1eNXq;Kni6VMoPE%JjK+K%0ct;@Fs3) zv-|!=@mzGmR-j7blD|^bwrQZS&ciZk2{k!wv_baE->5rTFJ>K2r8$u z!^p{*U{1kE1Tw>}i|Nsfk{X@g~k zA@>tjQ*mt3=Y)6%lKm64Qa}B#{Tk&13QT?M+(Zc}4$tFHxaaA2}jF*%xzhKmd8DUkwp1LomMmQ8)|v(?ovMjF*dpL#%fddG9qp6R^G<` zVE-npar~vlO)IR{z+phtNZGN%JDYBC!hO|sR*-RcB2T&AGX|d6mp{PQVogk~-sDc& zvbdvSdfUOf(<(U6C)j-KzjWO2)HL5YV<&GvJ#QG#V7#f5m)AM1LAiC-VQj+ss>lI` zq+&$8v@}Lk5-Y(u6fZb#W@gu}-ZyMbZKa|$ZSMG5CJ1_1tDP;KR;F%l_@Dn=4^n6& z=iQ?nP0IUYALbMSZDxLRmH6_I{L7Cc>(|nrv%}zgBEex9CZ|~EeUZK}vaz-g^dr{M z+?|QEsWyn*) zi7)z2?&a|e<5sUQ*ZE9yP+B%m#DuhR>$thztUUF&ZI+`|ZE?hD%Op83s`{nYTpPLV z^@j)`tBg5wjhX*TN}2iBS@!GNbK^W&Nsj&)vPQ)^TYUy)SC;Rapt&H=M_|uLKG`hF`@tZV|iT5`18B9=Sbw`XX3+H@>PM*M>jj({B9q8Ur6u z+k~*_pu8PTbfE_do1@J)IPdUUz`ze9N^$WNs~Pj*tJKD=H~s&p(i*oq{!s}z4|x2e z^4yL0IDY!#^8@FRh*R(t-FbwZvcO~bxtMUXB50W?X3?CQ@b`g4!NbTlc{?9wNI4cx z_k%VHnnVmt4;*rTpU+Q-6wv(?A#WeyXri^fp_#$L>?pwc`Ub<#98!*t(~Z_9Al@xR zGb7#m90wB*mz>!5GaXSVre7T7EisM@dYcN3_9IMn-_NW>p}F2@z z#K?E#I6N3_W;ELPm{qb$e8xpPme@@VW&G6eEep=>Jr2@_B?vS`g>17cpIF3L8}Tit3+P;Or1@oL#uzh3WF%YU~;ay>Ej zYHR1(cH4C9QR=dSmpI^ZCYrj8->e0+UWzlh--=eJt_aP$W_s4HzZ`EcJ4=r7V6aW|$aWe2wG@o3 z@DY62xrnh!fNoFbTOSj!Z!_kk=pyY~U-Vu-W>F`(wC|8zaoPx$m}gnpq%h7sn})q= zgJIv}TfYZcaHBaCA$s!Q!?OoZa0A{@_ypsKlafF_U=xj^eF%8)gaPv55z#36ht3C2 zxFH`16q$@iCB|iSFh`x#NF^5p*_{lI!XY1?Dbg9MO7^}A$&0Dn&f3X&)9w?@Nh3)S zj^F%-;Z^wIk=MUhaL+T0SLnXM;)NF-DrX!2^=^9x0CW&2^tcCdCiaup;oO%%d4T3V z@FXQZF4-KGGsOpV-6{VYDNCaAhj-y7?#Xng?xVolVu0Zurhw>(vLd_T0KFwZ%^17_ zRdl!mpRS@XW7|Xc%|Hv9QLNnj15wdm%Vbe__x~xM0eb}~LfO=`cwGss2k?%Y zWxF|mZYG!5bz4)1a3C8L^;C z)X3DkEd?>AtweEka38WXvIWb%v9nV@A3v(v-{dxXZ;e~6_wTT=wA4}yMSi@oo_ve9 zx`k?yDU) znp#^mAI@Hj8(h8_=-*4nnsr^Qs?s#Lw5kf57N)e`a2}Z>J83j^ENMPWGFfvTxgiA! zI{w+vvX*&VIMbGSOf~vU3-5geg)f~~ZYJKa^AfLQxY|x16(1P{QIu9PK#y_yv z^Wk;{j}IE)guGY$Z#LQvgsib#0&02TRryBq#N%U@0YE|tKa`F1+!##?gorLM3jg1Mn`+Df+(PPU^g&G|fGcSTw?{F_OaKK# z7l;$N>^Lxr09Cd@DR~IMsvD1;(ktAgvToEobows^tefF?VqsJM!Y7qC%NNACEdvH` z2}US0PtWyz1)$5^pEmcJ(2ZJKivkCyVdR|9+M8At#@P!e zJEn>!bOY;}@=oLU4df>oHMPBe;^FpE%R;&l>~0Is#%W|CW}AM$zdNNoPcCGOW@W9A zRJvUaIyd*l8s6!H?S3BuRuq1u7cix1Z!26hX(*%YzKyTUiot}q2Ki6T8bmCOqnUI6 zXr-r7S<5YIGv;^QrcC78xG8C?tGmyoIDEUrRo~n`cQA1yHg);no34Kr$JMh%?LIt3 znAX66civ#hD}bC6lo&~=8+3!A-g+&?KHj>U6n6S<8c6Z}E>6vU`a;zJ^`}?9F7a1$ zaDTS*#zCIhJB==J76BGbRgIu8aktH%DTu5v{Olp+1UQ?jzoIH4rmo&$YwE1^B+6Lc zJf}2Qq&B37`typHHDYt9fEU~PPtN!TKL0Lw4Z9RV5~U!P@A(D)Wh>syW6W&d&)h_V z*nW$Uw=ZzwG1{Dd7L1?t{2E6m!4U7mNlHe`Gz(Ce^ikpYOP#MI&+hfj0zESoQouy? z=uyBA^vs+91w~(#kK%d1Ag@_z)wO7zk>bQ*iJKR$wM~%XbYY1*`>GhwOpxJVVT%X) zs(cmC>xR7Mq*XVjiA{?Mc(Jslv-iU_f$1C^>INK*f!Oe8tHz!nOnYmRl&!+F-GJm>mfp0o~?EwHn=?+jU zWS@kSujTSmOmu!{i3(GM@~8At?-+~)DRFeP8PV`q=Y0*^!^(-V~Bpr78h+=D-^Fg3#N&S4bTFT9}GKxhL@|HmC&3|z$KG+a=u z0>+oXWBevQfbzwgUHG&Ks_rDz3SKyNhl~Sw2bd7Xp@Km3WW&bCg6oYeh4I#4)1li| z0n4T3i%3f#{(BzAR`U=TyHt2cC}iQ%6PVblqj7jsyYg%thV^|DspsSrABy`np}A?u zY05HxZ~xoVt%g;pO)!Az;^K<5-3;dkoLwArKjlS6q@|JZ4eBS`z+4m~_4Nsh@@!V} z^%q6lrk|k}1xthPJQTeMUcS5J7hZ7MyKvA#RFe*~>Ug@WsFpR~RTyil~)*xcXbno@asg)Q^S$FxoS{{+F2i}d}C<&=`Mq%Kvj z=i69sMT7TgUuVmZbL@T?&?@VrsM9WGo`4P3%tMwC*OKB zidy}_C{Waef^PUdB-CuS4MSzPSV(OD|HZn8&{UM3HBJ+JB;bE#g&!LuCo!+2N4H1N zHGbz;Qehr5_QAmXH2S4xbLa~_^~*H5DrK!_JRFGy)icrhGbcN5>h5I3zZ5YLFYvBk zur-g4_AI(**=E8NJYXromF+1u{K$))v8AcnV==`rFl55A* zaRYkpcq5ZlUh%liFS2(iV%T)j-Xq&uD;F50xAGSla?%FzQZ~@rn1cmnFdB%GEQ)>E zbC2g?Go*p;f?tDGnwE1m=M++M*^K((){wyV+AT|vuVsexsaKJp)4nuM2=pOLyL^Cj zsbGO>6y@I@oE@~_H7u+*bD37RQ0JXTb}_%Ld4q^H;QPFj(*K*=K5(k~y#HsQqm{oj zhuSORp4lw-<;=(5D`&o?x=m0~@#VdB*Gd=6bCdZpn8$p$!qki>E##8G>7ZQB#)EV* zp4gnK9gTU&QX7P*3fr01Ay289<{7SQeaee6)>~-ch;ti9q8TEL|`#Uox4Sxwiz zFk7+St7~8)*&tCexKh46(93_OB>QPKy>Uvnpi?AwhHTj;h14~JQ`qe%Tg9~k19M{) z+fJtp!)#eA+jWP*kL*!0o*u4B&eQFtS{+u51!ih$=G3&s_OwQOy)SdF9VP7drYkQ7 zlwj_2(e00sWD7~zrX(iu2P&0xhgHU8)@lx(CUXw8BE{?Rq18kB9{CQ_O9r*gZp3j- zr^fTm%ylfMT4}ZVTK-_#64Lv3U9xn-@gjOC-@o~khSa6K$}^8}!x7wl^P=~|>#9^) zA1}~p9#iiiv@)Z-rCw0%n64Lcj*ZB4O0Pa-@uU~=i?8=nISYAS=tDzFw2tog84?-V z*c@sW5NZV>BET6#6BDB8eTa$XOG8Wa0n;xO0!IJT(8UyJdT}wud})}8K4AG32ZWYG zB1v&pqo+TwGnBRAC>Z!hB{pNzab8l8#7RHT>@$3;h9PEk@;r0_Li7SBnwT>y=AEGt zlTpA!zcUCCHO>hJ?SqLYCa)d@5UFH$bw0om`x*X}7>gzV4afe0IE@bx?un4X>)zA1 z6*NYEV(CHOv5DHnmV&-NbfadZfdu0aiK7Q3KA?R)p~9t#CaL`H*&jT1#{B#sd< zL&VvJChmljbo78$1cF0E^a?Y82#r<>g7cIp3p3y?8m$rp=NUJ>LJm%n3L33ufI_(s z5t}&UCrB_E5ju82FdD59B$%AY4?Ca$jn)bhOi6_PFrXKW)(H|!MN2G1^C2PjZ`ib{rC->>Z}PCDv0g z+ShGby&W!1L@J>jGKYIj)zVo^AwRu$~2DxHOD3ShXN6qrjvDhVA?G zc((G~0fVwjZL}>sQ#+j#2o-YflCI=* zuCqei){9vGl|MO~7yUylDEx})9Ilx$dL=2`;9tr_t(UuOFQN~#8ksbG89Z)kotTr~ z%q5-f1%(Tr7uq|_QKdOKM@go0u^vCL7u0! z*KI76iB4`crbi=hwn>DMQM~6(8TU;h9IzGq3Pi>j z$I=*8Kk%af5n&Md5t(iL9$Z#aARZn+8rbL($_WarWxkO+_l_YS~u2Nc$*t;x`XQ& z4`+@p(w3#H_NvS~1TQqNk+oi~9WHxGcbB`u@Bz3&(<$KS+QmjK!?AICyqY}^TO_Nw zj9EDkI%v(lT@pq?AKxO&yFD&>++Z{L-aVJzH;DWouc>~nm8!J)S|mrm0^iZu{ufET zHDUsGa^b-io>wc8bY?RvZU;}pI~Vx&Pv_-{TkALGzes0$U3j}m6dm+5W-NN_Pb3}m zP#!FMc=j9~K&ciR>#iCSYBOAW8ZP&y>j(rJj%zU2?6=C*<*AkVgaM9@;T$%ZD-(;= za$9L-7cBJ+r0$#`|UNmo`?lc1kMdFf$}eIA3E)^+-d|kK5MMkug2dfj5VB#|O=* zvQ9EW?VFEFzqy}uO;z8XV6(l*;B-A3Z0_wmiY-{8JN@>dMv>gX#K7F?XD*+6f*Qs6 zUEXSiUWtqt3U9;nitN$S#kIxljXR3Z%Ir9Ykcp_F_X+4Cyw(cMWsTTSYCmUw>RThe)4XHHV~k zc`kM7yMel=UqQ7CArWMj^rH;eySEV|O=j`!Tl!9UBWA&%CMs7*UL)}zz_Ow9YfJsA z881RDJy$mhgkCUj=&)$L%Yaps#F`eqWZ67rN9pueeN6htKJO+ZPXZm>(ie*BsrvZj zALIo>+#-P^O^Hb$v;tPOtM^~Y*8fT_iydhye|G9dCik!Q>LBa8M3L;3wNv)I&0{xk z_zG4=%-UT(E zzX}*FHBir8H0P+f&m{hV4F6iwK}pR@m2oR`P<_bX70X7RM)pRlF;vvbDXn4Dt7^kK zd;ZAy@Nh|)+*_D)!Q0rj5M{8oh>}$PB^(~qd&ic4!tQ6 znzx9ohKFz1K0Yi>+N{kJE+f$8gOUrm2T~-NX=S;a7D;5iila5B;Sd)RrHeSHOk<9pPU3;>&(w8$2YU^w@rD~jN%gSwY=fZHf zKz?3(-V`b;33paDxXQA>oqBc|+o{n#QIowOw~zPB>-dea?q4})cZcHW86j!KABQFM zY4wVV7nZs7@EK+2_X62`={p6(LXCP!HI-#iC&$c}`&Ljo=QVcN+!d#U{!Nxgc$alf zeu;yrE5h6;eAwAEp6X*2ohHkyq-_De2*2F$6cf02-F$3=B~k-9H?Q26l2E*qwyc`O z%OI78&{Y#Eo%?C-&&n}ypNvm6bmy*?t0+3!U_>Q%onImgj?s(4qxvOHhCZ(&aZa%zGPb*m$(IFJ3%~YqD-? zUvvRop)NV#JvK;K2r2>=c6GwNLyIntys)hs<_)qO>Z~>D=fSf9>J}weYy{&){D&8; zFTwVS{IaWClmqDmVT+-w3zA6A`Vdr6O4BwO{$ZB-!h&QO2)x|bWWT|RYueU%1RG`5 zILtC6Im~kWc$nqk$U9`@+qA8@pvdL+m;L53Y+Qk{K4huHj%;xnypK(3GK2bq$FA8N zW(_<(%z`>Ok{$5WhZy`LR0IW|4)cyknda5_WZNMETl$5$YH)6 zSz56J*`n$SyTCUQ3BMfC0&KSm(elUFF;|-Z#wtynz<0&ky`Ml)#R1?gaWCqq9W2R- zrO($OR@kQ#9{bEg@dP>n5dRlSfa^~JZ@Pil>Nn>%1pviUQpW$ezjR08?@;Pw=b~KZ zwZgfiyNG0o4nK}0fQlW=OzyMCVo++ykvoS{1GmTb>1#lVt9N~6xiutw>|$-i+Peqg zvRvuq@a5xzwy{k96P`jf#Yp&KsM9@h3K>hQ^?4D%hUl}<%;1P z+#LLVWX=kp{3vAqzSxx``+m9EyIgsMCpS=d>qX7i%v$Mt_w&7k1cWOd#mEp$=Hm_C zxKv$zj)|Fg&!4OvFjDYwD}kr+NWLh16_(!s@ZsJ)W)kmJ!tT`y2jaQfU)c=!2o!ky zALqH`Ep=L)p1PowzSu3i0;tpW8_c>#49@|Se^6zp_m?7NP0;NvULZAzw{BvtHNk)C z;=bTVC9}c%j66xnwpbN;$=TRH%V(CXmk*Bi3R_I_A)D!G-O6l$tpLgU`%H{oi+=V0 z<%)s%8-!K)d?quF7GM%eDnLv@N}uHS>L4*@!b8R6hcNf}JN@c^SylfcJ<^KXaF>#6 zg#1}X*H<&XGf~Urd)?!IdA0wgvh4jrG3AaZ4cO)6Sb=!9jlrOaNg>hW@Lnl_GuYIf4FG4x(l9U?hGg?BUeJ<>goS zbClq^?th=rzcnU?YQ$874=zfXQ9*idCXe9pcGUpsf2nT&e#m^KNhqzK$?>bb1vPh2 zJ3H3`o&OTkJc5PkxXM>^0{(B9>;-o|K&LkDVBrT$egddW2sUq^_6ELd&*e=SCTafn zA%lMyMED-OSXh{uoB!a~Dd2Dpml!0Q2Ji_9NcRwBeaCofOzB`cL>~##i~FMTqVU1N zaROW=EkxIB@8!LM7tqQXc5zn8`|g6QWQ;(lq$p_Xd^)@{pfE#uC&z0Anf)^CkjcwU zqQHKzEZb?{iE@qab~+sS`dzDlyEcorO@{qyT3v2gLW@P}!uC}EiC5SOJiaMc!}wdz zs>Go?tTF7yB54f5U&d425GOU||11AmvFo(0)`Ixjt)`EQ^)ZLxs7A>mrR}vS11cn5 zO1uZQfNPt<$rx{K2SuKHni~~*`%_O>L0#Wlovn3bkKHccyyjS*Y2M{@b6*ZMaJyHS zqiOHRKRLPX1wCK4g;|W@KMrVwN?&6l>xuj{TwH%aH*=`cwPjAI(!GDu3I{L}t;kBi z-h3$9@9Y$hL#9^CtqC&iuq=}oBD!HxkFrN_pmXHk1K)x`Mkfg50@N!Cz2eC(A5PY{ z0{?6Z(ow}<4a?jE42enD;p3SiV1LRVEhhskmXlZ-L|dUrnt4 zcjc7(DZDmkFy}1PTxX|mdKl1Y_h-L=uYAcu^_;H)oMjV$SNg)TzCOZK2o>*cv6C{l zbFKW#bZp9USwX+pThKk~Vi6K_xcePguPi6Wap`pNETmIe@m%+;A!^lT9h2RMj`|1g! z%{20s6&tkv9^LPDBe^&#hLKhhuHAC?Z5j84(h@>&XwT8?Z{4?%I^17qo*<{&Y5eFs z_ZE1$Tb&PMSe6A~E!}m)`o$+Dj%4PZd!K^(>xNq-*7VjHDLq3LjK14OQ5qhxIT+Hn zO4=yJ(I-C#+AQoa)XuUq;HtVXM;4<_V&F=D6&4zb^O-y@+RGee0DOIhLdfhJuWT*1o z$9j*J+HTZB!UijebzM5$xtq2P*?LT)lEMA#+3MB_oDb(V=JY*+irh{stD8H;?YtAH!#X$=-7xMz^Xq$nWOZ zCsYSDF?6#WMxQk3ecfMW-yuGXuRZp_&9hH%(q3gZuW8dCn|}(Eb;Li6PLHmaPqwm4 zILqq>Is5g;+{2o3WI?`=_lMCpj&+?gefnxlhw;zl`>5XKIV3#$36gx+U}u(EWiMR# z%U+n@sXs=0^O)2z;ViyQ|0%5N^Lv=ApzB=dyObvS!yj#ShtVQa_42x%i%$&&VY0A- z1qOSq$D57`o%-*d`84I=Qov-{KJJXrVtv#WRSVt61-BanS2wN}NCIRTvDPCcXeekm zfEA>#3y6N201!6aK=-GeD{96+_j7lO@04R;Go|e>itzX?6KY7YC%UIPedYqm6A>_} zoWzya*x{wN-}HI2#j^m88{of-=mkJkI3A;>9>ZD638qS-h$+1Lu9WL%fHn6WfJxsR zfNM>W?-1{4ee*b=KZv9|%y<4gNlxZ|A1Svc?l?su%FFIlfgp0c@^(uejMx+K2AUI1 zl_vdq5><&`Vu(HZ@Du$>F$8meq!hiVaOD;0w#K&*?cZ9a_1n`z(TPG#LVu{0NjfPw z{_`}UlwZ`W1B`rXV4C=NnE=3{2hiP(-B62Vp>Dwkk%`7MaPShLH)nYB=c;Uj!Mv<` z^lIYv$&UIZry+DUWX=?eTyzSTc`mt#>Qi*7!77<5uaUT@|J_&Dp5>3cIlnlbokQ5? z3GZ62k4;5Ov0#Y~YzwsFuX4;OACOK#0(fZgY-z+_1iu9uDClt9XxdRf7PbN@ z=tBuK7MQZTYKp~925i(q3ntxo-O?<-AH}u<|9we(-iv_#WFt~*8}Keg*~-*QPQd?{ zu>y9)VJK5$L6gZB07n9Vhu3HXFv-gl^n$AwQDtAcVuTF4JZ#s2g)k}e0#B1*R~VC#!`<#dyscvb zBCt=$>O+a4*hR6!=Fizv#-0re&YKU%hTQ+YN7F(91@7=efp|fI(%dGk*9PScG zdm*LWhI3ru&k4V*1}|?yJQTlqTtw2%!8s&7XB7?|57i5ig3tjl zA@Ik<$VToZd;>Y=liPLkoBNc(a!&f@XP{+uTeiNt(dwe^M`X|$t*Uwrt!ZuFsIQya zSt-2#-B7;FyOj9e4rT4!ClSJh5er;8Awzn_5pzNiO5xeedClbNclT1;hE;p!Yn~YA z^~V{O_PK25t^9*HaRAwKE*Hoe#C?`(yA>5$R(lC8;#| z&uSx0OfRFzS_Sd{=soWPBz%$MX(i37G*F_kMHY;ug2_Y=6r))X|i4h z_c9rc5@KTbd`2Tuc;JT*d5eyt`JnAF%?ui*gq;rqzJ7Mckue}8k6HGB_UXCM4W9GcX>lPM;qC>D6gf8aACq%> zd}{G=_4?Pee1?Z+LTo#K+;qosKmh0Fao%aQ(a+)W=!|jG^7MR$G2E9U_IQD@)@9! zAk$B<4Xh05@k05h)$6CA#mj$`fgoks9!OUL>I#5`5x-B5ZLZ(t=#6fc|4Pvnl9D9K_ed5L1*=T zA*NmH;G;1X5o;@l>3U>EXiclJziS9;rt{wBUN%4Z<<=1KG&a==Ge1K^Jj*cjPsJ@s z2vnKwjcd`sdeBv6iR`f8S zsx}#|@MraSf6_dLaKnng(=USI{i&H-Z9hUDia!P_Gpe(+ zY$-@>s$MAaI6J(X6l)i~>YKb6{HxXt{+o%85*k2Z|6gp*jv@SYJr>@`wZ#R9 zNTCA;`QawELq$KnQEEGWj>HBwr@{)hLqI=%PDDGt5$FBwPbS{TcVNl4U%1{G;TXz{-jdMRH&s= z_6qQo00`@%2JviCoE00jLz>e|5E%Zu(; zY?PMMc$);8cXsx#Jn6LZodL(>%G*Ri4%g*bhSrvby+Omg6t=CQ#cx2*#NzGG*|Hvl zqPOwZCzJu4>za(p?wqeQ+1XKDKi0>_c8vmD(?cVF@bR%XX{Tp5?RPX{)Kby&FunFECts;YWY z)b)oH%#T-0oOh=4_`g^W?U)DVJw`fi4vvnba1Piy7)$>@%)Mn?ltJ4!EF~)_EFdMd zv~)Mp-5{MRNQaa(ODUZa5&|Nf(nyM=q;z+8_p;}E>V4hU`{jMVJfEHqvlGWL|C!m} z?s?A4QNHT~?6>VnYill>_V)uxMyGMEhqF`09tVSNn}a^{?jHWlu8WBnZk8g?^qi zPyd<8e;F0=iDC7(KfkriQ`7D)9mQsE;~0x1`P5{c<|9+DM4RRGEsqCBrsU1hx@H#XuM{)Pmk3gq|?&=3E4tqBgxe zb|mo%rtla&J`lzO4S5(e{u6tQNzxGp!9o8W2or`{UD6G2dh`VP1}$Xy0kyCM1Q)uB2I^CDw9aX9(0Lm`KU@8G2p(fyhg+#@L|Nm%!K!Y$tw(;PfkMX!q z(4-zbN`;_OhlHp+4us0UWbh!b(WS@(p$ae=e8^XHDb_%!3QUFovVtxp8VJ>pV#twz zFi{h{grO(Jg)>8cVTClHQhy&WctwL9@&}c=P6EOX&A|>iMx}0*fN)Y1yoQB*jtl34 z2C4MQkV0NRl*$N%TEk?XLB2keDh-6%hZAceXXI&PGF6|Mb%fF#G-6ljfBWV4dpVUD znTv}Y%5uGF_-g|niKsXRXcM$}s`H2Y4osvGxb^zQTu5S~r_bn8S$_fl(a|QKQUi_C z-U@M7Q7|znPB8;^kA8RpTd!Q-y^HGwCf^|IUB0$#<@Jxljk8W#&Mne)cj0NVqsVH3 z+Z^vW;9{Y+HQcbQF_!r9QDNcTbz3@}>D5V7NAuxYW_`&a!5>XM<*Q4+A*Z8dWNk~& zGXvb>%uNBpVa&N=)%C3jhT&4q<|tXEmsc&e)#|{CqiI}e-E`HTh0`6M$2ak$hq}rM zQDiQmKPrHWCydczTc+-j7f&V%qi^i^4vG`=&Khjf74IjjJjtlaKH#UP=Pqf!A?SM$ zBK+VhG(?4--7M&=tu;hN$hIbTvx`jFSX+yr?`2*t!^>=DdcIVAllRi0F$hGqny>f~ z&S6RA4+`xl#=RwN&#Kn4zE2mvMQGa5jC;gPq6WhSozg3wRhjDHp`#}j_b(o*PY%C3 zv+zr3|8&tYFKWP%{9Qx+Mu6kBkj*jOeaX22>uWq^ea{4>ZIWf#nQCg`G4rW74M2M; zzIuIslQms4uF`X!o0wQ*mjpa|@&vb05Ok`-ehD;~o{F>NvdjbD+?=A^{C(8Fv9=Xx zw+3DW=?PesZ{}(q4SmwO7aAOYc$se~JvU`byZ2~t%(&27Y`fq@bbw%>tW+btF~x3B z%$;-)yQ+rBh?3h->>lb$pDI^EpE?lTNhTn?nu;CH*=$bp`OeyEetjwCN6foghc&HD z{@LOKwL9wr+%GTvJTfMPo1G;NuIK&B#u}$|UcOh}WSA^6>CSq?zRI^|+0VX7Nh#3i z)7ER;f!a}FAG&$Ow{Xlcn|mQB*17%T;x*f=DPF#J2VV>;R5fjnya@QtP7iH0TMyj5A?gM8}!uhxog2& zeV%nS6;2G*h_X)nv}9PO9Tq+3_1yeg&{^=vB^1m5bO6nxaGB{XC5ax>+0W}f9^Cn_ zLG_|%KPi~6jrh)vLpuMp42zyEb9-)5E3c)7hCa^p@>Ez&4OI!YqV&9{e)q+Sa+N;Q zD~uClkOJG^KO7dV`2<#sH&R2j!a*iEbnl-$xLewpUVQbW-}w3rgnvp;&^jBvq`kCQw%S4f5>!d6LX&R`R} z`J8ay6Xd5YqW?I4SOMg7^EXtYNp;K-6^pk{uKMq~kQ{_YZRj!PtY4C}gAv4M|8_WA zw@!GsW?Sdt3z-R>HSae|(^lZ_7g_ht8@E&jWBYsq|8DO;AS01*iV4s?MiKwreA*hY zaV|bi?&f?S`v+Q00yGiza73x{7JBOXbJ*?Ex2^RJpS3OC|3;jiy2SpIeGp&MY;>EF zC8ofi23$0NMiPV1+q*M^d%6?@H~;J+T0au|n{8A=dsZ*QB@q5n?{ThqGD6Rd)H+M3 z?s&6@SibzTC`Dvh1Mgk@DEZv&gOo-EH-p* zkc?hu$|^Qq6~_lSnpsqwpAf7S1~tPEw2!sie@X3^3O0< z697dlv}4@)I7+H&N{W3An+L$~Iy~4QC7>Iyzubu-joAU^JxKL`hBlz@k>FeSM87`* z2QV4``{Ey_|6z*;c9H}T}*(!VFsgq1JfA2oN0g_)gl`r9s2-n1?Hm^TWC*6VqgBPGV?)7jV&_v7ee}g)?#iYxiB*mLA zD@!eF5xs3w<6Fyku32Lps`ZW>9v8}XE4eGlET#dv70u1o)N-$48n{ran~r}$R5*P; zB0lzOd#yi8iOetgt}NHfP6kcE3G0`a9h#=6vq*`L$f#6S>}6*p6fsXpjQCR7uhca( zotO8TzITC_<_J#9Z31sGg=FzMA$6<31JIl~kFHxMaAI&(Ruj-;Yiv;q$Q|8Jg;?6F| zbr1WeJ^uHjYxd>AZ-d%uz{B$o7_s%2R2LFnI|JBhpL9~|{Z$=bvJ32p;fom1PAjE) zWyhD_xv=|*cP?7;ZeF03vwPFY%yRdn8)7uvi*~qtr8fJJ@o57srm(%HbJ1*^8Uf+o ze;?ng*jqw<)7JR>eaG{7X11vmf8+Altn7uD=nd?PNAY2Hp7?pVxF&pCnyAZ5rey%7)$&rTyVYr z*Xx?y@1~{!tCo2Tt1QQLVZHfTLvP@|9OvkT<-zB(4<(;?s(wCo`8na${$-L~^{N3C zYq9F#(6mi!0^I{U3DuEZD<&{{vZpxq751|KJxyt?UHH@McZjsr}HsulV@YwWx)$apqt+>+%eFE1Zd)7i3(yOR2)f z>6C37-R~zf@vPidT8GO3M~z27_zl%x&ufPYYW<~2h~eQ00D@a03ef)7)GqRd>VI5! zn0Z`?kHznP{-lF_*2Yl=;1SspU5ML`0f6y+tnM+;pE*tGZf;*(>uya(JUR_(mdEXx zSIl4VQDaV%FFI{&Tyk5J`{?%R=zV*jP*VKpZqfK< zXs6+tVKrs-{z7V`S^hmP4mP*hJQ6eV)~t3Gsi*dVQ6cFRP=Jp7 zT*^Fc7w@sI`6Yv5N33r}jHi7PzsvA*K7I~8vf7!_7*KRlUDhl~F;>yW&%a0Jp5esE z=7^x=D<7ARtY0rVF>_1A7xsTcXWx;Dn;tzkNtMh%SjNx5;cL|B2YPQ;T75Y>Ui*I{ zjZt8tN+GMR_E9P#!zHyj8KigL`6rHHdU2pg+u;+MDCAukZ}48KKSsa8lGv|w%6c*)H{uPXexpkCI#_uGn95q05k?;3-RV5jARm!p1}vjcuc1PH9|REy{=`n`-v?dnARYwK3jQR3H3Xsgq6F~>{v`Xw-8u!m zmhKfqM~{V&rUWb#Kr>K-^d#P4L;O+Nxn4P(Mdk0vn2OJV0n|aC8UGw-^vrI}^1R$H z;_CwX&jINH>aWCCz##Q&&}=mF9_Tx>Do{w;1jK&ad zs_ya6w~Ll|O3EUT)K)EKTq*W$(09_~PJycCT{OREjdH9?vr**keViDbZ83k%+k8sD zGZFKo|YLYuWv2t2y^-STL>ug^gW{i^gK9Qe&-+P<+ z?DX@7cz`il;6A$tQxv8eCpJdVEMWcUaOymK38~Xmw(RUTdid1gbgZJUzD-amy~?6Y z^x}1Oz98?67>8~e5szx7SYCbNHWfYN6Kndx2Fa06A{p@s>bR3ff^9}F`^^SfUd!}0 zlV{QAi5~B5s#7S&US@e~DyN@OnV8flrMu3hxZFk=vwb`AaoPN%XsFu+|2@;9sy^)=^a4s-M2>D}R9NUn(D#!&Mbb9x%AutHRtD(fJ^ zNOrLiTRhbUsYDd7Tur#vnxpyGfdx6T=%#2=ZVxj0XC7o77Ki+oHuDbWaX;p+Gn;UT z;^!TFnVsvMgNGI#9wpI8fz3^w3v!i13*ElqP0_J#hy0V)^9~JQemL1M=c%yeXkOgC zAeRp^zz&7=WnAk=bk-bcgT-hYe>;4KFxI!{WXwN|baNpaKF$!L$pp*ZE@Z5yAaNTc zl1N;IS3bb}EWsXJiGoQY31&fYT*31X%`tyG>4v(HMbWSGlf3M8;H>*I_%@2VzFlA1 zF_g#-7VEj6__n8>uXGL%hpW?U@K>#KYK--0k$~EO- zcf#Cs?>GDb`uda5R~5u}9mn7SRKpW*Q*oe$6`sk4(?$Ki3I{Go4kkV>2gid_pxF&+ z_RiY+UDB=kZ^fe2nDI10RW3mNf7N%!EJd_FCD?`mDI>ris4}R04oJR1wDF(8|7x3n zx0`oAnJfI5C43MYRN7lPM6-?Z;xCulDpclXF38*qTEZ(?_M*lRIkvY9~}7 zGPP*;Bq#oJYUPX1(n}XT3t4~r|9NtaqZ3cCsWD7oT8JZan%@pfF;tKGdv?v`_nRdZ zxT*i-+Za;fK$fC(uv@D$_vLbAmP)wb_E50I-E%Eq_TUs_rr%^n@{ z=Q-AZ;AnPLSa4Uv*DNI_c1hkk?67avXu%N*&$W$7e#*(eh0ra%xWag}`uv(PKx?9H z-7S!Zdg3a>du!hNh|hl!f8HjZqrpCfh3-``N3KP6$yhwP+1BcvvB{;1^T+b6gWX1< zMbf%grOK@Z!Dl&H4%3eM-uv)Vu%vK(D69NtTg7ZOvo<+5`*myX;2A4g?1ww#{xJW$ zhgvNUr3aaJ+f09zG$V@8!c^dyw*1NZA^HSKxTAyy4&<-5qs&K2=V(De8J+k~ zZm49mE$D<%B^Bjz=;bA4RAJkX&}9R&nV^3?VG2qZz^o(D#xa8ay1|55N1p%Y zuz^`eqm5f4k|(-RBhVyWVTCy83xV09(3&2UT{JjS5X<5LX6^%s&`%V_S9Assq@Ix| zQU=69U>2y5q6bp!p4Tb~C?WR8Wih$Z=%Xn&C&US)IJt_pf^n?_v27B`f?*6cZ|J;M zVQF*`@fHziHVMo)xr04s*9hF3>;5d`$ckEddlkUx7Cr`~_wXG8)f7dS#cM!?7(hj9 z_8sYJpSS~5)5}3H!G|oU)R-|UGJo%RrPk4?sv*Fd~?M;lR=NYC$z>p zY~ojWaI%fG_m)k=m3MMe=V)YpJefi}ebcRjLatpsE3#S13c%rnuj) z`sK^k@(&(ICkEF{f&D;E``Aw3Fnt!;s}=Q!z_2U^M;^bwjoO3V5Y@$3m2#_D{%Q{< z7}IHrHTh+=3+y8bb!VPxwp20Yq`iG7>_t$ z87-Z96`l4372^1vX_hUs6;*!v=?hvg*VC8M3oEGjNy;zVNd_hge%ZCoF}-DII?XB` z*a=_Ro#*77P_WBWNz@O+k;|Xe@zpX3NF)W*v-F(Mzs%(6IdffOdQ&u4L#dyO{TO=4 zf%G-FD*_DU7Mi!%J0AaBYE2ypiq180Ui02ASn(Te5GP?crc_LckhWI}qS z4Kfh}HajW0w!FYeTMYNS-D=@RyXoNCv<|fS+S|zy#Kt#ApzUI6SAWTM%4=7L>1RRH z-m~w^Kg@SeQy46kZF-p_KB0w!8`o3AoYHN-M;FT`LKp2rr$K3U`jM9!N#yWrb?vls zRX$g-$kglfmOepvz0lF@G>)JC{Dq(GErp?NTzLU~zMV~v?(R;zqT%h3@xscIfvadz zjyk}tkY33wKXm*)!E!S;f#*VkiG^PGJ-ayjV1x~`m6casMt7de;diUN`P1}sM8j1L zA_3UNP<1QI_G}Z|T32#7ywyARqS~KFTpm7#D88TM`N?OuqJz?Q z!^~lZc-~FaZ$e^(SUAv2Z^JzGu=Bd1VGJ7EU~kJOv0DCZ_LkR=>0H)4x;6MaWgm=d zS1=_LSrJiaa?*u18F5v{9D94$>~Bf@4vGJRw7#@ZYsksK{d+{RHjR^HM^bQbaVY#! z>*TRmF(gb0H79NQ{bS_nib6V7ZL0OfSskMWbDk_KzJ6uky%e!;<9LC)f#@vaalWB zS%R`?*+y%JP8*^_yK%&X9vi%wd0D`Ws2`I;V<{!t#;T~BB%p2gV_T!)AlAQs#NbJr z5RxiEclmP~-;Xw0kD(+=K>njV!WZcIY&|m%oEZKF3Ur%+iJP`LB{%oG-RBzznv7BP zvE&+y6?F@qK-bfawc6rFajEY!~z#y20d-nS_Q(Bm61Ot_tnYU!p32 z)vfp#kSd>aE6#eK8Skz$36BVC%m!%X)9W7BtCp-n-xy{2Z z&Ej)~2aE5=j!x#uTSn&mUu70ZueEswi$q_dr@Y7yL3cX~No0K~Oks1lV=OAYQ^hz$ z)aV~J>h8*8G#$h#Yw9&ilquFr7H{$~2f~zh{ zr+TfyF~7UBMany;v-9~Hqn%p5i7}rWSEVfXdQW?UlEl`?g4x?AEE=~34AZL}-As>8 z+Ur7&4o?|AUS821{yt~GsJ)_d&}~MGz43YYg7YOQqJ6NA`a?(JSB~+jC+X1g=U0Aj z$rh`>a?>1T)x{6C=_Sa&uu*2e*H8>^ol8Ew@mS<4%RG+qa;@;NpE1dF#%rc+uE+Iaa_dVi z@>;PPq0HiZ72r*zLwB+6V${`@x8^r14Eq)!iQ>Y?jC&?Y)D7G}>WYRWhxOF9S zn%LBn?dZyCvqoGGkwj4~oxVaeOhuloS$#BHUXIwf>^gM9Yb%*$o|Dq1xO!7~8c-;< ztWGwiNr(Fe&4pibL_Q(W^J|3sT5GP_B6AAGp08;=SboXn zdxu2(s^RgU62*RxFM0Z!wqQ0SnpGntTIKsAG9i$_{du?@r!MyE8(N9)AqTWvAL6Hf z@h6aU@F(bl=`)z7!9>yt*1_}{Ow(W@=>qFrS>jxg@zeC)<{oE4`V8LY>c_)qb23i* z>|&UEGES^xwBB#*T5=fkJ!RDGGxg3pX+(1v>*VlWRKDgPAxJL?%hYdBJ?~_Ap2Il# zhr#>Jn<*P*rP{;j!m>U|&&Vz3I2Hm{zwsI<~0i+FIjvnc`_ic2jq7 zQAT-077q+xZZ^U_>-iAr4ozpdS7q5>>L}3EJUz(gEbg|VKQ#l0Wr|@DWpSOGRH=*4 z9_ovj-EHsnxz8UMKCl>c}q< zKPSyWknrojm>F5Qce*d%Et(B(E>OeaRcgb!$V3)KI$O&7IT>ia_=ezmHc@d&>aTq1 zSu(ijpzU#+_-t3eR`qSYmeFkKWM#P)D(h7dN-Jt!IhWCsd5;Q#ULM`Ddio_J;6$_o zwBD|7uNvuo;@ap#CfrCG-CcLguV(8wPolTkQnW_;O>u5hX>1lV+S1=D(UMUO3@t>V zZMe^@Y1Dd|Ho8k1JL}yc9g%odHexwKp){unaL=kPEw>2WVtl**IoCq*tb!{@B+o0j zKT}T{6~Bd=zGOm8UaI*^BqP!LnK33>H@~c3<>_cVzlds>67?vDA?io&!ZdT~c&XF3 zZsTEAJUPMlYCSUZ>3Bwa)nm?s7vG%C>_ryJ+%`rI=cq&$%;AS4ndytH`?Y)<)<+w$ zM3)A{9^=WiHQ$d`HA(M3s&edSJxj-<;&0%jZncs7<#9z8{sa$pY{zna=^`vXcSS)~I+r#aimN;UP?8Zw?4{*VK7M#{}V1`)QR}?DWaWCQT zv~d*8Ij>$g?HYTvNTzD0B#W&mim~N^ce?h1MLY>DP_Zng<#7o4$t@F|;+y-YBUc}I zxe`QCs5PVLUP>qsLR~OIEKsP8Bov6Drx+n2&TXj{QFnuMZzXz3p$XjzRS!dIxDuMf zFO0-=hJ8qqbJa?hP6MeYoxHM!seL3AsGz4k*ruP*QK^HY=swI3GYGBw^DELos~{n~ zsMN6%3UpBJM^QhE+V+=q?u|p83)a??zoKP*+$)=s+hzrMuCqfpa5SxcmnSpWEC&$h&#K8TH zq|4xk1{rkDI0sm6`X{CYC;xYncqor8$RSKtdrB@t+XR8w78DR0OsU1dI8T@bC8P*b z>M$_Q7pFntGBC~`woVmh^Z<0W26M!an8yidpywQQ06njvLF+MLj(8ID3;_)~VXy-u zX>=Qp=QIj;DbztVPfYQ0TV931R7E)g=fWVPqcYiY^#pji^xm>@b%unJhGBZ>HU!wR zag$77H$N=dIHJ#BH~tSa3L=?c!L&d&ZgUVSX}C8=qX4>>L$~ny_I(5C`!$eJm)Ho{!JrggZXP+IuEoMjlS><Q41+lofs+%9fQ;ssfVi}%e2rx;0dn=ac)9L6;6n95&~$JeMj%Hc z3HYTBfMDL>gzLOy;~1{PjlM%h(Z!uvz;D16Y_$vnC(}=(V8o1Ci{Gv{pYxX~!l)Kx zGIQ=Hl1y7>aa^EL*!v33->B=&Vh8+$a_DaRl5c8`>r9*n;5idNyZ*Kb|6wyTW8+#3 zUV}9PPHrKofJqnPXm%dBy7kO&!@8tjIHqz1%+A`q`CT@HFZ7bEret17@7a zSpFU`%<{GPQhZvndsh$8Rs%RC+8+YWd_4dPp_vuv)qV*@;7?Nyjy%$QBVmxN|7wm> zT+-BInWuAXMqMrUIxII?a6e8*tCEA$p*zO| z&zeJu+YzU4B9zJ`g;Y&zXgfV0XKrH)(v%DOz5A{Ft^bTvF{{`4@=6tR-Ew$GA1v?z zI)m;&FjYlS%YA!{d-s#1z5U_%ptJ=TCYy22#GT7mV|bNx_2Hd_;~%TI$yWx2i<}55 z!*qd!jks1{OOPxq~SAQoCqpJytpm={+3BrF0gXE&fw6jmH-)T$jQp-o-y zTZI2(LwTZ?&8%3#@kUF>r9XxF6G;3rf0~E2k<6jP1hQ!TW$6Q1^c^p>CQh}@i;d-q zO+j`HG|jFkFgzT7o~>nW#OCC49X?te{(AnRM$)2RKim~{hRT$+g>ke+aEd)0RkbE~ zv^LN*@1r^&IO^bIH|Qv;yrScOr<_32u28x>Nyimz^r;iaQ59dhflrYYkF8Gw31ApC z=qN>nag7S9tt1o#BTsH%INvj)eHtAm=_P9p;LnAgcru zS2UPMQyAHul=A5Js6~HfG<0Il3J%PR&Ri+WmC-|CBF88K-jB8Dj~ zyI01L6?Q`_5NB-MZ`eN3c&q3f5t z(c6lv&da-g5#UDdBva{p-?!^)=%RA&BtL9ttX~C`EG1bw)IVpd^Q8ptOoiGl1|xL`6CZC=VEThryOq?);6~V{0=b7IfZ%s$BE~edLZmR9i;f2eGn$E&Y2yB z(vcsY;nn?_7JP0k9W(B(QP1jL#l37T2!EEDc^KI%mM6!+aFZkFnZd!Or_P(MT zUThML+wZ~9d8J3tI=8L-_=`Q=;Y}n5Q(;AXjZlZcvA&4;AGH3AVDaxo(pXl4p{;*( zDfnN9y)@8~rdR}BZ_*rLyIVv)1pT3jjIWO#WiXAX7czzJ-F4T@I!1Y&g*e&I$eGV~ z`1r0VBj2d#BbuGwIDh0~a<6qdz5V)8cwMN#@AqSOrETV|@pEchTa7>-HZB!a5&of6 z%6SRZB~Zb)@Z!s^XK|A2EwRr8X-VT9_oDdgfdQwL{`s1o-e)?SuI%u|&x8)wRn@v= zLeXYd8#w9a>&X;un>}S(XUe9oM7&HI*b!7NLqbAoUz(6OTg|cF#UHRoznn!H7GX2c z3lW!B7B(w#5w$j7nr>`xY({RVBK&7ZBNxGIF;iZi*EOH{;sfr(SscEvcqqD+%s)jt z@T8>H#D(0VNVcDC65ll#m*L0~UQnnddTCG zvgBL{L}+z|LJ=QYg&x9-Lai>L@D$385u(kNV2na-Akj+%9mNRoMWKEz(Mtl=dKi*% zavVhW1Y&?DH5(8o0HcdJ5ji2D&W(v*$ASDdr<*~Ox($dEhtWYHr07yufpO9>Iy{I0 zy4174IQiE5cp2^l6;$e^sL(F+kT{iYfxnp=Y@Gn|2t!IPFis1${uH8!A*CA_rwdyr zgoI;ASq8=#$|V@V=u+Y>h#@;~>25Hjf&$}S!*V~%v(WWOC~!lo9*6LvQ4dQf@Itwt zglO|5KWde#B2`8=qh5&W3aW^E2m8C*#FQEejB|roP+T)6Up}~9+YS+*OAhyz*tKBv>A`=om9fZ1o@V^4P{6zGtTE}dNjPuc$-Y6Ec9dt9>Jcfz9;L$`3v z6+GfnfSAB;2x!qgU7}AqTe^_F5(H1zOS>_j6#GP!{nRQQ&5B-c)=qht_Gh-r@wJs8 zz=J~HCD}u<)?Ytki5QR>!EF#`*84nr{<~|Mbp7B%$^!6XDdR^F&6@*(tTROIlF}0% zG(H{;9<-K4omC8Xfvux4Z=yGOP92x({q-kRE z)r@lA6IZ08-L|KM4e$G}WzM6h8{LlY=TxbSM{^H+)yIVI6D=ngeA3(yj6}JEqbSmsB0Aw<*dTlw5x-oLA(ge;e*Sz(l^>{d1j7KEI>L z)KIF8`>4SPi%BTkLwGe&n7FOjW5zWFyete}ba%}ss#|_<(keglYm85bhEXa~rCBxR z*^ELYj#`pAjsKrF_fGL^hP;WZt^3bCSnf@Ck-7o%=0K>HdQ0%4-5ya+b~@A=h4pzdSP-CmqGT7(0MUG% zAH0@Ej9&IL)Hd_9fv49A0=bVOWBUmrsp1*(yf=RDr6}yieQWglEj^p~=jyy@$HTfv zvN1FHb9o+xQBeUVqs@+pt9vNiYVbrmLhQaD2Hp~q3w6vXrlpE24UMDal_u)X{6IAD zvg8+KeA!5Hd6v@mqa!oPrQd1vY;AGuR2f-9%sWyWw0eJ=@rkAO$DY~9mS18CA-ktW zmRVvB+vgeuvjzsWvl88f3b{cupNZlFI0hI=q^O7MTJD*`aNHZQ?TTT#xp2x9?IYB>f6=5b(|g5JlGTrB=I!OkWg8dZwQNC)hsh07vW@ahVtB)N$#Tu{g3sY%aEi! zMo^{1_vHA`EN>z{`Qki`{Jd%&3wjarl2tkRrrP<`sD&nf+KPbdgMQ<)eWHIEEAhX~ zo|vl(Rkri#`}8m-Z7@H(*^)$&QQ=A*{)$dhzTLBjC4nbc4%1m~2uciG!_vaU)AKD0 zZ^%h!U5)U#Cby+tji{i*)60mLH9k>S>?FkO5`LHqqbYw*xJMF~5Z167z`lxAK(`v9 z=Z>d0pBLWnCYXISLPfQcuzruGT!R-+&l&;XcHud9Ir!pi;5o|{gTPc^^Zc(Z4H`Ku zT5!DKEe(1w>)p~|#M851aV<;?W0_Q>DHqI%Y*>{Ap^kQG%Joaa8&+*hItkCf&g2QQ z#+7pT&Rt|xVJw?UH07Q$M9y94;QT6fz`6aAF+Pa{r{SCy#&Y;a)_CM4f%6A_dDK3} z)d)JVP*m^$2WAHc#skqz4LS*x!R3=r zfXk0#SdF-H184pU2N%b}ho{#JE}KRV zYzS@)W6=Uv%Q`A+j92jb=;yNu+sWJ76!@1}z2mo)&2f+XO0_V=8CM98P>%%`j+YPy zQn-H~@Jr`FK0uY0^d(7X(DW?=AOxr=NeNwF1K@u4$o3ZK+Y<}bXD$O;cEfANb8cTW z%UaRQ8>zX)nKJ*FxOL88@IxGZ8)a0zvd*$6wRoYi%aK%iW{6AKpv;{xX9QH=hFtoo zcHIUu%HCFHPWZWavh1uIaTuy&G#7oD_3SjcJ^D1d(`Na@sP!Phkg)l{u?)jbYu)aU zKeAidVXt-FQ6N8U@^Fl4^0G3^?f|ImdUhurPo&2?H+!&bS~NH1e@H2!X8od?)zLJ3 zkA{qDqOTwKMZnjNM^wU8S)@d!r2^VG6*YV(dBz!i$xnzMg<*Fo5Mzg7KkSrUTWH$; z#WmXXH%H|jm0dS!-j+ILH+AFkBIan!ZjK~2(O#sFWM>_|{2JL`?YE73W>3}FD>@g- z&P!`zUl-=qPP&uxx9#|Eo0t*(?SpCNk#H0(*q|KNAhF= zZInImA7czXb5<4`vmM0&K;_6t$}s}2VlUGm8^PZL&qt=;I_~FgA56L5Y8B_u^~QuzCM_p|Oa@yImK~8c6nc>hwF_)! zcl9L`Jo58p0{d=?H*94NL=G;s6grL$0{15UgCn7(2bf|GJAba9*u7({r*GKL7NLX9 z;cK0yHI2nvC~vKX&YN5cnta_mdgrkq`irm*w!pSTuz{s+W*^=AV}vl(vxLvKQ&G?D z_<@~DXHU64pf=gCDQ>vh`ncvj%YxNT>wQCQ53(#d(>tJPYO>A9n?ro}u-fr!SMo(> z)6uGXxqpY72QYq9e*Hb^Fy#7odB{>_=vkM0e4wPHn{Xl-%NZHr}!Hf7S&~ zqh~%IPGPq?D~NSy z!|B>m7H#p?c^>^i+H;&DAB%_3+lm_)P5C zHmh;mR+`y(*N<1D)>FUuE;9DFN)BI78}h-YN}7$E)b}?-d{>SfMV~1jq1`kkU3u7c z`n=#Mr<5?0>7T}Gtzj(^ zoFot;v~~-mtVJa@8Oam$64LOQjGpVijDk?s9+Z5v_V?tkM4_cUD4S^Q{^S}DVA>Bb z6CXhMexk@ekRlAwcnBL0jDLy>NqQi~B>2Ebb^q7HuH^^z!P6g}^iiX7g0N3Rf;qJC z$TjeBS|3K3OlLorD8!;=!Y=rL@+R!b2NbEd?<8yjG{|62L*=*9yV&hDC|f@*(!PHk zjC!)oCJ*A#qe?{wXwbp5!-EC27;sh6%1n`Z2B%)Bp5fx0rI{<`D!SbZ7fkp zjPsl%mQtZBK!Y1L{um;QCN)8#I1`{DAg3h=(~gNx#DUaypmd>0T?A-|!NzeR80bMg0FO`wL6oR%?6n;5dug>tdc4q@WNDddDIMWNX~4xw2K zU`G2oAecQAmHS7cke8N;4{AH8@HcD%+ShrBLIEfiPDljW*LCvcgfydaDk1Uu)FrCR z*AM>tE)pLGuGBj$m-Qxq^fPc155Kqv{L0yV@&%=*hTpp{kRLrZ;+&*k8f*6&xyy7C zu$H-Bmp$^yJYI<8mCD>vp07@p>+bMXOy3#_6Py>=4xA`&r+Vz3h6G%mJmhfv+3>aQ z@7VwjzU%zhSAYV+4?xxdK2m&<2?6M*90L>?zksdC5wfDVW566VQ>1dn0+tqN5I~dK z3edHM<^BdC1n_3%PH`dx zfNNg+YYD6XQ&>yt%!~*?6zsVowgTuig#c8$y!XJx8UVa`4t!l#j3R-z&p2&+{^^xf1Ay{9NCOXRN*ACWnUKK$o_^pD zfvgmPZ^i!Ic}Dsk_|gYo8E}mAC1YTtaSV7pMv;1XUQ&frma!ke zxP$k|q~5{J1`+kTUBv0jf3?#3X*qm1=Fc7SPkxm#?MB{vl*k5h*^Z=&_z{Z{T!?dz z967za@_aodI~?Aa=U*;zve{bR`H7`ek#F`#f>>WA4x%}KZ$6`t{_rcu`THm7%kNl9 z=%$V{gXd{aOMb}JLEIT*Z|9SI8(T%_y_;Az-VyJ8*3F6^tFWRls*5IX9Tsj~=W@Ah zDkF$YiT?&4685@(>~d;a@An&jD)Eoi!pkv=^6_k+1)K0-W1F7Sg`M`V<>z0_=W&2r z_MVpu3uA49D`}OsHGCaLvE*I?cAE@TLMNNLTc-=_KZo_Jt21f0{Qjhg*b@pJYI*q2 zSC=Ca&<=wbt{Sl-%-n~CQjgM_{DXZK<;{&hU^{vYbL<`(axx9Jyi>(ak@Z~KJuhDI z@B;V$dqzJWeZnknkE!QxTFT1cL}t7=R#@>`@e2(rQ-kZxXyb5eib*6wp>NS;m`;?0 zwAJ2pWr+CEY~Pk)ny_KCUrBJl_5@K!8F#ciqftlf2X;_t##w_N0y#7 zs60#E&0v*CQqL&`(n#(I`Zs0Ab9=Jtn%Dqolv)6xjL}WC4{5e%*-<%|eem4;7{DBk z=N8_H%?p*BGAF`wJE)7uwo8>oHyJjN{X;*GvP~USP7k8I*dvlm>7WlP_W^O9(V=qW zM1z>J%d+Qql6ro4o_NtRf82k8^by3F1QVW{dv!#1WPjie*s=h^hQE5IO&~cXSpsR) z4gXo9fkp1Ic0cj5VNVDDN5uU9KHs?YbWjLSMMr5<7mTJ2lyyOi)a=-6& z`tb6f$l{+4T*Wlc0ndR>51>2%|Me}0WkdY_z}0e=rz9D$M1qdli@@KoS=((^=1%X> zV82Qm=q8B1M-IG1t>4z48Gx6+K@#YnbeR^e`a#J5Nc+e)EE?PvF<;)l*u3Xbsr#}o zxH$G_WYC(o?nAw^mg`z~1NV_C#W0ELEWcjbq?k4DnaDR@5obdO|LyG2H+tc-r?pdw zy2GC1lVp@yxuAg*c!{Yo8*`g7;&}V;XmEsse}D3D~hoaES~zS2?a#x z9S9?9+2{7`4Qr+%8TqzFjudSkb<(tPww*IZd%^qio6X-U^Y=PT!|E##TVLtu{p1;q zZkf+Nlu@i!)=DFOu(1sbZ}r`YYWu^P<_pPP0%_l@EvZkO2_Ro|_e%!zG_&%YJOs$z zVM34(+Noil=;;5ohKTB9gI!~w_XI4HLXFXaoFv}iKo(KjU%;+0(J=#;siDT`L9tPt ziZIXL3iIeeSrYG_LNZa?btvud%>tKMmx$Tt4|&Yj*+$pGw>Z6+V#Wbfm`_wTp-V6)9Y`W2i95I6$* zYD#NVF>dN-1Xi4j*%mI2D%4EIKxGo$7~L~A9Vh_kVczjaDk7kkC% zY3*R0?yzV{&EmT(RYT{BQOgng^z9u-ZW(ot57gd`LLawxV!(>PB=p6Ch0eK~`MB$g zg-WpXlJgJtu0W~8PFC8hNL;c4x=zeF|B|g+`JLKZor=q`61hQavx#CLQ_t(BpIh{( z|KwehlNVz5od~S()aQNc_f{(-6hQ=ny^&Wgi!HjZZoV?N7FDKbd02y8BJnY8(vvwi zW(rszW*9zdPE^2idRX71umsdhJ3YrYqEqF@?VjZ(skFxh?>C-{iBFYBZJfCt^jUO+ zA0*w_b4lhmaF246nc(5!Iu^}*i9}}T2A0fkRG{KOth&X6bk1k$`Bk}o|KLAO*J{8# z2H-+wWw`IH$E!8bR%3w@mSI4?H=Zjg6F5r$uh?V|(eqchqI%yJ1G+_VSt^>b(dhup zMu6k6u+P}H0N#it(v|QmtFPsXpYRAR9w_x*RrAoiH)4~uV(_fX&`3;Cny-spLl*h^ zp37}~%C~CHvj1I8@%)LN(&U#a3en@BH*~nw_g1Q|M^}7Xv;M~oiBx;;R~h7D5<)kV z)N@4vYl|;q1x^zw9ZE8gdxq-$^;sH*guYugWlye@;(^QK=77d5pNECmNqE?Ho()+* zi86+6g>G5%{94Eb%{QIk=wwgZs@3~fj%V^Cdgn*YkfcvI#*a1Ia*fKOu1bODQq4^V_tM7oPt7#tAqC{{JCF<3JAfiRoi|B%g-h=2Z zx@cER5WROI(R;7KqjwVJ>O{Fp)adn|@5u9h@BjaOzhlmxyE{8OTh6h&Gdtt7FjOBM zji~n>KcOCD)gMP<=Iz_iRX5ZTo}8t_E|rFcg^#(XbP9r5xcXG@s4}3 zs`n_f)T5`zm7&BZ*4W->o}I3p3BGLxb8C`ZY6-d6>Ng%OLoo< zo?uhPiuO027@yv#E!i7~sV!M$Qz8kbde|zml_QQE;(OQ*%z5U%DKW@?SoZ8@<2EG! z_TBwC&!EVYaJ41bbV}rDVhilbc2X!+)~D6?-(S z|AL#F0P`Q>s3L8j8&S4#ip)51S)T{xy%~Z#Hd_a~Db_yb;D#?6 z=ZYp}KW3jemx#dktmb)48!ax^Zj6 z&Yeu^s4KWqdGvOrU|vwi;=_qTO#_UtC3$bQjr?GPM`g^#{#(Lkije}=9G<=w4C^3F3l(Hi^_dCnR>ArG11tec-u>OEGn4QKb1b2wq;$-A>()@L$6w6 zxq7m3pjug{^YfKsQ&B@%;&JVgSJS(Aa;@a~cbYYIds5DPUQ$MInS+y+Z&{;&=j(%`)iR>1#S^bf%Sg0wTcj>Ttll9YPER_P``P4t&^8`n0H z^TV%lo_a|ca^FL~Mf;ca*F!H8=S92dJoU7%_KqKLyY4Uv18=E?81z-kuVd|9cPWmx zl;yzl=6N0Y|=7wyyzV?7;NC5MalU4b*xKO-MX^4(S=uw|f(Cj7Za1mv|@) z=^>Qvz*IYtcqk6(8RM8IMfWuKW<+NqUinVPLyUp@<{1f(KNN?FIJjYpIqr}=6M7#A z5fSRaG`Y}b9Y>R-iQ)?r75(}c{bv(gqqzfYlTLeF0&{3EYy1p~dYyMoW_?!uoS*A-9erh34rm zbLSHZjR9K%7X$JYE%+H417QR+L?RRmB848TgT_E95eoW(LJ#&tV}SYuu@a+8$@@b{ zp;-5D)l8W0ECEp}y!D4Xf(B#bR-sG1_lM9zgK=>GpiBAtLl~gJxVStRQZX0U(s!Pq zc;a55GrWf7jl-!Dn>Ui;pWSJx4&O|lz?pWVhK1tgUL2K3VENhJZXSmA<6nbQU2lO~ zW278?vc`8yprOqwXs06?wX@*lTzfS-&P!q0aVFe0H-23%jIhi^PqH*XZ}ZM{i}W@K zxOO#;VI9+S98xsC?bFsPwRQ0&NJ8p4q{Oe@j~uAeS{k`tu!LZX4B5Q zI#G**Rq8_S?0tmDnM@jycr$J1UHPcR{wh)-cZNQ~^%-9pk!Z7Nr`;D(i@jA7FWevX z5w6V`(ujncX*=z*MJ;w$#lLVT?ju~C5u*_aF`ItBOBuD;S*8BM9j}jYWrmhUB*;wr z{Vs0Q;y+cSFWk}l2!GAoQj5UNrX5A;-wU1JpfW3tj{17v4%f?^U(fa`oMg&bS$Z7p z!_wLk6h*wQ4YA0Qvht+NaZ-JK6y%_V9iy>Z=vXq{yg$s#kM+oNWE z-~DcL>}sD+&!iSZOZgK7wOB9&K`jmpK~ReaLlD#wzz_tr#7v5xAgCpQVNz`2&}jJ9 zko-dn99e!4G(d0#Az_1o^Jf}}o$e?o?dblty~)GCLmX#sHh}na_5<Pc;(|D_V)k6!uG>a{voWxDO^!fC;=aA7brran2Y4;H5aFf)w~O z;+aEM-)0Och`|nGXn|R4!K@!laAZlk2qWHoqNP+I07+1T2tq#i&{-4aI}tvmLf}kT z>;s<9Tx&W}{xQrnF)YwrJe+kr+^|mcR1B$N{}>J^Gd}JthE%hE47Y6DGw8dB*xU!W zLT1bgm{JJ;nCCPxf^BB;-7EgX=nQTzpdJ$PbU5tHcZ#Eg{q#%<&^}q_pa>RFe*Uu8 zv_rd}5i*V&EQ-MpE78vkc{31|v_5{s`eO)`q^F=Zs()Aj(|1x9!Dv_`FqW~>pOKM} z8k^*uciqmjLLmw`?gPGVw{WCP*8L|-g1uYFp%z{)*e3!lRrd`06gt!xa)pbm<&p7Z ziR`IO@{SuqF+BAvKQ59i?k2EtdtBlM?>WylJw4o^Ca#9#@okn=`Rw1%B%L%dc{mVJ`F}O}nbG=>7U$ywV!zz*T>AxEV%I*}9j@y~O`L&@`T@#vs1I<%- zBCAY@&S*N2X{4b68(}nD3kK_ zetXAbCaMj_WRvstZLfwsS_^UIG4m;9wulf+>WTP6qA*O^ZcNVC%XCRYp*2jI%?zRx zRj2SQDT29M`b~Q;o`WdMBY@b`<`faWQr`A%`6|(yX<+ z%4yoyxNh$NpF;Y&^>PnUXRo}A#q4s$EI)}QV;k4(rE2!VU2cuHh33xbeGbYah0@v-Eb(%Ie0oUzpRyBa_8GHnF;PwM3GdY7R zgD02Tmyh5ZSE|$5fXh4O{bc*G(m*6VTor|*f#6>xe+kacxQ*arLUQo;B^5v5i3!;vqie3jcoV4TcOt%a0)1O^ zWC7VCzZ4IE=MtIbEumbNC7@>ueOJ(<)Qy2>B>p*DOYQRYjokGnVI$r1pe_L%qx~HR z@mTOI!|CBS@) zbw~`bLDf6#W4fH42R!ngApEd7nCs+~UQ({AN*3q?GtUsRXtDRoL25t#M3(@1!47H0S z`;E`u$YH$b`Ra||%{80G_BFj_lQr|Oje+f~l1+rc#(-_o*G<~2l>r!8!PwICZuLVa zKHpI$ldLAk?!n`It6%Isg+-#UniBgC`@Eyh9Ibio15Ne#Hk(UhrV739n%#~Llui!w zp+J*~bRI3!)4*(M&i3zRBWJeO`qb~~aF^2O7gGNIh1xrOX^+V5kl1<#(R&a~hnX`V zvBe9Sdk`#+ne$U(iyxv#5NyO3XMveBACbE#u_XwhA`Fhg%t1C zY>7aqh=ND?>=kwbet1LqvqSVpq;Fqd2mF9T_t7O5aQqu7(41gst66B>zUZOen2>Xv zQT8pmKk7zKVoPk0Qt8vERnNSk7ze|ymfm0)X}3otntz`D^Y;^a4cqwBehWveUzDas z4G+;_+-L!?=U1SfPxs*6zERq3_Ta<@mBx2RLI4==@cZ`|3!QhD7HS5sA`kdZdv|W- zR)ve^_2RaAF?}J=m;7q|qRZda=%^!?&+TVNQNjpK#fI_Z$bE(o4OrGkmov>8uaTpp zRg4Ava7}zcq8m?@NS4Cy3+n6B{s(ZuKeyajZ7dqY1v&bLxx@3##;XU;U9-zbOQWLa z=MGyQYjpQ-{UR=CoqnCKOCrD1`qbntC&&6(o-v+y^Nk;j8U_2oWt*{gCAWm1jn};; zl9~?c`|hgjIjl6@^CppEL;I{5+?(0}UAurARiGKP(t*!n+)O2(F942nAT(try8@sj zr88RsDmHH0k4QpDxi-syl-mWC3gAU~l#kFf{K1`ivmcU=tJ_(Mu<5+wO#zdn*XAQ) zJ&Lho=dChFMZ>x&=NYbO#cJCqnkDB@avr^LCR^p?ud8v$!uSdWo;S8a8@JYaNH^vd z?t`NV;kec%1BP?D-xF7*Z1MJn9=5&*qU`4_+tfwC;WQEj+m9pp6fsE}VWwvqB!cXw zIEcs2xC+Ut^{VGTTIs*OWATJNcts*@qZVS=x0+M{t6+ z2exlf8qiG`Tm0<;nJ#Ah=N&yGOwyh~`FleF9AsQfWKVG_KT>4H-^3o=){v^{rYukY3m&L zfaW_1!wXNAH}4M>yMIyR#s&pxGvY?ahA~G-KO{5=uiM04G`nG1gapCE|8> zaKwg!SR^?ZSMw}{XSwhpW7}&iC?ev7?1NJ9>55;m*0_oA4hVV5w)e>lSFEu_sIo0dqor*t7 z->y~&)t!zp#OcMo~k;`Q~#P<*>eE4NfBL{AMw3YfTi5o2~?c>XHW&owf zm>g@1xBcG!zOSXRN46W+LcRWc)AiGRi#-n|Wl;LQfw(v`ZYI6Tu3CC?Z0}*(5`^ep zGuDYOZnseOatv|%Wl5xqBX%3?cGyzU40?r5cH4@lUg+ZGD;qRyXbFi%g?mfOrg^`! z`y}$={a5cv<(G@>hEfacu)%$vNXM$E%R}t*nFA5MzScwf^NUt=1fCw|PWNV%9xK<) zsPN^|dFk)Bia9z3|yPa zaHtoWB(XcOG^y;@`w&+XLCFLVYC)I;;RJ+-t1EOrL%}Rzd8u374uNbvUFcuQTJXM- zx8QySt$>(ONb;L87gvQtn|Vl((z%&qn_uX_WO@*wATWTy2m%ub%*#=sNxP3j({>p{ zvm{<8fJ{8ZEv^Q$@{*X(%0TQNg*Ai8Z6I`l&QADIq&2tCNZ?$Y;X-(+%STM+ z?#X*h2rK7WOnqG(5f-d|eqEovbTe_L7rrRC!)1IvttY0h&5?P$^jI#^E>{MpV33CxW>tl1=y&3xQgkwQPiRT><935{ zNbFYuFN+G6BoFG`!YAhq^$%(sGT#jee?2$6`HFCyY4HLk>-2nPCcLC>M7dU4UOJm@ zQL#IXQ9Hl+VZd&E%yjgR8ELL0(f52J)E5crHy1JDCm)^WD)BtF28*-i4zsqeLT|L@ z`pFf%oIlGbi7)D^hM_c+ghVCiCW;NHYRck8>vv=L_hThK_zX~w2lwj=v2@qK&mfI#LSuCFNKq(K3Atc0rr3lO+`e==u)bsgrts6Y z^d$fI`Hl`G&Mll)Y#oaaPTi*vEga)k{7L>wFPGbZv>?{wyyTBZ2#DH1YaF?H!wT;B*z z#2p=Y5}OgP$tcWPBJHlC6?PaQ?Ip`7&RQnzr=q8T_QINl_*ZUXuz$Q32__f;0VCAz zA_Bk&954b3M#SDl1d?iz;LDOcP|;D~r&Q_=WQP!e$r5)2R>0(790c>@jM}&_hsrV1 zAHmGzbe_o2O)=;*FtY#sxS|wO9D@FWCa?>SBaDyY)TS6m%bu>A}s#3FMAWI?Jk&f{};)VFx!4xKv{SBK;= zhQTIy#)QYiTE^U)QCm(yD#|dJQTr4EhNBs^DkNYyF0W&&QF3Wpq332}+>zW(~Jw-+(Ke&0J&;oT)bZo*AN{@~Khjwr0_Ue>G)3UxBOVY*7BZsj_c5Hkz4~ z6#Lv|RC5f@wBDaGxYKT#zbVAaJA4YBX}DYT!biR-p1|KCYKJpQVgMBAFz_ew%H|oI zKJEE6qV)Ult|B94BWrhu>k0-DXdWcuvDrA2El0M+%{Qphs0Y%MReCKIDfPO1Jfah*uUGfdE z08fBU0JBm0F0AKcL!)gs4gSk>fM(m<+c6!X=L;GCo+aaJQRumT{PfCwGgVU=L1FKF zr~i36S}oC#fcBq-54sOVyxD#pJk7Vj zY97l@`xy*)8{jYPgqGtRI7v@qh3;T<*P*Xop*clTZVRJ3mH9UsNf_`!%c&vLgrPe) z-2zyv!mEuW)4cvDXzzFBlr@;kjU~AFUn7E{lvI?)(tpc0SiacP>;%ur0%~{1Q|M^v zK>2g|>IJw*yHv-Oh=9XA55IVBqf{fFlOovdH_55@yhgQGS(nVa;gwz9?z-zoM+M%d z5mhpMltHo&zXv)27cSpIm9Co-`%Et`J)_~65P%Sh;*z-W_P-G1FX`ZWF90j!314?$KJ}Xz;po~th2`EWC0Co&&RB_<2=`BysuY&Imu)a;y zi!Y7#xJ*9vc2JX=j@E8**e?v`+R7U|$6{OAHj511{igWNl!yt`rc`u&uf+6NO54;n zk=kiw`Lx&9seeoBs8y`1qXo_gz20UCUj*Tr%dbegZQ(~I zn2=r-4*J5_y1eVvH{<~2L=O4p`6Dzq`?RZAsl*2qj-l2af^E6-=CR~wHa(3%J; z;n)^wDUQ+$A?s7ua=W5%Warazyqh;QaOZU5T zYWay~(_SzoeQPu2+P79C*pib5eLyp5CT^*+MEt=X(iAiEe9hS5h zx|+JEN=`Gz*LofG!Z!axp0;SUOmsC{iAidR0FLw`x|+AdBt6p<6yk;}&4r;BEiuUq zal@0g$56|bm}J{wn_`F5-Is1Xx`?+S4{bKjoxAtd?@`gGfI>6bVsq&4N19e1Kby-XREm zfrEA6|BDWCW5!H~(eYAtl@a3ej#&kxLkZf5hXo7x#Rd_*7g+L-?Z=Amr)JAQYura6 z6!?X+K!LBC^-Z<{#P=U5^YCWFdW@QV{YuF`r@C#SWrhIR%QCLkjZ!mT9fC^H^#_NGMF@fY_t^W_ zA;jwn9*FtsnL^-VPkd)iKN5Rr+(&Tu(OZ63<}0emy?6X7_y2(N$sdjEx#blK^N>30 zJ+n58so%vTZ3OS1!(3n4SM3zmAZ-sy%CbI;&3bk56(>0Usnd0ho^zipXmg(sd?YB> zzHJM8|M6$epKooyRD@*T&r*-Z_^Zjv4=|0Y$eBit_9$f-o-vo??9h&ur<+Yy-V4e& z5>uW$JaILaK4TZ)-o|By4^dvu= zoR*)ktW!J`eD*z=FV)iR(Kc_FQh z^R~xm!WQdfLf5IUnV!91@AnU#g7tRac=lJs+WxS>c^-56EeTe==t@awo)i3V`}!sA zQN~2uyHCO_u8A%-R}cY#!hceeDD(4asW)E{Ief`K*xh!Wyi#!!of;In4R8G&p}FY$ z=pg%<#YV%Sxx<{R}0{A1{hrBcY>j96G{}CVEHTUWN~uTkK_Eu1wk%H{nt(>ePFD8C-WGO@^qh zQPmkT6%WzCwY{vWOksZ1si$RktTN6}iu8J^Gqk2+!e#iWGRdf*GD-b`30Jn;ecPtj zWQe1?2zO1LAs;Zj{n*1?M2v8*2J;Jb>Yb61$LGrF47r2(hB7+!<}^&WEMI)Avn#o8 zD-=A&pwy}NN$6wUjTBgV0LT_?r)iu9p6z8Ym|eG1&w&EWuB0;*31;{9>C{8@KoCbC zvMZAwfe|IXoqB`WFo68trOmD|pA`r%Vkf(zsKJ?gPC^(oP)jrk*`n z16W3Z=rFsGz3maU3&~;2QFfur8oWn* z%BjSx82mQgWe2zF=rnVHs9je%iz#q+cM22c?F2R8?oRE1DA61_z_$V+=ZSoC^UYjM z0)Sf+Fyn{>`Zh-T2TN`KmxQF^>Y#tv^~J<^MdBYA0uU+zZb7+A&EBK`nJcQ@yMiIa znYgF3^v!R8y31_vC@#zxU`aytX8<4Wf%Q9Ta3Fy=twV8}E7UguY2vUh?+GOy{v{mT`x~j{6 zU&t*pwACvJS}4_nm+5ZGA}p5ACeq<^Mz&Sg7Olt~lwOIY?RJ@!Mrkm6~Ke@k9W9Hv(RlS+}xpAxTRF%RpU9lsm zd;MZ(aJJJ)k*(Hxhf82L6Hh`zbH0yzm3P&B#Ft)xOklweFiuk<=xAYKEu55pny6wSYp$4@)|6whFKpqECt!hZG3bFB>*!`7b@5-#_+aVB z_e*})jF-32y0)_e?N~{Ub z4lb`MTd5Nd?~|Uc9B`>O8&MV>)E}yQpI1!S6UQ4joa>1EgK+uvz3 zRD;YEL4(|Rtldv|ZRI(SpV^K}ark(JUsT(2{)Qr8%X)&Dl&DQ7Qm+Pke?>I-<#gyI z$gC!TA>88k2=V3~51(-Z!ReAUJvpq4T))F18b7?D$1ue#+L7ELd^y%em2ILk=}?9K zx}T5C?%PJBCP_`&j$Fa1R@^S~bifybY-pGM#0CJN8QC{W+Kpi zZam7czF@j`etep~UbR2VEWL4y^g0)_sD415V!q(rNtH6~O{4GJ4K!UJ&!ZvEqc!oV zrhh|52D?L}#kLcExo%on^Y&JisMz3%PNJVazV_48Xw&nyUAlq&6r*p{VuuRPFOW*X z?YNH(_i6Vo7dB6ijTq)oH6<+_?0lGlhhceQdxEN*dlfkBzkWbmtvC<2YIF|+a3vs; zxQq}S1J^miz^iYUB{J*fimMsB}hM3f^;(TS_eW{V+TlsB_!n^2FqJ72Mjz6el00a z7OW%LPZs=EQl326DojY!fx&<={weMsl2ji_T*}~J$xzDR2ua*W!3mO~mqz8x;3!6O zjH^9%vicK%ch#H|Mt5Otdt+o^@uU|pz2UyQsjdNy-QDYdzJXGuz9weW0WaztANQo) z9_3MmQq741j#X^<*v~(3MF7)+73@gE^G(5Q^d!5nN25>hs+^}#CUz9(0U zFj6-<)F${dVZK~7rP*G&QVp-Lo0=&Nr}^bAPrx~0Kv;ZCJ^%43cSD==Ynz%&oXglQ z`WizEqO!%l3dN3^G21^7{~LV8vO3^rSN%FZe0@9Oct z8xU4JOWC^`jcYM_R%N(ku6JI6Q%oFhX(NWfE)m0dY!!Qa^81^8i*@U`VxgK_Yu(n; za`8{N#`qPbV2Q6vUBdMgY{1=+WAL`ZJ`S7HZ7`Zvf7D&`ygvvrX4+C{yUq|UTV*)G z$z`$e%B}F+#$LxKkV@aAoSXuo9N7|+-y?XewdQd$K{5zBHe0g(7AfkhMk`QJk&&Vq zyJuRT6t5*TTW(G}%j+G@-|MNVqF~hJ&JsOTB(|wgG+l0GEm<;EYbIBBlIAjXa!Or` zH*5X7TSlo?0q3eHzCgT4dBEzM3N1~6a=Nj0;zE`2mQgXpVY;u!Cyeo|@Y~1FgA?7i zwbHTr0*?7%J4&QKd1W$%{|JOTykd=OZ_D&}5hd=|aGLpJQ}V=Hd^j@k@|obP)vkq6 zUiu9$1)r21_G1%=!oiRxIv<^()j%T0bQ>Q}eJx~{K5eUP#*f3Kp8NDm`>!t#>$8SK z8cMbVOhbqq8}huW1C4Bi9r9rO_W3 zhxN&WAq{`1=$Ecad^|-A!EC?56vBe((3j%h_ZW{?_81buawlxNS?HINk}nU>pslhI zM=N`MAayS*AJ6M2t+K=5Z~ibMM-Py_7738OmfnyCbq(?Fncx1b>_I>Rf&(CR-PNvn zBrixk>Eh5m3FP=Om?zm9OnHs$nok9pzy_H}|MF+0%m|Ed03(vX$|2H?x^TdHE39?R zkATe8gLOK~?G9-mGZ+89C|$8~U;Mk_Q?MYqR3b-91&{?t|5`-t!-a?qnY^g+hrO&wto9 zg2A*r*sca(@`n>D2e2knAQ`$TuqNeT3sUooe^*w&Jai8OYkmvX-1iMw(sK}{7cA*| z`7j0NTKR3Tt!%034QnsFArg3CdZTTiSCPf=6o_co2TspU+iz~(-zHN6WOEl48vB{< zL@wDw^5xW^PkQgK*CpQBskwere`q(`e#nkbFABamZ&-xVvWYD?S1zgk?%?AVAwu#e z62hyxoV$M-i(MtHizb1ZPbk0A9-a@MTuqmhMjf%u3t9UdYka7EjD+*HxC*GFVn;=5 zhn?%Y-<#Bl0GZYHdlzTXec**H#S-ov4kBigc`FO8@)^)daHOE%NS0Ab0n4cO#I$dy?;i&VI@b%C$2a=aH|M+@@rn zFLZqsYp)}m-~YUP{irM)x%@q-`^wQ2sCaPzTzoV)jZ+?#Ixm@l9-AkI@7!T_uujgK3?Hs2hnuxuuhzeihVeEa*O-=k~cxu7<>`NwAP_aPCO zWj=g_1`e4{g{D&xFL8F>(X<`f_Qpn(Jd*RE>3?yixA$eu7LMmEijw;g_Ca5)eLEH6 z%DV@Mwx4d3yV~?8kri-!z{#`*Ha_#st~}bL60KQX2q1s7jEpe)<170y;<(Sdyzy{6 z`Vq`0cI$HOV)4-^nV2Z|nJ@PmYsu<|fdsOXq{`wdmwjeUsy|8J{!AYC1>62e?VC_}-xB%NK(JbAXNM?Gn zSlTtN7S0n#0!WKIsalKn3)`%MG%KU)V%rhH z#GiVl0|>pRVg(<@#B%G>+LVtK3=7z+4y-;&;+QWd2vi%lM4JOf$M4KqwUKDcu0p?l z^9vP@8gOk{MJ!w?rXe=sA>dT(wzl5!!OuD01zCK*;vj^dq~Qqv_bP;mmu-{T<{LeE zJK84ocs@O=e$6JAqB1=l(0lR>Q33M(xhnE7)41PIwe6{g{$ADk?%yVZPmI@yC$rwXf1Pdxf0s}t1Z2rYl` zRU~L@TpCd(>1q#Iq?V?@`8gu#>IPY)l}^U_xhLuB3t6O>#`VX=gyf(x(nthjg;qkV zf1nZ5L8Y*yQ~YtsAS)P*@2otcKN5ugU=XM|L?@Q26^ZHOW_igLfXfPDxW`x;%2_KB zOcDE$GV~cHu?@77K)OEwR|JxS!+0YR3=MsTMf@4sNh~cNh^qw2Q9us$-n`)j7hum= zs$b`=aN%o181NbGB!i!Z9^NDFgmzL&vjyQ=LKu{r-xMm{@ITp|y=FXn>W-liw0;|5evz%BhzDL|ga|D2FR5*NV#dxdY@ z2jn7MOl~$kZt0C*f-V-iUqvV=yN-N#a`$id?&_HbOq>*)p6Z+KiJt-ND94LzR6hd) zUJ>bCaUTK0UAP*+{hW*6EhV}H#sr+gVS0f2Q09Zdbq?m@^ z|F>i8BI3vTHx3^N*Mgt~AASXVeQzCMz=XB|pbgpMep>1r@4%U^&v^bp zAyMqr(7-@P&pAbA+97pZ_03%4}%jNP%^uzPZWlvkw zIq5NsV($iq7_NTqmIhA)9KVwe0oW`vUvRHOZ@BNWd?kB}@-RXF)ppdb160Xx0*&(T z_HcMm?SEAI0lORS`)DB1J5;NCseo^|4odLzjd8*;+?cew{s6Nd5M08$To#;xTF{gI z`}LIJ_~+)J^8^m>17vR7L4xswG<9&uCD1Ffa?$QsDSyZ1|0Q_)Sr0{V3NU5@=jIHy z*JA!R@U_es;5P6!*hd;gaYymz{b#^6McobeZ$L&Ea2$|EoWarVs4)Q7IN<|*|3%{k zTAa)Ct_K0r+jfv3td_}^nqK1HiuAr^ppOM)?kLs<4g=^iTma7BdH}#|OdTfOf6&l7 z(51xx%U%kA3D);qT^hwbcu7CR@68cF1O=8oS=WJoeo6cfL5yKQ5+q3d7Y|(< z?FfkUkU|mNCnPx{{-1VPZZ1T^c>u>)aF13$rcNLBpZe06Jf$)28|J!QM0E*vN+#dbF>Qx2UYQ|Mewy@AY zf4T3wFn);k{~h;3+_{e^nvN16;Rr0@G7#rMEb0060uv0O0u3Px!ZY{~a&?3sF!z zrjB0v_TTYx&pZ4-uL;;r=o>(%Auz?Z0SA(i0F<=)EU55r@4|t%j%xo7zJFOXZro|7 z0u50E)i=vRB)Zq2GIH8EI7}lumOB6UaKZPu)&7-D&!w*)pt*xj21yv7Gx#~2W}YaJYHZ?JRzTV=3wz$$~CgJJ|IkT;HMv30=ZRmF#8 zyh|9{j6NsYf8Tol%l7xv@Ya_oiXGtL_6^yvpUz5RnO*?>{&n5mobB$idU^&wh_Ooc>s`KFhIrcE zTvI=Ex>XIR^)6g8gd4`e_GoFH9f9_pF~{Po+e>V^2c|iy|F^Kt5rBEUa|mdN1|qP( zaZ>|i-J@ZY0N&p(A%!Kt%97iY7ZItz$%`U7B*J}&qWJe3nL^P&d+KCBJP(`;V*mTm zruYo>+<(xM|1nxQEKJFD&+;Y`xQ+B{$OJ}s{a>KeAq0I+`_Indv*0u>ylJeYXxAi` z#OC%Z@N_$Tc{!#Yn@gi1`^sqX&zXSrW)k*z`K+pDFHVP@bl?UlHa@b_M0;Ug1~?ZP$qIB4czYE4P7Fv@Z~m((|3 zez}ysJnI1^qi;)LxL2_k&bDi@y0H3(Xs`Nhk>9g5q%4c;mNd;JXQkEcpi;bN7k9~E z6Kq(MTHK=i_S(WFb2Dz(ZQ4@gcVu>kCfqx!Dc}+*e@l9hM*XQhd&=sNQO@l4OMeIs z+s5NJ*Zuj(r!Ug{e1%J9&s%7+Qukwxj57rV;Wd(4;n8a}T$WAdAGmQ{YN?Jaa>tmt zL&nY3lX8YcLmcOGd+mjNX;E|+XY$CoCf zmB+G0L#f7`EAzJUhSS`x?$_-@Z_X`;gqe&=^UqS6{u$>x6%=rOFSq&aC(e{n*h&%` z5IwcE&&AnV(pG$Ct=loaxoK_FZeuj+XWUbG3uoV?seCN$yIX=k8c>mzCu!?0grmC6 zMv!`4J|Vhg!fr9BGW5eeFV7@sH)*EXGOy9yg|ka3Sz~P{Pj6K zGnm1W5;|DH3KBC|!D^wyPoTpXoll_;FgtmnuP{5GLnB^#Zww1VhhOR@%;E$GSdB&M z;s%FF%-{ych7K!2ho#@SW0~*Am(+m-<4Mjyf{EEjQ^+J!h=Xav zhGU?d3h(l)=qTnn|s z?`(vY;&*kX=>5Wx3-LYiY zIv1=e1#yFdDqrBn2URv{+_>&{_-*bDq11+O+qF<-H@-fY;6yb+t5*y7T%+H8VH^QC zQUl>+DW8?Y>5_S$I7oqe_Xn>50{#o?*8pvDoL$&4o+U#XzpKGlr8VP8_}x_UBM`2; zLmW@e$Jy2pz^@`V6bL_teO7ikZGxX~!p)#jKp5zO z{%>v>7sLNV0}^o93jE*er@^e0EHiWOW#bYMAZzA#L&UNbdGFDGrnle(cN|~jCNeFhvyEkXLoj~tctIF?7dqxJMyoRV7mksJIYtq`-)xbB>A#s6>O2- zKDJ(s2(>(gn1tE&Bka6w)!Eb$!l!DY@N3bDof_5Mk@NQ0+10w9vm|;QzSeBdg{9wl zv8m!OLuSd`@&|tKOzzvNJiDx$ueeBWPK`hcv!j#oz6!`YpAE`Y%>QC9oOjwpo@&2z zrSjpO?Z@GIRY&c)vI`zQ&vnJTRyU7)_TNh0A;bsf?kC>!bmPdLVHM4+nh+|jbSZA# zU6aJkv`#51g}ELWd)s*Iyjhk)#k9HR*42fRTq@;T51wv@l{i0 zTU+!LGQRilUtKmSj{hU5JV3hVt~77?$_#tBs(@cNOQ>GCSgdZcbl9oxdZsUvD)IlY z^&e1CG*8?x3X&E9SwKJ#VL^g|WDv)*lt+Y*_`n@rD_R$b9*g`(H398t^pB{pbrbfQ^#0m-m7EWWUE6qjn ztL5V8Oy&3Dm&1F^%gy_0uIE~Jev3xWs|SB@>J!~eMeWnRUxQDXFz=I#;PVP^NpwOH zFYY`|*cg38p=$Xo52KSD@%s*m5$rvoOqwr({|f7EGl@>WFG3hv0Uo<8(FsGmz$OWU zEs@A5`5_dc75EHdlATWwFK|eTVN3D7?6vc)KVU$JeLi49=zKoh*?q{%>GJ_=m3s{j8u`_W zWep!%hVhpGI*9R?2)c*ymzco`0*UhZfDg&^`EVCf?gJj=jr93I2pRJEK(zXC?ICm! z^Y0@DCt?TyP4<^?hXjO4TtEWiB;4@>QY9|%19BwX?*HH19&Cf<6OC|kI}?%zYk9!QGOquLNfh6utLiHKCnTM zejlDehDa-7N8xX3Y3-)>{jh%LaMzp3Y-d*c@%Njs-tNv(!u=Jw$W1miUw0@%nF0QWTNda$fS#^N@`&Ie=yp7H&xYbbr zh*d2ni>*7K?ugP4q+KtY>zx4yMVAt1`w9NS&5wf5#CJhkB2&+QwnWd7LuFOY^|~Cf zUa>d1Ylt!F`LQ9*J@2!UC??cSa;Ds8?LzGJ!BdWiA zk@8bW`$=l%E}MvqodW(nk}`RFCWXfJg*k=Qh7r}@FLdQ{tk}%ml8WSaCaRv-9i611 zOuIje^r&+E-k~68cQHG+PtOK^2*lJC1v_AO)=3?2es>638!%qH7vm+(2fufnV2P$V zQyys++?mbxaQZDEd%X7DA>x*T222pvDw;wZ?B&l#cki0QN(>}Cy8O_Xnd|Z4w}67_ zA}hinp|{lly2yoapz0JLTAIZ@jL?XW@Y>ciGg%aQGyS`6sMr>#21n#~dFR&9dq8yu z2ss4T`D5*I@5$cB>U-Wf@Ja)=iyw4dB5#+WflF}z1333FJQ)00VsurMf2HUuf3tpk zvnT;C0p^Tfq@!o)pFcO=iM}Uo64d?wnp)1@q3C!Rn8iFw2+o21HMlsuqx2Ylad{bf zOL0~MZ6unj_ zz;k2NDjNIg-FLUI!*TyxUe93l0Y5wRpWgu2H+0}?=%E*R1=>ix51{op27Df0Oqe__ zW7)tEXF_^n(0ZI>FrV8up5%%8Ag?f}e_ubfwOs60CCMNKZ2|yZ#;t|qVig$q`Ls+I zmjUR3ljn>)i3I*XhN69nL{f1M4sMR0Zw}$-hnb6Zr$#xTHHD|{XEzx|cEZruI6vg!cZ3B*xjsK_f{=EPR_v0n~GpfrWK=$Q0 zJj@)O$zR%kB2HGlNO$2Cz4<9(5};d!g8-MnphMKnKHbhPCk@l>vYF#2uyo;Y*aw7E z;9EJG7*GIiqQLABFbS@3pB%xB*MR1Ab0fIQI^5`B8r;jmT;|(Ru{iWRdm9_H=}he^ zvsd{0{N~I}<=olJ1EOk+eFwQZTKP+A}>7fB00~Ez+4yUiw@l z(fo3;M{Yr%?#avRI~VQ@*JK3*RpS1==r7{u{i3kw~~!hp{i z0QrUkbRGWR@-z%I)a{cCa6F|K{ONL-Ikb$F&8bJ%arMCA9yjNgyQL0kKv%FD@zw?B z!qw2>tP!&11^VBDoMYg2qAIMivI1MtQJEuCKtP4}YBL@~{Xb^ZRZHMqe$A=02wTr-t7v2f9> zWiik4alTIb*C_=@!nSzvPas7kw1Y)e;1ol?%{q;-ooXZbS6T~bJ|Bh4Q;tDPz9Jie~E zetWjhuljt_^Ub{jXbE-Di-B8e(!>;;IzL4cE z<@khB$3vS(d36cGt{l06os%)b{DL`wLHhB+i8Dok{9+uzs1LgL+yKpci*5`L&eu5%Gh}#b?H!(xmRh`yrMcXRo5}IYoczSpZKduTqU(IlRq7T&tDBi%sGGTX zztpH^@FNmMY=wd!e!(k2>3G^^28#@9>CjfMHH)~4?q%aL_XCn8I0XP3{^Lc+un zW%*SngXfnCtsPrFVL5#i|9GN?G-uy3tK!ELRett?%ZN0?LjiWtZ6}X*V!WD=Gl3O( zVev_37yFm?TW$N%o zP9>e;Pf$m;k%F;pJ4(s^}Gkr6ndTspJAey zr+5LbPu?bflGwlt@RP8F1cX{Xd&}pt@*~6jdPxrauF$2@dn)G5{+RHt=(QV>Qr88z zbKZGTeo-6UP6u4F)eQhoy5WH$Xtrcexhn7{sOjrxqGLa=;4}i_vT;L$tJc~LX=ObT z6w_{4rAhU!MdMH5g_5k@&+IY_{5?j4pRz-mg>xI5^MmEdmb;gD?4SKLyl?;8xWiuW zr4DQSxd+7cZ~ei=>gwg@%?l}C3|J)$g9HNe!<3Qmf!u}qVluptz=j}Tm?TeNemF91 z!=$m#EIXfQg}?85a)#s!MJ4_m@ozbJ9x(S{87gqdS`uwN~Xbl6aA%wq>4h&yA1p@f}$yf-9ghCahPJbd?>pTaD8=k zy;zHO^C^#kzO=f486lb*^tL(0I_b1_xgt}{ylb%;t%GtJf9LNH3&5>+z=MT;3 zgF@=s$8={?bn~0#;%752W)I^hP9s^aW>juC^?-rl$=bLa;!Wi4+a6ce_vvWoj^bKg zOgvkQzKO}qVsy;zoEv-tdF_(5d(9cOIRqD-aQ$1Vgd(;XsHMyFR^CsW8gX@8aYm_* z1#NJ?oVFDw-uw!5?c>ju?>^jy7n9ob*{dmJdKFgf9@X$(EuMdxDNA#yLsf8S4sr4g zv@|3(m+KX#rR@*gG`X@R$2pBW-Mn}V;G?od#Bp?En#uj|Q%K_3&6TOfCTB(@orl}l zDixVj5-GSS)v6ap{(Syyf_u6fr@~j#))e|MrT6)B1kt_sIb_p8col~sC0ITi*fNtO z1suPGuqIyW1b=OOvVC8Z((IA{R(6S#n!y(rXi-?D%AM>SpN(fQAwq--R`#;bhKS6h zuVs+>WC)_$zh)S@NtkaqC zvth9#Fk&xmX>_TmwVZL9S*knxRZCA{_p>UuW=iNLyCvf!ytcX`vAJX&_p)?!wYtt5 zEq<9^n%T#en7Z<&Rz1bb{PE?yj+RFa(_2qYv%*^D*X3S+gr)ilPD&GEs#LEJdIn}1 zIa_1JfBt4HHxiMb<$^b)HGK8EvATM8Sw%v&8iA7inOWyhV0Sk(TAmOk<`jGP;&-8n*9#sP56z?e1dn3)gBruVbdn(fg>Z zE?-fnCE=A$pV)}&c^UJ*w`+ZM&$+zSP3%29uu&V<Em(Z>1(U6gg;Zsq0l43C)P8UQRckiQ3w< z7N#htY3OjRYmVwSffm=qXD(57Jau#Xn_9Kudu0MqA6E@r*fQgsxbi$HebDGsNk& zWBfE(fTZNxFTF~4+w)-IciW3#{de2TV1xwil`tiO_F7oDqUj`#u_5#f$M_wT0@wIG z^f|7vDO3yB*c|GLYi!9%%B!g1n3SB-YpdL4Y;Ma?^&H})5tB5X+DoX?_1@gkkZ)}f z&sN1$Hh+n`N+>2dJ+!xfPsZGxm6^AXEP1oApx;*2v^#%^r%H^I=Xe+AS|cXe48zd0 z^<6dtZy$DZZ*v$Tye+JMpEQQbUEPC*gvyUHK9hw(;~@L!EdviOC+j&ggVRCwM;HlJ zKPp!`}ThKGaKJteOM(Wf>72}hfszY zD`r5#ln<&yBx8;hGcRHK0;+RQCJ!rSSHe^TszWTZh82U7FqMGnMECO0BWxiIkNtW> zzrL{2NvkGAv#97Ml&SVGx=QNT6D*A+pl07m>z#4>mm8^lUUs%g9PDPZ@K`cKApt zrRosmZB@m>rk(WS2iwIa4x66r`N;ItV$)q}fgfo#3L$gz*WAY$)5I_L9`d%|xOCO( zT;nOZ?Eq)9z5aGV!uPye1&=-~vkU|$mLWv8Xf4EqP@BCbEFJwla>y7Lp^B1arFS9E z($S($Iv$4Kf={xiJCbR22DumX(SPPj?k1xK$i5Laqf9kGhZe<*?JM&Fc`8N&%-l_>_Ei#w|%39BwU zOisu9&6T<(neXfy>YTovXZQ4%E*yuSB+m?%H2)#7LhSD!C=1eUQl23?kW+)NOsYOb zVi74M?qp+dl zggfSur7+O_ zW@7(1E)qRu_>=m(bKG);Nn91KiqYPKYVQw|e}3yk(uXPOtRV#Yxq0zk-aD;L3GS+k z3NPgvrJ!iL^(Axj<5anf1yVt4Lq)lzvN)ZbF;<~iExTU| zd%MnW%{hmtP3D$g$!Em#*UnJOSr4h}6i&IOj`@|uSoJLM=1eZkaUGM&t-_zbtOvU4dKyrH->>!CWK=9Z5q zqe#@`Hm;D5C#A^Lq&MdN#l}ds@zK1KwHzTLTTW7?dHBvzk(`*K3A{N}H04%`zemv{ zL(%6f^eD`NAqP7xoMfLgBarSI8f@?)@8L=vpMTg1g>q!#Ea z=+8>n|4`HT-5!hw4pIpQuoCq@27x%T6tIr*K_Cr~rCADOp#Xu9wzWlbGWm-ESt*<3_uQ+E$vcQ`eV zLSL5u6$U%APLh0H(B3vDXNu0bi{%81@rVW`2ZEBtzJasA01Bfl9BrF>1$JHzq?daQ zb|V%fi3dqqzg?IPGV(aQ4)kq^>%EaD$6ZrnIDP{1D1tnn6+j+Mkf$8vX^01T%0ZsU zTyQ|oKoXl<5=D?iA0*koB}wePQ3N60F&uM&6A~8E-viRCG!uB>A6_M^`at@ZV^~1aQ8o9@3YJ-((?uW=nqgm^C@&Plx^ zW8$U7Ubvo6zwEM>*#7ZeL(l6Egt-ounhR_J=%bwo;j_hN6RQ&wp~j&ro(LixcwR+T zl8_=zAcb63*xa}dAS>YUJ(JbzSc%lG-dm||W5?(}ud-8cH5e5EJad%3>dfuzz74!- zL^myh_DSpuJj62c92|;AMz;2_%mwUWcTVzb*gk?I0+a zs6Dq~LT)DDeMhwPAT1x^NBYZ%!fpSzphL=3xXWws#J-pM>YeNh+jJ|6&w(K8QqXzs zp9kGq>|thc5d1O|Skyiw;CuB+S`z%WxN-QOyW2cqU=kZ7)2W0|WW9?%=YO&Sd@;Tl zYh+>RQbmNxQ*DJJRsQo9xj@!mi~DuKr4)?y0Xpc1>r1*&Bts-{U#2N|dOs4}`O8;$ z0hnafew}4>`BCFF(;lcju3aZq&XJN=6t+0SI2}azCQ&4=v~}`t_|>P;`z}_?LZg)# z`w9;6jYX}e$Hk+}U*zE|sx@z_!chOMuv~o%{ z8%^-0E7ZGZs8-ilqfuvQo9lf!@W5*JntQbNcweZl7?nO7)y%f*&Mh-jQGqnG2%T?m z8oTE*RnI(HR@Wm4CQ5WPXV=T!+cS`zLD?Fu(=KYRXHX3ldtUFyx84QxXQr;|k7~3N zDv^`SK;WPZC=<^ zlLvZ;6?M^INpRVm*&q5DttuA9yweM&_%~cVh8KNSXEIk11J>0(5t$raiVqchMh`vx z?8s!U3RX7By!|o+To!e%1Nv--m*QSbU?nVm2+(;0W|dL-a&eOx`fD9X%Lh5>USHm1 zVrhZ|Q)&H;APON!*PsK^dBZ?fxni&?ag*N`%(R-u2v(5&!wLbhUV{CoO$4#}E*RAN z$3Z#*)=Z%45lhu`FimVYC_MbHDen3){A^vM9ZCE4=!K>^o7U~^#_@5PxP3cSly1c8_DW&*s5f5AQ#9bAfQJ5`pnflS5V z{W3Y&b1?BYa4ZjAcqaxysa3}y%5RX@*i{U$h)y2@HqF3pOxA++ebZpQF9fhwBW zo*G_QZfY=s*QJ`*dTm+fF&ZH4&p8)qDc7!WukQ-q?*AYOj*&?~&Vw~zoZeuGbUF6D zJ{fQ+0tgRpL>&V``HX~Nhnrk{^sc5#u{O(~v&O9hMHgrgyb@=A%5CpgyaaH7VK&F- zO{X{F{-iL_I0zc`<2>aE`n*)Of#zYWSF;hKc&6U8f68o+tWp~qW}ccU4xsbc1?|r` zE9toHL|sSGtG=J|?6w7_>)_EQGb9J~uZxfPHA-8ycWOAj%gT?nN?yC2KfL;+>ZY|- z?%u!f&eTWV!Op_rcTHa52m<%4+Yp&bySHTS@cIlayk308*(cN~R!QH-_pW>S;*5a&9kk1PrS8ecJKb#b zd2PA|yS~AxNq!u4)ph9l@WO!~YdTRPKyJ>ig>lSock?d9dw{JHtNoU_J3D_q%VOS20B?B8fjO?e76dR>0jI%gre zM@_cq{FnRDbU$$VD_3E4#TG^L*a+MLntU)kLXA~@1)HRtON?(i!%#LLe`#VO?s^Ws zWohNgv#VEmEgs3qzqTc8t%b6J?d)$aA8#+Nx0g>sF~N4;4BK~LjhN}f9gTNxFIefl z9gW!OZ5@p`>Gd6rxMF1U{=JP5g#DfDVxJ8TSR*0A9xHp>XG09u2u0XqXS4ZksK6TU zBkW(A8W6~wGgNZmW~cgYSi>40A~^7}XGhA&wm-od>8#2qjW8(ZqhGUahr${kBRKH0 z^+ zm#NuPfI9mT0Ywi_7a9rr&Rhf8^A#>iA<0S68_T0Z5^8wV5tlE}`}^B{XF$Yz;Gdi3 zKSxbu$M-KU61}=n{lJpk6c81egM|_E^J(EvY5ik?|F#Ynci`~9!22~o#Zfd?BQ{R< ze)lQhCW0=$SUp4%0MGyDAq2eN1BO8(@k=XUG4XE@kn=t^Sf)E%QHkRJ_+jp1ULzg! z)sMul?cN!JKJtuR;SaZGF8=4GIR&SzqM#RHu`kAQ}O$-QhNJyvdj!@>tz@94UUU+R+e| zow2MdYhW>WL=${6%AY^mPZmkK{7A*EkKalD_>E%WtKf#}&HCK%qvVEuz*^_mFU0|~ z#pLai4`OB<>q*8>;RpP3f&K1^UBvmqtSy({G`v0PbB;=0tV@$Mz9?c05G+1(*ejse zTP;~=Y|aVN7PJ_UHC)qeBp94w`ju=0tQZ$ME%`ObY*S$S2|ENcJi|fMa;%JxWQj zuVuu1|0RBc);>;>SDtIt6V7qIhfB-ptxu7usP^`BbW3DX#DMM#tj|-aSbdrwa3=&; zAVR2|s?&Iv$mgkU!gPYoy(6v@#0jo+#gTuebrQ}9f`pWQ7PCLfQ{{Er5u73=eQ2_` z5@(LTd;k5tmg;t@HPKFz+H)%l_rQCR2j`^e2Aq7Z&U!EUMo~6#g71%>C`Q#p^o!!j zzGYaC=M$fq>>0J0vvSg$|CO+@V3d?ou3ve=-DuTS5_-ogg@*}GsZIwp z@PhU71`_*YA5!3cj0+tnTBm807ZjwMain1IRI#9Mj1PXooug`LnK!C^sQFjc~END5$ni5Ti7v0orycqAJ#6g#jxv@*l~kk8N`#8MbAMhq!zm??%71ojO>iV(Jf zAqACT#)oFZcyxTAxDYEJC?3RPSmikx1QMbqWy*j_Pd0;ZB85p$4t9t zzEDbthcEO2B*Yg=1xfaWQbP)Tp${Pq>ap+r9`pS4g+7Y;c`x7qq4WvXi6`X^!-h!t z!DJv(LExz`QlYR;h*TsD8(%6GCL?cJiA}G>5XTI0Buy5Pgxn91kwknsdzz#q2_X;A zlthpR=u1K<0!$?l3GNX+Yypauq)KjYk9|$+ z*e}Ch zZe1oRPZ!@$Hp;wgy5U8;qU&aF_SY@$pDwnS0FA2)$F1g%%PQ8kMb~K2@TttiW^c!a zFXu!e4+!5gGT*v8fI-%}#x?g!fc#EI=Fa*9(m&VrXn|o>lBs_V8n^D~giT$;z$1Mv z%j>3N_~(eaLBQ^W=>9g6V(o%+zmT8`T-s_*ceK-H77|QdzM9QmjH|T^(WrwD%gtAa zD9u|vWCJ(RavKE~KGf^!7BjJp$1A*?R98e%e@i%QC`!0&tkta@b*$OBh8NI^dlx0> z=_|6r|0HP|Z;=rZT=1;km?Ef62_9 zw0%%KId@dAJ6l?%>v_plGl;KRv)8Xyvye|~jlw6Gz~wAWI6>tX5ly69=R^{G>&9PH zBo;_v;KyI2=f6A@E=-)F+O3f~&r z7kraUmP?IGq~@g&US!l%TLdqsE~+r};&1z)LsZXNDCtt9C@I&fuE!~!U#oN8aMhb7 z{d(4n<(n&AX`G*h?Uxy3_^E>c=xy!q1^1$@NB;qN14&Y;FkTSCrUvYQrj9Z5y{ud zuaOKXa-%Y$gIuZDhzLUC--~)GI`RuEcCbaMFV6=R9a83ulduRC;x|QX^{S>8{O*=G63A$6lqU*b0{D$|l5gpA03uZXc32(W8rf-BK&RY+V{R`m6PEu7M$Agt&m7 zf_Q-fS#4wtv-b0t#q6}` z+?JMsjgTgQ+HO;ULQPZNSQ3Zf`-Z>Hhb;Ow#Is%rZ0Z=ChX|j?m0z()++lviM3{&m zn2afAYf+NfI%9m&6vJ zzC%MK85tzOQu$6!x{XX{IEVfq^4gbOvVp4`K#m;%jmn*oqo6tYDea``i>8Q8(=E|!3%I6 zhS4rLd~TAGu#ARM%LL$3Wl6rWj3%Y-48Rr4l2n7;symqJOUImpTrqlf=n@0Z|F^=U z{uYE=ktJzw38kTC48|SFl619%(o%m5#y!lE1Qp(^=H5EC|4ZY&y1qlbSO#T;$ooN= zs7*s~jk6_FETJsBPUB0nbe()5aq_l}%P9wyff$ikI3}2X#Uo=+wqv zKT=(YbH#ItU&8~-tdS#)phlT|L%da3?7c>0GZ2(h!e95cv}T^6q$V+{dQ$MONvUvE z6R1++OHWyv?d=XmgN3{Rs>z@&F`Jyo@=a=%n{S@=BhChK2j$MniiA`A$GXKfwKnC0 z#XFzVr)uBY96OP@u&?dcf=Xp*3l*MUGqL4dtZH4LlFZv?{ouaIsj`*LsSV}()BQJ# z)+JM&)PLA?u*woDa3>1$34}fl&Rm_-7^J$)mPFAAW!W_Cl$6cOJ#_iO+d5tYH%lJ8 ze_mVG5tpee93+-cKy?P%eTwT!vgmnB(iKlf1NkHCf>399Wqrxo&VR2nM_lH4bf$Lw zM;iC~@U|HYw+gqp$G&X~E_@BECae~-j{JTWN?0qK{JCT#bYVu%XnIDD!+1B&>F3OO zk3%Uca=+?qv1VH6T?gJ|50A!G3GJoSFUy9nfqHlZaM0h{){+R2#APkM4KdW$Lb-(p=(j$`@dTP&4p zKbzEqmlQl46PHUQ-5Zav^O8#3s*w{Yo0K)so#t<>?(1`29vT?SrAsSJ{myS7aM*!8 z|82slG|nj1IGu-OKb7t$}#zFZ#)_NBBn5?b-_kH76K7Ntc!M#;S<=L#=rpeAbJ-D;bY^Pv)BjUR)KtsK+2 z4s0|7Z<_5_`F)7NK5*T3<{IqPK?;cKJqn^agOWbKlxaJrZqrqvxBzJ~ zWAp`kuL6n$5qiNn2H{rzD}X%!3nyS_zJj+5;B>atu`%}kV+{IN`1W5RvReE=WU(xo z5u76vaKxeDzW|gxy7Eu5>c0Z%>c4`9Ay!f$*ty&JWZVFu%RuR%6w`mh>DBtk=HVqD z7<*|H_yb2k{?m;JDu()uG0C|v)?V>QjumGPy6Sjo;!LsW z1|DgUcHfJTXT3N?k``PnJVz7X--c7h9|F?no;N^wWYeM;#g}i>o5Uv{Y~zI=MJhLZ zf4lyxqvBHN=0X)2uq~&6&MNv}@MH`S1H{R7F%fOXMkl>(JB1^CX4l}FpciI&U@~x= zAW$>69;geHs~cX+odV3_hRqFVl44d>U0$9p~V3C;jFSvbTaU7vO zz{;64=6UtEJpwSkaPBi#8#O^*y#CsgK|CC2SD=R)21Wh0B&K;_6Yc$X3H6&_F{-+- zM4z;kFxeW8~9#Z%t<`dGfzAy=_cygrpt*$5#X72&EF`=u||k1aN`&k)|J zdhzzf*4i?Tz|FHrDscbgpI^M?B^?ml$w(BTC?Ddee6tQF_Qntg{jSw8C|N?ck^hAe z1p+;}-xxc=$oG9MfdA@x{?pCWJJ6#QOtB%bUojr|I%640aF#oExTsC+0)8-YZ!JZo z6g_uBG_K@+I5v7jhW2VxI*uPgv!E(I6*;>o!Z&qO3htE4aSGK&Obsh3 zj^`Q9_|^k)xSNqv;XMLP+x*L*TL0Tq1~+8$Fnp2q$&25}y456S=KX+7;i_<-=6(ZK zt`?A5c=Zie@z(~n_keq5{>Dc&z=y<{%2MLA%=yydPdU3otNCYXr}#1|BYneMo9=w{ z*HQju|EdfAgGk&1~djHr?}Kqan)z);+3Yk^r7-cYE>ZqrtbY?3la= z7`BcwDttC_0vX?89|ba|kdlN{M`MR|-(*Zn5GZ|rm5amtwtDmq*|YanzW5Y1)os`e zi4;lh0YJ<%ze0?T><2_K{o5lzEWt!Fy}PJTf*5h$pVJM`X0>#xfT^7QeJPg*K~p(S zL-&pIB>n9QXi?;kB4OKVqAAJ2TO<8qno;Js*)8to^hI*KWa`~!&zDX&=0L1?5bIpZ z#hk@3YOqBuT_Or~mx?#bfZTI$Y17#6!@u86O z9@uREzh;{MHTP@}FG;x=2BY^43($1K*T{<^7jVDr-=^C#@E}u#`{^=S>|NuV@&{gE zKpNZ9%{~J!nv-pH`D$Opf>*qa&9+b8t-0M*1&Qa%GZ4YH_S>-k?u>TBkj(_zVDEpa zP+p>=4)GreJmc;*JA_YdBk$O!0{m(vfWGMw9DIRzZVv)Cs2}8W(>qyrs>Re$xT|-_x>AJ05b9UtTrX}U1XsgD$V{Vw+X3dp@|AYP8?md(QCz=A?DS>v;9o!6^!+SNYq#n0-A(NwkgDYd z{a^e(I2D_*B7DqDHC#u)?mC=`5c8MvI=o?T1=|sw_%B!*UU3dT=lC1D{m+Wbd-c%X z2#`(#-Xtv}o4cmQ=hmGO&095pBex{;cD5`sXw|F!emzOiBb6I>waGN}^oSyHQQ=c6 z7uKLs-`6-lxgyJ`;&b0Dwe^CBpYK8(=47>`h4Pff24b1O;wMQwCm8JOIl0(6Zc8b+UYM=IT;cu@r zuLN6E2e}m&>5wY>ZX#o&aBbNuAEI&{+P(``&p)B3gObNn=ESu#Y0{(X7O8R~f5SHg zxIHZs->!fE>N{PLk)H0z?_U+HO=}+F=J`w%{l37gGsJZhzbREm)_Vr#HQr>#9-=rm zDrd8(7dsxe`7_}Wg`$+oSrU3Z?de~Z%AVSVHKo&;B+;@-;lb+4zREFawcS-N2h%)HI+)@@mk?dw`PZq9IhfE3gv!0_9RH0Sn2-oUg*bcJf8z#r2SWx5)q(jya2W_7MO5Fv z{;BcrI-&l7$si$tjgOGXdL&5k40b2zTc01U%pbLEiyv4FJ`&g@2#Gr+N-`8`Fu%~= zI|MQxd?8#=NnD0u32bl`h(+QIyAwr9L?8wx@??NWVlzz0zU4Zad8Nlv9&wUC1yO?j zkgp-3_zLs8FZ0z8q6NhyV6c?L=0N*w<8*t>H8y0u$x2q1!RJ?OkZBEkWS#r+FFa&T20 z)&D+z?dbPW{imJ=5$0#j+=)FG4WmYbt1)%=92JS~^tFuX(>i5e=+i!x1qnCaNar?) z5GKCSr;jq5b4cl19;R<3rR}Q$smh;avn^JL2oJ0t0y_ry`d=ol(7*4WkMOC>^pKPL z>Lg*3JKiTDAO4BshLV+#fXY&wud)r4Y?l`9WX4Z?F`ul-em#5gJh`rg{ zY5W8~FR<=0L`b+46lmf&coVel)OMM0+&pyMYB4a=Hg)vMaB%8qgM*F8nLSF;0_d@6 zz0sJBr^&a`W^K9I`hI1r-Kd#3;ZyP2B-Kra$h^Ak*ig%#iue0uB{hNN@6Ypz6E8G` zXQyYTpfuv$iADvwTFcC>H&PRo)J&f*1B=Y~yN^~WixMV=k5?(1`>Z8iK!&PIy08Ch z%UJ8<)MPJq6gKkCveqGD=4t~ODleRhb+sNRi`RjLMv$$uk{S+}@uO1|t|<-WrB}dw zHI$dgC-8|I_(^@pYt%G6eFi@5FkoJRt{R4C0aC!rhF4cc`mYn*tTvFo_!7#fa%5Lw z0Ga?rdBu5x{IQJ$Lj|tr97#Oh=R}^X(Uy{E z^Qa(?WsuVfnr0pJgpK(oHFMX#0c#-86=xvuLVh5SY()P>h5aMmg^4ihvf|duBk5+7 zHEEXpB>AzU$mFRPmBP!9c$ridxZ_q=2!I2ZYRCM59edw;6Dijzi8(>~CQn!f22>Rj z!6Mn4feTd)h!!Q^j1o`CyU=!SzbvRf03!nlK+kR@`&sBwT3Ys~l%9Gma4hbB_yx5X zl(3RGSUJ)0n=uCTj=!A_qYa>b=}0jjHB`Vmz61Omd|JI~@!w1tZ6KeVeg(oR!#+|N zP+yhjTmsnuSb00i+4_ViItR9N8@69{6H%xsZgf{TppEI<*6oB7ay(fl20W1uyav)+a0FlS%B@gR-2LxAX?VKGc!JFOG9G?->K)lQ1VozPV~oLF z9Y-3&Ou^^ie|T-76AAI+!s2YTt*7D{<%b@vR}SGOR}PIyXSd@A$1{Q+lQ@MVTEsqi z53!*IHk8*i*5TV=hM6#pK`#HsiuH)t4Z%EqGY7&;YYU2~FRRTw6VI6yGWZ!Z214!VEzVWcoOEepEb1~~ zLueyj{_|^h!TtID@tY~(UZ)IqW%hy>9Fz-J1wvDfY8<*Bs&sAPTD5)TN6kO+#!35> zKUx6>*2%R>9Qz;Ygp7WDS*L4yZSa-3mjFo3<@o6Gg;G2|o5Q26grmhRp?PP9%jNP- z#|pUzvZz|z9_AWqd;cS5xom6zlagvir&KkI>fi%aw5>NFpQ+aiNV!OA{65FUp?YalYpq?I$+ z*|PHVZ%gl}S4oU>K>3xXx~%`5J5r0U6M?0^EioXqRE$#CTAF71u$1cGY6kUM}S;P223wwZ#9p>|n6l%-hZxMdS?~Mc(0mK#a2N&!u zF7}wuyNCD$CN$8J$EN*QeqIt>Pzc4HA2P7t5bVdk@0g(d*na5&)s9%QfEyY!&zb@vkkc+izoI)CT! zS*^{V`g8|9*|o@umdl{|RGMlrx+ZE^8KO1OAYRp;=Kh0zj+^fD1CplpB9z>3^4hO# zwh{ej;o3jRbVU^{PvLr!_t8cd;I?!ipgLF;zdF4(nF_wg0PnUtnlfGFeeXrsdr;Mq z{d;NQ{u98_(Vapx_%>c<{(N!;a32zAip36(|}+_plmWH5T5;ZYRWN&~QQ7 zqKq>4fkl(A&)bqI6y-~e=jbi|QXH=#gTVD*QT86TLPxDqs;s$BGz)ccxY5x9EbMk{DWUBW}OX*?u z?6U~?yv620H|HK`$8ZZ2KQnU6_jGGy*t?jXxh!hZH%MrUW}nBi z|9*zhHQuCZotr669vI!Ow~e@Ao*um(e(jdYR{s42WgQ^=%e-2xmZE>O=FbdgLdm@R z<}3xJYg=Q>oe;fKZq-G?=Icn;AMH_%b7>AKA*r3*_FtmspP{&$jA8cFh=+JfYrgIn z5+c|zT5KpW76R{1r!?l$4~)YPKJF3{B8*aJUwz!)N{Dd5XsMyZ_YlF_@q6fG;)DG~ zV0t(V0m$62EQylCb-)0&p2KIm}QFPkCQAKw(L;wofgdGF)c`WrWt(f(UWTRS-NudkgVVkZyj%m zx=1R6pdq@bL4inbI{={k? zSzdn5Q_-c#Q4u@L7BUN!P5*R&>7onJjc;-`!-h5v5`>OBx+`feT5Ow)qpYu2lm(03 zt5Rw_o6>mABT}69OF!E0(D0uZz5M81?97k+L*X(Q^PmQ1=c{{Rm?9!zU8#FwTCG24 z`_H#H{J_TG-T2>O8G|+fCb;@E17;B7--y25yVkH>sm*_XF2Asuj zrL-C(G`Z-DO<}Al(QlqZ$?wVJVyPcWXo^9xG5oM4z~u)Ih9pEv_AU$|+1rbW4d&FB z_krD|e@p-kpf~-7>Gwh+8V_V2q?DAffUDBoDbiBX4T4CAbazR2vwOccKF{<2@_vDtGjk98cITcs=Q`Ip2Ma3; zkD|~Y`k0=P41&dI@dPu_1`%ctgG59{6X2~7@gAc~!JsejuS8ys*Nt)!oQdNv8r8voOs;^bZxD^JOg%_Zd>V)0L3P-KNVN%Mlfq0 zZo8-zp5igqEB+qx@aMGB!foMw{GVRm8T^sAiKC-Z`F!QISAm1uRLo1e&pS!coJkS8 zO5az%G?=K4%AS`!as5al{%@0CwH^Y6HT9LpJBnz7$v_uX$7QCn5I}f508HvDVEI&> z#xj=~-6!+OO}E|}&dBBCsv<%&-5bSwmsj?sc0cn;1Lc3;Ky}m;z|^s?hSX|0#QxLS z8^HPks6GasR~`b1c>tZck>R)!yiffWb$;K89ek6n;OFBKC_u%Od*jJJb@34RcH0Af z40AKWlknlm6d;=n3HY4>Ey_7nXVkSH0XP%t@i>jE!+PxzkPwjs=z84}C|>)%TbqeR zPtT1VWd;kFpT}Z+PMpOgtBMQsR;?1MS!5GfxbU_-`9qbvp8yxC=o}ol96N)`=+=wA;;T#r@ZLRaF_bcI^zLL zIiNCbTzMK$rw(;|97Kh)k{95%%2MY=B8EnC4taG5WjQq?{Mb%=4)gb9LG0e0 zop{rj7%TMXM|WrE2hmVX6MAN~l()p4l81lvWIw5)21C)*X zD;bORAMuS0Aa~>RaTKV!jrq`tY3SRJCVFulS-k@c4IP-d*RTA2mCvrYE+)?{h(py%32IY-XuG3bYzh)`NZ7LB&fCU&_>0HWHs!(t+Y@8d6Q42^ zXFjMqJxWelyX&Cu*dhr`Kd-n3iwwU0DkwThoG?Ov;wxLNDbaV&<{>1Ts}MlT zPO4_O1>fFwAoRHF7VdYBG5hVh5)g?1e#gD01Vje~Yp0&x{Z>+Vi?&CJ?4)swQpFJ{|a*a&Rjgn z$v>)M6-cc)RXW0xIA(MESPTtNa*wvyIzx*1sMRN(?{Ke^dvVvbHrGjp!K9@jiu1* zk%zbTRn}*nCt~>?IIjjI7A}vf#E47LGnYj^+#)|2tK6MoIXI0eIsdaYfxjy;)4xAq zqYeRYSEG_Mx>a}QcHm|h_~O05f)wjY?*Ry}GDmX8`@B?Z;L(ZG+b2z1W|8{&W$+xA zPD<Nh#GA@<2S(Y-P15;|vC$Mh*jYB!1l@c5IbaBY3wV`T3Ls!S{4Y+7G`VL7Y! zN_GEx8hrP2FSaRb`~yI=%w<@)l8sDKpwy+uoPAgMpn5iO-lCGb)wbAIPO)O1I1}p& zzaxnYEocC_G1sSxl6KHshy^DEDxBlkGOmdh3aZk86rZT?Mr;Mj3{wms4ZHM0n|bOUDg3joe?&6A0mJ$yZ5iQ z<0FUwwyXoXx;dhF!oNTmYD*YIiS_MqK!GCfW1Up6ZsT3e#sLiVM%dUhNHxB!YOH$2 z49>UCd-^4q>L;)<2?#z~AU5n7I-Vd}8y-|oDw@Ikvr~s>@Skj3UUC76v%Wt&Z%(Il z#0emF#cEC*cL!eZrCJ9(JG5_eW9mOU)3mHe95C#Fqr!lfLJJw^K+{&fxFx3~d}fC2 zgd%a{)5D30BLxl|YlB=Kd-C5#8n0ncYW9;Ds+3hYUnaSV1kc#TRAW)CwI*RCcX8kE z%g>5+EYz#*{&ml7p>N3WI^<%e${%2_yeVq;mvm`^Bb#6Rp9)!0Gq;j_xr__IQ;y)y z*PcA6e_H(=*g%csuDY_j%`Bg|&U~5;hKa5Z-41ztPq;`rhv&R^Pq^jiDt$$+-Zj}E zax*a`l_8|`WAk~{Mxb#S>G8SaNv(FUKAO(lc5TF<>rACODt9N7gj4Y2gU{R})FQvV4ajSek?bnNB zjL(UXt^WZ-oDQ!|H3a#x>z?GhO?Nss1ZQfndK{2%+SEo0|@ZfPf6$NFY6;%)UT7E5McT|5xl|ca+dKhGl+i`-qLV0CyG86OJ32Ni_;j#1pWT6ofdpd77TPwAMe%tyE_H}UMk;N zK(o)mb!QeOck|!dgQ^%cxhOW1V5&QyxmOh&mIw*juQ<z>-mCABFxCHa4q26dDX zVEV>zDgTV_;fCijz-Wok(J2&2I2*y4O$4bEzPUr z9LuGAQ$yme1;=EPqf(!dHzkd>2jQ@$q)NCAR?8;6=x3e1cjm1Kaa)-3qIqPZ(CbJn zMxWT5vKjhiF|LaG3kJK-q~V!4)2+MTjwraOgF1=0AZ?NF z0G}v4T8>{H&RY7v7X-MBIS#xQ>B0^Jc*ei0gD#(2Gd*M?F>BJ8D|*9euq4op8g+zseU$qY}kRPfdv1Z>ECiY zTrtT1p|EgFc9{@zWM%JhrG5F?ci`x$Ce7($4j<2rkg>|me?VMGFxfN+tQG)0H6v+q zXO@69NJ}ei1~C)h=3Cs!6i}4ASy$igce~(~$-9k|pQ)lUDWyjK#Mw())1`?`A<)XR zx6Mty)-vp?g3Ggv0^D*!j60Ge{htP9hoZdft4U$pPLfd;y3cGt3u3oY+n0J^TT&?z z=HpQQ=qG$^oz3?q{#`X_>|i>N!;FL>x`Z7xXwGD?xqA=~%nllKXI+*$zNJi857eBb z%KsF>%qzgG=IV?OW6cO9IcVeqIK`3!%WA+u<5O?qA)YHRoxfgArl#b`Z3bAdT6=bT z#1T2pdmVu5ZXN@7c6NF(Ym4LM;S+5&JXg1@^IV$Rm5h97;c3|e{DMBY%LWf4dW<;O1}k|2Bu@E&OV30a`AQt@Kvz?{6bGblN4xm1!_Pv(p?5X|zl3m$)@Nl?(PPEgTUR(%5p@F^_qF?2=nlVY(%FN>J#7 z64Hot?90huG>!Mh9*kqS5o3^}ou@xT?VINg8Sdn^lu4AyIv8@C`TUh&@}B2s-N>9| zDYsONadd3?mMI~}V^NwA_VH2tbJq-ukiW%A+;mLIYA=*-hmbi4LJ9TjMIfH{^(L+5 zQl)Qv$Bje+&iuTQV#Br9+r#5uAxxVRZ@ckpdHL5VS%tTFEcN>3nQ~7=EInVO#LZl) zvz{gTSu!fm!Am=(1+_R5CJ_0xRyyXy zG0r}=G{!2NCBEWOMegnbaZcKg<&oWqlejs5eWm@2)wrg}FRWK(sd2(XXBziu9m+@+ zh`;x{Q)`CAmBqigLH{k0U(WAz4CKT_n=0la7ZZE0n;7CfrdS7@j-&X2DdUmAGRLUL zDBbAC&HQQxw__Y{d&~i?goQ>U{r8&X6}N2q`syy90>@)9qyx8?Nj=Sg0iifqW>pyR z0T1_hCiD+=46mcu4UfH;z&-3VyH9MUd<{Kz@-5N(BT;?#%yeK$k0Be_h+uRxD_9aG zWJ8|Q46$rM~3sqZAk)t1}$&B=TiVd%<5)l3Th4tadV8vVY z`^Cx07-rvDp6QY#aoq2JjGY&XaUvIRFZ*Yh`s-enXV%hIBP`GCNRkBa_op6eZnH4* zFK{;XF59njbp%ysU8kmSVG6*o#N^E$-pH#gNYMk76O|CRyfgGNIRHiQ=$z_KoJI z#@oV>ZYfxgS0t});-!!Yh(o8hhP|MKRLH;Y$a#q8#VEoT%xJ-jix@+v_kg{ig;d}o zPP1UBSI_{KC@GQ`^!L{w*fB4{TNyovaC3;TkApCRWdl?&=;IM8TmexkPzz$bEi7q? zfT&j?v`JwY^trHZR!B?;hQ3@t)i;=lI<%Z5_gS)Bz}O?+dbxnLZ?O03&}Nn>Q<4|Y zAiVep5={E8ICVb71XNzi97$`?#Li)nABDGZn1uW!HzTO}lTbu-gS8pBXTTo^u>dy< zC)aoI^0vEy8||IJrxh503sV%`nwRF_l5k$oF>#3$#hIT_sP&rRxM%HAMeRk}MQUm@ za>E@=VDEx(Re#qrs5=iDz?-sa&8(~j{T4)b8t*Vzqr>YGC=NT0*7Slb!mMPSn~&Guczq zCbg9e#lvp8Q#;9|G!k^X+m|-da+h|a9O;g`dPGMrVsa~ywIN(WHk>o0QVpfQ0}>pO zkvk2M5*Ay-%U?^a1J|~_cJ+w+G@43$44(XVc9^-wqm6jnyv}jE4_`1xo)G zl@ikm6{wg9seXSmgWc(?%N1uIH)M}dm|LNIKYd2Z zdfmmrDmlZhVOUm~Lwj#5{L-(*a&7RmJXna>uGOw#lT2gt~fP zP?PSzH57hN6=ZU*=EZA;Ih|)%zPa6O2#)-)lM>g|5a^;ml*4m=U;e>|Y{}dE1m{*m z+zmNPvCNC_aS<6}SA~>+sJk=@E{G4Dyf&x@0!wVtqnpK54h6GtvBrYwTIxkTrMv4e zuuSnNto@fBLgumvUUt%LFIiB30~?InOIV4o$TJV;mq?7!R!Jdq7=fmUFmu=;K3*w$ zn-KIlF4lqn5-sEwGw>tq5Q4{r(WU@>eh-WL9)(cA5;KGvJ1`&ijufv2qfH;``2fp< zmB9QKJMdRda#$DaUGgpeDjy^bCvXz>jtb8Yv&|Xm`Ler?0BbQ|Net428+Zddq{E{E zGwJ*Pz&B2DSe@J$|k`HQM@_p|w_iHCr;%TQCE|ZJ6e?as#T=sTo1t|Y* z$s$B?X(JI(ix*aElAGEnu`v-?Z^$=s#SUzq;9hRC z>H2PzwNB9<9~l3$gHOS*?4jE`mwZK2^2ADen)eT&p%f^IBtuHx*>It^YH^{tKxhcr z)OH_gCw-H*+26N+cnB41(NL_|;wTzbn5l3E|i9#oP;xCz)r!=b9Jsp9u(^pICpf`+RoW z9v$;Rnon$vNx}9alE3haAcJ0C{xu#Z5 zd8zSM-J2Eni1JUu5za@SB968SBkt`fi1OZ?Ia{E7&Q_GsRN_cx^`x{6MbEDbst$hrLQ^SIE9$~X z9Wlr44_WjBNS-l;3Rx=kUwm7ah+$0rDxsF45p2G3aU)>BekBL^OFmu13KABJiDe-0K|S$QmIHyRc_9tEpE6o;M> z7lMTz_yh*V;8dVVkwaf#VmbRm2_aY*fwC~jJv?4?DHiApY^-uTih6%2Ipog00*iWx z*B3|x4C%}OU~28rP$?18T0KSk~fSekKDL8!)hy~%M{zZp0oOr*aBdjj;!AY)7hlSs%J3ecnm;zfqV04#)G~0-|R-M50Nt-v*?!?{;~s z$(^rd{M{}5t)KY*t)2tmJ_`)n2<~*CBJVc&jU1Q)p!IVuAXDKQvVBDDJ_M|+bfDA{ ztxy;5>%0uL10PotwsxU~pN1X5J#TSa8st$P*JWg@VEKiA?nrf%7-0H*Qm3Y1VbHns zh>k;4>^DkPBwG&{&P25qZic@(rXIbfBYdxS+;$$W;I_w*D9lahqcSRSs_t-Oo+;ek zBC@vo?(4_A)s_#|mxEWOFAZIdiKw2|iHEvF6-Vec-Fbfv*o&r6?9upD|oXXF=`W&_zH-(kQYPvX(f(})(Wro(l`tH?C zHTErXiRpI3YOOt%EXg~(1Z=Lq!)aD|r=adpjU- z2%}P7*&s-eQlqPWV(dG|dwK4`k&yN=fu0?HxT{M+(rwyCFHt5RZg*R`0XkUZPk+Wz zIR1Vfs(0rbOXC5&(1 z{0lgwb!aF0GJj7g!G=QC5CzyOp6Ud`apIaL%j{A#S0;QC~JwSzKkdy z2`KP{vSmgQ`AbX6V?cw@uqgbYSlHZQBrwQF#OG*Cyuc_|^C#$mEU>6gw6u))kQ{o8 z4)j1VL>LSfg@?z0F7*_OhmCdTGK8#Q1ipS!8fGz0w8!*johzYL5H;GrlgQ*=@% z@}d7`5D@l!+6?Dibe+RE0wTf>>Zsy5G^m7tM1d-WChF_?FZ+4) zu48#+)#ZXWD?u~2NEeUL#D+djC-3R`?Er|rX2tmYR#xqLP-AMH=%SnSzDvCAc*2J# z9_iJyGY-41E*DjV^WqgAz2ezM`zA-fT`Ven=9^RFzc))#Snj$0U36L0wQ9`H=uy8x z+95=*BeVppmfw5qez(^b+LF-D6gLvYpXQ|ca+a{#;25JSp3=MFKkjn7lDd9bcA!lx zq5u6HexmR7bDv`SXV*bAvCzU3!UnJ0w5kdf+9tm+`<~voFC@rf0#$DHSmMetGh}BG ztIV76<$(cP+sO&r?OL<#?mV93Ze2fZ1>chBQPf!gXwMM3bT*hD|HWO1>58L?>XMN7 zCBn7u=yf~gu#KqE?M?m+X!5De6~45se3kC@?vu#X7uM}KV?p9a@HMq*B@SmZ_n+}X@v@!lsqOY(cWWs9rwx(9g8WBwtX9>&8eKpnOMtTaB>qK zwF&Ubn@ly8H60o^H~pR6I9_4qicM^C(KES*OZN2D2x%t{!F5f__YJj0E)Ex~`x6iP9lahpAb#|x(@-kUHj$`E+g<5P#B|qXL@($`(VbOe(Ck=MUdgGFMUL|$) ze+FlXJn8BG0FFGBHACZL1V>oa^E!4Zu(dY(#*_A0z&FHocs28yh}B{j2Ef|IE% zmHOAfr>qpf^~AxauI{Ep%|ZBNpejUou2}6)0-h-=A(Gx=m}MaPWdojRN?U!0C9y-E zK0r)km^HwXxFJvR5fqqay&Zg3gRmrih?Q!$3KibTQ;Vkrh-6H&ZCH{hfD!m;^w_X&bVv*uf&-2IA*>sdJ{AvZ5g4V24RJw7SfJ5Ut^H1NL!+mIy}*O; zVj$ws=$T7ZA&CI46Z| zFN(t9C->#tr#d~EH0$F))^lzFZ-X^B15gwX1hJ;Bou|LRH)X%Dtx<`^?w3@^co>Ke34!Zl#LC)i!7ariY+*8LD_pMEFJF{{> z+|&J@kS4Gl74Oj_qq$MgqaPwxY~7F&Bc@DC`zSl_J>AoM+Ly5kIA<{m`;iF>zLaeF z;&Vzb7p)8WFE)$|wU zX-&j$-LMa28`Qf*qp8QH17X>R5jZQd<3o8HY!7$&c$r$tyjXHFV=W7^;^GiOeYuWVe56GIk0og_Ey>15j|n2_D4_3)36?Cl(wzV?jL8 z9t;jy@Q=}Plsr1eFLN5f^{VvO(_iR*2Nw+Q6^-8i2H@6c*mjUBg9~!z%7@j1Q_nS& zI>=SJ^;B4i%z5d}`9SgT-3pqv9Z9O-Jdg0f@5&j=pmuM{B)22yTKzxuzW&c8+$6bV z&Iu`bed+02f}*P=2Yd@V0B4QxBh#I+Jt{RlF2dQeRr6Lqx6i(3GIC!qqh}&+9%~^E zjMn$7s^@6R&1xD?W`g&*lojf#KOyIh^UvHplnFgN)a>{7iQL=g`EGwS>Q+Y1Mbi%y zM=QW9&n4W9_AB3I&ux|vmiS&YS%uGRRGiPA76^FHH%}yK3mKaCImWn8vs)rhzi7+! zRDXAlk_o3W{F=g`q*X~TBalg6_7pJ`O-zt7j_Mj+M{jH&3&4G|)-mwZ>kl8L@LP8u zufsjb?u0b+<0x%T?IDwPskVS!_ZcX2mGd6iN{Sw*oX6vXg0E@Ij5KFF^@w+m6q z5)90Pd~97GvebRFeaFIPCJV)EH)V=mNs1X<5L{gk_hg^ZU7}tTw|G{y_#Z@eY=0NDu`FuxiIjm@~Z?JP3GunOT*W{*diy&w7shKp;!u@ zRfD3Bf0DKn-;L3Wb%Pz6kO_~Y2<&%3-`qPHLnbnpX&x*QM^1QkVR*`U_tt6C$eDWI zinyEF|JN7FfMU;x*L2!^zIh3k**gOC0Mmc0xfHL3H4*WyjLU;-u@3S*20-1}D@obM z+5D%rj`90?ZOQp9!8i_QDqQ3B2rAKehmh{~sSiKSZxH{QzqdSEd=J;B@rF*Vf?#TV zO#IM)BBf4vMC5NW%x+}+=|o#CU4?;5OF4l)Q+?3~{_s8tAc1QmM|He^rP~Bsv(oTr2?9?OO^!=%|VH{wcN3 z3IHc4q5vd|ZYo!S%9n}w_un|r3~s*;`t&@DWQG3%b?O)RC!g)LtqBcUGArJ3rzF`q zi>>@DK>hyQCe?`uUZ^nZ=e^6YL2{J&kH;7yx!M{i_886Th6yD)k1D&Y)`9Z`YL=t& z|3mVpszN1lvK4lrzuq(flue7kN*=(49SYuXB%g6bCuCUbWNX!Yx!O9Ie{e7aMvt6G zg&zrv47m-9gbfW}p0|+~UB8YZ(`D))6U5n#OQsSsETn%!tab{Z%zvVa_a)%r=qGet zvPGdR3@Ebykk05t#}ZN#jZI4=H+g_xBp$Z6WkNw$bfB-C%4>n;CIH(dEBW8W zI@Dfy1uZJ9)B7n%YcUZX!8N^tfb?FO4-)#6+RF42MJC=7#UZRYmg6c};zhRi_w?O0 zZQ!`NbXuaH&WpDdMfA=zZH8E2`ys>r(mtW_n^Iu}Br|+UuU-tyo?sME>46wa^#l#?3FH?roFv zYty3i&!Wb;=-8Z&MDn+ZBs(8G|Kb$&(RG-+Y_;!day{)$BFiv}@fN_ohByC6!Px*F zY&%~?x|RXfrPU}OqbBuBxFm?rv~(_Ogr7+|Qk?(387SFfaB@A8SkmR(gFh_5yD@Na zfBt&Jea@qr{lliJZGH*+xJWfNa!hLaS?gDQF@F+nd~qejg**jp@tJ1%KPT>T zt$zKIQ&(>HM6=^z%=9w_-pnLsCPbOeBZ7$7Yq}v#oLyc;Ou{gYM?$7q_}+P$F;z1K z_$}GFZ<6O%awp0=HS1GoK2e^iUhgF(PGmEGz|6L~V$HHTdc#gUV;I-(x7@3b zt15J#;J(8Oa$eYk<2pDCfe@F@BU-Ujo8rzDWi7QAH*6gu;FM}&Ei`0}0;@#1KVJ~F2l z;M`luo@BoHwFpZ!RS7uQjL$iH;vn@yF4vpP!y4KB7bI!A<1ok4Eix9qN5!t^2tTeiO zHEEVbPuN5p(v679&9vk;t1;OdIQDe2IKvA5ij-K&)mFul&g1InoCaOjeY3u#B5h6) zHzlI@AWP<@HGU>>8l5}TZpY!fFjKPAxan*>R-@YBm+CkyS7ules$UHwGfc=2_2n_X z;=AytOF1rP65ipQ{E=~?rxD{(_xVe4RnB|U110efwRRSN-b{8QbsOY;MF!%}-zBj7 zE;1;0p0So5y_MYNg`;L%OlG~m2s*k==)N-#JEUk1VUv;9GS~f6(Do*EVY;Zta z4G)8e_mMg%dIXN~9zFdzFS3Aj`J6ro8|x0=!M7sa(D6c*K@q$*}!td1k2k*h&Z)%EqFU@6sGAFiv7qBk}jwVS1ILn1Sk0vuy=rNjolEtR|9+uR`p#+VB)effwX4|lyx9PGY*Tf%W2M$(+REA3dUbAiHcPWp zyx1(LCjP+?cPBdJX07-4*8b7}-&#}w_P%_Nl=Xr#YS^$Of1hdb$R>;ub&cbZUu)e% z6j@)A?lJf6y*}C6#KLvVT(#K3jDxvk^-V|m1Z_Rvdd5A4x#mZ;ebF?HhCT`(3eP1n zw)WWvv~TvERw8Cg1OvBQ4E|<>#k4?dWMuIedRU$ z8;Rx)Z~M8sW=4`sBdT+GT8&%?RfVC<*1jtsg(xvCrm0I@Y|T-)`o_v*d)ay{TFP#Y z@nW$s;@T}jbZ?o|_PWKcm|}8vY}oLm#5^QMduN7!hm_dT%igTY-RSm}*9UL*9mKi# zT7SVoNpdTH40E;Ja>nUk;_+Ix!kp&&CJr^<9ruf>MoHa#C!aZS^WP@!8x4kY$Njk4 zvlU&%l{jVEm3d{ARvxSxt~dj=g9OMgX;eHtDL3mz!Ur8_cBloO@{t;<*>7ENw}$($Zfz;Rwps;y)T~5y%K8qn309BU}ooP44FPO z#87%+AUp7MXI@PsR-h6BEyluAMsGI&)6heUaq#-+EhaD#*hIYS80|55$pYwR>M%W0 zNCGy(9o@_frbkg-#;1(gKI8x6IkcDnuaEII!byto!4nG|JOmSlSvXAZ2}I`}!V<$Q zJ?@ld{RYym#Jc5^dZ319mzxu*&%xx|Z_B!6o}jEqS81YjorJA9(p8)kBVpAOcgkaz z2TtK<^6CH1I&Gey+FhK=mZ<-nzS1RQcQ4VaV$)detMo?CLZN7nr!LXq?vr0y{>)w( z=@v+1?t9O$F{OX|zv6|C z;p53+N{{=$5`>OD#QTIPy^fbWf}Zsr#zG7Ej*B=(&+=RQJ9&sy$_j+B&_itT5DXYu zAutw3$o30#Y|R%?t(YiQCWx)#-;JAiX@P)OFQH?^c-Yv|asjV2lp2y#l;GmR4!s1~ z4=;b1e&*>U$qpUAqSSxCZq;!wQna|X6pc<8>2`cpEFH8{ zXlUS|SsHmPU*GU@XKg!Sp?%zU>7bNWUBO8Fm$q)1Raqm$M>Rc$NZOiH)P=lmCijZF z@5NkxxOe%-(#1Txs^Qegoi{q`cILWZv`)on)%EnyHa08x2~84q;!2f>X_(KJ>o649Xc#QT*s6`Mf>m3m#_Q z{2m-Qisjq?*33^S6gGj^fA*L;ddV|Ja!}a#uK16;5WduE+>42 z+6G1`R&9R+cfOY^jV<7W;7|Tm2%$0A^WCkvF@bT+;|Df_CMao%Kn2@g#&FN<2>FdM zBu7g*#~@AzMUi>_i8%X8G9u?MR+iPjxaJu^R`?^J2FAI>C&o{M)hSn3+^f&wVZ=MF z*P{Tg&jL%hSeL^RP*(4{Im%6^H|t~C-Soq^mb|7(eZorIbW$Ux^BA?he7O^*sF&hm zYXUnV>gTimanbF}Z!%dRI$19x<`f4;7_7IbOO@sS^2Us9y_Co85I}b}h8a=OH%dTD zqn#RQ`WeE?$5MWk3M7>Z#FbVH8yDfIcO;i3%8~5;vKd8NUCdwAxTCrKzHR-y51btD z3|uLLR^yP{_I0MS6-f008Il9wUoy)umjDia@@$@m1JN^b5tXL2@55&#+}tg1%!j(o zOvN1z4pC;+t1WHkhv{1pFAZ^p83a3?i-dBaO&+c4*zrou&lld!ie zvTK;{!_<1%vwRa>-~Cd;%bNRyv01Zl)vt-{5(Z@ zwr~1I1R8dwD3PaPU$UM|n^E)k5((Ah{~{S4G85!~pQKjh_5^Y9=gEgxTYuqA(N;eP zg{UzX0gYJCMWTVP`KA+3jFAmihkJ$s329vdGCKS2_^S1Cv1w;t&Gm+`Q{vXDBbMo7 z1q$awsSCgK(J+22j)=Zt7LoV0eU~FXw;0{x6!vuW`d!y$Rbozm=7rsm-Tg6PldP&D z-bJ78QYfwd4peoOfHmx&Cg^XnHWlL)7!+v_5Kh3Dguv0;| zI2-UG24pg`76J-I&S-eFXl>ZgOEfHI|0Qh599ke9>>UKlBCk zKuOrUpr|7}JTCM$X6a5=s3$g7t^X1kggVF)uv}r>x?_*gjmQgqbEO9|@b9>FHaRNc+0tKD~ zG4D&vHaqD~2k51$y6Eb2h!}3*P6t(|2g$pZ2JHQ^Up`gn=V~GQ+zgce9IjPBu*=M4 z>vMQQ$&WD|EvGwDVrE$N29T`!29+tf3Up=&eG<$tp8?#@QcX`C$9FLmrgVMcw>?`^ z=ib`s`gDALU4JqI^+{yP?3)Q3+BMGKk8jLvwmFbEl&V)4!#vMewp%wDK$%7U2mfxZ zxX9WWlW;ONoc2)5qO30YTCtcnYG(FDEac1J) zA{q=axnqokIxlTJ8u|D-tcGsif*GH!d)})#y?OWNsue?K>cM;@e~w+k{3w!qo4Cg2 zL;K^QPOPI0x%=0eKU|hcm#C7m8Qz8UE(Khete*yW2qoh#81IQ45+ryn(Z~Ywmg-9b zY+<+yK9;netu~th7aw^Eo9KR={PZd5$2@>fc`Y@|tp{8nnDvNC=dh%qgyxXS7J*M;5myWwlwjlRSM^R0R=tFSF4<_ z{wYKsF>K`tK!Fq}c#;JQK4C>gf5O-{6Z?VtmgVby8>Uax7YrMDDD;IaIuGL`dPZUh z;yXbUQsw)}!PVnC{Hx=Vn+PCXAME4qJyX7MQsso+2<@o!qrgbU9tITg)jwwVx3MBr zBH8+5y#FS0Xte4|yhIQyor8eKaHPNV>4e}b>*$a2%Nu6V{ynzkP33-LKgCn3IxeVb7bA(x^gIFu9ada9 zlGxW=ISgWC?3H)45MI^>?}YyDJYL=L_El|~+}zne(Jfo(*+dkVKA%s67>NoW27G9O z?zc@209!&X!Ca;EcZ6;R!08YLFD>COY8sP7NpcOoOS#H?19;r=V&W+#lqGgr7f*h* zJ_ff^afNed`nhV&M6a(R`)(?yB-@2Y&2+8Jq7JQ1Q}OW)Ri~1q%KU4fysFm4ZOP?E zjhI%$Z=bj2nCzr$gqwLFzRRG6o95;+xz{u@JSyTq;tjC(vuGsvrgyjXASN!h=%6fa zKO`2zg>VW}ca2So(NG6xwnba|n`5bcTyZ?55PX<+#ysuO^?X^ps!VBgO3Pz&r*li! z!mI4aS;HoNy|?<$>MO=S=EgilW}g4Z2BJl%lk5&I_gPp!OcI_C5;rItm)`W3sv2{+ zH`mBm)^_j~`m`Cxi{lTmiTmVD`BYQo$$pldVT5OVKS#Bj?VTvr&0Va&pD5`1w&q7= z-H?6oLfd?TtGbiRm|#LIxT>Fs-0p4&hnj)yRA;<7)`IVY0lig3OM-q2qSZ4Cc@mi)`kh2Uejp4ht-%g z{`UTTX?#3&yHmWnvY*fuIlr6n=Uhp6^ham97r%1Gm{o+&NE_+)8r{ge=KJZfLZ^

oF5%wc?0lVIdiCvTMwKQ}m1M4pzSU2C#ISwFq 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
oHJaZa%&cRgbKqQScY`o5It4F}rqGD>-kDeG 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 diff --git a/libs/deep_translator-1.11.4.dist-info/METADATA b/libs/deep_translator-1.11.4.dist-info/METADATA index 4515e6413..68c3e45c1 100644 --- a/libs/deep_translator-1.11.4.dist-info/METADATA +++ b/libs/deep_translator-1.11.4.dist-info/METADATA @@ -23,6 +23,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Communications Classifier: Topic :: Education Classifier: Topic :: Software Development diff --git a/libs/deep_translator-1.11.4.dist-info/RECORD b/libs/deep_translator-1.11.4.dist-info/RECORD index 0039c60b2..e75e45706 100644 --- a/libs/deep_translator-1.11.4.dist-info/RECORD +++ b/libs/deep_translator-1.11.4.dist-info/RECORD @@ -2,10 +2,10 @@ ../../bin/dt,sha256=U3_p8MJCCWdWmVZnfGHdUuFlTz1aG4rLmb48o7_T49Y,246 deep_translator-1.11.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 deep_translator-1.11.4.dist-info/LICENSE,sha256=UGnCG4PtsPuWXv32Jc-C22mZqVMVb1MAkEVWFIUgTOA,11350 -deep_translator-1.11.4.dist-info/METADATA,sha256=eqaO4nvbDgoE7PcUmKxCx02wC7zfOS_Y9BQIa7iLFjg,30471 +deep_translator-1.11.4.dist-info/METADATA,sha256=ef-qfaz9mwg_50OH2ZvZGl5ONHip_EgiVMNFh1Uyfx8,30522 deep_translator-1.11.4.dist-info/RECORD,, deep_translator-1.11.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -deep_translator-1.11.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 +deep_translator-1.11.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 deep_translator-1.11.4.dist-info/entry_points.txt,sha256=qQAStn9mriwaW7GNz-W_55eFUrym6XwBHSyf3oXv_lQ,98 deep_translator/__init__.py,sha256=3zy0Ux3TVne-Al8QdCr_mtDtGHQiQCwpvxk6qsnPmi0,1238 deep_translator/__main__.py,sha256=MkNnzbdqvk5qx_rgErLMjhe1Gp3Rsvl8At66JnQ8CZk,161 diff --git a/libs/deep_translator-1.11.4.dist-info/WHEEL b/libs/deep_translator-1.11.4.dist-info/WHEEL index d73ccaae8..8b9b3a1bf 100644 --- a/libs/deep_translator-1.11.4.dist-info/WHEEL +++ b/libs/deep_translator-1.11.4.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 +Generator: poetry-core 1.9.1 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/dnspython-2.6.1.dist-info/METADATA b/libs/dnspython-2.6.1.dist-info/METADATA index 129184e39..596853b3a 100644 --- a/libs/dnspython-2.6.1.dist-info/METADATA +++ b/libs/dnspython-2.6.1.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: dnspython Version: 2.6.1 Summary: DNS toolkit diff --git a/libs/dnspython-2.6.1.dist-info/RECORD b/libs/dnspython-2.6.1.dist-info/RECORD index eae42c5b0..00515e496 100644 --- a/libs/dnspython-2.6.1.dist-info/RECORD +++ b/libs/dnspython-2.6.1.dist-info/RECORD @@ -142,8 +142,8 @@ dns/zone.py,sha256=lLAarSxPtpx4Sw29OQ0ifPshD4QauGu8RnPh2dEropA,52086 dns/zonefile.py,sha256=9pgkO0pV8Js53Oq9ZKOSbpFkGS5r_orU-25tmufGP9M,27929 dns/zonetypes.py,sha256=HrQNZxZ_gWLWI9dskix71msi9wkYK5pgrBBbPb1T74Y,690 dnspython-2.6.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -dnspython-2.6.1.dist-info/METADATA,sha256=2GJFv-NqkwIytog5VQe0wPtZKoS016uyYfG76lqftto,5808 +dnspython-2.6.1.dist-info/METADATA,sha256=93MjwRdAibIDnxyA4eYzHKDKbG1sUWeke-xJPhPeaUo,5808 dnspython-2.6.1.dist-info/RECORD,, dnspython-2.6.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -dnspython-2.6.1.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 +dnspython-2.6.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 dnspython-2.6.1.dist-info/licenses/LICENSE,sha256=w-o_9WVLMpwZ07xfdIGvYjw93tSmFFWFSZ-EOtPXQc0,1526 diff --git a/libs/dnspython-2.6.1.dist-info/WHEEL b/libs/dnspython-2.6.1.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/dnspython-2.6.1.dist-info/WHEEL +++ b/libs/dnspython-2.6.1.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/dogpile.cache-1.3.2.dist-info/WHEEL b/libs/dogpile.cache-1.3.2.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/dogpile.cache-1.3.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/charset_normalizer-3.3.2.dist-info/INSTALLER b/libs/dogpile.cache-1.3.3.dist-info/INSTALLER similarity index 100% rename from libs/charset_normalizer-3.3.2.dist-info/INSTALLER rename to libs/dogpile.cache-1.3.3.dist-info/INSTALLER diff --git a/libs/dogpile.cache-1.3.2.dist-info/LICENSE b/libs/dogpile.cache-1.3.3.dist-info/LICENSE similarity index 100% rename from libs/dogpile.cache-1.3.2.dist-info/LICENSE rename to libs/dogpile.cache-1.3.3.dist-info/LICENSE diff --git a/libs/dogpile.cache-1.3.2.dist-info/METADATA b/libs/dogpile.cache-1.3.3.dist-info/METADATA similarity index 99% rename from libs/dogpile.cache-1.3.2.dist-info/METADATA rename to libs/dogpile.cache-1.3.3.dist-info/METADATA index 5aea9da52..e466816f2 100644 --- a/libs/dogpile.cache-1.3.2.dist-info/METADATA +++ b/libs/dogpile.cache-1.3.3.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: dogpile.cache -Version: 1.3.2 +Version: 1.3.3 Summary: A caching front-end based on the Dogpile lock. Author-email: Mike Bayer License: MIT diff --git a/libs/dogpile.cache-1.3.2.dist-info/RECORD b/libs/dogpile.cache-1.3.3.dist-info/RECORD similarity index 70% rename from libs/dogpile.cache-1.3.2.dist-info/RECORD rename to libs/dogpile.cache-1.3.3.dist-info/RECORD index 473894070..e287ce20e 100644 --- a/libs/dogpile.cache-1.3.2.dist-info/RECORD +++ b/libs/dogpile.cache-1.3.3.dist-info/RECORD @@ -1,17 +1,17 @@ -dogpile.cache-1.3.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -dogpile.cache-1.3.2.dist-info/LICENSE,sha256=6mI3atkmgsiipPJp3i526pyP_NVuNSKAGA7jbB1dAyo,1059 -dogpile.cache-1.3.2.dist-info/METADATA,sha256=MAITj98iAYY1j6LaAIQTuigPu74tsEe5ayETsbLUPlg,5184 -dogpile.cache-1.3.2.dist-info/RECORD,, -dogpile.cache-1.3.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -dogpile.cache-1.3.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -dogpile.cache-1.3.2.dist-info/entry_points.txt,sha256=9_62qgwpYf1Kp06LazdG2FNgaJQiUTUGBn-Fl0URfq4,73 -dogpile.cache-1.3.2.dist-info/top_level.txt,sha256=XGYQHt1p8HLN4sRU6sGpQBA2GMTZQbPwHX5A1PUENgk,8 -dogpile/__init__.py,sha256=YmBy0wZDJOrEnW9iRt4frDuPUhJxlDp6WSZC2l7g-7s,106 +dogpile.cache-1.3.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +dogpile.cache-1.3.3.dist-info/LICENSE,sha256=6mI3atkmgsiipPJp3i526pyP_NVuNSKAGA7jbB1dAyo,1059 +dogpile.cache-1.3.3.dist-info/METADATA,sha256=rOv9RsQapDoS1HDFLhiqFoNI_lq6JOvLbk07E2E1ZBg,5184 +dogpile.cache-1.3.3.dist-info/RECORD,, +dogpile.cache-1.3.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +dogpile.cache-1.3.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +dogpile.cache-1.3.3.dist-info/entry_points.txt,sha256=9_62qgwpYf1Kp06LazdG2FNgaJQiUTUGBn-Fl0URfq4,73 +dogpile.cache-1.3.3.dist-info/top_level.txt,sha256=XGYQHt1p8HLN4sRU6sGpQBA2GMTZQbPwHX5A1PUENgk,8 +dogpile/__init__.py,sha256=rSfQtRaK-ePncI3Mo3wyrfmLXYjBNGWLdFSVupCxR-w,106 dogpile/cache/__init__.py,sha256=QSxZd91vI3BTBDcT7BVt1_qUio5g4rVADVcJMeIuLoQ,180 -dogpile/cache/api.py,sha256=Kaz1ktKZEDEa44QkIbnmsFGe5RKBDTpuF_nUQguC3AE,17864 +dogpile/cache/api.py,sha256=EZBQ96IS79Xp8e1ERi9x6E3BHOq9bZR5cPINMnisUqI,18029 dogpile/cache/backends/__init__.py,sha256=bqQudgYKfg1n-wvYn3Sr0mlOX5Wbsifmn1WHUTGfu8s,1315 dogpile/cache/backends/file.py,sha256=8ZNqQOOec-1MhPB7Z6IoH6ra47P-JdQNO9nN351WYNc,13710 -dogpile/cache/backends/memcached.py,sha256=jOXU-lIGIS3M59Va8n-yhwr5v1w4XZjnv2X_IqDx0t8,20887 +dogpile/cache/backends/memcached.py,sha256=eVtjiOmeuKAgg46EGf0qaMu5L6n7-EgztL1ZhEHKrSo,21552 dogpile/cache/backends/memory.py,sha256=7Wo_yT0bdym9TonXxmhVt1Uvl_M_-GGMmMAwNWQ5YMo,3030 dogpile/cache/backends/null.py,sha256=DzZXHt64alfYuYP_Ei322I2D-mZMpT-Y_zzLF1pXd74,1167 dogpile/cache/backends/redis.py,sha256=bpEGn0rOmG-Nw7I4gLwKgh8B4W84V59PxDM2MW8hjh0,19744 @@ -19,7 +19,7 @@ dogpile/cache/exception.py,sha256=8XDELddxVqj0fthUYpPaX85QfEQqdsP23e_7bQFC0Us,60 dogpile/cache/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 dogpile/cache/plugins/mako_cache.py,sha256=SRG6Pr_wHji_jGE07bLbj-IldbUo_BYyccNNhXM7X6c,2964 dogpile/cache/proxy.py,sha256=nUhu_HAaWtaPE_oPY4kcALVvROi541JTxwxFRyzK9Us,3667 -dogpile/cache/region.py,sha256=pSYinh9s9K8u9qaxyvYYVKtC98I1oyBMtVUF1lZD6wI,69882 +dogpile/cache/region.py,sha256=vLoQXJKCUwqPB6hnmqRSpea8AoxO3vYLm73IK_yVnDo,69988 dogpile/cache/util.py,sha256=KWrykvRkWK1YE0YRKUFtZnKI75TP_3XBJEoKQHjaFZ4,5416 dogpile/core.py,sha256=2ojPK5ASUk9QQFH4pUQObQSwqhAKoocRlhlo4jskFGY,565 dogpile/lock.py,sha256=zXMtrnUBTGkTgsWYAmENCtT_Zifgrnz62t7Iwe9_qUA,7077 diff --git a/libs/charset_normalizer-3.3.2.dist-info/REQUESTED b/libs/dogpile.cache-1.3.3.dist-info/REQUESTED similarity index 100% rename from libs/charset_normalizer-3.3.2.dist-info/REQUESTED rename to libs/dogpile.cache-1.3.3.dist-info/REQUESTED diff --git a/libs/dogpile.cache-1.3.3.dist-info/WHEEL b/libs/dogpile.cache-1.3.3.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/dogpile.cache-1.3.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/dogpile.cache-1.3.2.dist-info/entry_points.txt b/libs/dogpile.cache-1.3.3.dist-info/entry_points.txt similarity index 100% rename from libs/dogpile.cache-1.3.2.dist-info/entry_points.txt rename to libs/dogpile.cache-1.3.3.dist-info/entry_points.txt diff --git a/libs/dogpile.cache-1.3.2.dist-info/top_level.txt b/libs/dogpile.cache-1.3.3.dist-info/top_level.txt similarity index 100% rename from libs/dogpile.cache-1.3.2.dist-info/top_level.txt rename to libs/dogpile.cache-1.3.3.dist-info/top_level.txt diff --git a/libs/dogpile/__init__.py b/libs/dogpile/__init__.py index 3b095b02a..4168f8935 100644 --- a/libs/dogpile/__init__.py +++ b/libs/dogpile/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.3.2" +__version__ = "1.3.3" from .lock import Lock # noqa from .lock import NeedRegenerationException # noqa diff --git a/libs/dogpile/cache/api.py b/libs/dogpile/cache/api.py index 394a09340..6fbe84279 100644 --- a/libs/dogpile/cache/api.py +++ b/libs/dogpile/cache/api.py @@ -1,11 +1,13 @@ from __future__ import annotations import abc +import enum import pickle import time from typing import Any from typing import Callable from typing import cast +from typing import Literal from typing import Mapping from typing import NamedTuple from typing import Optional @@ -15,7 +17,7 @@ from ..util.typing import Self -class NoValue: +class NoValue(enum.Enum): """Describe a missing cache value. The :data:`.NO_VALUE` constant should be used. @@ -33,12 +35,16 @@ def __repr__(self): """ return "" - def __bool__(self): # pragma NO COVERAGE + def __bool__(self) -> Literal[False]: # pragma NO COVERAGE return False + NO_VALUE = "NoValue" -NO_VALUE = NoValue() -"""Value returned from ``get()`` that describes + +NoValueType = Literal[NoValue.NO_VALUE] + +NO_VALUE = NoValue.NO_VALUE +"""Value returned from :meth:`.CacheRegion.get` that describes a key not present.""" MetaDataType = Mapping[str, Any] @@ -160,13 +166,13 @@ def age(self) -> float: return time.time() - self.cached_time -CacheReturnType = Union[CachedValue, NoValue] +CacheReturnType = Union[CachedValue, NoValueType] """The non-serialized form of what may be returned from a backend get method. """ -SerializedReturnType = Union[bytes, NoValue] +SerializedReturnType = Union[bytes, NoValueType] """the serialized form of what may be returned from a backend get method.""" BackendFormatted = Union[CacheReturnType, SerializedReturnType] diff --git a/libs/dogpile/cache/backends/memcached.py b/libs/dogpile/cache/backends/memcached.py index 1bad85664..eee344838 100644 --- a/libs/dogpile/cache/backends/memcached.py +++ b/libs/dogpile/cache/backends/memcached.py @@ -95,26 +95,6 @@ class GenericMemcachedBackend(CacheBackend): .. versionadded:: 0.5.7 - :param memcached_expire_time: integer, when present will - be passed as the ``time`` parameter to ``pylibmc.Client.set``. - This is used to set the memcached expiry time for a value. - - .. note:: - - This parameter is **different** from Dogpile's own - ``expiration_time``, which is the number of seconds after - which Dogpile will consider the value to be expired. - When Dogpile considers a value to be expired, - it **continues to use the value** until generation - of a new value is complete, when using - :meth:`.CacheRegion.get_or_create`. - Therefore, if you are setting ``memcached_expire_time``, you'll - want to make sure it is greater than ``expiration_time`` - by at least enough seconds for new values to be generated, - else the value won't be available during a regeneration, - forcing all threads to wait for a regeneration each time - a value expires. - The :class:`.GenericMemachedBackend` uses a ``threading.local()`` object to store individual client objects per thread, as most modern memcached clients do not appear to be inherently @@ -147,7 +127,6 @@ def __init__(self, arguments): self.url = util.to_list(arguments["url"]) self.distributed_lock = arguments.get("distributed_lock", False) self.lock_timeout = arguments.get("lock_timeout", 0) - self.memcached_expire_time = arguments.get("memcached_expire_time", 0) def has_lock_timeout(self): return self.lock_timeout != 0 @@ -222,6 +201,29 @@ def delete_multi(self, keys): class MemcacheArgs(GenericMemcachedBackend): """Mixin which provides support for the 'time' argument to set(), 'min_compress_len' to other methods. + + :param memcached_expire_time: integer, when present will + be passed as the ``time`` parameter to the ``set`` method. + This is used to set the memcached expiry time for a value. + + .. note:: + + This parameter is **different** from Dogpile's own + ``expiration_time``, which is the number of seconds after + which Dogpile will consider the value to be expired. + When Dogpile considers a value to be expired, + it **continues to use the value** until generation + of a new value is complete, when using + :meth:`.CacheRegion.get_or_create`. + Therefore, if you are setting ``memcached_expire_time``, you'll + want to make sure it is greater than ``expiration_time`` + by at least enough seconds for new values to be generated, + else the value won't be available during a regeneration, + forcing all threads to wait for a regeneration each time + a value expires. + + :param min_compress_len: Threshold length to kick in auto-compression + of the value using the compressor """ def __init__(self, arguments): @@ -408,25 +410,8 @@ def _imports(self): global bmemcached import bmemcached - class RepairBMemcachedAPI(bmemcached.Client): - """Repairs BMemcached's non-standard method - signatures, which was fixed in BMemcached - ef206ed4473fec3b639e. - - """ - - def add(self, key, value, timeout=0): - try: - return super(RepairBMemcachedAPI, self).add( - key, value, timeout - ) - except ValueError: - return False - - self.Client = RepairBMemcachedAPI - def _create_client(self): - return self.Client( + return bmemcached.Client( self.url, username=self.username, password=self.password, @@ -580,6 +565,28 @@ class PyMemcacheBackend(GenericMemcachedBackend): .. versionadded:: 1.1.5 + :param memcached_expire_time: integer, when present will + be passed as the ``time`` parameter to the ``set`` method. + This is used to set the memcached expiry time for a value. + + .. note:: + + This parameter is **different** from Dogpile's own + ``expiration_time``, which is the number of seconds after + which Dogpile will consider the value to be expired. + When Dogpile considers a value to be expired, + it **continues to use the value** until generation + of a new value is complete, when using + :meth:`.CacheRegion.get_or_create`. + Therefore, if you are setting ``memcached_expire_time``, you'll + want to make sure it is greater than ``expiration_time`` + by at least enough seconds for new values to be generated, + else the value won't be available during a regeneration, + forcing all threads to wait for a regeneration each time + a value expires. + + .. versionadded:: 1.3.3 + """ # noqa E501 def __init__(self, arguments): @@ -611,6 +618,9 @@ def __init__(self, arguments): "enable_retry_client is not set; retry options " "will be ignored" ) + self.set_arguments = {} + if "memcached_expire_time" in arguments: + self.set_arguments["expire"] = arguments["memcached_expire_time"] def _imports(self): global pymemcache diff --git a/libs/dogpile/cache/region.py b/libs/dogpile/cache/region.py index 4cd14b642..a446e4c9c 100644 --- a/libs/dogpile/cache/region.py +++ b/libs/dogpile/cache/region.py @@ -32,6 +32,7 @@ from .api import KeyType from .api import MetaDataType from .api import NO_VALUE +from .api import NoValueType from .api import SerializedReturnType from .api import Serializer from .api import ValuePayload @@ -706,19 +707,20 @@ def get( key: KeyType, expiration_time: Optional[float] = None, ignore_expiration: bool = False, - ) -> CacheReturnType: + ) -> Union[ValuePayload, NoValueType]: """Return a value from the cache, based on the given key. If the value is not present, the method returns the token - ``NO_VALUE``. ``NO_VALUE`` evaluates to False, but is separate from - ``None`` to distinguish between a cached value of ``None``. + :data:`.api.NO_VALUE`. :data:`.api.NO_VALUE` evaluates to False, but is + separate from ``None`` to distinguish between a cached value of + ``None``. By default, the configured expiration time of the :class:`.CacheRegion`, or alternatively the expiration time supplied by the ``expiration_time`` argument, is tested against the creation time of the retrieved value versus the current time (as reported by ``time.time()``). - If stale, the cached value is ignored and the ``NO_VALUE`` + If stale, the cached value is ignored and the :data:`.api.NO_VALUE` token is returned. Passing the flag ``ignore_expiration=True`` bypasses the expiration time check. @@ -731,7 +733,7 @@ def get( of the current "invalidation" time as set by the :meth:`.invalidate` method. If a value is present, but its creation time is older than the current - invalidation time, the ``NO_VALUE`` token is returned. + invalidation time, the :data:`.api.NO_VALUE` token is returned. Passing the flag ``ignore_expiration=True`` bypasses the invalidation time check. @@ -1083,7 +1085,7 @@ def go(): return creator(*ca[0], **ca[1]) else: - go = creator + go = creator # type: ignore return acr(self, orig_key, go, mutex) else: diff --git a/libs/dogpile.cache-1.3.2.dist-info/INSTALLER b/libs/dynaconf-3.2.6.dist-info/INSTALLER similarity index 100% rename from libs/dogpile.cache-1.3.2.dist-info/INSTALLER rename to libs/dynaconf-3.2.6.dist-info/INSTALLER diff --git a/libs/dynaconf-3.2.4.dist-info/LICENSE b/libs/dynaconf-3.2.6.dist-info/LICENSE similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/LICENSE rename to libs/dynaconf-3.2.6.dist-info/LICENSE diff --git a/libs/dynaconf-3.2.4.dist-info/METADATA b/libs/dynaconf-3.2.6.dist-info/METADATA similarity index 97% rename from libs/dynaconf-3.2.4.dist-info/METADATA rename to libs/dynaconf-3.2.6.dist-info/METADATA index 98b2c2408..bf4e9f796 100644 --- a/libs/dynaconf-3.2.4.dist-info/METADATA +++ b/libs/dynaconf-3.2.6.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: dynaconf -Version: 3.2.4 +Version: 3.2.6 Summary: The dynamic configurator for your Python Project Home-page: https://github.com/dynaconf/dynaconf Author: Bruno Rocha @@ -51,11 +51,6 @@ Requires-Dist: pytest ; extra == 'test' Requires-Dist: pytest-cov ; extra == 'test' Requires-Dist: pytest-xdist ; extra == 'test' Requires-Dist: pytest-mock ; extra == 'test' -Requires-Dist: flake8 ; extra == 'test' -Requires-Dist: pep8-naming ; extra == 'test' -Requires-Dist: flake8-debugger ; extra == 'test' -Requires-Dist: flake8-print ; extra == 'test' -Requires-Dist: flake8-todo ; extra == 'test' Requires-Dist: radon ; extra == 'test' Requires-Dist: flask >=0.12 ; extra == 'test' Requires-Dist: django ; extra == 'test' diff --git a/libs/dynaconf-3.2.4.dist-info/RECORD b/libs/dynaconf-3.2.6.dist-info/RECORD similarity index 72% rename from libs/dynaconf-3.2.4.dist-info/RECORD rename to libs/dynaconf-3.2.6.dist-info/RECORD index 07e614acb..eb96de575 100644 --- a/libs/dynaconf-3.2.4.dist-info/RECORD +++ b/libs/dynaconf-3.2.6.dist-info/RECORD @@ -1,51 +1,51 @@ ../../bin/dynaconf,sha256=3EDP6hZ2u78FIaQ-Nqua_TvwQyyacEGh8qF8dN1hNfI,234 -dynaconf-3.2.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -dynaconf-3.2.4.dist-info/LICENSE,sha256=VXHf05Hz7uwTdLkQEFy4s7L4cb3mJ6Jc6yvoRPCg65c,1078 -dynaconf-3.2.4.dist-info/METADATA,sha256=86MSjAl4TFTIMXw_vU91bfTizCtJYqk8P5PRIqi3xyI,9308 -dynaconf-3.2.4.dist-info/RECORD,, -dynaconf-3.2.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -dynaconf-3.2.4.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 -dynaconf-3.2.4.dist-info/box-LICENSE.txt,sha256=OA9QtZRAYGpaFevuHWrHckHw0fQT4yhurfH56sJYDqw,1076 -dynaconf-3.2.4.dist-info/click-LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 -dynaconf-3.2.4.dist-info/entry_points.txt,sha256=olhFwb2rJswbRmjY97fTrkNfqPQhMv1Pxjez4mSxMSg,47 -dynaconf-3.2.4.dist-info/licenses.sh,sha256=9eID6RHwv82Obub4D4G--lIbRZya65Fa9EwgYNWXvFU,769 -dynaconf-3.2.4.dist-info/python-dotenv-LICENSE.txt,sha256=0nIJqz0WJ4Ko-OOHK5s1PEngksmqRnpkUiiDQH2NEDA,4600 -dynaconf-3.2.4.dist-info/ruamel.yaml-LICENSE.txt,sha256=QYxdb3JocDuWY6zvk3rVKcVO47J-9miiolkf4w6hH_8,1121 -dynaconf-3.2.4.dist-info/toml-LICENSE.txt,sha256=QitPoBx3Vs5N5go556B0Zf3Mz4YGxWeUiRYa9C1EGMg,1253 -dynaconf-3.2.4.dist-info/tomli-LICENSE.txt,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072 -dynaconf-3.2.4.dist-info/top_level.txt,sha256=y9G5RO-Ts5h0yOx6qVr8r_TBCSFA8wBxEWcvMZJq66c,9 -dynaconf-3.2.4.dist-info/vendor_versions.txt,sha256=QD2pB7JBhr6oIGaPCXFVhhFfs2uQibsJXBT9cUYlgHQ,100 -dynaconf/VERSION,sha256=2je2KyNPwIw6vhMXSljoDaDRxM_F3PQ3jpMX6B1PXD0,6 -dynaconf/__init__.py,sha256=z05mUwi_mk6UlKL4GgROQ6WyHwxVDCrAMlk2VF_Erm4,1285 -dynaconf/base.py,sha256=_IQT270mZ0qMCEWy_MrG_veNizozG7m96-fHz_bmpQo,51288 -dynaconf/cli.py,sha256=WxILwS9rVnGEsmVDrpsXUAkOCU1iey6evUg7_FTCwvU,26266 +dynaconf-3.2.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +dynaconf-3.2.6.dist-info/LICENSE,sha256=VXHf05Hz7uwTdLkQEFy4s7L4cb3mJ6Jc6yvoRPCg65c,1078 +dynaconf-3.2.6.dist-info/METADATA,sha256=ldv1NIqsLYvWG3Zux0X6CkjGkKYesBBAHZKepkZtoSs,9083 +dynaconf-3.2.6.dist-info/RECORD,, +dynaconf-3.2.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +dynaconf-3.2.6.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 +dynaconf-3.2.6.dist-info/box-LICENSE.txt,sha256=OA9QtZRAYGpaFevuHWrHckHw0fQT4yhurfH56sJYDqw,1076 +dynaconf-3.2.6.dist-info/click-LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +dynaconf-3.2.6.dist-info/entry_points.txt,sha256=olhFwb2rJswbRmjY97fTrkNfqPQhMv1Pxjez4mSxMSg,47 +dynaconf-3.2.6.dist-info/licenses.sh,sha256=9eID6RHwv82Obub4D4G--lIbRZya65Fa9EwgYNWXvFU,769 +dynaconf-3.2.6.dist-info/python-dotenv-LICENSE.txt,sha256=0nIJqz0WJ4Ko-OOHK5s1PEngksmqRnpkUiiDQH2NEDA,4600 +dynaconf-3.2.6.dist-info/ruamel.yaml-LICENSE.txt,sha256=QYxdb3JocDuWY6zvk3rVKcVO47J-9miiolkf4w6hH_8,1121 +dynaconf-3.2.6.dist-info/toml-LICENSE.txt,sha256=QitPoBx3Vs5N5go556B0Zf3Mz4YGxWeUiRYa9C1EGMg,1253 +dynaconf-3.2.6.dist-info/tomli-LICENSE.txt,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072 +dynaconf-3.2.6.dist-info/top_level.txt,sha256=y9G5RO-Ts5h0yOx6qVr8r_TBCSFA8wBxEWcvMZJq66c,9 +dynaconf-3.2.6.dist-info/vendor_versions.txt,sha256=QD2pB7JBhr6oIGaPCXFVhhFfs2uQibsJXBT9cUYlgHQ,100 +dynaconf/VERSION,sha256=wX-7S95xjeV7UD4RFHjNYDXJNtLEQMaptJtEZzNHI1U,6 +dynaconf/__init__.py,sha256=1SJQLzyyP-h6Z0Ws8QQaqJNWS8UFaSaHSNRK1ZOomDw,1221 +dynaconf/base.py,sha256=Pm8kEqQTFY-bQcR-sd3E8w1Vpw9Npp8kVsT4dizMLrs,51283 +dynaconf/cli.py,sha256=a8WFL3MmMK7rMBDaeVY--6ApnjO43g6S9NKDv91xdG4,26380 dynaconf/constants.py,sha256=DKUWa2XfcyqA-TpbfLBnpkwMF9rjAr86P_GrB8PbR1Y,1259 -dynaconf/contrib/__init__.py,sha256=gy_7wuth_6Gw_CcF7WO2Xd7mfuRZR6LryNLlBwl3QnA,240 -dynaconf/contrib/django_dynaconf_v2.py,sha256=bWyuWFl0sTpW_43HCXrLNmk6INOigbfFffLWlMijAOc,4699 -dynaconf/contrib/flask_dynaconf.py,sha256=0pLlFGY4ywCkNmCb2SnfjZmCtQc0bHYoivPJnD6s_YE,7566 -dynaconf/default_settings.py,sha256=qokrQ2mrxDKz4m1JcNJv5ihGKQZGN3uJDI9LI62IFi4,9764 -dynaconf/hooking.py,sha256=cUG5XHB7w1mv_Je6rIkH8sp2_KWsxnhNNTz7eh7v45M,8796 -dynaconf/loaders/__init__.py,sha256=RE4NrUrmQW2OZByrHgCiJstGO-ebUrW6KJY3FfYG024,11944 -dynaconf/loaders/base.py,sha256=W-5H0kBa_jdniqgcbE3WGxRSHq5YK702mtWry2Rh6u8,8266 +dynaconf/contrib/__init__.py,sha256=kyYhXVPeWZL-zeMFGqbal4f3U0-B6ktLK7-IEOetgP8,216 +dynaconf/contrib/django_dynaconf_v2.py,sha256=FcdbU-PLUxUaXZkVIDP09no8xuPZ-axY5RjooYaeWC8,4699 +dynaconf/contrib/flask_dynaconf.py,sha256=l1lT1D51clnya-SJ0qWk_g7NQTzf2kcCn_wE7zu4V14,7567 +dynaconf/default_settings.py,sha256=LEkJqz_6AIeXdAG8v_DRtCeq386j997hsP6Arrk_Sw0,9768 +dynaconf/hooking.py,sha256=UygwwSP4Gvhh4NudIUUy3SeTk7evOi1H3Yvi2y53jvQ,9673 +dynaconf/loaders/__init__.py,sha256=adT9ZH2ZZVQDYNFQC3GeTE0dM2z3iFB2ZGs4IL9oiiA,11990 +dynaconf/loaders/base.py,sha256=rsaiXO7ljPD5COBUHTwz_zKNkcUCnn6weJbHlIr3dgg,8255 dynaconf/loaders/env_loader.py,sha256=rdfBJlQPAa8m6mCTDL8DorTiM-3NJJEy6AD7DS-GvlI,3982 -dynaconf/loaders/ini_loader.py,sha256=F91FCWjR7J95PiKDqDl9-KmRxQJb73oJFl3WC9nVmfk,1943 -dynaconf/loaders/json_loader.py,sha256=MSb8VWCHyyS6GdTa3c2O3IGyL2rGXrrkVEWKarSOuU4,2407 -dynaconf/loaders/py_loader.py,sha256=nKfspZbbCyCCZYKTypZHvlsafXs_15ugmG8miLTI3C4,5770 +dynaconf/loaders/ini_loader.py,sha256=B1kvkY12NRpsN_x2Y2xkBC7_uk6oHYiC1ALDmZviQQQ,1933 +dynaconf/loaders/json_loader.py,sha256=FexRwMQNBvzfNbqFomQF2Hb2Ph1eIGsOp2Vz4Bwu5BI,2397 +dynaconf/loaders/py_loader.py,sha256=HrJ-wjBZhykOCqoPUJTjutPyoB9Zo5-v-ME_VqtgNkA,5760 dynaconf/loaders/redis_loader.py,sha256=u4BYWEeWlckuAm0V84znsknndu8OMH9kq0UrFAnG6Is,3990 dynaconf/loaders/toml_loader.py,sha256=xoFrce6V_RI0ZrDsSJyoiNGrn5FDBzADfjKmCMM4-C4,4290 -dynaconf/loaders/vault_loader.py,sha256=9m_oYtlw07Fw8SzdNTtXI3rgZJx0maGPG8ahw-nO5jA,7336 -dynaconf/loaders/yaml_loader.py,sha256=P_FSpxKoYVjBUaqwSzAt4BqrnXykgkNCvclEiaFHQlk,4336 +dynaconf/loaders/vault_loader.py,sha256=brL2kkOT8VtF-e5Zyu1qJcw4zaPResrX9xHqWdZ9nig,7367 +dynaconf/loaders/yaml_loader.py,sha256=rwRxWepvPQcZfYVEmUIK1EB4Xayv32ui4s8LaoLdNR0,4309 dynaconf/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -dynaconf/strategies/filtering.py,sha256=tPIun1kX-F-U16VKA8RWhfgPlJ2FTeSQ74dBbkAnbNM,560 +dynaconf/strategies/filtering.py,sha256=2Ezpg7azrEKWFpaCTWS_KytY_NEviySkuVmBv3WgkXg,851 dynaconf/test_settings.py,sha256=lVkCYSe2yEmCgM_rtB56NibLn1oWrX_8FPaXIdr4JDU,170 -dynaconf/utils/__init__.py,sha256=AyOawTDPlfP0JYPzzndDmay68ZpOAqDneS8oFUCfhNs,15675 -dynaconf/utils/boxing.py,sha256=0mttwEhnjKyrXZGFSC44Ss57ROF7wSU7nUPSSVV_CR0,3031 +dynaconf/utils/__init__.py,sha256=NlT5g85UoeQqHCNGGaWpzuBdXyXgJL_kcQk7R2EN2zU,15697 +dynaconf/utils/boxing.py,sha256=bXlz0AP-9qhdMvkvkNtf5gQkWRRtXGCfR_1D6ShFgx0,3146 dynaconf/utils/files.py,sha256=b7VfD9uln2zTnP6hGtXIFfQnxI1YdP0yggGbD5Bf7Sg,4211 dynaconf/utils/functional.py,sha256=Umiy8J3DO_kFvWtz1Xz5ZFJMdG6RwvutXH656NRJvVA,4582 -dynaconf/utils/inspect.py,sha256=Bd7bJd_e9HreQkW8atPegwNMNyVkzPMU-9CDBdz6QhI,9952 -dynaconf/utils/parse_conf.py,sha256=ETsYvLqE4rSTylCxPDL9DorehVRstLWF5uJCHSRCpkI,14058 -dynaconf/validator.py,sha256=77LQa7N3twOvh1qMThZaCHTBDFZFCcRHgOiW-T3-M5M,17795 -dynaconf/validator_conditions.py,sha256=kaYjxraGmhM_vUQODmEN8HxbEhLD1aoHzhYDfbQ3AMw,1526 +dynaconf/utils/inspect.py,sha256=YPCFPungbb0tTiPgaH-ugFKqIDsJZ_VuxmfBUdrmLQI,9966 +dynaconf/utils/parse_conf.py,sha256=xx-EEMswGO4WxXWrCZjl4SrhDJzmbasj5GpOyHOAaJg,15143 +dynaconf/validator.py,sha256=g6hPj_EZHTn0LZZLVfOKt5VQk9k1qJuHEMcRYpHjonE,17837 +dynaconf/validator_conditions.py,sha256=d3hKJJ6nBKxMWmyghtGsiRArdRwBqhpNt21WKoh81bM,1527 dynaconf/vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 dynaconf/vendor/box/__init__.py,sha256=bC6Imy93waRoExHLfaLbHmit0DDc-mXDpCS2Hw2tMWg,262 dynaconf/vendor/box/box.py,sha256=TvCDIyKr7mNgflKzFTMWprUTxHWvDn6pmvkKVnNtPCQ,14009 diff --git a/libs/dogpile.cache-1.3.2.dist-info/REQUESTED b/libs/dynaconf-3.2.6.dist-info/REQUESTED similarity index 100% rename from libs/dogpile.cache-1.3.2.dist-info/REQUESTED rename to libs/dynaconf-3.2.6.dist-info/REQUESTED diff --git a/libs/dynaconf-3.2.4.dist-info/WHEEL b/libs/dynaconf-3.2.6.dist-info/WHEEL similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/WHEEL rename to libs/dynaconf-3.2.6.dist-info/WHEEL diff --git a/libs/dynaconf-3.2.4.dist-info/box-LICENSE.txt b/libs/dynaconf-3.2.6.dist-info/box-LICENSE.txt similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/box-LICENSE.txt rename to libs/dynaconf-3.2.6.dist-info/box-LICENSE.txt diff --git a/libs/dynaconf-3.2.4.dist-info/click-LICENSE.rst b/libs/dynaconf-3.2.6.dist-info/click-LICENSE.rst similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/click-LICENSE.rst rename to libs/dynaconf-3.2.6.dist-info/click-LICENSE.rst diff --git a/libs/dynaconf-3.2.4.dist-info/entry_points.txt b/libs/dynaconf-3.2.6.dist-info/entry_points.txt similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/entry_points.txt rename to libs/dynaconf-3.2.6.dist-info/entry_points.txt diff --git a/libs/dynaconf-3.2.4.dist-info/licenses.sh b/libs/dynaconf-3.2.6.dist-info/licenses.sh similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/licenses.sh rename to libs/dynaconf-3.2.6.dist-info/licenses.sh diff --git a/libs/dynaconf-3.2.4.dist-info/python-dotenv-LICENSE.txt b/libs/dynaconf-3.2.6.dist-info/python-dotenv-LICENSE.txt similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/python-dotenv-LICENSE.txt rename to libs/dynaconf-3.2.6.dist-info/python-dotenv-LICENSE.txt diff --git a/libs/dynaconf-3.2.4.dist-info/ruamel.yaml-LICENSE.txt b/libs/dynaconf-3.2.6.dist-info/ruamel.yaml-LICENSE.txt similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/ruamel.yaml-LICENSE.txt rename to libs/dynaconf-3.2.6.dist-info/ruamel.yaml-LICENSE.txt diff --git a/libs/dynaconf-3.2.4.dist-info/toml-LICENSE.txt b/libs/dynaconf-3.2.6.dist-info/toml-LICENSE.txt similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/toml-LICENSE.txt rename to libs/dynaconf-3.2.6.dist-info/toml-LICENSE.txt diff --git a/libs/dynaconf-3.2.4.dist-info/tomli-LICENSE.txt b/libs/dynaconf-3.2.6.dist-info/tomli-LICENSE.txt similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/tomli-LICENSE.txt rename to libs/dynaconf-3.2.6.dist-info/tomli-LICENSE.txt diff --git a/libs/dynaconf-3.2.4.dist-info/top_level.txt b/libs/dynaconf-3.2.6.dist-info/top_level.txt similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/top_level.txt rename to libs/dynaconf-3.2.6.dist-info/top_level.txt diff --git a/libs/dynaconf-3.2.4.dist-info/vendor_versions.txt b/libs/dynaconf-3.2.6.dist-info/vendor_versions.txt similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/vendor_versions.txt rename to libs/dynaconf-3.2.6.dist-info/vendor_versions.txt diff --git a/libs/dynaconf/__init__.py b/libs/dynaconf/__init__.py index a40baf70b..d59d40580 100644 --- a/libs/dynaconf/__init__.py +++ b/libs/dynaconf/__init__.py @@ -1,16 +1,16 @@ from __future__ import annotations -from dynaconf.base import LazySettings # noqa +from dynaconf.base import LazySettings from dynaconf.constants import DEFAULT_SETTINGS_FILES -from dynaconf.contrib import DjangoDynaconf # noqa -from dynaconf.contrib import FlaskDynaconf # noqa +from dynaconf.contrib import DjangoDynaconf +from dynaconf.contrib import FlaskDynaconf from dynaconf.utils.inspect import get_history from dynaconf.utils.inspect import inspect_settings -from dynaconf.utils.parse_conf import add_converter # noqa -from dynaconf.utils.parse_conf import DynaconfFormatError # noqa -from dynaconf.utils.parse_conf import DynaconfParseError # noqa -from dynaconf.validator import ValidationError # noqa -from dynaconf.validator import Validator # noqa +from dynaconf.utils.parse_conf import add_converter +from dynaconf.utils.parse_conf import DynaconfFormatError +from dynaconf.utils.parse_conf import DynaconfParseError +from dynaconf.validator import ValidationError +from dynaconf.validator import Validator settings = LazySettings( # This global `settings` is deprecated from v3.0.0+ diff --git a/libs/dynaconf/base.py b/libs/dynaconf/base.py index 8d713a29c..3e57ba6d8 100644 --- a/libs/dynaconf/base.py +++ b/libs/dynaconf/base.py @@ -90,13 +90,13 @@ def __resolve_config_aliases(self, kwargs): e.g: ROOT_PATH='/' is transformed into `ROOT_PATH_FOR_DYNACONF` """ - mispells = { + misspells = { "settings_files": "settings_file", "SETTINGS_FILES": "SETTINGS_FILE", "environment": "environments", "ENVIRONMENT": "ENVIRONMENTS", } - for misspell, correct in mispells.items(): + for misspell, correct in misspells.items(): if misspell in kwargs: kwargs[correct] = kwargs.pop(misspell) @@ -229,7 +229,7 @@ def __init__(self, settings_module=None, **kwargs): # pragma: no cover self._loaded_py_modules = [] self._loaded_files = [] self._deleted = set() - self._store = DynaBox(box_settings=self) + self._store = kwargs.pop("_store", DynaBox(box_settings=self)) self._env_cache = {} self._loaded_by_loaders: dict[SourceMetadata | str, Any] = {} self._loaders = [] @@ -432,6 +432,12 @@ def _dotted_get( :param default: In case of not found it will be returned :param parent: Is there a pre-loaded parent in a nested data? """ + # if parent is not traverseable raise error + if parent and not hasattr(parent, "get"): + raise AttributeError( + f"cannot lookup {dotted_key!r} from {type(parent).__name__!r}" + ) + split_key = dotted_key.split(".") name, keys = split_key[0], split_key[1:] result = self.get(name, default=default, parent=parent, **kwargs) @@ -918,7 +924,7 @@ def set( :param key: The key to store. Can be of any type. :param value: The raw value to parse and store :param loader_identifier: Optional loader name e.g: toml, yaml etc. - Or isntance of SourceMetadata + Or instance of SourceMetadata :param tomlfy: Bool define if value is parsed by toml (defaults False) :param merge: Bool define if existing nested data will be merged. :param validate: Bool define if validation will be triggered @@ -1179,14 +1185,11 @@ def execute_loaders( core_loader.load(self, env, silent=silent, key=key) self.load_includes(env, silent=silent, key=key) - self._store._box_config["_bypass_evaluation"] = True # execute hooks execute_module_hooks("post", self, env, silent=silent, key=key) execute_instance_hooks(self, "post", self._post_hooks) - self._store._box_config.pop("_bypass_evaluation", None) - def pre_load(self, env, silent, key): """Do we have any file to pre-load before main settings file?""" preloads = self.get("PRELOAD_FOR_DYNACONF", []) @@ -1228,7 +1231,6 @@ def load_file( if files: already_loaded = set() for _filename in files: - # load_file() will handle validation later with suppress(ValidationError): if py_loader.try_to_load_from_py_module_name( @@ -1250,14 +1252,10 @@ def load_file( filepath = os.path.join(root_dir, str(_filename)) paths = [ - p - for p in sorted(glob(filepath, root_dir=self._root_path)) - if ".local." not in p + p for p in sorted(glob(filepath)) if ".local." not in p ] local_paths = [ - p - for p in sorted(glob(filepath, root_dir=self._root_path)) - if ".local." in p + p for p in sorted(glob(filepath)) if ".local." in p ] # Handle possible *.globs sorted alphanumeric diff --git a/libs/dynaconf/cli.py b/libs/dynaconf/cli.py index c0fd48957..108464d44 100644 --- a/libs/dynaconf/cli.py +++ b/libs/dynaconf/cli.py @@ -20,6 +20,11 @@ from dynaconf.utils import upperfy from dynaconf.utils.files import read_file from dynaconf.utils.functional import empty +from dynaconf.utils.inspect import builtin_dumpers +from dynaconf.utils.inspect import EnvNotFoundError +from dynaconf.utils.inspect import inspect_settings +from dynaconf.utils.inspect import KeyNotFoundError +from dynaconf.utils.inspect import OutputFormatError from dynaconf.utils.parse_conf import parse_conf_data from dynaconf.utils.parse_conf import unparse_conf_data from dynaconf.validator import ValidationError @@ -28,9 +33,8 @@ from dynaconf.vendor import toml from dynaconf.vendor import tomllib - if TYPE_CHECKING: # pragma: no cover - from dynaconf.base import Settings + from dynaconf.base import Settings # noqa: F401 os.environ["PYTHONIOENCODING"] = "utf-8" @@ -78,7 +82,7 @@ def set_settings(ctx, instance=None): try: # Django extension v2 from django.conf import settings # noqa - import dynaconf + import dynaconf # noqa: F401 import django # see https://docs.djangoproject.com/en/4.2/ref/applications/ @@ -97,7 +101,6 @@ def set_settings(ctx, instance=None): ) if settings is None: - if instance is None and "--help" not in click.get_os_args(): if ctx.invoked_subcommand and ctx.invoked_subcommand not in [ "init", @@ -394,9 +397,7 @@ def init(ctx, fileformat, path, env, _vars, _secrets, wg, y, django): if settings_path: loader.write(settings_path, settings_data, merge=True) - click.echo( - f"🎛️ {settings_path.name} created to hold your settings.\n" - ) + click.echo(f"🎛️ {settings_path.name} created to hold your settings.\n") if secrets_path: loader.write(secrets_path, secrets_data, merge=True) @@ -461,7 +462,7 @@ def init(ctx, fileformat, path, env, _vars, _secrets, wg, y, django): def get(key, default, env, unparse): """Returns the raw value for a settings key. - If result is a dict, list or tuple it is printes as a valid json string. + If result is a dict, list or tuple it is printed as a valid json string. """ if env: env = env.strip() @@ -622,7 +623,7 @@ def format_setting(_k, _v): default=None, help=( "key values to be written " - "e.g: `dynaconf write toml -e NAME=foo -e X=2" + "e.g: `dynaconf write toml -e NAME=foo -e X=2`" ), ) @click.option( @@ -633,7 +634,7 @@ def format_setting(_k, _v): default=None, help=( "secret key values to be written in .secrets " - "e.g: `dynaconf write toml -s TOKEN=kdslmflds -s X=2" + "e.g: `dynaconf write toml -s TOKEN=kdslmflds -s X=2`" ), ) @click.option( @@ -661,7 +662,6 @@ def write(to, _vars, _secrets, path, env, y): loader = importlib.import_module(f"dynaconf.loaders.{to}_loader") if to in EXTS: - # Lets write to a file path = Path(path) @@ -807,14 +807,6 @@ def validate(path): # pragma: no cover sys.exit(1) -from dynaconf.utils.inspect import ( - KeyNotFoundError, - builtin_dumpers, - inspect_settings, - EnvNotFoundError, - OutputFormatError, -) - INSPECT_FORMATS = list(builtin_dumpers.keys()) @@ -860,7 +852,7 @@ def inspect( """ Inspect the loading history of the given settings instance. - Filters by key and environement, otherwise shows all. + Filters by key and environment, otherwise shows all. """ try: inspect_settings( diff --git a/libs/dynaconf/contrib/__init__.py b/libs/dynaconf/contrib/__init__.py index 2c0279a49..de6034c9e 100644 --- a/libs/dynaconf/contrib/__init__.py +++ b/libs/dynaconf/contrib/__init__.py @@ -1,5 +1,5 @@ from __future__ import annotations -from dynaconf.contrib.django_dynaconf_v2 import DjangoDynaconf # noqa -from dynaconf.contrib.flask_dynaconf import DynaconfConfig # noqa -from dynaconf.contrib.flask_dynaconf import FlaskDynaconf # noqa +from dynaconf.contrib.django_dynaconf_v2 import DjangoDynaconf +from dynaconf.contrib.flask_dynaconf import DynaconfConfig +from dynaconf.contrib.flask_dynaconf import FlaskDynaconf diff --git a/libs/dynaconf/contrib/django_dynaconf_v2.py b/libs/dynaconf/contrib/django_dynaconf_v2.py index accdabddb..2d201a099 100644 --- a/libs/dynaconf/contrib/django_dynaconf_v2.py +++ b/libs/dynaconf/contrib/django_dynaconf_v2.py @@ -20,6 +20,7 @@ DJANGO_ALLOWED_HOSTS='["localhost"]' \ python manage.py runserver """ + from __future__ import annotations import inspect @@ -114,7 +115,6 @@ class UserSettingsHolder(dynaconf.LazySettings): # 5) Patch django.conf.settings class Wrapper: - # lazy_settings = conf.settings.lazy_settings def __getattribute__(self, name): diff --git a/libs/dynaconf/contrib/flask_dynaconf.py b/libs/dynaconf/contrib/flask_dynaconf.py index c51351a49..5d9ba7a6f 100644 --- a/libs/dynaconf/contrib/flask_dynaconf.py +++ b/libs/dynaconf/contrib/flask_dynaconf.py @@ -13,9 +13,10 @@ Config = object -import dynaconf from importlib.metadata import EntryPoint +import dynaconf + class FlaskDynaconf: """The arguments are. diff --git a/libs/dynaconf/default_settings.py b/libs/dynaconf/default_settings.py index 7e8c22298..8b864694c 100644 --- a/libs/dynaconf/default_settings.py +++ b/libs/dynaconf/default_settings.py @@ -78,10 +78,10 @@ def reload(load_dotenv=None, *args, **kwargs): # Default settings file SETTINGS_FILE_FOR_DYNACONF = get("SETTINGS_FILE_FOR_DYNACONF", []) -# MISPELLS `FILES` when/if it happens -mispelled_files = get("SETTINGS_FILES_FOR_DYNACONF", None) -if not SETTINGS_FILE_FOR_DYNACONF and mispelled_files is not None: - SETTINGS_FILE_FOR_DYNACONF = mispelled_files +# MISSPELLS `FILES` when/if it happens +misspelled_files = get("SETTINGS_FILES_FOR_DYNACONF", None) +if not SETTINGS_FILE_FOR_DYNACONF and misspelled_files is not None: + SETTINGS_FILE_FOR_DYNACONF = misspelled_files # # ENV SETTINGS # # In dynaconf 1.0.0 `NAMESPACE` got renamed to `ENV` diff --git a/libs/dynaconf/hooking.py b/libs/dynaconf/hooking.py index f47fea682..092deb46e 100644 --- a/libs/dynaconf/hooking.py +++ b/libs/dynaconf/hooking.py @@ -5,14 +5,10 @@ from functools import wraps from typing import Any from typing import Callable -from typing import Dict -from typing import List -from dynaconf.base import RESERVED_ATTRS from dynaconf.base import Settings from dynaconf.loaders.base import SourceMetadata - __all__ = [ "hookable", "EMPTY_VALUE", @@ -25,8 +21,7 @@ ] -class Empty: - ... +class Empty: ... EMPTY_VALUE = Empty() @@ -81,17 +76,9 @@ def dispatch(fun, self, *args, **kwargs): ): return fun(self, *args, **kwargs) - # Create an unhookable (to avoid recursion) + # Create an unhook-able (to avoid recursion) # temporary settings to pass to the hooked function - temp_settings = Settings( - dynaconf_skip_loaders=True, - dynaconf_skip_validators=True, - ) - allowed_keys = self.__dict__.keys() - set(RESERVED_ATTRS) - temp_data = { - k: v for k, v in self.__dict__.items() if k in allowed_keys - } - temp_settings._store.update(temp_data) + temp_settings = TempSettingsHolder(self) def _hook(action: str, value: HookValue) -> HookValue: """executes the hooks for the given action""" @@ -308,3 +295,49 @@ class HookableSettings(Settings): @hookable def get(self, *args, **kwargs): return Settings.get(self, *args, **kwargs) + + +class TempSettingsHolder: + """Holds settings to be passed down to hooks. + To save runtime resources initialize a copy of it only if accessed. + """ + + _settings = None + + def __init__(self, settings): + self._original_settings = settings + + def _initialize(self): + if self._settings is None: + self._settings = Settings( + dynaconf_skip_loaders=True, + dynaconf_skip_validators=True, + _store=self._original_settings._store._safe_copy(), + ) + + def __getattr__(self, attr): + self._initialize() + return getattr(self._settings, attr) + + def __getitem__(self, item): + self._initialize() + return self._settings[item] + + def __setitem__(self, item, value): + self._initialize() + self._settings[item] = value + + def __iter__(self): + self._initialize() + return iter(self._settings) + + def __contains__(self, item): + self._initialize() + return item in self._settings + + def __setattr__(self, attr, value): + if attr in ["_original_settings", "_settings"]: + super().__setattr__(attr, value) + else: + self._initialize() + setattr(self._settings, attr, value) diff --git a/libs/dynaconf/loaders/__init__.py b/libs/dynaconf/loaders/__init__.py index b1a46e0a3..153b64d5c 100644 --- a/libs/dynaconf/loaders/__init__.py +++ b/libs/dynaconf/loaders/__init__.py @@ -28,7 +28,7 @@ def default_loader(obj, defaults=None): """Initial loader for the initialization process. Steps: - - Load default settings (from static module) + kwargs overrides (togheter) + - Load default settings (from static module) + kwargs overrides (together) - Load envvar overrides """ # LOAD DEFAULT STATIC + KWARGS OVERRIDES @@ -126,12 +126,13 @@ def execute_module_hooks( hook_file = os.path.join( os.path.dirname(loaded_file), "dynaconf_hooks.py" ) + if not os.path.exists(hook_file): + # Return early if file doesn't exist. + # Faster than attempting to import. + continue hook_module = py_loader.import_from_filename( obj, hook_file, silent=silent ) - if not hook_module: - # There was no hook on the same path as a python file - continue _run_hook_module( hook_type=hook, hook_module=hook_module, diff --git a/libs/dynaconf/loaders/base.py b/libs/dynaconf/loaders/base.py index 5c46891b7..e0ea23bf8 100644 --- a/libs/dynaconf/loaders/base.py +++ b/libs/dynaconf/loaders/base.py @@ -1,6 +1,5 @@ from __future__ import annotations -import io import warnings from typing import NamedTuple @@ -227,7 +226,7 @@ def _set_data_to_obj( class SourceMetadata(NamedTuple): """ - Usefull metadata about some loaded source (file, envvar, etc). + Useful metadata about some loaded source (file, envvar, etc). Serve as a unique identifier for data from a specific env and a specific source (file, envvar, validationd default, etc) diff --git a/libs/dynaconf/loaders/ini_loader.py b/libs/dynaconf/loaders/ini_loader.py index 0156fc64c..bf92d2a82 100644 --- a/libs/dynaconf/loaders/ini_loader.py +++ b/libs/dynaconf/loaders/ini_loader.py @@ -1,6 +1,5 @@ from __future__ import annotations -import io from pathlib import Path from dynaconf import default_settings diff --git a/libs/dynaconf/loaders/json_loader.py b/libs/dynaconf/loaders/json_loader.py index 69b5a4865..7bf9961be 100644 --- a/libs/dynaconf/loaders/json_loader.py +++ b/libs/dynaconf/loaders/json_loader.py @@ -1,6 +1,5 @@ from __future__ import annotations -import io import json from pathlib import Path diff --git a/libs/dynaconf/loaders/py_loader.py b/libs/dynaconf/loaders/py_loader.py index 6367fd642..f8f575505 100644 --- a/libs/dynaconf/loaders/py_loader.py +++ b/libs/dynaconf/loaders/py_loader.py @@ -3,7 +3,6 @@ import errno import importlib import inspect -import io import types from contextlib import suppress from pathlib import Path diff --git a/libs/dynaconf/loaders/vault_loader.py b/libs/dynaconf/loaders/vault_loader.py index b1a9091f3..79d757475 100644 --- a/libs/dynaconf/loaders/vault_loader.py +++ b/libs/dynaconf/loaders/vault_loader.py @@ -13,7 +13,8 @@ try: from hvac import Client - from hvac.exceptions import InvalidPath, Forbidden + from hvac.exceptions import Forbidden + from hvac.exceptions import InvalidPath except ImportError: raise ImportError( "vault package is not installed in your environment. " diff --git a/libs/dynaconf/loaders/yaml_loader.py b/libs/dynaconf/loaders/yaml_loader.py index 57216810c..af0629838 100644 --- a/libs/dynaconf/loaders/yaml_loader.py +++ b/libs/dynaconf/loaders/yaml_loader.py @@ -1,8 +1,6 @@ from __future__ import annotations -import sys from pathlib import Path -from typing import TextIO from warnings import warn from dynaconf import default_settings @@ -13,10 +11,10 @@ from dynaconf.vendor.ruamel import yaml # Add support for Dynaconf Lazy values to YAML dumper -yaml.SafeDumper.yaml_representers[ - None -] = lambda self, data: yaml.representer.SafeRepresenter.represent_str( - self, try_to_encode(data) +yaml.SafeDumper.yaml_representers[None] = ( + lambda self, data: yaml.representer.SafeRepresenter.represent_str( + self, try_to_encode(data) + ) ) diff --git a/libs/dynaconf/strategies/filtering.py b/libs/dynaconf/strategies/filtering.py index ef1f51ff9..c3a864349 100644 --- a/libs/dynaconf/strategies/filtering.py +++ b/libs/dynaconf/strategies/filtering.py @@ -4,13 +4,25 @@ class PrefixFilter: - def __init__(self, prefix): + """Filter environment variables by prefix. + + Examples: + Please see [Prefix filtering][prefix-filtering] in the advanced usage + section. + """ + + def __init__(self, prefix: str): + """Initialises the PrefixFilter class. + + Args: + prefix: The prefix to filter on. + """ if not isinstance(prefix, str): raise TypeError("`SETTINGS_FILE_PREFIX` must be str") self.prefix = f"{upperfy(prefix)}_" def __call__(self, data): - """Filter incoming data by prefix""" + """Filter incoming data by prefix.""" len_prefix = len(self.prefix) return { upperfy(key[len_prefix:]): value diff --git a/libs/dynaconf/utils/__init__.py b/libs/dynaconf/utils/__init__.py index 9db51e150..339a4ef29 100644 --- a/libs/dynaconf/utils/__init__.py +++ b/libs/dynaconf/utils/__init__.py @@ -9,10 +9,10 @@ from typing import TYPE_CHECKING from typing import TypeVar - if TYPE_CHECKING: # pragma: no cover + from dynaconf.base import LazySettings + from dynaconf.base import Settings from dynaconf.utils.boxing import DynaBox - from dynaconf.base import LazySettings, Settings BANNER = """ @@ -47,7 +47,6 @@ def object_merge( return new if isinstance(old, list) and isinstance(new, list): - # 726: allow local_merge to override global merge on lists if "dynaconf_merge_unique" in new: new.remove("dynaconf_merge_unique") @@ -83,7 +82,6 @@ def safe_items(data): should_merge = new.pop("dynaconf_merge", True) if should_merge: for old_key, value in safe_items(old): - # This is for when the dict exists internally # but the new value on the end of full path is the same if ( @@ -131,7 +129,6 @@ def handle_metavalues( """Cleanup of MetaValues on new dict""" for key in list(new.keys()): - # MetaValue instances if getattr(new[key], "_dynaconf_reset", False): # pragma: no cover # a Reset on `new` triggers reasign of existing data @@ -300,7 +297,7 @@ def trimmed_split( continue data = [item.strip() for item in s.strip().split(sep)] return data - return [s] # raw un-splitted + return [s] # raw un-split T = TypeVar("T") diff --git a/libs/dynaconf/utils/boxing.py b/libs/dynaconf/utils/boxing.py index 3c6f32311..1fc9a342f 100644 --- a/libs/dynaconf/utils/boxing.py +++ b/libs/dynaconf/utils/boxing.py @@ -15,16 +15,13 @@ def evaluate_lazy_format(f): @wraps(f) def evaluate(dynabox, item, *args, **kwargs): - if dynabox._box_config.get("_bypass_evaluation") is True: - return f(dynabox, item, *args, **kwargs) - value = f(dynabox, item, *args, **kwargs) settings = dynabox._box_config["box_settings"] if getattr(value, "_dynaconf_lazy_format", None): - dynabox._box_config[ - f"raw_{item.lower()}" - ] = f"@{value.formatter.token} {value.value}" + dynabox._box_config[f"raw_{item.lower()}"] = ( + f"@{value.formatter.token} {value.value}" + ) return recursively_evaluate_lazy_format(value, settings) @@ -59,6 +56,13 @@ def _safe_get(self, item, *args, **kwargs): n_item = find_the_correct_casing(item, self) or item return super().__getitem__(n_item, *args, **kwargs) + def _safe_copy(self): + """Copy bypassing lazy evaluation""" + return self.__class__( + {k: self._safe_get(k) for k in self.keys()}, + box_settings=self._box_config.get("box_settings"), + ) + def __copy__(self): return self.__class__( super(Box, self).copy(), diff --git a/libs/dynaconf/utils/inspect.py b/libs/dynaconf/utils/inspect.py index 21d724e7c..eee06f0de 100644 --- a/libs/dynaconf/utils/inspect.py +++ b/libs/dynaconf/utils/inspect.py @@ -1,4 +1,5 @@ """Inspecting module""" + from __future__ import annotations import json @@ -8,7 +9,6 @@ from typing import Any from typing import Callable from typing import Literal -from typing import Optional from typing import Protocol from typing import TextIO from typing import TYPE_CHECKING @@ -21,7 +21,8 @@ from dynaconf.vendor.ruamel.yaml import YAML if TYPE_CHECKING: # pragma: no cover - from dynaconf.base import LazySettings, Settings + from dynaconf.base import LazySettings + from dynaconf.base import Settings # Dumpers config @@ -298,7 +299,8 @@ def _ensure_serializable(data: BoxList | DynaBox) -> dict | list: return [_ensure_serializable(v) for v in data] elif isinstance(data, (DynaBox, dict)): return { - k: _ensure_serializable(v) for k, v in data.items() # type: ignore + k: _ensure_serializable(v) + for k, v in data.items() # type: ignore } else: return data if isinstance(data, (int, bool, float)) else str(data) diff --git a/libs/dynaconf/utils/parse_conf.py b/libs/dynaconf/utils/parse_conf.py index 882110e50..74036208a 100644 --- a/libs/dynaconf/utils/parse_conf.py +++ b/libs/dynaconf/utils/parse_conf.py @@ -168,11 +168,46 @@ def _jinja_formatter(value, **context): return jinja_env.from_string(value).render(**context) +def _get_formatter(value, **context): + """ + Invokes settings.get from the annotation in value. + + value can be one of the following: + + @get KEY + @get KEY @int + @get KEY default_value + @get KEY @int default_value + + @marker KEY_TO_LOOKUP @OPTIONAL_CAST OPTIONAL_DEFAULT_VALUE + + key group will match the key + cast group will match anything provided after @ + the default group will match anything between single or double quotes + """ + pattern = re.compile( + r"(?P\w+(?:\.\w+)?)\s*" + r"(?:(?P@\w+)\s*)?" + r'(?P["\']?)' + r'\s*(?P[^"\']*)\s*(?P=quote)?' + ) + if match := pattern.match(value.strip()): + data = match.groupdict() + return context["this"].get( + key=data["key"], + default=data["default"], + cast=data["cast"], + ) + else: + raise DynaconfFormatError(f"Error parsing {value} malformed syntax.") + + class Formatters: """Dynaconf builtin formatters""" python_formatter = BaseFormatter(str.format, "format") jinja_formatter = BaseFormatter(_jinja_formatter, "jinja") + get_formatter = BaseFormatter(_get_formatter, "get") class Lazy: @@ -268,6 +303,7 @@ def evaluate(settings, *args, **kwargs): "@merge_unique": lambda value, box_settings: Merge( value, box_settings, unique=True ), + "@get": lambda value: Lazy(value, formatter=Formatters.get_formatter), # Special markers to be used as placeholders e.g: in prefilled forms # will always return None when evaluated "@note": lambda value: None, @@ -405,21 +441,21 @@ def parse_conf_data(data, tomlfy=False, box_settings=None): if isinstance(data, DynaBox): # recursively parse inner dict items - _parsed = DynaBox({}, box_settings=box_settings) + # It is important to keep the same object id because + # of mutability for k, v in data._safe_items(): - _parsed[k] = parse_conf_data( + data[k] = parse_conf_data( v, tomlfy=tomlfy, box_settings=box_settings ) - return _parsed + return data if isinstance(data, dict): # recursively parse inner dict items - _parsed = {} for k, v in data.items(): - _parsed[k] = parse_conf_data( + data[k] = parse_conf_data( v, tomlfy=tomlfy, box_settings=box_settings ) - return _parsed + return data # return parsed string value return _parse_conf_data(data, tomlfy=tomlfy, box_settings=box_settings) @@ -451,7 +487,7 @@ def boolean_fix(value: str | None): """Gets a value like `True/False` and turns to `true/false` This function exists because of issue #976 Toml parser casts booleans from true/false lower case - however envvars are usually exportes as True/False capitalized + however envvars are usually exported as True/False capitalized by mistake, this helper fixes it for envvars only. Assume envvars are always str. diff --git a/libs/dynaconf/validator.py b/libs/dynaconf/validator.py index 6107fff81..37e2f7f78 100644 --- a/libs/dynaconf/validator.py +++ b/libs/dynaconf/validator.py @@ -13,7 +13,8 @@ from dynaconf.utils.functional import empty if TYPE_CHECKING: - from dynaconf.base import LazySettings, Settings + from dynaconf.base import LazySettings # noqa: F401 + from dynaconf.base import Settings EQUALITY_ATTRS = ( "names", @@ -464,7 +465,6 @@ def register(self, *args: Validator, **kwargs: Validator): self.append(validator) def descriptions(self, flat: bool = False) -> dict[str, str | list[str]]: - if flat: descriptions: dict[str, str | list[str]] = {} else: diff --git a/libs/dynaconf/validator_conditions.py b/libs/dynaconf/validator_conditions.py index 96d151011..039dede32 100644 --- a/libs/dynaconf/validator_conditions.py +++ b/libs/dynaconf/validator_conditions.py @@ -2,6 +2,7 @@ """ Implement basic assertions to be used in assertion action """ + from __future__ import annotations diff --git a/libs/engineio/async_client.py b/libs/engineio/async_client.py index 72cd80058..a39085793 100644 --- a/libs/engineio/async_client.py +++ b/libs/engineio/async_client.py @@ -62,7 +62,7 @@ class AsyncClient(base_client.BaseClient): :param http_session: an initialized ``aiohttp.ClientSession`` object to be used when sending requests to the server. Use it if you need to add special client options such as proxy - servers, SSL certificates, etc. + servers, SSL certificates, custom CA bundle, etc. :param ssl_verify: ``True`` to verify SSL certificates, or ``False`` to skip SSL certificate verification, allowing connections to servers with self signed certificates. diff --git a/libs/engineio/async_drivers/asgi.py b/libs/engineio/async_drivers/asgi.py index 57267037e..bd502261d 100644 --- a/libs/engineio/async_drivers/asgi.py +++ b/libs/engineio/async_drivers/asgi.py @@ -19,7 +19,12 @@ class ASGIApp: :param other_asgi_app: A separate ASGI app that receives all other traffic. :param engineio_path: The endpoint where the Engine.IO application should be installed. The default value is appropriate for - most cases. + most cases. With a value of ``None``, all incoming + traffic is directed to the Engine.IO server, with the + assumption that routing, if necessary, is handled by + a different layer. When this option is set to + ``None``, ``static_files`` and ``other_asgi_app`` are + ignored. :param on_startup: function to be called on application startup; can be coroutine :param on_shutdown: function to be called on application shutdown; can be @@ -44,24 +49,27 @@ def __init__(self, engineio_server, other_asgi_app=None, self.engineio_server = engineio_server self.other_asgi_app = other_asgi_app self.engineio_path = engineio_path - if not self.engineio_path.startswith('/'): - self.engineio_path = '/' + self.engineio_path - if not self.engineio_path.endswith('/'): - self.engineio_path += '/' + if self.engineio_path is not None: + if not self.engineio_path.startswith('/'): + self.engineio_path = '/' + self.engineio_path + if not self.engineio_path.endswith('/'): + self.engineio_path += '/' self.static_files = static_files or {} self.on_startup = on_startup self.on_shutdown = on_shutdown async def __call__(self, scope, receive, send): - if scope['type'] in ['http', 'websocket'] and \ - scope['path'].startswith(self.engineio_path): + if scope['type'] == 'lifespan': + await self.lifespan(scope, receive, send) + elif scope['type'] in ['http', 'websocket'] and ( + self.engineio_path is None + or self._ensure_trailing_slash(scope['path']).startswith( + self.engineio_path)): await self.engineio_server.handle_request(scope, receive, send) else: static_file = get_static_file(scope['path'], self.static_files) \ if scope['type'] == 'http' and self.static_files else None - if scope['type'] == 'lifespan': - await self.lifespan(scope, receive, send) - elif static_file and os.path.exists(static_file['filename']): + if static_file and os.path.exists(static_file['filename']): await self.serve_static_file(static_file, receive, send) elif self.other_asgi_app is not None: await self.other_asgi_app(scope, receive, send) @@ -120,6 +128,11 @@ async def not_found(self, receive, send): await send({'type': 'http.response.body', 'body': b'Not Found'}) + def _ensure_trailing_slash(self, path): + if not path.endswith('/'): + path += '/' + return path + async def translate_request(scope, receive, send): class AwaitablePayload(object): # pragma: no cover diff --git a/libs/engineio/async_drivers/eventlet.py b/libs/engineio/async_drivers/eventlet.py index 4dfdc1eff..b27eb1445 100644 --- a/libs/engineio/async_drivers/eventlet.py +++ b/libs/engineio/async_drivers/eventlet.py @@ -25,7 +25,7 @@ def join(self): return self.g.wait() -class WebSocketWSGI(_WebSocketWSGI): +class WebSocketWSGI(_WebSocketWSGI): # pragma: no cover def __init__(self, handler, server): try: super().__init__( diff --git a/libs/engineio/async_server.py b/libs/engineio/async_server.py index a7763830c..661205023 100644 --- a/libs/engineio/async_server.py +++ b/libs/engineio/async_server.py @@ -70,6 +70,10 @@ class AsyncServer(base_server.BaseServer): :param async_handlers: If set to ``True``, run message event handlers in non-blocking threads. To run handlers synchronously, set to ``False``. The default is ``True``. + :param monitor_clients: If set to ``True``, a background task will ensure + inactive clients are closed. Set to ``False`` to + disable the monitoring task (not recommended). The + default is ``True``. :param transports: The list of allowed transports. Valid transports are ``'polling'`` and ``'websocket'``. Defaults to ``['polling', 'websocket']``. @@ -265,11 +269,11 @@ async def handle_request(self, *args, **kwargs): 'bad-jsonp-index') r = self._bad_request('Invalid JSONP index number') elif method == 'GET': + upgrade_header = environ.get('HTTP_UPGRADE').lower() \ + if 'HTTP_UPGRADE' in environ else None if sid is None: # transport must be one of 'polling' or 'websocket'. # if 'websocket', the HTTP_UPGRADE header must match. - upgrade_header = environ.get('HTTP_UPGRADE').lower() \ - if 'HTTP_UPGRADE' in environ else None if transport == 'polling' \ or transport == upgrade_header == 'websocket': r = await self._handle_connect(environ, transport, @@ -284,18 +288,25 @@ async def handle_request(self, *args, **kwargs): r = self._bad_request('Invalid session ' + sid) else: socket = self._get_socket(sid) - try: - packets = await socket.handle_get_request(environ) - if isinstance(packets, list): - r = self._ok(packets, jsonp_index=jsonp_index) - else: - r = packets - except exceptions.EngineIOError: - if sid in self.sockets: # pragma: no cover - await self.disconnect(sid) - r = self._bad_request() - if sid in self.sockets and self.sockets[sid].closed: - del self.sockets[sid] + if self.transport(sid) != transport and \ + transport != upgrade_header: + self._log_error_once( + 'Invalid transport for session ' + sid, + 'bad-transport') + r = self._bad_request('Invalid transport') + else: + try: + packets = await socket.handle_get_request(environ) + if isinstance(packets, list): + r = self._ok(packets, jsonp_index=jsonp_index) + else: + r = packets + except exceptions.EngineIOError: + if sid in self.sockets: # pragma: no cover + await self.disconnect(sid) + r = self._bad_request() + if sid in self.sockets and self.sockets[sid].closed: + del self.sockets[sid] elif method == 'POST': if sid is None or sid not in self.sockets: self._log_error_once('Invalid session ' + sid, 'bad-sid') @@ -524,9 +535,9 @@ async def _service_task(self): # pragma: no cover try: await asyncio.wait_for(self.service_task_event.wait(), timeout=self.ping_timeout) - except asyncio.TimeoutError: break - continue + except asyncio.TimeoutError: + continue # go through the entire client list in a ping interval cycle sleep_interval = self.ping_timeout / len(self.sockets) @@ -546,8 +557,9 @@ async def _service_task(self): # pragma: no cover try: await asyncio.wait_for(self.service_task_event.wait(), timeout=sleep_interval) - except asyncio.TimeoutError: raise KeyboardInterrupt() + except asyncio.TimeoutError: + continue except ( SystemExit, KeyboardInterrupt, diff --git a/libs/engineio/client.py b/libs/engineio/client.py index 8775179dc..a2571842b 100644 --- a/libs/engineio/client.py +++ b/libs/engineio/client.py @@ -494,7 +494,7 @@ def _read_loop_websocket(self): p = None try: p = self.ws.recv() - if len(p) == 0: # pragma: no cover + if len(p) == 0 and not self.ws.connected: # pragma: no cover # websocket client can return an empty string after close raise websocket.WebSocketConnectionClosedException() except websocket.WebSocketTimeoutException: @@ -510,8 +510,7 @@ def _read_loop_websocket(self): except Exception as e: # pragma: no cover if type(e) is OSError and e.errno == 9: self.logger.info( - 'WebSocket connection is closing, aborting', - str(e)) + 'WebSocket connection is closing, aborting') else: self.logger.info( 'Unexpected error receiving packet: "%s", aborting', diff --git a/libs/engineio/server.py b/libs/engineio/server.py index 3926b226a..578780bc6 100644 --- a/libs/engineio/server.py +++ b/libs/engineio/server.py @@ -180,7 +180,7 @@ def disconnect(self, sid=None): if sid in self.sockets: # pragma: no cover del self.sockets[sid] else: - for client in self.sockets.values(): + for client in self.sockets.copy().values(): client.close() self.sockets = {} @@ -251,11 +251,11 @@ def handle_request(self, environ, start_response): 'bad-jsonp-index') r = self._bad_request('Invalid JSONP index number') elif method == 'GET': + upgrade_header = environ.get('HTTP_UPGRADE').lower() \ + if 'HTTP_UPGRADE' in environ else None if sid is None: # transport must be one of 'polling' or 'websocket'. # if 'websocket', the HTTP_UPGRADE header must match. - upgrade_header = environ.get('HTTP_UPGRADE').lower() \ - if 'HTTP_UPGRADE' in environ else None if transport == 'polling' \ or transport == upgrade_header == 'websocket': r = self._handle_connect(environ, start_response, @@ -270,19 +270,26 @@ def handle_request(self, environ, start_response): r = self._bad_request('Invalid session') else: socket = self._get_socket(sid) - try: - packets = socket.handle_get_request( - environ, start_response) - if isinstance(packets, list): - r = self._ok(packets, jsonp_index=jsonp_index) - else: - r = packets - except exceptions.EngineIOError: - if sid in self.sockets: # pragma: no cover - self.disconnect(sid) - r = self._bad_request() - if sid in self.sockets and self.sockets[sid].closed: - del self.sockets[sid] + if self.transport(sid) != transport and \ + transport != upgrade_header: + self._log_error_once( + 'Invalid transport for session ' + sid, + 'bad-transport') + r = self._bad_request('Invalid transport') + else: + try: + packets = socket.handle_get_request( + environ, start_response) + if isinstance(packets, list): + r = self._ok(packets, jsonp_index=jsonp_index) + else: + r = packets + except exceptions.EngineIOError: + if sid in self.sockets: # pragma: no cover + self.disconnect(sid) + r = self._bad_request() + if sid in self.sockets and self.sockets[sid].closed: + del self.sockets[sid] elif method == 'POST': if sid is None or sid not in self.sockets: self._log_error_once( diff --git a/libs/enzyme-0.4.1.dist-info/LICENSE b/libs/enzyme-0.4.1.dist-info/LICENSE deleted file mode 100644 index 32c6448c1..000000000 --- a/libs/enzyme-0.4.1.dist-info/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2013 Antoine Bertin - - 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/libs/enzyme-0.4.1.dist-info/METADATA b/libs/enzyme-0.4.1.dist-info/METADATA deleted file mode 100644 index 9b25f08d6..000000000 --- a/libs/enzyme-0.4.1.dist-info/METADATA +++ /dev/null @@ -1,84 +0,0 @@ -Metadata-Version: 2.1 -Name: enzyme -Version: 0.4.1 -Summary: Python video metadata parser -Home-page: https://github.com/Diaoul/enzyme -Author: Antoine Bertin -Author-email: diaoulael@gmail.com -License: Apache 2.0 -Keywords: parser video metadata mkv -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software 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.3 -Classifier: Topic :: Multimedia :: Video -Classifier: Topic :: Software Development :: Libraries :: Python Modules -License-File: LICENSE - -Enzyme -====== - -Enzyme is a Python module to parse video metadata. - -.. image:: https://travis-ci.org/Diaoul/enzyme.png?branch=master - :target: https://travis-ci.org/Diaoul/enzyme - - -Usage ------ -Parse a MKV file:: - - >>> with open('How.I.Met.Your.Mother.S08E21.720p.HDTV.X264-DIMENSION.mkv', 'rb') as f: - ... mkv = enzyme.MKV(f) - ... - >>> mkv.info - - >>> mkv.video_tracks - [] - >>> mkv.audio_tracks - [] - - -License -------- -Apache2 - - -Changelog -========= - -0.4.1 ------ -**release date:** 2013-11-05 - -* Fix parsing nested SeekHead elements -* Make parsing nested SeekHead elements optional - - -0.4.0 ------ -**release date:** 2013-10-30 - -* Import exceptions under enzyme namespace -* Change repr format -* Rename base exception -* Remove test file - - -0.3.1 ------ -**release date:** 2013-10-20 - -* Fix package distribution - - -0.3 ---- -**release date:** 2013-05-18 - -* Complete refactoring, for the old enzyme see https://github.com/Diaoul/enzyme-old diff --git a/libs/enzyme-0.4.1.dist-info/RECORD b/libs/enzyme-0.4.1.dist-info/RECORD deleted file mode 100644 index 49c974853..000000000 --- a/libs/enzyme-0.4.1.dist-info/RECORD +++ /dev/null @@ -1,20 +0,0 @@ -enzyme-0.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -enzyme-0.4.1.dist-info/LICENSE,sha256=e-Z5UoOAO42i94CJeEIdGivqSSmsdwR-3oZCfb8AEuc,580 -enzyme-0.4.1.dist-info/METADATA,sha256=6YCurGi7B_dAlefGG5Jx1nW4Mkh0qDiuoSn7TGHtSfc,1997 -enzyme-0.4.1.dist-info/RECORD,, -enzyme-0.4.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -enzyme-0.4.1.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -enzyme-0.4.1.dist-info/top_level.txt,sha256=ZnBG41c0gHbSzWViydQBVrwPW1GOY1yM8gJ4dykf98A,7 -enzyme/__init__.py,sha256=Bxt7MSfXw8VjbpmajC1OH7te6Xqj2GX9V7vlDqSQo4g,297 -enzyme/compat.py,sha256=RaScoNq3JzqME2tJG7p3V6LNT8mI7BC8bOBTNl82pvo,227 -enzyme/exceptions.py,sha256=y-sSDZ070RCmpBNqWXXQ91CwPlbXitkYbRhVuRMXRY4,547 -enzyme/mkv.py,sha256=YgESoKgFKGkmLmHkr-yZpLB-_RW6roQJ5AdsFP1_Sd0,15877 -enzyme/parsers/__init__.py,sha256=iwhKnzeBJLKxpRVjvzwiRE63_zNpIBfaKLITauVph-0,24 -enzyme/parsers/ebml/__init__.py,sha256=H1cI6PdN63O3nKu10qyKgY0SXQFN8mclH0gTozIo3YI,67 -enzyme/parsers/ebml/core.py,sha256=kq3OPCmOhSwfWCuG8jG_IFE4M8WhzhzUNjEKwmzBMpg,9965 -enzyme/parsers/ebml/readers.py,sha256=IIBwXiAhi8bPhjGj0-opLKXVFCQZABPaCefthpkEs2U,7341 -enzyme/parsers/ebml/specs/matroska.xml,sha256=T6pV24Sz_5cHUr3VMt1Zj1Hzr9K4YqjOyS3alZK9xic,51240 -enzyme/tests/__init__.py,sha256=fBPyZdilFRWxA4CnUxzoMLhvpf7EYkssv_rMSRmC4Yc,218 -enzyme/tests/parsers/ebml/test1.mkv.yml,sha256=yAktCo6wXlJMrV9n0QEzSwJcliYHUqXmNamD0njFNr0,156640 -enzyme/tests/test_mkv.py,sha256=SWPzNAdJzn_Ohd8dsNxrcjOcaQl_u90yrpC25qU1Oms,36801 -enzyme/tests/test_parsers.py,sha256=nCgV9TsefwzMvolDGVze0taPUf3icuU3ysr1LlOeFFM,6118 diff --git a/libs/dynaconf-3.2.4.dist-info/INSTALLER b/libs/enzyme-0.5.2.dist-info/INSTALLER similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/INSTALLER rename to libs/enzyme-0.5.2.dist-info/INSTALLER diff --git a/libs/enzyme-0.5.2.dist-info/LICENSE b/libs/enzyme-0.5.2.dist-info/LICENSE new file mode 100644 index 000000000..da9dca7b4 --- /dev/null +++ b/libs/enzyme-0.5.2.dist-info/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2021 Antoine Bertin + +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/libs/enzyme-0.5.2.dist-info/METADATA b/libs/enzyme-0.5.2.dist-info/METADATA new file mode 100644 index 000000000..abe3ac08b --- /dev/null +++ b/libs/enzyme-0.5.2.dist-info/METADATA @@ -0,0 +1,70 @@ +Metadata-Version: 2.1 +Name: enzyme +Version: 0.5.2 +Summary: Video metadata parser +Author-email: Antoine Bertin +Maintainer-email: Antoine Bertin +License: MIT +Project-URL: homepage, https://github.com/Diaoul/enzyme +Project-URL: repository, https://github.com/Diaoul/enzyme +Project-URL: documentation, https://enzyme.readthedocs.org +Keywords: video,metadata,parser,mkv,matroska,ebml +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.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Multimedia :: Video +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: importlib-resources >=4.6 ; python_version == "3.8" +Provides-Extra: dev +Requires-Dist: doc8 ; extra == 'dev' +Requires-Dist: mypy ; extra == 'dev' +Requires-Dist: ruff ; extra == 'dev' +Requires-Dist: typos ; extra == 'dev' +Requires-Dist: validate-pyproject ; extra == 'dev' +Requires-Dist: tox ; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: sphinx-rtd-theme ; extra == 'docs' +Requires-Dist: myst-parser ; extra == 'docs' +Provides-Extra: test +Requires-Dist: PyYAML ; extra == 'test' +Requires-Dist: requests ; extra == 'test' +Requires-Dist: mypy ; extra == 'test' +Requires-Dist: pytest >=6.0 ; extra == 'test' +Requires-Dist: importlib-metadata >=4.6 ; (python_version < "3.10") and extra == 'test' + +# Enzyme + +Enzyme is a Python module to parse video metadata. + +## Usage + +Parse a MKV file metadata: + +```python +>>> import enzyme +>>> with open('example.mkv', 'rb') as f: +... mkv = enzyme.MKV(f) +... +>>> mkv.info + +>>> mkv.video_tracks +[] +>>> mkv.audio_tracks +[] +``` + +## License + +Enzyme is licensed under the MIT license. diff --git a/libs/enzyme-0.5.2.dist-info/RECORD b/libs/enzyme-0.5.2.dist-info/RECORD new file mode 100644 index 000000000..2b02eed08 --- /dev/null +++ b/libs/enzyme-0.5.2.dist-info/RECORD @@ -0,0 +1,15 @@ +enzyme-0.5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +enzyme-0.5.2.dist-info/LICENSE,sha256=29cmv2ez8aYybOYLMMZOC5ZiKtX4sBZTJ4nKINDWdU0,1072 +enzyme-0.5.2.dist-info/METADATA,sha256=JA_WEchw6yhLjGeVCf9SJUb9KDl4PPFKNE4Sf92wKrM,2464 +enzyme-0.5.2.dist-info/RECORD,, +enzyme-0.5.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +enzyme-0.5.2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +enzyme-0.5.2.dist-info/top_level.txt,sha256=ZnBG41c0gHbSzWViydQBVrwPW1GOY1yM8gJ4dykf98A,7 +enzyme/__init__.py,sha256=rfY7cJy1R3VIwVczd-GBNIWY2EQeldE-FEybuuDIkOU,266 +enzyme/exceptions.py,sha256=FrxTjGmic1OsDVFORgD-Grj2lgyFXYW-EagU3MiJWhg,528 +enzyme/mkv.py,sha256=p3MkwBEuGnDf2agyJL3ULmQV8eUYnhwN4acM-GCwNwA,16977 +enzyme/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +enzyme/parsers/ebml/__init__.py,sha256=aj4Yd1HNy3fV0zVrZV4VPWIYT1320jTW4jR9ALDECJo,43 +enzyme/parsers/ebml/core.py,sha256=6Jv9no2MVArK1FTOGTtrS4LFUU8ou0HdpumvbzoxyNA,10503 +enzyme/parsers/ebml/readers.py,sha256=Ynystq5Ci9Hya_Tk5sdwkw6M0zQr8rAsw9bRTv77jUU,7274 +enzyme/parsers/ebml/specs/matroska.xml,sha256=T6pV24Sz_5cHUr3VMt1Zj1Hzr9K4YqjOyS3alZK9xic,51240 diff --git a/libs/dynaconf-3.2.4.dist-info/REQUESTED b/libs/enzyme-0.5.2.dist-info/REQUESTED similarity index 100% rename from libs/dynaconf-3.2.4.dist-info/REQUESTED rename to libs/enzyme-0.5.2.dist-info/REQUESTED diff --git a/libs/enzyme-0.5.2.dist-info/WHEEL b/libs/enzyme-0.5.2.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/enzyme-0.5.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/enzyme-0.4.1.dist-info/top_level.txt b/libs/enzyme-0.5.2.dist-info/top_level.txt similarity index 100% rename from libs/enzyme-0.4.1.dist-info/top_level.txt rename to libs/enzyme-0.5.2.dist-info/top_level.txt diff --git a/libs/enzyme/__init__.py b/libs/enzyme/__init__.py index 3bd89f336..09c5bbcdd 100644 --- a/libs/enzyme/__init__.py +++ b/libs/enzyme/__init__.py @@ -1,9 +1,8 @@ -# -*- coding: utf-8 -*- -__title__ = 'enzyme' -__version__ = '0.4.1' -__author__ = 'Antoine Bertin' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2013 Antoine Bertin' +__title__ = "enzyme" +__version__ = "0.5.2" +__author__ = "Antoine Bertin" +__license__ = "MIT" +__copyright__ = "Copyright 2013 Antoine Bertin" import logging from .exceptions import * diff --git a/libs/enzyme/compat.py b/libs/enzyme/compat.py deleted file mode 100644 index 81e3a4c9d..000000000 --- a/libs/enzyme/compat.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -import sys - - -_ver = sys.version_info -is_py3 = _ver[0] == 3 -is_py2 = _ver[0] == 2 - - -if is_py2: - bytes = lambda x: chr(x[0]) # @ReservedAssignment -elif is_py3: - bytes = bytes # @ReservedAssignment diff --git a/libs/enzyme/exceptions.py b/libs/enzyme/exceptions.py index b2252aa47..e7f62a07a 100644 --- a/libs/enzyme/exceptions.py +++ b/libs/enzyme/exceptions.py @@ -1,27 +1,31 @@ -# -*- coding: utf-8 -*- -__all__ = ['Error', 'MalformedMKVError', 'ParserError', 'ReadError', 'SizeError'] +__all__ = ["Error", "MalformedMKVError", "ParserError", "ReadError", "SizeError"] class Error(Exception): """Base class for enzyme exceptions""" + pass class MalformedMKVError(Error): """Wrong or malformed element found""" + pass class ParserError(Error): """Base class for exceptions in parsers""" + pass class ReadError(ParserError): """Unable to correctly read""" + pass class SizeError(ParserError): """Mismatch between the type of the element and the size of its data""" + pass diff --git a/libs/enzyme/mkv.py b/libs/enzyme/mkv.py index 9dbce9bce..88c1a37ae 100644 --- a/libs/enzyme/mkv.py +++ b/libs/enzyme/mkv.py @@ -1,12 +1,23 @@ -# -*- coding: utf-8 -*- from .exceptions import ParserError, MalformedMKVError from .parsers import ebml from datetime import timedelta import logging -__all__ = ['VIDEO_TRACK', 'AUDIO_TRACK', 'SUBTITLE_TRACK', 'MKV', 'Info', 'Track', 'VideoTrack', - 'AudioTrack', 'SubtitleTrack', 'Tag', 'SimpleTag', 'Chapter'] +__all__ = [ + "VIDEO_TRACK", + "AUDIO_TRACK", + "SUBTITLE_TRACK", + "MKV", + "Info", + "Track", + "VideoTrack", + "AudioTrack", + "SubtitleTrack", + "Tag", + "SimpleTag", + "Chapter", +] logger = logging.getLogger(__name__) @@ -14,12 +25,13 @@ VIDEO_TRACK, AUDIO_TRACK, SUBTITLE_TRACK = 0x01, 0x02, 0x11 -class MKV(object): +class MKV: """Matroska Video file :param stream: seekable file-like object """ + def __init__(self, stream, recurse_seek_head=False): # default attributes self.info = None @@ -35,73 +47,111 @@ def __init__(self, stream, recurse_seek_head=False): try: # get the Segment element - logger.info('Reading Segment element') + logger.info("Reading Segment element") specs = ebml.get_matroska_specs() - segments = ebml.parse(stream, specs, ignore_element_names=['EBML'], max_level=0) + segments = ebml.parse(stream, specs, ignore_element_names=["EBML"], max_level=0) if not segments: - raise MalformedMKVError('No Segment found') + raise MalformedMKVError("No Segment found") if len(segments) > 1: - logger.warning('%d segments found, using the first one', len(segments)) + logger.warning("%d segments found, using the first one", len(segments)) segment = segments[0] # get and recursively parse the SeekHead element - logger.info('Reading SeekHead element') + logger.info("Reading SeekHead element") stream.seek(segment.position) seek_head = ebml.parse_element(stream, specs) - if seek_head.name != 'SeekHead': - raise MalformedMKVError('No SeekHead found') - seek_head.load(stream, specs, ignore_element_names=['Void', 'CRC-32']) + if seek_head.name != "SeekHead": + raise MalformedMKVError("No SeekHead found") + seek_head.load(stream, specs, ignore_element_names=["Void", "CRC-32"]) self._parse_seekhead(seek_head, segment, stream, specs) except ParserError as e: - raise MalformedMKVError('Parsing error: %s' % e) + raise MalformedMKVError("Parsing error: %s" % e) def _parse_seekhead(self, seek_head, segment, stream, specs): for seek in seek_head: - element_id = ebml.read_element_id(seek['SeekID'].data) + element_id = ebml.read_element_id(seek["SeekID"].data) element_name = specs[element_id][1] - element_position = seek['SeekPosition'].data + segment.position + element_position = seek["SeekPosition"].data + segment.position if element_position in self._parsed_positions: - logger.warning('Skipping already parsed %s element at position %d', element_name, element_position) + logger.warning("Skipping already parsed %s element at position %d", element_name, element_position) continue - if element_name == 'Info': - logger.info('Processing element %s from SeekHead at position %d', element_name, element_position) + if element_name == "Info": + logger.info("Processing element %s from SeekHead at position %d", element_name, element_position) stream.seek(element_position) - self.info = Info.fromelement(ebml.parse_element(stream, specs, True, ignore_element_names=['Void', 'CRC-32'])) - elif element_name == 'Tracks': - logger.info('Processing element %s from SeekHead at position %d', element_name, element_position) + self.info = Info.fromelement( + ebml.parse_element(stream, specs, True, ignore_element_names=["Void", "CRC-32"]) + ) + elif element_name == "Tracks": + logger.info("Processing element %s from SeekHead at position %d", element_name, element_position) stream.seek(element_position) - tracks = ebml.parse_element(stream, specs, True, ignore_element_names=['Void', 'CRC-32']) - self.video_tracks.extend([VideoTrack.fromelement(t) for t in tracks if t['TrackType'].data == VIDEO_TRACK]) - self.audio_tracks.extend([AudioTrack.fromelement(t) for t in tracks if t['TrackType'].data == AUDIO_TRACK]) - self.subtitle_tracks.extend([SubtitleTrack.fromelement(t) for t in tracks if t['TrackType'].data == SUBTITLE_TRACK]) - elif element_name == 'Chapters': - logger.info('Processing element %s from SeekHead at position %d', element_name, element_position) + tracks = ebml.parse_element(stream, specs, True, ignore_element_names=["Void", "CRC-32"]) + self.video_tracks.extend( + [VideoTrack.fromelement(t) for t in tracks if t["TrackType"].data == VIDEO_TRACK] + ) + self.audio_tracks.extend( + [AudioTrack.fromelement(t) for t in tracks if t["TrackType"].data == AUDIO_TRACK] + ) + self.subtitle_tracks.extend( + [SubtitleTrack.fromelement(t) for t in tracks if t["TrackType"].data == SUBTITLE_TRACK] + ) + elif element_name == "Chapters": + logger.info("Processing element %s from SeekHead at position %d", element_name, element_position) stream.seek(element_position) - self.chapters.extend([Chapter.fromelement(c) for c in ebml.parse_element(stream, specs, True, ignore_element_names=['Void', 'CRC-32'])[0] if c.name == 'ChapterAtom']) - elif element_name == 'Tags': - logger.info('Processing element %s from SeekHead at position %d', element_name, element_position) + self.chapters.extend( + [ + Chapter.fromelement(c) + for c in ebml.parse_element(stream, specs, True, ignore_element_names=["Void", "CRC-32"])[0] + if c.name == "ChapterAtom" + ] + ) + elif element_name == "Tags": + logger.info("Processing element %s from SeekHead at position %d", element_name, element_position) stream.seek(element_position) - self.tags.extend([Tag.fromelement(t) for t in ebml.parse_element(stream, specs, True, ignore_element_names=['Void', 'CRC-32'])]) - elif element_name == 'SeekHead' and self.recurse_seek_head: - logger.info('Processing element %s from SeekHead at position %d', element_name, element_position) + self.tags.extend( + [ + Tag.fromelement(t) + for t in ebml.parse_element(stream, specs, True, ignore_element_names=["Void", "CRC-32"]) + ] + ) + elif element_name == "SeekHead" and self.recurse_seek_head: + logger.info("Processing element %s from SeekHead at position %d", element_name, element_position) stream.seek(element_position) - self._parse_seekhead(ebml.parse_element(stream, specs, True, ignore_element_names=['Void', 'CRC-32']), segment, stream, specs) + self._parse_seekhead( + ebml.parse_element(stream, specs, True, ignore_element_names=["Void", "CRC-32"]), + segment, + stream, + specs, + ) else: - logger.debug('Element %s ignored', element_name) + logger.debug("Element %s ignored", element_name) self._parsed_positions.add(element_position) def to_dict(self): - return {'info': self.info.__dict__, 'video_tracks': [t.__dict__ for t in self.video_tracks], - 'audio_tracks': [t.__dict__ for t in self.audio_tracks], 'subtitle_tracks': [t.__dict__ for t in self.subtitle_tracks], - 'chapters': [c.__dict__ for c in self.chapters], 'tags': [t.__dict__ for t in self.tags]} + return { + "info": self.info.__dict__, + "video_tracks": [t.__dict__ for t in self.video_tracks], + "audio_tracks": [t.__dict__ for t in self.audio_tracks], + "subtitle_tracks": [t.__dict__ for t in self.subtitle_tracks], + "chapters": [c.__dict__ for c in self.chapters], + "tags": [t.__dict__ for t in self.tags], + } def __repr__(self): - return '<%s [%r, %r, %r, %r]>' % (self.__class__.__name__, self.info, self.video_tracks, self.audio_tracks, self.subtitle_tracks) + return "<%s [%r, %r, %r, %r]>" % ( + self.__class__.__name__, + self.info, + self.video_tracks, + self.audio_tracks, + self.subtitle_tracks, + ) -class Info(object): +class Info: """Object for the Info EBML element""" - def __init__(self, title=None, duration=None, date_utc=None, timecode_scale=None, muxing_app=None, writing_app=None): + + def __init__( + self, title=None, duration=None, date_utc=None, timecode_scale=None, muxing_app=None, writing_app=None + ): self.title = title self.duration = timedelta(microseconds=duration * (timecode_scale or 1000000) // 1000) if duration else None self.date_utc = date_utc @@ -116,25 +166,42 @@ def fromelement(cls, element): :type element: :class:`~enzyme.parsers.ebml.Element` """ - title = element.get('Title') - duration = element.get('Duration') - date_utc = element.get('DateUTC') - timecode_scale = element.get('TimecodeScale') - muxing_app = element.get('MuxingApp') - writing_app = element.get('WritingApp') + title = element.get("Title") + duration = element.get("Duration") + date_utc = element.get("DateUTC") + timecode_scale = element.get("TimecodeScale") + muxing_app = element.get("MuxingApp") + writing_app = element.get("WritingApp") return cls(title, duration, date_utc, timecode_scale, muxing_app, writing_app) def __repr__(self): - return '<%s [title=%r, duration=%s, date=%s]>' % (self.__class__.__name__, self.title, self.duration, self.date_utc) + return "<%s [title=%r, duration=%s, date=%s]>" % ( + self.__class__.__name__, + self.title, + self.duration, + self.date_utc, + ) def __str__(self): return repr(self.__dict__) -class Track(object): +class Track: """Base object for the Tracks EBML element""" - def __init__(self, type=None, number=None, name=None, language=None, enabled=None, default=None, forced=None, lacing=None, # @ReservedAssignment - codec_id=None, codec_name=None): + + def __init__( + self, + type=None, + number=None, + name=None, + language=None, + enabled=None, + default=None, + forced=None, + lacing=None, # @ReservedAssignment + codec_id=None, + codec_name=None, + ): self.type = type self.number = number self.name = name @@ -154,21 +221,31 @@ def fromelement(cls, element): :type element: :class:`~enzyme.parsers.ebml.Element` """ - type = element.get('TrackType') # @ReservedAssignment - number = element.get('TrackNumber', 0) - name = element.get('Name') - language = element.get('Language') - enabled = bool(element.get('FlagEnabled', 1)) - default = bool(element.get('FlagDefault', 1)) - forced = bool(element.get('FlagForced', 0)) - lacing = bool(element.get('FlagLacing', 1)) - codec_id = element.get('CodecID') - codec_name = element.get('CodecName') - return cls(type=type, number=number, name=name, language=language, enabled=enabled, default=default, - forced=forced, lacing=lacing, codec_id=codec_id, codec_name=codec_name) + type = element.get("TrackType") # @ReservedAssignment + number = element.get("TrackNumber", 0) + name = element.get("Name") + language = element.get("Language") + enabled = bool(element.get("FlagEnabled", 1)) + default = bool(element.get("FlagDefault", 1)) + forced = bool(element.get("FlagForced", 0)) + lacing = bool(element.get("FlagLacing", 1)) + codec_id = element.get("CodecID") + codec_name = element.get("CodecName") + return cls( + type=type, + number=number, + name=name, + language=language, + enabled=enabled, + default=default, + forced=forced, + lacing=lacing, + codec_id=codec_id, + codec_name=codec_name, + ) def __repr__(self): - return '<%s [%d, name=%r, language=%s]>' % (self.__class__.__name__, self.number, self.name, self.language) + return "<%s [%d, name=%r, language=%s]>" % (self.__class__.__name__, self.number, self.name, self.language) def __str__(self): return str(self.__dict__) @@ -176,8 +253,20 @@ def __str__(self): class VideoTrack(Track): """Object for the Tracks EBML element with :data:`VIDEO_TRACK` TrackType""" - def __init__(self, width=0, height=0, interlaced=False, stereo_mode=None, crop=None, - display_width=None, display_height=None, display_unit=None, aspect_ratio_type=None, **kwargs): + + def __init__( + self, + width=0, + height=0, + interlaced=False, + stereo_mode=None, + crop=None, + display_width=None, + display_height=None, + display_unit=None, + aspect_ratio_type=None, + **kwargs, + ): super(VideoTrack, self).__init__(**kwargs) self.width = width self.height = height @@ -198,28 +287,35 @@ def fromelement(cls, element): """ videotrack = super(VideoTrack, cls).fromelement(element) - videotrack.width = element['Video'].get('PixelWidth', 0) - videotrack.height = element['Video'].get('PixelHeight', 0) - videotrack.interlaced = bool(element['Video'].get('FlagInterlaced', False)) - videotrack.stereo_mode = element['Video'].get('StereoMode') + videotrack.width = element["Video"].get("PixelWidth", 0) + videotrack.height = element["Video"].get("PixelHeight", 0) + videotrack.interlaced = bool(element["Video"].get("FlagInterlaced", False)) + videotrack.stereo_mode = element["Video"].get("StereoMode") videotrack.crop = {} - if 'PixelCropTop' in element['Video']: - videotrack.crop['top'] = element['Video']['PixelCropTop'] - if 'PixelCropBottom' in element['Video']: - videotrack.crop['bottom'] = element['Video']['PixelCropBottom'] - if 'PixelCropLeft' in element['Video']: - videotrack.crop['left'] = element['Video']['PixelCropLeft'] - if 'PixelCropRight' in element['Video']: - videotrack.crop['right'] = element['Video']['PixelCropRight'] - videotrack.display_width = element['Video'].get('DisplayWidth') - videotrack.display_height = element['Video'].get('DisplayHeight') - videotrack.display_unit = element['Video'].get('DisplayUnit') - videotrack.aspect_ratio_type = element['Video'].get('AspectRatioType') + if "PixelCropTop" in element["Video"]: + videotrack.crop["top"] = element["Video"]["PixelCropTop"] + if "PixelCropBottom" in element["Video"]: + videotrack.crop["bottom"] = element["Video"]["PixelCropBottom"] + if "PixelCropLeft" in element["Video"]: + videotrack.crop["left"] = element["Video"]["PixelCropLeft"] + if "PixelCropRight" in element["Video"]: + videotrack.crop["right"] = element["Video"]["PixelCropRight"] + videotrack.display_width = element["Video"].get("DisplayWidth") + videotrack.display_height = element["Video"].get("DisplayHeight") + videotrack.display_unit = element["Video"].get("DisplayUnit") + videotrack.aspect_ratio_type = element["Video"].get("AspectRatioType") return videotrack def __repr__(self): - return '<%s [%d, %dx%d, %s, name=%r, language=%s]>' % (self.__class__.__name__, self.number, self.width, self.height, - self.codec_id, self.name, self.language) + return "<%s [%d, %dx%d, %s, name=%r, language=%s]>" % ( + self.__class__.__name__, + self.number, + self.width, + self.height, + self.codec_id, + self.name, + self.language, + ) def __str__(self): return str(self.__dict__) @@ -227,7 +323,10 @@ def __str__(self): class AudioTrack(Track): """Object for the Tracks EBML element with :data:`AUDIO_TRACK` TrackType""" - def __init__(self, sampling_frequency=None, channels=None, output_sampling_frequency=None, bit_depth=None, **kwargs): + + def __init__( + self, sampling_frequency=None, channels=None, output_sampling_frequency=None, bit_depth=None, **kwargs + ): super(AudioTrack, self).__init__(**kwargs) self.sampling_frequency = sampling_frequency self.channels = channels @@ -243,24 +342,33 @@ def fromelement(cls, element): """ audiotrack = super(AudioTrack, cls).fromelement(element) - audiotrack.sampling_frequency = element['Audio'].get('SamplingFrequency', 8000.0) - audiotrack.channels = element['Audio'].get('Channels', 1) - audiotrack.output_sampling_frequency = element['Audio'].get('OutputSamplingFrequency') - audiotrack.bit_depth = element['Audio'].get('BitDepth') + audiotrack.sampling_frequency = element["Audio"].get("SamplingFrequency", 8000.0) + audiotrack.channels = element["Audio"].get("Channels", 1) + audiotrack.output_sampling_frequency = element["Audio"].get("OutputSamplingFrequency") + audiotrack.bit_depth = element["Audio"].get("BitDepth") return audiotrack def __repr__(self): - return '<%s [%d, %d channel(s), %.0fHz, %s, name=%r, language=%s]>' % (self.__class__.__name__, self.number, self.channels, - self.sampling_frequency, self.codec_id, self.name, self.language) + return "<%s [%d, %d channel(s), %.0fHz, %s, name=%r, language=%s]>" % ( + self.__class__.__name__, + self.number, + self.channels, + self.sampling_frequency, + self.codec_id, + self.name, + self.language, + ) class SubtitleTrack(Track): """Object for the Tracks EBML element with :data:`SUBTITLE_TRACK` TrackType""" + pass -class Tag(object): +class Tag: """Object for the Tag EBML element""" + def __init__(self, targets=None, simpletags=None): self.targets = targets if targets is not None else [] self.simpletags = simpletags if simpletags is not None else [] @@ -273,17 +381,18 @@ def fromelement(cls, element): :type element: :class:`~enzyme.parsers.ebml.Element` """ - targets = element['Targets'] if 'Targets' in element else [] - simpletags = [SimpleTag.fromelement(s) for s in element if s.name == 'SimpleTag'] + targets = element["Targets"] if "Targets" in element else [] + simpletags = [SimpleTag.fromelement(s) for s in element if s.name == "SimpleTag"] return cls(targets, simpletags) def __repr__(self): - return '<%s [targets=%r, simpletags=%r]>' % (self.__class__.__name__, self.targets, self.simpletags) + return "<%s [targets=%r, simpletags=%r]>" % (self.__class__.__name__, self.targets, self.simpletags) -class SimpleTag(object): +class SimpleTag: """Object for the SimpleTag EBML element""" - def __init__(self, name, language='und', default=True, string=None, binary=None): + + def __init__(self, name, language="und", default=True, string=None, binary=None): self.name = name self.language = language self.default = default @@ -298,18 +407,24 @@ def fromelement(cls, element): :type element: :class:`~enzyme.parsers.ebml.Element` """ - name = element.get('TagName') - language = element.get('TagLanguage', 'und') - default = element.get('TagDefault', True) - string = element.get('TagString') - binary = element.get('TagBinary') + name = element.get("TagName") + language = element.get("TagLanguage", "und") + default = element.get("TagDefault", True) + string = element.get("TagString") + binary = element.get("TagBinary") return cls(name, language, default, string, binary) def __repr__(self): - return '<%s [%s, language=%s, default=%s, string=%s]>' % (self.__class__.__name__, self.name, self.language, self.default, self.string) + return "<%s [%s, language=%s, default=%s, string=%s]>" % ( + self.__class__.__name__, + self.name, + self.language, + self.default, + self.string, + ) -class Chapter(object): +class Chapter: """Object for the ChapterAtom and ChapterDisplay EBML element .. note:: @@ -318,6 +433,7 @@ class Chapter(object): are merged into the :class:`Chapter` """ + def __init__(self, start, hidden=False, enabled=False, end=None, string=None, language=None): self.start = start self.hidden = hidden @@ -334,18 +450,20 @@ def fromelement(cls, element): :type element: :class:`~enzyme.parsers.ebml.Element` """ - start = timedelta(microseconds=element.get('ChapterTimeStart') // 1000) - hidden = element.get('ChapterFlagHidden', False) - enabled = element.get('ChapterFlagEnabled', True) - end = element.get('ChapterTimeEnd') - chapterdisplays = [c for c in element if c.name == 'ChapterDisplay'] + start = timedelta(microseconds=element.get("ChapterTimeStart") // 1000) + hidden = element.get("ChapterFlagHidden", False) + enabled = element.get("ChapterFlagEnabled", True) + end = element.get("ChapterTimeEnd") + chapterdisplays = [c for c in element if c.name == "ChapterDisplay"] if len(chapterdisplays) > 1: - logger.warning('More than 1 (%d) ChapterDisplay element in the ChapterAtom, using the first one', len(chapterdisplays)) + logger.warning( + "More than 1 (%d) ChapterDisplay element in the ChapterAtom, using the first one", len(chapterdisplays) + ) if chapterdisplays: - string = chapterdisplays[0].get('ChapString') - language = chapterdisplays[0].get('ChapLanguage') + string = chapterdisplays[0].get("ChapString") + language = chapterdisplays[0].get("ChapLanguage") return cls(start, hidden, enabled, end, string, language) return cls(start, hidden, enabled, end) def __repr__(self): - return '<%s [%s, enabled=%s]>' % (self.__class__.__name__, self.start, self.enabled) + return "<%s [%s, enabled=%s]>" % (self.__class__.__name__, self.start, self.enabled) diff --git a/libs/enzyme/parsers/__init__.py b/libs/enzyme/parsers/__init__.py index 40a96afc6..e69de29bb 100644 --- a/libs/enzyme/parsers/__init__.py +++ b/libs/enzyme/parsers/__init__.py @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/libs/enzyme/parsers/ebml/__init__.py b/libs/enzyme/parsers/ebml/__init__.py index 04219f8c3..1097fabbb 100644 --- a/libs/enzyme/parsers/ebml/__init__.py +++ b/libs/enzyme/parsers/ebml/__init__.py @@ -1,3 +1,2 @@ -# -*- coding: utf-8 -*- from .core import * from .readers import * diff --git a/libs/enzyme/parsers/ebml/core.py b/libs/enzyme/parsers/ebml/core.py index ae025ac73..9c25abe42 100644 --- a/libs/enzyme/parsers/ebml/core.py +++ b/libs/enzyme/parsers/ebml/core.py @@ -1,14 +1,30 @@ -# -*- coding: utf-8 -*- from ...exceptions import ReadError from .readers import * -from pkg_resources import resource_stream # @UnresolvedImport from xml.dom import minidom import logging - -__all__ = ['INTEGER', 'UINTEGER', 'FLOAT', 'STRING', 'UNICODE', 'DATE', 'MASTER', 'BINARY', - 'SPEC_TYPES', 'READERS', 'Element', 'MasterElement', 'parse', 'parse_element', - 'get_matroska_specs'] +try: + from importlib.resources import files +except ImportError: + from importlib_resources import files # type: ignore[assignment,no-redef,import-not-found] + +__all__ = [ + "INTEGER", + "UINTEGER", + "FLOAT", + "STRING", + "UNICODE", + "DATE", + "MASTER", + "BINARY", + "SPEC_TYPES", + "READERS", + "Element", + "MasterElement", + "parse", + "parse_element", + "get_matroska_specs", +] logger = logging.getLogger(__name__) @@ -17,14 +33,14 @@ # Spec types to EBML types mapping SPEC_TYPES = { - 'integer': INTEGER, - 'uinteger': UINTEGER, - 'float': FLOAT, - 'string': STRING, - 'utf-8': UNICODE, - 'date': DATE, - 'master': MASTER, - 'binary': BINARY + "integer": INTEGER, + "uinteger": UINTEGER, + "float": FLOAT, + "string": STRING, + "utf-8": UNICODE, + "date": DATE, + "master": MASTER, + "binary": BINARY, } # Readers to use per EBML type @@ -35,11 +51,11 @@ STRING: read_element_string, UNICODE: read_element_unicode, DATE: read_element_date, - BINARY: read_element_binary + BINARY: read_element_binary, } -class Element(object): +class Element: """Base object of EBML :param int id: id of the element, best represented as hexadecimal (0x18538067 for Matroska Segment element) @@ -52,7 +68,10 @@ class Element(object): :param data: data as read by the corresponding :data:`READERS` """ - def __init__(self, id=None, type=None, name=None, level=None, position=None, size=None, data=None): # @ReservedAssignment + + def __init__( + self, id=None, type=None, name=None, level=None, position=None, size=None, data=None + ): # @ReservedAssignment self.id = id self.type = type self.name = name @@ -62,7 +81,7 @@ def __init__(self, id=None, type=None, name=None, level=None, position=None, siz self.data = data def __repr__(self): - return '<%s [%s, %r]>' % (self.__class__.__name__, self.name, self.data) + return "<%s [%s, %r]>" % (self.__class__.__name__, self.name, self.data) class MasterElement(Element): @@ -89,6 +108,7 @@ class MasterElement(Element): Element(DocType, u'matroska') """ + def __init__(self, id=None, name=None, level=None, position=None, size=None, data=None): # @ReservedAssignment super(MasterElement, self).__init__(id, MASTER, name, level, position, size, data) @@ -118,7 +138,7 @@ def get(self, name, default=None): return default element = self[name] if element.type == MASTER: - raise ValueError('%s is a MasterElement' % name) + raise ValueError("%s is a MasterElement" % name) return element.data def __getitem__(self, key): @@ -128,7 +148,7 @@ def __getitem__(self, key): if not children: raise KeyError(key) if len(children) > 1: - raise KeyError('More than 1 child with key %s (%d)' % (key, len(children))) + raise KeyError("More than 1 child with key %s (%d)" % (key, len(children))) return children[0] def __contains__(self, item): @@ -165,19 +185,31 @@ def parse(stream, specs, size=None, ignore_element_types=None, ignore_element_na element = parse_element(stream, specs) if element is None: continue - logger.debug('%s %s parsed', element.__class__.__name__, element.name) + logger.debug("%s %s parsed", element.__class__.__name__, element.name) if element.type in ignore_element_types or element.name in ignore_element_names: - logger.info('%s %s ignored', element.__class__.__name__, element.name) + logger.info("%s %s ignored", element.__class__.__name__, element.name) if element.type == MASTER: stream.seek(element.size, 1) continue if element.type == MASTER: if max_level is not None and element.level >= max_level: - logger.info('Maximum level %d reached for children of %s %s', max_level, element.__class__.__name__, element.name) + logger.info( + "Maximum level %d reached for children of %s %s", + max_level, + element.__class__.__name__, + element.name, + ) stream.seek(element.size, 1) else: - logger.debug('Loading child elements for %s %s with size %d', element.__class__.__name__, element.name, element.size) - element.data = parse(stream, specs, element.size, ignore_element_types, ignore_element_names, max_level) + logger.debug( + "Loading child elements for %s %s with size %d", + element.__class__.__name__, + element.name, + element.size, + ) + element.data = parse( + stream, specs, element.size, ignore_element_types, ignore_element_names, max_level + ) elements.append(element) except ReadError: if size is not None: @@ -186,7 +218,9 @@ def parse(stream, specs, size=None, ignore_element_types=None, ignore_element_na return elements -def parse_element(stream, specs, load_children=False, ignore_element_types=None, ignore_element_names=None, max_level=None): +def parse_element( + stream, specs, load_children=False, ignore_element_types=None, ignore_element_names=None, max_level=None +): """Extract a single :class:`Element` from the `stream` according to the `specs` :param stream: file-like object from which to read @@ -203,12 +237,12 @@ def parse_element(stream, specs, load_children=False, ignore_element_types=None, ignore_element_names = ignore_element_names if ignore_element_names is not None else [] element_id = read_element_id(stream) if element_id is None: - raise ReadError('Cannot read element id') + raise ReadError("Cannot read element id") element_size = read_element_size(stream) if element_size is None: - raise ReadError('Cannot read element size') + raise ReadError("Cannot read element size") if element_id not in specs: - logger.error('Element with id 0x%x is not in the specs' % element_id) + logger.error("Element with id 0x%x is not in the specs" % element_id) stream.seek(element_size, 1) return None element_type, element_name, element_level = specs[element_id] @@ -231,9 +265,14 @@ def get_matroska_specs(webm_only=False): """ specs = {} - with resource_stream(__name__, 'specs/matroska.xml') as resource: + spec_file = files(__package__).joinpath("specs", "matroska.xml") + with spec_file.open("rb") as resource: xmldoc = minidom.parse(resource) - for element in xmldoc.getElementsByTagName('element'): - if not webm_only or element.hasAttribute('webm') and element.getAttribute('webm') == '1': - specs[int(element.getAttribute('id'), 16)] = (SPEC_TYPES[element.getAttribute('type')], element.getAttribute('name'), int(element.getAttribute('level'))) + for element in xmldoc.getElementsByTagName("element"): + if not webm_only or element.hasAttribute("webm") and element.getAttribute("webm") == "1": + specs[int(element.getAttribute("id"), 16)] = ( + SPEC_TYPES[element.getAttribute("type")], + element.getAttribute("name"), + int(element.getAttribute("level")), + ) return specs diff --git a/libs/enzyme/parsers/ebml/readers.py b/libs/enzyme/parsers/ebml/readers.py index 3c9709b77..c4153805b 100644 --- a/libs/enzyme/parsers/ebml/readers.py +++ b/libs/enzyme/parsers/ebml/readers.py @@ -1,14 +1,20 @@ -# -*- coding: utf-8 -*- -from ...compat import bytes from ...exceptions import ReadError, SizeError from datetime import datetime, timedelta from io import BytesIO from struct import unpack -__all__ = ['read_element_id', 'read_element_size', 'read_element_integer', 'read_element_uinteger', - 'read_element_float', 'read_element_string', 'read_element_unicode', 'read_element_date', - 'read_element_binary'] +__all__ = [ + "read_element_id", + "read_element_size", + "read_element_integer", + "read_element_uinteger", + "read_element_float", + "read_element_string", + "read_element_unicode", + "read_element_date", + "read_element_binary", +] def _read(stream, size): @@ -24,7 +30,7 @@ def _read(stream, size): """ data = stream.read(size) if len(data) < size: - raise ReadError('Less than %d bytes read (%d)' % (size, len(data))) + raise ReadError("Less than %d bytes read (%d)" % (size, len(data))) return data @@ -42,14 +48,14 @@ def read_element_id(stream): if byte & 0x80: return byte elif byte & 0x40: - return unpack('>H', char + _read(stream, 1))[0] + return unpack(">H", char + _read(stream, 1))[0] elif byte & 0x20: - b, h = unpack('>BH', char + _read(stream, 2)) - return b * 2 ** 16 + h + b, h = unpack(">BH", char + _read(stream, 2)) + return b * 2**16 + h elif byte & 0x10: - return unpack('>L', char + _read(stream, 3))[0] + return unpack(">L", char + _read(stream, 3))[0] else: - ValueError('Not an Element ID') + ValueError("Not an Element ID") def read_element_size(stream): @@ -64,27 +70,27 @@ def read_element_size(stream): char = _read(stream, 1) byte = ord(char) if byte & 0x80: - return unpack('>B', bytes((byte ^ 0x80,)))[0] + return unpack(">B", bytes((byte ^ 0x80,)))[0] elif byte & 0x40: - return unpack('>H', bytes((byte ^ 0x40,)) + _read(stream, 1))[0] + return unpack(">H", bytes((byte ^ 0x40,)) + _read(stream, 1))[0] elif byte & 0x20: - b, h = unpack('>BH', bytes((byte ^ 0x20,)) + _read(stream, 2)) - return b * 2 ** 16 + h + b, h = unpack(">BH", bytes((byte ^ 0x20,)) + _read(stream, 2)) + return b * 2**16 + h elif byte & 0x10: - return unpack('>L', bytes((byte ^ 0x10,)) + _read(stream, 3))[0] + return unpack(">L", bytes((byte ^ 0x10,)) + _read(stream, 3))[0] elif byte & 0x08: - b, l = unpack('>BL', bytes((byte ^ 0x08,)) + _read(stream, 4)) - return b * 2 ** 32 + l + b, l = unpack(">BL", bytes((byte ^ 0x08,)) + _read(stream, 4)) + return b * 2**32 + l elif byte & 0x04: - h, l = unpack('>HL', bytes((byte ^ 0x04,)) + _read(stream, 5)) - return h * 2 ** 32 + l + h, l = unpack(">HL", bytes((byte ^ 0x04,)) + _read(stream, 5)) + return h * 2**32 + l elif byte & 0x02: - b, h, l = unpack('>BHL', bytes((byte ^ 0x02,)) + _read(stream, 6)) - return b * 2 ** 48 + h * 2 ** 32 + l + b, h, l = unpack(">BHL", bytes((byte ^ 0x02,)) + _read(stream, 6)) + return b * 2**48 + h * 2**32 + l elif byte & 0x01: - return unpack('>Q', bytes((byte ^ 0x01,)) + _read(stream, 7))[0] + return unpack(">Q", bytes((byte ^ 0x01,)) + _read(stream, 7))[0] else: - ValueError('Not an Element Size') + ValueError("Not an Element Size") def read_element_integer(stream, size): @@ -99,25 +105,25 @@ def read_element_integer(stream, size): """ if size == 1: - return unpack('>b', _read(stream, 1))[0] + return unpack(">b", _read(stream, 1))[0] elif size == 2: - return unpack('>h', _read(stream, 2))[0] + return unpack(">h", _read(stream, 2))[0] elif size == 3: - b, h = unpack('>bH', _read(stream, 3)) - return b * 2 ** 16 + h + b, h = unpack(">bH", _read(stream, 3)) + return b * 2**16 + h elif size == 4: - return unpack('>l', _read(stream, 4))[0] + return unpack(">l", _read(stream, 4))[0] elif size == 5: - b, l = unpack('>bL', _read(stream, 5)) - return b * 2 ** 32 + l + b, l = unpack(">bL", _read(stream, 5)) + return b * 2**32 + l elif size == 6: - h, l = unpack('>hL', _read(stream, 6)) - return h * 2 ** 32 + l + h, l = unpack(">hL", _read(stream, 6)) + return h * 2**32 + l elif size == 7: - b, h, l = unpack('>bHL', _read(stream, 7)) - return b * 2 ** 48 + h * 2 ** 32 + l + b, h, l = unpack(">bHL", _read(stream, 7)) + return b * 2**48 + h * 2**32 + l elif size == 8: - return unpack('>q', _read(stream, 8))[0] + return unpack(">q", _read(stream, 8))[0] else: raise SizeError(size) @@ -134,25 +140,25 @@ def read_element_uinteger(stream, size): """ if size == 1: - return unpack('>B', _read(stream, 1))[0] + return unpack(">B", _read(stream, 1))[0] elif size == 2: - return unpack('>H', _read(stream, 2))[0] + return unpack(">H", _read(stream, 2))[0] elif size == 3: - b, h = unpack('>BH', _read(stream, 3)) - return b * 2 ** 16 + h + b, h = unpack(">BH", _read(stream, 3)) + return b * 2**16 + h elif size == 4: - return unpack('>L', _read(stream, 4))[0] + return unpack(">L", _read(stream, 4))[0] elif size == 5: - b, l = unpack('>BL', _read(stream, 5)) - return b * 2 ** 32 + l + b, l = unpack(">BL", _read(stream, 5)) + return b * 2**32 + l elif size == 6: - h, l = unpack('>HL', _read(stream, 6)) - return h * 2 ** 32 + l + h, l = unpack(">HL", _read(stream, 6)) + return h * 2**32 + l elif size == 7: - b, h, l = unpack('>BHL', _read(stream, 7)) - return b * 2 ** 48 + h * 2 ** 32 + l + b, h, l = unpack(">BHL", _read(stream, 7)) + return b * 2**48 + h * 2**32 + l elif size == 8: - return unpack('>Q', _read(stream, 8))[0] + return unpack(">Q", _read(stream, 8))[0] else: raise SizeError(size) @@ -169,9 +175,9 @@ def read_element_float(stream, size): """ if size == 4: - return unpack('>f', _read(stream, 4))[0] + return unpack(">f", _read(stream, 4))[0] elif size == 8: - return unpack('>d', _read(stream, 8))[0] + return unpack(">d", _read(stream, 8))[0] else: raise SizeError(size) @@ -187,7 +193,7 @@ def read_element_string(stream, size): :rtype: unicode """ - return _read(stream, size).decode('ascii') + return _read(stream, size).decode("ascii") def read_element_unicode(stream, size): @@ -201,7 +207,7 @@ def read_element_unicode(stream, size): :rtype: unicode """ - return _read(stream, size).decode('utf-8') + return _read(stream, size).decode("utf-8") def read_element_date(stream, size): @@ -217,7 +223,7 @@ def read_element_date(stream, size): """ if size != 8: raise SizeError(size) - nanoseconds = unpack('>q', _read(stream, 8))[0] + nanoseconds = unpack(">q", _read(stream, 8))[0] return datetime(2001, 1, 1, 0, 0, 0, 0, None) + timedelta(microseconds=nanoseconds // 1000) diff --git a/libs/enzyme/tests/__init__.py b/libs/enzyme/tests/__init__.py deleted file mode 100644 index 426d3598f..000000000 --- a/libs/enzyme/tests/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -from . import test_mkv, test_parsers -import unittest - - -suite = unittest.TestSuite([test_mkv.suite(), test_parsers.suite()]) - - -if __name__ == '__main__': - unittest.TextTestRunner().run(suite) diff --git a/libs/enzyme/tests/parsers/ebml/test1.mkv.yml b/libs/enzyme/tests/parsers/ebml/test1.mkv.yml deleted file mode 100644 index 92642ec5d..000000000 --- a/libs/enzyme/tests/parsers/ebml/test1.mkv.yml +++ /dev/null @@ -1,2974 +0,0 @@ -- - 440786851 - - 6 - - EBML - - 0 - - 5 - - 19 - - - [17026, 3, DocType, 1, 8, 8, matroska] - - [17031, 1, DocTypeVersion, 1, 19, 1, 2] - - [17029, 1, DocTypeReadVersion, 1, 23, 1, 2] -- - 408125543 - - 6 - - Segment - - 0 - - 32 - - 23339305 - - - - 290298740 - - 6 - - SeekHead - - 1 - - 37 - - 59 - - - - 19899 - - 6 - - Seek - - 2 - - 40 - - 11 - - - [21419, 7, SeekID, 3, 43, 4, null] - - [21420, 1, SeekPosition, 3, 50, 1, 64] - - - 19899 - - 6 - - Seek - - 2 - - 54 - - 12 - - - [21419, 7, SeekID, 3, 57, 4, null] - - [21420, 1, SeekPosition, 3, 64, 2, 275] - - - 19899 - - 6 - - Seek - - 2 - - 69 - - 12 - - - [21419, 7, SeekID, 3, 72, 4, null] - - [21420, 1, SeekPosition, 3, 79, 2, 440] - - - 19899 - - 6 - - Seek - - 2 - - 84 - - 12 - - - [21419, 7, SeekID, 3, 87, 4, null] - - [21420, 1, SeekPosition, 3, 94, 2, 602] - - - 357149030 - - 6 - - Info - - 1 - - 102 - - 205 - - - [17545, 2, Duration, 2, 105, 4, 87336.0] - - [19840, 4, MuxingApp, 2, 112, 39, libebml2 v0.10.0 + libmatroska2 v0.10.1] - - [22337, 4, WritingApp, 2, 154, 123, 'mkclean 0.5.5 ru from libebml v1.0.0 - + libmatroska v1.0.0 + mkvmerge v4.1.1 (''Bouncin'' Back'') built on Jul 3 - 2010 22:54:08'] - - [17505, 5, DateUTC, 2, 280, 8, !!timestamp '2010-08-21 07:23:03'] - - [29604, 7, SegmentUID, 2, 291, 16, null] - - - 374648427 - - 6 - - Tracks - - 1 - - 313 - - 159 - - - - 174 - - 6 - - TrackEntry - - 2 - - 315 - - 105 - - - [215, 1, TrackNumber, 3, 317, 1, 1] - - [131, 1, TrackType, 3, 320, 1, 1] - - [134, 3, CodecID, 3, 323, 15, V_MS/VFW/FOURCC] - - [29637, 1, TrackUID, 3, 341, 4, 2422994868] - - [156, 1, FlagLacing, 3, 347, 1, 0] - - [28135, 1, MinCache, 3, 351, 1, 1] - - [25506, 7, CodecPrivate, 3, 355, 40, null] - - [2352003, 1, DefaultDuration, 3, 399, 4, 41666666] - - [2274716, 3, Language, 3, 407, 3, und] - - - 224 - - 6 - - Video - - 3 - - 412 - - 8 - - - [176, 1, PixelWidth, 4, 414, 2, 854] - - [186, 1, PixelHeight, 4, 418, 2, 480] - - - 174 - - 6 - - TrackEntry - - 2 - - 422 - - 50 - - - [215, 1, TrackNumber, 3, 424, 1, 2] - - [131, 1, TrackType, 3, 427, 1, 2] - - [134, 3, CodecID, 3, 430, 9, A_MPEG/L3] - - [29637, 1, TrackUID, 3, 442, 4, 3653291187] - - [2352003, 1, DefaultDuration, 3, 450, 4, 24000000] - - [2274716, 3, Language, 3, 458, 3, und] - - - 225 - - 6 - - Audio - - 3 - - 463 - - 9 - - - [181, 2, SamplingFrequency, 4, 465, 4, 48000.0] - - [159, 1, Channels, 4, 471, 1, 2] - - - 307544935 - - 6 - - Tags - - 1 - - 478 - - 156 - - - - 29555 - - 6 - - Tag - - 2 - - 482 - - 152 - - - - 25536 - - 6 - - Targets - - 3 - - 485 - - 0 - - [] - - - 26568 - - 6 - - SimpleTag - - 3 - - 488 - - 34 - - - [17827, 4, TagName, 4, 491, 5, TITLE] - - [17543, 4, TagString, 4, 499, 23, Big Buck Bunny - test 1] - - - 26568 - - 6 - - SimpleTag - - 3 - - 525 - - 23 - - - [17827, 4, TagName, 4, 528, 13, DATE_RELEASED] - - [17543, 4, TagString, 4, 544, 4, '2010'] - - - 26568 - - 6 - - SimpleTag - - 3 - - 551 - - 83 - - - [17827, 4, TagName, 4, 554, 7, COMMENT] - - [17543, 4, TagString, 4, 564, 70, 'Matroska Validation File1, basic - MPEG4.2 and MP3 with only SimpleBlock'] - - - 475249515 - - 6 - - Cues - - 1 - - 640 - - 163 - - - - 187 - - 6 - - CuePoint - - 2 - - 642 - - 12 - - - [179, 1, CueTime, 3, 644, 1, 0] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 647 - - 7 - - - [247, 1, CueTrack, 4, 649, 1, 1] - - [241, 1, CueClusterPosition, 4, 652, 2, 771] - - - 187 - - 6 - - CuePoint - - 2 - - 656 - - 14 - - - [179, 1, CueTime, 3, 658, 2, 1042] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 662 - - 8 - - - [247, 1, CueTrack, 4, 664, 1, 1] - - [241, 1, CueClusterPosition, 4, 667, 3, 145582] - - - 187 - - 6 - - CuePoint - - 2 - - 672 - - 14 - - - [179, 1, CueTime, 3, 674, 2, 11667] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 678 - - 8 - - - [247, 1, CueTrack, 4, 680, 1, 1] - - [241, 1, CueClusterPosition, 4, 683, 3, 3131552] - - - 187 - - 6 - - CuePoint - - 2 - - 688 - - 14 - - - [179, 1, CueTime, 3, 690, 2, 22083] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 694 - - 8 - - - [247, 1, CueTrack, 4, 696, 1, 1] - - [241, 1, CueClusterPosition, 4, 699, 3, 5654336] - - - 187 - - 6 - - CuePoint - - 2 - - 704 - - 14 - - - [179, 1, CueTime, 3, 706, 2, 32500] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 710 - - 8 - - - [247, 1, CueTrack, 4, 712, 1, 1] - - [241, 1, CueClusterPosition, 4, 715, 3, 9696374] - - - 187 - - 6 - - CuePoint - - 2 - - 720 - - 14 - - - [179, 1, CueTime, 3, 722, 2, 42917] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 726 - - 8 - - - [247, 1, CueTrack, 4, 728, 1, 1] - - [241, 1, CueClusterPosition, 4, 731, 3, 13440514] - - - 187 - - 6 - - CuePoint - - 2 - - 736 - - 14 - - - [179, 1, CueTime, 3, 738, 2, 53333] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 742 - - 8 - - - [247, 1, CueTrack, 4, 744, 1, 1] - - [241, 1, CueClusterPosition, 4, 747, 3, 16690071] - - - 187 - - 6 - - CuePoint - - 2 - - 752 - - 15 - - - [179, 1, CueTime, 3, 754, 2, 56083] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 758 - - 9 - - - [247, 1, CueTrack, 4, 760, 1, 1] - - [241, 1, CueClusterPosition, 4, 763, 4, 17468879] - - - 187 - - 6 - - CuePoint - - 2 - - 769 - - 16 - - - [179, 1, CueTime, 3, 771, 3, 66500] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 776 - - 9 - - - [247, 1, CueTrack, 4, 778, 1, 1] - - [241, 1, CueClusterPosition, 4, 781, 4, 18628759] - - - 187 - - 6 - - CuePoint - - 2 - - 787 - - 16 - - - [179, 1, CueTime, 3, 789, 3, 76917] - - - 183 - - 6 - - CueTrackPositions - - 3 - - 794 - - 9 - - - [247, 1, CueTrack, 4, 796, 1, 1] - - [241, 1, CueClusterPosition, 4, 799, 4, 20732433] - - - 524531317 - - 6 - - Cluster - - 1 - - 810 - - 144804 - - - [231, 1, Timecode, 2, 812, 1, 0] - - [163, 7, SimpleBlock, 2, 816, 5008, null] - - [163, 7, SimpleBlock, 2, 5827, 4464, null] - - [163, 7, SimpleBlock, 2, 10294, 303, null] - - [163, 7, SimpleBlock, 2, 10600, 303, null] - - [163, 7, SimpleBlock, 2, 10906, 208, null] - - [163, 7, SimpleBlock, 2, 11117, 676, null] - - [163, 7, SimpleBlock, 2, 11796, 2465, null] - - [163, 7, SimpleBlock, 2, 14264, 2794, null] - - [163, 7, SimpleBlock, 2, 17061, 4486, null] - - [163, 7, SimpleBlock, 2, 21550, 4966, null] - - [163, 7, SimpleBlock, 2, 26519, 580, null] - - [163, 7, SimpleBlock, 2, 27102, 4476, null] - - [163, 7, SimpleBlock, 2, 31581, 3077, null] - - [163, 7, SimpleBlock, 2, 34661, 4485, null] - - [163, 7, SimpleBlock, 2, 39149, 5117, null] - - [163, 7, SimpleBlock, 2, 44269, 1639, null] - - [163, 7, SimpleBlock, 2, 45911, 4521, null] - - [163, 7, SimpleBlock, 2, 50435, 772, null] - - [163, 7, SimpleBlock, 2, 51210, 4543, null] - - [163, 7, SimpleBlock, 2, 55756, 3371, null] - - [163, 7, SimpleBlock, 2, 59130, 4602, null] - - [163, 7, SimpleBlock, 2, 63735, 5427, null] - - [163, 7, SimpleBlock, 2, 69165, 1735, null] - - [163, 7, SimpleBlock, 2, 70903, 4790, null] - - [163, 7, SimpleBlock, 2, 75696, 772, null] - - [163, 7, SimpleBlock, 2, 76471, 4905, null] - - [163, 7, SimpleBlock, 2, 81379, 1639, null] - - [163, 7, SimpleBlock, 2, 83021, 5052, null] - - [163, 7, SimpleBlock, 2, 88076, 2697, null] - - [163, 7, SimpleBlock, 2, 90776, 5215, null] - - [163, 7, SimpleBlock, 2, 95994, 3371, null] - - [163, 7, SimpleBlock, 2, 99368, 5630, null] - - [163, 7, SimpleBlock, 2, 105001, 5582, null] - - [163, 7, SimpleBlock, 2, 110586, 5696, null] - - [163, 7, SimpleBlock, 2, 116285, 2505, null] - - [163, 7, SimpleBlock, 2, 118793, 6002, null] - - [163, 7, SimpleBlock, 2, 124798, 5794, null] - - [163, 7, SimpleBlock, 2, 130595, 2601, null] - - [163, 7, SimpleBlock, 2, 133199, 6520, null] - - [163, 7, SimpleBlock, 2, 139722, 5892, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 145621 - - 41405 - - - [231, 1, Timecode, 2, 145623, 2, 1042] - - [163, 7, SimpleBlock, 2, 145628, 964, null] - - [163, 7, SimpleBlock, 2, 146595, 2504, null] - - [163, 7, SimpleBlock, 2, 149102, 7082, null] - - [163, 7, SimpleBlock, 2, 156187, 6024, null] - - [163, 7, SimpleBlock, 2, 162214, 4237, null] - - [163, 7, SimpleBlock, 2, 166454, 7739, null] - - [163, 7, SimpleBlock, 2, 174196, 6210, null] - - [163, 7, SimpleBlock, 2, 180409, 6617, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 187034 - - 2944550 - - - [231, 1, Timecode, 2, 187036, 2, 1250] - - [163, 7, SimpleBlock, 2, 187041, 772, null] - - [163, 7, SimpleBlock, 2, 187816, 6736, null] - - [163, 7, SimpleBlock, 2, 194555, 8731, null] - - [163, 7, SimpleBlock, 2, 203289, 6522, null] - - [163, 7, SimpleBlock, 2, 209814, 7087, null] - - [163, 7, SimpleBlock, 2, 216904, 7323, null] - - [163, 7, SimpleBlock, 2, 224230, 7629, null] - - [163, 7, SimpleBlock, 2, 231862, 6546, null] - - [163, 7, SimpleBlock, 2, 238411, 7860, null] - - [163, 7, SimpleBlock, 2, 246274, 7989, null] - - [163, 7, SimpleBlock, 2, 254266, 8281, null] - - [163, 7, SimpleBlock, 2, 262550, 8399, null] - - [163, 7, SimpleBlock, 2, 270952, 5967, null] - - [163, 7, SimpleBlock, 2, 276922, 8557, null] - - [163, 7, SimpleBlock, 2, 285482, 8820, null] - - [163, 7, SimpleBlock, 2, 294305, 8886, null] - - [163, 7, SimpleBlock, 2, 303194, 8997, null] - - [163, 7, SimpleBlock, 2, 312194, 9160, null] - - [163, 7, SimpleBlock, 2, 321357, 6643, null] - - [163, 7, SimpleBlock, 2, 328003, 9359, null] - - [163, 7, SimpleBlock, 2, 337365, 9630, null] - - [163, 7, SimpleBlock, 2, 346998, 10035, null] - - [163, 7, SimpleBlock, 2, 357036, 10450, null] - - [163, 7, SimpleBlock, 2, 367489, 6641, null] - - [163, 7, SimpleBlock, 2, 374133, 11054, null] - - [163, 7, SimpleBlock, 2, 385190, 11571, null] - - [163, 7, SimpleBlock, 2, 396764, 11910, null] - - [163, 7, SimpleBlock, 2, 408677, 4492, null] - - [163, 7, SimpleBlock, 2, 413172, 4513, null] - - [163, 7, SimpleBlock, 2, 417688, 6931, null] - - [163, 7, SimpleBlock, 2, 424622, 5450, null] - - [163, 7, SimpleBlock, 2, 430075, 5226, null] - - [163, 7, SimpleBlock, 2, 435304, 5387, null] - - [163, 7, SimpleBlock, 2, 440694, 5433, null] - - [163, 7, SimpleBlock, 2, 446130, 5557, null] - - [163, 7, SimpleBlock, 2, 451690, 6163, null] - - [163, 7, SimpleBlock, 2, 457856, 5576, null] - - [163, 7, SimpleBlock, 2, 463435, 5832, null] - - [163, 7, SimpleBlock, 2, 469270, 5718, null] - - [163, 7, SimpleBlock, 2, 474991, 5658, null] - - [163, 7, SimpleBlock, 2, 480652, 6161, null] - - [163, 7, SimpleBlock, 2, 486816, 5455, null] - - [163, 7, SimpleBlock, 2, 492274, 5361, null] - - [163, 7, SimpleBlock, 2, 497638, 5391, null] - - [163, 7, SimpleBlock, 2, 503032, 5249, null] - - [163, 7, SimpleBlock, 2, 508284, 5241, null] - - [163, 7, SimpleBlock, 2, 513528, 6161, null] - - [163, 7, SimpleBlock, 2, 519692, 5189, null] - - [163, 7, SimpleBlock, 2, 524884, 5186, null] - - [163, 7, SimpleBlock, 2, 530073, 5185, null] - - [163, 7, SimpleBlock, 2, 535261, 5443, null] - - [163, 7, SimpleBlock, 2, 540707, 5587, null] - - [163, 7, SimpleBlock, 2, 546297, 5559, null] - - [163, 7, SimpleBlock, 2, 551859, 5899, null] - - [163, 7, SimpleBlock, 2, 557761, 6247, null] - - [163, 7, SimpleBlock, 2, 564011, 6210, null] - - [163, 7, SimpleBlock, 2, 570224, 6362, null] - - [163, 7, SimpleBlock, 2, 576589, 5776, null] - - [163, 7, SimpleBlock, 2, 582368, 6608, null] - - [163, 7, SimpleBlock, 2, 588979, 6560, null] - - [163, 7, SimpleBlock, 2, 595542, 6658, null] - - [163, 7, SimpleBlock, 2, 602203, 7020, null] - - [163, 7, SimpleBlock, 2, 609226, 7107, null] - - [163, 7, SimpleBlock, 2, 616336, 6063, null] - - [163, 7, SimpleBlock, 2, 622402, 7022, null] - - [163, 7, SimpleBlock, 2, 629427, 7149, null] - - [163, 7, SimpleBlock, 2, 636579, 7180, null] - - [163, 7, SimpleBlock, 2, 643762, 7213, null] - - [163, 7, SimpleBlock, 2, 650978, 5967, null] - - [163, 7, SimpleBlock, 2, 656948, 7189, null] - - [163, 7, SimpleBlock, 2, 664140, 7478, null] - - [163, 7, SimpleBlock, 2, 671621, 7488, null] - - [163, 7, SimpleBlock, 2, 679112, 7491, null] - - [163, 7, SimpleBlock, 2, 686606, 7515, null] - - [163, 7, SimpleBlock, 2, 694124, 5873, null] - - [163, 7, SimpleBlock, 2, 700000, 7718, null] - - [163, 7, SimpleBlock, 2, 707721, 7485, null] - - [163, 7, SimpleBlock, 2, 715209, 7448, null] - - [163, 7, SimpleBlock, 2, 722660, 7483, null] - - [163, 7, SimpleBlock, 2, 730146, 7497, null] - - [163, 7, SimpleBlock, 2, 737646, 5682, null] - - [163, 7, SimpleBlock, 2, 743331, 7583, null] - - [163, 7, SimpleBlock, 2, 750917, 7666, null] - - [163, 7, SimpleBlock, 2, 758586, 7792, null] - - [163, 7, SimpleBlock, 2, 766381, 7810, null] - - [163, 7, SimpleBlock, 2, 774194, 5778, null] - - [163, 7, SimpleBlock, 2, 779975, 7823, null] - - [163, 7, SimpleBlock, 2, 787801, 7962, null] - - [163, 7, SimpleBlock, 2, 795766, 8032, null] - - [163, 7, SimpleBlock, 2, 803801, 8119, null] - - [163, 7, SimpleBlock, 2, 811923, 8142, null] - - [163, 7, SimpleBlock, 2, 820068, 5874, null] - - [163, 7, SimpleBlock, 2, 825945, 8045, null] - - [163, 7, SimpleBlock, 2, 833993, 8247, null] - - [163, 7, SimpleBlock, 2, 842243, 8393, null] - - [163, 7, SimpleBlock, 2, 850639, 8264, null] - - [163, 7, SimpleBlock, 2, 858906, 6062, null] - - [163, 7, SimpleBlock, 2, 864971, 8456, null] - - [163, 7, SimpleBlock, 2, 873430, 8595, null] - - [163, 7, SimpleBlock, 2, 882028, 8604, null] - - [163, 7, SimpleBlock, 2, 890635, 8690, null] - - [163, 7, SimpleBlock, 2, 899328, 8682, null] - - [163, 7, SimpleBlock, 2, 908013, 5874, null] - - [163, 7, SimpleBlock, 2, 913890, 8927, null] - - [163, 7, SimpleBlock, 2, 922820, 8768, null] - - [163, 7, SimpleBlock, 2, 931591, 9073, null] - - [163, 7, SimpleBlock, 2, 940667, 9001, null] - - [163, 7, SimpleBlock, 2, 949671, 8907, null] - - [163, 7, SimpleBlock, 2, 958581, 5873, null] - - [163, 7, SimpleBlock, 2, 964457, 8930, null] - - [163, 7, SimpleBlock, 2, 973390, 8900, null] - - [163, 7, SimpleBlock, 2, 982293, 9019, null] - - [163, 7, SimpleBlock, 2, 991315, 9005, null] - - [163, 7, SimpleBlock, 2, 1000323, 5873, null] - - [163, 7, SimpleBlock, 2, 1006199, 9000, null] - - [163, 7, SimpleBlock, 2, 1015202, 9075, null] - - [163, 7, SimpleBlock, 2, 1024280, 9002, null] - - [163, 7, SimpleBlock, 2, 1033285, 9161, null] - - [163, 7, SimpleBlock, 2, 1042449, 9136, null] - - [163, 7, SimpleBlock, 2, 1051588, 5682, null] - - [163, 7, SimpleBlock, 2, 1057273, 9178, null] - - [163, 7, SimpleBlock, 2, 1066454, 9207, null] - - [163, 7, SimpleBlock, 2, 1075664, 9305, null] - - [163, 7, SimpleBlock, 2, 1084972, 9626, null] - - [163, 7, SimpleBlock, 2, 1094601, 5873, null] - - [163, 7, SimpleBlock, 2, 1100477, 9755, null] - - [163, 7, SimpleBlock, 2, 1110235, 9724, null] - - [163, 7, SimpleBlock, 2, 1119962, 9933, null] - - [163, 7, SimpleBlock, 2, 1129898, 9880, null] - - [163, 7, SimpleBlock, 2, 1139781, 10249, null] - - [163, 7, SimpleBlock, 2, 1150033, 6350, null] - - [163, 7, SimpleBlock, 2, 1156386, 10265, null] - - [163, 7, SimpleBlock, 2, 1166654, 10385, null] - - [163, 7, SimpleBlock, 2, 1177042, 10350, null] - - [163, 7, SimpleBlock, 2, 1187395, 10340, null] - - [163, 7, SimpleBlock, 2, 1197738, 10483, null] - - [163, 7, SimpleBlock, 2, 1208224, 6739, null] - - [163, 7, SimpleBlock, 2, 1214966, 10579, null] - - [163, 7, SimpleBlock, 2, 1225548, 10512, null] - - [163, 7, SimpleBlock, 2, 1236063, 10449, null] - - [163, 7, SimpleBlock, 2, 1246515, 10633, null] - - [163, 7, SimpleBlock, 2, 1257151, 6642, null] - - [163, 7, SimpleBlock, 2, 1263796, 10454, null] - - [163, 7, SimpleBlock, 2, 1274253, 10695, null] - - [163, 7, SimpleBlock, 2, 1284951, 10452, null] - - [163, 7, SimpleBlock, 2, 1295406, 10663, null] - - [163, 7, SimpleBlock, 2, 1306072, 10309, null] - - [163, 7, SimpleBlock, 2, 1316384, 6547, null] - - [163, 7, SimpleBlock, 2, 1322934, 10359, null] - - [163, 7, SimpleBlock, 2, 1333296, 10337, null] - - [163, 7, SimpleBlock, 2, 1343636, 10027, null] - - [163, 7, SimpleBlock, 2, 1353666, 9883, null] - - [163, 7, SimpleBlock, 2, 1363552, 6451, null] - - [163, 7, SimpleBlock, 2, 1370006, 9643, null] - - [163, 7, SimpleBlock, 2, 1379652, 9148, null] - - [163, 7, SimpleBlock, 2, 1388803, 8794, null] - - [163, 7, SimpleBlock, 2, 1397600, 8468, null] - - [163, 7, SimpleBlock, 2, 1406071, 8372, null] - - [163, 7, SimpleBlock, 2, 1414446, 6835, null] - - [163, 7, SimpleBlock, 2, 1421284, 8121, null] - - [163, 7, SimpleBlock, 2, 1429408, 8022, null] - - [163, 7, SimpleBlock, 2, 1437433, 8096, null] - - [163, 7, SimpleBlock, 2, 1445532, 7920, null] - - [163, 7, SimpleBlock, 2, 1453455, 7699, null] - - [163, 7, SimpleBlock, 2, 1461157, 6545, null] - - [163, 7, SimpleBlock, 2, 1467705, 7707, null] - - [163, 7, SimpleBlock, 2, 1475415, 7821, null] - - [163, 7, SimpleBlock, 2, 1483239, 7978, null] - - [163, 7, SimpleBlock, 2, 1491220, 8241, null] - - [163, 7, SimpleBlock, 2, 1499464, 5778, null] - - [163, 7, SimpleBlock, 2, 1505245, 8282, null] - - [163, 7, SimpleBlock, 2, 1513530, 8598, null] - - [163, 7, SimpleBlock, 2, 1522131, 9098, null] - - [163, 7, SimpleBlock, 2, 1531232, 9644, null] - - [163, 7, SimpleBlock, 2, 1540879, 10086, null] - - [163, 7, SimpleBlock, 2, 1550968, 5779, null] - - [163, 7, SimpleBlock, 2, 1556750, 10191, null] - - [163, 7, SimpleBlock, 2, 1566944, 10458, null] - - [163, 7, SimpleBlock, 2, 1577405, 10570, null] - - [163, 7, SimpleBlock, 2, 1587978, 11074, null] - - [163, 7, SimpleBlock, 2, 1599055, 6158, null] - - [163, 7, SimpleBlock, 2, 1605216, 11120, null] - - [163, 7, SimpleBlock, 2, 1616339, 11421, null] - - [163, 7, SimpleBlock, 2, 1627763, 11589, null] - - [163, 7, SimpleBlock, 2, 1639355, 11727, null] - - [163, 7, SimpleBlock, 2, 1651085, 11990, null] - - [163, 7, SimpleBlock, 2, 1663078, 6352, null] - - [163, 7, SimpleBlock, 2, 1669433, 12178, null] - - [163, 7, SimpleBlock, 2, 1681614, 12242, null] - - [163, 7, SimpleBlock, 2, 1693859, 12403, null] - - [163, 7, SimpleBlock, 2, 1706265, 12268, null] - - [163, 7, SimpleBlock, 2, 1718536, 12507, null] - - [163, 7, SimpleBlock, 2, 1731046, 6450, null] - - [163, 7, SimpleBlock, 2, 1737499, 12548, null] - - [163, 7, SimpleBlock, 2, 1750050, 12540, null] - - [163, 7, SimpleBlock, 2, 1762593, 12616, null] - - [163, 7, SimpleBlock, 2, 1775212, 12497, null] - - [163, 7, SimpleBlock, 2, 1787712, 5586, null] - - [163, 7, SimpleBlock, 2, 1793301, 12619, null] - - [163, 7, SimpleBlock, 2, 1805923, 12645, null] - - [163, 7, SimpleBlock, 2, 1818571, 12819, null] - - [163, 7, SimpleBlock, 2, 1831393, 12553, null] - - [163, 7, SimpleBlock, 2, 1843949, 12186, null] - - [163, 7, SimpleBlock, 2, 1856138, 6349, null] - - [163, 7, SimpleBlock, 2, 1862490, 12232, null] - - [163, 7, SimpleBlock, 2, 1874725, 11787, null] - - [163, 7, SimpleBlock, 2, 1886515, 12022, null] - - [163, 7, SimpleBlock, 2, 1898540, 11715, null] - - [163, 7, SimpleBlock, 2, 1910258, 11778, null] - - [163, 7, SimpleBlock, 2, 1922039, 6258, null] - - [163, 7, SimpleBlock, 2, 1928300, 11504, null] - - [163, 7, SimpleBlock, 2, 1939807, 11427, null] - - [163, 7, SimpleBlock, 2, 1951237, 11323, null] - - [163, 7, SimpleBlock, 2, 1962563, 10800, null] - - [163, 7, SimpleBlock, 2, 1973366, 6258, null] - - [163, 7, SimpleBlock, 2, 1979627, 10602, null] - - [163, 7, SimpleBlock, 2, 1990232, 10219, null] - - [163, 7, SimpleBlock, 2, 2000454, 9952, null] - - [163, 7, SimpleBlock, 2, 2010409, 10054, null] - - [163, 7, SimpleBlock, 2, 2020466, 10129, null] - - [163, 7, SimpleBlock, 2, 2030598, 6065, null] - - [163, 7, SimpleBlock, 2, 2036666, 10124, null] - - [163, 7, SimpleBlock, 2, 2046793, 10209, null] - - [163, 7, SimpleBlock, 2, 2057005, 10584, null] - - [163, 7, SimpleBlock, 2, 2067592, 10618, null] - - [163, 7, SimpleBlock, 2, 2078213, 5970, null] - - [163, 7, SimpleBlock, 2, 2084186, 11182, null] - - [163, 7, SimpleBlock, 2, 2095371, 11631, null] - - [163, 7, SimpleBlock, 2, 2107005, 12268, null] - - [163, 7, SimpleBlock, 2, 2119276, 13038, null] - - [163, 7, SimpleBlock, 2, 2132317, 13455, null] - - [163, 7, SimpleBlock, 2, 2145775, 5970, null] - - [163, 7, SimpleBlock, 2, 2151748, 13833, null] - - [163, 7, SimpleBlock, 2, 2165584, 13984, null] - - [163, 7, SimpleBlock, 2, 2179571, 13708, null] - - [163, 7, SimpleBlock, 2, 2193282, 13782, null] - - [163, 7, SimpleBlock, 2, 2207067, 14245, null] - - [163, 7, SimpleBlock, 2, 2221315, 5680, null] - - [163, 7, SimpleBlock, 2, 2226998, 14394, null] - - [163, 7, SimpleBlock, 2, 2241395, 14877, null] - - [163, 7, SimpleBlock, 2, 2256275, 15072, null] - - [163, 7, SimpleBlock, 2, 2271350, 15391, null] - - [163, 7, SimpleBlock, 2, 2286744, 5680, null] - - [163, 7, SimpleBlock, 2, 2292427, 15642, null] - - [163, 7, SimpleBlock, 2, 2308072, 15860, null] - - [163, 7, SimpleBlock, 2, 2323935, 16213, null] - - [163, 7, SimpleBlock, 2, 2340152, 16528, null] - - [163, 7, SimpleBlock, 2, 2356684, 16926, null] - - [163, 7, SimpleBlock, 2, 2373613, 5585, null] - - [163, 7, SimpleBlock, 2, 2379202, 16873, null] - - [163, 7, SimpleBlock, 2, 2396079, 17018, null] - - [163, 7, SimpleBlock, 2, 2413101, 16919, null] - - [163, 7, SimpleBlock, 2, 2430024, 17045, null] - - [163, 7, SimpleBlock, 2, 2447072, 5392, null] - - [163, 7, SimpleBlock, 2, 2452468, 16885, null] - - [163, 7, SimpleBlock, 2, 2469357, 16916, null] - - [163, 7, SimpleBlock, 2, 2486277, 16981, null] - - [163, 7, SimpleBlock, 2, 2503262, 16714, null] - - [163, 7, SimpleBlock, 2, 2519980, 16876, null] - - [163, 7, SimpleBlock, 2, 2536859, 5583, null] - - [163, 7, SimpleBlock, 2, 2542446, 16975, null] - - [163, 7, SimpleBlock, 2, 2559425, 17112, null] - - [163, 7, SimpleBlock, 2, 2576541, 17040, null] - - [163, 7, SimpleBlock, 2, 2593585, 17198, null] - - [163, 7, SimpleBlock, 2, 2610787, 17325, null] - - [163, 7, SimpleBlock, 2, 2628115, 5967, null] - - [163, 7, SimpleBlock, 2, 2634086, 17301, null] - - [163, 7, SimpleBlock, 2, 2651391, 17363, null] - - [163, 7, SimpleBlock, 2, 2668758, 17444, null] - - [163, 7, SimpleBlock, 2, 2686206, 17214, null] - - [163, 7, SimpleBlock, 2, 2703423, 5968, null] - - [163, 7, SimpleBlock, 2, 2709395, 16998, null] - - [163, 7, SimpleBlock, 2, 2726397, 16808, null] - - [163, 7, SimpleBlock, 2, 2743208, 16300, null] - - [163, 7, SimpleBlock, 2, 2759511, 16046, null] - - [163, 7, SimpleBlock, 2, 2775560, 15219, null] - - [163, 7, SimpleBlock, 2, 2790782, 2313, null] - - [163, 7, SimpleBlock, 2, 2793098, 15047, null] - - [163, 7, SimpleBlock, 2, 2808148, 14767, null] - - [163, 7, SimpleBlock, 2, 2822918, 6352, null] - - [163, 7, SimpleBlock, 2, 2829273, 14386, null] - - [163, 7, SimpleBlock, 2, 2843662, 14226, null] - - [163, 7, SimpleBlock, 2, 2857891, 14208, null] - - [163, 7, SimpleBlock, 2, 2872102, 14241, null] - - [163, 7, SimpleBlock, 2, 2886346, 5970, null] - - [163, 7, SimpleBlock, 2, 2892319, 13992, null] - - [163, 7, SimpleBlock, 2, 2906314, 14075, null] - - [163, 7, SimpleBlock, 2, 2920392, 13939, null] - - [163, 7, SimpleBlock, 2, 2934334, 13791, null] - - [163, 7, SimpleBlock, 2, 2948128, 13671, null] - - [163, 7, SimpleBlock, 2, 2961802, 5874, null] - - [163, 7, SimpleBlock, 2, 2967679, 13547, null] - - [163, 7, SimpleBlock, 2, 2981229, 13453, null] - - [163, 7, SimpleBlock, 2, 2994685, 13272, null] - - [163, 7, SimpleBlock, 2, 3007960, 12962, null] - - [163, 7, SimpleBlock, 2, 3020925, 5777, null] - - [163, 7, SimpleBlock, 2, 3026705, 12709, null] - - [163, 7, SimpleBlock, 2, 3039417, 12244, null] - - [163, 7, SimpleBlock, 2, 3051664, 12266, null] - - [163, 7, SimpleBlock, 2, 3063933, 12052, null] - - [163, 7, SimpleBlock, 2, 3075988, 11674, null] - - [163, 7, SimpleBlock, 2, 3087665, 4334, null] - - [163, 7, SimpleBlock, 2, 3092002, 10707, null] - - [163, 7, SimpleBlock, 2, 3102712, 10379, null] - - [163, 7, SimpleBlock, 2, 3113094, 9656, null] - - [163, 7, SimpleBlock, 2, 3122753, 8831, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 3131592 - - 2522776 - - - [231, 1, Timecode, 2, 3131594, 2, 11667] - - [163, 7, SimpleBlock, 2, 3131599, 676, null] - - [163, 7, SimpleBlock, 2, 3132278, 6066, null] - - [163, 7, SimpleBlock, 2, 3138348, 76018, null] - - [163, 7, SimpleBlock, 2, 3214369, 1660, null] - - [163, 7, SimpleBlock, 2, 3216032, 2664, null] - - [163, 7, SimpleBlock, 2, 3218699, 2864, null] - - [163, 7, SimpleBlock, 2, 3221566, 2369, null] - - [163, 7, SimpleBlock, 2, 3223938, 6547, null] - - [163, 7, SimpleBlock, 2, 3230489, 91368, null] - - [163, 7, SimpleBlock, 2, 3321860, 8748, null] - - [163, 7, SimpleBlock, 2, 3330611, 13105, null] - - [163, 7, SimpleBlock, 2, 3343719, 13051, null] - - [163, 7, SimpleBlock, 2, 3356773, 6641, null] - - [163, 7, SimpleBlock, 2, 3363417, 13474, null] - - [163, 7, SimpleBlock, 2, 3376894, 14246, null] - - [163, 7, SimpleBlock, 2, 3391143, 14613, null] - - [163, 7, SimpleBlock, 2, 3405759, 15195, null] - - [163, 7, SimpleBlock, 2, 3420957, 15310, null] - - [163, 7, SimpleBlock, 2, 3436270, 6546, null] - - [163, 7, SimpleBlock, 2, 3442819, 15441, null] - - [163, 7, SimpleBlock, 2, 3458263, 15653, null] - - [163, 7, SimpleBlock, 2, 3473919, 15680, null] - - [163, 7, SimpleBlock, 2, 3489602, 15627, null] - - [163, 7, SimpleBlock, 2, 3505232, 6547, null] - - [163, 7, SimpleBlock, 2, 3511782, 15376, null] - - [163, 7, SimpleBlock, 2, 3527161, 15431, null] - - [163, 7, SimpleBlock, 2, 3542595, 15411, null] - - [163, 7, SimpleBlock, 2, 3558009, 15211, null] - - [163, 7, SimpleBlock, 2, 3573223, 15589, null] - - [163, 7, SimpleBlock, 2, 3588815, 6353, null] - - [163, 7, SimpleBlock, 2, 3595171, 15450, null] - - [163, 7, SimpleBlock, 2, 3610624, 15443, null] - - [163, 7, SimpleBlock, 2, 3626070, 15422, null] - - [163, 7, SimpleBlock, 2, 3641495, 15484, null] - - [163, 7, SimpleBlock, 2, 3656982, 15369, null] - - [163, 7, SimpleBlock, 2, 3672354, 6543, null] - - [163, 7, SimpleBlock, 2, 3678900, 15472, null] - - [163, 7, SimpleBlock, 2, 3694375, 15538, null] - - [163, 7, SimpleBlock, 2, 3709916, 15403, null] - - [163, 7, SimpleBlock, 2, 3725322, 15527, null] - - [163, 7, SimpleBlock, 2, 3740852, 6353, null] - - [163, 7, SimpleBlock, 2, 3747208, 15560, null] - - [163, 7, SimpleBlock, 2, 3762771, 15725, null] - - [163, 7, SimpleBlock, 2, 3778499, 15805, null] - - [163, 7, SimpleBlock, 2, 3794307, 16012, null] - - [163, 7, SimpleBlock, 2, 3810322, 15586, null] - - [163, 7, SimpleBlock, 2, 3825911, 6355, null] - - [163, 7, SimpleBlock, 2, 3832269, 15751, null] - - [163, 7, SimpleBlock, 2, 3848023, 15878, null] - - [163, 7, SimpleBlock, 2, 3863904, 16069, null] - - [163, 7, SimpleBlock, 2, 3879976, 16014, null] - - [163, 7, SimpleBlock, 2, 3895993, 6641, null] - - [163, 7, SimpleBlock, 2, 3902637, 15962, null] - - [163, 7, SimpleBlock, 2, 3918602, 16056, null] - - [163, 7, SimpleBlock, 2, 3934661, 16113, null] - - [163, 7, SimpleBlock, 2, 3950777, 15808, null] - - [163, 7, SimpleBlock, 2, 3966588, 15957, null] - - [163, 7, SimpleBlock, 2, 3982548, 5872, null] - - [163, 7, SimpleBlock, 2, 3988423, 16047, null] - - [163, 7, SimpleBlock, 2, 4004473, 15885, null] - - [163, 7, SimpleBlock, 2, 4020361, 15939, null] - - [163, 7, SimpleBlock, 2, 4036303, 16219, null] - - [163, 7, SimpleBlock, 2, 4052525, 16099, null] - - [163, 7, SimpleBlock, 2, 4068627, 5969, null] - - [163, 7, SimpleBlock, 2, 4074599, 16044, null] - - [163, 7, SimpleBlock, 2, 4090646, 15843, null] - - [163, 7, SimpleBlock, 2, 4106492, 15565, null] - - [163, 7, SimpleBlock, 2, 4122060, 15513, null] - - [163, 7, SimpleBlock, 2, 4137576, 5969, null] - - [163, 7, SimpleBlock, 2, 4143548, 15671, null] - - [163, 7, SimpleBlock, 2, 4159222, 15472, null] - - [163, 7, SimpleBlock, 2, 4174697, 15694, null] - - [163, 7, SimpleBlock, 2, 4190394, 15367, null] - - [163, 7, SimpleBlock, 2, 4205764, 15550, null] - - [163, 7, SimpleBlock, 2, 4221317, 5874, null] - - [163, 7, SimpleBlock, 2, 4227194, 15799, null] - - [163, 7, SimpleBlock, 2, 4242996, 15468, null] - - [163, 7, SimpleBlock, 2, 4258467, 15683, null] - - [163, 7, SimpleBlock, 2, 4274153, 15831, null] - - [163, 7, SimpleBlock, 2, 4289987, 15649, null] - - [163, 7, SimpleBlock, 2, 4305639, 6161, null] - - [163, 7, SimpleBlock, 2, 4311803, 15674, null] - - [163, 7, SimpleBlock, 2, 4327480, 15947, null] - - [163, 7, SimpleBlock, 2, 4343430, 15950, null] - - [163, 7, SimpleBlock, 2, 4359383, 16024, null] - - [163, 7, SimpleBlock, 2, 4375410, 6546, null] - - [163, 7, SimpleBlock, 2, 4381959, 15905, null] - - [163, 7, SimpleBlock, 2, 4397867, 15804, null] - - [163, 7, SimpleBlock, 2, 4413674, 15923, null] - - [163, 7, SimpleBlock, 2, 4429600, 16016, null] - - [163, 7, SimpleBlock, 2, 4445619, 15976, null] - - [163, 7, SimpleBlock, 2, 4461598, 6161, null] - - [163, 7, SimpleBlock, 2, 4467762, 15653, null] - - [163, 7, SimpleBlock, 2, 4483418, 15624, null] - - [163, 7, SimpleBlock, 2, 4499045, 15816, null] - - [163, 7, SimpleBlock, 2, 4514864, 15789, null] - - [163, 7, SimpleBlock, 2, 4530656, 6065, null] - - [163, 7, SimpleBlock, 2, 4536724, 15807, null] - - [163, 7, SimpleBlock, 2, 4552534, 15778, null] - - [163, 7, SimpleBlock, 2, 4568315, 16016, null] - - [163, 7, SimpleBlock, 2, 4584335, 16391, null] - - [163, 7, SimpleBlock, 2, 4600729, 16213, null] - - [163, 7, SimpleBlock, 2, 4616945, 5968, null] - - [163, 7, SimpleBlock, 2, 4622917, 16515, null] - - [163, 7, SimpleBlock, 2, 4639436, 16489, null] - - [163, 7, SimpleBlock, 2, 4655928, 16261, null] - - [163, 7, SimpleBlock, 2, 4672193, 16569, null] - - [163, 7, SimpleBlock, 2, 4688766, 16611, null] - - [163, 7, SimpleBlock, 2, 4705380, 6162, null] - - [163, 7, SimpleBlock, 2, 4711545, 16272, null] - - [163, 7, SimpleBlock, 2, 4727821, 16456, null] - - [163, 7, SimpleBlock, 2, 4744281, 16625, null] - - [163, 7, SimpleBlock, 2, 4760909, 16309, null] - - [163, 7, SimpleBlock, 2, 4777221, 6257, null] - - [163, 7, SimpleBlock, 2, 4783481, 16124, null] - - [163, 7, SimpleBlock, 2, 4799608, 16054, null] - - [163, 7, SimpleBlock, 2, 4815665, 16133, null] - - [163, 7, SimpleBlock, 2, 4831801, 16104, null] - - [163, 7, SimpleBlock, 2, 4847908, 16074, null] - - [163, 7, SimpleBlock, 2, 4863985, 6257, null] - - [163, 7, SimpleBlock, 2, 4870245, 15985, null] - - [163, 7, SimpleBlock, 2, 4886234, 30557, null] - - [163, 7, SimpleBlock, 2, 4916794, 1070, null] - - [163, 7, SimpleBlock, 2, 4917867, 1018, null] - - [163, 7, SimpleBlock, 2, 4918888, 6547, null] - - [163, 7, SimpleBlock, 2, 4925438, 999, null] - - [163, 7, SimpleBlock, 2, 4926440, 978, null] - - [163, 7, SimpleBlock, 2, 4927421, 1346, null] - - [163, 7, SimpleBlock, 2, 4928770, 961, null] - - [163, 7, SimpleBlock, 2, 4929734, 2286, null] - - [163, 7, SimpleBlock, 2, 4932023, 6739, null] - - [163, 7, SimpleBlock, 2, 4938765, 4122, null] - - [163, 7, SimpleBlock, 2, 4942890, 4871, null] - - [163, 7, SimpleBlock, 2, 4947764, 4809, null] - - [163, 7, SimpleBlock, 2, 4952576, 3777, null] - - [163, 7, SimpleBlock, 2, 4956356, 4788, null] - - [163, 7, SimpleBlock, 2, 4961147, 6451, null] - - [163, 7, SimpleBlock, 2, 4967601, 5463, null] - - [163, 7, SimpleBlock, 2, 4973067, 6989, null] - - [163, 7, SimpleBlock, 2, 4980059, 8594, null] - - [163, 7, SimpleBlock, 2, 4988656, 8170, null] - - [163, 7, SimpleBlock, 2, 4996829, 6545, null] - - [163, 7, SimpleBlock, 2, 5003377, 3838, null] - - [163, 7, SimpleBlock, 2, 5007218, 3437, null] - - [163, 7, SimpleBlock, 2, 5010658, 2846, null] - - [163, 7, SimpleBlock, 2, 5013507, 2664, null] - - [163, 7, SimpleBlock, 2, 5016174, 2312, null] - - [163, 7, SimpleBlock, 2, 5018489, 6449, null] - - [163, 7, SimpleBlock, 2, 5024941, 2172, null] - - [163, 7, SimpleBlock, 2, 5027116, 2268, null] - - [163, 7, SimpleBlock, 2, 5029387, 2394, null] - - [163, 7, SimpleBlock, 2, 5031784, 2501, null] - - [163, 7, SimpleBlock, 2, 5034288, 6450, null] - - [163, 7, SimpleBlock, 2, 5040741, 2616, null] - - [163, 7, SimpleBlock, 2, 5043360, 2571, null] - - [163, 7, SimpleBlock, 2, 5045934, 2547, null] - - [163, 7, SimpleBlock, 2, 5048484, 2487, null] - - [163, 7, SimpleBlock, 2, 5050974, 2602, null] - - [163, 7, SimpleBlock, 2, 5053579, 6354, null] - - [163, 7, SimpleBlock, 2, 5059936, 2173, null] - - [163, 7, SimpleBlock, 2, 5062112, 2151, null] - - [163, 7, SimpleBlock, 2, 5064266, 2176, null] - - [163, 7, SimpleBlock, 2, 5066445, 2030, null] - - [163, 7, SimpleBlock, 2, 5068478, 1997, null] - - [163, 7, SimpleBlock, 2, 5070478, 6257, null] - - [163, 7, SimpleBlock, 2, 5076738, 1716, null] - - [163, 7, SimpleBlock, 2, 5078457, 3963, null] - - [163, 7, SimpleBlock, 2, 5082423, 6863, null] - - [163, 7, SimpleBlock, 2, 5089289, 5119, null] - - [163, 7, SimpleBlock, 2, 5094411, 5199, null] - - [163, 7, SimpleBlock, 2, 5099613, 3255, null] - - [163, 7, SimpleBlock, 2, 5102871, 4286, null] - - [163, 7, SimpleBlock, 2, 5107160, 5759, null] - - [163, 7, SimpleBlock, 2, 5112922, 6331, null] - - [163, 7, SimpleBlock, 2, 5119256, 6585, null] - - [163, 7, SimpleBlock, 2, 5125844, 5201, null] - - [163, 7, SimpleBlock, 2, 5131048, 5612, null] - - [163, 7, SimpleBlock, 2, 5136663, 4421, null] - - [163, 7, SimpleBlock, 2, 5141087, 4525, null] - - [163, 7, SimpleBlock, 2, 5145615, 4141, null] - - [163, 7, SimpleBlock, 2, 5149759, 5490, null] - - [163, 7, SimpleBlock, 2, 5155252, 3473, null] - - [163, 7, SimpleBlock, 2, 5158728, 2837, null] - - [163, 7, SimpleBlock, 2, 5161568, 3132, null] - - [163, 7, SimpleBlock, 2, 5164703, 3646, null] - - [163, 7, SimpleBlock, 2, 5168352, 5469, null] - - [163, 7, SimpleBlock, 2, 5173824, 5873, null] - - [163, 7, SimpleBlock, 2, 5179700, 8756, null] - - [163, 7, SimpleBlock, 2, 5188459, 9327, null] - - [163, 7, SimpleBlock, 2, 5197789, 8557, null] - - [163, 7, SimpleBlock, 2, 5206349, 6774, null] - - [163, 7, SimpleBlock, 2, 5213126, 2800, null] - - [163, 7, SimpleBlock, 2, 5215929, 6159, null] - - [163, 7, SimpleBlock, 2, 5222091, 2426, null] - - [163, 7, SimpleBlock, 2, 5224520, 2308, null] - - [163, 7, SimpleBlock, 2, 5226831, 2065, null] - - [163, 7, SimpleBlock, 2, 5228899, 1848, null] - - [163, 7, SimpleBlock, 2, 5230750, 5969, null] - - [163, 7, SimpleBlock, 2, 5236722, 1791, null] - - [163, 7, SimpleBlock, 2, 5238516, 1759, null] - - [163, 7, SimpleBlock, 2, 5240278, 2394, null] - - [163, 7, SimpleBlock, 2, 5242675, 2589, null] - - [163, 7, SimpleBlock, 2, 5245267, 2474, null] - - [163, 7, SimpleBlock, 2, 5247744, 6062, null] - - [163, 7, SimpleBlock, 2, 5253809, 2594, null] - - [163, 7, SimpleBlock, 2, 5256406, 2693, null] - - [163, 7, SimpleBlock, 2, 5259102, 2275, null] - - [163, 7, SimpleBlock, 2, 5261380, 1749, null] - - [163, 7, SimpleBlock, 2, 5263132, 5968, null] - - [163, 7, SimpleBlock, 2, 5269103, 1866, null] - - [163, 7, SimpleBlock, 2, 5270972, 1849, null] - - [163, 7, SimpleBlock, 2, 5272824, 1718, null] - - [163, 7, SimpleBlock, 2, 5274545, 2034, null] - - [163, 7, SimpleBlock, 2, 5276582, 1945, null] - - [163, 7, SimpleBlock, 2, 5278530, 5969, null] - - [163, 7, SimpleBlock, 2, 5284502, 1836, null] - - [163, 7, SimpleBlock, 2, 5286341, 2041, null] - - [163, 7, SimpleBlock, 2, 5288385, 2254, null] - - [163, 7, SimpleBlock, 2, 5290642, 1765, null] - - [163, 7, SimpleBlock, 2, 5292410, 1135, null] - - [163, 7, SimpleBlock, 2, 5293548, 5872, null] - - [163, 7, SimpleBlock, 2, 5299423, 1202, null] - - [163, 7, SimpleBlock, 2, 5300628, 1294, null] - - [163, 7, SimpleBlock, 2, 5301925, 1459, null] - - [163, 7, SimpleBlock, 2, 5303387, 1521, null] - - [163, 7, SimpleBlock, 2, 5304911, 6066, null] - - [163, 7, SimpleBlock, 2, 5310980, 1531, null] - - [163, 7, SimpleBlock, 2, 5312514, 1475, null] - - [163, 7, SimpleBlock, 2, 5313992, 1411, null] - - [163, 7, SimpleBlock, 2, 5315406, 1211, null] - - [163, 7, SimpleBlock, 2, 5316620, 2324, null] - - [163, 7, SimpleBlock, 2, 5318947, 6257, null] - - [163, 7, SimpleBlock, 2, 5325207, 2000, null] - - [163, 7, SimpleBlock, 2, 5327210, 1445, null] - - [163, 7, SimpleBlock, 2, 5328658, 1469, null] - - [163, 7, SimpleBlock, 2, 5330130, 1727, null] - - [163, 7, SimpleBlock, 2, 5331860, 1755, null] - - [163, 7, SimpleBlock, 2, 5333618, 6162, null] - - [163, 7, SimpleBlock, 2, 5339783, 1839, null] - - [163, 7, SimpleBlock, 2, 5341625, 1878, null] - - [163, 7, SimpleBlock, 2, 5343506, 4785, null] - - [163, 7, SimpleBlock, 2, 5348294, 7508, null] - - [163, 7, SimpleBlock, 2, 5355805, 5489, null] - - [163, 7, SimpleBlock, 2, 5361297, 9645, null] - - [163, 7, SimpleBlock, 2, 5370945, 7838, null] - - [163, 7, SimpleBlock, 2, 5378786, 5736, null] - - [163, 7, SimpleBlock, 2, 5384525, 5252, null] - - [163, 7, SimpleBlock, 2, 5389780, 4668, null] - - [163, 7, SimpleBlock, 2, 5394451, 676, null] - - [163, 7, SimpleBlock, 2, 5395130, 6160, null] - - [163, 7, SimpleBlock, 2, 5401293, 5740, null] - - [163, 7, SimpleBlock, 2, 5407036, 5130, null] - - [163, 7, SimpleBlock, 2, 5412169, 4879, null] - - [163, 7, SimpleBlock, 2, 5417051, 4866, null] - - [163, 7, SimpleBlock, 2, 5421920, 6009, null] - - [163, 7, SimpleBlock, 2, 5427932, 5490, null] - - [163, 7, SimpleBlock, 2, 5433425, 6863, null] - - [163, 7, SimpleBlock, 2, 5440291, 7796, null] - - [163, 7, SimpleBlock, 2, 5448090, 11253, null] - - [163, 7, SimpleBlock, 2, 5459346, 15567, null] - - [163, 7, SimpleBlock, 2, 5474916, 12076, null] - - [163, 7, SimpleBlock, 2, 5486995, 4531, null] - - [163, 7, SimpleBlock, 2, 5491529, 13816, null] - - [163, 7, SimpleBlock, 2, 5505348, 11914, null] - - [163, 7, SimpleBlock, 2, 5517265, 10621, null] - - [163, 7, SimpleBlock, 2, 5527889, 9203, null] - - [163, 7, SimpleBlock, 2, 5537095, 4432, null] - - [163, 7, SimpleBlock, 2, 5541530, 11010, null] - - [163, 7, SimpleBlock, 2, 5552543, 10400, null] - - [163, 7, SimpleBlock, 2, 5562946, 10182, null] - - [163, 7, SimpleBlock, 2, 5573131, 10107, null] - - [163, 7, SimpleBlock, 2, 5583241, 7515, null] - - [163, 7, SimpleBlock, 2, 5590759, 4613, null] - - [163, 7, SimpleBlock, 2, 5595375, 2891, null] - - [163, 7, SimpleBlock, 2, 5598269, 2262, null] - - [163, 7, SimpleBlock, 2, 5600534, 2210, null] - - [163, 7, SimpleBlock, 2, 5602747, 1779, null] - - [163, 7, SimpleBlock, 2, 5604529, 5009, null] - - [163, 7, SimpleBlock, 2, 5609541, 1401, null] - - [163, 7, SimpleBlock, 2, 5610945, 1046, null] - - [163, 7, SimpleBlock, 2, 5611994, 882, null] - - [163, 7, SimpleBlock, 2, 5612879, 877, null] - - [163, 7, SimpleBlock, 2, 5613759, 984, null] - - [163, 7, SimpleBlock, 2, 5614746, 5104, null] - - [163, 7, SimpleBlock, 2, 5619853, 1173, null] - - [163, 7, SimpleBlock, 2, 5621029, 1175, null] - - [163, 7, SimpleBlock, 2, 5622207, 1082, null] - - [163, 7, SimpleBlock, 2, 5623292, 1103, null] - - [163, 7, SimpleBlock, 2, 5624398, 864, null] - - [163, 7, SimpleBlock, 2, 5625265, 5586, null] - - [163, 7, SimpleBlock, 2, 5630854, 766, null] - - [163, 7, SimpleBlock, 2, 5631623, 867, null] - - [163, 7, SimpleBlock, 2, 5632493, 866, null] - - [163, 7, SimpleBlock, 2, 5633362, 826, null] - - [163, 7, SimpleBlock, 2, 5634191, 5104, null] - - [163, 7, SimpleBlock, 2, 5639298, 929, null] - - [163, 7, SimpleBlock, 2, 5640230, 984, null] - - [163, 7, SimpleBlock, 2, 5641217, 893, null] - - [163, 7, SimpleBlock, 2, 5642113, 849, null] - - [163, 7, SimpleBlock, 2, 5642965, 751, null] - - [163, 7, SimpleBlock, 2, 5643719, 5874, null] - - [163, 7, SimpleBlock, 2, 5649596, 664, null] - - [163, 7, SimpleBlock, 2, 5650263, 704, null] - - [163, 7, SimpleBlock, 2, 5650970, 866, null] - - [163, 7, SimpleBlock, 2, 5651839, 932, null] - - [163, 7, SimpleBlock, 2, 5652774, 580, null] - - [163, 7, SimpleBlock, 2, 5653357, 1011, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 5654376 - - 4042030 - - - [231, 1, Timecode, 2, 5654378, 2, 22083] - - [163, 7, SimpleBlock, 2, 5654383, 5487, null] - - [163, 7, SimpleBlock, 2, 5659874, 25991, null] - - [163, 7, SimpleBlock, 2, 5685868, 1412, null] - - [163, 7, SimpleBlock, 2, 5687283, 875, null] - - [163, 7, SimpleBlock, 2, 5688161, 752, null] - - [163, 7, SimpleBlock, 2, 5688916, 652, null] - - [163, 7, SimpleBlock, 2, 5689571, 4816, null] - - [163, 7, SimpleBlock, 2, 5694390, 631, null] - - [163, 7, SimpleBlock, 2, 5695024, 780, null] - - [163, 7, SimpleBlock, 2, 5695807, 795, null] - - [163, 7, SimpleBlock, 2, 5696605, 832, null] - - [163, 7, SimpleBlock, 2, 5697440, 5491, null] - - [163, 7, SimpleBlock, 2, 5702934, 816, null] - - [163, 7, SimpleBlock, 2, 5703753, 840, null] - - [163, 7, SimpleBlock, 2, 5704596, 781, null] - - [163, 7, SimpleBlock, 2, 5705380, 678, null] - - [163, 7, SimpleBlock, 2, 5706061, 624, null] - - [163, 7, SimpleBlock, 2, 5706688, 5585, null] - - [163, 7, SimpleBlock, 2, 5712276, 496, null] - - [163, 7, SimpleBlock, 2, 5712775, 531, null] - - [163, 7, SimpleBlock, 2, 5713309, 559, null] - - [163, 7, SimpleBlock, 2, 5713871, 566, null] - - [163, 7, SimpleBlock, 2, 5714440, 6450, null] - - [163, 7, SimpleBlock, 2, 5720893, 513, null] - - [163, 7, SimpleBlock, 2, 5721409, 429, null] - - [163, 7, SimpleBlock, 2, 5721841, 485, null] - - [163, 7, SimpleBlock, 2, 5722329, 554, null] - - [163, 7, SimpleBlock, 2, 5722886, 512, null] - - [163, 7, SimpleBlock, 2, 5723401, 6450, null] - - [163, 7, SimpleBlock, 2, 5729855, 85844, null] - - [163, 7, SimpleBlock, 2, 5815702, 9241, null] - - [163, 7, SimpleBlock, 2, 5824946, 13021, null] - - [163, 7, SimpleBlock, 2, 5837970, 13020, null] - - [163, 7, SimpleBlock, 2, 5850993, 14475, null] - - [163, 7, SimpleBlock, 2, 5865471, 6835, null] - - [163, 7, SimpleBlock, 2, 5872309, 14579, null] - - [163, 7, SimpleBlock, 2, 5886891, 15342, null] - - [163, 7, SimpleBlock, 2, 5902236, 15053, null] - - [163, 7, SimpleBlock, 2, 5917292, 15560, null] - - [163, 7, SimpleBlock, 2, 5932855, 6642, null] - - [163, 7, SimpleBlock, 2, 5939500, 15399, null] - - [163, 7, SimpleBlock, 2, 5954902, 15560, null] - - [163, 7, SimpleBlock, 2, 5970465, 15577, null] - - [163, 7, SimpleBlock, 2, 5986045, 15647, null] - - [163, 7, SimpleBlock, 2, 6001695, 15358, null] - - [163, 7, SimpleBlock, 2, 6017056, 6835, null] - - [163, 7, SimpleBlock, 2, 6023894, 15537, null] - - [163, 7, SimpleBlock, 2, 6039434, 15598, null] - - [163, 7, SimpleBlock, 2, 6055035, 15730, null] - - [163, 7, SimpleBlock, 2, 6070768, 15582, null] - - [163, 7, SimpleBlock, 2, 6086353, 6351, null] - - [163, 7, SimpleBlock, 2, 6092707, 15441, null] - - [163, 7, SimpleBlock, 2, 6108151, 15429, null] - - [163, 7, SimpleBlock, 2, 6123583, 15534, null] - - [163, 7, SimpleBlock, 2, 6139120, 15550, null] - - [163, 7, SimpleBlock, 2, 6154673, 15537, null] - - [163, 7, SimpleBlock, 2, 6170213, 6546, null] - - [163, 7, SimpleBlock, 2, 6176762, 15619, null] - - [163, 7, SimpleBlock, 2, 6192384, 15707, null] - - [163, 7, SimpleBlock, 2, 6208094, 15679, null] - - [163, 7, SimpleBlock, 2, 6223776, 15407, null] - - [163, 7, SimpleBlock, 2, 6239186, 15554, null] - - [163, 7, SimpleBlock, 2, 6254743, 6448, null] - - [163, 7, SimpleBlock, 2, 6261194, 15613, null] - - [163, 7, SimpleBlock, 2, 6276810, 15697, null] - - [163, 7, SimpleBlock, 2, 6292510, 15583, null] - - [163, 7, SimpleBlock, 2, 6308096, 15663, null] - - [163, 7, SimpleBlock, 2, 6323762, 5971, null] - - [163, 7, SimpleBlock, 2, 6329736, 15636, null] - - [163, 7, SimpleBlock, 2, 6345375, 15711, null] - - [163, 7, SimpleBlock, 2, 6361089, 15877, null] - - [163, 7, SimpleBlock, 2, 6376969, 15632, null] - - [163, 7, SimpleBlock, 2, 6392604, 15880, null] - - [163, 7, SimpleBlock, 2, 6408487, 5299, null] - - [163, 7, SimpleBlock, 2, 6413789, 15875, null] - - [163, 7, SimpleBlock, 2, 6429667, 15671, null] - - [163, 7, SimpleBlock, 2, 6445341, 15803, null] - - [163, 7, SimpleBlock, 2, 6461147, 15793, null] - - [163, 7, SimpleBlock, 2, 6476943, 5872, null] - - [163, 7, SimpleBlock, 2, 6482818, 16039, null] - - [163, 7, SimpleBlock, 2, 6498860, 16305, null] - - [163, 7, SimpleBlock, 2, 6515169, 16465, null] - - [163, 7, SimpleBlock, 2, 6531638, 16499, null] - - [163, 7, SimpleBlock, 2, 6548141, 16741, null] - - [163, 7, SimpleBlock, 2, 6564885, 5584, null] - - [163, 7, SimpleBlock, 2, 6570473, 17095, null] - - [163, 7, SimpleBlock, 2, 6587572, 17131, null] - - [163, 7, SimpleBlock, 2, 6604707, 17304, null] - - [163, 7, SimpleBlock, 2, 6622015, 17294, null] - - [163, 7, SimpleBlock, 2, 6639313, 17485, null] - - [163, 7, SimpleBlock, 2, 6656801, 5490, null] - - [163, 7, SimpleBlock, 2, 6662295, 17982, null] - - [163, 7, SimpleBlock, 2, 6680281, 18072, null] - - [163, 7, SimpleBlock, 2, 6698357, 17845, null] - - [163, 7, SimpleBlock, 2, 6716206, 18220, null] - - [163, 7, SimpleBlock, 2, 6734429, 4914, null] - - [163, 7, SimpleBlock, 2, 6739347, 18198, null] - - [163, 7, SimpleBlock, 2, 6757549, 18229, null] - - [163, 7, SimpleBlock, 2, 6775782, 18246, null] - - [163, 7, SimpleBlock, 2, 6794032, 18232, null] - - [163, 7, SimpleBlock, 2, 6812268, 18081, null] - - [163, 7, SimpleBlock, 2, 6830352, 5586, null] - - [163, 7, SimpleBlock, 2, 6835942, 17839, null] - - [163, 7, SimpleBlock, 2, 6853785, 18150, null] - - [163, 7, SimpleBlock, 2, 6871939, 17811, null] - - [163, 7, SimpleBlock, 2, 6889754, 17733, null] - - [163, 7, SimpleBlock, 2, 6907491, 17342, null] - - [163, 7, SimpleBlock, 2, 6924836, 5393, null] - - [163, 7, SimpleBlock, 2, 6930233, 17401, null] - - [163, 7, SimpleBlock, 2, 6947638, 17334, null] - - [163, 7, SimpleBlock, 2, 6964976, 17208, null] - - [163, 7, SimpleBlock, 2, 6982188, 16806, null] - - [163, 7, SimpleBlock, 2, 6998997, 5199, null] - - [163, 7, SimpleBlock, 2, 7004200, 16683, null] - - [163, 7, SimpleBlock, 2, 7020887, 16765, null] - - [163, 7, SimpleBlock, 2, 7037656, 16489, null] - - [163, 7, SimpleBlock, 2, 7054149, 16415, null] - - [163, 7, SimpleBlock, 2, 7070567, 16272, null] - - [163, 7, SimpleBlock, 2, 7086842, 4910, null] - - [163, 7, SimpleBlock, 2, 7091755, 16065, null] - - [163, 7, SimpleBlock, 2, 7107823, 15683, null] - - [163, 7, SimpleBlock, 2, 7123509, 15669, null] - - [163, 7, SimpleBlock, 2, 7139181, 15353, null] - - [163, 7, SimpleBlock, 2, 7154537, 5395, null] - - [163, 7, SimpleBlock, 2, 7159935, 15367, null] - - [163, 7, SimpleBlock, 2, 7175305, 14998, null] - - [163, 7, SimpleBlock, 2, 7190306, 14862, null] - - [163, 7, SimpleBlock, 2, 7205171, 15044, null] - - [163, 7, SimpleBlock, 2, 7220218, 5872, null] - - [163, 7, SimpleBlock, 2, 7226093, 15078, null] - - [163, 7, SimpleBlock, 2, 7241174, 14735, null] - - [163, 7, SimpleBlock, 2, 7255912, 14895, null] - - [163, 7, SimpleBlock, 2, 7270810, 15001, null] - - [163, 7, SimpleBlock, 2, 7285814, 14921, null] - - [163, 7, SimpleBlock, 2, 7300738, 5778, null] - - [163, 7, SimpleBlock, 2, 7306519, 14923, null] - - [163, 7, SimpleBlock, 2, 7321445, 14971, null] - - [163, 7, SimpleBlock, 2, 7336419, 14927, null] - - [163, 7, SimpleBlock, 2, 7351349, 14900, null] - - [163, 7, SimpleBlock, 2, 7366252, 15092, null] - - [163, 7, SimpleBlock, 2, 7381347, 5485, null] - - [163, 7, SimpleBlock, 2, 7386835, 14913, null] - - [163, 7, SimpleBlock, 2, 7401751, 14865, null] - - [163, 7, SimpleBlock, 2, 7416619, 15019, null] - - [163, 7, SimpleBlock, 2, 7431641, 14883, null] - - [163, 7, SimpleBlock, 2, 7446527, 5682, null] - - [163, 7, SimpleBlock, 2, 7452212, 15002, null] - - [163, 7, SimpleBlock, 2, 7467217, 14870, null] - - [163, 7, SimpleBlock, 2, 7482090, 14810, null] - - [163, 7, SimpleBlock, 2, 7496903, 14940, null] - - [163, 7, SimpleBlock, 2, 7511846, 15141, null] - - [163, 7, SimpleBlock, 2, 7526990, 5874, null] - - [163, 7, SimpleBlock, 2, 7532867, 15044, null] - - [163, 7, SimpleBlock, 2, 7547914, 14799, null] - - [163, 7, SimpleBlock, 2, 7562716, 14863, null] - - [163, 7, SimpleBlock, 2, 7577582, 14982, null] - - [163, 7, SimpleBlock, 2, 7592567, 5873, null] - - [163, 7, SimpleBlock, 2, 7598443, 14843, null] - - [163, 7, SimpleBlock, 2, 7613289, 14979, null] - - [163, 7, SimpleBlock, 2, 7628271, 14680, null] - - [163, 7, SimpleBlock, 2, 7642954, 14874, null] - - [163, 7, SimpleBlock, 2, 7657831, 14871, null] - - [163, 7, SimpleBlock, 2, 7672705, 5491, null] - - [163, 7, SimpleBlock, 2, 7678199, 14981, null] - - [163, 7, SimpleBlock, 2, 7693183, 14699, null] - - [163, 7, SimpleBlock, 2, 7707885, 15065, null] - - [163, 7, SimpleBlock, 2, 7722953, 14820, null] - - [163, 7, SimpleBlock, 2, 7737776, 14760, null] - - [163, 7, SimpleBlock, 2, 7752539, 5584, null] - - [163, 7, SimpleBlock, 2, 7758126, 14847, null] - - [163, 7, SimpleBlock, 2, 7772976, 14937, null] - - [163, 7, SimpleBlock, 2, 7787916, 14800, null] - - [163, 7, SimpleBlock, 2, 7802719, 15108, null] - - [163, 7, SimpleBlock, 2, 7817830, 5107, null] - - [163, 7, SimpleBlock, 2, 7822940, 14980, null] - - [163, 7, SimpleBlock, 2, 7837923, 15035, null] - - [163, 7, SimpleBlock, 2, 7852961, 14959, null] - - [163, 7, SimpleBlock, 2, 7867923, 14964, null] - - [163, 7, SimpleBlock, 2, 7882890, 14914, null] - - [163, 7, SimpleBlock, 2, 7897807, 5490, null] - - [163, 7, SimpleBlock, 2, 7903300, 15071, null] - - [163, 7, SimpleBlock, 2, 7918374, 14910, null] - - [163, 7, SimpleBlock, 2, 7933287, 15206, null] - - [163, 7, SimpleBlock, 2, 7948496, 14820, null] - - [163, 7, SimpleBlock, 2, 7963319, 5583, null] - - [163, 7, SimpleBlock, 2, 7968905, 15074, null] - - [163, 7, SimpleBlock, 2, 7983982, 14970, null] - - [163, 7, SimpleBlock, 2, 7998955, 15396, null] - - [163, 7, SimpleBlock, 2, 8014354, 15402, null] - - [163, 7, SimpleBlock, 2, 8029759, 15417, null] - - [163, 7, SimpleBlock, 2, 8045179, 5873, null] - - [163, 7, SimpleBlock, 2, 8051055, 15643, null] - - [163, 7, SimpleBlock, 2, 8066701, 15741, null] - - [163, 7, SimpleBlock, 2, 8082445, 15823, null] - - [163, 7, SimpleBlock, 2, 8098271, 15968, null] - - [163, 7, SimpleBlock, 2, 8114242, 16024, null] - - [163, 7, SimpleBlock, 2, 8130269, 5681, null] - - [163, 7, SimpleBlock, 2, 8135953, 16190, null] - - [163, 7, SimpleBlock, 2, 8152146, 16229, null] - - [163, 7, SimpleBlock, 2, 8168378, 16320, null] - - [163, 7, SimpleBlock, 2, 8184702, 16427, null] - - [163, 7, SimpleBlock, 2, 8201132, 5487, null] - - [163, 7, SimpleBlock, 2, 8206623, 16674, null] - - [163, 7, SimpleBlock, 2, 8223301, 16862, null] - - [163, 7, SimpleBlock, 2, 8240167, 16715, null] - - [163, 7, SimpleBlock, 2, 8256886, 17261, null] - - [163, 7, SimpleBlock, 2, 8274151, 17477, null] - - [163, 7, SimpleBlock, 2, 8291631, 5778, null] - - [163, 7, SimpleBlock, 2, 8297413, 17112, null] - - [163, 7, SimpleBlock, 2, 8314529, 17366, null] - - [163, 7, SimpleBlock, 2, 8331899, 17553, null] - - [163, 7, SimpleBlock, 2, 8349456, 17762, null] - - [163, 7, SimpleBlock, 2, 8367222, 17629, null] - - [163, 7, SimpleBlock, 2, 8384854, 5778, null] - - [163, 7, SimpleBlock, 2, 8390636, 17749, null] - - [163, 7, SimpleBlock, 2, 8408389, 18009, null] - - [163, 7, SimpleBlock, 2, 8426402, 17943, null] - - [163, 7, SimpleBlock, 2, 8444349, 17886, null] - - [163, 7, SimpleBlock, 2, 8462238, 5777, null] - - [163, 7, SimpleBlock, 2, 8468019, 18051, null] - - [163, 7, SimpleBlock, 2, 8486074, 17991, null] - - [163, 7, SimpleBlock, 2, 8504069, 17883, null] - - [163, 7, SimpleBlock, 2, 8521956, 17835, null] - - [163, 7, SimpleBlock, 2, 8539795, 17949, null] - - [163, 7, SimpleBlock, 2, 8557747, 5775, null] - - [163, 7, SimpleBlock, 2, 8563526, 17955, null] - - [163, 7, SimpleBlock, 2, 8581485, 17740, null] - - [163, 7, SimpleBlock, 2, 8599229, 17608, null] - - [163, 7, SimpleBlock, 2, 8616841, 17646, null] - - [163, 7, SimpleBlock, 2, 8634490, 1541, null] - - [163, 7, SimpleBlock, 2, 8636035, 17615, null] - - [163, 7, SimpleBlock, 2, 8653653, 6065, null] - - [163, 7, SimpleBlock, 2, 8659722, 17519, null] - - [163, 7, SimpleBlock, 2, 8677245, 17265, null] - - [163, 7, SimpleBlock, 2, 8694514, 17299, null] - - [163, 7, SimpleBlock, 2, 8711817, 17000, null] - - [163, 7, SimpleBlock, 2, 8728821, 17199, null] - - [163, 7, SimpleBlock, 2, 8746023, 5776, null] - - [163, 7, SimpleBlock, 2, 8751803, 16948, null] - - [163, 7, SimpleBlock, 2, 8768755, 16961, null] - - [163, 7, SimpleBlock, 2, 8785720, 16941, null] - - [163, 7, SimpleBlock, 2, 8802665, 16778, null] - - [163, 7, SimpleBlock, 2, 8819447, 16807, null] - - [163, 7, SimpleBlock, 2, 8836257, 5488, null] - - [163, 7, SimpleBlock, 2, 8841749, 16640, null] - - [163, 7, SimpleBlock, 2, 8858393, 16528, null] - - [163, 7, SimpleBlock, 2, 8874925, 16728, null] - - [163, 7, SimpleBlock, 2, 8891656, 16326, null] - - [163, 7, SimpleBlock, 2, 8907985, 5489, null] - - [163, 7, SimpleBlock, 2, 8913478, 16478, null] - - [163, 7, SimpleBlock, 2, 8929959, 16373, null] - - [163, 7, SimpleBlock, 2, 8946336, 16728, null] - - [163, 7, SimpleBlock, 2, 8963068, 16548, null] - - [163, 7, SimpleBlock, 2, 8979620, 16730, null] - - [163, 7, SimpleBlock, 2, 8996353, 5779, null] - - [163, 7, SimpleBlock, 2, 9002136, 16702, null] - - [163, 7, SimpleBlock, 2, 9018842, 16695, null] - - [163, 7, SimpleBlock, 2, 9035541, 16575, null] - - [163, 7, SimpleBlock, 2, 9052120, 16558, null] - - [163, 7, SimpleBlock, 2, 9068682, 16576, null] - - [163, 7, SimpleBlock, 2, 9085261, 5585, null] - - [163, 7, SimpleBlock, 2, 9090850, 16410, null] - - [163, 7, SimpleBlock, 2, 9107264, 16615, null] - - [163, 7, SimpleBlock, 2, 9123883, 16629, null] - - [163, 7, SimpleBlock, 2, 9140516, 16572, null] - - [163, 7, SimpleBlock, 2, 9157091, 5487, null] - - [163, 7, SimpleBlock, 2, 9162582, 16740, null] - - [163, 7, SimpleBlock, 2, 9179326, 16688, null] - - [163, 7, SimpleBlock, 2, 9196018, 16625, null] - - [163, 7, SimpleBlock, 2, 9212647, 17417, null] - - [163, 7, SimpleBlock, 2, 9230068, 17527, null] - - [163, 7, SimpleBlock, 2, 9247598, 5487, null] - - [163, 7, SimpleBlock, 2, 9253089, 17348, null] - - [163, 7, SimpleBlock, 2, 9270441, 17060, null] - - [163, 7, SimpleBlock, 2, 9287505, 16552, null] - - [163, 7, SimpleBlock, 2, 9304060, 16344, null] - - [163, 7, SimpleBlock, 2, 9320407, 5296, null] - - [163, 7, SimpleBlock, 2, 9325706, 16256, null] - - [163, 7, SimpleBlock, 2, 9341965, 15758, null] - - [163, 7, SimpleBlock, 2, 9357726, 15896, null] - - [163, 7, SimpleBlock, 2, 9373625, 15296, null] - - [163, 7, SimpleBlock, 2, 9388924, 15339, null] - - [163, 7, SimpleBlock, 2, 9404266, 5489, null] - - [163, 7, SimpleBlock, 2, 9409758, 14934, null] - - [163, 7, SimpleBlock, 2, 9424695, 14798, null] - - [163, 7, SimpleBlock, 2, 9439496, 14636, null] - - [163, 7, SimpleBlock, 2, 9454135, 14532, null] - - [163, 7, SimpleBlock, 2, 9468670, 14366, null] - - [163, 7, SimpleBlock, 2, 9483039, 5583, null] - - [163, 7, SimpleBlock, 2, 9488625, 14350, null] - - [163, 7, SimpleBlock, 2, 9502978, 14273, null] - - [163, 7, SimpleBlock, 2, 9517254, 14005, null] - - [163, 7, SimpleBlock, 2, 9531262, 14068, null] - - [163, 7, SimpleBlock, 2, 9545333, 5583, null] - - [163, 7, SimpleBlock, 2, 9550919, 14134, null] - - [163, 7, SimpleBlock, 2, 9565056, 13834, null] - - [163, 7, SimpleBlock, 2, 9578893, 13920, null] - - [163, 7, SimpleBlock, 2, 9592816, 13837, null] - - [163, 7, SimpleBlock, 2, 9606656, 13788, null] - - [163, 7, SimpleBlock, 2, 9620447, 5487, null] - - [163, 7, SimpleBlock, 2, 9625937, 13746, null] - - [163, 7, SimpleBlock, 2, 9639686, 13819, null] - - [163, 7, SimpleBlock, 2, 9653508, 13907, null] - - [163, 7, SimpleBlock, 2, 9667418, 13995, null] - - [163, 7, SimpleBlock, 2, 9681416, 964, null] - - [163, 7, SimpleBlock, 2, 9682383, 14023, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 9696414 - - 3744132 - - - [231, 1, Timecode, 2, 9696416, 2, 32500] - - [163, 7, SimpleBlock, 2, 9696421, 5584, null] - - [163, 7, SimpleBlock, 2, 9702009, 58285, null] - - [163, 7, SimpleBlock, 2, 9760297, 8074, null] - - [163, 7, SimpleBlock, 2, 9768374, 11664, null] - - [163, 7, SimpleBlock, 2, 9780041, 12436, null] - - [163, 7, SimpleBlock, 2, 9792480, 13719, null] - - [163, 7, SimpleBlock, 2, 9806202, 5679, null] - - [163, 7, SimpleBlock, 2, 9811884, 14117, null] - - [163, 7, SimpleBlock, 2, 9826004, 14219, null] - - [163, 7, SimpleBlock, 2, 9840226, 14317, null] - - [163, 7, SimpleBlock, 2, 9854546, 14481, null] - - [163, 7, SimpleBlock, 2, 9869030, 5490, null] - - [163, 7, SimpleBlock, 2, 9874523, 14660, null] - - [163, 7, SimpleBlock, 2, 9889186, 14854, null] - - [163, 7, SimpleBlock, 2, 9904043, 14980, null] - - [163, 7, SimpleBlock, 2, 9919026, 15380, null] - - [163, 7, SimpleBlock, 2, 9934409, 15522, null] - - [163, 7, SimpleBlock, 2, 9949934, 5779, null] - - [163, 7, SimpleBlock, 2, 9955716, 15621, null] - - [163, 7, SimpleBlock, 2, 9971340, 15669, null] - - [163, 7, SimpleBlock, 2, 9987012, 15890, null] - - [163, 7, SimpleBlock, 2, 10002905, 16299, null] - - [163, 7, SimpleBlock, 2, 10019207, 5969, null] - - [163, 7, SimpleBlock, 2, 10025179, 16299, null] - - [163, 7, SimpleBlock, 2, 10041482, 16612, null] - - [163, 7, SimpleBlock, 2, 10058098, 17028, null] - - [163, 7, SimpleBlock, 2, 10075130, 17286, null] - - [163, 7, SimpleBlock, 2, 10092420, 17238, null] - - [163, 7, SimpleBlock, 2, 10109661, 5585, null] - - [163, 7, SimpleBlock, 2, 10115250, 17673, null] - - [163, 7, SimpleBlock, 2, 10132927, 17702, null] - - [163, 7, SimpleBlock, 2, 10150633, 18215, null] - - [163, 7, SimpleBlock, 2, 10168852, 18454, null] - - [163, 7, SimpleBlock, 2, 10187310, 18997, null] - - [163, 7, SimpleBlock, 2, 10206310, 5969, null] - - [163, 7, SimpleBlock, 2, 10212283, 19148, null] - - [163, 7, SimpleBlock, 2, 10231435, 19526, null] - - [163, 7, SimpleBlock, 2, 10250965, 16685, null] - - [163, 7, SimpleBlock, 2, 10267654, 16395, null] - - [163, 7, SimpleBlock, 2, 10284052, 5778, null] - - [163, 7, SimpleBlock, 2, 10289833, 16114, null] - - [163, 7, SimpleBlock, 2, 10305950, 16376, null] - - [163, 7, SimpleBlock, 2, 10322329, 16074, null] - - [163, 7, SimpleBlock, 2, 10338406, 16202, null] - - [163, 7, SimpleBlock, 2, 10354611, 16277, null] - - [163, 7, SimpleBlock, 2, 10370891, 5873, null] - - [163, 7, SimpleBlock, 2, 10376767, 16211, null] - - [163, 7, SimpleBlock, 2, 10392981, 16342, null] - - [163, 7, SimpleBlock, 2, 10409326, 16294, null] - - [163, 7, SimpleBlock, 2, 10425623, 16227, null] - - [163, 7, SimpleBlock, 2, 10441853, 5969, null] - - [163, 7, SimpleBlock, 2, 10447825, 16131, null] - - [163, 7, SimpleBlock, 2, 10463959, 16256, null] - - [163, 7, SimpleBlock, 2, 10480219, 16528, null] - - [163, 7, SimpleBlock, 2, 10496750, 16212, null] - - [163, 7, SimpleBlock, 2, 10512965, 16157, null] - - [163, 7, SimpleBlock, 2, 10529125, 5872, null] - - [163, 7, SimpleBlock, 2, 10535000, 16235, null] - - [163, 7, SimpleBlock, 2, 10551238, 15984, null] - - [163, 7, SimpleBlock, 2, 10567225, 16158, null] - - [163, 7, SimpleBlock, 2, 10583386, 16233, null] - - [163, 7, SimpleBlock, 2, 10599622, 16083, null] - - [163, 7, SimpleBlock, 2, 10615708, 6162, null] - - [163, 7, SimpleBlock, 2, 10621873, 16186, null] - - [163, 7, SimpleBlock, 2, 10638062, 16047, null] - - [163, 7, SimpleBlock, 2, 10654112, 15948, null] - - [163, 7, SimpleBlock, 2, 10670063, 16103, null] - - [163, 7, SimpleBlock, 2, 10686169, 6065, null] - - [163, 7, SimpleBlock, 2, 10692237, 16048, null] - - [163, 7, SimpleBlock, 2, 10708288, 16064, null] - - [163, 7, SimpleBlock, 2, 10724355, 15899, null] - - [163, 7, SimpleBlock, 2, 10740257, 15995, null] - - [163, 7, SimpleBlock, 2, 10756255, 16002, null] - - [163, 7, SimpleBlock, 2, 10772260, 6065, null] - - [163, 7, SimpleBlock, 2, 10778328, 16105, null] - - [163, 7, SimpleBlock, 2, 10794436, 15916, null] - - [163, 7, SimpleBlock, 2, 10810355, 16022, null] - - [163, 7, SimpleBlock, 2, 10826380, 15944, null] - - [163, 7, SimpleBlock, 2, 10842327, 6066, null] - - [163, 7, SimpleBlock, 2, 10848396, 15894, null] - - [163, 7, SimpleBlock, 2, 10864293, 15821, null] - - [163, 7, SimpleBlock, 2, 10880117, 15998, null] - - [163, 7, SimpleBlock, 2, 10896118, 15774, null] - - [163, 7, SimpleBlock, 2, 10911895, 15840, null] - - [163, 7, SimpleBlock, 2, 10927738, 6546, null] - - [163, 7, SimpleBlock, 2, 10934287, 15857, null] - - [163, 7, SimpleBlock, 2, 10950147, 15871, null] - - [163, 7, SimpleBlock, 2, 10966021, 15709, null] - - [163, 7, SimpleBlock, 2, 10981733, 15836, null] - - [163, 7, SimpleBlock, 2, 10997572, 15847, null] - - [163, 7, SimpleBlock, 2, 11013422, 6162, null] - - [163, 7, SimpleBlock, 2, 11019587, 15943, null] - - [163, 7, SimpleBlock, 2, 11035533, 15875, null] - - [163, 7, SimpleBlock, 2, 11051411, 15777, null] - - [163, 7, SimpleBlock, 2, 11067191, 15896, null] - - [163, 7, SimpleBlock, 2, 11083090, 6255, null] - - [163, 7, SimpleBlock, 2, 11089348, 15755, null] - - [163, 7, SimpleBlock, 2, 11105106, 15815, null] - - [163, 7, SimpleBlock, 2, 11120924, 15742, null] - - [163, 7, SimpleBlock, 2, 11136669, 15718, null] - - [163, 7, SimpleBlock, 2, 11152390, 15628, null] - - [163, 7, SimpleBlock, 2, 11168021, 964, null] - - [163, 7, SimpleBlock, 2, 11168988, 6161, null] - - [163, 7, SimpleBlock, 2, 11175152, 15743, null] - - [163, 7, SimpleBlock, 2, 11190898, 15651, null] - - [163, 7, SimpleBlock, 2, 11206552, 15646, null] - - [163, 7, SimpleBlock, 2, 11222201, 15666, null] - - [163, 7, SimpleBlock, 2, 11237870, 15600, null] - - [163, 7, SimpleBlock, 2, 11253473, 6354, null] - - [163, 7, SimpleBlock, 2, 11259830, 15472, null] - - [163, 7, SimpleBlock, 2, 11275305, 15276, null] - - [163, 7, SimpleBlock, 2, 11290584, 15429, null] - - [163, 7, SimpleBlock, 2, 11306016, 15363, null] - - [163, 7, SimpleBlock, 2, 11321382, 15264, null] - - [163, 7, SimpleBlock, 2, 11336649, 6256, null] - - [163, 7, SimpleBlock, 2, 11342908, 15189, null] - - [163, 7, SimpleBlock, 2, 11358100, 15429, null] - - [163, 7, SimpleBlock, 2, 11373532, 15182, null] - - [163, 7, SimpleBlock, 2, 11388717, 15176, null] - - [163, 7, SimpleBlock, 2, 11403896, 6258, null] - - [163, 7, SimpleBlock, 2, 11410157, 15160, null] - - [163, 7, SimpleBlock, 2, 11425320, 15084, null] - - [163, 7, SimpleBlock, 2, 11440407, 15027, null] - - [163, 7, SimpleBlock, 2, 11455437, 15087, null] - - [163, 7, SimpleBlock, 2, 11470527, 15308, null] - - [163, 7, SimpleBlock, 2, 11485838, 6643, null] - - [163, 7, SimpleBlock, 2, 11492484, 14960, null] - - [163, 7, SimpleBlock, 2, 11507447, 15005, null] - - [163, 7, SimpleBlock, 2, 11522455, 15128, null] - - [163, 7, SimpleBlock, 2, 11537586, 15124, null] - - [163, 7, SimpleBlock, 2, 11552713, 15103, null] - - [163, 7, SimpleBlock, 2, 11567819, 6354, null] - - [163, 7, SimpleBlock, 2, 11574176, 15080, null] - - [163, 7, SimpleBlock, 2, 11589259, 15014, null] - - [163, 7, SimpleBlock, 2, 11604276, 14951, null] - - [163, 7, SimpleBlock, 2, 11619230, 14915, null] - - [163, 7, SimpleBlock, 2, 11634148, 6256, null] - - [163, 7, SimpleBlock, 2, 11640407, 14819, null] - - [163, 7, SimpleBlock, 2, 11655229, 14729, null] - - [163, 7, SimpleBlock, 2, 11669961, 14715, null] - - [163, 7, SimpleBlock, 2, 11684679, 14801, null] - - [163, 7, SimpleBlock, 2, 11699483, 14828, null] - - [163, 7, SimpleBlock, 2, 11714314, 6258, null] - - [163, 7, SimpleBlock, 2, 11720575, 14604, null] - - [163, 7, SimpleBlock, 2, 11735182, 14649, null] - - [163, 7, SimpleBlock, 2, 11749834, 14712, null] - - [163, 7, SimpleBlock, 2, 11764549, 14456, null] - - [163, 7, SimpleBlock, 2, 11779008, 6162, null] - - [163, 7, SimpleBlock, 2, 11785173, 14612, null] - - [163, 7, SimpleBlock, 2, 11799788, 14464, null] - - [163, 7, SimpleBlock, 2, 11814255, 14548, null] - - [163, 7, SimpleBlock, 2, 11828806, 14477, null] - - [163, 7, SimpleBlock, 2, 11843286, 14547, null] - - [163, 7, SimpleBlock, 2, 11857836, 6162, null] - - [163, 7, SimpleBlock, 2, 11864001, 14432, null] - - [163, 7, SimpleBlock, 2, 11878436, 14322, null] - - [163, 7, SimpleBlock, 2, 11892761, 14270, null] - - [163, 7, SimpleBlock, 2, 11907034, 14174, null] - - [163, 7, SimpleBlock, 2, 11921211, 14244, null] - - [163, 7, SimpleBlock, 2, 11935458, 5968, null] - - [163, 7, SimpleBlock, 2, 11941429, 14147, null] - - [163, 7, SimpleBlock, 2, 11955579, 14105, null] - - [163, 7, SimpleBlock, 2, 11969687, 14050, null] - - [163, 7, SimpleBlock, 2, 11983740, 14133, null] - - [163, 7, SimpleBlock, 2, 11997876, 5966, null] - - [163, 7, SimpleBlock, 2, 12003845, 14114, null] - - [163, 7, SimpleBlock, 2, 12017962, 13853, null] - - [163, 7, SimpleBlock, 2, 12031818, 14074, null] - - [163, 7, SimpleBlock, 2, 12045895, 13788, null] - - [163, 7, SimpleBlock, 2, 12059686, 13645, null] - - [163, 7, SimpleBlock, 2, 12073334, 5872, null] - - [163, 7, SimpleBlock, 2, 12079209, 13645, null] - - [163, 7, SimpleBlock, 2, 12092857, 13742, null] - - [163, 7, SimpleBlock, 2, 12106602, 13511, null] - - [163, 7, SimpleBlock, 2, 12120116, 13642, null] - - [163, 7, SimpleBlock, 2, 12133761, 5871, null] - - [163, 7, SimpleBlock, 2, 12139635, 13525, null] - - [163, 7, SimpleBlock, 2, 12153163, 13417, null] - - [163, 7, SimpleBlock, 2, 12166583, 13399, null] - - [163, 7, SimpleBlock, 2, 12179985, 13388, null] - - [163, 7, SimpleBlock, 2, 12193376, 13531, null] - - [163, 7, SimpleBlock, 2, 12206910, 5776, null] - - [163, 7, SimpleBlock, 2, 12212689, 13370, null] - - [163, 7, SimpleBlock, 2, 12226062, 13288, null] - - [163, 7, SimpleBlock, 2, 12239353, 13187, null] - - [163, 7, SimpleBlock, 2, 12252543, 13400, null] - - [163, 7, SimpleBlock, 2, 12265946, 13324, null] - - [163, 7, SimpleBlock, 2, 12279273, 5776, null] - - [163, 7, SimpleBlock, 2, 12285052, 13383, null] - - [163, 7, SimpleBlock, 2, 12298438, 13326, null] - - [163, 7, SimpleBlock, 2, 12311767, 13233, null] - - [163, 7, SimpleBlock, 2, 12325003, 13224, null] - - [163, 7, SimpleBlock, 2, 12338230, 5393, null] - - [163, 7, SimpleBlock, 2, 12343626, 13395, null] - - [163, 7, SimpleBlock, 2, 12357024, 13150, null] - - [163, 7, SimpleBlock, 2, 12370177, 13085, null] - - [163, 7, SimpleBlock, 2, 12383265, 13142, null] - - [163, 7, SimpleBlock, 2, 12396410, 12979, null] - - [163, 7, SimpleBlock, 2, 12409392, 5391, null] - - [163, 7, SimpleBlock, 2, 12414786, 13151, null] - - [163, 7, SimpleBlock, 2, 12427940, 12982, null] - - [163, 7, SimpleBlock, 2, 12440925, 12778, null] - - [163, 7, SimpleBlock, 2, 12453706, 12569, null] - - [163, 7, SimpleBlock, 2, 12466278, 5681, null] - - [163, 7, SimpleBlock, 2, 12471962, 12672, null] - - [163, 7, SimpleBlock, 2, 12484637, 12435, null] - - [163, 7, SimpleBlock, 2, 12497075, 12408, null] - - [163, 7, SimpleBlock, 2, 12509486, 12258, null] - - [163, 7, SimpleBlock, 2, 12521747, 12327, null] - - [163, 7, SimpleBlock, 2, 12534077, 5970, null] - - [163, 7, SimpleBlock, 2, 12540050, 12242, null] - - [163, 7, SimpleBlock, 2, 12552295, 12099, null] - - [163, 7, SimpleBlock, 2, 12564397, 12248, null] - - [163, 7, SimpleBlock, 2, 12576648, 11962, null] - - [163, 7, SimpleBlock, 2, 12588613, 11927, null] - - [163, 7, SimpleBlock, 2, 12600543, 5874, null] - - [163, 7, SimpleBlock, 2, 12606420, 11981, null] - - [163, 7, SimpleBlock, 2, 12618404, 11902, null] - - [163, 7, SimpleBlock, 2, 12630309, 11921, null] - - [163, 7, SimpleBlock, 2, 12642233, 11689, null] - - [163, 7, SimpleBlock, 2, 12653925, 2794, null] - - [163, 7, SimpleBlock, 2, 12656722, 11864, null] - - [163, 7, SimpleBlock, 2, 12668589, 11531, null] - - [163, 7, SimpleBlock, 2, 12680123, 11632, null] - - [163, 7, SimpleBlock, 2, 12691758, 5777, null] - - [163, 7, SimpleBlock, 2, 12697538, 11429, null] - - [163, 7, SimpleBlock, 2, 12708970, 11526, null] - - [163, 7, SimpleBlock, 2, 12720499, 11214, null] - - [163, 7, SimpleBlock, 2, 12731716, 11362, null] - - [163, 7, SimpleBlock, 2, 12743081, 5585, null] - - [163, 7, SimpleBlock, 2, 12748669, 11338, null] - - [163, 7, SimpleBlock, 2, 12760010, 11249, null] - - [163, 7, SimpleBlock, 2, 12771262, 11295, null] - - [163, 7, SimpleBlock, 2, 12782560, 11137, null] - - [163, 7, SimpleBlock, 2, 12793700, 11203, null] - - [163, 7, SimpleBlock, 2, 12804906, 5395, null] - - [163, 7, SimpleBlock, 2, 12810304, 11042, null] - - [163, 7, SimpleBlock, 2, 12821349, 11145, null] - - [163, 7, SimpleBlock, 2, 12832497, 10864, null] - - [163, 7, SimpleBlock, 2, 12843364, 10885, null] - - [163, 7, SimpleBlock, 2, 12854252, 5680, null] - - [163, 7, SimpleBlock, 2, 12859935, 10829, null] - - [163, 7, SimpleBlock, 2, 12870767, 10656, null] - - [163, 7, SimpleBlock, 2, 12881426, 10698, null] - - [163, 7, SimpleBlock, 2, 12892127, 10718, null] - - [163, 7, SimpleBlock, 2, 12902848, 10663, null] - - [163, 7, SimpleBlock, 2, 12913514, 5393, null] - - [163, 7, SimpleBlock, 2, 12918910, 10615, null] - - [163, 7, SimpleBlock, 2, 12929528, 10614, null] - - [163, 7, SimpleBlock, 2, 12940145, 10528, null] - - [163, 7, SimpleBlock, 2, 12950676, 10479, null] - - [163, 7, SimpleBlock, 2, 12961158, 10358, null] - - [163, 7, SimpleBlock, 2, 12971519, 5487, null] - - [163, 7, SimpleBlock, 2, 12977009, 10405, null] - - [163, 7, SimpleBlock, 2, 12987417, 10152, null] - - [163, 7, SimpleBlock, 2, 12997572, 10226, null] - - [163, 7, SimpleBlock, 2, 13007801, 10300, null] - - [163, 7, SimpleBlock, 2, 13018104, 5104, null] - - [163, 7, SimpleBlock, 2, 13023211, 10268, null] - - [163, 7, SimpleBlock, 2, 13033482, 10148, null] - - [163, 7, SimpleBlock, 2, 13043633, 10309, null] - - [163, 7, SimpleBlock, 2, 13053945, 10178, null] - - [163, 7, SimpleBlock, 2, 13064126, 10096, null] - - [163, 7, SimpleBlock, 2, 13074225, 5201, null] - - [163, 7, SimpleBlock, 2, 13079429, 10085, null] - - [163, 7, SimpleBlock, 2, 13089517, 10239, null] - - [163, 7, SimpleBlock, 2, 13099759, 10113, null] - - [163, 7, SimpleBlock, 2, 13109875, 10129, null] - - [163, 7, SimpleBlock, 2, 13120007, 5008, null] - - [163, 7, SimpleBlock, 2, 13125018, 10090, null] - - [163, 7, SimpleBlock, 2, 13135111, 10152, null] - - [163, 7, SimpleBlock, 2, 13145266, 10211, null] - - [163, 7, SimpleBlock, 2, 13155480, 9935, null] - - [163, 7, SimpleBlock, 2, 13165418, 10088, null] - - [163, 7, SimpleBlock, 2, 13175509, 5202, null] - - [163, 7, SimpleBlock, 2, 13180714, 9887, null] - - [163, 7, SimpleBlock, 2, 13190604, 9798, null] - - [163, 7, SimpleBlock, 2, 13200405, 9855, null] - - [163, 7, SimpleBlock, 2, 13210263, 9677, null] - - [163, 7, SimpleBlock, 2, 13219943, 9497, null] - - [163, 7, SimpleBlock, 2, 13229443, 5585, null] - - [163, 7, SimpleBlock, 2, 13235031, 9425, null] - - [163, 7, SimpleBlock, 2, 13244459, 9598, null] - - [163, 7, SimpleBlock, 2, 13254060, 9206, null] - - [163, 7, SimpleBlock, 2, 13263269, 9294, null] - - [163, 7, SimpleBlock, 2, 13272566, 6354, null] - - [163, 7, SimpleBlock, 2, 13278923, 9149, null] - - [163, 7, SimpleBlock, 2, 13288075, 9011, null] - - [163, 7, SimpleBlock, 2, 13297089, 8892, null] - - [163, 7, SimpleBlock, 2, 13305984, 8677, null] - - [163, 7, SimpleBlock, 2, 13314664, 8752, null] - - [163, 7, SimpleBlock, 2, 13323419, 6547, null] - - [163, 7, SimpleBlock, 2, 13329969, 8803, null] - - [163, 7, SimpleBlock, 2, 13338775, 8670, null] - - [163, 7, SimpleBlock, 2, 13347448, 8642, null] - - [163, 7, SimpleBlock, 2, 13356093, 8631, null] - - [163, 7, SimpleBlock, 2, 13364727, 5682, null] - - [163, 7, SimpleBlock, 2, 13370412, 8570, null] - - [163, 7, SimpleBlock, 2, 13378985, 8420, null] - - [163, 7, SimpleBlock, 2, 13387408, 8489, null] - - [163, 7, SimpleBlock, 2, 13395900, 8492, null] - - [163, 7, SimpleBlock, 2, 13404395, 8290, null] - - [163, 7, SimpleBlock, 2, 13412688, 2793, null] - - [163, 7, SimpleBlock, 2, 13415484, 8296, null] - - [163, 7, SimpleBlock, 2, 13423783, 8405, null] - - [163, 7, SimpleBlock, 2, 13432191, 8355, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 13440554 - - 3249549 - - - [231, 1, Timecode, 2, 13440556, 2, 42917] - - [163, 7, SimpleBlock, 2, 13440561, 676, null] - - [163, 7, SimpleBlock, 2, 13441240, 5489, null] - - [163, 7, SimpleBlock, 2, 13446733, 51446, null] - - [163, 7, SimpleBlock, 2, 13498182, 4220, null] - - [163, 7, SimpleBlock, 2, 13502405, 6526, null] - - [163, 7, SimpleBlock, 2, 13508934, 6389, null] - - [163, 7, SimpleBlock, 2, 13515326, 7048, null] - - [163, 7, SimpleBlock, 2, 13522377, 5490, null] - - [163, 7, SimpleBlock, 2, 13527870, 6914, null] - - [163, 7, SimpleBlock, 2, 13534787, 7116, null] - - [163, 7, SimpleBlock, 2, 13541906, 7356, null] - - [163, 7, SimpleBlock, 2, 13549265, 7645, null] - - [163, 7, SimpleBlock, 2, 13556913, 5585, null] - - [163, 7, SimpleBlock, 2, 13562501, 7360, null] - - [163, 7, SimpleBlock, 2, 13569864, 7213, null] - - [163, 7, SimpleBlock, 2, 13577080, 7193, null] - - [163, 7, SimpleBlock, 2, 13584276, 7232, null] - - [163, 7, SimpleBlock, 2, 13591511, 7281, null] - - [163, 7, SimpleBlock, 2, 13598795, 5680, null] - - [163, 7, SimpleBlock, 2, 13604478, 7357, null] - - [163, 7, SimpleBlock, 2, 13611838, 7403, null] - - [163, 7, SimpleBlock, 2, 13619244, 7427, null] - - [163, 7, SimpleBlock, 2, 13626674, 7673, null] - - [163, 7, SimpleBlock, 2, 13634350, 5489, null] - - [163, 7, SimpleBlock, 2, 13639842, 7819, null] - - [163, 7, SimpleBlock, 2, 13647664, 8057, null] - - [163, 7, SimpleBlock, 2, 13655724, 8240, null] - - [163, 7, SimpleBlock, 2, 13663967, 8555, null] - - [163, 7, SimpleBlock, 2, 13672525, 8858, null] - - [163, 7, SimpleBlock, 2, 13681386, 5381, null] - - [163, 7, SimpleBlock, 2, 13686770, 9423, null] - - [163, 7, SimpleBlock, 2, 13696196, 9727, null] - - [163, 7, SimpleBlock, 2, 13705926, 10330, null] - - [163, 7, SimpleBlock, 2, 13716259, 10596, null] - - [163, 7, SimpleBlock, 2, 13726858, 10571, null] - - [163, 7, SimpleBlock, 2, 13737432, 5683, null] - - [163, 7, SimpleBlock, 2, 13743118, 10613, null] - - [163, 7, SimpleBlock, 2, 13753734, 10893, null] - - [163, 7, SimpleBlock, 2, 13764630, 11063, null] - - [163, 7, SimpleBlock, 2, 13775696, 10909, null] - - [163, 7, SimpleBlock, 2, 13786608, 5486, null] - - [163, 7, SimpleBlock, 2, 13792097, 10803, null] - - [163, 7, SimpleBlock, 2, 13802903, 10949, null] - - [163, 7, SimpleBlock, 2, 13813855, 10796, null] - - [163, 7, SimpleBlock, 2, 13824654, 10855, null] - - [163, 7, SimpleBlock, 2, 13835512, 10674, null] - - [163, 7, SimpleBlock, 2, 13846189, 5200, null] - - [163, 7, SimpleBlock, 2, 13851392, 10485, null] - - [163, 7, SimpleBlock, 2, 13861880, 10737, null] - - [163, 7, SimpleBlock, 2, 13872620, 10837, null] - - [163, 7, SimpleBlock, 2, 13883460, 11119, null] - - [163, 7, SimpleBlock, 2, 13894582, 6161, null] - - [163, 7, SimpleBlock, 2, 13900746, 11117, null] - - [163, 7, SimpleBlock, 2, 13911866, 11056, null] - - [163, 7, SimpleBlock, 2, 13922925, 11181, null] - - [163, 7, SimpleBlock, 2, 13934109, 11216, null] - - [163, 7, SimpleBlock, 2, 13945328, 11249, null] - - [163, 7, SimpleBlock, 2, 13956580, 6161, null] - - [163, 7, SimpleBlock, 2, 13962744, 11095, null] - - [163, 7, SimpleBlock, 2, 13973842, 11220, null] - - [163, 7, SimpleBlock, 2, 13985065, 11147, null] - - [163, 7, SimpleBlock, 2, 13996215, 11224, null] - - [163, 7, SimpleBlock, 2, 14007442, 11201, null] - - [163, 7, SimpleBlock, 2, 14018646, 5491, null] - - [163, 7, SimpleBlock, 2, 14024140, 11272, null] - - [163, 7, SimpleBlock, 2, 14035415, 11123, null] - - [163, 7, SimpleBlock, 2, 14046541, 11354, null] - - [163, 7, SimpleBlock, 2, 14057898, 11251, null] - - [163, 7, SimpleBlock, 2, 14069152, 5873, null] - - [163, 7, SimpleBlock, 2, 14075028, 11219, null] - - [163, 7, SimpleBlock, 2, 14086250, 11150, null] - - [163, 7, SimpleBlock, 2, 14097403, 11010, null] - - [163, 7, SimpleBlock, 2, 14108416, 11187, null] - - [163, 7, SimpleBlock, 2, 14119606, 11061, null] - - [163, 7, SimpleBlock, 2, 14130670, 5680, null] - - [163, 7, SimpleBlock, 2, 14136353, 10999, null] - - [163, 7, SimpleBlock, 2, 14147355, 10922, null] - - [163, 7, SimpleBlock, 2, 14158280, 10778, null] - - [163, 7, SimpleBlock, 2, 14169061, 10831, null] - - [163, 7, SimpleBlock, 2, 14179895, 5969, null] - - [163, 7, SimpleBlock, 2, 14185867, 10646, null] - - [163, 7, SimpleBlock, 2, 14196516, 10783, null] - - [163, 7, SimpleBlock, 2, 14207302, 10694, null] - - [163, 7, SimpleBlock, 2, 14217999, 10551, null] - - [163, 7, SimpleBlock, 2, 14228553, 10232, null] - - [163, 7, SimpleBlock, 2, 14238788, 5488, null] - - [163, 7, SimpleBlock, 2, 14244279, 10166, null] - - [163, 7, SimpleBlock, 2, 14254448, 10369, null] - - [163, 7, SimpleBlock, 2, 14264820, 10309, null] - - [163, 7, SimpleBlock, 2, 14275132, 10050, null] - - [163, 7, SimpleBlock, 2, 14285185, 9831, null] - - [163, 7, SimpleBlock, 2, 14295019, 5381, null] - - [163, 7, SimpleBlock, 2, 14300403, 9790, null] - - [163, 7, SimpleBlock, 2, 14310196, 9781, null] - - [163, 7, SimpleBlock, 2, 14319980, 9691, null] - - [163, 7, SimpleBlock, 2, 14329674, 9640, null] - - [163, 7, SimpleBlock, 2, 14339317, 5968, null] - - [163, 7, SimpleBlock, 2, 14345288, 9567, null] - - [163, 7, SimpleBlock, 2, 14354858, 9593, null] - - [163, 7, SimpleBlock, 2, 14364454, 9481, null] - - [163, 7, SimpleBlock, 2, 14373938, 9196, null] - - [163, 7, SimpleBlock, 2, 14383137, 9329, null] - - [163, 7, SimpleBlock, 2, 14392469, 5970, null] - - [163, 7, SimpleBlock, 2, 14398442, 9824, null] - - [163, 7, SimpleBlock, 2, 14408269, 10746, null] - - [163, 7, SimpleBlock, 2, 14419018, 11335, null] - - [163, 7, SimpleBlock, 2, 14430356, 10367, null] - - [163, 7, SimpleBlock, 2, 14440726, 12364, null] - - [163, 7, SimpleBlock, 2, 14453093, 5489, null] - - [163, 7, SimpleBlock, 2, 14458585, 12120, null] - - [163, 7, SimpleBlock, 2, 14470708, 12407, null] - - [163, 7, SimpleBlock, 2, 14483118, 11822, null] - - [163, 7, SimpleBlock, 2, 14494943, 9897, null] - - [163, 7, SimpleBlock, 2, 14504843, 5873, null] - - [163, 7, SimpleBlock, 2, 14510719, 9439, null] - - [163, 7, SimpleBlock, 2, 14520161, 8651, null] - - [163, 7, SimpleBlock, 2, 14528815, 7775, null] - - [163, 7, SimpleBlock, 2, 14536593, 6840, null] - - [163, 7, SimpleBlock, 2, 14543436, 6619, null] - - [163, 7, SimpleBlock, 2, 14550058, 5583, null] - - [163, 7, SimpleBlock, 2, 14555644, 6141, null] - - [163, 7, SimpleBlock, 2, 14561788, 6076, null] - - [163, 7, SimpleBlock, 2, 14567867, 6044, null] - - [163, 7, SimpleBlock, 2, 14573914, 5676, null] - - [163, 7, SimpleBlock, 2, 14579593, 5490, null] - - [163, 7, SimpleBlock, 2, 14585086, 5501, null] - - [163, 7, SimpleBlock, 2, 14590590, 5301, null] - - [163, 7, SimpleBlock, 2, 14595894, 5021, null] - - [163, 7, SimpleBlock, 2, 14600918, 4890, null] - - [163, 7, SimpleBlock, 2, 14605811, 4454, null] - - [163, 7, SimpleBlock, 2, 14610268, 5295, null] - - [163, 7, SimpleBlock, 2, 14615566, 4043, null] - - [163, 7, SimpleBlock, 2, 14619612, 3760, null] - - [163, 7, SimpleBlock, 2, 14623375, 3239, null] - - [163, 7, SimpleBlock, 2, 14626617, 3786, null] - - [163, 7, SimpleBlock, 2, 14630406, 6048, null] - - [163, 7, SimpleBlock, 2, 14636457, 5393, null] - - [163, 7, SimpleBlock, 2, 14641853, 7637, null] - - [163, 7, SimpleBlock, 2, 14649493, 9427, null] - - [163, 7, SimpleBlock, 2, 14658923, 10261, null] - - [163, 7, SimpleBlock, 2, 14669187, 10309, null] - - [163, 7, SimpleBlock, 2, 14679499, 5485, null] - - [163, 7, SimpleBlock, 2, 14684988, 81128, null] - - [163, 7, SimpleBlock, 2, 14766119, 2985, null] - - [163, 7, SimpleBlock, 2, 14769107, 4541, null] - - [163, 7, SimpleBlock, 2, 14773651, 5172, null] - - [163, 7, SimpleBlock, 2, 14778826, 7922, null] - - [163, 7, SimpleBlock, 2, 14786751, 5392, null] - - [163, 7, SimpleBlock, 2, 14792146, 9646, null] - - [163, 7, SimpleBlock, 2, 14801795, 12038, null] - - [163, 7, SimpleBlock, 2, 14813836, 13795, null] - - [163, 7, SimpleBlock, 2, 14827634, 14528, null] - - [163, 7, SimpleBlock, 2, 14842165, 5681, null] - - [163, 7, SimpleBlock, 2, 14847849, 15597, null] - - [163, 7, SimpleBlock, 2, 14863450, 16822, null] - - [163, 7, SimpleBlock, 2, 14880276, 18050, null] - - [163, 7, SimpleBlock, 2, 14898330, 18837, null] - - [163, 7, SimpleBlock, 2, 14917171, 19247, null] - - [163, 7, SimpleBlock, 2, 14936421, 5392, null] - - [163, 7, SimpleBlock, 2, 14941817, 19069, null] - - [163, 7, SimpleBlock, 2, 14960890, 19463, null] - - [163, 7, SimpleBlock, 2, 14980357, 19931, null] - - [163, 7, SimpleBlock, 2, 15000292, 20799, null] - - [163, 7, SimpleBlock, 2, 15021095, 21176, null] - - [163, 7, SimpleBlock, 2, 15042274, 5487, null] - - [163, 7, SimpleBlock, 2, 15047765, 21537, null] - - [163, 7, SimpleBlock, 2, 15069306, 22280, null] - - [163, 7, SimpleBlock, 2, 15091590, 22732, null] - - [163, 7, SimpleBlock, 2, 15114326, 23371, null] - - [163, 7, SimpleBlock, 2, 15137700, 5678, null] - - [163, 7, SimpleBlock, 2, 15143382, 23440, null] - - [163, 7, SimpleBlock, 2, 15166826, 22016, null] - - [163, 7, SimpleBlock, 2, 15188846, 21824, null] - - [163, 7, SimpleBlock, 2, 15210674, 21546, null] - - [163, 7, SimpleBlock, 2, 15232224, 21501, null] - - [163, 7, SimpleBlock, 2, 15253728, 5585, null] - - [163, 7, SimpleBlock, 2, 15259317, 22122, null] - - [163, 7, SimpleBlock, 2, 15281443, 21956, null] - - [163, 7, SimpleBlock, 2, 15303403, 22514, null] - - [163, 7, SimpleBlock, 2, 15325921, 22574, null] - - [163, 7, SimpleBlock, 2, 15348498, 5489, null] - - [163, 7, SimpleBlock, 2, 15353991, 22991, null] - - [163, 7, SimpleBlock, 2, 15376986, 23508, null] - - [163, 7, SimpleBlock, 2, 15400498, 23870, null] - - [163, 7, SimpleBlock, 2, 15424372, 24440, null] - - [163, 7, SimpleBlock, 2, 15448816, 25013, null] - - [163, 7, SimpleBlock, 2, 15473832, 5199, null] - - [163, 7, SimpleBlock, 2, 15479035, 25337, null] - - [163, 7, SimpleBlock, 2, 15504376, 24717, null] - - [163, 7, SimpleBlock, 2, 15529097, 24623, null] - - [163, 7, SimpleBlock, 2, 15553724, 24344, null] - - [163, 7, SimpleBlock, 2, 15578072, 23717, null] - - [163, 7, SimpleBlock, 2, 15601792, 5680, null] - - [163, 7, SimpleBlock, 2, 15607476, 23417, null] - - [163, 7, SimpleBlock, 2, 15630897, 23226, null] - - [163, 7, SimpleBlock, 2, 15654127, 22676, null] - - [163, 7, SimpleBlock, 2, 15676807, 21990, null] - - [163, 7, SimpleBlock, 2, 15698800, 5776, null] - - [163, 7, SimpleBlock, 2, 15704580, 21261, null] - - [163, 7, SimpleBlock, 2, 15725845, 20986, null] - - [163, 7, SimpleBlock, 2, 15746835, 20141, null] - - [163, 7, SimpleBlock, 2, 15766980, 19845, null] - - [163, 7, SimpleBlock, 2, 15786829, 19632, null] - - [163, 7, SimpleBlock, 2, 15806464, 5875, null] - - [163, 7, SimpleBlock, 2, 15812343, 19280, null] - - [163, 7, SimpleBlock, 2, 15831627, 19167, null] - - [163, 7, SimpleBlock, 2, 15850798, 19204, null] - - [163, 7, SimpleBlock, 2, 15870006, 18863, null] - - [163, 7, SimpleBlock, 2, 15888872, 5682, null] - - [163, 7, SimpleBlock, 2, 15894558, 18701, null] - - [163, 7, SimpleBlock, 2, 15913263, 18677, null] - - [163, 7, SimpleBlock, 2, 15931944, 18223, null] - - [163, 7, SimpleBlock, 2, 15950171, 18362, null] - - [163, 7, SimpleBlock, 2, 15968537, 17943, null] - - [163, 7, SimpleBlock, 2, 15986483, 5681, null] - - [163, 7, SimpleBlock, 2, 15992168, 17666, null] - - [163, 7, SimpleBlock, 2, 16009838, 17249, null] - - [163, 7, SimpleBlock, 2, 16027091, 16713, null] - - [163, 7, SimpleBlock, 2, 16043807, 16212, null] - - [163, 7, SimpleBlock, 2, 16060022, 15866, null] - - [163, 7, SimpleBlock, 2, 16075891, 5779, null] - - [163, 7, SimpleBlock, 2, 16081673, 15394, null] - - [163, 7, SimpleBlock, 2, 16097070, 15150, null] - - [163, 7, SimpleBlock, 2, 16112223, 14891, null] - - [163, 7, SimpleBlock, 2, 16127117, 14570, null] - - [163, 7, SimpleBlock, 2, 16141690, 5777, null] - - [163, 7, SimpleBlock, 2, 16147470, 14314, null] - - [163, 7, SimpleBlock, 2, 16161787, 13823, null] - - [163, 7, SimpleBlock, 2, 16175613, 13404, null] - - [163, 7, SimpleBlock, 2, 16189020, 12774, null] - - [163, 7, SimpleBlock, 2, 16201797, 12584, null] - - [163, 7, SimpleBlock, 2, 16214384, 5584, null] - - [163, 7, SimpleBlock, 2, 16219971, 12212, null] - - [163, 7, SimpleBlock, 2, 16232186, 11618, null] - - [163, 7, SimpleBlock, 2, 16243807, 11021, null] - - [163, 7, SimpleBlock, 2, 16254831, 10348, null] - - [163, 7, SimpleBlock, 2, 16265182, 2602, null] - - [163, 7, SimpleBlock, 2, 16267787, 9776, null] - - [163, 7, SimpleBlock, 2, 16277566, 9134, null] - - [163, 7, SimpleBlock, 2, 16286703, 8473, null] - - [163, 7, SimpleBlock, 2, 16295179, 5872, null] - - [163, 7, SimpleBlock, 2, 16301054, 8042, null] - - [163, 7, SimpleBlock, 2, 16309099, 6886, null] - - [163, 7, SimpleBlock, 2, 16315988, 6278, null] - - [163, 7, SimpleBlock, 2, 16322269, 5524, null] - - [163, 7, SimpleBlock, 2, 16327796, 5777, null] - - [163, 7, SimpleBlock, 2, 16333576, 4813, null] - - [163, 7, SimpleBlock, 2, 16338392, 4026, null] - - [163, 7, SimpleBlock, 2, 16342421, 3079, null] - - [163, 7, SimpleBlock, 2, 16345503, 2908, null] - - [163, 7, SimpleBlock, 2, 16348414, 2809, null] - - [163, 7, SimpleBlock, 2, 16351226, 5585, null] - - [163, 7, SimpleBlock, 2, 16356814, 2952, null] - - [163, 7, SimpleBlock, 2, 16359769, 2981, null] - - [163, 7, SimpleBlock, 2, 16362753, 3155, null] - - [163, 7, SimpleBlock, 2, 16365911, 3321, null] - - [163, 7, SimpleBlock, 2, 16369235, 3586, null] - - [163, 7, SimpleBlock, 2, 16372824, 5779, null] - - [163, 7, SimpleBlock, 2, 16378606, 3776, null] - - [163, 7, SimpleBlock, 2, 16382385, 4020, null] - - [163, 7, SimpleBlock, 2, 16386408, 4418, null] - - [163, 7, SimpleBlock, 2, 16390829, 5383, null] - - [163, 7, SimpleBlock, 2, 16396215, 5295, null] - - [163, 7, SimpleBlock, 2, 16401513, 6085, null] - - [163, 7, SimpleBlock, 2, 16407601, 6943, null] - - [163, 7, SimpleBlock, 2, 16414547, 7869, null] - - [163, 7, SimpleBlock, 2, 16422419, 8274, null] - - [163, 7, SimpleBlock, 2, 16430696, 7703, null] - - [163, 7, SimpleBlock, 2, 16438402, 5969, null] - - [163, 7, SimpleBlock, 2, 16444374, 7035, null] - - [163, 7, SimpleBlock, 2, 16451412, 7128, null] - - [163, 7, SimpleBlock, 2, 16458543, 6985, null] - - [163, 7, SimpleBlock, 2, 16465531, 6926, null] - - [163, 7, SimpleBlock, 2, 16472460, 5872, null] - - [163, 7, SimpleBlock, 2, 16478335, 6447, null] - - [163, 7, SimpleBlock, 2, 16484785, 5798, null] - - [163, 7, SimpleBlock, 2, 16490586, 5291, null] - - [163, 7, SimpleBlock, 2, 16495880, 5001, null] - - [163, 7, SimpleBlock, 2, 16500884, 4734, null] - - [163, 7, SimpleBlock, 2, 16505621, 7311, null] - - [163, 7, SimpleBlock, 2, 16512935, 4435, null] - - [163, 7, SimpleBlock, 2, 16517373, 6151, null] - - [163, 7, SimpleBlock, 2, 16523527, 5456, null] - - [163, 7, SimpleBlock, 2, 16528986, 4818, null] - - [163, 7, SimpleBlock, 2, 16533807, 5462, null] - - [163, 7, SimpleBlock, 2, 16539272, 6159, null] - - [163, 7, SimpleBlock, 2, 16545434, 5465, null] - - [163, 7, SimpleBlock, 2, 16550902, 5201, null] - - [163, 7, SimpleBlock, 2, 16556106, 5002, null] - - [163, 7, SimpleBlock, 2, 16561111, 5430, null] - - [163, 7, SimpleBlock, 2, 16566544, 5970, null] - - [163, 7, SimpleBlock, 2, 16572517, 6146, null] - - [163, 7, SimpleBlock, 2, 16578666, 6690, null] - - [163, 7, SimpleBlock, 2, 16585359, 7086, null] - - [163, 7, SimpleBlock, 2, 16592448, 8078, null] - - [163, 7, SimpleBlock, 2, 16600529, 8723, null] - - [163, 7, SimpleBlock, 2, 16609255, 6067, null] - - [163, 7, SimpleBlock, 2, 16615325, 9113, null] - - [163, 7, SimpleBlock, 2, 16624441, 9253, null] - - [163, 7, SimpleBlock, 2, 16633697, 10193, null] - - [163, 7, SimpleBlock, 2, 16643893, 9354, null] - - [163, 7, SimpleBlock, 2, 16653250, 3948, null] - - [163, 7, SimpleBlock, 2, 16657201, 9131, null] - - [163, 7, SimpleBlock, 2, 16666335, 8881, null] - - [163, 7, SimpleBlock, 2, 16675219, 7845, null] - - [163, 7, SimpleBlock, 2, 16683067, 7036, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 16690110 - - 778801 - - - [231, 1, Timecode, 2, 16690112, 2, 53333] - - [163, 7, SimpleBlock, 2, 16690117, 772, null] - - [163, 7, SimpleBlock, 2, 16690892, 6162, null] - - [163, 7, SimpleBlock, 2, 16697058, 73939, null] - - [163, 7, SimpleBlock, 2, 16771000, 2203, null] - - [163, 7, SimpleBlock, 2, 16773206, 2982, null] - - [163, 7, SimpleBlock, 2, 16776191, 3662, null] - - [163, 7, SimpleBlock, 2, 16779856, 4237, null] - - [163, 7, SimpleBlock, 2, 16784096, 5968, null] - - [163, 7, SimpleBlock, 2, 16790067, 4508, null] - - [163, 7, SimpleBlock, 2, 16794578, 4745, null] - - [163, 7, SimpleBlock, 2, 16799326, 4972, null] - - [163, 7, SimpleBlock, 2, 16804301, 5076, null] - - [163, 7, SimpleBlock, 2, 16809380, 6063, null] - - [163, 7, SimpleBlock, 2, 16815446, 5439, null] - - [163, 7, SimpleBlock, 2, 16820888, 5560, null] - - [163, 7, SimpleBlock, 2, 16826451, 5676, null] - - [163, 7, SimpleBlock, 2, 16832130, 5844, null] - - [163, 7, SimpleBlock, 2, 16837977, 6061, null] - - [163, 7, SimpleBlock, 2, 16844041, 5969, null] - - [163, 7, SimpleBlock, 2, 16850013, 6557, null] - - [163, 7, SimpleBlock, 2, 16856573, 7227, null] - - [163, 7, SimpleBlock, 2, 16863803, 7725, null] - - [163, 7, SimpleBlock, 2, 16871531, 8407, null] - - [163, 7, SimpleBlock, 2, 16879941, 5582, null] - - [163, 7, SimpleBlock, 2, 16885526, 8767, null] - - [163, 7, SimpleBlock, 2, 16894296, 9382, null] - - [163, 7, SimpleBlock, 2, 16903681, 9861, null] - - [163, 7, SimpleBlock, 2, 16913545, 10355, null] - - [163, 7, SimpleBlock, 2, 16923903, 9733, null] - - [163, 7, SimpleBlock, 2, 16933639, 5873, null] - - [163, 7, SimpleBlock, 2, 16939515, 9873, null] - - [163, 7, SimpleBlock, 2, 16949391, 9813, null] - - [163, 7, SimpleBlock, 2, 16959207, 9508, null] - - [163, 7, SimpleBlock, 2, 16968718, 11810, null] - - [163, 7, SimpleBlock, 2, 16980531, 12852, null] - - [163, 7, SimpleBlock, 2, 16993386, 5393, null] - - [163, 7, SimpleBlock, 2, 16998782, 11068, null] - - [163, 7, SimpleBlock, 2, 17009853, 10499, null] - - [163, 7, SimpleBlock, 2, 17020355, 10353, null] - - [163, 7, SimpleBlock, 2, 17030711, 9915, null] - - [163, 7, SimpleBlock, 2, 17040629, 5873, null] - - [163, 7, SimpleBlock, 2, 17046505, 9921, null] - - [163, 7, SimpleBlock, 2, 17056429, 9995, null] - - [163, 7, SimpleBlock, 2, 17066427, 10146, null] - - [163, 7, SimpleBlock, 2, 17076576, 10535, null] - - [163, 7, SimpleBlock, 2, 17087114, 10775, null] - - [163, 7, SimpleBlock, 2, 17097892, 5873, null] - - [163, 7, SimpleBlock, 2, 17103768, 11200, null] - - [163, 7, SimpleBlock, 2, 17114971, 12237, null] - - [163, 7, SimpleBlock, 2, 17127211, 12523, null] - - [163, 7, SimpleBlock, 2, 17139737, 12799, null] - - [163, 7, SimpleBlock, 2, 17152539, 6353, null] - - [163, 7, SimpleBlock, 2, 17158895, 12844, null] - - [163, 7, SimpleBlock, 2, 17171742, 13331, null] - - [163, 7, SimpleBlock, 2, 17185076, 13494, null] - - [163, 7, SimpleBlock, 2, 17198573, 13391, null] - - [163, 7, SimpleBlock, 2, 17211967, 13210, null] - - [163, 7, SimpleBlock, 2, 17225180, 5776, null] - - [163, 7, SimpleBlock, 2, 17230959, 12707, null] - - [163, 7, SimpleBlock, 2, 17243669, 12771, null] - - [163, 7, SimpleBlock, 2, 17256443, 12524, null] - - [163, 7, SimpleBlock, 2, 17268970, 12340, null] - - [163, 7, SimpleBlock, 2, 17281313, 12283, null] - - [163, 7, SimpleBlock, 2, 17293599, 5297, null] - - [163, 7, SimpleBlock, 2, 17298899, 12150, null] - - [163, 7, SimpleBlock, 2, 17311052, 12123, null] - - [163, 7, SimpleBlock, 2, 17323178, 11543, null] - - [163, 7, SimpleBlock, 2, 17334724, 10955, null] - - [163, 7, SimpleBlock, 2, 17345682, 5487, null] - - [163, 7, SimpleBlock, 2, 17351172, 10655, null] - - [163, 7, SimpleBlock, 2, 17361830, 10831, null] - - [163, 7, SimpleBlock, 2, 17372664, 11824, null] - - [163, 7, SimpleBlock, 2, 17384491, 12199, null] - - [163, 7, SimpleBlock, 2, 17396693, 10612, null] - - [163, 7, SimpleBlock, 2, 17407308, 6162, null] - - [163, 7, SimpleBlock, 2, 17413473, 10118, null] - - [163, 7, SimpleBlock, 2, 17423594, 9704, null] - - [163, 7, SimpleBlock, 2, 17433301, 8930, null] - - [163, 7, SimpleBlock, 2, 17442234, 8418, null] - - [163, 7, SimpleBlock, 2, 17450655, 676, null] - - [163, 7, SimpleBlock, 2, 17451334, 8595, null] - - [163, 7, SimpleBlock, 2, 17459932, 8979, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 17468918 - - 1159873 - - - [231, 1, Timecode, 2, 17468920, 2, 56083] - - [163, 7, SimpleBlock, 2, 17468925, 676, null] - - [163, 7, SimpleBlock, 2, 17469604, 5777, null] - - [163, 7, SimpleBlock, 2, 17475385, 22461, null] - - [163, 7, SimpleBlock, 2, 17497849, 2509, null] - - [163, 7, SimpleBlock, 2, 17500361, 1485, null] - - [163, 7, SimpleBlock, 2, 17501849, 320, null] - - [163, 7, SimpleBlock, 2, 17502172, 6258, null] - - [163, 7, SimpleBlock, 2, 17508433, 245, null] - - [163, 7, SimpleBlock, 2, 17508681, 248, null] - - [163, 7, SimpleBlock, 2, 17508932, 233, null] - - [163, 7, SimpleBlock, 2, 17509168, 218, null] - - [163, 7, SimpleBlock, 2, 17509389, 238, null] - - [163, 7, SimpleBlock, 2, 17509630, 6353, null] - - [163, 7, SimpleBlock, 2, 17515986, 232, null] - - [163, 7, SimpleBlock, 2, 17516221, 224, null] - - [163, 7, SimpleBlock, 2, 17516448, 235, null] - - [163, 7, SimpleBlock, 2, 17516686, 330, null] - - [163, 7, SimpleBlock, 2, 17517019, 6545, null] - - [163, 7, SimpleBlock, 2, 17523567, 414, null] - - [163, 7, SimpleBlock, 2, 17523984, 499, null] - - [163, 7, SimpleBlock, 2, 17524486, 554, null] - - [163, 7, SimpleBlock, 2, 17525043, 614, null] - - [163, 7, SimpleBlock, 2, 17525660, 598, null] - - [163, 7, SimpleBlock, 2, 17526261, 5487, null] - - [163, 7, SimpleBlock, 2, 17531751, 640, null] - - [163, 7, SimpleBlock, 2, 17532394, 771, null] - - [163, 7, SimpleBlock, 2, 17533168, 715, null] - - [163, 7, SimpleBlock, 2, 17533886, 643, null] - - [163, 7, SimpleBlock, 2, 17534532, 686, null] - - [163, 7, SimpleBlock, 2, 17535221, 5779, null] - - [163, 7, SimpleBlock, 2, 17541003, 763, null] - - [163, 7, SimpleBlock, 2, 17541769, 1464, null] - - [163, 7, SimpleBlock, 2, 17543236, 1514, null] - - [163, 7, SimpleBlock, 2, 17544753, 1618, null] - - [163, 7, SimpleBlock, 2, 17546374, 5969, null] - - [163, 7, SimpleBlock, 2, 17552346, 1804, null] - - [163, 7, SimpleBlock, 2, 17554153, 1848, null] - - [163, 7, SimpleBlock, 2, 17556004, 1926, null] - - [163, 7, SimpleBlock, 2, 17557933, 1630, null] - - [163, 7, SimpleBlock, 2, 17559566, 1113, null] - - [163, 7, SimpleBlock, 2, 17560682, 5295, null] - - [163, 7, SimpleBlock, 2, 17565980, 1004, null] - - [163, 7, SimpleBlock, 2, 17566987, 1093, null] - - [163, 7, SimpleBlock, 2, 17568083, 1153, null] - - [163, 7, SimpleBlock, 2, 17569239, 1172, null] - - [163, 7, SimpleBlock, 2, 17570414, 6354, null] - - [163, 7, SimpleBlock, 2, 17576771, 1405, null] - - [163, 7, SimpleBlock, 2, 17578179, 2397, null] - - [163, 7, SimpleBlock, 2, 17580579, 2799, null] - - [163, 7, SimpleBlock, 2, 17583381, 3471, null] - - [163, 7, SimpleBlock, 2, 17586855, 3841, null] - - [163, 7, SimpleBlock, 2, 17590699, 5779, null] - - [163, 7, SimpleBlock, 2, 17596481, 4169, null] - - [163, 7, SimpleBlock, 2, 17600653, 4518, null] - - [163, 7, SimpleBlock, 2, 17605174, 4830, null] - - [163, 7, SimpleBlock, 2, 17610007, 5034, null] - - [163, 7, SimpleBlock, 2, 17615044, 4699, null] - - [163, 7, SimpleBlock, 2, 17619746, 5776, null] - - [163, 7, SimpleBlock, 2, 17625525, 3001, null] - - [163, 7, SimpleBlock, 2, 17628529, 2180, null] - - [163, 7, SimpleBlock, 2, 17630712, 2302, null] - - [163, 7, SimpleBlock, 2, 17633017, 2170, null] - - [163, 7, SimpleBlock, 2, 17635190, 6062, null] - - [163, 7, SimpleBlock, 2, 17641255, 2343, null] - - [163, 7, SimpleBlock, 2, 17643601, 2435, null] - - [163, 7, SimpleBlock, 2, 17646039, 2472, null] - - [163, 7, SimpleBlock, 2, 17648514, 2495, null] - - [163, 7, SimpleBlock, 2, 17651012, 2687, null] - - [163, 7, SimpleBlock, 2, 17653702, 5393, null] - - [163, 7, SimpleBlock, 2, 17659098, 2627, null] - - [163, 7, SimpleBlock, 2, 17661728, 2740, null] - - [163, 7, SimpleBlock, 2, 17664471, 2819, null] - - [163, 7, SimpleBlock, 2, 17667293, 2973, null] - - [163, 7, SimpleBlock, 2, 17670269, 3204, null] - - [163, 7, SimpleBlock, 2, 17673476, 6255, null] - - [163, 7, SimpleBlock, 2, 17679734, 3227, null] - - [163, 7, SimpleBlock, 2, 17682964, 3096, null] - - [163, 7, SimpleBlock, 2, 17686063, 2755, null] - - [163, 7, SimpleBlock, 2, 17688821, 2414, null] - - [163, 7, SimpleBlock, 2, 17691238, 5966, null] - - [163, 7, SimpleBlock, 2, 17697207, 2199, null] - - [163, 7, SimpleBlock, 2, 17699409, 1988, null] - - [163, 7, SimpleBlock, 2, 17701400, 1875, null] - - [163, 7, SimpleBlock, 2, 17703278, 1877, null] - - [163, 7, SimpleBlock, 2, 17705158, 1855, null] - - [163, 7, SimpleBlock, 2, 17707016, 5872, null] - - [163, 7, SimpleBlock, 2, 17712891, 1753, null] - - [163, 7, SimpleBlock, 2, 17714647, 1698, null] - - [163, 7, SimpleBlock, 2, 17716348, 1681, null] - - [163, 7, SimpleBlock, 2, 17718032, 1668, null] - - [163, 7, SimpleBlock, 2, 17719703, 6449, null] - - [163, 7, SimpleBlock, 2, 17726155, 1643, null] - - [163, 7, SimpleBlock, 2, 17727801, 1573, null] - - [163, 7, SimpleBlock, 2, 17729377, 1510, null] - - [163, 7, SimpleBlock, 2, 17730890, 1414, null] - - [163, 7, SimpleBlock, 2, 17732307, 1290, null] - - [163, 7, SimpleBlock, 2, 17733600, 6066, null] - - [163, 7, SimpleBlock, 2, 17739669, 1199, null] - - [163, 7, SimpleBlock, 2, 17740871, 1170, null] - - [163, 7, SimpleBlock, 2, 17742044, 1056, null] - - [163, 7, SimpleBlock, 2, 17743103, 914, null] - - [163, 7, SimpleBlock, 2, 17744020, 895, null] - - [163, 7, SimpleBlock, 2, 17744918, 6256, null] - - [163, 7, SimpleBlock, 2, 17751177, 772, null] - - [163, 7, SimpleBlock, 2, 17751952, 686, null] - - [163, 7, SimpleBlock, 2, 17752641, 801, null] - - [163, 7, SimpleBlock, 2, 17753445, 810, null] - - [163, 7, SimpleBlock, 2, 17754258, 5201, null] - - [163, 7, SimpleBlock, 2, 17759462, 816, null] - - [163, 7, SimpleBlock, 2, 17760281, 773, null] - - [163, 7, SimpleBlock, 2, 17761057, 767, null] - - [163, 7, SimpleBlock, 2, 17761827, 819, null] - - [163, 7, SimpleBlock, 2, 17762649, 878, null] - - [163, 7, SimpleBlock, 2, 17763530, 5777, null] - - [163, 7, SimpleBlock, 2, 17769310, 1042, null] - - [163, 7, SimpleBlock, 2, 17770355, 1207, null] - - [163, 7, SimpleBlock, 2, 17771565, 1260, null] - - [163, 7, SimpleBlock, 2, 17772828, 1224, null] - - [163, 7, SimpleBlock, 2, 17774055, 5679, null] - - [163, 7, SimpleBlock, 2, 17779737, 1156, null] - - [163, 7, SimpleBlock, 2, 17780896, 1212, null] - - [163, 7, SimpleBlock, 2, 17782111, 1231, null] - - [163, 7, SimpleBlock, 2, 17783345, 1228, null] - - [163, 7, SimpleBlock, 2, 17784576, 1295, null] - - [163, 7, SimpleBlock, 2, 17785874, 5010, null] - - [163, 7, SimpleBlock, 2, 17790887, 1319, null] - - [163, 7, SimpleBlock, 2, 17792209, 1331, null] - - [163, 7, SimpleBlock, 2, 17793543, 1360, null] - - [163, 7, SimpleBlock, 2, 17794906, 1380, null] - - [163, 7, SimpleBlock, 2, 17796289, 1470, null] - - [163, 7, SimpleBlock, 2, 17797762, 5968, null] - - [163, 7, SimpleBlock, 2, 17803733, 1471, null] - - [163, 7, SimpleBlock, 2, 17805207, 1209, null] - - [163, 7, SimpleBlock, 2, 17806419, 1172, null] - - [163, 7, SimpleBlock, 2, 17807594, 1246, null] - - [163, 7, SimpleBlock, 2, 17808843, 5874, null] - - [163, 7, SimpleBlock, 2, 17814721, 29320, null] - - [163, 7, SimpleBlock, 2, 17844044, 4031, null] - - [163, 7, SimpleBlock, 2, 17848078, 3115, null] - - [163, 7, SimpleBlock, 2, 17851196, 2426, null] - - [163, 7, SimpleBlock, 2, 17853625, 3597, null] - - [163, 7, SimpleBlock, 2, 17857225, 5586, null] - - [163, 7, SimpleBlock, 2, 17862814, 4146, null] - - [163, 7, SimpleBlock, 2, 17866963, 4167, null] - - [163, 7, SimpleBlock, 2, 17871133, 3878, null] - - [163, 7, SimpleBlock, 2, 17875014, 2803, null] - - [163, 7, SimpleBlock, 2, 17877820, 772, null] - - [163, 7, SimpleBlock, 2, 17878595, 2519, null] - - [163, 7, SimpleBlock, 2, 17881117, 5586, null] - - [163, 7, SimpleBlock, 2, 17886706, 3475, null] - - [163, 7, SimpleBlock, 2, 17890184, 3964, null] - - [163, 7, SimpleBlock, 2, 17894151, 3802, null] - - [163, 7, SimpleBlock, 2, 17897956, 3434, null] - - [163, 7, SimpleBlock, 2, 17901393, 2679, null] - - [163, 7, SimpleBlock, 2, 17904075, 5489, null] - - [163, 7, SimpleBlock, 2, 17909567, 2362, null] - - [163, 7, SimpleBlock, 2, 17911932, 2821, null] - - [163, 7, SimpleBlock, 2, 17914756, 3440, null] - - [163, 7, SimpleBlock, 2, 17918199, 3659, null] - - [163, 7, SimpleBlock, 2, 17921861, 6737, null] - - [163, 7, SimpleBlock, 2, 17928601, 3649, null] - - [163, 7, SimpleBlock, 2, 17932253, 2521, null] - - [163, 7, SimpleBlock, 2, 17934777, 1893, null] - - [163, 7, SimpleBlock, 2, 17936673, 2836, null] - - [163, 7, SimpleBlock, 2, 17939512, 3377, null] - - [163, 7, SimpleBlock, 2, 17942892, 5392, null] - - [163, 7, SimpleBlock, 2, 17948287, 3391, null] - - [163, 7, SimpleBlock, 2, 17951681, 3300, null] - - [163, 7, SimpleBlock, 2, 17954984, 2321, null] - - [163, 7, SimpleBlock, 2, 17957308, 1850, null] - - [163, 7, SimpleBlock, 2, 17959161, 5585, null] - - [163, 7, SimpleBlock, 2, 17964749, 2256, null] - - [163, 7, SimpleBlock, 2, 17967008, 2635, null] - - [163, 7, SimpleBlock, 2, 17969646, 2856, null] - - [163, 7, SimpleBlock, 2, 17972505, 2837, null] - - [163, 7, SimpleBlock, 2, 17975345, 2829, null] - - [163, 7, SimpleBlock, 2, 17978177, 6256, null] - - [163, 7, SimpleBlock, 2, 17984436, 2566, null] - - [163, 7, SimpleBlock, 2, 17987005, 2308, null] - - [163, 7, SimpleBlock, 2, 17989316, 2064, null] - - [163, 7, SimpleBlock, 2, 17991383, 2007, null] - - [163, 7, SimpleBlock, 2, 17993393, 2166, null] - - [163, 7, SimpleBlock, 2, 17995562, 5393, null] - - [163, 7, SimpleBlock, 2, 18000958, 1772, null] - - [163, 7, SimpleBlock, 2, 18002733, 1579, null] - - [163, 7, SimpleBlock, 2, 18004315, 1467, null] - - [163, 7, SimpleBlock, 2, 18005785, 1362, null] - - [163, 7, SimpleBlock, 2, 18007150, 5776, null] - - [163, 7, SimpleBlock, 2, 18012929, 1411, null] - - [163, 7, SimpleBlock, 2, 18014343, 1553, null] - - [163, 7, SimpleBlock, 2, 18015899, 1874, null] - - [163, 7, SimpleBlock, 2, 18017776, 2222, null] - - [163, 7, SimpleBlock, 2, 18020001, 2455, null] - - [163, 7, SimpleBlock, 2, 18022459, 5298, null] - - [163, 7, SimpleBlock, 2, 18027760, 2969, null] - - [163, 7, SimpleBlock, 2, 18030732, 2986, null] - - [163, 7, SimpleBlock, 2, 18033721, 2874, null] - - [163, 7, SimpleBlock, 2, 18036598, 3500, null] - - [163, 7, SimpleBlock, 2, 18040101, 5299, null] - - [163, 7, SimpleBlock, 2, 18045403, 5436, null] - - [163, 7, SimpleBlock, 2, 18050842, 5687, null] - - [163, 7, SimpleBlock, 2, 18056532, 4865, null] - - [163, 7, SimpleBlock, 2, 18061400, 4047, null] - - [163, 7, SimpleBlock, 2, 18065450, 4424, null] - - [163, 7, SimpleBlock, 2, 18069877, 5776, null] - - [163, 7, SimpleBlock, 2, 18075656, 4828, null] - - [163, 7, SimpleBlock, 2, 18080487, 5030, null] - - [163, 7, SimpleBlock, 2, 18085520, 4587, null] - - [163, 7, SimpleBlock, 2, 18090110, 3823, null] - - [163, 7, SimpleBlock, 2, 18093936, 3266, null] - - [163, 7, SimpleBlock, 2, 18097205, 5969, null] - - [163, 7, SimpleBlock, 2, 18103177, 2943, null] - - [163, 7, SimpleBlock, 2, 18106123, 2733, null] - - [163, 7, SimpleBlock, 2, 18108859, 2523, null] - - [163, 7, SimpleBlock, 2, 18111385, 2499, null] - - [163, 7, SimpleBlock, 2, 18113887, 6162, null] - - [163, 7, SimpleBlock, 2, 18120052, 2530, null] - - [163, 7, SimpleBlock, 2, 18122585, 2361, null] - - [163, 7, SimpleBlock, 2, 18124949, 2255, null] - - [163, 7, SimpleBlock, 2, 18127207, 2069, null] - - [163, 7, SimpleBlock, 2, 18129279, 1886, null] - - [163, 7, SimpleBlock, 2, 18131168, 5874, null] - - [163, 7, SimpleBlock, 2, 18137045, 1818, null] - - [163, 7, SimpleBlock, 2, 18138866, 1694, null] - - [163, 7, SimpleBlock, 2, 18140563, 1791, null] - - [163, 7, SimpleBlock, 2, 18142357, 1640, null] - - [163, 7, SimpleBlock, 2, 18144000, 5679, null] - - [163, 7, SimpleBlock, 2, 18149682, 1477, null] - - [163, 7, SimpleBlock, 2, 18151163, 60499, null] - - [163, 7, SimpleBlock, 2, 18211665, 2228, null] - - [163, 7, SimpleBlock, 2, 18213896, 2038, null] - - [163, 7, SimpleBlock, 2, 18215937, 1445, null] - - [163, 7, SimpleBlock, 2, 18217385, 5871, null] - - [163, 7, SimpleBlock, 2, 18223259, 1144, null] - - [163, 7, SimpleBlock, 2, 18224406, 966, null] - - [163, 7, SimpleBlock, 2, 18225375, 1554, null] - - [163, 7, SimpleBlock, 2, 18226932, 2149, null] - - [163, 7, SimpleBlock, 2, 18229084, 2465, null] - - [163, 7, SimpleBlock, 2, 18231552, 5872, null] - - [163, 7, SimpleBlock, 2, 18237427, 2573, null] - - [163, 7, SimpleBlock, 2, 18240003, 2777, null] - - [163, 7, SimpleBlock, 2, 18242783, 2284, null] - - [163, 7, SimpleBlock, 2, 18245070, 1929, null] - - [163, 7, SimpleBlock, 2, 18247002, 6066, null] - - [163, 7, SimpleBlock, 2, 18253071, 1909, null] - - [163, 7, SimpleBlock, 2, 18254983, 1855, null] - - [163, 7, SimpleBlock, 2, 18256841, 1852, null] - - [163, 7, SimpleBlock, 2, 18258696, 1983, null] - - [163, 7, SimpleBlock, 2, 18260682, 1894, null] - - [163, 7, SimpleBlock, 2, 18262579, 5583, null] - - [163, 7, SimpleBlock, 2, 18268165, 2739, null] - - [163, 7, SimpleBlock, 2, 18270907, 3644, null] - - [163, 7, SimpleBlock, 2, 18274554, 4230, null] - - [163, 7, SimpleBlock, 2, 18278787, 3657, null] - - [163, 7, SimpleBlock, 2, 18282447, 3713, null] - - [163, 7, SimpleBlock, 2, 18286163, 5680, null] - - [163, 7, SimpleBlock, 2, 18291846, 4481, null] - - [163, 7, SimpleBlock, 2, 18296330, 4123, null] - - [163, 7, SimpleBlock, 2, 18300456, 3651, null] - - [163, 7, SimpleBlock, 2, 18304110, 3533, null] - - [163, 7, SimpleBlock, 2, 18307646, 5681, null] - - [163, 7, SimpleBlock, 2, 18313330, 4339, null] - - [163, 7, SimpleBlock, 2, 18317672, 5237, null] - - [163, 7, SimpleBlock, 2, 18322912, 5918, null] - - [163, 7, SimpleBlock, 2, 18328833, 5993, null] - - [163, 7, SimpleBlock, 2, 18334829, 4395, null] - - [163, 7, SimpleBlock, 2, 18339227, 6066, null] - - [163, 7, SimpleBlock, 2, 18345296, 4935, null] - - [163, 7, SimpleBlock, 2, 18350234, 6037, null] - - [163, 7, SimpleBlock, 2, 18356274, 6409, null] - - [163, 7, SimpleBlock, 2, 18362686, 6297, null] - - [163, 7, SimpleBlock, 2, 18368986, 5585, null] - - [163, 7, SimpleBlock, 2, 18374574, 5557, null] - - [163, 7, SimpleBlock, 2, 18380134, 3974, null] - - [163, 7, SimpleBlock, 2, 18384111, 3783, null] - - [163, 7, SimpleBlock, 2, 18387897, 5331, null] - - [163, 7, SimpleBlock, 2, 18393231, 6651, null] - - [163, 7, SimpleBlock, 2, 18399885, 6256, null] - - [163, 7, SimpleBlock, 2, 18406144, 7153, null] - - [163, 7, SimpleBlock, 2, 18413300, 6988, null] - - [163, 7, SimpleBlock, 2, 18420291, 5408, null] - - [163, 7, SimpleBlock, 2, 18425702, 5607, null] - - [163, 7, SimpleBlock, 2, 18431312, 6685, null] - - [163, 7, SimpleBlock, 2, 18438000, 5585, null] - - [163, 7, SimpleBlock, 2, 18443588, 6995, null] - - [163, 7, SimpleBlock, 2, 18450586, 7063, null] - - [163, 7, SimpleBlock, 2, 18457652, 7432, null] - - [163, 7, SimpleBlock, 2, 18465087, 6784, null] - - [163, 7, SimpleBlock, 2, 18471874, 6257, null] - - [163, 7, SimpleBlock, 2, 18478134, 5355, null] - - [163, 7, SimpleBlock, 2, 18483492, 7557, null] - - [163, 7, SimpleBlock, 2, 18491052, 8650, null] - - [163, 7, SimpleBlock, 2, 18499705, 8923, null] - - [163, 7, SimpleBlock, 2, 18508631, 8857, null] - - [163, 7, SimpleBlock, 2, 18517491, 772, null] - - [163, 7, SimpleBlock, 2, 18518266, 5487, null] - - [163, 7, SimpleBlock, 2, 18523756, 7441, null] - - [163, 7, SimpleBlock, 2, 18531200, 8855, null] - - [163, 7, SimpleBlock, 2, 18540058, 9921, null] - - [163, 7, SimpleBlock, 2, 18549982, 10005, null] - - [163, 7, SimpleBlock, 2, 18559990, 10304, null] - - [163, 7, SimpleBlock, 2, 18570297, 5199, null] - - [163, 7, SimpleBlock, 2, 18575499, 10952, null] - - [163, 7, SimpleBlock, 2, 18586454, 11010, null] - - [163, 7, SimpleBlock, 2, 18597467, 9866, null] - - [163, 7, SimpleBlock, 2, 18607336, 10617, null] - - [163, 7, SimpleBlock, 2, 18617956, 10835, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 18628799 - - 2103666 - - - [231, 1, Timecode, 2, 18628801, 3, 66500] - - [163, 7, SimpleBlock, 2, 18628807, 772, null] - - [163, 7, SimpleBlock, 2, 18629582, 5776, null] - - [163, 7, SimpleBlock, 2, 18635362, 36579, null] - - [163, 7, SimpleBlock, 2, 18671944, 10731, null] - - [163, 7, SimpleBlock, 2, 18682678, 10066, null] - - [163, 7, SimpleBlock, 2, 18692747, 10462, null] - - [163, 7, SimpleBlock, 2, 18703212, 5680, null] - - [163, 7, SimpleBlock, 2, 18708895, 10053, null] - - [163, 7, SimpleBlock, 2, 18718951, 9561, null] - - [163, 7, SimpleBlock, 2, 18728515, 9702, null] - - [163, 7, SimpleBlock, 2, 18738220, 9853, null] - - [163, 7, SimpleBlock, 2, 18748076, 10160, null] - - [163, 7, SimpleBlock, 2, 18758239, 5777, null] - - [163, 7, SimpleBlock, 2, 18764019, 10507, null] - - [163, 7, SimpleBlock, 2, 18774529, 9258, null] - - [163, 7, SimpleBlock, 2, 18783790, 9531, null] - - [163, 7, SimpleBlock, 2, 18793324, 9334, null] - - [163, 7, SimpleBlock, 2, 18802661, 5971, null] - - [163, 7, SimpleBlock, 2, 18808635, 9543, null] - - [163, 7, SimpleBlock, 2, 18818181, 9583, null] - - [163, 7, SimpleBlock, 2, 18827767, 9467, null] - - [163, 7, SimpleBlock, 2, 18837237, 8785, null] - - [163, 7, SimpleBlock, 2, 18846025, 8852, null] - - [163, 7, SimpleBlock, 2, 18854880, 5585, null] - - [163, 7, SimpleBlock, 2, 18860468, 8937, null] - - [163, 7, SimpleBlock, 2, 18869408, 9268, null] - - [163, 7, SimpleBlock, 2, 18878679, 9540, null] - - [163, 7, SimpleBlock, 2, 18888222, 9647, null] - - [163, 7, SimpleBlock, 2, 18897872, 10183, null] - - [163, 7, SimpleBlock, 2, 18908058, 6063, null] - - [163, 7, SimpleBlock, 2, 18914124, 10189, null] - - [163, 7, SimpleBlock, 2, 18924316, 10411, null] - - [163, 7, SimpleBlock, 2, 18934730, 10327, null] - - [163, 7, SimpleBlock, 2, 18945060, 8746, null] - - [163, 7, SimpleBlock, 2, 18953809, 5778, null] - - [163, 7, SimpleBlock, 2, 18959590, 6640, null] - - [163, 7, SimpleBlock, 2, 18966233, 4282, null] - - [163, 7, SimpleBlock, 2, 18970518, 4188, null] - - [163, 7, SimpleBlock, 2, 18974709, 4033, null] - - [163, 7, SimpleBlock, 2, 18978745, 3879, null] - - [163, 7, SimpleBlock, 2, 18982627, 6161, null] - - [163, 7, SimpleBlock, 2, 18988791, 3886, null] - - [163, 7, SimpleBlock, 2, 18992680, 3964, null] - - [163, 7, SimpleBlock, 2, 18996647, 4541, null] - - [163, 7, SimpleBlock, 2, 19001191, 6260, null] - - [163, 7, SimpleBlock, 2, 19007454, 6063, null] - - [163, 7, SimpleBlock, 2, 19013520, 6518, null] - - [163, 7, SimpleBlock, 2, 19020041, 7033, null] - - [163, 7, SimpleBlock, 2, 19027077, 7616, null] - - [163, 7, SimpleBlock, 2, 19034696, 8183, null] - - [163, 7, SimpleBlock, 2, 19042882, 8734, null] - - [163, 7, SimpleBlock, 2, 19051619, 6067, null] - - [163, 7, SimpleBlock, 2, 19057689, 9116, null] - - [163, 7, SimpleBlock, 2, 19066808, 9011, null] - - [163, 7, SimpleBlock, 2, 19075822, 8607, null] - - [163, 7, SimpleBlock, 2, 19084432, 6087, null] - - [163, 7, SimpleBlock, 2, 19090522, 4136, null] - - [163, 7, SimpleBlock, 2, 19094661, 6061, null] - - [163, 7, SimpleBlock, 2, 19100725, 4215, null] - - [163, 7, SimpleBlock, 2, 19104943, 8273, null] - - [163, 7, SimpleBlock, 2, 19113219, 8929, null] - - [163, 7, SimpleBlock, 2, 19122151, 8522, null] - - [163, 7, SimpleBlock, 2, 19130676, 5682, null] - - [163, 7, SimpleBlock, 2, 19136361, 8505, null] - - [163, 7, SimpleBlock, 2, 19144869, 8264, null] - - [163, 7, SimpleBlock, 2, 19153136, 8036, null] - - [163, 7, SimpleBlock, 2, 19161175, 8376, null] - - [163, 7, SimpleBlock, 2, 19169554, 7908, null] - - [163, 7, SimpleBlock, 2, 19177465, 6255, null] - - [163, 7, SimpleBlock, 2, 19183723, 8350, null] - - [163, 7, SimpleBlock, 2, 19192076, 10471, null] - - [163, 7, SimpleBlock, 2, 19202550, 12007, null] - - [163, 7, SimpleBlock, 2, 19214560, 12700, null] - - [163, 7, SimpleBlock, 2, 19227263, 6449, null] - - [163, 7, SimpleBlock, 2, 19233715, 13211, null] - - [163, 7, SimpleBlock, 2, 19246929, 13350, null] - - [163, 7, SimpleBlock, 2, 19260282, 12895, null] - - [163, 7, SimpleBlock, 2, 19273180, 11656, null] - - [163, 7, SimpleBlock, 2, 19284839, 10411, null] - - [163, 7, SimpleBlock, 2, 19295253, 6451, null] - - [163, 7, SimpleBlock, 2, 19301707, 9994, null] - - [163, 7, SimpleBlock, 2, 19311704, 9523, null] - - [163, 7, SimpleBlock, 2, 19321230, 9295, null] - - [163, 7, SimpleBlock, 2, 19330528, 8371, null] - - [163, 7, SimpleBlock, 2, 19338902, 7294, null] - - [163, 7, SimpleBlock, 2, 19346199, 6161, null] - - [163, 7, SimpleBlock, 2, 19352363, 6261, null] - - [163, 7, SimpleBlock, 2, 19358628, 36475, null] - - [163, 7, SimpleBlock, 2, 19395106, 1597, null] - - [163, 7, SimpleBlock, 2, 19396706, 1054, null] - - [163, 7, SimpleBlock, 2, 19397763, 5967, null] - - [163, 7, SimpleBlock, 2, 19403733, 639, null] - - [163, 7, SimpleBlock, 2, 19404375, 654, null] - - [163, 7, SimpleBlock, 2, 19405032, 649, null] - - [163, 7, SimpleBlock, 2, 19405684, 671, null] - - [163, 7, SimpleBlock, 2, 19406358, 546, null] - - [163, 7, SimpleBlock, 2, 19406907, 6257, null] - - [163, 7, SimpleBlock, 2, 19413167, 564, null] - - [163, 7, SimpleBlock, 2, 19413734, 551, null] - - [163, 7, SimpleBlock, 2, 19414288, 644, null] - - [163, 7, SimpleBlock, 2, 19414935, 691, null] - - [163, 7, SimpleBlock, 2, 19415629, 559, null] - - [163, 7, SimpleBlock, 2, 19416191, 5872, null] - - [163, 7, SimpleBlock, 2, 19422066, 619, null] - - [163, 7, SimpleBlock, 2, 19422688, 773, null] - - [163, 7, SimpleBlock, 2, 19423464, 853, null] - - [163, 7, SimpleBlock, 2, 19424320, 816, null] - - [163, 7, SimpleBlock, 2, 19425139, 5488, null] - - [163, 7, SimpleBlock, 2, 19430630, 760, null] - - [163, 7, SimpleBlock, 2, 19431393, 977, null] - - [163, 7, SimpleBlock, 2, 19432373, 729, null] - - [163, 7, SimpleBlock, 2, 19433105, 915, null] - - [163, 7, SimpleBlock, 2, 19434023, 803, null] - - [163, 7, SimpleBlock, 2, 19434829, 5967, null] - - [163, 7, SimpleBlock, 2, 19440799, 629, null] - - [163, 7, SimpleBlock, 2, 19441431, 971, null] - - [163, 7, SimpleBlock, 2, 19442405, 704, null] - - [163, 7, SimpleBlock, 2, 19443112, 899, null] - - [163, 7, SimpleBlock, 2, 19444014, 5584, null] - - [163, 7, SimpleBlock, 2, 19449601, 814, null] - - [163, 7, SimpleBlock, 2, 19450418, 724, null] - - [163, 7, SimpleBlock, 2, 19451145, 950, null] - - [163, 7, SimpleBlock, 2, 19452098, 770, null] - - [163, 7, SimpleBlock, 2, 19452871, 973, null] - - [163, 7, SimpleBlock, 2, 19453847, 5776, null] - - [163, 7, SimpleBlock, 2, 19459626, 901, null] - - [163, 7, SimpleBlock, 2, 19460530, 719, null] - - [163, 7, SimpleBlock, 2, 19461252, 947, null] - - [163, 7, SimpleBlock, 2, 19462202, 662, null] - - [163, 7, SimpleBlock, 2, 19462867, 836, null] - - [163, 7, SimpleBlock, 2, 19463706, 6160, null] - - [163, 7, SimpleBlock, 2, 19469869, 723, null] - - [163, 7, SimpleBlock, 2, 19470595, 592, null] - - [163, 7, SimpleBlock, 2, 19471190, 837, null] - - [163, 7, SimpleBlock, 2, 19472030, 607, null] - - [163, 7, SimpleBlock, 2, 19472640, 5681, null] - - [163, 7, SimpleBlock, 2, 19478324, 784, null] - - [163, 7, SimpleBlock, 2, 19479111, 699, null] - - [163, 7, SimpleBlock, 2, 19479813, 517, null] - - [163, 7, SimpleBlock, 2, 19480333, 787, null] - - [163, 7, SimpleBlock, 2, 19481123, 554, null] - - [163, 7, SimpleBlock, 2, 19481680, 6065, null] - - [163, 7, SimpleBlock, 2, 19487749, 48229, null] - - [163, 7, SimpleBlock, 2, 19535981, 1795, null] - - [163, 7, SimpleBlock, 2, 19537779, 1433, null] - - [163, 7, SimpleBlock, 2, 19539215, 829, null] - - [163, 7, SimpleBlock, 2, 19540047, 772, null] - - [163, 7, SimpleBlock, 2, 19540822, 647, null] - - [163, 7, SimpleBlock, 2, 19541472, 5680, null] - - [163, 7, SimpleBlock, 2, 19547155, 757, null] - - [163, 7, SimpleBlock, 2, 19547915, 771, null] - - [163, 7, SimpleBlock, 2, 19548689, 699, null] - - [163, 7, SimpleBlock, 2, 19549391, 793, null] - - [163, 7, SimpleBlock, 2, 19550187, 904, null] - - [163, 7, SimpleBlock, 2, 19551094, 5872, null] - - [163, 7, SimpleBlock, 2, 19556969, 862, null] - - [163, 7, SimpleBlock, 2, 19557834, 1178, null] - - [163, 7, SimpleBlock, 2, 19559015, 1055, null] - - [163, 7, SimpleBlock, 2, 19560073, 1098, null] - - [163, 7, SimpleBlock, 2, 19561174, 5774, null] - - [163, 7, SimpleBlock, 2, 19566951, 1242, null] - - [163, 7, SimpleBlock, 2, 19568196, 1272, null] - - [163, 7, SimpleBlock, 2, 19569471, 1209, null] - - [163, 7, SimpleBlock, 2, 19570683, 1540, null] - - [163, 7, SimpleBlock, 2, 19572226, 1541, null] - - [163, 7, SimpleBlock, 2, 19573770, 5680, null] - - [163, 7, SimpleBlock, 2, 19579453, 1583, null] - - [163, 7, SimpleBlock, 2, 19581039, 1724, null] - - [163, 7, SimpleBlock, 2, 19582766, 1947, null] - - [163, 7, SimpleBlock, 2, 19584716, 1810, null] - - [163, 7, SimpleBlock, 2, 19586529, 5394, null] - - [163, 7, SimpleBlock, 2, 19591926, 1931, null] - - [163, 7, SimpleBlock, 2, 19593860, 1872, null] - - [163, 7, SimpleBlock, 2, 19595735, 1897, null] - - [163, 7, SimpleBlock, 2, 19597635, 1731, null] - - [163, 7, SimpleBlock, 2, 19599369, 1852, null] - - [163, 7, SimpleBlock, 2, 19601224, 5393, null] - - [163, 7, SimpleBlock, 2, 19606620, 1761, null] - - [163, 7, SimpleBlock, 2, 19608384, 1845, null] - - [163, 7, SimpleBlock, 2, 19610232, 1851, null] - - [163, 7, SimpleBlock, 2, 19612086, 1824, null] - - [163, 7, SimpleBlock, 2, 19613913, 1842, null] - - [163, 7, SimpleBlock, 2, 19615758, 5295, null] - - [163, 7, SimpleBlock, 2, 19621056, 1767, null] - - [163, 7, SimpleBlock, 2, 19622826, 1774, null] - - [163, 7, SimpleBlock, 2, 19624603, 1688, null] - - [163, 7, SimpleBlock, 2, 19626294, 1683, null] - - [163, 7, SimpleBlock, 2, 19627980, 5584, null] - - [163, 7, SimpleBlock, 2, 19633567, 1458, null] - - [163, 7, SimpleBlock, 2, 19635028, 1661, null] - - [163, 7, SimpleBlock, 2, 19636692, 1559, null] - - [163, 7, SimpleBlock, 2, 19638254, 1429, null] - - [163, 7, SimpleBlock, 2, 19639686, 1566, null] - - [163, 7, SimpleBlock, 2, 19641255, 5294, null] - - [163, 7, SimpleBlock, 2, 19646552, 1519, null] - - [163, 7, SimpleBlock, 2, 19648074, 1356, null] - - [163, 7, SimpleBlock, 2, 19649433, 1292, null] - - [163, 7, SimpleBlock, 2, 19650728, 1177, null] - - [163, 7, SimpleBlock, 2, 19651908, 5488, null] - - [163, 7, SimpleBlock, 2, 19657399, 1208, null] - - [163, 7, SimpleBlock, 2, 19658610, 1022, null] - - [163, 7, SimpleBlock, 2, 19659635, 943, null] - - [163, 7, SimpleBlock, 2, 19660581, 804, null] - - [163, 7, SimpleBlock, 2, 19661388, 783, null] - - [163, 7, SimpleBlock, 2, 19662174, 5393, null] - - [163, 7, SimpleBlock, 2, 19667570, 856, null] - - [163, 7, SimpleBlock, 2, 19668430, 28957, null] - - [163, 7, SimpleBlock, 2, 19697390, 3375, null] - - [163, 7, SimpleBlock, 2, 19700768, 3741, null] - - [163, 7, SimpleBlock, 2, 19704512, 3590, null] - - [163, 7, SimpleBlock, 2, 19708105, 6545, null] - - [163, 7, SimpleBlock, 2, 19714653, 3476, null] - - [163, 7, SimpleBlock, 2, 19718132, 3331, null] - - [163, 7, SimpleBlock, 2, 19721466, 3305, null] - - [163, 7, SimpleBlock, 2, 19724774, 3474, null] - - [163, 7, SimpleBlock, 2, 19728251, 6063, null] - - [163, 7, SimpleBlock, 2, 19734317, 3784, null] - - [163, 7, SimpleBlock, 2, 19738104, 3987, null] - - [163, 7, SimpleBlock, 2, 19742094, 4201, null] - - [163, 7, SimpleBlock, 2, 19746298, 3595, null] - - [163, 7, SimpleBlock, 2, 19749896, 3209, null] - - [163, 7, SimpleBlock, 2, 19753108, 6256, null] - - [163, 7, SimpleBlock, 2, 19759367, 3317, null] - - [163, 7, SimpleBlock, 2, 19762687, 3767, null] - - [163, 7, SimpleBlock, 2, 19766457, 3811, null] - - [163, 7, SimpleBlock, 2, 19770271, 3951, null] - - [163, 7, SimpleBlock, 2, 19774225, 6546, null] - - [163, 7, SimpleBlock, 2, 19780774, 3884, null] - - [163, 7, SimpleBlock, 2, 19784661, 3807, null] - - [163, 7, SimpleBlock, 2, 19788471, 4301, null] - - [163, 7, SimpleBlock, 2, 19792775, 5472, null] - - [163, 7, SimpleBlock, 2, 19798250, 6931, null] - - [163, 7, SimpleBlock, 2, 19805184, 5968, null] - - [163, 7, SimpleBlock, 2, 19811155, 8261, null] - - [163, 7, SimpleBlock, 2, 19819419, 9448, null] - - [163, 7, SimpleBlock, 2, 19828870, 9747, null] - - [163, 7, SimpleBlock, 2, 19838620, 10939, null] - - [163, 7, SimpleBlock, 2, 19849562, 11581, null] - - [163, 7, SimpleBlock, 2, 19861146, 6257, null] - - [163, 7, SimpleBlock, 2, 19867406, 12226, null] - - [163, 7, SimpleBlock, 2, 19879635, 12386, null] - - [163, 7, SimpleBlock, 2, 19892024, 12288, null] - - [163, 7, SimpleBlock, 2, 19904315, 12342, null] - - [163, 7, SimpleBlock, 2, 19916660, 6066, null] - - [163, 7, SimpleBlock, 2, 19922729, 12606, null] - - [163, 7, SimpleBlock, 2, 19935338, 12670, null] - - [163, 7, SimpleBlock, 2, 19948011, 14314, null] - - [163, 7, SimpleBlock, 2, 19962328, 14351, null] - - [163, 7, SimpleBlock, 2, 19976682, 14816, null] - - [163, 7, SimpleBlock, 2, 19991501, 6065, null] - - [163, 7, SimpleBlock, 2, 19997569, 14730, null] - - [163, 7, SimpleBlock, 2, 20012302, 14115, null] - - [163, 7, SimpleBlock, 2, 20026420, 12301, null] - - [163, 7, SimpleBlock, 2, 20038724, 9600, null] - - [163, 7, SimpleBlock, 2, 20048327, 7875, null] - - [163, 7, SimpleBlock, 2, 20056205, 6258, null] - - [163, 7, SimpleBlock, 2, 20062466, 7045, null] - - [163, 7, SimpleBlock, 2, 20069514, 5980, null] - - [163, 7, SimpleBlock, 2, 20075497, 5767, null] - - [163, 7, SimpleBlock, 2, 20081267, 5984, null] - - [163, 7, SimpleBlock, 2, 20087254, 5874, null] - - [163, 7, SimpleBlock, 2, 20093131, 6340, null] - - [163, 7, SimpleBlock, 2, 20099474, 6302, null] - - [163, 7, SimpleBlock, 2, 20105779, 6276, null] - - [163, 7, SimpleBlock, 2, 20112058, 6033, null] - - [163, 7, SimpleBlock, 2, 20118094, 5439, null] - - [163, 7, SimpleBlock, 2, 20123536, 5873, null] - - [163, 7, SimpleBlock, 2, 20129413, 60579, null] - - [163, 7, SimpleBlock, 2, 20189995, 7029, null] - - [163, 7, SimpleBlock, 2, 20197027, 9336, null] - - [163, 7, SimpleBlock, 2, 20206366, 10592, null] - - [163, 7, SimpleBlock, 2, 20216961, 5490, null] - - [163, 7, SimpleBlock, 2, 20222454, 12788, null] - - [163, 7, SimpleBlock, 2, 20235245, 13783, null] - - [163, 7, SimpleBlock, 2, 20249031, 14231, null] - - [163, 7, SimpleBlock, 2, 20263265, 15363, null] - - [163, 7, SimpleBlock, 2, 20278632, 17133, null] - - [163, 7, SimpleBlock, 2, 20295768, 5296, null] - - [163, 7, SimpleBlock, 2, 20301068, 17470, null] - - [163, 7, SimpleBlock, 2, 20318541, 14994, null] - - [163, 7, SimpleBlock, 2, 20333538, 14941, null] - - [163, 7, SimpleBlock, 2, 20348482, 14520, null] - - [163, 7, SimpleBlock, 2, 20363005, 15205, null] - - [163, 7, SimpleBlock, 2, 20378213, 5201, null] - - [163, 7, SimpleBlock, 2, 20383417, 15907, null] - - [163, 7, SimpleBlock, 2, 20399328, 16652, null] - - [163, 7, SimpleBlock, 2, 20415984, 17361, null] - - [163, 7, SimpleBlock, 2, 20433349, 17414, null] - - [163, 7, SimpleBlock, 2, 20450766, 5296, null] - - [163, 7, SimpleBlock, 2, 20456066, 17770, null] - - [163, 7, SimpleBlock, 2, 20473840, 17844, null] - - [163, 7, SimpleBlock, 2, 20491688, 16842, null] - - [163, 7, SimpleBlock, 2, 20508534, 16488, null] - - [163, 7, SimpleBlock, 2, 20525026, 16936, null] - - [163, 7, SimpleBlock, 2, 20541965, 676, null] - - [163, 7, SimpleBlock, 2, 20542644, 5870, null] - - [163, 7, SimpleBlock, 2, 20548518, 17904, null] - - [163, 7, SimpleBlock, 2, 20566426, 17748, null] - - [163, 7, SimpleBlock, 2, 20584178, 17327, null] - - [163, 7, SimpleBlock, 2, 20601509, 16804, null] - - [163, 7, SimpleBlock, 2, 20618317, 16609, null] - - [163, 7, SimpleBlock, 2, 20634929, 4620, null] - - [163, 7, SimpleBlock, 2, 20639553, 17718, null] - - [163, 7, SimpleBlock, 2, 20657275, 19234, null] - - [163, 7, SimpleBlock, 2, 20676513, 18749, null] - - [163, 7, SimpleBlock, 2, 20695266, 18574, null] - - [163, 7, SimpleBlock, 2, 20713844, 18621, null] - - - 524531317 - - 6 - - Cluster - - 1 - - 20732473 - - 2606864 - - - [231, 1, Timecode, 2, 20732475, 3, 76917] - - [163, 7, SimpleBlock, 2, 20732481, 676, null] - - [163, 7, SimpleBlock, 2, 20733160, 5296, null] - - [163, 7, SimpleBlock, 2, 20738460, 57870, null] - - [163, 7, SimpleBlock, 2, 20796333, 14161, null] - - [163, 7, SimpleBlock, 2, 20810497, 16283, null] - - [163, 7, SimpleBlock, 2, 20826784, 18643, null] - - [163, 7, SimpleBlock, 2, 20845430, 5584, null] - - [163, 7, SimpleBlock, 2, 20851018, 20094, null] - - [163, 7, SimpleBlock, 2, 20871116, 20936, null] - - [163, 7, SimpleBlock, 2, 20892056, 21547, null] - - [163, 7, SimpleBlock, 2, 20913607, 21831, null] - - [163, 7, SimpleBlock, 2, 20935442, 21619, null] - - [163, 7, SimpleBlock, 2, 20957064, 5967, null] - - [163, 7, SimpleBlock, 2, 20963035, 21935, null] - - [163, 7, SimpleBlock, 2, 20984974, 21975, null] - - [163, 7, SimpleBlock, 2, 21006953, 21595, null] - - [163, 7, SimpleBlock, 2, 21028552, 22352, null] - - [163, 7, SimpleBlock, 2, 21050907, 5971, null] - - [163, 7, SimpleBlock, 2, 21056882, 21241, null] - - [163, 7, SimpleBlock, 2, 21078127, 20004, null] - - [163, 7, SimpleBlock, 2, 21098135, 18589, null] - - [163, 7, SimpleBlock, 2, 21116728, 18088, null] - - [163, 7, SimpleBlock, 2, 21134820, 18065, null] - - [163, 7, SimpleBlock, 2, 21152888, 5680, null] - - [163, 7, SimpleBlock, 2, 21158572, 18783, null] - - [163, 7, SimpleBlock, 2, 21177359, 19388, null] - - [163, 7, SimpleBlock, 2, 21196751, 19874, null] - - [163, 7, SimpleBlock, 2, 21216629, 20500, null] - - [163, 7, SimpleBlock, 2, 21237133, 20363, null] - - [163, 7, SimpleBlock, 2, 21257499, 5683, null] - - [163, 7, SimpleBlock, 2, 21263186, 20383, null] - - [163, 7, SimpleBlock, 2, 21283573, 19364, null] - - [163, 7, SimpleBlock, 2, 21302941, 19084, null] - - [163, 7, SimpleBlock, 2, 21322029, 19510, null] - - [163, 7, SimpleBlock, 2, 21341542, 5779, null] - - [163, 7, SimpleBlock, 2, 21347325, 19655, null] - - [163, 7, SimpleBlock, 2, 21366984, 19150, null] - - [163, 7, SimpleBlock, 2, 21386138, 18882, null] - - [163, 7, SimpleBlock, 2, 21405024, 18431, null] - - [163, 7, SimpleBlock, 2, 21423459, 18037, null] - - [163, 7, SimpleBlock, 2, 21441499, 5393, null] - - [163, 7, SimpleBlock, 2, 21446896, 18017, null] - - [163, 7, SimpleBlock, 2, 21464917, 17810, null] - - [163, 7, SimpleBlock, 2, 21482731, 17480, null] - - [163, 7, SimpleBlock, 2, 21500215, 17218, null] - - [163, 7, SimpleBlock, 2, 21517436, 5968, null] - - [163, 7, SimpleBlock, 2, 21523408, 16822, null] - - [163, 7, SimpleBlock, 2, 21540234, 16542, null] - - [163, 7, SimpleBlock, 2, 21556779, 16000, null] - - [163, 7, SimpleBlock, 2, 21572783, 17251, null] - - [163, 7, SimpleBlock, 2, 21590038, 18254, null] - - [163, 7, SimpleBlock, 2, 21608295, 6451, null] - - [163, 7, SimpleBlock, 2, 21614750, 19178, null] - - [163, 7, SimpleBlock, 2, 21633932, 19684, null] - - [163, 7, SimpleBlock, 2, 21653620, 20370, null] - - [163, 7, SimpleBlock, 2, 21673994, 21172, null] - - [163, 7, SimpleBlock, 2, 21695170, 21607, null] - - [163, 7, SimpleBlock, 2, 21716780, 6162, null] - - [163, 7, SimpleBlock, 2, 21722946, 21284, null] - - [163, 7, SimpleBlock, 2, 21744234, 19858, null] - - [163, 7, SimpleBlock, 2, 21764096, 20103, null] - - [163, 7, SimpleBlock, 2, 21784203, 20348, null] - - [163, 7, SimpleBlock, 2, 21804554, 5775, null] - - [163, 7, SimpleBlock, 2, 21810333, 20136, null] - - [163, 7, SimpleBlock, 2, 21830473, 18094, null] - - [163, 7, SimpleBlock, 2, 21848571, 17128, null] - - [163, 7, SimpleBlock, 2, 21865703, 16497, null] - - [163, 7, SimpleBlock, 2, 21882204, 16452, null] - - [163, 7, SimpleBlock, 2, 21898659, 6161, null] - - [163, 7, SimpleBlock, 2, 21904824, 17164, null] - - [163, 7, SimpleBlock, 2, 21921992, 17846, null] - - [163, 7, SimpleBlock, 2, 21939842, 18903, null] - - [163, 7, SimpleBlock, 2, 21958749, 19244, null] - - [163, 7, SimpleBlock, 2, 21977996, 5874, null] - - [163, 7, SimpleBlock, 2, 21983874, 18813, null] - - [163, 7, SimpleBlock, 2, 22002691, 18540, null] - - [163, 7, SimpleBlock, 2, 22021235, 17596, null] - - [163, 7, SimpleBlock, 2, 22038835, 17222, null] - - [163, 7, SimpleBlock, 2, 22056061, 17986, null] - - [163, 7, SimpleBlock, 2, 22074050, 5871, null] - - [163, 7, SimpleBlock, 2, 22079925, 19782, null] - - [163, 7, SimpleBlock, 2, 22099711, 20933, null] - - [163, 7, SimpleBlock, 2, 22120648, 20789, null] - - [163, 7, SimpleBlock, 2, 22141441, 19381, null] - - [163, 7, SimpleBlock, 2, 22160826, 17254, null] - - [163, 7, SimpleBlock, 2, 22178083, 3660, null] - - [163, 7, SimpleBlock, 2, 22181746, 15440, null] - - [163, 7, SimpleBlock, 2, 22197189, 14453, null] - - [163, 7, SimpleBlock, 2, 22211645, 13030, null] - - [163, 7, SimpleBlock, 2, 22224678, 5682, null] - - [163, 7, SimpleBlock, 2, 22230363, 11253, null] - - [163, 7, SimpleBlock, 2, 22241620, 32873, null] - - [163, 7, SimpleBlock, 2, 22274496, 6159, null] - - [163, 7, SimpleBlock, 2, 22280658, 7281, null] - - [163, 7, SimpleBlock, 2, 22287942, 5585, null] - - [163, 7, SimpleBlock, 2, 22293530, 7922, null] - - [163, 7, SimpleBlock, 2, 22301455, 7943, null] - - [163, 7, SimpleBlock, 2, 22309401, 7994, null] - - [163, 7, SimpleBlock, 2, 22317398, 7958, null] - - [163, 7, SimpleBlock, 2, 22325359, 8355, null] - - [163, 7, SimpleBlock, 2, 22333717, 5777, null] - - [163, 7, SimpleBlock, 2, 22339497, 8199, null] - - [163, 7, SimpleBlock, 2, 22347699, 8535, null] - - [163, 7, SimpleBlock, 2, 22356237, 8831, null] - - [163, 7, SimpleBlock, 2, 22365071, 9248, null] - - [163, 7, SimpleBlock, 2, 22374322, 5680, null] - - [163, 7, SimpleBlock, 2, 22380005, 9220, null] - - [163, 7, SimpleBlock, 2, 22389228, 9075, null] - - [163, 7, SimpleBlock, 2, 22398306, 9125, null] - - [163, 7, SimpleBlock, 2, 22407434, 9290, null] - - [163, 7, SimpleBlock, 2, 22416727, 9547, null] - - [163, 7, SimpleBlock, 2, 22426277, 5969, null] - - [163, 7, SimpleBlock, 2, 22432249, 9837, null] - - [163, 7, SimpleBlock, 2, 22442089, 10391, null] - - [163, 7, SimpleBlock, 2, 22452483, 10332, null] - - [163, 7, SimpleBlock, 2, 22462818, 10531, null] - - [163, 7, SimpleBlock, 2, 22473352, 10458, null] - - [163, 7, SimpleBlock, 2, 22483813, 5872, null] - - [163, 7, SimpleBlock, 2, 22489688, 10067, null] - - [163, 7, SimpleBlock, 2, 22499758, 10130, null] - - [163, 7, SimpleBlock, 2, 22509891, 9976, null] - - [163, 7, SimpleBlock, 2, 22519870, 10480, null] - - [163, 7, SimpleBlock, 2, 22530353, 6162, null] - - [163, 7, SimpleBlock, 2, 22536518, 11192, null] - - [163, 7, SimpleBlock, 2, 22547713, 10621, null] - - [163, 7, SimpleBlock, 2, 22558337, 10069, null] - - [163, 7, SimpleBlock, 2, 22568409, 10229, null] - - [163, 7, SimpleBlock, 2, 22578641, 10237, null] - - [163, 7, SimpleBlock, 2, 22588881, 6162, null] - - [163, 7, SimpleBlock, 2, 22595046, 10671, null] - - [163, 7, SimpleBlock, 2, 22605720, 10010, null] - - [163, 7, SimpleBlock, 2, 22615733, 9164, null] - - [163, 7, SimpleBlock, 2, 22624900, 8803, null] - - [163, 7, SimpleBlock, 2, 22633706, 6255, null] - - [163, 7, SimpleBlock, 2, 22639964, 8877, null] - - [163, 7, SimpleBlock, 2, 22648844, 8534, null] - - [163, 7, SimpleBlock, 2, 22657381, 7929, null] - - [163, 7, SimpleBlock, 2, 22665313, 8015, null] - - [163, 7, SimpleBlock, 2, 22673331, 8173, null] - - [163, 7, SimpleBlock, 2, 22681507, 6065, null] - - [163, 7, SimpleBlock, 2, 22687575, 7984, null] - - [163, 7, SimpleBlock, 2, 22695562, 7944, null] - - [163, 7, SimpleBlock, 2, 22703509, 8216, null] - - [163, 7, SimpleBlock, 2, 22711728, 8112, null] - - [163, 7, SimpleBlock, 2, 22719843, 7928, null] - - [163, 7, SimpleBlock, 2, 22727774, 6354, null] - - [163, 7, SimpleBlock, 2, 22734131, 7622, null] - - [163, 7, SimpleBlock, 2, 22741756, 8231, null] - - [163, 7, SimpleBlock, 2, 22749990, 8319, null] - - [163, 7, SimpleBlock, 2, 22758312, 7903, null] - - [163, 7, SimpleBlock, 2, 22766218, 6063, null] - - [163, 7, SimpleBlock, 2, 22772284, 8053, null] - - [163, 7, SimpleBlock, 2, 22780340, 8385, null] - - [163, 7, SimpleBlock, 2, 22788728, 8056, null] - - [163, 7, SimpleBlock, 2, 22796787, 8148, null] - - [163, 7, SimpleBlock, 2, 22804938, 8115, null] - - [163, 7, SimpleBlock, 2, 22813056, 6065, null] - - [163, 7, SimpleBlock, 2, 22819124, 8290, null] - - [163, 7, SimpleBlock, 2, 22827417, 7985, null] - - [163, 7, SimpleBlock, 2, 22835405, 8685, null] - - [163, 7, SimpleBlock, 2, 22844093, 9660, null] - - [163, 7, SimpleBlock, 2, 22853756, 5874, null] - - [163, 7, SimpleBlock, 2, 22859633, 10373, null] - - [163, 7, SimpleBlock, 2, 22870009, 9892, null] - - [163, 7, SimpleBlock, 2, 22879904, 9637, null] - - [163, 7, SimpleBlock, 2, 22889544, 9721, null] - - [163, 7, SimpleBlock, 2, 22899268, 9824, null] - - [163, 7, SimpleBlock, 2, 22909095, 5874, null] - - [163, 7, SimpleBlock, 2, 22914972, 9921, null] - - [163, 7, SimpleBlock, 2, 22924896, 8744, null] - - [163, 7, SimpleBlock, 2, 22933643, 7978, null] - - [163, 7, SimpleBlock, 2, 22941624, 7648, null] - - [163, 7, SimpleBlock, 2, 22949275, 7314, null] - - [163, 7, SimpleBlock, 2, 22956592, 5969, null] - - [163, 7, SimpleBlock, 2, 22962564, 7531, null] - - [163, 7, SimpleBlock, 2, 22970098, 7095, null] - - [163, 7, SimpleBlock, 2, 22977196, 6685, null] - - [163, 7, SimpleBlock, 2, 22983884, 6591, null] - - [163, 7, SimpleBlock, 2, 22990478, 5776, null] - - [163, 7, SimpleBlock, 2, 22996257, 6599, null] - - [163, 7, SimpleBlock, 2, 23002859, 5858, null] - - [163, 7, SimpleBlock, 2, 23008720, 5549, null] - - [163, 7, SimpleBlock, 2, 23014272, 4881, null] - - [163, 7, SimpleBlock, 2, 23019156, 4488, null] - - [163, 7, SimpleBlock, 2, 23023647, 5968, null] - - [163, 7, SimpleBlock, 2, 23029618, 4335, null] - - [163, 7, SimpleBlock, 2, 23033956, 4173, null] - - [163, 7, SimpleBlock, 2, 23038132, 3829, null] - - [163, 7, SimpleBlock, 2, 23041964, 3577, null] - - [163, 7, SimpleBlock, 2, 23045544, 3307, null] - - [163, 7, SimpleBlock, 2, 23048854, 5969, null] - - [163, 7, SimpleBlock, 2, 23054826, 3053, null] - - [163, 7, SimpleBlock, 2, 23057882, 2805, null] - - [163, 7, SimpleBlock, 2, 23060690, 2487, null] - - [163, 7, SimpleBlock, 2, 23063180, 2142, null] - - [163, 7, SimpleBlock, 2, 23065325, 6257, null] - - [163, 7, SimpleBlock, 2, 23071585, 1832, null] - - [163, 7, SimpleBlock, 2, 23073420, 1453, null] - - [163, 7, SimpleBlock, 2, 23074876, 1818, null] - - [163, 7, SimpleBlock, 2, 23076697, 1981, null] - - [163, 7, SimpleBlock, 2, 23078681, 3420, null] - - [163, 7, SimpleBlock, 2, 23082104, 5587, null] - - [163, 7, SimpleBlock, 2, 23087694, 3332, null] - - [163, 7, SimpleBlock, 2, 23091029, 2137, null] - - [163, 7, SimpleBlock, 2, 23093169, 2342, null] - - [163, 7, SimpleBlock, 2, 23095514, 3714, null] - - [163, 7, SimpleBlock, 2, 23099231, 4914, null] - - [163, 7, SimpleBlock, 2, 23104148, 2562, null] - - [163, 7, SimpleBlock, 2, 23106713, 3019, null] - - [163, 7, SimpleBlock, 2, 23109735, 2231, null] - - [163, 7, SimpleBlock, 2, 23111969, 1798, null] - - [163, 7, SimpleBlock, 2, 23113770, 1799, null] - - [163, 7, SimpleBlock, 2, 23115572, 5775, null] - - [163, 7, SimpleBlock, 2, 23121350, 1502, null] - - [163, 7, SimpleBlock, 2, 23122855, 1437, null] - - [163, 7, SimpleBlock, 2, 23124295, 1266, null] - - [163, 7, SimpleBlock, 2, 23125564, 1279, null] - - [163, 7, SimpleBlock, 2, 23126846, 1276, null] - - [163, 7, SimpleBlock, 2, 23128125, 4816, null] - - [163, 7, SimpleBlock, 2, 23132944, 1198, null] - - [163, 7, SimpleBlock, 2, 23134145, 1034, null] - - [163, 7, SimpleBlock, 2, 23135182, 876, null] - - [163, 7, SimpleBlock, 2, 23136061, 721, null] - - [163, 7, SimpleBlock, 2, 23136785, 4719, null] - - [163, 7, SimpleBlock, 2, 23141507, 541, null] - - [163, 7, SimpleBlock, 2, 23142051, 616, null] - - [163, 7, SimpleBlock, 2, 23142670, 618, null] - - [163, 7, SimpleBlock, 2, 23143291, 597, null] - - [163, 7, SimpleBlock, 2, 23143891, 440, null] - - [163, 7, SimpleBlock, 2, 23144334, 4527, null] - - [163, 7, SimpleBlock, 2, 23148864, 435, null] - - [163, 7, SimpleBlock, 2, 23149302, 424, null] - - [163, 7, SimpleBlock, 2, 23149729, 432, null] - - [163, 7, SimpleBlock, 2, 23150164, 417, null] - - [163, 7, SimpleBlock, 2, 23150584, 580, null] - - [163, 7, SimpleBlock, 2, 23151167, 405, null] - - [163, 7, SimpleBlock, 2, 23151575, 4525, null] - - [163, 7, SimpleBlock, 2, 23156103, 413, null] - - [163, 7, SimpleBlock, 2, 23156519, 411, null] - - [163, 7, SimpleBlock, 2, 23156933, 437, null] - - [163, 7, SimpleBlock, 2, 23157373, 422, null] - - [163, 7, SimpleBlock, 2, 23157798, 437, null] - - [163, 7, SimpleBlock, 2, 23158238, 4613, null] - - [163, 7, SimpleBlock, 2, 23162854, 458, null] - - [163, 7, SimpleBlock, 2, 23163315, 479, null] - - [163, 7, SimpleBlock, 2, 23163797, 478, null] - - [163, 7, SimpleBlock, 2, 23164278, 477, null] - - [163, 7, SimpleBlock, 2, 23164758, 4613, null] - - [163, 7, SimpleBlock, 2, 23169374, 489, null] - - [163, 7, SimpleBlock, 2, 23169866, 550, null] - - [163, 7, SimpleBlock, 2, 23170419, 541, null] - - [163, 7, SimpleBlock, 2, 23170963, 549, null] - - [163, 7, SimpleBlock, 2, 23171515, 583, null] - - [163, 7, SimpleBlock, 2, 23172101, 4613, null] - - [163, 7, SimpleBlock, 2, 23176717, 629, null] - - [163, 7, SimpleBlock, 2, 23177349, 728, null] - - [163, 7, SimpleBlock, 2, 23178080, 756, null] - - [163, 7, SimpleBlock, 2, 23178839, 1142, null] - - [163, 7, SimpleBlock, 2, 23179984, 5009, null] - - [163, 7, SimpleBlock, 2, 23184996, 1271, null] - - [163, 7, SimpleBlock, 2, 23186270, 1824, null] - - [163, 7, SimpleBlock, 2, 23188097, 3163, null] - - [163, 7, SimpleBlock, 2, 23191263, 3939, null] - - [163, 7, SimpleBlock, 2, 23195205, 4206, null] - - [163, 7, SimpleBlock, 2, 23199414, 5106, null] - - [163, 7, SimpleBlock, 2, 23204523, 4020, null] - - [163, 7, SimpleBlock, 2, 23208546, 4034, null] - - [163, 7, SimpleBlock, 2, 23212583, 4006, null] - - [163, 7, SimpleBlock, 2, 23216592, 3598, null] - - [163, 7, SimpleBlock, 2, 23220193, 3320, null] - - [163, 7, SimpleBlock, 2, 23223516, 5011, null] - - [163, 7, SimpleBlock, 2, 23228530, 2597, null] - - [163, 7, SimpleBlock, 2, 23231130, 2306, null] - - [163, 7, SimpleBlock, 2, 23233439, 1768, null] - - [163, 7, SimpleBlock, 2, 23235210, 1621, null] - - [163, 7, SimpleBlock, 2, 23236834, 4913, null] - - [163, 7, SimpleBlock, 2, 23241750, 1419, null] - - [163, 7, SimpleBlock, 2, 23243172, 1361, null] - - [163, 7, SimpleBlock, 2, 23244536, 1402, null] - - [163, 7, SimpleBlock, 2, 23245941, 1566, null] - - [163, 7, SimpleBlock, 2, 23247510, 1694, null] - - [163, 7, SimpleBlock, 2, 23249207, 4914, null] - - [163, 7, SimpleBlock, 2, 23254124, 2301, null] - - [163, 7, SimpleBlock, 2, 23256428, 2605, null] - - [163, 7, SimpleBlock, 2, 23259036, 2604, null] - - [163, 7, SimpleBlock, 2, 23261643, 2765, null] - - [163, 7, SimpleBlock, 2, 23264411, 4816, null] - - [163, 7, SimpleBlock, 2, 23269230, 2631, null] - - [163, 7, SimpleBlock, 2, 23271864, 2608, null] - - [163, 7, SimpleBlock, 2, 23274475, 2650, null] - - [163, 7, SimpleBlock, 2, 23277128, 3690, null] - - [163, 7, SimpleBlock, 2, 23280821, 4659, null] - - [163, 7, SimpleBlock, 2, 23285483, 5586, null] - - [163, 7, SimpleBlock, 2, 23291072, 5402, null] - - [163, 7, SimpleBlock, 2, 23296477, 5586, null] - - [163, 7, SimpleBlock, 2, 23302066, 4918, null] - - [163, 7, SimpleBlock, 2, 23306987, 3245, null] - - [163, 7, SimpleBlock, 2, 23310235, 3349, null] - - [163, 7, SimpleBlock, 2, 23313587, 5393, null] - - [163, 7, SimpleBlock, 2, 23318983, 3421, null] - - [163, 7, SimpleBlock, 2, 23322407, 3249, null] - - [163, 7, SimpleBlock, 2, 23325659, 2877, null] - - [163, 7, SimpleBlock, 2, 23328539, 2659, null] - - [163, 7, SimpleBlock, 2, 23331201, 2410, null] - - [163, 7, SimpleBlock, 2, 23333614, 2300, null] - - [163, 7, SimpleBlock, 2, 23335917, 1891, null] - - [163, 7, SimpleBlock, 2, 23337811, 1526, null] diff --git a/libs/enzyme/tests/test_mkv.py b/libs/enzyme/tests/test_mkv.py deleted file mode 100644 index 1bfa0456b..000000000 --- a/libs/enzyme/tests/test_mkv.py +++ /dev/null @@ -1,607 +0,0 @@ -# -*- coding: utf-8 -*- -from datetime import timedelta, datetime -from enzyme.mkv import MKV, VIDEO_TRACK, AUDIO_TRACK, SUBTITLE_TRACK -import io -import os.path -import requests -import unittest -import zipfile - - -# Test directory -TEST_DIR = os.path.join(os.path.dirname(__file__), os.path.splitext(__file__)[0]) - - -def setUpModule(): - if not os.path.exists(TEST_DIR): - r = requests.get('http://downloads.sourceforge.net/project/matroska/test_files/matroska_test_w1_1.zip') - with zipfile.ZipFile(io.BytesIO(r.content), 'r') as f: - f.extractall(TEST_DIR) - - -class MKVTestCase(unittest.TestCase): - def test_test1(self): - stream = io.open(os.path.join(TEST_DIR, 'test1.mkv'), 'rb') - mkv = MKV(stream) - # info - self.assertTrue(mkv.info.title is None) - self.assertTrue(mkv.info.duration == timedelta(minutes=1, seconds=27, milliseconds=336)) - self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 7, 23, 3)) - self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.10.0 + libmatroska2 v0.10.1') - self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 ru from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.1.1 (\'Bouncin\' Back\') built on Jul 3 2010 22:54:08') - # video track - self.assertTrue(len(mkv.video_tracks) == 1) - self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK) - self.assertTrue(mkv.video_tracks[0].number == 1) - self.assertTrue(mkv.video_tracks[0].name is None) - self.assertTrue(mkv.video_tracks[0].language == 'und') - self.assertTrue(mkv.video_tracks[0].enabled == True) - self.assertTrue(mkv.video_tracks[0].default == True) - self.assertTrue(mkv.video_tracks[0].forced == False) - self.assertTrue(mkv.video_tracks[0].lacing == False) - self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MS/VFW/FOURCC') - self.assertTrue(mkv.video_tracks[0].codec_name is None) - self.assertTrue(mkv.video_tracks[0].width == 854) - self.assertTrue(mkv.video_tracks[0].height == 480) - self.assertTrue(mkv.video_tracks[0].interlaced == False) - self.assertTrue(mkv.video_tracks[0].stereo_mode is None) - self.assertTrue(mkv.video_tracks[0].crop == {}) - self.assertTrue(mkv.video_tracks[0].display_width is None) - self.assertTrue(mkv.video_tracks[0].display_height is None) - self.assertTrue(mkv.video_tracks[0].display_unit is None) - self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None) - # audio track - self.assertTrue(len(mkv.audio_tracks) == 1) - self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK) - self.assertTrue(mkv.audio_tracks[0].number == 2) - self.assertTrue(mkv.audio_tracks[0].name is None) - self.assertTrue(mkv.audio_tracks[0].language == 'und') - self.assertTrue(mkv.audio_tracks[0].enabled == True) - self.assertTrue(mkv.audio_tracks[0].default == True) - self.assertTrue(mkv.audio_tracks[0].forced == False) - self.assertTrue(mkv.audio_tracks[0].lacing == True) - self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_MPEG/L3') - self.assertTrue(mkv.audio_tracks[0].codec_name is None) - self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0) - self.assertTrue(mkv.audio_tracks[0].channels == 2) - self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None) - self.assertTrue(mkv.audio_tracks[0].bit_depth is None) - # subtitle track - self.assertTrue(len(mkv.subtitle_tracks) == 0) - # chapters - self.assertTrue(len(mkv.chapters) == 0) - # tags - self.assertTrue(len(mkv.tags) == 1) - self.assertTrue(len(mkv.tags[0].simpletags) == 3) - self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE') - self.assertTrue(mkv.tags[0].simpletags[0].default == True) - self.assertTrue(mkv.tags[0].simpletags[0].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 1') - self.assertTrue(mkv.tags[0].simpletags[0].binary is None) - self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED') - self.assertTrue(mkv.tags[0].simpletags[1].default == True) - self.assertTrue(mkv.tags[0].simpletags[1].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[1].string == '2010') - self.assertTrue(mkv.tags[0].simpletags[1].binary is None) - self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT') - self.assertTrue(mkv.tags[0].simpletags[2].default == True) - self.assertTrue(mkv.tags[0].simpletags[2].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File1, basic MPEG4.2 and MP3 with only SimpleBlock') - self.assertTrue(mkv.tags[0].simpletags[2].binary is None) - - def test_test2(self): - stream = io.open(os.path.join(TEST_DIR, 'test2.mkv'), 'rb') - mkv = MKV(stream) - # info - self.assertTrue(mkv.info.title is None) - self.assertTrue(mkv.info.duration == timedelta(seconds=47, milliseconds=509)) - self.assertTrue(mkv.info.date_utc == datetime(2011, 6, 2, 12, 45, 20)) - self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.21.0 + libmatroska2 v0.22.1') - self.assertTrue(mkv.info.writing_app == 'mkclean 0.8.3 ru from libebml2 v0.10.0 + libmatroska2 v0.10.1 + mkclean 0.5.5 ru from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.1.1 (\'Bouncin\' Back\') built on Jul 3 2010 22:54:08') - # video track - self.assertTrue(len(mkv.video_tracks) == 1) - self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK) - self.assertTrue(mkv.video_tracks[0].number == 1) - self.assertTrue(mkv.video_tracks[0].name is None) - self.assertTrue(mkv.video_tracks[0].language == 'und') - self.assertTrue(mkv.video_tracks[0].enabled == True) - self.assertTrue(mkv.video_tracks[0].default == True) - self.assertTrue(mkv.video_tracks[0].forced == False) - self.assertTrue(mkv.video_tracks[0].lacing == False) - self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC') - self.assertTrue(mkv.video_tracks[0].codec_name is None) - self.assertTrue(mkv.video_tracks[0].width == 1024) - self.assertTrue(mkv.video_tracks[0].height == 576) - self.assertTrue(mkv.video_tracks[0].interlaced == False) - self.assertTrue(mkv.video_tracks[0].stereo_mode is None) - self.assertTrue(mkv.video_tracks[0].crop == {}) - self.assertTrue(mkv.video_tracks[0].display_width == 1354) - self.assertTrue(mkv.video_tracks[0].display_height is None) - self.assertTrue(mkv.video_tracks[0].display_unit is None) - self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None) - # audio track - self.assertTrue(len(mkv.audio_tracks) == 1) - self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK) - self.assertTrue(mkv.audio_tracks[0].number == 2) - self.assertTrue(mkv.audio_tracks[0].name is None) - self.assertTrue(mkv.audio_tracks[0].language == 'und') - self.assertTrue(mkv.audio_tracks[0].enabled == True) - self.assertTrue(mkv.audio_tracks[0].default == True) - self.assertTrue(mkv.audio_tracks[0].forced == False) - self.assertTrue(mkv.audio_tracks[0].lacing == True) - self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_AAC') - self.assertTrue(mkv.audio_tracks[0].codec_name is None) - self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0) - self.assertTrue(mkv.audio_tracks[0].channels == 2) - self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None) - self.assertTrue(mkv.audio_tracks[0].bit_depth is None) - # subtitle track - self.assertTrue(len(mkv.subtitle_tracks) == 0) - # chapters - self.assertTrue(len(mkv.chapters) == 0) - # tags - self.assertTrue(len(mkv.tags) == 1) - self.assertTrue(len(mkv.tags[0].simpletags) == 3) - self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE') - self.assertTrue(mkv.tags[0].simpletags[0].default == True) - self.assertTrue(mkv.tags[0].simpletags[0].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[0].string == 'Elephant Dream - test 2') - self.assertTrue(mkv.tags[0].simpletags[0].binary is None) - self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED') - self.assertTrue(mkv.tags[0].simpletags[1].default == True) - self.assertTrue(mkv.tags[0].simpletags[1].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[1].string == '2010') - self.assertTrue(mkv.tags[0].simpletags[1].binary is None) - self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT') - self.assertTrue(mkv.tags[0].simpletags[2].default == True) - self.assertTrue(mkv.tags[0].simpletags[2].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 2, 100,000 timecode scale, odd aspect ratio, and CRC-32. Codecs are AVC and AAC') - self.assertTrue(mkv.tags[0].simpletags[2].binary is None) - - def test_test3(self): - stream = io.open(os.path.join(TEST_DIR, 'test3.mkv'), 'rb') - mkv = MKV(stream) - # info - self.assertTrue(mkv.info.title is None) - self.assertTrue(mkv.info.duration == timedelta(seconds=49, milliseconds=64)) - self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 21, 43, 25)) - self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.11.0 + libmatroska2 v0.10.1') - self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 ro from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.1.1 (\'Bouncin\' Back\') built on Jul 3 2010 22:54:08') - # video track - self.assertTrue(len(mkv.video_tracks) == 1) - self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK) - self.assertTrue(mkv.video_tracks[0].number == 1) - self.assertTrue(mkv.video_tracks[0].name is None) - self.assertTrue(mkv.video_tracks[0].language == 'und') - self.assertTrue(mkv.video_tracks[0].enabled == True) - self.assertTrue(mkv.video_tracks[0].default == True) - self.assertTrue(mkv.video_tracks[0].forced == False) - self.assertTrue(mkv.video_tracks[0].lacing == False) - self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC') - self.assertTrue(mkv.video_tracks[0].codec_name is None) - self.assertTrue(mkv.video_tracks[0].width == 1024) - self.assertTrue(mkv.video_tracks[0].height == 576) - self.assertTrue(mkv.video_tracks[0].interlaced == False) - self.assertTrue(mkv.video_tracks[0].stereo_mode is None) - self.assertTrue(mkv.video_tracks[0].crop == {}) - self.assertTrue(mkv.video_tracks[0].display_width is None) - self.assertTrue(mkv.video_tracks[0].display_height is None) - self.assertTrue(mkv.video_tracks[0].display_unit is None) - self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None) - # audio track - self.assertTrue(len(mkv.audio_tracks) == 1) - self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK) - self.assertTrue(mkv.audio_tracks[0].number == 2) - self.assertTrue(mkv.audio_tracks[0].name is None) - self.assertTrue(mkv.audio_tracks[0].language is None) - self.assertTrue(mkv.audio_tracks[0].enabled == True) - self.assertTrue(mkv.audio_tracks[0].default == True) - self.assertTrue(mkv.audio_tracks[0].forced == False) - self.assertTrue(mkv.audio_tracks[0].lacing == True) - self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_MPEG/L3') - self.assertTrue(mkv.audio_tracks[0].codec_name is None) - self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0) - self.assertTrue(mkv.audio_tracks[0].channels == 2) - self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None) - self.assertTrue(mkv.audio_tracks[0].bit_depth is None) - # subtitle track - self.assertTrue(len(mkv.subtitle_tracks) == 0) - # chapters - self.assertTrue(len(mkv.chapters) == 0) - # tags - self.assertTrue(len(mkv.tags) == 1) - self.assertTrue(len(mkv.tags[0].simpletags) == 3) - self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE') - self.assertTrue(mkv.tags[0].simpletags[0].default == True) - self.assertTrue(mkv.tags[0].simpletags[0].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[0].string == 'Elephant Dream - test 3') - self.assertTrue(mkv.tags[0].simpletags[0].binary is None) - self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED') - self.assertTrue(mkv.tags[0].simpletags[1].default == True) - self.assertTrue(mkv.tags[0].simpletags[1].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[1].string == '2010') - self.assertTrue(mkv.tags[0].simpletags[1].binary is None) - self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT') - self.assertTrue(mkv.tags[0].simpletags[2].default == True) - self.assertTrue(mkv.tags[0].simpletags[2].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 3, header stripping on the video track and no SimpleBlock') - self.assertTrue(mkv.tags[0].simpletags[2].binary is None) - - def test_test5(self): - stream = io.open(os.path.join(TEST_DIR, 'test5.mkv'), 'rb') - mkv = MKV(stream) - # info - self.assertTrue(mkv.info.title is None) - self.assertTrue(mkv.info.duration == timedelta(seconds=46, milliseconds=665)) - self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 18, 6, 43)) - self.assertTrue(mkv.info.muxing_app == 'libebml v1.0.0 + libmatroska v1.0.0') - self.assertTrue(mkv.info.writing_app == 'mkvmerge v4.0.0 (\'The Stars were mine\') built on Jun 6 2010 16:18:42') - # video track - self.assertTrue(len(mkv.video_tracks) == 1) - self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK) - self.assertTrue(mkv.video_tracks[0].number == 1) - self.assertTrue(mkv.video_tracks[0].name is None) - self.assertTrue(mkv.video_tracks[0].language == 'und') - self.assertTrue(mkv.video_tracks[0].enabled == True) - self.assertTrue(mkv.video_tracks[0].default == True) - self.assertTrue(mkv.video_tracks[0].forced == False) - self.assertTrue(mkv.video_tracks[0].lacing == False) - self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC') - self.assertTrue(mkv.video_tracks[0].codec_name is None) - self.assertTrue(mkv.video_tracks[0].width == 1024) - self.assertTrue(mkv.video_tracks[0].height == 576) - self.assertTrue(mkv.video_tracks[0].interlaced == False) - self.assertTrue(mkv.video_tracks[0].stereo_mode is None) - self.assertTrue(mkv.video_tracks[0].crop == {}) - self.assertTrue(mkv.video_tracks[0].display_width == 1024) - self.assertTrue(mkv.video_tracks[0].display_height == 576) - self.assertTrue(mkv.video_tracks[0].display_unit is None) - self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None) - # audio tracks - self.assertTrue(len(mkv.audio_tracks) == 2) - self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK) - self.assertTrue(mkv.audio_tracks[0].number == 2) - self.assertTrue(mkv.audio_tracks[0].name is None) - self.assertTrue(mkv.audio_tracks[0].language == 'und') - self.assertTrue(mkv.audio_tracks[0].enabled == True) - self.assertTrue(mkv.audio_tracks[0].default == True) - self.assertTrue(mkv.audio_tracks[0].forced == False) - self.assertTrue(mkv.audio_tracks[0].lacing == True) - self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_AAC') - self.assertTrue(mkv.audio_tracks[0].codec_name is None) - self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0) - self.assertTrue(mkv.audio_tracks[0].channels == 2) - self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None) - self.assertTrue(mkv.audio_tracks[0].bit_depth is None) - self.assertTrue(mkv.audio_tracks[1].type == AUDIO_TRACK) - self.assertTrue(mkv.audio_tracks[1].number == 10) - self.assertTrue(mkv.audio_tracks[1].name == 'Commentary') - self.assertTrue(mkv.audio_tracks[1].language is None) - self.assertTrue(mkv.audio_tracks[1].enabled == True) - self.assertTrue(mkv.audio_tracks[1].default == False) - self.assertTrue(mkv.audio_tracks[1].forced == False) - self.assertTrue(mkv.audio_tracks[1].lacing == True) - self.assertTrue(mkv.audio_tracks[1].codec_id == 'A_AAC') - self.assertTrue(mkv.audio_tracks[1].codec_name is None) - self.assertTrue(mkv.audio_tracks[1].sampling_frequency == 22050.0) - self.assertTrue(mkv.audio_tracks[1].channels == 1) - self.assertTrue(mkv.audio_tracks[1].output_sampling_frequency == 44100.0) - self.assertTrue(mkv.audio_tracks[1].bit_depth is None) - # subtitle track - self.assertTrue(len(mkv.subtitle_tracks) == 8) - self.assertTrue(mkv.subtitle_tracks[0].type == SUBTITLE_TRACK) - self.assertTrue(mkv.subtitle_tracks[0].number == 3) - self.assertTrue(mkv.subtitle_tracks[0].name is None) - self.assertTrue(mkv.subtitle_tracks[0].language is None) - self.assertTrue(mkv.subtitle_tracks[0].enabled == True) - self.assertTrue(mkv.subtitle_tracks[0].default == True) - self.assertTrue(mkv.subtitle_tracks[0].forced == False) - self.assertTrue(mkv.subtitle_tracks[0].lacing == False) - self.assertTrue(mkv.subtitle_tracks[0].codec_id == 'S_TEXT/UTF8') - self.assertTrue(mkv.subtitle_tracks[0].codec_name is None) - self.assertTrue(mkv.subtitle_tracks[1].type == SUBTITLE_TRACK) - self.assertTrue(mkv.subtitle_tracks[1].number == 4) - self.assertTrue(mkv.subtitle_tracks[1].name is None) - self.assertTrue(mkv.subtitle_tracks[1].language == 'hun') - self.assertTrue(mkv.subtitle_tracks[1].enabled == True) - self.assertTrue(mkv.subtitle_tracks[1].default == False) - self.assertTrue(mkv.subtitle_tracks[1].forced == False) - self.assertTrue(mkv.subtitle_tracks[1].lacing == False) - self.assertTrue(mkv.subtitle_tracks[1].codec_id == 'S_TEXT/UTF8') - self.assertTrue(mkv.subtitle_tracks[1].codec_name is None) - self.assertTrue(mkv.subtitle_tracks[2].type == SUBTITLE_TRACK) - self.assertTrue(mkv.subtitle_tracks[2].number == 5) - self.assertTrue(mkv.subtitle_tracks[2].name is None) - self.assertTrue(mkv.subtitle_tracks[2].language == 'ger') - self.assertTrue(mkv.subtitle_tracks[2].enabled == True) - self.assertTrue(mkv.subtitle_tracks[2].default == False) - self.assertTrue(mkv.subtitle_tracks[2].forced == False) - self.assertTrue(mkv.subtitle_tracks[2].lacing == False) - self.assertTrue(mkv.subtitle_tracks[2].codec_id == 'S_TEXT/UTF8') - self.assertTrue(mkv.subtitle_tracks[2].codec_name is None) - self.assertTrue(mkv.subtitle_tracks[3].type == SUBTITLE_TRACK) - self.assertTrue(mkv.subtitle_tracks[3].number == 6) - self.assertTrue(mkv.subtitle_tracks[3].name is None) - self.assertTrue(mkv.subtitle_tracks[3].language == 'fre') - self.assertTrue(mkv.subtitle_tracks[3].enabled == True) - self.assertTrue(mkv.subtitle_tracks[3].default == False) - self.assertTrue(mkv.subtitle_tracks[3].forced == False) - self.assertTrue(mkv.subtitle_tracks[3].lacing == False) - self.assertTrue(mkv.subtitle_tracks[3].codec_id == 'S_TEXT/UTF8') - self.assertTrue(mkv.subtitle_tracks[3].codec_name is None) - self.assertTrue(mkv.subtitle_tracks[4].type == SUBTITLE_TRACK) - self.assertTrue(mkv.subtitle_tracks[4].number == 8) - self.assertTrue(mkv.subtitle_tracks[4].name is None) - self.assertTrue(mkv.subtitle_tracks[4].language == 'spa') - self.assertTrue(mkv.subtitle_tracks[4].enabled == True) - self.assertTrue(mkv.subtitle_tracks[4].default == False) - self.assertTrue(mkv.subtitle_tracks[4].forced == False) - self.assertTrue(mkv.subtitle_tracks[4].lacing == False) - self.assertTrue(mkv.subtitle_tracks[4].codec_id == 'S_TEXT/UTF8') - self.assertTrue(mkv.subtitle_tracks[4].codec_name is None) - self.assertTrue(mkv.subtitle_tracks[5].type == SUBTITLE_TRACK) - self.assertTrue(mkv.subtitle_tracks[5].number == 9) - self.assertTrue(mkv.subtitle_tracks[5].name is None) - self.assertTrue(mkv.subtitle_tracks[5].language == 'ita') - self.assertTrue(mkv.subtitle_tracks[5].enabled == True) - self.assertTrue(mkv.subtitle_tracks[5].default == False) - self.assertTrue(mkv.subtitle_tracks[5].forced == False) - self.assertTrue(mkv.subtitle_tracks[5].lacing == False) - self.assertTrue(mkv.subtitle_tracks[5].codec_id == 'S_TEXT/UTF8') - self.assertTrue(mkv.subtitle_tracks[5].codec_name is None) - self.assertTrue(mkv.subtitle_tracks[6].type == SUBTITLE_TRACK) - self.assertTrue(mkv.subtitle_tracks[6].number == 11) - self.assertTrue(mkv.subtitle_tracks[6].name is None) - self.assertTrue(mkv.subtitle_tracks[6].language == 'jpn') - self.assertTrue(mkv.subtitle_tracks[6].enabled == True) - self.assertTrue(mkv.subtitle_tracks[6].default == False) - self.assertTrue(mkv.subtitle_tracks[6].forced == False) - self.assertTrue(mkv.subtitle_tracks[6].lacing == False) - self.assertTrue(mkv.subtitle_tracks[6].codec_id == 'S_TEXT/UTF8') - self.assertTrue(mkv.subtitle_tracks[6].codec_name is None) - self.assertTrue(mkv.subtitle_tracks[7].type == SUBTITLE_TRACK) - self.assertTrue(mkv.subtitle_tracks[7].number == 7) - self.assertTrue(mkv.subtitle_tracks[7].name is None) - self.assertTrue(mkv.subtitle_tracks[7].language == 'und') - self.assertTrue(mkv.subtitle_tracks[7].enabled == True) - self.assertTrue(mkv.subtitle_tracks[7].default == False) - self.assertTrue(mkv.subtitle_tracks[7].forced == False) - self.assertTrue(mkv.subtitle_tracks[7].lacing == False) - self.assertTrue(mkv.subtitle_tracks[7].codec_id == 'S_TEXT/UTF8') - self.assertTrue(mkv.subtitle_tracks[7].codec_name is None) - # chapters - self.assertTrue(len(mkv.chapters) == 0) - # tags - self.assertTrue(len(mkv.tags) == 1) - self.assertTrue(len(mkv.tags[0].simpletags) == 3) - self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE') - self.assertTrue(mkv.tags[0].simpletags[0].default == True) - self.assertTrue(mkv.tags[0].simpletags[0].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 8') - self.assertTrue(mkv.tags[0].simpletags[0].binary is None) - self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED') - self.assertTrue(mkv.tags[0].simpletags[1].default == True) - self.assertTrue(mkv.tags[0].simpletags[1].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[1].string == '2010') - self.assertTrue(mkv.tags[0].simpletags[1].binary is None) - self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT') - self.assertTrue(mkv.tags[0].simpletags[2].default == True) - self.assertTrue(mkv.tags[0].simpletags[2].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 8, secondary audio commentary track, misc subtitle tracks') - self.assertTrue(mkv.tags[0].simpletags[2].binary is None) - - def test_test6(self): - stream = io.open(os.path.join(TEST_DIR, 'test6.mkv'), 'rb') - mkv = MKV(stream) - # info - self.assertTrue(mkv.info.title is None) - self.assertTrue(mkv.info.duration == timedelta(seconds=87, milliseconds=336)) - self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 16, 31, 55)) - self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.10.1 + libmatroska2 v0.10.1') - self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 r from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.0.0 (\'The Stars were mine\') built on Jun 6 2010 16:18:42') - # video track - self.assertTrue(len(mkv.video_tracks) == 1) - self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK) - self.assertTrue(mkv.video_tracks[0].number == 1) - self.assertTrue(mkv.video_tracks[0].name is None) - self.assertTrue(mkv.video_tracks[0].language == 'und') - self.assertTrue(mkv.video_tracks[0].enabled == True) - self.assertTrue(mkv.video_tracks[0].default == False) - self.assertTrue(mkv.video_tracks[0].forced == False) - self.assertTrue(mkv.video_tracks[0].lacing == False) - self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MS/VFW/FOURCC') - self.assertTrue(mkv.video_tracks[0].codec_name is None) - self.assertTrue(mkv.video_tracks[0].width == 854) - self.assertTrue(mkv.video_tracks[0].height == 480) - self.assertTrue(mkv.video_tracks[0].interlaced == False) - self.assertTrue(mkv.video_tracks[0].stereo_mode is None) - self.assertTrue(mkv.video_tracks[0].crop == {}) - self.assertTrue(mkv.video_tracks[0].display_width is None) - self.assertTrue(mkv.video_tracks[0].display_height is None) - self.assertTrue(mkv.video_tracks[0].display_unit is None) - self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None) - # audio track - self.assertTrue(len(mkv.audio_tracks) == 1) - self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK) - self.assertTrue(mkv.audio_tracks[0].number == 2) - self.assertTrue(mkv.audio_tracks[0].name is None) - self.assertTrue(mkv.audio_tracks[0].language == 'und') - self.assertTrue(mkv.audio_tracks[0].enabled == True) - self.assertTrue(mkv.audio_tracks[0].default == False) - self.assertTrue(mkv.audio_tracks[0].forced == False) - self.assertTrue(mkv.audio_tracks[0].lacing == True) - self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_MPEG/L3') - self.assertTrue(mkv.audio_tracks[0].codec_name is None) - self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0) - self.assertTrue(mkv.audio_tracks[0].channels == 2) - self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None) - self.assertTrue(mkv.audio_tracks[0].bit_depth is None) - # subtitle track - self.assertTrue(len(mkv.subtitle_tracks) == 0) - # chapters - self.assertTrue(len(mkv.chapters) == 0) - # tags - self.assertTrue(len(mkv.tags) == 1) - self.assertTrue(len(mkv.tags[0].simpletags) == 3) - self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE') - self.assertTrue(mkv.tags[0].simpletags[0].default == True) - self.assertTrue(mkv.tags[0].simpletags[0].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 6') - self.assertTrue(mkv.tags[0].simpletags[0].binary is None) - self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED') - self.assertTrue(mkv.tags[0].simpletags[1].default == True) - self.assertTrue(mkv.tags[0].simpletags[1].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[1].string == '2010') - self.assertTrue(mkv.tags[0].simpletags[1].binary is None) - self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT') - self.assertTrue(mkv.tags[0].simpletags[2].default == True) - self.assertTrue(mkv.tags[0].simpletags[2].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 6, random length to code the size of Clusters and Blocks, no Cues for seeking') - self.assertTrue(mkv.tags[0].simpletags[2].binary is None) - - def test_test7(self): - stream = io.open(os.path.join(TEST_DIR, 'test7.mkv'), 'rb') - mkv = MKV(stream) - # info - self.assertTrue(mkv.info.title is None) - self.assertTrue(mkv.info.duration == timedelta(seconds=37, milliseconds=43)) - self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 17, 0, 23)) - self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.10.1 + libmatroska2 v0.10.1') - self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 r from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.0.0 (\'The Stars were mine\') built on Jun 6 2010 16:18:42') - # video track - self.assertTrue(len(mkv.video_tracks) == 1) - self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK) - self.assertTrue(mkv.video_tracks[0].number == 1) - self.assertTrue(mkv.video_tracks[0].name is None) - self.assertTrue(mkv.video_tracks[0].language == 'und') - self.assertTrue(mkv.video_tracks[0].enabled == True) - self.assertTrue(mkv.video_tracks[0].default == False) - self.assertTrue(mkv.video_tracks[0].forced == False) - self.assertTrue(mkv.video_tracks[0].lacing == False) - self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC') - self.assertTrue(mkv.video_tracks[0].codec_name is None) - self.assertTrue(mkv.video_tracks[0].width == 1024) - self.assertTrue(mkv.video_tracks[0].height == 576) - self.assertTrue(mkv.video_tracks[0].interlaced == False) - self.assertTrue(mkv.video_tracks[0].stereo_mode is None) - self.assertTrue(mkv.video_tracks[0].crop == {}) - self.assertTrue(mkv.video_tracks[0].display_width is None) - self.assertTrue(mkv.video_tracks[0].display_height is None) - self.assertTrue(mkv.video_tracks[0].display_unit is None) - self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None) - # audio track - self.assertTrue(len(mkv.audio_tracks) == 1) - self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK) - self.assertTrue(mkv.audio_tracks[0].number == 2) - self.assertTrue(mkv.audio_tracks[0].name is None) - self.assertTrue(mkv.audio_tracks[0].language == 'und') - self.assertTrue(mkv.audio_tracks[0].enabled == True) - self.assertTrue(mkv.audio_tracks[0].default == False) - self.assertTrue(mkv.audio_tracks[0].forced == False) - self.assertTrue(mkv.audio_tracks[0].lacing == True) - self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_AAC') - self.assertTrue(mkv.audio_tracks[0].codec_name is None) - self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0) - self.assertTrue(mkv.audio_tracks[0].channels == 2) - self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None) - self.assertTrue(mkv.audio_tracks[0].bit_depth is None) - # subtitle track - self.assertTrue(len(mkv.subtitle_tracks) == 0) - # chapters - self.assertTrue(len(mkv.chapters) == 0) - # tags - self.assertTrue(len(mkv.tags) == 1) - self.assertTrue(len(mkv.tags[0].simpletags) == 3) - self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE') - self.assertTrue(mkv.tags[0].simpletags[0].default == True) - self.assertTrue(mkv.tags[0].simpletags[0].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 7') - self.assertTrue(mkv.tags[0].simpletags[0].binary is None) - self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED') - self.assertTrue(mkv.tags[0].simpletags[1].default == True) - self.assertTrue(mkv.tags[0].simpletags[1].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[1].string == '2010') - self.assertTrue(mkv.tags[0].simpletags[1].binary is None) - self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT') - self.assertTrue(mkv.tags[0].simpletags[2].default == True) - self.assertTrue(mkv.tags[0].simpletags[2].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 7, junk elements are present at the beggining or end of clusters, the parser should skip it. There is also a damaged element at 451418') - self.assertTrue(mkv.tags[0].simpletags[2].binary is None) - - def test_test8(self): - stream = io.open(os.path.join(TEST_DIR, 'test8.mkv'), 'rb') - mkv = MKV(stream) - # info - self.assertTrue(mkv.info.title is None) - self.assertTrue(mkv.info.duration == timedelta(seconds=47, milliseconds=341)) - self.assertTrue(mkv.info.date_utc == datetime(2010, 8, 21, 17, 22, 14)) - self.assertTrue(mkv.info.muxing_app == 'libebml2 v0.10.1 + libmatroska2 v0.10.1') - self.assertTrue(mkv.info.writing_app == 'mkclean 0.5.5 r from libebml v1.0.0 + libmatroska v1.0.0 + mkvmerge v4.0.0 (\'The Stars were mine\') built on Jun 6 2010 16:18:42') - # video track - self.assertTrue(len(mkv.video_tracks) == 1) - self.assertTrue(mkv.video_tracks[0].type == VIDEO_TRACK) - self.assertTrue(mkv.video_tracks[0].number == 1) - self.assertTrue(mkv.video_tracks[0].name is None) - self.assertTrue(mkv.video_tracks[0].language == 'und') - self.assertTrue(mkv.video_tracks[0].enabled == True) - self.assertTrue(mkv.video_tracks[0].default == False) - self.assertTrue(mkv.video_tracks[0].forced == False) - self.assertTrue(mkv.video_tracks[0].lacing == False) - self.assertTrue(mkv.video_tracks[0].codec_id == 'V_MPEG4/ISO/AVC') - self.assertTrue(mkv.video_tracks[0].codec_name is None) - self.assertTrue(mkv.video_tracks[0].width == 1024) - self.assertTrue(mkv.video_tracks[0].height == 576) - self.assertTrue(mkv.video_tracks[0].interlaced == False) - self.assertTrue(mkv.video_tracks[0].stereo_mode is None) - self.assertTrue(mkv.video_tracks[0].crop == {}) - self.assertTrue(mkv.video_tracks[0].display_width is None) - self.assertTrue(mkv.video_tracks[0].display_height is None) - self.assertTrue(mkv.video_tracks[0].display_unit is None) - self.assertTrue(mkv.video_tracks[0].aspect_ratio_type is None) - # audio track - self.assertTrue(len(mkv.audio_tracks) == 1) - self.assertTrue(mkv.audio_tracks[0].type == AUDIO_TRACK) - self.assertTrue(mkv.audio_tracks[0].number == 2) - self.assertTrue(mkv.audio_tracks[0].name is None) - self.assertTrue(mkv.audio_tracks[0].language == 'und') - self.assertTrue(mkv.audio_tracks[0].enabled == True) - self.assertTrue(mkv.audio_tracks[0].default == False) - self.assertTrue(mkv.audio_tracks[0].forced == False) - self.assertTrue(mkv.audio_tracks[0].lacing == True) - self.assertTrue(mkv.audio_tracks[0].codec_id == 'A_AAC') - self.assertTrue(mkv.audio_tracks[0].codec_name is None) - self.assertTrue(mkv.audio_tracks[0].sampling_frequency == 48000.0) - self.assertTrue(mkv.audio_tracks[0].channels == 2) - self.assertTrue(mkv.audio_tracks[0].output_sampling_frequency is None) - self.assertTrue(mkv.audio_tracks[0].bit_depth is None) - # subtitle track - self.assertTrue(len(mkv.subtitle_tracks) == 0) - # chapters - self.assertTrue(len(mkv.chapters) == 0) - # tags - self.assertTrue(len(mkv.tags) == 1) - self.assertTrue(len(mkv.tags[0].simpletags) == 3) - self.assertTrue(mkv.tags[0].simpletags[0].name == 'TITLE') - self.assertTrue(mkv.tags[0].simpletags[0].default == True) - self.assertTrue(mkv.tags[0].simpletags[0].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[0].string == 'Big Buck Bunny - test 8') - self.assertTrue(mkv.tags[0].simpletags[0].binary is None) - self.assertTrue(mkv.tags[0].simpletags[1].name == 'DATE_RELEASED') - self.assertTrue(mkv.tags[0].simpletags[1].default == True) - self.assertTrue(mkv.tags[0].simpletags[1].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[1].string == '2010') - self.assertTrue(mkv.tags[0].simpletags[1].binary is None) - self.assertTrue(mkv.tags[0].simpletags[2].name == 'COMMENT') - self.assertTrue(mkv.tags[0].simpletags[2].default == True) - self.assertTrue(mkv.tags[0].simpletags[2].language == 'und') - self.assertTrue(mkv.tags[0].simpletags[2].string == 'Matroska Validation File 8, audio missing between timecodes 6.019s and 6.360s') - self.assertTrue(mkv.tags[0].simpletags[2].binary is None) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.TestLoader().loadTestsFromTestCase(MKVTestCase)) - return suite - -if __name__ == '__main__': - unittest.TextTestRunner().run(suite()) diff --git a/libs/enzyme/tests/test_parsers.py b/libs/enzyme/tests/test_parsers.py deleted file mode 100644 index 0fa320ce0..000000000 --- a/libs/enzyme/tests/test_parsers.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -from enzyme.parsers import ebml -import io -import os.path -import requests -import unittest -import yaml -import zipfile - - -# Test directory -TEST_DIR = os.path.join(os.path.dirname(__file__), os.path.splitext(__file__)[0]) - -# EBML validation directory -EBML_VALIDATION_DIR = os.path.join(os.path.dirname(__file__), 'parsers', 'ebml') - - -def setUpModule(): - if not os.path.exists(TEST_DIR): - r = requests.get('http://downloads.sourceforge.net/project/matroska/test_files/matroska_test_w1_1.zip') - with zipfile.ZipFile(io.BytesIO(r.content), 'r') as f: - f.extractall(TEST_DIR) - - -class EBMLTestCase(unittest.TestCase): - def setUp(self): - self.stream = io.open(os.path.join(TEST_DIR, 'test1.mkv'), 'rb') - with io.open(os.path.join(EBML_VALIDATION_DIR, 'test1.mkv.yml'), 'r') as yml: - self.validation = yaml.safe_load(yml) - self.specs = ebml.get_matroska_specs() - - def tearDown(self): - self.stream.close() - - def check_element(self, element_id, element_type, element_name, element_level, element_position, element_size, element_data, element, - ignore_element_types=None, ignore_element_names=None, max_level=None): - """Recursively check an element""" - # base - self.assertTrue(element.id == element_id) - self.assertTrue(element.type == element_type) - self.assertTrue(element.name == element_name) - self.assertTrue(element.level == element_level) - self.assertTrue(element.position == element_position) - self.assertTrue(element.size == element_size) - # Element - if not isinstance(element_data, list): - self.assertTrue(type(element) == ebml.Element) - if element_type != ebml.BINARY: - self.assertTrue(element.data == element_data) - return - # MasterElement - if ignore_element_types is not None: # filter validation on element types - element_data = [e for e in element_data if e[1] not in ignore_element_types] - if ignore_element_names is not None: # filter validation on element names - element_data = [e for e in element_data if e[2] not in ignore_element_names] - if element.level == max_level: # special check when maximum level is reached - self.assertTrue(element.data is None) - return - self.assertTrue(len(element.data) == len(element_data)) - for i in range(len(element.data)): - self.check_element(element_data[i][0], element_data[i][1], element_data[i][2], element_data[i][3], - element_data[i][4], element_data[i][5], element_data[i][6], element.data[i], ignore_element_types, - ignore_element_names, max_level) - - def test_parse_full(self): - result = ebml.parse(self.stream, self.specs) - self.assertTrue(len(result) == len(self.validation)) - for i in range(len(self.validation)): - self.check_element(self.validation[i][0], self.validation[i][1], self.validation[i][2], self.validation[i][3], - self.validation[i][4], self.validation[i][5], self.validation[i][6], result[i]) - - def test_parse_ignore_element_types(self): - ignore_element_types = [ebml.INTEGER, ebml.BINARY] - result = ebml.parse(self.stream, self.specs, ignore_element_types=ignore_element_types) - self.validation = [e for e in self.validation if e[1] not in ignore_element_types] - self.assertTrue(len(result) == len(self.validation)) - for i in range(len(self.validation)): - self.check_element(self.validation[i][0], self.validation[i][1], self.validation[i][2], self.validation[i][3], - self.validation[i][4], self.validation[i][5], self.validation[i][6], result[i], ignore_element_types=ignore_element_types) - - def test_parse_ignore_element_names(self): - ignore_element_names = ['EBML', 'SimpleBlock'] - result = ebml.parse(self.stream, self.specs, ignore_element_names=ignore_element_names) - self.validation = [e for e in self.validation if e[2] not in ignore_element_names] - self.assertTrue(len(result) == len(self.validation)) - for i in range(len(self.validation)): - self.check_element(self.validation[i][0], self.validation[i][1], self.validation[i][2], self.validation[i][3], - self.validation[i][4], self.validation[i][5], self.validation[i][6], result[i], ignore_element_names=ignore_element_names) - - def test_parse_max_level(self): - max_level = 3 - result = ebml.parse(self.stream, self.specs, max_level=max_level) - self.validation = [e for e in self.validation if e[3] <= max_level] - self.assertTrue(len(result) == len(self.validation)) - for i in range(len(self.validation)): - self.check_element(self.validation[i][0], self.validation[i][1], self.validation[i][2], self.validation[i][3], - self.validation[i][4], self.validation[i][5], self.validation[i][6], result[i], max_level=max_level) - - -def generate_yml(filename, specs): - """Generate a validation file for the test video""" - def _to_builtin(elements): - """Recursively convert elements to built-in types""" - result = [] - for e in elements: - if isinstance(e, ebml.MasterElement): - result.append((e.id, e.type, e.name, e.level, e.position, e.size, _to_builtin(e.data))) - else: - result.append((e.id, e.type, e.name, e.level, e.position, e.size, None if isinstance(e.data, io.BytesIO) else e.data)) - return result - video = io.open(os.path.join(TEST_DIR, filename), 'rb') - yml = io.open(os.path.join(EBML_VALIDATION_DIR, filename + '.yml'), 'w') - yaml.safe_dump(_to_builtin(ebml.parse(video, specs)), yml) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.TestLoader().loadTestsFromTestCase(EBMLTestCase)) - return suite - -if __name__ == '__main__': - unittest.TextTestRunner().run(suite()) diff --git a/libs/fcache-0.5.2.dist-info/METADATA b/libs/fcache-0.5.2.dist-info/METADATA index 9bb847fad..eb081d3ff 100644 --- a/libs/fcache-0.5.2.dist-info/METADATA +++ b/libs/fcache-0.5.2.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: fcache Version: 0.5.2 Summary: a dictionary-like, file-based cache module for Python diff --git a/libs/fcache-0.5.2.dist-info/RECORD b/libs/fcache-0.5.2.dist-info/RECORD index f8a9f193c..a9ea25c8d 100644 --- a/libs/fcache-0.5.2.dist-info/RECORD +++ b/libs/fcache-0.5.2.dist-info/RECORD @@ -1,8 +1,8 @@ fcache-0.5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -fcache-0.5.2.dist-info/METADATA,sha256=AeNVGA3snoxzxr5OF1C624C1xnd19egyaZ0-P4uwPsg,2840 +fcache-0.5.2.dist-info/METADATA,sha256=4uw9_Kh21oj4TsAnmtokJwjAXI3M5uTlqbmoLqx7BtQ,2840 fcache-0.5.2.dist-info/RECORD,, fcache-0.5.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -fcache-0.5.2.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 +fcache-0.5.2.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 fcache-0.5.2.dist-info/licenses/AUTHORS.rst,sha256=z5OBAQvrU1cODlriE7s3MA3AK1JRqcz_c5lxaagXIec,398 fcache-0.5.2.dist-info/licenses/LICENSE.txt,sha256=UK1ituPhetE5O947l7Iz53IihKh1ZtmBBjUbCCas8-Y,1056 fcache/__init__.py,sha256=isJrmDBLRag7Zc2UK9ZovWGOv7ji1Oh-zJtJMNJFkXw,22 diff --git a/libs/fcache-0.5.2.dist-info/WHEEL b/libs/fcache-0.5.2.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/fcache-0.5.2.dist-info/WHEEL +++ b/libs/fcache-0.5.2.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/fese-0.3.0.dist-info/RECORD b/libs/fese-0.3.0.dist-info/RECORD index 55deffc5a..29825b430 100644 --- a/libs/fese-0.3.0.dist-info/RECORD +++ b/libs/fese-0.3.0.dist-info/RECORD @@ -3,7 +3,7 @@ fese-0.3.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY, fese-0.3.0.dist-info/METADATA,sha256=Y6rn3cPjHc2ySJrSnUAuXxahgSFs2YoAivSIgJqi40M,655 fese-0.3.0.dist-info/RECORD,, fese-0.3.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -fese-0.3.0.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91 +fese-0.3.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 fese-0.3.0.dist-info/top_level.txt,sha256=ra2BuARVEUZpk76YpHnjVoqjR2FxvzhCdmW2OyBWGzE,5 fese/__init__.py,sha256=_YUpx7sq26ioEp5LZOEKa-0MrRHQUuRuDCs0EQ6Amv4,150 fese/container.py,sha256=zhUNLut9Tdy_oPa6gCophUekTQegGWbHdbd1prR5aHg,10443 diff --git a/libs/fese-0.3.0.dist-info/WHEEL b/libs/fese-0.3.0.dist-info/WHEEL index 5bea5450d..da25d7b42 100644 --- a/libs/fese-0.3.0.dist-info/WHEEL +++ b/libs/fese-0.3.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (70.3.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/enzyme-0.4.1.dist-info/INSTALLER b/libs/ffsubsync-0.4.26.dist-info/INSTALLER similarity index 100% rename from libs/enzyme-0.4.1.dist-info/INSTALLER rename to libs/ffsubsync-0.4.26.dist-info/INSTALLER diff --git a/libs/ffsubsync-0.4.25.dist-info/LICENSE b/libs/ffsubsync-0.4.26.dist-info/LICENSE similarity index 100% rename from libs/ffsubsync-0.4.25.dist-info/LICENSE rename to libs/ffsubsync-0.4.26.dist-info/LICENSE diff --git a/libs/ffsubsync-0.4.25.dist-info/METADATA b/libs/ffsubsync-0.4.26.dist-info/METADATA similarity index 99% rename from libs/ffsubsync-0.4.25.dist-info/METADATA rename to libs/ffsubsync-0.4.26.dist-info/METADATA index 7bf28f7d2..6a14ad2c8 100644 --- a/libs/ffsubsync-0.4.25.dist-info/METADATA +++ b/libs/ffsubsync-0.4.26.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: ffsubsync -Version: 0.4.25 +Version: 0.4.26 Summary: Language-agnostic synchronization of subtitles with video. Home-page: https://github.com/smacke/ffsubsync Author: Stephen Macke @@ -16,6 +16,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 :: 3.12 Classifier: Topic :: Multimedia :: Sound/Audio :: Analysis Classifier: Topic :: Multimedia :: Sound/Audio :: Speech Description-Content-Type: text/markdown diff --git a/libs/ffsubsync-0.4.25.dist-info/RECORD b/libs/ffsubsync-0.4.26.dist-info/RECORD similarity index 59% rename from libs/ffsubsync-0.4.25.dist-info/RECORD rename to libs/ffsubsync-0.4.26.dist-info/RECORD index dcaa007b6..2609b3f5a 100644 --- a/libs/ffsubsync-0.4.25.dist-info/RECORD +++ b/libs/ffsubsync-0.4.26.dist-info/RECORD @@ -1,26 +1,26 @@ ../../bin/ffs,sha256=DxvuHhnq32-Y1GV_I7TgwLKfOdmvGmt3YEor11O66T0,231 ../../bin/ffsubsync,sha256=DxvuHhnq32-Y1GV_I7TgwLKfOdmvGmt3YEor11O66T0,231 ../../bin/subsync,sha256=DxvuHhnq32-Y1GV_I7TgwLKfOdmvGmt3YEor11O66T0,231 -ffsubsync-0.4.25.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -ffsubsync-0.4.25.dist-info/LICENSE,sha256=DojZETNKKMCxh_kvQYZwyPFvuoM9pkllyQDqVdT9Ja4,1053 -ffsubsync-0.4.25.dist-info/METADATA,sha256=7JGrV9X4BxuRX8Dc0yv5-dADVPD5S4I6iUl9wvYOSe4,10075 -ffsubsync-0.4.25.dist-info/RECORD,, -ffsubsync-0.4.25.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -ffsubsync-0.4.25.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110 -ffsubsync-0.4.25.dist-info/entry_points.txt,sha256=x5tYAy_9mGKvB6HtyypAE7bMClVIVPxcxcTozISatsg,91 -ffsubsync-0.4.25.dist-info/top_level.txt,sha256=rD4Pc_QfEQZsZ-i6QXAdnbhVWanzT9edNbD7htPRjWs,10 +ffsubsync-0.4.26.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +ffsubsync-0.4.26.dist-info/LICENSE,sha256=DojZETNKKMCxh_kvQYZwyPFvuoM9pkllyQDqVdT9Ja4,1053 +ffsubsync-0.4.26.dist-info/METADATA,sha256=bbhDMkNjRqLOWJlYrsWCEc4SkJY7ApsJgIBG5wtI6c0,10126 +ffsubsync-0.4.26.dist-info/RECORD,, +ffsubsync-0.4.26.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ffsubsync-0.4.26.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110 +ffsubsync-0.4.26.dist-info/entry_points.txt,sha256=x5tYAy_9mGKvB6HtyypAE7bMClVIVPxcxcTozISatsg,91 +ffsubsync-0.4.26.dist-info/top_level.txt,sha256=rD4Pc_QfEQZsZ-i6QXAdnbhVWanzT9edNbD7htPRjWs,10 ffsubsync/__init__.py,sha256=ZvmoQa78CTLOAugFvZ2Ui4CpqSIbvcAEbDSNUjLNwt0,601 -ffsubsync/_version.py,sha256=ZAcDEXOak9gtRiRqLXOW4cVz0fwpCab6U3HJ8EZgqHA,498 +ffsubsync/_version.py,sha256=DegFaqHChjouMMImtFhJMNrc55PoFbJNI-P5xU4R58U,498 ffsubsync/aligners.py,sha256=uaWmoCax0t8C6njy9paPkhgG4luPk8VIDm97WrZMzWU,5738 ffsubsync/constants.py,sha256=SYqge3UW2ZQsGk_bi_wgg010SJCBhu6akR9R9fatv_0,1324 -ffsubsync/ffmpeg_utils.py,sha256=oI-wmdyfrpctrJBTIeR8zdMQ7XGuz1PzodG0xy1InO0,2934 -ffsubsync/ffsubsync.py,sha256=x8WCR5Yp0qauUfYEBAMFEQDCIr0icg-hOT25tX2mXcw,26116 +ffsubsync/ffmpeg_utils.py,sha256=QeWpxoZ4Lm1IyLptl-pc1DZjn2zgLocZ0wyie86Popc,3161 +ffsubsync/ffsubsync.py,sha256=8b0bj4z25AdPIglVtoshWwPI90RV9F3H_YYcFgo9hng,26017 ffsubsync/ffsubsync_gui.py,sha256=0cC9shk5q6KShAMzpo9ERbh2xVTyJNY7T4IOPqrE5p8,3617 ffsubsync/file_utils.py,sha256=B5iTlmTuolE2JwhbFkJY8KqPvtwtHPNrAKsADtPgAQM,893 ffsubsync/generic_subtitles.py,sha256=5w27NE6PP1i6EihWG70VdMIP0EmK_dYXd3dCwtpkFBs,6204 ffsubsync/golden_section_search.py,sha256=hJjjORLTzN01Yaz2H95_3RFHxmPoJGAg3yPSdg_7IKI,1831 ffsubsync/sklearn_shim.py,sha256=KcnfAfCUMUDEWYiDooTZrAvWZSYsrRZhBZZn787NrrU,14569 -ffsubsync/speech_transformers.py,sha256=K6VV05ImzdkmKsWknjXEXoVuaCV-GDKa5nCCvS7alWU,19207 +ffsubsync/speech_transformers.py,sha256=msv1V5DIbkF3NSli2as0pJuSZQMgg1t2aWk867IS-pg,19267 ffsubsync/subtitle_parser.py,sha256=Fttx6Qg_jpA33mbcRoYCp1RxpxEMPGfPWMx_HEPCN2c,6476 ffsubsync/subtitle_transformers.py,sha256=qxD-FDRLDHUdXBXtr25Y8eXVLlV_XPv8tt5UQUMekGE,4547 ffsubsync/version.py,sha256=GCDvVUjTaRo3LJ6PsWPopYN5eY6rjRFl3MdlxeH2nsI,1232 diff --git a/libs/enzyme-0.4.1.dist-info/REQUESTED b/libs/ffsubsync-0.4.26.dist-info/REQUESTED similarity index 100% rename from libs/enzyme-0.4.1.dist-info/REQUESTED rename to libs/ffsubsync-0.4.26.dist-info/REQUESTED diff --git a/libs/ffsubsync-0.4.25.dist-info/WHEEL b/libs/ffsubsync-0.4.26.dist-info/WHEEL similarity index 70% rename from libs/ffsubsync-0.4.25.dist-info/WHEEL rename to libs/ffsubsync-0.4.26.dist-info/WHEEL index 0b18a2811..f771c29b8 100644 --- a/libs/ffsubsync-0.4.25.dist-info/WHEEL +++ b/libs/ffsubsync-0.4.26.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) +Generator: bdist_wheel (0.40.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/libs/ffsubsync-0.4.25.dist-info/entry_points.txt b/libs/ffsubsync-0.4.26.dist-info/entry_points.txt similarity index 100% rename from libs/ffsubsync-0.4.25.dist-info/entry_points.txt rename to libs/ffsubsync-0.4.26.dist-info/entry_points.txt diff --git a/libs/ffsubsync-0.4.25.dist-info/top_level.txt b/libs/ffsubsync-0.4.26.dist-info/top_level.txt similarity index 100% rename from libs/ffsubsync-0.4.25.dist-info/top_level.txt rename to libs/ffsubsync-0.4.26.dist-info/top_level.txt diff --git a/libs/ffsubsync/_version.py b/libs/ffsubsync/_version.py index a39e32836..e854c2ba1 100644 --- a/libs/ffsubsync/_version.py +++ b/libs/ffsubsync/_version.py @@ -1,5 +1,5 @@ -# This file was generated by 'versioneer.py' (0.18) from +# This file was generated by 'versioneer.py' (0.22) from # revision-control system data, or from the parent directory name of an # unpacked source archive. Distribution tarballs contain a pre-generated copy # of this file. @@ -8,11 +8,11 @@ version_json = ''' { - "date": "2023-04-20T11:25:58+0100", + "date": "2024-10-15T19:36:49-0700", "dirty": false, "error": null, - "full-revisionid": "0953aa240101a7aa235438496f796ef5f8d69d5b", - "version": "0.4.25" + "full-revisionid": "bafd232a38769951c14c05669a69b2e8c150e1ae", + "version": "0.4.26" } ''' # END VERSION_JSON diff --git a/libs/ffsubsync/ffmpeg_utils.py b/libs/ffsubsync/ffmpeg_utils.py index 7f5733404..d8bf47459 100644 --- a/libs/ffsubsync/ffmpeg_utils.py +++ b/libs/ffsubsync/ffmpeg_utils.py @@ -70,6 +70,10 @@ def ffmpeg_bin_path(bin_name, gui_mode, ffmpeg_resources_path=None): if platform.system() == "Windows": bin_name = "{}.exe".format(bin_name) if ffmpeg_resources_path is not None: + if not os.path.isdir(ffmpeg_resources_path): + if bin_name.lower().startswith("ffmpeg"): + return ffmpeg_resources_path + ffmpeg_resources_path = os.path.dirname(ffmpeg_resources_path) return os.path.join(ffmpeg_resources_path, bin_name) try: resource_path = os.environ[SUBSYNC_RESOURCES_ENV_MAGIC] diff --git a/libs/ffsubsync/ffsubsync.py b/libs/ffsubsync/ffsubsync.py index 9a808a29b..b0114cc89 100644 --- a/libs/ffsubsync/ffsubsync.py +++ b/libs/ffsubsync/ffsubsync.py @@ -11,11 +11,7 @@ import numpy as np -from ffsubsync.aligners import ( - FFTAligner, - MaxScoreAligner, - FailedToFindAlignmentException, -) +from ffsubsync.aligners import FFTAligner, MaxScoreAligner from ffsubsync.constants import ( DEFAULT_APPLY_OFFSET_SECONDS, DEFAULT_FRAME_RATE, @@ -128,16 +124,16 @@ def get_framerate_ratios_to_try(args: argparse.Namespace) -> List[Optional[float def try_sync( args: argparse.Namespace, reference_pipe: Optional[Pipeline], result: Dict[str, Any] ) -> bool: + result["sync_was_successful"] = False sync_was_successful = True - exc = None - try: - logger.info( - "extracting speech segments from %s...", - "stdin" if not args.srtin else "subtitles file(s) {}".format(args.srtin), - ) - if not args.srtin: - args.srtin = [None] - for srtin in args.srtin: + logger.info( + "extracting speech segments from %s...", + "stdin" if not args.srtin else "subtitles file(s) {}".format(args.srtin), + ) + if not args.srtin: + args.srtin = [None] + for srtin in args.srtin: + try: skip_sync = args.skip_sync or reference_pipe is None skip_infer_framerate_ratio = ( args.skip_infer_framerate_ratio or reference_pipe is None @@ -182,6 +178,8 @@ def try_sync( reference_pipe.transform(args.reference), srt_pipes, ) + if best_score < 0: + sync_was_successful = False logger.info("...done") offset_seconds = ( offset_samples / float(SAMPLE_RATE) + args.apply_offset_seconds @@ -211,20 +209,14 @@ def try_sync( offset_seconds, args.suppress_output_if_offset_less_than, ) - except FailedToFindAlignmentException as e: - sync_was_successful = False - logger.error(str(e)) - except Exception as e: - exc = e - sync_was_successful = False - else: - result["offset_seconds"] = offset_seconds - result["framerate_scale_factor"] = scale_step.scale_factor - finally: - if exc is not None: - raise exc - result["sync_was_successful"] = sync_was_successful - return sync_was_successful + except Exception: + sync_was_successful = False + logger.exception("failed to sync %s", srtin) + else: + result["offset_seconds"] = offset_seconds + result["framerate_scale_factor"] = scale_step.scale_factor + result["sync_was_successful"] = sync_was_successful + return sync_was_successful def make_reference_pipe(args: argparse.Namespace) -> Pipeline: diff --git a/libs/ffsubsync/speech_transformers.py b/libs/ffsubsync/speech_transformers.py index 72ca23e30..38883d14b 100644 --- a/libs/ffsubsync/speech_transformers.py +++ b/libs/ffsubsync/speech_transformers.py @@ -367,6 +367,8 @@ def fit(self, fname: str, *_) -> "VideoSpeechTransformer": "1", "-acodec", "pcm_s16le", + "-af", + "aresample=async=1", "-ar", str(self.frame_rate), "-", diff --git a/libs/ffsubsync-0.4.25.dist-info/INSTALLER b/libs/flask-3.0.3.dist-info/INSTALLER similarity index 100% rename from libs/ffsubsync-0.4.25.dist-info/INSTALLER rename to libs/flask-3.0.3.dist-info/INSTALLER diff --git a/libs/flask-3.0.2.dist-info/LICENSE.rst b/libs/flask-3.0.3.dist-info/LICENSE.txt similarity index 100% rename from libs/flask-3.0.2.dist-info/LICENSE.rst rename to libs/flask-3.0.3.dist-info/LICENSE.txt diff --git a/libs/flask-3.0.2.dist-info/METADATA b/libs/flask-3.0.3.dist-info/METADATA similarity index 53% rename from libs/flask-3.0.2.dist-info/METADATA rename to libs/flask-3.0.3.dist-info/METADATA index 71551b9ba..5a0210724 100644 --- a/libs/flask-3.0.2.dist-info/METADATA +++ b/libs/flask-3.0.3.dist-info/METADATA @@ -1,10 +1,10 @@ Metadata-Version: 2.1 Name: Flask -Version: 3.0.2 +Version: 3.0.3 Summary: A simple framework for building complex web applications. Maintainer-email: Pallets Requires-Python: >=3.8 -Description-Content-Type: text/x-rst +Description-Content-Type: text/markdown Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Framework :: Flask @@ -16,6 +16,7 @@ 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 +Classifier: Typing :: Typed Requires-Dist: Werkzeug>=3.0.0 Requires-Dist: Jinja2>=3.1.2 Requires-Dist: itsdangerous>=2.1.2 @@ -28,18 +29,16 @@ 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/ +Project-URL: Source, https://github.com/pallets/flask/ Provides-Extra: async Provides-Extra: dotenv -Flask -===== +# Flask -Flask is a lightweight `WSGI`_ web application framework. It is designed +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 +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 @@ -47,70 +46,56 @@ 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/ +[WSGI]: https://wsgi.readthedocs.io/ +[Werkzeug]: https://werkzeug.palletsprojects.com/ +[Jinja]: https://jinja.palletsprojects.com/ -Installing ----------- +## Installing -Install and update using `pip`_: +Install and update from [PyPI][] using an installer such as [pip][]: -.. code-block:: text +``` +$ pip install -U Flask +``` - $ pip install -U Flask +[PyPI]: https://pypi.org/project/Flask/ +[pip]: https://pip.pypa.io/en/stable/getting-started/ -.. _pip: https://pip.pypa.io/en/stable/getting-started/ +## A Simple Example -A Simple Example ----------------- +```python +# save this as app.py +from flask import Flask -.. code-block:: python +app = Flask(__name__) - # save this as app.py - from flask import Flask +@app.route("/") +def hello(): + return "Hello, World!" +``` - app = Flask(__name__) +``` +$ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` - @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 ------------- +## Contributing For guidance on setting up a development environment and how to make a -contribution to Flask, see the `contributing guidelines`_. +contribution to Flask, see the [contributing guidelines][]. -.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst +[contributing guidelines]: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst -Donate ------- +## 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 ------ +allow the maintainers to devote more time to the projects, [please +donate today][]. -- 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 +[please donate today]: https://palletsprojects.com/donate diff --git a/libs/flask-3.0.2.dist-info/RECORD b/libs/flask-3.0.3.dist-info/RECORD similarity index 59% rename from libs/flask-3.0.2.dist-info/RECORD rename to libs/flask-3.0.3.dist-info/RECORD index 4091f230c..a3c5345b8 100644 --- a/libs/flask-3.0.2.dist-info/RECORD +++ b/libs/flask-3.0.3.dist-info/RECORD @@ -1,31 +1,31 @@ ../../bin/flask,sha256=mkfqP1bdu7Q1Kux98Y6YmUcCGO8FyMAkRMD3_v5My8s,231 -flask-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -flask-3.0.2.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -flask-3.0.2.dist-info/METADATA,sha256=5SsBudAoun3E_3ZSRXJLB2V3NAdALovsQMKUvzqcJfM,3588 -flask-3.0.2.dist-info/RECORD,, -flask-3.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask-3.0.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -flask-3.0.2.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 +flask-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +flask-3.0.3.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +flask-3.0.3.dist-info/METADATA,sha256=exPahy4aahjV-mYqd9qb5HNP8haB_IxTuaotoSvCtag,3177 +flask-3.0.3.dist-info/RECORD,, +flask-3.0.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask-3.0.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask-3.0.3.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 -flask/app.py,sha256=TQfhvSlv1QpaPHeeRz_Ke7JmiSFMMHT-rJR4tqsEHdc,59706 -flask/blueprints.py,sha256=H7u4HzNn--riGMTt5GkxUHpYRzCav-WDGSKNnBSEMcU,3160 -flask/cli.py,sha256=eegT_64cSOqaKOwI_Am3XwaCSJPZ9UEJ6EmSL0qg8xg,35833 -flask/config.py,sha256=QiL9KkQT8RWc0HU2AE26Yw5mdOkNsKv8TEFEbXkqhJk,13328 +flask/app.py,sha256=7-lh6cIj27riTE1Q18Ok1p5nOZ8qYiMux4Btc6o6mNc,60143 +flask/blueprints.py,sha256=7INXPwTkUxfOQXOOv1yu52NpHPmPGI5fMTMFZ-BG9yY,4430 +flask/cli.py,sha256=OOaf_Efqih1i2in58j-5ZZZmQnPpaSfiUFbEjlL9bzw,35825 +flask/config.py,sha256=bLzLVAj-cq-Xotu9erqOFte0xSFaVXyfz0AkP4GbwmY,13312 flask/ctx.py,sha256=4atDhJJ_cpV1VMq4qsfU4E_61M1oN93jlS2H9gjrl58,15120 flask/debughelpers.py,sha256=PGIDhStW_efRjpaa3zHIpo-htStJOR41Ip3OJWPYBwo,6080 flask/globals.py,sha256=XdQZmStBmPIs8t93tjx6pO7Bm3gobAaONWkFcUHaGas,1713 flask/helpers.py,sha256=tYrcQ_73GuSZVEgwFr-eMmV69UriFQDBmt8wZJIAqvg,23084 flask/json/__init__.py,sha256=hLNR898paqoefdeAhraa5wyJy-bmRB2k2dV4EgVy2Z8,5602 flask/json/provider.py,sha256=q6iB83lSiopy80DZPrU-9mGcWwrD0mvLjiv9fHrRZgc,7646 -flask/json/tag.py,sha256=aXslvQyO4QpxviWJqxhyOj0CCQKlYXq1r0H9DKqiEY8,9280 +flask/json/tag.py,sha256=DhaNwuIOhdt2R74oOC9Y4Z8ZprxFYiRb5dUP5byyINw,9281 flask/logging.py,sha256=8sM3WMTubi1cBb2c_lPkWpN0J8dMAqrgKRYLLi1dCVI,2377 flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 flask/sansio/README.md,sha256=-0X1tECnilmz1cogx-YhNw5d7guK7GKrq_DEV2OzlU0,228 -flask/sansio/app.py,sha256=ZF0Yy610NKSpdJ1d6qtG4L2RkCmzngu0G9FFXZf4O_M,38209 +flask/sansio/app.py,sha256=YG5Gf7JVf1c0yccWDZ86q5VSfJUidOVp27HFxFNxC7U,38053 flask/sansio/blueprints.py,sha256=Tqe-7EkZ-tbWchm8iDoCfD848f0_3nLv6NNjeIPvHwM,24637 -flask/sansio/scaffold.py,sha256=9SSSC6A_zzXhcEVYf9wkrKx2r4uDqfIWsnRNYSvDclU,30879 -flask/sessions.py,sha256=bIpZRwiTfnYJn3ikVnCPcF2kNtyRz0dfpsuMADIpSJc,14518 +flask/sansio/scaffold.py,sha256=WLV9TRQMMhGlXz-1OKtQ3lv6mtIBQZxdW2HezYrGxoI,30633 +flask/sessions.py,sha256=RU4lzm9MQW9CtH8rVLRTDm8USMJyT4LbvYe7sxM2__k,14807 flask/signals.py,sha256=V7lMUww7CqgJ2ThUBn1PiatZtQanOyt7OZpu2GZI-34,750 flask/templating.py,sha256=2TcXLT85Asflm2W9WOSFxKCmYn5e49w_Jkg9-NaaJWo,7537 flask/testing.py,sha256=3BFXb3bP7R5r-XLBuobhczbxDu8-1LWRzYuhbr-lwaE,10163 diff --git a/libs/ffsubsync-0.4.25.dist-info/REQUESTED b/libs/flask-3.0.3.dist-info/REQUESTED similarity index 100% rename from libs/ffsubsync-0.4.25.dist-info/REQUESTED rename to libs/flask-3.0.3.dist-info/REQUESTED diff --git a/libs/flask-3.0.2.dist-info/WHEEL b/libs/flask-3.0.3.dist-info/WHEEL similarity index 100% rename from libs/flask-3.0.2.dist-info/WHEEL rename to libs/flask-3.0.3.dist-info/WHEEL diff --git a/libs/flask-3.0.2.dist-info/entry_points.txt b/libs/flask-3.0.3.dist-info/entry_points.txt similarity index 100% rename from libs/flask-3.0.2.dist-info/entry_points.txt rename to libs/flask-3.0.3.dist-info/entry_points.txt diff --git a/libs/flask/app.py b/libs/flask/app.py index 12ac50d49..7622b5e83 100644 --- a/libs/flask/app.py +++ b/libs/flask/app.py @@ -241,6 +241,16 @@ def __init__( 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 = cli.AppGroup() + + # 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 + # 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. diff --git a/libs/flask/blueprints.py b/libs/flask/blueprints.py index 52859b855..aa9eacf21 100644 --- a/libs/flask/blueprints.py +++ b/libs/flask/blueprints.py @@ -4,16 +4,54 @@ import typing as t from datetime import timedelta +from .cli import AppGroup 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 +from .sansio.scaffold import _sentinel if t.TYPE_CHECKING: # pragma: no cover from .wrappers import Response class Blueprint(SansioBlueprint): + def __init__( + self, + name: str, + import_name: str, + static_folder: str | os.PathLike[str] | None = None, + static_url_path: str | None = None, + template_folder: str | os.PathLike[str] | None = None, + url_prefix: str | None = None, + subdomain: str | None = None, + url_defaults: dict[str, t.Any] | None = None, + root_path: str | None = None, + cli_group: str | None = _sentinel, # type: ignore + ) -> None: + super().__init__( + name, + import_name, + static_folder, + static_url_path, + template_folder, + url_prefix, + subdomain, + url_defaults, + root_path, + cli_group, + ) + + #: 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() + + # 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 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. diff --git a/libs/flask/cli.py b/libs/flask/cli.py index d4df2802b..ecb292a01 100644 --- a/libs/flask/cli.py +++ b/libs/flask/cli.py @@ -229,15 +229,13 @@ def prepare_import(path: str) -> str: @t.overload def locate_app( module_name: str, app_name: str | None, raise_if_not_found: t.Literal[True] = True -) -> Flask: - ... +) -> Flask: ... @t.overload def locate_app( module_name: str, app_name: str | None, raise_if_not_found: t.Literal[False] = ... -) -> Flask | None: - ... +) -> Flask | None: ... def locate_app( diff --git a/libs/flask/config.py b/libs/flask/config.py index f2f414780..7e3ba1790 100644 --- a/libs/flask/config.py +++ b/libs/flask/config.py @@ -27,12 +27,10 @@ def __init__( self.get_converter = get_converter @t.overload - def __get__(self, obj: None, owner: None) -> te.Self: - ... + def __get__(self, obj: None, owner: None) -> te.Self: ... @t.overload - def __get__(self, obj: App, owner: type[App]) -> T: - ... + def __get__(self, obj: App, owner: type[App]) -> T: ... def __get__(self, obj: App | None, owner: type[App] | None = None) -> T | te.Self: if obj is None: diff --git a/libs/flask/json/tag.py b/libs/flask/json/tag.py index 2bb986bc8..8dc3629bf 100644 --- a/libs/flask/json/tag.py +++ b/libs/flask/json/tag.py @@ -40,6 +40,7 @@ def to_python(self, value): app.session_interface.serializer.register(TagOrderedDict, index=0) """ + from __future__ import annotations import typing as t diff --git a/libs/flask/sansio/app.py b/libs/flask/sansio/app.py index 21a79ba46..01fd5dbfa 100644 --- a/libs/flask/sansio/app.py +++ b/libs/flask/sansio/app.py @@ -410,10 +410,6 @@ def __init__( # 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( diff --git a/libs/flask/sansio/scaffold.py b/libs/flask/sansio/scaffold.py index 535570089..69e33a095 100644 --- a/libs/flask/sansio/scaffold.py +++ b/libs/flask/sansio/scaffold.py @@ -8,7 +8,6 @@ from collections import defaultdict from functools import update_wrapper -import click from jinja2 import BaseLoader from jinja2 import FileSystemLoader from werkzeug.exceptions import default_exceptions @@ -16,10 +15,12 @@ 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 +if t.TYPE_CHECKING: # pragma: no cover + from click import Group + # a singleton sentinel value for parameter defaults _sentinel = object() @@ -66,6 +67,7 @@ class Scaffold: .. versionadded:: 2.0 """ + cli: Group name: str _static_folder: str | None = None _static_url_path: str | None = None @@ -97,12 +99,6 @@ def __init__( #: 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: click.Group = AppGroup() - #: A dictionary mapping endpoint names to view functions. #: #: To register a view function, use the :meth:`route` decorator. diff --git a/libs/flask/sessions.py b/libs/flask/sessions.py index bb753eb81..ee19ad638 100644 --- a/libs/flask/sessions.py +++ b/libs/flask/sessions.py @@ -277,6 +277,14 @@ def save_session( session_json_serializer = TaggedJSONSerializer() +def _lazy_sha1(string: bytes = b"") -> t.Any: + """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include + SHA-1, in which case the import and use as a default would fail before the + developer can configure something else. + """ + return hashlib.sha1(string) + + class SecureCookieSessionInterface(SessionInterface): """The default session interface that stores sessions in signed cookies through the :mod:`itsdangerous` module. @@ -286,7 +294,7 @@ class SecureCookieSessionInterface(SessionInterface): #: 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) + digest_method = staticmethod(_lazy_sha1) #: the name of the itsdangerous supported key derivation. The default #: is hmac. key_derivation = "hmac" diff --git a/libs/flask_cors/core.py b/libs/flask_cors/core.py index 5358036c2..3fcc4d346 100644 --- a/libs/flask_cors/core.py +++ b/libs/flask_cors/core.py @@ -36,7 +36,7 @@ 'CORS_MAX_AGE', 'CORS_SEND_WILDCARD', 'CORS_AUTOMATIC_OPTIONS', 'CORS_VARY_HEADER', 'CORS_RESOURCES', 'CORS_INTERCEPT_EXCEPTIONS', - 'CORS_ALWAYS_SEND'] + 'CORS_ALWAYS_SEND', 'CORS_ALLOW_PRIVATE_NETWORK'] # Attribute added to request object by decorator to indicate that CORS # was evaluated, in case the decorator and extension are both applied # to a view. @@ -56,7 +56,8 @@ vary_header=True, resources=r'/*', intercept_exceptions=True, - always_send=True) + always_send=True, + allow_private_network=False) def parse_resources(resources): @@ -186,7 +187,8 @@ def get_cors_headers(options, request_headers, request_method): if ACL_REQUEST_HEADER_PRIVATE_NETWORK in request_headers \ and request_headers.get(ACL_REQUEST_HEADER_PRIVATE_NETWORK) == 'true': - headers[ACL_RESPONSE_PRIVATE_NETWORK] = 'true' + allow_private_network = 'true' if options.get('allow_private_network') else 'false' + headers[ACL_RESPONSE_PRIVATE_NETWORK] = allow_private_network # This is a preflight request # http://www.w3.org/TR/cors/#resource-preflight-requests diff --git a/libs/flask_cors/extension.py b/libs/flask_cors/extension.py index c00cbfff9..abf5cafe9 100644 --- a/libs/flask_cors/extension.py +++ b/libs/flask_cors/extension.py @@ -70,9 +70,11 @@ class CORS(object): The origin(s) may be regular expressions, case-sensitive strings, or else an asterisk. - :note: origins must include the schema and the port (if not port 80), - e.g., - `CORS(app, origins=["http://localhost:8000", "https://example.com"])`. + .. note:: + + origins must include the schema and the port (if not port 80), + e.g., + `CORS(app, origins=["http://localhost:8000", "https://example.com"])`. Default : '*' :type origins: list, string or regex @@ -136,6 +138,22 @@ class CORS(object): Default : True :type vary_header: bool + + :param allow_private_network: + If True, the response header `Access-Control-Allow-Private-Network` + will be set with the value 'true' whenever the request header + `Access-Control-Request-Private-Network` has a value 'true'. + + If False, the reponse header `Access-Control-Allow-Private-Network` + will be set with the value 'false' whenever the request header + `Access-Control-Request-Private-Network` has a value of 'true'. + + If the request header `Access-Control-Request-Private-Network` is + not present or has a value other than 'true', the response header + `Access-Control-Allow-Private-Network` will not be set. + + Default : True + :type allow_private_network: bool """ def __init__(self, app=None, **kwargs): @@ -191,7 +209,7 @@ def cors_after_request(resp): normalized_path = unquote_plus(request.path) for res_regex, res_options in resources: if try_match(normalized_path, res_regex): - LOG.debug("Request to '%s' matches CORS resource '%s'. Using options: %s", + LOG.debug("Request to '%r' matches CORS resource '%s'. Using options: %s", request.path, get_regexp_pattern(res_regex), res_options) set_cors_headers(resp, res_options) break diff --git a/libs/flask_cors/version.py b/libs/flask_cors/version.py index d6497a814..a0f66580c 100644 --- a/libs/flask_cors/version.py +++ b/libs/flask_cors/version.py @@ -1 +1 @@ -__version__ = '4.0.0' +__version__ = '5.0.0' diff --git a/libs/flask_migrate/__init__.py b/libs/flask_migrate/__init__.py index c61b7f5eb..197f17bda 100644 --- a/libs/flask_migrate/__init__.py +++ b/libs/flask_migrate/__init__.py @@ -3,7 +3,7 @@ import logging import os import sys -from flask import current_app +from flask import current_app, g from alembic import __version__ as __alembic_version__ from alembic.config import Config as AlembicConfig from alembic import command @@ -92,15 +92,15 @@ def get_config(self, directory=None, x_arg=None, opts=None): for opt in opts or []: setattr(config.cmd_opts, opt, True) if not hasattr(config.cmd_opts, 'x'): + setattr(config.cmd_opts, 'x', []) + for x in getattr(g, 'x_arg', []): + config.cmd_opts.x.append(x) if x_arg is not None: - setattr(config.cmd_opts, 'x', []) if isinstance(x_arg, list) or isinstance(x_arg, tuple): for x in x_arg: config.cmd_opts.x.append(x) else: config.cmd_opts.x.append(x_arg) - else: - setattr(config.cmd_opts, 'x', None) return self.call_configure_callbacks(config) @@ -252,11 +252,11 @@ def current(directory=None, verbose=False): @catch_errors -def stamp(directory=None, revision='head', sql=False, tag=None): +def stamp(directory=None, revision='head', sql=False, tag=None, purge=False): """'stamp' the revision table with the given revision; don't run any migrations""" config = current_app.extensions['migrate'].migrate.get_config(directory) - command.stamp(config, revision, sql=sql, tag=tag) + command.stamp(config, revision, sql=sql, tag=tag, purge=purge) @catch_errors diff --git a/libs/flask_migrate/cli.py b/libs/flask_migrate/cli.py index 176672c58..73a31ba6d 100644 --- a/libs/flask_migrate/cli.py +++ b/libs/flask_migrate/cli.py @@ -1,4 +1,5 @@ import click +from flask import g from flask.cli import with_appcontext from flask_migrate import list_templates as _list_templates from flask_migrate import init as _init @@ -18,9 +19,12 @@ @click.group() -def db(): +@click.option('-x', '--x-arg', multiple=True, + help='Additional arguments consumed by custom env.py scripts') +@with_appcontext +def db(x_arg): """Perform database migrations.""" - pass + g.x_arg = x_arg # these will be picked up by Migrate.get_config() @db.command() @@ -234,12 +238,15 @@ def current(directory, verbose): @click.option('--tag', default=None, help=('Arbitrary "tag" name - can be used by custom env.py ' 'scripts')) +@click.option('--purge', is_flag=True, + help=('Delete the version in the alembic_version table before ' + 'stamping')) @click.argument('revision', default='head') @with_appcontext -def stamp(directory, sql, tag, revision): +def stamp(directory, sql, tag, revision, purge): """'stamp' the revision table with the given revision; don't run any migrations""" - _stamp(directory, revision, sql, tag) + _stamp(directory, revision, sql, tag, purge) @db.command() diff --git a/libs/flask_socketio/__init__.py b/libs/flask_socketio/__init__.py index c065ae372..e651da4b0 100644 --- a/libs/flask_socketio/__init__.py +++ b/libs/flask_socketio/__init__.py @@ -279,7 +279,18 @@ def handle_my_custom_event(json): def decorator(handler): @wraps(handler) def _handler(sid, *args): - return self._handle_event(handler, message, namespace, sid, + nonlocal namespace + real_ns = namespace + if namespace == '*': + real_ns = sid + sid = args[0] + args = args[1:] + real_msg = message + if message == '*': + real_msg = sid + sid = args[0] + args = [real_msg] + list(args[1:]) + return self._handle_event(handler, message, real_ns, sid, *args) if self.server: diff --git a/libs/flask_socketio/namespace.py b/libs/flask_socketio/namespace.py index 43833a9bd..8c447f5fc 100644 --- a/libs/flask_socketio/namespace.py +++ b/libs/flask_socketio/namespace.py @@ -17,7 +17,7 @@ def trigger_event(self, event, *args): method can be overridden if special dispatching rules are needed, or if having a single method that catches all events is desired. """ - handler_name = 'on_' + event + handler_name = 'on_' + (event or '') if not hasattr(self, handler_name): # there is no handler for this event, so we ignore it return diff --git a/libs/ftfy-6.1.3.dist-info/RECORD b/libs/ftfy-6.1.3.dist-info/RECORD deleted file mode 100644 index c241f118e..000000000 --- a/libs/ftfy-6.1.3.dist-info/RECORD +++ /dev/null @@ -1,20 +0,0 @@ -../../bin/ftfy,sha256=RiqPO-DVZ0PjvYA-L6_heE5XGXpqCUH_cuFkg3x_Nro,230 -CHANGELOG.md,sha256=N3lqel77VL-IYoCBaaV5wPeKTqjFB5ij4VN1o1LVnYw,21931 -README.md,sha256=tq7rGBdhuzaySgb__1FESwOKJjO_xQEa0CYT9gr3mgM,5559 -ftfy-6.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -ftfy-6.1.3.dist-info/LICENSE.txt,sha256=oL_FAgvC4eggVRoGJccMlfqomMFec3EA_0iAqhAZeFc,552 -ftfy-6.1.3.dist-info/METADATA,sha256=WGR7WPYS2N1u6a4oO3SJnAo6Bj6IWnsDes7LrLtK_h0,6227 -ftfy-6.1.3.dist-info/RECORD,, -ftfy-6.1.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -ftfy-6.1.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 -ftfy-6.1.3.dist-info/entry_points.txt,sha256=N8flv0M3Cdg0X56vlUPd7R_CdvTG76C8pKhrDS9Ysug,38 -ftfy/__init__.py,sha256=XuwZPFzyvp4DfkBK5iAUQvWzHBgT09mCWj1xEBq_4Lw,29222 -ftfy/bad_codecs/__init__.py,sha256=kNDJXrT7ZZgk5WZG4zIWgkinI27UTXLrubOGfrFk3dc,3234 -ftfy/bad_codecs/sloppy.py,sha256=1YkVYn8x99FxNDBAZlojlzDV7wprZgtmJzPdpsMQ23s,6761 -ftfy/bad_codecs/utf8_variants.py,sha256=Tspd3prlZKQAFoW_PcE7sDK5pMsTcJSUuO0IBOCBvxs,9590 -ftfy/badness.py,sha256=Pa7pqan89Ixk__OWlEpQgtxzpZZiQKnpyVdNSOVfj6A,14494 -ftfy/chardata.py,sha256=HQV9r3IZCIbuO5-Eqb8HOFSWnNmMg__jH67P339cjUM,11900 -ftfy/cli.py,sha256=9rddOrxYcsjjyGfc3p79hPKdfa9xqnIY__c7vz97t7M,4146 -ftfy/fixes.py,sha256=sM4gGHB33B9rDuF6cCVo-ezjX6Hdgzg9z99B56QniTM,17755 -ftfy/formatting.py,sha256=MpF6Y-hEjf1BvtcI5mZjodeSu7iAA-b3af49V_0EmI8,5808 -ftfy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/flask-3.0.2.dist-info/INSTALLER b/libs/ftfy-6.2.3.dist-info/INSTALLER similarity index 100% rename from libs/flask-3.0.2.dist-info/INSTALLER rename to libs/ftfy-6.2.3.dist-info/INSTALLER diff --git a/libs/ftfy-6.1.3.dist-info/LICENSE.txt b/libs/ftfy-6.2.3.dist-info/LICENSE.txt similarity index 100% rename from libs/ftfy-6.1.3.dist-info/LICENSE.txt rename to libs/ftfy-6.2.3.dist-info/LICENSE.txt diff --git a/libs/ftfy-6.2.3.dist-info/METADATA b/libs/ftfy-6.2.3.dist-info/METADATA new file mode 100644 index 000000000..013f2c36c --- /dev/null +++ b/libs/ftfy-6.2.3.dist-info/METADATA @@ -0,0 +1,165 @@ +Metadata-Version: 2.1 +Name: ftfy +Version: 6.2.3 +Summary: Fixes mojibake and other problems with Unicode, after the fact +Home-page: https://ftfy.readthedocs.io/en/latest/ +License: Apache-2.0 +Author: Robyn Speer +Author-email: rspeer@arborelia.net +Requires-Python: >=3.8.1,<4 +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Requires-Dist: wcwidth (>=0.2.12,<0.3.0) +Project-URL: Changelog, https://github.com/rspeer/python-ftfy/blob/main/CHANGELOG.md +Project-URL: Cohost, https://cohost.org/arborelia +Project-URL: Documentation, https://ftfy.readthedocs.io/en/latest/ +Project-URL: Issues, https://github.com/rspeer/python-ftfy/issues/ +Project-URL: Repository, https://github.com/rspeer/python-ftfy +Description-Content-Type: text/markdown + +# ftfy: fixes text for you + +[![PyPI package](https://badge.fury.io/py/ftfy.svg)](https://badge.fury.io/py/ftfy) +[![Docs](https://readthedocs.org/projects/ftfy/badge/?version=latest)](https://ftfy.readthedocs.org/en/latest/) + +```python + +>>> from ftfy import fix_encoding +>>> print(fix_encoding("(ง'⌣')ง")) +(ง'⌣')ง + +``` + +The full documentation of ftfy is available at [ftfy.readthedocs.org](https://ftfy.readthedocs.org). The documentation covers a lot more than this README, so here are +some links into it: + +- [Fixing problems and getting explanations](https://ftfy.readthedocs.io/en/latest/explain.html) +- [Configuring ftfy](https://ftfy.readthedocs.io/en/latest/config.html) +- [Encodings ftfy can handle](https://ftfy.readthedocs.io/en/latest/encodings.html) +- [“Fixer” functions](https://ftfy.readthedocs.io/en/latest/fixes.html) +- [Is ftfy an encoding detector?](https://ftfy.readthedocs.io/en/latest/detect.html) +- [Heuristics for detecting mojibake](https://ftfy.readthedocs.io/en/latest/heuristic.html) +- [Support for “bad” encodings](https://ftfy.readthedocs.io/en/latest/bad_encodings.html) +- [Command-line usage](https://ftfy.readthedocs.io/en/latest/cli.html) +- [Citing ftfy](https://ftfy.readthedocs.io/en/latest/cite.html) + +## Testimonials + +- “My life is livable again!” + — [@planarrowspace](https://twitter.com/planarrowspace) +- “A handy piece of magic” + — [@simonw](https://twitter.com/simonw) +- “Saved me a large amount of frustrating dev work” + — [@iancal](https://twitter.com/iancal) +- “ftfy did the right thing right away, with no faffing about. Excellent work, solving a very tricky real-world (whole-world!) problem.” + — Brennan Young +- “I have no idea when I’m gonna need this, but I’m definitely bookmarking it.” + — [/u/ocrow](https://reddit.com/u/ocrow) +- “9.2/10” + — [pylint](https://bitbucket.org/logilab/pylint/) + +## What it does + +Here are some examples (found in the real world) of what ftfy can do: + +ftfy can fix mojibake (encoding mix-ups), by detecting patterns of characters that were clearly meant to be UTF-8 but were decoded as something else: + + >>> import ftfy + >>> ftfy.fix_text('✔ No problems') + '✔ No problems' + +Does this sound impossible? It's really not. UTF-8 is a well-designed encoding that makes it obvious when it's being misused, and a string of mojibake usually contains all the information we need to recover the original string. + +ftfy can fix multiple layers of mojibake simultaneously: + + >>> ftfy.fix_text('The Mona Lisa doesn’t have eyebrows.') + "The Mona Lisa doesn't have eyebrows." + +It can fix mojibake that has had "curly quotes" applied on top of it, which cannot be consistently decoded until the quotes are uncurled: + + >>> ftfy.fix_text("l’humanité") + "l'humanité" + +ftfy can fix mojibake that would have included the character U+A0 (non-breaking space), but the U+A0 was turned into an ASCII space and then combined with another following space: + + >>> ftfy.fix_text('Ã\xa0 perturber la réflexion') + 'à perturber la réflexion' + >>> ftfy.fix_text('à perturber la réflexion') + 'à perturber la réflexion' + +ftfy can also decode HTML entities that appear outside of HTML, even in cases where the entity has been incorrectly capitalized: + + >>> # by the HTML 5 standard, only 'PÉREZ' is acceptable + >>> ftfy.fix_text('P&EACUTE;REZ') + 'PÉREZ' + +These fixes are not applied in all cases, because ftfy has a strongly-held goal of avoiding false positives -- it should never change correctly-decoded text to something else. + +The following text could be encoded in Windows-1252 and decoded in UTF-8, and it would decode as 'MARQUɅ'. However, the original text is already sensible, so it is unchanged. + + >>> ftfy.fix_text('IL Y MARQUÉ…') + 'IL Y MARQUÉ…' + +## Installing + +ftfy is a Python 3 package that can be installed using `pip`: + + pip install ftfy + +(Or use `pip3 install ftfy` on systems where Python 2 and 3 are both globally installed and `pip` refers to Python 2.) + +If you use `poetry`, you can use ftfy as a dependency in the usual way (such as `poetry add ftfy`). + +### Local development + +ftfy is developed using `poetry`. Its `setup.py` is vestigial and is not the recommended way to install it. + +[Install Poetry](https://python-poetry.org/docs/master/#installing-with-the-official-installer), check out this repository, and run `poetry install` to install ftfy for local development, such as experimenting with the heuristic or running tests. + +## Who maintains ftfy? + +I'm Robyn Speer, also known as Elia Robyn Lake. You can find me +[on GitHub](https://github.com/rspeer) or [Cohost](https://cohost.org/arborelia). + +## Citing ftfy + +ftfy has been used as a crucial data processing step in major NLP research. + +It's important to give credit appropriately to everyone whose work you build on in research. This includes software, not just high-status contributions such as mathematical models. All I ask when you use ftfy for research is that you cite it. + +ftfy has a citable record [on Zenodo](https://zenodo.org/record/2591652). +A citation of ftfy may look like this: + + Robyn Speer. (2019). ftfy (Version 5.5). Zenodo. + http://doi.org/10.5281/zenodo.2591652 + +In BibTeX format, the citation is:: + + @misc{speer-2019-ftfy, + author = {Robyn Speer}, + title = {ftfy}, + note = {Version 5.5}, + year = 2019, + howpublished = {Zenodo}, + doi = {10.5281/zenodo.2591652}, + url = {https://doi.org/10.5281/zenodo.2591652} + } + +## Important license clarifications + +If you do not follow ftfy's license, you do not have a license to ftfy. + +This sounds obvious and tautological, but there are people who think open source licenses mean that they can just do what they want, especially in the field of generative AI. It's a permissive license but you still have to follow it. The [Apache license](https://www.apache.org/licenses/LICENSE-2.0) is the only thing that gives you permission to use and copy ftfy; otherwise, all rights are reserved. + +If you use or distribute ftfy, you must follow the terms of the [Apache license](https://www.apache.org/licenses/LICENSE-2.0), including that you must attribute the author of ftfy (Robyn Speer) correctly. + +You _may not_ make a derived work of ftfy that obscures its authorship, such as by putting its code in an AI training dataset, including the code in AI training at runtime, or using a generative AI that copies code from such a dataset. + +At my discretion, I may notify you of a license violation, and give you a chance to either remedy it or delete all copies of ftfy in your possession. + + diff --git a/libs/ftfy-6.2.3.dist-info/RECORD b/libs/ftfy-6.2.3.dist-info/RECORD new file mode 100644 index 000000000..991af898c --- /dev/null +++ b/libs/ftfy-6.2.3.dist-info/RECORD @@ -0,0 +1,18 @@ +../../bin/ftfy,sha256=RiqPO-DVZ0PjvYA-L6_heE5XGXpqCUH_cuFkg3x_Nro,230 +ftfy-6.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +ftfy-6.2.3.dist-info/LICENSE.txt,sha256=oL_FAgvC4eggVRoGJccMlfqomMFec3EA_0iAqhAZeFc,552 +ftfy-6.2.3.dist-info/METADATA,sha256=hAdQ7jdqJ5bO9CmRbjnu6eNI3NvjYnHD70TgvMlSzBg,7821 +ftfy-6.2.3.dist-info/RECORD,, +ftfy-6.2.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ftfy-6.2.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 +ftfy-6.2.3.dist-info/entry_points.txt,sha256=N8flv0M3Cdg0X56vlUPd7R_CdvTG76C8pKhrDS9Ysug,38 +ftfy/__init__.py,sha256=aQ1aDlnMRmAXh73MQ6N5zaQyjRuiTiTpHqn_5dp1pbU,29669 +ftfy/bad_codecs/__init__.py,sha256=leOXAQMXM0FCRi-Q2SujbgHv3WqaWAmpUCCSLYBACUg,3288 +ftfy/bad_codecs/sloppy.py,sha256=kLlM9uqoC2xQYDQf9CJfentPGRzE__bkWQ_zzd3Fkgs,6905 +ftfy/bad_codecs/utf8_variants.py,sha256=ZWQXXiZCw40qg6MFSTLRtcJpiPpGZYMrxhkFz9-hLX4,10015 +ftfy/badness.py,sha256=r0t9crAjTizKzuTij8yD3_8keOGp9MySAYNgEMzbdaE,14353 +ftfy/chardata.py,sha256=-Dp2VDodc2FN95fYvZflv8fBSpjgzMDHSeqH5TFfj-4,12028 +ftfy/cli.py,sha256=CqRTXQt7PfaEb0AGQLYNXNq-TZSOW-xNbIXhUgELLEg,4186 +ftfy/fixes.py,sha256=t7FM-Vn8N3WRcud_tK9GSu4PZkagSvNWzwufcl2JQI4,18239 +ftfy/formatting.py,sha256=pbmBunYydgPs3bxMhCXFtaTM0_3qT_yp6esZvjvOKZk,5882 +ftfy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/flask-3.0.2.dist-info/REQUESTED b/libs/ftfy-6.2.3.dist-info/REQUESTED similarity index 100% rename from libs/flask-3.0.2.dist-info/REQUESTED rename to libs/ftfy-6.2.3.dist-info/REQUESTED diff --git a/libs/ftfy-6.1.3.dist-info/WHEEL b/libs/ftfy-6.2.3.dist-info/WHEEL similarity index 67% rename from libs/ftfy-6.1.3.dist-info/WHEEL rename to libs/ftfy-6.2.3.dist-info/WHEEL index d73ccaae8..8b9b3a1bf 100644 --- a/libs/ftfy-6.1.3.dist-info/WHEEL +++ b/libs/ftfy-6.2.3.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 +Generator: poetry-core 1.9.1 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/ftfy-6.1.3.dist-info/entry_points.txt b/libs/ftfy-6.2.3.dist-info/entry_points.txt similarity index 100% rename from libs/ftfy-6.1.3.dist-info/entry_points.txt rename to libs/ftfy-6.2.3.dist-info/entry_points.txt diff --git a/libs/ftfy/__init__.py b/libs/ftfy/__init__.py index 95564d733..6b97b5859 100644 --- a/libs/ftfy/__init__.py +++ b/libs/ftfy/__init__.py @@ -4,30 +4,32 @@ This is a module for making text less broken. See the `fix_text` function for more information. """ + from __future__ import annotations + import unicodedata import warnings from typing import ( Any, BinaryIO, + Callable, Dict, Iterator, List, + Literal, NamedTuple, Optional, TextIO, Tuple, Union, cast, - no_type_check, ) -from ftfy import bad_codecs -from ftfy import chardata, fixes +from ftfy import bad_codecs, chardata, fixes from ftfy.badness import is_bad from ftfy.formatting import display_ljust -__version__ = "6.1.2" +__version__ = "6.2.3" # Though this function does nothing, it lets linters know that we're using @@ -75,7 +77,7 @@ class ExplainedText(NamedTuple): # Functions that can be applied using `apply_plan`. -FIXERS = { +FIXERS: Dict[str, Callable] = { # type: ignore[type-arg] "unescape_html": fixes.unescape_html, "remove_terminal_escapes": fixes.remove_terminal_escapes, "restore_byte_a0": fixes.restore_byte_a0, @@ -211,6 +213,7 @@ class TextFixerConfig(NamedTuple): Functions that accept TextFixerConfig and don't return an explanation will automatically set `explain` to False. """ + unescape_html: Union[str, bool] = "auto" remove_terminal_escapes: bool = True fix_encoding: bool = True @@ -224,7 +227,7 @@ class TextFixerConfig(NamedTuple): fix_line_breaks: bool = True fix_surrogates: bool = True remove_control_chars: bool = True - normalization: Optional[str] = "NFC" + normalization: Optional[Literal["NFC", "NFD", "NFKC", "NFKD"]] = "NFC" max_decode_length: int = 1000000 explain: bool = True @@ -238,7 +241,9 @@ def _config_from_kwargs( """ if "fix_entities" in kwargs: warnings.warn( - "`fix_entities` has been renamed to `unescape_html`", DeprecationWarning + "`fix_entities` has been renamed to `unescape_html`", + DeprecationWarning, + stacklevel=2, ) kwargs = kwargs.copy() kwargs["unescape_html"] = kwargs["fix_entities"] @@ -287,7 +292,7 @@ def _try_fix( return text -def fix_text(text: str, config: Optional[TextFixerConfig] = None, **kwargs) -> str: +def fix_text(text: str, config: Optional[TextFixerConfig] = None, **kwargs: Any) -> str: r""" Given Unicode text as input, fix inconsistencies and glitches in it, such as mojibake (text that was decoded in the wrong encoding). @@ -362,7 +367,7 @@ def fix_text(text: str, config: Optional[TextFixerConfig] = None, **kwargs) -> s def fix_and_explain( - text: str, config: Optional[TextFixerConfig] = None, **kwargs + text: str, config: Optional[TextFixerConfig] = None, **kwargs: Any ) -> ExplainedText: """ Fix text as a single segment, returning the fixed text and an explanation @@ -422,7 +427,7 @@ def fix_and_explain( def fix_encoding_and_explain( - text: str, config: Optional[TextFixerConfig] = None, **kwargs + text: str, config: Optional[TextFixerConfig] = None, **kwargs: Any ) -> ExplainedText: """ Apply the steps of ftfy that detect mojibake and fix it. Returns the fixed @@ -503,8 +508,13 @@ def _fix_encoding_one_step_and_explain( decoding = "utf-8" # Check encoded_bytes for sequences that would be UTF-8, # except they have b' ' where b'\xa0' would belong. - if config.restore_byte_a0 and chardata.ALTERED_UTF8_RE.search( - encoded_bytes + # + # Don't do this in the macroman encoding, where it would match + # an en dash followed by a space, leading to false positives. + if ( + config.restore_byte_a0 + and encoding != "macroman" + and chardata.ALTERED_UTF8_RE.search(encoded_bytes) ): replaced_bytes = fixes.restore_byte_a0(encoded_bytes) if replaced_bytes != encoded_bytes: @@ -578,7 +588,9 @@ def _fix_encoding_one_step_and_explain( return ExplainedText(text, []) -def fix_encoding(text: str, config: Optional[TextFixerConfig] = None, **kwargs): +def fix_encoding( + text: str, config: Optional[TextFixerConfig] = None, **kwargs: Any +) -> str: """ Apply just the encoding-fixing steps of ftfy to this text. Returns the fixed text, discarding the explanation. @@ -599,7 +611,9 @@ def fix_encoding(text: str, config: Optional[TextFixerConfig] = None, **kwargs): ftfy = fix_text -def fix_text_segment(text: str, config: Optional[TextFixerConfig] = None, **kwargs): +def fix_text_segment( + text: str, config: Optional[TextFixerConfig] = None, **kwargs: Any +) -> str: """ Fix text as a single segment, with a consistent sequence of steps that are applied to fix the text. Discard the explanation. @@ -615,7 +629,7 @@ def fix_file( input_file: TextIO | BinaryIO, encoding: Optional[str] = None, config: Optional[TextFixerConfig] = None, - **kwargs, + **kwargs: Any, ) -> Iterator[str]: """ Fix text that is found in a file. @@ -715,8 +729,7 @@ def guess_bytes(bstring: bytes) -> Tuple[str, str]: return bstring.decode("sloppy-windows-1252"), "sloppy-windows-1252" -@no_type_check -def apply_plan(text: str, plan: List[Tuple[str, str]]): +def apply_plan(text: str, plan: List[Tuple[str, str]]) -> str: """ Apply a plan for fixing the encoding of text. @@ -743,9 +756,9 @@ def apply_plan(text: str, plan: List[Tuple[str, str]]): obj = text for operation, encoding in plan: if operation == "encode": - obj = obj.encode(encoding) + obj = obj.encode(encoding) # type: ignore elif operation == "decode": - obj = obj.decode(encoding) + obj = obj.decode(encoding) # type: ignore elif operation in ("transcode", "apply"): if encoding in FIXERS: obj = FIXERS[encoding](obj) @@ -757,7 +770,7 @@ def apply_plan(text: str, plan: List[Tuple[str, str]]): return obj -def explain_unicode(text: str): +def explain_unicode(text: str) -> None: """ A utility method that's useful for debugging mysterious Unicode. diff --git a/libs/ftfy/bad_codecs/__init__.py b/libs/ftfy/bad_codecs/__init__.py index b1433a3a6..bb71136ab 100644 --- a/libs/ftfy/bad_codecs/__init__.py +++ b/libs/ftfy/bad_codecs/__init__.py @@ -29,9 +29,10 @@ >>> print(b'\xed\xa0\xbd\xed\xb8\x8d'.decode('utf-8-variants')) 😍 """ -from encodings import normalize_encoding + import codecs -from typing import Dict +from encodings import normalize_encoding +from typing import Dict, Optional _CACHE: Dict[str, codecs.CodecInfo] = {} @@ -51,7 +52,7 @@ ) -def search_function(encoding): +def search_function(encoding: str) -> Optional[codecs.CodecInfo]: """ Register our "bad codecs" with Python's codecs API. This involves adding a search function that takes in an encoding name, and returns a codec @@ -85,7 +86,7 @@ def search_function(encoding): return codec -def ok(): +def ok() -> None: """ A feel-good function that gives you something to call after importing this package. diff --git a/libs/ftfy/bad_codecs/sloppy.py b/libs/ftfy/bad_codecs/sloppy.py index bf051ff8d..6f63b1e8d 100644 --- a/libs/ftfy/bad_codecs/sloppy.py +++ b/libs/ftfy/bad_codecs/sloppy.py @@ -71,16 +71,17 @@ U+0081 \x81 [Cc] U+201A ‚ [Ps] SINGLE LOW-9 QUOTATION MARK """ + from __future__ import annotations + import codecs from encodings import normalize_encoding -import sys +from typing import Optional, Tuple REPLACEMENT_CHAR = "\ufffd" -PY26 = sys.version_info[:2] == (2, 6) -def make_sloppy_codec(encoding): +def make_sloppy_codec(encoding: str) -> codecs.CodecInfo: """ Take a codec name, and return a 'sloppy' version of that codec that can encode and decode the unassigned bytes in that encoding. @@ -98,10 +99,7 @@ def make_sloppy_codec(encoding): # Get a list of what they decode to in the given encoding. Use the # replacement character for unassigned bytes. - if PY26: - decoded_chars = all_bytes.decode(encoding, "replace") - else: - decoded_chars = all_bytes.decode(encoding, errors="replace") + decoded_chars = all_bytes.decode(encoding, errors="replace") # Update the sloppy_chars list. Each byte that was successfully decoded # gets its decoded value in the list. The unassigned bytes are left as @@ -123,19 +121,23 @@ def make_sloppy_codec(encoding): # `encodings.cp1252` for comparison; this is almost exactly the same, # except I made it follow pep8. class Codec(codecs.Codec): - def encode(self, input, errors="strict"): + def encode( + self, input: str, errors: Optional[str] = "strict" + ) -> Tuple[bytes, int]: return codecs.charmap_encode(input, errors, encoding_table) - def decode(self, input, errors="strict"): - return codecs.charmap_decode(input, errors, decoding_table) # type: ignore + def decode( + self, input: bytes, errors: Optional[str] = "strict" + ) -> Tuple[str, int]: + return codecs.charmap_decode(input, errors, decoding_table) # type: ignore[arg-type] class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): + def encode(self, input: str, final: bool = False) -> bytes: return codecs.charmap_encode(input, self.errors, encoding_table)[0] class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input, self.errors, decoding_table)[0] # type: ignore + def decode(self, input: bytes, final: bool = False) -> str: # type: ignore[override] + return codecs.charmap_decode(input, self.errors, decoding_table)[0] # type: ignore[arg-type] class StreamWriter(Codec, codecs.StreamWriter): pass diff --git a/libs/ftfy/bad_codecs/utf8_variants.py b/libs/ftfy/bad_codecs/utf8_variants.py index 7dce8c0d5..28366a548 100644 --- a/libs/ftfy/bad_codecs/utf8_variants.py +++ b/libs/ftfy/bad_codecs/utf8_variants.py @@ -39,13 +39,15 @@ ftfy instead. """ -import re import codecs -from typing import Tuple +import re from encodings.utf_8 import ( IncrementalDecoder as UTF8IncrementalDecoder, +) +from encodings.utf_8 import ( IncrementalEncoder as UTF8IncrementalEncoder, ) +from typing import Callable, Optional, Tuple NAME = "utf-8-variants" @@ -90,7 +92,10 @@ class IncrementalDecoder(UTF8IncrementalDecoder): we define here for the cases the real encoder isn't expecting. """ - def _buffer_decode(self, input, errors, final): + @staticmethod + def _buffer_decode( # type: ignore[override] + input: bytes, errors: Optional[str], final: bool + ) -> Tuple[str, int]: """ Decode bytes that may be arriving in a stream, following the Codecs API. @@ -112,7 +117,7 @@ def _buffer_decode(self, input, errors, final): position = 0 while True: # Use _buffer_decode_step to decode a segment of text. - decoded, consumed = self._buffer_decode_step( + decoded, consumed = IncrementalDecoder._buffer_decode_step( input[position:], errors, final ) if consumed == 0: @@ -131,7 +136,10 @@ def _buffer_decode(self, input, errors, final): return "".join(decoded_segments), position - def _buffer_decode_step(self, input, errors, final): + @staticmethod + def _buffer_decode_step( + input: bytes, errors: Optional[str], final: bool + ) -> Tuple[str, int]: """ There are three possibilities for each decoding step: @@ -170,10 +178,17 @@ def _buffer_decode_step(self, input, errors, final): return "", 0 else: # Decode a possible six-byte sequence starting with 0xed. - return self._buffer_decode_surrogates(sup, input, errors, final) + return IncrementalDecoder._buffer_decode_surrogates( + sup, input, errors, final + ) @staticmethod - def _buffer_decode_surrogates(sup, input, errors, final): + def _buffer_decode_surrogates( + sup: Callable[[bytes, Optional[str], bool], Tuple[str, int]], + input: bytes, + errors: Optional[str], + final: bool, + ) -> Tuple[str, int]: """ When we have improperly encoded surrogates, we can still see the bits that they were meant to represent. diff --git a/libs/ftfy/badness.py b/libs/ftfy/badness.py index 7b6cce546..81c52744d 100644 --- a/libs/ftfy/badness.py +++ b/libs/ftfy/badness.py @@ -263,8 +263,6 @@ | [{box}{end_punctuation}{currency}{numeric}] [{lower_accented}] | - # leave out [upper_accented][currency] without further info, because it's used in some - # fancy leetspeak-esque writing [{lower_accented}{box}{end_punctuation}] [{currency}] | \s [{upper_accented}] [{currency}] @@ -352,9 +350,7 @@ # Windows-1253 mojibake of Latin-1 characters and/or the Greek alphabet [ΒΓΞΟ][{c1}{bad}{start_punctuation}{end_punctuation}{currency}°][ΒΓΞΟ] -""".format( - **MOJIBAKE_CATEGORIES - ), +""".format(**MOJIBAKE_CATEGORIES), re.VERBOSE, ) diff --git a/libs/ftfy/chardata.py b/libs/ftfy/chardata.py index 0ff75a63d..2e0e82a81 100644 --- a/libs/ftfy/chardata.py +++ b/libs/ftfy/chardata.py @@ -2,12 +2,14 @@ This gives other modules access to the gritty details about characters and the encodings that use them. """ + from __future__ import annotations + import html import itertools import re import unicodedata - +from typing import Dict # These are the encodings we will try to fix in ftfy, in the # order that they should be tried. @@ -27,7 +29,7 @@ DOUBLE_QUOTE_RE = re.compile("[\u201c-\u201f]") -def _build_regexes(): +def _build_regexes() -> Dict[str, re.Pattern[str]]: """ ENCODING_REGEXES contain reasonably fast ways to detect if we could represent a given string in a given encoding. The simplest one is @@ -57,7 +59,7 @@ def _build_regexes(): ENCODING_REGEXES = _build_regexes() -def _build_html_entities(): +def _build_html_entities() -> Dict[str, str]: entities = {} # Create a dictionary based on the built-in HTML5 entity dictionary. # Add a limited set of HTML entities that we'll also decode if they've @@ -81,7 +83,7 @@ def _build_html_entities(): HTML_ENTITIES = _build_html_entities() -def possible_encoding(text, encoding): +def possible_encoding(text: str, encoding: str) -> bool: """ Given text and a single-byte encoding, check whether that text could have been decoded from that single-byte encoding. @@ -92,13 +94,13 @@ def possible_encoding(text, encoding): return bool(ENCODING_REGEXES[encoding].match(text)) -def _build_control_char_mapping(): +def _build_control_char_mapping() -> Dict[int, None]: """ Build a translate mapping that strips likely-unintended control characters. See :func:`ftfy.fixes.remove_control_chars` for a description of these codepoint ranges and why they should be removed. """ - control_chars: dict[int, None] = {} + control_chars: Dict[int, None] = {} for i in itertools.chain( range(0x00, 0x09), @@ -228,7 +230,7 @@ def _build_control_char_mapping(): } -def _build_width_map(): +def _build_width_map() -> Dict[int, str]: """ Build a translate mapping that replaces halfwidth and fullwidth forms with their standard-width forms. diff --git a/libs/ftfy/cli.py b/libs/ftfy/cli.py index 338cba8da..dfb2e9350 100644 --- a/libs/ftfy/cli.py +++ b/libs/ftfy/cli.py @@ -1,10 +1,12 @@ """ A command-line utility for fixing text found in a file. """ + import os import sys +from typing import Union -from ftfy import __version__, fix_file, TextFixerConfig +from ftfy import TextFixerConfig, __version__, fix_file ENCODE_ERROR_TEXT_UNIX = """ftfy error: Unfortunately, this output stream does not support Unicode. @@ -39,7 +41,7 @@ """ -def main(): +def main() -> None: """ Run ftfy as a command-line utility. """ @@ -117,7 +119,7 @@ def main(): if normalization.lower() == "none": normalization = None - unescape_html: str | bool + unescape_html: Union[str, bool] if args.preserve_entities: unescape_html = False else: diff --git a/libs/ftfy/fixes.py b/libs/ftfy/fixes.py index d93cbebbf..a248bc833 100644 --- a/libs/ftfy/fixes.py +++ b/libs/ftfy/fixes.py @@ -14,8 +14,10 @@ import html import re import warnings +from typing import Any, List, Match, Tuple import ftfy +from ftfy.badness import is_bad from ftfy.chardata import ( ALTERED_UTF8_RE, C1_CONTROL_RE, @@ -30,41 +32,44 @@ WIDTH_MAP, ) -from ftfy.badness import is_bad - -def fix_encoding_and_explain(text): +def fix_encoding_and_explain(text: str) -> Any: """ Deprecated copy of `ftfy.fix_encoding_and_explain()`. """ warnings.warn( "`fix_encoding_and_explain()` has moved to the main module of ftfy.", DeprecationWarning, + stacklevel=2, ) return ftfy.fix_encoding_and_explain(text) -def fix_encoding(text): +def fix_encoding(text: str) -> str: """ Deprecated copy of `ftfy.fix_encoding()`. """ warnings.warn( - "`fix_encoding()` has moved to the main module of ftfy.", DeprecationWarning + "`fix_encoding()` has moved to the main module of ftfy.", + DeprecationWarning, + stacklevel=2, ) return ftfy.fix_encoding(text) -def apply_plan(text, plan): +def apply_plan(text: str, plan: List[Tuple[str, str]]) -> str: """ Deprecated copy of `ftfy.apply_plan()`. """ warnings.warn( - "`apply_plan()` has moved to the main module of ftfy.", DeprecationWarning + "`apply_plan()` has moved to the main module of ftfy.", + DeprecationWarning, + stacklevel=2, ) return ftfy.apply_plan(text, plan) -def _unescape_fixup(match): +def _unescape_fixup(match: Match[str]) -> str: """ Replace one matched HTML entity with the character it represents, if possible. @@ -73,7 +78,7 @@ def _unescape_fixup(match): if text in HTML_ENTITIES: return HTML_ENTITIES[text] elif text.startswith("&#"): - unescaped = html.unescape(text) + unescaped: str = html.unescape(text) # If html.unescape only decoded part of the string, that's not what # we want. The semicolon should be consumed. @@ -85,7 +90,7 @@ def _unescape_fixup(match): return text -def unescape_html(text): +def unescape_html(text: str) -> str: """ Decode HTML entities and character references, including some nonstandard ones written in all-caps. @@ -136,7 +141,7 @@ def unescape_html(text): ANSI_RE = re.compile("\033\\[((?:\\d|;)*)([a-zA-Z])") -def remove_terminal_escapes(text): +def remove_terminal_escapes(text: str) -> str: r""" Strip out "ANSI" terminal escape sequences, such as those that produce colored text on Unix. @@ -149,7 +154,7 @@ def remove_terminal_escapes(text): return ANSI_RE.sub("", text) -def uncurl_quotes(text): +def uncurl_quotes(text: str) -> str: r""" Replace curly quotation marks with straight equivalents. @@ -159,7 +164,7 @@ def uncurl_quotes(text): return SINGLE_QUOTE_RE.sub("'", DOUBLE_QUOTE_RE.sub('"', text)) -def fix_latin_ligatures(text): +def fix_latin_ligatures(text: str) -> str: """ Replace single-character ligatures of Latin letters, such as 'fi', with the characters that they contain, as in 'fi'. Latin ligatures are usually not @@ -177,7 +182,7 @@ def fix_latin_ligatures(text): return text.translate(LIGATURES) -def fix_character_width(text): +def fix_character_width(text: str) -> str: """ The ASCII characters, katakana, and Hangul characters have alternate "halfwidth" or "fullwidth" forms that help text line up in a grid. @@ -197,7 +202,7 @@ def fix_character_width(text): return text.translate(WIDTH_MAP) -def fix_line_breaks(text): +def fix_line_breaks(text: str) -> str: r""" Convert all line breaks to Unix style. @@ -253,7 +258,7 @@ def fix_line_breaks(text): SURROGATE_PAIR_RE = re.compile("[\ud800-\udbff][\udc00-\udfff]") -def convert_surrogate_pair(match): +def convert_surrogate_pair(match: Match[str]) -> str: """ Convert a surrogate pair to the single codepoint it represents. @@ -265,7 +270,7 @@ def convert_surrogate_pair(match): return chr(codept) -def fix_surrogates(text): +def fix_surrogates(text: str) -> str: """ Replace 16-bit surrogate codepoints with the characters they represent (when properly paired), or with \ufffd otherwise. @@ -288,7 +293,7 @@ def fix_surrogates(text): return text -def remove_control_chars(text): +def remove_control_chars(text: str) -> str: """ Remove various control characters that you probably didn't intend to be in your text. Many of these characters appear in the table of "Characters not @@ -321,7 +326,7 @@ def remove_control_chars(text): return text.translate(CONTROL_CHARS) -def remove_bom(text): +def remove_bom(text: str) -> str: r""" Remove a byte-order mark that was accidentally decoded as if it were part of the text. @@ -346,7 +351,7 @@ def remove_bom(text): ) -def decode_escapes(text): +def decode_escapes(text: str) -> str: r""" Decode backslashed escape sequences, including \\x, \\u, and \\U character references, even in the presence of other Unicode. @@ -377,7 +382,7 @@ def decode_escapes(text): "unicode-escape" to work correctly. """ - def decode_match(match): + def decode_match(match: Match[str]) -> str: "Given a regex match, decode the escape sequence it contains." return codecs.decode(match.group(0), "unicode-escape") @@ -410,7 +415,7 @@ def decode_match(match): A_GRAVE_WORD_RE = re.compile(b"\xc3 (?! |quele|quela|quilo|s )") -def restore_byte_a0(byts): +def restore_byte_a0(byts: bytes) -> bytes: """ Some mojibake has been additionally altered by a process that said "hmm, byte A0, that's basically a space!" and replaced it with an ASCII space. @@ -426,14 +431,14 @@ def restore_byte_a0(byts): """ byts = A_GRAVE_WORD_RE.sub(b"\xc3\xa0 ", byts) - def replacement(match): + def replacement(match: Match[bytes]) -> bytes: "The function to apply when this regex matches." return match.group(0).replace(b"\x20", b"\xa0") return ALTERED_UTF8_RE.sub(replacement, byts) -def replace_lossy_sequences(byts): +def replace_lossy_sequences(byts: bytes) -> bytes: """ This function identifies sequences where information has been lost in a "sloppy" codec, indicated by byte 1A, and if they would otherwise look @@ -472,7 +477,7 @@ def replace_lossy_sequences(byts): return LOSSY_UTF8_RE.sub("\ufffd".encode("utf-8"), byts) -def decode_inconsistent_utf8(text): +def decode_inconsistent_utf8(text: str) -> str: """ Sometimes, text from one encoding ends up embedded within text from a different one. This is common enough that we need to be able to fix it. @@ -480,7 +485,7 @@ def decode_inconsistent_utf8(text): This is used as a transcoder within `fix_encoding`. """ - def fix_embedded_mojibake(match): + def fix_embedded_mojibake(match: Match[str]) -> str: substr = match.group(0) # Require the match to be shorter, so that this doesn't recurse infinitely @@ -492,11 +497,11 @@ def fix_embedded_mojibake(match): return UTF8_DETECTOR_RE.sub(fix_embedded_mojibake, text) -def _c1_fixer(match): +def _c1_fixer(match: Match[str]) -> str: return match.group(0).encode("latin-1").decode("sloppy-windows-1252") -def fix_c1_controls(text): +def fix_c1_controls(text: str) -> str: """ If text still contains C1 control characters, treat them as their Windows-1252 equivalents. This matches what Web browsers do. diff --git a/libs/ftfy/formatting.py b/libs/ftfy/formatting.py index 5856f2940..18df64b08 100644 --- a/libs/ftfy/formatting.py +++ b/libs/ftfy/formatting.py @@ -5,9 +5,11 @@ We used to have our own implementation here, but now we mostly rely on the 'wcwidth' library. """ + from unicodedata import normalize from wcwidth import wcswidth, wcwidth + from ftfy.fixes import remove_terminal_escapes @@ -74,7 +76,7 @@ def monospaced_width(text: str) -> int: return int(wcswidth(remove_terminal_escapes(normalize("NFC", text)))) -def display_ljust(text, width, fillchar=" "): +def display_ljust(text: str, width: int, fillchar: str = " ") -> str: """ Return `text` left-justified in a Unicode string whose display width, in a monospaced terminal, should be at least `width` character cells. @@ -108,7 +110,7 @@ def display_ljust(text, width, fillchar=" "): return text + fillchar * padding -def display_rjust(text, width, fillchar=" "): +def display_rjust(text: str, width: int, fillchar: str = " ") -> str: """ Return `text` right-justified in a Unicode string whose display width, in a monospaced terminal, should be at least `width` character cells. @@ -137,7 +139,7 @@ def display_rjust(text, width, fillchar=" "): return fillchar * padding + text -def display_center(text, width, fillchar=" "): +def display_center(text: str, width: int, fillchar: str = " ") -> str: """ Return `text` centered in a Unicode string whose display width, in a monospaced terminal, should be at least `width` character cells. The rest diff --git a/libs/ga4mp-2.0.4.dist-info/METADATA b/libs/ga4mp-2.0.4.dist-info/METADATA index 9e525483d..fd94df244 100644 --- a/libs/ga4mp-2.0.4.dist-info/METADATA +++ b/libs/ga4mp-2.0.4.dist-info/METADATA @@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Project-URL: Repository, https://github.com/adswerve/GA4-Measurement-Protocol-Python Description-Content-Type: text/markdown diff --git a/libs/ga4mp-2.0.4.dist-info/RECORD b/libs/ga4mp-2.0.4.dist-info/RECORD index 56327dfcd..0a53ed4ef 100644 --- a/libs/ga4mp-2.0.4.dist-info/RECORD +++ b/libs/ga4mp-2.0.4.dist-info/RECORD @@ -1,9 +1,9 @@ ga4mp-2.0.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 ga4mp-2.0.4.dist-info/LICENSE,sha256=DM06JXbtuaVXvujV9lz_AavWd29d7hAQHGyqKztt84U,1521 -ga4mp-2.0.4.dist-info/METADATA,sha256=gdOlcNMQD_u19hJfu5WnTMGNUxNU9zh5FklRu0qUqjc,14523 +ga4mp-2.0.4.dist-info/METADATA,sha256=FIB_rdxhosEcBtajmqy4U4mKQs3ojhJVtYsoI3Ia5_s,14574 ga4mp-2.0.4.dist-info/RECORD,, ga4mp-2.0.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -ga4mp-2.0.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 +ga4mp-2.0.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 ga4mp/__init__.py,sha256=HtxNKOcZsblw0U8yAKbOh8o5gzyfFFSnd8omf9THTmI,77 ga4mp/event.py,sha256=7titLeg3n0Ovfz0s4jSCny3IivtjQc9tXU-F3ADMfyQ,1897 ga4mp/ga4mp.py,sha256=eKbeGKbEzVAihp-TiXokUWgNsnooGOq44lI-xE08KZg,17235 diff --git a/libs/ga4mp-2.0.4.dist-info/WHEEL b/libs/ga4mp-2.0.4.dist-info/WHEEL index d73ccaae8..8b9b3a1bf 100644 --- a/libs/ga4mp-2.0.4.dist-info/WHEEL +++ b/libs/ga4mp-2.0.4.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 +Generator: poetry-core 1.9.1 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/guessit-3.8.0.dist-info/METADATA b/libs/guessit-3.8.0.dist-info/METADATA index 672c0e7d6..c2d5a2fb5 100644 --- a/libs/guessit-3.8.0.dist-info/METADATA +++ b/libs/guessit-3.8.0.dist-info/METADATA @@ -23,25 +23,25 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules Description-Content-Type: text/markdown License-File: LICENSE License-File: AUTHORS.md -Requires-Dist: rebulk >=3.2.0 -Requires-Dist: babelfish >=0.6.0 +Requires-Dist: rebulk>=3.2.0 +Requires-Dist: babelfish>=0.6.0 Requires-Dist: python-dateutil -Requires-Dist: importlib-resources ; python_version < "3.9" +Requires-Dist: importlib-resources; python_version < "3.9" Provides-Extra: dev -Requires-Dist: tox ; extra == 'dev' -Requires-Dist: mkdocs ; extra == 'dev' -Requires-Dist: mkdocs-material ; extra == 'dev' -Requires-Dist: pyinstaller ; extra == 'dev' -Requires-Dist: wheel ; extra == 'dev' -Requires-Dist: python-semantic-release ; extra == 'dev' -Requires-Dist: twine ; extra == 'dev' +Requires-Dist: tox; extra == "dev" +Requires-Dist: mkdocs; extra == "dev" +Requires-Dist: mkdocs-material; extra == "dev" +Requires-Dist: pyinstaller; extra == "dev" +Requires-Dist: wheel; extra == "dev" +Requires-Dist: python-semantic-release; extra == "dev" +Requires-Dist: twine; extra == "dev" Provides-Extra: test -Requires-Dist: pytest ; extra == 'test' -Requires-Dist: pytest-mock ; extra == 'test' -Requires-Dist: pytest-benchmark ; extra == 'test' -Requires-Dist: pytest-cov ; extra == 'test' -Requires-Dist: pylint ; extra == 'test' -Requires-Dist: PyYAML ; extra == 'test' +Requires-Dist: pytest; extra == "test" +Requires-Dist: pytest-mock; extra == "test" +Requires-Dist: pytest-benchmark; extra == "test" +Requires-Dist: pytest-cov; extra == "test" +Requires-Dist: pylint; extra == "test" +Requires-Dist: PyYAML; extra == "test" GuessIt diff --git a/libs/guessit-3.8.0.dist-info/RECORD b/libs/guessit-3.8.0.dist-info/RECORD index 3cf6a0634..aee9c2f8b 100644 --- a/libs/guessit-3.8.0.dist-info/RECORD +++ b/libs/guessit-3.8.0.dist-info/RECORD @@ -2,10 +2,10 @@ guessit-3.8.0.dist-info/AUTHORS.md,sha256=8UKCF10oLsrPtPLJPqw05bfJ5eyc0g91VmYcLEzi2f0,565 guessit-3.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 guessit-3.8.0.dist-info/LICENSE,sha256=6or154nLLU6bELzjh0mCreFjt0m2v72zLi3yHE0QbeE,7650 -guessit-3.8.0.dist-info/METADATA,sha256=WFcO_I__1nC8Dwk73NsGZb3GCX8Ko2vFOR9hs2ewsdM,140739 +guessit-3.8.0.dist-info/METADATA,sha256=VUhjbKLAYqbDxZQqt4uabvRd_Pp-9TBOGZZZ8wav87E,140723 guessit-3.8.0.dist-info/RECORD,, guessit-3.8.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -guessit-3.8.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +guessit-3.8.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 guessit-3.8.0.dist-info/entry_points.txt,sha256=E03zXaeYI3YX6zekg8Gg3MO6reVOnJqH5G-Uh27QBsw,50 guessit-3.8.0.dist-info/top_level.txt,sha256=VXrxhYsS5fHWY-GfzrQYnsL1u_zplTpwxe7eOdfFQAU,8 guessit-3.8.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 diff --git a/libs/guessit-3.8.0.dist-info/WHEEL b/libs/guessit-3.8.0.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/guessit-3.8.0.dist-info/WHEEL +++ b/libs/guessit-3.8.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/h11-0.14.0.dist-info/METADATA b/libs/h11-0.14.0.dist-info/METADATA index cf12a82f1..b2b8a5db4 100644 --- a/libs/h11-0.14.0.dist-info/METADATA +++ b/libs/h11-0.14.0.dist-info/METADATA @@ -21,7 +21,7 @@ Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: System :: Networking Requires-Python: >=3.7 License-File: LICENSE.txt -Requires-Dist: typing-extensions ; python_version < "3.8" +Requires-Dist: typing-extensions; python_version < "3.8" h11 === diff --git a/libs/h11-0.14.0.dist-info/RECORD b/libs/h11-0.14.0.dist-info/RECORD index feaa3be52..1a31701c6 100644 --- a/libs/h11-0.14.0.dist-info/RECORD +++ b/libs/h11-0.14.0.dist-info/RECORD @@ -1,9 +1,9 @@ h11-0.14.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 h11-0.14.0.dist-info/LICENSE.txt,sha256=N9tbuFkm2yikJ6JYZ_ELEjIAOuob5pzLhRE4rbjm82E,1124 -h11-0.14.0.dist-info/METADATA,sha256=B7pZ0m7WBXNs17vl6hUH9bJTL9s37DaGvY31w7jNxSg,8175 +h11-0.14.0.dist-info/METADATA,sha256=ql-03yzC2R3KPYYtngVlhyt21TRceo3qQTVx4j2s1KI,8174 h11-0.14.0.dist-info/RECORD,, h11-0.14.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -h11-0.14.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +h11-0.14.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 h11-0.14.0.dist-info/top_level.txt,sha256=F7dC4jl3zeh8TGHEPaWJrMbeuoWbS379Gwdi-Yvdcis,4 h11/__init__.py,sha256=iO1KzkSO42yZ6ffg-VMgbx_ZVTWGUY00nRYEWn-s3kY,1507 h11/_abnf.py,sha256=ybixr0xsupnkA6GFAyMubuXF6Tc1lb_hF890NgCsfNc,4815 diff --git a/libs/h11-0.14.0.dist-info/WHEEL b/libs/h11-0.14.0.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/h11-0.14.0.dist-info/WHEEL +++ b/libs/h11-0.14.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/ftfy-6.1.3.dist-info/INSTALLER b/libs/idna-3.10.dist-info/INSTALLER similarity index 100% rename from libs/ftfy-6.1.3.dist-info/INSTALLER rename to libs/idna-3.10.dist-info/INSTALLER diff --git a/libs/idna-3.6.dist-info/LICENSE.md b/libs/idna-3.10.dist-info/LICENSE.md similarity index 96% rename from libs/idna-3.6.dist-info/LICENSE.md rename to libs/idna-3.10.dist-info/LICENSE.md index ce3670186..19b6b4524 100644 --- a/libs/idna-3.6.dist-info/LICENSE.md +++ b/libs/idna-3.10.dist-info/LICENSE.md @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2013-2023, Kim Davies and contributors. +Copyright (c) 2013-2024, Kim Davies and contributors. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/libs/idna-3.6.dist-info/METADATA b/libs/idna-3.10.dist-info/METADATA similarity index 93% rename from libs/idna-3.6.dist-info/METADATA rename to libs/idna-3.10.dist-info/METADATA index 9be806093..c42623e94 100644 --- a/libs/idna-3.6.dist-info/METADATA +++ b/libs/idna-3.10.dist-info/METADATA @@ -1,9 +1,9 @@ Metadata-Version: 2.1 Name: idna -Version: 3.6 +Version: 3.10 Summary: Internationalized Domain Names in Applications (IDNA) Author-email: Kim Davies -Requires-Python: >=3.5 +Requires-Python: >=3.6 Description-Content-Type: text/x-rst Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers @@ -13,7 +13,6 @@ Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 @@ -21,14 +20,20 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Internet :: Name Service (DNS) Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Utilities +Requires-Dist: ruff >= 0.6.2 ; extra == "all" +Requires-Dist: mypy >= 1.11.2 ; extra == "all" +Requires-Dist: pytest >= 8.3.2 ; extra == "all" +Requires-Dist: flake8 >= 7.1.1 ; extra == "all" Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst Project-URL: Issue tracker, https://github.com/kjd/idna/issues Project-URL: Source, https://github.com/kjd/idna +Provides-Extra: all Internationalized Domain Names in Applications (IDNA) ===================================================== @@ -115,7 +120,9 @@ This library provides one such mapping that was developed by the Unicode Consortium. Known as `Unicode IDNA Compatibility Processing `_, it provides for both a regular mapping for typical applications, as well as a transitional mapping to -help migrate from older IDNA 2003 applications. +help migrate from older IDNA 2003 applications. Strings are +preprocessed according to Section 4.4 “Preprocessing for IDNA2008” +prior to the IDNA operations. For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL LETTER K* is not allowed (nor are capital letters in general). @@ -215,7 +222,7 @@ Additional Notes * **Packages**. The latest tagged release version is published in the `Python Package Index `_. -* **Version support**. This library supports Python 3.5 and higher. +* **Version support**. This library supports Python 3.6 and higher. As this library serves as a low-level toolkit for a variety of applications, many of which strive for broad compatibility with older Python versions, there is no rush to remove older interpreter support. @@ -223,9 +230,9 @@ Additional Notes maintenance burden has become too high. * **Python 2**. Python 2 is supported by version 2.x of this library. - While active development of the version 2.x series has ended, notable - issues being corrected may be backported to 2.x. Use "idna<3" in your - requirements file if you need this library for a Python 2 application. + Use "idna<3" in your requirements file if you need this library for + a Python 2 application. Be advised that these versions are no longer + actively developed. * **Testing**. The library has a test suite based on each rule of the IDNA specification, as well as tests that are provided as part of the diff --git a/libs/idna-3.10.dist-info/RECORD b/libs/idna-3.10.dist-info/RECORD new file mode 100644 index 000000000..9a78b9871 --- /dev/null +++ b/libs/idna-3.10.dist-info/RECORD @@ -0,0 +1,15 @@ +idna-3.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna-3.10.dist-info/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541 +idna-3.10.dist-info/METADATA,sha256=URR5ZyDfQ1PCEGhkYoojqfi2Ra0tau2--lhwG4XSfjI,10158 +idna-3.10.dist-info/RECORD,, +idna-3.10.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna-3.10.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 +idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422 +idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 +idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239 +idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306 +idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 +idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21 +idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289 diff --git a/libs/ftfy-6.1.3.dist-info/REQUESTED b/libs/idna-3.10.dist-info/REQUESTED similarity index 100% rename from libs/ftfy-6.1.3.dist-info/REQUESTED rename to libs/idna-3.10.dist-info/REQUESTED diff --git a/libs/idna-3.6.dist-info/WHEEL b/libs/idna-3.10.dist-info/WHEEL similarity index 100% rename from libs/idna-3.6.dist-info/WHEEL rename to libs/idna-3.10.dist-info/WHEEL diff --git a/libs/idna-3.6.dist-info/RECORD b/libs/idna-3.6.dist-info/RECORD deleted file mode 100644 index 335c17aef..000000000 --- a/libs/idna-3.6.dist-info/RECORD +++ /dev/null @@ -1,15 +0,0 @@ -idna-3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -idna-3.6.dist-info/LICENSE.md,sha256=yy-vDKGMbTh-x8tm8yGTn7puZ-nawJ0xR3y52NP-aJk,1541 -idna-3.6.dist-info/METADATA,sha256=N93B509dkvvkd_Y0E_VxCHPkVkrD6InxoyfXvX4egds,9888 -idna-3.6.dist-info/RECORD,, -idna-3.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -idna-3.6.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 -idna/codec.py,sha256=PS6m-XmdST7Wj7J7ulRMakPDt5EBJyYrT3CPtjh-7t4,3426 -idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 -idna/core.py,sha256=Bxz9L1rH0N5U-yukGfPuDRTxR2jDUl96NCq1ql3YAUw,12908 -idna/idnadata.py,sha256=9u3Ec_GRrhlcbs7QM3pAZ2ObEQzPIOm99FaVOm91UGg,44351 -idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 -idna/package_data.py,sha256=y-iv-qJdmHsWVR5FszYwsMo1AQg8qpdU2aU5nT-S2oQ,21 -idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -idna/uts46data.py,sha256=1KuksWqLuccPXm2uyRVkhfiFLNIhM_H2m4azCcnOqEU,206503 diff --git a/libs/idna/__init__.py b/libs/idna/__init__.py index a40eeafcc..cfdc030a7 100644 --- a/libs/idna/__init__.py +++ b/libs/idna/__init__.py @@ -1,4 +1,3 @@ -from .package_data import __version__ from .core import ( IDNABidiError, IDNAError, @@ -20,8 +19,10 @@ valid_string_length, ) from .intranges import intranges_contain +from .package_data import __version__ __all__ = [ + "__version__", "IDNABidiError", "IDNAError", "InvalidCodepoint", diff --git a/libs/idna/codec.py b/libs/idna/codec.py index c855a4de6..913abfd6a 100644 --- a/libs/idna/codec.py +++ b/libs/idna/codec.py @@ -1,49 +1,51 @@ -from .core import encode, decode, alabel, ulabel, IDNAError import codecs import re -from typing import Any, Tuple, Optional +from typing import Any, Optional, Tuple -_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]') +from .core import IDNAError, alabel, decode, encode, ulabel + +_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") -class Codec(codecs.Codec): - def encode(self, data: str, errors: str = 'strict') -> Tuple[bytes, int]: - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) +class Codec(codecs.Codec): + def encode(self, data: str, errors: str = "strict") -> Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) if not data: return b"", 0 return encode(data), len(data) - def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]: - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) if not data: - return '', 0 + return "", 0 return decode(data), len(data) + class IncrementalEncoder(codecs.BufferedIncrementalEncoder): def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) if not data: - return b'', 0 + return b"", 0 labels = _unicode_dots_re.split(data) - trailing_dot = b'' + trailing_dot = b"" if labels: if not labels[-1]: - trailing_dot = b'.' + trailing_dot = b"." del labels[-1] elif not final: # Keep potentially unfinished label until the next call del labels[-1] if labels: - trailing_dot = b'.' + trailing_dot = b"." result = [] size = 0 @@ -54,32 +56,33 @@ def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, in size += len(label) # Join with U+002E - result_bytes = b'.'.join(result) + trailing_dot + result_bytes = b".".join(result) + trailing_dot size += len(trailing_dot) return result_bytes, size + class IncrementalDecoder(codecs.BufferedIncrementalDecoder): def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: - if errors != 'strict': - raise IDNAError('Unsupported error handling \"{}\"'.format(errors)) + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) if not data: - return ('', 0) + return ("", 0) if not isinstance(data, str): - data = str(data, 'ascii') + data = str(data, "ascii") labels = _unicode_dots_re.split(data) - trailing_dot = '' + trailing_dot = "" if labels: if not labels[-1]: - trailing_dot = '.' + trailing_dot = "." del labels[-1] elif not final: # Keep potentially unfinished label until the next call del labels[-1] if labels: - trailing_dot = '.' + trailing_dot = "." result = [] size = 0 @@ -89,7 +92,7 @@ def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int] size += 1 size += len(label) - result_str = '.'.join(result) + trailing_dot + result_str = ".".join(result) + trailing_dot size += len(trailing_dot) return (result_str, size) @@ -103,7 +106,7 @@ class StreamReader(Codec, codecs.StreamReader): def search_function(name: str) -> Optional[codecs.CodecInfo]: - if name != 'idna2008': + if name != "idna2008": return None return codecs.CodecInfo( name=name, @@ -115,4 +118,5 @@ def search_function(name: str) -> Optional[codecs.CodecInfo]: streamreader=StreamReader, ) + codecs.register(search_function) diff --git a/libs/idna/compat.py b/libs/idna/compat.py index 786e6bda6..1df9f2a70 100644 --- a/libs/idna/compat.py +++ b/libs/idna/compat.py @@ -1,13 +1,15 @@ -from .core import * -from .codec import * from typing import Any, Union +from .core import decode, encode + + def ToASCII(label: str) -> bytes: return encode(label) + def ToUnicode(label: Union[bytes, bytearray]) -> str: return decode(label) -def nameprep(s: Any) -> None: - raise NotImplementedError('IDNA 2008 does not utilise nameprep protocol') +def nameprep(s: Any) -> None: + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") diff --git a/libs/idna/core.py b/libs/idna/core.py index aaf7d658b..9115f123f 100644 --- a/libs/idna/core.py +++ b/libs/idna/core.py @@ -1,31 +1,37 @@ -from . import idnadata import bisect -import unicodedata import re -from typing import Union, Optional +import unicodedata +from typing import Optional, Union + +from . import idnadata from .intranges import intranges_contain _virama_combining_class = 9 -_alabel_prefix = b'xn--' -_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]') +_alabel_prefix = b"xn--" +_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") + class IDNAError(UnicodeError): - """ Base exception for all IDNA-encoding related problems """ + """Base exception for all IDNA-encoding related problems""" + pass class IDNABidiError(IDNAError): - """ Exception when bidirectional requirements are not satisfied """ + """Exception when bidirectional requirements are not satisfied""" + pass class InvalidCodepoint(IDNAError): - """ Exception when a disallowed or unallocated codepoint is used """ + """Exception when a disallowed or unallocated codepoint is used""" + pass class InvalidCodepointContext(IDNAError): - """ Exception when the codepoint is not valid in the context it is used """ + """Exception when the codepoint is not valid in the context it is used""" + pass @@ -33,17 +39,20 @@ def _combining_class(cp: int) -> int: v = unicodedata.combining(chr(cp)) if v == 0: if not unicodedata.name(chr(cp)): - raise ValueError('Unknown character in unicodedata') + raise ValueError("Unknown character in unicodedata") return v + def _is_script(cp: str, script: str) -> bool: return intranges_contain(ord(cp), idnadata.scripts[script]) + def _punycode(s: str) -> bytes: - return s.encode('punycode') + return s.encode("punycode") + def _unot(s: int) -> str: - return 'U+{:04X}'.format(s) + return "U+{:04X}".format(s) def valid_label_length(label: Union[bytes, str]) -> bool: @@ -61,158 +70,170 @@ def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: def check_bidi(label: str, check_ltr: bool = False) -> bool: # Bidi rules should only be applied if string contains RTL characters bidi_label = False - for (idx, cp) in enumerate(label, 1): + for idx, cp in enumerate(label, 1): direction = unicodedata.bidirectional(cp) - if direction == '': + if direction == "": # String likely comes from a newer version of Unicode - raise IDNABidiError('Unknown directionality in label {} at position {}'.format(repr(label), idx)) - if direction in ['R', 'AL', 'AN']: + raise IDNABidiError("Unknown directionality in label {} at position {}".format(repr(label), idx)) + if direction in ["R", "AL", "AN"]: bidi_label = True if not bidi_label and not check_ltr: return True # Bidi rule 1 direction = unicodedata.bidirectional(label[0]) - if direction in ['R', 'AL']: + if direction in ["R", "AL"]: rtl = True - elif direction == 'L': + elif direction == "L": rtl = False else: - raise IDNABidiError('First codepoint in label {} must be directionality L, R or AL'.format(repr(label))) + raise IDNABidiError("First codepoint in label {} must be directionality L, R or AL".format(repr(label))) valid_ending = False - number_type = None # type: Optional[str] - for (idx, cp) in enumerate(label, 1): + number_type: Optional[str] = None + for idx, cp in enumerate(label, 1): direction = unicodedata.bidirectional(cp) if rtl: # Bidi rule 2 - if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {} in a right-to-left label'.format(idx)) + if direction not in [ + "R", + "AL", + "AN", + "EN", + "ES", + "CS", + "ET", + "ON", + "BN", + "NSM", + ]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a right-to-left label".format(idx)) # Bidi rule 3 - if direction in ['R', 'AL', 'EN', 'AN']: + if direction in ["R", "AL", "EN", "AN"]: valid_ending = True - elif direction != 'NSM': + elif direction != "NSM": valid_ending = False # Bidi rule 4 - if direction in ['AN', 'EN']: + if direction in ["AN", "EN"]: if not number_type: number_type = direction else: if number_type != direction: - raise IDNABidiError('Can not mix numeral types in a right-to-left label') + raise IDNABidiError("Can not mix numeral types in a right-to-left label") else: # Bidi rule 5 - if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: - raise IDNABidiError('Invalid direction for codepoint at position {} in a left-to-right label'.format(idx)) + if direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a left-to-right label".format(idx)) # Bidi rule 6 - if direction in ['L', 'EN']: + if direction in ["L", "EN"]: valid_ending = True - elif direction != 'NSM': + elif direction != "NSM": valid_ending = False if not valid_ending: - raise IDNABidiError('Label ends with illegal codepoint directionality') + raise IDNABidiError("Label ends with illegal codepoint directionality") return True def check_initial_combiner(label: str) -> bool: - if unicodedata.category(label[0])[0] == 'M': - raise IDNAError('Label begins with an illegal combining character') + if unicodedata.category(label[0])[0] == "M": + raise IDNAError("Label begins with an illegal combining character") return True def check_hyphen_ok(label: str) -> bool: - if label[2:4] == '--': - raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') - if label[0] == '-' or label[-1] == '-': - raise IDNAError('Label must not start or end with a hyphen') + if label[2:4] == "--": + raise IDNAError("Label has disallowed hyphens in 3rd and 4th position") + if label[0] == "-" or label[-1] == "-": + raise IDNAError("Label must not start or end with a hyphen") return True def check_nfc(label: str) -> None: - if unicodedata.normalize('NFC', label) != label: - raise IDNAError('Label must be in Normalization Form C') + if unicodedata.normalize("NFC", label) != label: + raise IDNAError("Label must be in Normalization Form C") def valid_contextj(label: str, pos: int) -> bool: cp_value = ord(label[pos]) - if cp_value == 0x200c: - + if cp_value == 0x200C: if pos > 0: if _combining_class(ord(label[pos - 1])) == _virama_combining_class: return True ok = False - for i in range(pos-1, -1, -1): + for i in range(pos - 1, -1, -1): joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): + if joining_type == ord("T"): continue - if joining_type in [ord('L'), ord('D')]: + elif joining_type in [ord("L"), ord("D")]: ok = True break + else: + break if not ok: return False ok = False - for i in range(pos+1, len(label)): + for i in range(pos + 1, len(label)): joining_type = idnadata.joining_types.get(ord(label[i])) - if joining_type == ord('T'): + if joining_type == ord("T"): continue - if joining_type in [ord('R'), ord('D')]: + elif joining_type in [ord("R"), ord("D")]: ok = True break + else: + break return ok - if cp_value == 0x200d: - + if cp_value == 0x200D: if pos > 0: if _combining_class(ord(label[pos - 1])) == _virama_combining_class: return True return False else: - return False def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: cp_value = ord(label[pos]) - if cp_value == 0x00b7: - if 0 < pos < len(label)-1: - if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + if cp_value == 0x00B7: + if 0 < pos < len(label) - 1: + if ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C: return True return False elif cp_value == 0x0375: - if pos < len(label)-1 and len(label) > 1: - return _is_script(label[pos + 1], 'Greek') + if pos < len(label) - 1 and len(label) > 1: + return _is_script(label[pos + 1], "Greek") return False - elif cp_value == 0x05f3 or cp_value == 0x05f4: + elif cp_value == 0x05F3 or cp_value == 0x05F4: if pos > 0: - return _is_script(label[pos - 1], 'Hebrew') + return _is_script(label[pos - 1], "Hebrew") return False - elif cp_value == 0x30fb: + elif cp_value == 0x30FB: for cp in label: - if cp == '\u30fb': + if cp == "\u30fb": continue - if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"): return True return False elif 0x660 <= cp_value <= 0x669: for cp in label: - if 0x6f0 <= ord(cp) <= 0x06f9: + if 0x6F0 <= ord(cp) <= 0x06F9: return False return True - elif 0x6f0 <= cp_value <= 0x6f9: + elif 0x6F0 <= cp_value <= 0x6F9: for cp in label: if 0x660 <= ord(cp) <= 0x0669: return False @@ -223,55 +244,58 @@ def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: def check_label(label: Union[str, bytes, bytearray]) -> None: if isinstance(label, (bytes, bytearray)): - label = label.decode('utf-8') + label = label.decode("utf-8") if len(label) == 0: - raise IDNAError('Empty Label') + raise IDNAError("Empty Label") check_nfc(label) check_hyphen_ok(label) check_initial_combiner(label) - for (pos, cp) in enumerate(label): + for pos, cp in enumerate(label): cp_value = ord(cp) - if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]): continue - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]): try: if not valid_contextj(label, pos): - raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format( - _unot(cp_value), pos+1, repr(label))) + raise InvalidCodepointContext( + "Joiner {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) except ValueError: - raise IDNAError('Unknown codepoint adjacent to joiner {} at position {} in {}'.format( - _unot(cp_value), pos+1, repr(label))) - elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + raise IDNAError( + "Unknown codepoint adjacent to joiner {} at position {} in {}".format( + _unot(cp_value), pos + 1, repr(label) + ) + ) + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]): if not valid_contexto(label, pos): - raise InvalidCodepointContext('Codepoint {} not allowed at position {} in {}'.format(_unot(cp_value), pos+1, repr(label))) + raise InvalidCodepointContext( + "Codepoint {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) else: - raise InvalidCodepoint('Codepoint {} at position {} of {} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + raise InvalidCodepoint( + "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label)) + ) check_bidi(label) def alabel(label: str) -> bytes: try: - label_bytes = label.encode('ascii') + label_bytes = label.encode("ascii") ulabel(label_bytes) if not valid_label_length(label_bytes): - raise IDNAError('Label too long') + raise IDNAError("Label too long") return label_bytes except UnicodeEncodeError: pass - if not label: - raise IDNAError('No Input') - - label = str(label) check_label(label) - label_bytes = _punycode(label) - label_bytes = _alabel_prefix + label_bytes + label_bytes = _alabel_prefix + _punycode(label) if not valid_label_length(label_bytes): - raise IDNAError('Label too long') + raise IDNAError("Label too long") return label_bytes @@ -279,7 +303,7 @@ def alabel(label: str) -> bytes: def ulabel(label: Union[str, bytes, bytearray]) -> str: if not isinstance(label, (bytes, bytearray)): try: - label_bytes = label.encode('ascii') + label_bytes = label.encode("ascii") except UnicodeEncodeError: check_label(label) return label @@ -288,19 +312,19 @@ def ulabel(label: Union[str, bytes, bytearray]) -> str: label_bytes = label_bytes.lower() if label_bytes.startswith(_alabel_prefix): - label_bytes = label_bytes[len(_alabel_prefix):] + label_bytes = label_bytes[len(_alabel_prefix) :] if not label_bytes: - raise IDNAError('Malformed A-label, no Punycode eligible content found') - if label_bytes.decode('ascii')[-1] == '-': - raise IDNAError('A-label must not end with a hyphen') + raise IDNAError("Malformed A-label, no Punycode eligible content found") + if label_bytes.decode("ascii")[-1] == "-": + raise IDNAError("A-label must not end with a hyphen") else: check_label(label_bytes) - return label_bytes.decode('ascii') + return label_bytes.decode("ascii") try: - label = label_bytes.decode('punycode') + label = label_bytes.decode("punycode") except UnicodeError: - raise IDNAError('Invalid A-label') + raise IDNAError("Invalid A-label") check_label(label) return label @@ -308,52 +332,60 @@ def ulabel(label: Union[str, bytes, bytearray]) -> str: def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: """Re-map the characters in the string according to UTS46 processing.""" from .uts46data import uts46data - output = '' + + output = "" for pos, char in enumerate(domain): code_point = ord(char) try: - uts46row = uts46data[code_point if code_point < 256 else - bisect.bisect_left(uts46data, (code_point, 'Z')) - 1] + uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1] status = uts46row[1] - replacement = None # type: Optional[str] + replacement: Optional[str] = None if len(uts46row) == 3: replacement = uts46row[2] - if (status == 'V' or - (status == 'D' and not transitional) or - (status == '3' and not std3_rules and replacement is None)): + if ( + status == "V" + or (status == "D" and not transitional) + or (status == "3" and not std3_rules and replacement is None) + ): output += char - elif replacement is not None and (status == 'M' or - (status == '3' and not std3_rules) or - (status == 'D' and transitional)): + elif replacement is not None and ( + status == "M" or (status == "3" and not std3_rules) or (status == "D" and transitional) + ): output += replacement - elif status != 'I': + elif status != "I": raise IndexError() except IndexError: raise InvalidCodepoint( - 'Codepoint {} not allowed at position {} in {}'.format( - _unot(code_point), pos + 1, repr(domain))) + "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain)) + ) - return unicodedata.normalize('NFC', output) + return unicodedata.normalize("NFC", output) -def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes: +def encode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, + transitional: bool = False, +) -> bytes: if not isinstance(s, str): try: - s = str(s, 'ascii') + s = str(s, "ascii") except UnicodeDecodeError: - raise IDNAError('should pass a unicode string to the function rather than a byte string.') + raise IDNAError("should pass a unicode string to the function rather than a byte string.") if uts46: s = uts46_remap(s, std3_rules, transitional) trailing_dot = False result = [] if strict: - labels = s.split('.') + labels = s.split(".") else: labels = _unicode_dots_re.split(s) - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if labels[-1] == '': + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if labels[-1] == "": del labels[-1] trailing_dot = True for label in labels: @@ -361,21 +393,26 @@ def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = if s: result.append(s) else: - raise IDNAError('Empty label') + raise IDNAError("Empty label") if trailing_dot: - result.append(b'') - s = b'.'.join(result) + result.append(b"") + s = b".".join(result) if not valid_string_length(s, trailing_dot): - raise IDNAError('Domain too long') + raise IDNAError("Domain too long") return s -def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str: +def decode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, +) -> str: try: if not isinstance(s, str): - s = str(s, 'ascii') + s = str(s, "ascii") except UnicodeDecodeError: - raise IDNAError('Invalid ASCII in A-label') + raise IDNAError("Invalid ASCII in A-label") if uts46: s = uts46_remap(s, std3_rules, False) trailing_dot = False @@ -383,9 +420,9 @@ def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = if not strict: labels = _unicode_dots_re.split(s) else: - labels = s.split('.') - if not labels or labels == ['']: - raise IDNAError('Empty domain') + labels = s.split(".") + if not labels or labels == [""]: + raise IDNAError("Empty domain") if not labels[-1]: del labels[-1] trailing_dot = True @@ -394,7 +431,7 @@ def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = if s: result.append(s) else: - raise IDNAError('Empty label') + raise IDNAError("Empty label") if trailing_dot: - result.append('') - return '.'.join(result) + result.append("") + return ".".join(result) diff --git a/libs/idna/idnadata.py b/libs/idna/idnadata.py index 5cd05d905..4be600462 100644 --- a/libs/idna/idnadata.py +++ b/libs/idna/idnadata.py @@ -1,116 +1,290 @@ # This file is automatically generated by tools/idna-data -__version__ = '15.1.0' +__version__ = "15.1.0" scripts = { - 'Greek': ( + "Greek": ( 0x37000000374, 0x37500000378, - 0x37a0000037e, - 0x37f00000380, + 0x37A0000037E, + 0x37F00000380, 0x38400000385, 0x38600000387, - 0x3880000038b, - 0x38c0000038d, - 0x38e000003a2, - 0x3a3000003e2, - 0x3f000000400, - 0x1d2600001d2b, - 0x1d5d00001d62, - 0x1d6600001d6b, - 0x1dbf00001dc0, - 0x1f0000001f16, - 0x1f1800001f1e, - 0x1f2000001f46, - 0x1f4800001f4e, - 0x1f5000001f58, - 0x1f5900001f5a, - 0x1f5b00001f5c, - 0x1f5d00001f5e, - 0x1f5f00001f7e, - 0x1f8000001fb5, - 0x1fb600001fc5, - 0x1fc600001fd4, - 0x1fd600001fdc, - 0x1fdd00001ff0, - 0x1ff200001ff5, - 0x1ff600001fff, + 0x3880000038B, + 0x38C0000038D, + 0x38E000003A2, + 0x3A3000003E2, + 0x3F000000400, + 0x1D2600001D2B, + 0x1D5D00001D62, + 0x1D6600001D6B, + 0x1DBF00001DC0, + 0x1F0000001F16, + 0x1F1800001F1E, + 0x1F2000001F46, + 0x1F4800001F4E, + 0x1F5000001F58, + 0x1F5900001F5A, + 0x1F5B00001F5C, + 0x1F5D00001F5E, + 0x1F5F00001F7E, + 0x1F8000001FB5, + 0x1FB600001FC5, + 0x1FC600001FD4, + 0x1FD600001FDC, + 0x1FDD00001FF0, + 0x1FF200001FF5, + 0x1FF600001FFF, 0x212600002127, - 0xab650000ab66, - 0x101400001018f, - 0x101a0000101a1, - 0x1d2000001d246, + 0xAB650000AB66, + 0x101400001018F, + 0x101A0000101A1, + 0x1D2000001D246, ), - 'Han': ( - 0x2e8000002e9a, - 0x2e9b00002ef4, - 0x2f0000002fd6, + "Han": ( + 0x2E8000002E9A, + 0x2E9B00002EF4, + 0x2F0000002FD6, 0x300500003006, 0x300700003008, - 0x30210000302a, - 0x30380000303c, - 0x340000004dc0, - 0x4e000000a000, - 0xf9000000fa6e, - 0xfa700000fada, - 0x16fe200016fe4, - 0x16ff000016ff2, - 0x200000002a6e0, - 0x2a7000002b73a, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2ebf00002ee5e, - 0x2f8000002fa1e, - 0x300000003134b, - 0x31350000323b0, + 0x30210000302A, + 0x30380000303C, + 0x340000004DC0, + 0x4E000000A000, + 0xF9000000FA6E, + 0xFA700000FADA, + 0x16FE200016FE4, + 0x16FF000016FF2, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x2F8000002FA1E, + 0x300000003134B, + 0x31350000323B0, ), - 'Hebrew': ( - 0x591000005c8, - 0x5d0000005eb, - 0x5ef000005f5, - 0xfb1d0000fb37, - 0xfb380000fb3d, - 0xfb3e0000fb3f, - 0xfb400000fb42, - 0xfb430000fb45, - 0xfb460000fb50, + "Hebrew": ( + 0x591000005C8, + 0x5D0000005EB, + 0x5EF000005F5, + 0xFB1D0000FB37, + 0xFB380000FB3D, + 0xFB3E0000FB3F, + 0xFB400000FB42, + 0xFB430000FB45, + 0xFB460000FB50, ), - 'Hiragana': ( + "Hiragana": ( 0x304100003097, - 0x309d000030a0, - 0x1b0010001b120, - 0x1b1320001b133, - 0x1b1500001b153, - 0x1f2000001f201, + 0x309D000030A0, + 0x1B0010001B120, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1F2000001F201, ), - 'Katakana': ( - 0x30a1000030fb, - 0x30fd00003100, - 0x31f000003200, - 0x32d0000032ff, + "Katakana": ( + 0x30A1000030FB, + 0x30FD00003100, + 0x31F000003200, + 0x32D0000032FF, 0x330000003358, - 0xff660000ff70, - 0xff710000ff9e, - 0x1aff00001aff4, - 0x1aff50001affc, - 0x1affd0001afff, - 0x1b0000001b001, - 0x1b1200001b123, - 0x1b1550001b156, - 0x1b1640001b168, + 0xFF660000FF70, + 0xFF710000FF9E, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B001, + 0x1B1200001B123, + 0x1B1550001B156, + 0x1B1640001B168, ), } joining_types = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x605: 85, - 0x608: 85, - 0x60b: 85, + 0xAD: 84, + 0x300: 84, + 0x301: 84, + 0x302: 84, + 0x303: 84, + 0x304: 84, + 0x305: 84, + 0x306: 84, + 0x307: 84, + 0x308: 84, + 0x309: 84, + 0x30A: 84, + 0x30B: 84, + 0x30C: 84, + 0x30D: 84, + 0x30E: 84, + 0x30F: 84, + 0x310: 84, + 0x311: 84, + 0x312: 84, + 0x313: 84, + 0x314: 84, + 0x315: 84, + 0x316: 84, + 0x317: 84, + 0x318: 84, + 0x319: 84, + 0x31A: 84, + 0x31B: 84, + 0x31C: 84, + 0x31D: 84, + 0x31E: 84, + 0x31F: 84, + 0x320: 84, + 0x321: 84, + 0x322: 84, + 0x323: 84, + 0x324: 84, + 0x325: 84, + 0x326: 84, + 0x327: 84, + 0x328: 84, + 0x329: 84, + 0x32A: 84, + 0x32B: 84, + 0x32C: 84, + 0x32D: 84, + 0x32E: 84, + 0x32F: 84, + 0x330: 84, + 0x331: 84, + 0x332: 84, + 0x333: 84, + 0x334: 84, + 0x335: 84, + 0x336: 84, + 0x337: 84, + 0x338: 84, + 0x339: 84, + 0x33A: 84, + 0x33B: 84, + 0x33C: 84, + 0x33D: 84, + 0x33E: 84, + 0x33F: 84, + 0x340: 84, + 0x341: 84, + 0x342: 84, + 0x343: 84, + 0x344: 84, + 0x345: 84, + 0x346: 84, + 0x347: 84, + 0x348: 84, + 0x349: 84, + 0x34A: 84, + 0x34B: 84, + 0x34C: 84, + 0x34D: 84, + 0x34E: 84, + 0x34F: 84, + 0x350: 84, + 0x351: 84, + 0x352: 84, + 0x353: 84, + 0x354: 84, + 0x355: 84, + 0x356: 84, + 0x357: 84, + 0x358: 84, + 0x359: 84, + 0x35A: 84, + 0x35B: 84, + 0x35C: 84, + 0x35D: 84, + 0x35E: 84, + 0x35F: 84, + 0x360: 84, + 0x361: 84, + 0x362: 84, + 0x363: 84, + 0x364: 84, + 0x365: 84, + 0x366: 84, + 0x367: 84, + 0x368: 84, + 0x369: 84, + 0x36A: 84, + 0x36B: 84, + 0x36C: 84, + 0x36D: 84, + 0x36E: 84, + 0x36F: 84, + 0x483: 84, + 0x484: 84, + 0x485: 84, + 0x486: 84, + 0x487: 84, + 0x488: 84, + 0x489: 84, + 0x591: 84, + 0x592: 84, + 0x593: 84, + 0x594: 84, + 0x595: 84, + 0x596: 84, + 0x597: 84, + 0x598: 84, + 0x599: 84, + 0x59A: 84, + 0x59B: 84, + 0x59C: 84, + 0x59D: 84, + 0x59E: 84, + 0x59F: 84, + 0x5A0: 84, + 0x5A1: 84, + 0x5A2: 84, + 0x5A3: 84, + 0x5A4: 84, + 0x5A5: 84, + 0x5A6: 84, + 0x5A7: 84, + 0x5A8: 84, + 0x5A9: 84, + 0x5AA: 84, + 0x5AB: 84, + 0x5AC: 84, + 0x5AD: 84, + 0x5AE: 84, + 0x5AF: 84, + 0x5B0: 84, + 0x5B1: 84, + 0x5B2: 84, + 0x5B3: 84, + 0x5B4: 84, + 0x5B5: 84, + 0x5B6: 84, + 0x5B7: 84, + 0x5B8: 84, + 0x5B9: 84, + 0x5BA: 84, + 0x5BB: 84, + 0x5BC: 84, + 0x5BD: 84, + 0x5BF: 84, + 0x5C1: 84, + 0x5C2: 84, + 0x5C4: 84, + 0x5C5: 84, + 0x5C7: 84, + 0x610: 84, + 0x611: 84, + 0x612: 84, + 0x613: 84, + 0x614: 84, + 0x615: 84, + 0x616: 84, + 0x617: 84, + 0x618: 84, + 0x619: 84, + 0x61A: 84, + 0x61C: 84, 0x620: 68, - 0x621: 85, 0x622: 82, 0x623: 82, 0x624: 82, @@ -119,12 +293,12 @@ 0x627: 82, 0x628: 68, 0x629: 82, - 0x62a: 68, - 0x62b: 68, - 0x62c: 68, - 0x62d: 68, - 0x62e: 68, - 0x62f: 82, + 0x62A: 68, + 0x62B: 68, + 0x62C: 68, + 0x62D: 68, + 0x62E: 68, + 0x62F: 82, 0x630: 82, 0x631: 82, 0x632: 82, @@ -135,12 +309,12 @@ 0x637: 68, 0x638: 68, 0x639: 68, - 0x63a: 68, - 0x63b: 68, - 0x63c: 68, - 0x63d: 68, - 0x63e: 68, - 0x63f: 68, + 0x63A: 68, + 0x63B: 68, + 0x63C: 68, + 0x63D: 68, + 0x63E: 68, + 0x63F: 68, 0x640: 67, 0x641: 68, 0x642: 68, @@ -151,24 +325,45 @@ 0x647: 68, 0x648: 82, 0x649: 68, - 0x64a: 68, - 0x66e: 68, - 0x66f: 68, + 0x64A: 68, + 0x64B: 84, + 0x64C: 84, + 0x64D: 84, + 0x64E: 84, + 0x64F: 84, + 0x650: 84, + 0x651: 84, + 0x652: 84, + 0x653: 84, + 0x654: 84, + 0x655: 84, + 0x656: 84, + 0x657: 84, + 0x658: 84, + 0x659: 84, + 0x65A: 84, + 0x65B: 84, + 0x65C: 84, + 0x65D: 84, + 0x65E: 84, + 0x65F: 84, + 0x66E: 68, + 0x66F: 68, + 0x670: 84, 0x671: 82, 0x672: 82, 0x673: 82, - 0x674: 85, 0x675: 82, 0x676: 82, 0x677: 82, 0x678: 68, 0x679: 68, - 0x67a: 68, - 0x67b: 68, - 0x67c: 68, - 0x67d: 68, - 0x67e: 68, - 0x67f: 68, + 0x67A: 68, + 0x67B: 68, + 0x67C: 68, + 0x67D: 68, + 0x67E: 68, + 0x67F: 68, 0x680: 68, 0x681: 68, 0x682: 68, @@ -179,12 +374,12 @@ 0x687: 68, 0x688: 82, 0x689: 82, - 0x68a: 82, - 0x68b: 82, - 0x68c: 82, - 0x68d: 82, - 0x68e: 82, - 0x68f: 82, + 0x68A: 82, + 0x68B: 82, + 0x68C: 82, + 0x68D: 82, + 0x68E: 82, + 0x68F: 82, 0x690: 82, 0x691: 82, 0x692: 82, @@ -195,74 +390,93 @@ 0x697: 82, 0x698: 82, 0x699: 82, - 0x69a: 68, - 0x69b: 68, - 0x69c: 68, - 0x69d: 68, - 0x69e: 68, - 0x69f: 68, - 0x6a0: 68, - 0x6a1: 68, - 0x6a2: 68, - 0x6a3: 68, - 0x6a4: 68, - 0x6a5: 68, - 0x6a6: 68, - 0x6a7: 68, - 0x6a8: 68, - 0x6a9: 68, - 0x6aa: 68, - 0x6ab: 68, - 0x6ac: 68, - 0x6ad: 68, - 0x6ae: 68, - 0x6af: 68, - 0x6b0: 68, - 0x6b1: 68, - 0x6b2: 68, - 0x6b3: 68, - 0x6b4: 68, - 0x6b5: 68, - 0x6b6: 68, - 0x6b7: 68, - 0x6b8: 68, - 0x6b9: 68, - 0x6ba: 68, - 0x6bb: 68, - 0x6bc: 68, - 0x6bd: 68, - 0x6be: 68, - 0x6bf: 68, - 0x6c0: 82, - 0x6c1: 68, - 0x6c2: 68, - 0x6c3: 82, - 0x6c4: 82, - 0x6c5: 82, - 0x6c6: 82, - 0x6c7: 82, - 0x6c8: 82, - 0x6c9: 82, - 0x6ca: 82, - 0x6cb: 82, - 0x6cc: 68, - 0x6cd: 82, - 0x6ce: 68, - 0x6cf: 82, - 0x6d0: 68, - 0x6d1: 68, - 0x6d2: 82, - 0x6d3: 82, - 0x6d5: 82, - 0x6dd: 85, - 0x6ee: 82, - 0x6ef: 82, - 0x6fa: 68, - 0x6fb: 68, - 0x6fc: 68, - 0x6ff: 68, - 0x70f: 84, + 0x69A: 68, + 0x69B: 68, + 0x69C: 68, + 0x69D: 68, + 0x69E: 68, + 0x69F: 68, + 0x6A0: 68, + 0x6A1: 68, + 0x6A2: 68, + 0x6A3: 68, + 0x6A4: 68, + 0x6A5: 68, + 0x6A6: 68, + 0x6A7: 68, + 0x6A8: 68, + 0x6A9: 68, + 0x6AA: 68, + 0x6AB: 68, + 0x6AC: 68, + 0x6AD: 68, + 0x6AE: 68, + 0x6AF: 68, + 0x6B0: 68, + 0x6B1: 68, + 0x6B2: 68, + 0x6B3: 68, + 0x6B4: 68, + 0x6B5: 68, + 0x6B6: 68, + 0x6B7: 68, + 0x6B8: 68, + 0x6B9: 68, + 0x6BA: 68, + 0x6BB: 68, + 0x6BC: 68, + 0x6BD: 68, + 0x6BE: 68, + 0x6BF: 68, + 0x6C0: 82, + 0x6C1: 68, + 0x6C2: 68, + 0x6C3: 82, + 0x6C4: 82, + 0x6C5: 82, + 0x6C6: 82, + 0x6C7: 82, + 0x6C8: 82, + 0x6C9: 82, + 0x6CA: 82, + 0x6CB: 82, + 0x6CC: 68, + 0x6CD: 82, + 0x6CE: 68, + 0x6CF: 82, + 0x6D0: 68, + 0x6D1: 68, + 0x6D2: 82, + 0x6D3: 82, + 0x6D5: 82, + 0x6D6: 84, + 0x6D7: 84, + 0x6D8: 84, + 0x6D9: 84, + 0x6DA: 84, + 0x6DB: 84, + 0x6DC: 84, + 0x6DF: 84, + 0x6E0: 84, + 0x6E1: 84, + 0x6E2: 84, + 0x6E3: 84, + 0x6E4: 84, + 0x6E7: 84, + 0x6E8: 84, + 0x6EA: 84, + 0x6EB: 84, + 0x6EC: 84, + 0x6ED: 84, + 0x6EE: 82, + 0x6EF: 82, + 0x6FA: 68, + 0x6FB: 68, + 0x6FC: 68, + 0x6FF: 68, + 0x70F: 84, 0x710: 82, + 0x711: 84, 0x712: 68, 0x713: 68, 0x714: 68, @@ -271,12 +485,12 @@ 0x717: 82, 0x718: 82, 0x719: 82, - 0x71a: 68, - 0x71b: 68, - 0x71c: 68, - 0x71d: 68, - 0x71e: 82, - 0x71f: 68, + 0x71A: 68, + 0x71B: 68, + 0x71C: 68, + 0x71D: 68, + 0x71E: 82, + 0x71F: 68, 0x720: 68, 0x721: 68, 0x722: 68, @@ -287,15 +501,42 @@ 0x727: 68, 0x728: 82, 0x729: 68, - 0x72a: 82, - 0x72b: 68, - 0x72c: 82, - 0x72d: 68, - 0x72e: 68, - 0x72f: 82, - 0x74d: 82, - 0x74e: 68, - 0x74f: 68, + 0x72A: 82, + 0x72B: 68, + 0x72C: 82, + 0x72D: 68, + 0x72E: 68, + 0x72F: 82, + 0x730: 84, + 0x731: 84, + 0x732: 84, + 0x733: 84, + 0x734: 84, + 0x735: 84, + 0x736: 84, + 0x737: 84, + 0x738: 84, + 0x739: 84, + 0x73A: 84, + 0x73B: 84, + 0x73C: 84, + 0x73D: 84, + 0x73E: 84, + 0x73F: 84, + 0x740: 84, + 0x741: 84, + 0x742: 84, + 0x743: 84, + 0x744: 84, + 0x745: 84, + 0x746: 84, + 0x747: 84, + 0x748: 84, + 0x749: 84, + 0x74A: 84, + 0x74D: 82, + 0x74E: 68, + 0x74F: 68, 0x750: 68, 0x751: 68, 0x752: 68, @@ -306,12 +547,12 @@ 0x757: 68, 0x758: 68, 0x759: 82, - 0x75a: 82, - 0x75b: 82, - 0x75c: 68, - 0x75d: 68, - 0x75e: 68, - 0x75f: 68, + 0x75A: 82, + 0x75B: 82, + 0x75C: 68, + 0x75D: 68, + 0x75E: 68, + 0x75F: 68, 0x760: 68, 0x761: 68, 0x762: 68, @@ -322,12 +563,12 @@ 0x767: 68, 0x768: 68, 0x769: 68, - 0x76a: 68, - 0x76b: 82, - 0x76c: 82, - 0x76d: 68, - 0x76e: 68, - 0x76f: 68, + 0x76A: 68, + 0x76B: 82, + 0x76C: 82, + 0x76D: 68, + 0x76E: 68, + 0x76F: 68, 0x770: 68, 0x771: 82, 0x772: 68, @@ -338,46 +579,88 @@ 0x777: 68, 0x778: 82, 0x779: 82, - 0x77a: 68, - 0x77b: 68, - 0x77c: 68, - 0x77d: 68, - 0x77e: 68, - 0x77f: 68, - 0x7ca: 68, - 0x7cb: 68, - 0x7cc: 68, - 0x7cd: 68, - 0x7ce: 68, - 0x7cf: 68, - 0x7d0: 68, - 0x7d1: 68, - 0x7d2: 68, - 0x7d3: 68, - 0x7d4: 68, - 0x7d5: 68, - 0x7d6: 68, - 0x7d7: 68, - 0x7d8: 68, - 0x7d9: 68, - 0x7da: 68, - 0x7db: 68, - 0x7dc: 68, - 0x7dd: 68, - 0x7de: 68, - 0x7df: 68, - 0x7e0: 68, - 0x7e1: 68, - 0x7e2: 68, - 0x7e3: 68, - 0x7e4: 68, - 0x7e5: 68, - 0x7e6: 68, - 0x7e7: 68, - 0x7e8: 68, - 0x7e9: 68, - 0x7ea: 68, - 0x7fa: 67, + 0x77A: 68, + 0x77B: 68, + 0x77C: 68, + 0x77D: 68, + 0x77E: 68, + 0x77F: 68, + 0x7A6: 84, + 0x7A7: 84, + 0x7A8: 84, + 0x7A9: 84, + 0x7AA: 84, + 0x7AB: 84, + 0x7AC: 84, + 0x7AD: 84, + 0x7AE: 84, + 0x7AF: 84, + 0x7B0: 84, + 0x7CA: 68, + 0x7CB: 68, + 0x7CC: 68, + 0x7CD: 68, + 0x7CE: 68, + 0x7CF: 68, + 0x7D0: 68, + 0x7D1: 68, + 0x7D2: 68, + 0x7D3: 68, + 0x7D4: 68, + 0x7D5: 68, + 0x7D6: 68, + 0x7D7: 68, + 0x7D8: 68, + 0x7D9: 68, + 0x7DA: 68, + 0x7DB: 68, + 0x7DC: 68, + 0x7DD: 68, + 0x7DE: 68, + 0x7DF: 68, + 0x7E0: 68, + 0x7E1: 68, + 0x7E2: 68, + 0x7E3: 68, + 0x7E4: 68, + 0x7E5: 68, + 0x7E6: 68, + 0x7E7: 68, + 0x7E8: 68, + 0x7E9: 68, + 0x7EA: 68, + 0x7EB: 84, + 0x7EC: 84, + 0x7ED: 84, + 0x7EE: 84, + 0x7EF: 84, + 0x7F0: 84, + 0x7F1: 84, + 0x7F2: 84, + 0x7F3: 84, + 0x7FA: 67, + 0x7FD: 84, + 0x816: 84, + 0x817: 84, + 0x818: 84, + 0x819: 84, + 0x81B: 84, + 0x81C: 84, + 0x81D: 84, + 0x81E: 84, + 0x81F: 84, + 0x820: 84, + 0x821: 84, + 0x822: 84, + 0x823: 84, + 0x825: 84, + 0x826: 84, + 0x827: 84, + 0x829: 84, + 0x82A: 84, + 0x82B: 84, + 0x82C: 84, + 0x82D: 84, 0x840: 82, 0x841: 68, 0x842: 68, @@ -388,12 +671,12 @@ 0x847: 82, 0x848: 68, 0x849: 82, - 0x84a: 68, - 0x84b: 68, - 0x84c: 68, - 0x84d: 68, - 0x84e: 68, - 0x84f: 68, + 0x84A: 68, + 0x84B: 68, + 0x84C: 68, + 0x84D: 68, + 0x84E: 68, + 0x84F: 68, 0x850: 68, 0x851: 68, 0x852: 68, @@ -403,17 +686,18 @@ 0x856: 82, 0x857: 82, 0x858: 82, + 0x859: 84, + 0x85A: 84, + 0x85B: 84, 0x860: 68, - 0x861: 85, 0x862: 68, 0x863: 68, 0x864: 68, 0x865: 68, - 0x866: 85, 0x867: 82, 0x868: 68, 0x869: 82, - 0x86a: 82, + 0x86A: 82, 0x870: 82, 0x871: 82, 0x872: 82, @@ -424,12 +708,12 @@ 0x877: 82, 0x878: 82, 0x879: 82, - 0x87a: 82, - 0x87b: 82, - 0x87c: 82, - 0x87d: 82, - 0x87e: 82, - 0x87f: 82, + 0x87A: 82, + 0x87B: 82, + 0x87C: 82, + 0x87D: 82, + 0x87E: 82, + 0x87F: 82, 0x880: 82, 0x881: 82, 0x882: 82, @@ -437,62 +721,411 @@ 0x884: 67, 0x885: 67, 0x886: 68, - 0x887: 85, - 0x888: 85, 0x889: 68, - 0x88a: 68, - 0x88b: 68, - 0x88c: 68, - 0x88d: 68, - 0x88e: 82, - 0x890: 85, - 0x891: 85, - 0x8a0: 68, - 0x8a1: 68, - 0x8a2: 68, - 0x8a3: 68, - 0x8a4: 68, - 0x8a5: 68, - 0x8a6: 68, - 0x8a7: 68, - 0x8a8: 68, - 0x8a9: 68, - 0x8aa: 82, - 0x8ab: 82, - 0x8ac: 82, - 0x8ad: 85, - 0x8ae: 82, - 0x8af: 68, - 0x8b0: 68, - 0x8b1: 82, - 0x8b2: 82, - 0x8b3: 68, - 0x8b4: 68, - 0x8b5: 68, - 0x8b6: 68, - 0x8b7: 68, - 0x8b8: 68, - 0x8b9: 82, - 0x8ba: 68, - 0x8bb: 68, - 0x8bc: 68, - 0x8bd: 68, - 0x8be: 68, - 0x8bf: 68, - 0x8c0: 68, - 0x8c1: 68, - 0x8c2: 68, - 0x8c3: 68, - 0x8c4: 68, - 0x8c5: 68, - 0x8c6: 68, - 0x8c7: 68, - 0x8c8: 68, - 0x8e2: 85, - 0x1806: 85, + 0x88A: 68, + 0x88B: 68, + 0x88C: 68, + 0x88D: 68, + 0x88E: 82, + 0x898: 84, + 0x899: 84, + 0x89A: 84, + 0x89B: 84, + 0x89C: 84, + 0x89D: 84, + 0x89E: 84, + 0x89F: 84, + 0x8A0: 68, + 0x8A1: 68, + 0x8A2: 68, + 0x8A3: 68, + 0x8A4: 68, + 0x8A5: 68, + 0x8A6: 68, + 0x8A7: 68, + 0x8A8: 68, + 0x8A9: 68, + 0x8AA: 82, + 0x8AB: 82, + 0x8AC: 82, + 0x8AE: 82, + 0x8AF: 68, + 0x8B0: 68, + 0x8B1: 82, + 0x8B2: 82, + 0x8B3: 68, + 0x8B4: 68, + 0x8B5: 68, + 0x8B6: 68, + 0x8B7: 68, + 0x8B8: 68, + 0x8B9: 82, + 0x8BA: 68, + 0x8BB: 68, + 0x8BC: 68, + 0x8BD: 68, + 0x8BE: 68, + 0x8BF: 68, + 0x8C0: 68, + 0x8C1: 68, + 0x8C2: 68, + 0x8C3: 68, + 0x8C4: 68, + 0x8C5: 68, + 0x8C6: 68, + 0x8C7: 68, + 0x8C8: 68, + 0x8CA: 84, + 0x8CB: 84, + 0x8CC: 84, + 0x8CD: 84, + 0x8CE: 84, + 0x8CF: 84, + 0x8D0: 84, + 0x8D1: 84, + 0x8D2: 84, + 0x8D3: 84, + 0x8D4: 84, + 0x8D5: 84, + 0x8D6: 84, + 0x8D7: 84, + 0x8D8: 84, + 0x8D9: 84, + 0x8DA: 84, + 0x8DB: 84, + 0x8DC: 84, + 0x8DD: 84, + 0x8DE: 84, + 0x8DF: 84, + 0x8E0: 84, + 0x8E1: 84, + 0x8E3: 84, + 0x8E4: 84, + 0x8E5: 84, + 0x8E6: 84, + 0x8E7: 84, + 0x8E8: 84, + 0x8E9: 84, + 0x8EA: 84, + 0x8EB: 84, + 0x8EC: 84, + 0x8ED: 84, + 0x8EE: 84, + 0x8EF: 84, + 0x8F0: 84, + 0x8F1: 84, + 0x8F2: 84, + 0x8F3: 84, + 0x8F4: 84, + 0x8F5: 84, + 0x8F6: 84, + 0x8F7: 84, + 0x8F8: 84, + 0x8F9: 84, + 0x8FA: 84, + 0x8FB: 84, + 0x8FC: 84, + 0x8FD: 84, + 0x8FE: 84, + 0x8FF: 84, + 0x900: 84, + 0x901: 84, + 0x902: 84, + 0x93A: 84, + 0x93C: 84, + 0x941: 84, + 0x942: 84, + 0x943: 84, + 0x944: 84, + 0x945: 84, + 0x946: 84, + 0x947: 84, + 0x948: 84, + 0x94D: 84, + 0x951: 84, + 0x952: 84, + 0x953: 84, + 0x954: 84, + 0x955: 84, + 0x956: 84, + 0x957: 84, + 0x962: 84, + 0x963: 84, + 0x981: 84, + 0x9BC: 84, + 0x9C1: 84, + 0x9C2: 84, + 0x9C3: 84, + 0x9C4: 84, + 0x9CD: 84, + 0x9E2: 84, + 0x9E3: 84, + 0x9FE: 84, + 0xA01: 84, + 0xA02: 84, + 0xA3C: 84, + 0xA41: 84, + 0xA42: 84, + 0xA47: 84, + 0xA48: 84, + 0xA4B: 84, + 0xA4C: 84, + 0xA4D: 84, + 0xA51: 84, + 0xA70: 84, + 0xA71: 84, + 0xA75: 84, + 0xA81: 84, + 0xA82: 84, + 0xABC: 84, + 0xAC1: 84, + 0xAC2: 84, + 0xAC3: 84, + 0xAC4: 84, + 0xAC5: 84, + 0xAC7: 84, + 0xAC8: 84, + 0xACD: 84, + 0xAE2: 84, + 0xAE3: 84, + 0xAFA: 84, + 0xAFB: 84, + 0xAFC: 84, + 0xAFD: 84, + 0xAFE: 84, + 0xAFF: 84, + 0xB01: 84, + 0xB3C: 84, + 0xB3F: 84, + 0xB41: 84, + 0xB42: 84, + 0xB43: 84, + 0xB44: 84, + 0xB4D: 84, + 0xB55: 84, + 0xB56: 84, + 0xB62: 84, + 0xB63: 84, + 0xB82: 84, + 0xBC0: 84, + 0xBCD: 84, + 0xC00: 84, + 0xC04: 84, + 0xC3C: 84, + 0xC3E: 84, + 0xC3F: 84, + 0xC40: 84, + 0xC46: 84, + 0xC47: 84, + 0xC48: 84, + 0xC4A: 84, + 0xC4B: 84, + 0xC4C: 84, + 0xC4D: 84, + 0xC55: 84, + 0xC56: 84, + 0xC62: 84, + 0xC63: 84, + 0xC81: 84, + 0xCBC: 84, + 0xCBF: 84, + 0xCC6: 84, + 0xCCC: 84, + 0xCCD: 84, + 0xCE2: 84, + 0xCE3: 84, + 0xD00: 84, + 0xD01: 84, + 0xD3B: 84, + 0xD3C: 84, + 0xD41: 84, + 0xD42: 84, + 0xD43: 84, + 0xD44: 84, + 0xD4D: 84, + 0xD62: 84, + 0xD63: 84, + 0xD81: 84, + 0xDCA: 84, + 0xDD2: 84, + 0xDD3: 84, + 0xDD4: 84, + 0xDD6: 84, + 0xE31: 84, + 0xE34: 84, + 0xE35: 84, + 0xE36: 84, + 0xE37: 84, + 0xE38: 84, + 0xE39: 84, + 0xE3A: 84, + 0xE47: 84, + 0xE48: 84, + 0xE49: 84, + 0xE4A: 84, + 0xE4B: 84, + 0xE4C: 84, + 0xE4D: 84, + 0xE4E: 84, + 0xEB1: 84, + 0xEB4: 84, + 0xEB5: 84, + 0xEB6: 84, + 0xEB7: 84, + 0xEB8: 84, + 0xEB9: 84, + 0xEBA: 84, + 0xEBB: 84, + 0xEBC: 84, + 0xEC8: 84, + 0xEC9: 84, + 0xECA: 84, + 0xECB: 84, + 0xECC: 84, + 0xECD: 84, + 0xECE: 84, + 0xF18: 84, + 0xF19: 84, + 0xF35: 84, + 0xF37: 84, + 0xF39: 84, + 0xF71: 84, + 0xF72: 84, + 0xF73: 84, + 0xF74: 84, + 0xF75: 84, + 0xF76: 84, + 0xF77: 84, + 0xF78: 84, + 0xF79: 84, + 0xF7A: 84, + 0xF7B: 84, + 0xF7C: 84, + 0xF7D: 84, + 0xF7E: 84, + 0xF80: 84, + 0xF81: 84, + 0xF82: 84, + 0xF83: 84, + 0xF84: 84, + 0xF86: 84, + 0xF87: 84, + 0xF8D: 84, + 0xF8E: 84, + 0xF8F: 84, + 0xF90: 84, + 0xF91: 84, + 0xF92: 84, + 0xF93: 84, + 0xF94: 84, + 0xF95: 84, + 0xF96: 84, + 0xF97: 84, + 0xF99: 84, + 0xF9A: 84, + 0xF9B: 84, + 0xF9C: 84, + 0xF9D: 84, + 0xF9E: 84, + 0xF9F: 84, + 0xFA0: 84, + 0xFA1: 84, + 0xFA2: 84, + 0xFA3: 84, + 0xFA4: 84, + 0xFA5: 84, + 0xFA6: 84, + 0xFA7: 84, + 0xFA8: 84, + 0xFA9: 84, + 0xFAA: 84, + 0xFAB: 84, + 0xFAC: 84, + 0xFAD: 84, + 0xFAE: 84, + 0xFAF: 84, + 0xFB0: 84, + 0xFB1: 84, + 0xFB2: 84, + 0xFB3: 84, + 0xFB4: 84, + 0xFB5: 84, + 0xFB6: 84, + 0xFB7: 84, + 0xFB8: 84, + 0xFB9: 84, + 0xFBA: 84, + 0xFBB: 84, + 0xFBC: 84, + 0xFC6: 84, + 0x102D: 84, + 0x102E: 84, + 0x102F: 84, + 0x1030: 84, + 0x1032: 84, + 0x1033: 84, + 0x1034: 84, + 0x1035: 84, + 0x1036: 84, + 0x1037: 84, + 0x1039: 84, + 0x103A: 84, + 0x103D: 84, + 0x103E: 84, + 0x1058: 84, + 0x1059: 84, + 0x105E: 84, + 0x105F: 84, + 0x1060: 84, + 0x1071: 84, + 0x1072: 84, + 0x1073: 84, + 0x1074: 84, + 0x1082: 84, + 0x1085: 84, + 0x1086: 84, + 0x108D: 84, + 0x109D: 84, + 0x135D: 84, + 0x135E: 84, + 0x135F: 84, + 0x1712: 84, + 0x1713: 84, + 0x1714: 84, + 0x1732: 84, + 0x1733: 84, + 0x1752: 84, + 0x1753: 84, + 0x1772: 84, + 0x1773: 84, + 0x17B4: 84, + 0x17B5: 84, + 0x17B7: 84, + 0x17B8: 84, + 0x17B9: 84, + 0x17BA: 84, + 0x17BB: 84, + 0x17BC: 84, + 0x17BD: 84, + 0x17C6: 84, + 0x17C9: 84, + 0x17CA: 84, + 0x17CB: 84, + 0x17CC: 84, + 0x17CD: 84, + 0x17CE: 84, + 0x17CF: 84, + 0x17D0: 84, + 0x17D1: 84, + 0x17D2: 84, + 0x17D3: 84, + 0x17DD: 84, 0x1807: 68, - 0x180a: 67, - 0x180e: 85, + 0x180A: 67, + 0x180B: 84, + 0x180C: 84, + 0x180D: 84, + 0x180F: 84, 0x1820: 68, 0x1821: 68, 0x1822: 68, @@ -503,12 +1136,12 @@ 0x1827: 68, 0x1828: 68, 0x1829: 68, - 0x182a: 68, - 0x182b: 68, - 0x182c: 68, - 0x182d: 68, - 0x182e: 68, - 0x182f: 68, + 0x182A: 68, + 0x182B: 68, + 0x182C: 68, + 0x182D: 68, + 0x182E: 68, + 0x182F: 68, 0x1830: 68, 0x1831: 68, 0x1832: 68, @@ -519,12 +1152,12 @@ 0x1837: 68, 0x1838: 68, 0x1839: 68, - 0x183a: 68, - 0x183b: 68, - 0x183c: 68, - 0x183d: 68, - 0x183e: 68, - 0x183f: 68, + 0x183A: 68, + 0x183B: 68, + 0x183C: 68, + 0x183D: 68, + 0x183E: 68, + 0x183F: 68, 0x1840: 68, 0x1841: 68, 0x1842: 68, @@ -535,12 +1168,12 @@ 0x1847: 68, 0x1848: 68, 0x1849: 68, - 0x184a: 68, - 0x184b: 68, - 0x184c: 68, - 0x184d: 68, - 0x184e: 68, - 0x184f: 68, + 0x184A: 68, + 0x184B: 68, + 0x184C: 68, + 0x184D: 68, + 0x184E: 68, + 0x184F: 68, 0x1850: 68, 0x1851: 68, 0x1852: 68, @@ -551,12 +1184,12 @@ 0x1857: 68, 0x1858: 68, 0x1859: 68, - 0x185a: 68, - 0x185b: 68, - 0x185c: 68, - 0x185d: 68, - 0x185e: 68, - 0x185f: 68, + 0x185A: 68, + 0x185B: 68, + 0x185C: 68, + 0x185D: 68, + 0x185E: 68, + 0x185F: 68, 0x1860: 68, 0x1861: 68, 0x1862: 68, @@ -567,12 +1200,12 @@ 0x1867: 68, 0x1868: 68, 0x1869: 68, - 0x186a: 68, - 0x186b: 68, - 0x186c: 68, - 0x186d: 68, - 0x186e: 68, - 0x186f: 68, + 0x186A: 68, + 0x186B: 68, + 0x186C: 68, + 0x186D: 68, + 0x186E: 68, + 0x186F: 68, 0x1870: 68, 0x1871: 68, 0x1872: 68, @@ -582,22 +1215,17 @@ 0x1876: 68, 0x1877: 68, 0x1878: 68, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, 0x1885: 84, 0x1886: 84, 0x1887: 68, 0x1888: 68, 0x1889: 68, - 0x188a: 68, - 0x188b: 68, - 0x188c: 68, - 0x188d: 68, - 0x188e: 68, - 0x188f: 68, + 0x188A: 68, + 0x188B: 68, + 0x188C: 68, + 0x188D: 68, + 0x188E: 68, + 0x188F: 68, 0x1890: 68, 0x1891: 68, 0x1892: 68, @@ -608,1543 +1236,3008 @@ 0x1897: 68, 0x1898: 68, 0x1899: 68, - 0x189a: 68, - 0x189b: 68, - 0x189c: 68, - 0x189d: 68, - 0x189e: 68, - 0x189f: 68, - 0x18a0: 68, - 0x18a1: 68, - 0x18a2: 68, - 0x18a3: 68, - 0x18a4: 68, - 0x18a5: 68, - 0x18a6: 68, - 0x18a7: 68, - 0x18a8: 68, - 0x18aa: 68, - 0x200c: 85, - 0x200d: 67, - 0x202f: 85, - 0x2066: 85, - 0x2067: 85, - 0x2068: 85, - 0x2069: 85, - 0xa840: 68, - 0xa841: 68, - 0xa842: 68, - 0xa843: 68, - 0xa844: 68, - 0xa845: 68, - 0xa846: 68, - 0xa847: 68, - 0xa848: 68, - 0xa849: 68, - 0xa84a: 68, - 0xa84b: 68, - 0xa84c: 68, - 0xa84d: 68, - 0xa84e: 68, - 0xa84f: 68, - 0xa850: 68, - 0xa851: 68, - 0xa852: 68, - 0xa853: 68, - 0xa854: 68, - 0xa855: 68, - 0xa856: 68, - 0xa857: 68, - 0xa858: 68, - 0xa859: 68, - 0xa85a: 68, - 0xa85b: 68, - 0xa85c: 68, - 0xa85d: 68, - 0xa85e: 68, - 0xa85f: 68, - 0xa860: 68, - 0xa861: 68, - 0xa862: 68, - 0xa863: 68, - 0xa864: 68, - 0xa865: 68, - 0xa866: 68, - 0xa867: 68, - 0xa868: 68, - 0xa869: 68, - 0xa86a: 68, - 0xa86b: 68, - 0xa86c: 68, - 0xa86d: 68, - 0xa86e: 68, - 0xa86f: 68, - 0xa870: 68, - 0xa871: 68, - 0xa872: 76, - 0xa873: 85, - 0x10ac0: 68, - 0x10ac1: 68, - 0x10ac2: 68, - 0x10ac3: 68, - 0x10ac4: 68, - 0x10ac5: 82, - 0x10ac6: 85, - 0x10ac7: 82, - 0x10ac8: 85, - 0x10ac9: 82, - 0x10aca: 82, - 0x10acb: 85, - 0x10acc: 85, - 0x10acd: 76, - 0x10ace: 82, - 0x10acf: 82, - 0x10ad0: 82, - 0x10ad1: 82, - 0x10ad2: 82, - 0x10ad3: 68, - 0x10ad4: 68, - 0x10ad5: 68, - 0x10ad6: 68, - 0x10ad7: 76, - 0x10ad8: 68, - 0x10ad9: 68, - 0x10ada: 68, - 0x10adb: 68, - 0x10adc: 68, - 0x10add: 82, - 0x10ade: 68, - 0x10adf: 68, - 0x10ae0: 68, - 0x10ae1: 82, - 0x10ae2: 85, - 0x10ae3: 85, - 0x10ae4: 82, - 0x10aeb: 68, - 0x10aec: 68, - 0x10aed: 68, - 0x10aee: 68, - 0x10aef: 82, - 0x10b80: 68, - 0x10b81: 82, - 0x10b82: 68, - 0x10b83: 82, - 0x10b84: 82, - 0x10b85: 82, - 0x10b86: 68, - 0x10b87: 68, - 0x10b88: 68, - 0x10b89: 82, - 0x10b8a: 68, - 0x10b8b: 68, - 0x10b8c: 82, - 0x10b8d: 68, - 0x10b8e: 82, - 0x10b8f: 82, - 0x10b90: 68, - 0x10b91: 82, - 0x10ba9: 82, - 0x10baa: 82, - 0x10bab: 82, - 0x10bac: 82, - 0x10bad: 68, - 0x10bae: 68, - 0x10baf: 85, - 0x10d00: 76, - 0x10d01: 68, - 0x10d02: 68, - 0x10d03: 68, - 0x10d04: 68, - 0x10d05: 68, - 0x10d06: 68, - 0x10d07: 68, - 0x10d08: 68, - 0x10d09: 68, - 0x10d0a: 68, - 0x10d0b: 68, - 0x10d0c: 68, - 0x10d0d: 68, - 0x10d0e: 68, - 0x10d0f: 68, - 0x10d10: 68, - 0x10d11: 68, - 0x10d12: 68, - 0x10d13: 68, - 0x10d14: 68, - 0x10d15: 68, - 0x10d16: 68, - 0x10d17: 68, - 0x10d18: 68, - 0x10d19: 68, - 0x10d1a: 68, - 0x10d1b: 68, - 0x10d1c: 68, - 0x10d1d: 68, - 0x10d1e: 68, - 0x10d1f: 68, - 0x10d20: 68, - 0x10d21: 68, - 0x10d22: 82, - 0x10d23: 68, - 0x10f30: 68, - 0x10f31: 68, - 0x10f32: 68, - 0x10f33: 82, - 0x10f34: 68, - 0x10f35: 68, - 0x10f36: 68, - 0x10f37: 68, - 0x10f38: 68, - 0x10f39: 68, - 0x10f3a: 68, - 0x10f3b: 68, - 0x10f3c: 68, - 0x10f3d: 68, - 0x10f3e: 68, - 0x10f3f: 68, - 0x10f40: 68, - 0x10f41: 68, - 0x10f42: 68, - 0x10f43: 68, - 0x10f44: 68, - 0x10f45: 85, - 0x10f51: 68, - 0x10f52: 68, - 0x10f53: 68, - 0x10f54: 82, - 0x10f70: 68, - 0x10f71: 68, - 0x10f72: 68, - 0x10f73: 68, - 0x10f74: 82, - 0x10f75: 82, - 0x10f76: 68, - 0x10f77: 68, - 0x10f78: 68, - 0x10f79: 68, - 0x10f7a: 68, - 0x10f7b: 68, - 0x10f7c: 68, - 0x10f7d: 68, - 0x10f7e: 68, - 0x10f7f: 68, - 0x10f80: 68, - 0x10f81: 68, - 0x10fb0: 68, - 0x10fb1: 85, - 0x10fb2: 68, - 0x10fb3: 68, - 0x10fb4: 82, - 0x10fb5: 82, - 0x10fb6: 82, - 0x10fb7: 85, - 0x10fb8: 68, - 0x10fb9: 82, - 0x10fba: 82, - 0x10fbb: 68, - 0x10fbc: 68, - 0x10fbd: 82, - 0x10fbe: 68, - 0x10fbf: 68, - 0x10fc0: 85, - 0x10fc1: 68, - 0x10fc2: 82, - 0x10fc3: 82, - 0x10fc4: 68, - 0x10fc5: 85, - 0x10fc6: 85, - 0x10fc7: 85, - 0x10fc8: 85, - 0x10fc9: 82, - 0x10fca: 68, - 0x10fcb: 76, - 0x110bd: 85, - 0x110cd: 85, - 0x1e900: 68, - 0x1e901: 68, - 0x1e902: 68, - 0x1e903: 68, - 0x1e904: 68, - 0x1e905: 68, - 0x1e906: 68, - 0x1e907: 68, - 0x1e908: 68, - 0x1e909: 68, - 0x1e90a: 68, - 0x1e90b: 68, - 0x1e90c: 68, - 0x1e90d: 68, - 0x1e90e: 68, - 0x1e90f: 68, - 0x1e910: 68, - 0x1e911: 68, - 0x1e912: 68, - 0x1e913: 68, - 0x1e914: 68, - 0x1e915: 68, - 0x1e916: 68, - 0x1e917: 68, - 0x1e918: 68, - 0x1e919: 68, - 0x1e91a: 68, - 0x1e91b: 68, - 0x1e91c: 68, - 0x1e91d: 68, - 0x1e91e: 68, - 0x1e91f: 68, - 0x1e920: 68, - 0x1e921: 68, - 0x1e922: 68, - 0x1e923: 68, - 0x1e924: 68, - 0x1e925: 68, - 0x1e926: 68, - 0x1e927: 68, - 0x1e928: 68, - 0x1e929: 68, - 0x1e92a: 68, - 0x1e92b: 68, - 0x1e92c: 68, - 0x1e92d: 68, - 0x1e92e: 68, - 0x1e92f: 68, - 0x1e930: 68, - 0x1e931: 68, - 0x1e932: 68, - 0x1e933: 68, - 0x1e934: 68, - 0x1e935: 68, - 0x1e936: 68, - 0x1e937: 68, - 0x1e938: 68, - 0x1e939: 68, - 0x1e93a: 68, - 0x1e93b: 68, - 0x1e93c: 68, - 0x1e93d: 68, - 0x1e93e: 68, - 0x1e93f: 68, - 0x1e940: 68, - 0x1e941: 68, - 0x1e942: 68, - 0x1e943: 68, - 0x1e94b: 84, + 0x189A: 68, + 0x189B: 68, + 0x189C: 68, + 0x189D: 68, + 0x189E: 68, + 0x189F: 68, + 0x18A0: 68, + 0x18A1: 68, + 0x18A2: 68, + 0x18A3: 68, + 0x18A4: 68, + 0x18A5: 68, + 0x18A6: 68, + 0x18A7: 68, + 0x18A8: 68, + 0x18A9: 84, + 0x18AA: 68, + 0x1920: 84, + 0x1921: 84, + 0x1922: 84, + 0x1927: 84, + 0x1928: 84, + 0x1932: 84, + 0x1939: 84, + 0x193A: 84, + 0x193B: 84, + 0x1A17: 84, + 0x1A18: 84, + 0x1A1B: 84, + 0x1A56: 84, + 0x1A58: 84, + 0x1A59: 84, + 0x1A5A: 84, + 0x1A5B: 84, + 0x1A5C: 84, + 0x1A5D: 84, + 0x1A5E: 84, + 0x1A60: 84, + 0x1A62: 84, + 0x1A65: 84, + 0x1A66: 84, + 0x1A67: 84, + 0x1A68: 84, + 0x1A69: 84, + 0x1A6A: 84, + 0x1A6B: 84, + 0x1A6C: 84, + 0x1A73: 84, + 0x1A74: 84, + 0x1A75: 84, + 0x1A76: 84, + 0x1A77: 84, + 0x1A78: 84, + 0x1A79: 84, + 0x1A7A: 84, + 0x1A7B: 84, + 0x1A7C: 84, + 0x1A7F: 84, + 0x1AB0: 84, + 0x1AB1: 84, + 0x1AB2: 84, + 0x1AB3: 84, + 0x1AB4: 84, + 0x1AB5: 84, + 0x1AB6: 84, + 0x1AB7: 84, + 0x1AB8: 84, + 0x1AB9: 84, + 0x1ABA: 84, + 0x1ABB: 84, + 0x1ABC: 84, + 0x1ABD: 84, + 0x1ABE: 84, + 0x1ABF: 84, + 0x1AC0: 84, + 0x1AC1: 84, + 0x1AC2: 84, + 0x1AC3: 84, + 0x1AC4: 84, + 0x1AC5: 84, + 0x1AC6: 84, + 0x1AC7: 84, + 0x1AC8: 84, + 0x1AC9: 84, + 0x1ACA: 84, + 0x1ACB: 84, + 0x1ACC: 84, + 0x1ACD: 84, + 0x1ACE: 84, + 0x1B00: 84, + 0x1B01: 84, + 0x1B02: 84, + 0x1B03: 84, + 0x1B34: 84, + 0x1B36: 84, + 0x1B37: 84, + 0x1B38: 84, + 0x1B39: 84, + 0x1B3A: 84, + 0x1B3C: 84, + 0x1B42: 84, + 0x1B6B: 84, + 0x1B6C: 84, + 0x1B6D: 84, + 0x1B6E: 84, + 0x1B6F: 84, + 0x1B70: 84, + 0x1B71: 84, + 0x1B72: 84, + 0x1B73: 84, + 0x1B80: 84, + 0x1B81: 84, + 0x1BA2: 84, + 0x1BA3: 84, + 0x1BA4: 84, + 0x1BA5: 84, + 0x1BA8: 84, + 0x1BA9: 84, + 0x1BAB: 84, + 0x1BAC: 84, + 0x1BAD: 84, + 0x1BE6: 84, + 0x1BE8: 84, + 0x1BE9: 84, + 0x1BED: 84, + 0x1BEF: 84, + 0x1BF0: 84, + 0x1BF1: 84, + 0x1C2C: 84, + 0x1C2D: 84, + 0x1C2E: 84, + 0x1C2F: 84, + 0x1C30: 84, + 0x1C31: 84, + 0x1C32: 84, + 0x1C33: 84, + 0x1C36: 84, + 0x1C37: 84, + 0x1CD0: 84, + 0x1CD1: 84, + 0x1CD2: 84, + 0x1CD4: 84, + 0x1CD5: 84, + 0x1CD6: 84, + 0x1CD7: 84, + 0x1CD8: 84, + 0x1CD9: 84, + 0x1CDA: 84, + 0x1CDB: 84, + 0x1CDC: 84, + 0x1CDD: 84, + 0x1CDE: 84, + 0x1CDF: 84, + 0x1CE0: 84, + 0x1CE2: 84, + 0x1CE3: 84, + 0x1CE4: 84, + 0x1CE5: 84, + 0x1CE6: 84, + 0x1CE7: 84, + 0x1CE8: 84, + 0x1CED: 84, + 0x1CF4: 84, + 0x1CF8: 84, + 0x1CF9: 84, + 0x1DC0: 84, + 0x1DC1: 84, + 0x1DC2: 84, + 0x1DC3: 84, + 0x1DC4: 84, + 0x1DC5: 84, + 0x1DC6: 84, + 0x1DC7: 84, + 0x1DC8: 84, + 0x1DC9: 84, + 0x1DCA: 84, + 0x1DCB: 84, + 0x1DCC: 84, + 0x1DCD: 84, + 0x1DCE: 84, + 0x1DCF: 84, + 0x1DD0: 84, + 0x1DD1: 84, + 0x1DD2: 84, + 0x1DD3: 84, + 0x1DD4: 84, + 0x1DD5: 84, + 0x1DD6: 84, + 0x1DD7: 84, + 0x1DD8: 84, + 0x1DD9: 84, + 0x1DDA: 84, + 0x1DDB: 84, + 0x1DDC: 84, + 0x1DDD: 84, + 0x1DDE: 84, + 0x1DDF: 84, + 0x1DE0: 84, + 0x1DE1: 84, + 0x1DE2: 84, + 0x1DE3: 84, + 0x1DE4: 84, + 0x1DE5: 84, + 0x1DE6: 84, + 0x1DE7: 84, + 0x1DE8: 84, + 0x1DE9: 84, + 0x1DEA: 84, + 0x1DEB: 84, + 0x1DEC: 84, + 0x1DED: 84, + 0x1DEE: 84, + 0x1DEF: 84, + 0x1DF0: 84, + 0x1DF1: 84, + 0x1DF2: 84, + 0x1DF3: 84, + 0x1DF4: 84, + 0x1DF5: 84, + 0x1DF6: 84, + 0x1DF7: 84, + 0x1DF8: 84, + 0x1DF9: 84, + 0x1DFA: 84, + 0x1DFB: 84, + 0x1DFC: 84, + 0x1DFD: 84, + 0x1DFE: 84, + 0x1DFF: 84, + 0x200B: 84, + 0x200D: 67, + 0x200E: 84, + 0x200F: 84, + 0x202A: 84, + 0x202B: 84, + 0x202C: 84, + 0x202D: 84, + 0x202E: 84, + 0x2060: 84, + 0x2061: 84, + 0x2062: 84, + 0x2063: 84, + 0x2064: 84, + 0x206A: 84, + 0x206B: 84, + 0x206C: 84, + 0x206D: 84, + 0x206E: 84, + 0x206F: 84, + 0x20D0: 84, + 0x20D1: 84, + 0x20D2: 84, + 0x20D3: 84, + 0x20D4: 84, + 0x20D5: 84, + 0x20D6: 84, + 0x20D7: 84, + 0x20D8: 84, + 0x20D9: 84, + 0x20DA: 84, + 0x20DB: 84, + 0x20DC: 84, + 0x20DD: 84, + 0x20DE: 84, + 0x20DF: 84, + 0x20E0: 84, + 0x20E1: 84, + 0x20E2: 84, + 0x20E3: 84, + 0x20E4: 84, + 0x20E5: 84, + 0x20E6: 84, + 0x20E7: 84, + 0x20E8: 84, + 0x20E9: 84, + 0x20EA: 84, + 0x20EB: 84, + 0x20EC: 84, + 0x20ED: 84, + 0x20EE: 84, + 0x20EF: 84, + 0x20F0: 84, + 0x2CEF: 84, + 0x2CF0: 84, + 0x2CF1: 84, + 0x2D7F: 84, + 0x2DE0: 84, + 0x2DE1: 84, + 0x2DE2: 84, + 0x2DE3: 84, + 0x2DE4: 84, + 0x2DE5: 84, + 0x2DE6: 84, + 0x2DE7: 84, + 0x2DE8: 84, + 0x2DE9: 84, + 0x2DEA: 84, + 0x2DEB: 84, + 0x2DEC: 84, + 0x2DED: 84, + 0x2DEE: 84, + 0x2DEF: 84, + 0x2DF0: 84, + 0x2DF1: 84, + 0x2DF2: 84, + 0x2DF3: 84, + 0x2DF4: 84, + 0x2DF5: 84, + 0x2DF6: 84, + 0x2DF7: 84, + 0x2DF8: 84, + 0x2DF9: 84, + 0x2DFA: 84, + 0x2DFB: 84, + 0x2DFC: 84, + 0x2DFD: 84, + 0x2DFE: 84, + 0x2DFF: 84, + 0x302A: 84, + 0x302B: 84, + 0x302C: 84, + 0x302D: 84, + 0x3099: 84, + 0x309A: 84, + 0xA66F: 84, + 0xA670: 84, + 0xA671: 84, + 0xA672: 84, + 0xA674: 84, + 0xA675: 84, + 0xA676: 84, + 0xA677: 84, + 0xA678: 84, + 0xA679: 84, + 0xA67A: 84, + 0xA67B: 84, + 0xA67C: 84, + 0xA67D: 84, + 0xA69E: 84, + 0xA69F: 84, + 0xA6F0: 84, + 0xA6F1: 84, + 0xA802: 84, + 0xA806: 84, + 0xA80B: 84, + 0xA825: 84, + 0xA826: 84, + 0xA82C: 84, + 0xA840: 68, + 0xA841: 68, + 0xA842: 68, + 0xA843: 68, + 0xA844: 68, + 0xA845: 68, + 0xA846: 68, + 0xA847: 68, + 0xA848: 68, + 0xA849: 68, + 0xA84A: 68, + 0xA84B: 68, + 0xA84C: 68, + 0xA84D: 68, + 0xA84E: 68, + 0xA84F: 68, + 0xA850: 68, + 0xA851: 68, + 0xA852: 68, + 0xA853: 68, + 0xA854: 68, + 0xA855: 68, + 0xA856: 68, + 0xA857: 68, + 0xA858: 68, + 0xA859: 68, + 0xA85A: 68, + 0xA85B: 68, + 0xA85C: 68, + 0xA85D: 68, + 0xA85E: 68, + 0xA85F: 68, + 0xA860: 68, + 0xA861: 68, + 0xA862: 68, + 0xA863: 68, + 0xA864: 68, + 0xA865: 68, + 0xA866: 68, + 0xA867: 68, + 0xA868: 68, + 0xA869: 68, + 0xA86A: 68, + 0xA86B: 68, + 0xA86C: 68, + 0xA86D: 68, + 0xA86E: 68, + 0xA86F: 68, + 0xA870: 68, + 0xA871: 68, + 0xA872: 76, + 0xA8C4: 84, + 0xA8C5: 84, + 0xA8E0: 84, + 0xA8E1: 84, + 0xA8E2: 84, + 0xA8E3: 84, + 0xA8E4: 84, + 0xA8E5: 84, + 0xA8E6: 84, + 0xA8E7: 84, + 0xA8E8: 84, + 0xA8E9: 84, + 0xA8EA: 84, + 0xA8EB: 84, + 0xA8EC: 84, + 0xA8ED: 84, + 0xA8EE: 84, + 0xA8EF: 84, + 0xA8F0: 84, + 0xA8F1: 84, + 0xA8FF: 84, + 0xA926: 84, + 0xA927: 84, + 0xA928: 84, + 0xA929: 84, + 0xA92A: 84, + 0xA92B: 84, + 0xA92C: 84, + 0xA92D: 84, + 0xA947: 84, + 0xA948: 84, + 0xA949: 84, + 0xA94A: 84, + 0xA94B: 84, + 0xA94C: 84, + 0xA94D: 84, + 0xA94E: 84, + 0xA94F: 84, + 0xA950: 84, + 0xA951: 84, + 0xA980: 84, + 0xA981: 84, + 0xA982: 84, + 0xA9B3: 84, + 0xA9B6: 84, + 0xA9B7: 84, + 0xA9B8: 84, + 0xA9B9: 84, + 0xA9BC: 84, + 0xA9BD: 84, + 0xA9E5: 84, + 0xAA29: 84, + 0xAA2A: 84, + 0xAA2B: 84, + 0xAA2C: 84, + 0xAA2D: 84, + 0xAA2E: 84, + 0xAA31: 84, + 0xAA32: 84, + 0xAA35: 84, + 0xAA36: 84, + 0xAA43: 84, + 0xAA4C: 84, + 0xAA7C: 84, + 0xAAB0: 84, + 0xAAB2: 84, + 0xAAB3: 84, + 0xAAB4: 84, + 0xAAB7: 84, + 0xAAB8: 84, + 0xAABE: 84, + 0xAABF: 84, + 0xAAC1: 84, + 0xAAEC: 84, + 0xAAED: 84, + 0xAAF6: 84, + 0xABE5: 84, + 0xABE8: 84, + 0xABED: 84, + 0xFB1E: 84, + 0xFE00: 84, + 0xFE01: 84, + 0xFE02: 84, + 0xFE03: 84, + 0xFE04: 84, + 0xFE05: 84, + 0xFE06: 84, + 0xFE07: 84, + 0xFE08: 84, + 0xFE09: 84, + 0xFE0A: 84, + 0xFE0B: 84, + 0xFE0C: 84, + 0xFE0D: 84, + 0xFE0E: 84, + 0xFE0F: 84, + 0xFE20: 84, + 0xFE21: 84, + 0xFE22: 84, + 0xFE23: 84, + 0xFE24: 84, + 0xFE25: 84, + 0xFE26: 84, + 0xFE27: 84, + 0xFE28: 84, + 0xFE29: 84, + 0xFE2A: 84, + 0xFE2B: 84, + 0xFE2C: 84, + 0xFE2D: 84, + 0xFE2E: 84, + 0xFE2F: 84, + 0xFEFF: 84, + 0xFFF9: 84, + 0xFFFA: 84, + 0xFFFB: 84, + 0x101FD: 84, + 0x102E0: 84, + 0x10376: 84, + 0x10377: 84, + 0x10378: 84, + 0x10379: 84, + 0x1037A: 84, + 0x10A01: 84, + 0x10A02: 84, + 0x10A03: 84, + 0x10A05: 84, + 0x10A06: 84, + 0x10A0C: 84, + 0x10A0D: 84, + 0x10A0E: 84, + 0x10A0F: 84, + 0x10A38: 84, + 0x10A39: 84, + 0x10A3A: 84, + 0x10A3F: 84, + 0x10AC0: 68, + 0x10AC1: 68, + 0x10AC2: 68, + 0x10AC3: 68, + 0x10AC4: 68, + 0x10AC5: 82, + 0x10AC7: 82, + 0x10AC9: 82, + 0x10ACA: 82, + 0x10ACD: 76, + 0x10ACE: 82, + 0x10ACF: 82, + 0x10AD0: 82, + 0x10AD1: 82, + 0x10AD2: 82, + 0x10AD3: 68, + 0x10AD4: 68, + 0x10AD5: 68, + 0x10AD6: 68, + 0x10AD7: 76, + 0x10AD8: 68, + 0x10AD9: 68, + 0x10ADA: 68, + 0x10ADB: 68, + 0x10ADC: 68, + 0x10ADD: 82, + 0x10ADE: 68, + 0x10ADF: 68, + 0x10AE0: 68, + 0x10AE1: 82, + 0x10AE4: 82, + 0x10AE5: 84, + 0x10AE6: 84, + 0x10AEB: 68, + 0x10AEC: 68, + 0x10AED: 68, + 0x10AEE: 68, + 0x10AEF: 82, + 0x10B80: 68, + 0x10B81: 82, + 0x10B82: 68, + 0x10B83: 82, + 0x10B84: 82, + 0x10B85: 82, + 0x10B86: 68, + 0x10B87: 68, + 0x10B88: 68, + 0x10B89: 82, + 0x10B8A: 68, + 0x10B8B: 68, + 0x10B8C: 82, + 0x10B8D: 68, + 0x10B8E: 82, + 0x10B8F: 82, + 0x10B90: 68, + 0x10B91: 82, + 0x10BA9: 82, + 0x10BAA: 82, + 0x10BAB: 82, + 0x10BAC: 82, + 0x10BAD: 68, + 0x10BAE: 68, + 0x10D00: 76, + 0x10D01: 68, + 0x10D02: 68, + 0x10D03: 68, + 0x10D04: 68, + 0x10D05: 68, + 0x10D06: 68, + 0x10D07: 68, + 0x10D08: 68, + 0x10D09: 68, + 0x10D0A: 68, + 0x10D0B: 68, + 0x10D0C: 68, + 0x10D0D: 68, + 0x10D0E: 68, + 0x10D0F: 68, + 0x10D10: 68, + 0x10D11: 68, + 0x10D12: 68, + 0x10D13: 68, + 0x10D14: 68, + 0x10D15: 68, + 0x10D16: 68, + 0x10D17: 68, + 0x10D18: 68, + 0x10D19: 68, + 0x10D1A: 68, + 0x10D1B: 68, + 0x10D1C: 68, + 0x10D1D: 68, + 0x10D1E: 68, + 0x10D1F: 68, + 0x10D20: 68, + 0x10D21: 68, + 0x10D22: 82, + 0x10D23: 68, + 0x10D24: 84, + 0x10D25: 84, + 0x10D26: 84, + 0x10D27: 84, + 0x10EAB: 84, + 0x10EAC: 84, + 0x10EFD: 84, + 0x10EFE: 84, + 0x10EFF: 84, + 0x10F30: 68, + 0x10F31: 68, + 0x10F32: 68, + 0x10F33: 82, + 0x10F34: 68, + 0x10F35: 68, + 0x10F36: 68, + 0x10F37: 68, + 0x10F38: 68, + 0x10F39: 68, + 0x10F3A: 68, + 0x10F3B: 68, + 0x10F3C: 68, + 0x10F3D: 68, + 0x10F3E: 68, + 0x10F3F: 68, + 0x10F40: 68, + 0x10F41: 68, + 0x10F42: 68, + 0x10F43: 68, + 0x10F44: 68, + 0x10F46: 84, + 0x10F47: 84, + 0x10F48: 84, + 0x10F49: 84, + 0x10F4A: 84, + 0x10F4B: 84, + 0x10F4C: 84, + 0x10F4D: 84, + 0x10F4E: 84, + 0x10F4F: 84, + 0x10F50: 84, + 0x10F51: 68, + 0x10F52: 68, + 0x10F53: 68, + 0x10F54: 82, + 0x10F70: 68, + 0x10F71: 68, + 0x10F72: 68, + 0x10F73: 68, + 0x10F74: 82, + 0x10F75: 82, + 0x10F76: 68, + 0x10F77: 68, + 0x10F78: 68, + 0x10F79: 68, + 0x10F7A: 68, + 0x10F7B: 68, + 0x10F7C: 68, + 0x10F7D: 68, + 0x10F7E: 68, + 0x10F7F: 68, + 0x10F80: 68, + 0x10F81: 68, + 0x10F82: 84, + 0x10F83: 84, + 0x10F84: 84, + 0x10F85: 84, + 0x10FB0: 68, + 0x10FB2: 68, + 0x10FB3: 68, + 0x10FB4: 82, + 0x10FB5: 82, + 0x10FB6: 82, + 0x10FB8: 68, + 0x10FB9: 82, + 0x10FBA: 82, + 0x10FBB: 68, + 0x10FBC: 68, + 0x10FBD: 82, + 0x10FBE: 68, + 0x10FBF: 68, + 0x10FC1: 68, + 0x10FC2: 82, + 0x10FC3: 82, + 0x10FC4: 68, + 0x10FC9: 82, + 0x10FCA: 68, + 0x10FCB: 76, + 0x11001: 84, + 0x11038: 84, + 0x11039: 84, + 0x1103A: 84, + 0x1103B: 84, + 0x1103C: 84, + 0x1103D: 84, + 0x1103E: 84, + 0x1103F: 84, + 0x11040: 84, + 0x11041: 84, + 0x11042: 84, + 0x11043: 84, + 0x11044: 84, + 0x11045: 84, + 0x11046: 84, + 0x11070: 84, + 0x11073: 84, + 0x11074: 84, + 0x1107F: 84, + 0x11080: 84, + 0x11081: 84, + 0x110B3: 84, + 0x110B4: 84, + 0x110B5: 84, + 0x110B6: 84, + 0x110B9: 84, + 0x110BA: 84, + 0x110C2: 84, + 0x11100: 84, + 0x11101: 84, + 0x11102: 84, + 0x11127: 84, + 0x11128: 84, + 0x11129: 84, + 0x1112A: 84, + 0x1112B: 84, + 0x1112D: 84, + 0x1112E: 84, + 0x1112F: 84, + 0x11130: 84, + 0x11131: 84, + 0x11132: 84, + 0x11133: 84, + 0x11134: 84, + 0x11173: 84, + 0x11180: 84, + 0x11181: 84, + 0x111B6: 84, + 0x111B7: 84, + 0x111B8: 84, + 0x111B9: 84, + 0x111BA: 84, + 0x111BB: 84, + 0x111BC: 84, + 0x111BD: 84, + 0x111BE: 84, + 0x111C9: 84, + 0x111CA: 84, + 0x111CB: 84, + 0x111CC: 84, + 0x111CF: 84, + 0x1122F: 84, + 0x11230: 84, + 0x11231: 84, + 0x11234: 84, + 0x11236: 84, + 0x11237: 84, + 0x1123E: 84, + 0x11241: 84, + 0x112DF: 84, + 0x112E3: 84, + 0x112E4: 84, + 0x112E5: 84, + 0x112E6: 84, + 0x112E7: 84, + 0x112E8: 84, + 0x112E9: 84, + 0x112EA: 84, + 0x11300: 84, + 0x11301: 84, + 0x1133B: 84, + 0x1133C: 84, + 0x11340: 84, + 0x11366: 84, + 0x11367: 84, + 0x11368: 84, + 0x11369: 84, + 0x1136A: 84, + 0x1136B: 84, + 0x1136C: 84, + 0x11370: 84, + 0x11371: 84, + 0x11372: 84, + 0x11373: 84, + 0x11374: 84, + 0x11438: 84, + 0x11439: 84, + 0x1143A: 84, + 0x1143B: 84, + 0x1143C: 84, + 0x1143D: 84, + 0x1143E: 84, + 0x1143F: 84, + 0x11442: 84, + 0x11443: 84, + 0x11444: 84, + 0x11446: 84, + 0x1145E: 84, + 0x114B3: 84, + 0x114B4: 84, + 0x114B5: 84, + 0x114B6: 84, + 0x114B7: 84, + 0x114B8: 84, + 0x114BA: 84, + 0x114BF: 84, + 0x114C0: 84, + 0x114C2: 84, + 0x114C3: 84, + 0x115B2: 84, + 0x115B3: 84, + 0x115B4: 84, + 0x115B5: 84, + 0x115BC: 84, + 0x115BD: 84, + 0x115BF: 84, + 0x115C0: 84, + 0x115DC: 84, + 0x115DD: 84, + 0x11633: 84, + 0x11634: 84, + 0x11635: 84, + 0x11636: 84, + 0x11637: 84, + 0x11638: 84, + 0x11639: 84, + 0x1163A: 84, + 0x1163D: 84, + 0x1163F: 84, + 0x11640: 84, + 0x116AB: 84, + 0x116AD: 84, + 0x116B0: 84, + 0x116B1: 84, + 0x116B2: 84, + 0x116B3: 84, + 0x116B4: 84, + 0x116B5: 84, + 0x116B7: 84, + 0x1171D: 84, + 0x1171E: 84, + 0x1171F: 84, + 0x11722: 84, + 0x11723: 84, + 0x11724: 84, + 0x11725: 84, + 0x11727: 84, + 0x11728: 84, + 0x11729: 84, + 0x1172A: 84, + 0x1172B: 84, + 0x1182F: 84, + 0x11830: 84, + 0x11831: 84, + 0x11832: 84, + 0x11833: 84, + 0x11834: 84, + 0x11835: 84, + 0x11836: 84, + 0x11837: 84, + 0x11839: 84, + 0x1183A: 84, + 0x1193B: 84, + 0x1193C: 84, + 0x1193E: 84, + 0x11943: 84, + 0x119D4: 84, + 0x119D5: 84, + 0x119D6: 84, + 0x119D7: 84, + 0x119DA: 84, + 0x119DB: 84, + 0x119E0: 84, + 0x11A01: 84, + 0x11A02: 84, + 0x11A03: 84, + 0x11A04: 84, + 0x11A05: 84, + 0x11A06: 84, + 0x11A07: 84, + 0x11A08: 84, + 0x11A09: 84, + 0x11A0A: 84, + 0x11A33: 84, + 0x11A34: 84, + 0x11A35: 84, + 0x11A36: 84, + 0x11A37: 84, + 0x11A38: 84, + 0x11A3B: 84, + 0x11A3C: 84, + 0x11A3D: 84, + 0x11A3E: 84, + 0x11A47: 84, + 0x11A51: 84, + 0x11A52: 84, + 0x11A53: 84, + 0x11A54: 84, + 0x11A55: 84, + 0x11A56: 84, + 0x11A59: 84, + 0x11A5A: 84, + 0x11A5B: 84, + 0x11A8A: 84, + 0x11A8B: 84, + 0x11A8C: 84, + 0x11A8D: 84, + 0x11A8E: 84, + 0x11A8F: 84, + 0x11A90: 84, + 0x11A91: 84, + 0x11A92: 84, + 0x11A93: 84, + 0x11A94: 84, + 0x11A95: 84, + 0x11A96: 84, + 0x11A98: 84, + 0x11A99: 84, + 0x11C30: 84, + 0x11C31: 84, + 0x11C32: 84, + 0x11C33: 84, + 0x11C34: 84, + 0x11C35: 84, + 0x11C36: 84, + 0x11C38: 84, + 0x11C39: 84, + 0x11C3A: 84, + 0x11C3B: 84, + 0x11C3C: 84, + 0x11C3D: 84, + 0x11C3F: 84, + 0x11C92: 84, + 0x11C93: 84, + 0x11C94: 84, + 0x11C95: 84, + 0x11C96: 84, + 0x11C97: 84, + 0x11C98: 84, + 0x11C99: 84, + 0x11C9A: 84, + 0x11C9B: 84, + 0x11C9C: 84, + 0x11C9D: 84, + 0x11C9E: 84, + 0x11C9F: 84, + 0x11CA0: 84, + 0x11CA1: 84, + 0x11CA2: 84, + 0x11CA3: 84, + 0x11CA4: 84, + 0x11CA5: 84, + 0x11CA6: 84, + 0x11CA7: 84, + 0x11CAA: 84, + 0x11CAB: 84, + 0x11CAC: 84, + 0x11CAD: 84, + 0x11CAE: 84, + 0x11CAF: 84, + 0x11CB0: 84, + 0x11CB2: 84, + 0x11CB3: 84, + 0x11CB5: 84, + 0x11CB6: 84, + 0x11D31: 84, + 0x11D32: 84, + 0x11D33: 84, + 0x11D34: 84, + 0x11D35: 84, + 0x11D36: 84, + 0x11D3A: 84, + 0x11D3C: 84, + 0x11D3D: 84, + 0x11D3F: 84, + 0x11D40: 84, + 0x11D41: 84, + 0x11D42: 84, + 0x11D43: 84, + 0x11D44: 84, + 0x11D45: 84, + 0x11D47: 84, + 0x11D90: 84, + 0x11D91: 84, + 0x11D95: 84, + 0x11D97: 84, + 0x11EF3: 84, + 0x11EF4: 84, + 0x11F00: 84, + 0x11F01: 84, + 0x11F36: 84, + 0x11F37: 84, + 0x11F38: 84, + 0x11F39: 84, + 0x11F3A: 84, + 0x11F40: 84, + 0x11F42: 84, + 0x13430: 84, + 0x13431: 84, + 0x13432: 84, + 0x13433: 84, + 0x13434: 84, + 0x13435: 84, + 0x13436: 84, + 0x13437: 84, + 0x13438: 84, + 0x13439: 84, + 0x1343A: 84, + 0x1343B: 84, + 0x1343C: 84, + 0x1343D: 84, + 0x1343E: 84, + 0x1343F: 84, + 0x13440: 84, + 0x13447: 84, + 0x13448: 84, + 0x13449: 84, + 0x1344A: 84, + 0x1344B: 84, + 0x1344C: 84, + 0x1344D: 84, + 0x1344E: 84, + 0x1344F: 84, + 0x13450: 84, + 0x13451: 84, + 0x13452: 84, + 0x13453: 84, + 0x13454: 84, + 0x13455: 84, + 0x16AF0: 84, + 0x16AF1: 84, + 0x16AF2: 84, + 0x16AF3: 84, + 0x16AF4: 84, + 0x16B30: 84, + 0x16B31: 84, + 0x16B32: 84, + 0x16B33: 84, + 0x16B34: 84, + 0x16B35: 84, + 0x16B36: 84, + 0x16F4F: 84, + 0x16F8F: 84, + 0x16F90: 84, + 0x16F91: 84, + 0x16F92: 84, + 0x16FE4: 84, + 0x1BC9D: 84, + 0x1BC9E: 84, + 0x1BCA0: 84, + 0x1BCA1: 84, + 0x1BCA2: 84, + 0x1BCA3: 84, + 0x1CF00: 84, + 0x1CF01: 84, + 0x1CF02: 84, + 0x1CF03: 84, + 0x1CF04: 84, + 0x1CF05: 84, + 0x1CF06: 84, + 0x1CF07: 84, + 0x1CF08: 84, + 0x1CF09: 84, + 0x1CF0A: 84, + 0x1CF0B: 84, + 0x1CF0C: 84, + 0x1CF0D: 84, + 0x1CF0E: 84, + 0x1CF0F: 84, + 0x1CF10: 84, + 0x1CF11: 84, + 0x1CF12: 84, + 0x1CF13: 84, + 0x1CF14: 84, + 0x1CF15: 84, + 0x1CF16: 84, + 0x1CF17: 84, + 0x1CF18: 84, + 0x1CF19: 84, + 0x1CF1A: 84, + 0x1CF1B: 84, + 0x1CF1C: 84, + 0x1CF1D: 84, + 0x1CF1E: 84, + 0x1CF1F: 84, + 0x1CF20: 84, + 0x1CF21: 84, + 0x1CF22: 84, + 0x1CF23: 84, + 0x1CF24: 84, + 0x1CF25: 84, + 0x1CF26: 84, + 0x1CF27: 84, + 0x1CF28: 84, + 0x1CF29: 84, + 0x1CF2A: 84, + 0x1CF2B: 84, + 0x1CF2C: 84, + 0x1CF2D: 84, + 0x1CF30: 84, + 0x1CF31: 84, + 0x1CF32: 84, + 0x1CF33: 84, + 0x1CF34: 84, + 0x1CF35: 84, + 0x1CF36: 84, + 0x1CF37: 84, + 0x1CF38: 84, + 0x1CF39: 84, + 0x1CF3A: 84, + 0x1CF3B: 84, + 0x1CF3C: 84, + 0x1CF3D: 84, + 0x1CF3E: 84, + 0x1CF3F: 84, + 0x1CF40: 84, + 0x1CF41: 84, + 0x1CF42: 84, + 0x1CF43: 84, + 0x1CF44: 84, + 0x1CF45: 84, + 0x1CF46: 84, + 0x1D167: 84, + 0x1D168: 84, + 0x1D169: 84, + 0x1D173: 84, + 0x1D174: 84, + 0x1D175: 84, + 0x1D176: 84, + 0x1D177: 84, + 0x1D178: 84, + 0x1D179: 84, + 0x1D17A: 84, + 0x1D17B: 84, + 0x1D17C: 84, + 0x1D17D: 84, + 0x1D17E: 84, + 0x1D17F: 84, + 0x1D180: 84, + 0x1D181: 84, + 0x1D182: 84, + 0x1D185: 84, + 0x1D186: 84, + 0x1D187: 84, + 0x1D188: 84, + 0x1D189: 84, + 0x1D18A: 84, + 0x1D18B: 84, + 0x1D1AA: 84, + 0x1D1AB: 84, + 0x1D1AC: 84, + 0x1D1AD: 84, + 0x1D242: 84, + 0x1D243: 84, + 0x1D244: 84, + 0x1DA00: 84, + 0x1DA01: 84, + 0x1DA02: 84, + 0x1DA03: 84, + 0x1DA04: 84, + 0x1DA05: 84, + 0x1DA06: 84, + 0x1DA07: 84, + 0x1DA08: 84, + 0x1DA09: 84, + 0x1DA0A: 84, + 0x1DA0B: 84, + 0x1DA0C: 84, + 0x1DA0D: 84, + 0x1DA0E: 84, + 0x1DA0F: 84, + 0x1DA10: 84, + 0x1DA11: 84, + 0x1DA12: 84, + 0x1DA13: 84, + 0x1DA14: 84, + 0x1DA15: 84, + 0x1DA16: 84, + 0x1DA17: 84, + 0x1DA18: 84, + 0x1DA19: 84, + 0x1DA1A: 84, + 0x1DA1B: 84, + 0x1DA1C: 84, + 0x1DA1D: 84, + 0x1DA1E: 84, + 0x1DA1F: 84, + 0x1DA20: 84, + 0x1DA21: 84, + 0x1DA22: 84, + 0x1DA23: 84, + 0x1DA24: 84, + 0x1DA25: 84, + 0x1DA26: 84, + 0x1DA27: 84, + 0x1DA28: 84, + 0x1DA29: 84, + 0x1DA2A: 84, + 0x1DA2B: 84, + 0x1DA2C: 84, + 0x1DA2D: 84, + 0x1DA2E: 84, + 0x1DA2F: 84, + 0x1DA30: 84, + 0x1DA31: 84, + 0x1DA32: 84, + 0x1DA33: 84, + 0x1DA34: 84, + 0x1DA35: 84, + 0x1DA36: 84, + 0x1DA3B: 84, + 0x1DA3C: 84, + 0x1DA3D: 84, + 0x1DA3E: 84, + 0x1DA3F: 84, + 0x1DA40: 84, + 0x1DA41: 84, + 0x1DA42: 84, + 0x1DA43: 84, + 0x1DA44: 84, + 0x1DA45: 84, + 0x1DA46: 84, + 0x1DA47: 84, + 0x1DA48: 84, + 0x1DA49: 84, + 0x1DA4A: 84, + 0x1DA4B: 84, + 0x1DA4C: 84, + 0x1DA4D: 84, + 0x1DA4E: 84, + 0x1DA4F: 84, + 0x1DA50: 84, + 0x1DA51: 84, + 0x1DA52: 84, + 0x1DA53: 84, + 0x1DA54: 84, + 0x1DA55: 84, + 0x1DA56: 84, + 0x1DA57: 84, + 0x1DA58: 84, + 0x1DA59: 84, + 0x1DA5A: 84, + 0x1DA5B: 84, + 0x1DA5C: 84, + 0x1DA5D: 84, + 0x1DA5E: 84, + 0x1DA5F: 84, + 0x1DA60: 84, + 0x1DA61: 84, + 0x1DA62: 84, + 0x1DA63: 84, + 0x1DA64: 84, + 0x1DA65: 84, + 0x1DA66: 84, + 0x1DA67: 84, + 0x1DA68: 84, + 0x1DA69: 84, + 0x1DA6A: 84, + 0x1DA6B: 84, + 0x1DA6C: 84, + 0x1DA75: 84, + 0x1DA84: 84, + 0x1DA9B: 84, + 0x1DA9C: 84, + 0x1DA9D: 84, + 0x1DA9E: 84, + 0x1DA9F: 84, + 0x1DAA1: 84, + 0x1DAA2: 84, + 0x1DAA3: 84, + 0x1DAA4: 84, + 0x1DAA5: 84, + 0x1DAA6: 84, + 0x1DAA7: 84, + 0x1DAA8: 84, + 0x1DAA9: 84, + 0x1DAAA: 84, + 0x1DAAB: 84, + 0x1DAAC: 84, + 0x1DAAD: 84, + 0x1DAAE: 84, + 0x1DAAF: 84, + 0x1E000: 84, + 0x1E001: 84, + 0x1E002: 84, + 0x1E003: 84, + 0x1E004: 84, + 0x1E005: 84, + 0x1E006: 84, + 0x1E008: 84, + 0x1E009: 84, + 0x1E00A: 84, + 0x1E00B: 84, + 0x1E00C: 84, + 0x1E00D: 84, + 0x1E00E: 84, + 0x1E00F: 84, + 0x1E010: 84, + 0x1E011: 84, + 0x1E012: 84, + 0x1E013: 84, + 0x1E014: 84, + 0x1E015: 84, + 0x1E016: 84, + 0x1E017: 84, + 0x1E018: 84, + 0x1E01B: 84, + 0x1E01C: 84, + 0x1E01D: 84, + 0x1E01E: 84, + 0x1E01F: 84, + 0x1E020: 84, + 0x1E021: 84, + 0x1E023: 84, + 0x1E024: 84, + 0x1E026: 84, + 0x1E027: 84, + 0x1E028: 84, + 0x1E029: 84, + 0x1E02A: 84, + 0x1E08F: 84, + 0x1E130: 84, + 0x1E131: 84, + 0x1E132: 84, + 0x1E133: 84, + 0x1E134: 84, + 0x1E135: 84, + 0x1E136: 84, + 0x1E2AE: 84, + 0x1E2EC: 84, + 0x1E2ED: 84, + 0x1E2EE: 84, + 0x1E2EF: 84, + 0x1E4EC: 84, + 0x1E4ED: 84, + 0x1E4EE: 84, + 0x1E4EF: 84, + 0x1E8D0: 84, + 0x1E8D1: 84, + 0x1E8D2: 84, + 0x1E8D3: 84, + 0x1E8D4: 84, + 0x1E8D5: 84, + 0x1E8D6: 84, + 0x1E900: 68, + 0x1E901: 68, + 0x1E902: 68, + 0x1E903: 68, + 0x1E904: 68, + 0x1E905: 68, + 0x1E906: 68, + 0x1E907: 68, + 0x1E908: 68, + 0x1E909: 68, + 0x1E90A: 68, + 0x1E90B: 68, + 0x1E90C: 68, + 0x1E90D: 68, + 0x1E90E: 68, + 0x1E90F: 68, + 0x1E910: 68, + 0x1E911: 68, + 0x1E912: 68, + 0x1E913: 68, + 0x1E914: 68, + 0x1E915: 68, + 0x1E916: 68, + 0x1E917: 68, + 0x1E918: 68, + 0x1E919: 68, + 0x1E91A: 68, + 0x1E91B: 68, + 0x1E91C: 68, + 0x1E91D: 68, + 0x1E91E: 68, + 0x1E91F: 68, + 0x1E920: 68, + 0x1E921: 68, + 0x1E922: 68, + 0x1E923: 68, + 0x1E924: 68, + 0x1E925: 68, + 0x1E926: 68, + 0x1E927: 68, + 0x1E928: 68, + 0x1E929: 68, + 0x1E92A: 68, + 0x1E92B: 68, + 0x1E92C: 68, + 0x1E92D: 68, + 0x1E92E: 68, + 0x1E92F: 68, + 0x1E930: 68, + 0x1E931: 68, + 0x1E932: 68, + 0x1E933: 68, + 0x1E934: 68, + 0x1E935: 68, + 0x1E936: 68, + 0x1E937: 68, + 0x1E938: 68, + 0x1E939: 68, + 0x1E93A: 68, + 0x1E93B: 68, + 0x1E93C: 68, + 0x1E93D: 68, + 0x1E93E: 68, + 0x1E93F: 68, + 0x1E940: 68, + 0x1E941: 68, + 0x1E942: 68, + 0x1E943: 68, + 0x1E944: 84, + 0x1E945: 84, + 0x1E946: 84, + 0x1E947: 84, + 0x1E948: 84, + 0x1E949: 84, + 0x1E94A: 84, + 0x1E94B: 84, + 0xE0001: 84, + 0xE0020: 84, + 0xE0021: 84, + 0xE0022: 84, + 0xE0023: 84, + 0xE0024: 84, + 0xE0025: 84, + 0xE0026: 84, + 0xE0027: 84, + 0xE0028: 84, + 0xE0029: 84, + 0xE002A: 84, + 0xE002B: 84, + 0xE002C: 84, + 0xE002D: 84, + 0xE002E: 84, + 0xE002F: 84, + 0xE0030: 84, + 0xE0031: 84, + 0xE0032: 84, + 0xE0033: 84, + 0xE0034: 84, + 0xE0035: 84, + 0xE0036: 84, + 0xE0037: 84, + 0xE0038: 84, + 0xE0039: 84, + 0xE003A: 84, + 0xE003B: 84, + 0xE003C: 84, + 0xE003D: 84, + 0xE003E: 84, + 0xE003F: 84, + 0xE0040: 84, + 0xE0041: 84, + 0xE0042: 84, + 0xE0043: 84, + 0xE0044: 84, + 0xE0045: 84, + 0xE0046: 84, + 0xE0047: 84, + 0xE0048: 84, + 0xE0049: 84, + 0xE004A: 84, + 0xE004B: 84, + 0xE004C: 84, + 0xE004D: 84, + 0xE004E: 84, + 0xE004F: 84, + 0xE0050: 84, + 0xE0051: 84, + 0xE0052: 84, + 0xE0053: 84, + 0xE0054: 84, + 0xE0055: 84, + 0xE0056: 84, + 0xE0057: 84, + 0xE0058: 84, + 0xE0059: 84, + 0xE005A: 84, + 0xE005B: 84, + 0xE005C: 84, + 0xE005D: 84, + 0xE005E: 84, + 0xE005F: 84, + 0xE0060: 84, + 0xE0061: 84, + 0xE0062: 84, + 0xE0063: 84, + 0xE0064: 84, + 0xE0065: 84, + 0xE0066: 84, + 0xE0067: 84, + 0xE0068: 84, + 0xE0069: 84, + 0xE006A: 84, + 0xE006B: 84, + 0xE006C: 84, + 0xE006D: 84, + 0xE006E: 84, + 0xE006F: 84, + 0xE0070: 84, + 0xE0071: 84, + 0xE0072: 84, + 0xE0073: 84, + 0xE0074: 84, + 0xE0075: 84, + 0xE0076: 84, + 0xE0077: 84, + 0xE0078: 84, + 0xE0079: 84, + 0xE007A: 84, + 0xE007B: 84, + 0xE007C: 84, + 0xE007D: 84, + 0xE007E: 84, + 0xE007F: 84, + 0xE0100: 84, + 0xE0101: 84, + 0xE0102: 84, + 0xE0103: 84, + 0xE0104: 84, + 0xE0105: 84, + 0xE0106: 84, + 0xE0107: 84, + 0xE0108: 84, + 0xE0109: 84, + 0xE010A: 84, + 0xE010B: 84, + 0xE010C: 84, + 0xE010D: 84, + 0xE010E: 84, + 0xE010F: 84, + 0xE0110: 84, + 0xE0111: 84, + 0xE0112: 84, + 0xE0113: 84, + 0xE0114: 84, + 0xE0115: 84, + 0xE0116: 84, + 0xE0117: 84, + 0xE0118: 84, + 0xE0119: 84, + 0xE011A: 84, + 0xE011B: 84, + 0xE011C: 84, + 0xE011D: 84, + 0xE011E: 84, + 0xE011F: 84, + 0xE0120: 84, + 0xE0121: 84, + 0xE0122: 84, + 0xE0123: 84, + 0xE0124: 84, + 0xE0125: 84, + 0xE0126: 84, + 0xE0127: 84, + 0xE0128: 84, + 0xE0129: 84, + 0xE012A: 84, + 0xE012B: 84, + 0xE012C: 84, + 0xE012D: 84, + 0xE012E: 84, + 0xE012F: 84, + 0xE0130: 84, + 0xE0131: 84, + 0xE0132: 84, + 0xE0133: 84, + 0xE0134: 84, + 0xE0135: 84, + 0xE0136: 84, + 0xE0137: 84, + 0xE0138: 84, + 0xE0139: 84, + 0xE013A: 84, + 0xE013B: 84, + 0xE013C: 84, + 0xE013D: 84, + 0xE013E: 84, + 0xE013F: 84, + 0xE0140: 84, + 0xE0141: 84, + 0xE0142: 84, + 0xE0143: 84, + 0xE0144: 84, + 0xE0145: 84, + 0xE0146: 84, + 0xE0147: 84, + 0xE0148: 84, + 0xE0149: 84, + 0xE014A: 84, + 0xE014B: 84, + 0xE014C: 84, + 0xE014D: 84, + 0xE014E: 84, + 0xE014F: 84, + 0xE0150: 84, + 0xE0151: 84, + 0xE0152: 84, + 0xE0153: 84, + 0xE0154: 84, + 0xE0155: 84, + 0xE0156: 84, + 0xE0157: 84, + 0xE0158: 84, + 0xE0159: 84, + 0xE015A: 84, + 0xE015B: 84, + 0xE015C: 84, + 0xE015D: 84, + 0xE015E: 84, + 0xE015F: 84, + 0xE0160: 84, + 0xE0161: 84, + 0xE0162: 84, + 0xE0163: 84, + 0xE0164: 84, + 0xE0165: 84, + 0xE0166: 84, + 0xE0167: 84, + 0xE0168: 84, + 0xE0169: 84, + 0xE016A: 84, + 0xE016B: 84, + 0xE016C: 84, + 0xE016D: 84, + 0xE016E: 84, + 0xE016F: 84, + 0xE0170: 84, + 0xE0171: 84, + 0xE0172: 84, + 0xE0173: 84, + 0xE0174: 84, + 0xE0175: 84, + 0xE0176: 84, + 0xE0177: 84, + 0xE0178: 84, + 0xE0179: 84, + 0xE017A: 84, + 0xE017B: 84, + 0xE017C: 84, + 0xE017D: 84, + 0xE017E: 84, + 0xE017F: 84, + 0xE0180: 84, + 0xE0181: 84, + 0xE0182: 84, + 0xE0183: 84, + 0xE0184: 84, + 0xE0185: 84, + 0xE0186: 84, + 0xE0187: 84, + 0xE0188: 84, + 0xE0189: 84, + 0xE018A: 84, + 0xE018B: 84, + 0xE018C: 84, + 0xE018D: 84, + 0xE018E: 84, + 0xE018F: 84, + 0xE0190: 84, + 0xE0191: 84, + 0xE0192: 84, + 0xE0193: 84, + 0xE0194: 84, + 0xE0195: 84, + 0xE0196: 84, + 0xE0197: 84, + 0xE0198: 84, + 0xE0199: 84, + 0xE019A: 84, + 0xE019B: 84, + 0xE019C: 84, + 0xE019D: 84, + 0xE019E: 84, + 0xE019F: 84, + 0xE01A0: 84, + 0xE01A1: 84, + 0xE01A2: 84, + 0xE01A3: 84, + 0xE01A4: 84, + 0xE01A5: 84, + 0xE01A6: 84, + 0xE01A7: 84, + 0xE01A8: 84, + 0xE01A9: 84, + 0xE01AA: 84, + 0xE01AB: 84, + 0xE01AC: 84, + 0xE01AD: 84, + 0xE01AE: 84, + 0xE01AF: 84, + 0xE01B0: 84, + 0xE01B1: 84, + 0xE01B2: 84, + 0xE01B3: 84, + 0xE01B4: 84, + 0xE01B5: 84, + 0xE01B6: 84, + 0xE01B7: 84, + 0xE01B8: 84, + 0xE01B9: 84, + 0xE01BA: 84, + 0xE01BB: 84, + 0xE01BC: 84, + 0xE01BD: 84, + 0xE01BE: 84, + 0xE01BF: 84, + 0xE01C0: 84, + 0xE01C1: 84, + 0xE01C2: 84, + 0xE01C3: 84, + 0xE01C4: 84, + 0xE01C5: 84, + 0xE01C6: 84, + 0xE01C7: 84, + 0xE01C8: 84, + 0xE01C9: 84, + 0xE01CA: 84, + 0xE01CB: 84, + 0xE01CC: 84, + 0xE01CD: 84, + 0xE01CE: 84, + 0xE01CF: 84, + 0xE01D0: 84, + 0xE01D1: 84, + 0xE01D2: 84, + 0xE01D3: 84, + 0xE01D4: 84, + 0xE01D5: 84, + 0xE01D6: 84, + 0xE01D7: 84, + 0xE01D8: 84, + 0xE01D9: 84, + 0xE01DA: 84, + 0xE01DB: 84, + 0xE01DC: 84, + 0xE01DD: 84, + 0xE01DE: 84, + 0xE01DF: 84, + 0xE01E0: 84, + 0xE01E1: 84, + 0xE01E2: 84, + 0xE01E3: 84, + 0xE01E4: 84, + 0xE01E5: 84, + 0xE01E6: 84, + 0xE01E7: 84, + 0xE01E8: 84, + 0xE01E9: 84, + 0xE01EA: 84, + 0xE01EB: 84, + 0xE01EC: 84, + 0xE01ED: 84, + 0xE01EE: 84, + 0xE01EF: 84, } codepoint_classes = { - 'PVALID': ( - 0x2d0000002e, - 0x300000003a, - 0x610000007b, - 0xdf000000f7, - 0xf800000100, + "PVALID": ( + 0x2D0000002E, + 0x300000003A, + 0x610000007B, + 0xDF000000F7, + 0xF800000100, 0x10100000102, 0x10300000104, 0x10500000106, 0x10700000108, - 0x1090000010a, - 0x10b0000010c, - 0x10d0000010e, - 0x10f00000110, + 0x1090000010A, + 0x10B0000010C, + 0x10D0000010E, + 0x10F00000110, 0x11100000112, 0x11300000114, 0x11500000116, 0x11700000118, - 0x1190000011a, - 0x11b0000011c, - 0x11d0000011e, - 0x11f00000120, + 0x1190000011A, + 0x11B0000011C, + 0x11D0000011E, + 0x11F00000120, 0x12100000122, 0x12300000124, 0x12500000126, 0x12700000128, - 0x1290000012a, - 0x12b0000012c, - 0x12d0000012e, - 0x12f00000130, + 0x1290000012A, + 0x12B0000012C, + 0x12D0000012E, + 0x12F00000130, 0x13100000132, 0x13500000136, 0x13700000139, - 0x13a0000013b, - 0x13c0000013d, - 0x13e0000013f, + 0x13A0000013B, + 0x13C0000013D, + 0x13E0000013F, 0x14200000143, 0x14400000145, 0x14600000147, 0x14800000149, - 0x14b0000014c, - 0x14d0000014e, - 0x14f00000150, + 0x14B0000014C, + 0x14D0000014E, + 0x14F00000150, 0x15100000152, 0x15300000154, 0x15500000156, 0x15700000158, - 0x1590000015a, - 0x15b0000015c, - 0x15d0000015e, - 0x15f00000160, + 0x1590000015A, + 0x15B0000015C, + 0x15D0000015E, + 0x15F00000160, 0x16100000162, 0x16300000164, 0x16500000166, 0x16700000168, - 0x1690000016a, - 0x16b0000016c, - 0x16d0000016e, - 0x16f00000170, + 0x1690000016A, + 0x16B0000016C, + 0x16D0000016E, + 0x16F00000170, 0x17100000172, 0x17300000174, 0x17500000176, 0x17700000178, - 0x17a0000017b, - 0x17c0000017d, - 0x17e0000017f, + 0x17A0000017B, + 0x17C0000017D, + 0x17E0000017F, 0x18000000181, 0x18300000184, 0x18500000186, 0x18800000189, - 0x18c0000018e, + 0x18C0000018E, 0x19200000193, 0x19500000196, - 0x1990000019c, - 0x19e0000019f, - 0x1a1000001a2, - 0x1a3000001a4, - 0x1a5000001a6, - 0x1a8000001a9, - 0x1aa000001ac, - 0x1ad000001ae, - 0x1b0000001b1, - 0x1b4000001b5, - 0x1b6000001b7, - 0x1b9000001bc, - 0x1bd000001c4, - 0x1ce000001cf, - 0x1d0000001d1, - 0x1d2000001d3, - 0x1d4000001d5, - 0x1d6000001d7, - 0x1d8000001d9, - 0x1da000001db, - 0x1dc000001de, - 0x1df000001e0, - 0x1e1000001e2, - 0x1e3000001e4, - 0x1e5000001e6, - 0x1e7000001e8, - 0x1e9000001ea, - 0x1eb000001ec, - 0x1ed000001ee, - 0x1ef000001f1, - 0x1f5000001f6, - 0x1f9000001fa, - 0x1fb000001fc, - 0x1fd000001fe, - 0x1ff00000200, + 0x1990000019C, + 0x19E0000019F, + 0x1A1000001A2, + 0x1A3000001A4, + 0x1A5000001A6, + 0x1A8000001A9, + 0x1AA000001AC, + 0x1AD000001AE, + 0x1B0000001B1, + 0x1B4000001B5, + 0x1B6000001B7, + 0x1B9000001BC, + 0x1BD000001C4, + 0x1CE000001CF, + 0x1D0000001D1, + 0x1D2000001D3, + 0x1D4000001D5, + 0x1D6000001D7, + 0x1D8000001D9, + 0x1DA000001DB, + 0x1DC000001DE, + 0x1DF000001E0, + 0x1E1000001E2, + 0x1E3000001E4, + 0x1E5000001E6, + 0x1E7000001E8, + 0x1E9000001EA, + 0x1EB000001EC, + 0x1ED000001EE, + 0x1EF000001F1, + 0x1F5000001F6, + 0x1F9000001FA, + 0x1FB000001FC, + 0x1FD000001FE, + 0x1FF00000200, 0x20100000202, 0x20300000204, 0x20500000206, 0x20700000208, - 0x2090000020a, - 0x20b0000020c, - 0x20d0000020e, - 0x20f00000210, + 0x2090000020A, + 0x20B0000020C, + 0x20D0000020E, + 0x20F00000210, 0x21100000212, 0x21300000214, 0x21500000216, 0x21700000218, - 0x2190000021a, - 0x21b0000021c, - 0x21d0000021e, - 0x21f00000220, + 0x2190000021A, + 0x21B0000021C, + 0x21D0000021E, + 0x21F00000220, 0x22100000222, 0x22300000224, 0x22500000226, 0x22700000228, - 0x2290000022a, - 0x22b0000022c, - 0x22d0000022e, - 0x22f00000230, + 0x2290000022A, + 0x22B0000022C, + 0x22D0000022E, + 0x22F00000230, 0x23100000232, - 0x2330000023a, - 0x23c0000023d, - 0x23f00000241, + 0x2330000023A, + 0x23C0000023D, + 0x23F00000241, 0x24200000243, 0x24700000248, - 0x2490000024a, - 0x24b0000024c, - 0x24d0000024e, - 0x24f000002b0, - 0x2b9000002c2, - 0x2c6000002d2, - 0x2ec000002ed, - 0x2ee000002ef, + 0x2490000024A, + 0x24B0000024C, + 0x24D0000024E, + 0x24F000002B0, + 0x2B9000002C2, + 0x2C6000002D2, + 0x2EC000002ED, + 0x2EE000002EF, 0x30000000340, 0x34200000343, - 0x3460000034f, + 0x3460000034F, 0x35000000370, 0x37100000372, 0x37300000374, 0x37700000378, - 0x37b0000037e, + 0x37B0000037E, 0x39000000391, - 0x3ac000003cf, - 0x3d7000003d8, - 0x3d9000003da, - 0x3db000003dc, - 0x3dd000003de, - 0x3df000003e0, - 0x3e1000003e2, - 0x3e3000003e4, - 0x3e5000003e6, - 0x3e7000003e8, - 0x3e9000003ea, - 0x3eb000003ec, - 0x3ed000003ee, - 0x3ef000003f0, - 0x3f3000003f4, - 0x3f8000003f9, - 0x3fb000003fd, + 0x3AC000003CF, + 0x3D7000003D8, + 0x3D9000003DA, + 0x3DB000003DC, + 0x3DD000003DE, + 0x3DF000003E0, + 0x3E1000003E2, + 0x3E3000003E4, + 0x3E5000003E6, + 0x3E7000003E8, + 0x3E9000003EA, + 0x3EB000003EC, + 0x3ED000003EE, + 0x3EF000003F0, + 0x3F3000003F4, + 0x3F8000003F9, + 0x3FB000003FD, 0x43000000460, 0x46100000462, 0x46300000464, 0x46500000466, 0x46700000468, - 0x4690000046a, - 0x46b0000046c, - 0x46d0000046e, - 0x46f00000470, + 0x4690000046A, + 0x46B0000046C, + 0x46D0000046E, + 0x46F00000470, 0x47100000472, 0x47300000474, 0x47500000476, 0x47700000478, - 0x4790000047a, - 0x47b0000047c, - 0x47d0000047e, - 0x47f00000480, + 0x4790000047A, + 0x47B0000047C, + 0x47D0000047E, + 0x47F00000480, 0x48100000482, 0x48300000488, - 0x48b0000048c, - 0x48d0000048e, - 0x48f00000490, + 0x48B0000048C, + 0x48D0000048E, + 0x48F00000490, 0x49100000492, 0x49300000494, 0x49500000496, 0x49700000498, - 0x4990000049a, - 0x49b0000049c, - 0x49d0000049e, - 0x49f000004a0, - 0x4a1000004a2, - 0x4a3000004a4, - 0x4a5000004a6, - 0x4a7000004a8, - 0x4a9000004aa, - 0x4ab000004ac, - 0x4ad000004ae, - 0x4af000004b0, - 0x4b1000004b2, - 0x4b3000004b4, - 0x4b5000004b6, - 0x4b7000004b8, - 0x4b9000004ba, - 0x4bb000004bc, - 0x4bd000004be, - 0x4bf000004c0, - 0x4c2000004c3, - 0x4c4000004c5, - 0x4c6000004c7, - 0x4c8000004c9, - 0x4ca000004cb, - 0x4cc000004cd, - 0x4ce000004d0, - 0x4d1000004d2, - 0x4d3000004d4, - 0x4d5000004d6, - 0x4d7000004d8, - 0x4d9000004da, - 0x4db000004dc, - 0x4dd000004de, - 0x4df000004e0, - 0x4e1000004e2, - 0x4e3000004e4, - 0x4e5000004e6, - 0x4e7000004e8, - 0x4e9000004ea, - 0x4eb000004ec, - 0x4ed000004ee, - 0x4ef000004f0, - 0x4f1000004f2, - 0x4f3000004f4, - 0x4f5000004f6, - 0x4f7000004f8, - 0x4f9000004fa, - 0x4fb000004fc, - 0x4fd000004fe, - 0x4ff00000500, + 0x4990000049A, + 0x49B0000049C, + 0x49D0000049E, + 0x49F000004A0, + 0x4A1000004A2, + 0x4A3000004A4, + 0x4A5000004A6, + 0x4A7000004A8, + 0x4A9000004AA, + 0x4AB000004AC, + 0x4AD000004AE, + 0x4AF000004B0, + 0x4B1000004B2, + 0x4B3000004B4, + 0x4B5000004B6, + 0x4B7000004B8, + 0x4B9000004BA, + 0x4BB000004BC, + 0x4BD000004BE, + 0x4BF000004C0, + 0x4C2000004C3, + 0x4C4000004C5, + 0x4C6000004C7, + 0x4C8000004C9, + 0x4CA000004CB, + 0x4CC000004CD, + 0x4CE000004D0, + 0x4D1000004D2, + 0x4D3000004D4, + 0x4D5000004D6, + 0x4D7000004D8, + 0x4D9000004DA, + 0x4DB000004DC, + 0x4DD000004DE, + 0x4DF000004E0, + 0x4E1000004E2, + 0x4E3000004E4, + 0x4E5000004E6, + 0x4E7000004E8, + 0x4E9000004EA, + 0x4EB000004EC, + 0x4ED000004EE, + 0x4EF000004F0, + 0x4F1000004F2, + 0x4F3000004F4, + 0x4F5000004F6, + 0x4F7000004F8, + 0x4F9000004FA, + 0x4FB000004FC, + 0x4FD000004FE, + 0x4FF00000500, 0x50100000502, 0x50300000504, 0x50500000506, 0x50700000508, - 0x5090000050a, - 0x50b0000050c, - 0x50d0000050e, - 0x50f00000510, + 0x5090000050A, + 0x50B0000050C, + 0x50D0000050E, + 0x50F00000510, 0x51100000512, 0x51300000514, 0x51500000516, 0x51700000518, - 0x5190000051a, - 0x51b0000051c, - 0x51d0000051e, - 0x51f00000520, + 0x5190000051A, + 0x51B0000051C, + 0x51D0000051E, + 0x51F00000520, 0x52100000522, 0x52300000524, 0x52500000526, 0x52700000528, - 0x5290000052a, - 0x52b0000052c, - 0x52d0000052e, - 0x52f00000530, - 0x5590000055a, + 0x5290000052A, + 0x52B0000052C, + 0x52D0000052E, + 0x52F00000530, + 0x5590000055A, 0x56000000587, 0x58800000589, - 0x591000005be, - 0x5bf000005c0, - 0x5c1000005c3, - 0x5c4000005c6, - 0x5c7000005c8, - 0x5d0000005eb, - 0x5ef000005f3, - 0x6100000061b, + 0x591000005BE, + 0x5BF000005C0, + 0x5C1000005C3, + 0x5C4000005C6, + 0x5C7000005C8, + 0x5D0000005EB, + 0x5EF000005F3, + 0x6100000061B, 0x62000000640, 0x64100000660, - 0x66e00000675, - 0x679000006d4, - 0x6d5000006dd, - 0x6df000006e9, - 0x6ea000006f0, - 0x6fa00000700, - 0x7100000074b, - 0x74d000007b2, - 0x7c0000007f6, - 0x7fd000007fe, - 0x8000000082e, - 0x8400000085c, - 0x8600000086b, + 0x66E00000675, + 0x679000006D4, + 0x6D5000006DD, + 0x6DF000006E9, + 0x6EA000006F0, + 0x6FA00000700, + 0x7100000074B, + 0x74D000007B2, + 0x7C0000007F6, + 0x7FD000007FE, + 0x8000000082E, + 0x8400000085C, + 0x8600000086B, 0x87000000888, - 0x8890000088f, - 0x898000008e2, - 0x8e300000958, + 0x8890000088F, + 0x898000008E2, + 0x8E300000958, 0x96000000964, 0x96600000970, 0x97100000984, - 0x9850000098d, - 0x98f00000991, - 0x993000009a9, - 0x9aa000009b1, - 0x9b2000009b3, - 0x9b6000009ba, - 0x9bc000009c5, - 0x9c7000009c9, - 0x9cb000009cf, - 0x9d7000009d8, - 0x9e0000009e4, - 0x9e6000009f2, - 0x9fc000009fd, - 0x9fe000009ff, - 0xa0100000a04, - 0xa0500000a0b, - 0xa0f00000a11, - 0xa1300000a29, - 0xa2a00000a31, - 0xa3200000a33, - 0xa3500000a36, - 0xa3800000a3a, - 0xa3c00000a3d, - 0xa3e00000a43, - 0xa4700000a49, - 0xa4b00000a4e, - 0xa5100000a52, - 0xa5c00000a5d, - 0xa6600000a76, - 0xa8100000a84, - 0xa8500000a8e, - 0xa8f00000a92, - 0xa9300000aa9, - 0xaaa00000ab1, - 0xab200000ab4, - 0xab500000aba, - 0xabc00000ac6, - 0xac700000aca, - 0xacb00000ace, - 0xad000000ad1, - 0xae000000ae4, - 0xae600000af0, - 0xaf900000b00, - 0xb0100000b04, - 0xb0500000b0d, - 0xb0f00000b11, - 0xb1300000b29, - 0xb2a00000b31, - 0xb3200000b34, - 0xb3500000b3a, - 0xb3c00000b45, - 0xb4700000b49, - 0xb4b00000b4e, - 0xb5500000b58, - 0xb5f00000b64, - 0xb6600000b70, - 0xb7100000b72, - 0xb8200000b84, - 0xb8500000b8b, - 0xb8e00000b91, - 0xb9200000b96, - 0xb9900000b9b, - 0xb9c00000b9d, - 0xb9e00000ba0, - 0xba300000ba5, - 0xba800000bab, - 0xbae00000bba, - 0xbbe00000bc3, - 0xbc600000bc9, - 0xbca00000bce, - 0xbd000000bd1, - 0xbd700000bd8, - 0xbe600000bf0, - 0xc0000000c0d, - 0xc0e00000c11, - 0xc1200000c29, - 0xc2a00000c3a, - 0xc3c00000c45, - 0xc4600000c49, - 0xc4a00000c4e, - 0xc5500000c57, - 0xc5800000c5b, - 0xc5d00000c5e, - 0xc6000000c64, - 0xc6600000c70, - 0xc8000000c84, - 0xc8500000c8d, - 0xc8e00000c91, - 0xc9200000ca9, - 0xcaa00000cb4, - 0xcb500000cba, - 0xcbc00000cc5, - 0xcc600000cc9, - 0xcca00000cce, - 0xcd500000cd7, - 0xcdd00000cdf, - 0xce000000ce4, - 0xce600000cf0, - 0xcf100000cf4, - 0xd0000000d0d, - 0xd0e00000d11, - 0xd1200000d45, - 0xd4600000d49, - 0xd4a00000d4f, - 0xd5400000d58, - 0xd5f00000d64, - 0xd6600000d70, - 0xd7a00000d80, - 0xd8100000d84, - 0xd8500000d97, - 0xd9a00000db2, - 0xdb300000dbc, - 0xdbd00000dbe, - 0xdc000000dc7, - 0xdca00000dcb, - 0xdcf00000dd5, - 0xdd600000dd7, - 0xdd800000de0, - 0xde600000df0, - 0xdf200000df4, - 0xe0100000e33, - 0xe3400000e3b, - 0xe4000000e4f, - 0xe5000000e5a, - 0xe8100000e83, - 0xe8400000e85, - 0xe8600000e8b, - 0xe8c00000ea4, - 0xea500000ea6, - 0xea700000eb3, - 0xeb400000ebe, - 0xec000000ec5, - 0xec600000ec7, - 0xec800000ecf, - 0xed000000eda, - 0xede00000ee0, - 0xf0000000f01, - 0xf0b00000f0c, - 0xf1800000f1a, - 0xf2000000f2a, - 0xf3500000f36, - 0xf3700000f38, - 0xf3900000f3a, - 0xf3e00000f43, - 0xf4400000f48, - 0xf4900000f4d, - 0xf4e00000f52, - 0xf5300000f57, - 0xf5800000f5c, - 0xf5d00000f69, - 0xf6a00000f6d, - 0xf7100000f73, - 0xf7400000f75, - 0xf7a00000f81, - 0xf8200000f85, - 0xf8600000f93, - 0xf9400000f98, - 0xf9900000f9d, - 0xf9e00000fa2, - 0xfa300000fa7, - 0xfa800000fac, - 0xfad00000fb9, - 0xfba00000fbd, - 0xfc600000fc7, - 0x10000000104a, - 0x10500000109e, - 0x10d0000010fb, - 0x10fd00001100, + 0x9850000098D, + 0x98F00000991, + 0x993000009A9, + 0x9AA000009B1, + 0x9B2000009B3, + 0x9B6000009BA, + 0x9BC000009C5, + 0x9C7000009C9, + 0x9CB000009CF, + 0x9D7000009D8, + 0x9E0000009E4, + 0x9E6000009F2, + 0x9FC000009FD, + 0x9FE000009FF, + 0xA0100000A04, + 0xA0500000A0B, + 0xA0F00000A11, + 0xA1300000A29, + 0xA2A00000A31, + 0xA3200000A33, + 0xA3500000A36, + 0xA3800000A3A, + 0xA3C00000A3D, + 0xA3E00000A43, + 0xA4700000A49, + 0xA4B00000A4E, + 0xA5100000A52, + 0xA5C00000A5D, + 0xA6600000A76, + 0xA8100000A84, + 0xA8500000A8E, + 0xA8F00000A92, + 0xA9300000AA9, + 0xAAA00000AB1, + 0xAB200000AB4, + 0xAB500000ABA, + 0xABC00000AC6, + 0xAC700000ACA, + 0xACB00000ACE, + 0xAD000000AD1, + 0xAE000000AE4, + 0xAE600000AF0, + 0xAF900000B00, + 0xB0100000B04, + 0xB0500000B0D, + 0xB0F00000B11, + 0xB1300000B29, + 0xB2A00000B31, + 0xB3200000B34, + 0xB3500000B3A, + 0xB3C00000B45, + 0xB4700000B49, + 0xB4B00000B4E, + 0xB5500000B58, + 0xB5F00000B64, + 0xB6600000B70, + 0xB7100000B72, + 0xB8200000B84, + 0xB8500000B8B, + 0xB8E00000B91, + 0xB9200000B96, + 0xB9900000B9B, + 0xB9C00000B9D, + 0xB9E00000BA0, + 0xBA300000BA5, + 0xBA800000BAB, + 0xBAE00000BBA, + 0xBBE00000BC3, + 0xBC600000BC9, + 0xBCA00000BCE, + 0xBD000000BD1, + 0xBD700000BD8, + 0xBE600000BF0, + 0xC0000000C0D, + 0xC0E00000C11, + 0xC1200000C29, + 0xC2A00000C3A, + 0xC3C00000C45, + 0xC4600000C49, + 0xC4A00000C4E, + 0xC5500000C57, + 0xC5800000C5B, + 0xC5D00000C5E, + 0xC6000000C64, + 0xC6600000C70, + 0xC8000000C84, + 0xC8500000C8D, + 0xC8E00000C91, + 0xC9200000CA9, + 0xCAA00000CB4, + 0xCB500000CBA, + 0xCBC00000CC5, + 0xCC600000CC9, + 0xCCA00000CCE, + 0xCD500000CD7, + 0xCDD00000CDF, + 0xCE000000CE4, + 0xCE600000CF0, + 0xCF100000CF4, + 0xD0000000D0D, + 0xD0E00000D11, + 0xD1200000D45, + 0xD4600000D49, + 0xD4A00000D4F, + 0xD5400000D58, + 0xD5F00000D64, + 0xD6600000D70, + 0xD7A00000D80, + 0xD8100000D84, + 0xD8500000D97, + 0xD9A00000DB2, + 0xDB300000DBC, + 0xDBD00000DBE, + 0xDC000000DC7, + 0xDCA00000DCB, + 0xDCF00000DD5, + 0xDD600000DD7, + 0xDD800000DE0, + 0xDE600000DF0, + 0xDF200000DF4, + 0xE0100000E33, + 0xE3400000E3B, + 0xE4000000E4F, + 0xE5000000E5A, + 0xE8100000E83, + 0xE8400000E85, + 0xE8600000E8B, + 0xE8C00000EA4, + 0xEA500000EA6, + 0xEA700000EB3, + 0xEB400000EBE, + 0xEC000000EC5, + 0xEC600000EC7, + 0xEC800000ECF, + 0xED000000EDA, + 0xEDE00000EE0, + 0xF0000000F01, + 0xF0B00000F0C, + 0xF1800000F1A, + 0xF2000000F2A, + 0xF3500000F36, + 0xF3700000F38, + 0xF3900000F3A, + 0xF3E00000F43, + 0xF4400000F48, + 0xF4900000F4D, + 0xF4E00000F52, + 0xF5300000F57, + 0xF5800000F5C, + 0xF5D00000F69, + 0xF6A00000F6D, + 0xF7100000F73, + 0xF7400000F75, + 0xF7A00000F81, + 0xF8200000F85, + 0xF8600000F93, + 0xF9400000F98, + 0xF9900000F9D, + 0xF9E00000FA2, + 0xFA300000FA7, + 0xFA800000FAC, + 0xFAD00000FB9, + 0xFBA00000FBD, + 0xFC600000FC7, + 0x10000000104A, + 0x10500000109E, + 0x10D0000010FB, + 0x10FD00001100, 0x120000001249, - 0x124a0000124e, + 0x124A0000124E, 0x125000001257, 0x125800001259, - 0x125a0000125e, + 0x125A0000125E, 0x126000001289, - 0x128a0000128e, - 0x1290000012b1, - 0x12b2000012b6, - 0x12b8000012bf, - 0x12c0000012c1, - 0x12c2000012c6, - 0x12c8000012d7, - 0x12d800001311, + 0x128A0000128E, + 0x1290000012B1, + 0x12B2000012B6, + 0x12B8000012BF, + 0x12C0000012C1, + 0x12C2000012C6, + 0x12C8000012D7, + 0x12D800001311, 0x131200001316, - 0x13180000135b, - 0x135d00001360, + 0x13180000135B, + 0x135D00001360, 0x138000001390, - 0x13a0000013f6, - 0x14010000166d, - 0x166f00001680, - 0x16810000169b, - 0x16a0000016eb, - 0x16f1000016f9, + 0x13A0000013F6, + 0x14010000166D, + 0x166F00001680, + 0x16810000169B, + 0x16A0000016EB, + 0x16F1000016F9, 0x170000001716, - 0x171f00001735, + 0x171F00001735, 0x174000001754, - 0x17600000176d, - 0x176e00001771, + 0x17600000176D, + 0x176E00001771, 0x177200001774, - 0x1780000017b4, - 0x17b6000017d4, - 0x17d7000017d8, - 0x17dc000017de, - 0x17e0000017ea, - 0x18100000181a, + 0x1780000017B4, + 0x17B6000017D4, + 0x17D7000017D8, + 0x17DC000017DE, + 0x17E0000017EA, + 0x18100000181A, 0x182000001879, - 0x1880000018ab, - 0x18b0000018f6, - 0x19000000191f, - 0x19200000192c, - 0x19300000193c, - 0x19460000196e, + 0x1880000018AB, + 0x18B0000018F6, + 0x19000000191F, + 0x19200000192C, + 0x19300000193C, + 0x19460000196E, 0x197000001975, - 0x1980000019ac, - 0x19b0000019ca, - 0x19d0000019da, - 0x1a0000001a1c, - 0x1a2000001a5f, - 0x1a6000001a7d, - 0x1a7f00001a8a, - 0x1a9000001a9a, - 0x1aa700001aa8, - 0x1ab000001abe, - 0x1abf00001acf, - 0x1b0000001b4d, - 0x1b5000001b5a, - 0x1b6b00001b74, - 0x1b8000001bf4, - 0x1c0000001c38, - 0x1c4000001c4a, - 0x1c4d00001c7e, - 0x1cd000001cd3, - 0x1cd400001cfb, - 0x1d0000001d2c, - 0x1d2f00001d30, - 0x1d3b00001d3c, - 0x1d4e00001d4f, - 0x1d6b00001d78, - 0x1d7900001d9b, - 0x1dc000001e00, - 0x1e0100001e02, - 0x1e0300001e04, - 0x1e0500001e06, - 0x1e0700001e08, - 0x1e0900001e0a, - 0x1e0b00001e0c, - 0x1e0d00001e0e, - 0x1e0f00001e10, - 0x1e1100001e12, - 0x1e1300001e14, - 0x1e1500001e16, - 0x1e1700001e18, - 0x1e1900001e1a, - 0x1e1b00001e1c, - 0x1e1d00001e1e, - 0x1e1f00001e20, - 0x1e2100001e22, - 0x1e2300001e24, - 0x1e2500001e26, - 0x1e2700001e28, - 0x1e2900001e2a, - 0x1e2b00001e2c, - 0x1e2d00001e2e, - 0x1e2f00001e30, - 0x1e3100001e32, - 0x1e3300001e34, - 0x1e3500001e36, - 0x1e3700001e38, - 0x1e3900001e3a, - 0x1e3b00001e3c, - 0x1e3d00001e3e, - 0x1e3f00001e40, - 0x1e4100001e42, - 0x1e4300001e44, - 0x1e4500001e46, - 0x1e4700001e48, - 0x1e4900001e4a, - 0x1e4b00001e4c, - 0x1e4d00001e4e, - 0x1e4f00001e50, - 0x1e5100001e52, - 0x1e5300001e54, - 0x1e5500001e56, - 0x1e5700001e58, - 0x1e5900001e5a, - 0x1e5b00001e5c, - 0x1e5d00001e5e, - 0x1e5f00001e60, - 0x1e6100001e62, - 0x1e6300001e64, - 0x1e6500001e66, - 0x1e6700001e68, - 0x1e6900001e6a, - 0x1e6b00001e6c, - 0x1e6d00001e6e, - 0x1e6f00001e70, - 0x1e7100001e72, - 0x1e7300001e74, - 0x1e7500001e76, - 0x1e7700001e78, - 0x1e7900001e7a, - 0x1e7b00001e7c, - 0x1e7d00001e7e, - 0x1e7f00001e80, - 0x1e8100001e82, - 0x1e8300001e84, - 0x1e8500001e86, - 0x1e8700001e88, - 0x1e8900001e8a, - 0x1e8b00001e8c, - 0x1e8d00001e8e, - 0x1e8f00001e90, - 0x1e9100001e92, - 0x1e9300001e94, - 0x1e9500001e9a, - 0x1e9c00001e9e, - 0x1e9f00001ea0, - 0x1ea100001ea2, - 0x1ea300001ea4, - 0x1ea500001ea6, - 0x1ea700001ea8, - 0x1ea900001eaa, - 0x1eab00001eac, - 0x1ead00001eae, - 0x1eaf00001eb0, - 0x1eb100001eb2, - 0x1eb300001eb4, - 0x1eb500001eb6, - 0x1eb700001eb8, - 0x1eb900001eba, - 0x1ebb00001ebc, - 0x1ebd00001ebe, - 0x1ebf00001ec0, - 0x1ec100001ec2, - 0x1ec300001ec4, - 0x1ec500001ec6, - 0x1ec700001ec8, - 0x1ec900001eca, - 0x1ecb00001ecc, - 0x1ecd00001ece, - 0x1ecf00001ed0, - 0x1ed100001ed2, - 0x1ed300001ed4, - 0x1ed500001ed6, - 0x1ed700001ed8, - 0x1ed900001eda, - 0x1edb00001edc, - 0x1edd00001ede, - 0x1edf00001ee0, - 0x1ee100001ee2, - 0x1ee300001ee4, - 0x1ee500001ee6, - 0x1ee700001ee8, - 0x1ee900001eea, - 0x1eeb00001eec, - 0x1eed00001eee, - 0x1eef00001ef0, - 0x1ef100001ef2, - 0x1ef300001ef4, - 0x1ef500001ef6, - 0x1ef700001ef8, - 0x1ef900001efa, - 0x1efb00001efc, - 0x1efd00001efe, - 0x1eff00001f08, - 0x1f1000001f16, - 0x1f2000001f28, - 0x1f3000001f38, - 0x1f4000001f46, - 0x1f5000001f58, - 0x1f6000001f68, - 0x1f7000001f71, - 0x1f7200001f73, - 0x1f7400001f75, - 0x1f7600001f77, - 0x1f7800001f79, - 0x1f7a00001f7b, - 0x1f7c00001f7d, - 0x1fb000001fb2, - 0x1fb600001fb7, - 0x1fc600001fc7, - 0x1fd000001fd3, - 0x1fd600001fd8, - 0x1fe000001fe3, - 0x1fe400001fe8, - 0x1ff600001ff7, - 0x214e0000214f, + 0x1980000019AC, + 0x19B0000019CA, + 0x19D0000019DA, + 0x1A0000001A1C, + 0x1A2000001A5F, + 0x1A6000001A7D, + 0x1A7F00001A8A, + 0x1A9000001A9A, + 0x1AA700001AA8, + 0x1AB000001ABE, + 0x1ABF00001ACF, + 0x1B0000001B4D, + 0x1B5000001B5A, + 0x1B6B00001B74, + 0x1B8000001BF4, + 0x1C0000001C38, + 0x1C4000001C4A, + 0x1C4D00001C7E, + 0x1CD000001CD3, + 0x1CD400001CFB, + 0x1D0000001D2C, + 0x1D2F00001D30, + 0x1D3B00001D3C, + 0x1D4E00001D4F, + 0x1D6B00001D78, + 0x1D7900001D9B, + 0x1DC000001E00, + 0x1E0100001E02, + 0x1E0300001E04, + 0x1E0500001E06, + 0x1E0700001E08, + 0x1E0900001E0A, + 0x1E0B00001E0C, + 0x1E0D00001E0E, + 0x1E0F00001E10, + 0x1E1100001E12, + 0x1E1300001E14, + 0x1E1500001E16, + 0x1E1700001E18, + 0x1E1900001E1A, + 0x1E1B00001E1C, + 0x1E1D00001E1E, + 0x1E1F00001E20, + 0x1E2100001E22, + 0x1E2300001E24, + 0x1E2500001E26, + 0x1E2700001E28, + 0x1E2900001E2A, + 0x1E2B00001E2C, + 0x1E2D00001E2E, + 0x1E2F00001E30, + 0x1E3100001E32, + 0x1E3300001E34, + 0x1E3500001E36, + 0x1E3700001E38, + 0x1E3900001E3A, + 0x1E3B00001E3C, + 0x1E3D00001E3E, + 0x1E3F00001E40, + 0x1E4100001E42, + 0x1E4300001E44, + 0x1E4500001E46, + 0x1E4700001E48, + 0x1E4900001E4A, + 0x1E4B00001E4C, + 0x1E4D00001E4E, + 0x1E4F00001E50, + 0x1E5100001E52, + 0x1E5300001E54, + 0x1E5500001E56, + 0x1E5700001E58, + 0x1E5900001E5A, + 0x1E5B00001E5C, + 0x1E5D00001E5E, + 0x1E5F00001E60, + 0x1E6100001E62, + 0x1E6300001E64, + 0x1E6500001E66, + 0x1E6700001E68, + 0x1E6900001E6A, + 0x1E6B00001E6C, + 0x1E6D00001E6E, + 0x1E6F00001E70, + 0x1E7100001E72, + 0x1E7300001E74, + 0x1E7500001E76, + 0x1E7700001E78, + 0x1E7900001E7A, + 0x1E7B00001E7C, + 0x1E7D00001E7E, + 0x1E7F00001E80, + 0x1E8100001E82, + 0x1E8300001E84, + 0x1E8500001E86, + 0x1E8700001E88, + 0x1E8900001E8A, + 0x1E8B00001E8C, + 0x1E8D00001E8E, + 0x1E8F00001E90, + 0x1E9100001E92, + 0x1E9300001E94, + 0x1E9500001E9A, + 0x1E9C00001E9E, + 0x1E9F00001EA0, + 0x1EA100001EA2, + 0x1EA300001EA4, + 0x1EA500001EA6, + 0x1EA700001EA8, + 0x1EA900001EAA, + 0x1EAB00001EAC, + 0x1EAD00001EAE, + 0x1EAF00001EB0, + 0x1EB100001EB2, + 0x1EB300001EB4, + 0x1EB500001EB6, + 0x1EB700001EB8, + 0x1EB900001EBA, + 0x1EBB00001EBC, + 0x1EBD00001EBE, + 0x1EBF00001EC0, + 0x1EC100001EC2, + 0x1EC300001EC4, + 0x1EC500001EC6, + 0x1EC700001EC8, + 0x1EC900001ECA, + 0x1ECB00001ECC, + 0x1ECD00001ECE, + 0x1ECF00001ED0, + 0x1ED100001ED2, + 0x1ED300001ED4, + 0x1ED500001ED6, + 0x1ED700001ED8, + 0x1ED900001EDA, + 0x1EDB00001EDC, + 0x1EDD00001EDE, + 0x1EDF00001EE0, + 0x1EE100001EE2, + 0x1EE300001EE4, + 0x1EE500001EE6, + 0x1EE700001EE8, + 0x1EE900001EEA, + 0x1EEB00001EEC, + 0x1EED00001EEE, + 0x1EEF00001EF0, + 0x1EF100001EF2, + 0x1EF300001EF4, + 0x1EF500001EF6, + 0x1EF700001EF8, + 0x1EF900001EFA, + 0x1EFB00001EFC, + 0x1EFD00001EFE, + 0x1EFF00001F08, + 0x1F1000001F16, + 0x1F2000001F28, + 0x1F3000001F38, + 0x1F4000001F46, + 0x1F5000001F58, + 0x1F6000001F68, + 0x1F7000001F71, + 0x1F7200001F73, + 0x1F7400001F75, + 0x1F7600001F77, + 0x1F7800001F79, + 0x1F7A00001F7B, + 0x1F7C00001F7D, + 0x1FB000001FB2, + 0x1FB600001FB7, + 0x1FC600001FC7, + 0x1FD000001FD3, + 0x1FD600001FD8, + 0x1FE000001FE3, + 0x1FE400001FE8, + 0x1FF600001FF7, + 0x214E0000214F, 0x218400002185, - 0x2c3000002c60, - 0x2c6100002c62, - 0x2c6500002c67, - 0x2c6800002c69, - 0x2c6a00002c6b, - 0x2c6c00002c6d, - 0x2c7100002c72, - 0x2c7300002c75, - 0x2c7600002c7c, - 0x2c8100002c82, - 0x2c8300002c84, - 0x2c8500002c86, - 0x2c8700002c88, - 0x2c8900002c8a, - 0x2c8b00002c8c, - 0x2c8d00002c8e, - 0x2c8f00002c90, - 0x2c9100002c92, - 0x2c9300002c94, - 0x2c9500002c96, - 0x2c9700002c98, - 0x2c9900002c9a, - 0x2c9b00002c9c, - 0x2c9d00002c9e, - 0x2c9f00002ca0, - 0x2ca100002ca2, - 0x2ca300002ca4, - 0x2ca500002ca6, - 0x2ca700002ca8, - 0x2ca900002caa, - 0x2cab00002cac, - 0x2cad00002cae, - 0x2caf00002cb0, - 0x2cb100002cb2, - 0x2cb300002cb4, - 0x2cb500002cb6, - 0x2cb700002cb8, - 0x2cb900002cba, - 0x2cbb00002cbc, - 0x2cbd00002cbe, - 0x2cbf00002cc0, - 0x2cc100002cc2, - 0x2cc300002cc4, - 0x2cc500002cc6, - 0x2cc700002cc8, - 0x2cc900002cca, - 0x2ccb00002ccc, - 0x2ccd00002cce, - 0x2ccf00002cd0, - 0x2cd100002cd2, - 0x2cd300002cd4, - 0x2cd500002cd6, - 0x2cd700002cd8, - 0x2cd900002cda, - 0x2cdb00002cdc, - 0x2cdd00002cde, - 0x2cdf00002ce0, - 0x2ce100002ce2, - 0x2ce300002ce5, - 0x2cec00002ced, - 0x2cee00002cf2, - 0x2cf300002cf4, - 0x2d0000002d26, - 0x2d2700002d28, - 0x2d2d00002d2e, - 0x2d3000002d68, - 0x2d7f00002d97, - 0x2da000002da7, - 0x2da800002daf, - 0x2db000002db7, - 0x2db800002dbf, - 0x2dc000002dc7, - 0x2dc800002dcf, - 0x2dd000002dd7, - 0x2dd800002ddf, - 0x2de000002e00, - 0x2e2f00002e30, + 0x2C3000002C60, + 0x2C6100002C62, + 0x2C6500002C67, + 0x2C6800002C69, + 0x2C6A00002C6B, + 0x2C6C00002C6D, + 0x2C7100002C72, + 0x2C7300002C75, + 0x2C7600002C7C, + 0x2C8100002C82, + 0x2C8300002C84, + 0x2C8500002C86, + 0x2C8700002C88, + 0x2C8900002C8A, + 0x2C8B00002C8C, + 0x2C8D00002C8E, + 0x2C8F00002C90, + 0x2C9100002C92, + 0x2C9300002C94, + 0x2C9500002C96, + 0x2C9700002C98, + 0x2C9900002C9A, + 0x2C9B00002C9C, + 0x2C9D00002C9E, + 0x2C9F00002CA0, + 0x2CA100002CA2, + 0x2CA300002CA4, + 0x2CA500002CA6, + 0x2CA700002CA8, + 0x2CA900002CAA, + 0x2CAB00002CAC, + 0x2CAD00002CAE, + 0x2CAF00002CB0, + 0x2CB100002CB2, + 0x2CB300002CB4, + 0x2CB500002CB6, + 0x2CB700002CB8, + 0x2CB900002CBA, + 0x2CBB00002CBC, + 0x2CBD00002CBE, + 0x2CBF00002CC0, + 0x2CC100002CC2, + 0x2CC300002CC4, + 0x2CC500002CC6, + 0x2CC700002CC8, + 0x2CC900002CCA, + 0x2CCB00002CCC, + 0x2CCD00002CCE, + 0x2CCF00002CD0, + 0x2CD100002CD2, + 0x2CD300002CD4, + 0x2CD500002CD6, + 0x2CD700002CD8, + 0x2CD900002CDA, + 0x2CDB00002CDC, + 0x2CDD00002CDE, + 0x2CDF00002CE0, + 0x2CE100002CE2, + 0x2CE300002CE5, + 0x2CEC00002CED, + 0x2CEE00002CF2, + 0x2CF300002CF4, + 0x2D0000002D26, + 0x2D2700002D28, + 0x2D2D00002D2E, + 0x2D3000002D68, + 0x2D7F00002D97, + 0x2DA000002DA7, + 0x2DA800002DAF, + 0x2DB000002DB7, + 0x2DB800002DBF, + 0x2DC000002DC7, + 0x2DC800002DCF, + 0x2DD000002DD7, + 0x2DD800002DDF, + 0x2DE000002E00, + 0x2E2F00002E30, 0x300500003008, - 0x302a0000302e, - 0x303c0000303d, + 0x302A0000302E, + 0x303C0000303D, 0x304100003097, - 0x30990000309b, - 0x309d0000309f, - 0x30a1000030fb, - 0x30fc000030ff, + 0x30990000309B, + 0x309D0000309F, + 0x30A1000030FB, + 0x30FC000030FF, 0x310500003130, - 0x31a0000031c0, - 0x31f000003200, - 0x340000004dc0, - 0x4e000000a48d, - 0xa4d00000a4fe, - 0xa5000000a60d, - 0xa6100000a62c, - 0xa6410000a642, - 0xa6430000a644, - 0xa6450000a646, - 0xa6470000a648, - 0xa6490000a64a, - 0xa64b0000a64c, - 0xa64d0000a64e, - 0xa64f0000a650, - 0xa6510000a652, - 0xa6530000a654, - 0xa6550000a656, - 0xa6570000a658, - 0xa6590000a65a, - 0xa65b0000a65c, - 0xa65d0000a65e, - 0xa65f0000a660, - 0xa6610000a662, - 0xa6630000a664, - 0xa6650000a666, - 0xa6670000a668, - 0xa6690000a66a, - 0xa66b0000a66c, - 0xa66d0000a670, - 0xa6740000a67e, - 0xa67f0000a680, - 0xa6810000a682, - 0xa6830000a684, - 0xa6850000a686, - 0xa6870000a688, - 0xa6890000a68a, - 0xa68b0000a68c, - 0xa68d0000a68e, - 0xa68f0000a690, - 0xa6910000a692, - 0xa6930000a694, - 0xa6950000a696, - 0xa6970000a698, - 0xa6990000a69a, - 0xa69b0000a69c, - 0xa69e0000a6e6, - 0xa6f00000a6f2, - 0xa7170000a720, - 0xa7230000a724, - 0xa7250000a726, - 0xa7270000a728, - 0xa7290000a72a, - 0xa72b0000a72c, - 0xa72d0000a72e, - 0xa72f0000a732, - 0xa7330000a734, - 0xa7350000a736, - 0xa7370000a738, - 0xa7390000a73a, - 0xa73b0000a73c, - 0xa73d0000a73e, - 0xa73f0000a740, - 0xa7410000a742, - 0xa7430000a744, - 0xa7450000a746, - 0xa7470000a748, - 0xa7490000a74a, - 0xa74b0000a74c, - 0xa74d0000a74e, - 0xa74f0000a750, - 0xa7510000a752, - 0xa7530000a754, - 0xa7550000a756, - 0xa7570000a758, - 0xa7590000a75a, - 0xa75b0000a75c, - 0xa75d0000a75e, - 0xa75f0000a760, - 0xa7610000a762, - 0xa7630000a764, - 0xa7650000a766, - 0xa7670000a768, - 0xa7690000a76a, - 0xa76b0000a76c, - 0xa76d0000a76e, - 0xa76f0000a770, - 0xa7710000a779, - 0xa77a0000a77b, - 0xa77c0000a77d, - 0xa77f0000a780, - 0xa7810000a782, - 0xa7830000a784, - 0xa7850000a786, - 0xa7870000a789, - 0xa78c0000a78d, - 0xa78e0000a790, - 0xa7910000a792, - 0xa7930000a796, - 0xa7970000a798, - 0xa7990000a79a, - 0xa79b0000a79c, - 0xa79d0000a79e, - 0xa79f0000a7a0, - 0xa7a10000a7a2, - 0xa7a30000a7a4, - 0xa7a50000a7a6, - 0xa7a70000a7a8, - 0xa7a90000a7aa, - 0xa7af0000a7b0, - 0xa7b50000a7b6, - 0xa7b70000a7b8, - 0xa7b90000a7ba, - 0xa7bb0000a7bc, - 0xa7bd0000a7be, - 0xa7bf0000a7c0, - 0xa7c10000a7c2, - 0xa7c30000a7c4, - 0xa7c80000a7c9, - 0xa7ca0000a7cb, - 0xa7d10000a7d2, - 0xa7d30000a7d4, - 0xa7d50000a7d6, - 0xa7d70000a7d8, - 0xa7d90000a7da, - 0xa7f60000a7f8, - 0xa7fa0000a828, - 0xa82c0000a82d, - 0xa8400000a874, - 0xa8800000a8c6, - 0xa8d00000a8da, - 0xa8e00000a8f8, - 0xa8fb0000a8fc, - 0xa8fd0000a92e, - 0xa9300000a954, - 0xa9800000a9c1, - 0xa9cf0000a9da, - 0xa9e00000a9ff, - 0xaa000000aa37, - 0xaa400000aa4e, - 0xaa500000aa5a, - 0xaa600000aa77, - 0xaa7a0000aac3, - 0xaadb0000aade, - 0xaae00000aaf0, - 0xaaf20000aaf7, - 0xab010000ab07, - 0xab090000ab0f, - 0xab110000ab17, - 0xab200000ab27, - 0xab280000ab2f, - 0xab300000ab5b, - 0xab600000ab69, - 0xabc00000abeb, - 0xabec0000abee, - 0xabf00000abfa, - 0xac000000d7a4, - 0xfa0e0000fa10, - 0xfa110000fa12, - 0xfa130000fa15, - 0xfa1f0000fa20, - 0xfa210000fa22, - 0xfa230000fa25, - 0xfa270000fa2a, - 0xfb1e0000fb1f, - 0xfe200000fe30, - 0xfe730000fe74, - 0x100000001000c, - 0x1000d00010027, - 0x100280001003b, - 0x1003c0001003e, - 0x1003f0001004e, - 0x100500001005e, - 0x10080000100fb, - 0x101fd000101fe, - 0x102800001029d, - 0x102a0000102d1, - 0x102e0000102e1, + 0x31A0000031C0, + 0x31F000003200, + 0x340000004DC0, + 0x4E000000A48D, + 0xA4D00000A4FE, + 0xA5000000A60D, + 0xA6100000A62C, + 0xA6410000A642, + 0xA6430000A644, + 0xA6450000A646, + 0xA6470000A648, + 0xA6490000A64A, + 0xA64B0000A64C, + 0xA64D0000A64E, + 0xA64F0000A650, + 0xA6510000A652, + 0xA6530000A654, + 0xA6550000A656, + 0xA6570000A658, + 0xA6590000A65A, + 0xA65B0000A65C, + 0xA65D0000A65E, + 0xA65F0000A660, + 0xA6610000A662, + 0xA6630000A664, + 0xA6650000A666, + 0xA6670000A668, + 0xA6690000A66A, + 0xA66B0000A66C, + 0xA66D0000A670, + 0xA6740000A67E, + 0xA67F0000A680, + 0xA6810000A682, + 0xA6830000A684, + 0xA6850000A686, + 0xA6870000A688, + 0xA6890000A68A, + 0xA68B0000A68C, + 0xA68D0000A68E, + 0xA68F0000A690, + 0xA6910000A692, + 0xA6930000A694, + 0xA6950000A696, + 0xA6970000A698, + 0xA6990000A69A, + 0xA69B0000A69C, + 0xA69E0000A6E6, + 0xA6F00000A6F2, + 0xA7170000A720, + 0xA7230000A724, + 0xA7250000A726, + 0xA7270000A728, + 0xA7290000A72A, + 0xA72B0000A72C, + 0xA72D0000A72E, + 0xA72F0000A732, + 0xA7330000A734, + 0xA7350000A736, + 0xA7370000A738, + 0xA7390000A73A, + 0xA73B0000A73C, + 0xA73D0000A73E, + 0xA73F0000A740, + 0xA7410000A742, + 0xA7430000A744, + 0xA7450000A746, + 0xA7470000A748, + 0xA7490000A74A, + 0xA74B0000A74C, + 0xA74D0000A74E, + 0xA74F0000A750, + 0xA7510000A752, + 0xA7530000A754, + 0xA7550000A756, + 0xA7570000A758, + 0xA7590000A75A, + 0xA75B0000A75C, + 0xA75D0000A75E, + 0xA75F0000A760, + 0xA7610000A762, + 0xA7630000A764, + 0xA7650000A766, + 0xA7670000A768, + 0xA7690000A76A, + 0xA76B0000A76C, + 0xA76D0000A76E, + 0xA76F0000A770, + 0xA7710000A779, + 0xA77A0000A77B, + 0xA77C0000A77D, + 0xA77F0000A780, + 0xA7810000A782, + 0xA7830000A784, + 0xA7850000A786, + 0xA7870000A789, + 0xA78C0000A78D, + 0xA78E0000A790, + 0xA7910000A792, + 0xA7930000A796, + 0xA7970000A798, + 0xA7990000A79A, + 0xA79B0000A79C, + 0xA79D0000A79E, + 0xA79F0000A7A0, + 0xA7A10000A7A2, + 0xA7A30000A7A4, + 0xA7A50000A7A6, + 0xA7A70000A7A8, + 0xA7A90000A7AA, + 0xA7AF0000A7B0, + 0xA7B50000A7B6, + 0xA7B70000A7B8, + 0xA7B90000A7BA, + 0xA7BB0000A7BC, + 0xA7BD0000A7BE, + 0xA7BF0000A7C0, + 0xA7C10000A7C2, + 0xA7C30000A7C4, + 0xA7C80000A7C9, + 0xA7CA0000A7CB, + 0xA7D10000A7D2, + 0xA7D30000A7D4, + 0xA7D50000A7D6, + 0xA7D70000A7D8, + 0xA7D90000A7DA, + 0xA7F60000A7F8, + 0xA7FA0000A828, + 0xA82C0000A82D, + 0xA8400000A874, + 0xA8800000A8C6, + 0xA8D00000A8DA, + 0xA8E00000A8F8, + 0xA8FB0000A8FC, + 0xA8FD0000A92E, + 0xA9300000A954, + 0xA9800000A9C1, + 0xA9CF0000A9DA, + 0xA9E00000A9FF, + 0xAA000000AA37, + 0xAA400000AA4E, + 0xAA500000AA5A, + 0xAA600000AA77, + 0xAA7A0000AAC3, + 0xAADB0000AADE, + 0xAAE00000AAF0, + 0xAAF20000AAF7, + 0xAB010000AB07, + 0xAB090000AB0F, + 0xAB110000AB17, + 0xAB200000AB27, + 0xAB280000AB2F, + 0xAB300000AB5B, + 0xAB600000AB69, + 0xABC00000ABEB, + 0xABEC0000ABEE, + 0xABF00000ABFA, + 0xAC000000D7A4, + 0xFA0E0000FA10, + 0xFA110000FA12, + 0xFA130000FA15, + 0xFA1F0000FA20, + 0xFA210000FA22, + 0xFA230000FA25, + 0xFA270000FA2A, + 0xFB1E0000FB1F, + 0xFE200000FE30, + 0xFE730000FE74, + 0x100000001000C, + 0x1000D00010027, + 0x100280001003B, + 0x1003C0001003E, + 0x1003F0001004E, + 0x100500001005E, + 0x10080000100FB, + 0x101FD000101FE, + 0x102800001029D, + 0x102A0000102D1, + 0x102E0000102E1, 0x1030000010320, - 0x1032d00010341, - 0x103420001034a, - 0x103500001037b, - 0x103800001039e, - 0x103a0000103c4, - 0x103c8000103d0, - 0x104280001049e, - 0x104a0000104aa, - 0x104d8000104fc, + 0x1032D00010341, + 0x103420001034A, + 0x103500001037B, + 0x103800001039E, + 0x103A0000103C4, + 0x103C8000103D0, + 0x104280001049E, + 0x104A0000104AA, + 0x104D8000104FC, 0x1050000010528, 0x1053000010564, - 0x10597000105a2, - 0x105a3000105b2, - 0x105b3000105ba, - 0x105bb000105bd, + 0x10597000105A2, + 0x105A3000105B2, + 0x105B3000105BA, + 0x105BB000105BD, 0x1060000010737, 0x1074000010756, 0x1076000010768, 0x1078000010781, 0x1080000010806, 0x1080800010809, - 0x1080a00010836, + 0x1080A00010836, 0x1083700010839, - 0x1083c0001083d, - 0x1083f00010856, + 0x1083C0001083D, + 0x1083F00010856, 0x1086000010877, - 0x108800001089f, - 0x108e0000108f3, - 0x108f4000108f6, + 0x108800001089F, + 0x108E0000108F3, + 0x108F4000108F6, 0x1090000010916, - 0x109200001093a, - 0x10980000109b8, - 0x109be000109c0, - 0x10a0000010a04, - 0x10a0500010a07, - 0x10a0c00010a14, - 0x10a1500010a18, - 0x10a1900010a36, - 0x10a3800010a3b, - 0x10a3f00010a40, - 0x10a6000010a7d, - 0x10a8000010a9d, - 0x10ac000010ac8, - 0x10ac900010ae7, - 0x10b0000010b36, - 0x10b4000010b56, - 0x10b6000010b73, - 0x10b8000010b92, - 0x10c0000010c49, - 0x10cc000010cf3, - 0x10d0000010d28, - 0x10d3000010d3a, - 0x10e8000010eaa, - 0x10eab00010ead, - 0x10eb000010eb2, - 0x10efd00010f1d, - 0x10f2700010f28, - 0x10f3000010f51, - 0x10f7000010f86, - 0x10fb000010fc5, - 0x10fe000010ff7, + 0x109200001093A, + 0x10980000109B8, + 0x109BE000109C0, + 0x10A0000010A04, + 0x10A0500010A07, + 0x10A0C00010A14, + 0x10A1500010A18, + 0x10A1900010A36, + 0x10A3800010A3B, + 0x10A3F00010A40, + 0x10A6000010A7D, + 0x10A8000010A9D, + 0x10AC000010AC8, + 0x10AC900010AE7, + 0x10B0000010B36, + 0x10B4000010B56, + 0x10B6000010B73, + 0x10B8000010B92, + 0x10C0000010C49, + 0x10CC000010CF3, + 0x10D0000010D28, + 0x10D3000010D3A, + 0x10E8000010EAA, + 0x10EAB00010EAD, + 0x10EB000010EB2, + 0x10EFD00010F1D, + 0x10F2700010F28, + 0x10F3000010F51, + 0x10F7000010F86, + 0x10FB000010FC5, + 0x10FE000010FF7, 0x1100000011047, 0x1106600011076, - 0x1107f000110bb, - 0x110c2000110c3, - 0x110d0000110e9, - 0x110f0000110fa, + 0x1107F000110BB, + 0x110C2000110C3, + 0x110D0000110E9, + 0x110F0000110FA, 0x1110000011135, 0x1113600011140, 0x1114400011148, 0x1115000011174, 0x1117600011177, - 0x11180000111c5, - 0x111c9000111cd, - 0x111ce000111db, - 0x111dc000111dd, + 0x11180000111C5, + 0x111C9000111CD, + 0x111CE000111DB, + 0x111DC000111DD, 0x1120000011212, 0x1121300011238, - 0x1123e00011242, + 0x1123E00011242, 0x1128000011287, 0x1128800011289, - 0x1128a0001128e, - 0x1128f0001129e, - 0x1129f000112a9, - 0x112b0000112eb, - 0x112f0000112fa, + 0x1128A0001128E, + 0x1128F0001129E, + 0x1129F000112A9, + 0x112B0000112EB, + 0x112F0000112FA, 0x1130000011304, - 0x113050001130d, - 0x1130f00011311, + 0x113050001130D, + 0x1130F00011311, 0x1131300011329, - 0x1132a00011331, + 0x1132A00011331, 0x1133200011334, - 0x113350001133a, - 0x1133b00011345, + 0x113350001133A, + 0x1133B00011345, 0x1134700011349, - 0x1134b0001134e, + 0x1134B0001134E, 0x1135000011351, 0x1135700011358, - 0x1135d00011364, - 0x113660001136d, + 0x1135D00011364, + 0x113660001136D, 0x1137000011375, - 0x114000001144b, - 0x114500001145a, - 0x1145e00011462, - 0x11480000114c6, - 0x114c7000114c8, - 0x114d0000114da, - 0x11580000115b6, - 0x115b8000115c1, - 0x115d8000115de, + 0x114000001144B, + 0x114500001145A, + 0x1145E00011462, + 0x11480000114C6, + 0x114C7000114C8, + 0x114D0000114DA, + 0x11580000115B6, + 0x115B8000115C1, + 0x115D8000115DE, 0x1160000011641, 0x1164400011645, - 0x116500001165a, - 0x11680000116b9, - 0x116c0000116ca, - 0x117000001171b, - 0x1171d0001172c, - 0x117300001173a, + 0x116500001165A, + 0x11680000116B9, + 0x116C0000116CA, + 0x117000001171B, + 0x1171D0001172C, + 0x117300001173A, 0x1174000011747, - 0x118000001183b, - 0x118c0000118ea, - 0x118ff00011907, - 0x119090001190a, - 0x1190c00011914, + 0x118000001183B, + 0x118C0000118EA, + 0x118FF00011907, + 0x119090001190A, + 0x1190C00011914, 0x1191500011917, 0x1191800011936, 0x1193700011939, - 0x1193b00011944, - 0x119500001195a, - 0x119a0000119a8, - 0x119aa000119d8, - 0x119da000119e2, - 0x119e3000119e5, - 0x11a0000011a3f, - 0x11a4700011a48, - 0x11a5000011a9a, - 0x11a9d00011a9e, - 0x11ab000011af9, - 0x11c0000011c09, - 0x11c0a00011c37, - 0x11c3800011c41, - 0x11c5000011c5a, - 0x11c7200011c90, - 0x11c9200011ca8, - 0x11ca900011cb7, - 0x11d0000011d07, - 0x11d0800011d0a, - 0x11d0b00011d37, - 0x11d3a00011d3b, - 0x11d3c00011d3e, - 0x11d3f00011d48, - 0x11d5000011d5a, - 0x11d6000011d66, - 0x11d6700011d69, - 0x11d6a00011d8f, - 0x11d9000011d92, - 0x11d9300011d99, - 0x11da000011daa, - 0x11ee000011ef7, - 0x11f0000011f11, - 0x11f1200011f3b, - 0x11f3e00011f43, - 0x11f5000011f5a, - 0x11fb000011fb1, - 0x120000001239a, + 0x1193B00011944, + 0x119500001195A, + 0x119A0000119A8, + 0x119AA000119D8, + 0x119DA000119E2, + 0x119E3000119E5, + 0x11A0000011A3F, + 0x11A4700011A48, + 0x11A5000011A9A, + 0x11A9D00011A9E, + 0x11AB000011AF9, + 0x11C0000011C09, + 0x11C0A00011C37, + 0x11C3800011C41, + 0x11C5000011C5A, + 0x11C7200011C90, + 0x11C9200011CA8, + 0x11CA900011CB7, + 0x11D0000011D07, + 0x11D0800011D0A, + 0x11D0B00011D37, + 0x11D3A00011D3B, + 0x11D3C00011D3E, + 0x11D3F00011D48, + 0x11D5000011D5A, + 0x11D6000011D66, + 0x11D6700011D69, + 0x11D6A00011D8F, + 0x11D9000011D92, + 0x11D9300011D99, + 0x11DA000011DAA, + 0x11EE000011EF7, + 0x11F0000011F11, + 0x11F1200011F3B, + 0x11F3E00011F43, + 0x11F5000011F5A, + 0x11FB000011FB1, + 0x120000001239A, 0x1248000012544, - 0x12f9000012ff1, + 0x12F9000012FF1, 0x1300000013430, 0x1344000013456, 0x1440000014647, - 0x1680000016a39, - 0x16a4000016a5f, - 0x16a6000016a6a, - 0x16a7000016abf, - 0x16ac000016aca, - 0x16ad000016aee, - 0x16af000016af5, - 0x16b0000016b37, - 0x16b4000016b44, - 0x16b5000016b5a, - 0x16b6300016b78, - 0x16b7d00016b90, - 0x16e6000016e80, - 0x16f0000016f4b, - 0x16f4f00016f88, - 0x16f8f00016fa0, - 0x16fe000016fe2, - 0x16fe300016fe5, - 0x16ff000016ff2, - 0x17000000187f8, - 0x1880000018cd6, - 0x18d0000018d09, - 0x1aff00001aff4, - 0x1aff50001affc, - 0x1affd0001afff, - 0x1b0000001b123, - 0x1b1320001b133, - 0x1b1500001b153, - 0x1b1550001b156, - 0x1b1640001b168, - 0x1b1700001b2fc, - 0x1bc000001bc6b, - 0x1bc700001bc7d, - 0x1bc800001bc89, - 0x1bc900001bc9a, - 0x1bc9d0001bc9f, - 0x1cf000001cf2e, - 0x1cf300001cf47, - 0x1da000001da37, - 0x1da3b0001da6d, - 0x1da750001da76, - 0x1da840001da85, - 0x1da9b0001daa0, - 0x1daa10001dab0, - 0x1df000001df1f, - 0x1df250001df2b, - 0x1e0000001e007, - 0x1e0080001e019, - 0x1e01b0001e022, - 0x1e0230001e025, - 0x1e0260001e02b, - 0x1e0300001e06e, - 0x1e08f0001e090, - 0x1e1000001e12d, - 0x1e1300001e13e, - 0x1e1400001e14a, - 0x1e14e0001e14f, - 0x1e2900001e2af, - 0x1e2c00001e2fa, - 0x1e4d00001e4fa, - 0x1e7e00001e7e7, - 0x1e7e80001e7ec, - 0x1e7ed0001e7ef, - 0x1e7f00001e7ff, - 0x1e8000001e8c5, - 0x1e8d00001e8d7, - 0x1e9220001e94c, - 0x1e9500001e95a, - 0x200000002a6e0, - 0x2a7000002b73a, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2ebf00002ee5e, - 0x300000003134b, - 0x31350000323b0, + 0x1680000016A39, + 0x16A4000016A5F, + 0x16A6000016A6A, + 0x16A7000016ABF, + 0x16AC000016ACA, + 0x16AD000016AEE, + 0x16AF000016AF5, + 0x16B0000016B37, + 0x16B4000016B44, + 0x16B5000016B5A, + 0x16B6300016B78, + 0x16B7D00016B90, + 0x16E6000016E80, + 0x16F0000016F4B, + 0x16F4F00016F88, + 0x16F8F00016FA0, + 0x16FE000016FE2, + 0x16FE300016FE5, + 0x16FF000016FF2, + 0x17000000187F8, + 0x1880000018CD6, + 0x18D0000018D09, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B123, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1B1550001B156, + 0x1B1640001B168, + 0x1B1700001B2FC, + 0x1BC000001BC6B, + 0x1BC700001BC7D, + 0x1BC800001BC89, + 0x1BC900001BC9A, + 0x1BC9D0001BC9F, + 0x1CF000001CF2E, + 0x1CF300001CF47, + 0x1DA000001DA37, + 0x1DA3B0001DA6D, + 0x1DA750001DA76, + 0x1DA840001DA85, + 0x1DA9B0001DAA0, + 0x1DAA10001DAB0, + 0x1DF000001DF1F, + 0x1DF250001DF2B, + 0x1E0000001E007, + 0x1E0080001E019, + 0x1E01B0001E022, + 0x1E0230001E025, + 0x1E0260001E02B, + 0x1E08F0001E090, + 0x1E1000001E12D, + 0x1E1300001E13E, + 0x1E1400001E14A, + 0x1E14E0001E14F, + 0x1E2900001E2AF, + 0x1E2C00001E2FA, + 0x1E4D00001E4FA, + 0x1E7E00001E7E7, + 0x1E7E80001E7EC, + 0x1E7ED0001E7EF, + 0x1E7F00001E7FF, + 0x1E8000001E8C5, + 0x1E8D00001E8D7, + 0x1E9220001E94C, + 0x1E9500001E95A, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x300000003134B, + 0x31350000323B0, ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, + "CONTEXTJ": (0x200C0000200E,), + "CONTEXTO": ( + 0xB7000000B8, 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, + 0x5F3000005F5, + 0x6600000066A, + 0x6F0000006FA, + 0x30FB000030FC, ), } diff --git a/libs/idna/intranges.py b/libs/idna/intranges.py index 6a43b0475..7bfaa8d80 100644 --- a/libs/idna/intranges.py +++ b/libs/idna/intranges.py @@ -8,6 +8,7 @@ import bisect from typing import List, Tuple + def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: """Represent a list of integers as a sequence of ranges: ((start_0, end_0), (start_1, end_1), ...), such that the original @@ -20,18 +21,20 @@ def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: ranges = [] last_write = -1 for i in range(len(sorted_list)): - if i+1 < len(sorted_list): - if sorted_list[i] == sorted_list[i+1]-1: + if i + 1 < len(sorted_list): + if sorted_list[i] == sorted_list[i + 1] - 1: continue - current_range = sorted_list[last_write+1:i+1] + current_range = sorted_list[last_write + 1 : i + 1] ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) last_write = i return tuple(ranges) + def _encode_range(start: int, end: int) -> int: return (start << 32) | end + def _decode_range(r: int) -> Tuple[int, int]: return (r >> 32), (r & ((1 << 32) - 1)) @@ -43,7 +46,7 @@ def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: # we could be immediately ahead of a tuple (start, end) # with start < int_ <= end if pos > 0: - left, right = _decode_range(ranges[pos-1]) + left, right = _decode_range(ranges[pos - 1]) if left <= int_ < right: return True # or we could be immediately behind a tuple (int_, end) diff --git a/libs/idna/package_data.py b/libs/idna/package_data.py index c5b7220c9..514ff7e2e 100644 --- a/libs/idna/package_data.py +++ b/libs/idna/package_data.py @@ -1,2 +1 @@ -__version__ = '3.6' - +__version__ = "3.10" diff --git a/libs/idna/uts46data.py b/libs/idna/uts46data.py index 6a1eddbfd..eb8943274 100644 --- a/libs/idna/uts46data.py +++ b/libs/idna/uts46data.py @@ -3,8515 +3,8598 @@ from typing import List, Tuple, Union - """IDNA Mapping Table from UTS46.""" -__version__ = '15.1.0' +__version__ = "15.1.0" + + def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x0, '3'), - (0x1, '3'), - (0x2, '3'), - (0x3, '3'), - (0x4, '3'), - (0x5, '3'), - (0x6, '3'), - (0x7, '3'), - (0x8, '3'), - (0x9, '3'), - (0xA, '3'), - (0xB, '3'), - (0xC, '3'), - (0xD, '3'), - (0xE, '3'), - (0xF, '3'), - (0x10, '3'), - (0x11, '3'), - (0x12, '3'), - (0x13, '3'), - (0x14, '3'), - (0x15, '3'), - (0x16, '3'), - (0x17, '3'), - (0x18, '3'), - (0x19, '3'), - (0x1A, '3'), - (0x1B, '3'), - (0x1C, '3'), - (0x1D, '3'), - (0x1E, '3'), - (0x1F, '3'), - (0x20, '3'), - (0x21, '3'), - (0x22, '3'), - (0x23, '3'), - (0x24, '3'), - (0x25, '3'), - (0x26, '3'), - (0x27, '3'), - (0x28, '3'), - (0x29, '3'), - (0x2A, '3'), - (0x2B, '3'), - (0x2C, '3'), - (0x2D, 'V'), - (0x2E, 'V'), - (0x2F, '3'), - (0x30, 'V'), - (0x31, 'V'), - (0x32, 'V'), - (0x33, 'V'), - (0x34, 'V'), - (0x35, 'V'), - (0x36, 'V'), - (0x37, 'V'), - (0x38, 'V'), - (0x39, 'V'), - (0x3A, '3'), - (0x3B, '3'), - (0x3C, '3'), - (0x3D, '3'), - (0x3E, '3'), - (0x3F, '3'), - (0x40, '3'), - (0x41, 'M', 'a'), - (0x42, 'M', 'b'), - (0x43, 'M', 'c'), - (0x44, 'M', 'd'), - (0x45, 'M', 'e'), - (0x46, 'M', 'f'), - (0x47, 'M', 'g'), - (0x48, 'M', 'h'), - (0x49, 'M', 'i'), - (0x4A, 'M', 'j'), - (0x4B, 'M', 'k'), - (0x4C, 'M', 'l'), - (0x4D, 'M', 'm'), - (0x4E, 'M', 'n'), - (0x4F, 'M', 'o'), - (0x50, 'M', 'p'), - (0x51, 'M', 'q'), - (0x52, 'M', 'r'), - (0x53, 'M', 's'), - (0x54, 'M', 't'), - (0x55, 'M', 'u'), - (0x56, 'M', 'v'), - (0x57, 'M', 'w'), - (0x58, 'M', 'x'), - (0x59, 'M', 'y'), - (0x5A, 'M', 'z'), - (0x5B, '3'), - (0x5C, '3'), - (0x5D, '3'), - (0x5E, '3'), - (0x5F, '3'), - (0x60, '3'), - (0x61, 'V'), - (0x62, 'V'), - (0x63, 'V'), + (0x0, "3"), + (0x1, "3"), + (0x2, "3"), + (0x3, "3"), + (0x4, "3"), + (0x5, "3"), + (0x6, "3"), + (0x7, "3"), + (0x8, "3"), + (0x9, "3"), + (0xA, "3"), + (0xB, "3"), + (0xC, "3"), + (0xD, "3"), + (0xE, "3"), + (0xF, "3"), + (0x10, "3"), + (0x11, "3"), + (0x12, "3"), + (0x13, "3"), + (0x14, "3"), + (0x15, "3"), + (0x16, "3"), + (0x17, "3"), + (0x18, "3"), + (0x19, "3"), + (0x1A, "3"), + (0x1B, "3"), + (0x1C, "3"), + (0x1D, "3"), + (0x1E, "3"), + (0x1F, "3"), + (0x20, "3"), + (0x21, "3"), + (0x22, "3"), + (0x23, "3"), + (0x24, "3"), + (0x25, "3"), + (0x26, "3"), + (0x27, "3"), + (0x28, "3"), + (0x29, "3"), + (0x2A, "3"), + (0x2B, "3"), + (0x2C, "3"), + (0x2D, "V"), + (0x2E, "V"), + (0x2F, "3"), + (0x30, "V"), + (0x31, "V"), + (0x32, "V"), + (0x33, "V"), + (0x34, "V"), + (0x35, "V"), + (0x36, "V"), + (0x37, "V"), + (0x38, "V"), + (0x39, "V"), + (0x3A, "3"), + (0x3B, "3"), + (0x3C, "3"), + (0x3D, "3"), + (0x3E, "3"), + (0x3F, "3"), + (0x40, "3"), + (0x41, "M", "a"), + (0x42, "M", "b"), + (0x43, "M", "c"), + (0x44, "M", "d"), + (0x45, "M", "e"), + (0x46, "M", "f"), + (0x47, "M", "g"), + (0x48, "M", "h"), + (0x49, "M", "i"), + (0x4A, "M", "j"), + (0x4B, "M", "k"), + (0x4C, "M", "l"), + (0x4D, "M", "m"), + (0x4E, "M", "n"), + (0x4F, "M", "o"), + (0x50, "M", "p"), + (0x51, "M", "q"), + (0x52, "M", "r"), + (0x53, "M", "s"), + (0x54, "M", "t"), + (0x55, "M", "u"), + (0x56, "M", "v"), + (0x57, "M", "w"), + (0x58, "M", "x"), + (0x59, "M", "y"), + (0x5A, "M", "z"), + (0x5B, "3"), + (0x5C, "3"), + (0x5D, "3"), + (0x5E, "3"), + (0x5F, "3"), + (0x60, "3"), + (0x61, "V"), + (0x62, "V"), + (0x63, "V"), ] + def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x64, 'V'), - (0x65, 'V'), - (0x66, 'V'), - (0x67, 'V'), - (0x68, 'V'), - (0x69, 'V'), - (0x6A, 'V'), - (0x6B, 'V'), - (0x6C, 'V'), - (0x6D, 'V'), - (0x6E, 'V'), - (0x6F, 'V'), - (0x70, 'V'), - (0x71, 'V'), - (0x72, 'V'), - (0x73, 'V'), - (0x74, 'V'), - (0x75, 'V'), - (0x76, 'V'), - (0x77, 'V'), - (0x78, 'V'), - (0x79, 'V'), - (0x7A, 'V'), - (0x7B, '3'), - (0x7C, '3'), - (0x7D, '3'), - (0x7E, '3'), - (0x7F, '3'), - (0x80, 'X'), - (0x81, 'X'), - (0x82, 'X'), - (0x83, 'X'), - (0x84, 'X'), - (0x85, 'X'), - (0x86, 'X'), - (0x87, 'X'), - (0x88, 'X'), - (0x89, 'X'), - (0x8A, 'X'), - (0x8B, 'X'), - (0x8C, 'X'), - (0x8D, 'X'), - (0x8E, 'X'), - (0x8F, 'X'), - (0x90, 'X'), - (0x91, 'X'), - (0x92, 'X'), - (0x93, 'X'), - (0x94, 'X'), - (0x95, 'X'), - (0x96, 'X'), - (0x97, 'X'), - (0x98, 'X'), - (0x99, 'X'), - (0x9A, 'X'), - (0x9B, 'X'), - (0x9C, 'X'), - (0x9D, 'X'), - (0x9E, 'X'), - (0x9F, 'X'), - (0xA0, '3', ' '), - (0xA1, 'V'), - (0xA2, 'V'), - (0xA3, 'V'), - (0xA4, 'V'), - (0xA5, 'V'), - (0xA6, 'V'), - (0xA7, 'V'), - (0xA8, '3', ' ̈'), - (0xA9, 'V'), - (0xAA, 'M', 'a'), - (0xAB, 'V'), - (0xAC, 'V'), - (0xAD, 'I'), - (0xAE, 'V'), - (0xAF, '3', ' ̄'), - (0xB0, 'V'), - (0xB1, 'V'), - (0xB2, 'M', '2'), - (0xB3, 'M', '3'), - (0xB4, '3', ' ́'), - (0xB5, 'M', 'μ'), - (0xB6, 'V'), - (0xB7, 'V'), - (0xB8, '3', ' ̧'), - (0xB9, 'M', '1'), - (0xBA, 'M', 'o'), - (0xBB, 'V'), - (0xBC, 'M', '1⁄4'), - (0xBD, 'M', '1⁄2'), - (0xBE, 'M', '3⁄4'), - (0xBF, 'V'), - (0xC0, 'M', 'à'), - (0xC1, 'M', 'á'), - (0xC2, 'M', 'â'), - (0xC3, 'M', 'ã'), - (0xC4, 'M', 'ä'), - (0xC5, 'M', 'å'), - (0xC6, 'M', 'æ'), - (0xC7, 'M', 'ç'), + (0x64, "V"), + (0x65, "V"), + (0x66, "V"), + (0x67, "V"), + (0x68, "V"), + (0x69, "V"), + (0x6A, "V"), + (0x6B, "V"), + (0x6C, "V"), + (0x6D, "V"), + (0x6E, "V"), + (0x6F, "V"), + (0x70, "V"), + (0x71, "V"), + (0x72, "V"), + (0x73, "V"), + (0x74, "V"), + (0x75, "V"), + (0x76, "V"), + (0x77, "V"), + (0x78, "V"), + (0x79, "V"), + (0x7A, "V"), + (0x7B, "3"), + (0x7C, "3"), + (0x7D, "3"), + (0x7E, "3"), + (0x7F, "3"), + (0x80, "X"), + (0x81, "X"), + (0x82, "X"), + (0x83, "X"), + (0x84, "X"), + (0x85, "X"), + (0x86, "X"), + (0x87, "X"), + (0x88, "X"), + (0x89, "X"), + (0x8A, "X"), + (0x8B, "X"), + (0x8C, "X"), + (0x8D, "X"), + (0x8E, "X"), + (0x8F, "X"), + (0x90, "X"), + (0x91, "X"), + (0x92, "X"), + (0x93, "X"), + (0x94, "X"), + (0x95, "X"), + (0x96, "X"), + (0x97, "X"), + (0x98, "X"), + (0x99, "X"), + (0x9A, "X"), + (0x9B, "X"), + (0x9C, "X"), + (0x9D, "X"), + (0x9E, "X"), + (0x9F, "X"), + (0xA0, "3", " "), + (0xA1, "V"), + (0xA2, "V"), + (0xA3, "V"), + (0xA4, "V"), + (0xA5, "V"), + (0xA6, "V"), + (0xA7, "V"), + (0xA8, "3", " ̈"), + (0xA9, "V"), + (0xAA, "M", "a"), + (0xAB, "V"), + (0xAC, "V"), + (0xAD, "I"), + (0xAE, "V"), + (0xAF, "3", " ̄"), + (0xB0, "V"), + (0xB1, "V"), + (0xB2, "M", "2"), + (0xB3, "M", "3"), + (0xB4, "3", " ́"), + (0xB5, "M", "μ"), + (0xB6, "V"), + (0xB7, "V"), + (0xB8, "3", " ̧"), + (0xB9, "M", "1"), + (0xBA, "M", "o"), + (0xBB, "V"), + (0xBC, "M", "1⁄4"), + (0xBD, "M", "1⁄2"), + (0xBE, "M", "3⁄4"), + (0xBF, "V"), + (0xC0, "M", "à"), + (0xC1, "M", "á"), + (0xC2, "M", "â"), + (0xC3, "M", "ã"), + (0xC4, "M", "ä"), + (0xC5, "M", "å"), + (0xC6, "M", "æ"), + (0xC7, "M", "ç"), ] + def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xC8, 'M', 'è'), - (0xC9, 'M', 'é'), - (0xCA, 'M', 'ê'), - (0xCB, 'M', 'ë'), - (0xCC, 'M', 'ì'), - (0xCD, 'M', 'í'), - (0xCE, 'M', 'î'), - (0xCF, 'M', 'ï'), - (0xD0, 'M', 'ð'), - (0xD1, 'M', 'ñ'), - (0xD2, 'M', 'ò'), - (0xD3, 'M', 'ó'), - (0xD4, 'M', 'ô'), - (0xD5, 'M', 'õ'), - (0xD6, 'M', 'ö'), - (0xD7, 'V'), - (0xD8, 'M', 'ø'), - (0xD9, 'M', 'ù'), - (0xDA, 'M', 'ú'), - (0xDB, 'M', 'û'), - (0xDC, 'M', 'ü'), - (0xDD, 'M', 'ý'), - (0xDE, 'M', 'þ'), - (0xDF, 'D', 'ss'), - (0xE0, 'V'), - (0xE1, 'V'), - (0xE2, 'V'), - (0xE3, 'V'), - (0xE4, 'V'), - (0xE5, 'V'), - (0xE6, 'V'), - (0xE7, 'V'), - (0xE8, 'V'), - (0xE9, 'V'), - (0xEA, 'V'), - (0xEB, 'V'), - (0xEC, 'V'), - (0xED, 'V'), - (0xEE, 'V'), - (0xEF, 'V'), - (0xF0, 'V'), - (0xF1, 'V'), - (0xF2, 'V'), - (0xF3, 'V'), - (0xF4, 'V'), - (0xF5, 'V'), - (0xF6, 'V'), - (0xF7, 'V'), - (0xF8, 'V'), - (0xF9, 'V'), - (0xFA, 'V'), - (0xFB, 'V'), - (0xFC, 'V'), - (0xFD, 'V'), - (0xFE, 'V'), - (0xFF, 'V'), - (0x100, 'M', 'ā'), - (0x101, 'V'), - (0x102, 'M', 'ă'), - (0x103, 'V'), - (0x104, 'M', 'ą'), - (0x105, 'V'), - (0x106, 'M', 'ć'), - (0x107, 'V'), - (0x108, 'M', 'ĉ'), - (0x109, 'V'), - (0x10A, 'M', 'ċ'), - (0x10B, 'V'), - (0x10C, 'M', 'č'), - (0x10D, 'V'), - (0x10E, 'M', 'ď'), - (0x10F, 'V'), - (0x110, 'M', 'đ'), - (0x111, 'V'), - (0x112, 'M', 'ē'), - (0x113, 'V'), - (0x114, 'M', 'ĕ'), - (0x115, 'V'), - (0x116, 'M', 'ė'), - (0x117, 'V'), - (0x118, 'M', 'ę'), - (0x119, 'V'), - (0x11A, 'M', 'ě'), - (0x11B, 'V'), - (0x11C, 'M', 'ĝ'), - (0x11D, 'V'), - (0x11E, 'M', 'ğ'), - (0x11F, 'V'), - (0x120, 'M', 'ġ'), - (0x121, 'V'), - (0x122, 'M', 'ģ'), - (0x123, 'V'), - (0x124, 'M', 'ĥ'), - (0x125, 'V'), - (0x126, 'M', 'ħ'), - (0x127, 'V'), - (0x128, 'M', 'ĩ'), - (0x129, 'V'), - (0x12A, 'M', 'ī'), - (0x12B, 'V'), + (0xC8, "M", "è"), + (0xC9, "M", "é"), + (0xCA, "M", "ê"), + (0xCB, "M", "ë"), + (0xCC, "M", "ì"), + (0xCD, "M", "í"), + (0xCE, "M", "î"), + (0xCF, "M", "ï"), + (0xD0, "M", "ð"), + (0xD1, "M", "ñ"), + (0xD2, "M", "ò"), + (0xD3, "M", "ó"), + (0xD4, "M", "ô"), + (0xD5, "M", "õ"), + (0xD6, "M", "ö"), + (0xD7, "V"), + (0xD8, "M", "ø"), + (0xD9, "M", "ù"), + (0xDA, "M", "ú"), + (0xDB, "M", "û"), + (0xDC, "M", "ü"), + (0xDD, "M", "ý"), + (0xDE, "M", "þ"), + (0xDF, "D", "ss"), + (0xE0, "V"), + (0xE1, "V"), + (0xE2, "V"), + (0xE3, "V"), + (0xE4, "V"), + (0xE5, "V"), + (0xE6, "V"), + (0xE7, "V"), + (0xE8, "V"), + (0xE9, "V"), + (0xEA, "V"), + (0xEB, "V"), + (0xEC, "V"), + (0xED, "V"), + (0xEE, "V"), + (0xEF, "V"), + (0xF0, "V"), + (0xF1, "V"), + (0xF2, "V"), + (0xF3, "V"), + (0xF4, "V"), + (0xF5, "V"), + (0xF6, "V"), + (0xF7, "V"), + (0xF8, "V"), + (0xF9, "V"), + (0xFA, "V"), + (0xFB, "V"), + (0xFC, "V"), + (0xFD, "V"), + (0xFE, "V"), + (0xFF, "V"), + (0x100, "M", "ā"), + (0x101, "V"), + (0x102, "M", "ă"), + (0x103, "V"), + (0x104, "M", "ą"), + (0x105, "V"), + (0x106, "M", "ć"), + (0x107, "V"), + (0x108, "M", "ĉ"), + (0x109, "V"), + (0x10A, "M", "ċ"), + (0x10B, "V"), + (0x10C, "M", "č"), + (0x10D, "V"), + (0x10E, "M", "ď"), + (0x10F, "V"), + (0x110, "M", "đ"), + (0x111, "V"), + (0x112, "M", "ē"), + (0x113, "V"), + (0x114, "M", "ĕ"), + (0x115, "V"), + (0x116, "M", "ė"), + (0x117, "V"), + (0x118, "M", "ę"), + (0x119, "V"), + (0x11A, "M", "ě"), + (0x11B, "V"), + (0x11C, "M", "ĝ"), + (0x11D, "V"), + (0x11E, "M", "ğ"), + (0x11F, "V"), + (0x120, "M", "ġ"), + (0x121, "V"), + (0x122, "M", "ģ"), + (0x123, "V"), + (0x124, "M", "ĥ"), + (0x125, "V"), + (0x126, "M", "ħ"), + (0x127, "V"), + (0x128, "M", "ĩ"), + (0x129, "V"), + (0x12A, "M", "ī"), + (0x12B, "V"), ] + def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x12C, 'M', 'ĭ'), - (0x12D, 'V'), - (0x12E, 'M', 'į'), - (0x12F, 'V'), - (0x130, 'M', 'i̇'), - (0x131, 'V'), - (0x132, 'M', 'ij'), - (0x134, 'M', 'ĵ'), - (0x135, 'V'), - (0x136, 'M', 'ķ'), - (0x137, 'V'), - (0x139, 'M', 'ĺ'), - (0x13A, 'V'), - (0x13B, 'M', 'ļ'), - (0x13C, 'V'), - (0x13D, 'M', 'ľ'), - (0x13E, 'V'), - (0x13F, 'M', 'l·'), - (0x141, 'M', 'ł'), - (0x142, 'V'), - (0x143, 'M', 'ń'), - (0x144, 'V'), - (0x145, 'M', 'ņ'), - (0x146, 'V'), - (0x147, 'M', 'ň'), - (0x148, 'V'), - (0x149, 'M', 'ʼn'), - (0x14A, 'M', 'ŋ'), - (0x14B, 'V'), - (0x14C, 'M', 'ō'), - (0x14D, 'V'), - (0x14E, 'M', 'ŏ'), - (0x14F, 'V'), - (0x150, 'M', 'ő'), - (0x151, 'V'), - (0x152, 'M', 'œ'), - (0x153, 'V'), - (0x154, 'M', 'ŕ'), - (0x155, 'V'), - (0x156, 'M', 'ŗ'), - (0x157, 'V'), - (0x158, 'M', 'ř'), - (0x159, 'V'), - (0x15A, 'M', 'ś'), - (0x15B, 'V'), - (0x15C, 'M', 'ŝ'), - (0x15D, 'V'), - (0x15E, 'M', 'ş'), - (0x15F, 'V'), - (0x160, 'M', 'š'), - (0x161, 'V'), - (0x162, 'M', 'ţ'), - (0x163, 'V'), - (0x164, 'M', 'ť'), - (0x165, 'V'), - (0x166, 'M', 'ŧ'), - (0x167, 'V'), - (0x168, 'M', 'ũ'), - (0x169, 'V'), - (0x16A, 'M', 'ū'), - (0x16B, 'V'), - (0x16C, 'M', 'ŭ'), - (0x16D, 'V'), - (0x16E, 'M', 'ů'), - (0x16F, 'V'), - (0x170, 'M', 'ű'), - (0x171, 'V'), - (0x172, 'M', 'ų'), - (0x173, 'V'), - (0x174, 'M', 'ŵ'), - (0x175, 'V'), - (0x176, 'M', 'ŷ'), - (0x177, 'V'), - (0x178, 'M', 'ÿ'), - (0x179, 'M', 'ź'), - (0x17A, 'V'), - (0x17B, 'M', 'ż'), - (0x17C, 'V'), - (0x17D, 'M', 'ž'), - (0x17E, 'V'), - (0x17F, 'M', 's'), - (0x180, 'V'), - (0x181, 'M', 'ɓ'), - (0x182, 'M', 'ƃ'), - (0x183, 'V'), - (0x184, 'M', 'ƅ'), - (0x185, 'V'), - (0x186, 'M', 'ɔ'), - (0x187, 'M', 'ƈ'), - (0x188, 'V'), - (0x189, 'M', 'ɖ'), - (0x18A, 'M', 'ɗ'), - (0x18B, 'M', 'ƌ'), - (0x18C, 'V'), - (0x18E, 'M', 'ǝ'), - (0x18F, 'M', 'ə'), - (0x190, 'M', 'ɛ'), - (0x191, 'M', 'ƒ'), - (0x192, 'V'), - (0x193, 'M', 'ɠ'), + (0x12C, "M", "ĭ"), + (0x12D, "V"), + (0x12E, "M", "į"), + (0x12F, "V"), + (0x130, "M", "i̇"), + (0x131, "V"), + (0x132, "M", "ij"), + (0x134, "M", "ĵ"), + (0x135, "V"), + (0x136, "M", "ķ"), + (0x137, "V"), + (0x139, "M", "ĺ"), + (0x13A, "V"), + (0x13B, "M", "ļ"), + (0x13C, "V"), + (0x13D, "M", "ľ"), + (0x13E, "V"), + (0x13F, "M", "l·"), + (0x141, "M", "ł"), + (0x142, "V"), + (0x143, "M", "ń"), + (0x144, "V"), + (0x145, "M", "ņ"), + (0x146, "V"), + (0x147, "M", "ň"), + (0x148, "V"), + (0x149, "M", "ʼn"), + (0x14A, "M", "ŋ"), + (0x14B, "V"), + (0x14C, "M", "ō"), + (0x14D, "V"), + (0x14E, "M", "ŏ"), + (0x14F, "V"), + (0x150, "M", "ő"), + (0x151, "V"), + (0x152, "M", "œ"), + (0x153, "V"), + (0x154, "M", "ŕ"), + (0x155, "V"), + (0x156, "M", "ŗ"), + (0x157, "V"), + (0x158, "M", "ř"), + (0x159, "V"), + (0x15A, "M", "ś"), + (0x15B, "V"), + (0x15C, "M", "ŝ"), + (0x15D, "V"), + (0x15E, "M", "ş"), + (0x15F, "V"), + (0x160, "M", "š"), + (0x161, "V"), + (0x162, "M", "ţ"), + (0x163, "V"), + (0x164, "M", "ť"), + (0x165, "V"), + (0x166, "M", "ŧ"), + (0x167, "V"), + (0x168, "M", "ũ"), + (0x169, "V"), + (0x16A, "M", "ū"), + (0x16B, "V"), + (0x16C, "M", "ŭ"), + (0x16D, "V"), + (0x16E, "M", "ů"), + (0x16F, "V"), + (0x170, "M", "ű"), + (0x171, "V"), + (0x172, "M", "ų"), + (0x173, "V"), + (0x174, "M", "ŵ"), + (0x175, "V"), + (0x176, "M", "ŷ"), + (0x177, "V"), + (0x178, "M", "ÿ"), + (0x179, "M", "ź"), + (0x17A, "V"), + (0x17B, "M", "ż"), + (0x17C, "V"), + (0x17D, "M", "ž"), + (0x17E, "V"), + (0x17F, "M", "s"), + (0x180, "V"), + (0x181, "M", "ɓ"), + (0x182, "M", "ƃ"), + (0x183, "V"), + (0x184, "M", "ƅ"), + (0x185, "V"), + (0x186, "M", "ɔ"), + (0x187, "M", "ƈ"), + (0x188, "V"), + (0x189, "M", "ɖ"), + (0x18A, "M", "ɗ"), + (0x18B, "M", "ƌ"), + (0x18C, "V"), + (0x18E, "M", "ǝ"), + (0x18F, "M", "ə"), + (0x190, "M", "ɛ"), + (0x191, "M", "ƒ"), + (0x192, "V"), + (0x193, "M", "ɠ"), ] + def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x194, 'M', 'ɣ'), - (0x195, 'V'), - (0x196, 'M', 'ɩ'), - (0x197, 'M', 'ɨ'), - (0x198, 'M', 'ƙ'), - (0x199, 'V'), - (0x19C, 'M', 'ɯ'), - (0x19D, 'M', 'ɲ'), - (0x19E, 'V'), - (0x19F, 'M', 'ɵ'), - (0x1A0, 'M', 'ơ'), - (0x1A1, 'V'), - (0x1A2, 'M', 'ƣ'), - (0x1A3, 'V'), - (0x1A4, 'M', 'ƥ'), - (0x1A5, 'V'), - (0x1A6, 'M', 'ʀ'), - (0x1A7, 'M', 'ƨ'), - (0x1A8, 'V'), - (0x1A9, 'M', 'ʃ'), - (0x1AA, 'V'), - (0x1AC, 'M', 'ƭ'), - (0x1AD, 'V'), - (0x1AE, 'M', 'ʈ'), - (0x1AF, 'M', 'ư'), - (0x1B0, 'V'), - (0x1B1, 'M', 'ʊ'), - (0x1B2, 'M', 'ʋ'), - (0x1B3, 'M', 'ƴ'), - (0x1B4, 'V'), - (0x1B5, 'M', 'ƶ'), - (0x1B6, 'V'), - (0x1B7, 'M', 'ʒ'), - (0x1B8, 'M', 'ƹ'), - (0x1B9, 'V'), - (0x1BC, 'M', 'ƽ'), - (0x1BD, 'V'), - (0x1C4, 'M', 'dž'), - (0x1C7, 'M', 'lj'), - (0x1CA, 'M', 'nj'), - (0x1CD, 'M', 'ǎ'), - (0x1CE, 'V'), - (0x1CF, 'M', 'ǐ'), - (0x1D0, 'V'), - (0x1D1, 'M', 'ǒ'), - (0x1D2, 'V'), - (0x1D3, 'M', 'ǔ'), - (0x1D4, 'V'), - (0x1D5, 'M', 'ǖ'), - (0x1D6, 'V'), - (0x1D7, 'M', 'ǘ'), - (0x1D8, 'V'), - (0x1D9, 'M', 'ǚ'), - (0x1DA, 'V'), - (0x1DB, 'M', 'ǜ'), - (0x1DC, 'V'), - (0x1DE, 'M', 'ǟ'), - (0x1DF, 'V'), - (0x1E0, 'M', 'ǡ'), - (0x1E1, 'V'), - (0x1E2, 'M', 'ǣ'), - (0x1E3, 'V'), - (0x1E4, 'M', 'ǥ'), - (0x1E5, 'V'), - (0x1E6, 'M', 'ǧ'), - (0x1E7, 'V'), - (0x1E8, 'M', 'ǩ'), - (0x1E9, 'V'), - (0x1EA, 'M', 'ǫ'), - (0x1EB, 'V'), - (0x1EC, 'M', 'ǭ'), - (0x1ED, 'V'), - (0x1EE, 'M', 'ǯ'), - (0x1EF, 'V'), - (0x1F1, 'M', 'dz'), - (0x1F4, 'M', 'ǵ'), - (0x1F5, 'V'), - (0x1F6, 'M', 'ƕ'), - (0x1F7, 'M', 'ƿ'), - (0x1F8, 'M', 'ǹ'), - (0x1F9, 'V'), - (0x1FA, 'M', 'ǻ'), - (0x1FB, 'V'), - (0x1FC, 'M', 'ǽ'), - (0x1FD, 'V'), - (0x1FE, 'M', 'ǿ'), - (0x1FF, 'V'), - (0x200, 'M', 'ȁ'), - (0x201, 'V'), - (0x202, 'M', 'ȃ'), - (0x203, 'V'), - (0x204, 'M', 'ȅ'), - (0x205, 'V'), - (0x206, 'M', 'ȇ'), - (0x207, 'V'), - (0x208, 'M', 'ȉ'), - (0x209, 'V'), - (0x20A, 'M', 'ȋ'), - (0x20B, 'V'), - (0x20C, 'M', 'ȍ'), + (0x194, "M", "ɣ"), + (0x195, "V"), + (0x196, "M", "ɩ"), + (0x197, "M", "ɨ"), + (0x198, "M", "ƙ"), + (0x199, "V"), + (0x19C, "M", "ɯ"), + (0x19D, "M", "ɲ"), + (0x19E, "V"), + (0x19F, "M", "ɵ"), + (0x1A0, "M", "ơ"), + (0x1A1, "V"), + (0x1A2, "M", "ƣ"), + (0x1A3, "V"), + (0x1A4, "M", "ƥ"), + (0x1A5, "V"), + (0x1A6, "M", "ʀ"), + (0x1A7, "M", "ƨ"), + (0x1A8, "V"), + (0x1A9, "M", "ʃ"), + (0x1AA, "V"), + (0x1AC, "M", "ƭ"), + (0x1AD, "V"), + (0x1AE, "M", "ʈ"), + (0x1AF, "M", "ư"), + (0x1B0, "V"), + (0x1B1, "M", "ʊ"), + (0x1B2, "M", "ʋ"), + (0x1B3, "M", "ƴ"), + (0x1B4, "V"), + (0x1B5, "M", "ƶ"), + (0x1B6, "V"), + (0x1B7, "M", "ʒ"), + (0x1B8, "M", "ƹ"), + (0x1B9, "V"), + (0x1BC, "M", "ƽ"), + (0x1BD, "V"), + (0x1C4, "M", "dž"), + (0x1C7, "M", "lj"), + (0x1CA, "M", "nj"), + (0x1CD, "M", "ǎ"), + (0x1CE, "V"), + (0x1CF, "M", "ǐ"), + (0x1D0, "V"), + (0x1D1, "M", "ǒ"), + (0x1D2, "V"), + (0x1D3, "M", "ǔ"), + (0x1D4, "V"), + (0x1D5, "M", "ǖ"), + (0x1D6, "V"), + (0x1D7, "M", "ǘ"), + (0x1D8, "V"), + (0x1D9, "M", "ǚ"), + (0x1DA, "V"), + (0x1DB, "M", "ǜ"), + (0x1DC, "V"), + (0x1DE, "M", "ǟ"), + (0x1DF, "V"), + (0x1E0, "M", "ǡ"), + (0x1E1, "V"), + (0x1E2, "M", "ǣ"), + (0x1E3, "V"), + (0x1E4, "M", "ǥ"), + (0x1E5, "V"), + (0x1E6, "M", "ǧ"), + (0x1E7, "V"), + (0x1E8, "M", "ǩ"), + (0x1E9, "V"), + (0x1EA, "M", "ǫ"), + (0x1EB, "V"), + (0x1EC, "M", "ǭ"), + (0x1ED, "V"), + (0x1EE, "M", "ǯ"), + (0x1EF, "V"), + (0x1F1, "M", "dz"), + (0x1F4, "M", "ǵ"), + (0x1F5, "V"), + (0x1F6, "M", "ƕ"), + (0x1F7, "M", "ƿ"), + (0x1F8, "M", "ǹ"), + (0x1F9, "V"), + (0x1FA, "M", "ǻ"), + (0x1FB, "V"), + (0x1FC, "M", "ǽ"), + (0x1FD, "V"), + (0x1FE, "M", "ǿ"), + (0x1FF, "V"), + (0x200, "M", "ȁ"), + (0x201, "V"), + (0x202, "M", "ȃ"), + (0x203, "V"), + (0x204, "M", "ȅ"), + (0x205, "V"), + (0x206, "M", "ȇ"), + (0x207, "V"), + (0x208, "M", "ȉ"), + (0x209, "V"), + (0x20A, "M", "ȋ"), + (0x20B, "V"), + (0x20C, "M", "ȍ"), ] + def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x20D, 'V'), - (0x20E, 'M', 'ȏ'), - (0x20F, 'V'), - (0x210, 'M', 'ȑ'), - (0x211, 'V'), - (0x212, 'M', 'ȓ'), - (0x213, 'V'), - (0x214, 'M', 'ȕ'), - (0x215, 'V'), - (0x216, 'M', 'ȗ'), - (0x217, 'V'), - (0x218, 'M', 'ș'), - (0x219, 'V'), - (0x21A, 'M', 'ț'), - (0x21B, 'V'), - (0x21C, 'M', 'ȝ'), - (0x21D, 'V'), - (0x21E, 'M', 'ȟ'), - (0x21F, 'V'), - (0x220, 'M', 'ƞ'), - (0x221, 'V'), - (0x222, 'M', 'ȣ'), - (0x223, 'V'), - (0x224, 'M', 'ȥ'), - (0x225, 'V'), - (0x226, 'M', 'ȧ'), - (0x227, 'V'), - (0x228, 'M', 'ȩ'), - (0x229, 'V'), - (0x22A, 'M', 'ȫ'), - (0x22B, 'V'), - (0x22C, 'M', 'ȭ'), - (0x22D, 'V'), - (0x22E, 'M', 'ȯ'), - (0x22F, 'V'), - (0x230, 'M', 'ȱ'), - (0x231, 'V'), - (0x232, 'M', 'ȳ'), - (0x233, 'V'), - (0x23A, 'M', 'ⱥ'), - (0x23B, 'M', 'ȼ'), - (0x23C, 'V'), - (0x23D, 'M', 'ƚ'), - (0x23E, 'M', 'ⱦ'), - (0x23F, 'V'), - (0x241, 'M', 'ɂ'), - (0x242, 'V'), - (0x243, 'M', 'ƀ'), - (0x244, 'M', 'ʉ'), - (0x245, 'M', 'ʌ'), - (0x246, 'M', 'ɇ'), - (0x247, 'V'), - (0x248, 'M', 'ɉ'), - (0x249, 'V'), - (0x24A, 'M', 'ɋ'), - (0x24B, 'V'), - (0x24C, 'M', 'ɍ'), - (0x24D, 'V'), - (0x24E, 'M', 'ɏ'), - (0x24F, 'V'), - (0x2B0, 'M', 'h'), - (0x2B1, 'M', 'ɦ'), - (0x2B2, 'M', 'j'), - (0x2B3, 'M', 'r'), - (0x2B4, 'M', 'ɹ'), - (0x2B5, 'M', 'ɻ'), - (0x2B6, 'M', 'ʁ'), - (0x2B7, 'M', 'w'), - (0x2B8, 'M', 'y'), - (0x2B9, 'V'), - (0x2D8, '3', ' ̆'), - (0x2D9, '3', ' ̇'), - (0x2DA, '3', ' ̊'), - (0x2DB, '3', ' ̨'), - (0x2DC, '3', ' ̃'), - (0x2DD, '3', ' ̋'), - (0x2DE, 'V'), - (0x2E0, 'M', 'ɣ'), - (0x2E1, 'M', 'l'), - (0x2E2, 'M', 's'), - (0x2E3, 'M', 'x'), - (0x2E4, 'M', 'ʕ'), - (0x2E5, 'V'), - (0x340, 'M', '̀'), - (0x341, 'M', '́'), - (0x342, 'V'), - (0x343, 'M', '̓'), - (0x344, 'M', '̈́'), - (0x345, 'M', 'ι'), - (0x346, 'V'), - (0x34F, 'I'), - (0x350, 'V'), - (0x370, 'M', 'ͱ'), - (0x371, 'V'), - (0x372, 'M', 'ͳ'), - (0x373, 'V'), - (0x374, 'M', 'ʹ'), - (0x375, 'V'), - (0x376, 'M', 'ͷ'), - (0x377, 'V'), + (0x20D, "V"), + (0x20E, "M", "ȏ"), + (0x20F, "V"), + (0x210, "M", "ȑ"), + (0x211, "V"), + (0x212, "M", "ȓ"), + (0x213, "V"), + (0x214, "M", "ȕ"), + (0x215, "V"), + (0x216, "M", "ȗ"), + (0x217, "V"), + (0x218, "M", "ș"), + (0x219, "V"), + (0x21A, "M", "ț"), + (0x21B, "V"), + (0x21C, "M", "ȝ"), + (0x21D, "V"), + (0x21E, "M", "ȟ"), + (0x21F, "V"), + (0x220, "M", "ƞ"), + (0x221, "V"), + (0x222, "M", "ȣ"), + (0x223, "V"), + (0x224, "M", "ȥ"), + (0x225, "V"), + (0x226, "M", "ȧ"), + (0x227, "V"), + (0x228, "M", "ȩ"), + (0x229, "V"), + (0x22A, "M", "ȫ"), + (0x22B, "V"), + (0x22C, "M", "ȭ"), + (0x22D, "V"), + (0x22E, "M", "ȯ"), + (0x22F, "V"), + (0x230, "M", "ȱ"), + (0x231, "V"), + (0x232, "M", "ȳ"), + (0x233, "V"), + (0x23A, "M", "ⱥ"), + (0x23B, "M", "ȼ"), + (0x23C, "V"), + (0x23D, "M", "ƚ"), + (0x23E, "M", "ⱦ"), + (0x23F, "V"), + (0x241, "M", "ɂ"), + (0x242, "V"), + (0x243, "M", "ƀ"), + (0x244, "M", "ʉ"), + (0x245, "M", "ʌ"), + (0x246, "M", "ɇ"), + (0x247, "V"), + (0x248, "M", "ɉ"), + (0x249, "V"), + (0x24A, "M", "ɋ"), + (0x24B, "V"), + (0x24C, "M", "ɍ"), + (0x24D, "V"), + (0x24E, "M", "ɏ"), + (0x24F, "V"), + (0x2B0, "M", "h"), + (0x2B1, "M", "ɦ"), + (0x2B2, "M", "j"), + (0x2B3, "M", "r"), + (0x2B4, "M", "ɹ"), + (0x2B5, "M", "ɻ"), + (0x2B6, "M", "ʁ"), + (0x2B7, "M", "w"), + (0x2B8, "M", "y"), + (0x2B9, "V"), + (0x2D8, "3", " ̆"), + (0x2D9, "3", " ̇"), + (0x2DA, "3", " ̊"), + (0x2DB, "3", " ̨"), + (0x2DC, "3", " ̃"), + (0x2DD, "3", " ̋"), + (0x2DE, "V"), + (0x2E0, "M", "ɣ"), + (0x2E1, "M", "l"), + (0x2E2, "M", "s"), + (0x2E3, "M", "x"), + (0x2E4, "M", "ʕ"), + (0x2E5, "V"), + (0x340, "M", "̀"), + (0x341, "M", "́"), + (0x342, "V"), + (0x343, "M", "̓"), + (0x344, "M", "̈́"), + (0x345, "M", "ι"), + (0x346, "V"), + (0x34F, "I"), + (0x350, "V"), + (0x370, "M", "ͱ"), + (0x371, "V"), + (0x372, "M", "ͳ"), + (0x373, "V"), + (0x374, "M", "ʹ"), + (0x375, "V"), + (0x376, "M", "ͷ"), + (0x377, "V"), ] + def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x378, 'X'), - (0x37A, '3', ' ι'), - (0x37B, 'V'), - (0x37E, '3', ';'), - (0x37F, 'M', 'ϳ'), - (0x380, 'X'), - (0x384, '3', ' ́'), - (0x385, '3', ' ̈́'), - (0x386, 'M', 'ά'), - (0x387, 'M', '·'), - (0x388, 'M', 'έ'), - (0x389, 'M', 'ή'), - (0x38A, 'M', 'ί'), - (0x38B, 'X'), - (0x38C, 'M', 'ό'), - (0x38D, 'X'), - (0x38E, 'M', 'ύ'), - (0x38F, 'M', 'ώ'), - (0x390, 'V'), - (0x391, 'M', 'α'), - (0x392, 'M', 'β'), - (0x393, 'M', 'γ'), - (0x394, 'M', 'δ'), - (0x395, 'M', 'ε'), - (0x396, 'M', 'ζ'), - (0x397, 'M', 'η'), - (0x398, 'M', 'θ'), - (0x399, 'M', 'ι'), - (0x39A, 'M', 'κ'), - (0x39B, 'M', 'λ'), - (0x39C, 'M', 'μ'), - (0x39D, 'M', 'ν'), - (0x39E, 'M', 'ξ'), - (0x39F, 'M', 'ο'), - (0x3A0, 'M', 'π'), - (0x3A1, 'M', 'ρ'), - (0x3A2, 'X'), - (0x3A3, 'M', 'σ'), - (0x3A4, 'M', 'τ'), - (0x3A5, 'M', 'υ'), - (0x3A6, 'M', 'φ'), - (0x3A7, 'M', 'χ'), - (0x3A8, 'M', 'ψ'), - (0x3A9, 'M', 'ω'), - (0x3AA, 'M', 'ϊ'), - (0x3AB, 'M', 'ϋ'), - (0x3AC, 'V'), - (0x3C2, 'D', 'σ'), - (0x3C3, 'V'), - (0x3CF, 'M', 'ϗ'), - (0x3D0, 'M', 'β'), - (0x3D1, 'M', 'θ'), - (0x3D2, 'M', 'υ'), - (0x3D3, 'M', 'ύ'), - (0x3D4, 'M', 'ϋ'), - (0x3D5, 'M', 'φ'), - (0x3D6, 'M', 'π'), - (0x3D7, 'V'), - (0x3D8, 'M', 'ϙ'), - (0x3D9, 'V'), - (0x3DA, 'M', 'ϛ'), - (0x3DB, 'V'), - (0x3DC, 'M', 'ϝ'), - (0x3DD, 'V'), - (0x3DE, 'M', 'ϟ'), - (0x3DF, 'V'), - (0x3E0, 'M', 'ϡ'), - (0x3E1, 'V'), - (0x3E2, 'M', 'ϣ'), - (0x3E3, 'V'), - (0x3E4, 'M', 'ϥ'), - (0x3E5, 'V'), - (0x3E6, 'M', 'ϧ'), - (0x3E7, 'V'), - (0x3E8, 'M', 'ϩ'), - (0x3E9, 'V'), - (0x3EA, 'M', 'ϫ'), - (0x3EB, 'V'), - (0x3EC, 'M', 'ϭ'), - (0x3ED, 'V'), - (0x3EE, 'M', 'ϯ'), - (0x3EF, 'V'), - (0x3F0, 'M', 'κ'), - (0x3F1, 'M', 'ρ'), - (0x3F2, 'M', 'σ'), - (0x3F3, 'V'), - (0x3F4, 'M', 'θ'), - (0x3F5, 'M', 'ε'), - (0x3F6, 'V'), - (0x3F7, 'M', 'ϸ'), - (0x3F8, 'V'), - (0x3F9, 'M', 'σ'), - (0x3FA, 'M', 'ϻ'), - (0x3FB, 'V'), - (0x3FD, 'M', 'ͻ'), - (0x3FE, 'M', 'ͼ'), - (0x3FF, 'M', 'ͽ'), - (0x400, 'M', 'ѐ'), - (0x401, 'M', 'ё'), - (0x402, 'M', 'ђ'), + (0x378, "X"), + (0x37A, "3", " ι"), + (0x37B, "V"), + (0x37E, "3", ";"), + (0x37F, "M", "ϳ"), + (0x380, "X"), + (0x384, "3", " ́"), + (0x385, "3", " ̈́"), + (0x386, "M", "ά"), + (0x387, "M", "·"), + (0x388, "M", "έ"), + (0x389, "M", "ή"), + (0x38A, "M", "ί"), + (0x38B, "X"), + (0x38C, "M", "ό"), + (0x38D, "X"), + (0x38E, "M", "ύ"), + (0x38F, "M", "ώ"), + (0x390, "V"), + (0x391, "M", "α"), + (0x392, "M", "β"), + (0x393, "M", "γ"), + (0x394, "M", "δ"), + (0x395, "M", "ε"), + (0x396, "M", "ζ"), + (0x397, "M", "η"), + (0x398, "M", "θ"), + (0x399, "M", "ι"), + (0x39A, "M", "κ"), + (0x39B, "M", "λ"), + (0x39C, "M", "μ"), + (0x39D, "M", "ν"), + (0x39E, "M", "ξ"), + (0x39F, "M", "ο"), + (0x3A0, "M", "π"), + (0x3A1, "M", "ρ"), + (0x3A2, "X"), + (0x3A3, "M", "σ"), + (0x3A4, "M", "τ"), + (0x3A5, "M", "υ"), + (0x3A6, "M", "φ"), + (0x3A7, "M", "χ"), + (0x3A8, "M", "ψ"), + (0x3A9, "M", "ω"), + (0x3AA, "M", "ϊ"), + (0x3AB, "M", "ϋ"), + (0x3AC, "V"), + (0x3C2, "D", "σ"), + (0x3C3, "V"), + (0x3CF, "M", "ϗ"), + (0x3D0, "M", "β"), + (0x3D1, "M", "θ"), + (0x3D2, "M", "υ"), + (0x3D3, "M", "ύ"), + (0x3D4, "M", "ϋ"), + (0x3D5, "M", "φ"), + (0x3D6, "M", "π"), + (0x3D7, "V"), + (0x3D8, "M", "ϙ"), + (0x3D9, "V"), + (0x3DA, "M", "ϛ"), + (0x3DB, "V"), + (0x3DC, "M", "ϝ"), + (0x3DD, "V"), + (0x3DE, "M", "ϟ"), + (0x3DF, "V"), + (0x3E0, "M", "ϡ"), + (0x3E1, "V"), + (0x3E2, "M", "ϣ"), + (0x3E3, "V"), + (0x3E4, "M", "ϥ"), + (0x3E5, "V"), + (0x3E6, "M", "ϧ"), + (0x3E7, "V"), + (0x3E8, "M", "ϩ"), + (0x3E9, "V"), + (0x3EA, "M", "ϫ"), + (0x3EB, "V"), + (0x3EC, "M", "ϭ"), + (0x3ED, "V"), + (0x3EE, "M", "ϯ"), + (0x3EF, "V"), + (0x3F0, "M", "κ"), + (0x3F1, "M", "ρ"), + (0x3F2, "M", "σ"), + (0x3F3, "V"), + (0x3F4, "M", "θ"), + (0x3F5, "M", "ε"), + (0x3F6, "V"), + (0x3F7, "M", "ϸ"), + (0x3F8, "V"), + (0x3F9, "M", "σ"), + (0x3FA, "M", "ϻ"), + (0x3FB, "V"), + (0x3FD, "M", "ͻ"), + (0x3FE, "M", "ͼ"), + (0x3FF, "M", "ͽ"), + (0x400, "M", "ѐ"), + (0x401, "M", "ё"), + (0x402, "M", "ђ"), ] + def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x403, 'M', 'ѓ'), - (0x404, 'M', 'є'), - (0x405, 'M', 'ѕ'), - (0x406, 'M', 'і'), - (0x407, 'M', 'ї'), - (0x408, 'M', 'ј'), - (0x409, 'M', 'љ'), - (0x40A, 'M', 'њ'), - (0x40B, 'M', 'ћ'), - (0x40C, 'M', 'ќ'), - (0x40D, 'M', 'ѝ'), - (0x40E, 'M', 'ў'), - (0x40F, 'M', 'џ'), - (0x410, 'M', 'а'), - (0x411, 'M', 'б'), - (0x412, 'M', 'в'), - (0x413, 'M', 'г'), - (0x414, 'M', 'д'), - (0x415, 'M', 'е'), - (0x416, 'M', 'ж'), - (0x417, 'M', 'з'), - (0x418, 'M', 'и'), - (0x419, 'M', 'й'), - (0x41A, 'M', 'к'), - (0x41B, 'M', 'л'), - (0x41C, 'M', 'м'), - (0x41D, 'M', 'н'), - (0x41E, 'M', 'о'), - (0x41F, 'M', 'п'), - (0x420, 'M', 'р'), - (0x421, 'M', 'с'), - (0x422, 'M', 'т'), - (0x423, 'M', 'у'), - (0x424, 'M', 'ф'), - (0x425, 'M', 'х'), - (0x426, 'M', 'ц'), - (0x427, 'M', 'ч'), - (0x428, 'M', 'ш'), - (0x429, 'M', 'щ'), - (0x42A, 'M', 'ъ'), - (0x42B, 'M', 'ы'), - (0x42C, 'M', 'ь'), - (0x42D, 'M', 'э'), - (0x42E, 'M', 'ю'), - (0x42F, 'M', 'я'), - (0x430, 'V'), - (0x460, 'M', 'ѡ'), - (0x461, 'V'), - (0x462, 'M', 'ѣ'), - (0x463, 'V'), - (0x464, 'M', 'ѥ'), - (0x465, 'V'), - (0x466, 'M', 'ѧ'), - (0x467, 'V'), - (0x468, 'M', 'ѩ'), - (0x469, 'V'), - (0x46A, 'M', 'ѫ'), - (0x46B, 'V'), - (0x46C, 'M', 'ѭ'), - (0x46D, 'V'), - (0x46E, 'M', 'ѯ'), - (0x46F, 'V'), - (0x470, 'M', 'ѱ'), - (0x471, 'V'), - (0x472, 'M', 'ѳ'), - (0x473, 'V'), - (0x474, 'M', 'ѵ'), - (0x475, 'V'), - (0x476, 'M', 'ѷ'), - (0x477, 'V'), - (0x478, 'M', 'ѹ'), - (0x479, 'V'), - (0x47A, 'M', 'ѻ'), - (0x47B, 'V'), - (0x47C, 'M', 'ѽ'), - (0x47D, 'V'), - (0x47E, 'M', 'ѿ'), - (0x47F, 'V'), - (0x480, 'M', 'ҁ'), - (0x481, 'V'), - (0x48A, 'M', 'ҋ'), - (0x48B, 'V'), - (0x48C, 'M', 'ҍ'), - (0x48D, 'V'), - (0x48E, 'M', 'ҏ'), - (0x48F, 'V'), - (0x490, 'M', 'ґ'), - (0x491, 'V'), - (0x492, 'M', 'ғ'), - (0x493, 'V'), - (0x494, 'M', 'ҕ'), - (0x495, 'V'), - (0x496, 'M', 'җ'), - (0x497, 'V'), - (0x498, 'M', 'ҙ'), - (0x499, 'V'), - (0x49A, 'M', 'қ'), - (0x49B, 'V'), - (0x49C, 'M', 'ҝ'), - (0x49D, 'V'), + (0x403, "M", "ѓ"), + (0x404, "M", "є"), + (0x405, "M", "ѕ"), + (0x406, "M", "і"), + (0x407, "M", "ї"), + (0x408, "M", "ј"), + (0x409, "M", "љ"), + (0x40A, "M", "њ"), + (0x40B, "M", "ћ"), + (0x40C, "M", "ќ"), + (0x40D, "M", "ѝ"), + (0x40E, "M", "ў"), + (0x40F, "M", "џ"), + (0x410, "M", "а"), + (0x411, "M", "б"), + (0x412, "M", "в"), + (0x413, "M", "г"), + (0x414, "M", "д"), + (0x415, "M", "е"), + (0x416, "M", "ж"), + (0x417, "M", "з"), + (0x418, "M", "и"), + (0x419, "M", "й"), + (0x41A, "M", "к"), + (0x41B, "M", "л"), + (0x41C, "M", "м"), + (0x41D, "M", "н"), + (0x41E, "M", "о"), + (0x41F, "M", "п"), + (0x420, "M", "р"), + (0x421, "M", "с"), + (0x422, "M", "т"), + (0x423, "M", "у"), + (0x424, "M", "ф"), + (0x425, "M", "х"), + (0x426, "M", "ц"), + (0x427, "M", "ч"), + (0x428, "M", "ш"), + (0x429, "M", "щ"), + (0x42A, "M", "ъ"), + (0x42B, "M", "ы"), + (0x42C, "M", "ь"), + (0x42D, "M", "э"), + (0x42E, "M", "ю"), + (0x42F, "M", "я"), + (0x430, "V"), + (0x460, "M", "ѡ"), + (0x461, "V"), + (0x462, "M", "ѣ"), + (0x463, "V"), + (0x464, "M", "ѥ"), + (0x465, "V"), + (0x466, "M", "ѧ"), + (0x467, "V"), + (0x468, "M", "ѩ"), + (0x469, "V"), + (0x46A, "M", "ѫ"), + (0x46B, "V"), + (0x46C, "M", "ѭ"), + (0x46D, "V"), + (0x46E, "M", "ѯ"), + (0x46F, "V"), + (0x470, "M", "ѱ"), + (0x471, "V"), + (0x472, "M", "ѳ"), + (0x473, "V"), + (0x474, "M", "ѵ"), + (0x475, "V"), + (0x476, "M", "ѷ"), + (0x477, "V"), + (0x478, "M", "ѹ"), + (0x479, "V"), + (0x47A, "M", "ѻ"), + (0x47B, "V"), + (0x47C, "M", "ѽ"), + (0x47D, "V"), + (0x47E, "M", "ѿ"), + (0x47F, "V"), + (0x480, "M", "ҁ"), + (0x481, "V"), + (0x48A, "M", "ҋ"), + (0x48B, "V"), + (0x48C, "M", "ҍ"), + (0x48D, "V"), + (0x48E, "M", "ҏ"), + (0x48F, "V"), + (0x490, "M", "ґ"), + (0x491, "V"), + (0x492, "M", "ғ"), + (0x493, "V"), + (0x494, "M", "ҕ"), + (0x495, "V"), + (0x496, "M", "җ"), + (0x497, "V"), + (0x498, "M", "ҙ"), + (0x499, "V"), + (0x49A, "M", "қ"), + (0x49B, "V"), + (0x49C, "M", "ҝ"), + (0x49D, "V"), ] + def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x49E, 'M', 'ҟ'), - (0x49F, 'V'), - (0x4A0, 'M', 'ҡ'), - (0x4A1, 'V'), - (0x4A2, 'M', 'ң'), - (0x4A3, 'V'), - (0x4A4, 'M', 'ҥ'), - (0x4A5, 'V'), - (0x4A6, 'M', 'ҧ'), - (0x4A7, 'V'), - (0x4A8, 'M', 'ҩ'), - (0x4A9, 'V'), - (0x4AA, 'M', 'ҫ'), - (0x4AB, 'V'), - (0x4AC, 'M', 'ҭ'), - (0x4AD, 'V'), - (0x4AE, 'M', 'ү'), - (0x4AF, 'V'), - (0x4B0, 'M', 'ұ'), - (0x4B1, 'V'), - (0x4B2, 'M', 'ҳ'), - (0x4B3, 'V'), - (0x4B4, 'M', 'ҵ'), - (0x4B5, 'V'), - (0x4B6, 'M', 'ҷ'), - (0x4B7, 'V'), - (0x4B8, 'M', 'ҹ'), - (0x4B9, 'V'), - (0x4BA, 'M', 'һ'), - (0x4BB, 'V'), - (0x4BC, 'M', 'ҽ'), - (0x4BD, 'V'), - (0x4BE, 'M', 'ҿ'), - (0x4BF, 'V'), - (0x4C0, 'X'), - (0x4C1, 'M', 'ӂ'), - (0x4C2, 'V'), - (0x4C3, 'M', 'ӄ'), - (0x4C4, 'V'), - (0x4C5, 'M', 'ӆ'), - (0x4C6, 'V'), - (0x4C7, 'M', 'ӈ'), - (0x4C8, 'V'), - (0x4C9, 'M', 'ӊ'), - (0x4CA, 'V'), - (0x4CB, 'M', 'ӌ'), - (0x4CC, 'V'), - (0x4CD, 'M', 'ӎ'), - (0x4CE, 'V'), - (0x4D0, 'M', 'ӑ'), - (0x4D1, 'V'), - (0x4D2, 'M', 'ӓ'), - (0x4D3, 'V'), - (0x4D4, 'M', 'ӕ'), - (0x4D5, 'V'), - (0x4D6, 'M', 'ӗ'), - (0x4D7, 'V'), - (0x4D8, 'M', 'ә'), - (0x4D9, 'V'), - (0x4DA, 'M', 'ӛ'), - (0x4DB, 'V'), - (0x4DC, 'M', 'ӝ'), - (0x4DD, 'V'), - (0x4DE, 'M', 'ӟ'), - (0x4DF, 'V'), - (0x4E0, 'M', 'ӡ'), - (0x4E1, 'V'), - (0x4E2, 'M', 'ӣ'), - (0x4E3, 'V'), - (0x4E4, 'M', 'ӥ'), - (0x4E5, 'V'), - (0x4E6, 'M', 'ӧ'), - (0x4E7, 'V'), - (0x4E8, 'M', 'ө'), - (0x4E9, 'V'), - (0x4EA, 'M', 'ӫ'), - (0x4EB, 'V'), - (0x4EC, 'M', 'ӭ'), - (0x4ED, 'V'), - (0x4EE, 'M', 'ӯ'), - (0x4EF, 'V'), - (0x4F0, 'M', 'ӱ'), - (0x4F1, 'V'), - (0x4F2, 'M', 'ӳ'), - (0x4F3, 'V'), - (0x4F4, 'M', 'ӵ'), - (0x4F5, 'V'), - (0x4F6, 'M', 'ӷ'), - (0x4F7, 'V'), - (0x4F8, 'M', 'ӹ'), - (0x4F9, 'V'), - (0x4FA, 'M', 'ӻ'), - (0x4FB, 'V'), - (0x4FC, 'M', 'ӽ'), - (0x4FD, 'V'), - (0x4FE, 'M', 'ӿ'), - (0x4FF, 'V'), - (0x500, 'M', 'ԁ'), - (0x501, 'V'), - (0x502, 'M', 'ԃ'), + (0x49E, "M", "ҟ"), + (0x49F, "V"), + (0x4A0, "M", "ҡ"), + (0x4A1, "V"), + (0x4A2, "M", "ң"), + (0x4A3, "V"), + (0x4A4, "M", "ҥ"), + (0x4A5, "V"), + (0x4A6, "M", "ҧ"), + (0x4A7, "V"), + (0x4A8, "M", "ҩ"), + (0x4A9, "V"), + (0x4AA, "M", "ҫ"), + (0x4AB, "V"), + (0x4AC, "M", "ҭ"), + (0x4AD, "V"), + (0x4AE, "M", "ү"), + (0x4AF, "V"), + (0x4B0, "M", "ұ"), + (0x4B1, "V"), + (0x4B2, "M", "ҳ"), + (0x4B3, "V"), + (0x4B4, "M", "ҵ"), + (0x4B5, "V"), + (0x4B6, "M", "ҷ"), + (0x4B7, "V"), + (0x4B8, "M", "ҹ"), + (0x4B9, "V"), + (0x4BA, "M", "һ"), + (0x4BB, "V"), + (0x4BC, "M", "ҽ"), + (0x4BD, "V"), + (0x4BE, "M", "ҿ"), + (0x4BF, "V"), + (0x4C0, "X"), + (0x4C1, "M", "ӂ"), + (0x4C2, "V"), + (0x4C3, "M", "ӄ"), + (0x4C4, "V"), + (0x4C5, "M", "ӆ"), + (0x4C6, "V"), + (0x4C7, "M", "ӈ"), + (0x4C8, "V"), + (0x4C9, "M", "ӊ"), + (0x4CA, "V"), + (0x4CB, "M", "ӌ"), + (0x4CC, "V"), + (0x4CD, "M", "ӎ"), + (0x4CE, "V"), + (0x4D0, "M", "ӑ"), + (0x4D1, "V"), + (0x4D2, "M", "ӓ"), + (0x4D3, "V"), + (0x4D4, "M", "ӕ"), + (0x4D5, "V"), + (0x4D6, "M", "ӗ"), + (0x4D7, "V"), + (0x4D8, "M", "ә"), + (0x4D9, "V"), + (0x4DA, "M", "ӛ"), + (0x4DB, "V"), + (0x4DC, "M", "ӝ"), + (0x4DD, "V"), + (0x4DE, "M", "ӟ"), + (0x4DF, "V"), + (0x4E0, "M", "ӡ"), + (0x4E1, "V"), + (0x4E2, "M", "ӣ"), + (0x4E3, "V"), + (0x4E4, "M", "ӥ"), + (0x4E5, "V"), + (0x4E6, "M", "ӧ"), + (0x4E7, "V"), + (0x4E8, "M", "ө"), + (0x4E9, "V"), + (0x4EA, "M", "ӫ"), + (0x4EB, "V"), + (0x4EC, "M", "ӭ"), + (0x4ED, "V"), + (0x4EE, "M", "ӯ"), + (0x4EF, "V"), + (0x4F0, "M", "ӱ"), + (0x4F1, "V"), + (0x4F2, "M", "ӳ"), + (0x4F3, "V"), + (0x4F4, "M", "ӵ"), + (0x4F5, "V"), + (0x4F6, "M", "ӷ"), + (0x4F7, "V"), + (0x4F8, "M", "ӹ"), + (0x4F9, "V"), + (0x4FA, "M", "ӻ"), + (0x4FB, "V"), + (0x4FC, "M", "ӽ"), + (0x4FD, "V"), + (0x4FE, "M", "ӿ"), + (0x4FF, "V"), + (0x500, "M", "ԁ"), + (0x501, "V"), + (0x502, "M", "ԃ"), ] + def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x503, 'V'), - (0x504, 'M', 'ԅ'), - (0x505, 'V'), - (0x506, 'M', 'ԇ'), - (0x507, 'V'), - (0x508, 'M', 'ԉ'), - (0x509, 'V'), - (0x50A, 'M', 'ԋ'), - (0x50B, 'V'), - (0x50C, 'M', 'ԍ'), - (0x50D, 'V'), - (0x50E, 'M', 'ԏ'), - (0x50F, 'V'), - (0x510, 'M', 'ԑ'), - (0x511, 'V'), - (0x512, 'M', 'ԓ'), - (0x513, 'V'), - (0x514, 'M', 'ԕ'), - (0x515, 'V'), - (0x516, 'M', 'ԗ'), - (0x517, 'V'), - (0x518, 'M', 'ԙ'), - (0x519, 'V'), - (0x51A, 'M', 'ԛ'), - (0x51B, 'V'), - (0x51C, 'M', 'ԝ'), - (0x51D, 'V'), - (0x51E, 'M', 'ԟ'), - (0x51F, 'V'), - (0x520, 'M', 'ԡ'), - (0x521, 'V'), - (0x522, 'M', 'ԣ'), - (0x523, 'V'), - (0x524, 'M', 'ԥ'), - (0x525, 'V'), - (0x526, 'M', 'ԧ'), - (0x527, 'V'), - (0x528, 'M', 'ԩ'), - (0x529, 'V'), - (0x52A, 'M', 'ԫ'), - (0x52B, 'V'), - (0x52C, 'M', 'ԭ'), - (0x52D, 'V'), - (0x52E, 'M', 'ԯ'), - (0x52F, 'V'), - (0x530, 'X'), - (0x531, 'M', 'ա'), - (0x532, 'M', 'բ'), - (0x533, 'M', 'գ'), - (0x534, 'M', 'դ'), - (0x535, 'M', 'ե'), - (0x536, 'M', 'զ'), - (0x537, 'M', 'է'), - (0x538, 'M', 'ը'), - (0x539, 'M', 'թ'), - (0x53A, 'M', 'ժ'), - (0x53B, 'M', 'ի'), - (0x53C, 'M', 'լ'), - (0x53D, 'M', 'խ'), - (0x53E, 'M', 'ծ'), - (0x53F, 'M', 'կ'), - (0x540, 'M', 'հ'), - (0x541, 'M', 'ձ'), - (0x542, 'M', 'ղ'), - (0x543, 'M', 'ճ'), - (0x544, 'M', 'մ'), - (0x545, 'M', 'յ'), - (0x546, 'M', 'ն'), - (0x547, 'M', 'շ'), - (0x548, 'M', 'ո'), - (0x549, 'M', 'չ'), - (0x54A, 'M', 'պ'), - (0x54B, 'M', 'ջ'), - (0x54C, 'M', 'ռ'), - (0x54D, 'M', 'ս'), - (0x54E, 'M', 'վ'), - (0x54F, 'M', 'տ'), - (0x550, 'M', 'ր'), - (0x551, 'M', 'ց'), - (0x552, 'M', 'ւ'), - (0x553, 'M', 'փ'), - (0x554, 'M', 'ք'), - (0x555, 'M', 'օ'), - (0x556, 'M', 'ֆ'), - (0x557, 'X'), - (0x559, 'V'), - (0x587, 'M', 'եւ'), - (0x588, 'V'), - (0x58B, 'X'), - (0x58D, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5EF, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61D, 'V'), + (0x503, "V"), + (0x504, "M", "ԅ"), + (0x505, "V"), + (0x506, "M", "ԇ"), + (0x507, "V"), + (0x508, "M", "ԉ"), + (0x509, "V"), + (0x50A, "M", "ԋ"), + (0x50B, "V"), + (0x50C, "M", "ԍ"), + (0x50D, "V"), + (0x50E, "M", "ԏ"), + (0x50F, "V"), + (0x510, "M", "ԑ"), + (0x511, "V"), + (0x512, "M", "ԓ"), + (0x513, "V"), + (0x514, "M", "ԕ"), + (0x515, "V"), + (0x516, "M", "ԗ"), + (0x517, "V"), + (0x518, "M", "ԙ"), + (0x519, "V"), + (0x51A, "M", "ԛ"), + (0x51B, "V"), + (0x51C, "M", "ԝ"), + (0x51D, "V"), + (0x51E, "M", "ԟ"), + (0x51F, "V"), + (0x520, "M", "ԡ"), + (0x521, "V"), + (0x522, "M", "ԣ"), + (0x523, "V"), + (0x524, "M", "ԥ"), + (0x525, "V"), + (0x526, "M", "ԧ"), + (0x527, "V"), + (0x528, "M", "ԩ"), + (0x529, "V"), + (0x52A, "M", "ԫ"), + (0x52B, "V"), + (0x52C, "M", "ԭ"), + (0x52D, "V"), + (0x52E, "M", "ԯ"), + (0x52F, "V"), + (0x530, "X"), + (0x531, "M", "ա"), + (0x532, "M", "բ"), + (0x533, "M", "գ"), + (0x534, "M", "դ"), + (0x535, "M", "ե"), + (0x536, "M", "զ"), + (0x537, "M", "է"), + (0x538, "M", "ը"), + (0x539, "M", "թ"), + (0x53A, "M", "ժ"), + (0x53B, "M", "ի"), + (0x53C, "M", "լ"), + (0x53D, "M", "խ"), + (0x53E, "M", "ծ"), + (0x53F, "M", "կ"), + (0x540, "M", "հ"), + (0x541, "M", "ձ"), + (0x542, "M", "ղ"), + (0x543, "M", "ճ"), + (0x544, "M", "մ"), + (0x545, "M", "յ"), + (0x546, "M", "ն"), + (0x547, "M", "շ"), + (0x548, "M", "ո"), + (0x549, "M", "չ"), + (0x54A, "M", "պ"), + (0x54B, "M", "ջ"), + (0x54C, "M", "ռ"), + (0x54D, "M", "ս"), + (0x54E, "M", "վ"), + (0x54F, "M", "տ"), + (0x550, "M", "ր"), + (0x551, "M", "ց"), + (0x552, "M", "ւ"), + (0x553, "M", "փ"), + (0x554, "M", "ք"), + (0x555, "M", "օ"), + (0x556, "M", "ֆ"), + (0x557, "X"), + (0x559, "V"), + (0x587, "M", "եւ"), + (0x588, "V"), + (0x58B, "X"), + (0x58D, "V"), + (0x590, "X"), + (0x591, "V"), + (0x5C8, "X"), + (0x5D0, "V"), + (0x5EB, "X"), + (0x5EF, "V"), + (0x5F5, "X"), + (0x606, "V"), + (0x61C, "X"), + (0x61D, "V"), ] + def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x675, 'M', 'اٴ'), - (0x676, 'M', 'وٴ'), - (0x677, 'M', 'ۇٴ'), - (0x678, 'M', 'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x7FD, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x860, 'V'), - (0x86B, 'X'), - (0x870, 'V'), - (0x88F, 'X'), - (0x898, 'V'), - (0x8E2, 'X'), - (0x8E3, 'V'), - (0x958, 'M', 'क़'), - (0x959, 'M', 'ख़'), - (0x95A, 'M', 'ग़'), - (0x95B, 'M', 'ज़'), - (0x95C, 'M', 'ड़'), - (0x95D, 'M', 'ढ़'), - (0x95E, 'M', 'फ़'), - (0x95F, 'M', 'य़'), - (0x960, 'V'), - (0x984, 'X'), - (0x985, 'V'), - (0x98D, 'X'), - (0x98F, 'V'), - (0x991, 'X'), - (0x993, 'V'), - (0x9A9, 'X'), - (0x9AA, 'V'), - (0x9B1, 'X'), - (0x9B2, 'V'), - (0x9B3, 'X'), - (0x9B6, 'V'), - (0x9BA, 'X'), - (0x9BC, 'V'), - (0x9C5, 'X'), - (0x9C7, 'V'), - (0x9C9, 'X'), - (0x9CB, 'V'), - (0x9CF, 'X'), - (0x9D7, 'V'), - (0x9D8, 'X'), - (0x9DC, 'M', 'ড়'), - (0x9DD, 'M', 'ঢ়'), - (0x9DE, 'X'), - (0x9DF, 'M', 'য়'), - (0x9E0, 'V'), - (0x9E4, 'X'), - (0x9E6, 'V'), - (0x9FF, 'X'), - (0xA01, 'V'), - (0xA04, 'X'), - (0xA05, 'V'), - (0xA0B, 'X'), - (0xA0F, 'V'), - (0xA11, 'X'), - (0xA13, 'V'), - (0xA29, 'X'), - (0xA2A, 'V'), - (0xA31, 'X'), - (0xA32, 'V'), - (0xA33, 'M', 'ਲ਼'), - (0xA34, 'X'), - (0xA35, 'V'), - (0xA36, 'M', 'ਸ਼'), - (0xA37, 'X'), - (0xA38, 'V'), - (0xA3A, 'X'), - (0xA3C, 'V'), - (0xA3D, 'X'), - (0xA3E, 'V'), - (0xA43, 'X'), - (0xA47, 'V'), - (0xA49, 'X'), - (0xA4B, 'V'), - (0xA4E, 'X'), - (0xA51, 'V'), - (0xA52, 'X'), - (0xA59, 'M', 'ਖ਼'), - (0xA5A, 'M', 'ਗ਼'), - (0xA5B, 'M', 'ਜ਼'), - (0xA5C, 'V'), - (0xA5D, 'X'), + (0x675, "M", "اٴ"), + (0x676, "M", "وٴ"), + (0x677, "M", "ۇٴ"), + (0x678, "M", "يٴ"), + (0x679, "V"), + (0x6DD, "X"), + (0x6DE, "V"), + (0x70E, "X"), + (0x710, "V"), + (0x74B, "X"), + (0x74D, "V"), + (0x7B2, "X"), + (0x7C0, "V"), + (0x7FB, "X"), + (0x7FD, "V"), + (0x82E, "X"), + (0x830, "V"), + (0x83F, "X"), + (0x840, "V"), + (0x85C, "X"), + (0x85E, "V"), + (0x85F, "X"), + (0x860, "V"), + (0x86B, "X"), + (0x870, "V"), + (0x88F, "X"), + (0x898, "V"), + (0x8E2, "X"), + (0x8E3, "V"), + (0x958, "M", "क़"), + (0x959, "M", "ख़"), + (0x95A, "M", "ग़"), + (0x95B, "M", "ज़"), + (0x95C, "M", "ड़"), + (0x95D, "M", "ढ़"), + (0x95E, "M", "फ़"), + (0x95F, "M", "य़"), + (0x960, "V"), + (0x984, "X"), + (0x985, "V"), + (0x98D, "X"), + (0x98F, "V"), + (0x991, "X"), + (0x993, "V"), + (0x9A9, "X"), + (0x9AA, "V"), + (0x9B1, "X"), + (0x9B2, "V"), + (0x9B3, "X"), + (0x9B6, "V"), + (0x9BA, "X"), + (0x9BC, "V"), + (0x9C5, "X"), + (0x9C7, "V"), + (0x9C9, "X"), + (0x9CB, "V"), + (0x9CF, "X"), + (0x9D7, "V"), + (0x9D8, "X"), + (0x9DC, "M", "ড়"), + (0x9DD, "M", "ঢ়"), + (0x9DE, "X"), + (0x9DF, "M", "য়"), + (0x9E0, "V"), + (0x9E4, "X"), + (0x9E6, "V"), + (0x9FF, "X"), + (0xA01, "V"), + (0xA04, "X"), + (0xA05, "V"), + (0xA0B, "X"), + (0xA0F, "V"), + (0xA11, "X"), + (0xA13, "V"), + (0xA29, "X"), + (0xA2A, "V"), + (0xA31, "X"), + (0xA32, "V"), + (0xA33, "M", "ਲ਼"), + (0xA34, "X"), + (0xA35, "V"), + (0xA36, "M", "ਸ਼"), + (0xA37, "X"), + (0xA38, "V"), + (0xA3A, "X"), + (0xA3C, "V"), + (0xA3D, "X"), + (0xA3E, "V"), + (0xA43, "X"), + (0xA47, "V"), + (0xA49, "X"), + (0xA4B, "V"), + (0xA4E, "X"), + (0xA51, "V"), + (0xA52, "X"), + (0xA59, "M", "ਖ਼"), + (0xA5A, "M", "ਗ਼"), + (0xA5B, "M", "ਜ਼"), + (0xA5C, "V"), + (0xA5D, "X"), ] + def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xA5E, 'M', 'ਫ਼'), - (0xA5F, 'X'), - (0xA66, 'V'), - (0xA77, 'X'), - (0xA81, 'V'), - (0xA84, 'X'), - (0xA85, 'V'), - (0xA8E, 'X'), - (0xA8F, 'V'), - (0xA92, 'X'), - (0xA93, 'V'), - (0xAA9, 'X'), - (0xAAA, 'V'), - (0xAB1, 'X'), - (0xAB2, 'V'), - (0xAB4, 'X'), - (0xAB5, 'V'), - (0xABA, 'X'), - (0xABC, 'V'), - (0xAC6, 'X'), - (0xAC7, 'V'), - (0xACA, 'X'), - (0xACB, 'V'), - (0xACE, 'X'), - (0xAD0, 'V'), - (0xAD1, 'X'), - (0xAE0, 'V'), - (0xAE4, 'X'), - (0xAE6, 'V'), - (0xAF2, 'X'), - (0xAF9, 'V'), - (0xB00, 'X'), - (0xB01, 'V'), - (0xB04, 'X'), - (0xB05, 'V'), - (0xB0D, 'X'), - (0xB0F, 'V'), - (0xB11, 'X'), - (0xB13, 'V'), - (0xB29, 'X'), - (0xB2A, 'V'), - (0xB31, 'X'), - (0xB32, 'V'), - (0xB34, 'X'), - (0xB35, 'V'), - (0xB3A, 'X'), - (0xB3C, 'V'), - (0xB45, 'X'), - (0xB47, 'V'), - (0xB49, 'X'), - (0xB4B, 'V'), - (0xB4E, 'X'), - (0xB55, 'V'), - (0xB58, 'X'), - (0xB5C, 'M', 'ଡ଼'), - (0xB5D, 'M', 'ଢ଼'), - (0xB5E, 'X'), - (0xB5F, 'V'), - (0xB64, 'X'), - (0xB66, 'V'), - (0xB78, 'X'), - (0xB82, 'V'), - (0xB84, 'X'), - (0xB85, 'V'), - (0xB8B, 'X'), - (0xB8E, 'V'), - (0xB91, 'X'), - (0xB92, 'V'), - (0xB96, 'X'), - (0xB99, 'V'), - (0xB9B, 'X'), - (0xB9C, 'V'), - (0xB9D, 'X'), - (0xB9E, 'V'), - (0xBA0, 'X'), - (0xBA3, 'V'), - (0xBA5, 'X'), - (0xBA8, 'V'), - (0xBAB, 'X'), - (0xBAE, 'V'), - (0xBBA, 'X'), - (0xBBE, 'V'), - (0xBC3, 'X'), - (0xBC6, 'V'), - (0xBC9, 'X'), - (0xBCA, 'V'), - (0xBCE, 'X'), - (0xBD0, 'V'), - (0xBD1, 'X'), - (0xBD7, 'V'), - (0xBD8, 'X'), - (0xBE6, 'V'), - (0xBFB, 'X'), - (0xC00, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - (0xC29, 'X'), - (0xC2A, 'V'), + (0xA5E, "M", "ਫ਼"), + (0xA5F, "X"), + (0xA66, "V"), + (0xA77, "X"), + (0xA81, "V"), + (0xA84, "X"), + (0xA85, "V"), + (0xA8E, "X"), + (0xA8F, "V"), + (0xA92, "X"), + (0xA93, "V"), + (0xAA9, "X"), + (0xAAA, "V"), + (0xAB1, "X"), + (0xAB2, "V"), + (0xAB4, "X"), + (0xAB5, "V"), + (0xABA, "X"), + (0xABC, "V"), + (0xAC6, "X"), + (0xAC7, "V"), + (0xACA, "X"), + (0xACB, "V"), + (0xACE, "X"), + (0xAD0, "V"), + (0xAD1, "X"), + (0xAE0, "V"), + (0xAE4, "X"), + (0xAE6, "V"), + (0xAF2, "X"), + (0xAF9, "V"), + (0xB00, "X"), + (0xB01, "V"), + (0xB04, "X"), + (0xB05, "V"), + (0xB0D, "X"), + (0xB0F, "V"), + (0xB11, "X"), + (0xB13, "V"), + (0xB29, "X"), + (0xB2A, "V"), + (0xB31, "X"), + (0xB32, "V"), + (0xB34, "X"), + (0xB35, "V"), + (0xB3A, "X"), + (0xB3C, "V"), + (0xB45, "X"), + (0xB47, "V"), + (0xB49, "X"), + (0xB4B, "V"), + (0xB4E, "X"), + (0xB55, "V"), + (0xB58, "X"), + (0xB5C, "M", "ଡ଼"), + (0xB5D, "M", "ଢ଼"), + (0xB5E, "X"), + (0xB5F, "V"), + (0xB64, "X"), + (0xB66, "V"), + (0xB78, "X"), + (0xB82, "V"), + (0xB84, "X"), + (0xB85, "V"), + (0xB8B, "X"), + (0xB8E, "V"), + (0xB91, "X"), + (0xB92, "V"), + (0xB96, "X"), + (0xB99, "V"), + (0xB9B, "X"), + (0xB9C, "V"), + (0xB9D, "X"), + (0xB9E, "V"), + (0xBA0, "X"), + (0xBA3, "V"), + (0xBA5, "X"), + (0xBA8, "V"), + (0xBAB, "X"), + (0xBAE, "V"), + (0xBBA, "X"), + (0xBBE, "V"), + (0xBC3, "X"), + (0xBC6, "V"), + (0xBC9, "X"), + (0xBCA, "V"), + (0xBCE, "X"), + (0xBD0, "V"), + (0xBD1, "X"), + (0xBD7, "V"), + (0xBD8, "X"), + (0xBE6, "V"), + (0xBFB, "X"), + (0xC00, "V"), + (0xC0D, "X"), + (0xC0E, "V"), + (0xC11, "X"), + (0xC12, "V"), + (0xC29, "X"), + (0xC2A, "V"), ] + def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xC3A, 'X'), - (0xC3C, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5B, 'X'), - (0xC5D, 'V'), - (0xC5E, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC77, 'V'), - (0xC8D, 'X'), - (0xC8E, 'V'), - (0xC91, 'X'), - (0xC92, 'V'), - (0xCA9, 'X'), - (0xCAA, 'V'), - (0xCB4, 'X'), - (0xCB5, 'V'), - (0xCBA, 'X'), - (0xCBC, 'V'), - (0xCC5, 'X'), - (0xCC6, 'V'), - (0xCC9, 'X'), - (0xCCA, 'V'), - (0xCCE, 'X'), - (0xCD5, 'V'), - (0xCD7, 'X'), - (0xCDD, 'V'), - (0xCDF, 'X'), - (0xCE0, 'V'), - (0xCE4, 'X'), - (0xCE6, 'V'), - (0xCF0, 'X'), - (0xCF1, 'V'), - (0xCF4, 'X'), - (0xD00, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD50, 'X'), - (0xD54, 'V'), - (0xD64, 'X'), - (0xD66, 'V'), - (0xD80, 'X'), - (0xD81, 'V'), - (0xD84, 'X'), - (0xD85, 'V'), - (0xD97, 'X'), - (0xD9A, 'V'), - (0xDB2, 'X'), - (0xDB3, 'V'), - (0xDBC, 'X'), - (0xDBD, 'V'), - (0xDBE, 'X'), - (0xDC0, 'V'), - (0xDC7, 'X'), - (0xDCA, 'V'), - (0xDCB, 'X'), - (0xDCF, 'V'), - (0xDD5, 'X'), - (0xDD6, 'V'), - (0xDD7, 'X'), - (0xDD8, 'V'), - (0xDE0, 'X'), - (0xDE6, 'V'), - (0xDF0, 'X'), - (0xDF2, 'V'), - (0xDF5, 'X'), - (0xE01, 'V'), - (0xE33, 'M', 'ํา'), - (0xE34, 'V'), - (0xE3B, 'X'), - (0xE3F, 'V'), - (0xE5C, 'X'), - (0xE81, 'V'), - (0xE83, 'X'), - (0xE84, 'V'), - (0xE85, 'X'), - (0xE86, 'V'), - (0xE8B, 'X'), - (0xE8C, 'V'), - (0xEA4, 'X'), - (0xEA5, 'V'), - (0xEA6, 'X'), - (0xEA7, 'V'), - (0xEB3, 'M', 'ໍາ'), - (0xEB4, 'V'), + (0xC3A, "X"), + (0xC3C, "V"), + (0xC45, "X"), + (0xC46, "V"), + (0xC49, "X"), + (0xC4A, "V"), + (0xC4E, "X"), + (0xC55, "V"), + (0xC57, "X"), + (0xC58, "V"), + (0xC5B, "X"), + (0xC5D, "V"), + (0xC5E, "X"), + (0xC60, "V"), + (0xC64, "X"), + (0xC66, "V"), + (0xC70, "X"), + (0xC77, "V"), + (0xC8D, "X"), + (0xC8E, "V"), + (0xC91, "X"), + (0xC92, "V"), + (0xCA9, "X"), + (0xCAA, "V"), + (0xCB4, "X"), + (0xCB5, "V"), + (0xCBA, "X"), + (0xCBC, "V"), + (0xCC5, "X"), + (0xCC6, "V"), + (0xCC9, "X"), + (0xCCA, "V"), + (0xCCE, "X"), + (0xCD5, "V"), + (0xCD7, "X"), + (0xCDD, "V"), + (0xCDF, "X"), + (0xCE0, "V"), + (0xCE4, "X"), + (0xCE6, "V"), + (0xCF0, "X"), + (0xCF1, "V"), + (0xCF4, "X"), + (0xD00, "V"), + (0xD0D, "X"), + (0xD0E, "V"), + (0xD11, "X"), + (0xD12, "V"), + (0xD45, "X"), + (0xD46, "V"), + (0xD49, "X"), + (0xD4A, "V"), + (0xD50, "X"), + (0xD54, "V"), + (0xD64, "X"), + (0xD66, "V"), + (0xD80, "X"), + (0xD81, "V"), + (0xD84, "X"), + (0xD85, "V"), + (0xD97, "X"), + (0xD9A, "V"), + (0xDB2, "X"), + (0xDB3, "V"), + (0xDBC, "X"), + (0xDBD, "V"), + (0xDBE, "X"), + (0xDC0, "V"), + (0xDC7, "X"), + (0xDCA, "V"), + (0xDCB, "X"), + (0xDCF, "V"), + (0xDD5, "X"), + (0xDD6, "V"), + (0xDD7, "X"), + (0xDD8, "V"), + (0xDE0, "X"), + (0xDE6, "V"), + (0xDF0, "X"), + (0xDF2, "V"), + (0xDF5, "X"), + (0xE01, "V"), + (0xE33, "M", "ํา"), + (0xE34, "V"), + (0xE3B, "X"), + (0xE3F, "V"), + (0xE5C, "X"), + (0xE81, "V"), + (0xE83, "X"), + (0xE84, "V"), + (0xE85, "X"), + (0xE86, "V"), + (0xE8B, "X"), + (0xE8C, "V"), + (0xEA4, "X"), + (0xEA5, "V"), + (0xEA6, "X"), + (0xEA7, "V"), + (0xEB3, "M", "ໍາ"), + (0xEB4, "V"), ] + def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xEBE, 'X'), - (0xEC0, 'V'), - (0xEC5, 'X'), - (0xEC6, 'V'), - (0xEC7, 'X'), - (0xEC8, 'V'), - (0xECF, 'X'), - (0xED0, 'V'), - (0xEDA, 'X'), - (0xEDC, 'M', 'ຫນ'), - (0xEDD, 'M', 'ຫມ'), - (0xEDE, 'V'), - (0xEE0, 'X'), - (0xF00, 'V'), - (0xF0C, 'M', '་'), - (0xF0D, 'V'), - (0xF43, 'M', 'གྷ'), - (0xF44, 'V'), - (0xF48, 'X'), - (0xF49, 'V'), - (0xF4D, 'M', 'ཌྷ'), - (0xF4E, 'V'), - (0xF52, 'M', 'དྷ'), - (0xF53, 'V'), - (0xF57, 'M', 'བྷ'), - (0xF58, 'V'), - (0xF5C, 'M', 'ཛྷ'), - (0xF5D, 'V'), - (0xF69, 'M', 'ཀྵ'), - (0xF6A, 'V'), - (0xF6D, 'X'), - (0xF71, 'V'), - (0xF73, 'M', 'ཱི'), - (0xF74, 'V'), - (0xF75, 'M', 'ཱུ'), - (0xF76, 'M', 'ྲྀ'), - (0xF77, 'M', 'ྲཱྀ'), - (0xF78, 'M', 'ླྀ'), - (0xF79, 'M', 'ླཱྀ'), - (0xF7A, 'V'), - (0xF81, 'M', 'ཱྀ'), - (0xF82, 'V'), - (0xF93, 'M', 'ྒྷ'), - (0xF94, 'V'), - (0xF98, 'X'), - (0xF99, 'V'), - (0xF9D, 'M', 'ྜྷ'), - (0xF9E, 'V'), - (0xFA2, 'M', 'ྡྷ'), - (0xFA3, 'V'), - (0xFA7, 'M', 'ྦྷ'), - (0xFA8, 'V'), - (0xFAC, 'M', 'ྫྷ'), - (0xFAD, 'V'), - (0xFB9, 'M', 'ྐྵ'), - (0xFBA, 'V'), - (0xFBD, 'X'), - (0xFBE, 'V'), - (0xFCD, 'X'), - (0xFCE, 'V'), - (0xFDB, 'X'), - (0x1000, 'V'), - (0x10A0, 'X'), - (0x10C7, 'M', 'ⴧ'), - (0x10C8, 'X'), - (0x10CD, 'M', 'ⴭ'), - (0x10CE, 'X'), - (0x10D0, 'V'), - (0x10FC, 'M', 'ნ'), - (0x10FD, 'V'), - (0x115F, 'X'), - (0x1161, 'V'), - (0x1249, 'X'), - (0x124A, 'V'), - (0x124E, 'X'), - (0x1250, 'V'), - (0x1257, 'X'), - (0x1258, 'V'), - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - (0x128E, 'X'), - (0x1290, 'V'), - (0x12B1, 'X'), - (0x12B2, 'V'), - (0x12B6, 'X'), - (0x12B8, 'V'), - (0x12BF, 'X'), - (0x12C0, 'V'), - (0x12C1, 'X'), - (0x12C2, 'V'), - (0x12C6, 'X'), - (0x12C8, 'V'), - (0x12D7, 'X'), - (0x12D8, 'V'), - (0x1311, 'X'), - (0x1312, 'V'), + (0xEBE, "X"), + (0xEC0, "V"), + (0xEC5, "X"), + (0xEC6, "V"), + (0xEC7, "X"), + (0xEC8, "V"), + (0xECF, "X"), + (0xED0, "V"), + (0xEDA, "X"), + (0xEDC, "M", "ຫນ"), + (0xEDD, "M", "ຫມ"), + (0xEDE, "V"), + (0xEE0, "X"), + (0xF00, "V"), + (0xF0C, "M", "་"), + (0xF0D, "V"), + (0xF43, "M", "གྷ"), + (0xF44, "V"), + (0xF48, "X"), + (0xF49, "V"), + (0xF4D, "M", "ཌྷ"), + (0xF4E, "V"), + (0xF52, "M", "དྷ"), + (0xF53, "V"), + (0xF57, "M", "བྷ"), + (0xF58, "V"), + (0xF5C, "M", "ཛྷ"), + (0xF5D, "V"), + (0xF69, "M", "ཀྵ"), + (0xF6A, "V"), + (0xF6D, "X"), + (0xF71, "V"), + (0xF73, "M", "ཱི"), + (0xF74, "V"), + (0xF75, "M", "ཱུ"), + (0xF76, "M", "ྲྀ"), + (0xF77, "M", "ྲཱྀ"), + (0xF78, "M", "ླྀ"), + (0xF79, "M", "ླཱྀ"), + (0xF7A, "V"), + (0xF81, "M", "ཱྀ"), + (0xF82, "V"), + (0xF93, "M", "ྒྷ"), + (0xF94, "V"), + (0xF98, "X"), + (0xF99, "V"), + (0xF9D, "M", "ྜྷ"), + (0xF9E, "V"), + (0xFA2, "M", "ྡྷ"), + (0xFA3, "V"), + (0xFA7, "M", "ྦྷ"), + (0xFA8, "V"), + (0xFAC, "M", "ྫྷ"), + (0xFAD, "V"), + (0xFB9, "M", "ྐྵ"), + (0xFBA, "V"), + (0xFBD, "X"), + (0xFBE, "V"), + (0xFCD, "X"), + (0xFCE, "V"), + (0xFDB, "X"), + (0x1000, "V"), + (0x10A0, "X"), + (0x10C7, "M", "ⴧ"), + (0x10C8, "X"), + (0x10CD, "M", "ⴭ"), + (0x10CE, "X"), + (0x10D0, "V"), + (0x10FC, "M", "ნ"), + (0x10FD, "V"), + (0x115F, "X"), + (0x1161, "V"), + (0x1249, "X"), + (0x124A, "V"), + (0x124E, "X"), + (0x1250, "V"), + (0x1257, "X"), + (0x1258, "V"), + (0x1259, "X"), + (0x125A, "V"), + (0x125E, "X"), + (0x1260, "V"), + (0x1289, "X"), + (0x128A, "V"), + (0x128E, "X"), + (0x1290, "V"), + (0x12B1, "X"), + (0x12B2, "V"), + (0x12B6, "X"), + (0x12B8, "V"), + (0x12BF, "X"), + (0x12C0, "V"), + (0x12C1, "X"), + (0x12C2, "V"), + (0x12C6, "X"), + (0x12C8, "V"), + (0x12D7, "X"), + (0x12D8, "V"), + (0x1311, "X"), + (0x1312, "V"), ] + def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1316, 'X'), - (0x1318, 'V'), - (0x135B, 'X'), - (0x135D, 'V'), - (0x137D, 'X'), - (0x1380, 'V'), - (0x139A, 'X'), - (0x13A0, 'V'), - (0x13F6, 'X'), - (0x13F8, 'M', 'Ᏸ'), - (0x13F9, 'M', 'Ᏹ'), - (0x13FA, 'M', 'Ᏺ'), - (0x13FB, 'M', 'Ᏻ'), - (0x13FC, 'M', 'Ᏼ'), - (0x13FD, 'M', 'Ᏽ'), - (0x13FE, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F9, 'X'), - (0x1700, 'V'), - (0x1716, 'X'), - (0x171F, 'V'), - (0x1737, 'X'), - (0x1740, 'V'), - (0x1754, 'X'), - (0x1760, 'V'), - (0x176D, 'X'), - (0x176E, 'V'), - (0x1771, 'X'), - (0x1772, 'V'), - (0x1774, 'X'), - (0x1780, 'V'), - (0x17B4, 'X'), - (0x17B6, 'V'), - (0x17DE, 'X'), - (0x17E0, 'V'), - (0x17EA, 'X'), - (0x17F0, 'V'), - (0x17FA, 'X'), - (0x1800, 'V'), - (0x1806, 'X'), - (0x1807, 'V'), - (0x180B, 'I'), - (0x180E, 'X'), - (0x180F, 'I'), - (0x1810, 'V'), - (0x181A, 'X'), - (0x1820, 'V'), - (0x1879, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191F, 'X'), - (0x1920, 'V'), - (0x192C, 'X'), - (0x1930, 'V'), - (0x193C, 'X'), - (0x1940, 'V'), - (0x1941, 'X'), - (0x1944, 'V'), - (0x196E, 'X'), - (0x1970, 'V'), - (0x1975, 'X'), - (0x1980, 'V'), - (0x19AC, 'X'), - (0x19B0, 'V'), - (0x19CA, 'X'), - (0x19D0, 'V'), - (0x19DB, 'X'), - (0x19DE, 'V'), - (0x1A1C, 'X'), - (0x1A1E, 'V'), - (0x1A5F, 'X'), - (0x1A60, 'V'), - (0x1A7D, 'X'), - (0x1A7F, 'V'), - (0x1A8A, 'X'), - (0x1A90, 'V'), - (0x1A9A, 'X'), - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1AB0, 'V'), - (0x1ACF, 'X'), - (0x1B00, 'V'), - (0x1B4D, 'X'), - (0x1B50, 'V'), - (0x1B7F, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'M', 'в'), + (0x1316, "X"), + (0x1318, "V"), + (0x135B, "X"), + (0x135D, "V"), + (0x137D, "X"), + (0x1380, "V"), + (0x139A, "X"), + (0x13A0, "V"), + (0x13F6, "X"), + (0x13F8, "M", "Ᏸ"), + (0x13F9, "M", "Ᏹ"), + (0x13FA, "M", "Ᏺ"), + (0x13FB, "M", "Ᏻ"), + (0x13FC, "M", "Ᏼ"), + (0x13FD, "M", "Ᏽ"), + (0x13FE, "X"), + (0x1400, "V"), + (0x1680, "X"), + (0x1681, "V"), + (0x169D, "X"), + (0x16A0, "V"), + (0x16F9, "X"), + (0x1700, "V"), + (0x1716, "X"), + (0x171F, "V"), + (0x1737, "X"), + (0x1740, "V"), + (0x1754, "X"), + (0x1760, "V"), + (0x176D, "X"), + (0x176E, "V"), + (0x1771, "X"), + (0x1772, "V"), + (0x1774, "X"), + (0x1780, "V"), + (0x17B4, "X"), + (0x17B6, "V"), + (0x17DE, "X"), + (0x17E0, "V"), + (0x17EA, "X"), + (0x17F0, "V"), + (0x17FA, "X"), + (0x1800, "V"), + (0x1806, "X"), + (0x1807, "V"), + (0x180B, "I"), + (0x180E, "X"), + (0x180F, "I"), + (0x1810, "V"), + (0x181A, "X"), + (0x1820, "V"), + (0x1879, "X"), + (0x1880, "V"), + (0x18AB, "X"), + (0x18B0, "V"), + (0x18F6, "X"), + (0x1900, "V"), + (0x191F, "X"), + (0x1920, "V"), + (0x192C, "X"), + (0x1930, "V"), + (0x193C, "X"), + (0x1940, "V"), + (0x1941, "X"), + (0x1944, "V"), + (0x196E, "X"), + (0x1970, "V"), + (0x1975, "X"), + (0x1980, "V"), + (0x19AC, "X"), + (0x19B0, "V"), + (0x19CA, "X"), + (0x19D0, "V"), + (0x19DB, "X"), + (0x19DE, "V"), + (0x1A1C, "X"), + (0x1A1E, "V"), + (0x1A5F, "X"), + (0x1A60, "V"), + (0x1A7D, "X"), + (0x1A7F, "V"), + (0x1A8A, "X"), + (0x1A90, "V"), + (0x1A9A, "X"), + (0x1AA0, "V"), + (0x1AAE, "X"), + (0x1AB0, "V"), + (0x1ACF, "X"), + (0x1B00, "V"), + (0x1B4D, "X"), + (0x1B50, "V"), + (0x1B7F, "X"), + (0x1B80, "V"), + (0x1BF4, "X"), + (0x1BFC, "V"), + (0x1C38, "X"), + (0x1C3B, "V"), + (0x1C4A, "X"), + (0x1C4D, "V"), + (0x1C80, "M", "в"), ] + def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1C81, 'M', 'д'), - (0x1C82, 'M', 'о'), - (0x1C83, 'M', 'с'), - (0x1C84, 'M', 'т'), - (0x1C86, 'M', 'ъ'), - (0x1C87, 'M', 'ѣ'), - (0x1C88, 'M', 'ꙋ'), - (0x1C89, 'X'), - (0x1C90, 'M', 'ა'), - (0x1C91, 'M', 'ბ'), - (0x1C92, 'M', 'გ'), - (0x1C93, 'M', 'დ'), - (0x1C94, 'M', 'ე'), - (0x1C95, 'M', 'ვ'), - (0x1C96, 'M', 'ზ'), - (0x1C97, 'M', 'თ'), - (0x1C98, 'M', 'ი'), - (0x1C99, 'M', 'კ'), - (0x1C9A, 'M', 'ლ'), - (0x1C9B, 'M', 'მ'), - (0x1C9C, 'M', 'ნ'), - (0x1C9D, 'M', 'ო'), - (0x1C9E, 'M', 'პ'), - (0x1C9F, 'M', 'ჟ'), - (0x1CA0, 'M', 'რ'), - (0x1CA1, 'M', 'ს'), - (0x1CA2, 'M', 'ტ'), - (0x1CA3, 'M', 'უ'), - (0x1CA4, 'M', 'ფ'), - (0x1CA5, 'M', 'ქ'), - (0x1CA6, 'M', 'ღ'), - (0x1CA7, 'M', 'ყ'), - (0x1CA8, 'M', 'შ'), - (0x1CA9, 'M', 'ჩ'), - (0x1CAA, 'M', 'ც'), - (0x1CAB, 'M', 'ძ'), - (0x1CAC, 'M', 'წ'), - (0x1CAD, 'M', 'ჭ'), - (0x1CAE, 'M', 'ხ'), - (0x1CAF, 'M', 'ჯ'), - (0x1CB0, 'M', 'ჰ'), - (0x1CB1, 'M', 'ჱ'), - (0x1CB2, 'M', 'ჲ'), - (0x1CB3, 'M', 'ჳ'), - (0x1CB4, 'M', 'ჴ'), - (0x1CB5, 'M', 'ჵ'), - (0x1CB6, 'M', 'ჶ'), - (0x1CB7, 'M', 'ჷ'), - (0x1CB8, 'M', 'ჸ'), - (0x1CB9, 'M', 'ჹ'), - (0x1CBA, 'M', 'ჺ'), - (0x1CBB, 'X'), - (0x1CBD, 'M', 'ჽ'), - (0x1CBE, 'M', 'ჾ'), - (0x1CBF, 'M', 'ჿ'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CFB, 'X'), - (0x1D00, 'V'), - (0x1D2C, 'M', 'a'), - (0x1D2D, 'M', 'æ'), - (0x1D2E, 'M', 'b'), - (0x1D2F, 'V'), - (0x1D30, 'M', 'd'), - (0x1D31, 'M', 'e'), - (0x1D32, 'M', 'ǝ'), - (0x1D33, 'M', 'g'), - (0x1D34, 'M', 'h'), - (0x1D35, 'M', 'i'), - (0x1D36, 'M', 'j'), - (0x1D37, 'M', 'k'), - (0x1D38, 'M', 'l'), - (0x1D39, 'M', 'm'), - (0x1D3A, 'M', 'n'), - (0x1D3B, 'V'), - (0x1D3C, 'M', 'o'), - (0x1D3D, 'M', 'ȣ'), - (0x1D3E, 'M', 'p'), - (0x1D3F, 'M', 'r'), - (0x1D40, 'M', 't'), - (0x1D41, 'M', 'u'), - (0x1D42, 'M', 'w'), - (0x1D43, 'M', 'a'), - (0x1D44, 'M', 'ɐ'), - (0x1D45, 'M', 'ɑ'), - (0x1D46, 'M', 'ᴂ'), - (0x1D47, 'M', 'b'), - (0x1D48, 'M', 'd'), - (0x1D49, 'M', 'e'), - (0x1D4A, 'M', 'ə'), - (0x1D4B, 'M', 'ɛ'), - (0x1D4C, 'M', 'ɜ'), - (0x1D4D, 'M', 'g'), - (0x1D4E, 'V'), - (0x1D4F, 'M', 'k'), - (0x1D50, 'M', 'm'), - (0x1D51, 'M', 'ŋ'), - (0x1D52, 'M', 'o'), - (0x1D53, 'M', 'ɔ'), + (0x1C81, "M", "д"), + (0x1C82, "M", "о"), + (0x1C83, "M", "с"), + (0x1C84, "M", "т"), + (0x1C86, "M", "ъ"), + (0x1C87, "M", "ѣ"), + (0x1C88, "M", "ꙋ"), + (0x1C89, "X"), + (0x1C90, "M", "ა"), + (0x1C91, "M", "ბ"), + (0x1C92, "M", "გ"), + (0x1C93, "M", "დ"), + (0x1C94, "M", "ე"), + (0x1C95, "M", "ვ"), + (0x1C96, "M", "ზ"), + (0x1C97, "M", "თ"), + (0x1C98, "M", "ი"), + (0x1C99, "M", "კ"), + (0x1C9A, "M", "ლ"), + (0x1C9B, "M", "მ"), + (0x1C9C, "M", "ნ"), + (0x1C9D, "M", "ო"), + (0x1C9E, "M", "პ"), + (0x1C9F, "M", "ჟ"), + (0x1CA0, "M", "რ"), + (0x1CA1, "M", "ს"), + (0x1CA2, "M", "ტ"), + (0x1CA3, "M", "უ"), + (0x1CA4, "M", "ფ"), + (0x1CA5, "M", "ქ"), + (0x1CA6, "M", "ღ"), + (0x1CA7, "M", "ყ"), + (0x1CA8, "M", "შ"), + (0x1CA9, "M", "ჩ"), + (0x1CAA, "M", "ც"), + (0x1CAB, "M", "ძ"), + (0x1CAC, "M", "წ"), + (0x1CAD, "M", "ჭ"), + (0x1CAE, "M", "ხ"), + (0x1CAF, "M", "ჯ"), + (0x1CB0, "M", "ჰ"), + (0x1CB1, "M", "ჱ"), + (0x1CB2, "M", "ჲ"), + (0x1CB3, "M", "ჳ"), + (0x1CB4, "M", "ჴ"), + (0x1CB5, "M", "ჵ"), + (0x1CB6, "M", "ჶ"), + (0x1CB7, "M", "ჷ"), + (0x1CB8, "M", "ჸ"), + (0x1CB9, "M", "ჹ"), + (0x1CBA, "M", "ჺ"), + (0x1CBB, "X"), + (0x1CBD, "M", "ჽ"), + (0x1CBE, "M", "ჾ"), + (0x1CBF, "M", "ჿ"), + (0x1CC0, "V"), + (0x1CC8, "X"), + (0x1CD0, "V"), + (0x1CFB, "X"), + (0x1D00, "V"), + (0x1D2C, "M", "a"), + (0x1D2D, "M", "æ"), + (0x1D2E, "M", "b"), + (0x1D2F, "V"), + (0x1D30, "M", "d"), + (0x1D31, "M", "e"), + (0x1D32, "M", "ǝ"), + (0x1D33, "M", "g"), + (0x1D34, "M", "h"), + (0x1D35, "M", "i"), + (0x1D36, "M", "j"), + (0x1D37, "M", "k"), + (0x1D38, "M", "l"), + (0x1D39, "M", "m"), + (0x1D3A, "M", "n"), + (0x1D3B, "V"), + (0x1D3C, "M", "o"), + (0x1D3D, "M", "ȣ"), + (0x1D3E, "M", "p"), + (0x1D3F, "M", "r"), + (0x1D40, "M", "t"), + (0x1D41, "M", "u"), + (0x1D42, "M", "w"), + (0x1D43, "M", "a"), + (0x1D44, "M", "ɐ"), + (0x1D45, "M", "ɑ"), + (0x1D46, "M", "ᴂ"), + (0x1D47, "M", "b"), + (0x1D48, "M", "d"), + (0x1D49, "M", "e"), + (0x1D4A, "M", "ə"), + (0x1D4B, "M", "ɛ"), + (0x1D4C, "M", "ɜ"), + (0x1D4D, "M", "g"), + (0x1D4E, "V"), + (0x1D4F, "M", "k"), + (0x1D50, "M", "m"), + (0x1D51, "M", "ŋ"), + (0x1D52, "M", "o"), + (0x1D53, "M", "ɔ"), ] + def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D54, 'M', 'ᴖ'), - (0x1D55, 'M', 'ᴗ'), - (0x1D56, 'M', 'p'), - (0x1D57, 'M', 't'), - (0x1D58, 'M', 'u'), - (0x1D59, 'M', 'ᴝ'), - (0x1D5A, 'M', 'ɯ'), - (0x1D5B, 'M', 'v'), - (0x1D5C, 'M', 'ᴥ'), - (0x1D5D, 'M', 'β'), - (0x1D5E, 'M', 'γ'), - (0x1D5F, 'M', 'δ'), - (0x1D60, 'M', 'φ'), - (0x1D61, 'M', 'χ'), - (0x1D62, 'M', 'i'), - (0x1D63, 'M', 'r'), - (0x1D64, 'M', 'u'), - (0x1D65, 'M', 'v'), - (0x1D66, 'M', 'β'), - (0x1D67, 'M', 'γ'), - (0x1D68, 'M', 'ρ'), - (0x1D69, 'M', 'φ'), - (0x1D6A, 'M', 'χ'), - (0x1D6B, 'V'), - (0x1D78, 'M', 'н'), - (0x1D79, 'V'), - (0x1D9B, 'M', 'ɒ'), - (0x1D9C, 'M', 'c'), - (0x1D9D, 'M', 'ɕ'), - (0x1D9E, 'M', 'ð'), - (0x1D9F, 'M', 'ɜ'), - (0x1DA0, 'M', 'f'), - (0x1DA1, 'M', 'ɟ'), - (0x1DA2, 'M', 'ɡ'), - (0x1DA3, 'M', 'ɥ'), - (0x1DA4, 'M', 'ɨ'), - (0x1DA5, 'M', 'ɩ'), - (0x1DA6, 'M', 'ɪ'), - (0x1DA7, 'M', 'ᵻ'), - (0x1DA8, 'M', 'ʝ'), - (0x1DA9, 'M', 'ɭ'), - (0x1DAA, 'M', 'ᶅ'), - (0x1DAB, 'M', 'ʟ'), - (0x1DAC, 'M', 'ɱ'), - (0x1DAD, 'M', 'ɰ'), - (0x1DAE, 'M', 'ɲ'), - (0x1DAF, 'M', 'ɳ'), - (0x1DB0, 'M', 'ɴ'), - (0x1DB1, 'M', 'ɵ'), - (0x1DB2, 'M', 'ɸ'), - (0x1DB3, 'M', 'ʂ'), - (0x1DB4, 'M', 'ʃ'), - (0x1DB5, 'M', 'ƫ'), - (0x1DB6, 'M', 'ʉ'), - (0x1DB7, 'M', 'ʊ'), - (0x1DB8, 'M', 'ᴜ'), - (0x1DB9, 'M', 'ʋ'), - (0x1DBA, 'M', 'ʌ'), - (0x1DBB, 'M', 'z'), - (0x1DBC, 'M', 'ʐ'), - (0x1DBD, 'M', 'ʑ'), - (0x1DBE, 'M', 'ʒ'), - (0x1DBF, 'M', 'θ'), - (0x1DC0, 'V'), - (0x1E00, 'M', 'ḁ'), - (0x1E01, 'V'), - (0x1E02, 'M', 'ḃ'), - (0x1E03, 'V'), - (0x1E04, 'M', 'ḅ'), - (0x1E05, 'V'), - (0x1E06, 'M', 'ḇ'), - (0x1E07, 'V'), - (0x1E08, 'M', 'ḉ'), - (0x1E09, 'V'), - (0x1E0A, 'M', 'ḋ'), - (0x1E0B, 'V'), - (0x1E0C, 'M', 'ḍ'), - (0x1E0D, 'V'), - (0x1E0E, 'M', 'ḏ'), - (0x1E0F, 'V'), - (0x1E10, 'M', 'ḑ'), - (0x1E11, 'V'), - (0x1E12, 'M', 'ḓ'), - (0x1E13, 'V'), - (0x1E14, 'M', 'ḕ'), - (0x1E15, 'V'), - (0x1E16, 'M', 'ḗ'), - (0x1E17, 'V'), - (0x1E18, 'M', 'ḙ'), - (0x1E19, 'V'), - (0x1E1A, 'M', 'ḛ'), - (0x1E1B, 'V'), - (0x1E1C, 'M', 'ḝ'), - (0x1E1D, 'V'), - (0x1E1E, 'M', 'ḟ'), - (0x1E1F, 'V'), - (0x1E20, 'M', 'ḡ'), - (0x1E21, 'V'), - (0x1E22, 'M', 'ḣ'), - (0x1E23, 'V'), + (0x1D54, "M", "ᴖ"), + (0x1D55, "M", "ᴗ"), + (0x1D56, "M", "p"), + (0x1D57, "M", "t"), + (0x1D58, "M", "u"), + (0x1D59, "M", "ᴝ"), + (0x1D5A, "M", "ɯ"), + (0x1D5B, "M", "v"), + (0x1D5C, "M", "ᴥ"), + (0x1D5D, "M", "β"), + (0x1D5E, "M", "γ"), + (0x1D5F, "M", "δ"), + (0x1D60, "M", "φ"), + (0x1D61, "M", "χ"), + (0x1D62, "M", "i"), + (0x1D63, "M", "r"), + (0x1D64, "M", "u"), + (0x1D65, "M", "v"), + (0x1D66, "M", "β"), + (0x1D67, "M", "γ"), + (0x1D68, "M", "ρ"), + (0x1D69, "M", "φ"), + (0x1D6A, "M", "χ"), + (0x1D6B, "V"), + (0x1D78, "M", "н"), + (0x1D79, "V"), + (0x1D9B, "M", "ɒ"), + (0x1D9C, "M", "c"), + (0x1D9D, "M", "ɕ"), + (0x1D9E, "M", "ð"), + (0x1D9F, "M", "ɜ"), + (0x1DA0, "M", "f"), + (0x1DA1, "M", "ɟ"), + (0x1DA2, "M", "ɡ"), + (0x1DA3, "M", "ɥ"), + (0x1DA4, "M", "ɨ"), + (0x1DA5, "M", "ɩ"), + (0x1DA6, "M", "ɪ"), + (0x1DA7, "M", "ᵻ"), + (0x1DA8, "M", "ʝ"), + (0x1DA9, "M", "ɭ"), + (0x1DAA, "M", "ᶅ"), + (0x1DAB, "M", "ʟ"), + (0x1DAC, "M", "ɱ"), + (0x1DAD, "M", "ɰ"), + (0x1DAE, "M", "ɲ"), + (0x1DAF, "M", "ɳ"), + (0x1DB0, "M", "ɴ"), + (0x1DB1, "M", "ɵ"), + (0x1DB2, "M", "ɸ"), + (0x1DB3, "M", "ʂ"), + (0x1DB4, "M", "ʃ"), + (0x1DB5, "M", "ƫ"), + (0x1DB6, "M", "ʉ"), + (0x1DB7, "M", "ʊ"), + (0x1DB8, "M", "ᴜ"), + (0x1DB9, "M", "ʋ"), + (0x1DBA, "M", "ʌ"), + (0x1DBB, "M", "z"), + (0x1DBC, "M", "ʐ"), + (0x1DBD, "M", "ʑ"), + (0x1DBE, "M", "ʒ"), + (0x1DBF, "M", "θ"), + (0x1DC0, "V"), + (0x1E00, "M", "ḁ"), + (0x1E01, "V"), + (0x1E02, "M", "ḃ"), + (0x1E03, "V"), + (0x1E04, "M", "ḅ"), + (0x1E05, "V"), + (0x1E06, "M", "ḇ"), + (0x1E07, "V"), + (0x1E08, "M", "ḉ"), + (0x1E09, "V"), + (0x1E0A, "M", "ḋ"), + (0x1E0B, "V"), + (0x1E0C, "M", "ḍ"), + (0x1E0D, "V"), + (0x1E0E, "M", "ḏ"), + (0x1E0F, "V"), + (0x1E10, "M", "ḑ"), + (0x1E11, "V"), + (0x1E12, "M", "ḓ"), + (0x1E13, "V"), + (0x1E14, "M", "ḕ"), + (0x1E15, "V"), + (0x1E16, "M", "ḗ"), + (0x1E17, "V"), + (0x1E18, "M", "ḙ"), + (0x1E19, "V"), + (0x1E1A, "M", "ḛ"), + (0x1E1B, "V"), + (0x1E1C, "M", "ḝ"), + (0x1E1D, "V"), + (0x1E1E, "M", "ḟ"), + (0x1E1F, "V"), + (0x1E20, "M", "ḡ"), + (0x1E21, "V"), + (0x1E22, "M", "ḣ"), + (0x1E23, "V"), ] + def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1E24, 'M', 'ḥ'), - (0x1E25, 'V'), - (0x1E26, 'M', 'ḧ'), - (0x1E27, 'V'), - (0x1E28, 'M', 'ḩ'), - (0x1E29, 'V'), - (0x1E2A, 'M', 'ḫ'), - (0x1E2B, 'V'), - (0x1E2C, 'M', 'ḭ'), - (0x1E2D, 'V'), - (0x1E2E, 'M', 'ḯ'), - (0x1E2F, 'V'), - (0x1E30, 'M', 'ḱ'), - (0x1E31, 'V'), - (0x1E32, 'M', 'ḳ'), - (0x1E33, 'V'), - (0x1E34, 'M', 'ḵ'), - (0x1E35, 'V'), - (0x1E36, 'M', 'ḷ'), - (0x1E37, 'V'), - (0x1E38, 'M', 'ḹ'), - (0x1E39, 'V'), - (0x1E3A, 'M', 'ḻ'), - (0x1E3B, 'V'), - (0x1E3C, 'M', 'ḽ'), - (0x1E3D, 'V'), - (0x1E3E, 'M', 'ḿ'), - (0x1E3F, 'V'), - (0x1E40, 'M', 'ṁ'), - (0x1E41, 'V'), - (0x1E42, 'M', 'ṃ'), - (0x1E43, 'V'), - (0x1E44, 'M', 'ṅ'), - (0x1E45, 'V'), - (0x1E46, 'M', 'ṇ'), - (0x1E47, 'V'), - (0x1E48, 'M', 'ṉ'), - (0x1E49, 'V'), - (0x1E4A, 'M', 'ṋ'), - (0x1E4B, 'V'), - (0x1E4C, 'M', 'ṍ'), - (0x1E4D, 'V'), - (0x1E4E, 'M', 'ṏ'), - (0x1E4F, 'V'), - (0x1E50, 'M', 'ṑ'), - (0x1E51, 'V'), - (0x1E52, 'M', 'ṓ'), - (0x1E53, 'V'), - (0x1E54, 'M', 'ṕ'), - (0x1E55, 'V'), - (0x1E56, 'M', 'ṗ'), - (0x1E57, 'V'), - (0x1E58, 'M', 'ṙ'), - (0x1E59, 'V'), - (0x1E5A, 'M', 'ṛ'), - (0x1E5B, 'V'), - (0x1E5C, 'M', 'ṝ'), - (0x1E5D, 'V'), - (0x1E5E, 'M', 'ṟ'), - (0x1E5F, 'V'), - (0x1E60, 'M', 'ṡ'), - (0x1E61, 'V'), - (0x1E62, 'M', 'ṣ'), - (0x1E63, 'V'), - (0x1E64, 'M', 'ṥ'), - (0x1E65, 'V'), - (0x1E66, 'M', 'ṧ'), - (0x1E67, 'V'), - (0x1E68, 'M', 'ṩ'), - (0x1E69, 'V'), - (0x1E6A, 'M', 'ṫ'), - (0x1E6B, 'V'), - (0x1E6C, 'M', 'ṭ'), - (0x1E6D, 'V'), - (0x1E6E, 'M', 'ṯ'), - (0x1E6F, 'V'), - (0x1E70, 'M', 'ṱ'), - (0x1E71, 'V'), - (0x1E72, 'M', 'ṳ'), - (0x1E73, 'V'), - (0x1E74, 'M', 'ṵ'), - (0x1E75, 'V'), - (0x1E76, 'M', 'ṷ'), - (0x1E77, 'V'), - (0x1E78, 'M', 'ṹ'), - (0x1E79, 'V'), - (0x1E7A, 'M', 'ṻ'), - (0x1E7B, 'V'), - (0x1E7C, 'M', 'ṽ'), - (0x1E7D, 'V'), - (0x1E7E, 'M', 'ṿ'), - (0x1E7F, 'V'), - (0x1E80, 'M', 'ẁ'), - (0x1E81, 'V'), - (0x1E82, 'M', 'ẃ'), - (0x1E83, 'V'), - (0x1E84, 'M', 'ẅ'), - (0x1E85, 'V'), - (0x1E86, 'M', 'ẇ'), - (0x1E87, 'V'), + (0x1E24, "M", "ḥ"), + (0x1E25, "V"), + (0x1E26, "M", "ḧ"), + (0x1E27, "V"), + (0x1E28, "M", "ḩ"), + (0x1E29, "V"), + (0x1E2A, "M", "ḫ"), + (0x1E2B, "V"), + (0x1E2C, "M", "ḭ"), + (0x1E2D, "V"), + (0x1E2E, "M", "ḯ"), + (0x1E2F, "V"), + (0x1E30, "M", "ḱ"), + (0x1E31, "V"), + (0x1E32, "M", "ḳ"), + (0x1E33, "V"), + (0x1E34, "M", "ḵ"), + (0x1E35, "V"), + (0x1E36, "M", "ḷ"), + (0x1E37, "V"), + (0x1E38, "M", "ḹ"), + (0x1E39, "V"), + (0x1E3A, "M", "ḻ"), + (0x1E3B, "V"), + (0x1E3C, "M", "ḽ"), + (0x1E3D, "V"), + (0x1E3E, "M", "ḿ"), + (0x1E3F, "V"), + (0x1E40, "M", "ṁ"), + (0x1E41, "V"), + (0x1E42, "M", "ṃ"), + (0x1E43, "V"), + (0x1E44, "M", "ṅ"), + (0x1E45, "V"), + (0x1E46, "M", "ṇ"), + (0x1E47, "V"), + (0x1E48, "M", "ṉ"), + (0x1E49, "V"), + (0x1E4A, "M", "ṋ"), + (0x1E4B, "V"), + (0x1E4C, "M", "ṍ"), + (0x1E4D, "V"), + (0x1E4E, "M", "ṏ"), + (0x1E4F, "V"), + (0x1E50, "M", "ṑ"), + (0x1E51, "V"), + (0x1E52, "M", "ṓ"), + (0x1E53, "V"), + (0x1E54, "M", "ṕ"), + (0x1E55, "V"), + (0x1E56, "M", "ṗ"), + (0x1E57, "V"), + (0x1E58, "M", "ṙ"), + (0x1E59, "V"), + (0x1E5A, "M", "ṛ"), + (0x1E5B, "V"), + (0x1E5C, "M", "ṝ"), + (0x1E5D, "V"), + (0x1E5E, "M", "ṟ"), + (0x1E5F, "V"), + (0x1E60, "M", "ṡ"), + (0x1E61, "V"), + (0x1E62, "M", "ṣ"), + (0x1E63, "V"), + (0x1E64, "M", "ṥ"), + (0x1E65, "V"), + (0x1E66, "M", "ṧ"), + (0x1E67, "V"), + (0x1E68, "M", "ṩ"), + (0x1E69, "V"), + (0x1E6A, "M", "ṫ"), + (0x1E6B, "V"), + (0x1E6C, "M", "ṭ"), + (0x1E6D, "V"), + (0x1E6E, "M", "ṯ"), + (0x1E6F, "V"), + (0x1E70, "M", "ṱ"), + (0x1E71, "V"), + (0x1E72, "M", "ṳ"), + (0x1E73, "V"), + (0x1E74, "M", "ṵ"), + (0x1E75, "V"), + (0x1E76, "M", "ṷ"), + (0x1E77, "V"), + (0x1E78, "M", "ṹ"), + (0x1E79, "V"), + (0x1E7A, "M", "ṻ"), + (0x1E7B, "V"), + (0x1E7C, "M", "ṽ"), + (0x1E7D, "V"), + (0x1E7E, "M", "ṿ"), + (0x1E7F, "V"), + (0x1E80, "M", "ẁ"), + (0x1E81, "V"), + (0x1E82, "M", "ẃ"), + (0x1E83, "V"), + (0x1E84, "M", "ẅ"), + (0x1E85, "V"), + (0x1E86, "M", "ẇ"), + (0x1E87, "V"), ] + def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1E88, 'M', 'ẉ'), - (0x1E89, 'V'), - (0x1E8A, 'M', 'ẋ'), - (0x1E8B, 'V'), - (0x1E8C, 'M', 'ẍ'), - (0x1E8D, 'V'), - (0x1E8E, 'M', 'ẏ'), - (0x1E8F, 'V'), - (0x1E90, 'M', 'ẑ'), - (0x1E91, 'V'), - (0x1E92, 'M', 'ẓ'), - (0x1E93, 'V'), - (0x1E94, 'M', 'ẕ'), - (0x1E95, 'V'), - (0x1E9A, 'M', 'aʾ'), - (0x1E9B, 'M', 'ṡ'), - (0x1E9C, 'V'), - (0x1E9E, 'M', 'ß'), - (0x1E9F, 'V'), - (0x1EA0, 'M', 'ạ'), - (0x1EA1, 'V'), - (0x1EA2, 'M', 'ả'), - (0x1EA3, 'V'), - (0x1EA4, 'M', 'ấ'), - (0x1EA5, 'V'), - (0x1EA6, 'M', 'ầ'), - (0x1EA7, 'V'), - (0x1EA8, 'M', 'ẩ'), - (0x1EA9, 'V'), - (0x1EAA, 'M', 'ẫ'), - (0x1EAB, 'V'), - (0x1EAC, 'M', 'ậ'), - (0x1EAD, 'V'), - (0x1EAE, 'M', 'ắ'), - (0x1EAF, 'V'), - (0x1EB0, 'M', 'ằ'), - (0x1EB1, 'V'), - (0x1EB2, 'M', 'ẳ'), - (0x1EB3, 'V'), - (0x1EB4, 'M', 'ẵ'), - (0x1EB5, 'V'), - (0x1EB6, 'M', 'ặ'), - (0x1EB7, 'V'), - (0x1EB8, 'M', 'ẹ'), - (0x1EB9, 'V'), - (0x1EBA, 'M', 'ẻ'), - (0x1EBB, 'V'), - (0x1EBC, 'M', 'ẽ'), - (0x1EBD, 'V'), - (0x1EBE, 'M', 'ế'), - (0x1EBF, 'V'), - (0x1EC0, 'M', 'ề'), - (0x1EC1, 'V'), - (0x1EC2, 'M', 'ể'), - (0x1EC3, 'V'), - (0x1EC4, 'M', 'ễ'), - (0x1EC5, 'V'), - (0x1EC6, 'M', 'ệ'), - (0x1EC7, 'V'), - (0x1EC8, 'M', 'ỉ'), - (0x1EC9, 'V'), - (0x1ECA, 'M', 'ị'), - (0x1ECB, 'V'), - (0x1ECC, 'M', 'ọ'), - (0x1ECD, 'V'), - (0x1ECE, 'M', 'ỏ'), - (0x1ECF, 'V'), - (0x1ED0, 'M', 'ố'), - (0x1ED1, 'V'), - (0x1ED2, 'M', 'ồ'), - (0x1ED3, 'V'), - (0x1ED4, 'M', 'ổ'), - (0x1ED5, 'V'), - (0x1ED6, 'M', 'ỗ'), - (0x1ED7, 'V'), - (0x1ED8, 'M', 'ộ'), - (0x1ED9, 'V'), - (0x1EDA, 'M', 'ớ'), - (0x1EDB, 'V'), - (0x1EDC, 'M', 'ờ'), - (0x1EDD, 'V'), - (0x1EDE, 'M', 'ở'), - (0x1EDF, 'V'), - (0x1EE0, 'M', 'ỡ'), - (0x1EE1, 'V'), - (0x1EE2, 'M', 'ợ'), - (0x1EE3, 'V'), - (0x1EE4, 'M', 'ụ'), - (0x1EE5, 'V'), - (0x1EE6, 'M', 'ủ'), - (0x1EE7, 'V'), - (0x1EE8, 'M', 'ứ'), - (0x1EE9, 'V'), - (0x1EEA, 'M', 'ừ'), - (0x1EEB, 'V'), - (0x1EEC, 'M', 'ử'), - (0x1EED, 'V'), - (0x1EEE, 'M', 'ữ'), - (0x1EEF, 'V'), - (0x1EF0, 'M', 'ự'), + (0x1E88, "M", "ẉ"), + (0x1E89, "V"), + (0x1E8A, "M", "ẋ"), + (0x1E8B, "V"), + (0x1E8C, "M", "ẍ"), + (0x1E8D, "V"), + (0x1E8E, "M", "ẏ"), + (0x1E8F, "V"), + (0x1E90, "M", "ẑ"), + (0x1E91, "V"), + (0x1E92, "M", "ẓ"), + (0x1E93, "V"), + (0x1E94, "M", "ẕ"), + (0x1E95, "V"), + (0x1E9A, "M", "aʾ"), + (0x1E9B, "M", "ṡ"), + (0x1E9C, "V"), + (0x1E9E, "M", "ß"), + (0x1E9F, "V"), + (0x1EA0, "M", "ạ"), + (0x1EA1, "V"), + (0x1EA2, "M", "ả"), + (0x1EA3, "V"), + (0x1EA4, "M", "ấ"), + (0x1EA5, "V"), + (0x1EA6, "M", "ầ"), + (0x1EA7, "V"), + (0x1EA8, "M", "ẩ"), + (0x1EA9, "V"), + (0x1EAA, "M", "ẫ"), + (0x1EAB, "V"), + (0x1EAC, "M", "ậ"), + (0x1EAD, "V"), + (0x1EAE, "M", "ắ"), + (0x1EAF, "V"), + (0x1EB0, "M", "ằ"), + (0x1EB1, "V"), + (0x1EB2, "M", "ẳ"), + (0x1EB3, "V"), + (0x1EB4, "M", "ẵ"), + (0x1EB5, "V"), + (0x1EB6, "M", "ặ"), + (0x1EB7, "V"), + (0x1EB8, "M", "ẹ"), + (0x1EB9, "V"), + (0x1EBA, "M", "ẻ"), + (0x1EBB, "V"), + (0x1EBC, "M", "ẽ"), + (0x1EBD, "V"), + (0x1EBE, "M", "ế"), + (0x1EBF, "V"), + (0x1EC0, "M", "ề"), + (0x1EC1, "V"), + (0x1EC2, "M", "ể"), + (0x1EC3, "V"), + (0x1EC4, "M", "ễ"), + (0x1EC5, "V"), + (0x1EC6, "M", "ệ"), + (0x1EC7, "V"), + (0x1EC8, "M", "ỉ"), + (0x1EC9, "V"), + (0x1ECA, "M", "ị"), + (0x1ECB, "V"), + (0x1ECC, "M", "ọ"), + (0x1ECD, "V"), + (0x1ECE, "M", "ỏ"), + (0x1ECF, "V"), + (0x1ED0, "M", "ố"), + (0x1ED1, "V"), + (0x1ED2, "M", "ồ"), + (0x1ED3, "V"), + (0x1ED4, "M", "ổ"), + (0x1ED5, "V"), + (0x1ED6, "M", "ỗ"), + (0x1ED7, "V"), + (0x1ED8, "M", "ộ"), + (0x1ED9, "V"), + (0x1EDA, "M", "ớ"), + (0x1EDB, "V"), + (0x1EDC, "M", "ờ"), + (0x1EDD, "V"), + (0x1EDE, "M", "ở"), + (0x1EDF, "V"), + (0x1EE0, "M", "ỡ"), + (0x1EE1, "V"), + (0x1EE2, "M", "ợ"), + (0x1EE3, "V"), + (0x1EE4, "M", "ụ"), + (0x1EE5, "V"), + (0x1EE6, "M", "ủ"), + (0x1EE7, "V"), + (0x1EE8, "M", "ứ"), + (0x1EE9, "V"), + (0x1EEA, "M", "ừ"), + (0x1EEB, "V"), + (0x1EEC, "M", "ử"), + (0x1EED, "V"), + (0x1EEE, "M", "ữ"), + (0x1EEF, "V"), + (0x1EF0, "M", "ự"), ] + def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1EF1, 'V'), - (0x1EF2, 'M', 'ỳ'), - (0x1EF3, 'V'), - (0x1EF4, 'M', 'ỵ'), - (0x1EF5, 'V'), - (0x1EF6, 'M', 'ỷ'), - (0x1EF7, 'V'), - (0x1EF8, 'M', 'ỹ'), - (0x1EF9, 'V'), - (0x1EFA, 'M', 'ỻ'), - (0x1EFB, 'V'), - (0x1EFC, 'M', 'ỽ'), - (0x1EFD, 'V'), - (0x1EFE, 'M', 'ỿ'), - (0x1EFF, 'V'), - (0x1F08, 'M', 'ἀ'), - (0x1F09, 'M', 'ἁ'), - (0x1F0A, 'M', 'ἂ'), - (0x1F0B, 'M', 'ἃ'), - (0x1F0C, 'M', 'ἄ'), - (0x1F0D, 'M', 'ἅ'), - (0x1F0E, 'M', 'ἆ'), - (0x1F0F, 'M', 'ἇ'), - (0x1F10, 'V'), - (0x1F16, 'X'), - (0x1F18, 'M', 'ἐ'), - (0x1F19, 'M', 'ἑ'), - (0x1F1A, 'M', 'ἒ'), - (0x1F1B, 'M', 'ἓ'), - (0x1F1C, 'M', 'ἔ'), - (0x1F1D, 'M', 'ἕ'), - (0x1F1E, 'X'), - (0x1F20, 'V'), - (0x1F28, 'M', 'ἠ'), - (0x1F29, 'M', 'ἡ'), - (0x1F2A, 'M', 'ἢ'), - (0x1F2B, 'M', 'ἣ'), - (0x1F2C, 'M', 'ἤ'), - (0x1F2D, 'M', 'ἥ'), - (0x1F2E, 'M', 'ἦ'), - (0x1F2F, 'M', 'ἧ'), - (0x1F30, 'V'), - (0x1F38, 'M', 'ἰ'), - (0x1F39, 'M', 'ἱ'), - (0x1F3A, 'M', 'ἲ'), - (0x1F3B, 'M', 'ἳ'), - (0x1F3C, 'M', 'ἴ'), - (0x1F3D, 'M', 'ἵ'), - (0x1F3E, 'M', 'ἶ'), - (0x1F3F, 'M', 'ἷ'), - (0x1F40, 'V'), - (0x1F46, 'X'), - (0x1F48, 'M', 'ὀ'), - (0x1F49, 'M', 'ὁ'), - (0x1F4A, 'M', 'ὂ'), - (0x1F4B, 'M', 'ὃ'), - (0x1F4C, 'M', 'ὄ'), - (0x1F4D, 'M', 'ὅ'), - (0x1F4E, 'X'), - (0x1F50, 'V'), - (0x1F58, 'X'), - (0x1F59, 'M', 'ὑ'), - (0x1F5A, 'X'), - (0x1F5B, 'M', 'ὓ'), - (0x1F5C, 'X'), - (0x1F5D, 'M', 'ὕ'), - (0x1F5E, 'X'), - (0x1F5F, 'M', 'ὗ'), - (0x1F60, 'V'), - (0x1F68, 'M', 'ὠ'), - (0x1F69, 'M', 'ὡ'), - (0x1F6A, 'M', 'ὢ'), - (0x1F6B, 'M', 'ὣ'), - (0x1F6C, 'M', 'ὤ'), - (0x1F6D, 'M', 'ὥ'), - (0x1F6E, 'M', 'ὦ'), - (0x1F6F, 'M', 'ὧ'), - (0x1F70, 'V'), - (0x1F71, 'M', 'ά'), - (0x1F72, 'V'), - (0x1F73, 'M', 'έ'), - (0x1F74, 'V'), - (0x1F75, 'M', 'ή'), - (0x1F76, 'V'), - (0x1F77, 'M', 'ί'), - (0x1F78, 'V'), - (0x1F79, 'M', 'ό'), - (0x1F7A, 'V'), - (0x1F7B, 'M', 'ύ'), - (0x1F7C, 'V'), - (0x1F7D, 'M', 'ώ'), - (0x1F7E, 'X'), - (0x1F80, 'M', 'ἀι'), - (0x1F81, 'M', 'ἁι'), - (0x1F82, 'M', 'ἂι'), - (0x1F83, 'M', 'ἃι'), - (0x1F84, 'M', 'ἄι'), - (0x1F85, 'M', 'ἅι'), - (0x1F86, 'M', 'ἆι'), - (0x1F87, 'M', 'ἇι'), + (0x1EF1, "V"), + (0x1EF2, "M", "ỳ"), + (0x1EF3, "V"), + (0x1EF4, "M", "ỵ"), + (0x1EF5, "V"), + (0x1EF6, "M", "ỷ"), + (0x1EF7, "V"), + (0x1EF8, "M", "ỹ"), + (0x1EF9, "V"), + (0x1EFA, "M", "ỻ"), + (0x1EFB, "V"), + (0x1EFC, "M", "ỽ"), + (0x1EFD, "V"), + (0x1EFE, "M", "ỿ"), + (0x1EFF, "V"), + (0x1F08, "M", "ἀ"), + (0x1F09, "M", "ἁ"), + (0x1F0A, "M", "ἂ"), + (0x1F0B, "M", "ἃ"), + (0x1F0C, "M", "ἄ"), + (0x1F0D, "M", "ἅ"), + (0x1F0E, "M", "ἆ"), + (0x1F0F, "M", "ἇ"), + (0x1F10, "V"), + (0x1F16, "X"), + (0x1F18, "M", "ἐ"), + (0x1F19, "M", "ἑ"), + (0x1F1A, "M", "ἒ"), + (0x1F1B, "M", "ἓ"), + (0x1F1C, "M", "ἔ"), + (0x1F1D, "M", "ἕ"), + (0x1F1E, "X"), + (0x1F20, "V"), + (0x1F28, "M", "ἠ"), + (0x1F29, "M", "ἡ"), + (0x1F2A, "M", "ἢ"), + (0x1F2B, "M", "ἣ"), + (0x1F2C, "M", "ἤ"), + (0x1F2D, "M", "ἥ"), + (0x1F2E, "M", "ἦ"), + (0x1F2F, "M", "ἧ"), + (0x1F30, "V"), + (0x1F38, "M", "ἰ"), + (0x1F39, "M", "ἱ"), + (0x1F3A, "M", "ἲ"), + (0x1F3B, "M", "ἳ"), + (0x1F3C, "M", "ἴ"), + (0x1F3D, "M", "ἵ"), + (0x1F3E, "M", "ἶ"), + (0x1F3F, "M", "ἷ"), + (0x1F40, "V"), + (0x1F46, "X"), + (0x1F48, "M", "ὀ"), + (0x1F49, "M", "ὁ"), + (0x1F4A, "M", "ὂ"), + (0x1F4B, "M", "ὃ"), + (0x1F4C, "M", "ὄ"), + (0x1F4D, "M", "ὅ"), + (0x1F4E, "X"), + (0x1F50, "V"), + (0x1F58, "X"), + (0x1F59, "M", "ὑ"), + (0x1F5A, "X"), + (0x1F5B, "M", "ὓ"), + (0x1F5C, "X"), + (0x1F5D, "M", "ὕ"), + (0x1F5E, "X"), + (0x1F5F, "M", "ὗ"), + (0x1F60, "V"), + (0x1F68, "M", "ὠ"), + (0x1F69, "M", "ὡ"), + (0x1F6A, "M", "ὢ"), + (0x1F6B, "M", "ὣ"), + (0x1F6C, "M", "ὤ"), + (0x1F6D, "M", "ὥ"), + (0x1F6E, "M", "ὦ"), + (0x1F6F, "M", "ὧ"), + (0x1F70, "V"), + (0x1F71, "M", "ά"), + (0x1F72, "V"), + (0x1F73, "M", "έ"), + (0x1F74, "V"), + (0x1F75, "M", "ή"), + (0x1F76, "V"), + (0x1F77, "M", "ί"), + (0x1F78, "V"), + (0x1F79, "M", "ό"), + (0x1F7A, "V"), + (0x1F7B, "M", "ύ"), + (0x1F7C, "V"), + (0x1F7D, "M", "ώ"), + (0x1F7E, "X"), + (0x1F80, "M", "ἀι"), + (0x1F81, "M", "ἁι"), + (0x1F82, "M", "ἂι"), + (0x1F83, "M", "ἃι"), + (0x1F84, "M", "ἄι"), + (0x1F85, "M", "ἅι"), + (0x1F86, "M", "ἆι"), + (0x1F87, "M", "ἇι"), ] + def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1F88, 'M', 'ἀι'), - (0x1F89, 'M', 'ἁι'), - (0x1F8A, 'M', 'ἂι'), - (0x1F8B, 'M', 'ἃι'), - (0x1F8C, 'M', 'ἄι'), - (0x1F8D, 'M', 'ἅι'), - (0x1F8E, 'M', 'ἆι'), - (0x1F8F, 'M', 'ἇι'), - (0x1F90, 'M', 'ἠι'), - (0x1F91, 'M', 'ἡι'), - (0x1F92, 'M', 'ἢι'), - (0x1F93, 'M', 'ἣι'), - (0x1F94, 'M', 'ἤι'), - (0x1F95, 'M', 'ἥι'), - (0x1F96, 'M', 'ἦι'), - (0x1F97, 'M', 'ἧι'), - (0x1F98, 'M', 'ἠι'), - (0x1F99, 'M', 'ἡι'), - (0x1F9A, 'M', 'ἢι'), - (0x1F9B, 'M', 'ἣι'), - (0x1F9C, 'M', 'ἤι'), - (0x1F9D, 'M', 'ἥι'), - (0x1F9E, 'M', 'ἦι'), - (0x1F9F, 'M', 'ἧι'), - (0x1FA0, 'M', 'ὠι'), - (0x1FA1, 'M', 'ὡι'), - (0x1FA2, 'M', 'ὢι'), - (0x1FA3, 'M', 'ὣι'), - (0x1FA4, 'M', 'ὤι'), - (0x1FA5, 'M', 'ὥι'), - (0x1FA6, 'M', 'ὦι'), - (0x1FA7, 'M', 'ὧι'), - (0x1FA8, 'M', 'ὠι'), - (0x1FA9, 'M', 'ὡι'), - (0x1FAA, 'M', 'ὢι'), - (0x1FAB, 'M', 'ὣι'), - (0x1FAC, 'M', 'ὤι'), - (0x1FAD, 'M', 'ὥι'), - (0x1FAE, 'M', 'ὦι'), - (0x1FAF, 'M', 'ὧι'), - (0x1FB0, 'V'), - (0x1FB2, 'M', 'ὰι'), - (0x1FB3, 'M', 'αι'), - (0x1FB4, 'M', 'άι'), - (0x1FB5, 'X'), - (0x1FB6, 'V'), - (0x1FB7, 'M', 'ᾶι'), - (0x1FB8, 'M', 'ᾰ'), - (0x1FB9, 'M', 'ᾱ'), - (0x1FBA, 'M', 'ὰ'), - (0x1FBB, 'M', 'ά'), - (0x1FBC, 'M', 'αι'), - (0x1FBD, '3', ' ̓'), - (0x1FBE, 'M', 'ι'), - (0x1FBF, '3', ' ̓'), - (0x1FC0, '3', ' ͂'), - (0x1FC1, '3', ' ̈͂'), - (0x1FC2, 'M', 'ὴι'), - (0x1FC3, 'M', 'ηι'), - (0x1FC4, 'M', 'ήι'), - (0x1FC5, 'X'), - (0x1FC6, 'V'), - (0x1FC7, 'M', 'ῆι'), - (0x1FC8, 'M', 'ὲ'), - (0x1FC9, 'M', 'έ'), - (0x1FCA, 'M', 'ὴ'), - (0x1FCB, 'M', 'ή'), - (0x1FCC, 'M', 'ηι'), - (0x1FCD, '3', ' ̓̀'), - (0x1FCE, '3', ' ̓́'), - (0x1FCF, '3', ' ̓͂'), - (0x1FD0, 'V'), - (0x1FD3, 'M', 'ΐ'), - (0x1FD4, 'X'), - (0x1FD6, 'V'), - (0x1FD8, 'M', 'ῐ'), - (0x1FD9, 'M', 'ῑ'), - (0x1FDA, 'M', 'ὶ'), - (0x1FDB, 'M', 'ί'), - (0x1FDC, 'X'), - (0x1FDD, '3', ' ̔̀'), - (0x1FDE, '3', ' ̔́'), - (0x1FDF, '3', ' ̔͂'), - (0x1FE0, 'V'), - (0x1FE3, 'M', 'ΰ'), - (0x1FE4, 'V'), - (0x1FE8, 'M', 'ῠ'), - (0x1FE9, 'M', 'ῡ'), - (0x1FEA, 'M', 'ὺ'), - (0x1FEB, 'M', 'ύ'), - (0x1FEC, 'M', 'ῥ'), - (0x1FED, '3', ' ̈̀'), - (0x1FEE, '3', ' ̈́'), - (0x1FEF, '3', '`'), - (0x1FF0, 'X'), - (0x1FF2, 'M', 'ὼι'), - (0x1FF3, 'M', 'ωι'), - (0x1FF4, 'M', 'ώι'), - (0x1FF5, 'X'), - (0x1FF6, 'V'), + (0x1F88, "M", "ἀι"), + (0x1F89, "M", "ἁι"), + (0x1F8A, "M", "ἂι"), + (0x1F8B, "M", "ἃι"), + (0x1F8C, "M", "ἄι"), + (0x1F8D, "M", "ἅι"), + (0x1F8E, "M", "ἆι"), + (0x1F8F, "M", "ἇι"), + (0x1F90, "M", "ἠι"), + (0x1F91, "M", "ἡι"), + (0x1F92, "M", "ἢι"), + (0x1F93, "M", "ἣι"), + (0x1F94, "M", "ἤι"), + (0x1F95, "M", "ἥι"), + (0x1F96, "M", "ἦι"), + (0x1F97, "M", "ἧι"), + (0x1F98, "M", "ἠι"), + (0x1F99, "M", "ἡι"), + (0x1F9A, "M", "ἢι"), + (0x1F9B, "M", "ἣι"), + (0x1F9C, "M", "ἤι"), + (0x1F9D, "M", "ἥι"), + (0x1F9E, "M", "ἦι"), + (0x1F9F, "M", "ἧι"), + (0x1FA0, "M", "ὠι"), + (0x1FA1, "M", "ὡι"), + (0x1FA2, "M", "ὢι"), + (0x1FA3, "M", "ὣι"), + (0x1FA4, "M", "ὤι"), + (0x1FA5, "M", "ὥι"), + (0x1FA6, "M", "ὦι"), + (0x1FA7, "M", "ὧι"), + (0x1FA8, "M", "ὠι"), + (0x1FA9, "M", "ὡι"), + (0x1FAA, "M", "ὢι"), + (0x1FAB, "M", "ὣι"), + (0x1FAC, "M", "ὤι"), + (0x1FAD, "M", "ὥι"), + (0x1FAE, "M", "ὦι"), + (0x1FAF, "M", "ὧι"), + (0x1FB0, "V"), + (0x1FB2, "M", "ὰι"), + (0x1FB3, "M", "αι"), + (0x1FB4, "M", "άι"), + (0x1FB5, "X"), + (0x1FB6, "V"), + (0x1FB7, "M", "ᾶι"), + (0x1FB8, "M", "ᾰ"), + (0x1FB9, "M", "ᾱ"), + (0x1FBA, "M", "ὰ"), + (0x1FBB, "M", "ά"), + (0x1FBC, "M", "αι"), + (0x1FBD, "3", " ̓"), + (0x1FBE, "M", "ι"), + (0x1FBF, "3", " ̓"), + (0x1FC0, "3", " ͂"), + (0x1FC1, "3", " ̈͂"), + (0x1FC2, "M", "ὴι"), + (0x1FC3, "M", "ηι"), + (0x1FC4, "M", "ήι"), + (0x1FC5, "X"), + (0x1FC6, "V"), + (0x1FC7, "M", "ῆι"), + (0x1FC8, "M", "ὲ"), + (0x1FC9, "M", "έ"), + (0x1FCA, "M", "ὴ"), + (0x1FCB, "M", "ή"), + (0x1FCC, "M", "ηι"), + (0x1FCD, "3", " ̓̀"), + (0x1FCE, "3", " ̓́"), + (0x1FCF, "3", " ̓͂"), + (0x1FD0, "V"), + (0x1FD3, "M", "ΐ"), + (0x1FD4, "X"), + (0x1FD6, "V"), + (0x1FD8, "M", "ῐ"), + (0x1FD9, "M", "ῑ"), + (0x1FDA, "M", "ὶ"), + (0x1FDB, "M", "ί"), + (0x1FDC, "X"), + (0x1FDD, "3", " ̔̀"), + (0x1FDE, "3", " ̔́"), + (0x1FDF, "3", " ̔͂"), + (0x1FE0, "V"), + (0x1FE3, "M", "ΰ"), + (0x1FE4, "V"), + (0x1FE8, "M", "ῠ"), + (0x1FE9, "M", "ῡ"), + (0x1FEA, "M", "ὺ"), + (0x1FEB, "M", "ύ"), + (0x1FEC, "M", "ῥ"), + (0x1FED, "3", " ̈̀"), + (0x1FEE, "3", " ̈́"), + (0x1FEF, "3", "`"), + (0x1FF0, "X"), + (0x1FF2, "M", "ὼι"), + (0x1FF3, "M", "ωι"), + (0x1FF4, "M", "ώι"), + (0x1FF5, "X"), + (0x1FF6, "V"), ] + def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1FF7, 'M', 'ῶι'), - (0x1FF8, 'M', 'ὸ'), - (0x1FF9, 'M', 'ό'), - (0x1FFA, 'M', 'ὼ'), - (0x1FFB, 'M', 'ώ'), - (0x1FFC, 'M', 'ωι'), - (0x1FFD, '3', ' ́'), - (0x1FFE, '3', ' ̔'), - (0x1FFF, 'X'), - (0x2000, '3', ' '), - (0x200B, 'I'), - (0x200C, 'D', ''), - (0x200E, 'X'), - (0x2010, 'V'), - (0x2011, 'M', '‐'), - (0x2012, 'V'), - (0x2017, '3', ' ̳'), - (0x2018, 'V'), - (0x2024, 'X'), - (0x2027, 'V'), - (0x2028, 'X'), - (0x202F, '3', ' '), - (0x2030, 'V'), - (0x2033, 'M', '′′'), - (0x2034, 'M', '′′′'), - (0x2035, 'V'), - (0x2036, 'M', '‵‵'), - (0x2037, 'M', '‵‵‵'), - (0x2038, 'V'), - (0x203C, '3', '!!'), - (0x203D, 'V'), - (0x203E, '3', ' ̅'), - (0x203F, 'V'), - (0x2047, '3', '??'), - (0x2048, '3', '?!'), - (0x2049, '3', '!?'), - (0x204A, 'V'), - (0x2057, 'M', '′′′′'), - (0x2058, 'V'), - (0x205F, '3', ' '), - (0x2060, 'I'), - (0x2061, 'X'), - (0x2064, 'I'), - (0x2065, 'X'), - (0x2070, 'M', '0'), - (0x2071, 'M', 'i'), - (0x2072, 'X'), - (0x2074, 'M', '4'), - (0x2075, 'M', '5'), - (0x2076, 'M', '6'), - (0x2077, 'M', '7'), - (0x2078, 'M', '8'), - (0x2079, 'M', '9'), - (0x207A, '3', '+'), - (0x207B, 'M', '−'), - (0x207C, '3', '='), - (0x207D, '3', '('), - (0x207E, '3', ')'), - (0x207F, 'M', 'n'), - (0x2080, 'M', '0'), - (0x2081, 'M', '1'), - (0x2082, 'M', '2'), - (0x2083, 'M', '3'), - (0x2084, 'M', '4'), - (0x2085, 'M', '5'), - (0x2086, 'M', '6'), - (0x2087, 'M', '7'), - (0x2088, 'M', '8'), - (0x2089, 'M', '9'), - (0x208A, '3', '+'), - (0x208B, 'M', '−'), - (0x208C, '3', '='), - (0x208D, '3', '('), - (0x208E, '3', ')'), - (0x208F, 'X'), - (0x2090, 'M', 'a'), - (0x2091, 'M', 'e'), - (0x2092, 'M', 'o'), - (0x2093, 'M', 'x'), - (0x2094, 'M', 'ə'), - (0x2095, 'M', 'h'), - (0x2096, 'M', 'k'), - (0x2097, 'M', 'l'), - (0x2098, 'M', 'm'), - (0x2099, 'M', 'n'), - (0x209A, 'M', 'p'), - (0x209B, 'M', 's'), - (0x209C, 'M', 't'), - (0x209D, 'X'), - (0x20A0, 'V'), - (0x20A8, 'M', 'rs'), - (0x20A9, 'V'), - (0x20C1, 'X'), - (0x20D0, 'V'), - (0x20F1, 'X'), - (0x2100, '3', 'a/c'), - (0x2101, '3', 'a/s'), - (0x2102, 'M', 'c'), - (0x2103, 'M', '°c'), - (0x2104, 'V'), + (0x1FF7, "M", "ῶι"), + (0x1FF8, "M", "ὸ"), + (0x1FF9, "M", "ό"), + (0x1FFA, "M", "ὼ"), + (0x1FFB, "M", "ώ"), + (0x1FFC, "M", "ωι"), + (0x1FFD, "3", " ́"), + (0x1FFE, "3", " ̔"), + (0x1FFF, "X"), + (0x2000, "3", " "), + (0x200B, "I"), + (0x200C, "D", ""), + (0x200E, "X"), + (0x2010, "V"), + (0x2011, "M", "‐"), + (0x2012, "V"), + (0x2017, "3", " ̳"), + (0x2018, "V"), + (0x2024, "X"), + (0x2027, "V"), + (0x2028, "X"), + (0x202F, "3", " "), + (0x2030, "V"), + (0x2033, "M", "′′"), + (0x2034, "M", "′′′"), + (0x2035, "V"), + (0x2036, "M", "‵‵"), + (0x2037, "M", "‵‵‵"), + (0x2038, "V"), + (0x203C, "3", "!!"), + (0x203D, "V"), + (0x203E, "3", " ̅"), + (0x203F, "V"), + (0x2047, "3", "??"), + (0x2048, "3", "?!"), + (0x2049, "3", "!?"), + (0x204A, "V"), + (0x2057, "M", "′′′′"), + (0x2058, "V"), + (0x205F, "3", " "), + (0x2060, "I"), + (0x2061, "X"), + (0x2064, "I"), + (0x2065, "X"), + (0x2070, "M", "0"), + (0x2071, "M", "i"), + (0x2072, "X"), + (0x2074, "M", "4"), + (0x2075, "M", "5"), + (0x2076, "M", "6"), + (0x2077, "M", "7"), + (0x2078, "M", "8"), + (0x2079, "M", "9"), + (0x207A, "3", "+"), + (0x207B, "M", "−"), + (0x207C, "3", "="), + (0x207D, "3", "("), + (0x207E, "3", ")"), + (0x207F, "M", "n"), + (0x2080, "M", "0"), + (0x2081, "M", "1"), + (0x2082, "M", "2"), + (0x2083, "M", "3"), + (0x2084, "M", "4"), + (0x2085, "M", "5"), + (0x2086, "M", "6"), + (0x2087, "M", "7"), + (0x2088, "M", "8"), + (0x2089, "M", "9"), + (0x208A, "3", "+"), + (0x208B, "M", "−"), + (0x208C, "3", "="), + (0x208D, "3", "("), + (0x208E, "3", ")"), + (0x208F, "X"), + (0x2090, "M", "a"), + (0x2091, "M", "e"), + (0x2092, "M", "o"), + (0x2093, "M", "x"), + (0x2094, "M", "ə"), + (0x2095, "M", "h"), + (0x2096, "M", "k"), + (0x2097, "M", "l"), + (0x2098, "M", "m"), + (0x2099, "M", "n"), + (0x209A, "M", "p"), + (0x209B, "M", "s"), + (0x209C, "M", "t"), + (0x209D, "X"), + (0x20A0, "V"), + (0x20A8, "M", "rs"), + (0x20A9, "V"), + (0x20C1, "X"), + (0x20D0, "V"), + (0x20F1, "X"), + (0x2100, "3", "a/c"), + (0x2101, "3", "a/s"), + (0x2102, "M", "c"), + (0x2103, "M", "°c"), + (0x2104, "V"), ] + def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2105, '3', 'c/o'), - (0x2106, '3', 'c/u'), - (0x2107, 'M', 'ɛ'), - (0x2108, 'V'), - (0x2109, 'M', '°f'), - (0x210A, 'M', 'g'), - (0x210B, 'M', 'h'), - (0x210F, 'M', 'ħ'), - (0x2110, 'M', 'i'), - (0x2112, 'M', 'l'), - (0x2114, 'V'), - (0x2115, 'M', 'n'), - (0x2116, 'M', 'no'), - (0x2117, 'V'), - (0x2119, 'M', 'p'), - (0x211A, 'M', 'q'), - (0x211B, 'M', 'r'), - (0x211E, 'V'), - (0x2120, 'M', 'sm'), - (0x2121, 'M', 'tel'), - (0x2122, 'M', 'tm'), - (0x2123, 'V'), - (0x2124, 'M', 'z'), - (0x2125, 'V'), - (0x2126, 'M', 'ω'), - (0x2127, 'V'), - (0x2128, 'M', 'z'), - (0x2129, 'V'), - (0x212A, 'M', 'k'), - (0x212B, 'M', 'å'), - (0x212C, 'M', 'b'), - (0x212D, 'M', 'c'), - (0x212E, 'V'), - (0x212F, 'M', 'e'), - (0x2131, 'M', 'f'), - (0x2132, 'X'), - (0x2133, 'M', 'm'), - (0x2134, 'M', 'o'), - (0x2135, 'M', 'א'), - (0x2136, 'M', 'ב'), - (0x2137, 'M', 'ג'), - (0x2138, 'M', 'ד'), - (0x2139, 'M', 'i'), - (0x213A, 'V'), - (0x213B, 'M', 'fax'), - (0x213C, 'M', 'π'), - (0x213D, 'M', 'γ'), - (0x213F, 'M', 'π'), - (0x2140, 'M', '∑'), - (0x2141, 'V'), - (0x2145, 'M', 'd'), - (0x2147, 'M', 'e'), - (0x2148, 'M', 'i'), - (0x2149, 'M', 'j'), - (0x214A, 'V'), - (0x2150, 'M', '1⁄7'), - (0x2151, 'M', '1⁄9'), - (0x2152, 'M', '1⁄10'), - (0x2153, 'M', '1⁄3'), - (0x2154, 'M', '2⁄3'), - (0x2155, 'M', '1⁄5'), - (0x2156, 'M', '2⁄5'), - (0x2157, 'M', '3⁄5'), - (0x2158, 'M', '4⁄5'), - (0x2159, 'M', '1⁄6'), - (0x215A, 'M', '5⁄6'), - (0x215B, 'M', '1⁄8'), - (0x215C, 'M', '3⁄8'), - (0x215D, 'M', '5⁄8'), - (0x215E, 'M', '7⁄8'), - (0x215F, 'M', '1⁄'), - (0x2160, 'M', 'i'), - (0x2161, 'M', 'ii'), - (0x2162, 'M', 'iii'), - (0x2163, 'M', 'iv'), - (0x2164, 'M', 'v'), - (0x2165, 'M', 'vi'), - (0x2166, 'M', 'vii'), - (0x2167, 'M', 'viii'), - (0x2168, 'M', 'ix'), - (0x2169, 'M', 'x'), - (0x216A, 'M', 'xi'), - (0x216B, 'M', 'xii'), - (0x216C, 'M', 'l'), - (0x216D, 'M', 'c'), - (0x216E, 'M', 'd'), - (0x216F, 'M', 'm'), - (0x2170, 'M', 'i'), - (0x2171, 'M', 'ii'), - (0x2172, 'M', 'iii'), - (0x2173, 'M', 'iv'), - (0x2174, 'M', 'v'), - (0x2175, 'M', 'vi'), - (0x2176, 'M', 'vii'), - (0x2177, 'M', 'viii'), - (0x2178, 'M', 'ix'), - (0x2179, 'M', 'x'), - (0x217A, 'M', 'xi'), - (0x217B, 'M', 'xii'), - (0x217C, 'M', 'l'), + (0x2105, "3", "c/o"), + (0x2106, "3", "c/u"), + (0x2107, "M", "ɛ"), + (0x2108, "V"), + (0x2109, "M", "°f"), + (0x210A, "M", "g"), + (0x210B, "M", "h"), + (0x210F, "M", "ħ"), + (0x2110, "M", "i"), + (0x2112, "M", "l"), + (0x2114, "V"), + (0x2115, "M", "n"), + (0x2116, "M", "no"), + (0x2117, "V"), + (0x2119, "M", "p"), + (0x211A, "M", "q"), + (0x211B, "M", "r"), + (0x211E, "V"), + (0x2120, "M", "sm"), + (0x2121, "M", "tel"), + (0x2122, "M", "tm"), + (0x2123, "V"), + (0x2124, "M", "z"), + (0x2125, "V"), + (0x2126, "M", "ω"), + (0x2127, "V"), + (0x2128, "M", "z"), + (0x2129, "V"), + (0x212A, "M", "k"), + (0x212B, "M", "å"), + (0x212C, "M", "b"), + (0x212D, "M", "c"), + (0x212E, "V"), + (0x212F, "M", "e"), + (0x2131, "M", "f"), + (0x2132, "X"), + (0x2133, "M", "m"), + (0x2134, "M", "o"), + (0x2135, "M", "א"), + (0x2136, "M", "ב"), + (0x2137, "M", "ג"), + (0x2138, "M", "ד"), + (0x2139, "M", "i"), + (0x213A, "V"), + (0x213B, "M", "fax"), + (0x213C, "M", "π"), + (0x213D, "M", "γ"), + (0x213F, "M", "π"), + (0x2140, "M", "∑"), + (0x2141, "V"), + (0x2145, "M", "d"), + (0x2147, "M", "e"), + (0x2148, "M", "i"), + (0x2149, "M", "j"), + (0x214A, "V"), + (0x2150, "M", "1⁄7"), + (0x2151, "M", "1⁄9"), + (0x2152, "M", "1⁄10"), + (0x2153, "M", "1⁄3"), + (0x2154, "M", "2⁄3"), + (0x2155, "M", "1⁄5"), + (0x2156, "M", "2⁄5"), + (0x2157, "M", "3⁄5"), + (0x2158, "M", "4⁄5"), + (0x2159, "M", "1⁄6"), + (0x215A, "M", "5⁄6"), + (0x215B, "M", "1⁄8"), + (0x215C, "M", "3⁄8"), + (0x215D, "M", "5⁄8"), + (0x215E, "M", "7⁄8"), + (0x215F, "M", "1⁄"), + (0x2160, "M", "i"), + (0x2161, "M", "ii"), + (0x2162, "M", "iii"), + (0x2163, "M", "iv"), + (0x2164, "M", "v"), + (0x2165, "M", "vi"), + (0x2166, "M", "vii"), + (0x2167, "M", "viii"), + (0x2168, "M", "ix"), + (0x2169, "M", "x"), + (0x216A, "M", "xi"), + (0x216B, "M", "xii"), + (0x216C, "M", "l"), + (0x216D, "M", "c"), + (0x216E, "M", "d"), + (0x216F, "M", "m"), + (0x2170, "M", "i"), + (0x2171, "M", "ii"), + (0x2172, "M", "iii"), + (0x2173, "M", "iv"), + (0x2174, "M", "v"), + (0x2175, "M", "vi"), + (0x2176, "M", "vii"), + (0x2177, "M", "viii"), + (0x2178, "M", "ix"), + (0x2179, "M", "x"), + (0x217A, "M", "xi"), + (0x217B, "M", "xii"), + (0x217C, "M", "l"), ] + def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x217D, 'M', 'c'), - (0x217E, 'M', 'd'), - (0x217F, 'M', 'm'), - (0x2180, 'V'), - (0x2183, 'X'), - (0x2184, 'V'), - (0x2189, 'M', '0⁄3'), - (0x218A, 'V'), - (0x218C, 'X'), - (0x2190, 'V'), - (0x222C, 'M', '∫∫'), - (0x222D, 'M', '∫∫∫'), - (0x222E, 'V'), - (0x222F, 'M', '∮∮'), - (0x2230, 'M', '∮∮∮'), - (0x2231, 'V'), - (0x2329, 'M', '〈'), - (0x232A, 'M', '〉'), - (0x232B, 'V'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', '1'), - (0x2461, 'M', '2'), - (0x2462, 'M', '3'), - (0x2463, 'M', '4'), - (0x2464, 'M', '5'), - (0x2465, 'M', '6'), - (0x2466, 'M', '7'), - (0x2467, 'M', '8'), - (0x2468, 'M', '9'), - (0x2469, 'M', '10'), - (0x246A, 'M', '11'), - (0x246B, 'M', '12'), - (0x246C, 'M', '13'), - (0x246D, 'M', '14'), - (0x246E, 'M', '15'), - (0x246F, 'M', '16'), - (0x2470, 'M', '17'), - (0x2471, 'M', '18'), - (0x2472, 'M', '19'), - (0x2473, 'M', '20'), - (0x2474, '3', '(1)'), - (0x2475, '3', '(2)'), - (0x2476, '3', '(3)'), - (0x2477, '3', '(4)'), - (0x2478, '3', '(5)'), - (0x2479, '3', '(6)'), - (0x247A, '3', '(7)'), - (0x247B, '3', '(8)'), - (0x247C, '3', '(9)'), - (0x247D, '3', '(10)'), - (0x247E, '3', '(11)'), - (0x247F, '3', '(12)'), - (0x2480, '3', '(13)'), - (0x2481, '3', '(14)'), - (0x2482, '3', '(15)'), - (0x2483, '3', '(16)'), - (0x2484, '3', '(17)'), - (0x2485, '3', '(18)'), - (0x2486, '3', '(19)'), - (0x2487, '3', '(20)'), - (0x2488, 'X'), - (0x249C, '3', '(a)'), - (0x249D, '3', '(b)'), - (0x249E, '3', '(c)'), - (0x249F, '3', '(d)'), - (0x24A0, '3', '(e)'), - (0x24A1, '3', '(f)'), - (0x24A2, '3', '(g)'), - (0x24A3, '3', '(h)'), - (0x24A4, '3', '(i)'), - (0x24A5, '3', '(j)'), - (0x24A6, '3', '(k)'), - (0x24A7, '3', '(l)'), - (0x24A8, '3', '(m)'), - (0x24A9, '3', '(n)'), - (0x24AA, '3', '(o)'), - (0x24AB, '3', '(p)'), - (0x24AC, '3', '(q)'), - (0x24AD, '3', '(r)'), - (0x24AE, '3', '(s)'), - (0x24AF, '3', '(t)'), - (0x24B0, '3', '(u)'), - (0x24B1, '3', '(v)'), - (0x24B2, '3', '(w)'), - (0x24B3, '3', '(x)'), - (0x24B4, '3', '(y)'), - (0x24B5, '3', '(z)'), - (0x24B6, 'M', 'a'), - (0x24B7, 'M', 'b'), - (0x24B8, 'M', 'c'), - (0x24B9, 'M', 'd'), - (0x24BA, 'M', 'e'), - (0x24BB, 'M', 'f'), - (0x24BC, 'M', 'g'), - (0x24BD, 'M', 'h'), - (0x24BE, 'M', 'i'), - (0x24BF, 'M', 'j'), - (0x24C0, 'M', 'k'), + (0x217D, "M", "c"), + (0x217E, "M", "d"), + (0x217F, "M", "m"), + (0x2180, "V"), + (0x2183, "X"), + (0x2184, "V"), + (0x2189, "M", "0⁄3"), + (0x218A, "V"), + (0x218C, "X"), + (0x2190, "V"), + (0x222C, "M", "∫∫"), + (0x222D, "M", "∫∫∫"), + (0x222E, "V"), + (0x222F, "M", "∮∮"), + (0x2230, "M", "∮∮∮"), + (0x2231, "V"), + (0x2329, "M", "〈"), + (0x232A, "M", "〉"), + (0x232B, "V"), + (0x2427, "X"), + (0x2440, "V"), + (0x244B, "X"), + (0x2460, "M", "1"), + (0x2461, "M", "2"), + (0x2462, "M", "3"), + (0x2463, "M", "4"), + (0x2464, "M", "5"), + (0x2465, "M", "6"), + (0x2466, "M", "7"), + (0x2467, "M", "8"), + (0x2468, "M", "9"), + (0x2469, "M", "10"), + (0x246A, "M", "11"), + (0x246B, "M", "12"), + (0x246C, "M", "13"), + (0x246D, "M", "14"), + (0x246E, "M", "15"), + (0x246F, "M", "16"), + (0x2470, "M", "17"), + (0x2471, "M", "18"), + (0x2472, "M", "19"), + (0x2473, "M", "20"), + (0x2474, "3", "(1)"), + (0x2475, "3", "(2)"), + (0x2476, "3", "(3)"), + (0x2477, "3", "(4)"), + (0x2478, "3", "(5)"), + (0x2479, "3", "(6)"), + (0x247A, "3", "(7)"), + (0x247B, "3", "(8)"), + (0x247C, "3", "(9)"), + (0x247D, "3", "(10)"), + (0x247E, "3", "(11)"), + (0x247F, "3", "(12)"), + (0x2480, "3", "(13)"), + (0x2481, "3", "(14)"), + (0x2482, "3", "(15)"), + (0x2483, "3", "(16)"), + (0x2484, "3", "(17)"), + (0x2485, "3", "(18)"), + (0x2486, "3", "(19)"), + (0x2487, "3", "(20)"), + (0x2488, "X"), + (0x249C, "3", "(a)"), + (0x249D, "3", "(b)"), + (0x249E, "3", "(c)"), + (0x249F, "3", "(d)"), + (0x24A0, "3", "(e)"), + (0x24A1, "3", "(f)"), + (0x24A2, "3", "(g)"), + (0x24A3, "3", "(h)"), + (0x24A4, "3", "(i)"), + (0x24A5, "3", "(j)"), + (0x24A6, "3", "(k)"), + (0x24A7, "3", "(l)"), + (0x24A8, "3", "(m)"), + (0x24A9, "3", "(n)"), + (0x24AA, "3", "(o)"), + (0x24AB, "3", "(p)"), + (0x24AC, "3", "(q)"), + (0x24AD, "3", "(r)"), + (0x24AE, "3", "(s)"), + (0x24AF, "3", "(t)"), + (0x24B0, "3", "(u)"), + (0x24B1, "3", "(v)"), + (0x24B2, "3", "(w)"), + (0x24B3, "3", "(x)"), + (0x24B4, "3", "(y)"), + (0x24B5, "3", "(z)"), + (0x24B6, "M", "a"), + (0x24B7, "M", "b"), + (0x24B8, "M", "c"), + (0x24B9, "M", "d"), + (0x24BA, "M", "e"), + (0x24BB, "M", "f"), + (0x24BC, "M", "g"), + (0x24BD, "M", "h"), + (0x24BE, "M", "i"), + (0x24BF, "M", "j"), + (0x24C0, "M", "k"), ] + def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x24C1, 'M', 'l'), - (0x24C2, 'M', 'm'), - (0x24C3, 'M', 'n'), - (0x24C4, 'M', 'o'), - (0x24C5, 'M', 'p'), - (0x24C6, 'M', 'q'), - (0x24C7, 'M', 'r'), - (0x24C8, 'M', 's'), - (0x24C9, 'M', 't'), - (0x24CA, 'M', 'u'), - (0x24CB, 'M', 'v'), - (0x24CC, 'M', 'w'), - (0x24CD, 'M', 'x'), - (0x24CE, 'M', 'y'), - (0x24CF, 'M', 'z'), - (0x24D0, 'M', 'a'), - (0x24D1, 'M', 'b'), - (0x24D2, 'M', 'c'), - (0x24D3, 'M', 'd'), - (0x24D4, 'M', 'e'), - (0x24D5, 'M', 'f'), - (0x24D6, 'M', 'g'), - (0x24D7, 'M', 'h'), - (0x24D8, 'M', 'i'), - (0x24D9, 'M', 'j'), - (0x24DA, 'M', 'k'), - (0x24DB, 'M', 'l'), - (0x24DC, 'M', 'm'), - (0x24DD, 'M', 'n'), - (0x24DE, 'M', 'o'), - (0x24DF, 'M', 'p'), - (0x24E0, 'M', 'q'), - (0x24E1, 'M', 'r'), - (0x24E2, 'M', 's'), - (0x24E3, 'M', 't'), - (0x24E4, 'M', 'u'), - (0x24E5, 'M', 'v'), - (0x24E6, 'M', 'w'), - (0x24E7, 'M', 'x'), - (0x24E8, 'M', 'y'), - (0x24E9, 'M', 'z'), - (0x24EA, 'M', '0'), - (0x24EB, 'V'), - (0x2A0C, 'M', '∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', '::='), - (0x2A75, '3', '=='), - (0x2A76, '3', '==='), - (0x2A77, 'V'), - (0x2ADC, 'M', '⫝̸'), - (0x2ADD, 'V'), - (0x2B74, 'X'), - (0x2B76, 'V'), - (0x2B96, 'X'), - (0x2B97, 'V'), - (0x2C00, 'M', 'ⰰ'), - (0x2C01, 'M', 'ⰱ'), - (0x2C02, 'M', 'ⰲ'), - (0x2C03, 'M', 'ⰳ'), - (0x2C04, 'M', 'ⰴ'), - (0x2C05, 'M', 'ⰵ'), - (0x2C06, 'M', 'ⰶ'), - (0x2C07, 'M', 'ⰷ'), - (0x2C08, 'M', 'ⰸ'), - (0x2C09, 'M', 'ⰹ'), - (0x2C0A, 'M', 'ⰺ'), - (0x2C0B, 'M', 'ⰻ'), - (0x2C0C, 'M', 'ⰼ'), - (0x2C0D, 'M', 'ⰽ'), - (0x2C0E, 'M', 'ⰾ'), - (0x2C0F, 'M', 'ⰿ'), - (0x2C10, 'M', 'ⱀ'), - (0x2C11, 'M', 'ⱁ'), - (0x2C12, 'M', 'ⱂ'), - (0x2C13, 'M', 'ⱃ'), - (0x2C14, 'M', 'ⱄ'), - (0x2C15, 'M', 'ⱅ'), - (0x2C16, 'M', 'ⱆ'), - (0x2C17, 'M', 'ⱇ'), - (0x2C18, 'M', 'ⱈ'), - (0x2C19, 'M', 'ⱉ'), - (0x2C1A, 'M', 'ⱊ'), - (0x2C1B, 'M', 'ⱋ'), - (0x2C1C, 'M', 'ⱌ'), - (0x2C1D, 'M', 'ⱍ'), - (0x2C1E, 'M', 'ⱎ'), - (0x2C1F, 'M', 'ⱏ'), - (0x2C20, 'M', 'ⱐ'), - (0x2C21, 'M', 'ⱑ'), - (0x2C22, 'M', 'ⱒ'), - (0x2C23, 'M', 'ⱓ'), - (0x2C24, 'M', 'ⱔ'), - (0x2C25, 'M', 'ⱕ'), - (0x2C26, 'M', 'ⱖ'), - (0x2C27, 'M', 'ⱗ'), - (0x2C28, 'M', 'ⱘ'), - (0x2C29, 'M', 'ⱙ'), - (0x2C2A, 'M', 'ⱚ'), - (0x2C2B, 'M', 'ⱛ'), - (0x2C2C, 'M', 'ⱜ'), + (0x24C1, "M", "l"), + (0x24C2, "M", "m"), + (0x24C3, "M", "n"), + (0x24C4, "M", "o"), + (0x24C5, "M", "p"), + (0x24C6, "M", "q"), + (0x24C7, "M", "r"), + (0x24C8, "M", "s"), + (0x24C9, "M", "t"), + (0x24CA, "M", "u"), + (0x24CB, "M", "v"), + (0x24CC, "M", "w"), + (0x24CD, "M", "x"), + (0x24CE, "M", "y"), + (0x24CF, "M", "z"), + (0x24D0, "M", "a"), + (0x24D1, "M", "b"), + (0x24D2, "M", "c"), + (0x24D3, "M", "d"), + (0x24D4, "M", "e"), + (0x24D5, "M", "f"), + (0x24D6, "M", "g"), + (0x24D7, "M", "h"), + (0x24D8, "M", "i"), + (0x24D9, "M", "j"), + (0x24DA, "M", "k"), + (0x24DB, "M", "l"), + (0x24DC, "M", "m"), + (0x24DD, "M", "n"), + (0x24DE, "M", "o"), + (0x24DF, "M", "p"), + (0x24E0, "M", "q"), + (0x24E1, "M", "r"), + (0x24E2, "M", "s"), + (0x24E3, "M", "t"), + (0x24E4, "M", "u"), + (0x24E5, "M", "v"), + (0x24E6, "M", "w"), + (0x24E7, "M", "x"), + (0x24E8, "M", "y"), + (0x24E9, "M", "z"), + (0x24EA, "M", "0"), + (0x24EB, "V"), + (0x2A0C, "M", "∫∫∫∫"), + (0x2A0D, "V"), + (0x2A74, "3", "::="), + (0x2A75, "3", "=="), + (0x2A76, "3", "==="), + (0x2A77, "V"), + (0x2ADC, "M", "⫝̸"), + (0x2ADD, "V"), + (0x2B74, "X"), + (0x2B76, "V"), + (0x2B96, "X"), + (0x2B97, "V"), + (0x2C00, "M", "ⰰ"), + (0x2C01, "M", "ⰱ"), + (0x2C02, "M", "ⰲ"), + (0x2C03, "M", "ⰳ"), + (0x2C04, "M", "ⰴ"), + (0x2C05, "M", "ⰵ"), + (0x2C06, "M", "ⰶ"), + (0x2C07, "M", "ⰷ"), + (0x2C08, "M", "ⰸ"), + (0x2C09, "M", "ⰹ"), + (0x2C0A, "M", "ⰺ"), + (0x2C0B, "M", "ⰻ"), + (0x2C0C, "M", "ⰼ"), + (0x2C0D, "M", "ⰽ"), + (0x2C0E, "M", "ⰾ"), + (0x2C0F, "M", "ⰿ"), + (0x2C10, "M", "ⱀ"), + (0x2C11, "M", "ⱁ"), + (0x2C12, "M", "ⱂ"), + (0x2C13, "M", "ⱃ"), + (0x2C14, "M", "ⱄ"), + (0x2C15, "M", "ⱅ"), + (0x2C16, "M", "ⱆ"), + (0x2C17, "M", "ⱇ"), + (0x2C18, "M", "ⱈ"), + (0x2C19, "M", "ⱉ"), + (0x2C1A, "M", "ⱊ"), + (0x2C1B, "M", "ⱋ"), + (0x2C1C, "M", "ⱌ"), + (0x2C1D, "M", "ⱍ"), + (0x2C1E, "M", "ⱎ"), + (0x2C1F, "M", "ⱏ"), + (0x2C20, "M", "ⱐ"), + (0x2C21, "M", "ⱑ"), + (0x2C22, "M", "ⱒ"), + (0x2C23, "M", "ⱓ"), + (0x2C24, "M", "ⱔ"), + (0x2C25, "M", "ⱕ"), + (0x2C26, "M", "ⱖ"), + (0x2C27, "M", "ⱗ"), + (0x2C28, "M", "ⱘ"), + (0x2C29, "M", "ⱙ"), + (0x2C2A, "M", "ⱚ"), + (0x2C2B, "M", "ⱛ"), + (0x2C2C, "M", "ⱜ"), ] + def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2C2D, 'M', 'ⱝ'), - (0x2C2E, 'M', 'ⱞ'), - (0x2C2F, 'M', 'ⱟ'), - (0x2C30, 'V'), - (0x2C60, 'M', 'ⱡ'), - (0x2C61, 'V'), - (0x2C62, 'M', 'ɫ'), - (0x2C63, 'M', 'ᵽ'), - (0x2C64, 'M', 'ɽ'), - (0x2C65, 'V'), - (0x2C67, 'M', 'ⱨ'), - (0x2C68, 'V'), - (0x2C69, 'M', 'ⱪ'), - (0x2C6A, 'V'), - (0x2C6B, 'M', 'ⱬ'), - (0x2C6C, 'V'), - (0x2C6D, 'M', 'ɑ'), - (0x2C6E, 'M', 'ɱ'), - (0x2C6F, 'M', 'ɐ'), - (0x2C70, 'M', 'ɒ'), - (0x2C71, 'V'), - (0x2C72, 'M', 'ⱳ'), - (0x2C73, 'V'), - (0x2C75, 'M', 'ⱶ'), - (0x2C76, 'V'), - (0x2C7C, 'M', 'j'), - (0x2C7D, 'M', 'v'), - (0x2C7E, 'M', 'ȿ'), - (0x2C7F, 'M', 'ɀ'), - (0x2C80, 'M', 'ⲁ'), - (0x2C81, 'V'), - (0x2C82, 'M', 'ⲃ'), - (0x2C83, 'V'), - (0x2C84, 'M', 'ⲅ'), - (0x2C85, 'V'), - (0x2C86, 'M', 'ⲇ'), - (0x2C87, 'V'), - (0x2C88, 'M', 'ⲉ'), - (0x2C89, 'V'), - (0x2C8A, 'M', 'ⲋ'), - (0x2C8B, 'V'), - (0x2C8C, 'M', 'ⲍ'), - (0x2C8D, 'V'), - (0x2C8E, 'M', 'ⲏ'), - (0x2C8F, 'V'), - (0x2C90, 'M', 'ⲑ'), - (0x2C91, 'V'), - (0x2C92, 'M', 'ⲓ'), - (0x2C93, 'V'), - (0x2C94, 'M', 'ⲕ'), - (0x2C95, 'V'), - (0x2C96, 'M', 'ⲗ'), - (0x2C97, 'V'), - (0x2C98, 'M', 'ⲙ'), - (0x2C99, 'V'), - (0x2C9A, 'M', 'ⲛ'), - (0x2C9B, 'V'), - (0x2C9C, 'M', 'ⲝ'), - (0x2C9D, 'V'), - (0x2C9E, 'M', 'ⲟ'), - (0x2C9F, 'V'), - (0x2CA0, 'M', 'ⲡ'), - (0x2CA1, 'V'), - (0x2CA2, 'M', 'ⲣ'), - (0x2CA3, 'V'), - (0x2CA4, 'M', 'ⲥ'), - (0x2CA5, 'V'), - (0x2CA6, 'M', 'ⲧ'), - (0x2CA7, 'V'), - (0x2CA8, 'M', 'ⲩ'), - (0x2CA9, 'V'), - (0x2CAA, 'M', 'ⲫ'), - (0x2CAB, 'V'), - (0x2CAC, 'M', 'ⲭ'), - (0x2CAD, 'V'), - (0x2CAE, 'M', 'ⲯ'), - (0x2CAF, 'V'), - (0x2CB0, 'M', 'ⲱ'), - (0x2CB1, 'V'), - (0x2CB2, 'M', 'ⲳ'), - (0x2CB3, 'V'), - (0x2CB4, 'M', 'ⲵ'), - (0x2CB5, 'V'), - (0x2CB6, 'M', 'ⲷ'), - (0x2CB7, 'V'), - (0x2CB8, 'M', 'ⲹ'), - (0x2CB9, 'V'), - (0x2CBA, 'M', 'ⲻ'), - (0x2CBB, 'V'), - (0x2CBC, 'M', 'ⲽ'), - (0x2CBD, 'V'), - (0x2CBE, 'M', 'ⲿ'), - (0x2CBF, 'V'), - (0x2CC0, 'M', 'ⳁ'), - (0x2CC1, 'V'), - (0x2CC2, 'M', 'ⳃ'), - (0x2CC3, 'V'), - (0x2CC4, 'M', 'ⳅ'), - (0x2CC5, 'V'), - (0x2CC6, 'M', 'ⳇ'), + (0x2C2D, "M", "ⱝ"), + (0x2C2E, "M", "ⱞ"), + (0x2C2F, "M", "ⱟ"), + (0x2C30, "V"), + (0x2C60, "M", "ⱡ"), + (0x2C61, "V"), + (0x2C62, "M", "ɫ"), + (0x2C63, "M", "ᵽ"), + (0x2C64, "M", "ɽ"), + (0x2C65, "V"), + (0x2C67, "M", "ⱨ"), + (0x2C68, "V"), + (0x2C69, "M", "ⱪ"), + (0x2C6A, "V"), + (0x2C6B, "M", "ⱬ"), + (0x2C6C, "V"), + (0x2C6D, "M", "ɑ"), + (0x2C6E, "M", "ɱ"), + (0x2C6F, "M", "ɐ"), + (0x2C70, "M", "ɒ"), + (0x2C71, "V"), + (0x2C72, "M", "ⱳ"), + (0x2C73, "V"), + (0x2C75, "M", "ⱶ"), + (0x2C76, "V"), + (0x2C7C, "M", "j"), + (0x2C7D, "M", "v"), + (0x2C7E, "M", "ȿ"), + (0x2C7F, "M", "ɀ"), + (0x2C80, "M", "ⲁ"), + (0x2C81, "V"), + (0x2C82, "M", "ⲃ"), + (0x2C83, "V"), + (0x2C84, "M", "ⲅ"), + (0x2C85, "V"), + (0x2C86, "M", "ⲇ"), + (0x2C87, "V"), + (0x2C88, "M", "ⲉ"), + (0x2C89, "V"), + (0x2C8A, "M", "ⲋ"), + (0x2C8B, "V"), + (0x2C8C, "M", "ⲍ"), + (0x2C8D, "V"), + (0x2C8E, "M", "ⲏ"), + (0x2C8F, "V"), + (0x2C90, "M", "ⲑ"), + (0x2C91, "V"), + (0x2C92, "M", "ⲓ"), + (0x2C93, "V"), + (0x2C94, "M", "ⲕ"), + (0x2C95, "V"), + (0x2C96, "M", "ⲗ"), + (0x2C97, "V"), + (0x2C98, "M", "ⲙ"), + (0x2C99, "V"), + (0x2C9A, "M", "ⲛ"), + (0x2C9B, "V"), + (0x2C9C, "M", "ⲝ"), + (0x2C9D, "V"), + (0x2C9E, "M", "ⲟ"), + (0x2C9F, "V"), + (0x2CA0, "M", "ⲡ"), + (0x2CA1, "V"), + (0x2CA2, "M", "ⲣ"), + (0x2CA3, "V"), + (0x2CA4, "M", "ⲥ"), + (0x2CA5, "V"), + (0x2CA6, "M", "ⲧ"), + (0x2CA7, "V"), + (0x2CA8, "M", "ⲩ"), + (0x2CA9, "V"), + (0x2CAA, "M", "ⲫ"), + (0x2CAB, "V"), + (0x2CAC, "M", "ⲭ"), + (0x2CAD, "V"), + (0x2CAE, "M", "ⲯ"), + (0x2CAF, "V"), + (0x2CB0, "M", "ⲱ"), + (0x2CB1, "V"), + (0x2CB2, "M", "ⲳ"), + (0x2CB3, "V"), + (0x2CB4, "M", "ⲵ"), + (0x2CB5, "V"), + (0x2CB6, "M", "ⲷ"), + (0x2CB7, "V"), + (0x2CB8, "M", "ⲹ"), + (0x2CB9, "V"), + (0x2CBA, "M", "ⲻ"), + (0x2CBB, "V"), + (0x2CBC, "M", "ⲽ"), + (0x2CBD, "V"), + (0x2CBE, "M", "ⲿ"), + (0x2CBF, "V"), + (0x2CC0, "M", "ⳁ"), + (0x2CC1, "V"), + (0x2CC2, "M", "ⳃ"), + (0x2CC3, "V"), + (0x2CC4, "M", "ⳅ"), + (0x2CC5, "V"), + (0x2CC6, "M", "ⳇ"), ] + def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2CC7, 'V'), - (0x2CC8, 'M', 'ⳉ'), - (0x2CC9, 'V'), - (0x2CCA, 'M', 'ⳋ'), - (0x2CCB, 'V'), - (0x2CCC, 'M', 'ⳍ'), - (0x2CCD, 'V'), - (0x2CCE, 'M', 'ⳏ'), - (0x2CCF, 'V'), - (0x2CD0, 'M', 'ⳑ'), - (0x2CD1, 'V'), - (0x2CD2, 'M', 'ⳓ'), - (0x2CD3, 'V'), - (0x2CD4, 'M', 'ⳕ'), - (0x2CD5, 'V'), - (0x2CD6, 'M', 'ⳗ'), - (0x2CD7, 'V'), - (0x2CD8, 'M', 'ⳙ'), - (0x2CD9, 'V'), - (0x2CDA, 'M', 'ⳛ'), - (0x2CDB, 'V'), - (0x2CDC, 'M', 'ⳝ'), - (0x2CDD, 'V'), - (0x2CDE, 'M', 'ⳟ'), - (0x2CDF, 'V'), - (0x2CE0, 'M', 'ⳡ'), - (0x2CE1, 'V'), - (0x2CE2, 'M', 'ⳣ'), - (0x2CE3, 'V'), - (0x2CEB, 'M', 'ⳬ'), - (0x2CEC, 'V'), - (0x2CED, 'M', 'ⳮ'), - (0x2CEE, 'V'), - (0x2CF2, 'M', 'ⳳ'), - (0x2CF3, 'V'), - (0x2CF4, 'X'), - (0x2CF9, 'V'), - (0x2D26, 'X'), - (0x2D27, 'V'), - (0x2D28, 'X'), - (0x2D2D, 'V'), - (0x2D2E, 'X'), - (0x2D30, 'V'), - (0x2D68, 'X'), - (0x2D6F, 'M', 'ⵡ'), - (0x2D70, 'V'), - (0x2D71, 'X'), - (0x2D7F, 'V'), - (0x2D97, 'X'), - (0x2DA0, 'V'), - (0x2DA7, 'X'), - (0x2DA8, 'V'), - (0x2DAF, 'X'), - (0x2DB0, 'V'), - (0x2DB7, 'X'), - (0x2DB8, 'V'), - (0x2DBF, 'X'), - (0x2DC0, 'V'), - (0x2DC7, 'X'), - (0x2DC8, 'V'), - (0x2DCF, 'X'), - (0x2DD0, 'V'), - (0x2DD7, 'X'), - (0x2DD8, 'V'), - (0x2DDF, 'X'), - (0x2DE0, 'V'), - (0x2E5E, 'X'), - (0x2E80, 'V'), - (0x2E9A, 'X'), - (0x2E9B, 'V'), - (0x2E9F, 'M', '母'), - (0x2EA0, 'V'), - (0x2EF3, 'M', '龟'), - (0x2EF4, 'X'), - (0x2F00, 'M', '一'), - (0x2F01, 'M', '丨'), - (0x2F02, 'M', '丶'), - (0x2F03, 'M', '丿'), - (0x2F04, 'M', '乙'), - (0x2F05, 'M', '亅'), - (0x2F06, 'M', '二'), - (0x2F07, 'M', '亠'), - (0x2F08, 'M', '人'), - (0x2F09, 'M', '儿'), - (0x2F0A, 'M', '入'), - (0x2F0B, 'M', '八'), - (0x2F0C, 'M', '冂'), - (0x2F0D, 'M', '冖'), - (0x2F0E, 'M', '冫'), - (0x2F0F, 'M', '几'), - (0x2F10, 'M', '凵'), - (0x2F11, 'M', '刀'), - (0x2F12, 'M', '力'), - (0x2F13, 'M', '勹'), - (0x2F14, 'M', '匕'), - (0x2F15, 'M', '匚'), - (0x2F16, 'M', '匸'), - (0x2F17, 'M', '十'), - (0x2F18, 'M', '卜'), - (0x2F19, 'M', '卩'), + (0x2CC7, "V"), + (0x2CC8, "M", "ⳉ"), + (0x2CC9, "V"), + (0x2CCA, "M", "ⳋ"), + (0x2CCB, "V"), + (0x2CCC, "M", "ⳍ"), + (0x2CCD, "V"), + (0x2CCE, "M", "ⳏ"), + (0x2CCF, "V"), + (0x2CD0, "M", "ⳑ"), + (0x2CD1, "V"), + (0x2CD2, "M", "ⳓ"), + (0x2CD3, "V"), + (0x2CD4, "M", "ⳕ"), + (0x2CD5, "V"), + (0x2CD6, "M", "ⳗ"), + (0x2CD7, "V"), + (0x2CD8, "M", "ⳙ"), + (0x2CD9, "V"), + (0x2CDA, "M", "ⳛ"), + (0x2CDB, "V"), + (0x2CDC, "M", "ⳝ"), + (0x2CDD, "V"), + (0x2CDE, "M", "ⳟ"), + (0x2CDF, "V"), + (0x2CE0, "M", "ⳡ"), + (0x2CE1, "V"), + (0x2CE2, "M", "ⳣ"), + (0x2CE3, "V"), + (0x2CEB, "M", "ⳬ"), + (0x2CEC, "V"), + (0x2CED, "M", "ⳮ"), + (0x2CEE, "V"), + (0x2CF2, "M", "ⳳ"), + (0x2CF3, "V"), + (0x2CF4, "X"), + (0x2CF9, "V"), + (0x2D26, "X"), + (0x2D27, "V"), + (0x2D28, "X"), + (0x2D2D, "V"), + (0x2D2E, "X"), + (0x2D30, "V"), + (0x2D68, "X"), + (0x2D6F, "M", "ⵡ"), + (0x2D70, "V"), + (0x2D71, "X"), + (0x2D7F, "V"), + (0x2D97, "X"), + (0x2DA0, "V"), + (0x2DA7, "X"), + (0x2DA8, "V"), + (0x2DAF, "X"), + (0x2DB0, "V"), + (0x2DB7, "X"), + (0x2DB8, "V"), + (0x2DBF, "X"), + (0x2DC0, "V"), + (0x2DC7, "X"), + (0x2DC8, "V"), + (0x2DCF, "X"), + (0x2DD0, "V"), + (0x2DD7, "X"), + (0x2DD8, "V"), + (0x2DDF, "X"), + (0x2DE0, "V"), + (0x2E5E, "X"), + (0x2E80, "V"), + (0x2E9A, "X"), + (0x2E9B, "V"), + (0x2E9F, "M", "母"), + (0x2EA0, "V"), + (0x2EF3, "M", "龟"), + (0x2EF4, "X"), + (0x2F00, "M", "一"), + (0x2F01, "M", "丨"), + (0x2F02, "M", "丶"), + (0x2F03, "M", "丿"), + (0x2F04, "M", "乙"), + (0x2F05, "M", "亅"), + (0x2F06, "M", "二"), + (0x2F07, "M", "亠"), + (0x2F08, "M", "人"), + (0x2F09, "M", "儿"), + (0x2F0A, "M", "入"), + (0x2F0B, "M", "八"), + (0x2F0C, "M", "冂"), + (0x2F0D, "M", "冖"), + (0x2F0E, "M", "冫"), + (0x2F0F, "M", "几"), + (0x2F10, "M", "凵"), + (0x2F11, "M", "刀"), + (0x2F12, "M", "力"), + (0x2F13, "M", "勹"), + (0x2F14, "M", "匕"), + (0x2F15, "M", "匚"), + (0x2F16, "M", "匸"), + (0x2F17, "M", "十"), + (0x2F18, "M", "卜"), + (0x2F19, "M", "卩"), ] + def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F1A, 'M', '厂'), - (0x2F1B, 'M', '厶'), - (0x2F1C, 'M', '又'), - (0x2F1D, 'M', '口'), - (0x2F1E, 'M', '囗'), - (0x2F1F, 'M', '土'), - (0x2F20, 'M', '士'), - (0x2F21, 'M', '夂'), - (0x2F22, 'M', '夊'), - (0x2F23, 'M', '夕'), - (0x2F24, 'M', '大'), - (0x2F25, 'M', '女'), - (0x2F26, 'M', '子'), - (0x2F27, 'M', '宀'), - (0x2F28, 'M', '寸'), - (0x2F29, 'M', '小'), - (0x2F2A, 'M', '尢'), - (0x2F2B, 'M', '尸'), - (0x2F2C, 'M', '屮'), - (0x2F2D, 'M', '山'), - (0x2F2E, 'M', '巛'), - (0x2F2F, 'M', '工'), - (0x2F30, 'M', '己'), - (0x2F31, 'M', '巾'), - (0x2F32, 'M', '干'), - (0x2F33, 'M', '幺'), - (0x2F34, 'M', '广'), - (0x2F35, 'M', '廴'), - (0x2F36, 'M', '廾'), - (0x2F37, 'M', '弋'), - (0x2F38, 'M', '弓'), - (0x2F39, 'M', '彐'), - (0x2F3A, 'M', '彡'), - (0x2F3B, 'M', '彳'), - (0x2F3C, 'M', '心'), - (0x2F3D, 'M', '戈'), - (0x2F3E, 'M', '戶'), - (0x2F3F, 'M', '手'), - (0x2F40, 'M', '支'), - (0x2F41, 'M', '攴'), - (0x2F42, 'M', '文'), - (0x2F43, 'M', '斗'), - (0x2F44, 'M', '斤'), - (0x2F45, 'M', '方'), - (0x2F46, 'M', '无'), - (0x2F47, 'M', '日'), - (0x2F48, 'M', '曰'), - (0x2F49, 'M', '月'), - (0x2F4A, 'M', '木'), - (0x2F4B, 'M', '欠'), - (0x2F4C, 'M', '止'), - (0x2F4D, 'M', '歹'), - (0x2F4E, 'M', '殳'), - (0x2F4F, 'M', '毋'), - (0x2F50, 'M', '比'), - (0x2F51, 'M', '毛'), - (0x2F52, 'M', '氏'), - (0x2F53, 'M', '气'), - (0x2F54, 'M', '水'), - (0x2F55, 'M', '火'), - (0x2F56, 'M', '爪'), - (0x2F57, 'M', '父'), - (0x2F58, 'M', '爻'), - (0x2F59, 'M', '爿'), - (0x2F5A, 'M', '片'), - (0x2F5B, 'M', '牙'), - (0x2F5C, 'M', '牛'), - (0x2F5D, 'M', '犬'), - (0x2F5E, 'M', '玄'), - (0x2F5F, 'M', '玉'), - (0x2F60, 'M', '瓜'), - (0x2F61, 'M', '瓦'), - (0x2F62, 'M', '甘'), - (0x2F63, 'M', '生'), - (0x2F64, 'M', '用'), - (0x2F65, 'M', '田'), - (0x2F66, 'M', '疋'), - (0x2F67, 'M', '疒'), - (0x2F68, 'M', '癶'), - (0x2F69, 'M', '白'), - (0x2F6A, 'M', '皮'), - (0x2F6B, 'M', '皿'), - (0x2F6C, 'M', '目'), - (0x2F6D, 'M', '矛'), - (0x2F6E, 'M', '矢'), - (0x2F6F, 'M', '石'), - (0x2F70, 'M', '示'), - (0x2F71, 'M', '禸'), - (0x2F72, 'M', '禾'), - (0x2F73, 'M', '穴'), - (0x2F74, 'M', '立'), - (0x2F75, 'M', '竹'), - (0x2F76, 'M', '米'), - (0x2F77, 'M', '糸'), - (0x2F78, 'M', '缶'), - (0x2F79, 'M', '网'), - (0x2F7A, 'M', '羊'), - (0x2F7B, 'M', '羽'), - (0x2F7C, 'M', '老'), - (0x2F7D, 'M', '而'), + (0x2F1A, "M", "厂"), + (0x2F1B, "M", "厶"), + (0x2F1C, "M", "又"), + (0x2F1D, "M", "口"), + (0x2F1E, "M", "囗"), + (0x2F1F, "M", "土"), + (0x2F20, "M", "士"), + (0x2F21, "M", "夂"), + (0x2F22, "M", "夊"), + (0x2F23, "M", "夕"), + (0x2F24, "M", "大"), + (0x2F25, "M", "女"), + (0x2F26, "M", "子"), + (0x2F27, "M", "宀"), + (0x2F28, "M", "寸"), + (0x2F29, "M", "小"), + (0x2F2A, "M", "尢"), + (0x2F2B, "M", "尸"), + (0x2F2C, "M", "屮"), + (0x2F2D, "M", "山"), + (0x2F2E, "M", "巛"), + (0x2F2F, "M", "工"), + (0x2F30, "M", "己"), + (0x2F31, "M", "巾"), + (0x2F32, "M", "干"), + (0x2F33, "M", "幺"), + (0x2F34, "M", "广"), + (0x2F35, "M", "廴"), + (0x2F36, "M", "廾"), + (0x2F37, "M", "弋"), + (0x2F38, "M", "弓"), + (0x2F39, "M", "彐"), + (0x2F3A, "M", "彡"), + (0x2F3B, "M", "彳"), + (0x2F3C, "M", "心"), + (0x2F3D, "M", "戈"), + (0x2F3E, "M", "戶"), + (0x2F3F, "M", "手"), + (0x2F40, "M", "支"), + (0x2F41, "M", "攴"), + (0x2F42, "M", "文"), + (0x2F43, "M", "斗"), + (0x2F44, "M", "斤"), + (0x2F45, "M", "方"), + (0x2F46, "M", "无"), + (0x2F47, "M", "日"), + (0x2F48, "M", "曰"), + (0x2F49, "M", "月"), + (0x2F4A, "M", "木"), + (0x2F4B, "M", "欠"), + (0x2F4C, "M", "止"), + (0x2F4D, "M", "歹"), + (0x2F4E, "M", "殳"), + (0x2F4F, "M", "毋"), + (0x2F50, "M", "比"), + (0x2F51, "M", "毛"), + (0x2F52, "M", "氏"), + (0x2F53, "M", "气"), + (0x2F54, "M", "水"), + (0x2F55, "M", "火"), + (0x2F56, "M", "爪"), + (0x2F57, "M", "父"), + (0x2F58, "M", "爻"), + (0x2F59, "M", "爿"), + (0x2F5A, "M", "片"), + (0x2F5B, "M", "牙"), + (0x2F5C, "M", "牛"), + (0x2F5D, "M", "犬"), + (0x2F5E, "M", "玄"), + (0x2F5F, "M", "玉"), + (0x2F60, "M", "瓜"), + (0x2F61, "M", "瓦"), + (0x2F62, "M", "甘"), + (0x2F63, "M", "生"), + (0x2F64, "M", "用"), + (0x2F65, "M", "田"), + (0x2F66, "M", "疋"), + (0x2F67, "M", "疒"), + (0x2F68, "M", "癶"), + (0x2F69, "M", "白"), + (0x2F6A, "M", "皮"), + (0x2F6B, "M", "皿"), + (0x2F6C, "M", "目"), + (0x2F6D, "M", "矛"), + (0x2F6E, "M", "矢"), + (0x2F6F, "M", "石"), + (0x2F70, "M", "示"), + (0x2F71, "M", "禸"), + (0x2F72, "M", "禾"), + (0x2F73, "M", "穴"), + (0x2F74, "M", "立"), + (0x2F75, "M", "竹"), + (0x2F76, "M", "米"), + (0x2F77, "M", "糸"), + (0x2F78, "M", "缶"), + (0x2F79, "M", "网"), + (0x2F7A, "M", "羊"), + (0x2F7B, "M", "羽"), + (0x2F7C, "M", "老"), + (0x2F7D, "M", "而"), ] + def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F7E, 'M', '耒'), - (0x2F7F, 'M', '耳'), - (0x2F80, 'M', '聿'), - (0x2F81, 'M', '肉'), - (0x2F82, 'M', '臣'), - (0x2F83, 'M', '自'), - (0x2F84, 'M', '至'), - (0x2F85, 'M', '臼'), - (0x2F86, 'M', '舌'), - (0x2F87, 'M', '舛'), - (0x2F88, 'M', '舟'), - (0x2F89, 'M', '艮'), - (0x2F8A, 'M', '色'), - (0x2F8B, 'M', '艸'), - (0x2F8C, 'M', '虍'), - (0x2F8D, 'M', '虫'), - (0x2F8E, 'M', '血'), - (0x2F8F, 'M', '行'), - (0x2F90, 'M', '衣'), - (0x2F91, 'M', '襾'), - (0x2F92, 'M', '見'), - (0x2F93, 'M', '角'), - (0x2F94, 'M', '言'), - (0x2F95, 'M', '谷'), - (0x2F96, 'M', '豆'), - (0x2F97, 'M', '豕'), - (0x2F98, 'M', '豸'), - (0x2F99, 'M', '貝'), - (0x2F9A, 'M', '赤'), - (0x2F9B, 'M', '走'), - (0x2F9C, 'M', '足'), - (0x2F9D, 'M', '身'), - (0x2F9E, 'M', '車'), - (0x2F9F, 'M', '辛'), - (0x2FA0, 'M', '辰'), - (0x2FA1, 'M', '辵'), - (0x2FA2, 'M', '邑'), - (0x2FA3, 'M', '酉'), - (0x2FA4, 'M', '釆'), - (0x2FA5, 'M', '里'), - (0x2FA6, 'M', '金'), - (0x2FA7, 'M', '長'), - (0x2FA8, 'M', '門'), - (0x2FA9, 'M', '阜'), - (0x2FAA, 'M', '隶'), - (0x2FAB, 'M', '隹'), - (0x2FAC, 'M', '雨'), - (0x2FAD, 'M', '靑'), - (0x2FAE, 'M', '非'), - (0x2FAF, 'M', '面'), - (0x2FB0, 'M', '革'), - (0x2FB1, 'M', '韋'), - (0x2FB2, 'M', '韭'), - (0x2FB3, 'M', '音'), - (0x2FB4, 'M', '頁'), - (0x2FB5, 'M', '風'), - (0x2FB6, 'M', '飛'), - (0x2FB7, 'M', '食'), - (0x2FB8, 'M', '首'), - (0x2FB9, 'M', '香'), - (0x2FBA, 'M', '馬'), - (0x2FBB, 'M', '骨'), - (0x2FBC, 'M', '高'), - (0x2FBD, 'M', '髟'), - (0x2FBE, 'M', '鬥'), - (0x2FBF, 'M', '鬯'), - (0x2FC0, 'M', '鬲'), - (0x2FC1, 'M', '鬼'), - (0x2FC2, 'M', '魚'), - (0x2FC3, 'M', '鳥'), - (0x2FC4, 'M', '鹵'), - (0x2FC5, 'M', '鹿'), - (0x2FC6, 'M', '麥'), - (0x2FC7, 'M', '麻'), - (0x2FC8, 'M', '黃'), - (0x2FC9, 'M', '黍'), - (0x2FCA, 'M', '黑'), - (0x2FCB, 'M', '黹'), - (0x2FCC, 'M', '黽'), - (0x2FCD, 'M', '鼎'), - (0x2FCE, 'M', '鼓'), - (0x2FCF, 'M', '鼠'), - (0x2FD0, 'M', '鼻'), - (0x2FD1, 'M', '齊'), - (0x2FD2, 'M', '齒'), - (0x2FD3, 'M', '龍'), - (0x2FD4, 'M', '龜'), - (0x2FD5, 'M', '龠'), - (0x2FD6, 'X'), - (0x3000, '3', ' '), - (0x3001, 'V'), - (0x3002, 'M', '.'), - (0x3003, 'V'), - (0x3036, 'M', '〒'), - (0x3037, 'V'), - (0x3038, 'M', '十'), - (0x3039, 'M', '卄'), - (0x303A, 'M', '卅'), - (0x303B, 'V'), - (0x3040, 'X'), + (0x2F7E, "M", "耒"), + (0x2F7F, "M", "耳"), + (0x2F80, "M", "聿"), + (0x2F81, "M", "肉"), + (0x2F82, "M", "臣"), + (0x2F83, "M", "自"), + (0x2F84, "M", "至"), + (0x2F85, "M", "臼"), + (0x2F86, "M", "舌"), + (0x2F87, "M", "舛"), + (0x2F88, "M", "舟"), + (0x2F89, "M", "艮"), + (0x2F8A, "M", "色"), + (0x2F8B, "M", "艸"), + (0x2F8C, "M", "虍"), + (0x2F8D, "M", "虫"), + (0x2F8E, "M", "血"), + (0x2F8F, "M", "行"), + (0x2F90, "M", "衣"), + (0x2F91, "M", "襾"), + (0x2F92, "M", "見"), + (0x2F93, "M", "角"), + (0x2F94, "M", "言"), + (0x2F95, "M", "谷"), + (0x2F96, "M", "豆"), + (0x2F97, "M", "豕"), + (0x2F98, "M", "豸"), + (0x2F99, "M", "貝"), + (0x2F9A, "M", "赤"), + (0x2F9B, "M", "走"), + (0x2F9C, "M", "足"), + (0x2F9D, "M", "身"), + (0x2F9E, "M", "車"), + (0x2F9F, "M", "辛"), + (0x2FA0, "M", "辰"), + (0x2FA1, "M", "辵"), + (0x2FA2, "M", "邑"), + (0x2FA3, "M", "酉"), + (0x2FA4, "M", "釆"), + (0x2FA5, "M", "里"), + (0x2FA6, "M", "金"), + (0x2FA7, "M", "長"), + (0x2FA8, "M", "門"), + (0x2FA9, "M", "阜"), + (0x2FAA, "M", "隶"), + (0x2FAB, "M", "隹"), + (0x2FAC, "M", "雨"), + (0x2FAD, "M", "靑"), + (0x2FAE, "M", "非"), + (0x2FAF, "M", "面"), + (0x2FB0, "M", "革"), + (0x2FB1, "M", "韋"), + (0x2FB2, "M", "韭"), + (0x2FB3, "M", "音"), + (0x2FB4, "M", "頁"), + (0x2FB5, "M", "風"), + (0x2FB6, "M", "飛"), + (0x2FB7, "M", "食"), + (0x2FB8, "M", "首"), + (0x2FB9, "M", "香"), + (0x2FBA, "M", "馬"), + (0x2FBB, "M", "骨"), + (0x2FBC, "M", "高"), + (0x2FBD, "M", "髟"), + (0x2FBE, "M", "鬥"), + (0x2FBF, "M", "鬯"), + (0x2FC0, "M", "鬲"), + (0x2FC1, "M", "鬼"), + (0x2FC2, "M", "魚"), + (0x2FC3, "M", "鳥"), + (0x2FC4, "M", "鹵"), + (0x2FC5, "M", "鹿"), + (0x2FC6, "M", "麥"), + (0x2FC7, "M", "麻"), + (0x2FC8, "M", "黃"), + (0x2FC9, "M", "黍"), + (0x2FCA, "M", "黑"), + (0x2FCB, "M", "黹"), + (0x2FCC, "M", "黽"), + (0x2FCD, "M", "鼎"), + (0x2FCE, "M", "鼓"), + (0x2FCF, "M", "鼠"), + (0x2FD0, "M", "鼻"), + (0x2FD1, "M", "齊"), + (0x2FD2, "M", "齒"), + (0x2FD3, "M", "龍"), + (0x2FD4, "M", "龜"), + (0x2FD5, "M", "龠"), + (0x2FD6, "X"), + (0x3000, "3", " "), + (0x3001, "V"), + (0x3002, "M", "."), + (0x3003, "V"), + (0x3036, "M", "〒"), + (0x3037, "V"), + (0x3038, "M", "十"), + (0x3039, "M", "卄"), + (0x303A, "M", "卅"), + (0x303B, "V"), + (0x3040, "X"), ] + def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x3041, 'V'), - (0x3097, 'X'), - (0x3099, 'V'), - (0x309B, '3', ' ゙'), - (0x309C, '3', ' ゚'), - (0x309D, 'V'), - (0x309F, 'M', 'より'), - (0x30A0, 'V'), - (0x30FF, 'M', 'コト'), - (0x3100, 'X'), - (0x3105, 'V'), - (0x3130, 'X'), - (0x3131, 'M', 'ᄀ'), - (0x3132, 'M', 'ᄁ'), - (0x3133, 'M', 'ᆪ'), - (0x3134, 'M', 'ᄂ'), - (0x3135, 'M', 'ᆬ'), - (0x3136, 'M', 'ᆭ'), - (0x3137, 'M', 'ᄃ'), - (0x3138, 'M', 'ᄄ'), - (0x3139, 'M', 'ᄅ'), - (0x313A, 'M', 'ᆰ'), - (0x313B, 'M', 'ᆱ'), - (0x313C, 'M', 'ᆲ'), - (0x313D, 'M', 'ᆳ'), - (0x313E, 'M', 'ᆴ'), - (0x313F, 'M', 'ᆵ'), - (0x3140, 'M', 'ᄚ'), - (0x3141, 'M', 'ᄆ'), - (0x3142, 'M', 'ᄇ'), - (0x3143, 'M', 'ᄈ'), - (0x3144, 'M', 'ᄡ'), - (0x3145, 'M', 'ᄉ'), - (0x3146, 'M', 'ᄊ'), - (0x3147, 'M', 'ᄋ'), - (0x3148, 'M', 'ᄌ'), - (0x3149, 'M', 'ᄍ'), - (0x314A, 'M', 'ᄎ'), - (0x314B, 'M', 'ᄏ'), - (0x314C, 'M', 'ᄐ'), - (0x314D, 'M', 'ᄑ'), - (0x314E, 'M', 'ᄒ'), - (0x314F, 'M', 'ᅡ'), - (0x3150, 'M', 'ᅢ'), - (0x3151, 'M', 'ᅣ'), - (0x3152, 'M', 'ᅤ'), - (0x3153, 'M', 'ᅥ'), - (0x3154, 'M', 'ᅦ'), - (0x3155, 'M', 'ᅧ'), - (0x3156, 'M', 'ᅨ'), - (0x3157, 'M', 'ᅩ'), - (0x3158, 'M', 'ᅪ'), - (0x3159, 'M', 'ᅫ'), - (0x315A, 'M', 'ᅬ'), - (0x315B, 'M', 'ᅭ'), - (0x315C, 'M', 'ᅮ'), - (0x315D, 'M', 'ᅯ'), - (0x315E, 'M', 'ᅰ'), - (0x315F, 'M', 'ᅱ'), - (0x3160, 'M', 'ᅲ'), - (0x3161, 'M', 'ᅳ'), - (0x3162, 'M', 'ᅴ'), - (0x3163, 'M', 'ᅵ'), - (0x3164, 'X'), - (0x3165, 'M', 'ᄔ'), - (0x3166, 'M', 'ᄕ'), - (0x3167, 'M', 'ᇇ'), - (0x3168, 'M', 'ᇈ'), - (0x3169, 'M', 'ᇌ'), - (0x316A, 'M', 'ᇎ'), - (0x316B, 'M', 'ᇓ'), - (0x316C, 'M', 'ᇗ'), - (0x316D, 'M', 'ᇙ'), - (0x316E, 'M', 'ᄜ'), - (0x316F, 'M', 'ᇝ'), - (0x3170, 'M', 'ᇟ'), - (0x3171, 'M', 'ᄝ'), - (0x3172, 'M', 'ᄞ'), - (0x3173, 'M', 'ᄠ'), - (0x3174, 'M', 'ᄢ'), - (0x3175, 'M', 'ᄣ'), - (0x3176, 'M', 'ᄧ'), - (0x3177, 'M', 'ᄩ'), - (0x3178, 'M', 'ᄫ'), - (0x3179, 'M', 'ᄬ'), - (0x317A, 'M', 'ᄭ'), - (0x317B, 'M', 'ᄮ'), - (0x317C, 'M', 'ᄯ'), - (0x317D, 'M', 'ᄲ'), - (0x317E, 'M', 'ᄶ'), - (0x317F, 'M', 'ᅀ'), - (0x3180, 'M', 'ᅇ'), - (0x3181, 'M', 'ᅌ'), - (0x3182, 'M', 'ᇱ'), - (0x3183, 'M', 'ᇲ'), - (0x3184, 'M', 'ᅗ'), - (0x3185, 'M', 'ᅘ'), - (0x3186, 'M', 'ᅙ'), - (0x3187, 'M', 'ᆄ'), - (0x3188, 'M', 'ᆅ'), + (0x3041, "V"), + (0x3097, "X"), + (0x3099, "V"), + (0x309B, "3", " ゙"), + (0x309C, "3", " ゚"), + (0x309D, "V"), + (0x309F, "M", "より"), + (0x30A0, "V"), + (0x30FF, "M", "コト"), + (0x3100, "X"), + (0x3105, "V"), + (0x3130, "X"), + (0x3131, "M", "ᄀ"), + (0x3132, "M", "ᄁ"), + (0x3133, "M", "ᆪ"), + (0x3134, "M", "ᄂ"), + (0x3135, "M", "ᆬ"), + (0x3136, "M", "ᆭ"), + (0x3137, "M", "ᄃ"), + (0x3138, "M", "ᄄ"), + (0x3139, "M", "ᄅ"), + (0x313A, "M", "ᆰ"), + (0x313B, "M", "ᆱ"), + (0x313C, "M", "ᆲ"), + (0x313D, "M", "ᆳ"), + (0x313E, "M", "ᆴ"), + (0x313F, "M", "ᆵ"), + (0x3140, "M", "ᄚ"), + (0x3141, "M", "ᄆ"), + (0x3142, "M", "ᄇ"), + (0x3143, "M", "ᄈ"), + (0x3144, "M", "ᄡ"), + (0x3145, "M", "ᄉ"), + (0x3146, "M", "ᄊ"), + (0x3147, "M", "ᄋ"), + (0x3148, "M", "ᄌ"), + (0x3149, "M", "ᄍ"), + (0x314A, "M", "ᄎ"), + (0x314B, "M", "ᄏ"), + (0x314C, "M", "ᄐ"), + (0x314D, "M", "ᄑ"), + (0x314E, "M", "ᄒ"), + (0x314F, "M", "ᅡ"), + (0x3150, "M", "ᅢ"), + (0x3151, "M", "ᅣ"), + (0x3152, "M", "ᅤ"), + (0x3153, "M", "ᅥ"), + (0x3154, "M", "ᅦ"), + (0x3155, "M", "ᅧ"), + (0x3156, "M", "ᅨ"), + (0x3157, "M", "ᅩ"), + (0x3158, "M", "ᅪ"), + (0x3159, "M", "ᅫ"), + (0x315A, "M", "ᅬ"), + (0x315B, "M", "ᅭ"), + (0x315C, "M", "ᅮ"), + (0x315D, "M", "ᅯ"), + (0x315E, "M", "ᅰ"), + (0x315F, "M", "ᅱ"), + (0x3160, "M", "ᅲ"), + (0x3161, "M", "ᅳ"), + (0x3162, "M", "ᅴ"), + (0x3163, "M", "ᅵ"), + (0x3164, "X"), + (0x3165, "M", "ᄔ"), + (0x3166, "M", "ᄕ"), + (0x3167, "M", "ᇇ"), + (0x3168, "M", "ᇈ"), + (0x3169, "M", "ᇌ"), + (0x316A, "M", "ᇎ"), + (0x316B, "M", "ᇓ"), + (0x316C, "M", "ᇗ"), + (0x316D, "M", "ᇙ"), + (0x316E, "M", "ᄜ"), + (0x316F, "M", "ᇝ"), + (0x3170, "M", "ᇟ"), + (0x3171, "M", "ᄝ"), + (0x3172, "M", "ᄞ"), + (0x3173, "M", "ᄠ"), + (0x3174, "M", "ᄢ"), + (0x3175, "M", "ᄣ"), + (0x3176, "M", "ᄧ"), + (0x3177, "M", "ᄩ"), + (0x3178, "M", "ᄫ"), + (0x3179, "M", "ᄬ"), + (0x317A, "M", "ᄭ"), + (0x317B, "M", "ᄮ"), + (0x317C, "M", "ᄯ"), + (0x317D, "M", "ᄲ"), + (0x317E, "M", "ᄶ"), + (0x317F, "M", "ᅀ"), + (0x3180, "M", "ᅇ"), + (0x3181, "M", "ᅌ"), + (0x3182, "M", "ᇱ"), + (0x3183, "M", "ᇲ"), + (0x3184, "M", "ᅗ"), + (0x3185, "M", "ᅘ"), + (0x3186, "M", "ᅙ"), + (0x3187, "M", "ᆄ"), + (0x3188, "M", "ᆅ"), ] + def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x3189, 'M', 'ᆈ'), - (0x318A, 'M', 'ᆑ'), - (0x318B, 'M', 'ᆒ'), - (0x318C, 'M', 'ᆔ'), - (0x318D, 'M', 'ᆞ'), - (0x318E, 'M', 'ᆡ'), - (0x318F, 'X'), - (0x3190, 'V'), - (0x3192, 'M', '一'), - (0x3193, 'M', '二'), - (0x3194, 'M', '三'), - (0x3195, 'M', '四'), - (0x3196, 'M', '上'), - (0x3197, 'M', '中'), - (0x3198, 'M', '下'), - (0x3199, 'M', '甲'), - (0x319A, 'M', '乙'), - (0x319B, 'M', '丙'), - (0x319C, 'M', '丁'), - (0x319D, 'M', '天'), - (0x319E, 'M', '地'), - (0x319F, 'M', '人'), - (0x31A0, 'V'), - (0x31E4, 'X'), - (0x31F0, 'V'), - (0x3200, '3', '(ᄀ)'), - (0x3201, '3', '(ᄂ)'), - (0x3202, '3', '(ᄃ)'), - (0x3203, '3', '(ᄅ)'), - (0x3204, '3', '(ᄆ)'), - (0x3205, '3', '(ᄇ)'), - (0x3206, '3', '(ᄉ)'), - (0x3207, '3', '(ᄋ)'), - (0x3208, '3', '(ᄌ)'), - (0x3209, '3', '(ᄎ)'), - (0x320A, '3', '(ᄏ)'), - (0x320B, '3', '(ᄐ)'), - (0x320C, '3', '(ᄑ)'), - (0x320D, '3', '(ᄒ)'), - (0x320E, '3', '(가)'), - (0x320F, '3', '(나)'), - (0x3210, '3', '(다)'), - (0x3211, '3', '(라)'), - (0x3212, '3', '(마)'), - (0x3213, '3', '(바)'), - (0x3214, '3', '(사)'), - (0x3215, '3', '(아)'), - (0x3216, '3', '(자)'), - (0x3217, '3', '(차)'), - (0x3218, '3', '(카)'), - (0x3219, '3', '(타)'), - (0x321A, '3', '(파)'), - (0x321B, '3', '(하)'), - (0x321C, '3', '(주)'), - (0x321D, '3', '(오전)'), - (0x321E, '3', '(오후)'), - (0x321F, 'X'), - (0x3220, '3', '(一)'), - (0x3221, '3', '(二)'), - (0x3222, '3', '(三)'), - (0x3223, '3', '(四)'), - (0x3224, '3', '(五)'), - (0x3225, '3', '(六)'), - (0x3226, '3', '(七)'), - (0x3227, '3', '(八)'), - (0x3228, '3', '(九)'), - (0x3229, '3', '(十)'), - (0x322A, '3', '(月)'), - (0x322B, '3', '(火)'), - (0x322C, '3', '(水)'), - (0x322D, '3', '(木)'), - (0x322E, '3', '(金)'), - (0x322F, '3', '(土)'), - (0x3230, '3', '(日)'), - (0x3231, '3', '(株)'), - (0x3232, '3', '(有)'), - (0x3233, '3', '(社)'), - (0x3234, '3', '(名)'), - (0x3235, '3', '(特)'), - (0x3236, '3', '(財)'), - (0x3237, '3', '(祝)'), - (0x3238, '3', '(労)'), - (0x3239, '3', '(代)'), - (0x323A, '3', '(呼)'), - (0x323B, '3', '(学)'), - (0x323C, '3', '(監)'), - (0x323D, '3', '(企)'), - (0x323E, '3', '(資)'), - (0x323F, '3', '(協)'), - (0x3240, '3', '(祭)'), - (0x3241, '3', '(休)'), - (0x3242, '3', '(自)'), - (0x3243, '3', '(至)'), - (0x3244, 'M', '問'), - (0x3245, 'M', '幼'), - (0x3246, 'M', '文'), - (0x3247, 'M', '箏'), - (0x3248, 'V'), - (0x3250, 'M', 'pte'), - (0x3251, 'M', '21'), + (0x3189, "M", "ᆈ"), + (0x318A, "M", "ᆑ"), + (0x318B, "M", "ᆒ"), + (0x318C, "M", "ᆔ"), + (0x318D, "M", "ᆞ"), + (0x318E, "M", "ᆡ"), + (0x318F, "X"), + (0x3190, "V"), + (0x3192, "M", "一"), + (0x3193, "M", "二"), + (0x3194, "M", "三"), + (0x3195, "M", "四"), + (0x3196, "M", "上"), + (0x3197, "M", "中"), + (0x3198, "M", "下"), + (0x3199, "M", "甲"), + (0x319A, "M", "乙"), + (0x319B, "M", "丙"), + (0x319C, "M", "丁"), + (0x319D, "M", "天"), + (0x319E, "M", "地"), + (0x319F, "M", "人"), + (0x31A0, "V"), + (0x31E4, "X"), + (0x31F0, "V"), + (0x3200, "3", "(ᄀ)"), + (0x3201, "3", "(ᄂ)"), + (0x3202, "3", "(ᄃ)"), + (0x3203, "3", "(ᄅ)"), + (0x3204, "3", "(ᄆ)"), + (0x3205, "3", "(ᄇ)"), + (0x3206, "3", "(ᄉ)"), + (0x3207, "3", "(ᄋ)"), + (0x3208, "3", "(ᄌ)"), + (0x3209, "3", "(ᄎ)"), + (0x320A, "3", "(ᄏ)"), + (0x320B, "3", "(ᄐ)"), + (0x320C, "3", "(ᄑ)"), + (0x320D, "3", "(ᄒ)"), + (0x320E, "3", "(가)"), + (0x320F, "3", "(나)"), + (0x3210, "3", "(다)"), + (0x3211, "3", "(라)"), + (0x3212, "3", "(마)"), + (0x3213, "3", "(바)"), + (0x3214, "3", "(사)"), + (0x3215, "3", "(아)"), + (0x3216, "3", "(자)"), + (0x3217, "3", "(차)"), + (0x3218, "3", "(카)"), + (0x3219, "3", "(타)"), + (0x321A, "3", "(파)"), + (0x321B, "3", "(하)"), + (0x321C, "3", "(주)"), + (0x321D, "3", "(오전)"), + (0x321E, "3", "(오후)"), + (0x321F, "X"), + (0x3220, "3", "(一)"), + (0x3221, "3", "(二)"), + (0x3222, "3", "(三)"), + (0x3223, "3", "(四)"), + (0x3224, "3", "(五)"), + (0x3225, "3", "(六)"), + (0x3226, "3", "(七)"), + (0x3227, "3", "(八)"), + (0x3228, "3", "(九)"), + (0x3229, "3", "(十)"), + (0x322A, "3", "(月)"), + (0x322B, "3", "(火)"), + (0x322C, "3", "(水)"), + (0x322D, "3", "(木)"), + (0x322E, "3", "(金)"), + (0x322F, "3", "(土)"), + (0x3230, "3", "(日)"), + (0x3231, "3", "(株)"), + (0x3232, "3", "(有)"), + (0x3233, "3", "(社)"), + (0x3234, "3", "(名)"), + (0x3235, "3", "(特)"), + (0x3236, "3", "(財)"), + (0x3237, "3", "(祝)"), + (0x3238, "3", "(労)"), + (0x3239, "3", "(代)"), + (0x323A, "3", "(呼)"), + (0x323B, "3", "(学)"), + (0x323C, "3", "(監)"), + (0x323D, "3", "(企)"), + (0x323E, "3", "(資)"), + (0x323F, "3", "(協)"), + (0x3240, "3", "(祭)"), + (0x3241, "3", "(休)"), + (0x3242, "3", "(自)"), + (0x3243, "3", "(至)"), + (0x3244, "M", "問"), + (0x3245, "M", "幼"), + (0x3246, "M", "文"), + (0x3247, "M", "箏"), + (0x3248, "V"), + (0x3250, "M", "pte"), + (0x3251, "M", "21"), ] + def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x3252, 'M', '22'), - (0x3253, 'M', '23'), - (0x3254, 'M', '24'), - (0x3255, 'M', '25'), - (0x3256, 'M', '26'), - (0x3257, 'M', '27'), - (0x3258, 'M', '28'), - (0x3259, 'M', '29'), - (0x325A, 'M', '30'), - (0x325B, 'M', '31'), - (0x325C, 'M', '32'), - (0x325D, 'M', '33'), - (0x325E, 'M', '34'), - (0x325F, 'M', '35'), - (0x3260, 'M', 'ᄀ'), - (0x3261, 'M', 'ᄂ'), - (0x3262, 'M', 'ᄃ'), - (0x3263, 'M', 'ᄅ'), - (0x3264, 'M', 'ᄆ'), - (0x3265, 'M', 'ᄇ'), - (0x3266, 'M', 'ᄉ'), - (0x3267, 'M', 'ᄋ'), - (0x3268, 'M', 'ᄌ'), - (0x3269, 'M', 'ᄎ'), - (0x326A, 'M', 'ᄏ'), - (0x326B, 'M', 'ᄐ'), - (0x326C, 'M', 'ᄑ'), - (0x326D, 'M', 'ᄒ'), - (0x326E, 'M', '가'), - (0x326F, 'M', '나'), - (0x3270, 'M', '다'), - (0x3271, 'M', '라'), - (0x3272, 'M', '마'), - (0x3273, 'M', '바'), - (0x3274, 'M', '사'), - (0x3275, 'M', '아'), - (0x3276, 'M', '자'), - (0x3277, 'M', '차'), - (0x3278, 'M', '카'), - (0x3279, 'M', '타'), - (0x327A, 'M', '파'), - (0x327B, 'M', '하'), - (0x327C, 'M', '참고'), - (0x327D, 'M', '주의'), - (0x327E, 'M', '우'), - (0x327F, 'V'), - (0x3280, 'M', '一'), - (0x3281, 'M', '二'), - (0x3282, 'M', '三'), - (0x3283, 'M', '四'), - (0x3284, 'M', '五'), - (0x3285, 'M', '六'), - (0x3286, 'M', '七'), - (0x3287, 'M', '八'), - (0x3288, 'M', '九'), - (0x3289, 'M', '十'), - (0x328A, 'M', '月'), - (0x328B, 'M', '火'), - (0x328C, 'M', '水'), - (0x328D, 'M', '木'), - (0x328E, 'M', '金'), - (0x328F, 'M', '土'), - (0x3290, 'M', '日'), - (0x3291, 'M', '株'), - (0x3292, 'M', '有'), - (0x3293, 'M', '社'), - (0x3294, 'M', '名'), - (0x3295, 'M', '特'), - (0x3296, 'M', '財'), - (0x3297, 'M', '祝'), - (0x3298, 'M', '労'), - (0x3299, 'M', '秘'), - (0x329A, 'M', '男'), - (0x329B, 'M', '女'), - (0x329C, 'M', '適'), - (0x329D, 'M', '優'), - (0x329E, 'M', '印'), - (0x329F, 'M', '注'), - (0x32A0, 'M', '項'), - (0x32A1, 'M', '休'), - (0x32A2, 'M', '写'), - (0x32A3, 'M', '正'), - (0x32A4, 'M', '上'), - (0x32A5, 'M', '中'), - (0x32A6, 'M', '下'), - (0x32A7, 'M', '左'), - (0x32A8, 'M', '右'), - (0x32A9, 'M', '医'), - (0x32AA, 'M', '宗'), - (0x32AB, 'M', '学'), - (0x32AC, 'M', '監'), - (0x32AD, 'M', '企'), - (0x32AE, 'M', '資'), - (0x32AF, 'M', '協'), - (0x32B0, 'M', '夜'), - (0x32B1, 'M', '36'), - (0x32B2, 'M', '37'), - (0x32B3, 'M', '38'), - (0x32B4, 'M', '39'), - (0x32B5, 'M', '40'), + (0x3252, "M", "22"), + (0x3253, "M", "23"), + (0x3254, "M", "24"), + (0x3255, "M", "25"), + (0x3256, "M", "26"), + (0x3257, "M", "27"), + (0x3258, "M", "28"), + (0x3259, "M", "29"), + (0x325A, "M", "30"), + (0x325B, "M", "31"), + (0x325C, "M", "32"), + (0x325D, "M", "33"), + (0x325E, "M", "34"), + (0x325F, "M", "35"), + (0x3260, "M", "ᄀ"), + (0x3261, "M", "ᄂ"), + (0x3262, "M", "ᄃ"), + (0x3263, "M", "ᄅ"), + (0x3264, "M", "ᄆ"), + (0x3265, "M", "ᄇ"), + (0x3266, "M", "ᄉ"), + (0x3267, "M", "ᄋ"), + (0x3268, "M", "ᄌ"), + (0x3269, "M", "ᄎ"), + (0x326A, "M", "ᄏ"), + (0x326B, "M", "ᄐ"), + (0x326C, "M", "ᄑ"), + (0x326D, "M", "ᄒ"), + (0x326E, "M", "가"), + (0x326F, "M", "나"), + (0x3270, "M", "다"), + (0x3271, "M", "라"), + (0x3272, "M", "마"), + (0x3273, "M", "바"), + (0x3274, "M", "사"), + (0x3275, "M", "아"), + (0x3276, "M", "자"), + (0x3277, "M", "차"), + (0x3278, "M", "카"), + (0x3279, "M", "타"), + (0x327A, "M", "파"), + (0x327B, "M", "하"), + (0x327C, "M", "참고"), + (0x327D, "M", "주의"), + (0x327E, "M", "우"), + (0x327F, "V"), + (0x3280, "M", "一"), + (0x3281, "M", "二"), + (0x3282, "M", "三"), + (0x3283, "M", "四"), + (0x3284, "M", "五"), + (0x3285, "M", "六"), + (0x3286, "M", "七"), + (0x3287, "M", "八"), + (0x3288, "M", "九"), + (0x3289, "M", "十"), + (0x328A, "M", "月"), + (0x328B, "M", "火"), + (0x328C, "M", "水"), + (0x328D, "M", "木"), + (0x328E, "M", "金"), + (0x328F, "M", "土"), + (0x3290, "M", "日"), + (0x3291, "M", "株"), + (0x3292, "M", "有"), + (0x3293, "M", "社"), + (0x3294, "M", "名"), + (0x3295, "M", "特"), + (0x3296, "M", "財"), + (0x3297, "M", "祝"), + (0x3298, "M", "労"), + (0x3299, "M", "秘"), + (0x329A, "M", "男"), + (0x329B, "M", "女"), + (0x329C, "M", "適"), + (0x329D, "M", "優"), + (0x329E, "M", "印"), + (0x329F, "M", "注"), + (0x32A0, "M", "項"), + (0x32A1, "M", "休"), + (0x32A2, "M", "写"), + (0x32A3, "M", "正"), + (0x32A4, "M", "上"), + (0x32A5, "M", "中"), + (0x32A6, "M", "下"), + (0x32A7, "M", "左"), + (0x32A8, "M", "右"), + (0x32A9, "M", "医"), + (0x32AA, "M", "宗"), + (0x32AB, "M", "学"), + (0x32AC, "M", "監"), + (0x32AD, "M", "企"), + (0x32AE, "M", "資"), + (0x32AF, "M", "協"), + (0x32B0, "M", "夜"), + (0x32B1, "M", "36"), + (0x32B2, "M", "37"), + (0x32B3, "M", "38"), + (0x32B4, "M", "39"), + (0x32B5, "M", "40"), ] + def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x32B6, 'M', '41'), - (0x32B7, 'M', '42'), - (0x32B8, 'M', '43'), - (0x32B9, 'M', '44'), - (0x32BA, 'M', '45'), - (0x32BB, 'M', '46'), - (0x32BC, 'M', '47'), - (0x32BD, 'M', '48'), - (0x32BE, 'M', '49'), - (0x32BF, 'M', '50'), - (0x32C0, 'M', '1月'), - (0x32C1, 'M', '2月'), - (0x32C2, 'M', '3月'), - (0x32C3, 'M', '4月'), - (0x32C4, 'M', '5月'), - (0x32C5, 'M', '6月'), - (0x32C6, 'M', '7月'), - (0x32C7, 'M', '8月'), - (0x32C8, 'M', '9月'), - (0x32C9, 'M', '10月'), - (0x32CA, 'M', '11月'), - (0x32CB, 'M', '12月'), - (0x32CC, 'M', 'hg'), - (0x32CD, 'M', 'erg'), - (0x32CE, 'M', 'ev'), - (0x32CF, 'M', 'ltd'), - (0x32D0, 'M', 'ア'), - (0x32D1, 'M', 'イ'), - (0x32D2, 'M', 'ウ'), - (0x32D3, 'M', 'エ'), - (0x32D4, 'M', 'オ'), - (0x32D5, 'M', 'カ'), - (0x32D6, 'M', 'キ'), - (0x32D7, 'M', 'ク'), - (0x32D8, 'M', 'ケ'), - (0x32D9, 'M', 'コ'), - (0x32DA, 'M', 'サ'), - (0x32DB, 'M', 'シ'), - (0x32DC, 'M', 'ス'), - (0x32DD, 'M', 'セ'), - (0x32DE, 'M', 'ソ'), - (0x32DF, 'M', 'タ'), - (0x32E0, 'M', 'チ'), - (0x32E1, 'M', 'ツ'), - (0x32E2, 'M', 'テ'), - (0x32E3, 'M', 'ト'), - (0x32E4, 'M', 'ナ'), - (0x32E5, 'M', 'ニ'), - (0x32E6, 'M', 'ヌ'), - (0x32E7, 'M', 'ネ'), - (0x32E8, 'M', 'ノ'), - (0x32E9, 'M', 'ハ'), - (0x32EA, 'M', 'ヒ'), - (0x32EB, 'M', 'フ'), - (0x32EC, 'M', 'ヘ'), - (0x32ED, 'M', 'ホ'), - (0x32EE, 'M', 'マ'), - (0x32EF, 'M', 'ミ'), - (0x32F0, 'M', 'ム'), - (0x32F1, 'M', 'メ'), - (0x32F2, 'M', 'モ'), - (0x32F3, 'M', 'ヤ'), - (0x32F4, 'M', 'ユ'), - (0x32F5, 'M', 'ヨ'), - (0x32F6, 'M', 'ラ'), - (0x32F7, 'M', 'リ'), - (0x32F8, 'M', 'ル'), - (0x32F9, 'M', 'レ'), - (0x32FA, 'M', 'ロ'), - (0x32FB, 'M', 'ワ'), - (0x32FC, 'M', 'ヰ'), - (0x32FD, 'M', 'ヱ'), - (0x32FE, 'M', 'ヲ'), - (0x32FF, 'M', '令和'), - (0x3300, 'M', 'アパート'), - (0x3301, 'M', 'アルファ'), - (0x3302, 'M', 'アンペア'), - (0x3303, 'M', 'アール'), - (0x3304, 'M', 'イニング'), - (0x3305, 'M', 'インチ'), - (0x3306, 'M', 'ウォン'), - (0x3307, 'M', 'エスクード'), - (0x3308, 'M', 'エーカー'), - (0x3309, 'M', 'オンス'), - (0x330A, 'M', 'オーム'), - (0x330B, 'M', 'カイリ'), - (0x330C, 'M', 'カラット'), - (0x330D, 'M', 'カロリー'), - (0x330E, 'M', 'ガロン'), - (0x330F, 'M', 'ガンマ'), - (0x3310, 'M', 'ギガ'), - (0x3311, 'M', 'ギニー'), - (0x3312, 'M', 'キュリー'), - (0x3313, 'M', 'ギルダー'), - (0x3314, 'M', 'キロ'), - (0x3315, 'M', 'キログラム'), - (0x3316, 'M', 'キロメートル'), - (0x3317, 'M', 'キロワット'), - (0x3318, 'M', 'グラム'), - (0x3319, 'M', 'グラムトン'), + (0x32B6, "M", "41"), + (0x32B7, "M", "42"), + (0x32B8, "M", "43"), + (0x32B9, "M", "44"), + (0x32BA, "M", "45"), + (0x32BB, "M", "46"), + (0x32BC, "M", "47"), + (0x32BD, "M", "48"), + (0x32BE, "M", "49"), + (0x32BF, "M", "50"), + (0x32C0, "M", "1月"), + (0x32C1, "M", "2月"), + (0x32C2, "M", "3月"), + (0x32C3, "M", "4月"), + (0x32C4, "M", "5月"), + (0x32C5, "M", "6月"), + (0x32C6, "M", "7月"), + (0x32C7, "M", "8月"), + (0x32C8, "M", "9月"), + (0x32C9, "M", "10月"), + (0x32CA, "M", "11月"), + (0x32CB, "M", "12月"), + (0x32CC, "M", "hg"), + (0x32CD, "M", "erg"), + (0x32CE, "M", "ev"), + (0x32CF, "M", "ltd"), + (0x32D0, "M", "ア"), + (0x32D1, "M", "イ"), + (0x32D2, "M", "ウ"), + (0x32D3, "M", "エ"), + (0x32D4, "M", "オ"), + (0x32D5, "M", "カ"), + (0x32D6, "M", "キ"), + (0x32D7, "M", "ク"), + (0x32D8, "M", "ケ"), + (0x32D9, "M", "コ"), + (0x32DA, "M", "サ"), + (0x32DB, "M", "シ"), + (0x32DC, "M", "ス"), + (0x32DD, "M", "セ"), + (0x32DE, "M", "ソ"), + (0x32DF, "M", "タ"), + (0x32E0, "M", "チ"), + (0x32E1, "M", "ツ"), + (0x32E2, "M", "テ"), + (0x32E3, "M", "ト"), + (0x32E4, "M", "ナ"), + (0x32E5, "M", "ニ"), + (0x32E6, "M", "ヌ"), + (0x32E7, "M", "ネ"), + (0x32E8, "M", "ノ"), + (0x32E9, "M", "ハ"), + (0x32EA, "M", "ヒ"), + (0x32EB, "M", "フ"), + (0x32EC, "M", "ヘ"), + (0x32ED, "M", "ホ"), + (0x32EE, "M", "マ"), + (0x32EF, "M", "ミ"), + (0x32F0, "M", "ム"), + (0x32F1, "M", "メ"), + (0x32F2, "M", "モ"), + (0x32F3, "M", "ヤ"), + (0x32F4, "M", "ユ"), + (0x32F5, "M", "ヨ"), + (0x32F6, "M", "ラ"), + (0x32F7, "M", "リ"), + (0x32F8, "M", "ル"), + (0x32F9, "M", "レ"), + (0x32FA, "M", "ロ"), + (0x32FB, "M", "ワ"), + (0x32FC, "M", "ヰ"), + (0x32FD, "M", "ヱ"), + (0x32FE, "M", "ヲ"), + (0x32FF, "M", "令和"), + (0x3300, "M", "アパート"), + (0x3301, "M", "アルファ"), + (0x3302, "M", "アンペア"), + (0x3303, "M", "アール"), + (0x3304, "M", "イニング"), + (0x3305, "M", "インチ"), + (0x3306, "M", "ウォン"), + (0x3307, "M", "エスクード"), + (0x3308, "M", "エーカー"), + (0x3309, "M", "オンス"), + (0x330A, "M", "オーム"), + (0x330B, "M", "カイリ"), + (0x330C, "M", "カラット"), + (0x330D, "M", "カロリー"), + (0x330E, "M", "ガロン"), + (0x330F, "M", "ガンマ"), + (0x3310, "M", "ギガ"), + (0x3311, "M", "ギニー"), + (0x3312, "M", "キュリー"), + (0x3313, "M", "ギルダー"), + (0x3314, "M", "キロ"), + (0x3315, "M", "キログラム"), + (0x3316, "M", "キロメートル"), + (0x3317, "M", "キロワット"), + (0x3318, "M", "グラム"), + (0x3319, "M", "グラムトン"), ] + def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x331A, 'M', 'クルゼイロ'), - (0x331B, 'M', 'クローネ'), - (0x331C, 'M', 'ケース'), - (0x331D, 'M', 'コルナ'), - (0x331E, 'M', 'コーポ'), - (0x331F, 'M', 'サイクル'), - (0x3320, 'M', 'サンチーム'), - (0x3321, 'M', 'シリング'), - (0x3322, 'M', 'センチ'), - (0x3323, 'M', 'セント'), - (0x3324, 'M', 'ダース'), - (0x3325, 'M', 'デシ'), - (0x3326, 'M', 'ドル'), - (0x3327, 'M', 'トン'), - (0x3328, 'M', 'ナノ'), - (0x3329, 'M', 'ノット'), - (0x332A, 'M', 'ハイツ'), - (0x332B, 'M', 'パーセント'), - (0x332C, 'M', 'パーツ'), - (0x332D, 'M', 'バーレル'), - (0x332E, 'M', 'ピアストル'), - (0x332F, 'M', 'ピクル'), - (0x3330, 'M', 'ピコ'), - (0x3331, 'M', 'ビル'), - (0x3332, 'M', 'ファラッド'), - (0x3333, 'M', 'フィート'), - (0x3334, 'M', 'ブッシェル'), - (0x3335, 'M', 'フラン'), - (0x3336, 'M', 'ヘクタール'), - (0x3337, 'M', 'ペソ'), - (0x3338, 'M', 'ペニヒ'), - (0x3339, 'M', 'ヘルツ'), - (0x333A, 'M', 'ペンス'), - (0x333B, 'M', 'ページ'), - (0x333C, 'M', 'ベータ'), - (0x333D, 'M', 'ポイント'), - (0x333E, 'M', 'ボルト'), - (0x333F, 'M', 'ホン'), - (0x3340, 'M', 'ポンド'), - (0x3341, 'M', 'ホール'), - (0x3342, 'M', 'ホーン'), - (0x3343, 'M', 'マイクロ'), - (0x3344, 'M', 'マイル'), - (0x3345, 'M', 'マッハ'), - (0x3346, 'M', 'マルク'), - (0x3347, 'M', 'マンション'), - (0x3348, 'M', 'ミクロン'), - (0x3349, 'M', 'ミリ'), - (0x334A, 'M', 'ミリバール'), - (0x334B, 'M', 'メガ'), - (0x334C, 'M', 'メガトン'), - (0x334D, 'M', 'メートル'), - (0x334E, 'M', 'ヤード'), - (0x334F, 'M', 'ヤール'), - (0x3350, 'M', 'ユアン'), - (0x3351, 'M', 'リットル'), - (0x3352, 'M', 'リラ'), - (0x3353, 'M', 'ルピー'), - (0x3354, 'M', 'ルーブル'), - (0x3355, 'M', 'レム'), - (0x3356, 'M', 'レントゲン'), - (0x3357, 'M', 'ワット'), - (0x3358, 'M', '0点'), - (0x3359, 'M', '1点'), - (0x335A, 'M', '2点'), - (0x335B, 'M', '3点'), - (0x335C, 'M', '4点'), - (0x335D, 'M', '5点'), - (0x335E, 'M', '6点'), - (0x335F, 'M', '7点'), - (0x3360, 'M', '8点'), - (0x3361, 'M', '9点'), - (0x3362, 'M', '10点'), - (0x3363, 'M', '11点'), - (0x3364, 'M', '12点'), - (0x3365, 'M', '13点'), - (0x3366, 'M', '14点'), - (0x3367, 'M', '15点'), - (0x3368, 'M', '16点'), - (0x3369, 'M', '17点'), - (0x336A, 'M', '18点'), - (0x336B, 'M', '19点'), - (0x336C, 'M', '20点'), - (0x336D, 'M', '21点'), - (0x336E, 'M', '22点'), - (0x336F, 'M', '23点'), - (0x3370, 'M', '24点'), - (0x3371, 'M', 'hpa'), - (0x3372, 'M', 'da'), - (0x3373, 'M', 'au'), - (0x3374, 'M', 'bar'), - (0x3375, 'M', 'ov'), - (0x3376, 'M', 'pc'), - (0x3377, 'M', 'dm'), - (0x3378, 'M', 'dm2'), - (0x3379, 'M', 'dm3'), - (0x337A, 'M', 'iu'), - (0x337B, 'M', '平成'), - (0x337C, 'M', '昭和'), - (0x337D, 'M', '大正'), + (0x331A, "M", "クルゼイロ"), + (0x331B, "M", "クローネ"), + (0x331C, "M", "ケース"), + (0x331D, "M", "コルナ"), + (0x331E, "M", "コーポ"), + (0x331F, "M", "サイクル"), + (0x3320, "M", "サンチーム"), + (0x3321, "M", "シリング"), + (0x3322, "M", "センチ"), + (0x3323, "M", "セント"), + (0x3324, "M", "ダース"), + (0x3325, "M", "デシ"), + (0x3326, "M", "ドル"), + (0x3327, "M", "トン"), + (0x3328, "M", "ナノ"), + (0x3329, "M", "ノット"), + (0x332A, "M", "ハイツ"), + (0x332B, "M", "パーセント"), + (0x332C, "M", "パーツ"), + (0x332D, "M", "バーレル"), + (0x332E, "M", "ピアストル"), + (0x332F, "M", "ピクル"), + (0x3330, "M", "ピコ"), + (0x3331, "M", "ビル"), + (0x3332, "M", "ファラッド"), + (0x3333, "M", "フィート"), + (0x3334, "M", "ブッシェル"), + (0x3335, "M", "フラン"), + (0x3336, "M", "ヘクタール"), + (0x3337, "M", "ペソ"), + (0x3338, "M", "ペニヒ"), + (0x3339, "M", "ヘルツ"), + (0x333A, "M", "ペンス"), + (0x333B, "M", "ページ"), + (0x333C, "M", "ベータ"), + (0x333D, "M", "ポイント"), + (0x333E, "M", "ボルト"), + (0x333F, "M", "ホン"), + (0x3340, "M", "ポンド"), + (0x3341, "M", "ホール"), + (0x3342, "M", "ホーン"), + (0x3343, "M", "マイクロ"), + (0x3344, "M", "マイル"), + (0x3345, "M", "マッハ"), + (0x3346, "M", "マルク"), + (0x3347, "M", "マンション"), + (0x3348, "M", "ミクロン"), + (0x3349, "M", "ミリ"), + (0x334A, "M", "ミリバール"), + (0x334B, "M", "メガ"), + (0x334C, "M", "メガトン"), + (0x334D, "M", "メートル"), + (0x334E, "M", "ヤード"), + (0x334F, "M", "ヤール"), + (0x3350, "M", "ユアン"), + (0x3351, "M", "リットル"), + (0x3352, "M", "リラ"), + (0x3353, "M", "ルピー"), + (0x3354, "M", "ルーブル"), + (0x3355, "M", "レム"), + (0x3356, "M", "レントゲン"), + (0x3357, "M", "ワット"), + (0x3358, "M", "0点"), + (0x3359, "M", "1点"), + (0x335A, "M", "2点"), + (0x335B, "M", "3点"), + (0x335C, "M", "4点"), + (0x335D, "M", "5点"), + (0x335E, "M", "6点"), + (0x335F, "M", "7点"), + (0x3360, "M", "8点"), + (0x3361, "M", "9点"), + (0x3362, "M", "10点"), + (0x3363, "M", "11点"), + (0x3364, "M", "12点"), + (0x3365, "M", "13点"), + (0x3366, "M", "14点"), + (0x3367, "M", "15点"), + (0x3368, "M", "16点"), + (0x3369, "M", "17点"), + (0x336A, "M", "18点"), + (0x336B, "M", "19点"), + (0x336C, "M", "20点"), + (0x336D, "M", "21点"), + (0x336E, "M", "22点"), + (0x336F, "M", "23点"), + (0x3370, "M", "24点"), + (0x3371, "M", "hpa"), + (0x3372, "M", "da"), + (0x3373, "M", "au"), + (0x3374, "M", "bar"), + (0x3375, "M", "ov"), + (0x3376, "M", "pc"), + (0x3377, "M", "dm"), + (0x3378, "M", "dm2"), + (0x3379, "M", "dm3"), + (0x337A, "M", "iu"), + (0x337B, "M", "平成"), + (0x337C, "M", "昭和"), + (0x337D, "M", "大正"), ] + def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x337E, 'M', '明治'), - (0x337F, 'M', '株式会社'), - (0x3380, 'M', 'pa'), - (0x3381, 'M', 'na'), - (0x3382, 'M', 'μa'), - (0x3383, 'M', 'ma'), - (0x3384, 'M', 'ka'), - (0x3385, 'M', 'kb'), - (0x3386, 'M', 'mb'), - (0x3387, 'M', 'gb'), - (0x3388, 'M', 'cal'), - (0x3389, 'M', 'kcal'), - (0x338A, 'M', 'pf'), - (0x338B, 'M', 'nf'), - (0x338C, 'M', 'μf'), - (0x338D, 'M', 'μg'), - (0x338E, 'M', 'mg'), - (0x338F, 'M', 'kg'), - (0x3390, 'M', 'hz'), - (0x3391, 'M', 'khz'), - (0x3392, 'M', 'mhz'), - (0x3393, 'M', 'ghz'), - (0x3394, 'M', 'thz'), - (0x3395, 'M', 'μl'), - (0x3396, 'M', 'ml'), - (0x3397, 'M', 'dl'), - (0x3398, 'M', 'kl'), - (0x3399, 'M', 'fm'), - (0x339A, 'M', 'nm'), - (0x339B, 'M', 'μm'), - (0x339C, 'M', 'mm'), - (0x339D, 'M', 'cm'), - (0x339E, 'M', 'km'), - (0x339F, 'M', 'mm2'), - (0x33A0, 'M', 'cm2'), - (0x33A1, 'M', 'm2'), - (0x33A2, 'M', 'km2'), - (0x33A3, 'M', 'mm3'), - (0x33A4, 'M', 'cm3'), - (0x33A5, 'M', 'm3'), - (0x33A6, 'M', 'km3'), - (0x33A7, 'M', 'm∕s'), - (0x33A8, 'M', 'm∕s2'), - (0x33A9, 'M', 'pa'), - (0x33AA, 'M', 'kpa'), - (0x33AB, 'M', 'mpa'), - (0x33AC, 'M', 'gpa'), - (0x33AD, 'M', 'rad'), - (0x33AE, 'M', 'rad∕s'), - (0x33AF, 'M', 'rad∕s2'), - (0x33B0, 'M', 'ps'), - (0x33B1, 'M', 'ns'), - (0x33B2, 'M', 'μs'), - (0x33B3, 'M', 'ms'), - (0x33B4, 'M', 'pv'), - (0x33B5, 'M', 'nv'), - (0x33B6, 'M', 'μv'), - (0x33B7, 'M', 'mv'), - (0x33B8, 'M', 'kv'), - (0x33B9, 'M', 'mv'), - (0x33BA, 'M', 'pw'), - (0x33BB, 'M', 'nw'), - (0x33BC, 'M', 'μw'), - (0x33BD, 'M', 'mw'), - (0x33BE, 'M', 'kw'), - (0x33BF, 'M', 'mw'), - (0x33C0, 'M', 'kω'), - (0x33C1, 'M', 'mω'), - (0x33C2, 'X'), - (0x33C3, 'M', 'bq'), - (0x33C4, 'M', 'cc'), - (0x33C5, 'M', 'cd'), - (0x33C6, 'M', 'c∕kg'), - (0x33C7, 'X'), - (0x33C8, 'M', 'db'), - (0x33C9, 'M', 'gy'), - (0x33CA, 'M', 'ha'), - (0x33CB, 'M', 'hp'), - (0x33CC, 'M', 'in'), - (0x33CD, 'M', 'kk'), - (0x33CE, 'M', 'km'), - (0x33CF, 'M', 'kt'), - (0x33D0, 'M', 'lm'), - (0x33D1, 'M', 'ln'), - (0x33D2, 'M', 'log'), - (0x33D3, 'M', 'lx'), - (0x33D4, 'M', 'mb'), - (0x33D5, 'M', 'mil'), - (0x33D6, 'M', 'mol'), - (0x33D7, 'M', 'ph'), - (0x33D8, 'X'), - (0x33D9, 'M', 'ppm'), - (0x33DA, 'M', 'pr'), - (0x33DB, 'M', 'sr'), - (0x33DC, 'M', 'sv'), - (0x33DD, 'M', 'wb'), - (0x33DE, 'M', 'v∕m'), - (0x33DF, 'M', 'a∕m'), - (0x33E0, 'M', '1日'), - (0x33E1, 'M', '2日'), + (0x337E, "M", "明治"), + (0x337F, "M", "株式会社"), + (0x3380, "M", "pa"), + (0x3381, "M", "na"), + (0x3382, "M", "μa"), + (0x3383, "M", "ma"), + (0x3384, "M", "ka"), + (0x3385, "M", "kb"), + (0x3386, "M", "mb"), + (0x3387, "M", "gb"), + (0x3388, "M", "cal"), + (0x3389, "M", "kcal"), + (0x338A, "M", "pf"), + (0x338B, "M", "nf"), + (0x338C, "M", "μf"), + (0x338D, "M", "μg"), + (0x338E, "M", "mg"), + (0x338F, "M", "kg"), + (0x3390, "M", "hz"), + (0x3391, "M", "khz"), + (0x3392, "M", "mhz"), + (0x3393, "M", "ghz"), + (0x3394, "M", "thz"), + (0x3395, "M", "μl"), + (0x3396, "M", "ml"), + (0x3397, "M", "dl"), + (0x3398, "M", "kl"), + (0x3399, "M", "fm"), + (0x339A, "M", "nm"), + (0x339B, "M", "μm"), + (0x339C, "M", "mm"), + (0x339D, "M", "cm"), + (0x339E, "M", "km"), + (0x339F, "M", "mm2"), + (0x33A0, "M", "cm2"), + (0x33A1, "M", "m2"), + (0x33A2, "M", "km2"), + (0x33A3, "M", "mm3"), + (0x33A4, "M", "cm3"), + (0x33A5, "M", "m3"), + (0x33A6, "M", "km3"), + (0x33A7, "M", "m∕s"), + (0x33A8, "M", "m∕s2"), + (0x33A9, "M", "pa"), + (0x33AA, "M", "kpa"), + (0x33AB, "M", "mpa"), + (0x33AC, "M", "gpa"), + (0x33AD, "M", "rad"), + (0x33AE, "M", "rad∕s"), + (0x33AF, "M", "rad∕s2"), + (0x33B0, "M", "ps"), + (0x33B1, "M", "ns"), + (0x33B2, "M", "μs"), + (0x33B3, "M", "ms"), + (0x33B4, "M", "pv"), + (0x33B5, "M", "nv"), + (0x33B6, "M", "μv"), + (0x33B7, "M", "mv"), + (0x33B8, "M", "kv"), + (0x33B9, "M", "mv"), + (0x33BA, "M", "pw"), + (0x33BB, "M", "nw"), + (0x33BC, "M", "μw"), + (0x33BD, "M", "mw"), + (0x33BE, "M", "kw"), + (0x33BF, "M", "mw"), + (0x33C0, "M", "kω"), + (0x33C1, "M", "mω"), + (0x33C2, "X"), + (0x33C3, "M", "bq"), + (0x33C4, "M", "cc"), + (0x33C5, "M", "cd"), + (0x33C6, "M", "c∕kg"), + (0x33C7, "X"), + (0x33C8, "M", "db"), + (0x33C9, "M", "gy"), + (0x33CA, "M", "ha"), + (0x33CB, "M", "hp"), + (0x33CC, "M", "in"), + (0x33CD, "M", "kk"), + (0x33CE, "M", "km"), + (0x33CF, "M", "kt"), + (0x33D0, "M", "lm"), + (0x33D1, "M", "ln"), + (0x33D2, "M", "log"), + (0x33D3, "M", "lx"), + (0x33D4, "M", "mb"), + (0x33D5, "M", "mil"), + (0x33D6, "M", "mol"), + (0x33D7, "M", "ph"), + (0x33D8, "X"), + (0x33D9, "M", "ppm"), + (0x33DA, "M", "pr"), + (0x33DB, "M", "sr"), + (0x33DC, "M", "sv"), + (0x33DD, "M", "wb"), + (0x33DE, "M", "v∕m"), + (0x33DF, "M", "a∕m"), + (0x33E0, "M", "1日"), + (0x33E1, "M", "2日"), ] + def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x33E2, 'M', '3日'), - (0x33E3, 'M', '4日'), - (0x33E4, 'M', '5日'), - (0x33E5, 'M', '6日'), - (0x33E6, 'M', '7日'), - (0x33E7, 'M', '8日'), - (0x33E8, 'M', '9日'), - (0x33E9, 'M', '10日'), - (0x33EA, 'M', '11日'), - (0x33EB, 'M', '12日'), - (0x33EC, 'M', '13日'), - (0x33ED, 'M', '14日'), - (0x33EE, 'M', '15日'), - (0x33EF, 'M', '16日'), - (0x33F0, 'M', '17日'), - (0x33F1, 'M', '18日'), - (0x33F2, 'M', '19日'), - (0x33F3, 'M', '20日'), - (0x33F4, 'M', '21日'), - (0x33F5, 'M', '22日'), - (0x33F6, 'M', '23日'), - (0x33F7, 'M', '24日'), - (0x33F8, 'M', '25日'), - (0x33F9, 'M', '26日'), - (0x33FA, 'M', '27日'), - (0x33FB, 'M', '28日'), - (0x33FC, 'M', '29日'), - (0x33FD, 'M', '30日'), - (0x33FE, 'M', '31日'), - (0x33FF, 'M', 'gal'), - (0x3400, 'V'), - (0xA48D, 'X'), - (0xA490, 'V'), - (0xA4C7, 'X'), - (0xA4D0, 'V'), - (0xA62C, 'X'), - (0xA640, 'M', 'ꙁ'), - (0xA641, 'V'), - (0xA642, 'M', 'ꙃ'), - (0xA643, 'V'), - (0xA644, 'M', 'ꙅ'), - (0xA645, 'V'), - (0xA646, 'M', 'ꙇ'), - (0xA647, 'V'), - (0xA648, 'M', 'ꙉ'), - (0xA649, 'V'), - (0xA64A, 'M', 'ꙋ'), - (0xA64B, 'V'), - (0xA64C, 'M', 'ꙍ'), - (0xA64D, 'V'), - (0xA64E, 'M', 'ꙏ'), - (0xA64F, 'V'), - (0xA650, 'M', 'ꙑ'), - (0xA651, 'V'), - (0xA652, 'M', 'ꙓ'), - (0xA653, 'V'), - (0xA654, 'M', 'ꙕ'), - (0xA655, 'V'), - (0xA656, 'M', 'ꙗ'), - (0xA657, 'V'), - (0xA658, 'M', 'ꙙ'), - (0xA659, 'V'), - (0xA65A, 'M', 'ꙛ'), - (0xA65B, 'V'), - (0xA65C, 'M', 'ꙝ'), - (0xA65D, 'V'), - (0xA65E, 'M', 'ꙟ'), - (0xA65F, 'V'), - (0xA660, 'M', 'ꙡ'), - (0xA661, 'V'), - (0xA662, 'M', 'ꙣ'), - (0xA663, 'V'), - (0xA664, 'M', 'ꙥ'), - (0xA665, 'V'), - (0xA666, 'M', 'ꙧ'), - (0xA667, 'V'), - (0xA668, 'M', 'ꙩ'), - (0xA669, 'V'), - (0xA66A, 'M', 'ꙫ'), - (0xA66B, 'V'), - (0xA66C, 'M', 'ꙭ'), - (0xA66D, 'V'), - (0xA680, 'M', 'ꚁ'), - (0xA681, 'V'), - (0xA682, 'M', 'ꚃ'), - (0xA683, 'V'), - (0xA684, 'M', 'ꚅ'), - (0xA685, 'V'), - (0xA686, 'M', 'ꚇ'), - (0xA687, 'V'), - (0xA688, 'M', 'ꚉ'), - (0xA689, 'V'), - (0xA68A, 'M', 'ꚋ'), - (0xA68B, 'V'), - (0xA68C, 'M', 'ꚍ'), - (0xA68D, 'V'), - (0xA68E, 'M', 'ꚏ'), - (0xA68F, 'V'), - (0xA690, 'M', 'ꚑ'), - (0xA691, 'V'), + (0x33E2, "M", "3日"), + (0x33E3, "M", "4日"), + (0x33E4, "M", "5日"), + (0x33E5, "M", "6日"), + (0x33E6, "M", "7日"), + (0x33E7, "M", "8日"), + (0x33E8, "M", "9日"), + (0x33E9, "M", "10日"), + (0x33EA, "M", "11日"), + (0x33EB, "M", "12日"), + (0x33EC, "M", "13日"), + (0x33ED, "M", "14日"), + (0x33EE, "M", "15日"), + (0x33EF, "M", "16日"), + (0x33F0, "M", "17日"), + (0x33F1, "M", "18日"), + (0x33F2, "M", "19日"), + (0x33F3, "M", "20日"), + (0x33F4, "M", "21日"), + (0x33F5, "M", "22日"), + (0x33F6, "M", "23日"), + (0x33F7, "M", "24日"), + (0x33F8, "M", "25日"), + (0x33F9, "M", "26日"), + (0x33FA, "M", "27日"), + (0x33FB, "M", "28日"), + (0x33FC, "M", "29日"), + (0x33FD, "M", "30日"), + (0x33FE, "M", "31日"), + (0x33FF, "M", "gal"), + (0x3400, "V"), + (0xA48D, "X"), + (0xA490, "V"), + (0xA4C7, "X"), + (0xA4D0, "V"), + (0xA62C, "X"), + (0xA640, "M", "ꙁ"), + (0xA641, "V"), + (0xA642, "M", "ꙃ"), + (0xA643, "V"), + (0xA644, "M", "ꙅ"), + (0xA645, "V"), + (0xA646, "M", "ꙇ"), + (0xA647, "V"), + (0xA648, "M", "ꙉ"), + (0xA649, "V"), + (0xA64A, "M", "ꙋ"), + (0xA64B, "V"), + (0xA64C, "M", "ꙍ"), + (0xA64D, "V"), + (0xA64E, "M", "ꙏ"), + (0xA64F, "V"), + (0xA650, "M", "ꙑ"), + (0xA651, "V"), + (0xA652, "M", "ꙓ"), + (0xA653, "V"), + (0xA654, "M", "ꙕ"), + (0xA655, "V"), + (0xA656, "M", "ꙗ"), + (0xA657, "V"), + (0xA658, "M", "ꙙ"), + (0xA659, "V"), + (0xA65A, "M", "ꙛ"), + (0xA65B, "V"), + (0xA65C, "M", "ꙝ"), + (0xA65D, "V"), + (0xA65E, "M", "ꙟ"), + (0xA65F, "V"), + (0xA660, "M", "ꙡ"), + (0xA661, "V"), + (0xA662, "M", "ꙣ"), + (0xA663, "V"), + (0xA664, "M", "ꙥ"), + (0xA665, "V"), + (0xA666, "M", "ꙧ"), + (0xA667, "V"), + (0xA668, "M", "ꙩ"), + (0xA669, "V"), + (0xA66A, "M", "ꙫ"), + (0xA66B, "V"), + (0xA66C, "M", "ꙭ"), + (0xA66D, "V"), + (0xA680, "M", "ꚁ"), + (0xA681, "V"), + (0xA682, "M", "ꚃ"), + (0xA683, "V"), + (0xA684, "M", "ꚅ"), + (0xA685, "V"), + (0xA686, "M", "ꚇ"), + (0xA687, "V"), + (0xA688, "M", "ꚉ"), + (0xA689, "V"), + (0xA68A, "M", "ꚋ"), + (0xA68B, "V"), + (0xA68C, "M", "ꚍ"), + (0xA68D, "V"), + (0xA68E, "M", "ꚏ"), + (0xA68F, "V"), + (0xA690, "M", "ꚑ"), + (0xA691, "V"), ] + def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xA692, 'M', 'ꚓ'), - (0xA693, 'V'), - (0xA694, 'M', 'ꚕ'), - (0xA695, 'V'), - (0xA696, 'M', 'ꚗ'), - (0xA697, 'V'), - (0xA698, 'M', 'ꚙ'), - (0xA699, 'V'), - (0xA69A, 'M', 'ꚛ'), - (0xA69B, 'V'), - (0xA69C, 'M', 'ъ'), - (0xA69D, 'M', 'ь'), - (0xA69E, 'V'), - (0xA6F8, 'X'), - (0xA700, 'V'), - (0xA722, 'M', 'ꜣ'), - (0xA723, 'V'), - (0xA724, 'M', 'ꜥ'), - (0xA725, 'V'), - (0xA726, 'M', 'ꜧ'), - (0xA727, 'V'), - (0xA728, 'M', 'ꜩ'), - (0xA729, 'V'), - (0xA72A, 'M', 'ꜫ'), - (0xA72B, 'V'), - (0xA72C, 'M', 'ꜭ'), - (0xA72D, 'V'), - (0xA72E, 'M', 'ꜯ'), - (0xA72F, 'V'), - (0xA732, 'M', 'ꜳ'), - (0xA733, 'V'), - (0xA734, 'M', 'ꜵ'), - (0xA735, 'V'), - (0xA736, 'M', 'ꜷ'), - (0xA737, 'V'), - (0xA738, 'M', 'ꜹ'), - (0xA739, 'V'), - (0xA73A, 'M', 'ꜻ'), - (0xA73B, 'V'), - (0xA73C, 'M', 'ꜽ'), - (0xA73D, 'V'), - (0xA73E, 'M', 'ꜿ'), - (0xA73F, 'V'), - (0xA740, 'M', 'ꝁ'), - (0xA741, 'V'), - (0xA742, 'M', 'ꝃ'), - (0xA743, 'V'), - (0xA744, 'M', 'ꝅ'), - (0xA745, 'V'), - (0xA746, 'M', 'ꝇ'), - (0xA747, 'V'), - (0xA748, 'M', 'ꝉ'), - (0xA749, 'V'), - (0xA74A, 'M', 'ꝋ'), - (0xA74B, 'V'), - (0xA74C, 'M', 'ꝍ'), - (0xA74D, 'V'), - (0xA74E, 'M', 'ꝏ'), - (0xA74F, 'V'), - (0xA750, 'M', 'ꝑ'), - (0xA751, 'V'), - (0xA752, 'M', 'ꝓ'), - (0xA753, 'V'), - (0xA754, 'M', 'ꝕ'), - (0xA755, 'V'), - (0xA756, 'M', 'ꝗ'), - (0xA757, 'V'), - (0xA758, 'M', 'ꝙ'), - (0xA759, 'V'), - (0xA75A, 'M', 'ꝛ'), - (0xA75B, 'V'), - (0xA75C, 'M', 'ꝝ'), - (0xA75D, 'V'), - (0xA75E, 'M', 'ꝟ'), - (0xA75F, 'V'), - (0xA760, 'M', 'ꝡ'), - (0xA761, 'V'), - (0xA762, 'M', 'ꝣ'), - (0xA763, 'V'), - (0xA764, 'M', 'ꝥ'), - (0xA765, 'V'), - (0xA766, 'M', 'ꝧ'), - (0xA767, 'V'), - (0xA768, 'M', 'ꝩ'), - (0xA769, 'V'), - (0xA76A, 'M', 'ꝫ'), - (0xA76B, 'V'), - (0xA76C, 'M', 'ꝭ'), - (0xA76D, 'V'), - (0xA76E, 'M', 'ꝯ'), - (0xA76F, 'V'), - (0xA770, 'M', 'ꝯ'), - (0xA771, 'V'), - (0xA779, 'M', 'ꝺ'), - (0xA77A, 'V'), - (0xA77B, 'M', 'ꝼ'), - (0xA77C, 'V'), - (0xA77D, 'M', 'ᵹ'), - (0xA77E, 'M', 'ꝿ'), - (0xA77F, 'V'), + (0xA692, "M", "ꚓ"), + (0xA693, "V"), + (0xA694, "M", "ꚕ"), + (0xA695, "V"), + (0xA696, "M", "ꚗ"), + (0xA697, "V"), + (0xA698, "M", "ꚙ"), + (0xA699, "V"), + (0xA69A, "M", "ꚛ"), + (0xA69B, "V"), + (0xA69C, "M", "ъ"), + (0xA69D, "M", "ь"), + (0xA69E, "V"), + (0xA6F8, "X"), + (0xA700, "V"), + (0xA722, "M", "ꜣ"), + (0xA723, "V"), + (0xA724, "M", "ꜥ"), + (0xA725, "V"), + (0xA726, "M", "ꜧ"), + (0xA727, "V"), + (0xA728, "M", "ꜩ"), + (0xA729, "V"), + (0xA72A, "M", "ꜫ"), + (0xA72B, "V"), + (0xA72C, "M", "ꜭ"), + (0xA72D, "V"), + (0xA72E, "M", "ꜯ"), + (0xA72F, "V"), + (0xA732, "M", "ꜳ"), + (0xA733, "V"), + (0xA734, "M", "ꜵ"), + (0xA735, "V"), + (0xA736, "M", "ꜷ"), + (0xA737, "V"), + (0xA738, "M", "ꜹ"), + (0xA739, "V"), + (0xA73A, "M", "ꜻ"), + (0xA73B, "V"), + (0xA73C, "M", "ꜽ"), + (0xA73D, "V"), + (0xA73E, "M", "ꜿ"), + (0xA73F, "V"), + (0xA740, "M", "ꝁ"), + (0xA741, "V"), + (0xA742, "M", "ꝃ"), + (0xA743, "V"), + (0xA744, "M", "ꝅ"), + (0xA745, "V"), + (0xA746, "M", "ꝇ"), + (0xA747, "V"), + (0xA748, "M", "ꝉ"), + (0xA749, "V"), + (0xA74A, "M", "ꝋ"), + (0xA74B, "V"), + (0xA74C, "M", "ꝍ"), + (0xA74D, "V"), + (0xA74E, "M", "ꝏ"), + (0xA74F, "V"), + (0xA750, "M", "ꝑ"), + (0xA751, "V"), + (0xA752, "M", "ꝓ"), + (0xA753, "V"), + (0xA754, "M", "ꝕ"), + (0xA755, "V"), + (0xA756, "M", "ꝗ"), + (0xA757, "V"), + (0xA758, "M", "ꝙ"), + (0xA759, "V"), + (0xA75A, "M", "ꝛ"), + (0xA75B, "V"), + (0xA75C, "M", "ꝝ"), + (0xA75D, "V"), + (0xA75E, "M", "ꝟ"), + (0xA75F, "V"), + (0xA760, "M", "ꝡ"), + (0xA761, "V"), + (0xA762, "M", "ꝣ"), + (0xA763, "V"), + (0xA764, "M", "ꝥ"), + (0xA765, "V"), + (0xA766, "M", "ꝧ"), + (0xA767, "V"), + (0xA768, "M", "ꝩ"), + (0xA769, "V"), + (0xA76A, "M", "ꝫ"), + (0xA76B, "V"), + (0xA76C, "M", "ꝭ"), + (0xA76D, "V"), + (0xA76E, "M", "ꝯ"), + (0xA76F, "V"), + (0xA770, "M", "ꝯ"), + (0xA771, "V"), + (0xA779, "M", "ꝺ"), + (0xA77A, "V"), + (0xA77B, "M", "ꝼ"), + (0xA77C, "V"), + (0xA77D, "M", "ᵹ"), + (0xA77E, "M", "ꝿ"), + (0xA77F, "V"), ] + def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xA780, 'M', 'ꞁ'), - (0xA781, 'V'), - (0xA782, 'M', 'ꞃ'), - (0xA783, 'V'), - (0xA784, 'M', 'ꞅ'), - (0xA785, 'V'), - (0xA786, 'M', 'ꞇ'), - (0xA787, 'V'), - (0xA78B, 'M', 'ꞌ'), - (0xA78C, 'V'), - (0xA78D, 'M', 'ɥ'), - (0xA78E, 'V'), - (0xA790, 'M', 'ꞑ'), - (0xA791, 'V'), - (0xA792, 'M', 'ꞓ'), - (0xA793, 'V'), - (0xA796, 'M', 'ꞗ'), - (0xA797, 'V'), - (0xA798, 'M', 'ꞙ'), - (0xA799, 'V'), - (0xA79A, 'M', 'ꞛ'), - (0xA79B, 'V'), - (0xA79C, 'M', 'ꞝ'), - (0xA79D, 'V'), - (0xA79E, 'M', 'ꞟ'), - (0xA79F, 'V'), - (0xA7A0, 'M', 'ꞡ'), - (0xA7A1, 'V'), - (0xA7A2, 'M', 'ꞣ'), - (0xA7A3, 'V'), - (0xA7A4, 'M', 'ꞥ'), - (0xA7A5, 'V'), - (0xA7A6, 'M', 'ꞧ'), - (0xA7A7, 'V'), - (0xA7A8, 'M', 'ꞩ'), - (0xA7A9, 'V'), - (0xA7AA, 'M', 'ɦ'), - (0xA7AB, 'M', 'ɜ'), - (0xA7AC, 'M', 'ɡ'), - (0xA7AD, 'M', 'ɬ'), - (0xA7AE, 'M', 'ɪ'), - (0xA7AF, 'V'), - (0xA7B0, 'M', 'ʞ'), - (0xA7B1, 'M', 'ʇ'), - (0xA7B2, 'M', 'ʝ'), - (0xA7B3, 'M', 'ꭓ'), - (0xA7B4, 'M', 'ꞵ'), - (0xA7B5, 'V'), - (0xA7B6, 'M', 'ꞷ'), - (0xA7B7, 'V'), - (0xA7B8, 'M', 'ꞹ'), - (0xA7B9, 'V'), - (0xA7BA, 'M', 'ꞻ'), - (0xA7BB, 'V'), - (0xA7BC, 'M', 'ꞽ'), - (0xA7BD, 'V'), - (0xA7BE, 'M', 'ꞿ'), - (0xA7BF, 'V'), - (0xA7C0, 'M', 'ꟁ'), - (0xA7C1, 'V'), - (0xA7C2, 'M', 'ꟃ'), - (0xA7C3, 'V'), - (0xA7C4, 'M', 'ꞔ'), - (0xA7C5, 'M', 'ʂ'), - (0xA7C6, 'M', 'ᶎ'), - (0xA7C7, 'M', 'ꟈ'), - (0xA7C8, 'V'), - (0xA7C9, 'M', 'ꟊ'), - (0xA7CA, 'V'), - (0xA7CB, 'X'), - (0xA7D0, 'M', 'ꟑ'), - (0xA7D1, 'V'), - (0xA7D2, 'X'), - (0xA7D3, 'V'), - (0xA7D4, 'X'), - (0xA7D5, 'V'), - (0xA7D6, 'M', 'ꟗ'), - (0xA7D7, 'V'), - (0xA7D8, 'M', 'ꟙ'), - (0xA7D9, 'V'), - (0xA7DA, 'X'), - (0xA7F2, 'M', 'c'), - (0xA7F3, 'M', 'f'), - (0xA7F4, 'M', 'q'), - (0xA7F5, 'M', 'ꟶ'), - (0xA7F6, 'V'), - (0xA7F8, 'M', 'ħ'), - (0xA7F9, 'M', 'œ'), - (0xA7FA, 'V'), - (0xA82D, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C6, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA954, 'X'), + (0xA780, "M", "ꞁ"), + (0xA781, "V"), + (0xA782, "M", "ꞃ"), + (0xA783, "V"), + (0xA784, "M", "ꞅ"), + (0xA785, "V"), + (0xA786, "M", "ꞇ"), + (0xA787, "V"), + (0xA78B, "M", "ꞌ"), + (0xA78C, "V"), + (0xA78D, "M", "ɥ"), + (0xA78E, "V"), + (0xA790, "M", "ꞑ"), + (0xA791, "V"), + (0xA792, "M", "ꞓ"), + (0xA793, "V"), + (0xA796, "M", "ꞗ"), + (0xA797, "V"), + (0xA798, "M", "ꞙ"), + (0xA799, "V"), + (0xA79A, "M", "ꞛ"), + (0xA79B, "V"), + (0xA79C, "M", "ꞝ"), + (0xA79D, "V"), + (0xA79E, "M", "ꞟ"), + (0xA79F, "V"), + (0xA7A0, "M", "ꞡ"), + (0xA7A1, "V"), + (0xA7A2, "M", "ꞣ"), + (0xA7A3, "V"), + (0xA7A4, "M", "ꞥ"), + (0xA7A5, "V"), + (0xA7A6, "M", "ꞧ"), + (0xA7A7, "V"), + (0xA7A8, "M", "ꞩ"), + (0xA7A9, "V"), + (0xA7AA, "M", "ɦ"), + (0xA7AB, "M", "ɜ"), + (0xA7AC, "M", "ɡ"), + (0xA7AD, "M", "ɬ"), + (0xA7AE, "M", "ɪ"), + (0xA7AF, "V"), + (0xA7B0, "M", "ʞ"), + (0xA7B1, "M", "ʇ"), + (0xA7B2, "M", "ʝ"), + (0xA7B3, "M", "ꭓ"), + (0xA7B4, "M", "ꞵ"), + (0xA7B5, "V"), + (0xA7B6, "M", "ꞷ"), + (0xA7B7, "V"), + (0xA7B8, "M", "ꞹ"), + (0xA7B9, "V"), + (0xA7BA, "M", "ꞻ"), + (0xA7BB, "V"), + (0xA7BC, "M", "ꞽ"), + (0xA7BD, "V"), + (0xA7BE, "M", "ꞿ"), + (0xA7BF, "V"), + (0xA7C0, "M", "ꟁ"), + (0xA7C1, "V"), + (0xA7C2, "M", "ꟃ"), + (0xA7C3, "V"), + (0xA7C4, "M", "ꞔ"), + (0xA7C5, "M", "ʂ"), + (0xA7C6, "M", "ᶎ"), + (0xA7C7, "M", "ꟈ"), + (0xA7C8, "V"), + (0xA7C9, "M", "ꟊ"), + (0xA7CA, "V"), + (0xA7CB, "X"), + (0xA7D0, "M", "ꟑ"), + (0xA7D1, "V"), + (0xA7D2, "X"), + (0xA7D3, "V"), + (0xA7D4, "X"), + (0xA7D5, "V"), + (0xA7D6, "M", "ꟗ"), + (0xA7D7, "V"), + (0xA7D8, "M", "ꟙ"), + (0xA7D9, "V"), + (0xA7DA, "X"), + (0xA7F2, "M", "c"), + (0xA7F3, "M", "f"), + (0xA7F4, "M", "q"), + (0xA7F5, "M", "ꟶ"), + (0xA7F6, "V"), + (0xA7F8, "M", "ħ"), + (0xA7F9, "M", "œ"), + (0xA7FA, "V"), + (0xA82D, "X"), + (0xA830, "V"), + (0xA83A, "X"), + (0xA840, "V"), + (0xA878, "X"), + (0xA880, "V"), + (0xA8C6, "X"), + (0xA8CE, "V"), + (0xA8DA, "X"), + (0xA8E0, "V"), + (0xA954, "X"), ] + def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9FF, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, 'V'), - (0xAAC3, 'X'), - (0xAADB, 'V'), - (0xAAF7, 'X'), - (0xAB01, 'V'), - (0xAB07, 'X'), - (0xAB09, 'V'), - (0xAB0F, 'X'), - (0xAB11, 'V'), - (0xAB17, 'X'), - (0xAB20, 'V'), - (0xAB27, 'X'), - (0xAB28, 'V'), - (0xAB2F, 'X'), - (0xAB30, 'V'), - (0xAB5C, 'M', 'ꜧ'), - (0xAB5D, 'M', 'ꬷ'), - (0xAB5E, 'M', 'ɫ'), - (0xAB5F, 'M', 'ꭒ'), - (0xAB60, 'V'), - (0xAB69, 'M', 'ʍ'), - (0xAB6A, 'V'), - (0xAB6C, 'X'), - (0xAB70, 'M', 'Ꭰ'), - (0xAB71, 'M', 'Ꭱ'), - (0xAB72, 'M', 'Ꭲ'), - (0xAB73, 'M', 'Ꭳ'), - (0xAB74, 'M', 'Ꭴ'), - (0xAB75, 'M', 'Ꭵ'), - (0xAB76, 'M', 'Ꭶ'), - (0xAB77, 'M', 'Ꭷ'), - (0xAB78, 'M', 'Ꭸ'), - (0xAB79, 'M', 'Ꭹ'), - (0xAB7A, 'M', 'Ꭺ'), - (0xAB7B, 'M', 'Ꭻ'), - (0xAB7C, 'M', 'Ꭼ'), - (0xAB7D, 'M', 'Ꭽ'), - (0xAB7E, 'M', 'Ꭾ'), - (0xAB7F, 'M', 'Ꭿ'), - (0xAB80, 'M', 'Ꮀ'), - (0xAB81, 'M', 'Ꮁ'), - (0xAB82, 'M', 'Ꮂ'), - (0xAB83, 'M', 'Ꮃ'), - (0xAB84, 'M', 'Ꮄ'), - (0xAB85, 'M', 'Ꮅ'), - (0xAB86, 'M', 'Ꮆ'), - (0xAB87, 'M', 'Ꮇ'), - (0xAB88, 'M', 'Ꮈ'), - (0xAB89, 'M', 'Ꮉ'), - (0xAB8A, 'M', 'Ꮊ'), - (0xAB8B, 'M', 'Ꮋ'), - (0xAB8C, 'M', 'Ꮌ'), - (0xAB8D, 'M', 'Ꮍ'), - (0xAB8E, 'M', 'Ꮎ'), - (0xAB8F, 'M', 'Ꮏ'), - (0xAB90, 'M', 'Ꮐ'), - (0xAB91, 'M', 'Ꮑ'), - (0xAB92, 'M', 'Ꮒ'), - (0xAB93, 'M', 'Ꮓ'), - (0xAB94, 'M', 'Ꮔ'), - (0xAB95, 'M', 'Ꮕ'), - (0xAB96, 'M', 'Ꮖ'), - (0xAB97, 'M', 'Ꮗ'), - (0xAB98, 'M', 'Ꮘ'), - (0xAB99, 'M', 'Ꮙ'), - (0xAB9A, 'M', 'Ꮚ'), - (0xAB9B, 'M', 'Ꮛ'), - (0xAB9C, 'M', 'Ꮜ'), - (0xAB9D, 'M', 'Ꮝ'), - (0xAB9E, 'M', 'Ꮞ'), - (0xAB9F, 'M', 'Ꮟ'), - (0xABA0, 'M', 'Ꮠ'), - (0xABA1, 'M', 'Ꮡ'), - (0xABA2, 'M', 'Ꮢ'), - (0xABA3, 'M', 'Ꮣ'), - (0xABA4, 'M', 'Ꮤ'), - (0xABA5, 'M', 'Ꮥ'), - (0xABA6, 'M', 'Ꮦ'), - (0xABA7, 'M', 'Ꮧ'), - (0xABA8, 'M', 'Ꮨ'), - (0xABA9, 'M', 'Ꮩ'), - (0xABAA, 'M', 'Ꮪ'), - (0xABAB, 'M', 'Ꮫ'), - (0xABAC, 'M', 'Ꮬ'), - (0xABAD, 'M', 'Ꮭ'), - (0xABAE, 'M', 'Ꮮ'), + (0xA95F, "V"), + (0xA97D, "X"), + (0xA980, "V"), + (0xA9CE, "X"), + (0xA9CF, "V"), + (0xA9DA, "X"), + (0xA9DE, "V"), + (0xA9FF, "X"), + (0xAA00, "V"), + (0xAA37, "X"), + (0xAA40, "V"), + (0xAA4E, "X"), + (0xAA50, "V"), + (0xAA5A, "X"), + (0xAA5C, "V"), + (0xAAC3, "X"), + (0xAADB, "V"), + (0xAAF7, "X"), + (0xAB01, "V"), + (0xAB07, "X"), + (0xAB09, "V"), + (0xAB0F, "X"), + (0xAB11, "V"), + (0xAB17, "X"), + (0xAB20, "V"), + (0xAB27, "X"), + (0xAB28, "V"), + (0xAB2F, "X"), + (0xAB30, "V"), + (0xAB5C, "M", "ꜧ"), + (0xAB5D, "M", "ꬷ"), + (0xAB5E, "M", "ɫ"), + (0xAB5F, "M", "ꭒ"), + (0xAB60, "V"), + (0xAB69, "M", "ʍ"), + (0xAB6A, "V"), + (0xAB6C, "X"), + (0xAB70, "M", "Ꭰ"), + (0xAB71, "M", "Ꭱ"), + (0xAB72, "M", "Ꭲ"), + (0xAB73, "M", "Ꭳ"), + (0xAB74, "M", "Ꭴ"), + (0xAB75, "M", "Ꭵ"), + (0xAB76, "M", "Ꭶ"), + (0xAB77, "M", "Ꭷ"), + (0xAB78, "M", "Ꭸ"), + (0xAB79, "M", "Ꭹ"), + (0xAB7A, "M", "Ꭺ"), + (0xAB7B, "M", "Ꭻ"), + (0xAB7C, "M", "Ꭼ"), + (0xAB7D, "M", "Ꭽ"), + (0xAB7E, "M", "Ꭾ"), + (0xAB7F, "M", "Ꭿ"), + (0xAB80, "M", "Ꮀ"), + (0xAB81, "M", "Ꮁ"), + (0xAB82, "M", "Ꮂ"), + (0xAB83, "M", "Ꮃ"), + (0xAB84, "M", "Ꮄ"), + (0xAB85, "M", "Ꮅ"), + (0xAB86, "M", "Ꮆ"), + (0xAB87, "M", "Ꮇ"), + (0xAB88, "M", "Ꮈ"), + (0xAB89, "M", "Ꮉ"), + (0xAB8A, "M", "Ꮊ"), + (0xAB8B, "M", "Ꮋ"), + (0xAB8C, "M", "Ꮌ"), + (0xAB8D, "M", "Ꮍ"), + (0xAB8E, "M", "Ꮎ"), + (0xAB8F, "M", "Ꮏ"), + (0xAB90, "M", "Ꮐ"), + (0xAB91, "M", "Ꮑ"), + (0xAB92, "M", "Ꮒ"), + (0xAB93, "M", "Ꮓ"), + (0xAB94, "M", "Ꮔ"), + (0xAB95, "M", "Ꮕ"), + (0xAB96, "M", "Ꮖ"), + (0xAB97, "M", "Ꮗ"), + (0xAB98, "M", "Ꮘ"), + (0xAB99, "M", "Ꮙ"), + (0xAB9A, "M", "Ꮚ"), + (0xAB9B, "M", "Ꮛ"), + (0xAB9C, "M", "Ꮜ"), + (0xAB9D, "M", "Ꮝ"), + (0xAB9E, "M", "Ꮞ"), + (0xAB9F, "M", "Ꮟ"), + (0xABA0, "M", "Ꮠ"), + (0xABA1, "M", "Ꮡ"), + (0xABA2, "M", "Ꮢ"), + (0xABA3, "M", "Ꮣ"), + (0xABA4, "M", "Ꮤ"), + (0xABA5, "M", "Ꮥ"), + (0xABA6, "M", "Ꮦ"), + (0xABA7, "M", "Ꮧ"), + (0xABA8, "M", "Ꮨ"), + (0xABA9, "M", "Ꮩ"), + (0xABAA, "M", "Ꮪ"), + (0xABAB, "M", "Ꮫ"), + (0xABAC, "M", "Ꮬ"), + (0xABAD, "M", "Ꮭ"), + (0xABAE, "M", "Ꮮ"), ] + def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xABAF, 'M', 'Ꮯ'), - (0xABB0, 'M', 'Ꮰ'), - (0xABB1, 'M', 'Ꮱ'), - (0xABB2, 'M', 'Ꮲ'), - (0xABB3, 'M', 'Ꮳ'), - (0xABB4, 'M', 'Ꮴ'), - (0xABB5, 'M', 'Ꮵ'), - (0xABB6, 'M', 'Ꮶ'), - (0xABB7, 'M', 'Ꮷ'), - (0xABB8, 'M', 'Ꮸ'), - (0xABB9, 'M', 'Ꮹ'), - (0xABBA, 'M', 'Ꮺ'), - (0xABBB, 'M', 'Ꮻ'), - (0xABBC, 'M', 'Ꮼ'), - (0xABBD, 'M', 'Ꮽ'), - (0xABBE, 'M', 'Ꮾ'), - (0xABBF, 'M', 'Ꮿ'), - (0xABC0, 'V'), - (0xABEE, 'X'), - (0xABF0, 'V'), - (0xABFA, 'X'), - (0xAC00, 'V'), - (0xD7A4, 'X'), - (0xD7B0, 'V'), - (0xD7C7, 'X'), - (0xD7CB, 'V'), - (0xD7FC, 'X'), - (0xF900, 'M', '豈'), - (0xF901, 'M', '更'), - (0xF902, 'M', '車'), - (0xF903, 'M', '賈'), - (0xF904, 'M', '滑'), - (0xF905, 'M', '串'), - (0xF906, 'M', '句'), - (0xF907, 'M', '龜'), - (0xF909, 'M', '契'), - (0xF90A, 'M', '金'), - (0xF90B, 'M', '喇'), - (0xF90C, 'M', '奈'), - (0xF90D, 'M', '懶'), - (0xF90E, 'M', '癩'), - (0xF90F, 'M', '羅'), - (0xF910, 'M', '蘿'), - (0xF911, 'M', '螺'), - (0xF912, 'M', '裸'), - (0xF913, 'M', '邏'), - (0xF914, 'M', '樂'), - (0xF915, 'M', '洛'), - (0xF916, 'M', '烙'), - (0xF917, 'M', '珞'), - (0xF918, 'M', '落'), - (0xF919, 'M', '酪'), - (0xF91A, 'M', '駱'), - (0xF91B, 'M', '亂'), - (0xF91C, 'M', '卵'), - (0xF91D, 'M', '欄'), - (0xF91E, 'M', '爛'), - (0xF91F, 'M', '蘭'), - (0xF920, 'M', '鸞'), - (0xF921, 'M', '嵐'), - (0xF922, 'M', '濫'), - (0xF923, 'M', '藍'), - (0xF924, 'M', '襤'), - (0xF925, 'M', '拉'), - (0xF926, 'M', '臘'), - (0xF927, 'M', '蠟'), - (0xF928, 'M', '廊'), - (0xF929, 'M', '朗'), - (0xF92A, 'M', '浪'), - (0xF92B, 'M', '狼'), - (0xF92C, 'M', '郎'), - (0xF92D, 'M', '來'), - (0xF92E, 'M', '冷'), - (0xF92F, 'M', '勞'), - (0xF930, 'M', '擄'), - (0xF931, 'M', '櫓'), - (0xF932, 'M', '爐'), - (0xF933, 'M', '盧'), - (0xF934, 'M', '老'), - (0xF935, 'M', '蘆'), - (0xF936, 'M', '虜'), - (0xF937, 'M', '路'), - (0xF938, 'M', '露'), - (0xF939, 'M', '魯'), - (0xF93A, 'M', '鷺'), - (0xF93B, 'M', '碌'), - (0xF93C, 'M', '祿'), - (0xF93D, 'M', '綠'), - (0xF93E, 'M', '菉'), - (0xF93F, 'M', '錄'), - (0xF940, 'M', '鹿'), - (0xF941, 'M', '論'), - (0xF942, 'M', '壟'), - (0xF943, 'M', '弄'), - (0xF944, 'M', '籠'), - (0xF945, 'M', '聾'), - (0xF946, 'M', '牢'), - (0xF947, 'M', '磊'), - (0xF948, 'M', '賂'), - (0xF949, 'M', '雷'), + (0xABAF, "M", "Ꮯ"), + (0xABB0, "M", "Ꮰ"), + (0xABB1, "M", "Ꮱ"), + (0xABB2, "M", "Ꮲ"), + (0xABB3, "M", "Ꮳ"), + (0xABB4, "M", "Ꮴ"), + (0xABB5, "M", "Ꮵ"), + (0xABB6, "M", "Ꮶ"), + (0xABB7, "M", "Ꮷ"), + (0xABB8, "M", "Ꮸ"), + (0xABB9, "M", "Ꮹ"), + (0xABBA, "M", "Ꮺ"), + (0xABBB, "M", "Ꮻ"), + (0xABBC, "M", "Ꮼ"), + (0xABBD, "M", "Ꮽ"), + (0xABBE, "M", "Ꮾ"), + (0xABBF, "M", "Ꮿ"), + (0xABC0, "V"), + (0xABEE, "X"), + (0xABF0, "V"), + (0xABFA, "X"), + (0xAC00, "V"), + (0xD7A4, "X"), + (0xD7B0, "V"), + (0xD7C7, "X"), + (0xD7CB, "V"), + (0xD7FC, "X"), + (0xF900, "M", "豈"), + (0xF901, "M", "更"), + (0xF902, "M", "車"), + (0xF903, "M", "賈"), + (0xF904, "M", "滑"), + (0xF905, "M", "串"), + (0xF906, "M", "句"), + (0xF907, "M", "龜"), + (0xF909, "M", "契"), + (0xF90A, "M", "金"), + (0xF90B, "M", "喇"), + (0xF90C, "M", "奈"), + (0xF90D, "M", "懶"), + (0xF90E, "M", "癩"), + (0xF90F, "M", "羅"), + (0xF910, "M", "蘿"), + (0xF911, "M", "螺"), + (0xF912, "M", "裸"), + (0xF913, "M", "邏"), + (0xF914, "M", "樂"), + (0xF915, "M", "洛"), + (0xF916, "M", "烙"), + (0xF917, "M", "珞"), + (0xF918, "M", "落"), + (0xF919, "M", "酪"), + (0xF91A, "M", "駱"), + (0xF91B, "M", "亂"), + (0xF91C, "M", "卵"), + (0xF91D, "M", "欄"), + (0xF91E, "M", "爛"), + (0xF91F, "M", "蘭"), + (0xF920, "M", "鸞"), + (0xF921, "M", "嵐"), + (0xF922, "M", "濫"), + (0xF923, "M", "藍"), + (0xF924, "M", "襤"), + (0xF925, "M", "拉"), + (0xF926, "M", "臘"), + (0xF927, "M", "蠟"), + (0xF928, "M", "廊"), + (0xF929, "M", "朗"), + (0xF92A, "M", "浪"), + (0xF92B, "M", "狼"), + (0xF92C, "M", "郎"), + (0xF92D, "M", "來"), + (0xF92E, "M", "冷"), + (0xF92F, "M", "勞"), + (0xF930, "M", "擄"), + (0xF931, "M", "櫓"), + (0xF932, "M", "爐"), + (0xF933, "M", "盧"), + (0xF934, "M", "老"), + (0xF935, "M", "蘆"), + (0xF936, "M", "虜"), + (0xF937, "M", "路"), + (0xF938, "M", "露"), + (0xF939, "M", "魯"), + (0xF93A, "M", "鷺"), + (0xF93B, "M", "碌"), + (0xF93C, "M", "祿"), + (0xF93D, "M", "綠"), + (0xF93E, "M", "菉"), + (0xF93F, "M", "錄"), + (0xF940, "M", "鹿"), + (0xF941, "M", "論"), + (0xF942, "M", "壟"), + (0xF943, "M", "弄"), + (0xF944, "M", "籠"), + (0xF945, "M", "聾"), + (0xF946, "M", "牢"), + (0xF947, "M", "磊"), + (0xF948, "M", "賂"), + (0xF949, "M", "雷"), ] + def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xF94A, 'M', '壘'), - (0xF94B, 'M', '屢'), - (0xF94C, 'M', '樓'), - (0xF94D, 'M', '淚'), - (0xF94E, 'M', '漏'), - (0xF94F, 'M', '累'), - (0xF950, 'M', '縷'), - (0xF951, 'M', '陋'), - (0xF952, 'M', '勒'), - (0xF953, 'M', '肋'), - (0xF954, 'M', '凜'), - (0xF955, 'M', '凌'), - (0xF956, 'M', '稜'), - (0xF957, 'M', '綾'), - (0xF958, 'M', '菱'), - (0xF959, 'M', '陵'), - (0xF95A, 'M', '讀'), - (0xF95B, 'M', '拏'), - (0xF95C, 'M', '樂'), - (0xF95D, 'M', '諾'), - (0xF95E, 'M', '丹'), - (0xF95F, 'M', '寧'), - (0xF960, 'M', '怒'), - (0xF961, 'M', '率'), - (0xF962, 'M', '異'), - (0xF963, 'M', '北'), - (0xF964, 'M', '磻'), - (0xF965, 'M', '便'), - (0xF966, 'M', '復'), - (0xF967, 'M', '不'), - (0xF968, 'M', '泌'), - (0xF969, 'M', '數'), - (0xF96A, 'M', '索'), - (0xF96B, 'M', '參'), - (0xF96C, 'M', '塞'), - (0xF96D, 'M', '省'), - (0xF96E, 'M', '葉'), - (0xF96F, 'M', '說'), - (0xF970, 'M', '殺'), - (0xF971, 'M', '辰'), - (0xF972, 'M', '沈'), - (0xF973, 'M', '拾'), - (0xF974, 'M', '若'), - (0xF975, 'M', '掠'), - (0xF976, 'M', '略'), - (0xF977, 'M', '亮'), - (0xF978, 'M', '兩'), - (0xF979, 'M', '凉'), - (0xF97A, 'M', '梁'), - (0xF97B, 'M', '糧'), - (0xF97C, 'M', '良'), - (0xF97D, 'M', '諒'), - (0xF97E, 'M', '量'), - (0xF97F, 'M', '勵'), - (0xF980, 'M', '呂'), - (0xF981, 'M', '女'), - (0xF982, 'M', '廬'), - (0xF983, 'M', '旅'), - (0xF984, 'M', '濾'), - (0xF985, 'M', '礪'), - (0xF986, 'M', '閭'), - (0xF987, 'M', '驪'), - (0xF988, 'M', '麗'), - (0xF989, 'M', '黎'), - (0xF98A, 'M', '力'), - (0xF98B, 'M', '曆'), - (0xF98C, 'M', '歷'), - (0xF98D, 'M', '轢'), - (0xF98E, 'M', '年'), - (0xF98F, 'M', '憐'), - (0xF990, 'M', '戀'), - (0xF991, 'M', '撚'), - (0xF992, 'M', '漣'), - (0xF993, 'M', '煉'), - (0xF994, 'M', '璉'), - (0xF995, 'M', '秊'), - (0xF996, 'M', '練'), - (0xF997, 'M', '聯'), - (0xF998, 'M', '輦'), - (0xF999, 'M', '蓮'), - (0xF99A, 'M', '連'), - (0xF99B, 'M', '鍊'), - (0xF99C, 'M', '列'), - (0xF99D, 'M', '劣'), - (0xF99E, 'M', '咽'), - (0xF99F, 'M', '烈'), - (0xF9A0, 'M', '裂'), - (0xF9A1, 'M', '說'), - (0xF9A2, 'M', '廉'), - (0xF9A3, 'M', '念'), - (0xF9A4, 'M', '捻'), - (0xF9A5, 'M', '殮'), - (0xF9A6, 'M', '簾'), - (0xF9A7, 'M', '獵'), - (0xF9A8, 'M', '令'), - (0xF9A9, 'M', '囹'), - (0xF9AA, 'M', '寧'), - (0xF9AB, 'M', '嶺'), - (0xF9AC, 'M', '怜'), - (0xF9AD, 'M', '玲'), + (0xF94A, "M", "壘"), + (0xF94B, "M", "屢"), + (0xF94C, "M", "樓"), + (0xF94D, "M", "淚"), + (0xF94E, "M", "漏"), + (0xF94F, "M", "累"), + (0xF950, "M", "縷"), + (0xF951, "M", "陋"), + (0xF952, "M", "勒"), + (0xF953, "M", "肋"), + (0xF954, "M", "凜"), + (0xF955, "M", "凌"), + (0xF956, "M", "稜"), + (0xF957, "M", "綾"), + (0xF958, "M", "菱"), + (0xF959, "M", "陵"), + (0xF95A, "M", "讀"), + (0xF95B, "M", "拏"), + (0xF95C, "M", "樂"), + (0xF95D, "M", "諾"), + (0xF95E, "M", "丹"), + (0xF95F, "M", "寧"), + (0xF960, "M", "怒"), + (0xF961, "M", "率"), + (0xF962, "M", "異"), + (0xF963, "M", "北"), + (0xF964, "M", "磻"), + (0xF965, "M", "便"), + (0xF966, "M", "復"), + (0xF967, "M", "不"), + (0xF968, "M", "泌"), + (0xF969, "M", "數"), + (0xF96A, "M", "索"), + (0xF96B, "M", "參"), + (0xF96C, "M", "塞"), + (0xF96D, "M", "省"), + (0xF96E, "M", "葉"), + (0xF96F, "M", "說"), + (0xF970, "M", "殺"), + (0xF971, "M", "辰"), + (0xF972, "M", "沈"), + (0xF973, "M", "拾"), + (0xF974, "M", "若"), + (0xF975, "M", "掠"), + (0xF976, "M", "略"), + (0xF977, "M", "亮"), + (0xF978, "M", "兩"), + (0xF979, "M", "凉"), + (0xF97A, "M", "梁"), + (0xF97B, "M", "糧"), + (0xF97C, "M", "良"), + (0xF97D, "M", "諒"), + (0xF97E, "M", "量"), + (0xF97F, "M", "勵"), + (0xF980, "M", "呂"), + (0xF981, "M", "女"), + (0xF982, "M", "廬"), + (0xF983, "M", "旅"), + (0xF984, "M", "濾"), + (0xF985, "M", "礪"), + (0xF986, "M", "閭"), + (0xF987, "M", "驪"), + (0xF988, "M", "麗"), + (0xF989, "M", "黎"), + (0xF98A, "M", "力"), + (0xF98B, "M", "曆"), + (0xF98C, "M", "歷"), + (0xF98D, "M", "轢"), + (0xF98E, "M", "年"), + (0xF98F, "M", "憐"), + (0xF990, "M", "戀"), + (0xF991, "M", "撚"), + (0xF992, "M", "漣"), + (0xF993, "M", "煉"), + (0xF994, "M", "璉"), + (0xF995, "M", "秊"), + (0xF996, "M", "練"), + (0xF997, "M", "聯"), + (0xF998, "M", "輦"), + (0xF999, "M", "蓮"), + (0xF99A, "M", "連"), + (0xF99B, "M", "鍊"), + (0xF99C, "M", "列"), + (0xF99D, "M", "劣"), + (0xF99E, "M", "咽"), + (0xF99F, "M", "烈"), + (0xF9A0, "M", "裂"), + (0xF9A1, "M", "說"), + (0xF9A2, "M", "廉"), + (0xF9A3, "M", "念"), + (0xF9A4, "M", "捻"), + (0xF9A5, "M", "殮"), + (0xF9A6, "M", "簾"), + (0xF9A7, "M", "獵"), + (0xF9A8, "M", "令"), + (0xF9A9, "M", "囹"), + (0xF9AA, "M", "寧"), + (0xF9AB, "M", "嶺"), + (0xF9AC, "M", "怜"), + (0xF9AD, "M", "玲"), ] + def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xF9AE, 'M', '瑩'), - (0xF9AF, 'M', '羚'), - (0xF9B0, 'M', '聆'), - (0xF9B1, 'M', '鈴'), - (0xF9B2, 'M', '零'), - (0xF9B3, 'M', '靈'), - (0xF9B4, 'M', '領'), - (0xF9B5, 'M', '例'), - (0xF9B6, 'M', '禮'), - (0xF9B7, 'M', '醴'), - (0xF9B8, 'M', '隸'), - (0xF9B9, 'M', '惡'), - (0xF9BA, 'M', '了'), - (0xF9BB, 'M', '僚'), - (0xF9BC, 'M', '寮'), - (0xF9BD, 'M', '尿'), - (0xF9BE, 'M', '料'), - (0xF9BF, 'M', '樂'), - (0xF9C0, 'M', '燎'), - (0xF9C1, 'M', '療'), - (0xF9C2, 'M', '蓼'), - (0xF9C3, 'M', '遼'), - (0xF9C4, 'M', '龍'), - (0xF9C5, 'M', '暈'), - (0xF9C6, 'M', '阮'), - (0xF9C7, 'M', '劉'), - (0xF9C8, 'M', '杻'), - (0xF9C9, 'M', '柳'), - (0xF9CA, 'M', '流'), - (0xF9CB, 'M', '溜'), - (0xF9CC, 'M', '琉'), - (0xF9CD, 'M', '留'), - (0xF9CE, 'M', '硫'), - (0xF9CF, 'M', '紐'), - (0xF9D0, 'M', '類'), - (0xF9D1, 'M', '六'), - (0xF9D2, 'M', '戮'), - (0xF9D3, 'M', '陸'), - (0xF9D4, 'M', '倫'), - (0xF9D5, 'M', '崙'), - (0xF9D6, 'M', '淪'), - (0xF9D7, 'M', '輪'), - (0xF9D8, 'M', '律'), - (0xF9D9, 'M', '慄'), - (0xF9DA, 'M', '栗'), - (0xF9DB, 'M', '率'), - (0xF9DC, 'M', '隆'), - (0xF9DD, 'M', '利'), - (0xF9DE, 'M', '吏'), - (0xF9DF, 'M', '履'), - (0xF9E0, 'M', '易'), - (0xF9E1, 'M', '李'), - (0xF9E2, 'M', '梨'), - (0xF9E3, 'M', '泥'), - (0xF9E4, 'M', '理'), - (0xF9E5, 'M', '痢'), - (0xF9E6, 'M', '罹'), - (0xF9E7, 'M', '裏'), - (0xF9E8, 'M', '裡'), - (0xF9E9, 'M', '里'), - (0xF9EA, 'M', '離'), - (0xF9EB, 'M', '匿'), - (0xF9EC, 'M', '溺'), - (0xF9ED, 'M', '吝'), - (0xF9EE, 'M', '燐'), - (0xF9EF, 'M', '璘'), - (0xF9F0, 'M', '藺'), - (0xF9F1, 'M', '隣'), - (0xF9F2, 'M', '鱗'), - (0xF9F3, 'M', '麟'), - (0xF9F4, 'M', '林'), - (0xF9F5, 'M', '淋'), - (0xF9F6, 'M', '臨'), - (0xF9F7, 'M', '立'), - (0xF9F8, 'M', '笠'), - (0xF9F9, 'M', '粒'), - (0xF9FA, 'M', '狀'), - (0xF9FB, 'M', '炙'), - (0xF9FC, 'M', '識'), - (0xF9FD, 'M', '什'), - (0xF9FE, 'M', '茶'), - (0xF9FF, 'M', '刺'), - (0xFA00, 'M', '切'), - (0xFA01, 'M', '度'), - (0xFA02, 'M', '拓'), - (0xFA03, 'M', '糖'), - (0xFA04, 'M', '宅'), - (0xFA05, 'M', '洞'), - (0xFA06, 'M', '暴'), - (0xFA07, 'M', '輻'), - (0xFA08, 'M', '行'), - (0xFA09, 'M', '降'), - (0xFA0A, 'M', '見'), - (0xFA0B, 'M', '廓'), - (0xFA0C, 'M', '兀'), - (0xFA0D, 'M', '嗀'), - (0xFA0E, 'V'), - (0xFA10, 'M', '塚'), - (0xFA11, 'V'), - (0xFA12, 'M', '晴'), + (0xF9AE, "M", "瑩"), + (0xF9AF, "M", "羚"), + (0xF9B0, "M", "聆"), + (0xF9B1, "M", "鈴"), + (0xF9B2, "M", "零"), + (0xF9B3, "M", "靈"), + (0xF9B4, "M", "領"), + (0xF9B5, "M", "例"), + (0xF9B6, "M", "禮"), + (0xF9B7, "M", "醴"), + (0xF9B8, "M", "隸"), + (0xF9B9, "M", "惡"), + (0xF9BA, "M", "了"), + (0xF9BB, "M", "僚"), + (0xF9BC, "M", "寮"), + (0xF9BD, "M", "尿"), + (0xF9BE, "M", "料"), + (0xF9BF, "M", "樂"), + (0xF9C0, "M", "燎"), + (0xF9C1, "M", "療"), + (0xF9C2, "M", "蓼"), + (0xF9C3, "M", "遼"), + (0xF9C4, "M", "龍"), + (0xF9C5, "M", "暈"), + (0xF9C6, "M", "阮"), + (0xF9C7, "M", "劉"), + (0xF9C8, "M", "杻"), + (0xF9C9, "M", "柳"), + (0xF9CA, "M", "流"), + (0xF9CB, "M", "溜"), + (0xF9CC, "M", "琉"), + (0xF9CD, "M", "留"), + (0xF9CE, "M", "硫"), + (0xF9CF, "M", "紐"), + (0xF9D0, "M", "類"), + (0xF9D1, "M", "六"), + (0xF9D2, "M", "戮"), + (0xF9D3, "M", "陸"), + (0xF9D4, "M", "倫"), + (0xF9D5, "M", "崙"), + (0xF9D6, "M", "淪"), + (0xF9D7, "M", "輪"), + (0xF9D8, "M", "律"), + (0xF9D9, "M", "慄"), + (0xF9DA, "M", "栗"), + (0xF9DB, "M", "率"), + (0xF9DC, "M", "隆"), + (0xF9DD, "M", "利"), + (0xF9DE, "M", "吏"), + (0xF9DF, "M", "履"), + (0xF9E0, "M", "易"), + (0xF9E1, "M", "李"), + (0xF9E2, "M", "梨"), + (0xF9E3, "M", "泥"), + (0xF9E4, "M", "理"), + (0xF9E5, "M", "痢"), + (0xF9E6, "M", "罹"), + (0xF9E7, "M", "裏"), + (0xF9E8, "M", "裡"), + (0xF9E9, "M", "里"), + (0xF9EA, "M", "離"), + (0xF9EB, "M", "匿"), + (0xF9EC, "M", "溺"), + (0xF9ED, "M", "吝"), + (0xF9EE, "M", "燐"), + (0xF9EF, "M", "璘"), + (0xF9F0, "M", "藺"), + (0xF9F1, "M", "隣"), + (0xF9F2, "M", "鱗"), + (0xF9F3, "M", "麟"), + (0xF9F4, "M", "林"), + (0xF9F5, "M", "淋"), + (0xF9F6, "M", "臨"), + (0xF9F7, "M", "立"), + (0xF9F8, "M", "笠"), + (0xF9F9, "M", "粒"), + (0xF9FA, "M", "狀"), + (0xF9FB, "M", "炙"), + (0xF9FC, "M", "識"), + (0xF9FD, "M", "什"), + (0xF9FE, "M", "茶"), + (0xF9FF, "M", "刺"), + (0xFA00, "M", "切"), + (0xFA01, "M", "度"), + (0xFA02, "M", "拓"), + (0xFA03, "M", "糖"), + (0xFA04, "M", "宅"), + (0xFA05, "M", "洞"), + (0xFA06, "M", "暴"), + (0xFA07, "M", "輻"), + (0xFA08, "M", "行"), + (0xFA09, "M", "降"), + (0xFA0A, "M", "見"), + (0xFA0B, "M", "廓"), + (0xFA0C, "M", "兀"), + (0xFA0D, "M", "嗀"), + (0xFA0E, "V"), + (0xFA10, "M", "塚"), + (0xFA11, "V"), + (0xFA12, "M", "晴"), ] + def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFA13, 'V'), - (0xFA15, 'M', '凞'), - (0xFA16, 'M', '猪'), - (0xFA17, 'M', '益'), - (0xFA18, 'M', '礼'), - (0xFA19, 'M', '神'), - (0xFA1A, 'M', '祥'), - (0xFA1B, 'M', '福'), - (0xFA1C, 'M', '靖'), - (0xFA1D, 'M', '精'), - (0xFA1E, 'M', '羽'), - (0xFA1F, 'V'), - (0xFA20, 'M', '蘒'), - (0xFA21, 'V'), - (0xFA22, 'M', '諸'), - (0xFA23, 'V'), - (0xFA25, 'M', '逸'), - (0xFA26, 'M', '都'), - (0xFA27, 'V'), - (0xFA2A, 'M', '飯'), - (0xFA2B, 'M', '飼'), - (0xFA2C, 'M', '館'), - (0xFA2D, 'M', '鶴'), - (0xFA2E, 'M', '郞'), - (0xFA2F, 'M', '隷'), - (0xFA30, 'M', '侮'), - (0xFA31, 'M', '僧'), - (0xFA32, 'M', '免'), - (0xFA33, 'M', '勉'), - (0xFA34, 'M', '勤'), - (0xFA35, 'M', '卑'), - (0xFA36, 'M', '喝'), - (0xFA37, 'M', '嘆'), - (0xFA38, 'M', '器'), - (0xFA39, 'M', '塀'), - (0xFA3A, 'M', '墨'), - (0xFA3B, 'M', '層'), - (0xFA3C, 'M', '屮'), - (0xFA3D, 'M', '悔'), - (0xFA3E, 'M', '慨'), - (0xFA3F, 'M', '憎'), - (0xFA40, 'M', '懲'), - (0xFA41, 'M', '敏'), - (0xFA42, 'M', '既'), - (0xFA43, 'M', '暑'), - (0xFA44, 'M', '梅'), - (0xFA45, 'M', '海'), - (0xFA46, 'M', '渚'), - (0xFA47, 'M', '漢'), - (0xFA48, 'M', '煮'), - (0xFA49, 'M', '爫'), - (0xFA4A, 'M', '琢'), - (0xFA4B, 'M', '碑'), - (0xFA4C, 'M', '社'), - (0xFA4D, 'M', '祉'), - (0xFA4E, 'M', '祈'), - (0xFA4F, 'M', '祐'), - (0xFA50, 'M', '祖'), - (0xFA51, 'M', '祝'), - (0xFA52, 'M', '禍'), - (0xFA53, 'M', '禎'), - (0xFA54, 'M', '穀'), - (0xFA55, 'M', '突'), - (0xFA56, 'M', '節'), - (0xFA57, 'M', '練'), - (0xFA58, 'M', '縉'), - (0xFA59, 'M', '繁'), - (0xFA5A, 'M', '署'), - (0xFA5B, 'M', '者'), - (0xFA5C, 'M', '臭'), - (0xFA5D, 'M', '艹'), - (0xFA5F, 'M', '著'), - (0xFA60, 'M', '褐'), - (0xFA61, 'M', '視'), - (0xFA62, 'M', '謁'), - (0xFA63, 'M', '謹'), - (0xFA64, 'M', '賓'), - (0xFA65, 'M', '贈'), - (0xFA66, 'M', '辶'), - (0xFA67, 'M', '逸'), - (0xFA68, 'M', '難'), - (0xFA69, 'M', '響'), - (0xFA6A, 'M', '頻'), - (0xFA6B, 'M', '恵'), - (0xFA6C, 'M', '𤋮'), - (0xFA6D, 'M', '舘'), - (0xFA6E, 'X'), - (0xFA70, 'M', '並'), - (0xFA71, 'M', '况'), - (0xFA72, 'M', '全'), - (0xFA73, 'M', '侀'), - (0xFA74, 'M', '充'), - (0xFA75, 'M', '冀'), - (0xFA76, 'M', '勇'), - (0xFA77, 'M', '勺'), - (0xFA78, 'M', '喝'), - (0xFA79, 'M', '啕'), - (0xFA7A, 'M', '喙'), - (0xFA7B, 'M', '嗢'), - (0xFA7C, 'M', '塚'), + (0xFA13, "V"), + (0xFA15, "M", "凞"), + (0xFA16, "M", "猪"), + (0xFA17, "M", "益"), + (0xFA18, "M", "礼"), + (0xFA19, "M", "神"), + (0xFA1A, "M", "祥"), + (0xFA1B, "M", "福"), + (0xFA1C, "M", "靖"), + (0xFA1D, "M", "精"), + (0xFA1E, "M", "羽"), + (0xFA1F, "V"), + (0xFA20, "M", "蘒"), + (0xFA21, "V"), + (0xFA22, "M", "諸"), + (0xFA23, "V"), + (0xFA25, "M", "逸"), + (0xFA26, "M", "都"), + (0xFA27, "V"), + (0xFA2A, "M", "飯"), + (0xFA2B, "M", "飼"), + (0xFA2C, "M", "館"), + (0xFA2D, "M", "鶴"), + (0xFA2E, "M", "郞"), + (0xFA2F, "M", "隷"), + (0xFA30, "M", "侮"), + (0xFA31, "M", "僧"), + (0xFA32, "M", "免"), + (0xFA33, "M", "勉"), + (0xFA34, "M", "勤"), + (0xFA35, "M", "卑"), + (0xFA36, "M", "喝"), + (0xFA37, "M", "嘆"), + (0xFA38, "M", "器"), + (0xFA39, "M", "塀"), + (0xFA3A, "M", "墨"), + (0xFA3B, "M", "層"), + (0xFA3C, "M", "屮"), + (0xFA3D, "M", "悔"), + (0xFA3E, "M", "慨"), + (0xFA3F, "M", "憎"), + (0xFA40, "M", "懲"), + (0xFA41, "M", "敏"), + (0xFA42, "M", "既"), + (0xFA43, "M", "暑"), + (0xFA44, "M", "梅"), + (0xFA45, "M", "海"), + (0xFA46, "M", "渚"), + (0xFA47, "M", "漢"), + (0xFA48, "M", "煮"), + (0xFA49, "M", "爫"), + (0xFA4A, "M", "琢"), + (0xFA4B, "M", "碑"), + (0xFA4C, "M", "社"), + (0xFA4D, "M", "祉"), + (0xFA4E, "M", "祈"), + (0xFA4F, "M", "祐"), + (0xFA50, "M", "祖"), + (0xFA51, "M", "祝"), + (0xFA52, "M", "禍"), + (0xFA53, "M", "禎"), + (0xFA54, "M", "穀"), + (0xFA55, "M", "突"), + (0xFA56, "M", "節"), + (0xFA57, "M", "練"), + (0xFA58, "M", "縉"), + (0xFA59, "M", "繁"), + (0xFA5A, "M", "署"), + (0xFA5B, "M", "者"), + (0xFA5C, "M", "臭"), + (0xFA5D, "M", "艹"), + (0xFA5F, "M", "著"), + (0xFA60, "M", "褐"), + (0xFA61, "M", "視"), + (0xFA62, "M", "謁"), + (0xFA63, "M", "謹"), + (0xFA64, "M", "賓"), + (0xFA65, "M", "贈"), + (0xFA66, "M", "辶"), + (0xFA67, "M", "逸"), + (0xFA68, "M", "難"), + (0xFA69, "M", "響"), + (0xFA6A, "M", "頻"), + (0xFA6B, "M", "恵"), + (0xFA6C, "M", "𤋮"), + (0xFA6D, "M", "舘"), + (0xFA6E, "X"), + (0xFA70, "M", "並"), + (0xFA71, "M", "况"), + (0xFA72, "M", "全"), + (0xFA73, "M", "侀"), + (0xFA74, "M", "充"), + (0xFA75, "M", "冀"), + (0xFA76, "M", "勇"), + (0xFA77, "M", "勺"), + (0xFA78, "M", "喝"), + (0xFA79, "M", "啕"), + (0xFA7A, "M", "喙"), + (0xFA7B, "M", "嗢"), + (0xFA7C, "M", "塚"), ] + def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFA7D, 'M', '墳'), - (0xFA7E, 'M', '奄'), - (0xFA7F, 'M', '奔'), - (0xFA80, 'M', '婢'), - (0xFA81, 'M', '嬨'), - (0xFA82, 'M', '廒'), - (0xFA83, 'M', '廙'), - (0xFA84, 'M', '彩'), - (0xFA85, 'M', '徭'), - (0xFA86, 'M', '惘'), - (0xFA87, 'M', '慎'), - (0xFA88, 'M', '愈'), - (0xFA89, 'M', '憎'), - (0xFA8A, 'M', '慠'), - (0xFA8B, 'M', '懲'), - (0xFA8C, 'M', '戴'), - (0xFA8D, 'M', '揄'), - (0xFA8E, 'M', '搜'), - (0xFA8F, 'M', '摒'), - (0xFA90, 'M', '敖'), - (0xFA91, 'M', '晴'), - (0xFA92, 'M', '朗'), - (0xFA93, 'M', '望'), - (0xFA94, 'M', '杖'), - (0xFA95, 'M', '歹'), - (0xFA96, 'M', '殺'), - (0xFA97, 'M', '流'), - (0xFA98, 'M', '滛'), - (0xFA99, 'M', '滋'), - (0xFA9A, 'M', '漢'), - (0xFA9B, 'M', '瀞'), - (0xFA9C, 'M', '煮'), - (0xFA9D, 'M', '瞧'), - (0xFA9E, 'M', '爵'), - (0xFA9F, 'M', '犯'), - (0xFAA0, 'M', '猪'), - (0xFAA1, 'M', '瑱'), - (0xFAA2, 'M', '甆'), - (0xFAA3, 'M', '画'), - (0xFAA4, 'M', '瘝'), - (0xFAA5, 'M', '瘟'), - (0xFAA6, 'M', '益'), - (0xFAA7, 'M', '盛'), - (0xFAA8, 'M', '直'), - (0xFAA9, 'M', '睊'), - (0xFAAA, 'M', '着'), - (0xFAAB, 'M', '磌'), - (0xFAAC, 'M', '窱'), - (0xFAAD, 'M', '節'), - (0xFAAE, 'M', '类'), - (0xFAAF, 'M', '絛'), - (0xFAB0, 'M', '練'), - (0xFAB1, 'M', '缾'), - (0xFAB2, 'M', '者'), - (0xFAB3, 'M', '荒'), - (0xFAB4, 'M', '華'), - (0xFAB5, 'M', '蝹'), - (0xFAB6, 'M', '襁'), - (0xFAB7, 'M', '覆'), - (0xFAB8, 'M', '視'), - (0xFAB9, 'M', '調'), - (0xFABA, 'M', '諸'), - (0xFABB, 'M', '請'), - (0xFABC, 'M', '謁'), - (0xFABD, 'M', '諾'), - (0xFABE, 'M', '諭'), - (0xFABF, 'M', '謹'), - (0xFAC0, 'M', '變'), - (0xFAC1, 'M', '贈'), - (0xFAC2, 'M', '輸'), - (0xFAC3, 'M', '遲'), - (0xFAC4, 'M', '醙'), - (0xFAC5, 'M', '鉶'), - (0xFAC6, 'M', '陼'), - (0xFAC7, 'M', '難'), - (0xFAC8, 'M', '靖'), - (0xFAC9, 'M', '韛'), - (0xFACA, 'M', '響'), - (0xFACB, 'M', '頋'), - (0xFACC, 'M', '頻'), - (0xFACD, 'M', '鬒'), - (0xFACE, 'M', '龜'), - (0xFACF, 'M', '𢡊'), - (0xFAD0, 'M', '𢡄'), - (0xFAD1, 'M', '𣏕'), - (0xFAD2, 'M', '㮝'), - (0xFAD3, 'M', '䀘'), - (0xFAD4, 'M', '䀹'), - (0xFAD5, 'M', '𥉉'), - (0xFAD6, 'M', '𥳐'), - (0xFAD7, 'M', '𧻓'), - (0xFAD8, 'M', '齃'), - (0xFAD9, 'M', '龎'), - (0xFADA, 'X'), - (0xFB00, 'M', 'ff'), - (0xFB01, 'M', 'fi'), - (0xFB02, 'M', 'fl'), - (0xFB03, 'M', 'ffi'), - (0xFB04, 'M', 'ffl'), - (0xFB05, 'M', 'st'), + (0xFA7D, "M", "墳"), + (0xFA7E, "M", "奄"), + (0xFA7F, "M", "奔"), + (0xFA80, "M", "婢"), + (0xFA81, "M", "嬨"), + (0xFA82, "M", "廒"), + (0xFA83, "M", "廙"), + (0xFA84, "M", "彩"), + (0xFA85, "M", "徭"), + (0xFA86, "M", "惘"), + (0xFA87, "M", "慎"), + (0xFA88, "M", "愈"), + (0xFA89, "M", "憎"), + (0xFA8A, "M", "慠"), + (0xFA8B, "M", "懲"), + (0xFA8C, "M", "戴"), + (0xFA8D, "M", "揄"), + (0xFA8E, "M", "搜"), + (0xFA8F, "M", "摒"), + (0xFA90, "M", "敖"), + (0xFA91, "M", "晴"), + (0xFA92, "M", "朗"), + (0xFA93, "M", "望"), + (0xFA94, "M", "杖"), + (0xFA95, "M", "歹"), + (0xFA96, "M", "殺"), + (0xFA97, "M", "流"), + (0xFA98, "M", "滛"), + (0xFA99, "M", "滋"), + (0xFA9A, "M", "漢"), + (0xFA9B, "M", "瀞"), + (0xFA9C, "M", "煮"), + (0xFA9D, "M", "瞧"), + (0xFA9E, "M", "爵"), + (0xFA9F, "M", "犯"), + (0xFAA0, "M", "猪"), + (0xFAA1, "M", "瑱"), + (0xFAA2, "M", "甆"), + (0xFAA3, "M", "画"), + (0xFAA4, "M", "瘝"), + (0xFAA5, "M", "瘟"), + (0xFAA6, "M", "益"), + (0xFAA7, "M", "盛"), + (0xFAA8, "M", "直"), + (0xFAA9, "M", "睊"), + (0xFAAA, "M", "着"), + (0xFAAB, "M", "磌"), + (0xFAAC, "M", "窱"), + (0xFAAD, "M", "節"), + (0xFAAE, "M", "类"), + (0xFAAF, "M", "絛"), + (0xFAB0, "M", "練"), + (0xFAB1, "M", "缾"), + (0xFAB2, "M", "者"), + (0xFAB3, "M", "荒"), + (0xFAB4, "M", "華"), + (0xFAB5, "M", "蝹"), + (0xFAB6, "M", "襁"), + (0xFAB7, "M", "覆"), + (0xFAB8, "M", "視"), + (0xFAB9, "M", "調"), + (0xFABA, "M", "諸"), + (0xFABB, "M", "請"), + (0xFABC, "M", "謁"), + (0xFABD, "M", "諾"), + (0xFABE, "M", "諭"), + (0xFABF, "M", "謹"), + (0xFAC0, "M", "變"), + (0xFAC1, "M", "贈"), + (0xFAC2, "M", "輸"), + (0xFAC3, "M", "遲"), + (0xFAC4, "M", "醙"), + (0xFAC5, "M", "鉶"), + (0xFAC6, "M", "陼"), + (0xFAC7, "M", "難"), + (0xFAC8, "M", "靖"), + (0xFAC9, "M", "韛"), + (0xFACA, "M", "響"), + (0xFACB, "M", "頋"), + (0xFACC, "M", "頻"), + (0xFACD, "M", "鬒"), + (0xFACE, "M", "龜"), + (0xFACF, "M", "𢡊"), + (0xFAD0, "M", "𢡄"), + (0xFAD1, "M", "𣏕"), + (0xFAD2, "M", "㮝"), + (0xFAD3, "M", "䀘"), + (0xFAD4, "M", "䀹"), + (0xFAD5, "M", "𥉉"), + (0xFAD6, "M", "𥳐"), + (0xFAD7, "M", "𧻓"), + (0xFAD8, "M", "齃"), + (0xFAD9, "M", "龎"), + (0xFADA, "X"), + (0xFB00, "M", "ff"), + (0xFB01, "M", "fi"), + (0xFB02, "M", "fl"), + (0xFB03, "M", "ffi"), + (0xFB04, "M", "ffl"), + (0xFB05, "M", "st"), ] + def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFB07, 'X'), - (0xFB13, 'M', 'մն'), - (0xFB14, 'M', 'մե'), - (0xFB15, 'M', 'մի'), - (0xFB16, 'M', 'վն'), - (0xFB17, 'M', 'մխ'), - (0xFB18, 'X'), - (0xFB1D, 'M', 'יִ'), - (0xFB1E, 'V'), - (0xFB1F, 'M', 'ײַ'), - (0xFB20, 'M', 'ע'), - (0xFB21, 'M', 'א'), - (0xFB22, 'M', 'ד'), - (0xFB23, 'M', 'ה'), - (0xFB24, 'M', 'כ'), - (0xFB25, 'M', 'ל'), - (0xFB26, 'M', 'ם'), - (0xFB27, 'M', 'ר'), - (0xFB28, 'M', 'ת'), - (0xFB29, '3', '+'), - (0xFB2A, 'M', 'שׁ'), - (0xFB2B, 'M', 'שׂ'), - (0xFB2C, 'M', 'שּׁ'), - (0xFB2D, 'M', 'שּׂ'), - (0xFB2E, 'M', 'אַ'), - (0xFB2F, 'M', 'אָ'), - (0xFB30, 'M', 'אּ'), - (0xFB31, 'M', 'בּ'), - (0xFB32, 'M', 'גּ'), - (0xFB33, 'M', 'דּ'), - (0xFB34, 'M', 'הּ'), - (0xFB35, 'M', 'וּ'), - (0xFB36, 'M', 'זּ'), - (0xFB37, 'X'), - (0xFB38, 'M', 'טּ'), - (0xFB39, 'M', 'יּ'), - (0xFB3A, 'M', 'ךּ'), - (0xFB3B, 'M', 'כּ'), - (0xFB3C, 'M', 'לּ'), - (0xFB3D, 'X'), - (0xFB3E, 'M', 'מּ'), - (0xFB3F, 'X'), - (0xFB40, 'M', 'נּ'), - (0xFB41, 'M', 'סּ'), - (0xFB42, 'X'), - (0xFB43, 'M', 'ףּ'), - (0xFB44, 'M', 'פּ'), - (0xFB45, 'X'), - (0xFB46, 'M', 'צּ'), - (0xFB47, 'M', 'קּ'), - (0xFB48, 'M', 'רּ'), - (0xFB49, 'M', 'שּ'), - (0xFB4A, 'M', 'תּ'), - (0xFB4B, 'M', 'וֹ'), - (0xFB4C, 'M', 'בֿ'), - (0xFB4D, 'M', 'כֿ'), - (0xFB4E, 'M', 'פֿ'), - (0xFB4F, 'M', 'אל'), - (0xFB50, 'M', 'ٱ'), - (0xFB52, 'M', 'ٻ'), - (0xFB56, 'M', 'پ'), - (0xFB5A, 'M', 'ڀ'), - (0xFB5E, 'M', 'ٺ'), - (0xFB62, 'M', 'ٿ'), - (0xFB66, 'M', 'ٹ'), - (0xFB6A, 'M', 'ڤ'), - (0xFB6E, 'M', 'ڦ'), - (0xFB72, 'M', 'ڄ'), - (0xFB76, 'M', 'ڃ'), - (0xFB7A, 'M', 'چ'), - (0xFB7E, 'M', 'ڇ'), - (0xFB82, 'M', 'ڍ'), - (0xFB84, 'M', 'ڌ'), - (0xFB86, 'M', 'ڎ'), - (0xFB88, 'M', 'ڈ'), - (0xFB8A, 'M', 'ژ'), - (0xFB8C, 'M', 'ڑ'), - (0xFB8E, 'M', 'ک'), - (0xFB92, 'M', 'گ'), - (0xFB96, 'M', 'ڳ'), - (0xFB9A, 'M', 'ڱ'), - (0xFB9E, 'M', 'ں'), - (0xFBA0, 'M', 'ڻ'), - (0xFBA4, 'M', 'ۀ'), - (0xFBA6, 'M', 'ہ'), - (0xFBAA, 'M', 'ھ'), - (0xFBAE, 'M', 'ے'), - (0xFBB0, 'M', 'ۓ'), - (0xFBB2, 'V'), - (0xFBC3, 'X'), - (0xFBD3, 'M', 'ڭ'), - (0xFBD7, 'M', 'ۇ'), - (0xFBD9, 'M', 'ۆ'), - (0xFBDB, 'M', 'ۈ'), - (0xFBDD, 'M', 'ۇٴ'), - (0xFBDE, 'M', 'ۋ'), - (0xFBE0, 'M', 'ۅ'), - (0xFBE2, 'M', 'ۉ'), - (0xFBE4, 'M', 'ې'), - (0xFBE8, 'M', 'ى'), + (0xFB07, "X"), + (0xFB13, "M", "մն"), + (0xFB14, "M", "մե"), + (0xFB15, "M", "մի"), + (0xFB16, "M", "վն"), + (0xFB17, "M", "մխ"), + (0xFB18, "X"), + (0xFB1D, "M", "יִ"), + (0xFB1E, "V"), + (0xFB1F, "M", "ײַ"), + (0xFB20, "M", "ע"), + (0xFB21, "M", "א"), + (0xFB22, "M", "ד"), + (0xFB23, "M", "ה"), + (0xFB24, "M", "כ"), + (0xFB25, "M", "ל"), + (0xFB26, "M", "ם"), + (0xFB27, "M", "ר"), + (0xFB28, "M", "ת"), + (0xFB29, "3", "+"), + (0xFB2A, "M", "שׁ"), + (0xFB2B, "M", "שׂ"), + (0xFB2C, "M", "שּׁ"), + (0xFB2D, "M", "שּׂ"), + (0xFB2E, "M", "אַ"), + (0xFB2F, "M", "אָ"), + (0xFB30, "M", "אּ"), + (0xFB31, "M", "בּ"), + (0xFB32, "M", "גּ"), + (0xFB33, "M", "דּ"), + (0xFB34, "M", "הּ"), + (0xFB35, "M", "וּ"), + (0xFB36, "M", "זּ"), + (0xFB37, "X"), + (0xFB38, "M", "טּ"), + (0xFB39, "M", "יּ"), + (0xFB3A, "M", "ךּ"), + (0xFB3B, "M", "כּ"), + (0xFB3C, "M", "לּ"), + (0xFB3D, "X"), + (0xFB3E, "M", "מּ"), + (0xFB3F, "X"), + (0xFB40, "M", "נּ"), + (0xFB41, "M", "סּ"), + (0xFB42, "X"), + (0xFB43, "M", "ףּ"), + (0xFB44, "M", "פּ"), + (0xFB45, "X"), + (0xFB46, "M", "צּ"), + (0xFB47, "M", "קּ"), + (0xFB48, "M", "רּ"), + (0xFB49, "M", "שּ"), + (0xFB4A, "M", "תּ"), + (0xFB4B, "M", "וֹ"), + (0xFB4C, "M", "בֿ"), + (0xFB4D, "M", "כֿ"), + (0xFB4E, "M", "פֿ"), + (0xFB4F, "M", "אל"), + (0xFB50, "M", "ٱ"), + (0xFB52, "M", "ٻ"), + (0xFB56, "M", "پ"), + (0xFB5A, "M", "ڀ"), + (0xFB5E, "M", "ٺ"), + (0xFB62, "M", "ٿ"), + (0xFB66, "M", "ٹ"), + (0xFB6A, "M", "ڤ"), + (0xFB6E, "M", "ڦ"), + (0xFB72, "M", "ڄ"), + (0xFB76, "M", "ڃ"), + (0xFB7A, "M", "چ"), + (0xFB7E, "M", "ڇ"), + (0xFB82, "M", "ڍ"), + (0xFB84, "M", "ڌ"), + (0xFB86, "M", "ڎ"), + (0xFB88, "M", "ڈ"), + (0xFB8A, "M", "ژ"), + (0xFB8C, "M", "ڑ"), + (0xFB8E, "M", "ک"), + (0xFB92, "M", "گ"), + (0xFB96, "M", "ڳ"), + (0xFB9A, "M", "ڱ"), + (0xFB9E, "M", "ں"), + (0xFBA0, "M", "ڻ"), + (0xFBA4, "M", "ۀ"), + (0xFBA6, "M", "ہ"), + (0xFBAA, "M", "ھ"), + (0xFBAE, "M", "ے"), + (0xFBB0, "M", "ۓ"), + (0xFBB2, "V"), + (0xFBC3, "X"), + (0xFBD3, "M", "ڭ"), + (0xFBD7, "M", "ۇ"), + (0xFBD9, "M", "ۆ"), + (0xFBDB, "M", "ۈ"), + (0xFBDD, "M", "ۇٴ"), + (0xFBDE, "M", "ۋ"), + (0xFBE0, "M", "ۅ"), + (0xFBE2, "M", "ۉ"), + (0xFBE4, "M", "ې"), + (0xFBE8, "M", "ى"), ] + def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFBEA, 'M', 'ئا'), - (0xFBEC, 'M', 'ئە'), - (0xFBEE, 'M', 'ئو'), - (0xFBF0, 'M', 'ئۇ'), - (0xFBF2, 'M', 'ئۆ'), - (0xFBF4, 'M', 'ئۈ'), - (0xFBF6, 'M', 'ئې'), - (0xFBF9, 'M', 'ئى'), - (0xFBFC, 'M', 'ی'), - (0xFC00, 'M', 'ئج'), - (0xFC01, 'M', 'ئح'), - (0xFC02, 'M', 'ئم'), - (0xFC03, 'M', 'ئى'), - (0xFC04, 'M', 'ئي'), - (0xFC05, 'M', 'بج'), - (0xFC06, 'M', 'بح'), - (0xFC07, 'M', 'بخ'), - (0xFC08, 'M', 'بم'), - (0xFC09, 'M', 'بى'), - (0xFC0A, 'M', 'بي'), - (0xFC0B, 'M', 'تج'), - (0xFC0C, 'M', 'تح'), - (0xFC0D, 'M', 'تخ'), - (0xFC0E, 'M', 'تم'), - (0xFC0F, 'M', 'تى'), - (0xFC10, 'M', 'تي'), - (0xFC11, 'M', 'ثج'), - (0xFC12, 'M', 'ثم'), - (0xFC13, 'M', 'ثى'), - (0xFC14, 'M', 'ثي'), - (0xFC15, 'M', 'جح'), - (0xFC16, 'M', 'جم'), - (0xFC17, 'M', 'حج'), - (0xFC18, 'M', 'حم'), - (0xFC19, 'M', 'خج'), - (0xFC1A, 'M', 'خح'), - (0xFC1B, 'M', 'خم'), - (0xFC1C, 'M', 'سج'), - (0xFC1D, 'M', 'سح'), - (0xFC1E, 'M', 'سخ'), - (0xFC1F, 'M', 'سم'), - (0xFC20, 'M', 'صح'), - (0xFC21, 'M', 'صم'), - (0xFC22, 'M', 'ضج'), - (0xFC23, 'M', 'ضح'), - (0xFC24, 'M', 'ضخ'), - (0xFC25, 'M', 'ضم'), - (0xFC26, 'M', 'طح'), - (0xFC27, 'M', 'طم'), - (0xFC28, 'M', 'ظم'), - (0xFC29, 'M', 'عج'), - (0xFC2A, 'M', 'عم'), - (0xFC2B, 'M', 'غج'), - (0xFC2C, 'M', 'غم'), - (0xFC2D, 'M', 'فج'), - (0xFC2E, 'M', 'فح'), - (0xFC2F, 'M', 'فخ'), - (0xFC30, 'M', 'فم'), - (0xFC31, 'M', 'فى'), - (0xFC32, 'M', 'في'), - (0xFC33, 'M', 'قح'), - (0xFC34, 'M', 'قم'), - (0xFC35, 'M', 'قى'), - (0xFC36, 'M', 'قي'), - (0xFC37, 'M', 'كا'), - (0xFC38, 'M', 'كج'), - (0xFC39, 'M', 'كح'), - (0xFC3A, 'M', 'كخ'), - (0xFC3B, 'M', 'كل'), - (0xFC3C, 'M', 'كم'), - (0xFC3D, 'M', 'كى'), - (0xFC3E, 'M', 'كي'), - (0xFC3F, 'M', 'لج'), - (0xFC40, 'M', 'لح'), - (0xFC41, 'M', 'لخ'), - (0xFC42, 'M', 'لم'), - (0xFC43, 'M', 'لى'), - (0xFC44, 'M', 'لي'), - (0xFC45, 'M', 'مج'), - (0xFC46, 'M', 'مح'), - (0xFC47, 'M', 'مخ'), - (0xFC48, 'M', 'مم'), - (0xFC49, 'M', 'مى'), - (0xFC4A, 'M', 'مي'), - (0xFC4B, 'M', 'نج'), - (0xFC4C, 'M', 'نح'), - (0xFC4D, 'M', 'نخ'), - (0xFC4E, 'M', 'نم'), - (0xFC4F, 'M', 'نى'), - (0xFC50, 'M', 'ني'), - (0xFC51, 'M', 'هج'), - (0xFC52, 'M', 'هم'), - (0xFC53, 'M', 'هى'), - (0xFC54, 'M', 'هي'), - (0xFC55, 'M', 'يج'), - (0xFC56, 'M', 'يح'), - (0xFC57, 'M', 'يخ'), - (0xFC58, 'M', 'يم'), - (0xFC59, 'M', 'يى'), - (0xFC5A, 'M', 'يي'), + (0xFBEA, "M", "ئا"), + (0xFBEC, "M", "ئە"), + (0xFBEE, "M", "ئو"), + (0xFBF0, "M", "ئۇ"), + (0xFBF2, "M", "ئۆ"), + (0xFBF4, "M", "ئۈ"), + (0xFBF6, "M", "ئې"), + (0xFBF9, "M", "ئى"), + (0xFBFC, "M", "ی"), + (0xFC00, "M", "ئج"), + (0xFC01, "M", "ئح"), + (0xFC02, "M", "ئم"), + (0xFC03, "M", "ئى"), + (0xFC04, "M", "ئي"), + (0xFC05, "M", "بج"), + (0xFC06, "M", "بح"), + (0xFC07, "M", "بخ"), + (0xFC08, "M", "بم"), + (0xFC09, "M", "بى"), + (0xFC0A, "M", "بي"), + (0xFC0B, "M", "تج"), + (0xFC0C, "M", "تح"), + (0xFC0D, "M", "تخ"), + (0xFC0E, "M", "تم"), + (0xFC0F, "M", "تى"), + (0xFC10, "M", "تي"), + (0xFC11, "M", "ثج"), + (0xFC12, "M", "ثم"), + (0xFC13, "M", "ثى"), + (0xFC14, "M", "ثي"), + (0xFC15, "M", "جح"), + (0xFC16, "M", "جم"), + (0xFC17, "M", "حج"), + (0xFC18, "M", "حم"), + (0xFC19, "M", "خج"), + (0xFC1A, "M", "خح"), + (0xFC1B, "M", "خم"), + (0xFC1C, "M", "سج"), + (0xFC1D, "M", "سح"), + (0xFC1E, "M", "سخ"), + (0xFC1F, "M", "سم"), + (0xFC20, "M", "صح"), + (0xFC21, "M", "صم"), + (0xFC22, "M", "ضج"), + (0xFC23, "M", "ضح"), + (0xFC24, "M", "ضخ"), + (0xFC25, "M", "ضم"), + (0xFC26, "M", "طح"), + (0xFC27, "M", "طم"), + (0xFC28, "M", "ظم"), + (0xFC29, "M", "عج"), + (0xFC2A, "M", "عم"), + (0xFC2B, "M", "غج"), + (0xFC2C, "M", "غم"), + (0xFC2D, "M", "فج"), + (0xFC2E, "M", "فح"), + (0xFC2F, "M", "فخ"), + (0xFC30, "M", "فم"), + (0xFC31, "M", "فى"), + (0xFC32, "M", "في"), + (0xFC33, "M", "قح"), + (0xFC34, "M", "قم"), + (0xFC35, "M", "قى"), + (0xFC36, "M", "قي"), + (0xFC37, "M", "كا"), + (0xFC38, "M", "كج"), + (0xFC39, "M", "كح"), + (0xFC3A, "M", "كخ"), + (0xFC3B, "M", "كل"), + (0xFC3C, "M", "كم"), + (0xFC3D, "M", "كى"), + (0xFC3E, "M", "كي"), + (0xFC3F, "M", "لج"), + (0xFC40, "M", "لح"), + (0xFC41, "M", "لخ"), + (0xFC42, "M", "لم"), + (0xFC43, "M", "لى"), + (0xFC44, "M", "لي"), + (0xFC45, "M", "مج"), + (0xFC46, "M", "مح"), + (0xFC47, "M", "مخ"), + (0xFC48, "M", "مم"), + (0xFC49, "M", "مى"), + (0xFC4A, "M", "مي"), + (0xFC4B, "M", "نج"), + (0xFC4C, "M", "نح"), + (0xFC4D, "M", "نخ"), + (0xFC4E, "M", "نم"), + (0xFC4F, "M", "نى"), + (0xFC50, "M", "ني"), + (0xFC51, "M", "هج"), + (0xFC52, "M", "هم"), + (0xFC53, "M", "هى"), + (0xFC54, "M", "هي"), + (0xFC55, "M", "يج"), + (0xFC56, "M", "يح"), + (0xFC57, "M", "يخ"), + (0xFC58, "M", "يم"), + (0xFC59, "M", "يى"), + (0xFC5A, "M", "يي"), ] + def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFC5B, 'M', 'ذٰ'), - (0xFC5C, 'M', 'رٰ'), - (0xFC5D, 'M', 'ىٰ'), - (0xFC5E, '3', ' ٌّ'), - (0xFC5F, '3', ' ٍّ'), - (0xFC60, '3', ' َّ'), - (0xFC61, '3', ' ُّ'), - (0xFC62, '3', ' ِّ'), - (0xFC63, '3', ' ّٰ'), - (0xFC64, 'M', 'ئر'), - (0xFC65, 'M', 'ئز'), - (0xFC66, 'M', 'ئم'), - (0xFC67, 'M', 'ئن'), - (0xFC68, 'M', 'ئى'), - (0xFC69, 'M', 'ئي'), - (0xFC6A, 'M', 'بر'), - (0xFC6B, 'M', 'بز'), - (0xFC6C, 'M', 'بم'), - (0xFC6D, 'M', 'بن'), - (0xFC6E, 'M', 'بى'), - (0xFC6F, 'M', 'بي'), - (0xFC70, 'M', 'تر'), - (0xFC71, 'M', 'تز'), - (0xFC72, 'M', 'تم'), - (0xFC73, 'M', 'تن'), - (0xFC74, 'M', 'تى'), - (0xFC75, 'M', 'تي'), - (0xFC76, 'M', 'ثر'), - (0xFC77, 'M', 'ثز'), - (0xFC78, 'M', 'ثم'), - (0xFC79, 'M', 'ثن'), - (0xFC7A, 'M', 'ثى'), - (0xFC7B, 'M', 'ثي'), - (0xFC7C, 'M', 'فى'), - (0xFC7D, 'M', 'في'), - (0xFC7E, 'M', 'قى'), - (0xFC7F, 'M', 'قي'), - (0xFC80, 'M', 'كا'), - (0xFC81, 'M', 'كل'), - (0xFC82, 'M', 'كم'), - (0xFC83, 'M', 'كى'), - (0xFC84, 'M', 'كي'), - (0xFC85, 'M', 'لم'), - (0xFC86, 'M', 'لى'), - (0xFC87, 'M', 'لي'), - (0xFC88, 'M', 'ما'), - (0xFC89, 'M', 'مم'), - (0xFC8A, 'M', 'نر'), - (0xFC8B, 'M', 'نز'), - (0xFC8C, 'M', 'نم'), - (0xFC8D, 'M', 'نن'), - (0xFC8E, 'M', 'نى'), - (0xFC8F, 'M', 'ني'), - (0xFC90, 'M', 'ىٰ'), - (0xFC91, 'M', 'ير'), - (0xFC92, 'M', 'يز'), - (0xFC93, 'M', 'يم'), - (0xFC94, 'M', 'ين'), - (0xFC95, 'M', 'يى'), - (0xFC96, 'M', 'يي'), - (0xFC97, 'M', 'ئج'), - (0xFC98, 'M', 'ئح'), - (0xFC99, 'M', 'ئخ'), - (0xFC9A, 'M', 'ئم'), - (0xFC9B, 'M', 'ئه'), - (0xFC9C, 'M', 'بج'), - (0xFC9D, 'M', 'بح'), - (0xFC9E, 'M', 'بخ'), - (0xFC9F, 'M', 'بم'), - (0xFCA0, 'M', 'به'), - (0xFCA1, 'M', 'تج'), - (0xFCA2, 'M', 'تح'), - (0xFCA3, 'M', 'تخ'), - (0xFCA4, 'M', 'تم'), - (0xFCA5, 'M', 'ته'), - (0xFCA6, 'M', 'ثم'), - (0xFCA7, 'M', 'جح'), - (0xFCA8, 'M', 'جم'), - (0xFCA9, 'M', 'حج'), - (0xFCAA, 'M', 'حم'), - (0xFCAB, 'M', 'خج'), - (0xFCAC, 'M', 'خم'), - (0xFCAD, 'M', 'سج'), - (0xFCAE, 'M', 'سح'), - (0xFCAF, 'M', 'سخ'), - (0xFCB0, 'M', 'سم'), - (0xFCB1, 'M', 'صح'), - (0xFCB2, 'M', 'صخ'), - (0xFCB3, 'M', 'صم'), - (0xFCB4, 'M', 'ضج'), - (0xFCB5, 'M', 'ضح'), - (0xFCB6, 'M', 'ضخ'), - (0xFCB7, 'M', 'ضم'), - (0xFCB8, 'M', 'طح'), - (0xFCB9, 'M', 'ظم'), - (0xFCBA, 'M', 'عج'), - (0xFCBB, 'M', 'عم'), - (0xFCBC, 'M', 'غج'), - (0xFCBD, 'M', 'غم'), - (0xFCBE, 'M', 'فج'), + (0xFC5B, "M", "ذٰ"), + (0xFC5C, "M", "رٰ"), + (0xFC5D, "M", "ىٰ"), + (0xFC5E, "3", " ٌّ"), + (0xFC5F, "3", " ٍّ"), + (0xFC60, "3", " َّ"), + (0xFC61, "3", " ُّ"), + (0xFC62, "3", " ِّ"), + (0xFC63, "3", " ّٰ"), + (0xFC64, "M", "ئر"), + (0xFC65, "M", "ئز"), + (0xFC66, "M", "ئم"), + (0xFC67, "M", "ئن"), + (0xFC68, "M", "ئى"), + (0xFC69, "M", "ئي"), + (0xFC6A, "M", "بر"), + (0xFC6B, "M", "بز"), + (0xFC6C, "M", "بم"), + (0xFC6D, "M", "بن"), + (0xFC6E, "M", "بى"), + (0xFC6F, "M", "بي"), + (0xFC70, "M", "تر"), + (0xFC71, "M", "تز"), + (0xFC72, "M", "تم"), + (0xFC73, "M", "تن"), + (0xFC74, "M", "تى"), + (0xFC75, "M", "تي"), + (0xFC76, "M", "ثر"), + (0xFC77, "M", "ثز"), + (0xFC78, "M", "ثم"), + (0xFC79, "M", "ثن"), + (0xFC7A, "M", "ثى"), + (0xFC7B, "M", "ثي"), + (0xFC7C, "M", "فى"), + (0xFC7D, "M", "في"), + (0xFC7E, "M", "قى"), + (0xFC7F, "M", "قي"), + (0xFC80, "M", "كا"), + (0xFC81, "M", "كل"), + (0xFC82, "M", "كم"), + (0xFC83, "M", "كى"), + (0xFC84, "M", "كي"), + (0xFC85, "M", "لم"), + (0xFC86, "M", "لى"), + (0xFC87, "M", "لي"), + (0xFC88, "M", "ما"), + (0xFC89, "M", "مم"), + (0xFC8A, "M", "نر"), + (0xFC8B, "M", "نز"), + (0xFC8C, "M", "نم"), + (0xFC8D, "M", "نن"), + (0xFC8E, "M", "نى"), + (0xFC8F, "M", "ني"), + (0xFC90, "M", "ىٰ"), + (0xFC91, "M", "ير"), + (0xFC92, "M", "يز"), + (0xFC93, "M", "يم"), + (0xFC94, "M", "ين"), + (0xFC95, "M", "يى"), + (0xFC96, "M", "يي"), + (0xFC97, "M", "ئج"), + (0xFC98, "M", "ئح"), + (0xFC99, "M", "ئخ"), + (0xFC9A, "M", "ئم"), + (0xFC9B, "M", "ئه"), + (0xFC9C, "M", "بج"), + (0xFC9D, "M", "بح"), + (0xFC9E, "M", "بخ"), + (0xFC9F, "M", "بم"), + (0xFCA0, "M", "به"), + (0xFCA1, "M", "تج"), + (0xFCA2, "M", "تح"), + (0xFCA3, "M", "تخ"), + (0xFCA4, "M", "تم"), + (0xFCA5, "M", "ته"), + (0xFCA6, "M", "ثم"), + (0xFCA7, "M", "جح"), + (0xFCA8, "M", "جم"), + (0xFCA9, "M", "حج"), + (0xFCAA, "M", "حم"), + (0xFCAB, "M", "خج"), + (0xFCAC, "M", "خم"), + (0xFCAD, "M", "سج"), + (0xFCAE, "M", "سح"), + (0xFCAF, "M", "سخ"), + (0xFCB0, "M", "سم"), + (0xFCB1, "M", "صح"), + (0xFCB2, "M", "صخ"), + (0xFCB3, "M", "صم"), + (0xFCB4, "M", "ضج"), + (0xFCB5, "M", "ضح"), + (0xFCB6, "M", "ضخ"), + (0xFCB7, "M", "ضم"), + (0xFCB8, "M", "طح"), + (0xFCB9, "M", "ظم"), + (0xFCBA, "M", "عج"), + (0xFCBB, "M", "عم"), + (0xFCBC, "M", "غج"), + (0xFCBD, "M", "غم"), + (0xFCBE, "M", "فج"), ] + def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFCBF, 'M', 'فح'), - (0xFCC0, 'M', 'فخ'), - (0xFCC1, 'M', 'فم'), - (0xFCC2, 'M', 'قح'), - (0xFCC3, 'M', 'قم'), - (0xFCC4, 'M', 'كج'), - (0xFCC5, 'M', 'كح'), - (0xFCC6, 'M', 'كخ'), - (0xFCC7, 'M', 'كل'), - (0xFCC8, 'M', 'كم'), - (0xFCC9, 'M', 'لج'), - (0xFCCA, 'M', 'لح'), - (0xFCCB, 'M', 'لخ'), - (0xFCCC, 'M', 'لم'), - (0xFCCD, 'M', 'له'), - (0xFCCE, 'M', 'مج'), - (0xFCCF, 'M', 'مح'), - (0xFCD0, 'M', 'مخ'), - (0xFCD1, 'M', 'مم'), - (0xFCD2, 'M', 'نج'), - (0xFCD3, 'M', 'نح'), - (0xFCD4, 'M', 'نخ'), - (0xFCD5, 'M', 'نم'), - (0xFCD6, 'M', 'نه'), - (0xFCD7, 'M', 'هج'), - (0xFCD8, 'M', 'هم'), - (0xFCD9, 'M', 'هٰ'), - (0xFCDA, 'M', 'يج'), - (0xFCDB, 'M', 'يح'), - (0xFCDC, 'M', 'يخ'), - (0xFCDD, 'M', 'يم'), - (0xFCDE, 'M', 'يه'), - (0xFCDF, 'M', 'ئم'), - (0xFCE0, 'M', 'ئه'), - (0xFCE1, 'M', 'بم'), - (0xFCE2, 'M', 'به'), - (0xFCE3, 'M', 'تم'), - (0xFCE4, 'M', 'ته'), - (0xFCE5, 'M', 'ثم'), - (0xFCE6, 'M', 'ثه'), - (0xFCE7, 'M', 'سم'), - (0xFCE8, 'M', 'سه'), - (0xFCE9, 'M', 'شم'), - (0xFCEA, 'M', 'شه'), - (0xFCEB, 'M', 'كل'), - (0xFCEC, 'M', 'كم'), - (0xFCED, 'M', 'لم'), - (0xFCEE, 'M', 'نم'), - (0xFCEF, 'M', 'نه'), - (0xFCF0, 'M', 'يم'), - (0xFCF1, 'M', 'يه'), - (0xFCF2, 'M', 'ـَّ'), - (0xFCF3, 'M', 'ـُّ'), - (0xFCF4, 'M', 'ـِّ'), - (0xFCF5, 'M', 'طى'), - (0xFCF6, 'M', 'طي'), - (0xFCF7, 'M', 'عى'), - (0xFCF8, 'M', 'عي'), - (0xFCF9, 'M', 'غى'), - (0xFCFA, 'M', 'غي'), - (0xFCFB, 'M', 'سى'), - (0xFCFC, 'M', 'سي'), - (0xFCFD, 'M', 'شى'), - (0xFCFE, 'M', 'شي'), - (0xFCFF, 'M', 'حى'), - (0xFD00, 'M', 'حي'), - (0xFD01, 'M', 'جى'), - (0xFD02, 'M', 'جي'), - (0xFD03, 'M', 'خى'), - (0xFD04, 'M', 'خي'), - (0xFD05, 'M', 'صى'), - (0xFD06, 'M', 'صي'), - (0xFD07, 'M', 'ضى'), - (0xFD08, 'M', 'ضي'), - (0xFD09, 'M', 'شج'), - (0xFD0A, 'M', 'شح'), - (0xFD0B, 'M', 'شخ'), - (0xFD0C, 'M', 'شم'), - (0xFD0D, 'M', 'شر'), - (0xFD0E, 'M', 'سر'), - (0xFD0F, 'M', 'صر'), - (0xFD10, 'M', 'ضر'), - (0xFD11, 'M', 'طى'), - (0xFD12, 'M', 'طي'), - (0xFD13, 'M', 'عى'), - (0xFD14, 'M', 'عي'), - (0xFD15, 'M', 'غى'), - (0xFD16, 'M', 'غي'), - (0xFD17, 'M', 'سى'), - (0xFD18, 'M', 'سي'), - (0xFD19, 'M', 'شى'), - (0xFD1A, 'M', 'شي'), - (0xFD1B, 'M', 'حى'), - (0xFD1C, 'M', 'حي'), - (0xFD1D, 'M', 'جى'), - (0xFD1E, 'M', 'جي'), - (0xFD1F, 'M', 'خى'), - (0xFD20, 'M', 'خي'), - (0xFD21, 'M', 'صى'), - (0xFD22, 'M', 'صي'), + (0xFCBF, "M", "فح"), + (0xFCC0, "M", "فخ"), + (0xFCC1, "M", "فم"), + (0xFCC2, "M", "قح"), + (0xFCC3, "M", "قم"), + (0xFCC4, "M", "كج"), + (0xFCC5, "M", "كح"), + (0xFCC6, "M", "كخ"), + (0xFCC7, "M", "كل"), + (0xFCC8, "M", "كم"), + (0xFCC9, "M", "لج"), + (0xFCCA, "M", "لح"), + (0xFCCB, "M", "لخ"), + (0xFCCC, "M", "لم"), + (0xFCCD, "M", "له"), + (0xFCCE, "M", "مج"), + (0xFCCF, "M", "مح"), + (0xFCD0, "M", "مخ"), + (0xFCD1, "M", "مم"), + (0xFCD2, "M", "نج"), + (0xFCD3, "M", "نح"), + (0xFCD4, "M", "نخ"), + (0xFCD5, "M", "نم"), + (0xFCD6, "M", "نه"), + (0xFCD7, "M", "هج"), + (0xFCD8, "M", "هم"), + (0xFCD9, "M", "هٰ"), + (0xFCDA, "M", "يج"), + (0xFCDB, "M", "يح"), + (0xFCDC, "M", "يخ"), + (0xFCDD, "M", "يم"), + (0xFCDE, "M", "يه"), + (0xFCDF, "M", "ئم"), + (0xFCE0, "M", "ئه"), + (0xFCE1, "M", "بم"), + (0xFCE2, "M", "به"), + (0xFCE3, "M", "تم"), + (0xFCE4, "M", "ته"), + (0xFCE5, "M", "ثم"), + (0xFCE6, "M", "ثه"), + (0xFCE7, "M", "سم"), + (0xFCE8, "M", "سه"), + (0xFCE9, "M", "شم"), + (0xFCEA, "M", "شه"), + (0xFCEB, "M", "كل"), + (0xFCEC, "M", "كم"), + (0xFCED, "M", "لم"), + (0xFCEE, "M", "نم"), + (0xFCEF, "M", "نه"), + (0xFCF0, "M", "يم"), + (0xFCF1, "M", "يه"), + (0xFCF2, "M", "ـَّ"), + (0xFCF3, "M", "ـُّ"), + (0xFCF4, "M", "ـِّ"), + (0xFCF5, "M", "طى"), + (0xFCF6, "M", "طي"), + (0xFCF7, "M", "عى"), + (0xFCF8, "M", "عي"), + (0xFCF9, "M", "غى"), + (0xFCFA, "M", "غي"), + (0xFCFB, "M", "سى"), + (0xFCFC, "M", "سي"), + (0xFCFD, "M", "شى"), + (0xFCFE, "M", "شي"), + (0xFCFF, "M", "حى"), + (0xFD00, "M", "حي"), + (0xFD01, "M", "جى"), + (0xFD02, "M", "جي"), + (0xFD03, "M", "خى"), + (0xFD04, "M", "خي"), + (0xFD05, "M", "صى"), + (0xFD06, "M", "صي"), + (0xFD07, "M", "ضى"), + (0xFD08, "M", "ضي"), + (0xFD09, "M", "شج"), + (0xFD0A, "M", "شح"), + (0xFD0B, "M", "شخ"), + (0xFD0C, "M", "شم"), + (0xFD0D, "M", "شر"), + (0xFD0E, "M", "سر"), + (0xFD0F, "M", "صر"), + (0xFD10, "M", "ضر"), + (0xFD11, "M", "طى"), + (0xFD12, "M", "طي"), + (0xFD13, "M", "عى"), + (0xFD14, "M", "عي"), + (0xFD15, "M", "غى"), + (0xFD16, "M", "غي"), + (0xFD17, "M", "سى"), + (0xFD18, "M", "سي"), + (0xFD19, "M", "شى"), + (0xFD1A, "M", "شي"), + (0xFD1B, "M", "حى"), + (0xFD1C, "M", "حي"), + (0xFD1D, "M", "جى"), + (0xFD1E, "M", "جي"), + (0xFD1F, "M", "خى"), + (0xFD20, "M", "خي"), + (0xFD21, "M", "صى"), + (0xFD22, "M", "صي"), ] + def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFD23, 'M', 'ضى'), - (0xFD24, 'M', 'ضي'), - (0xFD25, 'M', 'شج'), - (0xFD26, 'M', 'شح'), - (0xFD27, 'M', 'شخ'), - (0xFD28, 'M', 'شم'), - (0xFD29, 'M', 'شر'), - (0xFD2A, 'M', 'سر'), - (0xFD2B, 'M', 'صر'), - (0xFD2C, 'M', 'ضر'), - (0xFD2D, 'M', 'شج'), - (0xFD2E, 'M', 'شح'), - (0xFD2F, 'M', 'شخ'), - (0xFD30, 'M', 'شم'), - (0xFD31, 'M', 'سه'), - (0xFD32, 'M', 'شه'), - (0xFD33, 'M', 'طم'), - (0xFD34, 'M', 'سج'), - (0xFD35, 'M', 'سح'), - (0xFD36, 'M', 'سخ'), - (0xFD37, 'M', 'شج'), - (0xFD38, 'M', 'شح'), - (0xFD39, 'M', 'شخ'), - (0xFD3A, 'M', 'طم'), - (0xFD3B, 'M', 'ظم'), - (0xFD3C, 'M', 'اً'), - (0xFD3E, 'V'), - (0xFD50, 'M', 'تجم'), - (0xFD51, 'M', 'تحج'), - (0xFD53, 'M', 'تحم'), - (0xFD54, 'M', 'تخم'), - (0xFD55, 'M', 'تمج'), - (0xFD56, 'M', 'تمح'), - (0xFD57, 'M', 'تمخ'), - (0xFD58, 'M', 'جمح'), - (0xFD5A, 'M', 'حمي'), - (0xFD5B, 'M', 'حمى'), - (0xFD5C, 'M', 'سحج'), - (0xFD5D, 'M', 'سجح'), - (0xFD5E, 'M', 'سجى'), - (0xFD5F, 'M', 'سمح'), - (0xFD61, 'M', 'سمج'), - (0xFD62, 'M', 'سمم'), - (0xFD64, 'M', 'صحح'), - (0xFD66, 'M', 'صمم'), - (0xFD67, 'M', 'شحم'), - (0xFD69, 'M', 'شجي'), - (0xFD6A, 'M', 'شمخ'), - (0xFD6C, 'M', 'شمم'), - (0xFD6E, 'M', 'ضحى'), - (0xFD6F, 'M', 'ضخم'), - (0xFD71, 'M', 'طمح'), - (0xFD73, 'M', 'طمم'), - (0xFD74, 'M', 'طمي'), - (0xFD75, 'M', 'عجم'), - (0xFD76, 'M', 'عمم'), - (0xFD78, 'M', 'عمى'), - (0xFD79, 'M', 'غمم'), - (0xFD7A, 'M', 'غمي'), - (0xFD7B, 'M', 'غمى'), - (0xFD7C, 'M', 'فخم'), - (0xFD7E, 'M', 'قمح'), - (0xFD7F, 'M', 'قمم'), - (0xFD80, 'M', 'لحم'), - (0xFD81, 'M', 'لحي'), - (0xFD82, 'M', 'لحى'), - (0xFD83, 'M', 'لجج'), - (0xFD85, 'M', 'لخم'), - (0xFD87, 'M', 'لمح'), - (0xFD89, 'M', 'محج'), - (0xFD8A, 'M', 'محم'), - (0xFD8B, 'M', 'محي'), - (0xFD8C, 'M', 'مجح'), - (0xFD8D, 'M', 'مجم'), - (0xFD8E, 'M', 'مخج'), - (0xFD8F, 'M', 'مخم'), - (0xFD90, 'X'), - (0xFD92, 'M', 'مجخ'), - (0xFD93, 'M', 'همج'), - (0xFD94, 'M', 'همم'), - (0xFD95, 'M', 'نحم'), - (0xFD96, 'M', 'نحى'), - (0xFD97, 'M', 'نجم'), - (0xFD99, 'M', 'نجى'), - (0xFD9A, 'M', 'نمي'), - (0xFD9B, 'M', 'نمى'), - (0xFD9C, 'M', 'يمم'), - (0xFD9E, 'M', 'بخي'), - (0xFD9F, 'M', 'تجي'), - (0xFDA0, 'M', 'تجى'), - (0xFDA1, 'M', 'تخي'), - (0xFDA2, 'M', 'تخى'), - (0xFDA3, 'M', 'تمي'), - (0xFDA4, 'M', 'تمى'), - (0xFDA5, 'M', 'جمي'), - (0xFDA6, 'M', 'جحى'), - (0xFDA7, 'M', 'جمى'), - (0xFDA8, 'M', 'سخى'), - (0xFDA9, 'M', 'صحي'), - (0xFDAA, 'M', 'شحي'), + (0xFD23, "M", "ضى"), + (0xFD24, "M", "ضي"), + (0xFD25, "M", "شج"), + (0xFD26, "M", "شح"), + (0xFD27, "M", "شخ"), + (0xFD28, "M", "شم"), + (0xFD29, "M", "شر"), + (0xFD2A, "M", "سر"), + (0xFD2B, "M", "صر"), + (0xFD2C, "M", "ضر"), + (0xFD2D, "M", "شج"), + (0xFD2E, "M", "شح"), + (0xFD2F, "M", "شخ"), + (0xFD30, "M", "شم"), + (0xFD31, "M", "سه"), + (0xFD32, "M", "شه"), + (0xFD33, "M", "طم"), + (0xFD34, "M", "سج"), + (0xFD35, "M", "سح"), + (0xFD36, "M", "سخ"), + (0xFD37, "M", "شج"), + (0xFD38, "M", "شح"), + (0xFD39, "M", "شخ"), + (0xFD3A, "M", "طم"), + (0xFD3B, "M", "ظم"), + (0xFD3C, "M", "اً"), + (0xFD3E, "V"), + (0xFD50, "M", "تجم"), + (0xFD51, "M", "تحج"), + (0xFD53, "M", "تحم"), + (0xFD54, "M", "تخم"), + (0xFD55, "M", "تمج"), + (0xFD56, "M", "تمح"), + (0xFD57, "M", "تمخ"), + (0xFD58, "M", "جمح"), + (0xFD5A, "M", "حمي"), + (0xFD5B, "M", "حمى"), + (0xFD5C, "M", "سحج"), + (0xFD5D, "M", "سجح"), + (0xFD5E, "M", "سجى"), + (0xFD5F, "M", "سمح"), + (0xFD61, "M", "سمج"), + (0xFD62, "M", "سمم"), + (0xFD64, "M", "صحح"), + (0xFD66, "M", "صمم"), + (0xFD67, "M", "شحم"), + (0xFD69, "M", "شجي"), + (0xFD6A, "M", "شمخ"), + (0xFD6C, "M", "شمم"), + (0xFD6E, "M", "ضحى"), + (0xFD6F, "M", "ضخم"), + (0xFD71, "M", "طمح"), + (0xFD73, "M", "طمم"), + (0xFD74, "M", "طمي"), + (0xFD75, "M", "عجم"), + (0xFD76, "M", "عمم"), + (0xFD78, "M", "عمى"), + (0xFD79, "M", "غمم"), + (0xFD7A, "M", "غمي"), + (0xFD7B, "M", "غمى"), + (0xFD7C, "M", "فخم"), + (0xFD7E, "M", "قمح"), + (0xFD7F, "M", "قمم"), + (0xFD80, "M", "لحم"), + (0xFD81, "M", "لحي"), + (0xFD82, "M", "لحى"), + (0xFD83, "M", "لجج"), + (0xFD85, "M", "لخم"), + (0xFD87, "M", "لمح"), + (0xFD89, "M", "محج"), + (0xFD8A, "M", "محم"), + (0xFD8B, "M", "محي"), + (0xFD8C, "M", "مجح"), + (0xFD8D, "M", "مجم"), + (0xFD8E, "M", "مخج"), + (0xFD8F, "M", "مخم"), + (0xFD90, "X"), + (0xFD92, "M", "مجخ"), + (0xFD93, "M", "همج"), + (0xFD94, "M", "همم"), + (0xFD95, "M", "نحم"), + (0xFD96, "M", "نحى"), + (0xFD97, "M", "نجم"), + (0xFD99, "M", "نجى"), + (0xFD9A, "M", "نمي"), + (0xFD9B, "M", "نمى"), + (0xFD9C, "M", "يمم"), + (0xFD9E, "M", "بخي"), + (0xFD9F, "M", "تجي"), + (0xFDA0, "M", "تجى"), + (0xFDA1, "M", "تخي"), + (0xFDA2, "M", "تخى"), + (0xFDA3, "M", "تمي"), + (0xFDA4, "M", "تمى"), + (0xFDA5, "M", "جمي"), + (0xFDA6, "M", "جحى"), + (0xFDA7, "M", "جمى"), + (0xFDA8, "M", "سخى"), + (0xFDA9, "M", "صحي"), + (0xFDAA, "M", "شحي"), ] + def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFDAB, 'M', 'ضحي'), - (0xFDAC, 'M', 'لجي'), - (0xFDAD, 'M', 'لمي'), - (0xFDAE, 'M', 'يحي'), - (0xFDAF, 'M', 'يجي'), - (0xFDB0, 'M', 'يمي'), - (0xFDB1, 'M', 'ممي'), - (0xFDB2, 'M', 'قمي'), - (0xFDB3, 'M', 'نحي'), - (0xFDB4, 'M', 'قمح'), - (0xFDB5, 'M', 'لحم'), - (0xFDB6, 'M', 'عمي'), - (0xFDB7, 'M', 'كمي'), - (0xFDB8, 'M', 'نجح'), - (0xFDB9, 'M', 'مخي'), - (0xFDBA, 'M', 'لجم'), - (0xFDBB, 'M', 'كمم'), - (0xFDBC, 'M', 'لجم'), - (0xFDBD, 'M', 'نجح'), - (0xFDBE, 'M', 'جحي'), - (0xFDBF, 'M', 'حجي'), - (0xFDC0, 'M', 'مجي'), - (0xFDC1, 'M', 'فمي'), - (0xFDC2, 'M', 'بحي'), - (0xFDC3, 'M', 'كمم'), - (0xFDC4, 'M', 'عجم'), - (0xFDC5, 'M', 'صمم'), - (0xFDC6, 'M', 'سخي'), - (0xFDC7, 'M', 'نجي'), - (0xFDC8, 'X'), - (0xFDCF, 'V'), - (0xFDD0, 'X'), - (0xFDF0, 'M', 'صلے'), - (0xFDF1, 'M', 'قلے'), - (0xFDF2, 'M', 'الله'), - (0xFDF3, 'M', 'اكبر'), - (0xFDF4, 'M', 'محمد'), - (0xFDF5, 'M', 'صلعم'), - (0xFDF6, 'M', 'رسول'), - (0xFDF7, 'M', 'عليه'), - (0xFDF8, 'M', 'وسلم'), - (0xFDF9, 'M', 'صلى'), - (0xFDFA, '3', 'صلى الله عليه وسلم'), - (0xFDFB, '3', 'جل جلاله'), - (0xFDFC, 'M', 'ریال'), - (0xFDFD, 'V'), - (0xFE00, 'I'), - (0xFE10, '3', ','), - (0xFE11, 'M', '、'), - (0xFE12, 'X'), - (0xFE13, '3', ':'), - (0xFE14, '3', ';'), - (0xFE15, '3', '!'), - (0xFE16, '3', '?'), - (0xFE17, 'M', '〖'), - (0xFE18, 'M', '〗'), - (0xFE19, 'X'), - (0xFE20, 'V'), - (0xFE30, 'X'), - (0xFE31, 'M', '—'), - (0xFE32, 'M', '–'), - (0xFE33, '3', '_'), - (0xFE35, '3', '('), - (0xFE36, '3', ')'), - (0xFE37, '3', '{'), - (0xFE38, '3', '}'), - (0xFE39, 'M', '〔'), - (0xFE3A, 'M', '〕'), - (0xFE3B, 'M', '【'), - (0xFE3C, 'M', '】'), - (0xFE3D, 'M', '《'), - (0xFE3E, 'M', '》'), - (0xFE3F, 'M', '〈'), - (0xFE40, 'M', '〉'), - (0xFE41, 'M', '「'), - (0xFE42, 'M', '」'), - (0xFE43, 'M', '『'), - (0xFE44, 'M', '』'), - (0xFE45, 'V'), - (0xFE47, '3', '['), - (0xFE48, '3', ']'), - (0xFE49, '3', ' ̅'), - (0xFE4D, '3', '_'), - (0xFE50, '3', ','), - (0xFE51, 'M', '、'), - (0xFE52, 'X'), - (0xFE54, '3', ';'), - (0xFE55, '3', ':'), - (0xFE56, '3', '?'), - (0xFE57, '3', '!'), - (0xFE58, 'M', '—'), - (0xFE59, '3', '('), - (0xFE5A, '3', ')'), - (0xFE5B, '3', '{'), - (0xFE5C, '3', '}'), - (0xFE5D, 'M', '〔'), - (0xFE5E, 'M', '〕'), - (0xFE5F, '3', '#'), - (0xFE60, '3', '&'), - (0xFE61, '3', '*'), + (0xFDAB, "M", "ضحي"), + (0xFDAC, "M", "لجي"), + (0xFDAD, "M", "لمي"), + (0xFDAE, "M", "يحي"), + (0xFDAF, "M", "يجي"), + (0xFDB0, "M", "يمي"), + (0xFDB1, "M", "ممي"), + (0xFDB2, "M", "قمي"), + (0xFDB3, "M", "نحي"), + (0xFDB4, "M", "قمح"), + (0xFDB5, "M", "لحم"), + (0xFDB6, "M", "عمي"), + (0xFDB7, "M", "كمي"), + (0xFDB8, "M", "نجح"), + (0xFDB9, "M", "مخي"), + (0xFDBA, "M", "لجم"), + (0xFDBB, "M", "كمم"), + (0xFDBC, "M", "لجم"), + (0xFDBD, "M", "نجح"), + (0xFDBE, "M", "جحي"), + (0xFDBF, "M", "حجي"), + (0xFDC0, "M", "مجي"), + (0xFDC1, "M", "فمي"), + (0xFDC2, "M", "بحي"), + (0xFDC3, "M", "كمم"), + (0xFDC4, "M", "عجم"), + (0xFDC5, "M", "صمم"), + (0xFDC6, "M", "سخي"), + (0xFDC7, "M", "نجي"), + (0xFDC8, "X"), + (0xFDCF, "V"), + (0xFDD0, "X"), + (0xFDF0, "M", "صلے"), + (0xFDF1, "M", "قلے"), + (0xFDF2, "M", "الله"), + (0xFDF3, "M", "اكبر"), + (0xFDF4, "M", "محمد"), + (0xFDF5, "M", "صلعم"), + (0xFDF6, "M", "رسول"), + (0xFDF7, "M", "عليه"), + (0xFDF8, "M", "وسلم"), + (0xFDF9, "M", "صلى"), + (0xFDFA, "3", "صلى الله عليه وسلم"), + (0xFDFB, "3", "جل جلاله"), + (0xFDFC, "M", "ریال"), + (0xFDFD, "V"), + (0xFE00, "I"), + (0xFE10, "3", ","), + (0xFE11, "M", "、"), + (0xFE12, "X"), + (0xFE13, "3", ":"), + (0xFE14, "3", ";"), + (0xFE15, "3", "!"), + (0xFE16, "3", "?"), + (0xFE17, "M", "〖"), + (0xFE18, "M", "〗"), + (0xFE19, "X"), + (0xFE20, "V"), + (0xFE30, "X"), + (0xFE31, "M", "—"), + (0xFE32, "M", "–"), + (0xFE33, "3", "_"), + (0xFE35, "3", "("), + (0xFE36, "3", ")"), + (0xFE37, "3", "{"), + (0xFE38, "3", "}"), + (0xFE39, "M", "〔"), + (0xFE3A, "M", "〕"), + (0xFE3B, "M", "【"), + (0xFE3C, "M", "】"), + (0xFE3D, "M", "《"), + (0xFE3E, "M", "》"), + (0xFE3F, "M", "〈"), + (0xFE40, "M", "〉"), + (0xFE41, "M", "「"), + (0xFE42, "M", "」"), + (0xFE43, "M", "『"), + (0xFE44, "M", "』"), + (0xFE45, "V"), + (0xFE47, "3", "["), + (0xFE48, "3", "]"), + (0xFE49, "3", " ̅"), + (0xFE4D, "3", "_"), + (0xFE50, "3", ","), + (0xFE51, "M", "、"), + (0xFE52, "X"), + (0xFE54, "3", ";"), + (0xFE55, "3", ":"), + (0xFE56, "3", "?"), + (0xFE57, "3", "!"), + (0xFE58, "M", "—"), + (0xFE59, "3", "("), + (0xFE5A, "3", ")"), + (0xFE5B, "3", "{"), + (0xFE5C, "3", "}"), + (0xFE5D, "M", "〔"), + (0xFE5E, "M", "〕"), + (0xFE5F, "3", "#"), + (0xFE60, "3", "&"), + (0xFE61, "3", "*"), ] + def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFE62, '3', '+'), - (0xFE63, 'M', '-'), - (0xFE64, '3', '<'), - (0xFE65, '3', '>'), - (0xFE66, '3', '='), - (0xFE67, 'X'), - (0xFE68, '3', '\\'), - (0xFE69, '3', '$'), - (0xFE6A, '3', '%'), - (0xFE6B, '3', '@'), - (0xFE6C, 'X'), - (0xFE70, '3', ' ً'), - (0xFE71, 'M', 'ـً'), - (0xFE72, '3', ' ٌ'), - (0xFE73, 'V'), - (0xFE74, '3', ' ٍ'), - (0xFE75, 'X'), - (0xFE76, '3', ' َ'), - (0xFE77, 'M', 'ـَ'), - (0xFE78, '3', ' ُ'), - (0xFE79, 'M', 'ـُ'), - (0xFE7A, '3', ' ِ'), - (0xFE7B, 'M', 'ـِ'), - (0xFE7C, '3', ' ّ'), - (0xFE7D, 'M', 'ـّ'), - (0xFE7E, '3', ' ْ'), - (0xFE7F, 'M', 'ـْ'), - (0xFE80, 'M', 'ء'), - (0xFE81, 'M', 'آ'), - (0xFE83, 'M', 'أ'), - (0xFE85, 'M', 'ؤ'), - (0xFE87, 'M', 'إ'), - (0xFE89, 'M', 'ئ'), - (0xFE8D, 'M', 'ا'), - (0xFE8F, 'M', 'ب'), - (0xFE93, 'M', 'ة'), - (0xFE95, 'M', 'ت'), - (0xFE99, 'M', 'ث'), - (0xFE9D, 'M', 'ج'), - (0xFEA1, 'M', 'ح'), - (0xFEA5, 'M', 'خ'), - (0xFEA9, 'M', 'د'), - (0xFEAB, 'M', 'ذ'), - (0xFEAD, 'M', 'ر'), - (0xFEAF, 'M', 'ز'), - (0xFEB1, 'M', 'س'), - (0xFEB5, 'M', 'ش'), - (0xFEB9, 'M', 'ص'), - (0xFEBD, 'M', 'ض'), - (0xFEC1, 'M', 'ط'), - (0xFEC5, 'M', 'ظ'), - (0xFEC9, 'M', 'ع'), - (0xFECD, 'M', 'غ'), - (0xFED1, 'M', 'ف'), - (0xFED5, 'M', 'ق'), - (0xFED9, 'M', 'ك'), - (0xFEDD, 'M', 'ل'), - (0xFEE1, 'M', 'م'), - (0xFEE5, 'M', 'ن'), - (0xFEE9, 'M', 'ه'), - (0xFEED, 'M', 'و'), - (0xFEEF, 'M', 'ى'), - (0xFEF1, 'M', 'ي'), - (0xFEF5, 'M', 'لآ'), - (0xFEF7, 'M', 'لأ'), - (0xFEF9, 'M', 'لإ'), - (0xFEFB, 'M', 'لا'), - (0xFEFD, 'X'), - (0xFEFF, 'I'), - (0xFF00, 'X'), - (0xFF01, '3', '!'), - (0xFF02, '3', '"'), - (0xFF03, '3', '#'), - (0xFF04, '3', '$'), - (0xFF05, '3', '%'), - (0xFF06, '3', '&'), - (0xFF07, '3', '\''), - (0xFF08, '3', '('), - (0xFF09, '3', ')'), - (0xFF0A, '3', '*'), - (0xFF0B, '3', '+'), - (0xFF0C, '3', ','), - (0xFF0D, 'M', '-'), - (0xFF0E, 'M', '.'), - (0xFF0F, '3', '/'), - (0xFF10, 'M', '0'), - (0xFF11, 'M', '1'), - (0xFF12, 'M', '2'), - (0xFF13, 'M', '3'), - (0xFF14, 'M', '4'), - (0xFF15, 'M', '5'), - (0xFF16, 'M', '6'), - (0xFF17, 'M', '7'), - (0xFF18, 'M', '8'), - (0xFF19, 'M', '9'), - (0xFF1A, '3', ':'), - (0xFF1B, '3', ';'), - (0xFF1C, '3', '<'), - (0xFF1D, '3', '='), - (0xFF1E, '3', '>'), + (0xFE62, "3", "+"), + (0xFE63, "M", "-"), + (0xFE64, "3", "<"), + (0xFE65, "3", ">"), + (0xFE66, "3", "="), + (0xFE67, "X"), + (0xFE68, "3", "\\"), + (0xFE69, "3", "$"), + (0xFE6A, "3", "%"), + (0xFE6B, "3", "@"), + (0xFE6C, "X"), + (0xFE70, "3", " ً"), + (0xFE71, "M", "ـً"), + (0xFE72, "3", " ٌ"), + (0xFE73, "V"), + (0xFE74, "3", " ٍ"), + (0xFE75, "X"), + (0xFE76, "3", " َ"), + (0xFE77, "M", "ـَ"), + (0xFE78, "3", " ُ"), + (0xFE79, "M", "ـُ"), + (0xFE7A, "3", " ِ"), + (0xFE7B, "M", "ـِ"), + (0xFE7C, "3", " ّ"), + (0xFE7D, "M", "ـّ"), + (0xFE7E, "3", " ْ"), + (0xFE7F, "M", "ـْ"), + (0xFE80, "M", "ء"), + (0xFE81, "M", "آ"), + (0xFE83, "M", "أ"), + (0xFE85, "M", "ؤ"), + (0xFE87, "M", "إ"), + (0xFE89, "M", "ئ"), + (0xFE8D, "M", "ا"), + (0xFE8F, "M", "ب"), + (0xFE93, "M", "ة"), + (0xFE95, "M", "ت"), + (0xFE99, "M", "ث"), + (0xFE9D, "M", "ج"), + (0xFEA1, "M", "ح"), + (0xFEA5, "M", "خ"), + (0xFEA9, "M", "د"), + (0xFEAB, "M", "ذ"), + (0xFEAD, "M", "ر"), + (0xFEAF, "M", "ز"), + (0xFEB1, "M", "س"), + (0xFEB5, "M", "ش"), + (0xFEB9, "M", "ص"), + (0xFEBD, "M", "ض"), + (0xFEC1, "M", "ط"), + (0xFEC5, "M", "ظ"), + (0xFEC9, "M", "ع"), + (0xFECD, "M", "غ"), + (0xFED1, "M", "ف"), + (0xFED5, "M", "ق"), + (0xFED9, "M", "ك"), + (0xFEDD, "M", "ل"), + (0xFEE1, "M", "م"), + (0xFEE5, "M", "ن"), + (0xFEE9, "M", "ه"), + (0xFEED, "M", "و"), + (0xFEEF, "M", "ى"), + (0xFEF1, "M", "ي"), + (0xFEF5, "M", "لآ"), + (0xFEF7, "M", "لأ"), + (0xFEF9, "M", "لإ"), + (0xFEFB, "M", "لا"), + (0xFEFD, "X"), + (0xFEFF, "I"), + (0xFF00, "X"), + (0xFF01, "3", "!"), + (0xFF02, "3", '"'), + (0xFF03, "3", "#"), + (0xFF04, "3", "$"), + (0xFF05, "3", "%"), + (0xFF06, "3", "&"), + (0xFF07, "3", "'"), + (0xFF08, "3", "("), + (0xFF09, "3", ")"), + (0xFF0A, "3", "*"), + (0xFF0B, "3", "+"), + (0xFF0C, "3", ","), + (0xFF0D, "M", "-"), + (0xFF0E, "M", "."), + (0xFF0F, "3", "/"), + (0xFF10, "M", "0"), + (0xFF11, "M", "1"), + (0xFF12, "M", "2"), + (0xFF13, "M", "3"), + (0xFF14, "M", "4"), + (0xFF15, "M", "5"), + (0xFF16, "M", "6"), + (0xFF17, "M", "7"), + (0xFF18, "M", "8"), + (0xFF19, "M", "9"), + (0xFF1A, "3", ":"), + (0xFF1B, "3", ";"), + (0xFF1C, "3", "<"), + (0xFF1D, "3", "="), + (0xFF1E, "3", ">"), ] + def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFF1F, '3', '?'), - (0xFF20, '3', '@'), - (0xFF21, 'M', 'a'), - (0xFF22, 'M', 'b'), - (0xFF23, 'M', 'c'), - (0xFF24, 'M', 'd'), - (0xFF25, 'M', 'e'), - (0xFF26, 'M', 'f'), - (0xFF27, 'M', 'g'), - (0xFF28, 'M', 'h'), - (0xFF29, 'M', 'i'), - (0xFF2A, 'M', 'j'), - (0xFF2B, 'M', 'k'), - (0xFF2C, 'M', 'l'), - (0xFF2D, 'M', 'm'), - (0xFF2E, 'M', 'n'), - (0xFF2F, 'M', 'o'), - (0xFF30, 'M', 'p'), - (0xFF31, 'M', 'q'), - (0xFF32, 'M', 'r'), - (0xFF33, 'M', 's'), - (0xFF34, 'M', 't'), - (0xFF35, 'M', 'u'), - (0xFF36, 'M', 'v'), - (0xFF37, 'M', 'w'), - (0xFF38, 'M', 'x'), - (0xFF39, 'M', 'y'), - (0xFF3A, 'M', 'z'), - (0xFF3B, '3', '['), - (0xFF3C, '3', '\\'), - (0xFF3D, '3', ']'), - (0xFF3E, '3', '^'), - (0xFF3F, '3', '_'), - (0xFF40, '3', '`'), - (0xFF41, 'M', 'a'), - (0xFF42, 'M', 'b'), - (0xFF43, 'M', 'c'), - (0xFF44, 'M', 'd'), - (0xFF45, 'M', 'e'), - (0xFF46, 'M', 'f'), - (0xFF47, 'M', 'g'), - (0xFF48, 'M', 'h'), - (0xFF49, 'M', 'i'), - (0xFF4A, 'M', 'j'), - (0xFF4B, 'M', 'k'), - (0xFF4C, 'M', 'l'), - (0xFF4D, 'M', 'm'), - (0xFF4E, 'M', 'n'), - (0xFF4F, 'M', 'o'), - (0xFF50, 'M', 'p'), - (0xFF51, 'M', 'q'), - (0xFF52, 'M', 'r'), - (0xFF53, 'M', 's'), - (0xFF54, 'M', 't'), - (0xFF55, 'M', 'u'), - (0xFF56, 'M', 'v'), - (0xFF57, 'M', 'w'), - (0xFF58, 'M', 'x'), - (0xFF59, 'M', 'y'), - (0xFF5A, 'M', 'z'), - (0xFF5B, '3', '{'), - (0xFF5C, '3', '|'), - (0xFF5D, '3', '}'), - (0xFF5E, '3', '~'), - (0xFF5F, 'M', '⦅'), - (0xFF60, 'M', '⦆'), - (0xFF61, 'M', '.'), - (0xFF62, 'M', '「'), - (0xFF63, 'M', '」'), - (0xFF64, 'M', '、'), - (0xFF65, 'M', '・'), - (0xFF66, 'M', 'ヲ'), - (0xFF67, 'M', 'ァ'), - (0xFF68, 'M', 'ィ'), - (0xFF69, 'M', 'ゥ'), - (0xFF6A, 'M', 'ェ'), - (0xFF6B, 'M', 'ォ'), - (0xFF6C, 'M', 'ャ'), - (0xFF6D, 'M', 'ュ'), - (0xFF6E, 'M', 'ョ'), - (0xFF6F, 'M', 'ッ'), - (0xFF70, 'M', 'ー'), - (0xFF71, 'M', 'ア'), - (0xFF72, 'M', 'イ'), - (0xFF73, 'M', 'ウ'), - (0xFF74, 'M', 'エ'), - (0xFF75, 'M', 'オ'), - (0xFF76, 'M', 'カ'), - (0xFF77, 'M', 'キ'), - (0xFF78, 'M', 'ク'), - (0xFF79, 'M', 'ケ'), - (0xFF7A, 'M', 'コ'), - (0xFF7B, 'M', 'サ'), - (0xFF7C, 'M', 'シ'), - (0xFF7D, 'M', 'ス'), - (0xFF7E, 'M', 'セ'), - (0xFF7F, 'M', 'ソ'), - (0xFF80, 'M', 'タ'), - (0xFF81, 'M', 'チ'), - (0xFF82, 'M', 'ツ'), + (0xFF1F, "3", "?"), + (0xFF20, "3", "@"), + (0xFF21, "M", "a"), + (0xFF22, "M", "b"), + (0xFF23, "M", "c"), + (0xFF24, "M", "d"), + (0xFF25, "M", "e"), + (0xFF26, "M", "f"), + (0xFF27, "M", "g"), + (0xFF28, "M", "h"), + (0xFF29, "M", "i"), + (0xFF2A, "M", "j"), + (0xFF2B, "M", "k"), + (0xFF2C, "M", "l"), + (0xFF2D, "M", "m"), + (0xFF2E, "M", "n"), + (0xFF2F, "M", "o"), + (0xFF30, "M", "p"), + (0xFF31, "M", "q"), + (0xFF32, "M", "r"), + (0xFF33, "M", "s"), + (0xFF34, "M", "t"), + (0xFF35, "M", "u"), + (0xFF36, "M", "v"), + (0xFF37, "M", "w"), + (0xFF38, "M", "x"), + (0xFF39, "M", "y"), + (0xFF3A, "M", "z"), + (0xFF3B, "3", "["), + (0xFF3C, "3", "\\"), + (0xFF3D, "3", "]"), + (0xFF3E, "3", "^"), + (0xFF3F, "3", "_"), + (0xFF40, "3", "`"), + (0xFF41, "M", "a"), + (0xFF42, "M", "b"), + (0xFF43, "M", "c"), + (0xFF44, "M", "d"), + (0xFF45, "M", "e"), + (0xFF46, "M", "f"), + (0xFF47, "M", "g"), + (0xFF48, "M", "h"), + (0xFF49, "M", "i"), + (0xFF4A, "M", "j"), + (0xFF4B, "M", "k"), + (0xFF4C, "M", "l"), + (0xFF4D, "M", "m"), + (0xFF4E, "M", "n"), + (0xFF4F, "M", "o"), + (0xFF50, "M", "p"), + (0xFF51, "M", "q"), + (0xFF52, "M", "r"), + (0xFF53, "M", "s"), + (0xFF54, "M", "t"), + (0xFF55, "M", "u"), + (0xFF56, "M", "v"), + (0xFF57, "M", "w"), + (0xFF58, "M", "x"), + (0xFF59, "M", "y"), + (0xFF5A, "M", "z"), + (0xFF5B, "3", "{"), + (0xFF5C, "3", "|"), + (0xFF5D, "3", "}"), + (0xFF5E, "3", "~"), + (0xFF5F, "M", "⦅"), + (0xFF60, "M", "⦆"), + (0xFF61, "M", "."), + (0xFF62, "M", "「"), + (0xFF63, "M", "」"), + (0xFF64, "M", "、"), + (0xFF65, "M", "・"), + (0xFF66, "M", "ヲ"), + (0xFF67, "M", "ァ"), + (0xFF68, "M", "ィ"), + (0xFF69, "M", "ゥ"), + (0xFF6A, "M", "ェ"), + (0xFF6B, "M", "ォ"), + (0xFF6C, "M", "ャ"), + (0xFF6D, "M", "ュ"), + (0xFF6E, "M", "ョ"), + (0xFF6F, "M", "ッ"), + (0xFF70, "M", "ー"), + (0xFF71, "M", "ア"), + (0xFF72, "M", "イ"), + (0xFF73, "M", "ウ"), + (0xFF74, "M", "エ"), + (0xFF75, "M", "オ"), + (0xFF76, "M", "カ"), + (0xFF77, "M", "キ"), + (0xFF78, "M", "ク"), + (0xFF79, "M", "ケ"), + (0xFF7A, "M", "コ"), + (0xFF7B, "M", "サ"), + (0xFF7C, "M", "シ"), + (0xFF7D, "M", "ス"), + (0xFF7E, "M", "セ"), + (0xFF7F, "M", "ソ"), + (0xFF80, "M", "タ"), + (0xFF81, "M", "チ"), + (0xFF82, "M", "ツ"), ] + def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFF83, 'M', 'テ'), - (0xFF84, 'M', 'ト'), - (0xFF85, 'M', 'ナ'), - (0xFF86, 'M', 'ニ'), - (0xFF87, 'M', 'ヌ'), - (0xFF88, 'M', 'ネ'), - (0xFF89, 'M', 'ノ'), - (0xFF8A, 'M', 'ハ'), - (0xFF8B, 'M', 'ヒ'), - (0xFF8C, 'M', 'フ'), - (0xFF8D, 'M', 'ヘ'), - (0xFF8E, 'M', 'ホ'), - (0xFF8F, 'M', 'マ'), - (0xFF90, 'M', 'ミ'), - (0xFF91, 'M', 'ム'), - (0xFF92, 'M', 'メ'), - (0xFF93, 'M', 'モ'), - (0xFF94, 'M', 'ヤ'), - (0xFF95, 'M', 'ユ'), - (0xFF96, 'M', 'ヨ'), - (0xFF97, 'M', 'ラ'), - (0xFF98, 'M', 'リ'), - (0xFF99, 'M', 'ル'), - (0xFF9A, 'M', 'レ'), - (0xFF9B, 'M', 'ロ'), - (0xFF9C, 'M', 'ワ'), - (0xFF9D, 'M', 'ン'), - (0xFF9E, 'M', '゙'), - (0xFF9F, 'M', '゚'), - (0xFFA0, 'X'), - (0xFFA1, 'M', 'ᄀ'), - (0xFFA2, 'M', 'ᄁ'), - (0xFFA3, 'M', 'ᆪ'), - (0xFFA4, 'M', 'ᄂ'), - (0xFFA5, 'M', 'ᆬ'), - (0xFFA6, 'M', 'ᆭ'), - (0xFFA7, 'M', 'ᄃ'), - (0xFFA8, 'M', 'ᄄ'), - (0xFFA9, 'M', 'ᄅ'), - (0xFFAA, 'M', 'ᆰ'), - (0xFFAB, 'M', 'ᆱ'), - (0xFFAC, 'M', 'ᆲ'), - (0xFFAD, 'M', 'ᆳ'), - (0xFFAE, 'M', 'ᆴ'), - (0xFFAF, 'M', 'ᆵ'), - (0xFFB0, 'M', 'ᄚ'), - (0xFFB1, 'M', 'ᄆ'), - (0xFFB2, 'M', 'ᄇ'), - (0xFFB3, 'M', 'ᄈ'), - (0xFFB4, 'M', 'ᄡ'), - (0xFFB5, 'M', 'ᄉ'), - (0xFFB6, 'M', 'ᄊ'), - (0xFFB7, 'M', 'ᄋ'), - (0xFFB8, 'M', 'ᄌ'), - (0xFFB9, 'M', 'ᄍ'), - (0xFFBA, 'M', 'ᄎ'), - (0xFFBB, 'M', 'ᄏ'), - (0xFFBC, 'M', 'ᄐ'), - (0xFFBD, 'M', 'ᄑ'), - (0xFFBE, 'M', 'ᄒ'), - (0xFFBF, 'X'), - (0xFFC2, 'M', 'ᅡ'), - (0xFFC3, 'M', 'ᅢ'), - (0xFFC4, 'M', 'ᅣ'), - (0xFFC5, 'M', 'ᅤ'), - (0xFFC6, 'M', 'ᅥ'), - (0xFFC7, 'M', 'ᅦ'), - (0xFFC8, 'X'), - (0xFFCA, 'M', 'ᅧ'), - (0xFFCB, 'M', 'ᅨ'), - (0xFFCC, 'M', 'ᅩ'), - (0xFFCD, 'M', 'ᅪ'), - (0xFFCE, 'M', 'ᅫ'), - (0xFFCF, 'M', 'ᅬ'), - (0xFFD0, 'X'), - (0xFFD2, 'M', 'ᅭ'), - (0xFFD3, 'M', 'ᅮ'), - (0xFFD4, 'M', 'ᅯ'), - (0xFFD5, 'M', 'ᅰ'), - (0xFFD6, 'M', 'ᅱ'), - (0xFFD7, 'M', 'ᅲ'), - (0xFFD8, 'X'), - (0xFFDA, 'M', 'ᅳ'), - (0xFFDB, 'M', 'ᅴ'), - (0xFFDC, 'M', 'ᅵ'), - (0xFFDD, 'X'), - (0xFFE0, 'M', '¢'), - (0xFFE1, 'M', '£'), - (0xFFE2, 'M', '¬'), - (0xFFE3, '3', ' ̄'), - (0xFFE4, 'M', '¦'), - (0xFFE5, 'M', '¥'), - (0xFFE6, 'M', '₩'), - (0xFFE7, 'X'), - (0xFFE8, 'M', '│'), - (0xFFE9, 'M', '←'), - (0xFFEA, 'M', '↑'), - (0xFFEB, 'M', '→'), - (0xFFEC, 'M', '↓'), - (0xFFED, 'M', '■'), + (0xFF83, "M", "テ"), + (0xFF84, "M", "ト"), + (0xFF85, "M", "ナ"), + (0xFF86, "M", "ニ"), + (0xFF87, "M", "ヌ"), + (0xFF88, "M", "ネ"), + (0xFF89, "M", "ノ"), + (0xFF8A, "M", "ハ"), + (0xFF8B, "M", "ヒ"), + (0xFF8C, "M", "フ"), + (0xFF8D, "M", "ヘ"), + (0xFF8E, "M", "ホ"), + (0xFF8F, "M", "マ"), + (0xFF90, "M", "ミ"), + (0xFF91, "M", "ム"), + (0xFF92, "M", "メ"), + (0xFF93, "M", "モ"), + (0xFF94, "M", "ヤ"), + (0xFF95, "M", "ユ"), + (0xFF96, "M", "ヨ"), + (0xFF97, "M", "ラ"), + (0xFF98, "M", "リ"), + (0xFF99, "M", "ル"), + (0xFF9A, "M", "レ"), + (0xFF9B, "M", "ロ"), + (0xFF9C, "M", "ワ"), + (0xFF9D, "M", "ン"), + (0xFF9E, "M", "゙"), + (0xFF9F, "M", "゚"), + (0xFFA0, "X"), + (0xFFA1, "M", "ᄀ"), + (0xFFA2, "M", "ᄁ"), + (0xFFA3, "M", "ᆪ"), + (0xFFA4, "M", "ᄂ"), + (0xFFA5, "M", "ᆬ"), + (0xFFA6, "M", "ᆭ"), + (0xFFA7, "M", "ᄃ"), + (0xFFA8, "M", "ᄄ"), + (0xFFA9, "M", "ᄅ"), + (0xFFAA, "M", "ᆰ"), + (0xFFAB, "M", "ᆱ"), + (0xFFAC, "M", "ᆲ"), + (0xFFAD, "M", "ᆳ"), + (0xFFAE, "M", "ᆴ"), + (0xFFAF, "M", "ᆵ"), + (0xFFB0, "M", "ᄚ"), + (0xFFB1, "M", "ᄆ"), + (0xFFB2, "M", "ᄇ"), + (0xFFB3, "M", "ᄈ"), + (0xFFB4, "M", "ᄡ"), + (0xFFB5, "M", "ᄉ"), + (0xFFB6, "M", "ᄊ"), + (0xFFB7, "M", "ᄋ"), + (0xFFB8, "M", "ᄌ"), + (0xFFB9, "M", "ᄍ"), + (0xFFBA, "M", "ᄎ"), + (0xFFBB, "M", "ᄏ"), + (0xFFBC, "M", "ᄐ"), + (0xFFBD, "M", "ᄑ"), + (0xFFBE, "M", "ᄒ"), + (0xFFBF, "X"), + (0xFFC2, "M", "ᅡ"), + (0xFFC3, "M", "ᅢ"), + (0xFFC4, "M", "ᅣ"), + (0xFFC5, "M", "ᅤ"), + (0xFFC6, "M", "ᅥ"), + (0xFFC7, "M", "ᅦ"), + (0xFFC8, "X"), + (0xFFCA, "M", "ᅧ"), + (0xFFCB, "M", "ᅨ"), + (0xFFCC, "M", "ᅩ"), + (0xFFCD, "M", "ᅪ"), + (0xFFCE, "M", "ᅫ"), + (0xFFCF, "M", "ᅬ"), + (0xFFD0, "X"), + (0xFFD2, "M", "ᅭ"), + (0xFFD3, "M", "ᅮ"), + (0xFFD4, "M", "ᅯ"), + (0xFFD5, "M", "ᅰ"), + (0xFFD6, "M", "ᅱ"), + (0xFFD7, "M", "ᅲ"), + (0xFFD8, "X"), + (0xFFDA, "M", "ᅳ"), + (0xFFDB, "M", "ᅴ"), + (0xFFDC, "M", "ᅵ"), + (0xFFDD, "X"), + (0xFFE0, "M", "¢"), + (0xFFE1, "M", "£"), + (0xFFE2, "M", "¬"), + (0xFFE3, "3", " ̄"), + (0xFFE4, "M", "¦"), + (0xFFE5, "M", "¥"), + (0xFFE6, "M", "₩"), + (0xFFE7, "X"), + (0xFFE8, "M", "│"), + (0xFFE9, "M", "←"), + (0xFFEA, "M", "↑"), + (0xFFEB, "M", "→"), + (0xFFEC, "M", "↓"), + (0xFFED, "M", "■"), ] + def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0xFFEE, 'M', '○'), - (0xFFEF, 'X'), - (0x10000, 'V'), - (0x1000C, 'X'), - (0x1000D, 'V'), - (0x10027, 'X'), - (0x10028, 'V'), - (0x1003B, 'X'), - (0x1003C, 'V'), - (0x1003E, 'X'), - (0x1003F, 'V'), - (0x1004E, 'X'), - (0x10050, 'V'), - (0x1005E, 'X'), - (0x10080, 'V'), - (0x100FB, 'X'), - (0x10100, 'V'), - (0x10103, 'X'), - (0x10107, 'V'), - (0x10134, 'X'), - (0x10137, 'V'), - (0x1018F, 'X'), - (0x10190, 'V'), - (0x1019D, 'X'), - (0x101A0, 'V'), - (0x101A1, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x102E0, 'V'), - (0x102FC, 'X'), - (0x10300, 'V'), - (0x10324, 'X'), - (0x1032D, 'V'), - (0x1034B, 'X'), - (0x10350, 'V'), - (0x1037B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', '𐐨'), - (0x10401, 'M', '𐐩'), - (0x10402, 'M', '𐐪'), - (0x10403, 'M', '𐐫'), - (0x10404, 'M', '𐐬'), - (0x10405, 'M', '𐐭'), - (0x10406, 'M', '𐐮'), - (0x10407, 'M', '𐐯'), - (0x10408, 'M', '𐐰'), - (0x10409, 'M', '𐐱'), - (0x1040A, 'M', '𐐲'), - (0x1040B, 'M', '𐐳'), - (0x1040C, 'M', '𐐴'), - (0x1040D, 'M', '𐐵'), - (0x1040E, 'M', '𐐶'), - (0x1040F, 'M', '𐐷'), - (0x10410, 'M', '𐐸'), - (0x10411, 'M', '𐐹'), - (0x10412, 'M', '𐐺'), - (0x10413, 'M', '𐐻'), - (0x10414, 'M', '𐐼'), - (0x10415, 'M', '𐐽'), - (0x10416, 'M', '𐐾'), - (0x10417, 'M', '𐐿'), - (0x10418, 'M', '𐑀'), - (0x10419, 'M', '𐑁'), - (0x1041A, 'M', '𐑂'), - (0x1041B, 'M', '𐑃'), - (0x1041C, 'M', '𐑄'), - (0x1041D, 'M', '𐑅'), - (0x1041E, 'M', '𐑆'), - (0x1041F, 'M', '𐑇'), - (0x10420, 'M', '𐑈'), - (0x10421, 'M', '𐑉'), - (0x10422, 'M', '𐑊'), - (0x10423, 'M', '𐑋'), - (0x10424, 'M', '𐑌'), - (0x10425, 'M', '𐑍'), - (0x10426, 'M', '𐑎'), - (0x10427, 'M', '𐑏'), - (0x10428, 'V'), - (0x1049E, 'X'), - (0x104A0, 'V'), - (0x104AA, 'X'), - (0x104B0, 'M', '𐓘'), - (0x104B1, 'M', '𐓙'), - (0x104B2, 'M', '𐓚'), - (0x104B3, 'M', '𐓛'), - (0x104B4, 'M', '𐓜'), - (0x104B5, 'M', '𐓝'), - (0x104B6, 'M', '𐓞'), - (0x104B7, 'M', '𐓟'), - (0x104B8, 'M', '𐓠'), - (0x104B9, 'M', '𐓡'), + (0xFFEE, "M", "○"), + (0xFFEF, "X"), + (0x10000, "V"), + (0x1000C, "X"), + (0x1000D, "V"), + (0x10027, "X"), + (0x10028, "V"), + (0x1003B, "X"), + (0x1003C, "V"), + (0x1003E, "X"), + (0x1003F, "V"), + (0x1004E, "X"), + (0x10050, "V"), + (0x1005E, "X"), + (0x10080, "V"), + (0x100FB, "X"), + (0x10100, "V"), + (0x10103, "X"), + (0x10107, "V"), + (0x10134, "X"), + (0x10137, "V"), + (0x1018F, "X"), + (0x10190, "V"), + (0x1019D, "X"), + (0x101A0, "V"), + (0x101A1, "X"), + (0x101D0, "V"), + (0x101FE, "X"), + (0x10280, "V"), + (0x1029D, "X"), + (0x102A0, "V"), + (0x102D1, "X"), + (0x102E0, "V"), + (0x102FC, "X"), + (0x10300, "V"), + (0x10324, "X"), + (0x1032D, "V"), + (0x1034B, "X"), + (0x10350, "V"), + (0x1037B, "X"), + (0x10380, "V"), + (0x1039E, "X"), + (0x1039F, "V"), + (0x103C4, "X"), + (0x103C8, "V"), + (0x103D6, "X"), + (0x10400, "M", "𐐨"), + (0x10401, "M", "𐐩"), + (0x10402, "M", "𐐪"), + (0x10403, "M", "𐐫"), + (0x10404, "M", "𐐬"), + (0x10405, "M", "𐐭"), + (0x10406, "M", "𐐮"), + (0x10407, "M", "𐐯"), + (0x10408, "M", "𐐰"), + (0x10409, "M", "𐐱"), + (0x1040A, "M", "𐐲"), + (0x1040B, "M", "𐐳"), + (0x1040C, "M", "𐐴"), + (0x1040D, "M", "𐐵"), + (0x1040E, "M", "𐐶"), + (0x1040F, "M", "𐐷"), + (0x10410, "M", "𐐸"), + (0x10411, "M", "𐐹"), + (0x10412, "M", "𐐺"), + (0x10413, "M", "𐐻"), + (0x10414, "M", "𐐼"), + (0x10415, "M", "𐐽"), + (0x10416, "M", "𐐾"), + (0x10417, "M", "𐐿"), + (0x10418, "M", "𐑀"), + (0x10419, "M", "𐑁"), + (0x1041A, "M", "𐑂"), + (0x1041B, "M", "𐑃"), + (0x1041C, "M", "𐑄"), + (0x1041D, "M", "𐑅"), + (0x1041E, "M", "𐑆"), + (0x1041F, "M", "𐑇"), + (0x10420, "M", "𐑈"), + (0x10421, "M", "𐑉"), + (0x10422, "M", "𐑊"), + (0x10423, "M", "𐑋"), + (0x10424, "M", "𐑌"), + (0x10425, "M", "𐑍"), + (0x10426, "M", "𐑎"), + (0x10427, "M", "𐑏"), + (0x10428, "V"), + (0x1049E, "X"), + (0x104A0, "V"), + (0x104AA, "X"), + (0x104B0, "M", "𐓘"), + (0x104B1, "M", "𐓙"), + (0x104B2, "M", "𐓚"), + (0x104B3, "M", "𐓛"), + (0x104B4, "M", "𐓜"), + (0x104B5, "M", "𐓝"), + (0x104B6, "M", "𐓞"), + (0x104B7, "M", "𐓟"), + (0x104B8, "M", "𐓠"), + (0x104B9, "M", "𐓡"), ] + def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x104BA, 'M', '𐓢'), - (0x104BB, 'M', '𐓣'), - (0x104BC, 'M', '𐓤'), - (0x104BD, 'M', '𐓥'), - (0x104BE, 'M', '𐓦'), - (0x104BF, 'M', '𐓧'), - (0x104C0, 'M', '𐓨'), - (0x104C1, 'M', '𐓩'), - (0x104C2, 'M', '𐓪'), - (0x104C3, 'M', '𐓫'), - (0x104C4, 'M', '𐓬'), - (0x104C5, 'M', '𐓭'), - (0x104C6, 'M', '𐓮'), - (0x104C7, 'M', '𐓯'), - (0x104C8, 'M', '𐓰'), - (0x104C9, 'M', '𐓱'), - (0x104CA, 'M', '𐓲'), - (0x104CB, 'M', '𐓳'), - (0x104CC, 'M', '𐓴'), - (0x104CD, 'M', '𐓵'), - (0x104CE, 'M', '𐓶'), - (0x104CF, 'M', '𐓷'), - (0x104D0, 'M', '𐓸'), - (0x104D1, 'M', '𐓹'), - (0x104D2, 'M', '𐓺'), - (0x104D3, 'M', '𐓻'), - (0x104D4, 'X'), - (0x104D8, 'V'), - (0x104FC, 'X'), - (0x10500, 'V'), - (0x10528, 'X'), - (0x10530, 'V'), - (0x10564, 'X'), - (0x1056F, 'V'), - (0x10570, 'M', '𐖗'), - (0x10571, 'M', '𐖘'), - (0x10572, 'M', '𐖙'), - (0x10573, 'M', '𐖚'), - (0x10574, 'M', '𐖛'), - (0x10575, 'M', '𐖜'), - (0x10576, 'M', '𐖝'), - (0x10577, 'M', '𐖞'), - (0x10578, 'M', '𐖟'), - (0x10579, 'M', '𐖠'), - (0x1057A, 'M', '𐖡'), - (0x1057B, 'X'), - (0x1057C, 'M', '𐖣'), - (0x1057D, 'M', '𐖤'), - (0x1057E, 'M', '𐖥'), - (0x1057F, 'M', '𐖦'), - (0x10580, 'M', '𐖧'), - (0x10581, 'M', '𐖨'), - (0x10582, 'M', '𐖩'), - (0x10583, 'M', '𐖪'), - (0x10584, 'M', '𐖫'), - (0x10585, 'M', '𐖬'), - (0x10586, 'M', '𐖭'), - (0x10587, 'M', '𐖮'), - (0x10588, 'M', '𐖯'), - (0x10589, 'M', '𐖰'), - (0x1058A, 'M', '𐖱'), - (0x1058B, 'X'), - (0x1058C, 'M', '𐖳'), - (0x1058D, 'M', '𐖴'), - (0x1058E, 'M', '𐖵'), - (0x1058F, 'M', '𐖶'), - (0x10590, 'M', '𐖷'), - (0x10591, 'M', '𐖸'), - (0x10592, 'M', '𐖹'), - (0x10593, 'X'), - (0x10594, 'M', '𐖻'), - (0x10595, 'M', '𐖼'), - (0x10596, 'X'), - (0x10597, 'V'), - (0x105A2, 'X'), - (0x105A3, 'V'), - (0x105B2, 'X'), - (0x105B3, 'V'), - (0x105BA, 'X'), - (0x105BB, 'V'), - (0x105BD, 'X'), - (0x10600, 'V'), - (0x10737, 'X'), - (0x10740, 'V'), - (0x10756, 'X'), - (0x10760, 'V'), - (0x10768, 'X'), - (0x10780, 'V'), - (0x10781, 'M', 'ː'), - (0x10782, 'M', 'ˑ'), - (0x10783, 'M', 'æ'), - (0x10784, 'M', 'ʙ'), - (0x10785, 'M', 'ɓ'), - (0x10786, 'X'), - (0x10787, 'M', 'ʣ'), - (0x10788, 'M', 'ꭦ'), - (0x10789, 'M', 'ʥ'), - (0x1078A, 'M', 'ʤ'), - (0x1078B, 'M', 'ɖ'), - (0x1078C, 'M', 'ɗ'), + (0x104BA, "M", "𐓢"), + (0x104BB, "M", "𐓣"), + (0x104BC, "M", "𐓤"), + (0x104BD, "M", "𐓥"), + (0x104BE, "M", "𐓦"), + (0x104BF, "M", "𐓧"), + (0x104C0, "M", "𐓨"), + (0x104C1, "M", "𐓩"), + (0x104C2, "M", "𐓪"), + (0x104C3, "M", "𐓫"), + (0x104C4, "M", "𐓬"), + (0x104C5, "M", "𐓭"), + (0x104C6, "M", "𐓮"), + (0x104C7, "M", "𐓯"), + (0x104C8, "M", "𐓰"), + (0x104C9, "M", "𐓱"), + (0x104CA, "M", "𐓲"), + (0x104CB, "M", "𐓳"), + (0x104CC, "M", "𐓴"), + (0x104CD, "M", "𐓵"), + (0x104CE, "M", "𐓶"), + (0x104CF, "M", "𐓷"), + (0x104D0, "M", "𐓸"), + (0x104D1, "M", "𐓹"), + (0x104D2, "M", "𐓺"), + (0x104D3, "M", "𐓻"), + (0x104D4, "X"), + (0x104D8, "V"), + (0x104FC, "X"), + (0x10500, "V"), + (0x10528, "X"), + (0x10530, "V"), + (0x10564, "X"), + (0x1056F, "V"), + (0x10570, "M", "𐖗"), + (0x10571, "M", "𐖘"), + (0x10572, "M", "𐖙"), + (0x10573, "M", "𐖚"), + (0x10574, "M", "𐖛"), + (0x10575, "M", "𐖜"), + (0x10576, "M", "𐖝"), + (0x10577, "M", "𐖞"), + (0x10578, "M", "𐖟"), + (0x10579, "M", "𐖠"), + (0x1057A, "M", "𐖡"), + (0x1057B, "X"), + (0x1057C, "M", "𐖣"), + (0x1057D, "M", "𐖤"), + (0x1057E, "M", "𐖥"), + (0x1057F, "M", "𐖦"), + (0x10580, "M", "𐖧"), + (0x10581, "M", "𐖨"), + (0x10582, "M", "𐖩"), + (0x10583, "M", "𐖪"), + (0x10584, "M", "𐖫"), + (0x10585, "M", "𐖬"), + (0x10586, "M", "𐖭"), + (0x10587, "M", "𐖮"), + (0x10588, "M", "𐖯"), + (0x10589, "M", "𐖰"), + (0x1058A, "M", "𐖱"), + (0x1058B, "X"), + (0x1058C, "M", "𐖳"), + (0x1058D, "M", "𐖴"), + (0x1058E, "M", "𐖵"), + (0x1058F, "M", "𐖶"), + (0x10590, "M", "𐖷"), + (0x10591, "M", "𐖸"), + (0x10592, "M", "𐖹"), + (0x10593, "X"), + (0x10594, "M", "𐖻"), + (0x10595, "M", "𐖼"), + (0x10596, "X"), + (0x10597, "V"), + (0x105A2, "X"), + (0x105A3, "V"), + (0x105B2, "X"), + (0x105B3, "V"), + (0x105BA, "X"), + (0x105BB, "V"), + (0x105BD, "X"), + (0x10600, "V"), + (0x10737, "X"), + (0x10740, "V"), + (0x10756, "X"), + (0x10760, "V"), + (0x10768, "X"), + (0x10780, "V"), + (0x10781, "M", "ː"), + (0x10782, "M", "ˑ"), + (0x10783, "M", "æ"), + (0x10784, "M", "ʙ"), + (0x10785, "M", "ɓ"), + (0x10786, "X"), + (0x10787, "M", "ʣ"), + (0x10788, "M", "ꭦ"), + (0x10789, "M", "ʥ"), + (0x1078A, "M", "ʤ"), + (0x1078B, "M", "ɖ"), + (0x1078C, "M", "ɗ"), ] + def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1078D, 'M', 'ᶑ'), - (0x1078E, 'M', 'ɘ'), - (0x1078F, 'M', 'ɞ'), - (0x10790, 'M', 'ʩ'), - (0x10791, 'M', 'ɤ'), - (0x10792, 'M', 'ɢ'), - (0x10793, 'M', 'ɠ'), - (0x10794, 'M', 'ʛ'), - (0x10795, 'M', 'ħ'), - (0x10796, 'M', 'ʜ'), - (0x10797, 'M', 'ɧ'), - (0x10798, 'M', 'ʄ'), - (0x10799, 'M', 'ʪ'), - (0x1079A, 'M', 'ʫ'), - (0x1079B, 'M', 'ɬ'), - (0x1079C, 'M', '𝼄'), - (0x1079D, 'M', 'ꞎ'), - (0x1079E, 'M', 'ɮ'), - (0x1079F, 'M', '𝼅'), - (0x107A0, 'M', 'ʎ'), - (0x107A1, 'M', '𝼆'), - (0x107A2, 'M', 'ø'), - (0x107A3, 'M', 'ɶ'), - (0x107A4, 'M', 'ɷ'), - (0x107A5, 'M', 'q'), - (0x107A6, 'M', 'ɺ'), - (0x107A7, 'M', '𝼈'), - (0x107A8, 'M', 'ɽ'), - (0x107A9, 'M', 'ɾ'), - (0x107AA, 'M', 'ʀ'), - (0x107AB, 'M', 'ʨ'), - (0x107AC, 'M', 'ʦ'), - (0x107AD, 'M', 'ꭧ'), - (0x107AE, 'M', 'ʧ'), - (0x107AF, 'M', 'ʈ'), - (0x107B0, 'M', 'ⱱ'), - (0x107B1, 'X'), - (0x107B2, 'M', 'ʏ'), - (0x107B3, 'M', 'ʡ'), - (0x107B4, 'M', 'ʢ'), - (0x107B5, 'M', 'ʘ'), - (0x107B6, 'M', 'ǀ'), - (0x107B7, 'M', 'ǁ'), - (0x107B8, 'M', 'ǂ'), - (0x107B9, 'M', '𝼊'), - (0x107BA, 'M', '𝼞'), - (0x107BB, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x1089F, 'X'), - (0x108A7, 'V'), - (0x108B0, 'X'), - (0x108E0, 'V'), - (0x108F3, 'X'), - (0x108F4, 'V'), - (0x108F6, 'X'), - (0x108FB, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BC, 'V'), - (0x109D0, 'X'), - (0x109D2, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A36, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A49, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10AA0, 'X'), - (0x10AC0, 'V'), - (0x10AE7, 'X'), - (0x10AEB, 'V'), - (0x10AF7, 'X'), - (0x10B00, 'V'), + (0x1078D, "M", "ᶑ"), + (0x1078E, "M", "ɘ"), + (0x1078F, "M", "ɞ"), + (0x10790, "M", "ʩ"), + (0x10791, "M", "ɤ"), + (0x10792, "M", "ɢ"), + (0x10793, "M", "ɠ"), + (0x10794, "M", "ʛ"), + (0x10795, "M", "ħ"), + (0x10796, "M", "ʜ"), + (0x10797, "M", "ɧ"), + (0x10798, "M", "ʄ"), + (0x10799, "M", "ʪ"), + (0x1079A, "M", "ʫ"), + (0x1079B, "M", "ɬ"), + (0x1079C, "M", "𝼄"), + (0x1079D, "M", "ꞎ"), + (0x1079E, "M", "ɮ"), + (0x1079F, "M", "𝼅"), + (0x107A0, "M", "ʎ"), + (0x107A1, "M", "𝼆"), + (0x107A2, "M", "ø"), + (0x107A3, "M", "ɶ"), + (0x107A4, "M", "ɷ"), + (0x107A5, "M", "q"), + (0x107A6, "M", "ɺ"), + (0x107A7, "M", "𝼈"), + (0x107A8, "M", "ɽ"), + (0x107A9, "M", "ɾ"), + (0x107AA, "M", "ʀ"), + (0x107AB, "M", "ʨ"), + (0x107AC, "M", "ʦ"), + (0x107AD, "M", "ꭧ"), + (0x107AE, "M", "ʧ"), + (0x107AF, "M", "ʈ"), + (0x107B0, "M", "ⱱ"), + (0x107B1, "X"), + (0x107B2, "M", "ʏ"), + (0x107B3, "M", "ʡ"), + (0x107B4, "M", "ʢ"), + (0x107B5, "M", "ʘ"), + (0x107B6, "M", "ǀ"), + (0x107B7, "M", "ǁ"), + (0x107B8, "M", "ǂ"), + (0x107B9, "M", "𝼊"), + (0x107BA, "M", "𝼞"), + (0x107BB, "X"), + (0x10800, "V"), + (0x10806, "X"), + (0x10808, "V"), + (0x10809, "X"), + (0x1080A, "V"), + (0x10836, "X"), + (0x10837, "V"), + (0x10839, "X"), + (0x1083C, "V"), + (0x1083D, "X"), + (0x1083F, "V"), + (0x10856, "X"), + (0x10857, "V"), + (0x1089F, "X"), + (0x108A7, "V"), + (0x108B0, "X"), + (0x108E0, "V"), + (0x108F3, "X"), + (0x108F4, "V"), + (0x108F6, "X"), + (0x108FB, "V"), + (0x1091C, "X"), + (0x1091F, "V"), + (0x1093A, "X"), + (0x1093F, "V"), + (0x10940, "X"), + (0x10980, "V"), + (0x109B8, "X"), + (0x109BC, "V"), + (0x109D0, "X"), + (0x109D2, "V"), + (0x10A04, "X"), + (0x10A05, "V"), + (0x10A07, "X"), + (0x10A0C, "V"), + (0x10A14, "X"), + (0x10A15, "V"), + (0x10A18, "X"), + (0x10A19, "V"), + (0x10A36, "X"), + (0x10A38, "V"), + (0x10A3B, "X"), + (0x10A3F, "V"), + (0x10A49, "X"), + (0x10A50, "V"), + (0x10A59, "X"), + (0x10A60, "V"), + (0x10AA0, "X"), + (0x10AC0, "V"), + (0x10AE7, "X"), + (0x10AEB, "V"), + (0x10AF7, "X"), + (0x10B00, "V"), ] + def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B92, 'X'), - (0x10B99, 'V'), - (0x10B9D, 'X'), - (0x10BA9, 'V'), - (0x10BB0, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10C80, 'M', '𐳀'), - (0x10C81, 'M', '𐳁'), - (0x10C82, 'M', '𐳂'), - (0x10C83, 'M', '𐳃'), - (0x10C84, 'M', '𐳄'), - (0x10C85, 'M', '𐳅'), - (0x10C86, 'M', '𐳆'), - (0x10C87, 'M', '𐳇'), - (0x10C88, 'M', '𐳈'), - (0x10C89, 'M', '𐳉'), - (0x10C8A, 'M', '𐳊'), - (0x10C8B, 'M', '𐳋'), - (0x10C8C, 'M', '𐳌'), - (0x10C8D, 'M', '𐳍'), - (0x10C8E, 'M', '𐳎'), - (0x10C8F, 'M', '𐳏'), - (0x10C90, 'M', '𐳐'), - (0x10C91, 'M', '𐳑'), - (0x10C92, 'M', '𐳒'), - (0x10C93, 'M', '𐳓'), - (0x10C94, 'M', '𐳔'), - (0x10C95, 'M', '𐳕'), - (0x10C96, 'M', '𐳖'), - (0x10C97, 'M', '𐳗'), - (0x10C98, 'M', '𐳘'), - (0x10C99, 'M', '𐳙'), - (0x10C9A, 'M', '𐳚'), - (0x10C9B, 'M', '𐳛'), - (0x10C9C, 'M', '𐳜'), - (0x10C9D, 'M', '𐳝'), - (0x10C9E, 'M', '𐳞'), - (0x10C9F, 'M', '𐳟'), - (0x10CA0, 'M', '𐳠'), - (0x10CA1, 'M', '𐳡'), - (0x10CA2, 'M', '𐳢'), - (0x10CA3, 'M', '𐳣'), - (0x10CA4, 'M', '𐳤'), - (0x10CA5, 'M', '𐳥'), - (0x10CA6, 'M', '𐳦'), - (0x10CA7, 'M', '𐳧'), - (0x10CA8, 'M', '𐳨'), - (0x10CA9, 'M', '𐳩'), - (0x10CAA, 'M', '𐳪'), - (0x10CAB, 'M', '𐳫'), - (0x10CAC, 'M', '𐳬'), - (0x10CAD, 'M', '𐳭'), - (0x10CAE, 'M', '𐳮'), - (0x10CAF, 'M', '𐳯'), - (0x10CB0, 'M', '𐳰'), - (0x10CB1, 'M', '𐳱'), - (0x10CB2, 'M', '𐳲'), - (0x10CB3, 'X'), - (0x10CC0, 'V'), - (0x10CF3, 'X'), - (0x10CFA, 'V'), - (0x10D28, 'X'), - (0x10D30, 'V'), - (0x10D3A, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x10E80, 'V'), - (0x10EAA, 'X'), - (0x10EAB, 'V'), - (0x10EAE, 'X'), - (0x10EB0, 'V'), - (0x10EB2, 'X'), - (0x10EFD, 'V'), - (0x10F28, 'X'), - (0x10F30, 'V'), - (0x10F5A, 'X'), - (0x10F70, 'V'), - (0x10F8A, 'X'), - (0x10FB0, 'V'), - (0x10FCC, 'X'), - (0x10FE0, 'V'), - (0x10FF7, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11076, 'X'), - (0x1107F, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C3, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), + (0x10B36, "X"), + (0x10B39, "V"), + (0x10B56, "X"), + (0x10B58, "V"), + (0x10B73, "X"), + (0x10B78, "V"), + (0x10B92, "X"), + (0x10B99, "V"), + (0x10B9D, "X"), + (0x10BA9, "V"), + (0x10BB0, "X"), + (0x10C00, "V"), + (0x10C49, "X"), + (0x10C80, "M", "𐳀"), + (0x10C81, "M", "𐳁"), + (0x10C82, "M", "𐳂"), + (0x10C83, "M", "𐳃"), + (0x10C84, "M", "𐳄"), + (0x10C85, "M", "𐳅"), + (0x10C86, "M", "𐳆"), + (0x10C87, "M", "𐳇"), + (0x10C88, "M", "𐳈"), + (0x10C89, "M", "𐳉"), + (0x10C8A, "M", "𐳊"), + (0x10C8B, "M", "𐳋"), + (0x10C8C, "M", "𐳌"), + (0x10C8D, "M", "𐳍"), + (0x10C8E, "M", "𐳎"), + (0x10C8F, "M", "𐳏"), + (0x10C90, "M", "𐳐"), + (0x10C91, "M", "𐳑"), + (0x10C92, "M", "𐳒"), + (0x10C93, "M", "𐳓"), + (0x10C94, "M", "𐳔"), + (0x10C95, "M", "𐳕"), + (0x10C96, "M", "𐳖"), + (0x10C97, "M", "𐳗"), + (0x10C98, "M", "𐳘"), + (0x10C99, "M", "𐳙"), + (0x10C9A, "M", "𐳚"), + (0x10C9B, "M", "𐳛"), + (0x10C9C, "M", "𐳜"), + (0x10C9D, "M", "𐳝"), + (0x10C9E, "M", "𐳞"), + (0x10C9F, "M", "𐳟"), + (0x10CA0, "M", "𐳠"), + (0x10CA1, "M", "𐳡"), + (0x10CA2, "M", "𐳢"), + (0x10CA3, "M", "𐳣"), + (0x10CA4, "M", "𐳤"), + (0x10CA5, "M", "𐳥"), + (0x10CA6, "M", "𐳦"), + (0x10CA7, "M", "𐳧"), + (0x10CA8, "M", "𐳨"), + (0x10CA9, "M", "𐳩"), + (0x10CAA, "M", "𐳪"), + (0x10CAB, "M", "𐳫"), + (0x10CAC, "M", "𐳬"), + (0x10CAD, "M", "𐳭"), + (0x10CAE, "M", "𐳮"), + (0x10CAF, "M", "𐳯"), + (0x10CB0, "M", "𐳰"), + (0x10CB1, "M", "𐳱"), + (0x10CB2, "M", "𐳲"), + (0x10CB3, "X"), + (0x10CC0, "V"), + (0x10CF3, "X"), + (0x10CFA, "V"), + (0x10D28, "X"), + (0x10D30, "V"), + (0x10D3A, "X"), + (0x10E60, "V"), + (0x10E7F, "X"), + (0x10E80, "V"), + (0x10EAA, "X"), + (0x10EAB, "V"), + (0x10EAE, "X"), + (0x10EB0, "V"), + (0x10EB2, "X"), + (0x10EFD, "V"), + (0x10F28, "X"), + (0x10F30, "V"), + (0x10F5A, "X"), + (0x10F70, "V"), + (0x10F8A, "X"), + (0x10FB0, "V"), + (0x10FCC, "X"), + (0x10FE0, "V"), + (0x10FF7, "X"), + (0x11000, "V"), + (0x1104E, "X"), + (0x11052, "V"), + (0x11076, "X"), + (0x1107F, "V"), + (0x110BD, "X"), + (0x110BE, "V"), + (0x110C3, "X"), + (0x110D0, "V"), + (0x110E9, "X"), + (0x110F0, "V"), ] + def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11148, 'X'), - (0x11150, 'V'), - (0x11177, 'X'), - (0x11180, 'V'), - (0x111E0, 'X'), - (0x111E1, 'V'), - (0x111F5, 'X'), - (0x11200, 'V'), - (0x11212, 'X'), - (0x11213, 'V'), - (0x11242, 'X'), - (0x11280, 'V'), - (0x11287, 'X'), - (0x11288, 'V'), - (0x11289, 'X'), - (0x1128A, 'V'), - (0x1128E, 'X'), - (0x1128F, 'V'), - (0x1129E, 'X'), - (0x1129F, 'V'), - (0x112AA, 'X'), - (0x112B0, 'V'), - (0x112EB, 'X'), - (0x112F0, 'V'), - (0x112FA, 'X'), - (0x11300, 'V'), - (0x11304, 'X'), - (0x11305, 'V'), - (0x1130D, 'X'), - (0x1130F, 'V'), - (0x11311, 'X'), - (0x11313, 'V'), - (0x11329, 'X'), - (0x1132A, 'V'), - (0x11331, 'X'), - (0x11332, 'V'), - (0x11334, 'X'), - (0x11335, 'V'), - (0x1133A, 'X'), - (0x1133B, 'V'), - (0x11345, 'X'), - (0x11347, 'V'), - (0x11349, 'X'), - (0x1134B, 'V'), - (0x1134E, 'X'), - (0x11350, 'V'), - (0x11351, 'X'), - (0x11357, 'V'), - (0x11358, 'X'), - (0x1135D, 'V'), - (0x11364, 'X'), - (0x11366, 'V'), - (0x1136D, 'X'), - (0x11370, 'V'), - (0x11375, 'X'), - (0x11400, 'V'), - (0x1145C, 'X'), - (0x1145D, 'V'), - (0x11462, 'X'), - (0x11480, 'V'), - (0x114C8, 'X'), - (0x114D0, 'V'), - (0x114DA, 'X'), - (0x11580, 'V'), - (0x115B6, 'X'), - (0x115B8, 'V'), - (0x115DE, 'X'), - (0x11600, 'V'), - (0x11645, 'X'), - (0x11650, 'V'), - (0x1165A, 'X'), - (0x11660, 'V'), - (0x1166D, 'X'), - (0x11680, 'V'), - (0x116BA, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x11700, 'V'), - (0x1171B, 'X'), - (0x1171D, 'V'), - (0x1172C, 'X'), - (0x11730, 'V'), - (0x11747, 'X'), - (0x11800, 'V'), - (0x1183C, 'X'), - (0x118A0, 'M', '𑣀'), - (0x118A1, 'M', '𑣁'), - (0x118A2, 'M', '𑣂'), - (0x118A3, 'M', '𑣃'), - (0x118A4, 'M', '𑣄'), - (0x118A5, 'M', '𑣅'), - (0x118A6, 'M', '𑣆'), - (0x118A7, 'M', '𑣇'), - (0x118A8, 'M', '𑣈'), - (0x118A9, 'M', '𑣉'), - (0x118AA, 'M', '𑣊'), + (0x110FA, "X"), + (0x11100, "V"), + (0x11135, "X"), + (0x11136, "V"), + (0x11148, "X"), + (0x11150, "V"), + (0x11177, "X"), + (0x11180, "V"), + (0x111E0, "X"), + (0x111E1, "V"), + (0x111F5, "X"), + (0x11200, "V"), + (0x11212, "X"), + (0x11213, "V"), + (0x11242, "X"), + (0x11280, "V"), + (0x11287, "X"), + (0x11288, "V"), + (0x11289, "X"), + (0x1128A, "V"), + (0x1128E, "X"), + (0x1128F, "V"), + (0x1129E, "X"), + (0x1129F, "V"), + (0x112AA, "X"), + (0x112B0, "V"), + (0x112EB, "X"), + (0x112F0, "V"), + (0x112FA, "X"), + (0x11300, "V"), + (0x11304, "X"), + (0x11305, "V"), + (0x1130D, "X"), + (0x1130F, "V"), + (0x11311, "X"), + (0x11313, "V"), + (0x11329, "X"), + (0x1132A, "V"), + (0x11331, "X"), + (0x11332, "V"), + (0x11334, "X"), + (0x11335, "V"), + (0x1133A, "X"), + (0x1133B, "V"), + (0x11345, "X"), + (0x11347, "V"), + (0x11349, "X"), + (0x1134B, "V"), + (0x1134E, "X"), + (0x11350, "V"), + (0x11351, "X"), + (0x11357, "V"), + (0x11358, "X"), + (0x1135D, "V"), + (0x11364, "X"), + (0x11366, "V"), + (0x1136D, "X"), + (0x11370, "V"), + (0x11375, "X"), + (0x11400, "V"), + (0x1145C, "X"), + (0x1145D, "V"), + (0x11462, "X"), + (0x11480, "V"), + (0x114C8, "X"), + (0x114D0, "V"), + (0x114DA, "X"), + (0x11580, "V"), + (0x115B6, "X"), + (0x115B8, "V"), + (0x115DE, "X"), + (0x11600, "V"), + (0x11645, "X"), + (0x11650, "V"), + (0x1165A, "X"), + (0x11660, "V"), + (0x1166D, "X"), + (0x11680, "V"), + (0x116BA, "X"), + (0x116C0, "V"), + (0x116CA, "X"), + (0x11700, "V"), + (0x1171B, "X"), + (0x1171D, "V"), + (0x1172C, "X"), + (0x11730, "V"), + (0x11747, "X"), + (0x11800, "V"), + (0x1183C, "X"), + (0x118A0, "M", "𑣀"), + (0x118A1, "M", "𑣁"), + (0x118A2, "M", "𑣂"), + (0x118A3, "M", "𑣃"), + (0x118A4, "M", "𑣄"), + (0x118A5, "M", "𑣅"), + (0x118A6, "M", "𑣆"), + (0x118A7, "M", "𑣇"), + (0x118A8, "M", "𑣈"), + (0x118A9, "M", "𑣉"), + (0x118AA, "M", "𑣊"), ] + def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x118AB, 'M', '𑣋'), - (0x118AC, 'M', '𑣌'), - (0x118AD, 'M', '𑣍'), - (0x118AE, 'M', '𑣎'), - (0x118AF, 'M', '𑣏'), - (0x118B0, 'M', '𑣐'), - (0x118B1, 'M', '𑣑'), - (0x118B2, 'M', '𑣒'), - (0x118B3, 'M', '𑣓'), - (0x118B4, 'M', '𑣔'), - (0x118B5, 'M', '𑣕'), - (0x118B6, 'M', '𑣖'), - (0x118B7, 'M', '𑣗'), - (0x118B8, 'M', '𑣘'), - (0x118B9, 'M', '𑣙'), - (0x118BA, 'M', '𑣚'), - (0x118BB, 'M', '𑣛'), - (0x118BC, 'M', '𑣜'), - (0x118BD, 'M', '𑣝'), - (0x118BE, 'M', '𑣞'), - (0x118BF, 'M', '𑣟'), - (0x118C0, 'V'), - (0x118F3, 'X'), - (0x118FF, 'V'), - (0x11907, 'X'), - (0x11909, 'V'), - (0x1190A, 'X'), - (0x1190C, 'V'), - (0x11914, 'X'), - (0x11915, 'V'), - (0x11917, 'X'), - (0x11918, 'V'), - (0x11936, 'X'), - (0x11937, 'V'), - (0x11939, 'X'), - (0x1193B, 'V'), - (0x11947, 'X'), - (0x11950, 'V'), - (0x1195A, 'X'), - (0x119A0, 'V'), - (0x119A8, 'X'), - (0x119AA, 'V'), - (0x119D8, 'X'), - (0x119DA, 'V'), - (0x119E5, 'X'), - (0x11A00, 'V'), - (0x11A48, 'X'), - (0x11A50, 'V'), - (0x11AA3, 'X'), - (0x11AB0, 'V'), - (0x11AF9, 'X'), - (0x11B00, 'V'), - (0x11B0A, 'X'), - (0x11C00, 'V'), - (0x11C09, 'X'), - (0x11C0A, 'V'), - (0x11C37, 'X'), - (0x11C38, 'V'), - (0x11C46, 'X'), - (0x11C50, 'V'), - (0x11C6D, 'X'), - (0x11C70, 'V'), - (0x11C90, 'X'), - (0x11C92, 'V'), - (0x11CA8, 'X'), - (0x11CA9, 'V'), - (0x11CB7, 'X'), - (0x11D00, 'V'), - (0x11D07, 'X'), - (0x11D08, 'V'), - (0x11D0A, 'X'), - (0x11D0B, 'V'), - (0x11D37, 'X'), - (0x11D3A, 'V'), - (0x11D3B, 'X'), - (0x11D3C, 'V'), - (0x11D3E, 'X'), - (0x11D3F, 'V'), - (0x11D48, 'X'), - (0x11D50, 'V'), - (0x11D5A, 'X'), - (0x11D60, 'V'), - (0x11D66, 'X'), - (0x11D67, 'V'), - (0x11D69, 'X'), - (0x11D6A, 'V'), - (0x11D8F, 'X'), - (0x11D90, 'V'), - (0x11D92, 'X'), - (0x11D93, 'V'), - (0x11D99, 'X'), - (0x11DA0, 'V'), - (0x11DAA, 'X'), - (0x11EE0, 'V'), - (0x11EF9, 'X'), - (0x11F00, 'V'), - (0x11F11, 'X'), - (0x11F12, 'V'), - (0x11F3B, 'X'), - (0x11F3E, 'V'), + (0x118AB, "M", "𑣋"), + (0x118AC, "M", "𑣌"), + (0x118AD, "M", "𑣍"), + (0x118AE, "M", "𑣎"), + (0x118AF, "M", "𑣏"), + (0x118B0, "M", "𑣐"), + (0x118B1, "M", "𑣑"), + (0x118B2, "M", "𑣒"), + (0x118B3, "M", "𑣓"), + (0x118B4, "M", "𑣔"), + (0x118B5, "M", "𑣕"), + (0x118B6, "M", "𑣖"), + (0x118B7, "M", "𑣗"), + (0x118B8, "M", "𑣘"), + (0x118B9, "M", "𑣙"), + (0x118BA, "M", "𑣚"), + (0x118BB, "M", "𑣛"), + (0x118BC, "M", "𑣜"), + (0x118BD, "M", "𑣝"), + (0x118BE, "M", "𑣞"), + (0x118BF, "M", "𑣟"), + (0x118C0, "V"), + (0x118F3, "X"), + (0x118FF, "V"), + (0x11907, "X"), + (0x11909, "V"), + (0x1190A, "X"), + (0x1190C, "V"), + (0x11914, "X"), + (0x11915, "V"), + (0x11917, "X"), + (0x11918, "V"), + (0x11936, "X"), + (0x11937, "V"), + (0x11939, "X"), + (0x1193B, "V"), + (0x11947, "X"), + (0x11950, "V"), + (0x1195A, "X"), + (0x119A0, "V"), + (0x119A8, "X"), + (0x119AA, "V"), + (0x119D8, "X"), + (0x119DA, "V"), + (0x119E5, "X"), + (0x11A00, "V"), + (0x11A48, "X"), + (0x11A50, "V"), + (0x11AA3, "X"), + (0x11AB0, "V"), + (0x11AF9, "X"), + (0x11B00, "V"), + (0x11B0A, "X"), + (0x11C00, "V"), + (0x11C09, "X"), + (0x11C0A, "V"), + (0x11C37, "X"), + (0x11C38, "V"), + (0x11C46, "X"), + (0x11C50, "V"), + (0x11C6D, "X"), + (0x11C70, "V"), + (0x11C90, "X"), + (0x11C92, "V"), + (0x11CA8, "X"), + (0x11CA9, "V"), + (0x11CB7, "X"), + (0x11D00, "V"), + (0x11D07, "X"), + (0x11D08, "V"), + (0x11D0A, "X"), + (0x11D0B, "V"), + (0x11D37, "X"), + (0x11D3A, "V"), + (0x11D3B, "X"), + (0x11D3C, "V"), + (0x11D3E, "X"), + (0x11D3F, "V"), + (0x11D48, "X"), + (0x11D50, "V"), + (0x11D5A, "X"), + (0x11D60, "V"), + (0x11D66, "X"), + (0x11D67, "V"), + (0x11D69, "X"), + (0x11D6A, "V"), + (0x11D8F, "X"), + (0x11D90, "V"), + (0x11D92, "X"), + (0x11D93, "V"), + (0x11D99, "X"), + (0x11DA0, "V"), + (0x11DAA, "X"), + (0x11EE0, "V"), + (0x11EF9, "X"), + (0x11F00, "V"), + (0x11F11, "X"), + (0x11F12, "V"), + (0x11F3B, "X"), + (0x11F3E, "V"), ] + def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x11F5A, 'X'), - (0x11FB0, 'V'), - (0x11FB1, 'X'), - (0x11FC0, 'V'), - (0x11FF2, 'X'), - (0x11FFF, 'V'), - (0x1239A, 'X'), - (0x12400, 'V'), - (0x1246F, 'X'), - (0x12470, 'V'), - (0x12475, 'X'), - (0x12480, 'V'), - (0x12544, 'X'), - (0x12F90, 'V'), - (0x12FF3, 'X'), - (0x13000, 'V'), - (0x13430, 'X'), - (0x13440, 'V'), - (0x13456, 'X'), - (0x14400, 'V'), - (0x14647, 'X'), - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16A40, 'V'), - (0x16A5F, 'X'), - (0x16A60, 'V'), - (0x16A6A, 'X'), - (0x16A6E, 'V'), - (0x16ABF, 'X'), - (0x16AC0, 'V'), - (0x16ACA, 'X'), - (0x16AD0, 'V'), - (0x16AEE, 'X'), - (0x16AF0, 'V'), - (0x16AF6, 'X'), - (0x16B00, 'V'), - (0x16B46, 'X'), - (0x16B50, 'V'), - (0x16B5A, 'X'), - (0x16B5B, 'V'), - (0x16B62, 'X'), - (0x16B63, 'V'), - (0x16B78, 'X'), - (0x16B7D, 'V'), - (0x16B90, 'X'), - (0x16E40, 'M', '𖹠'), - (0x16E41, 'M', '𖹡'), - (0x16E42, 'M', '𖹢'), - (0x16E43, 'M', '𖹣'), - (0x16E44, 'M', '𖹤'), - (0x16E45, 'M', '𖹥'), - (0x16E46, 'M', '𖹦'), - (0x16E47, 'M', '𖹧'), - (0x16E48, 'M', '𖹨'), - (0x16E49, 'M', '𖹩'), - (0x16E4A, 'M', '𖹪'), - (0x16E4B, 'M', '𖹫'), - (0x16E4C, 'M', '𖹬'), - (0x16E4D, 'M', '𖹭'), - (0x16E4E, 'M', '𖹮'), - (0x16E4F, 'M', '𖹯'), - (0x16E50, 'M', '𖹰'), - (0x16E51, 'M', '𖹱'), - (0x16E52, 'M', '𖹲'), - (0x16E53, 'M', '𖹳'), - (0x16E54, 'M', '𖹴'), - (0x16E55, 'M', '𖹵'), - (0x16E56, 'M', '𖹶'), - (0x16E57, 'M', '𖹷'), - (0x16E58, 'M', '𖹸'), - (0x16E59, 'M', '𖹹'), - (0x16E5A, 'M', '𖹺'), - (0x16E5B, 'M', '𖹻'), - (0x16E5C, 'M', '𖹼'), - (0x16E5D, 'M', '𖹽'), - (0x16E5E, 'M', '𖹾'), - (0x16E5F, 'M', '𖹿'), - (0x16E60, 'V'), - (0x16E9B, 'X'), - (0x16F00, 'V'), - (0x16F4B, 'X'), - (0x16F4F, 'V'), - (0x16F88, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x16FE0, 'V'), - (0x16FE5, 'X'), - (0x16FF0, 'V'), - (0x16FF2, 'X'), - (0x17000, 'V'), - (0x187F8, 'X'), - (0x18800, 'V'), - (0x18CD6, 'X'), - (0x18D00, 'V'), - (0x18D09, 'X'), - (0x1AFF0, 'V'), - (0x1AFF4, 'X'), - (0x1AFF5, 'V'), - (0x1AFFC, 'X'), - (0x1AFFD, 'V'), + (0x11F5A, "X"), + (0x11FB0, "V"), + (0x11FB1, "X"), + (0x11FC0, "V"), + (0x11FF2, "X"), + (0x11FFF, "V"), + (0x1239A, "X"), + (0x12400, "V"), + (0x1246F, "X"), + (0x12470, "V"), + (0x12475, "X"), + (0x12480, "V"), + (0x12544, "X"), + (0x12F90, "V"), + (0x12FF3, "X"), + (0x13000, "V"), + (0x13430, "X"), + (0x13440, "V"), + (0x13456, "X"), + (0x14400, "V"), + (0x14647, "X"), + (0x16800, "V"), + (0x16A39, "X"), + (0x16A40, "V"), + (0x16A5F, "X"), + (0x16A60, "V"), + (0x16A6A, "X"), + (0x16A6E, "V"), + (0x16ABF, "X"), + (0x16AC0, "V"), + (0x16ACA, "X"), + (0x16AD0, "V"), + (0x16AEE, "X"), + (0x16AF0, "V"), + (0x16AF6, "X"), + (0x16B00, "V"), + (0x16B46, "X"), + (0x16B50, "V"), + (0x16B5A, "X"), + (0x16B5B, "V"), + (0x16B62, "X"), + (0x16B63, "V"), + (0x16B78, "X"), + (0x16B7D, "V"), + (0x16B90, "X"), + (0x16E40, "M", "𖹠"), + (0x16E41, "M", "𖹡"), + (0x16E42, "M", "𖹢"), + (0x16E43, "M", "𖹣"), + (0x16E44, "M", "𖹤"), + (0x16E45, "M", "𖹥"), + (0x16E46, "M", "𖹦"), + (0x16E47, "M", "𖹧"), + (0x16E48, "M", "𖹨"), + (0x16E49, "M", "𖹩"), + (0x16E4A, "M", "𖹪"), + (0x16E4B, "M", "𖹫"), + (0x16E4C, "M", "𖹬"), + (0x16E4D, "M", "𖹭"), + (0x16E4E, "M", "𖹮"), + (0x16E4F, "M", "𖹯"), + (0x16E50, "M", "𖹰"), + (0x16E51, "M", "𖹱"), + (0x16E52, "M", "𖹲"), + (0x16E53, "M", "𖹳"), + (0x16E54, "M", "𖹴"), + (0x16E55, "M", "𖹵"), + (0x16E56, "M", "𖹶"), + (0x16E57, "M", "𖹷"), + (0x16E58, "M", "𖹸"), + (0x16E59, "M", "𖹹"), + (0x16E5A, "M", "𖹺"), + (0x16E5B, "M", "𖹻"), + (0x16E5C, "M", "𖹼"), + (0x16E5D, "M", "𖹽"), + (0x16E5E, "M", "𖹾"), + (0x16E5F, "M", "𖹿"), + (0x16E60, "V"), + (0x16E9B, "X"), + (0x16F00, "V"), + (0x16F4B, "X"), + (0x16F4F, "V"), + (0x16F88, "X"), + (0x16F8F, "V"), + (0x16FA0, "X"), + (0x16FE0, "V"), + (0x16FE5, "X"), + (0x16FF0, "V"), + (0x16FF2, "X"), + (0x17000, "V"), + (0x187F8, "X"), + (0x18800, "V"), + (0x18CD6, "X"), + (0x18D00, "V"), + (0x18D09, "X"), + (0x1AFF0, "V"), + (0x1AFF4, "X"), + (0x1AFF5, "V"), + (0x1AFFC, "X"), + (0x1AFFD, "V"), ] + def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1AFFF, 'X'), - (0x1B000, 'V'), - (0x1B123, 'X'), - (0x1B132, 'V'), - (0x1B133, 'X'), - (0x1B150, 'V'), - (0x1B153, 'X'), - (0x1B155, 'V'), - (0x1B156, 'X'), - (0x1B164, 'V'), - (0x1B168, 'X'), - (0x1B170, 'V'), - (0x1B2FC, 'X'), - (0x1BC00, 'V'), - (0x1BC6B, 'X'), - (0x1BC70, 'V'), - (0x1BC7D, 'X'), - (0x1BC80, 'V'), - (0x1BC89, 'X'), - (0x1BC90, 'V'), - (0x1BC9A, 'X'), - (0x1BC9C, 'V'), - (0x1BCA0, 'I'), - (0x1BCA4, 'X'), - (0x1CF00, 'V'), - (0x1CF2E, 'X'), - (0x1CF30, 'V'), - (0x1CF47, 'X'), - (0x1CF50, 'V'), - (0x1CFC4, 'X'), - (0x1D000, 'V'), - (0x1D0F6, 'X'), - (0x1D100, 'V'), - (0x1D127, 'X'), - (0x1D129, 'V'), - (0x1D15E, 'M', '𝅗𝅥'), - (0x1D15F, 'M', '𝅘𝅥'), - (0x1D160, 'M', '𝅘𝅥𝅮'), - (0x1D161, 'M', '𝅘𝅥𝅯'), - (0x1D162, 'M', '𝅘𝅥𝅰'), - (0x1D163, 'M', '𝅘𝅥𝅱'), - (0x1D164, 'M', '𝅘𝅥𝅲'), - (0x1D165, 'V'), - (0x1D173, 'X'), - (0x1D17B, 'V'), - (0x1D1BB, 'M', '𝆹𝅥'), - (0x1D1BC, 'M', '𝆺𝅥'), - (0x1D1BD, 'M', '𝆹𝅥𝅮'), - (0x1D1BE, 'M', '𝆺𝅥𝅮'), - (0x1D1BF, 'M', '𝆹𝅥𝅯'), - (0x1D1C0, 'M', '𝆺𝅥𝅯'), - (0x1D1C1, 'V'), - (0x1D1EB, 'X'), - (0x1D200, 'V'), - (0x1D246, 'X'), - (0x1D2C0, 'V'), - (0x1D2D4, 'X'), - (0x1D2E0, 'V'), - (0x1D2F4, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D379, 'X'), - (0x1D400, 'M', 'a'), - (0x1D401, 'M', 'b'), - (0x1D402, 'M', 'c'), - (0x1D403, 'M', 'd'), - (0x1D404, 'M', 'e'), - (0x1D405, 'M', 'f'), - (0x1D406, 'M', 'g'), - (0x1D407, 'M', 'h'), - (0x1D408, 'M', 'i'), - (0x1D409, 'M', 'j'), - (0x1D40A, 'M', 'k'), - (0x1D40B, 'M', 'l'), - (0x1D40C, 'M', 'm'), - (0x1D40D, 'M', 'n'), - (0x1D40E, 'M', 'o'), - (0x1D40F, 'M', 'p'), - (0x1D410, 'M', 'q'), - (0x1D411, 'M', 'r'), - (0x1D412, 'M', 's'), - (0x1D413, 'M', 't'), - (0x1D414, 'M', 'u'), - (0x1D415, 'M', 'v'), - (0x1D416, 'M', 'w'), - (0x1D417, 'M', 'x'), - (0x1D418, 'M', 'y'), - (0x1D419, 'M', 'z'), - (0x1D41A, 'M', 'a'), - (0x1D41B, 'M', 'b'), - (0x1D41C, 'M', 'c'), - (0x1D41D, 'M', 'd'), - (0x1D41E, 'M', 'e'), - (0x1D41F, 'M', 'f'), - (0x1D420, 'M', 'g'), - (0x1D421, 'M', 'h'), - (0x1D422, 'M', 'i'), - (0x1D423, 'M', 'j'), - (0x1D424, 'M', 'k'), + (0x1AFFF, "X"), + (0x1B000, "V"), + (0x1B123, "X"), + (0x1B132, "V"), + (0x1B133, "X"), + (0x1B150, "V"), + (0x1B153, "X"), + (0x1B155, "V"), + (0x1B156, "X"), + (0x1B164, "V"), + (0x1B168, "X"), + (0x1B170, "V"), + (0x1B2FC, "X"), + (0x1BC00, "V"), + (0x1BC6B, "X"), + (0x1BC70, "V"), + (0x1BC7D, "X"), + (0x1BC80, "V"), + (0x1BC89, "X"), + (0x1BC90, "V"), + (0x1BC9A, "X"), + (0x1BC9C, "V"), + (0x1BCA0, "I"), + (0x1BCA4, "X"), + (0x1CF00, "V"), + (0x1CF2E, "X"), + (0x1CF30, "V"), + (0x1CF47, "X"), + (0x1CF50, "V"), + (0x1CFC4, "X"), + (0x1D000, "V"), + (0x1D0F6, "X"), + (0x1D100, "V"), + (0x1D127, "X"), + (0x1D129, "V"), + (0x1D15E, "M", "𝅗𝅥"), + (0x1D15F, "M", "𝅘𝅥"), + (0x1D160, "M", "𝅘𝅥𝅮"), + (0x1D161, "M", "𝅘𝅥𝅯"), + (0x1D162, "M", "𝅘𝅥𝅰"), + (0x1D163, "M", "𝅘𝅥𝅱"), + (0x1D164, "M", "𝅘𝅥𝅲"), + (0x1D165, "V"), + (0x1D173, "X"), + (0x1D17B, "V"), + (0x1D1BB, "M", "𝆹𝅥"), + (0x1D1BC, "M", "𝆺𝅥"), + (0x1D1BD, "M", "𝆹𝅥𝅮"), + (0x1D1BE, "M", "𝆺𝅥𝅮"), + (0x1D1BF, "M", "𝆹𝅥𝅯"), + (0x1D1C0, "M", "𝆺𝅥𝅯"), + (0x1D1C1, "V"), + (0x1D1EB, "X"), + (0x1D200, "V"), + (0x1D246, "X"), + (0x1D2C0, "V"), + (0x1D2D4, "X"), + (0x1D2E0, "V"), + (0x1D2F4, "X"), + (0x1D300, "V"), + (0x1D357, "X"), + (0x1D360, "V"), + (0x1D379, "X"), + (0x1D400, "M", "a"), + (0x1D401, "M", "b"), + (0x1D402, "M", "c"), + (0x1D403, "M", "d"), + (0x1D404, "M", "e"), + (0x1D405, "M", "f"), + (0x1D406, "M", "g"), + (0x1D407, "M", "h"), + (0x1D408, "M", "i"), + (0x1D409, "M", "j"), + (0x1D40A, "M", "k"), + (0x1D40B, "M", "l"), + (0x1D40C, "M", "m"), + (0x1D40D, "M", "n"), + (0x1D40E, "M", "o"), + (0x1D40F, "M", "p"), + (0x1D410, "M", "q"), + (0x1D411, "M", "r"), + (0x1D412, "M", "s"), + (0x1D413, "M", "t"), + (0x1D414, "M", "u"), + (0x1D415, "M", "v"), + (0x1D416, "M", "w"), + (0x1D417, "M", "x"), + (0x1D418, "M", "y"), + (0x1D419, "M", "z"), + (0x1D41A, "M", "a"), + (0x1D41B, "M", "b"), + (0x1D41C, "M", "c"), + (0x1D41D, "M", "d"), + (0x1D41E, "M", "e"), + (0x1D41F, "M", "f"), + (0x1D420, "M", "g"), + (0x1D421, "M", "h"), + (0x1D422, "M", "i"), + (0x1D423, "M", "j"), + (0x1D424, "M", "k"), ] + def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D425, 'M', 'l'), - (0x1D426, 'M', 'm'), - (0x1D427, 'M', 'n'), - (0x1D428, 'M', 'o'), - (0x1D429, 'M', 'p'), - (0x1D42A, 'M', 'q'), - (0x1D42B, 'M', 'r'), - (0x1D42C, 'M', 's'), - (0x1D42D, 'M', 't'), - (0x1D42E, 'M', 'u'), - (0x1D42F, 'M', 'v'), - (0x1D430, 'M', 'w'), - (0x1D431, 'M', 'x'), - (0x1D432, 'M', 'y'), - (0x1D433, 'M', 'z'), - (0x1D434, 'M', 'a'), - (0x1D435, 'M', 'b'), - (0x1D436, 'M', 'c'), - (0x1D437, 'M', 'd'), - (0x1D438, 'M', 'e'), - (0x1D439, 'M', 'f'), - (0x1D43A, 'M', 'g'), - (0x1D43B, 'M', 'h'), - (0x1D43C, 'M', 'i'), - (0x1D43D, 'M', 'j'), - (0x1D43E, 'M', 'k'), - (0x1D43F, 'M', 'l'), - (0x1D440, 'M', 'm'), - (0x1D441, 'M', 'n'), - (0x1D442, 'M', 'o'), - (0x1D443, 'M', 'p'), - (0x1D444, 'M', 'q'), - (0x1D445, 'M', 'r'), - (0x1D446, 'M', 's'), - (0x1D447, 'M', 't'), - (0x1D448, 'M', 'u'), - (0x1D449, 'M', 'v'), - (0x1D44A, 'M', 'w'), - (0x1D44B, 'M', 'x'), - (0x1D44C, 'M', 'y'), - (0x1D44D, 'M', 'z'), - (0x1D44E, 'M', 'a'), - (0x1D44F, 'M', 'b'), - (0x1D450, 'M', 'c'), - (0x1D451, 'M', 'd'), - (0x1D452, 'M', 'e'), - (0x1D453, 'M', 'f'), - (0x1D454, 'M', 'g'), - (0x1D455, 'X'), - (0x1D456, 'M', 'i'), - (0x1D457, 'M', 'j'), - (0x1D458, 'M', 'k'), - (0x1D459, 'M', 'l'), - (0x1D45A, 'M', 'm'), - (0x1D45B, 'M', 'n'), - (0x1D45C, 'M', 'o'), - (0x1D45D, 'M', 'p'), - (0x1D45E, 'M', 'q'), - (0x1D45F, 'M', 'r'), - (0x1D460, 'M', 's'), - (0x1D461, 'M', 't'), - (0x1D462, 'M', 'u'), - (0x1D463, 'M', 'v'), - (0x1D464, 'M', 'w'), - (0x1D465, 'M', 'x'), - (0x1D466, 'M', 'y'), - (0x1D467, 'M', 'z'), - (0x1D468, 'M', 'a'), - (0x1D469, 'M', 'b'), - (0x1D46A, 'M', 'c'), - (0x1D46B, 'M', 'd'), - (0x1D46C, 'M', 'e'), - (0x1D46D, 'M', 'f'), - (0x1D46E, 'M', 'g'), - (0x1D46F, 'M', 'h'), - (0x1D470, 'M', 'i'), - (0x1D471, 'M', 'j'), - (0x1D472, 'M', 'k'), - (0x1D473, 'M', 'l'), - (0x1D474, 'M', 'm'), - (0x1D475, 'M', 'n'), - (0x1D476, 'M', 'o'), - (0x1D477, 'M', 'p'), - (0x1D478, 'M', 'q'), - (0x1D479, 'M', 'r'), - (0x1D47A, 'M', 's'), - (0x1D47B, 'M', 't'), - (0x1D47C, 'M', 'u'), - (0x1D47D, 'M', 'v'), - (0x1D47E, 'M', 'w'), - (0x1D47F, 'M', 'x'), - (0x1D480, 'M', 'y'), - (0x1D481, 'M', 'z'), - (0x1D482, 'M', 'a'), - (0x1D483, 'M', 'b'), - (0x1D484, 'M', 'c'), - (0x1D485, 'M', 'd'), - (0x1D486, 'M', 'e'), - (0x1D487, 'M', 'f'), - (0x1D488, 'M', 'g'), + (0x1D425, "M", "l"), + (0x1D426, "M", "m"), + (0x1D427, "M", "n"), + (0x1D428, "M", "o"), + (0x1D429, "M", "p"), + (0x1D42A, "M", "q"), + (0x1D42B, "M", "r"), + (0x1D42C, "M", "s"), + (0x1D42D, "M", "t"), + (0x1D42E, "M", "u"), + (0x1D42F, "M", "v"), + (0x1D430, "M", "w"), + (0x1D431, "M", "x"), + (0x1D432, "M", "y"), + (0x1D433, "M", "z"), + (0x1D434, "M", "a"), + (0x1D435, "M", "b"), + (0x1D436, "M", "c"), + (0x1D437, "M", "d"), + (0x1D438, "M", "e"), + (0x1D439, "M", "f"), + (0x1D43A, "M", "g"), + (0x1D43B, "M", "h"), + (0x1D43C, "M", "i"), + (0x1D43D, "M", "j"), + (0x1D43E, "M", "k"), + (0x1D43F, "M", "l"), + (0x1D440, "M", "m"), + (0x1D441, "M", "n"), + (0x1D442, "M", "o"), + (0x1D443, "M", "p"), + (0x1D444, "M", "q"), + (0x1D445, "M", "r"), + (0x1D446, "M", "s"), + (0x1D447, "M", "t"), + (0x1D448, "M", "u"), + (0x1D449, "M", "v"), + (0x1D44A, "M", "w"), + (0x1D44B, "M", "x"), + (0x1D44C, "M", "y"), + (0x1D44D, "M", "z"), + (0x1D44E, "M", "a"), + (0x1D44F, "M", "b"), + (0x1D450, "M", "c"), + (0x1D451, "M", "d"), + (0x1D452, "M", "e"), + (0x1D453, "M", "f"), + (0x1D454, "M", "g"), + (0x1D455, "X"), + (0x1D456, "M", "i"), + (0x1D457, "M", "j"), + (0x1D458, "M", "k"), + (0x1D459, "M", "l"), + (0x1D45A, "M", "m"), + (0x1D45B, "M", "n"), + (0x1D45C, "M", "o"), + (0x1D45D, "M", "p"), + (0x1D45E, "M", "q"), + (0x1D45F, "M", "r"), + (0x1D460, "M", "s"), + (0x1D461, "M", "t"), + (0x1D462, "M", "u"), + (0x1D463, "M", "v"), + (0x1D464, "M", "w"), + (0x1D465, "M", "x"), + (0x1D466, "M", "y"), + (0x1D467, "M", "z"), + (0x1D468, "M", "a"), + (0x1D469, "M", "b"), + (0x1D46A, "M", "c"), + (0x1D46B, "M", "d"), + (0x1D46C, "M", "e"), + (0x1D46D, "M", "f"), + (0x1D46E, "M", "g"), + (0x1D46F, "M", "h"), + (0x1D470, "M", "i"), + (0x1D471, "M", "j"), + (0x1D472, "M", "k"), + (0x1D473, "M", "l"), + (0x1D474, "M", "m"), + (0x1D475, "M", "n"), + (0x1D476, "M", "o"), + (0x1D477, "M", "p"), + (0x1D478, "M", "q"), + (0x1D479, "M", "r"), + (0x1D47A, "M", "s"), + (0x1D47B, "M", "t"), + (0x1D47C, "M", "u"), + (0x1D47D, "M", "v"), + (0x1D47E, "M", "w"), + (0x1D47F, "M", "x"), + (0x1D480, "M", "y"), + (0x1D481, "M", "z"), + (0x1D482, "M", "a"), + (0x1D483, "M", "b"), + (0x1D484, "M", "c"), + (0x1D485, "M", "d"), + (0x1D486, "M", "e"), + (0x1D487, "M", "f"), + (0x1D488, "M", "g"), ] + def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D489, 'M', 'h'), - (0x1D48A, 'M', 'i'), - (0x1D48B, 'M', 'j'), - (0x1D48C, 'M', 'k'), - (0x1D48D, 'M', 'l'), - (0x1D48E, 'M', 'm'), - (0x1D48F, 'M', 'n'), - (0x1D490, 'M', 'o'), - (0x1D491, 'M', 'p'), - (0x1D492, 'M', 'q'), - (0x1D493, 'M', 'r'), - (0x1D494, 'M', 's'), - (0x1D495, 'M', 't'), - (0x1D496, 'M', 'u'), - (0x1D497, 'M', 'v'), - (0x1D498, 'M', 'w'), - (0x1D499, 'M', 'x'), - (0x1D49A, 'M', 'y'), - (0x1D49B, 'M', 'z'), - (0x1D49C, 'M', 'a'), - (0x1D49D, 'X'), - (0x1D49E, 'M', 'c'), - (0x1D49F, 'M', 'd'), - (0x1D4A0, 'X'), - (0x1D4A2, 'M', 'g'), - (0x1D4A3, 'X'), - (0x1D4A5, 'M', 'j'), - (0x1D4A6, 'M', 'k'), - (0x1D4A7, 'X'), - (0x1D4A9, 'M', 'n'), - (0x1D4AA, 'M', 'o'), - (0x1D4AB, 'M', 'p'), - (0x1D4AC, 'M', 'q'), - (0x1D4AD, 'X'), - (0x1D4AE, 'M', 's'), - (0x1D4AF, 'M', 't'), - (0x1D4B0, 'M', 'u'), - (0x1D4B1, 'M', 'v'), - (0x1D4B2, 'M', 'w'), - (0x1D4B3, 'M', 'x'), - (0x1D4B4, 'M', 'y'), - (0x1D4B5, 'M', 'z'), - (0x1D4B6, 'M', 'a'), - (0x1D4B7, 'M', 'b'), - (0x1D4B8, 'M', 'c'), - (0x1D4B9, 'M', 'd'), - (0x1D4BA, 'X'), - (0x1D4BB, 'M', 'f'), - (0x1D4BC, 'X'), - (0x1D4BD, 'M', 'h'), - (0x1D4BE, 'M', 'i'), - (0x1D4BF, 'M', 'j'), - (0x1D4C0, 'M', 'k'), - (0x1D4C1, 'M', 'l'), - (0x1D4C2, 'M', 'm'), - (0x1D4C3, 'M', 'n'), - (0x1D4C4, 'X'), - (0x1D4C5, 'M', 'p'), - (0x1D4C6, 'M', 'q'), - (0x1D4C7, 'M', 'r'), - (0x1D4C8, 'M', 's'), - (0x1D4C9, 'M', 't'), - (0x1D4CA, 'M', 'u'), - (0x1D4CB, 'M', 'v'), - (0x1D4CC, 'M', 'w'), - (0x1D4CD, 'M', 'x'), - (0x1D4CE, 'M', 'y'), - (0x1D4CF, 'M', 'z'), - (0x1D4D0, 'M', 'a'), - (0x1D4D1, 'M', 'b'), - (0x1D4D2, 'M', 'c'), - (0x1D4D3, 'M', 'd'), - (0x1D4D4, 'M', 'e'), - (0x1D4D5, 'M', 'f'), - (0x1D4D6, 'M', 'g'), - (0x1D4D7, 'M', 'h'), - (0x1D4D8, 'M', 'i'), - (0x1D4D9, 'M', 'j'), - (0x1D4DA, 'M', 'k'), - (0x1D4DB, 'M', 'l'), - (0x1D4DC, 'M', 'm'), - (0x1D4DD, 'M', 'n'), - (0x1D4DE, 'M', 'o'), - (0x1D4DF, 'M', 'p'), - (0x1D4E0, 'M', 'q'), - (0x1D4E1, 'M', 'r'), - (0x1D4E2, 'M', 's'), - (0x1D4E3, 'M', 't'), - (0x1D4E4, 'M', 'u'), - (0x1D4E5, 'M', 'v'), - (0x1D4E6, 'M', 'w'), - (0x1D4E7, 'M', 'x'), - (0x1D4E8, 'M', 'y'), - (0x1D4E9, 'M', 'z'), - (0x1D4EA, 'M', 'a'), - (0x1D4EB, 'M', 'b'), - (0x1D4EC, 'M', 'c'), - (0x1D4ED, 'M', 'd'), - (0x1D4EE, 'M', 'e'), - (0x1D4EF, 'M', 'f'), + (0x1D489, "M", "h"), + (0x1D48A, "M", "i"), + (0x1D48B, "M", "j"), + (0x1D48C, "M", "k"), + (0x1D48D, "M", "l"), + (0x1D48E, "M", "m"), + (0x1D48F, "M", "n"), + (0x1D490, "M", "o"), + (0x1D491, "M", "p"), + (0x1D492, "M", "q"), + (0x1D493, "M", "r"), + (0x1D494, "M", "s"), + (0x1D495, "M", "t"), + (0x1D496, "M", "u"), + (0x1D497, "M", "v"), + (0x1D498, "M", "w"), + (0x1D499, "M", "x"), + (0x1D49A, "M", "y"), + (0x1D49B, "M", "z"), + (0x1D49C, "M", "a"), + (0x1D49D, "X"), + (0x1D49E, "M", "c"), + (0x1D49F, "M", "d"), + (0x1D4A0, "X"), + (0x1D4A2, "M", "g"), + (0x1D4A3, "X"), + (0x1D4A5, "M", "j"), + (0x1D4A6, "M", "k"), + (0x1D4A7, "X"), + (0x1D4A9, "M", "n"), + (0x1D4AA, "M", "o"), + (0x1D4AB, "M", "p"), + (0x1D4AC, "M", "q"), + (0x1D4AD, "X"), + (0x1D4AE, "M", "s"), + (0x1D4AF, "M", "t"), + (0x1D4B0, "M", "u"), + (0x1D4B1, "M", "v"), + (0x1D4B2, "M", "w"), + (0x1D4B3, "M", "x"), + (0x1D4B4, "M", "y"), + (0x1D4B5, "M", "z"), + (0x1D4B6, "M", "a"), + (0x1D4B7, "M", "b"), + (0x1D4B8, "M", "c"), + (0x1D4B9, "M", "d"), + (0x1D4BA, "X"), + (0x1D4BB, "M", "f"), + (0x1D4BC, "X"), + (0x1D4BD, "M", "h"), + (0x1D4BE, "M", "i"), + (0x1D4BF, "M", "j"), + (0x1D4C0, "M", "k"), + (0x1D4C1, "M", "l"), + (0x1D4C2, "M", "m"), + (0x1D4C3, "M", "n"), + (0x1D4C4, "X"), + (0x1D4C5, "M", "p"), + (0x1D4C6, "M", "q"), + (0x1D4C7, "M", "r"), + (0x1D4C8, "M", "s"), + (0x1D4C9, "M", "t"), + (0x1D4CA, "M", "u"), + (0x1D4CB, "M", "v"), + (0x1D4CC, "M", "w"), + (0x1D4CD, "M", "x"), + (0x1D4CE, "M", "y"), + (0x1D4CF, "M", "z"), + (0x1D4D0, "M", "a"), + (0x1D4D1, "M", "b"), + (0x1D4D2, "M", "c"), + (0x1D4D3, "M", "d"), + (0x1D4D4, "M", "e"), + (0x1D4D5, "M", "f"), + (0x1D4D6, "M", "g"), + (0x1D4D7, "M", "h"), + (0x1D4D8, "M", "i"), + (0x1D4D9, "M", "j"), + (0x1D4DA, "M", "k"), + (0x1D4DB, "M", "l"), + (0x1D4DC, "M", "m"), + (0x1D4DD, "M", "n"), + (0x1D4DE, "M", "o"), + (0x1D4DF, "M", "p"), + (0x1D4E0, "M", "q"), + (0x1D4E1, "M", "r"), + (0x1D4E2, "M", "s"), + (0x1D4E3, "M", "t"), + (0x1D4E4, "M", "u"), + (0x1D4E5, "M", "v"), + (0x1D4E6, "M", "w"), + (0x1D4E7, "M", "x"), + (0x1D4E8, "M", "y"), + (0x1D4E9, "M", "z"), + (0x1D4EA, "M", "a"), + (0x1D4EB, "M", "b"), + (0x1D4EC, "M", "c"), + (0x1D4ED, "M", "d"), + (0x1D4EE, "M", "e"), + (0x1D4EF, "M", "f"), ] + def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D4F0, 'M', 'g'), - (0x1D4F1, 'M', 'h'), - (0x1D4F2, 'M', 'i'), - (0x1D4F3, 'M', 'j'), - (0x1D4F4, 'M', 'k'), - (0x1D4F5, 'M', 'l'), - (0x1D4F6, 'M', 'm'), - (0x1D4F7, 'M', 'n'), - (0x1D4F8, 'M', 'o'), - (0x1D4F9, 'M', 'p'), - (0x1D4FA, 'M', 'q'), - (0x1D4FB, 'M', 'r'), - (0x1D4FC, 'M', 's'), - (0x1D4FD, 'M', 't'), - (0x1D4FE, 'M', 'u'), - (0x1D4FF, 'M', 'v'), - (0x1D500, 'M', 'w'), - (0x1D501, 'M', 'x'), - (0x1D502, 'M', 'y'), - (0x1D503, 'M', 'z'), - (0x1D504, 'M', 'a'), - (0x1D505, 'M', 'b'), - (0x1D506, 'X'), - (0x1D507, 'M', 'd'), - (0x1D508, 'M', 'e'), - (0x1D509, 'M', 'f'), - (0x1D50A, 'M', 'g'), - (0x1D50B, 'X'), - (0x1D50D, 'M', 'j'), - (0x1D50E, 'M', 'k'), - (0x1D50F, 'M', 'l'), - (0x1D510, 'M', 'm'), - (0x1D511, 'M', 'n'), - (0x1D512, 'M', 'o'), - (0x1D513, 'M', 'p'), - (0x1D514, 'M', 'q'), - (0x1D515, 'X'), - (0x1D516, 'M', 's'), - (0x1D517, 'M', 't'), - (0x1D518, 'M', 'u'), - (0x1D519, 'M', 'v'), - (0x1D51A, 'M', 'w'), - (0x1D51B, 'M', 'x'), - (0x1D51C, 'M', 'y'), - (0x1D51D, 'X'), - (0x1D51E, 'M', 'a'), - (0x1D51F, 'M', 'b'), - (0x1D520, 'M', 'c'), - (0x1D521, 'M', 'd'), - (0x1D522, 'M', 'e'), - (0x1D523, 'M', 'f'), - (0x1D524, 'M', 'g'), - (0x1D525, 'M', 'h'), - (0x1D526, 'M', 'i'), - (0x1D527, 'M', 'j'), - (0x1D528, 'M', 'k'), - (0x1D529, 'M', 'l'), - (0x1D52A, 'M', 'm'), - (0x1D52B, 'M', 'n'), - (0x1D52C, 'M', 'o'), - (0x1D52D, 'M', 'p'), - (0x1D52E, 'M', 'q'), - (0x1D52F, 'M', 'r'), - (0x1D530, 'M', 's'), - (0x1D531, 'M', 't'), - (0x1D532, 'M', 'u'), - (0x1D533, 'M', 'v'), - (0x1D534, 'M', 'w'), - (0x1D535, 'M', 'x'), - (0x1D536, 'M', 'y'), - (0x1D537, 'M', 'z'), - (0x1D538, 'M', 'a'), - (0x1D539, 'M', 'b'), - (0x1D53A, 'X'), - (0x1D53B, 'M', 'd'), - (0x1D53C, 'M', 'e'), - (0x1D53D, 'M', 'f'), - (0x1D53E, 'M', 'g'), - (0x1D53F, 'X'), - (0x1D540, 'M', 'i'), - (0x1D541, 'M', 'j'), - (0x1D542, 'M', 'k'), - (0x1D543, 'M', 'l'), - (0x1D544, 'M', 'm'), - (0x1D545, 'X'), - (0x1D546, 'M', 'o'), - (0x1D547, 'X'), - (0x1D54A, 'M', 's'), - (0x1D54B, 'M', 't'), - (0x1D54C, 'M', 'u'), - (0x1D54D, 'M', 'v'), - (0x1D54E, 'M', 'w'), - (0x1D54F, 'M', 'x'), - (0x1D550, 'M', 'y'), - (0x1D551, 'X'), - (0x1D552, 'M', 'a'), - (0x1D553, 'M', 'b'), - (0x1D554, 'M', 'c'), - (0x1D555, 'M', 'd'), - (0x1D556, 'M', 'e'), + (0x1D4F0, "M", "g"), + (0x1D4F1, "M", "h"), + (0x1D4F2, "M", "i"), + (0x1D4F3, "M", "j"), + (0x1D4F4, "M", "k"), + (0x1D4F5, "M", "l"), + (0x1D4F6, "M", "m"), + (0x1D4F7, "M", "n"), + (0x1D4F8, "M", "o"), + (0x1D4F9, "M", "p"), + (0x1D4FA, "M", "q"), + (0x1D4FB, "M", "r"), + (0x1D4FC, "M", "s"), + (0x1D4FD, "M", "t"), + (0x1D4FE, "M", "u"), + (0x1D4FF, "M", "v"), + (0x1D500, "M", "w"), + (0x1D501, "M", "x"), + (0x1D502, "M", "y"), + (0x1D503, "M", "z"), + (0x1D504, "M", "a"), + (0x1D505, "M", "b"), + (0x1D506, "X"), + (0x1D507, "M", "d"), + (0x1D508, "M", "e"), + (0x1D509, "M", "f"), + (0x1D50A, "M", "g"), + (0x1D50B, "X"), + (0x1D50D, "M", "j"), + (0x1D50E, "M", "k"), + (0x1D50F, "M", "l"), + (0x1D510, "M", "m"), + (0x1D511, "M", "n"), + (0x1D512, "M", "o"), + (0x1D513, "M", "p"), + (0x1D514, "M", "q"), + (0x1D515, "X"), + (0x1D516, "M", "s"), + (0x1D517, "M", "t"), + (0x1D518, "M", "u"), + (0x1D519, "M", "v"), + (0x1D51A, "M", "w"), + (0x1D51B, "M", "x"), + (0x1D51C, "M", "y"), + (0x1D51D, "X"), + (0x1D51E, "M", "a"), + (0x1D51F, "M", "b"), + (0x1D520, "M", "c"), + (0x1D521, "M", "d"), + (0x1D522, "M", "e"), + (0x1D523, "M", "f"), + (0x1D524, "M", "g"), + (0x1D525, "M", "h"), + (0x1D526, "M", "i"), + (0x1D527, "M", "j"), + (0x1D528, "M", "k"), + (0x1D529, "M", "l"), + (0x1D52A, "M", "m"), + (0x1D52B, "M", "n"), + (0x1D52C, "M", "o"), + (0x1D52D, "M", "p"), + (0x1D52E, "M", "q"), + (0x1D52F, "M", "r"), + (0x1D530, "M", "s"), + (0x1D531, "M", "t"), + (0x1D532, "M", "u"), + (0x1D533, "M", "v"), + (0x1D534, "M", "w"), + (0x1D535, "M", "x"), + (0x1D536, "M", "y"), + (0x1D537, "M", "z"), + (0x1D538, "M", "a"), + (0x1D539, "M", "b"), + (0x1D53A, "X"), + (0x1D53B, "M", "d"), + (0x1D53C, "M", "e"), + (0x1D53D, "M", "f"), + (0x1D53E, "M", "g"), + (0x1D53F, "X"), + (0x1D540, "M", "i"), + (0x1D541, "M", "j"), + (0x1D542, "M", "k"), + (0x1D543, "M", "l"), + (0x1D544, "M", "m"), + (0x1D545, "X"), + (0x1D546, "M", "o"), + (0x1D547, "X"), + (0x1D54A, "M", "s"), + (0x1D54B, "M", "t"), + (0x1D54C, "M", "u"), + (0x1D54D, "M", "v"), + (0x1D54E, "M", "w"), + (0x1D54F, "M", "x"), + (0x1D550, "M", "y"), + (0x1D551, "X"), + (0x1D552, "M", "a"), + (0x1D553, "M", "b"), + (0x1D554, "M", "c"), + (0x1D555, "M", "d"), + (0x1D556, "M", "e"), ] + def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D557, 'M', 'f'), - (0x1D558, 'M', 'g'), - (0x1D559, 'M', 'h'), - (0x1D55A, 'M', 'i'), - (0x1D55B, 'M', 'j'), - (0x1D55C, 'M', 'k'), - (0x1D55D, 'M', 'l'), - (0x1D55E, 'M', 'm'), - (0x1D55F, 'M', 'n'), - (0x1D560, 'M', 'o'), - (0x1D561, 'M', 'p'), - (0x1D562, 'M', 'q'), - (0x1D563, 'M', 'r'), - (0x1D564, 'M', 's'), - (0x1D565, 'M', 't'), - (0x1D566, 'M', 'u'), - (0x1D567, 'M', 'v'), - (0x1D568, 'M', 'w'), - (0x1D569, 'M', 'x'), - (0x1D56A, 'M', 'y'), - (0x1D56B, 'M', 'z'), - (0x1D56C, 'M', 'a'), - (0x1D56D, 'M', 'b'), - (0x1D56E, 'M', 'c'), - (0x1D56F, 'M', 'd'), - (0x1D570, 'M', 'e'), - (0x1D571, 'M', 'f'), - (0x1D572, 'M', 'g'), - (0x1D573, 'M', 'h'), - (0x1D574, 'M', 'i'), - (0x1D575, 'M', 'j'), - (0x1D576, 'M', 'k'), - (0x1D577, 'M', 'l'), - (0x1D578, 'M', 'm'), - (0x1D579, 'M', 'n'), - (0x1D57A, 'M', 'o'), - (0x1D57B, 'M', 'p'), - (0x1D57C, 'M', 'q'), - (0x1D57D, 'M', 'r'), - (0x1D57E, 'M', 's'), - (0x1D57F, 'M', 't'), - (0x1D580, 'M', 'u'), - (0x1D581, 'M', 'v'), - (0x1D582, 'M', 'w'), - (0x1D583, 'M', 'x'), - (0x1D584, 'M', 'y'), - (0x1D585, 'M', 'z'), - (0x1D586, 'M', 'a'), - (0x1D587, 'M', 'b'), - (0x1D588, 'M', 'c'), - (0x1D589, 'M', 'd'), - (0x1D58A, 'M', 'e'), - (0x1D58B, 'M', 'f'), - (0x1D58C, 'M', 'g'), - (0x1D58D, 'M', 'h'), - (0x1D58E, 'M', 'i'), - (0x1D58F, 'M', 'j'), - (0x1D590, 'M', 'k'), - (0x1D591, 'M', 'l'), - (0x1D592, 'M', 'm'), - (0x1D593, 'M', 'n'), - (0x1D594, 'M', 'o'), - (0x1D595, 'M', 'p'), - (0x1D596, 'M', 'q'), - (0x1D597, 'M', 'r'), - (0x1D598, 'M', 's'), - (0x1D599, 'M', 't'), - (0x1D59A, 'M', 'u'), - (0x1D59B, 'M', 'v'), - (0x1D59C, 'M', 'w'), - (0x1D59D, 'M', 'x'), - (0x1D59E, 'M', 'y'), - (0x1D59F, 'M', 'z'), - (0x1D5A0, 'M', 'a'), - (0x1D5A1, 'M', 'b'), - (0x1D5A2, 'M', 'c'), - (0x1D5A3, 'M', 'd'), - (0x1D5A4, 'M', 'e'), - (0x1D5A5, 'M', 'f'), - (0x1D5A6, 'M', 'g'), - (0x1D5A7, 'M', 'h'), - (0x1D5A8, 'M', 'i'), - (0x1D5A9, 'M', 'j'), - (0x1D5AA, 'M', 'k'), - (0x1D5AB, 'M', 'l'), - (0x1D5AC, 'M', 'm'), - (0x1D5AD, 'M', 'n'), - (0x1D5AE, 'M', 'o'), - (0x1D5AF, 'M', 'p'), - (0x1D5B0, 'M', 'q'), - (0x1D5B1, 'M', 'r'), - (0x1D5B2, 'M', 's'), - (0x1D5B3, 'M', 't'), - (0x1D5B4, 'M', 'u'), - (0x1D5B5, 'M', 'v'), - (0x1D5B6, 'M', 'w'), - (0x1D5B7, 'M', 'x'), - (0x1D5B8, 'M', 'y'), - (0x1D5B9, 'M', 'z'), - (0x1D5BA, 'M', 'a'), + (0x1D557, "M", "f"), + (0x1D558, "M", "g"), + (0x1D559, "M", "h"), + (0x1D55A, "M", "i"), + (0x1D55B, "M", "j"), + (0x1D55C, "M", "k"), + (0x1D55D, "M", "l"), + (0x1D55E, "M", "m"), + (0x1D55F, "M", "n"), + (0x1D560, "M", "o"), + (0x1D561, "M", "p"), + (0x1D562, "M", "q"), + (0x1D563, "M", "r"), + (0x1D564, "M", "s"), + (0x1D565, "M", "t"), + (0x1D566, "M", "u"), + (0x1D567, "M", "v"), + (0x1D568, "M", "w"), + (0x1D569, "M", "x"), + (0x1D56A, "M", "y"), + (0x1D56B, "M", "z"), + (0x1D56C, "M", "a"), + (0x1D56D, "M", "b"), + (0x1D56E, "M", "c"), + (0x1D56F, "M", "d"), + (0x1D570, "M", "e"), + (0x1D571, "M", "f"), + (0x1D572, "M", "g"), + (0x1D573, "M", "h"), + (0x1D574, "M", "i"), + (0x1D575, "M", "j"), + (0x1D576, "M", "k"), + (0x1D577, "M", "l"), + (0x1D578, "M", "m"), + (0x1D579, "M", "n"), + (0x1D57A, "M", "o"), + (0x1D57B, "M", "p"), + (0x1D57C, "M", "q"), + (0x1D57D, "M", "r"), + (0x1D57E, "M", "s"), + (0x1D57F, "M", "t"), + (0x1D580, "M", "u"), + (0x1D581, "M", "v"), + (0x1D582, "M", "w"), + (0x1D583, "M", "x"), + (0x1D584, "M", "y"), + (0x1D585, "M", "z"), + (0x1D586, "M", "a"), + (0x1D587, "M", "b"), + (0x1D588, "M", "c"), + (0x1D589, "M", "d"), + (0x1D58A, "M", "e"), + (0x1D58B, "M", "f"), + (0x1D58C, "M", "g"), + (0x1D58D, "M", "h"), + (0x1D58E, "M", "i"), + (0x1D58F, "M", "j"), + (0x1D590, "M", "k"), + (0x1D591, "M", "l"), + (0x1D592, "M", "m"), + (0x1D593, "M", "n"), + (0x1D594, "M", "o"), + (0x1D595, "M", "p"), + (0x1D596, "M", "q"), + (0x1D597, "M", "r"), + (0x1D598, "M", "s"), + (0x1D599, "M", "t"), + (0x1D59A, "M", "u"), + (0x1D59B, "M", "v"), + (0x1D59C, "M", "w"), + (0x1D59D, "M", "x"), + (0x1D59E, "M", "y"), + (0x1D59F, "M", "z"), + (0x1D5A0, "M", "a"), + (0x1D5A1, "M", "b"), + (0x1D5A2, "M", "c"), + (0x1D5A3, "M", "d"), + (0x1D5A4, "M", "e"), + (0x1D5A5, "M", "f"), + (0x1D5A6, "M", "g"), + (0x1D5A7, "M", "h"), + (0x1D5A8, "M", "i"), + (0x1D5A9, "M", "j"), + (0x1D5AA, "M", "k"), + (0x1D5AB, "M", "l"), + (0x1D5AC, "M", "m"), + (0x1D5AD, "M", "n"), + (0x1D5AE, "M", "o"), + (0x1D5AF, "M", "p"), + (0x1D5B0, "M", "q"), + (0x1D5B1, "M", "r"), + (0x1D5B2, "M", "s"), + (0x1D5B3, "M", "t"), + (0x1D5B4, "M", "u"), + (0x1D5B5, "M", "v"), + (0x1D5B6, "M", "w"), + (0x1D5B7, "M", "x"), + (0x1D5B8, "M", "y"), + (0x1D5B9, "M", "z"), + (0x1D5BA, "M", "a"), ] + def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D5BB, 'M', 'b'), - (0x1D5BC, 'M', 'c'), - (0x1D5BD, 'M', 'd'), - (0x1D5BE, 'M', 'e'), - (0x1D5BF, 'M', 'f'), - (0x1D5C0, 'M', 'g'), - (0x1D5C1, 'M', 'h'), - (0x1D5C2, 'M', 'i'), - (0x1D5C3, 'M', 'j'), - (0x1D5C4, 'M', 'k'), - (0x1D5C5, 'M', 'l'), - (0x1D5C6, 'M', 'm'), - (0x1D5C7, 'M', 'n'), - (0x1D5C8, 'M', 'o'), - (0x1D5C9, 'M', 'p'), - (0x1D5CA, 'M', 'q'), - (0x1D5CB, 'M', 'r'), - (0x1D5CC, 'M', 's'), - (0x1D5CD, 'M', 't'), - (0x1D5CE, 'M', 'u'), - (0x1D5CF, 'M', 'v'), - (0x1D5D0, 'M', 'w'), - (0x1D5D1, 'M', 'x'), - (0x1D5D2, 'M', 'y'), - (0x1D5D3, 'M', 'z'), - (0x1D5D4, 'M', 'a'), - (0x1D5D5, 'M', 'b'), - (0x1D5D6, 'M', 'c'), - (0x1D5D7, 'M', 'd'), - (0x1D5D8, 'M', 'e'), - (0x1D5D9, 'M', 'f'), - (0x1D5DA, 'M', 'g'), - (0x1D5DB, 'M', 'h'), - (0x1D5DC, 'M', 'i'), - (0x1D5DD, 'M', 'j'), - (0x1D5DE, 'M', 'k'), - (0x1D5DF, 'M', 'l'), - (0x1D5E0, 'M', 'm'), - (0x1D5E1, 'M', 'n'), - (0x1D5E2, 'M', 'o'), - (0x1D5E3, 'M', 'p'), - (0x1D5E4, 'M', 'q'), - (0x1D5E5, 'M', 'r'), - (0x1D5E6, 'M', 's'), - (0x1D5E7, 'M', 't'), - (0x1D5E8, 'M', 'u'), - (0x1D5E9, 'M', 'v'), - (0x1D5EA, 'M', 'w'), - (0x1D5EB, 'M', 'x'), - (0x1D5EC, 'M', 'y'), - (0x1D5ED, 'M', 'z'), - (0x1D5EE, 'M', 'a'), - (0x1D5EF, 'M', 'b'), - (0x1D5F0, 'M', 'c'), - (0x1D5F1, 'M', 'd'), - (0x1D5F2, 'M', 'e'), - (0x1D5F3, 'M', 'f'), - (0x1D5F4, 'M', 'g'), - (0x1D5F5, 'M', 'h'), - (0x1D5F6, 'M', 'i'), - (0x1D5F7, 'M', 'j'), - (0x1D5F8, 'M', 'k'), - (0x1D5F9, 'M', 'l'), - (0x1D5FA, 'M', 'm'), - (0x1D5FB, 'M', 'n'), - (0x1D5FC, 'M', 'o'), - (0x1D5FD, 'M', 'p'), - (0x1D5FE, 'M', 'q'), - (0x1D5FF, 'M', 'r'), - (0x1D600, 'M', 's'), - (0x1D601, 'M', 't'), - (0x1D602, 'M', 'u'), - (0x1D603, 'M', 'v'), - (0x1D604, 'M', 'w'), - (0x1D605, 'M', 'x'), - (0x1D606, 'M', 'y'), - (0x1D607, 'M', 'z'), - (0x1D608, 'M', 'a'), - (0x1D609, 'M', 'b'), - (0x1D60A, 'M', 'c'), - (0x1D60B, 'M', 'd'), - (0x1D60C, 'M', 'e'), - (0x1D60D, 'M', 'f'), - (0x1D60E, 'M', 'g'), - (0x1D60F, 'M', 'h'), - (0x1D610, 'M', 'i'), - (0x1D611, 'M', 'j'), - (0x1D612, 'M', 'k'), - (0x1D613, 'M', 'l'), - (0x1D614, 'M', 'm'), - (0x1D615, 'M', 'n'), - (0x1D616, 'M', 'o'), - (0x1D617, 'M', 'p'), - (0x1D618, 'M', 'q'), - (0x1D619, 'M', 'r'), - (0x1D61A, 'M', 's'), - (0x1D61B, 'M', 't'), - (0x1D61C, 'M', 'u'), - (0x1D61D, 'M', 'v'), - (0x1D61E, 'M', 'w'), + (0x1D5BB, "M", "b"), + (0x1D5BC, "M", "c"), + (0x1D5BD, "M", "d"), + (0x1D5BE, "M", "e"), + (0x1D5BF, "M", "f"), + (0x1D5C0, "M", "g"), + (0x1D5C1, "M", "h"), + (0x1D5C2, "M", "i"), + (0x1D5C3, "M", "j"), + (0x1D5C4, "M", "k"), + (0x1D5C5, "M", "l"), + (0x1D5C6, "M", "m"), + (0x1D5C7, "M", "n"), + (0x1D5C8, "M", "o"), + (0x1D5C9, "M", "p"), + (0x1D5CA, "M", "q"), + (0x1D5CB, "M", "r"), + (0x1D5CC, "M", "s"), + (0x1D5CD, "M", "t"), + (0x1D5CE, "M", "u"), + (0x1D5CF, "M", "v"), + (0x1D5D0, "M", "w"), + (0x1D5D1, "M", "x"), + (0x1D5D2, "M", "y"), + (0x1D5D3, "M", "z"), + (0x1D5D4, "M", "a"), + (0x1D5D5, "M", "b"), + (0x1D5D6, "M", "c"), + (0x1D5D7, "M", "d"), + (0x1D5D8, "M", "e"), + (0x1D5D9, "M", "f"), + (0x1D5DA, "M", "g"), + (0x1D5DB, "M", "h"), + (0x1D5DC, "M", "i"), + (0x1D5DD, "M", "j"), + (0x1D5DE, "M", "k"), + (0x1D5DF, "M", "l"), + (0x1D5E0, "M", "m"), + (0x1D5E1, "M", "n"), + (0x1D5E2, "M", "o"), + (0x1D5E3, "M", "p"), + (0x1D5E4, "M", "q"), + (0x1D5E5, "M", "r"), + (0x1D5E6, "M", "s"), + (0x1D5E7, "M", "t"), + (0x1D5E8, "M", "u"), + (0x1D5E9, "M", "v"), + (0x1D5EA, "M", "w"), + (0x1D5EB, "M", "x"), + (0x1D5EC, "M", "y"), + (0x1D5ED, "M", "z"), + (0x1D5EE, "M", "a"), + (0x1D5EF, "M", "b"), + (0x1D5F0, "M", "c"), + (0x1D5F1, "M", "d"), + (0x1D5F2, "M", "e"), + (0x1D5F3, "M", "f"), + (0x1D5F4, "M", "g"), + (0x1D5F5, "M", "h"), + (0x1D5F6, "M", "i"), + (0x1D5F7, "M", "j"), + (0x1D5F8, "M", "k"), + (0x1D5F9, "M", "l"), + (0x1D5FA, "M", "m"), + (0x1D5FB, "M", "n"), + (0x1D5FC, "M", "o"), + (0x1D5FD, "M", "p"), + (0x1D5FE, "M", "q"), + (0x1D5FF, "M", "r"), + (0x1D600, "M", "s"), + (0x1D601, "M", "t"), + (0x1D602, "M", "u"), + (0x1D603, "M", "v"), + (0x1D604, "M", "w"), + (0x1D605, "M", "x"), + (0x1D606, "M", "y"), + (0x1D607, "M", "z"), + (0x1D608, "M", "a"), + (0x1D609, "M", "b"), + (0x1D60A, "M", "c"), + (0x1D60B, "M", "d"), + (0x1D60C, "M", "e"), + (0x1D60D, "M", "f"), + (0x1D60E, "M", "g"), + (0x1D60F, "M", "h"), + (0x1D610, "M", "i"), + (0x1D611, "M", "j"), + (0x1D612, "M", "k"), + (0x1D613, "M", "l"), + (0x1D614, "M", "m"), + (0x1D615, "M", "n"), + (0x1D616, "M", "o"), + (0x1D617, "M", "p"), + (0x1D618, "M", "q"), + (0x1D619, "M", "r"), + (0x1D61A, "M", "s"), + (0x1D61B, "M", "t"), + (0x1D61C, "M", "u"), + (0x1D61D, "M", "v"), + (0x1D61E, "M", "w"), ] + def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D61F, 'M', 'x'), - (0x1D620, 'M', 'y'), - (0x1D621, 'M', 'z'), - (0x1D622, 'M', 'a'), - (0x1D623, 'M', 'b'), - (0x1D624, 'M', 'c'), - (0x1D625, 'M', 'd'), - (0x1D626, 'M', 'e'), - (0x1D627, 'M', 'f'), - (0x1D628, 'M', 'g'), - (0x1D629, 'M', 'h'), - (0x1D62A, 'M', 'i'), - (0x1D62B, 'M', 'j'), - (0x1D62C, 'M', 'k'), - (0x1D62D, 'M', 'l'), - (0x1D62E, 'M', 'm'), - (0x1D62F, 'M', 'n'), - (0x1D630, 'M', 'o'), - (0x1D631, 'M', 'p'), - (0x1D632, 'M', 'q'), - (0x1D633, 'M', 'r'), - (0x1D634, 'M', 's'), - (0x1D635, 'M', 't'), - (0x1D636, 'M', 'u'), - (0x1D637, 'M', 'v'), - (0x1D638, 'M', 'w'), - (0x1D639, 'M', 'x'), - (0x1D63A, 'M', 'y'), - (0x1D63B, 'M', 'z'), - (0x1D63C, 'M', 'a'), - (0x1D63D, 'M', 'b'), - (0x1D63E, 'M', 'c'), - (0x1D63F, 'M', 'd'), - (0x1D640, 'M', 'e'), - (0x1D641, 'M', 'f'), - (0x1D642, 'M', 'g'), - (0x1D643, 'M', 'h'), - (0x1D644, 'M', 'i'), - (0x1D645, 'M', 'j'), - (0x1D646, 'M', 'k'), - (0x1D647, 'M', 'l'), - (0x1D648, 'M', 'm'), - (0x1D649, 'M', 'n'), - (0x1D64A, 'M', 'o'), - (0x1D64B, 'M', 'p'), - (0x1D64C, 'M', 'q'), - (0x1D64D, 'M', 'r'), - (0x1D64E, 'M', 's'), - (0x1D64F, 'M', 't'), - (0x1D650, 'M', 'u'), - (0x1D651, 'M', 'v'), - (0x1D652, 'M', 'w'), - (0x1D653, 'M', 'x'), - (0x1D654, 'M', 'y'), - (0x1D655, 'M', 'z'), - (0x1D656, 'M', 'a'), - (0x1D657, 'M', 'b'), - (0x1D658, 'M', 'c'), - (0x1D659, 'M', 'd'), - (0x1D65A, 'M', 'e'), - (0x1D65B, 'M', 'f'), - (0x1D65C, 'M', 'g'), - (0x1D65D, 'M', 'h'), - (0x1D65E, 'M', 'i'), - (0x1D65F, 'M', 'j'), - (0x1D660, 'M', 'k'), - (0x1D661, 'M', 'l'), - (0x1D662, 'M', 'm'), - (0x1D663, 'M', 'n'), - (0x1D664, 'M', 'o'), - (0x1D665, 'M', 'p'), - (0x1D666, 'M', 'q'), - (0x1D667, 'M', 'r'), - (0x1D668, 'M', 's'), - (0x1D669, 'M', 't'), - (0x1D66A, 'M', 'u'), - (0x1D66B, 'M', 'v'), - (0x1D66C, 'M', 'w'), - (0x1D66D, 'M', 'x'), - (0x1D66E, 'M', 'y'), - (0x1D66F, 'M', 'z'), - (0x1D670, 'M', 'a'), - (0x1D671, 'M', 'b'), - (0x1D672, 'M', 'c'), - (0x1D673, 'M', 'd'), - (0x1D674, 'M', 'e'), - (0x1D675, 'M', 'f'), - (0x1D676, 'M', 'g'), - (0x1D677, 'M', 'h'), - (0x1D678, 'M', 'i'), - (0x1D679, 'M', 'j'), - (0x1D67A, 'M', 'k'), - (0x1D67B, 'M', 'l'), - (0x1D67C, 'M', 'm'), - (0x1D67D, 'M', 'n'), - (0x1D67E, 'M', 'o'), - (0x1D67F, 'M', 'p'), - (0x1D680, 'M', 'q'), - (0x1D681, 'M', 'r'), - (0x1D682, 'M', 's'), + (0x1D61F, "M", "x"), + (0x1D620, "M", "y"), + (0x1D621, "M", "z"), + (0x1D622, "M", "a"), + (0x1D623, "M", "b"), + (0x1D624, "M", "c"), + (0x1D625, "M", "d"), + (0x1D626, "M", "e"), + (0x1D627, "M", "f"), + (0x1D628, "M", "g"), + (0x1D629, "M", "h"), + (0x1D62A, "M", "i"), + (0x1D62B, "M", "j"), + (0x1D62C, "M", "k"), + (0x1D62D, "M", "l"), + (0x1D62E, "M", "m"), + (0x1D62F, "M", "n"), + (0x1D630, "M", "o"), + (0x1D631, "M", "p"), + (0x1D632, "M", "q"), + (0x1D633, "M", "r"), + (0x1D634, "M", "s"), + (0x1D635, "M", "t"), + (0x1D636, "M", "u"), + (0x1D637, "M", "v"), + (0x1D638, "M", "w"), + (0x1D639, "M", "x"), + (0x1D63A, "M", "y"), + (0x1D63B, "M", "z"), + (0x1D63C, "M", "a"), + (0x1D63D, "M", "b"), + (0x1D63E, "M", "c"), + (0x1D63F, "M", "d"), + (0x1D640, "M", "e"), + (0x1D641, "M", "f"), + (0x1D642, "M", "g"), + (0x1D643, "M", "h"), + (0x1D644, "M", "i"), + (0x1D645, "M", "j"), + (0x1D646, "M", "k"), + (0x1D647, "M", "l"), + (0x1D648, "M", "m"), + (0x1D649, "M", "n"), + (0x1D64A, "M", "o"), + (0x1D64B, "M", "p"), + (0x1D64C, "M", "q"), + (0x1D64D, "M", "r"), + (0x1D64E, "M", "s"), + (0x1D64F, "M", "t"), + (0x1D650, "M", "u"), + (0x1D651, "M", "v"), + (0x1D652, "M", "w"), + (0x1D653, "M", "x"), + (0x1D654, "M", "y"), + (0x1D655, "M", "z"), + (0x1D656, "M", "a"), + (0x1D657, "M", "b"), + (0x1D658, "M", "c"), + (0x1D659, "M", "d"), + (0x1D65A, "M", "e"), + (0x1D65B, "M", "f"), + (0x1D65C, "M", "g"), + (0x1D65D, "M", "h"), + (0x1D65E, "M", "i"), + (0x1D65F, "M", "j"), + (0x1D660, "M", "k"), + (0x1D661, "M", "l"), + (0x1D662, "M", "m"), + (0x1D663, "M", "n"), + (0x1D664, "M", "o"), + (0x1D665, "M", "p"), + (0x1D666, "M", "q"), + (0x1D667, "M", "r"), + (0x1D668, "M", "s"), + (0x1D669, "M", "t"), + (0x1D66A, "M", "u"), + (0x1D66B, "M", "v"), + (0x1D66C, "M", "w"), + (0x1D66D, "M", "x"), + (0x1D66E, "M", "y"), + (0x1D66F, "M", "z"), + (0x1D670, "M", "a"), + (0x1D671, "M", "b"), + (0x1D672, "M", "c"), + (0x1D673, "M", "d"), + (0x1D674, "M", "e"), + (0x1D675, "M", "f"), + (0x1D676, "M", "g"), + (0x1D677, "M", "h"), + (0x1D678, "M", "i"), + (0x1D679, "M", "j"), + (0x1D67A, "M", "k"), + (0x1D67B, "M", "l"), + (0x1D67C, "M", "m"), + (0x1D67D, "M", "n"), + (0x1D67E, "M", "o"), + (0x1D67F, "M", "p"), + (0x1D680, "M", "q"), + (0x1D681, "M", "r"), + (0x1D682, "M", "s"), ] + def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D683, 'M', 't'), - (0x1D684, 'M', 'u'), - (0x1D685, 'M', 'v'), - (0x1D686, 'M', 'w'), - (0x1D687, 'M', 'x'), - (0x1D688, 'M', 'y'), - (0x1D689, 'M', 'z'), - (0x1D68A, 'M', 'a'), - (0x1D68B, 'M', 'b'), - (0x1D68C, 'M', 'c'), - (0x1D68D, 'M', 'd'), - (0x1D68E, 'M', 'e'), - (0x1D68F, 'M', 'f'), - (0x1D690, 'M', 'g'), - (0x1D691, 'M', 'h'), - (0x1D692, 'M', 'i'), - (0x1D693, 'M', 'j'), - (0x1D694, 'M', 'k'), - (0x1D695, 'M', 'l'), - (0x1D696, 'M', 'm'), - (0x1D697, 'M', 'n'), - (0x1D698, 'M', 'o'), - (0x1D699, 'M', 'p'), - (0x1D69A, 'M', 'q'), - (0x1D69B, 'M', 'r'), - (0x1D69C, 'M', 's'), - (0x1D69D, 'M', 't'), - (0x1D69E, 'M', 'u'), - (0x1D69F, 'M', 'v'), - (0x1D6A0, 'M', 'w'), - (0x1D6A1, 'M', 'x'), - (0x1D6A2, 'M', 'y'), - (0x1D6A3, 'M', 'z'), - (0x1D6A4, 'M', 'ı'), - (0x1D6A5, 'M', 'ȷ'), - (0x1D6A6, 'X'), - (0x1D6A8, 'M', 'α'), - (0x1D6A9, 'M', 'β'), - (0x1D6AA, 'M', 'γ'), - (0x1D6AB, 'M', 'δ'), - (0x1D6AC, 'M', 'ε'), - (0x1D6AD, 'M', 'ζ'), - (0x1D6AE, 'M', 'η'), - (0x1D6AF, 'M', 'θ'), - (0x1D6B0, 'M', 'ι'), - (0x1D6B1, 'M', 'κ'), - (0x1D6B2, 'M', 'λ'), - (0x1D6B3, 'M', 'μ'), - (0x1D6B4, 'M', 'ν'), - (0x1D6B5, 'M', 'ξ'), - (0x1D6B6, 'M', 'ο'), - (0x1D6B7, 'M', 'π'), - (0x1D6B8, 'M', 'ρ'), - (0x1D6B9, 'M', 'θ'), - (0x1D6BA, 'M', 'σ'), - (0x1D6BB, 'M', 'τ'), - (0x1D6BC, 'M', 'υ'), - (0x1D6BD, 'M', 'φ'), - (0x1D6BE, 'M', 'χ'), - (0x1D6BF, 'M', 'ψ'), - (0x1D6C0, 'M', 'ω'), - (0x1D6C1, 'M', '∇'), - (0x1D6C2, 'M', 'α'), - (0x1D6C3, 'M', 'β'), - (0x1D6C4, 'M', 'γ'), - (0x1D6C5, 'M', 'δ'), - (0x1D6C6, 'M', 'ε'), - (0x1D6C7, 'M', 'ζ'), - (0x1D6C8, 'M', 'η'), - (0x1D6C9, 'M', 'θ'), - (0x1D6CA, 'M', 'ι'), - (0x1D6CB, 'M', 'κ'), - (0x1D6CC, 'M', 'λ'), - (0x1D6CD, 'M', 'μ'), - (0x1D6CE, 'M', 'ν'), - (0x1D6CF, 'M', 'ξ'), - (0x1D6D0, 'M', 'ο'), - (0x1D6D1, 'M', 'π'), - (0x1D6D2, 'M', 'ρ'), - (0x1D6D3, 'M', 'σ'), - (0x1D6D5, 'M', 'τ'), - (0x1D6D6, 'M', 'υ'), - (0x1D6D7, 'M', 'φ'), - (0x1D6D8, 'M', 'χ'), - (0x1D6D9, 'M', 'ψ'), - (0x1D6DA, 'M', 'ω'), - (0x1D6DB, 'M', '∂'), - (0x1D6DC, 'M', 'ε'), - (0x1D6DD, 'M', 'θ'), - (0x1D6DE, 'M', 'κ'), - (0x1D6DF, 'M', 'φ'), - (0x1D6E0, 'M', 'ρ'), - (0x1D6E1, 'M', 'π'), - (0x1D6E2, 'M', 'α'), - (0x1D6E3, 'M', 'β'), - (0x1D6E4, 'M', 'γ'), - (0x1D6E5, 'M', 'δ'), - (0x1D6E6, 'M', 'ε'), - (0x1D6E7, 'M', 'ζ'), - (0x1D6E8, 'M', 'η'), + (0x1D683, "M", "t"), + (0x1D684, "M", "u"), + (0x1D685, "M", "v"), + (0x1D686, "M", "w"), + (0x1D687, "M", "x"), + (0x1D688, "M", "y"), + (0x1D689, "M", "z"), + (0x1D68A, "M", "a"), + (0x1D68B, "M", "b"), + (0x1D68C, "M", "c"), + (0x1D68D, "M", "d"), + (0x1D68E, "M", "e"), + (0x1D68F, "M", "f"), + (0x1D690, "M", "g"), + (0x1D691, "M", "h"), + (0x1D692, "M", "i"), + (0x1D693, "M", "j"), + (0x1D694, "M", "k"), + (0x1D695, "M", "l"), + (0x1D696, "M", "m"), + (0x1D697, "M", "n"), + (0x1D698, "M", "o"), + (0x1D699, "M", "p"), + (0x1D69A, "M", "q"), + (0x1D69B, "M", "r"), + (0x1D69C, "M", "s"), + (0x1D69D, "M", "t"), + (0x1D69E, "M", "u"), + (0x1D69F, "M", "v"), + (0x1D6A0, "M", "w"), + (0x1D6A1, "M", "x"), + (0x1D6A2, "M", "y"), + (0x1D6A3, "M", "z"), + (0x1D6A4, "M", "ı"), + (0x1D6A5, "M", "ȷ"), + (0x1D6A6, "X"), + (0x1D6A8, "M", "α"), + (0x1D6A9, "M", "β"), + (0x1D6AA, "M", "γ"), + (0x1D6AB, "M", "δ"), + (0x1D6AC, "M", "ε"), + (0x1D6AD, "M", "ζ"), + (0x1D6AE, "M", "η"), + (0x1D6AF, "M", "θ"), + (0x1D6B0, "M", "ι"), + (0x1D6B1, "M", "κ"), + (0x1D6B2, "M", "λ"), + (0x1D6B3, "M", "μ"), + (0x1D6B4, "M", "ν"), + (0x1D6B5, "M", "ξ"), + (0x1D6B6, "M", "ο"), + (0x1D6B7, "M", "π"), + (0x1D6B8, "M", "ρ"), + (0x1D6B9, "M", "θ"), + (0x1D6BA, "M", "σ"), + (0x1D6BB, "M", "τ"), + (0x1D6BC, "M", "υ"), + (0x1D6BD, "M", "φ"), + (0x1D6BE, "M", "χ"), + (0x1D6BF, "M", "ψ"), + (0x1D6C0, "M", "ω"), + (0x1D6C1, "M", "∇"), + (0x1D6C2, "M", "α"), + (0x1D6C3, "M", "β"), + (0x1D6C4, "M", "γ"), + (0x1D6C5, "M", "δ"), + (0x1D6C6, "M", "ε"), + (0x1D6C7, "M", "ζ"), + (0x1D6C8, "M", "η"), + (0x1D6C9, "M", "θ"), + (0x1D6CA, "M", "ι"), + (0x1D6CB, "M", "κ"), + (0x1D6CC, "M", "λ"), + (0x1D6CD, "M", "μ"), + (0x1D6CE, "M", "ν"), + (0x1D6CF, "M", "ξ"), + (0x1D6D0, "M", "ο"), + (0x1D6D1, "M", "π"), + (0x1D6D2, "M", "ρ"), + (0x1D6D3, "M", "σ"), + (0x1D6D5, "M", "τ"), + (0x1D6D6, "M", "υ"), + (0x1D6D7, "M", "φ"), + (0x1D6D8, "M", "χ"), + (0x1D6D9, "M", "ψ"), + (0x1D6DA, "M", "ω"), + (0x1D6DB, "M", "∂"), + (0x1D6DC, "M", "ε"), + (0x1D6DD, "M", "θ"), + (0x1D6DE, "M", "κ"), + (0x1D6DF, "M", "φ"), + (0x1D6E0, "M", "ρ"), + (0x1D6E1, "M", "π"), + (0x1D6E2, "M", "α"), + (0x1D6E3, "M", "β"), + (0x1D6E4, "M", "γ"), + (0x1D6E5, "M", "δ"), + (0x1D6E6, "M", "ε"), + (0x1D6E7, "M", "ζ"), + (0x1D6E8, "M", "η"), ] + def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D6E9, 'M', 'θ'), - (0x1D6EA, 'M', 'ι'), - (0x1D6EB, 'M', 'κ'), - (0x1D6EC, 'M', 'λ'), - (0x1D6ED, 'M', 'μ'), - (0x1D6EE, 'M', 'ν'), - (0x1D6EF, 'M', 'ξ'), - (0x1D6F0, 'M', 'ο'), - (0x1D6F1, 'M', 'π'), - (0x1D6F2, 'M', 'ρ'), - (0x1D6F3, 'M', 'θ'), - (0x1D6F4, 'M', 'σ'), - (0x1D6F5, 'M', 'τ'), - (0x1D6F6, 'M', 'υ'), - (0x1D6F7, 'M', 'φ'), - (0x1D6F8, 'M', 'χ'), - (0x1D6F9, 'M', 'ψ'), - (0x1D6FA, 'M', 'ω'), - (0x1D6FB, 'M', '∇'), - (0x1D6FC, 'M', 'α'), - (0x1D6FD, 'M', 'β'), - (0x1D6FE, 'M', 'γ'), - (0x1D6FF, 'M', 'δ'), - (0x1D700, 'M', 'ε'), - (0x1D701, 'M', 'ζ'), - (0x1D702, 'M', 'η'), - (0x1D703, 'M', 'θ'), - (0x1D704, 'M', 'ι'), - (0x1D705, 'M', 'κ'), - (0x1D706, 'M', 'λ'), - (0x1D707, 'M', 'μ'), - (0x1D708, 'M', 'ν'), - (0x1D709, 'M', 'ξ'), - (0x1D70A, 'M', 'ο'), - (0x1D70B, 'M', 'π'), - (0x1D70C, 'M', 'ρ'), - (0x1D70D, 'M', 'σ'), - (0x1D70F, 'M', 'τ'), - (0x1D710, 'M', 'υ'), - (0x1D711, 'M', 'φ'), - (0x1D712, 'M', 'χ'), - (0x1D713, 'M', 'ψ'), - (0x1D714, 'M', 'ω'), - (0x1D715, 'M', '∂'), - (0x1D716, 'M', 'ε'), - (0x1D717, 'M', 'θ'), - (0x1D718, 'M', 'κ'), - (0x1D719, 'M', 'φ'), - (0x1D71A, 'M', 'ρ'), - (0x1D71B, 'M', 'π'), - (0x1D71C, 'M', 'α'), - (0x1D71D, 'M', 'β'), - (0x1D71E, 'M', 'γ'), - (0x1D71F, 'M', 'δ'), - (0x1D720, 'M', 'ε'), - (0x1D721, 'M', 'ζ'), - (0x1D722, 'M', 'η'), - (0x1D723, 'M', 'θ'), - (0x1D724, 'M', 'ι'), - (0x1D725, 'M', 'κ'), - (0x1D726, 'M', 'λ'), - (0x1D727, 'M', 'μ'), - (0x1D728, 'M', 'ν'), - (0x1D729, 'M', 'ξ'), - (0x1D72A, 'M', 'ο'), - (0x1D72B, 'M', 'π'), - (0x1D72C, 'M', 'ρ'), - (0x1D72D, 'M', 'θ'), - (0x1D72E, 'M', 'σ'), - (0x1D72F, 'M', 'τ'), - (0x1D730, 'M', 'υ'), - (0x1D731, 'M', 'φ'), - (0x1D732, 'M', 'χ'), - (0x1D733, 'M', 'ψ'), - (0x1D734, 'M', 'ω'), - (0x1D735, 'M', '∇'), - (0x1D736, 'M', 'α'), - (0x1D737, 'M', 'β'), - (0x1D738, 'M', 'γ'), - (0x1D739, 'M', 'δ'), - (0x1D73A, 'M', 'ε'), - (0x1D73B, 'M', 'ζ'), - (0x1D73C, 'M', 'η'), - (0x1D73D, 'M', 'θ'), - (0x1D73E, 'M', 'ι'), - (0x1D73F, 'M', 'κ'), - (0x1D740, 'M', 'λ'), - (0x1D741, 'M', 'μ'), - (0x1D742, 'M', 'ν'), - (0x1D743, 'M', 'ξ'), - (0x1D744, 'M', 'ο'), - (0x1D745, 'M', 'π'), - (0x1D746, 'M', 'ρ'), - (0x1D747, 'M', 'σ'), - (0x1D749, 'M', 'τ'), - (0x1D74A, 'M', 'υ'), - (0x1D74B, 'M', 'φ'), - (0x1D74C, 'M', 'χ'), - (0x1D74D, 'M', 'ψ'), - (0x1D74E, 'M', 'ω'), + (0x1D6E9, "M", "θ"), + (0x1D6EA, "M", "ι"), + (0x1D6EB, "M", "κ"), + (0x1D6EC, "M", "λ"), + (0x1D6ED, "M", "μ"), + (0x1D6EE, "M", "ν"), + (0x1D6EF, "M", "ξ"), + (0x1D6F0, "M", "ο"), + (0x1D6F1, "M", "π"), + (0x1D6F2, "M", "ρ"), + (0x1D6F3, "M", "θ"), + (0x1D6F4, "M", "σ"), + (0x1D6F5, "M", "τ"), + (0x1D6F6, "M", "υ"), + (0x1D6F7, "M", "φ"), + (0x1D6F8, "M", "χ"), + (0x1D6F9, "M", "ψ"), + (0x1D6FA, "M", "ω"), + (0x1D6FB, "M", "∇"), + (0x1D6FC, "M", "α"), + (0x1D6FD, "M", "β"), + (0x1D6FE, "M", "γ"), + (0x1D6FF, "M", "δ"), + (0x1D700, "M", "ε"), + (0x1D701, "M", "ζ"), + (0x1D702, "M", "η"), + (0x1D703, "M", "θ"), + (0x1D704, "M", "ι"), + (0x1D705, "M", "κ"), + (0x1D706, "M", "λ"), + (0x1D707, "M", "μ"), + (0x1D708, "M", "ν"), + (0x1D709, "M", "ξ"), + (0x1D70A, "M", "ο"), + (0x1D70B, "M", "π"), + (0x1D70C, "M", "ρ"), + (0x1D70D, "M", "σ"), + (0x1D70F, "M", "τ"), + (0x1D710, "M", "υ"), + (0x1D711, "M", "φ"), + (0x1D712, "M", "χ"), + (0x1D713, "M", "ψ"), + (0x1D714, "M", "ω"), + (0x1D715, "M", "∂"), + (0x1D716, "M", "ε"), + (0x1D717, "M", "θ"), + (0x1D718, "M", "κ"), + (0x1D719, "M", "φ"), + (0x1D71A, "M", "ρ"), + (0x1D71B, "M", "π"), + (0x1D71C, "M", "α"), + (0x1D71D, "M", "β"), + (0x1D71E, "M", "γ"), + (0x1D71F, "M", "δ"), + (0x1D720, "M", "ε"), + (0x1D721, "M", "ζ"), + (0x1D722, "M", "η"), + (0x1D723, "M", "θ"), + (0x1D724, "M", "ι"), + (0x1D725, "M", "κ"), + (0x1D726, "M", "λ"), + (0x1D727, "M", "μ"), + (0x1D728, "M", "ν"), + (0x1D729, "M", "ξ"), + (0x1D72A, "M", "ο"), + (0x1D72B, "M", "π"), + (0x1D72C, "M", "ρ"), + (0x1D72D, "M", "θ"), + (0x1D72E, "M", "σ"), + (0x1D72F, "M", "τ"), + (0x1D730, "M", "υ"), + (0x1D731, "M", "φ"), + (0x1D732, "M", "χ"), + (0x1D733, "M", "ψ"), + (0x1D734, "M", "ω"), + (0x1D735, "M", "∇"), + (0x1D736, "M", "α"), + (0x1D737, "M", "β"), + (0x1D738, "M", "γ"), + (0x1D739, "M", "δ"), + (0x1D73A, "M", "ε"), + (0x1D73B, "M", "ζ"), + (0x1D73C, "M", "η"), + (0x1D73D, "M", "θ"), + (0x1D73E, "M", "ι"), + (0x1D73F, "M", "κ"), + (0x1D740, "M", "λ"), + (0x1D741, "M", "μ"), + (0x1D742, "M", "ν"), + (0x1D743, "M", "ξ"), + (0x1D744, "M", "ο"), + (0x1D745, "M", "π"), + (0x1D746, "M", "ρ"), + (0x1D747, "M", "σ"), + (0x1D749, "M", "τ"), + (0x1D74A, "M", "υ"), + (0x1D74B, "M", "φ"), + (0x1D74C, "M", "χ"), + (0x1D74D, "M", "ψ"), + (0x1D74E, "M", "ω"), ] + def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D74F, 'M', '∂'), - (0x1D750, 'M', 'ε'), - (0x1D751, 'M', 'θ'), - (0x1D752, 'M', 'κ'), - (0x1D753, 'M', 'φ'), - (0x1D754, 'M', 'ρ'), - (0x1D755, 'M', 'π'), - (0x1D756, 'M', 'α'), - (0x1D757, 'M', 'β'), - (0x1D758, 'M', 'γ'), - (0x1D759, 'M', 'δ'), - (0x1D75A, 'M', 'ε'), - (0x1D75B, 'M', 'ζ'), - (0x1D75C, 'M', 'η'), - (0x1D75D, 'M', 'θ'), - (0x1D75E, 'M', 'ι'), - (0x1D75F, 'M', 'κ'), - (0x1D760, 'M', 'λ'), - (0x1D761, 'M', 'μ'), - (0x1D762, 'M', 'ν'), - (0x1D763, 'M', 'ξ'), - (0x1D764, 'M', 'ο'), - (0x1D765, 'M', 'π'), - (0x1D766, 'M', 'ρ'), - (0x1D767, 'M', 'θ'), - (0x1D768, 'M', 'σ'), - (0x1D769, 'M', 'τ'), - (0x1D76A, 'M', 'υ'), - (0x1D76B, 'M', 'φ'), - (0x1D76C, 'M', 'χ'), - (0x1D76D, 'M', 'ψ'), - (0x1D76E, 'M', 'ω'), - (0x1D76F, 'M', '∇'), - (0x1D770, 'M', 'α'), - (0x1D771, 'M', 'β'), - (0x1D772, 'M', 'γ'), - (0x1D773, 'M', 'δ'), - (0x1D774, 'M', 'ε'), - (0x1D775, 'M', 'ζ'), - (0x1D776, 'M', 'η'), - (0x1D777, 'M', 'θ'), - (0x1D778, 'M', 'ι'), - (0x1D779, 'M', 'κ'), - (0x1D77A, 'M', 'λ'), - (0x1D77B, 'M', 'μ'), - (0x1D77C, 'M', 'ν'), - (0x1D77D, 'M', 'ξ'), - (0x1D77E, 'M', 'ο'), - (0x1D77F, 'M', 'π'), - (0x1D780, 'M', 'ρ'), - (0x1D781, 'M', 'σ'), - (0x1D783, 'M', 'τ'), - (0x1D784, 'M', 'υ'), - (0x1D785, 'M', 'φ'), - (0x1D786, 'M', 'χ'), - (0x1D787, 'M', 'ψ'), - (0x1D788, 'M', 'ω'), - (0x1D789, 'M', '∂'), - (0x1D78A, 'M', 'ε'), - (0x1D78B, 'M', 'θ'), - (0x1D78C, 'M', 'κ'), - (0x1D78D, 'M', 'φ'), - (0x1D78E, 'M', 'ρ'), - (0x1D78F, 'M', 'π'), - (0x1D790, 'M', 'α'), - (0x1D791, 'M', 'β'), - (0x1D792, 'M', 'γ'), - (0x1D793, 'M', 'δ'), - (0x1D794, 'M', 'ε'), - (0x1D795, 'M', 'ζ'), - (0x1D796, 'M', 'η'), - (0x1D797, 'M', 'θ'), - (0x1D798, 'M', 'ι'), - (0x1D799, 'M', 'κ'), - (0x1D79A, 'M', 'λ'), - (0x1D79B, 'M', 'μ'), - (0x1D79C, 'M', 'ν'), - (0x1D79D, 'M', 'ξ'), - (0x1D79E, 'M', 'ο'), - (0x1D79F, 'M', 'π'), - (0x1D7A0, 'M', 'ρ'), - (0x1D7A1, 'M', 'θ'), - (0x1D7A2, 'M', 'σ'), - (0x1D7A3, 'M', 'τ'), - (0x1D7A4, 'M', 'υ'), - (0x1D7A5, 'M', 'φ'), - (0x1D7A6, 'M', 'χ'), - (0x1D7A7, 'M', 'ψ'), - (0x1D7A8, 'M', 'ω'), - (0x1D7A9, 'M', '∇'), - (0x1D7AA, 'M', 'α'), - (0x1D7AB, 'M', 'β'), - (0x1D7AC, 'M', 'γ'), - (0x1D7AD, 'M', 'δ'), - (0x1D7AE, 'M', 'ε'), - (0x1D7AF, 'M', 'ζ'), - (0x1D7B0, 'M', 'η'), - (0x1D7B1, 'M', 'θ'), - (0x1D7B2, 'M', 'ι'), - (0x1D7B3, 'M', 'κ'), + (0x1D74F, "M", "∂"), + (0x1D750, "M", "ε"), + (0x1D751, "M", "θ"), + (0x1D752, "M", "κ"), + (0x1D753, "M", "φ"), + (0x1D754, "M", "ρ"), + (0x1D755, "M", "π"), + (0x1D756, "M", "α"), + (0x1D757, "M", "β"), + (0x1D758, "M", "γ"), + (0x1D759, "M", "δ"), + (0x1D75A, "M", "ε"), + (0x1D75B, "M", "ζ"), + (0x1D75C, "M", "η"), + (0x1D75D, "M", "θ"), + (0x1D75E, "M", "ι"), + (0x1D75F, "M", "κ"), + (0x1D760, "M", "λ"), + (0x1D761, "M", "μ"), + (0x1D762, "M", "ν"), + (0x1D763, "M", "ξ"), + (0x1D764, "M", "ο"), + (0x1D765, "M", "π"), + (0x1D766, "M", "ρ"), + (0x1D767, "M", "θ"), + (0x1D768, "M", "σ"), + (0x1D769, "M", "τ"), + (0x1D76A, "M", "υ"), + (0x1D76B, "M", "φ"), + (0x1D76C, "M", "χ"), + (0x1D76D, "M", "ψ"), + (0x1D76E, "M", "ω"), + (0x1D76F, "M", "∇"), + (0x1D770, "M", "α"), + (0x1D771, "M", "β"), + (0x1D772, "M", "γ"), + (0x1D773, "M", "δ"), + (0x1D774, "M", "ε"), + (0x1D775, "M", "ζ"), + (0x1D776, "M", "η"), + (0x1D777, "M", "θ"), + (0x1D778, "M", "ι"), + (0x1D779, "M", "κ"), + (0x1D77A, "M", "λ"), + (0x1D77B, "M", "μ"), + (0x1D77C, "M", "ν"), + (0x1D77D, "M", "ξ"), + (0x1D77E, "M", "ο"), + (0x1D77F, "M", "π"), + (0x1D780, "M", "ρ"), + (0x1D781, "M", "σ"), + (0x1D783, "M", "τ"), + (0x1D784, "M", "υ"), + (0x1D785, "M", "φ"), + (0x1D786, "M", "χ"), + (0x1D787, "M", "ψ"), + (0x1D788, "M", "ω"), + (0x1D789, "M", "∂"), + (0x1D78A, "M", "ε"), + (0x1D78B, "M", "θ"), + (0x1D78C, "M", "κ"), + (0x1D78D, "M", "φ"), + (0x1D78E, "M", "ρ"), + (0x1D78F, "M", "π"), + (0x1D790, "M", "α"), + (0x1D791, "M", "β"), + (0x1D792, "M", "γ"), + (0x1D793, "M", "δ"), + (0x1D794, "M", "ε"), + (0x1D795, "M", "ζ"), + (0x1D796, "M", "η"), + (0x1D797, "M", "θ"), + (0x1D798, "M", "ι"), + (0x1D799, "M", "κ"), + (0x1D79A, "M", "λ"), + (0x1D79B, "M", "μ"), + (0x1D79C, "M", "ν"), + (0x1D79D, "M", "ξ"), + (0x1D79E, "M", "ο"), + (0x1D79F, "M", "π"), + (0x1D7A0, "M", "ρ"), + (0x1D7A1, "M", "θ"), + (0x1D7A2, "M", "σ"), + (0x1D7A3, "M", "τ"), + (0x1D7A4, "M", "υ"), + (0x1D7A5, "M", "φ"), + (0x1D7A6, "M", "χ"), + (0x1D7A7, "M", "ψ"), + (0x1D7A8, "M", "ω"), + (0x1D7A9, "M", "∇"), + (0x1D7AA, "M", "α"), + (0x1D7AB, "M", "β"), + (0x1D7AC, "M", "γ"), + (0x1D7AD, "M", "δ"), + (0x1D7AE, "M", "ε"), + (0x1D7AF, "M", "ζ"), + (0x1D7B0, "M", "η"), + (0x1D7B1, "M", "θ"), + (0x1D7B2, "M", "ι"), + (0x1D7B3, "M", "κ"), ] + def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1D7B4, 'M', 'λ'), - (0x1D7B5, 'M', 'μ'), - (0x1D7B6, 'M', 'ν'), - (0x1D7B7, 'M', 'ξ'), - (0x1D7B8, 'M', 'ο'), - (0x1D7B9, 'M', 'π'), - (0x1D7BA, 'M', 'ρ'), - (0x1D7BB, 'M', 'σ'), - (0x1D7BD, 'M', 'τ'), - (0x1D7BE, 'M', 'υ'), - (0x1D7BF, 'M', 'φ'), - (0x1D7C0, 'M', 'χ'), - (0x1D7C1, 'M', 'ψ'), - (0x1D7C2, 'M', 'ω'), - (0x1D7C3, 'M', '∂'), - (0x1D7C4, 'M', 'ε'), - (0x1D7C5, 'M', 'θ'), - (0x1D7C6, 'M', 'κ'), - (0x1D7C7, 'M', 'φ'), - (0x1D7C8, 'M', 'ρ'), - (0x1D7C9, 'M', 'π'), - (0x1D7CA, 'M', 'ϝ'), - (0x1D7CC, 'X'), - (0x1D7CE, 'M', '0'), - (0x1D7CF, 'M', '1'), - (0x1D7D0, 'M', '2'), - (0x1D7D1, 'M', '3'), - (0x1D7D2, 'M', '4'), - (0x1D7D3, 'M', '5'), - (0x1D7D4, 'M', '6'), - (0x1D7D5, 'M', '7'), - (0x1D7D6, 'M', '8'), - (0x1D7D7, 'M', '9'), - (0x1D7D8, 'M', '0'), - (0x1D7D9, 'M', '1'), - (0x1D7DA, 'M', '2'), - (0x1D7DB, 'M', '3'), - (0x1D7DC, 'M', '4'), - (0x1D7DD, 'M', '5'), - (0x1D7DE, 'M', '6'), - (0x1D7DF, 'M', '7'), - (0x1D7E0, 'M', '8'), - (0x1D7E1, 'M', '9'), - (0x1D7E2, 'M', '0'), - (0x1D7E3, 'M', '1'), - (0x1D7E4, 'M', '2'), - (0x1D7E5, 'M', '3'), - (0x1D7E6, 'M', '4'), - (0x1D7E7, 'M', '5'), - (0x1D7E8, 'M', '6'), - (0x1D7E9, 'M', '7'), - (0x1D7EA, 'M', '8'), - (0x1D7EB, 'M', '9'), - (0x1D7EC, 'M', '0'), - (0x1D7ED, 'M', '1'), - (0x1D7EE, 'M', '2'), - (0x1D7EF, 'M', '3'), - (0x1D7F0, 'M', '4'), - (0x1D7F1, 'M', '5'), - (0x1D7F2, 'M', '6'), - (0x1D7F3, 'M', '7'), - (0x1D7F4, 'M', '8'), - (0x1D7F5, 'M', '9'), - (0x1D7F6, 'M', '0'), - (0x1D7F7, 'M', '1'), - (0x1D7F8, 'M', '2'), - (0x1D7F9, 'M', '3'), - (0x1D7FA, 'M', '4'), - (0x1D7FB, 'M', '5'), - (0x1D7FC, 'M', '6'), - (0x1D7FD, 'M', '7'), - (0x1D7FE, 'M', '8'), - (0x1D7FF, 'M', '9'), - (0x1D800, 'V'), - (0x1DA8C, 'X'), - (0x1DA9B, 'V'), - (0x1DAA0, 'X'), - (0x1DAA1, 'V'), - (0x1DAB0, 'X'), - (0x1DF00, 'V'), - (0x1DF1F, 'X'), - (0x1DF25, 'V'), - (0x1DF2B, 'X'), - (0x1E000, 'V'), - (0x1E007, 'X'), - (0x1E008, 'V'), - (0x1E019, 'X'), - (0x1E01B, 'V'), - (0x1E022, 'X'), - (0x1E023, 'V'), - (0x1E025, 'X'), - (0x1E026, 'V'), - (0x1E02B, 'X'), - (0x1E030, 'M', 'а'), - (0x1E031, 'M', 'б'), - (0x1E032, 'M', 'в'), - (0x1E033, 'M', 'г'), - (0x1E034, 'M', 'д'), - (0x1E035, 'M', 'е'), - (0x1E036, 'M', 'ж'), + (0x1D7B4, "M", "λ"), + (0x1D7B5, "M", "μ"), + (0x1D7B6, "M", "ν"), + (0x1D7B7, "M", "ξ"), + (0x1D7B8, "M", "ο"), + (0x1D7B9, "M", "π"), + (0x1D7BA, "M", "ρ"), + (0x1D7BB, "M", "σ"), + (0x1D7BD, "M", "τ"), + (0x1D7BE, "M", "υ"), + (0x1D7BF, "M", "φ"), + (0x1D7C0, "M", "χ"), + (0x1D7C1, "M", "ψ"), + (0x1D7C2, "M", "ω"), + (0x1D7C3, "M", "∂"), + (0x1D7C4, "M", "ε"), + (0x1D7C5, "M", "θ"), + (0x1D7C6, "M", "κ"), + (0x1D7C7, "M", "φ"), + (0x1D7C8, "M", "ρ"), + (0x1D7C9, "M", "π"), + (0x1D7CA, "M", "ϝ"), + (0x1D7CC, "X"), + (0x1D7CE, "M", "0"), + (0x1D7CF, "M", "1"), + (0x1D7D0, "M", "2"), + (0x1D7D1, "M", "3"), + (0x1D7D2, "M", "4"), + (0x1D7D3, "M", "5"), + (0x1D7D4, "M", "6"), + (0x1D7D5, "M", "7"), + (0x1D7D6, "M", "8"), + (0x1D7D7, "M", "9"), + (0x1D7D8, "M", "0"), + (0x1D7D9, "M", "1"), + (0x1D7DA, "M", "2"), + (0x1D7DB, "M", "3"), + (0x1D7DC, "M", "4"), + (0x1D7DD, "M", "5"), + (0x1D7DE, "M", "6"), + (0x1D7DF, "M", "7"), + (0x1D7E0, "M", "8"), + (0x1D7E1, "M", "9"), + (0x1D7E2, "M", "0"), + (0x1D7E3, "M", "1"), + (0x1D7E4, "M", "2"), + (0x1D7E5, "M", "3"), + (0x1D7E6, "M", "4"), + (0x1D7E7, "M", "5"), + (0x1D7E8, "M", "6"), + (0x1D7E9, "M", "7"), + (0x1D7EA, "M", "8"), + (0x1D7EB, "M", "9"), + (0x1D7EC, "M", "0"), + (0x1D7ED, "M", "1"), + (0x1D7EE, "M", "2"), + (0x1D7EF, "M", "3"), + (0x1D7F0, "M", "4"), + (0x1D7F1, "M", "5"), + (0x1D7F2, "M", "6"), + (0x1D7F3, "M", "7"), + (0x1D7F4, "M", "8"), + (0x1D7F5, "M", "9"), + (0x1D7F6, "M", "0"), + (0x1D7F7, "M", "1"), + (0x1D7F8, "M", "2"), + (0x1D7F9, "M", "3"), + (0x1D7FA, "M", "4"), + (0x1D7FB, "M", "5"), + (0x1D7FC, "M", "6"), + (0x1D7FD, "M", "7"), + (0x1D7FE, "M", "8"), + (0x1D7FF, "M", "9"), + (0x1D800, "V"), + (0x1DA8C, "X"), + (0x1DA9B, "V"), + (0x1DAA0, "X"), + (0x1DAA1, "V"), + (0x1DAB0, "X"), + (0x1DF00, "V"), + (0x1DF1F, "X"), + (0x1DF25, "V"), + (0x1DF2B, "X"), + (0x1E000, "V"), + (0x1E007, "X"), + (0x1E008, "V"), + (0x1E019, "X"), + (0x1E01B, "V"), + (0x1E022, "X"), + (0x1E023, "V"), + (0x1E025, "X"), + (0x1E026, "V"), + (0x1E02B, "X"), + (0x1E030, "M", "а"), + (0x1E031, "M", "б"), + (0x1E032, "M", "в"), + (0x1E033, "M", "г"), + (0x1E034, "M", "д"), + (0x1E035, "M", "е"), + (0x1E036, "M", "ж"), ] + def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1E037, 'M', 'з'), - (0x1E038, 'M', 'и'), - (0x1E039, 'M', 'к'), - (0x1E03A, 'M', 'л'), - (0x1E03B, 'M', 'м'), - (0x1E03C, 'M', 'о'), - (0x1E03D, 'M', 'п'), - (0x1E03E, 'M', 'р'), - (0x1E03F, 'M', 'с'), - (0x1E040, 'M', 'т'), - (0x1E041, 'M', 'у'), - (0x1E042, 'M', 'ф'), - (0x1E043, 'M', 'х'), - (0x1E044, 'M', 'ц'), - (0x1E045, 'M', 'ч'), - (0x1E046, 'M', 'ш'), - (0x1E047, 'M', 'ы'), - (0x1E048, 'M', 'э'), - (0x1E049, 'M', 'ю'), - (0x1E04A, 'M', 'ꚉ'), - (0x1E04B, 'M', 'ә'), - (0x1E04C, 'M', 'і'), - (0x1E04D, 'M', 'ј'), - (0x1E04E, 'M', 'ө'), - (0x1E04F, 'M', 'ү'), - (0x1E050, 'M', 'ӏ'), - (0x1E051, 'M', 'а'), - (0x1E052, 'M', 'б'), - (0x1E053, 'M', 'в'), - (0x1E054, 'M', 'г'), - (0x1E055, 'M', 'д'), - (0x1E056, 'M', 'е'), - (0x1E057, 'M', 'ж'), - (0x1E058, 'M', 'з'), - (0x1E059, 'M', 'и'), - (0x1E05A, 'M', 'к'), - (0x1E05B, 'M', 'л'), - (0x1E05C, 'M', 'о'), - (0x1E05D, 'M', 'п'), - (0x1E05E, 'M', 'с'), - (0x1E05F, 'M', 'у'), - (0x1E060, 'M', 'ф'), - (0x1E061, 'M', 'х'), - (0x1E062, 'M', 'ц'), - (0x1E063, 'M', 'ч'), - (0x1E064, 'M', 'ш'), - (0x1E065, 'M', 'ъ'), - (0x1E066, 'M', 'ы'), - (0x1E067, 'M', 'ґ'), - (0x1E068, 'M', 'і'), - (0x1E069, 'M', 'ѕ'), - (0x1E06A, 'M', 'џ'), - (0x1E06B, 'M', 'ҫ'), - (0x1E06C, 'M', 'ꙑ'), - (0x1E06D, 'M', 'ұ'), - (0x1E06E, 'X'), - (0x1E08F, 'V'), - (0x1E090, 'X'), - (0x1E100, 'V'), - (0x1E12D, 'X'), - (0x1E130, 'V'), - (0x1E13E, 'X'), - (0x1E140, 'V'), - (0x1E14A, 'X'), - (0x1E14E, 'V'), - (0x1E150, 'X'), - (0x1E290, 'V'), - (0x1E2AF, 'X'), - (0x1E2C0, 'V'), - (0x1E2FA, 'X'), - (0x1E2FF, 'V'), - (0x1E300, 'X'), - (0x1E4D0, 'V'), - (0x1E4FA, 'X'), - (0x1E7E0, 'V'), - (0x1E7E7, 'X'), - (0x1E7E8, 'V'), - (0x1E7EC, 'X'), - (0x1E7ED, 'V'), - (0x1E7EF, 'X'), - (0x1E7F0, 'V'), - (0x1E7FF, 'X'), - (0x1E800, 'V'), - (0x1E8C5, 'X'), - (0x1E8C7, 'V'), - (0x1E8D7, 'X'), - (0x1E900, 'M', '𞤢'), - (0x1E901, 'M', '𞤣'), - (0x1E902, 'M', '𞤤'), - (0x1E903, 'M', '𞤥'), - (0x1E904, 'M', '𞤦'), - (0x1E905, 'M', '𞤧'), - (0x1E906, 'M', '𞤨'), - (0x1E907, 'M', '𞤩'), - (0x1E908, 'M', '𞤪'), - (0x1E909, 'M', '𞤫'), - (0x1E90A, 'M', '𞤬'), - (0x1E90B, 'M', '𞤭'), - (0x1E90C, 'M', '𞤮'), - (0x1E90D, 'M', '𞤯'), + (0x1E037, "M", "з"), + (0x1E038, "M", "и"), + (0x1E039, "M", "к"), + (0x1E03A, "M", "л"), + (0x1E03B, "M", "м"), + (0x1E03C, "M", "о"), + (0x1E03D, "M", "п"), + (0x1E03E, "M", "р"), + (0x1E03F, "M", "с"), + (0x1E040, "M", "т"), + (0x1E041, "M", "у"), + (0x1E042, "M", "ф"), + (0x1E043, "M", "х"), + (0x1E044, "M", "ц"), + (0x1E045, "M", "ч"), + (0x1E046, "M", "ш"), + (0x1E047, "M", "ы"), + (0x1E048, "M", "э"), + (0x1E049, "M", "ю"), + (0x1E04A, "M", "ꚉ"), + (0x1E04B, "M", "ә"), + (0x1E04C, "M", "і"), + (0x1E04D, "M", "ј"), + (0x1E04E, "M", "ө"), + (0x1E04F, "M", "ү"), + (0x1E050, "M", "ӏ"), + (0x1E051, "M", "а"), + (0x1E052, "M", "б"), + (0x1E053, "M", "в"), + (0x1E054, "M", "г"), + (0x1E055, "M", "д"), + (0x1E056, "M", "е"), + (0x1E057, "M", "ж"), + (0x1E058, "M", "з"), + (0x1E059, "M", "и"), + (0x1E05A, "M", "к"), + (0x1E05B, "M", "л"), + (0x1E05C, "M", "о"), + (0x1E05D, "M", "п"), + (0x1E05E, "M", "с"), + (0x1E05F, "M", "у"), + (0x1E060, "M", "ф"), + (0x1E061, "M", "х"), + (0x1E062, "M", "ц"), + (0x1E063, "M", "ч"), + (0x1E064, "M", "ш"), + (0x1E065, "M", "ъ"), + (0x1E066, "M", "ы"), + (0x1E067, "M", "ґ"), + (0x1E068, "M", "і"), + (0x1E069, "M", "ѕ"), + (0x1E06A, "M", "џ"), + (0x1E06B, "M", "ҫ"), + (0x1E06C, "M", "ꙑ"), + (0x1E06D, "M", "ұ"), + (0x1E06E, "X"), + (0x1E08F, "V"), + (0x1E090, "X"), + (0x1E100, "V"), + (0x1E12D, "X"), + (0x1E130, "V"), + (0x1E13E, "X"), + (0x1E140, "V"), + (0x1E14A, "X"), + (0x1E14E, "V"), + (0x1E150, "X"), + (0x1E290, "V"), + (0x1E2AF, "X"), + (0x1E2C0, "V"), + (0x1E2FA, "X"), + (0x1E2FF, "V"), + (0x1E300, "X"), + (0x1E4D0, "V"), + (0x1E4FA, "X"), + (0x1E7E0, "V"), + (0x1E7E7, "X"), + (0x1E7E8, "V"), + (0x1E7EC, "X"), + (0x1E7ED, "V"), + (0x1E7EF, "X"), + (0x1E7F0, "V"), + (0x1E7FF, "X"), + (0x1E800, "V"), + (0x1E8C5, "X"), + (0x1E8C7, "V"), + (0x1E8D7, "X"), + (0x1E900, "M", "𞤢"), + (0x1E901, "M", "𞤣"), + (0x1E902, "M", "𞤤"), + (0x1E903, "M", "𞤥"), + (0x1E904, "M", "𞤦"), + (0x1E905, "M", "𞤧"), + (0x1E906, "M", "𞤨"), + (0x1E907, "M", "𞤩"), + (0x1E908, "M", "𞤪"), + (0x1E909, "M", "𞤫"), + (0x1E90A, "M", "𞤬"), + (0x1E90B, "M", "𞤭"), + (0x1E90C, "M", "𞤮"), + (0x1E90D, "M", "𞤯"), ] + def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1E90E, 'M', '𞤰'), - (0x1E90F, 'M', '𞤱'), - (0x1E910, 'M', '𞤲'), - (0x1E911, 'M', '𞤳'), - (0x1E912, 'M', '𞤴'), - (0x1E913, 'M', '𞤵'), - (0x1E914, 'M', '𞤶'), - (0x1E915, 'M', '𞤷'), - (0x1E916, 'M', '𞤸'), - (0x1E917, 'M', '𞤹'), - (0x1E918, 'M', '𞤺'), - (0x1E919, 'M', '𞤻'), - (0x1E91A, 'M', '𞤼'), - (0x1E91B, 'M', '𞤽'), - (0x1E91C, 'M', '𞤾'), - (0x1E91D, 'M', '𞤿'), - (0x1E91E, 'M', '𞥀'), - (0x1E91F, 'M', '𞥁'), - (0x1E920, 'M', '𞥂'), - (0x1E921, 'M', '𞥃'), - (0x1E922, 'V'), - (0x1E94C, 'X'), - (0x1E950, 'V'), - (0x1E95A, 'X'), - (0x1E95E, 'V'), - (0x1E960, 'X'), - (0x1EC71, 'V'), - (0x1ECB5, 'X'), - (0x1ED01, 'V'), - (0x1ED3E, 'X'), - (0x1EE00, 'M', 'ا'), - (0x1EE01, 'M', 'ب'), - (0x1EE02, 'M', 'ج'), - (0x1EE03, 'M', 'د'), - (0x1EE04, 'X'), - (0x1EE05, 'M', 'و'), - (0x1EE06, 'M', 'ز'), - (0x1EE07, 'M', 'ح'), - (0x1EE08, 'M', 'ط'), - (0x1EE09, 'M', 'ي'), - (0x1EE0A, 'M', 'ك'), - (0x1EE0B, 'M', 'ل'), - (0x1EE0C, 'M', 'م'), - (0x1EE0D, 'M', 'ن'), - (0x1EE0E, 'M', 'س'), - (0x1EE0F, 'M', 'ع'), - (0x1EE10, 'M', 'ف'), - (0x1EE11, 'M', 'ص'), - (0x1EE12, 'M', 'ق'), - (0x1EE13, 'M', 'ر'), - (0x1EE14, 'M', 'ش'), - (0x1EE15, 'M', 'ت'), - (0x1EE16, 'M', 'ث'), - (0x1EE17, 'M', 'خ'), - (0x1EE18, 'M', 'ذ'), - (0x1EE19, 'M', 'ض'), - (0x1EE1A, 'M', 'ظ'), - (0x1EE1B, 'M', 'غ'), - (0x1EE1C, 'M', 'ٮ'), - (0x1EE1D, 'M', 'ں'), - (0x1EE1E, 'M', 'ڡ'), - (0x1EE1F, 'M', 'ٯ'), - (0x1EE20, 'X'), - (0x1EE21, 'M', 'ب'), - (0x1EE22, 'M', 'ج'), - (0x1EE23, 'X'), - (0x1EE24, 'M', 'ه'), - (0x1EE25, 'X'), - (0x1EE27, 'M', 'ح'), - (0x1EE28, 'X'), - (0x1EE29, 'M', 'ي'), - (0x1EE2A, 'M', 'ك'), - (0x1EE2B, 'M', 'ل'), - (0x1EE2C, 'M', 'م'), - (0x1EE2D, 'M', 'ن'), - (0x1EE2E, 'M', 'س'), - (0x1EE2F, 'M', 'ع'), - (0x1EE30, 'M', 'ف'), - (0x1EE31, 'M', 'ص'), - (0x1EE32, 'M', 'ق'), - (0x1EE33, 'X'), - (0x1EE34, 'M', 'ش'), - (0x1EE35, 'M', 'ت'), - (0x1EE36, 'M', 'ث'), - (0x1EE37, 'M', 'خ'), - (0x1EE38, 'X'), - (0x1EE39, 'M', 'ض'), - (0x1EE3A, 'X'), - (0x1EE3B, 'M', 'غ'), - (0x1EE3C, 'X'), - (0x1EE42, 'M', 'ج'), - (0x1EE43, 'X'), - (0x1EE47, 'M', 'ح'), - (0x1EE48, 'X'), - (0x1EE49, 'M', 'ي'), - (0x1EE4A, 'X'), - (0x1EE4B, 'M', 'ل'), - (0x1EE4C, 'X'), - (0x1EE4D, 'M', 'ن'), - (0x1EE4E, 'M', 'س'), + (0x1E90E, "M", "𞤰"), + (0x1E90F, "M", "𞤱"), + (0x1E910, "M", "𞤲"), + (0x1E911, "M", "𞤳"), + (0x1E912, "M", "𞤴"), + (0x1E913, "M", "𞤵"), + (0x1E914, "M", "𞤶"), + (0x1E915, "M", "𞤷"), + (0x1E916, "M", "𞤸"), + (0x1E917, "M", "𞤹"), + (0x1E918, "M", "𞤺"), + (0x1E919, "M", "𞤻"), + (0x1E91A, "M", "𞤼"), + (0x1E91B, "M", "𞤽"), + (0x1E91C, "M", "𞤾"), + (0x1E91D, "M", "𞤿"), + (0x1E91E, "M", "𞥀"), + (0x1E91F, "M", "𞥁"), + (0x1E920, "M", "𞥂"), + (0x1E921, "M", "𞥃"), + (0x1E922, "V"), + (0x1E94C, "X"), + (0x1E950, "V"), + (0x1E95A, "X"), + (0x1E95E, "V"), + (0x1E960, "X"), + (0x1EC71, "V"), + (0x1ECB5, "X"), + (0x1ED01, "V"), + (0x1ED3E, "X"), + (0x1EE00, "M", "ا"), + (0x1EE01, "M", "ب"), + (0x1EE02, "M", "ج"), + (0x1EE03, "M", "د"), + (0x1EE04, "X"), + (0x1EE05, "M", "و"), + (0x1EE06, "M", "ز"), + (0x1EE07, "M", "ح"), + (0x1EE08, "M", "ط"), + (0x1EE09, "M", "ي"), + (0x1EE0A, "M", "ك"), + (0x1EE0B, "M", "ل"), + (0x1EE0C, "M", "م"), + (0x1EE0D, "M", "ن"), + (0x1EE0E, "M", "س"), + (0x1EE0F, "M", "ع"), + (0x1EE10, "M", "ف"), + (0x1EE11, "M", "ص"), + (0x1EE12, "M", "ق"), + (0x1EE13, "M", "ر"), + (0x1EE14, "M", "ش"), + (0x1EE15, "M", "ت"), + (0x1EE16, "M", "ث"), + (0x1EE17, "M", "خ"), + (0x1EE18, "M", "ذ"), + (0x1EE19, "M", "ض"), + (0x1EE1A, "M", "ظ"), + (0x1EE1B, "M", "غ"), + (0x1EE1C, "M", "ٮ"), + (0x1EE1D, "M", "ں"), + (0x1EE1E, "M", "ڡ"), + (0x1EE1F, "M", "ٯ"), + (0x1EE20, "X"), + (0x1EE21, "M", "ب"), + (0x1EE22, "M", "ج"), + (0x1EE23, "X"), + (0x1EE24, "M", "ه"), + (0x1EE25, "X"), + (0x1EE27, "M", "ح"), + (0x1EE28, "X"), + (0x1EE29, "M", "ي"), + (0x1EE2A, "M", "ك"), + (0x1EE2B, "M", "ل"), + (0x1EE2C, "M", "م"), + (0x1EE2D, "M", "ن"), + (0x1EE2E, "M", "س"), + (0x1EE2F, "M", "ع"), + (0x1EE30, "M", "ف"), + (0x1EE31, "M", "ص"), + (0x1EE32, "M", "ق"), + (0x1EE33, "X"), + (0x1EE34, "M", "ش"), + (0x1EE35, "M", "ت"), + (0x1EE36, "M", "ث"), + (0x1EE37, "M", "خ"), + (0x1EE38, "X"), + (0x1EE39, "M", "ض"), + (0x1EE3A, "X"), + (0x1EE3B, "M", "غ"), + (0x1EE3C, "X"), + (0x1EE42, "M", "ج"), + (0x1EE43, "X"), + (0x1EE47, "M", "ح"), + (0x1EE48, "X"), + (0x1EE49, "M", "ي"), + (0x1EE4A, "X"), + (0x1EE4B, "M", "ل"), + (0x1EE4C, "X"), + (0x1EE4D, "M", "ن"), + (0x1EE4E, "M", "س"), ] + def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1EE4F, 'M', 'ع'), - (0x1EE50, 'X'), - (0x1EE51, 'M', 'ص'), - (0x1EE52, 'M', 'ق'), - (0x1EE53, 'X'), - (0x1EE54, 'M', 'ش'), - (0x1EE55, 'X'), - (0x1EE57, 'M', 'خ'), - (0x1EE58, 'X'), - (0x1EE59, 'M', 'ض'), - (0x1EE5A, 'X'), - (0x1EE5B, 'M', 'غ'), - (0x1EE5C, 'X'), - (0x1EE5D, 'M', 'ں'), - (0x1EE5E, 'X'), - (0x1EE5F, 'M', 'ٯ'), - (0x1EE60, 'X'), - (0x1EE61, 'M', 'ب'), - (0x1EE62, 'M', 'ج'), - (0x1EE63, 'X'), - (0x1EE64, 'M', 'ه'), - (0x1EE65, 'X'), - (0x1EE67, 'M', 'ح'), - (0x1EE68, 'M', 'ط'), - (0x1EE69, 'M', 'ي'), - (0x1EE6A, 'M', 'ك'), - (0x1EE6B, 'X'), - (0x1EE6C, 'M', 'م'), - (0x1EE6D, 'M', 'ن'), - (0x1EE6E, 'M', 'س'), - (0x1EE6F, 'M', 'ع'), - (0x1EE70, 'M', 'ف'), - (0x1EE71, 'M', 'ص'), - (0x1EE72, 'M', 'ق'), - (0x1EE73, 'X'), - (0x1EE74, 'M', 'ش'), - (0x1EE75, 'M', 'ت'), - (0x1EE76, 'M', 'ث'), - (0x1EE77, 'M', 'خ'), - (0x1EE78, 'X'), - (0x1EE79, 'M', 'ض'), - (0x1EE7A, 'M', 'ظ'), - (0x1EE7B, 'M', 'غ'), - (0x1EE7C, 'M', 'ٮ'), - (0x1EE7D, 'X'), - (0x1EE7E, 'M', 'ڡ'), - (0x1EE7F, 'X'), - (0x1EE80, 'M', 'ا'), - (0x1EE81, 'M', 'ب'), - (0x1EE82, 'M', 'ج'), - (0x1EE83, 'M', 'د'), - (0x1EE84, 'M', 'ه'), - (0x1EE85, 'M', 'و'), - (0x1EE86, 'M', 'ز'), - (0x1EE87, 'M', 'ح'), - (0x1EE88, 'M', 'ط'), - (0x1EE89, 'M', 'ي'), - (0x1EE8A, 'X'), - (0x1EE8B, 'M', 'ل'), - (0x1EE8C, 'M', 'م'), - (0x1EE8D, 'M', 'ن'), - (0x1EE8E, 'M', 'س'), - (0x1EE8F, 'M', 'ع'), - (0x1EE90, 'M', 'ف'), - (0x1EE91, 'M', 'ص'), - (0x1EE92, 'M', 'ق'), - (0x1EE93, 'M', 'ر'), - (0x1EE94, 'M', 'ش'), - (0x1EE95, 'M', 'ت'), - (0x1EE96, 'M', 'ث'), - (0x1EE97, 'M', 'خ'), - (0x1EE98, 'M', 'ذ'), - (0x1EE99, 'M', 'ض'), - (0x1EE9A, 'M', 'ظ'), - (0x1EE9B, 'M', 'غ'), - (0x1EE9C, 'X'), - (0x1EEA1, 'M', 'ب'), - (0x1EEA2, 'M', 'ج'), - (0x1EEA3, 'M', 'د'), - (0x1EEA4, 'X'), - (0x1EEA5, 'M', 'و'), - (0x1EEA6, 'M', 'ز'), - (0x1EEA7, 'M', 'ح'), - (0x1EEA8, 'M', 'ط'), - (0x1EEA9, 'M', 'ي'), - (0x1EEAA, 'X'), - (0x1EEAB, 'M', 'ل'), - (0x1EEAC, 'M', 'م'), - (0x1EEAD, 'M', 'ن'), - (0x1EEAE, 'M', 'س'), - (0x1EEAF, 'M', 'ع'), - (0x1EEB0, 'M', 'ف'), - (0x1EEB1, 'M', 'ص'), - (0x1EEB2, 'M', 'ق'), - (0x1EEB3, 'M', 'ر'), - (0x1EEB4, 'M', 'ش'), - (0x1EEB5, 'M', 'ت'), - (0x1EEB6, 'M', 'ث'), - (0x1EEB7, 'M', 'خ'), - (0x1EEB8, 'M', 'ذ'), + (0x1EE4F, "M", "ع"), + (0x1EE50, "X"), + (0x1EE51, "M", "ص"), + (0x1EE52, "M", "ق"), + (0x1EE53, "X"), + (0x1EE54, "M", "ش"), + (0x1EE55, "X"), + (0x1EE57, "M", "خ"), + (0x1EE58, "X"), + (0x1EE59, "M", "ض"), + (0x1EE5A, "X"), + (0x1EE5B, "M", "غ"), + (0x1EE5C, "X"), + (0x1EE5D, "M", "ں"), + (0x1EE5E, "X"), + (0x1EE5F, "M", "ٯ"), + (0x1EE60, "X"), + (0x1EE61, "M", "ب"), + (0x1EE62, "M", "ج"), + (0x1EE63, "X"), + (0x1EE64, "M", "ه"), + (0x1EE65, "X"), + (0x1EE67, "M", "ح"), + (0x1EE68, "M", "ط"), + (0x1EE69, "M", "ي"), + (0x1EE6A, "M", "ك"), + (0x1EE6B, "X"), + (0x1EE6C, "M", "م"), + (0x1EE6D, "M", "ن"), + (0x1EE6E, "M", "س"), + (0x1EE6F, "M", "ع"), + (0x1EE70, "M", "ف"), + (0x1EE71, "M", "ص"), + (0x1EE72, "M", "ق"), + (0x1EE73, "X"), + (0x1EE74, "M", "ش"), + (0x1EE75, "M", "ت"), + (0x1EE76, "M", "ث"), + (0x1EE77, "M", "خ"), + (0x1EE78, "X"), + (0x1EE79, "M", "ض"), + (0x1EE7A, "M", "ظ"), + (0x1EE7B, "M", "غ"), + (0x1EE7C, "M", "ٮ"), + (0x1EE7D, "X"), + (0x1EE7E, "M", "ڡ"), + (0x1EE7F, "X"), + (0x1EE80, "M", "ا"), + (0x1EE81, "M", "ب"), + (0x1EE82, "M", "ج"), + (0x1EE83, "M", "د"), + (0x1EE84, "M", "ه"), + (0x1EE85, "M", "و"), + (0x1EE86, "M", "ز"), + (0x1EE87, "M", "ح"), + (0x1EE88, "M", "ط"), + (0x1EE89, "M", "ي"), + (0x1EE8A, "X"), + (0x1EE8B, "M", "ل"), + (0x1EE8C, "M", "م"), + (0x1EE8D, "M", "ن"), + (0x1EE8E, "M", "س"), + (0x1EE8F, "M", "ع"), + (0x1EE90, "M", "ف"), + (0x1EE91, "M", "ص"), + (0x1EE92, "M", "ق"), + (0x1EE93, "M", "ر"), + (0x1EE94, "M", "ش"), + (0x1EE95, "M", "ت"), + (0x1EE96, "M", "ث"), + (0x1EE97, "M", "خ"), + (0x1EE98, "M", "ذ"), + (0x1EE99, "M", "ض"), + (0x1EE9A, "M", "ظ"), + (0x1EE9B, "M", "غ"), + (0x1EE9C, "X"), + (0x1EEA1, "M", "ب"), + (0x1EEA2, "M", "ج"), + (0x1EEA3, "M", "د"), + (0x1EEA4, "X"), + (0x1EEA5, "M", "و"), + (0x1EEA6, "M", "ز"), + (0x1EEA7, "M", "ح"), + (0x1EEA8, "M", "ط"), + (0x1EEA9, "M", "ي"), + (0x1EEAA, "X"), + (0x1EEAB, "M", "ل"), + (0x1EEAC, "M", "م"), + (0x1EEAD, "M", "ن"), + (0x1EEAE, "M", "س"), + (0x1EEAF, "M", "ع"), + (0x1EEB0, "M", "ف"), + (0x1EEB1, "M", "ص"), + (0x1EEB2, "M", "ق"), + (0x1EEB3, "M", "ر"), + (0x1EEB4, "M", "ش"), + (0x1EEB5, "M", "ت"), + (0x1EEB6, "M", "ث"), + (0x1EEB7, "M", "خ"), + (0x1EEB8, "M", "ذ"), ] + def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1EEB9, 'M', 'ض'), - (0x1EEBA, 'M', 'ظ'), - (0x1EEBB, 'M', 'غ'), - (0x1EEBC, 'X'), - (0x1EEF0, 'V'), - (0x1EEF2, 'X'), - (0x1F000, 'V'), - (0x1F02C, 'X'), - (0x1F030, 'V'), - (0x1F094, 'X'), - (0x1F0A0, 'V'), - (0x1F0AF, 'X'), - (0x1F0B1, 'V'), - (0x1F0C0, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0F6, 'X'), - (0x1F101, '3', '0,'), - (0x1F102, '3', '1,'), - (0x1F103, '3', '2,'), - (0x1F104, '3', '3,'), - (0x1F105, '3', '4,'), - (0x1F106, '3', '5,'), - (0x1F107, '3', '6,'), - (0x1F108, '3', '7,'), - (0x1F109, '3', '8,'), - (0x1F10A, '3', '9,'), - (0x1F10B, 'V'), - (0x1F110, '3', '(a)'), - (0x1F111, '3', '(b)'), - (0x1F112, '3', '(c)'), - (0x1F113, '3', '(d)'), - (0x1F114, '3', '(e)'), - (0x1F115, '3', '(f)'), - (0x1F116, '3', '(g)'), - (0x1F117, '3', '(h)'), - (0x1F118, '3', '(i)'), - (0x1F119, '3', '(j)'), - (0x1F11A, '3', '(k)'), - (0x1F11B, '3', '(l)'), - (0x1F11C, '3', '(m)'), - (0x1F11D, '3', '(n)'), - (0x1F11E, '3', '(o)'), - (0x1F11F, '3', '(p)'), - (0x1F120, '3', '(q)'), - (0x1F121, '3', '(r)'), - (0x1F122, '3', '(s)'), - (0x1F123, '3', '(t)'), - (0x1F124, '3', '(u)'), - (0x1F125, '3', '(v)'), - (0x1F126, '3', '(w)'), - (0x1F127, '3', '(x)'), - (0x1F128, '3', '(y)'), - (0x1F129, '3', '(z)'), - (0x1F12A, 'M', '〔s〕'), - (0x1F12B, 'M', 'c'), - (0x1F12C, 'M', 'r'), - (0x1F12D, 'M', 'cd'), - (0x1F12E, 'M', 'wz'), - (0x1F12F, 'V'), - (0x1F130, 'M', 'a'), - (0x1F131, 'M', 'b'), - (0x1F132, 'M', 'c'), - (0x1F133, 'M', 'd'), - (0x1F134, 'M', 'e'), - (0x1F135, 'M', 'f'), - (0x1F136, 'M', 'g'), - (0x1F137, 'M', 'h'), - (0x1F138, 'M', 'i'), - (0x1F139, 'M', 'j'), - (0x1F13A, 'M', 'k'), - (0x1F13B, 'M', 'l'), - (0x1F13C, 'M', 'm'), - (0x1F13D, 'M', 'n'), - (0x1F13E, 'M', 'o'), - (0x1F13F, 'M', 'p'), - (0x1F140, 'M', 'q'), - (0x1F141, 'M', 'r'), - (0x1F142, 'M', 's'), - (0x1F143, 'M', 't'), - (0x1F144, 'M', 'u'), - (0x1F145, 'M', 'v'), - (0x1F146, 'M', 'w'), - (0x1F147, 'M', 'x'), - (0x1F148, 'M', 'y'), - (0x1F149, 'M', 'z'), - (0x1F14A, 'M', 'hv'), - (0x1F14B, 'M', 'mv'), - (0x1F14C, 'M', 'sd'), - (0x1F14D, 'M', 'ss'), - (0x1F14E, 'M', 'ppv'), - (0x1F14F, 'M', 'wc'), - (0x1F150, 'V'), - (0x1F16A, 'M', 'mc'), - (0x1F16B, 'M', 'md'), - (0x1F16C, 'M', 'mr'), - (0x1F16D, 'V'), - (0x1F190, 'M', 'dj'), - (0x1F191, 'V'), + (0x1EEB9, "M", "ض"), + (0x1EEBA, "M", "ظ"), + (0x1EEBB, "M", "غ"), + (0x1EEBC, "X"), + (0x1EEF0, "V"), + (0x1EEF2, "X"), + (0x1F000, "V"), + (0x1F02C, "X"), + (0x1F030, "V"), + (0x1F094, "X"), + (0x1F0A0, "V"), + (0x1F0AF, "X"), + (0x1F0B1, "V"), + (0x1F0C0, "X"), + (0x1F0C1, "V"), + (0x1F0D0, "X"), + (0x1F0D1, "V"), + (0x1F0F6, "X"), + (0x1F101, "3", "0,"), + (0x1F102, "3", "1,"), + (0x1F103, "3", "2,"), + (0x1F104, "3", "3,"), + (0x1F105, "3", "4,"), + (0x1F106, "3", "5,"), + (0x1F107, "3", "6,"), + (0x1F108, "3", "7,"), + (0x1F109, "3", "8,"), + (0x1F10A, "3", "9,"), + (0x1F10B, "V"), + (0x1F110, "3", "(a)"), + (0x1F111, "3", "(b)"), + (0x1F112, "3", "(c)"), + (0x1F113, "3", "(d)"), + (0x1F114, "3", "(e)"), + (0x1F115, "3", "(f)"), + (0x1F116, "3", "(g)"), + (0x1F117, "3", "(h)"), + (0x1F118, "3", "(i)"), + (0x1F119, "3", "(j)"), + (0x1F11A, "3", "(k)"), + (0x1F11B, "3", "(l)"), + (0x1F11C, "3", "(m)"), + (0x1F11D, "3", "(n)"), + (0x1F11E, "3", "(o)"), + (0x1F11F, "3", "(p)"), + (0x1F120, "3", "(q)"), + (0x1F121, "3", "(r)"), + (0x1F122, "3", "(s)"), + (0x1F123, "3", "(t)"), + (0x1F124, "3", "(u)"), + (0x1F125, "3", "(v)"), + (0x1F126, "3", "(w)"), + (0x1F127, "3", "(x)"), + (0x1F128, "3", "(y)"), + (0x1F129, "3", "(z)"), + (0x1F12A, "M", "〔s〕"), + (0x1F12B, "M", "c"), + (0x1F12C, "M", "r"), + (0x1F12D, "M", "cd"), + (0x1F12E, "M", "wz"), + (0x1F12F, "V"), + (0x1F130, "M", "a"), + (0x1F131, "M", "b"), + (0x1F132, "M", "c"), + (0x1F133, "M", "d"), + (0x1F134, "M", "e"), + (0x1F135, "M", "f"), + (0x1F136, "M", "g"), + (0x1F137, "M", "h"), + (0x1F138, "M", "i"), + (0x1F139, "M", "j"), + (0x1F13A, "M", "k"), + (0x1F13B, "M", "l"), + (0x1F13C, "M", "m"), + (0x1F13D, "M", "n"), + (0x1F13E, "M", "o"), + (0x1F13F, "M", "p"), + (0x1F140, "M", "q"), + (0x1F141, "M", "r"), + (0x1F142, "M", "s"), + (0x1F143, "M", "t"), + (0x1F144, "M", "u"), + (0x1F145, "M", "v"), + (0x1F146, "M", "w"), + (0x1F147, "M", "x"), + (0x1F148, "M", "y"), + (0x1F149, "M", "z"), + (0x1F14A, "M", "hv"), + (0x1F14B, "M", "mv"), + (0x1F14C, "M", "sd"), + (0x1F14D, "M", "ss"), + (0x1F14E, "M", "ppv"), + (0x1F14F, "M", "wc"), + (0x1F150, "V"), + (0x1F16A, "M", "mc"), + (0x1F16B, "M", "md"), + (0x1F16C, "M", "mr"), + (0x1F16D, "V"), + (0x1F190, "M", "dj"), + (0x1F191, "V"), ] + def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1F1AE, 'X'), - (0x1F1E6, 'V'), - (0x1F200, 'M', 'ほか'), - (0x1F201, 'M', 'ココ'), - (0x1F202, 'M', 'サ'), - (0x1F203, 'X'), - (0x1F210, 'M', '手'), - (0x1F211, 'M', '字'), - (0x1F212, 'M', '双'), - (0x1F213, 'M', 'デ'), - (0x1F214, 'M', '二'), - (0x1F215, 'M', '多'), - (0x1F216, 'M', '解'), - (0x1F217, 'M', '天'), - (0x1F218, 'M', '交'), - (0x1F219, 'M', '映'), - (0x1F21A, 'M', '無'), - (0x1F21B, 'M', '料'), - (0x1F21C, 'M', '前'), - (0x1F21D, 'M', '後'), - (0x1F21E, 'M', '再'), - (0x1F21F, 'M', '新'), - (0x1F220, 'M', '初'), - (0x1F221, 'M', '終'), - (0x1F222, 'M', '生'), - (0x1F223, 'M', '販'), - (0x1F224, 'M', '声'), - (0x1F225, 'M', '吹'), - (0x1F226, 'M', '演'), - (0x1F227, 'M', '投'), - (0x1F228, 'M', '捕'), - (0x1F229, 'M', '一'), - (0x1F22A, 'M', '三'), - (0x1F22B, 'M', '遊'), - (0x1F22C, 'M', '左'), - (0x1F22D, 'M', '中'), - (0x1F22E, 'M', '右'), - (0x1F22F, 'M', '指'), - (0x1F230, 'M', '走'), - (0x1F231, 'M', '打'), - (0x1F232, 'M', '禁'), - (0x1F233, 'M', '空'), - (0x1F234, 'M', '合'), - (0x1F235, 'M', '満'), - (0x1F236, 'M', '有'), - (0x1F237, 'M', '月'), - (0x1F238, 'M', '申'), - (0x1F239, 'M', '割'), - (0x1F23A, 'M', '営'), - (0x1F23B, 'M', '配'), - (0x1F23C, 'X'), - (0x1F240, 'M', '〔本〕'), - (0x1F241, 'M', '〔三〕'), - (0x1F242, 'M', '〔二〕'), - (0x1F243, 'M', '〔安〕'), - (0x1F244, 'M', '〔点〕'), - (0x1F245, 'M', '〔打〕'), - (0x1F246, 'M', '〔盗〕'), - (0x1F247, 'M', '〔勝〕'), - (0x1F248, 'M', '〔敗〕'), - (0x1F249, 'X'), - (0x1F250, 'M', '得'), - (0x1F251, 'M', '可'), - (0x1F252, 'X'), - (0x1F260, 'V'), - (0x1F266, 'X'), - (0x1F300, 'V'), - (0x1F6D8, 'X'), - (0x1F6DC, 'V'), - (0x1F6ED, 'X'), - (0x1F6F0, 'V'), - (0x1F6FD, 'X'), - (0x1F700, 'V'), - (0x1F777, 'X'), - (0x1F77B, 'V'), - (0x1F7DA, 'X'), - (0x1F7E0, 'V'), - (0x1F7EC, 'X'), - (0x1F7F0, 'V'), - (0x1F7F1, 'X'), - (0x1F800, 'V'), - (0x1F80C, 'X'), - (0x1F810, 'V'), - (0x1F848, 'X'), - (0x1F850, 'V'), - (0x1F85A, 'X'), - (0x1F860, 'V'), - (0x1F888, 'X'), - (0x1F890, 'V'), - (0x1F8AE, 'X'), - (0x1F8B0, 'V'), - (0x1F8B2, 'X'), - (0x1F900, 'V'), - (0x1FA54, 'X'), - (0x1FA60, 'V'), - (0x1FA6E, 'X'), - (0x1FA70, 'V'), - (0x1FA7D, 'X'), - (0x1FA80, 'V'), - (0x1FA89, 'X'), + (0x1F1AE, "X"), + (0x1F1E6, "V"), + (0x1F200, "M", "ほか"), + (0x1F201, "M", "ココ"), + (0x1F202, "M", "サ"), + (0x1F203, "X"), + (0x1F210, "M", "手"), + (0x1F211, "M", "字"), + (0x1F212, "M", "双"), + (0x1F213, "M", "デ"), + (0x1F214, "M", "二"), + (0x1F215, "M", "多"), + (0x1F216, "M", "解"), + (0x1F217, "M", "天"), + (0x1F218, "M", "交"), + (0x1F219, "M", "映"), + (0x1F21A, "M", "無"), + (0x1F21B, "M", "料"), + (0x1F21C, "M", "前"), + (0x1F21D, "M", "後"), + (0x1F21E, "M", "再"), + (0x1F21F, "M", "新"), + (0x1F220, "M", "初"), + (0x1F221, "M", "終"), + (0x1F222, "M", "生"), + (0x1F223, "M", "販"), + (0x1F224, "M", "声"), + (0x1F225, "M", "吹"), + (0x1F226, "M", "演"), + (0x1F227, "M", "投"), + (0x1F228, "M", "捕"), + (0x1F229, "M", "一"), + (0x1F22A, "M", "三"), + (0x1F22B, "M", "遊"), + (0x1F22C, "M", "左"), + (0x1F22D, "M", "中"), + (0x1F22E, "M", "右"), + (0x1F22F, "M", "指"), + (0x1F230, "M", "走"), + (0x1F231, "M", "打"), + (0x1F232, "M", "禁"), + (0x1F233, "M", "空"), + (0x1F234, "M", "合"), + (0x1F235, "M", "満"), + (0x1F236, "M", "有"), + (0x1F237, "M", "月"), + (0x1F238, "M", "申"), + (0x1F239, "M", "割"), + (0x1F23A, "M", "営"), + (0x1F23B, "M", "配"), + (0x1F23C, "X"), + (0x1F240, "M", "〔本〕"), + (0x1F241, "M", "〔三〕"), + (0x1F242, "M", "〔二〕"), + (0x1F243, "M", "〔安〕"), + (0x1F244, "M", "〔点〕"), + (0x1F245, "M", "〔打〕"), + (0x1F246, "M", "〔盗〕"), + (0x1F247, "M", "〔勝〕"), + (0x1F248, "M", "〔敗〕"), + (0x1F249, "X"), + (0x1F250, "M", "得"), + (0x1F251, "M", "可"), + (0x1F252, "X"), + (0x1F260, "V"), + (0x1F266, "X"), + (0x1F300, "V"), + (0x1F6D8, "X"), + (0x1F6DC, "V"), + (0x1F6ED, "X"), + (0x1F6F0, "V"), + (0x1F6FD, "X"), + (0x1F700, "V"), + (0x1F777, "X"), + (0x1F77B, "V"), + (0x1F7DA, "X"), + (0x1F7E0, "V"), + (0x1F7EC, "X"), + (0x1F7F0, "V"), + (0x1F7F1, "X"), + (0x1F800, "V"), + (0x1F80C, "X"), + (0x1F810, "V"), + (0x1F848, "X"), + (0x1F850, "V"), + (0x1F85A, "X"), + (0x1F860, "V"), + (0x1F888, "X"), + (0x1F890, "V"), + (0x1F8AE, "X"), + (0x1F8B0, "V"), + (0x1F8B2, "X"), + (0x1F900, "V"), + (0x1FA54, "X"), + (0x1FA60, "V"), + (0x1FA6E, "X"), + (0x1FA70, "V"), + (0x1FA7D, "X"), + (0x1FA80, "V"), + (0x1FA89, "X"), ] + def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x1FA90, 'V'), - (0x1FABE, 'X'), - (0x1FABF, 'V'), - (0x1FAC6, 'X'), - (0x1FACE, 'V'), - (0x1FADC, 'X'), - (0x1FAE0, 'V'), - (0x1FAE9, 'X'), - (0x1FAF0, 'V'), - (0x1FAF9, 'X'), - (0x1FB00, 'V'), - (0x1FB93, 'X'), - (0x1FB94, 'V'), - (0x1FBCB, 'X'), - (0x1FBF0, 'M', '0'), - (0x1FBF1, 'M', '1'), - (0x1FBF2, 'M', '2'), - (0x1FBF3, 'M', '3'), - (0x1FBF4, 'M', '4'), - (0x1FBF5, 'M', '5'), - (0x1FBF6, 'M', '6'), - (0x1FBF7, 'M', '7'), - (0x1FBF8, 'M', '8'), - (0x1FBF9, 'M', '9'), - (0x1FBFA, 'X'), - (0x20000, 'V'), - (0x2A6E0, 'X'), - (0x2A700, 'V'), - (0x2B73A, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2B820, 'V'), - (0x2CEA2, 'X'), - (0x2CEB0, 'V'), - (0x2EBE1, 'X'), - (0x2EBF0, 'V'), - (0x2EE5E, 'X'), - (0x2F800, 'M', '丽'), - (0x2F801, 'M', '丸'), - (0x2F802, 'M', '乁'), - (0x2F803, 'M', '𠄢'), - (0x2F804, 'M', '你'), - (0x2F805, 'M', '侮'), - (0x2F806, 'M', '侻'), - (0x2F807, 'M', '倂'), - (0x2F808, 'M', '偺'), - (0x2F809, 'M', '備'), - (0x2F80A, 'M', '僧'), - (0x2F80B, 'M', '像'), - (0x2F80C, 'M', '㒞'), - (0x2F80D, 'M', '𠘺'), - (0x2F80E, 'M', '免'), - (0x2F80F, 'M', '兔'), - (0x2F810, 'M', '兤'), - (0x2F811, 'M', '具'), - (0x2F812, 'M', '𠔜'), - (0x2F813, 'M', '㒹'), - (0x2F814, 'M', '內'), - (0x2F815, 'M', '再'), - (0x2F816, 'M', '𠕋'), - (0x2F817, 'M', '冗'), - (0x2F818, 'M', '冤'), - (0x2F819, 'M', '仌'), - (0x2F81A, 'M', '冬'), - (0x2F81B, 'M', '况'), - (0x2F81C, 'M', '𩇟'), - (0x2F81D, 'M', '凵'), - (0x2F81E, 'M', '刃'), - (0x2F81F, 'M', '㓟'), - (0x2F820, 'M', '刻'), - (0x2F821, 'M', '剆'), - (0x2F822, 'M', '割'), - (0x2F823, 'M', '剷'), - (0x2F824, 'M', '㔕'), - (0x2F825, 'M', '勇'), - (0x2F826, 'M', '勉'), - (0x2F827, 'M', '勤'), - (0x2F828, 'M', '勺'), - (0x2F829, 'M', '包'), - (0x2F82A, 'M', '匆'), - (0x2F82B, 'M', '北'), - (0x2F82C, 'M', '卉'), - (0x2F82D, 'M', '卑'), - (0x2F82E, 'M', '博'), - (0x2F82F, 'M', '即'), - (0x2F830, 'M', '卽'), - (0x2F831, 'M', '卿'), - (0x2F834, 'M', '𠨬'), - (0x2F835, 'M', '灰'), - (0x2F836, 'M', '及'), - (0x2F837, 'M', '叟'), - (0x2F838, 'M', '𠭣'), - (0x2F839, 'M', '叫'), - (0x2F83A, 'M', '叱'), - (0x2F83B, 'M', '吆'), - (0x2F83C, 'M', '咞'), - (0x2F83D, 'M', '吸'), - (0x2F83E, 'M', '呈'), - (0x2F83F, 'M', '周'), - (0x2F840, 'M', '咢'), + (0x1FA90, "V"), + (0x1FABE, "X"), + (0x1FABF, "V"), + (0x1FAC6, "X"), + (0x1FACE, "V"), + (0x1FADC, "X"), + (0x1FAE0, "V"), + (0x1FAE9, "X"), + (0x1FAF0, "V"), + (0x1FAF9, "X"), + (0x1FB00, "V"), + (0x1FB93, "X"), + (0x1FB94, "V"), + (0x1FBCB, "X"), + (0x1FBF0, "M", "0"), + (0x1FBF1, "M", "1"), + (0x1FBF2, "M", "2"), + (0x1FBF3, "M", "3"), + (0x1FBF4, "M", "4"), + (0x1FBF5, "M", "5"), + (0x1FBF6, "M", "6"), + (0x1FBF7, "M", "7"), + (0x1FBF8, "M", "8"), + (0x1FBF9, "M", "9"), + (0x1FBFA, "X"), + (0x20000, "V"), + (0x2A6E0, "X"), + (0x2A700, "V"), + (0x2B73A, "X"), + (0x2B740, "V"), + (0x2B81E, "X"), + (0x2B820, "V"), + (0x2CEA2, "X"), + (0x2CEB0, "V"), + (0x2EBE1, "X"), + (0x2EBF0, "V"), + (0x2EE5E, "X"), + (0x2F800, "M", "丽"), + (0x2F801, "M", "丸"), + (0x2F802, "M", "乁"), + (0x2F803, "M", "𠄢"), + (0x2F804, "M", "你"), + (0x2F805, "M", "侮"), + (0x2F806, "M", "侻"), + (0x2F807, "M", "倂"), + (0x2F808, "M", "偺"), + (0x2F809, "M", "備"), + (0x2F80A, "M", "僧"), + (0x2F80B, "M", "像"), + (0x2F80C, "M", "㒞"), + (0x2F80D, "M", "𠘺"), + (0x2F80E, "M", "免"), + (0x2F80F, "M", "兔"), + (0x2F810, "M", "兤"), + (0x2F811, "M", "具"), + (0x2F812, "M", "𠔜"), + (0x2F813, "M", "㒹"), + (0x2F814, "M", "內"), + (0x2F815, "M", "再"), + (0x2F816, "M", "𠕋"), + (0x2F817, "M", "冗"), + (0x2F818, "M", "冤"), + (0x2F819, "M", "仌"), + (0x2F81A, "M", "冬"), + (0x2F81B, "M", "况"), + (0x2F81C, "M", "𩇟"), + (0x2F81D, "M", "凵"), + (0x2F81E, "M", "刃"), + (0x2F81F, "M", "㓟"), + (0x2F820, "M", "刻"), + (0x2F821, "M", "剆"), + (0x2F822, "M", "割"), + (0x2F823, "M", "剷"), + (0x2F824, "M", "㔕"), + (0x2F825, "M", "勇"), + (0x2F826, "M", "勉"), + (0x2F827, "M", "勤"), + (0x2F828, "M", "勺"), + (0x2F829, "M", "包"), + (0x2F82A, "M", "匆"), + (0x2F82B, "M", "北"), + (0x2F82C, "M", "卉"), + (0x2F82D, "M", "卑"), + (0x2F82E, "M", "博"), + (0x2F82F, "M", "即"), + (0x2F830, "M", "卽"), + (0x2F831, "M", "卿"), + (0x2F834, "M", "𠨬"), + (0x2F835, "M", "灰"), + (0x2F836, "M", "及"), + (0x2F837, "M", "叟"), + (0x2F838, "M", "𠭣"), + (0x2F839, "M", "叫"), + (0x2F83A, "M", "叱"), + (0x2F83B, "M", "吆"), + (0x2F83C, "M", "咞"), + (0x2F83D, "M", "吸"), + (0x2F83E, "M", "呈"), + (0x2F83F, "M", "周"), + (0x2F840, "M", "咢"), ] + def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F841, 'M', '哶'), - (0x2F842, 'M', '唐'), - (0x2F843, 'M', '啓'), - (0x2F844, 'M', '啣'), - (0x2F845, 'M', '善'), - (0x2F847, 'M', '喙'), - (0x2F848, 'M', '喫'), - (0x2F849, 'M', '喳'), - (0x2F84A, 'M', '嗂'), - (0x2F84B, 'M', '圖'), - (0x2F84C, 'M', '嘆'), - (0x2F84D, 'M', '圗'), - (0x2F84E, 'M', '噑'), - (0x2F84F, 'M', '噴'), - (0x2F850, 'M', '切'), - (0x2F851, 'M', '壮'), - (0x2F852, 'M', '城'), - (0x2F853, 'M', '埴'), - (0x2F854, 'M', '堍'), - (0x2F855, 'M', '型'), - (0x2F856, 'M', '堲'), - (0x2F857, 'M', '報'), - (0x2F858, 'M', '墬'), - (0x2F859, 'M', '𡓤'), - (0x2F85A, 'M', '売'), - (0x2F85B, 'M', '壷'), - (0x2F85C, 'M', '夆'), - (0x2F85D, 'M', '多'), - (0x2F85E, 'M', '夢'), - (0x2F85F, 'M', '奢'), - (0x2F860, 'M', '𡚨'), - (0x2F861, 'M', '𡛪'), - (0x2F862, 'M', '姬'), - (0x2F863, 'M', '娛'), - (0x2F864, 'M', '娧'), - (0x2F865, 'M', '姘'), - (0x2F866, 'M', '婦'), - (0x2F867, 'M', '㛮'), - (0x2F868, 'X'), - (0x2F869, 'M', '嬈'), - (0x2F86A, 'M', '嬾'), - (0x2F86C, 'M', '𡧈'), - (0x2F86D, 'M', '寃'), - (0x2F86E, 'M', '寘'), - (0x2F86F, 'M', '寧'), - (0x2F870, 'M', '寳'), - (0x2F871, 'M', '𡬘'), - (0x2F872, 'M', '寿'), - (0x2F873, 'M', '将'), - (0x2F874, 'X'), - (0x2F875, 'M', '尢'), - (0x2F876, 'M', '㞁'), - (0x2F877, 'M', '屠'), - (0x2F878, 'M', '屮'), - (0x2F879, 'M', '峀'), - (0x2F87A, 'M', '岍'), - (0x2F87B, 'M', '𡷤'), - (0x2F87C, 'M', '嵃'), - (0x2F87D, 'M', '𡷦'), - (0x2F87E, 'M', '嵮'), - (0x2F87F, 'M', '嵫'), - (0x2F880, 'M', '嵼'), - (0x2F881, 'M', '巡'), - (0x2F882, 'M', '巢'), - (0x2F883, 'M', '㠯'), - (0x2F884, 'M', '巽'), - (0x2F885, 'M', '帨'), - (0x2F886, 'M', '帽'), - (0x2F887, 'M', '幩'), - (0x2F888, 'M', '㡢'), - (0x2F889, 'M', '𢆃'), - (0x2F88A, 'M', '㡼'), - (0x2F88B, 'M', '庰'), - (0x2F88C, 'M', '庳'), - (0x2F88D, 'M', '庶'), - (0x2F88E, 'M', '廊'), - (0x2F88F, 'M', '𪎒'), - (0x2F890, 'M', '廾'), - (0x2F891, 'M', '𢌱'), - (0x2F893, 'M', '舁'), - (0x2F894, 'M', '弢'), - (0x2F896, 'M', '㣇'), - (0x2F897, 'M', '𣊸'), - (0x2F898, 'M', '𦇚'), - (0x2F899, 'M', '形'), - (0x2F89A, 'M', '彫'), - (0x2F89B, 'M', '㣣'), - (0x2F89C, 'M', '徚'), - (0x2F89D, 'M', '忍'), - (0x2F89E, 'M', '志'), - (0x2F89F, 'M', '忹'), - (0x2F8A0, 'M', '悁'), - (0x2F8A1, 'M', '㤺'), - (0x2F8A2, 'M', '㤜'), - (0x2F8A3, 'M', '悔'), - (0x2F8A4, 'M', '𢛔'), - (0x2F8A5, 'M', '惇'), - (0x2F8A6, 'M', '慈'), - (0x2F8A7, 'M', '慌'), - (0x2F8A8, 'M', '慎'), + (0x2F841, "M", "哶"), + (0x2F842, "M", "唐"), + (0x2F843, "M", "啓"), + (0x2F844, "M", "啣"), + (0x2F845, "M", "善"), + (0x2F847, "M", "喙"), + (0x2F848, "M", "喫"), + (0x2F849, "M", "喳"), + (0x2F84A, "M", "嗂"), + (0x2F84B, "M", "圖"), + (0x2F84C, "M", "嘆"), + (0x2F84D, "M", "圗"), + (0x2F84E, "M", "噑"), + (0x2F84F, "M", "噴"), + (0x2F850, "M", "切"), + (0x2F851, "M", "壮"), + (0x2F852, "M", "城"), + (0x2F853, "M", "埴"), + (0x2F854, "M", "堍"), + (0x2F855, "M", "型"), + (0x2F856, "M", "堲"), + (0x2F857, "M", "報"), + (0x2F858, "M", "墬"), + (0x2F859, "M", "𡓤"), + (0x2F85A, "M", "売"), + (0x2F85B, "M", "壷"), + (0x2F85C, "M", "夆"), + (0x2F85D, "M", "多"), + (0x2F85E, "M", "夢"), + (0x2F85F, "M", "奢"), + (0x2F860, "M", "𡚨"), + (0x2F861, "M", "𡛪"), + (0x2F862, "M", "姬"), + (0x2F863, "M", "娛"), + (0x2F864, "M", "娧"), + (0x2F865, "M", "姘"), + (0x2F866, "M", "婦"), + (0x2F867, "M", "㛮"), + (0x2F868, "X"), + (0x2F869, "M", "嬈"), + (0x2F86A, "M", "嬾"), + (0x2F86C, "M", "𡧈"), + (0x2F86D, "M", "寃"), + (0x2F86E, "M", "寘"), + (0x2F86F, "M", "寧"), + (0x2F870, "M", "寳"), + (0x2F871, "M", "𡬘"), + (0x2F872, "M", "寿"), + (0x2F873, "M", "将"), + (0x2F874, "X"), + (0x2F875, "M", "尢"), + (0x2F876, "M", "㞁"), + (0x2F877, "M", "屠"), + (0x2F878, "M", "屮"), + (0x2F879, "M", "峀"), + (0x2F87A, "M", "岍"), + (0x2F87B, "M", "𡷤"), + (0x2F87C, "M", "嵃"), + (0x2F87D, "M", "𡷦"), + (0x2F87E, "M", "嵮"), + (0x2F87F, "M", "嵫"), + (0x2F880, "M", "嵼"), + (0x2F881, "M", "巡"), + (0x2F882, "M", "巢"), + (0x2F883, "M", "㠯"), + (0x2F884, "M", "巽"), + (0x2F885, "M", "帨"), + (0x2F886, "M", "帽"), + (0x2F887, "M", "幩"), + (0x2F888, "M", "㡢"), + (0x2F889, "M", "𢆃"), + (0x2F88A, "M", "㡼"), + (0x2F88B, "M", "庰"), + (0x2F88C, "M", "庳"), + (0x2F88D, "M", "庶"), + (0x2F88E, "M", "廊"), + (0x2F88F, "M", "𪎒"), + (0x2F890, "M", "廾"), + (0x2F891, "M", "𢌱"), + (0x2F893, "M", "舁"), + (0x2F894, "M", "弢"), + (0x2F896, "M", "㣇"), + (0x2F897, "M", "𣊸"), + (0x2F898, "M", "𦇚"), + (0x2F899, "M", "形"), + (0x2F89A, "M", "彫"), + (0x2F89B, "M", "㣣"), + (0x2F89C, "M", "徚"), + (0x2F89D, "M", "忍"), + (0x2F89E, "M", "志"), + (0x2F89F, "M", "忹"), + (0x2F8A0, "M", "悁"), + (0x2F8A1, "M", "㤺"), + (0x2F8A2, "M", "㤜"), + (0x2F8A3, "M", "悔"), + (0x2F8A4, "M", "𢛔"), + (0x2F8A5, "M", "惇"), + (0x2F8A6, "M", "慈"), + (0x2F8A7, "M", "慌"), + (0x2F8A8, "M", "慎"), ] + def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F8A9, 'M', '慌'), - (0x2F8AA, 'M', '慺'), - (0x2F8AB, 'M', '憎'), - (0x2F8AC, 'M', '憲'), - (0x2F8AD, 'M', '憤'), - (0x2F8AE, 'M', '憯'), - (0x2F8AF, 'M', '懞'), - (0x2F8B0, 'M', '懲'), - (0x2F8B1, 'M', '懶'), - (0x2F8B2, 'M', '成'), - (0x2F8B3, 'M', '戛'), - (0x2F8B4, 'M', '扝'), - (0x2F8B5, 'M', '抱'), - (0x2F8B6, 'M', '拔'), - (0x2F8B7, 'M', '捐'), - (0x2F8B8, 'M', '𢬌'), - (0x2F8B9, 'M', '挽'), - (0x2F8BA, 'M', '拼'), - (0x2F8BB, 'M', '捨'), - (0x2F8BC, 'M', '掃'), - (0x2F8BD, 'M', '揤'), - (0x2F8BE, 'M', '𢯱'), - (0x2F8BF, 'M', '搢'), - (0x2F8C0, 'M', '揅'), - (0x2F8C1, 'M', '掩'), - (0x2F8C2, 'M', '㨮'), - (0x2F8C3, 'M', '摩'), - (0x2F8C4, 'M', '摾'), - (0x2F8C5, 'M', '撝'), - (0x2F8C6, 'M', '摷'), - (0x2F8C7, 'M', '㩬'), - (0x2F8C8, 'M', '敏'), - (0x2F8C9, 'M', '敬'), - (0x2F8CA, 'M', '𣀊'), - (0x2F8CB, 'M', '旣'), - (0x2F8CC, 'M', '書'), - (0x2F8CD, 'M', '晉'), - (0x2F8CE, 'M', '㬙'), - (0x2F8CF, 'M', '暑'), - (0x2F8D0, 'M', '㬈'), - (0x2F8D1, 'M', '㫤'), - (0x2F8D2, 'M', '冒'), - (0x2F8D3, 'M', '冕'), - (0x2F8D4, 'M', '最'), - (0x2F8D5, 'M', '暜'), - (0x2F8D6, 'M', '肭'), - (0x2F8D7, 'M', '䏙'), - (0x2F8D8, 'M', '朗'), - (0x2F8D9, 'M', '望'), - (0x2F8DA, 'M', '朡'), - (0x2F8DB, 'M', '杞'), - (0x2F8DC, 'M', '杓'), - (0x2F8DD, 'M', '𣏃'), - (0x2F8DE, 'M', '㭉'), - (0x2F8DF, 'M', '柺'), - (0x2F8E0, 'M', '枅'), - (0x2F8E1, 'M', '桒'), - (0x2F8E2, 'M', '梅'), - (0x2F8E3, 'M', '𣑭'), - (0x2F8E4, 'M', '梎'), - (0x2F8E5, 'M', '栟'), - (0x2F8E6, 'M', '椔'), - (0x2F8E7, 'M', '㮝'), - (0x2F8E8, 'M', '楂'), - (0x2F8E9, 'M', '榣'), - (0x2F8EA, 'M', '槪'), - (0x2F8EB, 'M', '檨'), - (0x2F8EC, 'M', '𣚣'), - (0x2F8ED, 'M', '櫛'), - (0x2F8EE, 'M', '㰘'), - (0x2F8EF, 'M', '次'), - (0x2F8F0, 'M', '𣢧'), - (0x2F8F1, 'M', '歔'), - (0x2F8F2, 'M', '㱎'), - (0x2F8F3, 'M', '歲'), - (0x2F8F4, 'M', '殟'), - (0x2F8F5, 'M', '殺'), - (0x2F8F6, 'M', '殻'), - (0x2F8F7, 'M', '𣪍'), - (0x2F8F8, 'M', '𡴋'), - (0x2F8F9, 'M', '𣫺'), - (0x2F8FA, 'M', '汎'), - (0x2F8FB, 'M', '𣲼'), - (0x2F8FC, 'M', '沿'), - (0x2F8FD, 'M', '泍'), - (0x2F8FE, 'M', '汧'), - (0x2F8FF, 'M', '洖'), - (0x2F900, 'M', '派'), - (0x2F901, 'M', '海'), - (0x2F902, 'M', '流'), - (0x2F903, 'M', '浩'), - (0x2F904, 'M', '浸'), - (0x2F905, 'M', '涅'), - (0x2F906, 'M', '𣴞'), - (0x2F907, 'M', '洴'), - (0x2F908, 'M', '港'), - (0x2F909, 'M', '湮'), - (0x2F90A, 'M', '㴳'), - (0x2F90B, 'M', '滋'), - (0x2F90C, 'M', '滇'), + (0x2F8A9, "M", "慌"), + (0x2F8AA, "M", "慺"), + (0x2F8AB, "M", "憎"), + (0x2F8AC, "M", "憲"), + (0x2F8AD, "M", "憤"), + (0x2F8AE, "M", "憯"), + (0x2F8AF, "M", "懞"), + (0x2F8B0, "M", "懲"), + (0x2F8B1, "M", "懶"), + (0x2F8B2, "M", "成"), + (0x2F8B3, "M", "戛"), + (0x2F8B4, "M", "扝"), + (0x2F8B5, "M", "抱"), + (0x2F8B6, "M", "拔"), + (0x2F8B7, "M", "捐"), + (0x2F8B8, "M", "𢬌"), + (0x2F8B9, "M", "挽"), + (0x2F8BA, "M", "拼"), + (0x2F8BB, "M", "捨"), + (0x2F8BC, "M", "掃"), + (0x2F8BD, "M", "揤"), + (0x2F8BE, "M", "𢯱"), + (0x2F8BF, "M", "搢"), + (0x2F8C0, "M", "揅"), + (0x2F8C1, "M", "掩"), + (0x2F8C2, "M", "㨮"), + (0x2F8C3, "M", "摩"), + (0x2F8C4, "M", "摾"), + (0x2F8C5, "M", "撝"), + (0x2F8C6, "M", "摷"), + (0x2F8C7, "M", "㩬"), + (0x2F8C8, "M", "敏"), + (0x2F8C9, "M", "敬"), + (0x2F8CA, "M", "𣀊"), + (0x2F8CB, "M", "旣"), + (0x2F8CC, "M", "書"), + (0x2F8CD, "M", "晉"), + (0x2F8CE, "M", "㬙"), + (0x2F8CF, "M", "暑"), + (0x2F8D0, "M", "㬈"), + (0x2F8D1, "M", "㫤"), + (0x2F8D2, "M", "冒"), + (0x2F8D3, "M", "冕"), + (0x2F8D4, "M", "最"), + (0x2F8D5, "M", "暜"), + (0x2F8D6, "M", "肭"), + (0x2F8D7, "M", "䏙"), + (0x2F8D8, "M", "朗"), + (0x2F8D9, "M", "望"), + (0x2F8DA, "M", "朡"), + (0x2F8DB, "M", "杞"), + (0x2F8DC, "M", "杓"), + (0x2F8DD, "M", "𣏃"), + (0x2F8DE, "M", "㭉"), + (0x2F8DF, "M", "柺"), + (0x2F8E0, "M", "枅"), + (0x2F8E1, "M", "桒"), + (0x2F8E2, "M", "梅"), + (0x2F8E3, "M", "𣑭"), + (0x2F8E4, "M", "梎"), + (0x2F8E5, "M", "栟"), + (0x2F8E6, "M", "椔"), + (0x2F8E7, "M", "㮝"), + (0x2F8E8, "M", "楂"), + (0x2F8E9, "M", "榣"), + (0x2F8EA, "M", "槪"), + (0x2F8EB, "M", "檨"), + (0x2F8EC, "M", "𣚣"), + (0x2F8ED, "M", "櫛"), + (0x2F8EE, "M", "㰘"), + (0x2F8EF, "M", "次"), + (0x2F8F0, "M", "𣢧"), + (0x2F8F1, "M", "歔"), + (0x2F8F2, "M", "㱎"), + (0x2F8F3, "M", "歲"), + (0x2F8F4, "M", "殟"), + (0x2F8F5, "M", "殺"), + (0x2F8F6, "M", "殻"), + (0x2F8F7, "M", "𣪍"), + (0x2F8F8, "M", "𡴋"), + (0x2F8F9, "M", "𣫺"), + (0x2F8FA, "M", "汎"), + (0x2F8FB, "M", "𣲼"), + (0x2F8FC, "M", "沿"), + (0x2F8FD, "M", "泍"), + (0x2F8FE, "M", "汧"), + (0x2F8FF, "M", "洖"), + (0x2F900, "M", "派"), + (0x2F901, "M", "海"), + (0x2F902, "M", "流"), + (0x2F903, "M", "浩"), + (0x2F904, "M", "浸"), + (0x2F905, "M", "涅"), + (0x2F906, "M", "𣴞"), + (0x2F907, "M", "洴"), + (0x2F908, "M", "港"), + (0x2F909, "M", "湮"), + (0x2F90A, "M", "㴳"), + (0x2F90B, "M", "滋"), + (0x2F90C, "M", "滇"), ] + def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F90D, 'M', '𣻑'), - (0x2F90E, 'M', '淹'), - (0x2F90F, 'M', '潮'), - (0x2F910, 'M', '𣽞'), - (0x2F911, 'M', '𣾎'), - (0x2F912, 'M', '濆'), - (0x2F913, 'M', '瀹'), - (0x2F914, 'M', '瀞'), - (0x2F915, 'M', '瀛'), - (0x2F916, 'M', '㶖'), - (0x2F917, 'M', '灊'), - (0x2F918, 'M', '災'), - (0x2F919, 'M', '灷'), - (0x2F91A, 'M', '炭'), - (0x2F91B, 'M', '𠔥'), - (0x2F91C, 'M', '煅'), - (0x2F91D, 'M', '𤉣'), - (0x2F91E, 'M', '熜'), - (0x2F91F, 'X'), - (0x2F920, 'M', '爨'), - (0x2F921, 'M', '爵'), - (0x2F922, 'M', '牐'), - (0x2F923, 'M', '𤘈'), - (0x2F924, 'M', '犀'), - (0x2F925, 'M', '犕'), - (0x2F926, 'M', '𤜵'), - (0x2F927, 'M', '𤠔'), - (0x2F928, 'M', '獺'), - (0x2F929, 'M', '王'), - (0x2F92A, 'M', '㺬'), - (0x2F92B, 'M', '玥'), - (0x2F92C, 'M', '㺸'), - (0x2F92E, 'M', '瑇'), - (0x2F92F, 'M', '瑜'), - (0x2F930, 'M', '瑱'), - (0x2F931, 'M', '璅'), - (0x2F932, 'M', '瓊'), - (0x2F933, 'M', '㼛'), - (0x2F934, 'M', '甤'), - (0x2F935, 'M', '𤰶'), - (0x2F936, 'M', '甾'), - (0x2F937, 'M', '𤲒'), - (0x2F938, 'M', '異'), - (0x2F939, 'M', '𢆟'), - (0x2F93A, 'M', '瘐'), - (0x2F93B, 'M', '𤾡'), - (0x2F93C, 'M', '𤾸'), - (0x2F93D, 'M', '𥁄'), - (0x2F93E, 'M', '㿼'), - (0x2F93F, 'M', '䀈'), - (0x2F940, 'M', '直'), - (0x2F941, 'M', '𥃳'), - (0x2F942, 'M', '𥃲'), - (0x2F943, 'M', '𥄙'), - (0x2F944, 'M', '𥄳'), - (0x2F945, 'M', '眞'), - (0x2F946, 'M', '真'), - (0x2F948, 'M', '睊'), - (0x2F949, 'M', '䀹'), - (0x2F94A, 'M', '瞋'), - (0x2F94B, 'M', '䁆'), - (0x2F94C, 'M', '䂖'), - (0x2F94D, 'M', '𥐝'), - (0x2F94E, 'M', '硎'), - (0x2F94F, 'M', '碌'), - (0x2F950, 'M', '磌'), - (0x2F951, 'M', '䃣'), - (0x2F952, 'M', '𥘦'), - (0x2F953, 'M', '祖'), - (0x2F954, 'M', '𥚚'), - (0x2F955, 'M', '𥛅'), - (0x2F956, 'M', '福'), - (0x2F957, 'M', '秫'), - (0x2F958, 'M', '䄯'), - (0x2F959, 'M', '穀'), - (0x2F95A, 'M', '穊'), - (0x2F95B, 'M', '穏'), - (0x2F95C, 'M', '𥥼'), - (0x2F95D, 'M', '𥪧'), - (0x2F95F, 'X'), - (0x2F960, 'M', '䈂'), - (0x2F961, 'M', '𥮫'), - (0x2F962, 'M', '篆'), - (0x2F963, 'M', '築'), - (0x2F964, 'M', '䈧'), - (0x2F965, 'M', '𥲀'), - (0x2F966, 'M', '糒'), - (0x2F967, 'M', '䊠'), - (0x2F968, 'M', '糨'), - (0x2F969, 'M', '糣'), - (0x2F96A, 'M', '紀'), - (0x2F96B, 'M', '𥾆'), - (0x2F96C, 'M', '絣'), - (0x2F96D, 'M', '䌁'), - (0x2F96E, 'M', '緇'), - (0x2F96F, 'M', '縂'), - (0x2F970, 'M', '繅'), - (0x2F971, 'M', '䌴'), - (0x2F972, 'M', '𦈨'), - (0x2F973, 'M', '𦉇'), + (0x2F90D, "M", "𣻑"), + (0x2F90E, "M", "淹"), + (0x2F90F, "M", "潮"), + (0x2F910, "M", "𣽞"), + (0x2F911, "M", "𣾎"), + (0x2F912, "M", "濆"), + (0x2F913, "M", "瀹"), + (0x2F914, "M", "瀞"), + (0x2F915, "M", "瀛"), + (0x2F916, "M", "㶖"), + (0x2F917, "M", "灊"), + (0x2F918, "M", "災"), + (0x2F919, "M", "灷"), + (0x2F91A, "M", "炭"), + (0x2F91B, "M", "𠔥"), + (0x2F91C, "M", "煅"), + (0x2F91D, "M", "𤉣"), + (0x2F91E, "M", "熜"), + (0x2F91F, "X"), + (0x2F920, "M", "爨"), + (0x2F921, "M", "爵"), + (0x2F922, "M", "牐"), + (0x2F923, "M", "𤘈"), + (0x2F924, "M", "犀"), + (0x2F925, "M", "犕"), + (0x2F926, "M", "𤜵"), + (0x2F927, "M", "𤠔"), + (0x2F928, "M", "獺"), + (0x2F929, "M", "王"), + (0x2F92A, "M", "㺬"), + (0x2F92B, "M", "玥"), + (0x2F92C, "M", "㺸"), + (0x2F92E, "M", "瑇"), + (0x2F92F, "M", "瑜"), + (0x2F930, "M", "瑱"), + (0x2F931, "M", "璅"), + (0x2F932, "M", "瓊"), + (0x2F933, "M", "㼛"), + (0x2F934, "M", "甤"), + (0x2F935, "M", "𤰶"), + (0x2F936, "M", "甾"), + (0x2F937, "M", "𤲒"), + (0x2F938, "M", "異"), + (0x2F939, "M", "𢆟"), + (0x2F93A, "M", "瘐"), + (0x2F93B, "M", "𤾡"), + (0x2F93C, "M", "𤾸"), + (0x2F93D, "M", "𥁄"), + (0x2F93E, "M", "㿼"), + (0x2F93F, "M", "䀈"), + (0x2F940, "M", "直"), + (0x2F941, "M", "𥃳"), + (0x2F942, "M", "𥃲"), + (0x2F943, "M", "𥄙"), + (0x2F944, "M", "𥄳"), + (0x2F945, "M", "眞"), + (0x2F946, "M", "真"), + (0x2F948, "M", "睊"), + (0x2F949, "M", "䀹"), + (0x2F94A, "M", "瞋"), + (0x2F94B, "M", "䁆"), + (0x2F94C, "M", "䂖"), + (0x2F94D, "M", "𥐝"), + (0x2F94E, "M", "硎"), + (0x2F94F, "M", "碌"), + (0x2F950, "M", "磌"), + (0x2F951, "M", "䃣"), + (0x2F952, "M", "𥘦"), + (0x2F953, "M", "祖"), + (0x2F954, "M", "𥚚"), + (0x2F955, "M", "𥛅"), + (0x2F956, "M", "福"), + (0x2F957, "M", "秫"), + (0x2F958, "M", "䄯"), + (0x2F959, "M", "穀"), + (0x2F95A, "M", "穊"), + (0x2F95B, "M", "穏"), + (0x2F95C, "M", "𥥼"), + (0x2F95D, "M", "𥪧"), + (0x2F95F, "X"), + (0x2F960, "M", "䈂"), + (0x2F961, "M", "𥮫"), + (0x2F962, "M", "篆"), + (0x2F963, "M", "築"), + (0x2F964, "M", "䈧"), + (0x2F965, "M", "𥲀"), + (0x2F966, "M", "糒"), + (0x2F967, "M", "䊠"), + (0x2F968, "M", "糨"), + (0x2F969, "M", "糣"), + (0x2F96A, "M", "紀"), + (0x2F96B, "M", "𥾆"), + (0x2F96C, "M", "絣"), + (0x2F96D, "M", "䌁"), + (0x2F96E, "M", "緇"), + (0x2F96F, "M", "縂"), + (0x2F970, "M", "繅"), + (0x2F971, "M", "䌴"), + (0x2F972, "M", "𦈨"), + (0x2F973, "M", "𦉇"), ] + def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F974, 'M', '䍙'), - (0x2F975, 'M', '𦋙'), - (0x2F976, 'M', '罺'), - (0x2F977, 'M', '𦌾'), - (0x2F978, 'M', '羕'), - (0x2F979, 'M', '翺'), - (0x2F97A, 'M', '者'), - (0x2F97B, 'M', '𦓚'), - (0x2F97C, 'M', '𦔣'), - (0x2F97D, 'M', '聠'), - (0x2F97E, 'M', '𦖨'), - (0x2F97F, 'M', '聰'), - (0x2F980, 'M', '𣍟'), - (0x2F981, 'M', '䏕'), - (0x2F982, 'M', '育'), - (0x2F983, 'M', '脃'), - (0x2F984, 'M', '䐋'), - (0x2F985, 'M', '脾'), - (0x2F986, 'M', '媵'), - (0x2F987, 'M', '𦞧'), - (0x2F988, 'M', '𦞵'), - (0x2F989, 'M', '𣎓'), - (0x2F98A, 'M', '𣎜'), - (0x2F98B, 'M', '舁'), - (0x2F98C, 'M', '舄'), - (0x2F98D, 'M', '辞'), - (0x2F98E, 'M', '䑫'), - (0x2F98F, 'M', '芑'), - (0x2F990, 'M', '芋'), - (0x2F991, 'M', '芝'), - (0x2F992, 'M', '劳'), - (0x2F993, 'M', '花'), - (0x2F994, 'M', '芳'), - (0x2F995, 'M', '芽'), - (0x2F996, 'M', '苦'), - (0x2F997, 'M', '𦬼'), - (0x2F998, 'M', '若'), - (0x2F999, 'M', '茝'), - (0x2F99A, 'M', '荣'), - (0x2F99B, 'M', '莭'), - (0x2F99C, 'M', '茣'), - (0x2F99D, 'M', '莽'), - (0x2F99E, 'M', '菧'), - (0x2F99F, 'M', '著'), - (0x2F9A0, 'M', '荓'), - (0x2F9A1, 'M', '菊'), - (0x2F9A2, 'M', '菌'), - (0x2F9A3, 'M', '菜'), - (0x2F9A4, 'M', '𦰶'), - (0x2F9A5, 'M', '𦵫'), - (0x2F9A6, 'M', '𦳕'), - (0x2F9A7, 'M', '䔫'), - (0x2F9A8, 'M', '蓱'), - (0x2F9A9, 'M', '蓳'), - (0x2F9AA, 'M', '蔖'), - (0x2F9AB, 'M', '𧏊'), - (0x2F9AC, 'M', '蕤'), - (0x2F9AD, 'M', '𦼬'), - (0x2F9AE, 'M', '䕝'), - (0x2F9AF, 'M', '䕡'), - (0x2F9B0, 'M', '𦾱'), - (0x2F9B1, 'M', '𧃒'), - (0x2F9B2, 'M', '䕫'), - (0x2F9B3, 'M', '虐'), - (0x2F9B4, 'M', '虜'), - (0x2F9B5, 'M', '虧'), - (0x2F9B6, 'M', '虩'), - (0x2F9B7, 'M', '蚩'), - (0x2F9B8, 'M', '蚈'), - (0x2F9B9, 'M', '蜎'), - (0x2F9BA, 'M', '蛢'), - (0x2F9BB, 'M', '蝹'), - (0x2F9BC, 'M', '蜨'), - (0x2F9BD, 'M', '蝫'), - (0x2F9BE, 'M', '螆'), - (0x2F9BF, 'X'), - (0x2F9C0, 'M', '蟡'), - (0x2F9C1, 'M', '蠁'), - (0x2F9C2, 'M', '䗹'), - (0x2F9C3, 'M', '衠'), - (0x2F9C4, 'M', '衣'), - (0x2F9C5, 'M', '𧙧'), - (0x2F9C6, 'M', '裗'), - (0x2F9C7, 'M', '裞'), - (0x2F9C8, 'M', '䘵'), - (0x2F9C9, 'M', '裺'), - (0x2F9CA, 'M', '㒻'), - (0x2F9CB, 'M', '𧢮'), - (0x2F9CC, 'M', '𧥦'), - (0x2F9CD, 'M', '䚾'), - (0x2F9CE, 'M', '䛇'), - (0x2F9CF, 'M', '誠'), - (0x2F9D0, 'M', '諭'), - (0x2F9D1, 'M', '變'), - (0x2F9D2, 'M', '豕'), - (0x2F9D3, 'M', '𧲨'), - (0x2F9D4, 'M', '貫'), - (0x2F9D5, 'M', '賁'), - (0x2F9D6, 'M', '贛'), - (0x2F9D7, 'M', '起'), + (0x2F974, "M", "䍙"), + (0x2F975, "M", "𦋙"), + (0x2F976, "M", "罺"), + (0x2F977, "M", "𦌾"), + (0x2F978, "M", "羕"), + (0x2F979, "M", "翺"), + (0x2F97A, "M", "者"), + (0x2F97B, "M", "𦓚"), + (0x2F97C, "M", "𦔣"), + (0x2F97D, "M", "聠"), + (0x2F97E, "M", "𦖨"), + (0x2F97F, "M", "聰"), + (0x2F980, "M", "𣍟"), + (0x2F981, "M", "䏕"), + (0x2F982, "M", "育"), + (0x2F983, "M", "脃"), + (0x2F984, "M", "䐋"), + (0x2F985, "M", "脾"), + (0x2F986, "M", "媵"), + (0x2F987, "M", "𦞧"), + (0x2F988, "M", "𦞵"), + (0x2F989, "M", "𣎓"), + (0x2F98A, "M", "𣎜"), + (0x2F98B, "M", "舁"), + (0x2F98C, "M", "舄"), + (0x2F98D, "M", "辞"), + (0x2F98E, "M", "䑫"), + (0x2F98F, "M", "芑"), + (0x2F990, "M", "芋"), + (0x2F991, "M", "芝"), + (0x2F992, "M", "劳"), + (0x2F993, "M", "花"), + (0x2F994, "M", "芳"), + (0x2F995, "M", "芽"), + (0x2F996, "M", "苦"), + (0x2F997, "M", "𦬼"), + (0x2F998, "M", "若"), + (0x2F999, "M", "茝"), + (0x2F99A, "M", "荣"), + (0x2F99B, "M", "莭"), + (0x2F99C, "M", "茣"), + (0x2F99D, "M", "莽"), + (0x2F99E, "M", "菧"), + (0x2F99F, "M", "著"), + (0x2F9A0, "M", "荓"), + (0x2F9A1, "M", "菊"), + (0x2F9A2, "M", "菌"), + (0x2F9A3, "M", "菜"), + (0x2F9A4, "M", "𦰶"), + (0x2F9A5, "M", "𦵫"), + (0x2F9A6, "M", "𦳕"), + (0x2F9A7, "M", "䔫"), + (0x2F9A8, "M", "蓱"), + (0x2F9A9, "M", "蓳"), + (0x2F9AA, "M", "蔖"), + (0x2F9AB, "M", "𧏊"), + (0x2F9AC, "M", "蕤"), + (0x2F9AD, "M", "𦼬"), + (0x2F9AE, "M", "䕝"), + (0x2F9AF, "M", "䕡"), + (0x2F9B0, "M", "𦾱"), + (0x2F9B1, "M", "𧃒"), + (0x2F9B2, "M", "䕫"), + (0x2F9B3, "M", "虐"), + (0x2F9B4, "M", "虜"), + (0x2F9B5, "M", "虧"), + (0x2F9B6, "M", "虩"), + (0x2F9B7, "M", "蚩"), + (0x2F9B8, "M", "蚈"), + (0x2F9B9, "M", "蜎"), + (0x2F9BA, "M", "蛢"), + (0x2F9BB, "M", "蝹"), + (0x2F9BC, "M", "蜨"), + (0x2F9BD, "M", "蝫"), + (0x2F9BE, "M", "螆"), + (0x2F9BF, "X"), + (0x2F9C0, "M", "蟡"), + (0x2F9C1, "M", "蠁"), + (0x2F9C2, "M", "䗹"), + (0x2F9C3, "M", "衠"), + (0x2F9C4, "M", "衣"), + (0x2F9C5, "M", "𧙧"), + (0x2F9C6, "M", "裗"), + (0x2F9C7, "M", "裞"), + (0x2F9C8, "M", "䘵"), + (0x2F9C9, "M", "裺"), + (0x2F9CA, "M", "㒻"), + (0x2F9CB, "M", "𧢮"), + (0x2F9CC, "M", "𧥦"), + (0x2F9CD, "M", "䚾"), + (0x2F9CE, "M", "䛇"), + (0x2F9CF, "M", "誠"), + (0x2F9D0, "M", "諭"), + (0x2F9D1, "M", "變"), + (0x2F9D2, "M", "豕"), + (0x2F9D3, "M", "𧲨"), + (0x2F9D4, "M", "貫"), + (0x2F9D5, "M", "賁"), + (0x2F9D6, "M", "贛"), + (0x2F9D7, "M", "起"), ] + def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: return [ - (0x2F9D8, 'M', '𧼯'), - (0x2F9D9, 'M', '𠠄'), - (0x2F9DA, 'M', '跋'), - (0x2F9DB, 'M', '趼'), - (0x2F9DC, 'M', '跰'), - (0x2F9DD, 'M', '𠣞'), - (0x2F9DE, 'M', '軔'), - (0x2F9DF, 'M', '輸'), - (0x2F9E0, 'M', '𨗒'), - (0x2F9E1, 'M', '𨗭'), - (0x2F9E2, 'M', '邔'), - (0x2F9E3, 'M', '郱'), - (0x2F9E4, 'M', '鄑'), - (0x2F9E5, 'M', '𨜮'), - (0x2F9E6, 'M', '鄛'), - (0x2F9E7, 'M', '鈸'), - (0x2F9E8, 'M', '鋗'), - (0x2F9E9, 'M', '鋘'), - (0x2F9EA, 'M', '鉼'), - (0x2F9EB, 'M', '鏹'), - (0x2F9EC, 'M', '鐕'), - (0x2F9ED, 'M', '𨯺'), - (0x2F9EE, 'M', '開'), - (0x2F9EF, 'M', '䦕'), - (0x2F9F0, 'M', '閷'), - (0x2F9F1, 'M', '𨵷'), - (0x2F9F2, 'M', '䧦'), - (0x2F9F3, 'M', '雃'), - (0x2F9F4, 'M', '嶲'), - (0x2F9F5, 'M', '霣'), - (0x2F9F6, 'M', '𩅅'), - (0x2F9F7, 'M', '𩈚'), - (0x2F9F8, 'M', '䩮'), - (0x2F9F9, 'M', '䩶'), - (0x2F9FA, 'M', '韠'), - (0x2F9FB, 'M', '𩐊'), - (0x2F9FC, 'M', '䪲'), - (0x2F9FD, 'M', '𩒖'), - (0x2F9FE, 'M', '頋'), - (0x2FA00, 'M', '頩'), - (0x2FA01, 'M', '𩖶'), - (0x2FA02, 'M', '飢'), - (0x2FA03, 'M', '䬳'), - (0x2FA04, 'M', '餩'), - (0x2FA05, 'M', '馧'), - (0x2FA06, 'M', '駂'), - (0x2FA07, 'M', '駾'), - (0x2FA08, 'M', '䯎'), - (0x2FA09, 'M', '𩬰'), - (0x2FA0A, 'M', '鬒'), - (0x2FA0B, 'M', '鱀'), - (0x2FA0C, 'M', '鳽'), - (0x2FA0D, 'M', '䳎'), - (0x2FA0E, 'M', '䳭'), - (0x2FA0F, 'M', '鵧'), - (0x2FA10, 'M', '𪃎'), - (0x2FA11, 'M', '䳸'), - (0x2FA12, 'M', '𪄅'), - (0x2FA13, 'M', '𪈎'), - (0x2FA14, 'M', '𪊑'), - (0x2FA15, 'M', '麻'), - (0x2FA16, 'M', '䵖'), - (0x2FA17, 'M', '黹'), - (0x2FA18, 'M', '黾'), - (0x2FA19, 'M', '鼅'), - (0x2FA1A, 'M', '鼏'), - (0x2FA1B, 'M', '鼖'), - (0x2FA1C, 'M', '鼻'), - (0x2FA1D, 'M', '𪘀'), - (0x2FA1E, 'X'), - (0x30000, 'V'), - (0x3134B, 'X'), - (0x31350, 'V'), - (0x323B0, 'X'), - (0xE0100, 'I'), - (0xE01F0, 'X'), + (0x2F9D8, "M", "𧼯"), + (0x2F9D9, "M", "𠠄"), + (0x2F9DA, "M", "跋"), + (0x2F9DB, "M", "趼"), + (0x2F9DC, "M", "跰"), + (0x2F9DD, "M", "𠣞"), + (0x2F9DE, "M", "軔"), + (0x2F9DF, "M", "輸"), + (0x2F9E0, "M", "𨗒"), + (0x2F9E1, "M", "𨗭"), + (0x2F9E2, "M", "邔"), + (0x2F9E3, "M", "郱"), + (0x2F9E4, "M", "鄑"), + (0x2F9E5, "M", "𨜮"), + (0x2F9E6, "M", "鄛"), + (0x2F9E7, "M", "鈸"), + (0x2F9E8, "M", "鋗"), + (0x2F9E9, "M", "鋘"), + (0x2F9EA, "M", "鉼"), + (0x2F9EB, "M", "鏹"), + (0x2F9EC, "M", "鐕"), + (0x2F9ED, "M", "𨯺"), + (0x2F9EE, "M", "開"), + (0x2F9EF, "M", "䦕"), + (0x2F9F0, "M", "閷"), + (0x2F9F1, "M", "𨵷"), + (0x2F9F2, "M", "䧦"), + (0x2F9F3, "M", "雃"), + (0x2F9F4, "M", "嶲"), + (0x2F9F5, "M", "霣"), + (0x2F9F6, "M", "𩅅"), + (0x2F9F7, "M", "𩈚"), + (0x2F9F8, "M", "䩮"), + (0x2F9F9, "M", "䩶"), + (0x2F9FA, "M", "韠"), + (0x2F9FB, "M", "𩐊"), + (0x2F9FC, "M", "䪲"), + (0x2F9FD, "M", "𩒖"), + (0x2F9FE, "M", "頋"), + (0x2FA00, "M", "頩"), + (0x2FA01, "M", "𩖶"), + (0x2FA02, "M", "飢"), + (0x2FA03, "M", "䬳"), + (0x2FA04, "M", "餩"), + (0x2FA05, "M", "馧"), + (0x2FA06, "M", "駂"), + (0x2FA07, "M", "駾"), + (0x2FA08, "M", "䯎"), + (0x2FA09, "M", "𩬰"), + (0x2FA0A, "M", "鬒"), + (0x2FA0B, "M", "鱀"), + (0x2FA0C, "M", "鳽"), + (0x2FA0D, "M", "䳎"), + (0x2FA0E, "M", "䳭"), + (0x2FA0F, "M", "鵧"), + (0x2FA10, "M", "𪃎"), + (0x2FA11, "M", "䳸"), + (0x2FA12, "M", "𪄅"), + (0x2FA13, "M", "𪈎"), + (0x2FA14, "M", "𪊑"), + (0x2FA15, "M", "麻"), + (0x2FA16, "M", "䵖"), + (0x2FA17, "M", "黹"), + (0x2FA18, "M", "黾"), + (0x2FA19, "M", "鼅"), + (0x2FA1A, "M", "鼏"), + (0x2FA1B, "M", "鼖"), + (0x2FA1C, "M", "鼻"), + (0x2FA1D, "M", "𪘀"), + (0x2FA1E, "X"), + (0x30000, "V"), + (0x3134B, "X"), + (0x31350, "V"), + (0x323B0, "X"), + (0xE0100, "I"), + (0xE01F0, "X"), ] + uts46data = tuple( _seg_0() + _seg_1() diff --git a/libs/importlib_metadata-7.0.1.dist-info/RECORD b/libs/importlib_metadata-7.0.1.dist-info/RECORD deleted file mode 100644 index 8ee59fab3..000000000 --- a/libs/importlib_metadata-7.0.1.dist-info/RECORD +++ /dev/null @@ -1,18 +0,0 @@ -importlib_metadata-7.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -importlib_metadata-7.0.1.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 -importlib_metadata-7.0.1.dist-info/METADATA,sha256=67Yxj6rypSFswUjYHY01_GecCOIVMcAk8kYxodYgStU,4926 -importlib_metadata-7.0.1.dist-info/RECORD,, -importlib_metadata-7.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_metadata-7.0.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -importlib_metadata-7.0.1.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19 -importlib_metadata/__init__.py,sha256=CrDhGQz3SCK5Cct82OvmGzqzOqneJn3jLvvfmSx8nCs,31551 -importlib_metadata/_adapters.py,sha256=jZr_CmHrl8qTGatO0yMmuOdfFExOY64G8eEYf6Cnj9k,2455 -importlib_metadata/_collections.py,sha256=CJ0OTCHIjWA0ZIVS4voORAsn2R4R2cQBEtPsZEJpASY,743 -importlib_metadata/_compat.py,sha256=73QKrN9KNoaZzhbX5yPCCZa-FaALwXe8TPlDR72JgBU,1314 -importlib_metadata/_functools.py,sha256=PsY2-4rrKX4RVeRC1oGp1lB1pmC9eKN88_f-bD9uOoA,2895 -importlib_metadata/_itertools.py,sha256=cvr_2v8BRbxcIl5x5ldfqdHjhI8Yi8s8yk50G_nm6jQ,2068 -importlib_metadata/_meta.py,sha256=FRThoc8OnIaQ0trIKQ0kyj08cQhZvqNFyjEyXUgAvVs,1849 -importlib_metadata/_py39compat.py,sha256=2Tk5twb_VgLCY-1NEAQjdZp_S9OFMC-pUzP2isuaPsQ,1098 -importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166 -importlib_metadata/diagnose.py,sha256=nkSRMiowlmkhLYhKhvCg9glmt_11Cox-EmLzEbqYTa8,379 -importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/importlib_metadata-7.0.1.dist-info/WHEEL b/libs/importlib_metadata-7.0.1.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/importlib_metadata-7.0.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/idna-3.6.dist-info/INSTALLER b/libs/importlib_metadata-7.2.1.dist-info/INSTALLER similarity index 100% rename from libs/idna-3.6.dist-info/INSTALLER rename to libs/importlib_metadata-7.2.1.dist-info/INSTALLER diff --git a/libs/importlib_metadata-7.0.1.dist-info/LICENSE b/libs/importlib_metadata-7.2.1.dist-info/LICENSE similarity index 100% rename from libs/importlib_metadata-7.0.1.dist-info/LICENSE rename to libs/importlib_metadata-7.2.1.dist-info/LICENSE diff --git a/libs/importlib_metadata-7.0.1.dist-info/METADATA b/libs/importlib_metadata-7.2.1.dist-info/METADATA similarity index 71% rename from libs/importlib_metadata-7.0.1.dist-info/METADATA rename to libs/importlib_metadata-7.2.1.dist-info/METADATA index dee9754ac..7ba1967b1 100644 --- a/libs/importlib_metadata-7.0.1.dist-info/METADATA +++ b/libs/importlib_metadata-7.2.1.dist-info/METADATA @@ -1,42 +1,41 @@ Metadata-Version: 2.1 Name: importlib_metadata -Version: 7.0.1 +Version: 7.2.1 Summary: Read metadata from Python packages -Home-page: https://github.com/python/importlib_metadata -Author: Jason R. Coombs -Author-email: jaraco@jaraco.com +Author-email: "Jason R. Coombs" +Project-URL: Source, https://github.com/python/importlib_metadata 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 +Description-Content-Type: text/x-rst 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: sphinx <7.2.5 ; extra == 'docs' -Requires-Dist: jaraco.packaging >=9.3 ; 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: doc +Requires-Dist: sphinx >=3.5 ; extra == 'doc' +Requires-Dist: jaraco.packaging >=9.3 ; extra == 'doc' +Requires-Dist: rst.linker >=1.9 ; extra == 'doc' +Requires-Dist: furo ; extra == 'doc' +Requires-Dist: sphinx-lint ; extra == 'doc' +Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'doc' 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' +Provides-Extra: test +Requires-Dist: pytest !=8.1.*,>=6 ; extra == 'test' +Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' +Requires-Dist: pytest-mypy ; extra == 'test' +Requires-Dist: pytest-enabler >=2.2 ; extra == 'test' +Requires-Dist: pytest-ruff >=0.2.1 ; extra == 'test' +Requires-Dist: packaging ; extra == 'test' +Requires-Dist: pyfakefs ; extra == 'test' +Requires-Dist: flufl.flake8 ; extra == 'test' +Requires-Dist: pytest-perf >=0.9.2 ; extra == 'test' +Requires-Dist: jaraco.test >=5.4 ; extra == 'test' +Requires-Dist: importlib-resources >=1.3 ; (python_version < "3.9") and extra == 'test' .. image:: https://img.shields.io/pypi/v/importlib_metadata.svg :target: https://pypi.org/project/importlib_metadata @@ -51,14 +50,10 @@ Requires-Dist: importlib-resources >=1.3 ; (python_version < "3.9") and extra == :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 +.. image:: https://img.shields.io/badge/skeleton-2024-informational :target: https://blog.jaraco.com/skeleton .. image:: https://tidelift.com/badges/package/pypi/importlib-metadata diff --git a/libs/importlib_metadata-7.2.1.dist-info/RECORD b/libs/importlib_metadata-7.2.1.dist-info/RECORD new file mode 100644 index 000000000..7f1c16f51 --- /dev/null +++ b/libs/importlib_metadata-7.2.1.dist-info/RECORD @@ -0,0 +1,20 @@ +importlib_metadata-7.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_metadata-7.2.1.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_metadata-7.2.1.dist-info/METADATA,sha256=hEvctiPIb3ke8xTdUeHrdh7Hwa4T-nC_ugLZyvSFLB0,4648 +importlib_metadata-7.2.1.dist-info/RECORD,, +importlib_metadata-7.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_metadata-7.2.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +importlib_metadata-7.2.1.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19 +importlib_metadata/__init__.py,sha256=tIqhoBxCohAGl-SpQsRoRiUo4rP_tt5vl5bgP0k_v80,34411 +importlib_metadata/_adapters.py,sha256=jZr_CmHrl8qTGatO0yMmuOdfFExOY64G8eEYf6Cnj9k,2455 +importlib_metadata/_collections.py,sha256=CJ0OTCHIjWA0ZIVS4voORAsn2R4R2cQBEtPsZEJpASY,743 +importlib_metadata/_compat.py,sha256=73QKrN9KNoaZzhbX5yPCCZa-FaALwXe8TPlDR72JgBU,1314 +importlib_metadata/_functools.py,sha256=PsY2-4rrKX4RVeRC1oGp1lB1pmC9eKN88_f-bD9uOoA,2895 +importlib_metadata/_itertools.py,sha256=cvr_2v8BRbxcIl5x5ldfqdHjhI8Yi8s8yk50G_nm6jQ,2068 +importlib_metadata/_meta.py,sha256=nxZ7C8GVlcBFAKWyVOn_dn7ot_twBcbm1NmvjIetBHI,1801 +importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166 +importlib_metadata/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_metadata/compat/py311.py,sha256=uqm-K-uohyj1042TH4a9Er_I5o7667DvulcD-gC_fSA,608 +importlib_metadata/compat/py39.py,sha256=cPkMv6-0ilK-0Jw_Tkn0xYbOKJZc4WJKQHow0c2T44w,1102 +importlib_metadata/diagnose.py,sha256=nkSRMiowlmkhLYhKhvCg9glmt_11Cox-EmLzEbqYTa8,379 +importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/idna-3.6.dist-info/REQUESTED b/libs/importlib_metadata-7.2.1.dist-info/REQUESTED similarity index 100% rename from libs/idna-3.6.dist-info/REQUESTED rename to libs/importlib_metadata-7.2.1.dist-info/REQUESTED diff --git a/libs/importlib_metadata-7.2.1.dist-info/WHEEL b/libs/importlib_metadata-7.2.1.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/importlib_metadata-7.2.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/importlib_metadata-7.0.1.dist-info/top_level.txt b/libs/importlib_metadata-7.2.1.dist-info/top_level.txt similarity index 100% rename from libs/importlib_metadata-7.0.1.dist-info/top_level.txt rename to libs/importlib_metadata-7.2.1.dist-info/top_level.txt diff --git a/libs/importlib_metadata/__init__.py b/libs/importlib_metadata/__init__.py index 0ce535a1f..eab73ffe8 100644 --- a/libs/importlib_metadata/__init__.py +++ b/libs/importlib_metadata/__init__.py @@ -3,7 +3,6 @@ import os import re import abc -import csv import sys import json import zipp @@ -19,7 +18,8 @@ import posixpath import collections -from . import _adapters, _meta, _py39compat +from . import _meta +from .compat import py39, py311 from ._collections import FreezableDefaultDict, Pair from ._compat import ( NullFinder, @@ -33,7 +33,7 @@ from importlib import import_module from importlib.abc import MetaPathFinder from itertools import starmap -from typing import Iterable, List, Mapping, Optional, Set, cast +from typing import Any, Iterable, List, Mapping, Match, Optional, Set, cast __all__ = [ 'Distribution', @@ -170,17 +170,17 @@ class EntryPoint: value: str group: str - dist: Optional['Distribution'] = None + 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): + def load(self) -> Any: """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) + match = cast(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) @@ -275,12 +275,12 @@ def __repr__(self): """ return '%s(%r)' % (self.__class__.__name__, tuple(self)) - def select(self, **params): + def select(self, **params) -> EntryPoints: """ 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)) + return EntryPoints(ep for ep in self if py39.ep_matches(ep, **params)) @property def names(self) -> Set[str]: @@ -311,9 +311,9 @@ def _from_text(text): class PackagePath(pathlib.PurePosixPath): """A reference to a path in a package""" - hash: Optional["FileHash"] + hash: Optional[FileHash] size: int - dist: "Distribution" + dist: Distribution def read_text(self, encoding: str = 'utf-8') -> str: # type: ignore[override] return self.locate().read_text(encoding=encoding) @@ -360,7 +360,9 @@ class Distribution(DeprecatedNonAbstract): Custom providers may derive from this class and define the abstract methods to provide a concrete implementation - for their environment. + for their environment. Some providers may opt to override + the default implementation of some properties to bypass + the file-reading mechanism. """ @abc.abstractmethod @@ -374,11 +376,10 @@ def read_text(self, filename) -> Optional[str]: - METADATA: The distribution metadata including fields like Name and Version and Description. - - entry_points.txt: A series of entry points defined by - the Setuptools spec in an ini format with sections - representing the groups. - - RECORD: A record of files as installed by a typical - installer. + - entry_points.txt: A series of entry points as defined in + `the entry points spec `_. + - RECORD: A record of files according to + `this recording spec `_. A package may provide any set of files, including those not listed here or none at all. @@ -395,7 +396,7 @@ def locate_file(self, path: str | os.PathLike[str]) -> SimplePath: """ @classmethod - def from_name(cls, name: str) -> "Distribution": + 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. @@ -414,8 +415,8 @@ def from_name(cls, name: str) -> "Distribution": @classmethod def discover( - cls, *, context: Optional['DistributionFinder.Context'] = None, **kwargs - ) -> Iterable["Distribution"]: + cls, *, context: Optional[DistributionFinder.Context] = None, **kwargs + ) -> Iterable[Distribution]: """Return an iterable of Distribution objects for all packages. Pass a ``context`` or pass keyword arguments for constructing @@ -433,7 +434,7 @@ def discover( ) @staticmethod - def at(path: str | os.PathLike[str]) -> "Distribution": + def at(path: str | os.PathLike[str]) -> Distribution: """Return a Distribution for the indicated metadata path. :param path: a string or path-like object @@ -454,8 +455,15 @@ 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. + metadata per the + `Core metadata specifications `_. + + Custom providers may provide the METADATA file or override this + property. """ + # deferred for performance (python/cpython#109829) + from . import _adapters + opt_text = ( self.read_text('METADATA') or self.read_text('PKG-INFO') @@ -484,6 +492,12 @@ def version(self) -> str: @property def entry_points(self) -> EntryPoints: + """ + Return EntryPoints for this distribution. + + Custom providers may provide the ``entry_points.txt`` file + or override this property. + """ return EntryPoints._from_text_for(self.read_text('entry_points.txt'), self) @property @@ -496,6 +510,10 @@ def files(self) -> Optional[List[PackagePath]]: (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. + + Custom providers are recommended to provide a "RECORD" file (in + ``read_text``) or override this property to allow for callers to be + able to resolve filenames provided by the package. """ def make_file(name, hash=None, size_str=None): @@ -507,6 +525,10 @@ def make_file(name, hash=None, size_str=None): @pass_none def make_files(lines): + # Delay csv import, since Distribution.files is not as widely used + # as other parts of importlib.metadata + import csv + return starmap(make_file, csv.reader(lines)) @pass_none @@ -523,7 +545,7 @@ def skip_missing_files(package_paths): def _read_files_distinfo(self): """ - Read the lines of RECORD + Read the lines of RECORD. """ text = self.read_text('RECORD') return text and text.splitlines() @@ -548,9 +570,8 @@ def _read_files_egginfo_installed(self): return paths = ( - (subdir / name) - .resolve() - .relative_to(self.locate_file('').resolve()) + py311.relative_fix((subdir / name).resolve()) + .relative_to(self.locate_file('').resolve(), walk_up=True) .as_posix() for name in text.splitlines() ) @@ -637,6 +658,9 @@ def _load_json(self, filename): class DistributionFinder(MetaPathFinder): """ A MetaPathFinder capable of discovering installed distributions. + + Custom providers should implement this interface in order to + supply metadata. """ class Context: @@ -649,6 +673,17 @@ class Context: Each DistributionFinder may expect any parameters and should attempt to honor the canonical parameters defined below when appropriate. + + This mechanism gives a custom provider a means to + solicit additional details from the caller beyond + "name" and "path" when searching distributions. + For example, imagine a provider that exposes suites + of packages in either a "public" or "private" ``realm``. + A caller may wish to query only for distributions in + a particular realm and could call + ``distributions(realm="private")`` to signal to the + custom provider to only include distributions from that + realm. """ name = None @@ -684,11 +719,18 @@ def find_distributions(self, context=Context()) -> Iterable[Distribution]: class FastPath: """ - Micro-optimized class for searching a path for - children. + Micro-optimized class for searching a root for children. + + Root is a path on the file system that may contain metadata + directories either as natural directories or within a zip file. >>> FastPath('').children() ['...'] + + FastPath objects are cached and recycled for any given root. + + >>> FastPath('foobar') is FastPath('foobar') + True """ @functools.lru_cache() # type: ignore @@ -730,7 +772,19 @@ def lookup(self, mtime): class Lookup: + """ + A micro-optimized class for searching a (fast) path for metadata. + """ + def __init__(self, path: FastPath): + """ + Calculate all of the children representing metadata. + + From the children in the path, calculate early all of the + children that appear to represent metadata (infos) or legacy + metadata (eggs). + """ + base = os.path.basename(path.root).lower() base_is_egg = base.endswith(".egg") self.infos = FreezableDefaultDict(list) @@ -751,7 +805,10 @@ def __init__(self, path: FastPath): self.infos.freeze() self.eggs.freeze() - def search(self, prepared): + def search(self, prepared: Prepared): + """ + Yield all infos and eggs matching the Prepared query. + """ infos = ( self.infos[prepared.normalized] if prepared @@ -767,13 +824,28 @@ def search(self, prepared): class Prepared: """ - A prepared search for metadata on a possibly-named package. + A prepared search query for metadata on a possibly-named package. + + Pre-calculates the normalization to prevent repeated operations. + + >>> none = Prepared(None) + >>> none.normalized + >>> none.legacy_normalized + >>> bool(none) + False + >>> sample = Prepared('Sample__Pkg-name.foo') + >>> sample.normalized + 'sample_pkg_name_foo' + >>> sample.legacy_normalized + 'sample__pkg_name.foo' + >>> bool(sample) + True """ normalized = None legacy_normalized = None - def __init__(self, name): + def __init__(self, name: Optional[str]): self.name = name if name is None: return @@ -807,9 +879,10 @@ class MetadataPathFinder(NullFinder, DistributionFinder): of Python that do not have a PathFinder find_distributions(). """ + @classmethod def find_distributions( - self, context=DistributionFinder.Context() - ) -> Iterable["PathDistribution"]: + cls, context=DistributionFinder.Context() + ) -> Iterable[PathDistribution]: """ Find distributions. @@ -818,7 +891,7 @@ def find_distributions( (or all names if ``None`` indicated) along the paths in the list of directories ``context.path``. """ - found = self._search_paths(context.name, context.path) + found = cls._search_paths(context.name, context.path) return map(PathDistribution, found) @classmethod @@ -829,6 +902,7 @@ def _search_paths(cls, name, paths): path.search(prepared) for path in map(FastPath, paths) ) + @classmethod def invalidate_caches(cls) -> None: FastPath.__new__.cache_clear() @@ -926,7 +1000,7 @@ def version(distribution_name: str) -> str: _unique = functools.partial( unique_everseen, - key=_py39compat.normalized_name, + key=py39.normalized_name, ) """ Wrapper for ``distributions`` to return unique distributions by name. diff --git a/libs/importlib_metadata/_meta.py b/libs/importlib_metadata/_meta.py index 1342d839b..1927d0f62 100644 --- a/libs/importlib_metadata/_meta.py +++ b/libs/importlib_metadata/_meta.py @@ -9,30 +9,27 @@ class PackageMetadata(Protocol): - def __len__(self) -> int: - ... # pragma: no cover + def __len__(self) -> int: ... # pragma: no cover - def __contains__(self, item: str) -> bool: - ... # pragma: no cover + def __contains__(self, item: str) -> bool: ... # pragma: no cover - def __getitem__(self, key: str) -> str: - ... # pragma: no cover + def __getitem__(self, key: str) -> str: ... # pragma: no cover - def __iter__(self) -> Iterator[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 + 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 + 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 + 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]: @@ -52,21 +49,19 @@ class SimplePath(Protocol): A minimal subset of pathlib.Path required by Distribution. """ - def joinpath(self, other: Union[str, os.PathLike[str]]) -> SimplePath: - ... # pragma: no cover + def joinpath( + self, other: Union[str, os.PathLike[str]] + ) -> SimplePath: ... # pragma: no cover - def __truediv__(self, other: Union[str, os.PathLike[str]]) -> SimplePath: - ... # pragma: no cover + def __truediv__( + self, other: Union[str, os.PathLike[str]] + ) -> SimplePath: ... # pragma: no cover @property - def parent(self) -> SimplePath: - ... # pragma: no cover + def parent(self) -> SimplePath: ... # pragma: no cover - def read_text(self, encoding=None) -> str: - ... # pragma: no cover + def read_text(self, encoding=None) -> str: ... # pragma: no cover - def read_bytes(self) -> bytes: - ... # pragma: no cover + def read_bytes(self) -> bytes: ... # pragma: no cover - def exists(self) -> bool: - ... # pragma: no cover + def exists(self) -> bool: ... # pragma: no cover diff --git a/libs/importlib_resources/tests/data01/__init__.py b/libs/importlib_metadata/compat/__init__.py similarity index 100% rename from libs/importlib_resources/tests/data01/__init__.py rename to libs/importlib_metadata/compat/__init__.py diff --git a/libs/importlib_metadata/compat/py311.py b/libs/importlib_metadata/compat/py311.py new file mode 100644 index 000000000..3a5327436 --- /dev/null +++ b/libs/importlib_metadata/compat/py311.py @@ -0,0 +1,22 @@ +import os +import pathlib +import sys +import types + + +def wrap(path): # pragma: no cover + """ + Workaround for https://github.com/python/cpython/issues/84538 + to add backward compatibility for walk_up=True. + An example affected package is dask-labextension, which uses + jupyter-packaging to install JupyterLab javascript files outside + of site-packages. + """ + + def relative_to(root, *, walk_up=False): + return pathlib.Path(os.path.relpath(path, root)) + + return types.SimpleNamespace(relative_to=relative_to) + + +relative_fix = wrap if sys.version_info < (3, 12) else lambda x: x diff --git a/libs/importlib_metadata/_py39compat.py b/libs/importlib_metadata/compat/py39.py similarity index 82% rename from libs/importlib_metadata/_py39compat.py rename to libs/importlib_metadata/compat/py39.py index cde4558fb..1f15bd97e 100644 --- a/libs/importlib_metadata/_py39compat.py +++ b/libs/importlib_metadata/compat/py39.py @@ -1,11 +1,12 @@ """ 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 + from .. import Distribution, EntryPoint else: Distribution = EntryPoint = Any @@ -17,7 +18,7 @@ def normalized_name(dist: Distribution) -> Optional[str]: try: return dist._normalized_name except AttributeError: - from . import Prepared # -> delay to prevent circular imports. + from .. import Prepared # -> delay to prevent circular imports. return Prepared.normalize(getattr(dist, "name", None) or dist.metadata['Name']) @@ -29,7 +30,7 @@ def ep_matches(ep: EntryPoint, **params) -> bool: try: return ep.matches(**params) except AttributeError: - from . import EntryPoint # -> delay to prevent circular imports. + 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/libs/importlib_resources-6.1.2.dist-info/RECORD b/libs/importlib_resources-6.1.2.dist-info/RECORD deleted file mode 100644 index 0b3918bae..000000000 --- a/libs/importlib_resources-6.1.2.dist-info/RECORD +++ /dev/null @@ -1,50 +0,0 @@ -importlib_resources-6.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -importlib_resources-6.1.2.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 -importlib_resources-6.1.2.dist-info/METADATA,sha256=40TGqxYj6HL5HSbWcHoLR2lhonNI4JtCX-93I6S9Gr0,3890 -importlib_resources-6.1.2.dist-info/RECORD,, -importlib_resources-6.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources-6.1.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -importlib_resources-6.1.2.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20 -importlib_resources/__init__.py,sha256=t3v1sx-q_TzszzsOs3dqNOjqBQVbSB_KY-BjCvf65qQ,226 -importlib_resources/_adapters.py,sha256=vprJGbUeHbajX6XCuMP6J3lMrqCi-P_MTlziJUR7jfk,4482 -importlib_resources/_common.py,sha256=SmaJImwoyTHuAImUNQcXTgxCtI9fhaVmIqiogDx5x6E,5512 -importlib_resources/_itertools.py,sha256=eDisV6RqiNZOogLSXf6LOGHOYc79FGgPrKNLzFLmCrU,1277 -importlib_resources/abc.py,sha256=UKNU9ncEDkZRB3txcGb3WLxsL2iju9JbaLTI-dfLE_4,5162 -importlib_resources/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/compat/py38.py,sha256=MWhut3XsAJwBYUaa5Qb2AoCrZNqcQjVThP-P1uBoE_4,230 -importlib_resources/compat/py39.py,sha256=Wfln4uQUShNz1XdCG-toG6_Y0WrlUmO9JzpvtcfQ-Cw,184 -importlib_resources/future/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/future/adapters.py,sha256=Cz0dJUhgmeO4tcUwJFmSJ6gaTKGTglgzKPtZ2pip5ac,1429 -importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/readers.py,sha256=WNKurBHHVu9EVtUhWkOj2fxH50HP7uanNFuupAqH2S8,5863 -importlib_resources/simple.py,sha256=CQ3TiIMFiJs_80o-7xJL1EpbUUVna4-NGDrSTQ3HW2Y,2584 -importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/tests/_compat.py,sha256=YTSB0U1R9oADnh6GrQcOCgojxcF_N6H1LklymEWf9SQ,708 -importlib_resources/tests/_path.py,sha256=nkv3ek7D1U898v921rYbldDCtKri2oyYOi3EJqGjEGU,1289 -importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4 -importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/tests/data01/subdirectory/binary.file,sha256=xtRM9Bj2EOP-nh2SlP9D3vgcbNytbLsYIM_0jTqkNV0,4 -importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44 -importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20 -importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13 -importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt,sha256=jnrBBztxYrtQck7cmVnc4xQVO4-agzAZDGSFkAWtlFw,10 -importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13 -importlib_resources/tests/namespacedata01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4 -importlib_resources/tests/namespacedata01/subdirectory/binary.file,sha256=cbkhEL8TXIVYHIoSj2oZwPasp1KwxskeNXGJnPCbFF0,4 -importlib_resources/tests/namespacedata01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44 -importlib_resources/tests/namespacedata01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20 -importlib_resources/tests/test_compatibilty_files.py,sha256=95N_R7aik8cvnE6sBJpsxmP0K5plOWRIJDgbalD-Hpw,3314 -importlib_resources/tests/test_contents.py,sha256=70HW3mL_hv05Emv-OgdmwoLhXxjtuVxiWVaUpgRaRWA,930 -importlib_resources/tests/test_custom.py,sha256=HMS544nh3L0EdEung-JwoTV8sAzZo3IYNZ0B9AQveBI,1217 -importlib_resources/tests/test_files.py,sha256=Hhw2k19OyPp0GvmjLKZhO91Cu9swJ6JMBVgS2P6d00Q,3239 -importlib_resources/tests/test_open.py,sha256=ccmzbOeEa6zTd4ymZZ8yISrecfuYV0jhon-Vddqysu4,2778 -importlib_resources/tests/test_path.py,sha256=x8r2gJxG3hFM9xCOFNkgmHYXxsMldMLTSW_AZYf1l-A,2009 -importlib_resources/tests/test_read.py,sha256=7tsILQ2NoqVGFQxhHqxBwc5hWcN8b_3idojCsszTNfQ,3112 -importlib_resources/tests/test_reader.py,sha256=IcIUXaiPAtuahGV4_ZT4YXFLMMsJmcM1iOxqdIH2Aa4,5001 -importlib_resources/tests/test_resource.py,sha256=fcF8WgZ6rDCTRFnxtAUbdiaNe4G23yGovT1nb2dc7ls,7823 -importlib_resources/tests/util.py,sha256=ZJ9ouR8UOZRbgQ6_ZeXxXBvcjOlSVae4ckIMqzhyAZg,4784 -importlib_resources/tests/zip.py,sha256=2MKmF8-osXBJSnqcUTuAUek_-tSB3iKmIT9qPhcsOsM,783 diff --git a/libs/importlib_resources-6.1.2.dist-info/WHEEL b/libs/importlib_resources-6.1.2.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/importlib_resources-6.1.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/importlib_metadata-7.0.1.dist-info/INSTALLER b/libs/importlib_resources-6.4.5.dist-info/INSTALLER similarity index 100% rename from libs/importlib_metadata-7.0.1.dist-info/INSTALLER rename to libs/importlib_resources-6.4.5.dist-info/INSTALLER diff --git a/libs/importlib_resources-6.1.2.dist-info/LICENSE b/libs/importlib_resources-6.4.5.dist-info/LICENSE similarity index 100% rename from libs/importlib_resources-6.1.2.dist-info/LICENSE rename to libs/importlib_resources-6.4.5.dist-info/LICENSE diff --git a/libs/importlib_resources-6.1.2.dist-info/METADATA b/libs/importlib_resources-6.4.5.dist-info/METADATA similarity index 73% rename from libs/importlib_resources-6.1.2.dist-info/METADATA rename to libs/importlib_resources-6.4.5.dist-info/METADATA index ab2ecc7e8..1ee4166c1 100644 --- a/libs/importlib_resources-6.1.2.dist-info/METADATA +++ b/libs/importlib_resources-6.4.5.dist-info/METADATA @@ -1,35 +1,39 @@ Metadata-Version: 2.1 Name: importlib_resources -Version: 6.1.2 +Version: 6.4.5 Summary: Read resources from Python packages -Home-page: https://github.com/python/importlib_resources -Author: Barry Warsaw -Author-email: barry@python.org -Project-URL: Documentation, https://importlib-resources.readthedocs.io/ +Author-email: Barry Warsaw +Maintainer-email: "Jason R. Coombs" +Project-URL: Source, https://github.com/python/importlib_resources 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 +Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: zipp >=3.1.0 ; python_version < "3.10" -Provides-Extra: docs -Requires-Dist: sphinx >=3.5 ; extra == 'docs' -Requires-Dist: sphinx <7.2.5 ; extra == 'docs' -Requires-Dist: jaraco.packaging >=9.3 ; 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: 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 >=0.2.1 ; extra == 'testing' -Requires-Dist: zipp >=3.17 ; extra == 'testing' -Requires-Dist: pytest-mypy ; (platform_python_implementation != "PyPy") and extra == 'testing' +Provides-Extra: check +Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'check' +Requires-Dist: pytest-ruff >=0.2.1 ; (sys_platform != "cygwin") and extra == 'check' +Provides-Extra: cover +Requires-Dist: pytest-cov ; extra == 'cover' +Provides-Extra: doc +Requires-Dist: sphinx >=3.5 ; extra == 'doc' +Requires-Dist: jaraco.packaging >=9.3 ; extra == 'doc' +Requires-Dist: rst.linker >=1.9 ; extra == 'doc' +Requires-Dist: furo ; extra == 'doc' +Requires-Dist: sphinx-lint ; extra == 'doc' +Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'doc' +Provides-Extra: enabler +Requires-Dist: pytest-enabler >=2.2 ; extra == 'enabler' +Provides-Extra: test +Requires-Dist: pytest !=8.1.*,>=6 ; extra == 'test' +Requires-Dist: zipp >=3.17 ; extra == 'test' +Requires-Dist: jaraco.test >=5.4 ; extra == 'test' +Provides-Extra: type +Requires-Dist: pytest-mypy ; extra == 'type' .. image:: https://img.shields.io/pypi/v/importlib_resources.svg :target: https://pypi.org/project/importlib_resources diff --git a/libs/importlib_resources-6.4.5.dist-info/RECORD b/libs/importlib_resources-6.4.5.dist-info/RECORD new file mode 100644 index 000000000..cb14396a2 --- /dev/null +++ b/libs/importlib_resources-6.4.5.dist-info/RECORD @@ -0,0 +1,38 @@ +importlib_resources-6.4.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_resources-6.4.5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_resources-6.4.5.dist-info/METADATA,sha256=iwGfOzcc9jUBSuQa6zQeXla0el4YCZlAoj5uRIm7fyg,3975 +importlib_resources-6.4.5.dist-info/RECORD,, +importlib_resources-6.4.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources-6.4.5.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +importlib_resources-6.4.5.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20 +importlib_resources/__init__.py,sha256=3J-261Qqzg-1kBenMVsOsvJo19EbUmYqjHkrZWiFHOM,703 +importlib_resources/_adapters.py,sha256=vprJGbUeHbajX6XCuMP6J3lMrqCi-P_MTlziJUR7jfk,4482 +importlib_resources/_common.py,sha256=5PVT4ezn_Ptj7LIAebtLYquK7A6X4EYoQJM37yTBdbQ,5624 +importlib_resources/_functional.py,sha256=mLU4DwSlh8_2IXWqwKOfPVxyRqAEpB3B4XTfRxr3X3M,2651 +importlib_resources/_itertools.py,sha256=eDisV6RqiNZOogLSXf6LOGHOYc79FGgPrKNLzFLmCrU,1277 +importlib_resources/abc.py,sha256=UKNU9ncEDkZRB3txcGb3WLxsL2iju9JbaLTI-dfLE_4,5162 +importlib_resources/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/compat/py38.py,sha256=MWhut3XsAJwBYUaa5Qb2AoCrZNqcQjVThP-P1uBoE_4,230 +importlib_resources/compat/py39.py,sha256=KlP7QiD3NkoytWFjJgrJI33uRTw667vEDtkZWUtBDZM,152 +importlib_resources/future/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/future/adapters.py,sha256=1-MF2VRcCButhcC1OMfZILU9o3kwZ4nXB2lurXpaIAw,2940 +importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/readers.py,sha256=n9Rn8B5UHapkXGSfFhQNbdk_pfDCISPBLIXZnpoOKs8,6251 +importlib_resources/simple.py,sha256=wJm2qGZ9EMPFhRLiJBa9Em5tVKbD7Q8ibWtt4ZNgWBU,2590 +importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/_path.py,sha256=eqMTKkYA9Hc8_mzrVBN14HPuoc2HFNxuyTWqAo_2ZEM,2288 +importlib_resources/tests/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/compat/py312.py,sha256=qcWjpZhQo2oEsdwIlRRQHrsMGDltkFTnETeG7fLdUS8,364 +importlib_resources/tests/compat/py39.py,sha256=nOjut4CZDtRgZEblX9hWhupo9vli_CA1270_JwdQzRo,441 +importlib_resources/tests/test_compatibilty_files.py,sha256=95N_R7aik8cvnE6sBJpsxmP0K5plOWRIJDgbalD-Hpw,3314 +importlib_resources/tests/test_contents.py,sha256=EagRx9Mz7MOe1kRaOc9XNX_YlBYy90Qzhv2rqWMhMlw,837 +importlib_resources/tests/test_custom.py,sha256=QrHZqIWl0e-fsQRfm0ych8stOlKJOsAIU3rK6QOcyN0,1221 +importlib_resources/tests/test_files.py,sha256=4G4Wo4_2UJtpg9HrEKjRaXimM68lXKjkAmFY-9OLCyE,5796 +importlib_resources/tests/test_functional.py,sha256=DV8sdnwtpacNjHQ3ExifIoeQTCr4C-M-NVbaWewOcAo,8863 +importlib_resources/tests/test_open.py,sha256=eCDLP6SszzBK6vs5j6LDkuR0Y2rHXrTYNRVZsAFKnCQ,2681 +importlib_resources/tests/test_path.py,sha256=rz_BOqNzEu5ZRyrhAHOi9tvx3K_0AqHiRNkYT4QFhQw,1985 +importlib_resources/tests/test_read.py,sha256=oh0ZkCZ04N0DxPXgBLdadENwia4J0_sYt73uaH_I11g,3045 +importlib_resources/tests/test_reader.py,sha256=G62D2vkFjYSeFT6BFE-z_shUX8n7h80f089ojXCufBY,4655 +importlib_resources/tests/test_resource.py,sha256=ZxW6cIXJRwgvU7-wCc2jIRWV9M4pX4uznijN0vNfplM,7686 +importlib_resources/tests/util.py,sha256=CtY1uL-Xl71sw553ow2st6M5X710jf2jrhYAv6nhZ_Y,6065 +importlib_resources/tests/zip.py,sha256=nG9D6u_4nu67NrEUFfMt7vzba0qO_-QPyAAWc6W4gP4,577 diff --git a/libs/importlib_metadata-7.0.1.dist-info/REQUESTED b/libs/importlib_resources-6.4.5.dist-info/REQUESTED similarity index 100% rename from libs/importlib_metadata-7.0.1.dist-info/REQUESTED rename to libs/importlib_resources-6.4.5.dist-info/REQUESTED diff --git a/libs/importlib_resources-6.4.5.dist-info/WHEEL b/libs/importlib_resources-6.4.5.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/importlib_resources-6.4.5.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/importlib_resources-6.1.2.dist-info/top_level.txt b/libs/importlib_resources-6.4.5.dist-info/top_level.txt similarity index 100% rename from libs/importlib_resources-6.1.2.dist-info/top_level.txt rename to libs/importlib_resources-6.4.5.dist-info/top_level.txt diff --git a/libs/importlib_resources/__init__.py b/libs/importlib_resources/__init__.py index e6b60c18c..723c9f9eb 100644 --- a/libs/importlib_resources/__init__.py +++ b/libs/importlib_resources/__init__.py @@ -1,9 +1,27 @@ -"""Read resources contained within a package.""" +""" +Read resources contained within a package. + +This codebase is shared between importlib.resources in the stdlib +and importlib_resources in PyPI. See +https://github.com/python/importlib_metadata/wiki/Development-Methodology +for more detail. +""" from ._common import ( as_file, files, Package, + Anchor, +) + +from ._functional import ( + contents, + is_resource, + open_binary, + open_text, + path, + read_binary, + read_text, ) from .abc import ResourceReader @@ -11,7 +29,15 @@ __all__ = [ 'Package', + 'Anchor', 'ResourceReader', 'as_file', 'files', + 'contents', + 'is_resource', + 'open_binary', + 'open_text', + 'path', + 'read_binary', + 'read_text', ] diff --git a/libs/importlib_resources/_common.py b/libs/importlib_resources/_common.py index c9891359d..f065d493f 100644 --- a/libs/importlib_resources/_common.py +++ b/libs/importlib_resources/_common.py @@ -12,8 +12,6 @@ from typing import Union, Optional, cast from .abc import ResourceReader, Traversable -from .future.adapters import wrap_spec - Package = Union[types.ModuleType, str] Anchor = Package @@ -68,10 +66,10 @@ def get_resource_reader(package: types.ModuleType) -> Optional[ResourceReader]: # zipimport.zipimporter does not support weak references, resulting in a # TypeError. That seems terrible. spec = package.__spec__ - reader = getattr(spec.loader, 'get_resource_reader', None) # type: ignore + reader = getattr(spec.loader, 'get_resource_reader', None) # type: ignore[union-attr] if reader is None: return None - return reader(spec.name) # type: ignore + return reader(spec.name) # type: ignore[union-attr] @functools.singledispatch @@ -95,12 +93,13 @@ def _infer_caller(): """ def is_this_file(frame_info): - return frame_info.filename == __file__ + return frame_info.filename == stack[0].filename def is_wrapper(frame_info): return frame_info.function == 'wrapper' - not_this_file = itertools.filterfalse(is_this_file, inspect.stack()) + stack = inspect.stack() + not_this_file = itertools.filterfalse(is_this_file, stack) # also exclude 'wrapper' due to singledispatch in the call stack callers = itertools.filterfalse(is_wrapper, not_this_file) return next(callers).frame @@ -111,6 +110,9 @@ def from_package(package: types.ModuleType): Return a Traversable object for the given package. """ + # deferred for performance (python/cpython#109829) + from .future.adapters import wrap_spec + spec = wrap_spec(package) reader = spec.loader.get_resource_reader(spec.name) return reader.files() @@ -181,7 +183,7 @@ def _(path): @contextlib.contextmanager def _temp_path(dir: tempfile.TemporaryDirectory): """ - Wrap tempfile.TemporyDirectory to return a pathlib object. + Wrap tempfile.TemporaryDirectory to return a pathlib object. """ with dir as result: yield pathlib.Path(result) diff --git a/libs/importlib_resources/_functional.py b/libs/importlib_resources/_functional.py new file mode 100644 index 000000000..f59416f2d --- /dev/null +++ b/libs/importlib_resources/_functional.py @@ -0,0 +1,81 @@ +"""Simplified function-based API for importlib.resources""" + +import warnings + +from ._common import files, as_file + + +_MISSING = object() + + +def open_binary(anchor, *path_names): + """Open for binary reading the *resource* within *package*.""" + return _get_resource(anchor, path_names).open('rb') + + +def open_text(anchor, *path_names, encoding=_MISSING, errors='strict'): + """Open for text reading the *resource* within *package*.""" + encoding = _get_encoding_arg(path_names, encoding) + resource = _get_resource(anchor, path_names) + return resource.open('r', encoding=encoding, errors=errors) + + +def read_binary(anchor, *path_names): + """Read and return contents of *resource* within *package* as bytes.""" + return _get_resource(anchor, path_names).read_bytes() + + +def read_text(anchor, *path_names, encoding=_MISSING, errors='strict'): + """Read and return contents of *resource* within *package* as str.""" + encoding = _get_encoding_arg(path_names, encoding) + resource = _get_resource(anchor, path_names) + return resource.read_text(encoding=encoding, errors=errors) + + +def path(anchor, *path_names): + """Return the path to the *resource* as an actual file system path.""" + return as_file(_get_resource(anchor, path_names)) + + +def is_resource(anchor, *path_names): + """Return ``True`` if there is a resource named *name* in the package, + + Otherwise returns ``False``. + """ + return _get_resource(anchor, path_names).is_file() + + +def contents(anchor, *path_names): + """Return an iterable over the named resources within the package. + + The iterable returns :class:`str` resources (e.g. files). + The iterable does not recurse into subdirectories. + """ + warnings.warn( + "importlib.resources.contents is deprecated. " + "Use files(anchor).iterdir() instead.", + DeprecationWarning, + stacklevel=1, + ) + return (resource.name for resource in _get_resource(anchor, path_names).iterdir()) + + +def _get_encoding_arg(path_names, encoding): + # For compatibility with versions where *encoding* was a positional + # argument, it needs to be given explicitly when there are multiple + # *path_names*. + # This limitation can be removed in Python 3.15. + if encoding is _MISSING: + if len(path_names) > 1: + raise TypeError( + "'encoding' argument required with multiple path names", + ) + else: + return 'utf-8' + return encoding + + +def _get_resource(anchor, path_names): + if anchor is None: + raise TypeError("anchor must be module or string, got None") + return files(anchor).joinpath(*path_names) diff --git a/libs/importlib_resources/compat/py39.py b/libs/importlib_resources/compat/py39.py index ab87b9dc1..ed5abd5e5 100644 --- a/libs/importlib_resources/compat/py39.py +++ b/libs/importlib_resources/compat/py39.py @@ -5,6 +5,6 @@ if sys.version_info >= (3, 10): - from zipfile import Path as ZipPath # type: ignore + from zipfile import Path as ZipPath else: - from zipp import Path as ZipPath # type: ignore + from zipp import Path as ZipPath diff --git a/libs/importlib_resources/future/adapters.py b/libs/importlib_resources/future/adapters.py index 56dea7cfc..0e9764bae 100644 --- a/libs/importlib_resources/future/adapters.py +++ b/libs/importlib_resources/future/adapters.py @@ -1,3 +1,4 @@ +import functools import pathlib from contextlib import suppress from types import SimpleNamespace @@ -5,6 +6,50 @@ from .. import readers, _adapters +def _block_standard(reader_getter): + """ + Wrap _adapters.TraversableResourcesLoader.get_resource_reader + and intercept any standard library readers. + """ + + @functools.wraps(reader_getter) + def wrapper(*args, **kwargs): + """ + If the reader is from the standard library, return None to allow + allow likely newer implementations in this library to take precedence. + """ + try: + reader = reader_getter(*args, **kwargs) + except NotADirectoryError: + # MultiplexedPath may fail on zip subdirectory + return + # Python 3.10+ + mod_name = reader.__class__.__module__ + if mod_name.startswith('importlib.') and mod_name.endswith('readers'): + return + # Python 3.8, 3.9 + if isinstance(reader, _adapters.CompatibilityFiles) and ( + reader.spec.loader.__class__.__module__.startswith('zipimport') + or reader.spec.loader.__class__.__module__.startswith( + '_frozen_importlib_external' + ) + ): + return + return reader + + return wrapper + + +def _skip_degenerate(reader): + """ + Mask any degenerate reader. Ref #298. + """ + is_degenerate = ( + isinstance(reader, _adapters.CompatibilityFiles) and not reader._reader + ) + return reader if not is_degenerate else None + + class TraversableResourcesLoader(_adapters.TraversableResourcesLoader): """ Adapt loaders to provide TraversableResources and other @@ -15,7 +60,11 @@ class TraversableResourcesLoader(_adapters.TraversableResourcesLoader): """ def get_resource_reader(self, name): - return self._standard_reader() or super().get_resource_reader(name) + return ( + _skip_degenerate(_block_standard(super().get_resource_reader)(name)) + or self._standard_reader() + or super().get_resource_reader(name) + ) def _standard_reader(self): return self._zip_reader() or self._namespace_reader() or self._file_reader() diff --git a/libs/importlib_resources/readers.py b/libs/importlib_resources/readers.py index 4a80a774a..4f761c64b 100644 --- a/libs/importlib_resources/readers.py +++ b/libs/importlib_resources/readers.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import collections import contextlib import itertools @@ -5,6 +7,7 @@ import operator import re import warnings +from collections.abc import Iterator from . import abc @@ -34,8 +37,10 @@ def files(self): class ZipReader(abc.TraversableResources): def __init__(self, loader, module): - _, _, name = module.rpartition('.') - self.prefix = loader.prefix.replace('\\', '/') + name + '/' + self.prefix = loader.prefix.replace('\\', '/') + if loader.is_package(module): + _, _, name = module.rpartition('.') + self.prefix += name + '/' self.archive = loader.archive def open_resource(self, resource): @@ -133,27 +138,31 @@ class NamespaceReader(abc.TraversableResources): def __init__(self, namespace_path): if 'NamespacePath' not in str(namespace_path): raise ValueError('Invalid path') - self.path = MultiplexedPath(*map(self._resolve, namespace_path)) + self.path = MultiplexedPath(*filter(bool, map(self._resolve, namespace_path))) @classmethod - def _resolve(cls, path_str) -> abc.Traversable: + def _resolve(cls, path_str) -> abc.Traversable | None: r""" Given an item from a namespace path, resolve it to a Traversable. path_str might be a directory on the filesystem or a path to a zipfile plus the path within the zipfile, e.g. ``/foo/bar`` or ``/foo/baz.zip/inner_dir`` or ``foo\baz.zip\inner_dir\sub``. + + path_str might also be a sentinel used by editable packages to + trigger other behaviors (see python/importlib_resources#311). + In that case, return None. """ - (dir,) = (cand for cand in cls._candidate_paths(path_str) if cand.is_dir()) - return dir + dirs = (cand for cand in cls._candidate_paths(path_str) if cand.is_dir()) + return next(dirs, None) @classmethod - def _candidate_paths(cls, path_str): + def _candidate_paths(cls, path_str: str) -> Iterator[abc.Traversable]: yield pathlib.Path(path_str) yield from cls._resolve_zip_path(path_str) @staticmethod - def _resolve_zip_path(path_str): + def _resolve_zip_path(path_str: str): for match in reversed(list(re.finditer(r'[\\/]', path_str))): with contextlib.suppress( FileNotFoundError, diff --git a/libs/importlib_resources/simple.py b/libs/importlib_resources/simple.py index 96f117fec..2e75299b1 100644 --- a/libs/importlib_resources/simple.py +++ b/libs/importlib_resources/simple.py @@ -77,7 +77,7 @@ class ResourceHandle(Traversable): def __init__(self, parent: ResourceContainer, name: str): self.parent = parent - self.name = name # type: ignore + self.name = name # type: ignore[misc] def is_file(self): return True diff --git a/libs/importlib_resources/tests/_compat.py b/libs/importlib_resources/tests/_compat.py deleted file mode 100644 index e7bf06dd4..000000000 --- a/libs/importlib_resources/tests/_compat.py +++ /dev/null @@ -1,32 +0,0 @@ -import os - - -try: - from test.support import import_helper # type: ignore -except ImportError: - # Python 3.9 and earlier - class import_helper: # type: ignore - from test.support import ( - modules_setup, - modules_cleanup, - DirsOnSysPath, - CleanImport, - ) - - -try: - from test.support import os_helper # type: ignore -except ImportError: - # Python 3.9 compat - class os_helper: # type:ignore - from test.support import temp_dir - - -try: - # Python 3.10 - from test.support.os_helper import unlink -except ImportError: - from test.support import unlink as _unlink - - def unlink(target): - return _unlink(os.fspath(target)) diff --git a/libs/importlib_resources/tests/_path.py b/libs/importlib_resources/tests/_path.py index 1f97c9614..b144628cb 100644 --- a/libs/importlib_resources/tests/_path.py +++ b/libs/importlib_resources/tests/_path.py @@ -2,15 +2,44 @@ import functools from typing import Dict, Union +from typing import runtime_checkable +from typing import Protocol #### -# from jaraco.path 3.4.1 +# from jaraco.path 3.7.1 -FilesSpec = Dict[str, Union[str, bytes, 'FilesSpec']] # type: ignore +class Symlink(str): + """ + A string indicating the target of a symlink. + """ + + +FilesSpec = Dict[str, Union[str, bytes, Symlink, 'FilesSpec']] + + +@runtime_checkable +class TreeMaker(Protocol): + def __truediv__(self, *args, **kwargs): ... # pragma: no cover + + def mkdir(self, **kwargs): ... # pragma: no cover + + def write_text(self, content, **kwargs): ... # pragma: no cover + + def write_bytes(self, content): ... # pragma: no cover -def build(spec: FilesSpec, prefix=pathlib.Path()): + def symlink_to(self, target): ... # pragma: no cover + + +def _ensure_tree_maker(obj: Union[str, TreeMaker]) -> TreeMaker: + return obj if isinstance(obj, TreeMaker) else pathlib.Path(obj) # type: ignore[return-value] + + +def build( + spec: FilesSpec, + prefix: Union[str, TreeMaker] = pathlib.Path(), # type: ignore[assignment] +): """ Build a set of files/directories, as described by the spec. @@ -25,21 +54,25 @@ def build(spec: FilesSpec, prefix=pathlib.Path()): ... "__init__.py": "", ... }, ... "baz.py": "# Some code", - ... } + ... "bar.py": Symlink("baz.py"), + ... }, + ... "bing": Symlink("foo"), ... } >>> target = getfixture('tmp_path') >>> build(spec, target) >>> target.joinpath('foo/baz.py').read_text(encoding='utf-8') '# Some code' + >>> target.joinpath('bing/bar.py').read_text(encoding='utf-8') + '# Some code' """ for name, contents in spec.items(): - create(contents, pathlib.Path(prefix) / name) + create(contents, _ensure_tree_maker(prefix) / name) @functools.singledispatch def create(content: Union[str, bytes, FilesSpec], path): path.mkdir(exist_ok=True) - build(content, prefix=path) # type: ignore + build(content, prefix=path) # type: ignore[arg-type] @create.register @@ -52,5 +85,10 @@ def _(content: str, path): path.write_text(content, encoding='utf-8') +@create.register +def _(content: Symlink, path): + path.symlink_to(content) + + # end from jaraco.path #### diff --git a/libs/importlib_resources/tests/data01/subdirectory/__init__.py b/libs/importlib_resources/tests/compat/__init__.py similarity index 100% rename from libs/importlib_resources/tests/data01/subdirectory/__init__.py rename to libs/importlib_resources/tests/compat/__init__.py diff --git a/libs/importlib_resources/tests/compat/py312.py b/libs/importlib_resources/tests/compat/py312.py new file mode 100644 index 000000000..ea9a58ba2 --- /dev/null +++ b/libs/importlib_resources/tests/compat/py312.py @@ -0,0 +1,18 @@ +import contextlib + +from .py39 import import_helper + + +@contextlib.contextmanager +def isolated_modules(): + """ + Save modules on entry and cleanup on exit. + """ + (saved,) = import_helper.modules_setup() + try: + yield + finally: + import_helper.modules_cleanup(saved) + + +vars(import_helper).setdefault('isolated_modules', isolated_modules) diff --git a/libs/importlib_resources/tests/compat/py39.py b/libs/importlib_resources/tests/compat/py39.py new file mode 100644 index 000000000..e01d276bd --- /dev/null +++ b/libs/importlib_resources/tests/compat/py39.py @@ -0,0 +1,13 @@ +""" +Backward-compatability shims to support Python 3.9 and earlier. +""" + +from jaraco.test.cpython import from_test_support, try_import + +import_helper = try_import('import_helper') or from_test_support( + 'modules_setup', 'modules_cleanup', 'DirsOnSysPath' +) +os_helper = try_import('os_helper') or from_test_support('temp_dir') +warnings_helper = try_import('warnings_helper') or from_test_support( + 'ignore_warnings', 'check_warnings' +) diff --git a/libs/importlib_resources/tests/data01/binary.file b/libs/importlib_resources/tests/data01/binary.file deleted file mode 100644 index eaf36c1daccfdf325514461cd1a2ffbc139b5464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQzWMT#Y01f~L diff --git a/libs/importlib_resources/tests/data01/subdirectory/binary.file b/libs/importlib_resources/tests/data01/subdirectory/binary.file deleted file mode 100644 index 5bd8bb897..000000000 --- a/libs/importlib_resources/tests/data01/subdirectory/binary.file +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/libs/importlib_resources/tests/data01/utf-16.file b/libs/importlib_resources/tests/data01/utf-16.file deleted file mode 100644 index 2cb772295ef4b480a8d83725bd5006a0236d8f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 ucmezW&x0YAAqNQa8FUyF7(y9B7~B|i84MZBfV^^`Xc15@g+Y;liva-T)Ce>H diff --git a/libs/importlib_resources/tests/data01/utf-8.file b/libs/importlib_resources/tests/data01/utf-8.file deleted file mode 100644 index 1c0132ad9..000000000 --- a/libs/importlib_resources/tests/data01/utf-8.file +++ /dev/null @@ -1 +0,0 @@ -Hello, UTF-8 world! diff --git a/libs/importlib_resources/tests/data02/one/__init__.py b/libs/importlib_resources/tests/data02/one/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/libs/importlib_resources/tests/data02/one/resource1.txt b/libs/importlib_resources/tests/data02/one/resource1.txt deleted file mode 100644 index 61a813e40..000000000 --- a/libs/importlib_resources/tests/data02/one/resource1.txt +++ /dev/null @@ -1 +0,0 @@ -one resource diff --git a/libs/importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt b/libs/importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt deleted file mode 100644 index 48f587a2d..000000000 --- a/libs/importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt +++ /dev/null @@ -1 +0,0 @@ -a resource \ No newline at end of file diff --git a/libs/importlib_resources/tests/data02/two/__init__.py b/libs/importlib_resources/tests/data02/two/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/libs/importlib_resources/tests/data02/two/resource2.txt b/libs/importlib_resources/tests/data02/two/resource2.txt deleted file mode 100644 index a80ce46ea..000000000 --- a/libs/importlib_resources/tests/data02/two/resource2.txt +++ /dev/null @@ -1 +0,0 @@ -two resource diff --git a/libs/importlib_resources/tests/namespacedata01/binary.file b/libs/importlib_resources/tests/namespacedata01/binary.file deleted file mode 100644 index eaf36c1daccfdf325514461cd1a2ffbc139b5464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQzWMT#Y01f~L diff --git a/libs/importlib_resources/tests/namespacedata01/subdirectory/binary.file b/libs/importlib_resources/tests/namespacedata01/subdirectory/binary.file deleted file mode 100644 index 100f50643..000000000 --- a/libs/importlib_resources/tests/namespacedata01/subdirectory/binary.file +++ /dev/null @@ -1 +0,0 @@ -  \ No newline at end of file diff --git a/libs/importlib_resources/tests/namespacedata01/utf-16.file b/libs/importlib_resources/tests/namespacedata01/utf-16.file deleted file mode 100644 index 2cb772295ef4b480a8d83725bd5006a0236d8f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 ucmezW&x0YAAqNQa8FUyF7(y9B7~B|i84MZBfV^^`Xc15@g+Y;liva-T)Ce>H diff --git a/libs/importlib_resources/tests/namespacedata01/utf-8.file b/libs/importlib_resources/tests/namespacedata01/utf-8.file deleted file mode 100644 index 1c0132ad9..000000000 --- a/libs/importlib_resources/tests/namespacedata01/utf-8.file +++ /dev/null @@ -1 +0,0 @@ -Hello, UTF-8 world! diff --git a/libs/importlib_resources/tests/test_contents.py b/libs/importlib_resources/tests/test_contents.py index 7dc3b0a61..741a74076 100644 --- a/libs/importlib_resources/tests/test_contents.py +++ b/libs/importlib_resources/tests/test_contents.py @@ -1,7 +1,6 @@ import unittest import importlib_resources as resources -from . import data01 from . import util @@ -19,16 +18,17 @@ def test_contents(self): assert self.expected <= contents -class ContentsDiskTests(ContentsTests, unittest.TestCase): - def setUp(self): - self.data = data01 +class ContentsDiskTests(ContentsTests, util.DiskSetup, unittest.TestCase): + pass class ContentsZipTests(ContentsTests, util.ZipSetup, unittest.TestCase): pass -class ContentsNamespaceTests(ContentsTests, unittest.TestCase): +class ContentsNamespaceTests(ContentsTests, util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + expected = { # no __init__ because of namespace design 'binary.file', @@ -36,8 +36,3 @@ class ContentsNamespaceTests(ContentsTests, unittest.TestCase): 'utf-16.file', 'utf-8.file', } - - def setUp(self): - from . import namespacedata01 - - self.data = namespacedata01 diff --git a/libs/importlib_resources/tests/test_custom.py b/libs/importlib_resources/tests/test_custom.py index 35336f8fb..86c65676f 100644 --- a/libs/importlib_resources/tests/test_custom.py +++ b/libs/importlib_resources/tests/test_custom.py @@ -6,7 +6,7 @@ from .. import abc from ..abc import TraversableResources, ResourceReader from . import util -from ._compat import os_helper +from .compat.py39 import os_helper class SimpleLoader: diff --git a/libs/importlib_resources/tests/test_files.py b/libs/importlib_resources/tests/test_files.py index 51ecc8961..f1fe2337a 100644 --- a/libs/importlib_resources/tests/test_files.py +++ b/libs/importlib_resources/tests/test_files.py @@ -1,3 +1,7 @@ +import os +import pathlib +import py_compile +import shutil import textwrap import unittest import warnings @@ -6,10 +10,8 @@ import importlib_resources as resources from ..abc import Traversable -from . import data01 from . import util -from . import _path -from ._compat import os_helper, import_helper +from .compat.py39 import os_helper, import_helper @contextlib.contextmanager @@ -33,6 +35,11 @@ def test_read_text(self): def test_traversable(self): assert isinstance(resources.files(self.data), Traversable) + def test_joinpath_with_multiple_args(self): + files = resources.files(self.data) + binfile = files.joinpath('subdirectory', 'binary.file') + self.assertTrue(binfile.is_file()) + def test_old_parameter(self): """ Files used to take a 'package' parameter. Make sure anyone @@ -42,70 +49,146 @@ def test_old_parameter(self): resources.files(package=self.data) -class OpenDiskTests(FilesTests, unittest.TestCase): - def setUp(self): - self.data = data01 +class OpenDiskTests(FilesTests, util.DiskSetup, unittest.TestCase): + pass class OpenZipTests(FilesTests, util.ZipSetup, unittest.TestCase): pass -class OpenNamespaceTests(FilesTests, unittest.TestCase): - def setUp(self): - from . import namespacedata01 +class OpenNamespaceTests(FilesTests, util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + def test_non_paths_in_dunder_path(self): + """ + Non-path items in a namespace package's ``__path__`` are ignored. + + As reported in python/importlib_resources#311, some tools + like Setuptools, when creating editable packages, will inject + non-paths into a namespace package's ``__path__``, a + sentinel like + ``__editable__.sample_namespace-1.0.finder.__path_hook__`` + to cause the ``PathEntryFinder`` to be called when searching + for packages. In that case, resources should still be loadable. + """ + import namespacedata01 + + namespacedata01.__path__.append( + '__editable__.sample_namespace-1.0.finder.__path_hook__' + ) - self.data = namespacedata01 + resources.files(namespacedata01) class OpenNamespaceZipTests(FilesTests, util.ZipSetup, unittest.TestCase): ZIP_MODULE = 'namespacedata01' -class SiteDir: - def setUp(self): - self.fixtures = contextlib.ExitStack() - self.addCleanup(self.fixtures.close) - self.site_dir = self.fixtures.enter_context(os_helper.temp_dir()) - self.fixtures.enter_context(import_helper.DirsOnSysPath(self.site_dir)) - self.fixtures.enter_context(import_helper.CleanImport()) +class DirectSpec: + """ + Override behavior of ModuleSetup to write a full spec directly. + """ + + MODULE = 'unused' + + def load_fixture(self, name): + self.tree_on_path(self.spec) + +class ModulesFiles: + spec = { + 'mod.py': '', + 'res.txt': 'resources are the best', + } -class ModulesFilesTests(SiteDir, unittest.TestCase): def test_module_resources(self): """ A module can have resources found adjacent to the module. """ - spec = { - 'mod.py': '', - 'res.txt': 'resources are the best', - } - _path.build(spec, self.site_dir) - import mod + import mod # type: ignore[import-not-found] actual = resources.files(mod).joinpath('res.txt').read_text(encoding='utf-8') - assert actual == spec['res.txt'] + assert actual == self.spec['res.txt'] + +class ModuleFilesDiskTests(DirectSpec, util.DiskSetup, ModulesFiles, unittest.TestCase): + pass -class ImplicitContextFilesTests(SiteDir, unittest.TestCase): - def test_implicit_files(self): + +class ModuleFilesZipTests(DirectSpec, util.ZipSetup, ModulesFiles, unittest.TestCase): + pass + + +class ImplicitContextFiles: + set_val = textwrap.dedent( + f""" + import {resources.__name__} as res + val = res.files().joinpath('res.txt').read_text(encoding='utf-8') + """ + ) + spec = { + 'somepkg': { + '__init__.py': set_val, + 'submod.py': set_val, + 'res.txt': 'resources are the best', + }, + 'frozenpkg': { + '__init__.py': set_val.replace(resources.__name__, 'c_resources'), + 'res.txt': 'resources are the best', + }, + } + + def test_implicit_files_package(self): """ Without any parameter, files() will infer the location as the caller. """ - spec = { - 'somepkg': { - '__init__.py': textwrap.dedent( - """ - import importlib_resources as res - val = res.files().joinpath('res.txt').read_text(encoding='utf-8') - """ - ), - 'res.txt': 'resources are the best', - }, - } - _path.build(spec, self.site_dir) assert importlib.import_module('somepkg').val == 'resources are the best' + def test_implicit_files_submodule(self): + """ + Without any parameter, files() will infer the location as the caller. + """ + assert importlib.import_module('somepkg.submod').val == 'resources are the best' + + def _compile_importlib(self): + """ + Make a compiled-only copy of the importlib resources package. + """ + bin_site = self.fixtures.enter_context(os_helper.temp_dir()) + c_resources = pathlib.Path(bin_site, 'c_resources') + sources = pathlib.Path(resources.__file__).parent + shutil.copytree(sources, c_resources, ignore=lambda *_: ['__pycache__']) + + for dirpath, _, filenames in os.walk(c_resources): + for filename in filenames: + source_path = pathlib.Path(dirpath) / filename + cfile = source_path.with_suffix('.pyc') + py_compile.compile(source_path, cfile) + pathlib.Path.unlink(source_path) + self.fixtures.enter_context(import_helper.DirsOnSysPath(bin_site)) + + def test_implicit_files_with_compiled_importlib(self): + """ + Caller detection works for compiled-only resources module. + + python/cpython#123085 + """ + self._compile_importlib() + assert importlib.import_module('frozenpkg').val == 'resources are the best' + + +class ImplicitContextFilesDiskTests( + DirectSpec, util.DiskSetup, ImplicitContextFiles, unittest.TestCase +): + pass + + +class ImplicitContextFilesZipTests( + DirectSpec, util.ZipSetup, ImplicitContextFiles, unittest.TestCase +): + pass + if __name__ == '__main__': unittest.main() diff --git a/libs/importlib_resources/tests/test_functional.py b/libs/importlib_resources/tests/test_functional.py new file mode 100644 index 000000000..1851edfba --- /dev/null +++ b/libs/importlib_resources/tests/test_functional.py @@ -0,0 +1,255 @@ +import unittest +import os +import importlib + +from .compat.py39 import warnings_helper + +import importlib_resources as resources + +from . import util + +# Since the functional API forwards to Traversable, we only test +# filesystem resources here -- not zip files, namespace packages etc. +# We do test for two kinds of Anchor, though. + + +class StringAnchorMixin: + anchor01 = 'data01' + anchor02 = 'data02' + + +class ModuleAnchorMixin: + @property + def anchor01(self): + return importlib.import_module('data01') + + @property + def anchor02(self): + return importlib.import_module('data02') + + +class FunctionalAPIBase(util.DiskSetup): + def setUp(self): + super().setUp() + self.load_fixture('data02') + + def _gen_resourcetxt_path_parts(self): + """Yield various names of a text file in anchor02, each in a subTest""" + for path_parts in ( + ('subdirectory', 'subsubdir', 'resource.txt'), + ('subdirectory/subsubdir/resource.txt',), + ('subdirectory/subsubdir', 'resource.txt'), + ): + with self.subTest(path_parts=path_parts): + yield path_parts + + def assertEndsWith(self, string, suffix): + """Assert that `string` ends with `suffix`. + + Used to ignore an architecture-specific UTF-16 byte-order mark.""" + self.assertEqual(string[-len(suffix) :], suffix) + + def test_read_text(self): + self.assertEqual( + resources.read_text(self.anchor01, 'utf-8.file'), + 'Hello, UTF-8 world!\n', + ) + self.assertEqual( + resources.read_text( + self.anchor02, + 'subdirectory', + 'subsubdir', + 'resource.txt', + encoding='utf-8', + ), + 'a resource', + ) + for path_parts in self._gen_resourcetxt_path_parts(): + self.assertEqual( + resources.read_text( + self.anchor02, + *path_parts, + encoding='utf-8', + ), + 'a resource', + ) + # Use generic OSError, since e.g. attempting to read a directory can + # fail with PermissionError rather than IsADirectoryError + with self.assertRaises(OSError): + resources.read_text(self.anchor01) + with self.assertRaises(OSError): + resources.read_text(self.anchor01, 'no-such-file') + with self.assertRaises(UnicodeDecodeError): + resources.read_text(self.anchor01, 'utf-16.file') + self.assertEqual( + resources.read_text( + self.anchor01, + 'binary.file', + encoding='latin1', + ), + '\x00\x01\x02\x03', + ) + self.assertEndsWith( # ignore the BOM + resources.read_text( + self.anchor01, + 'utf-16.file', + errors='backslashreplace', + ), + 'Hello, UTF-16 world!\n'.encode('utf-16-le').decode( + errors='backslashreplace', + ), + ) + + def test_read_binary(self): + self.assertEqual( + resources.read_binary(self.anchor01, 'utf-8.file'), + b'Hello, UTF-8 world!\n', + ) + for path_parts in self._gen_resourcetxt_path_parts(): + self.assertEqual( + resources.read_binary(self.anchor02, *path_parts), + b'a resource', + ) + + def test_open_text(self): + with resources.open_text(self.anchor01, 'utf-8.file') as f: + self.assertEqual(f.read(), 'Hello, UTF-8 world!\n') + for path_parts in self._gen_resourcetxt_path_parts(): + with resources.open_text( + self.anchor02, + *path_parts, + encoding='utf-8', + ) as f: + self.assertEqual(f.read(), 'a resource') + # Use generic OSError, since e.g. attempting to read a directory can + # fail with PermissionError rather than IsADirectoryError + with self.assertRaises(OSError): + resources.open_text(self.anchor01) + with self.assertRaises(OSError): + resources.open_text(self.anchor01, 'no-such-file') + with resources.open_text(self.anchor01, 'utf-16.file') as f: + with self.assertRaises(UnicodeDecodeError): + f.read() + with resources.open_text( + self.anchor01, + 'binary.file', + encoding='latin1', + ) as f: + self.assertEqual(f.read(), '\x00\x01\x02\x03') + with resources.open_text( + self.anchor01, + 'utf-16.file', + errors='backslashreplace', + ) as f: + self.assertEndsWith( # ignore the BOM + f.read(), + 'Hello, UTF-16 world!\n'.encode('utf-16-le').decode( + errors='backslashreplace', + ), + ) + + def test_open_binary(self): + with resources.open_binary(self.anchor01, 'utf-8.file') as f: + self.assertEqual(f.read(), b'Hello, UTF-8 world!\n') + for path_parts in self._gen_resourcetxt_path_parts(): + with resources.open_binary( + self.anchor02, + *path_parts, + ) as f: + self.assertEqual(f.read(), b'a resource') + + def test_path(self): + with resources.path(self.anchor01, 'utf-8.file') as path: + with open(str(path), encoding='utf-8') as f: + self.assertEqual(f.read(), 'Hello, UTF-8 world!\n') + with resources.path(self.anchor01) as path: + with open(os.path.join(path, 'utf-8.file'), encoding='utf-8') as f: + self.assertEqual(f.read(), 'Hello, UTF-8 world!\n') + + def test_is_resource(self): + is_resource = resources.is_resource + self.assertTrue(is_resource(self.anchor01, 'utf-8.file')) + self.assertFalse(is_resource(self.anchor01, 'no_such_file')) + self.assertFalse(is_resource(self.anchor01)) + self.assertFalse(is_resource(self.anchor01, 'subdirectory')) + for path_parts in self._gen_resourcetxt_path_parts(): + self.assertTrue(is_resource(self.anchor02, *path_parts)) + + def test_contents(self): + with warnings_helper.check_warnings((".*contents.*", DeprecationWarning)): + c = resources.contents(self.anchor01) + self.assertGreaterEqual( + set(c), + {'utf-8.file', 'utf-16.file', 'binary.file', 'subdirectory'}, + ) + with self.assertRaises(OSError), warnings_helper.check_warnings(( + ".*contents.*", + DeprecationWarning, + )): + list(resources.contents(self.anchor01, 'utf-8.file')) + + for path_parts in self._gen_resourcetxt_path_parts(): + with self.assertRaises(OSError), warnings_helper.check_warnings(( + ".*contents.*", + DeprecationWarning, + )): + list(resources.contents(self.anchor01, *path_parts)) + with warnings_helper.check_warnings((".*contents.*", DeprecationWarning)): + c = resources.contents(self.anchor01, 'subdirectory') + self.assertGreaterEqual( + set(c), + {'binary.file'}, + ) + + @warnings_helper.ignore_warnings(category=DeprecationWarning) + def test_common_errors(self): + for func in ( + resources.read_text, + resources.read_binary, + resources.open_text, + resources.open_binary, + resources.path, + resources.is_resource, + resources.contents, + ): + with self.subTest(func=func): + # Rejecting None anchor + with self.assertRaises(TypeError): + func(None) + # Rejecting invalid anchor type + with self.assertRaises((TypeError, AttributeError)): + func(1234) + # Unknown module + with self.assertRaises(ModuleNotFoundError): + func('$missing module$') + + def test_text_errors(self): + for func in ( + resources.read_text, + resources.open_text, + ): + with self.subTest(func=func): + # Multiple path arguments need explicit encoding argument. + with self.assertRaises(TypeError): + func( + self.anchor02, + 'subdirectory', + 'subsubdir', + 'resource.txt', + ) + + +class FunctionalAPITest_StringAnchor( + StringAnchorMixin, + FunctionalAPIBase, + unittest.TestCase, +): + pass + + +class FunctionalAPITest_ModuleAnchor( + ModuleAnchorMixin, + FunctionalAPIBase, + unittest.TestCase, +): + pass diff --git a/libs/importlib_resources/tests/test_open.py b/libs/importlib_resources/tests/test_open.py index 44f1018af..c40bb8c6f 100644 --- a/libs/importlib_resources/tests/test_open.py +++ b/libs/importlib_resources/tests/test_open.py @@ -1,7 +1,6 @@ import unittest import importlib_resources as resources -from . import data01 from . import util @@ -65,16 +64,12 @@ def test_open_text_FileNotFoundError(self): target.open(encoding='utf-8') -class OpenDiskTests(OpenTests, unittest.TestCase): - def setUp(self): - self.data = data01 - +class OpenDiskTests(OpenTests, util.DiskSetup, unittest.TestCase): + pass -class OpenDiskNamespaceTests(OpenTests, unittest.TestCase): - def setUp(self): - from . import namespacedata01 - self.data = namespacedata01 +class OpenDiskNamespaceTests(OpenTests, util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' class OpenZipTests(OpenTests, util.ZipSetup, unittest.TestCase): @@ -82,7 +77,7 @@ class OpenZipTests(OpenTests, util.ZipSetup, unittest.TestCase): class OpenNamespaceZipTests(OpenTests, util.ZipSetup, unittest.TestCase): - ZIP_MODULE = 'namespacedata01' + MODULE = 'namespacedata01' if __name__ == '__main__': diff --git a/libs/importlib_resources/tests/test_path.py b/libs/importlib_resources/tests/test_path.py index c3e1cbb4e..1e30f2bc5 100644 --- a/libs/importlib_resources/tests/test_path.py +++ b/libs/importlib_resources/tests/test_path.py @@ -3,7 +3,6 @@ import unittest import importlib_resources as resources -from . import data01 from . import util @@ -25,9 +24,7 @@ def test_reading(self): self.assertEqual('Hello, UTF-8 world!\n', path.read_text(encoding='utf-8')) -class PathDiskTests(PathTests, unittest.TestCase): - data = data01 - +class PathDiskTests(PathTests, util.DiskSetup, unittest.TestCase): def test_natural_path(self): """ Guarantee the internal implementation detail that diff --git a/libs/importlib_resources/tests/test_read.py b/libs/importlib_resources/tests/test_read.py index 97d90128c..6780a2d16 100644 --- a/libs/importlib_resources/tests/test_read.py +++ b/libs/importlib_resources/tests/test_read.py @@ -1,7 +1,6 @@ import unittest import importlib_resources as resources -from . import data01 from . import util from importlib import import_module @@ -52,8 +51,8 @@ def test_read_text_with_errors(self): ) -class ReadDiskTests(ReadTests, unittest.TestCase): - data = data01 +class ReadDiskTests(ReadTests, util.DiskSetup, unittest.TestCase): + pass class ReadZipTests(ReadTests, util.ZipSetup, unittest.TestCase): @@ -69,15 +68,12 @@ def test_read_submodule_resource_by_name(self): self.assertEqual(result, bytes(range(4, 8))) -class ReadNamespaceTests(ReadTests, unittest.TestCase): - def setUp(self): - from . import namespacedata01 - - self.data = namespacedata01 +class ReadNamespaceTests(ReadTests, util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' class ReadNamespaceZipTests(ReadTests, util.ZipSetup, unittest.TestCase): - ZIP_MODULE = 'namespacedata01' + MODULE = 'namespacedata01' def test_read_submodule_resource(self): submodule = import_module('namespacedata01.subdirectory') diff --git a/libs/importlib_resources/tests/test_reader.py b/libs/importlib_resources/tests/test_reader.py index 95c2fc85a..0a77eb404 100644 --- a/libs/importlib_resources/tests/test_reader.py +++ b/libs/importlib_resources/tests/test_reader.py @@ -1,16 +1,21 @@ import os.path -import sys import pathlib import unittest from importlib import import_module from importlib_resources.readers import MultiplexedPath, NamespaceReader +from . import util -class MultiplexedPathTest(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.folder = pathlib.Path(__file__).parent / 'namespacedata01' + +class MultiplexedPathTest(util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + def setUp(self): + super().setUp() + self.folder = pathlib.Path(self.data.__path__[0]) + self.data01 = pathlib.Path(self.load_fixture('data01').__file__).parent + self.data02 = pathlib.Path(self.load_fixture('data02').__file__).parent def test_init_no_paths(self): with self.assertRaises(FileNotFoundError): @@ -31,9 +36,8 @@ def test_iterdir(self): ) def test_iterdir_duplicate(self): - data01 = pathlib.Path(__file__).parent.joinpath('data01') contents = { - path.name for path in MultiplexedPath(self.folder, data01).iterdir() + path.name for path in MultiplexedPath(self.folder, self.data01).iterdir() } for remove in ('__pycache__', '__init__.pyc'): try: @@ -61,9 +65,8 @@ def test_open_file(self): path.open() def test_join_path(self): - data01 = pathlib.Path(__file__).parent.joinpath('data01') - prefix = str(data01.parent) - path = MultiplexedPath(self.folder, data01) + prefix = str(self.folder.parent) + path = MultiplexedPath(self.folder, self.data01) self.assertEqual( str(path.joinpath('binary.file'))[len(prefix) + 1 :], os.path.join('namespacedata01', 'binary.file'), @@ -83,10 +86,8 @@ def test_join_path_compound(self): assert not path.joinpath('imaginary/foo.py').exists() def test_join_path_common_subdir(self): - data01 = pathlib.Path(__file__).parent.joinpath('data01') - data02 = pathlib.Path(__file__).parent.joinpath('data02') - prefix = str(data01.parent) - path = MultiplexedPath(data01, data02) + prefix = str(self.data02.parent) + path = MultiplexedPath(self.data01, self.data02) self.assertIsInstance(path.joinpath('subdirectory'), MultiplexedPath) self.assertEqual( str(path.joinpath('subdirectory', 'subsubdir'))[len(prefix) + 1 :], @@ -106,16 +107,8 @@ def test_name(self): ) -class NamespaceReaderTest(unittest.TestCase): - site_dir = str(pathlib.Path(__file__).parent) - - @classmethod - def setUpClass(cls): - sys.path.append(cls.site_dir) - - @classmethod - def tearDownClass(cls): - sys.path.remove(cls.site_dir) +class NamespaceReaderTest(util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' def test_init_error(self): with self.assertRaises(ValueError): @@ -125,7 +118,7 @@ def test_resource_path(self): namespacedata01 = import_module('namespacedata01') reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations) - root = os.path.abspath(os.path.join(__file__, '..', 'namespacedata01')) + root = self.data.__path__[0] self.assertEqual( reader.resource_path('binary.file'), os.path.join(root, 'binary.file') ) @@ -134,9 +127,8 @@ def test_resource_path(self): ) def test_files(self): - namespacedata01 = import_module('namespacedata01') - reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations) - root = os.path.abspath(os.path.join(__file__, '..', 'namespacedata01')) + reader = NamespaceReader(self.data.__spec__.submodule_search_locations) + root = self.data.__path__[0] self.assertIsInstance(reader.files(), MultiplexedPath) self.assertEqual(repr(reader.files()), f"MultiplexedPath('{root}')") diff --git a/libs/importlib_resources/tests/test_resource.py b/libs/importlib_resources/tests/test_resource.py index dc2a108cd..a0da6a356 100644 --- a/libs/importlib_resources/tests/test_resource.py +++ b/libs/importlib_resources/tests/test_resource.py @@ -1,9 +1,6 @@ -import sys import unittest import importlib_resources as resources -import pathlib -from . import data01 from . import util from importlib import import_module @@ -25,9 +22,8 @@ def test_is_dir(self): self.assertTrue(target.is_dir()) -class ResourceDiskTests(ResourceTests, unittest.TestCase): - def setUp(self): - self.data = data01 +class ResourceDiskTests(ResourceTests, util.DiskSetup, unittest.TestCase): + pass class ResourceZipTests(ResourceTests, util.ZipSetup, unittest.TestCase): @@ -38,33 +34,39 @@ def names(traversable): return {item.name for item in traversable.iterdir()} -class ResourceLoaderTests(unittest.TestCase): +class ResourceLoaderTests(util.DiskSetup, unittest.TestCase): def test_resource_contents(self): package = util.create_package( - file=data01, path=data01.__file__, contents=['A', 'B', 'C'] + file=self.data, path=self.data.__file__, contents=['A', 'B', 'C'] ) self.assertEqual(names(resources.files(package)), {'A', 'B', 'C'}) def test_is_file(self): package = util.create_package( - file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + file=self.data, + path=self.data.__file__, + contents=['A', 'B', 'C', 'D/E', 'D/F'], ) self.assertTrue(resources.files(package).joinpath('B').is_file()) def test_is_dir(self): package = util.create_package( - file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + file=self.data, + path=self.data.__file__, + contents=['A', 'B', 'C', 'D/E', 'D/F'], ) self.assertTrue(resources.files(package).joinpath('D').is_dir()) def test_resource_missing(self): package = util.create_package( - file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + file=self.data, + path=self.data.__file__, + contents=['A', 'B', 'C', 'D/E', 'D/F'], ) self.assertFalse(resources.files(package).joinpath('Z').is_file()) -class ResourceCornerCaseTests(unittest.TestCase): +class ResourceCornerCaseTests(util.DiskSetup, unittest.TestCase): def test_package_has_no_reader_fallback(self): """ Test odd ball packages which: @@ -73,7 +75,7 @@ def test_package_has_no_reader_fallback(self): # 3. Are not in a zip file """ module = util.create_package( - file=data01, path=data01.__file__, contents=['A', 'B', 'C'] + file=self.data, path=self.data.__file__, contents=['A', 'B', 'C'] ) # Give the module a dummy loader. module.__loader__ = object() @@ -84,9 +86,7 @@ def test_package_has_no_reader_fallback(self): self.assertFalse(resources.files(module).joinpath('A').is_file()) -class ResourceFromZipsTest01(util.ZipSetupBase, unittest.TestCase): - ZIP_MODULE = 'data01' - +class ResourceFromZipsTest01(util.ZipSetup, unittest.TestCase): def test_is_submodule_resource(self): submodule = import_module('data01.subdirectory') self.assertTrue(resources.files(submodule).joinpath('binary.file').is_file()) @@ -117,8 +117,8 @@ def test_as_file_directory(self): assert not data.parent.exists() -class ResourceFromZipsTest02(util.ZipSetupBase, unittest.TestCase): - ZIP_MODULE = 'data02' +class ResourceFromZipsTest02(util.ZipSetup, unittest.TestCase): + MODULE = 'data02' def test_unrelated_contents(self): """ @@ -135,7 +135,7 @@ def test_unrelated_contents(self): ) -class DeletingZipsTest(util.ZipSetupBase, unittest.TestCase): +class DeletingZipsTest(util.ZipSetup, unittest.TestCase): """Having accessed resources in a zip file should not keep an open reference to the zip. """ @@ -217,24 +217,20 @@ def test_submodule_sub_contents_by_name(self): self.assertEqual(contents, {'binary.file'}) -class ResourceFromNamespaceDiskTests(ResourceFromNamespaceTests, unittest.TestCase): - site_dir = str(pathlib.Path(__file__).parent) - - @classmethod - def setUpClass(cls): - sys.path.append(cls.site_dir) - - @classmethod - def tearDownClass(cls): - sys.path.remove(cls.site_dir) +class ResourceFromNamespaceDiskTests( + util.DiskSetup, + ResourceFromNamespaceTests, + unittest.TestCase, +): + MODULE = 'namespacedata01' class ResourceFromNamespaceZipTests( - util.ZipSetupBase, + util.ZipSetup, ResourceFromNamespaceTests, unittest.TestCase, ): - ZIP_MODULE = 'namespacedata01' + MODULE = 'namespacedata01' if __name__ == '__main__': diff --git a/libs/importlib_resources/tests/util.py b/libs/importlib_resources/tests/util.py index 066f41130..a4eafac3a 100644 --- a/libs/importlib_resources/tests/util.py +++ b/libs/importlib_resources/tests/util.py @@ -6,10 +6,10 @@ import pathlib import contextlib -from . import data01 from ..abc import ResourceReader -from ._compat import import_helper, os_helper +from .compat.py39 import import_helper, os_helper from . import zip as zip_ +from . import _path from importlib.machinery import ModuleSpec @@ -68,7 +68,7 @@ def create_package(file=None, path=None, is_package=True, contents=()): ) -class CommonTests(metaclass=abc.ABCMeta): +class CommonTestsBase(metaclass=abc.ABCMeta): """ Tests shared by test_open, test_path, and test_read. """ @@ -84,34 +84,34 @@ def test_package_name(self): """ Passing in the package name should succeed. """ - self.execute(data01.__name__, 'utf-8.file') + self.execute(self.data.__name__, 'utf-8.file') def test_package_object(self): """ Passing in the package itself should succeed. """ - self.execute(data01, 'utf-8.file') + self.execute(self.data, 'utf-8.file') def test_string_path(self): """ Passing in a string for the path should succeed. """ path = 'utf-8.file' - self.execute(data01, path) + self.execute(self.data, path) def test_pathlib_path(self): """ Passing in a pathlib.PurePath object for the path should succeed. """ path = pathlib.PurePath('utf-8.file') - self.execute(data01, path) + self.execute(self.data, path) def test_importing_module_as_side_effect(self): """ The anchor package can already be imported. """ - del sys.modules[data01.__name__] - self.execute(data01.__name__, 'utf-8.file') + del sys.modules[self.data.__name__] + self.execute(self.data.__name__, 'utf-8.file') def test_missing_path(self): """ @@ -141,25 +141,66 @@ def test_useless_loader(self): self.execute(package, 'utf-8.file') -class ZipSetupBase: - ZIP_MODULE = 'data01' - +fixtures = dict( + data01={ + '__init__.py': '', + 'binary.file': bytes(range(4)), + 'utf-16.file': 'Hello, UTF-16 world!\n'.encode('utf-16'), + 'utf-8.file': 'Hello, UTF-8 world!\n'.encode('utf-8'), + 'subdirectory': { + '__init__.py': '', + 'binary.file': bytes(range(4, 8)), + }, + }, + data02={ + '__init__.py': '', + 'one': {'__init__.py': '', 'resource1.txt': 'one resource'}, + 'two': {'__init__.py': '', 'resource2.txt': 'two resource'}, + 'subdirectory': {'subsubdir': {'resource.txt': 'a resource'}}, + }, + namespacedata01={ + 'binary.file': bytes(range(4)), + 'utf-16.file': 'Hello, UTF-16 world!\n'.encode('utf-16'), + 'utf-8.file': 'Hello, UTF-8 world!\n'.encode('utf-8'), + 'subdirectory': { + 'binary.file': bytes(range(12, 16)), + }, + }, +) + + +class ModuleSetup: def setUp(self): self.fixtures = contextlib.ExitStack() self.addCleanup(self.fixtures.close) - modules = import_helper.modules_setup() - self.addCleanup(import_helper.modules_cleanup, *modules) + self.fixtures.enter_context(import_helper.isolated_modules()) + self.data = self.load_fixture(self.MODULE) + + def load_fixture(self, module): + self.tree_on_path({module: fixtures[module]}) + return importlib.import_module(module) + + +class ZipSetup(ModuleSetup): + MODULE = 'data01' + def tree_on_path(self, spec): temp_dir = self.fixtures.enter_context(os_helper.temp_dir()) modules = pathlib.Path(temp_dir) / 'zipped modules.zip' - src_path = pathlib.Path(__file__).parent.joinpath(self.ZIP_MODULE) self.fixtures.enter_context( - import_helper.DirsOnSysPath(str(zip_.make_zip_file(src_path, modules))) + import_helper.DirsOnSysPath(str(zip_.make_zip_file(spec, modules))) ) - self.data = importlib.import_module(self.ZIP_MODULE) + +class DiskSetup(ModuleSetup): + MODULE = 'data01' + + def tree_on_path(self, spec): + temp_dir = self.fixtures.enter_context(os_helper.temp_dir()) + _path.build(spec, pathlib.Path(temp_dir)) + self.fixtures.enter_context(import_helper.DirsOnSysPath(temp_dir)) -class ZipSetup(ZipSetupBase): +class CommonTests(DiskSetup, CommonTestsBase): pass diff --git a/libs/importlib_resources/tests/zip.py b/libs/importlib_resources/tests/zip.py index 962195a90..51ee56487 100644 --- a/libs/importlib_resources/tests/zip.py +++ b/libs/importlib_resources/tests/zip.py @@ -2,31 +2,25 @@ Generate zip test data files. """ -import contextlib -import os -import pathlib import zipfile import zipp -def make_zip_file(src, dst): +def make_zip_file(tree, dst): """ - Zip the files in src into a new zipfile at dst. + Zip the files in tree into a new zipfile at dst. """ with zipfile.ZipFile(dst, 'w') as zf: - for src_path, rel in walk(src): - dst_name = src.name / pathlib.PurePosixPath(rel.as_posix()) - zf.write(src_path, dst_name) + for name, contents in walk(tree): + zf.writestr(name, contents) zipp.CompleteDirs.inject(zf) return dst -def walk(datapath): - for dirpath, dirnames, filenames in os.walk(datapath): - with contextlib.suppress(ValueError): - dirnames.remove('__pycache__') - for filename in filenames: - res = pathlib.Path(dirpath) / filename - rel = res.relative_to(datapath) - yield res, rel +def walk(tree, prefix=''): + for name, contents in tree.items(): + if isinstance(contents, dict): + yield from walk(contents, prefix=f'{prefix}{name}/') + else: + yield f'{prefix}{name}', contents diff --git a/libs/inflect-7.0.0.dist-info/RECORD b/libs/inflect-7.0.0.dist-info/RECORD deleted file mode 100644 index 162cbe744..000000000 --- a/libs/inflect-7.0.0.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -inflect-7.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -inflect-7.0.0.dist-info/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023 -inflect-7.0.0.dist-info/METADATA,sha256=8IoGgLa4FInqHNquqWJJmhw3unMmVk0yV3Wfue7DdJs,21470 -inflect-7.0.0.dist-info/RECORD,, -inflect-7.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -inflect-7.0.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -inflect-7.0.0.dist-info/top_level.txt,sha256=m52ujdp10CqT6jh1XQxZT6kEntcnv-7Tl7UiGNTzWZA,8 -inflect/__init__.py,sha256=5KHEEYdT98oCwaJ9TxWBkcyZhK5w3a35pOByPq-brLs,102919 -inflect/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -inflect/compat/pydantic.py,sha256=N4wBaVCqJD5XyX8g6uX68fqm3PpgPUwDiraC97V3Jgo,507 -inflect/compat/pydantic1.py,sha256=myfFPMj2-1ybEtzhmDxYGohW7DQZ9rDr-_KWOPOCQeE,204 -inflect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/inflect-7.0.0.dist-info/WHEEL b/libs/inflect-7.0.0.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/inflect-7.0.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/importlib_resources-6.1.2.dist-info/INSTALLER b/libs/inflect-7.4.0.dist-info/INSTALLER similarity index 100% rename from libs/importlib_resources-6.1.2.dist-info/INSTALLER rename to libs/inflect-7.4.0.dist-info/INSTALLER diff --git a/libs/inflect-7.0.0.dist-info/LICENSE b/libs/inflect-7.4.0.dist-info/LICENSE similarity index 100% rename from libs/inflect-7.0.0.dist-info/LICENSE rename to libs/inflect-7.4.0.dist-info/LICENSE diff --git a/libs/inflect-7.0.0.dist-info/METADATA b/libs/inflect-7.4.0.dist-info/METADATA similarity index 92% rename from libs/inflect-7.0.0.dist-info/METADATA rename to libs/inflect-7.4.0.dist-info/METADATA index 300ee6a25..00a7fcdd0 100644 --- a/libs/inflect-7.0.0.dist-info/METADATA +++ b/libs/inflect-7.4.0.dist-info/METADATA @@ -1,12 +1,11 @@ Metadata-Version: 2.1 Name: inflect -Version: 7.0.0 -Summary: Correctly generate plurals, singular nouns, ordinals, indefinite articles; convert numbers to words -Home-page: https://github.com/jaraco/inflect -Author: Paul Dyson -Author-email: pwdyson@yahoo.com -Maintainer: Jason R. Coombs -Maintainer-email: jaraco@jaraco.com +Version: 7.4.0 +Summary: Correctly generate plurals, singular nouns, ordinals, indefinite articles +Author-email: Paul Dyson +Maintainer-email: "Jason R. Coombs" +Project-URL: Source, https://github.com/jaraco/inflect +Keywords: plural,inflect,participle Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License @@ -17,32 +16,37 @@ Classifier: Operating System :: OS Independent Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Text Processing :: Linguistic Requires-Python: >=3.8 +Description-Content-Type: text/x-rst License-File: LICENSE -Requires-Dist: pydantic >=1.9.1 -Requires-Dist: typing-extensions -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: 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: pygments ; 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: more-itertools >=8.5.0 +Requires-Dist: typeguard >=4.0.1 +Requires-Dist: typing-extensions ; python_version < "3.9" +Provides-Extra: check +Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'check' +Requires-Dist: pytest-ruff >=0.2.1 ; (sys_platform != "cygwin") and extra == 'check' +Provides-Extra: cover +Requires-Dist: pytest-cov ; extra == 'cover' +Provides-Extra: doc +Requires-Dist: sphinx >=3.5 ; extra == 'doc' +Requires-Dist: jaraco.packaging >=9.3 ; extra == 'doc' +Requires-Dist: rst.linker >=1.9 ; extra == 'doc' +Requires-Dist: furo ; extra == 'doc' +Requires-Dist: sphinx-lint ; extra == 'doc' +Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'doc' +Provides-Extra: enabler +Requires-Dist: pytest-enabler >=2.2 ; extra == 'enabler' +Provides-Extra: test +Requires-Dist: pytest !=8.1.*,>=6 ; extra == 'test' +Requires-Dist: pygments ; extra == 'test' +Provides-Extra: type +Requires-Dist: pytest-mypy ; extra == 'type' .. image:: https://img.shields.io/pypi/v/inflect.svg :target: https://pypi.org/project/inflect .. image:: https://img.shields.io/pypi/pyversions/inflect.svg -.. image:: https://github.com/jaraco/inflect/workflows/tests/badge.svg +.. image:: https://github.com/jaraco/inflect/actions/workflows/main.yml/badge.svg :target: https://github.com/jaraco/inflect/actions?query=workflow%3A%22tests%22 :alt: tests @@ -50,14 +54,10 @@ Requires-Dist: pytest-mypy >=0.9.1 ; (platform_python_implementation != "PyPy") :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/inflect/badge/?version=latest :target: https://inflect.readthedocs.io/en/latest/?badge=latest -.. image:: https://img.shields.io/badge/skeleton-2023-informational +.. image:: https://img.shields.io/badge/skeleton-2024-informational :target: https://blog.jaraco.com/skeleton .. image:: https://tidelift.com/badges/package/pypi/inflect @@ -66,7 +66,7 @@ Requires-Dist: pytest-mypy >=0.9.1 ; (platform_python_implementation != "PyPy") NAME ==== -inflect.py - Correctly generate plurals, singular nouns, ordinals, indefinite articles; convert numbers to words. +inflect.py - Accurately generate plurals, singular nouns, ordinals, indefinite articles, and word-based representations of numbers. This functionality is limited to English. SYNOPSIS ======== @@ -593,10 +593,3 @@ 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/libs/inflect-7.4.0.dist-info/RECORD b/libs/inflect-7.4.0.dist-info/RECORD new file mode 100644 index 000000000..197ff1657 --- /dev/null +++ b/libs/inflect-7.4.0.dist-info/RECORD @@ -0,0 +1,11 @@ +inflect-7.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +inflect-7.4.0.dist-info/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023 +inflect-7.4.0.dist-info/METADATA,sha256=MV9Pl_30VbIbBxTU6A6sw-H9g6caHnyx2OYY2ZP0Spg,21265 +inflect-7.4.0.dist-info/RECORD,, +inflect-7.4.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +inflect-7.4.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +inflect-7.4.0.dist-info/top_level.txt,sha256=m52ujdp10CqT6jh1XQxZT6kEntcnv-7Tl7UiGNTzWZA,8 +inflect/__init__.py,sha256=BsJ4xVkg2TcttXL0zl43ZAR55IOmj54XSddEuxyD2bc,103635 +inflect/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +inflect/compat/py38.py,sha256=oObVfVnWX9_OpnOuEJn1mFbJxVhwyR5epbiTNXDDaso,160 +inflect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/importlib_resources-6.1.2.dist-info/REQUESTED b/libs/inflect-7.4.0.dist-info/REQUESTED similarity index 100% rename from libs/importlib_resources-6.1.2.dist-info/REQUESTED rename to libs/inflect-7.4.0.dist-info/REQUESTED diff --git a/libs/inflect-7.4.0.dist-info/WHEEL b/libs/inflect-7.4.0.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/inflect-7.4.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/inflect-7.0.0.dist-info/top_level.txt b/libs/inflect-7.4.0.dist-info/top_level.txt similarity index 100% rename from libs/inflect-7.0.0.dist-info/top_level.txt rename to libs/inflect-7.4.0.dist-info/top_level.txt diff --git a/libs/inflect/__init__.py b/libs/inflect/__init__.py index b638c6b8a..47a8e05fa 100644 --- a/libs/inflect/__init__.py +++ b/libs/inflect/__init__.py @@ -3,6 +3,8 @@ - correctly generate plurals, ordinals, indefinite articles - convert numbers to words +Copyright (C) 2010 Paul Dyson + Based upon the Perl module `Lingua::EN::Inflect `_. @@ -50,34 +52,35 @@ """ +from __future__ import annotations + import ast -import re -import functools import collections import contextlib +import functools +import itertools +import re +from numbers import Number from typing import ( + TYPE_CHECKING, + Any, + Callable, Dict, - Union, - Optional, Iterable, List, + Literal, Match, - Tuple, - Callable, + Optional, Sequence, + Tuple, + Union, cast, - Any, ) -from typing_extensions import Literal -from numbers import Number - -from pydantic import Field -from typing_extensions import Annotated +from more_itertools import windowed_complete +from typeguard import typechecked - -from .compat.pydantic1 import validate_call -from .compat.pydantic import same_method +from .compat.py38 import Annotated class UnknownClassicalModeError(Exception): @@ -258,9 +261,9 @@ def make_pl_si_lists( for k in list(si_sb_irregular_compound): if "|" in k: k1, k2 = k.split("|") - si_sb_irregular_compound[k1] = si_sb_irregular_compound[ - k2 - ] = si_sb_irregular_compound[k] + si_sb_irregular_compound[k1] = si_sb_irregular_compound[k2] = ( + si_sb_irregular_compound[k] + ) del si_sb_irregular_compound[k] # si_sb_irregular_keys = enclose('|'.join(si_sb_irregular.keys())) @@ -1597,7 +1600,7 @@ def make_pl_si_lists( pl_prep = enclose("|".join(pl_prep_list_da)) -pl_sb_prep_dual_compound = fr"(.*?)((?:-|\s+)(?:{pl_prep})(?:-|\s+))a(?:-|\s+)(.*)" +pl_sb_prep_dual_compound = rf"(.*?)((?:-|\s+)(?:{pl_prep})(?:-|\s+))a(?:-|\s+)(.*)" singular_pronoun_genders = { @@ -1659,43 +1662,69 @@ def make_pl_si_lists( si_pron["acc"] = {v: k for (k, v) in pl_pron_acc.items()} -for _thecase, _plur, _gend, _sing in ( - ("nom", "they", "neuter", "it"), - ("nom", "they", "feminine", "she"), - ("nom", "they", "masculine", "he"), - ("nom", "they", "gender-neutral", "they"), - ("nom", "they", "feminine or masculine", "she or he"), - ("nom", "they", "masculine or feminine", "he or she"), - ("nom", "themselves", "neuter", "itself"), - ("nom", "themselves", "feminine", "herself"), - ("nom", "themselves", "masculine", "himself"), - ("nom", "themselves", "gender-neutral", "themself"), - ("nom", "themselves", "feminine or masculine", "herself or himself"), - ("nom", "themselves", "masculine or feminine", "himself or herself"), - ("nom", "theirs", "neuter", "its"), - ("nom", "theirs", "feminine", "hers"), - ("nom", "theirs", "masculine", "his"), - ("nom", "theirs", "gender-neutral", "theirs"), - ("nom", "theirs", "feminine or masculine", "hers or his"), - ("nom", "theirs", "masculine or feminine", "his or hers"), - ("acc", "them", "neuter", "it"), - ("acc", "them", "feminine", "her"), - ("acc", "them", "masculine", "him"), - ("acc", "them", "gender-neutral", "them"), - ("acc", "them", "feminine or masculine", "her or him"), - ("acc", "them", "masculine or feminine", "him or her"), - ("acc", "themselves", "neuter", "itself"), - ("acc", "themselves", "feminine", "herself"), - ("acc", "themselves", "masculine", "himself"), - ("acc", "themselves", "gender-neutral", "themself"), - ("acc", "themselves", "feminine or masculine", "herself or himself"), - ("acc", "themselves", "masculine or feminine", "himself or herself"), +for _thecase, _plur, _gend_sing in ( + ( + "nom", + "they", + { + "neuter": "it", + "feminine": "she", + "masculine": "he", + "gender-neutral": "they", + "feminine or masculine": "she or he", + "masculine or feminine": "he or she", + }, + ), + ( + "nom", + "themselves", + { + "neuter": "itself", + "feminine": "herself", + "masculine": "himself", + "gender-neutral": "themself", + "feminine or masculine": "herself or himself", + "masculine or feminine": "himself or herself", + }, + ), + ( + "nom", + "theirs", + { + "neuter": "its", + "feminine": "hers", + "masculine": "his", + "gender-neutral": "theirs", + "feminine or masculine": "hers or his", + "masculine or feminine": "his or hers", + }, + ), + ( + "acc", + "them", + { + "neuter": "it", + "feminine": "her", + "masculine": "him", + "gender-neutral": "them", + "feminine or masculine": "her or him", + "masculine or feminine": "him or her", + }, + ), + ( + "acc", + "themselves", + { + "neuter": "itself", + "feminine": "herself", + "masculine": "himself", + "gender-neutral": "themself", + "feminine or masculine": "herself or himself", + "masculine or feminine": "himself or herself", + }, + ), ): - try: - si_pron[_thecase][_plur][_gend] = _sing # type: ignore - except TypeError: - si_pron[_thecase][_plur] = {} - si_pron[_thecase][_plur][_gend] = _sing # type: ignore + si_pron[_thecase][_plur] = _gend_sing si_pron_acc_keys = enclose("|".join(si_pron["acc"])) @@ -1764,7 +1793,7 @@ def get_si_pron(thecase, word, gender) -> str: } plverb_ambiguous_pres_keys = re.compile( - fr"^({enclose('|'.join(plverb_ambiguous_pres))})((\s.*)?)$", re.IGNORECASE + rf"^({enclose('|'.join(plverb_ambiguous_pres))})((\s.*)?)$", re.IGNORECASE ) @@ -1804,7 +1833,7 @@ def get_si_pron(thecase, word, gender) -> str: pl_adj_special = {"a": "some", "an": "some", "this": "these", "that": "those"} pl_adj_special_keys = re.compile( - fr"^({enclose('|'.join(pl_adj_special))})$", re.IGNORECASE + rf"^({enclose('|'.join(pl_adj_special))})$", re.IGNORECASE ) pl_adj_poss = { @@ -1816,7 +1845,7 @@ def get_si_pron(thecase, word, gender) -> str: "their": "their", } -pl_adj_poss_keys = re.compile(fr"^({enclose('|'.join(pl_adj_poss))})$", re.IGNORECASE) +pl_adj_poss_keys = re.compile(rf"^({enclose('|'.join(pl_adj_poss))})$", re.IGNORECASE) # 2. INDEFINITE ARTICLES @@ -1883,7 +1912,7 @@ def get_si_pron(thecase, word, gender) -> str: twelve="twelfth", ) -ordinal_suff = re.compile(fr"({'|'.join(ordinal)})\Z") +ordinal_suff = re.compile(rf"({'|'.join(ordinal)})\Z") # NUMBERS @@ -1948,16 +1977,16 @@ def get_si_pron(thecase, word, gender) -> str: FUNCTION_CALL = re.compile(r"((\w+)\([^)]*\)*)", re.IGNORECASE) PARTITION_WORD = re.compile(r"\A(\s*)(.+?)(\s*)\Z") PL_SB_POSTFIX_ADJ_STEMS_RE = re.compile( - fr"^(?:{pl_sb_postfix_adj_stems})$", re.IGNORECASE + rf"^(?:{pl_sb_postfix_adj_stems})$", re.IGNORECASE ) PL_SB_PREP_DUAL_COMPOUND_RE = re.compile( - fr"^(?:{pl_sb_prep_dual_compound})$", re.IGNORECASE + rf"^(?:{pl_sb_prep_dual_compound})$", re.IGNORECASE ) DENOMINATOR = re.compile(r"(?P.+)( (per|a) .+)") -PLVERB_SPECIAL_S_RE = re.compile(fr"^({plverb_special_s})$") +PLVERB_SPECIAL_S_RE = re.compile(rf"^({plverb_special_s})$") WHITESPACE = re.compile(r"\s") ENDS_WITH_S = re.compile(r"^(.*[^s])s$", re.IGNORECASE) -ENDS_WITH_APOSTROPHE_S = re.compile(r"^(.*)'s?$") +ENDS_WITH_APOSTROPHE_S = re.compile(r"^(.+)'s?$") INDEFINITE_ARTICLE_TEST = re.compile(r"\A(\s*)(?:an?\s+)?(.+?)(\s*)\Z", re.IGNORECASE) SPECIAL_AN = re.compile(r"^[aefhilmnorsx]$", re.IGNORECASE) SPECIAL_A = re.compile(r"^[bcdgjkpqtuvwyz]$", re.IGNORECASE) @@ -2020,10 +2049,25 @@ def __init__(self, orig) -> None: self.last = self.split_[-1] -Word = Annotated[str, Field(min_length=1)] Falsish = Any # ideally, falsish would only validate on bool(value) is False +_STATIC_TYPE_CHECKING = TYPE_CHECKING +# ^-- Workaround for typeguard AST manipulation: +# https://github.com/agronholm/typeguard/issues/353#issuecomment-1556306554 + +if _STATIC_TYPE_CHECKING: # pragma: no cover + Word = Annotated[str, "String with at least 1 character"] +else: + + class _WordMeta(type): # Too dynamic to be supported by mypy... + def __instancecheck__(self, instance: Any) -> bool: + return isinstance(instance, str) and len(instance) >= 1 + + class Word(metaclass=_WordMeta): # type: ignore[no-redef] + """String with at least 1 character""" + + class engine: def __init__(self) -> None: self.classical_dict = def_classical.copy() @@ -2045,7 +2089,7 @@ def _number_args(self): def _number_args(self, val): self.__number_args = val - @validate_call + @typechecked def defnoun(self, singular: Optional[Word], plural: Optional[Word]) -> int: """ Set the noun plural of singular to plural. @@ -2057,7 +2101,7 @@ def defnoun(self, singular: Optional[Word], plural: Optional[Word]) -> int: self.si_sb_user_defined.extend((plural, singular)) return 1 - @validate_call + @typechecked def defverb( self, s1: Optional[Word], @@ -2082,7 +2126,7 @@ def defverb( self.pl_v_user_defined.extend((s1, p1, s2, p2, s3, p3)) return 1 - @validate_call + @typechecked def defadj(self, singular: Optional[Word], plural: Optional[Word]) -> int: """ Set the adjective plural of singular to plural. @@ -2093,7 +2137,7 @@ def defadj(self, singular: Optional[Word], plural: Optional[Word]) -> int: self.pl_adj_user_defined.extend((singular, plural)) return 1 - @validate_call + @typechecked def defa(self, pattern: Optional[Word]) -> int: """ Define the indefinite article as 'a' for words matching pattern. @@ -2103,7 +2147,7 @@ def defa(self, pattern: Optional[Word]) -> int: self.A_a_user_defined.extend((pattern, "a")) return 1 - @validate_call + @typechecked def defan(self, pattern: Optional[Word]) -> int: """ Define the indefinite article as 'an' for words matching pattern. @@ -2121,8 +2165,8 @@ def checkpat(self, pattern: Optional[Word]) -> None: return try: re.match(pattern, "") - except re.error: - raise BadUserDefinedPatternError(pattern) + except re.error as err: + raise BadUserDefinedPatternError(pattern) from err def checkpatplural(self, pattern: Optional[Word]) -> None: """ @@ -2130,10 +2174,10 @@ def checkpatplural(self, pattern: Optional[Word]) -> None: """ return - @validate_call + @typechecked def ud_match(self, word: Word, wordlist: Sequence[Optional[Word]]) -> Optional[str]: for i in range(len(wordlist) - 2, -2, -2): # backwards through even elements - mo = re.search(fr"^{wordlist[i]}$", word, re.IGNORECASE) + mo = re.search(rf"^{wordlist[i]}$", word, re.IGNORECASE) if mo: if wordlist[i + 1] is None: return None @@ -2191,8 +2235,8 @@ def num( if count is not None: try: self.persistent_count = int(count) - except ValueError: - raise BadNumValueError + except ValueError as err: + raise BadNumValueError from err if (show is None) or show: return str(count) else: @@ -2270,7 +2314,7 @@ def _string_to_substitute( # 0. PERFORM GENERAL INFLECTIONS IN A STRING - @validate_call + @typechecked def inflect(self, text: Word) -> str: """ Perform inflections in a string. @@ -2347,7 +2391,7 @@ def partition_word(self, text: str) -> Tuple[str, str, str]: else: return "", "", "" - @validate_call + @typechecked def plural(self, text: Word, count: Optional[Union[str, int, Any]] = None) -> str: """ Return the plural of text. @@ -2371,7 +2415,7 @@ def plural(self, text: Word, count: Optional[Union[str, int, Any]] = None) -> st ) return f"{pre}{plural}{post}" - @validate_call + @typechecked def plural_noun( self, text: Word, count: Optional[Union[str, int, Any]] = None ) -> str: @@ -2392,7 +2436,7 @@ def plural_noun( plural = self.postprocess(word, self._plnoun(word, count)) return f"{pre}{plural}{post}" - @validate_call + @typechecked def plural_verb( self, text: Word, count: Optional[Union[str, int, Any]] = None ) -> str: @@ -2416,7 +2460,7 @@ def plural_verb( ) return f"{pre}{plural}{post}" - @validate_call + @typechecked def plural_adj( self, text: Word, count: Optional[Union[str, int, Any]] = None ) -> str: @@ -2437,7 +2481,7 @@ def plural_adj( plural = self.postprocess(word, self._pl_special_adjective(word, count) or word) return f"{pre}{plural}{post}" - @validate_call + @typechecked def compare(self, word1: Word, word2: Word) -> Union[str, bool]: """ compare word1 and word2 for equality regardless of plurality @@ -2460,15 +2504,13 @@ def compare(self, word1: Word, word2: Word) -> Union[str, bool]: >>> compare('egg', '') Traceback (most recent call last): ... - pydantic...ValidationError: ... - ... - ...at least 1 characters... + typeguard.TypeCheckError:...is not an instance of inflect.Word """ norms = self.plural_noun, self.plural_verb, self.plural_adj results = (self._plequal(word1, word2, norm) for norm in norms) return next(filter(None, results), False) - @validate_call + @typechecked def compare_nouns(self, word1: Word, word2: Word) -> Union[str, bool]: """ compare word1 and word2 for equality regardless of plurality @@ -2484,7 +2526,7 @@ def compare_nouns(self, word1: Word, word2: Word) -> Union[str, bool]: """ return self._plequal(word1, word2, self.plural_noun) - @validate_call + @typechecked def compare_verbs(self, word1: Word, word2: Word) -> Union[str, bool]: """ compare word1 and word2 for equality regardless of plurality @@ -2500,7 +2542,7 @@ def compare_verbs(self, word1: Word, word2: Word) -> Union[str, bool]: """ return self._plequal(word1, word2, self.plural_verb) - @validate_call + @typechecked def compare_adjs(self, word1: Word, word2: Word) -> Union[str, bool]: """ compare word1 and word2 for equality regardless of plurality @@ -2516,7 +2558,7 @@ def compare_adjs(self, word1: Word, word2: Word) -> Union[str, bool]: """ return self._plequal(word1, word2, self.plural_adj) - @validate_call + @typechecked def singular_noun( self, text: Word, @@ -2574,18 +2616,18 @@ def _plequal(self, word1: str, word2: str, pl) -> Union[str, bool]: # noqa: C90 return "s:p" self.classical_dict = classval.copy() - if same_method(pl, self.plural) or same_method(pl, self.plural_noun): + if pl == self.plural or pl == self.plural_noun: if self._pl_check_plurals_N(word1, word2): return "p:p" if self._pl_check_plurals_N(word2, word1): return "p:p" - if same_method(pl, self.plural) or same_method(pl, self.plural_adj): + if pl == self.plural or pl == self.plural_adj: if self._pl_check_plurals_adj(word1, word2): return "p:p" return False def _pl_reg_plurals(self, pair: str, stems: str, end1: str, end2: str) -> bool: - pattern = fr"({stems})({end1}\|\1{end2}|{end2}\|\1{end1})" + pattern = rf"({stems})({end1}\|\1{end2}|{end2}\|\1{end1})" return bool(re.search(pattern, pair)) def _pl_check_plurals_N(self, word1: str, word2: str) -> bool: @@ -2679,6 +2721,8 @@ def _plnoun( # noqa: C901 word = Words(word) if word.last.lower() in pl_sb_uninflected_complete: + if len(word.split_) >= 3: + return self._handle_long_compounds(word, count=2) or word return word if word in pl_sb_uninflected_caps: @@ -2707,13 +2751,9 @@ def _plnoun( # noqa: C901 ) if len(word.split_) >= 3: - for numword in range(1, len(word.split_) - 1): - if word.split_[numword] in pl_prep_list_da: - return " ".join( - word.split_[: numword - 1] - + [self._plnoun(word.split_[numword - 1], 2)] - + word.split_[numword:] - ) + handled_words = self._handle_long_compounds(word, count=2) + if handled_words is not None: + return handled_words # only pluralize denominators in units mo = DENOMINATOR.search(word.lowered) @@ -2972,6 +3012,30 @@ def _handle_prepositional_phrase(cls, phrase, transform, sep): parts[: pivot - 1] + [sep.join([transformed, parts[pivot], ''])] ) + " ".join(parts[(pivot + 1) :]) + def _handle_long_compounds(self, word: Words, count: int) -> Union[str, None]: + """ + Handles the plural and singular for compound `Words` that + have three or more words, based on the given count. + + >>> engine()._handle_long_compounds(Words("pair of scissors"), 2) + 'pairs of scissors' + >>> engine()._handle_long_compounds(Words("men beyond hills"), 1) + 'man beyond hills' + """ + inflection = self._sinoun if count == 1 else self._plnoun + solutions = ( + " ".join( + itertools.chain( + leader, + [inflection(cand, count), prep], # type: ignore[operator] + trailer, + ) + ) + for leader, (cand, prep), trailer in windowed_complete(word.split_, 2) + if prep in pl_prep_list_da + ) + return next(solutions, None) + @staticmethod def _find_pivot(words, candidates): pivots = ( @@ -2980,7 +3044,7 @@ def _find_pivot(words, candidates): try: return next(pivots) except StopIteration: - raise ValueError("No pivot found") + raise ValueError("No pivot found") from None def _pl_special_verb( # noqa: C901 self, word: str, count: Optional[Union[str, int]] = None @@ -3145,8 +3209,8 @@ def _sinoun( # noqa: C901 gender = self.thegender elif gender not in singular_pronoun_genders: raise BadGenderError - except (TypeError, IndexError): - raise BadGenderError + except (TypeError, IndexError) as err: + raise BadGenderError from err # HANDLE USER-DEFINED NOUNS @@ -3165,6 +3229,8 @@ def _sinoun( # noqa: C901 words = Words(word) if words.last.lower() in pl_sb_uninflected_complete: + if len(words.split_) >= 3: + return self._handle_long_compounds(words, count=1) or word return word if word in pl_sb_uninflected_caps: @@ -3450,7 +3516,7 @@ def _sinoun( # noqa: C901 # ADJECTIVES - @validate_call + @typechecked def a(self, text: Word, count: Optional[Union[int, str, Any]] = 1) -> str: """ Return the appropriate indefinite article followed by text. @@ -3531,7 +3597,7 @@ def _indef_article(self, word: str, count: Union[int, str, Any]) -> str: # 2. TRANSLATE ZERO-QUANTIFIED $word TO "no plural($word)" - @validate_call + @typechecked def no(self, text: Word, count: Optional[Union[int, str]] = None) -> str: """ If count is 0, no, zero or nil, return 'no' followed by the plural @@ -3569,7 +3635,7 @@ def no(self, text: Word, count: Optional[Union[int, str]] = None) -> str: # PARTICIPLES - @validate_call + @typechecked def present_participle(self, word: Word) -> str: """ Return the present participle for word. @@ -3588,7 +3654,7 @@ def present_participle(self, word: Word) -> str: # NUMERICAL INFLECTIONS - @validate_call(config=dict(arbitrary_types_allowed=True)) + @typechecked def ordinal(self, num: Union[Number, Word]) -> str: """ Return the ordinal of num. @@ -3609,26 +3675,18 @@ def ordinal(self, num: Union[Number, Word]) -> str: # so only need last one for ordinal n = int(str(num)[-1]) - except ValueError: # ends with '.', so need to use whole string + except ValueError: + # ends with '.', so need to use whole string n = int(str(num)[:-1]) else: - n = int(num) # type: ignore + n = int(num) # type: ignore[arg-type] try: post = nth[n % 100] except KeyError: post = nth[n % 10] return f"{num}{post}" else: - # Mad props to Damian Conway (?) whose ordinal() - # algorithm is type-bendy enough to foil MyPy - str_num: str = num # type: ignore[assignment] - mo = ordinal_suff.search(str_num) - if mo: - post = ordinal[mo.group(1)] - rval = ordinal_suff.sub(post, str_num) - else: - rval = f"{str_num}th" - return rval + return self._sub_ord(num) def millfn(self, ind: int = 0) -> str: if ind > len(mill) - 1: @@ -3747,7 +3805,36 @@ def enword(self, num: str, group: int) -> str: num = ONE_DIGIT_WORD.sub(self.unitsub, num, 1) return num - @validate_call(config=dict(arbitrary_types_allowed=True)) # noqa: C901 + @staticmethod + def _sub_ord(val): + new = ordinal_suff.sub(lambda match: ordinal[match.group(1)], val) + return new + "th" * (new == val) + + @classmethod + def _chunk_num(cls, num, decimal, group): + if decimal: + max_split = -1 if group != 0 else 1 + chunks = num.split(".", max_split) + else: + chunks = [num] + return cls._remove_last_blank(chunks) + + @staticmethod + def _remove_last_blank(chunks): + """ + Remove the last item from chunks if it's a blank string. + + Return the resultant chunks and whether the last item was removed. + """ + removed = chunks[-1] == "" + result = chunks[:-1] if removed else chunks + return result, removed + + @staticmethod + def _get_sign(num): + return {'+': 'plus', '-': 'minus'}.get(num.lstrip()[0], '') + + @typechecked def number_to_words( # noqa: C901 self, num: Union[Number, Word], @@ -3794,13 +3881,8 @@ def number_to_words( # noqa: C901 if group < 0 or group > 3: raise BadChunkingOptionError - nowhite = num.lstrip() - if nowhite[0] == "+": - sign = "plus" - elif nowhite[0] == "-": - sign = "minus" - else: - sign = "" + + sign = self._get_sign(num) if num in nth_suff: num = zero @@ -3808,34 +3890,21 @@ def number_to_words( # noqa: C901 myord = num[-2:] in nth_suff if myord: num = num[:-2] - finalpoint = False - if decimal: - if group != 0: - chunks = num.split(".") - else: - chunks = num.split(".", 1) - if chunks[-1] == "": # remove blank string if nothing after decimal - chunks = chunks[:-1] - finalpoint = True # add 'point' to end of output - else: - chunks = [num] - first: Union[int, str, bool] = 1 - loopstart = 0 + chunks, finalpoint = self._chunk_num(num, decimal, group) - if chunks[0] == "": - first = 0 - if len(chunks) > 1: - loopstart = 1 + loopstart = chunks[0] == "" + first: bool | None = not loopstart + + def _handle_chunk(chunk): + nonlocal first - for i in range(loopstart, len(chunks)): - chunk = chunks[i] # remove all non numeric \D chunk = NON_DIGIT.sub("", chunk) if chunk == "": chunk = "0" - if group == 0 and (first == 0 or first == ""): + if group == 0 and not first: chunk = self.enword(chunk, 1) else: chunk = self.enword(chunk, group) @@ -3850,20 +3919,17 @@ def number_to_words( # noqa: C901 # chunk = re.sub(r"(\A\s|\s\Z)", self.blankfn, chunk) chunk = chunk.strip() if first: - first = "" - chunks[i] = chunk + first = None + return chunk + + chunks[loopstart:] = map(_handle_chunk, chunks[loopstart:]) numchunks = [] if first != 0: numchunks = chunks[0].split(f"{comma} ") if myord and numchunks: - # TODO: can this be just one re as it is in perl? - mo = ordinal_suff.search(numchunks[-1]) - if mo: - numchunks[-1] = ordinal_suff.sub(ordinal[mo.group(1)], numchunks[-1]) - else: - numchunks[-1] += "th" + numchunks[-1] = self._sub_ord(numchunks[-1]) for chunk in chunks[1:]: numchunks.append(decimal) @@ -3872,34 +3938,30 @@ def number_to_words( # noqa: C901 if finalpoint: numchunks.append(decimal) - # wantlist: Perl list context. can explicitly specify in Python if wantlist: - if sign: - numchunks = [sign] + numchunks - return numchunks - elif group: - signout = f"{sign} " if sign else "" - return f"{signout}{', '.join(numchunks)}" - else: - signout = f"{sign} " if sign else "" - num = f"{signout}{numchunks.pop(0)}" - if decimal is None: - first = True - else: - first = not num.endswith(decimal) - for nc in numchunks: - if nc == decimal: - num += f" {nc}" - first = 0 - elif first: - num += f"{comma} {nc}" - else: - num += f" {nc}" - return num + return [sign] * bool(sign) + numchunks - # Join words with commas and a trailing 'and' (when appropriate)... + signout = f"{sign} " if sign else "" + valout = ( + ', '.join(numchunks) + if group + else ''.join(self._render(numchunks, decimal, comma)) + ) + return signout + valout - @validate_call + @staticmethod + def _render(chunks, decimal, comma): + first_item = chunks.pop(0) + yield first_item + first = decimal is None or not first_item.endswith(decimal) + for nc in chunks: + if nc == decimal: + first = False + elif first: + yield comma + yield f" {nc}" + + @typechecked def join( self, words: Optional[Sequence[Word]], diff --git a/libs/inflect/compat/py38.py b/libs/inflect/compat/py38.py new file mode 100644 index 000000000..a2d01bd98 --- /dev/null +++ b/libs/inflect/compat/py38.py @@ -0,0 +1,7 @@ +import sys + + +if sys.version_info > (3, 9): + from typing import Annotated +else: # pragma: no cover + from typing_extensions import Annotated # noqa: F401 diff --git a/libs/inflect/compat/pydantic.py b/libs/inflect/compat/pydantic.py deleted file mode 100644 index d777564ab..000000000 --- a/libs/inflect/compat/pydantic.py +++ /dev/null @@ -1,19 +0,0 @@ -class ValidateCallWrapperWrapper: - def __init__(self, wrapped): - self.orig = wrapped - - def __eq__(self, other): - return self.raw_function == other.raw_function - - @property - def raw_function(self): - return getattr(self.orig, 'raw_function') or self.orig - - -def same_method(m1, m2) -> bool: - """ - Return whether m1 and m2 are the same method. - - Workaround for pydantic/pydantic#6390. - """ - return ValidateCallWrapperWrapper(m1) == ValidateCallWrapperWrapper(m2) diff --git a/libs/inflect/compat/pydantic1.py b/libs/inflect/compat/pydantic1.py deleted file mode 100644 index 8262fdcf9..000000000 --- a/libs/inflect/compat/pydantic1.py +++ /dev/null @@ -1,8 +0,0 @@ -try: - from pydantic import validate_call # type: ignore -except ImportError: - # Pydantic 1 - from pydantic import validate_arguments as validate_call # type: ignore - - -__all__ = ['validate_call'] diff --git a/libs/itsdangerous-2.1.2.dist-info/METADATA b/libs/itsdangerous-2.1.2.dist-info/METADATA deleted file mode 100644 index 70ae1bef8..000000000 --- a/libs/itsdangerous-2.1.2.dist-info/METADATA +++ /dev/null @@ -1,94 +0,0 @@ -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 -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/libs/itsdangerous-2.1.2.dist-info/RECORD b/libs/itsdangerous-2.1.2.dist-info/RECORD deleted file mode 100644 index 74c5e4649..000000000 --- a/libs/itsdangerous-2.1.2.dist-info/RECORD +++ /dev/null @@ -1,16 +0,0 @@ -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=i9sDdrG-Rz4BK1jcyhmjsg8KAFpfGKLuN69uGaYJzdY,2908 -itsdangerous-2.1.2.dist-info/RECORD,, -itsdangerous-2.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -itsdangerous-2.1.2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -itsdangerous-2.1.2.dist-info/top_level.txt,sha256=gKN1OKLk81i7fbWWildJA88EQ9NhnGMSvZqhfz9ICjk,13 -itsdangerous/__init__.py,sha256=n4mkyjlIVn23pgsgCIw0MJKPdcHIetyeRpe5Fwsn8qg,876 -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/libs/itsdangerous-2.1.2.dist-info/top_level.txt b/libs/itsdangerous-2.1.2.dist-info/top_level.txt deleted file mode 100644 index e163955e8..000000000 --- a/libs/itsdangerous-2.1.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -itsdangerous diff --git a/libs/inflect-7.0.0.dist-info/INSTALLER b/libs/itsdangerous-2.2.0.dist-info/INSTALLER similarity index 100% rename from libs/inflect-7.0.0.dist-info/INSTALLER rename to libs/itsdangerous-2.2.0.dist-info/INSTALLER diff --git a/libs/itsdangerous-2.1.2.dist-info/LICENSE.rst b/libs/itsdangerous-2.2.0.dist-info/LICENSE.txt similarity index 100% rename from libs/itsdangerous-2.1.2.dist-info/LICENSE.rst rename to libs/itsdangerous-2.2.0.dist-info/LICENSE.txt diff --git a/libs/itsdangerous-2.2.0.dist-info/METADATA b/libs/itsdangerous-2.2.0.dist-info/METADATA new file mode 100644 index 000000000..ddf546484 --- /dev/null +++ b/libs/itsdangerous-2.2.0.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: itsdangerous +Version: 2.2.0 +Summary: Safely pass data to untrusted environments and back. +Maintainer-email: Pallets +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +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 +Classifier: Typing :: Typed +Project-URL: Changes, https://itsdangerous.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://itsdangerous.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/itsdangerous/ + +# 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. + + +## A Simple Example + +Here's how you could generate a token for transmitting a user's id and +name between web requests. + +```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 + diff --git a/libs/itsdangerous-2.2.0.dist-info/RECORD b/libs/itsdangerous-2.2.0.dist-info/RECORD new file mode 100644 index 000000000..01486a83b --- /dev/null +++ b/libs/itsdangerous-2.2.0.dist-info/RECORD @@ -0,0 +1,15 @@ +itsdangerous-2.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +itsdangerous-2.2.0.dist-info/LICENSE.txt,sha256=Y68JiRtr6K0aQlLtQ68PTvun_JSOIoNnvtfzxa4LCdc,1475 +itsdangerous-2.2.0.dist-info/METADATA,sha256=0rk0-1ZwihuU5DnwJVwPWoEI4yWOyCexih3JyZHblhE,1924 +itsdangerous-2.2.0.dist-info/RECORD,, +itsdangerous-2.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous-2.2.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +itsdangerous/__init__.py,sha256=4SK75sCe29xbRgQE1ZQtMHnKUuZYAf3bSpZOrff1IAY,1427 +itsdangerous/_json.py,sha256=wPQGmge2yZ9328EHKF6gadGeyGYCJQKxtU-iLKE6UnA,473 +itsdangerous/encoding.py,sha256=wwTz5q_3zLcaAdunk6_vSoStwGqYWe307Zl_U87aRFM,1409 +itsdangerous/exc.py,sha256=Rr3exo0MRFEcPZltwecyK16VV1bE2K9_F1-d-ljcUn4,3201 +itsdangerous/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +itsdangerous/serializer.py,sha256=PmdwADLqkSyQLZ0jOKAgDsAW4k_H0TlA71Ei3z0C5aI,15601 +itsdangerous/signer.py,sha256=YO0CV7NBvHA6j549REHJFUjUojw2pHqwcUpQnU7yNYQ,9647 +itsdangerous/timed.py,sha256=6RvDMqNumGMxf0-HlpaZdN9PUQQmRvrQGplKhxuivUs,8083 +itsdangerous/url_safe.py,sha256=az4e5fXi_vs-YbWj8YZwn4wiVKfeD--GEKRT5Ueu4P4,2505 diff --git a/libs/inflect-7.0.0.dist-info/REQUESTED b/libs/itsdangerous-2.2.0.dist-info/REQUESTED similarity index 100% rename from libs/inflect-7.0.0.dist-info/REQUESTED rename to libs/itsdangerous-2.2.0.dist-info/REQUESTED diff --git a/libs/pyparsing-3.1.1.dist-info/WHEEL b/libs/itsdangerous-2.2.0.dist-info/WHEEL similarity index 100% rename from libs/pyparsing-3.1.1.dist-info/WHEEL rename to libs/itsdangerous-2.2.0.dist-info/WHEEL diff --git a/libs/itsdangerous/__init__.py b/libs/itsdangerous/__init__.py index fdb2dfd00..ea55256eb 100644 --- a/libs/itsdangerous/__init__.py +++ b/libs/itsdangerous/__init__.py @@ -1,3 +1,7 @@ +from __future__ import annotations + +import typing as t + from .encoding import base64_decode as base64_decode from .encoding import base64_encode as base64_encode from .encoding import want_bytes as want_bytes @@ -16,4 +20,19 @@ from .url_safe import URLSafeSerializer as URLSafeSerializer from .url_safe import URLSafeTimedSerializer as URLSafeTimedSerializer -__version__ = "2.1.2" + +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" + " ItsDangerous 2.3. Use feature detection or" + " 'importlib.metadata.version(\"itsdangerous\")' instead.", + DeprecationWarning, + stacklevel=2, + ) + return importlib.metadata.version("itsdangerous") + + raise AttributeError(name) diff --git a/libs/itsdangerous/_json.py b/libs/itsdangerous/_json.py index c70d37a95..fc23feaaf 100644 --- a/libs/itsdangerous/_json.py +++ b/libs/itsdangerous/_json.py @@ -1,16 +1,18 @@ +from __future__ import annotations + import json as _json -import typing as _t +import typing as t class _CompactJSON: """Wrapper around json module that strips whitespace.""" @staticmethod - def loads(payload: _t.Union[str, bytes]) -> _t.Any: + def loads(payload: str | bytes) -> t.Any: return _json.loads(payload) @staticmethod - def dumps(obj: _t.Any, **kwargs: _t.Any) -> str: + 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/libs/itsdangerous/encoding.py b/libs/itsdangerous/encoding.py index edb04d1a6..f5ca80f90 100644 --- a/libs/itsdangerous/encoding.py +++ b/libs/itsdangerous/encoding.py @@ -1,15 +1,15 @@ +from __future__ import annotations + import base64 import string import struct -import typing as _t +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" + s: str | bytes, encoding: str = "utf-8", errors: str = "strict" ) -> bytes: if isinstance(s, str): s = s.encode(encoding, errors) @@ -17,7 +17,7 @@ def want_bytes( return s -def base64_encode(string: _t_str_bytes) -> bytes: +def base64_encode(string: str | bytes) -> bytes: """Base64 encode a string of bytes or text. The resulting bytes are safe to use in URLs. """ @@ -25,7 +25,7 @@ def base64_encode(string: _t_str_bytes) -> bytes: return base64.urlsafe_b64encode(string).rstrip(b"=") -def base64_decode(string: _t_str_bytes) -> bytes: +def base64_decode(string: str | bytes) -> bytes: """Base64 decode a URL-safe string of bytes or text. The result is bytes. """ @@ -43,7 +43,7 @@ def base64_decode(string: _t_str_bytes) -> bytes: _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) +_bytes_to_int = t.cast("t.Callable[[bytes], tuple[int]]", _int64_struct.unpack) def int_to_bytes(num: int) -> bytes: diff --git a/libs/itsdangerous/exc.py b/libs/itsdangerous/exc.py index c38a6af52..a75adcd52 100644 --- a/libs/itsdangerous/exc.py +++ b/libs/itsdangerous/exc.py @@ -1,8 +1,7 @@ -import typing as _t -from datetime import datetime +from __future__ import annotations -_t_opt_any = _t.Optional[_t.Any] -_t_opt_exc = _t.Optional[Exception] +import typing as t +from datetime import datetime class BadData(Exception): @@ -23,7 +22,7 @@ def __str__(self) -> str: class BadSignature(BadData): """Raised if a signature does not match.""" - def __init__(self, message: str, payload: _t_opt_any = None): + def __init__(self, message: str, payload: t.Any | None = None): super().__init__(message) #: The payload that failed the signature test. In some @@ -31,7 +30,7 @@ def __init__(self, message: str, payload: _t_opt_any = None): #: you know it was tampered with. #: #: .. versionadded:: 0.14 - self.payload: _t_opt_any = payload + self.payload: t.Any | None = payload class BadTimeSignature(BadSignature): @@ -42,8 +41,8 @@ class BadTimeSignature(BadSignature): def __init__( self, message: str, - payload: _t_opt_any = None, - date_signed: _t.Optional[datetime] = None, + payload: t.Any | None = None, + date_signed: datetime | None = None, ): super().__init__(message, payload) @@ -75,19 +74,19 @@ class BadHeader(BadSignature): def __init__( self, message: str, - payload: _t_opt_any = None, - header: _t_opt_any = None, - original_error: _t_opt_exc = None, + payload: t.Any | None = None, + header: t.Any | None = None, + original_error: Exception | None = 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 + self.header: t.Any | None = 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 + self.original_error: Exception | None = original_error class BadPayload(BadData): @@ -99,9 +98,9 @@ class BadPayload(BadData): .. versionadded:: 0.15 """ - def __init__(self, message: str, original_error: _t_opt_exc = None): + def __init__(self, message: str, original_error: Exception | None = 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 + self.original_error: Exception | None = original_error diff --git a/libs/itsdangerous/serializer.py b/libs/itsdangerous/serializer.py index 9f4a84a17..5ddf3871d 100644 --- a/libs/itsdangerous/serializer.py +++ b/libs/itsdangerous/serializer.py @@ -1,5 +1,8 @@ +from __future__ import annotations + +import collections.abc as cabc import json -import typing as _t +import typing as t from .encoding import want_bytes from .exc import BadPayload @@ -7,22 +10,36 @@ 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] +if t.TYPE_CHECKING: + import typing_extensions as te + + # This should be either be str or bytes. To avoid having to specify the + # bound type, it falls back to a union if structural matching fails. + _TSerialized = te.TypeVar( + "_TSerialized", bound=t.Union[str, bytes], default=t.Union[str, bytes] + ) +else: + # Still available at runtime on Python < 3.13, but without the default. + _TSerialized = t.TypeVar("_TSerialized", bound=t.Union[str, bytes]) + +class _PDataSerializer(t.Protocol[_TSerialized]): + def loads(self, payload: _TSerialized, /) -> t.Any: ... + # A signature with additional arguments is not handled correctly by type + # checkers right now, so an overload is used below for serializers that + # don't match this strict protocol. + def dumps(self, obj: t.Any, /) -> _TSerialized: ... -def is_text_serializer(serializer: _t.Any) -> bool: + +# Use TypeIs once it's available in typing_extensions or 3.13. +def is_text_serializer( + serializer: _PDataSerializer[t.Any], +) -> te.TypeGuard[_PDataSerializer[str]]: """Checks whether a serializer generates text or binary.""" return isinstance(serializer.dumps({}), str) -class Serializer: +class Serializer(t.Generic[_TSerialized]): """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. @@ -77,31 +94,120 @@ class Serializer: #: 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 + default_serializer: _PDataSerializer[t.Any] = json #: The default ``Signer`` class to instantiate when signing data. #: The default is :class:`itsdangerous.signer.Signer`. - default_signer: _t_signer = Signer + default_signer: type[Signer] = Signer #: The default fallback signers to try when unsigning fails. - default_fallback_signers: _t_fallbacks = [] + default_fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] = [] + + # Serializer[str] if no data serializer is provided, or if it returns str. + @t.overload + def __init__( + self: Serializer[str], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + serializer: None | _PDataSerializer[str] = None, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Serializer[bytes] with a bytes data serializer positional argument. + @t.overload + def __init__( + self: Serializer[bytes], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None, + serializer: _PDataSerializer[bytes], + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Serializer[bytes] with a bytes data serializer keyword argument. + @t.overload + def __init__( + self: Serializer[bytes], + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + *, + serializer: _PDataSerializer[bytes], + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Fall back with a positional argument. If the strict signature of + # _PDataSerializer doesn't match, fall back to a union, requiring the user + # to specify the type. + @t.overload + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None, + serializer: t.Any, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... + + # Fall back with a keyword argument. + @t.overload + def __init__( + self, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + *, + serializer: t.Any, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = None, + ): ... 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, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous", + serializer: t.Any | None = None, + serializer_kwargs: dict[str, t.Any] | None = None, + signer: type[Signer] | None = None, + signer_kwargs: dict[str, t.Any] | None = None, + fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] + | None = 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.secret_keys: list[bytes] = _make_keys_list(secret_key) if salt is not None: salt = want_bytes(salt) @@ -112,20 +218,22 @@ def __init__( if serializer is None: serializer = self.default_serializer - self.serializer: _t.Any = serializer + self.serializer: _PDataSerializer[_TSerialized] = 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 {} + self.signer: type[Signer] = signer + self.signer_kwargs: dict[str, t.Any] = signer_kwargs or {} if fallback_signers is None: - fallback_signers = list(self.default_fallback_signers or ()) + fallback_signers = list(self.default_fallback_signers) - self.fallback_signers: _t_fallbacks = fallback_signers - self.serializer_kwargs: _t_kwargs = serializer_kwargs or {} + self.fallback_signers: list[ + dict[str, t.Any] | tuple[type[Signer], dict[str, t.Any]] | type[Signer] + ] = fallback_signers + self.serializer_kwargs: dict[str, t.Any] = serializer_kwargs or {} @property def secret_key(self) -> bytes: @@ -135,8 +243,8 @@ def secret_key(self) -> bytes: return self.secret_keys[-1] def load_payload( - self, payload: bytes, serializer: _t.Optional[_t.Any] = None - ) -> _t.Any: + self, payload: bytes, serializer: _PDataSerializer[t.Any] | None = 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 @@ -144,16 +252,17 @@ def load_payload( bytes. """ if serializer is None: - serializer = self.serializer + use_serializer = self.serializer is_text = self.is_text_serializer else: + use_serializer = serializer is_text = is_text_serializer(serializer) try: if is_text: - return serializer.loads(payload.decode("utf-8")) + return use_serializer.loads(payload.decode("utf-8")) # type: ignore[arg-type] - return serializer.loads(payload) + return use_serializer.loads(payload) # type: ignore[arg-type] except Exception as e: raise BadPayload( "Could not load the payload because an exception" @@ -161,14 +270,14 @@ def load_payload( original_error=e, ) from e - def dump_payload(self, obj: _t.Any) -> bytes: + 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: + def make_signer(self, salt: str | bytes | None = None) -> Signer: """Creates a new instance of the signer to be used. The default implementation uses the :class:`.Signer` base class. """ @@ -177,7 +286,7 @@ def make_signer(self, salt: _t_opt_str_bytes = None) -> Signer: return self.signer(self.secret_keys, salt=salt, **self.signer_kwargs) - def iter_unsigners(self, salt: _t_opt_str_bytes = None) -> _t.Iterator[Signer]: + def iter_unsigners(self, salt: str | bytes | None = None) -> cabc.Iterator[Signer]: """Iterates over all signers to be tried for unsigning. Starts with the configured signer, then constructs each signer specified in ``fallback_signers``. @@ -199,7 +308,7 @@ def iter_unsigners(self, salt: _t_opt_str_bytes = None) -> _t.Iterator[Signer]: 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: + def dumps(self, obj: t.Any, salt: str | bytes | None = None) -> _TSerialized: """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. @@ -208,19 +317,19 @@ def dumps(self, obj: _t.Any, salt: _t_opt_str_bytes = None) -> _t_str_bytes: rv = self.make_signer(salt).sign(payload) if self.is_text_serializer: - return rv.decode("utf-8") + return rv.decode("utf-8") # type: ignore[return-value] - return rv + return rv # type: ignore[return-value] - def dump(self, obj: _t.Any, f: _t.IO, salt: _t_opt_str_bytes = None) -> None: + def dump(self, obj: t.Any, f: t.IO[t.Any], salt: str | bytes | None = 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: + self, s: str | bytes, salt: str | bytes | None = None, **kwargs: t.Any + ) -> t.Any: """Reverse of :meth:`dumps`. Raises :exc:`.BadSignature` if the signature validation fails. """ @@ -233,15 +342,15 @@ def loads( except BadSignature as err: last_exception = err - raise _t.cast(BadSignature, last_exception) + raise t.cast(BadSignature, last_exception) - def load(self, f: _t.IO, salt: _t_opt_str_bytes = None) -> _t.Any: + def load(self, f: t.IO[t.Any], salt: str | bytes | None = 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: + self, s: str | bytes, salt: str | bytes | None = None + ) -> tuple[bool, t.Any]: """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, @@ -259,11 +368,11 @@ def loads_unsafe( 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: + s: str | bytes, + salt: str | bytes | None, + load_kwargs: dict[str, t.Any] | None = None, + load_payload_kwargs: dict[str, t.Any] | None = None, + ) -> tuple[bool, t.Any]: """Low level helper function to implement :meth:`loads_unsafe` in serializer subclasses. """ @@ -287,7 +396,9 @@ def _loads_unsafe_impl( except BadPayload: return False, None - def load_unsafe(self, f: _t.IO, salt: _t_opt_str_bytes = None) -> _t_load_unsafe: + def load_unsafe( + self, f: t.IO[t.Any], salt: str | bytes | None = None + ) -> tuple[bool, t.Any]: """Like :meth:`loads_unsafe` but loads from a file. .. versionadded:: 0.15 diff --git a/libs/itsdangerous/signer.py b/libs/itsdangerous/signer.py index aa12005e9..e324dc03d 100644 --- a/libs/itsdangerous/signer.py +++ b/libs/itsdangerous/signer.py @@ -1,6 +1,9 @@ +from __future__ import annotations + +import collections.abc as cabc import hashlib import hmac -import typing as _t +import typing as t from .encoding import _base64_alphabet from .encoding import base64_decode @@ -8,10 +11,6 @@ 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 @@ -38,30 +37,40 @@ def get_signature(self, key: bytes, value: bytes) -> bytes: return b"" +def _lazy_sha1(string: bytes = b"") -> t.Any: + """Don't access ``hashlib.sha1`` until runtime. FIPS builds may not include + SHA-1, in which case the import and use as a default would fail before the + developer can configure something else. + """ + return hashlib.sha1(string) + + 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) + default_digest_method: t.Any = staticmethod(_lazy_sha1) - def __init__(self, digest_method: _t.Any = None): + 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 + 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]: +def _make_keys_list( + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], +) -> list[bytes]: if isinstance(secret_key, (str, bytes)): return [want_bytes(secret_key)] - return [want_bytes(s) for s in secret_key] + return [want_bytes(s) for s in secret_key] # pyright: ignore class Signer: @@ -108,7 +117,7 @@ class Signer: #: doesn't apply when used intermediately in HMAC. #: #: .. versionadded:: 0.14 - default_digest_method: _t.Any = staticmethod(hashlib.sha1) + default_digest_method: t.Any = staticmethod(_lazy_sha1) #: The default scheme to use to derive the signing key from the #: secret key and salt. The default is ``django-concat``. Possible @@ -119,19 +128,19 @@ class Signer: 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, + secret_key: str | bytes | cabc.Iterable[str] | cabc.Iterable[bytes], + salt: str | bytes | None = b"itsdangerous.Signer", + sep: str | bytes = b".", + key_derivation: str | None = None, + digest_method: t.Any | None = None, + algorithm: SigningAlgorithm | None = 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.secret_keys: list[bytes] = _make_keys_list(secret_key) self.sep: bytes = want_bytes(sep) if self.sep in _base64_alphabet: @@ -156,7 +165,7 @@ def __init__( if digest_method is None: digest_method = self.default_digest_method - self.digest_method: _t.Any = digest_method + self.digest_method: t.Any = digest_method if algorithm is None: algorithm = HMACAlgorithm(self.digest_method) @@ -170,7 +179,7 @@ def secret_key(self) -> bytes: """ return self.secret_keys[-1] - def derive_key(self, secret_key: _t_opt_str_bytes = None) -> bytes: + def derive_key(self, secret_key: str | bytes | None = 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 @@ -189,9 +198,9 @@ def derive_key(self, secret_key: _t_opt_str_bytes = None) -> bytes: secret_key = want_bytes(secret_key) if self.key_derivation == "concat": - return _t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) + return t.cast(bytes, self.digest_method(self.salt + secret_key).digest()) elif self.key_derivation == "django-concat": - return _t.cast( + return t.cast( bytes, self.digest_method(self.salt + b"signer" + secret_key).digest() ) elif self.key_derivation == "hmac": @@ -203,19 +212,19 @@ def derive_key(self, secret_key: _t_opt_str_bytes = None) -> bytes: else: raise TypeError("Unknown key derivation method") - def get_signature(self, value: _t_str_bytes) -> bytes: + def get_signature(self, value: 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: + def sign(self, value: 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: + def verify_signature(self, value: str | bytes, sig: str | bytes) -> bool: """Verifies the signature for the given value.""" try: sig = base64_decode(sig) @@ -232,7 +241,7 @@ def verify_signature(self, value: _t_str_bytes, sig: _t_str_bytes) -> bool: return False - def unsign(self, signed_value: _t_str_bytes) -> bytes: + def unsign(self, signed_value: str | bytes) -> bytes: """Unsigns the given string.""" signed_value = want_bytes(signed_value) @@ -246,7 +255,7 @@ def unsign(self, signed_value: _t_str_bytes) -> bytes: raise BadSignature(f"Signature {sig!r} does not match", payload=value) - def validate(self, signed_value: _t_str_bytes) -> bool: + def validate(self, signed_value: str | bytes) -> bool: """Only validates the given signed value. Returns ``True`` if the signature exists and is valid. """ diff --git a/libs/itsdangerous/timed.py b/libs/itsdangerous/timed.py index cad8da341..73843755d 100644 --- a/libs/itsdangerous/timed.py +++ b/libs/itsdangerous/timed.py @@ -1,6 +1,8 @@ +from __future__ import annotations + +import collections.abc as cabc import time -import typing -import typing as _t +import typing as t from datetime import datetime from datetime import timezone @@ -12,16 +14,10 @@ from .exc import BadSignature from .exc import BadTimeSignature from .exc import SignatureExpired +from .serializer import _TSerialized 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 @@ -46,7 +42,7 @@ def timestamp_to_datetime(self, ts: int) -> datetime: """ return datetime.fromtimestamp(ts, tz=timezone.utc) - def sign(self, value: _t_str_bytes) -> bytes: + def sign(self, value: 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())) @@ -57,30 +53,28 @@ def sign(self, value: _t_str_bytes) -> bytes: # Ignore overlapping signatures check, return_timestamp is the only # parameter that affects the return type. - @typing.overload - def unsign( # type: ignore + @t.overload + def unsign( # type: ignore[overload-overlap] self, - signed_value: _t_str_bytes, - max_age: _t_opt_int = None, - return_timestamp: "_te.Literal[False]" = False, - ) -> bytes: - ... + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: t.Literal[False] = False, + ) -> bytes: ... - @typing.overload + @t.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]: - ... + signed_value: str | bytes, + max_age: int | None = None, + return_timestamp: t.Literal[True] = True, + ) -> tuple[bytes, datetime]: ... def unsign( self, - signed_value: _t_str_bytes, - max_age: _t_opt_int = None, + signed_value: str | bytes, + max_age: int | None = None, return_timestamp: bool = False, - ) -> _t.Union[_t.Tuple[bytes, datetime], bytes]: + ) -> 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 @@ -112,8 +106,8 @@ def unsign( 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 + ts_int: int | None = None + ts_dt: datetime | None = None try: ts_int = bytes_to_int(base64_decode(ts_bytes)) @@ -163,7 +157,7 @@ def unsign( return value - def validate(self, signed_value: _t_str_bytes, max_age: _t_opt_int = None) -> bool: + def validate(self, signed_value: str | bytes, max_age: int | None = None) -> bool: """Only validates the given signed value. Returns ``True`` if the signature exists and is valid.""" try: @@ -173,28 +167,28 @@ def validate(self, signed_value: _t_str_bytes, max_age: _t_opt_int = None) -> bo return False -class TimedSerializer(Serializer): +class TimedSerializer(Serializer[_TSerialized]): """Uses :class:`TimestampSigner` instead of the default :class:`.Signer`. """ - default_signer: _t.Type[TimestampSigner] = TimestampSigner + default_signer: 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)) + self, salt: str | bytes | None = None + ) -> cabc.Iterator[TimestampSigner]: + return t.cast("cabc.Iterator[TimestampSigner]", super().iter_unsigners(salt)) # TODO: Signature is incompatible because parameters were added # before salt. - def loads( # type: ignore + def loads( # type: ignore[override] self, - s: _t_str_bytes, - max_age: _t_opt_int = None, + s: str | bytes, + max_age: int | None = None, return_timestamp: bool = False, - salt: _t_opt_str_bytes = None, - ) -> _t.Any: + salt: str | bytes | None = 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 @@ -223,12 +217,12 @@ def loads( # type: ignore except BadSignature as err: last_exception = err - raise _t.cast(BadSignature, last_exception) + raise t.cast(BadSignature, last_exception) - def loads_unsafe( # type: ignore + def loads_unsafe( # type: ignore[override] self, - s: _t_str_bytes, - max_age: _t_opt_int = None, - salt: _t_opt_str_bytes = None, - ) -> _t.Tuple[bool, _t.Any]: + s: str | bytes, + max_age: int | None = None, + salt: str | bytes | None = None, + ) -> tuple[bool, t.Any]: return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age}) diff --git a/libs/itsdangerous/url_safe.py b/libs/itsdangerous/url_safe.py index d5a9b0c26..56a079331 100644 --- a/libs/itsdangerous/url_safe.py +++ b/libs/itsdangerous/url_safe.py @@ -1,29 +1,32 @@ -import typing as _t +from __future__ import annotations + +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 _PDataSerializer from .serializer import Serializer from .timed import TimedSerializer -class URLSafeSerializerMixin(Serializer): +class URLSafeSerializerMixin(Serializer[str]): """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 + default_serializer: _PDataSerializer[str] = _CompactJSON def load_payload( self, payload: bytes, - *args: _t.Any, - serializer: _t.Optional[_t.Any] = None, - **kwargs: _t.Any, - ) -> _t.Any: + *args: t.Any, + serializer: t.Any | None = None, + **kwargs: t.Any, + ) -> t.Any: decompress = False if payload.startswith(b"."): @@ -49,7 +52,7 @@ def load_payload( return super().load_payload(json, *args, **kwargs) - def dump_payload(self, obj: _t.Any) -> bytes: + def dump_payload(self, obj: t.Any) -> bytes: json = super().dump_payload(obj) is_compressed = False compressed = zlib.compress(json) @@ -66,14 +69,14 @@ def dump_payload(self, obj: _t.Any) -> bytes: return base64d -class URLSafeSerializer(URLSafeSerializerMixin, Serializer): +class URLSafeSerializer(URLSafeSerializerMixin, Serializer[str]): """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): +class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer[str]): """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/libs/itsdangerous-2.1.2.dist-info/INSTALLER b/libs/jinja2-3.1.4.dist-info/INSTALLER similarity index 100% rename from libs/itsdangerous-2.1.2.dist-info/INSTALLER rename to libs/jinja2-3.1.4.dist-info/INSTALLER diff --git a/libs/Jinja2-3.1.3.dist-info/LICENSE.rst b/libs/jinja2-3.1.4.dist-info/LICENSE.txt similarity index 100% rename from libs/Jinja2-3.1.3.dist-info/LICENSE.rst rename to libs/jinja2-3.1.4.dist-info/LICENSE.txt diff --git a/libs/Jinja2-3.1.3.dist-info/METADATA b/libs/jinja2-3.1.4.dist-info/METADATA similarity index 66% rename from libs/Jinja2-3.1.3.dist-info/METADATA rename to libs/jinja2-3.1.4.dist-info/METADATA index 56e942902..265cc32e1 100644 --- a/libs/Jinja2-3.1.3.dist-info/METADATA +++ b/libs/jinja2-3.1.4.dist-info/METADATA @@ -1,17 +1,10 @@ Metadata-Version: 2.1 Name: Jinja2 -Version: 3.1.3 +Version: 3.1.4 Summary: A very fast and expressive template engine. -Home-page: https://palletsprojects.com/p/jinja/ -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: Chat, https://discord.gg/pallets +Maintainer-email: Pallets +Requires-Python: >=3.7 +Description-Content-Type: text/markdown Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers @@ -20,15 +13,17 @@ 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 +Classifier: Typing :: Typed +Requires-Dist: MarkupSafe>=2.0 +Requires-Dist: Babel>=2.7 ; extra == "i18n" +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/jinja/ Provides-Extra: i18n -Requires-Dist: Babel >=2.7 ; extra == 'i18n' -Jinja -===== +# Jinja Jinja is a fast, expressive, extensible templating engine. Special placeholders in the template allow writing code similar to Python @@ -55,20 +50,7 @@ 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 -------------- +## In A Nutshell .. code-block:: jinja @@ -83,23 +65,12 @@ In A Nutshell {% endblock %} -Donate ------- +## 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 - +allow the maintainers to devote more time to the projects, [please +donate today][]. -Links ------ +[please donate today]: https://palletsprojects.com/donate -- 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/ -- Chat: https://discord.gg/pallets diff --git a/libs/jinja2-3.1.4.dist-info/RECORD b/libs/jinja2-3.1.4.dist-info/RECORD new file mode 100644 index 000000000..2c1de103a --- /dev/null +++ b/libs/jinja2-3.1.4.dist-info/RECORD @@ -0,0 +1,33 @@ +jinja2-3.1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2-3.1.4.dist-info/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +jinja2-3.1.4.dist-info/METADATA,sha256=R_brzpPQVBvpGcsm-WbrtgotO7suQ1D0F-qkhTzeEfY,2640 +jinja2-3.1.4.dist-info/RECORD,, +jinja2-3.1.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2-3.1.4.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +jinja2-3.1.4.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 +jinja2/__init__.py,sha256=wIl45IM20KGw-kfr7jJhaBxxX5g4-kihlBYjxopX7Pw,1928 +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=JXKWCAXmTx0iZB4-hAsF50vgjxw_RJTjiLOlGGTBso0,2477 +jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 +jinja2/compiler.py,sha256=dpV-n6_iQUP4uSwlXwGUavJmwjvXdyxKzJ-AonFjPBk,72271 +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=xhFkmxO0CESA76Ki5tz4XWq9yzGu-t0p93JCCVBVNps,61538 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=igsBH7c6C0byHaOtMbE-ugpt4GjLGgR-ywskyXtKgq8,31877 +jinja2/filters.py,sha256=bKeqjFjjz88TkHVLSyyMIEB75CzAN6b3Airgx0phJDg,54611 +jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 +jinja2/lexer.py,sha256=xnWWXhPndHFsoqzpc5VTjheDE9JuKk9MUo9DZkrM8Os,29754 +jinja2/loaders.py,sha256=ru0GIWHo5KiHJi7_MoI_LvGDoBBvP6rd0hiC1ReaTwk,23167 +jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 +jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 +jinja2/parser.py,sha256=DV1iF1FR2Rsaj_5zl8rmx7j6Bj4S8iLHoYsvJ0bfEis,39890 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=POXT3tKNKJRENx2CymwUsOOXH2JwGPjW702njB5__cQ,33435 +jinja2/sandbox.py,sha256=TJjBNS9qRJ2ZgBMWdAgRBpyDLOHea2kT-2mk4PrjYx0,14616 +jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 +jinja2/utils.py,sha256=nV7IpWLvRCMyHW1irBAK8CIPAnOFfkb2ukggDBjbBEY,23952 +jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/libs/itsdangerous-2.1.2.dist-info/REQUESTED b/libs/jinja2-3.1.4.dist-info/REQUESTED similarity index 100% rename from libs/itsdangerous-2.1.2.dist-info/REQUESTED rename to libs/jinja2-3.1.4.dist-info/REQUESTED diff --git a/libs/typing_extensions-4.10.0.dist-info/WHEEL b/libs/jinja2-3.1.4.dist-info/WHEEL similarity index 100% rename from libs/typing_extensions-4.10.0.dist-info/WHEEL rename to libs/jinja2-3.1.4.dist-info/WHEEL diff --git a/libs/jinja2-3.1.4.dist-info/entry_points.txt b/libs/jinja2-3.1.4.dist-info/entry_points.txt new file mode 100644 index 000000000..abc3eae3b --- /dev/null +++ b/libs/jinja2-3.1.4.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2=jinja2.ext:babel_extract[i18n] + diff --git a/libs/jinja2/__init__.py b/libs/jinja2/__init__.py index af5d4288d..2f0b5b286 100644 --- a/libs/jinja2/__init__.py +++ b/libs/jinja2/__init__.py @@ -2,6 +2,7 @@ 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 @@ -34,4 +35,4 @@ from .utils import pass_eval_context as pass_eval_context from .utils import select_autoescape as select_autoescape -__version__ = "3.1.3" +__version__ = "3.1.4" diff --git a/libs/jinja2/async_utils.py b/libs/jinja2/async_utils.py index 715d70119..e65219e49 100644 --- a/libs/jinja2/async_utils.py +++ b/libs/jinja2/async_utils.py @@ -47,7 +47,7 @@ def wrapper(*args, **kwargs): # type: ignore if need_eval_context: wrapper = pass_eval_context(wrapper) - wrapper.jinja_async_variant = True + wrapper.jinja_async_variant = True # type: ignore[attr-defined] return wrapper return decorator diff --git a/libs/jinja2/bccache.py b/libs/jinja2/bccache.py index d0ddf56ef..ada8b099f 100644 --- a/libs/jinja2/bccache.py +++ b/libs/jinja2/bccache.py @@ -5,6 +5,7 @@ Situations where this is useful are often forking web applications that are initialized on the first request. """ + import errno import fnmatch import marshal @@ -20,14 +21,15 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .environment import Environment class _MemcachedClient(te.Protocol): - def get(self, key: str) -> bytes: - ... + def get(self, key: str) -> bytes: ... - def set(self, key: str, value: bytes, timeout: t.Optional[int] = None) -> None: - ... + def set( + self, key: str, value: bytes, timeout: t.Optional[int] = None + ) -> None: ... bc_version = 5 diff --git a/libs/jinja2/compiler.py b/libs/jinja2/compiler.py index ff95c807b..274071750 100644 --- a/libs/jinja2/compiler.py +++ b/libs/jinja2/compiler.py @@ -1,4 +1,5 @@ """Compiles nodes from the parser into Python code.""" + import typing as t from contextlib import contextmanager from functools import update_wrapper @@ -24,6 +25,7 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .environment import Environment F = t.TypeVar("F", bound=t.Callable[..., t.Any]) @@ -60,8 +62,7 @@ def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"] @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.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) @@ -84,8 +85,7 @@ def _make_unop( @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.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) @@ -133,7 +133,7 @@ def has_safe_repr(value: t.Any) -> bool: if type(value) in {tuple, list, set, frozenset}: return all(has_safe_repr(v) for v in value) - if type(value) is dict: + if type(value) is dict: # noqa E721 return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) return False @@ -551,10 +551,13 @@ def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: for node in nodes: visitor.visit(node) - for id_map, names, dependency in (self.filters, visitor.filters, "filters"), ( - self.tests, - visitor.tests, - "tests", + 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: @@ -829,7 +832,8 @@ def visit_Template( assert frame is None, "no root frame allowed" eval_ctx = EvalContext(self.environment, self.name) - from .runtime import exported, async_exported + from .runtime import async_exported + from .runtime import exported if self.environment.is_async: exported_names = sorted(exported + async_exported) diff --git a/libs/jinja2/environment.py b/libs/jinja2/environment.py index 185d33246..1d3be0bed 100644 --- a/libs/jinja2/environment.py +++ b/libs/jinja2/environment.py @@ -1,6 +1,7 @@ """Classes for managing templates and their runtime and compile time options. """ + import os import typing import typing as t @@ -20,10 +21,10 @@ 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_FILTERS # type: ignore[attr-defined] from .defaults import DEFAULT_NAMESPACE from .defaults import DEFAULT_POLICIES -from .defaults import DEFAULT_TESTS +from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] from .defaults import KEEP_TRAILING_NEWLINE from .defaults import LINE_COMMENT_PREFIX from .defaults import LINE_STATEMENT_PREFIX @@ -55,6 +56,7 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .bccache import BytecodeCache from .ext import Extension from .loaders import BaseLoader @@ -79,7 +81,7 @@ def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_b def create_cache( size: int, -) -> t.Optional[t.MutableMapping[t.Tuple[weakref.ref, str], "Template"]]: +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: """Return the cache class for the given size.""" if size == 0: return None @@ -91,13 +93,13 @@ def create_cache( def copy_cache( - cache: t.Optional[t.MutableMapping], -) -> t.Optional[t.MutableMapping[t.Tuple[weakref.ref, str], "Template"]]: + cache: t.Optional[t.MutableMapping[t.Any, t.Any]], +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: """Create an empty copy of the given cache.""" if cache is None: return None - if type(cache) is dict: + if type(cache) is dict: # noqa E721 return {} return LRUCache(cache.capacity) # type: ignore @@ -670,7 +672,7 @@ def _tokenize( stream = ext.filter_stream(stream) # type: ignore if not isinstance(stream, TokenStream): - stream = TokenStream(stream, name, filename) # type: ignore + stream = TokenStream(stream, name, filename) return stream @@ -711,8 +713,7 @@ def compile( # type: ignore filename: t.Optional[str] = None, raw: "te.Literal[False]" = False, defer_init: bool = False, - ) -> CodeType: - ... + ) -> CodeType: ... @typing.overload def compile( @@ -722,8 +723,7 @@ def compile( filename: t.Optional[str] = None, raw: "te.Literal[True]" = ..., defer_init: bool = False, - ) -> str: - ... + ) -> str: ... @internalcode def compile( @@ -814,7 +814,7 @@ def compile_expression( def compile_templates( self, - target: t.Union[str, os.PathLike], + target: t.Union[str, "os.PathLike[str]"], extensions: t.Optional[t.Collection[str]] = None, filter_func: t.Optional[t.Callable[[str], bool]] = None, zip: t.Optional[str] = "deflated", @@ -858,7 +858,10 @@ def write_file(filename: str, data: str) -> None: f.write(data.encode("utf8")) if zip is not None: - from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED + from zipfile import ZIP_DEFLATED + from zipfile import ZIP_STORED + from zipfile import ZipFile + from zipfile import ZipInfo zip_file = ZipFile( target, "w", dict(deflated=ZIP_DEFLATED, stored=ZIP_STORED)[zip] @@ -1417,7 +1420,9 @@ async def make_module_async( """ ctx = self.new_context(vars, shared, locals) return TemplateModule( - self, ctx, [x async for x in self.root_render_func(ctx)] # type: ignore + self, + ctx, + [x async for x in self.root_render_func(ctx)], # type: ignore ) @internalcode @@ -1588,7 +1593,7 @@ def __init__(self, gen: t.Iterator[str]) -> None: def dump( self, - fp: t.Union[str, t.IO], + fp: t.Union[str, t.IO[bytes]], encoding: t.Optional[str] = None, errors: t.Optional[str] = "strict", ) -> None: @@ -1606,22 +1611,25 @@ def dump( if encoding is None: encoding = "utf-8" - fp = open(fp, "wb") + real_fp: t.IO[bytes] = open(fp, "wb") close = True + else: + real_fp = fp + try: if encoding is not None: iterable = (x.encode(encoding, errors) for x in self) # type: ignore else: iterable = self # type: ignore - if hasattr(fp, "writelines"): - fp.writelines(iterable) + if hasattr(real_fp, "writelines"): + real_fp.writelines(iterable) else: for item in iterable: - fp.write(item) + real_fp.write(item) finally: if close: - fp.close() + real_fp.close() def disable_buffering(self) -> None: """Disable the output buffering.""" diff --git a/libs/jinja2/ext.py b/libs/jinja2/ext.py index fade1fa3b..8d0810cd4 100644 --- a/libs/jinja2/ext.py +++ b/libs/jinja2/ext.py @@ -1,4 +1,5 @@ """Extension API for adding custom tags and behavior.""" + import pprint import re import typing as t @@ -18,23 +19,23 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .lexer import Token from .lexer import TokenStream from .parser import Parser class _TranslationsBasic(te.Protocol): - def gettext(self, message: str) -> str: - ... + def gettext(self, message: str) -> str: ... def ngettext(self, singular: str, plural: str, n: int) -> str: pass class _TranslationsContext(_TranslationsBasic): - def pgettext(self, context: str, message: str) -> str: - ... + def pgettext(self, context: str, message: str) -> str: ... - def npgettext(self, context: str, singular: str, plural: str, n: int) -> str: - ... + def npgettext( + self, context: str, singular: str, plural: str, n: int + ) -> str: ... _SupportedTranslations = t.Union[_TranslationsBasic, _TranslationsContext] @@ -218,7 +219,7 @@ def pgettext( def _make_new_npgettext( - func: t.Callable[[str, str, str, int], str] + func: t.Callable[[str, str, str, int], str], ) -> t.Callable[..., str]: @pass_context def npgettext( @@ -294,14 +295,14 @@ def _install_null(self, newstyle: t.Optional[bool] = None) -> None: pgettext = translations.pgettext else: - def pgettext(c: str, s: str) -> str: + def pgettext(c: str, s: str) -> str: # type: ignore[misc] return s if hasattr(translations, "npgettext"): npgettext = translations.npgettext else: - def npgettext(c: str, s: str, p: str, n: int) -> str: + def npgettext(c: str, s: str, p: str, n: int) -> str: # type: ignore[misc] return s if n == 1 else p self._install_callables( diff --git a/libs/jinja2/filters.py b/libs/jinja2/filters.py index c7ecc9bb6..acd11976e 100644 --- a/libs/jinja2/filters.py +++ b/libs/jinja2/filters.py @@ -1,4 +1,5 @@ """Built-in template filters used with the ``|`` operator.""" + import math import random import re @@ -28,6 +29,7 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .environment import Environment from .nodes import EvalContext from .runtime import Context @@ -122,7 +124,7 @@ def attrgetter(item: t.Any) -> t.List[t.Any]: def _prepare_attribute_parts( - attr: t.Optional[t.Union[str, int]] + attr: t.Optional[t.Union[str, int]], ) -> t.List[t.Union[str, int]]: if attr is None: return [] @@ -142,7 +144,7 @@ def do_forceescape(value: "t.Union[str, HasHTML]") -> Markup: def do_urlencode( - value: t.Union[str, t.Mapping[str, t.Any], t.Iterable[t.Tuple[str, t.Any]]] + value: t.Union[str, t.Mapping[str, t.Any], t.Iterable[t.Tuple[str, t.Any]]], ) -> str: """Quote data for use in a URL path or query using UTF-8. @@ -248,7 +250,9 @@ def do_items(value: t.Union[t.Mapping[K, V], Undefined]) -> t.Iterator[t.Tuple[K yield from value.items() -_space_re = re.compile(r"\s", flags=re.ASCII) +# Check for characters that would move the parser state from key to value. +# https://html.spec.whatwg.org/#attribute-name-state +_attr_key_re = re.compile(r"[\s/>=]", flags=re.ASCII) @pass_eval_context @@ -257,8 +261,14 @@ def do_xmlattr( ) -> str: """Create an SGML/XML attribute string based on the items in a dict. - If any key contains a space, this fails with a ``ValueError``. Values that - are neither ``none`` nor ``undefined`` are automatically escaped. + **Values** that are neither ``none`` nor ``undefined`` are automatically + escaped, safely allowing untrusted user input. + + User input should not be used as **keys** to this filter. If any key + contains a space, ``/`` solidus, ``>`` greater-than sign, or ``=`` equals + sign, this fails with a ``ValueError``. Regardless of this, user input + should never be used as keys to this filter, or must be separately validated + first. .. sourcecode:: html+jinja @@ -278,6 +288,10 @@ def do_xmlattr( As you can see it automatically prepends a space in front of the item if the filter returned something unless the second parameter is false. + .. versionchanged:: 3.1.4 + Keys with ``/`` solidus, ``>`` greater-than sign, or ``=`` equals sign + are not allowed. + .. versionchanged:: 3.1.3 Keys with spaces are not allowed. """ @@ -287,8 +301,8 @@ def do_xmlattr( if value is None or isinstance(value, Undefined): continue - if _space_re.search(key) is not None: - raise ValueError(f"Spaces are not allowed in attributes: '{key}'") + if _attr_key_re.search(key) is not None: + raise ValueError(f"Invalid character in attribute name: {key!r}") items.append(f'{escape(key)}="{escape(value)}"') @@ -552,7 +566,7 @@ def do_default( @pass_eval_context def sync_do_join( eval_ctx: "EvalContext", - value: t.Iterable, + value: t.Iterable[t.Any], d: str = "", attribute: t.Optional[t.Union[str, int]] = None, ) -> str: @@ -610,7 +624,7 @@ def sync_do_join( @async_variant(sync_do_join) # type: ignore async def do_join( eval_ctx: "EvalContext", - value: t.Union[t.AsyncIterable, t.Iterable], + value: t.Union[t.AsyncIterable[t.Any], t.Iterable[t.Any]], d: str = "", attribute: t.Optional[t.Union[str, int]] = None, ) -> str: @@ -1160,7 +1174,7 @@ def do_round( class _GroupTuple(t.NamedTuple): grouper: t.Any - list: t.List + list: t.List[t.Any] # Use the regular tuple repr to hide this subclass if users print # out the value during debugging. @@ -1356,13 +1370,11 @@ def do_mark_unsafe(value: str) -> str: @typing.overload -def do_reverse(value: str) -> str: - ... +def do_reverse(value: str) -> str: ... @typing.overload -def do_reverse(value: "t.Iterable[V]") -> "t.Iterable[V]": - ... +def do_reverse(value: "t.Iterable[V]") -> "t.Iterable[V]": ... def do_reverse(value: t.Union[str, t.Iterable[V]]) -> t.Union[str, t.Iterable[V]]: @@ -1416,26 +1428,28 @@ def do_attr( @typing.overload def sync_do_map( - context: "Context", value: t.Iterable, name: str, *args: t.Any, **kwargs: t.Any -) -> t.Iterable: - ... + context: "Context", + value: t.Iterable[t.Any], + name: str, + *args: t.Any, + **kwargs: t.Any, +) -> t.Iterable[t.Any]: ... @typing.overload def sync_do_map( context: "Context", - value: t.Iterable, + value: t.Iterable[t.Any], *, attribute: str = ..., default: t.Optional[t.Any] = None, -) -> t.Iterable: - ... +) -> t.Iterable[t.Any]: ... @pass_context def sync_do_map( - context: "Context", value: t.Iterable, *args: t.Any, **kwargs: t.Any -) -> t.Iterable: + context: "Context", value: t.Iterable[t.Any], *args: t.Any, **kwargs: t.Any +) -> t.Iterable[t.Any]: """Applies a filter on a sequence of objects or looks up an attribute. This is useful when dealing with lists of objects but you are really only interested in a certain value of it. @@ -1485,32 +1499,30 @@ def sync_do_map( @typing.overload def do_map( context: "Context", - value: t.Union[t.AsyncIterable, t.Iterable], + value: t.Union[t.AsyncIterable[t.Any], t.Iterable[t.Any]], name: str, *args: t.Any, **kwargs: t.Any, -) -> t.Iterable: - ... +) -> t.Iterable[t.Any]: ... @typing.overload def do_map( context: "Context", - value: t.Union[t.AsyncIterable, t.Iterable], + value: t.Union[t.AsyncIterable[t.Any], t.Iterable[t.Any]], *, attribute: str = ..., default: t.Optional[t.Any] = None, -) -> t.Iterable: - ... +) -> t.Iterable[t.Any]: ... @async_variant(sync_do_map) # type: ignore async def do_map( context: "Context", - value: t.Union[t.AsyncIterable, t.Iterable], + value: t.Union[t.AsyncIterable[t.Any], t.Iterable[t.Any]], *args: t.Any, **kwargs: t.Any, -) -> t.AsyncIterable: +) -> t.AsyncIterable[t.Any]: if value: func = prepare_map(context, args, kwargs) @@ -1703,7 +1715,7 @@ def do_tojson( def prepare_map( - context: "Context", args: t.Tuple, kwargs: t.Dict[str, t.Any] + context: "Context", args: t.Tuple[t.Any, ...], kwargs: t.Dict[str, t.Any] ) -> t.Callable[[t.Any], t.Any]: if not args and "attribute" in kwargs: attribute = kwargs.pop("attribute") @@ -1732,7 +1744,7 @@ def func(item: t.Any) -> t.Any: def prepare_select_or_reject( context: "Context", - args: t.Tuple, + args: t.Tuple[t.Any, ...], kwargs: t.Dict[str, t.Any], modfunc: t.Callable[[t.Any], t.Any], lookup_attr: bool, @@ -1767,7 +1779,7 @@ def func(item: t.Any) -> t.Any: def select_or_reject( context: "Context", value: "t.Iterable[V]", - args: t.Tuple, + args: t.Tuple[t.Any, ...], kwargs: t.Dict[str, t.Any], modfunc: t.Callable[[t.Any], t.Any], lookup_attr: bool, @@ -1783,7 +1795,7 @@ def select_or_reject( async def async_select_or_reject( context: "Context", value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", - args: t.Tuple, + args: t.Tuple[t.Any, ...], kwargs: t.Dict[str, t.Any], modfunc: t.Callable[[t.Any], t.Any], lookup_attr: bool, diff --git a/libs/jinja2/lexer.py b/libs/jinja2/lexer.py index aff7e9f99..62b0471a3 100644 --- a/libs/jinja2/lexer.py +++ b/libs/jinja2/lexer.py @@ -3,6 +3,7 @@ the bitshift operators we don't allow in templates. It separates template code and python code in expressions. """ + import re import typing as t from ast import literal_eval @@ -15,6 +16,7 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .environment import Environment # cache for the lexers. Exists in order to be able to have multiple @@ -447,7 +449,7 @@ def get_lexer(environment: "Environment") -> "Lexer": return lexer -class OptionalLStrip(tuple): +class OptionalLStrip(tuple): # type: ignore[type-arg] """A special tuple for marking a point in the state that can have lstrip applied. """ diff --git a/libs/jinja2/loaders.py b/libs/jinja2/loaders.py index 32f3a74e7..9eaf647ba 100644 --- a/libs/jinja2/loaders.py +++ b/libs/jinja2/loaders.py @@ -1,6 +1,7 @@ """API and implementations for loading templates from different data sources. """ + import importlib.util import os import posixpath @@ -177,7 +178,9 @@ class FileSystemLoader(BaseLoader): def __init__( self, - searchpath: t.Union[str, os.PathLike, t.Sequence[t.Union[str, os.PathLike]]], + searchpath: t.Union[ + str, "os.PathLike[str]", t.Sequence[t.Union[str, "os.PathLike[str]"]] + ], encoding: str = "utf-8", followlinks: bool = False, ) -> None: @@ -601,7 +604,10 @@ class ModuleLoader(BaseLoader): has_source_access = False def __init__( - self, path: t.Union[str, os.PathLike, t.Sequence[t.Union[str, os.PathLike]]] + self, + path: t.Union[ + str, "os.PathLike[str]", t.Sequence[t.Union[str, "os.PathLike[str]"]] + ], ) -> None: package_name = f"_jinja2_module_templates_{id(self):x}" diff --git a/libs/jinja2/meta.py b/libs/jinja2/meta.py index 0057d6eab..298499e26 100644 --- a/libs/jinja2/meta.py +++ b/libs/jinja2/meta.py @@ -1,6 +1,7 @@ """Functions that expose information about templates that might be interesting for introspection. """ + import typing as t from . import nodes diff --git a/libs/jinja2/nodes.py b/libs/jinja2/nodes.py index b2f88d9d9..2f93b90ec 100644 --- a/libs/jinja2/nodes.py +++ b/libs/jinja2/nodes.py @@ -2,6 +2,7 @@ some node tree helper functions used by the parser and compiler in order to normalize nodes. """ + import inspect import operator import typing as t @@ -13,6 +14,7 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .environment import Environment _NodeBound = t.TypeVar("_NodeBound", bound="Node") @@ -56,7 +58,7 @@ class NodeType(type): def __new__(mcs, name, bases, d): # type: ignore for attr in "fields", "attributes": - storage = [] + storage: t.List[t.Tuple[str, ...]] = [] storage.extend(getattr(bases[0] if bases else object, attr, ())) storage.extend(d.get(attr, ())) assert len(bases) <= 1, "multiple inheritance not allowed" diff --git a/libs/jinja2/optimizer.py b/libs/jinja2/optimizer.py index fe1010705..32d1c717b 100644 --- a/libs/jinja2/optimizer.py +++ b/libs/jinja2/optimizer.py @@ -7,6 +7,7 @@ would have a different scope. The solution would be a second syntax tree that stored the scoping rules. """ + import typing as t from . import nodes diff --git a/libs/jinja2/parser.py b/libs/jinja2/parser.py index 3354bc933..0ec997fb4 100644 --- a/libs/jinja2/parser.py +++ b/libs/jinja2/parser.py @@ -1,4 +1,5 @@ """Parse tokens from the lexer into nodes for the compiler.""" + import typing import typing as t @@ -10,6 +11,7 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .environment import Environment _ImportInclude = t.TypeVar("_ImportInclude", nodes.Import, nodes.Include) @@ -457,8 +459,7 @@ def parse_print(self) -> nodes.Output: @typing.overload def parse_assign_target( self, with_tuple: bool = ..., name_only: "te.Literal[True]" = ... - ) -> nodes.Name: - ... + ) -> nodes.Name: ... @typing.overload def parse_assign_target( @@ -467,8 +468,7 @@ def parse_assign_target( name_only: bool = False, extra_end_rules: t.Optional[t.Tuple[str, ...]] = None, with_namespace: bool = False, - ) -> t.Union[nodes.NSRef, nodes.Name, nodes.Tuple]: - ... + ) -> t.Union[nodes.NSRef, nodes.Name, nodes.Tuple]: ... def parse_assign_target( self, @@ -861,7 +861,14 @@ def parse_subscribed(self) -> nodes.Expr: return nodes.Slice(lineno=lineno, *args) # noqa: B026 - def parse_call_args(self) -> t.Tuple: + def parse_call_args( + self, + ) -> t.Tuple[ + t.List[nodes.Expr], + t.List[nodes.Keyword], + t.Optional[nodes.Expr], + t.Optional[nodes.Expr], + ]: token = self.stream.expect("lparen") args = [] kwargs = [] @@ -952,7 +959,7 @@ def parse_test(self, node: nodes.Expr) -> nodes.Expr: next(self.stream) name += "." + self.stream.expect("name").value dyn_args = dyn_kwargs = None - kwargs = [] + kwargs: t.List[nodes.Keyword] = [] if self.stream.current.type == "lparen": args, kwargs, dyn_args, dyn_kwargs = self.parse_call_args() elif self.stream.current.type in { diff --git a/libs/jinja2/runtime.py b/libs/jinja2/runtime.py index 58a540ba3..4325c8deb 100644 --- a/libs/jinja2/runtime.py +++ b/libs/jinja2/runtime.py @@ -1,4 +1,5 @@ """The runtime functions and state used by compiled templates.""" + import functools import sys import typing as t @@ -28,7 +29,9 @@ if t.TYPE_CHECKING: import logging + import typing_extensions as te + from .environment import Environment class LoopRenderFunc(te.Protocol): @@ -37,8 +40,7 @@ def __call__( reciter: t.Iterable[V], loop_render_func: "LoopRenderFunc", depth: int = 0, - ) -> str: - ... + ) -> str: ... # these variables are exported to the template runtime @@ -259,7 +261,10 @@ def get_all(self) -> t.Dict[str, t.Any]: @internalcode def call( - __self, __obj: t.Callable, *args: t.Any, **kwargs: t.Any # noqa: B902 + __self, + __obj: t.Callable[..., t.Any], + *args: t.Any, + **kwargs: t.Any, # noqa: B902 ) -> t.Union[t.Any, "Undefined"]: """Call the callable with the arguments and keyword arguments provided but inject the active context or environment as first @@ -586,7 +591,7 @@ class AsyncLoopContext(LoopContext): @staticmethod def _to_iterator( # type: ignore - iterable: t.Union[t.Iterable[V], t.AsyncIterable[V]] + iterable: t.Union[t.Iterable[V], t.AsyncIterable[V]], ) -> t.AsyncIterator[V]: return auto_aiter(iterable) diff --git a/libs/jinja2/sandbox.py b/libs/jinja2/sandbox.py index 06d74148e..0b4fc12d3 100644 --- a/libs/jinja2/sandbox.py +++ b/libs/jinja2/sandbox.py @@ -1,14 +1,15 @@ """A sandbox layer that ensures unsafe operations cannot be performed. Useful when the template itself comes from an untrusted source. """ + import operator import types import typing as t -from _string import formatter_field_name_split # type: ignore from collections import abc from collections import deque from string import Formatter +from _string import formatter_field_name_split # type: ignore from markupsafe import EscapeFormatter from markupsafe import Markup @@ -37,7 +38,7 @@ #: unsafe attributes on async generators UNSAFE_ASYNC_GENERATOR_ATTRIBUTES = {"ag_code", "ag_frame"} -_mutable_spec: t.Tuple[t.Tuple[t.Type, t.FrozenSet[str]], ...] = ( +_mutable_spec: t.Tuple[t.Tuple[t.Type[t.Any], t.FrozenSet[str]], ...] = ( ( abc.MutableSet, frozenset( @@ -80,7 +81,7 @@ ) -def inspect_format_method(callable: t.Callable) -> t.Optional[str]: +def inspect_format_method(callable: t.Callable[..., t.Any]) -> t.Optional[str]: if not isinstance( callable, (types.MethodType, types.BuiltinMethodType) ) or callable.__name__ not in ("format", "format_map"): @@ -350,7 +351,7 @@ def format_string( s: str, args: t.Tuple[t.Any, ...], kwargs: t.Dict[str, t.Any], - format_func: t.Optional[t.Callable] = None, + format_func: t.Optional[t.Callable[..., t.Any]] = None, ) -> str: """If a format call is detected, then this is routed through this method so that our safety sandbox can be used for it. diff --git a/libs/jinja2/tests.py b/libs/jinja2/tests.py index a467cf08b..1a59e3703 100644 --- a/libs/jinja2/tests.py +++ b/libs/jinja2/tests.py @@ -1,4 +1,5 @@ """Built-in template tests used with the ``is`` operator.""" + import operator import typing as t from collections import abc @@ -169,7 +170,7 @@ def test_sequence(value: t.Any) -> bool: """ try: len(value) - value.__getitem__ + value.__getitem__ # noqa B018 except Exception: return False @@ -204,7 +205,7 @@ def test_escaped(value: t.Any) -> bool: return hasattr(value, "__html__") -def test_in(value: t.Any, seq: t.Container) -> bool: +def test_in(value: t.Any, seq: t.Container[t.Any]) -> bool: """Check if value is in seq. .. versionadded:: 2.10 diff --git a/libs/jinja2/utils.py b/libs/jinja2/utils.py index 18914a58f..7fb76935a 100644 --- a/libs/jinja2/utils.py +++ b/libs/jinja2/utils.py @@ -152,7 +152,7 @@ def import_string(import_name: str, silent: bool = False) -> t.Any: raise -def open_if_exists(filename: str, mode: str = "rb") -> t.Optional[t.IO]: +def open_if_exists(filename: str, mode: str = "rb") -> t.Optional[t.IO[t.Any]]: """Returns a file descriptor for the filename if that file exists, otherwise ``None``. """ @@ -450,7 +450,7 @@ def __setstate__(self, d: t.Mapping[str, t.Any]) -> None: self.__dict__.update(d) self._postinit() - def __getnewargs__(self) -> t.Tuple: + def __getnewargs__(self) -> t.Tuple[t.Any, ...]: return (self.capacity,) def copy(self) -> "LRUCache": diff --git a/libs/jinja2/visitor.py b/libs/jinja2/visitor.py index 17c6aaba5..7b8e18060 100644 --- a/libs/jinja2/visitor.py +++ b/libs/jinja2/visitor.py @@ -1,6 +1,7 @@ """API for traversing the AST nodes. Implemented by the compiler and meta introspection. """ + import typing as t from .nodes import Node @@ -9,8 +10,7 @@ import typing_extensions as te class VisitCallable(te.Protocol): - def __call__(self, node: Node, *args: t.Any, **kwargs: t.Any) -> t.Any: - ... + def __call__(self, node: Node, *args: t.Any, **kwargs: t.Any) -> t.Any: ... class NodeVisitor: diff --git a/libs/jsonschema-4.17.3.dist-info/METADATA b/libs/jsonschema-4.17.3.dist-info/METADATA index 07ec3f119..e1b42afd3 100644 --- a/libs/jsonschema-4.17.3.dist-info/METADATA +++ b/libs/jsonschema-4.17.3.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: jsonschema Version: 4.17.3 Summary: An implementation of JSON Schema validation for Python diff --git a/libs/jsonschema-4.17.3.dist-info/RECORD b/libs/jsonschema-4.17.3.dist-info/RECORD index f7b57b07a..a3d24eb00 100644 --- a/libs/jsonschema-4.17.3.dist-info/RECORD +++ b/libs/jsonschema-4.17.3.dist-info/RECORD @@ -1,9 +1,9 @@ ../../bin/jsonschema,sha256=OGb6w5dwZHsl6rXgS34xFKvogE2caDivcWj8ukkFJDc,236 jsonschema-4.17.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -jsonschema-4.17.3.dist-info/METADATA,sha256=YnDEs-j6S4At_Fq54u7PqfYG4gQT8E5nrp8vu2PXeXw,7879 +jsonschema-4.17.3.dist-info/METADATA,sha256=x_UDV2TgG-vvXjMZDEKIsx-NByuAhR-0OaABungk3cM,7879 jsonschema-4.17.3.dist-info/RECORD,, jsonschema-4.17.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jsonschema-4.17.3.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 +jsonschema-4.17.3.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 jsonschema-4.17.3.dist-info/entry_points.txt,sha256=vO7rX4Fs_xIVJy2pnAtKgTSxfpnozAVQ0DjCmpMxnWE,51 jsonschema-4.17.3.dist-info/licenses/COPYING,sha256=T5KgFaE8TRoEC-8BiqE0MLTxvHO0Gxa7hGw0Z2bedDk,1057 jsonschema/__init__.py,sha256=FRdJDXN8-AFk-Fj1qclckQsZNeGQB__r_QuMjtRoze4,2187 diff --git a/libs/jsonschema-4.17.3.dist-info/WHEEL b/libs/jsonschema-4.17.3.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/jsonschema-4.17.3.dist-info/WHEEL +++ b/libs/jsonschema-4.17.3.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/mako/__init__.py b/libs/mako/__init__.py index d022cf82d..d7223f7c3 100644 --- a/libs/mako/__init__.py +++ b/libs/mako/__init__.py @@ -5,4 +5,4 @@ # the MIT License: http://www.opensource.org/licenses/mit-license.php -__version__ = "1.3.2" +__version__ = "1.3.6" diff --git a/libs/mako/codegen.py b/libs/mako/codegen.py index ce6f83aac..b9fea937b 100644 --- a/libs/mako/codegen.py +++ b/libs/mako/codegen.py @@ -838,13 +838,24 @@ def visitControlLine(self, node): text = node.text self.printer.writeline(text) children = node.get_children() - # this covers the three situations where we want to insert a pass: - # 1) a ternary control line with no children, - # 2) a primary control line with nothing but its own ternary - # and end control lines, and - # 3) any control line with no content other than comments - if not children or ( - all( + + # this covers the four situations where we want to insert a pass: + # 1) a ternary control line with no children, + # 2) a primary control line with nothing but its own ternary + # and end control lines, and + # 3) any control line with no content other than comments + # 4) the first control block with no content other than comments + def _search_for_control_line(): + for c in children: + if isinstance(c, parsetree.Comment): + continue + elif isinstance(c, parsetree.ControlLine): + return True + return False + + if ( + not children + or all( isinstance(c, (parsetree.Comment, parsetree.ControlLine)) for c in children ) @@ -853,6 +864,7 @@ def visitControlLine(self, node): for c in children if isinstance(c, parsetree.ControlLine) ) + or _search_for_control_line() ): self.printer.writeline("pass") diff --git a/libs/mako/lexer.py b/libs/mako/lexer.py index 9d1f5f30d..b4a76a45f 100644 --- a/libs/mako/lexer.py +++ b/libs/mako/lexer.py @@ -375,7 +375,7 @@ def match_text(self): | (?=\${) # an expression | - (?= None: h.text = m.group('header').strip() if after: # Insert remaining lines as first block for future parsing. + if self.parser.state.isstate('looselist'): + # This is a weird edge case where a header is a child of a loose list + # and there is no blank line after the header. To ensure proper + # parsing, the line(s) after need to be detabbed. See #1443. + after = self.looseDetab(after) blocks.insert(0, after) else: # pragma: no cover # This should never happen, but just in case... diff --git a/libs/markdown/extensions/abbr.py b/libs/markdown/extensions/abbr.py index 738368afe..693c3bba9 100644 --- a/libs/markdown/extensions/abbr.py +++ b/libs/markdown/extensions/abbr.py @@ -25,31 +25,120 @@ from . import Extension from ..blockprocessors import BlockProcessor from ..inlinepatterns import InlineProcessor -from ..util import AtomicString +from ..treeprocessors import Treeprocessor +from ..util import AtomicString, deprecated +from typing import TYPE_CHECKING import re import xml.etree.ElementTree as etree +if TYPE_CHECKING: # pragma: no cover + from .. import Markdown + from ..blockparsers import BlockParser + class AbbrExtension(Extension): """ Abbreviation Extension for Python-Markdown. """ - def extendMarkdown(self, md): - """ Insert `AbbrPreprocessor` before `ReferencePreprocessor`. """ - md.parser.blockprocessors.register(AbbrPreprocessor(md.parser), 'abbr', 16) - + def __init__(self, **kwargs): + """ Initiate Extension and set up configs. """ + self.config = { + 'glossary': [ + {}, + 'A dictionary where the `key` is the abbreviation and the `value` is the definition.' + "Default: `{}`" + ], + } + """ Default configuration options. """ + super().__init__(**kwargs) + self.abbrs = {} + self.glossary = {} + + def reset(self): + """ Clear all previously defined abbreviations. """ + self.abbrs.clear() + if (self.glossary): + self.abbrs.update(self.glossary) + + def reset_glossary(self): + """ Clear all abbreviations from the glossary. """ + self.glossary.clear() + + def load_glossary(self, dictionary: dict[str, str]): + """Adds `dictionary` to our glossary. Any abbreviations that already exist will be overwritten.""" + if dictionary: + self.glossary = {**dictionary, **self.glossary} -class AbbrPreprocessor(BlockProcessor): - """ Abbreviation Preprocessor - parse text for abbr references. """ - - RE = re.compile(r'^[*]\[(?P[^\]]*)\][ ]?:[ ]*\n?[ ]*(?P.*)$', re.MULTILINE) + def extendMarkdown(self, md): + """ Insert `AbbrTreeprocessor` and `AbbrBlockprocessor`. """ + if (self.config['glossary'][0]): + self.load_glossary(self.config['glossary'][0]) + self.abbrs.update(self.glossary) + md.registerExtension(self) + md.treeprocessors.register(AbbrTreeprocessor(md, self.abbrs), 'abbr', 7) + md.parser.blockprocessors.register(AbbrBlockprocessor(md.parser, self.abbrs), 'abbr', 16) + + +class AbbrTreeprocessor(Treeprocessor): + """ Replace abbreviation text with `<abbr>` elements. """ + + def __init__(self, md: Markdown | None = None, abbrs: dict | None = None): + self.abbrs: dict = abbrs if abbrs is not None else {} + self.RE: re.RegexObject | None = None + super().__init__(md) + + def iter_element(self, el: etree.Element, parent: etree.Element | None = None) -> None: + ''' Recursively iterate over elements, run regex on text and wrap matches in `abbr` tags. ''' + for child in reversed(el): + self.iter_element(child, el) + if text := el.text: + for m in reversed(list(self.RE.finditer(text))): + if self.abbrs[m.group(0)]: + abbr = etree.Element('abbr', {'title': self.abbrs[m.group(0)]}) + abbr.text = AtomicString(m.group(0)) + abbr.tail = text[m.end():] + el.insert(0, abbr) + text = text[:m.start()] + el.text = text + if parent is not None and el.tail: + tail = el.tail + index = list(parent).index(el) + 1 + for m in reversed(list(self.RE.finditer(tail))): + abbr = etree.Element('abbr', {'title': self.abbrs[m.group(0)]}) + abbr.text = AtomicString(m.group(0)) + abbr.tail = tail[m.end():] + parent.insert(index, abbr) + tail = tail[:m.start()] + el.tail = tail + + def run(self, root: etree.Element) -> etree.Element | None: + ''' Step through tree to find known abbreviations. ''' + if not self.abbrs: + # No abbreviations defined. Skip running processor. + return + # Build and compile regex + abbr_list = list(self.abbrs.keys()) + abbr_list.sort(key=len, reverse=True) + self.RE = re.compile(f"\\b(?:{ '|'.join(re.escape(key) for key in abbr_list) })\\b") + # Step through tree and modify on matches + self.iter_element(root) + + +class AbbrBlockprocessor(BlockProcessor): + """ Parse text for abbreviation references. """ + + RE = re.compile(r'^[*]\[(?P<abbr>[^\\]*?)\][ ]?:[ ]*\n?[ ]*(?P<title>.*)$', re.MULTILINE) + + def __init__(self, parser: BlockParser, abbrs: dict): + self.abbrs: dict = abbrs + super().__init__(parser) def test(self, parent: etree.Element, block: str) -> bool: return True def run(self, parent: etree.Element, blocks: list[str]) -> bool: """ - Find and remove all Abbreviation references from the text. - Each reference is set as a new `AbbrPattern` in the markdown instance. + Find and remove all abbreviation references from the text. + Each reference is added to the abbreviation collection. """ block = blocks.pop(0) @@ -57,36 +146,27 @@ def run(self, parent: etree.Element, blocks: list[str]) -> bool: if m: abbr = m.group('abbr').strip() title = m.group('title').strip() - self.parser.md.inlinePatterns.register( - AbbrInlineProcessor(self._generate_pattern(abbr), title), 'abbr-%s' % abbr, 2 - ) - if block[m.end():].strip(): - # Add any content after match back to blocks as separate block - blocks.insert(0, block[m.end():].lstrip('\n')) - if block[:m.start()].strip(): - # Add any content before match back to blocks as separate block - blocks.insert(0, block[:m.start()].rstrip('\n')) - return True + if title and abbr: + if title == "''" or title == '""': + self.abbrs.pop(abbr) + else: + self.abbrs[abbr] = title + if block[m.end():].strip(): + # Add any content after match back to blocks as separate block + blocks.insert(0, block[m.end():].lstrip('\n')) + if block[:m.start()].strip(): + # Add any content before match back to blocks as separate block + blocks.insert(0, block[:m.start()].rstrip('\n')) + return True # No match. Restore block. blocks.insert(0, block) return False - def _generate_pattern(self, text: str) -> str: - """ - Given a string, returns an regex pattern to match that string. - - 'HTML' -> r'(?P<abbr>[H][T][M][L])' - Note: we force each char as a literal match (in brackets) as we don't - know what they will be beforehand. - - """ - chars = list(text) - for i in range(len(chars)): - chars[i] = r'[%s]' % chars[i] - return r'(?P<abbr>\b%s\b)' % (r''.join(chars)) +AbbrPreprocessor = deprecated("This class has been renamed to `AbbrBlockprocessor`.")(AbbrBlockprocessor) +@deprecated("This class will be removed in the future; use `AbbrTreeprocessor` instead.") class AbbrInlineProcessor(InlineProcessor): """ Abbreviation inline pattern. """ diff --git a/libs/markdown/extensions/attr_list.py b/libs/markdown/extensions/attr_list.py index 7ce3f9925..9206d11e6 100644 --- a/libs/markdown/extensions/attr_list.py +++ b/libs/markdown/extensions/attr_list.py @@ -57,17 +57,30 @@ def _handle_word(s, t): _scanner = re.Scanner([ - (r'[^ =]+=".*?"', _handle_double_quote), - (r"[^ =]+='.*?'", _handle_single_quote), - (r'[^ =]+=[^ =]+', _handle_key_value), - (r'[^ =]+', _handle_word), + (r'[^ =}]+=".*?"', _handle_double_quote), + (r"[^ =}]+='.*?'", _handle_single_quote), + (r'[^ =}]+=[^ =}]+', _handle_key_value), + (r'[^ =}]+', _handle_word), (r' ', None) ]) -def get_attrs(str: str) -> list[tuple[str, str]]: - """ Parse attribute list and return a list of attribute tuples. """ - return _scanner.scan(str)[0] +def get_attrs_and_remainder(attrs_string: str) -> tuple[list[tuple[str, str]], str]: + """ Parse attribute list and return a list of attribute tuples. + + Additionally, return any text that remained after a curly brace. In typical cases, its presence + should mean that the input does not match the intended attribute list syntax. + """ + attrs, remainder = _scanner.scan(attrs_string) + # To keep historic behavior, discard all unparsable text prior to '}'. + index = remainder.find('}') + remainder = remainder[index:] if index != -1 else '' + return attrs, remainder + + +def get_attrs(str: str) -> list[tuple[str, str]]: # pragma: no cover + """ Soft-deprecated. Prefer `get_attrs_and_remainder`. """ + return get_attrs_and_remainder(str)[0] def isheader(elem: Element) -> bool: @@ -76,7 +89,7 @@ def isheader(elem: Element) -> bool: class AttrListTreeprocessor(Treeprocessor): - BASE_RE = r'\{\:?[ ]*([^\}\n ][^\}\n]*)[ ]*\}' + BASE_RE = r'\{\:?[ ]*([^\}\n ][^\n]*)[ ]*\}' HEADER_RE = re.compile(r'[ ]+{}[ ]*$'.format(BASE_RE)) BLOCK_RE = re.compile(r'\n[ ]*{}[ ]*$'.format(BASE_RE)) INLINE_RE = re.compile(r'^{}'.format(BASE_RE)) @@ -106,49 +119,58 @@ def run(self, doc: Element) -> None: # use tail of last child. no `ul` or `ol`. m = RE.search(elem[-1].tail) if m: - self.assign_attrs(elem, m.group(1)) - elem[-1].tail = elem[-1].tail[:m.start()] + if not self.assign_attrs(elem, m.group(1), strict=True): + elem[-1].tail = elem[-1].tail[:m.start()] elif pos is not None and pos > 0 and elem[pos-1].tail: # use tail of last child before `ul` or `ol` m = RE.search(elem[pos-1].tail) if m: - self.assign_attrs(elem, m.group(1)) - elem[pos-1].tail = elem[pos-1].tail[:m.start()] + if not self.assign_attrs(elem, m.group(1), strict=True): + elem[pos-1].tail = elem[pos-1].tail[:m.start()] elif elem.text: # use text. `ul` is first child. m = RE.search(elem.text) if m: - self.assign_attrs(elem, m.group(1)) - elem.text = elem.text[:m.start()] + if not self.assign_attrs(elem, m.group(1), strict=True): + elem.text = elem.text[:m.start()] elif len(elem) and elem[-1].tail: # has children. Get from tail of last child m = RE.search(elem[-1].tail) if m: - self.assign_attrs(elem, m.group(1)) - elem[-1].tail = elem[-1].tail[:m.start()] - if isheader(elem): - # clean up trailing #s - elem[-1].tail = elem[-1].tail.rstrip('#').rstrip() + if not self.assign_attrs(elem, m.group(1), strict=True): + elem[-1].tail = elem[-1].tail[:m.start()] + if isheader(elem): + # clean up trailing #s + elem[-1].tail = elem[-1].tail.rstrip('#').rstrip() elif elem.text: # no children. Get from text. m = RE.search(elem.text) if m: - self.assign_attrs(elem, m.group(1)) - elem.text = elem.text[:m.start()] - if isheader(elem): - # clean up trailing #s - elem.text = elem.text.rstrip('#').rstrip() + if not self.assign_attrs(elem, m.group(1), strict=True): + elem.text = elem.text[:m.start()] + if isheader(elem): + # clean up trailing #s + elem.text = elem.text.rstrip('#').rstrip() else: # inline: check for `attrs` at start of tail if elem.tail: m = self.INLINE_RE.match(elem.tail) if m: - self.assign_attrs(elem, m.group(1)) - elem.tail = elem.tail[m.end():] + remainder = self.assign_attrs(elem, m.group(1)) + elem.tail = elem.tail[m.end():] + remainder + + def assign_attrs(self, elem: Element, attrs_string: str, *, strict: bool = False) -> str: + """ Assign `attrs` to element. + + If the `attrs_string` has an extra closing curly brace, the remaining text is returned. + + The `strict` argument controls whether to still assign `attrs` if there is a remaining `}`. + """ + attrs, remainder = get_attrs_and_remainder(attrs_string) + if strict and remainder: + return remainder - def assign_attrs(self, elem: Element, attrs: str) -> None: - """ Assign `attrs` to element. """ - for k, v in get_attrs(attrs): + for k, v in attrs: if k == '.': # add to class cls = elem.get('class') @@ -159,11 +181,13 @@ def assign_attrs(self, elem: Element, attrs: str) -> None: else: # assign attribute `k` with `v` elem.set(self.sanitize_name(k), v) + # The text that we initially over-matched will be put back. + return remainder def sanitize_name(self, name: str) -> str: """ - Sanitize name as 'an XML Name, minus the ":"'. - See https://www.w3.org/TR/REC-xml-names/#NT-NCName + Sanitize name as 'an XML Name, minus the `:`.' + See <https://www.w3.org/TR/REC-xml-names/#NT-NCName>. """ return self.NAME_RE.sub('_', name) diff --git a/libs/markdown/extensions/fenced_code.py b/libs/markdown/extensions/fenced_code.py index da1a9be1e..bae7330a3 100644 --- a/libs/markdown/extensions/fenced_code.py +++ b/libs/markdown/extensions/fenced_code.py @@ -25,7 +25,7 @@ from . import Extension from ..preprocessors import Preprocessor from .codehilite import CodeHilite, CodeHiliteExtension, parse_hl_lines -from .attr_list import get_attrs, AttrListExtension +from .attr_list import get_attrs_and_remainder, AttrListExtension from ..util import parseBoolValue from ..serializers import _escape_attrib_html import re @@ -56,7 +56,7 @@ class FencedBlockPreprocessor(Preprocessor): FENCED_BLOCK_RE = re.compile( dedent(r''' (?P<fence>^(?:~{3,}|`{3,}))[ ]* # opening fence - ((\{(?P<attrs>[^\}\n]*)\})| # (optional {attrs} or + ((\{(?P<attrs>[^\n]*)\})| # (optional {attrs} or (\.?(?P<lang>[\w#.+-]*)[ ]*)? # optional (.)lang (hl_lines=(?P<quot>"|')(?P<hl_lines>.*?)(?P=quot)[ ]*)?) # optional hl_lines) \n # newline (end of opening fence) @@ -94,12 +94,17 @@ def run(self, lines: list[str]) -> list[str]: self.checked_for_deps = True text = "\n".join(lines) + index = 0 while 1: - m = self.FENCED_BLOCK_RE.search(text) + m = self.FENCED_BLOCK_RE.search(text, index) if m: lang, id, classes, config = None, '', [], {} if m.group('attrs'): - id, classes, config = self.handle_attrs(get_attrs(m.group('attrs'))) + attrs, remainder = get_attrs_and_remainder(m.group('attrs')) + if remainder: # Does not have correctly matching curly braces, so the syntax is invalid. + index = m.end('attrs') # Explicitly skip over this, to prevent an infinite loop. + continue + id, classes, config = self.handle_attrs(attrs) if len(classes): lang = classes.pop(0) else: @@ -151,6 +156,8 @@ def run(self, lines: list[str]) -> list[str]: placeholder = self.md.htmlStash.store(code) text = f'{text[:m.start()]}\n{placeholder}\n{text[m.end():]}' + # Continue from after the replaced text in the next iteration. + index = m.start() + 1 + len(placeholder) else: break return text.split("\n") diff --git a/libs/markdown/extensions/smarty.py b/libs/markdown/extensions/smarty.py index 0ce7772a7..7a7c952dc 100644 --- a/libs/markdown/extensions/smarty.py +++ b/libs/markdown/extensions/smarty.py @@ -269,7 +269,7 @@ def extendMarkdown(self, md): self.educateDashes(md) inlineProcessor = InlineProcessor(md) inlineProcessor.inlinePatterns = self.inlinePatterns - md.treeprocessors.register(inlineProcessor, 'smarty', 2) + md.treeprocessors.register(inlineProcessor, 'smarty', 6) md.ESCAPED_CHARS.extend(['"', "'"]) diff --git a/libs/markdown/extensions/toc.py b/libs/markdown/extensions/toc.py index a17d7241c..5462a906c 100644 --- a/libs/markdown/extensions/toc.py +++ b/libs/markdown/extensions/toc.py @@ -6,7 +6,7 @@ # Original code Copyright 2008 [Jack Miller](https://codezen.org/) -# All changes Copyright 2008-2014 The Python Markdown Project +# All changes Copyright 2008-2024 The Python Markdown Project # License: [BSD](https://opensource.org/licenses/bsd-license.php) @@ -21,11 +21,13 @@ from . import Extension from ..treeprocessors import Treeprocessor -from ..util import code_escape, parseBoolValue, AMP_SUBSTITUTE, HTML_PLACEHOLDER_RE, AtomicString +from ..util import parseBoolValue, AMP_SUBSTITUTE, deprecated, HTML_PLACEHOLDER_RE, AtomicString from ..treeprocessors import UnescapeTreeprocessor +from ..serializers import RE_AMP import re import html import unicodedata +from copy import deepcopy import xml.etree.ElementTree as etree from typing import TYPE_CHECKING, Any, Iterator, MutableSet @@ -63,6 +65,7 @@ def unique(id: str, ids: MutableSet[str]) -> str: return id +@deprecated('Use `render_inner_html` and `striptags` instead.') def get_name(el: etree.Element) -> str: """Get title name.""" @@ -75,6 +78,7 @@ def get_name(el: etree.Element) -> str: return ''.join(text).strip() +@deprecated('Use `run_postprocessors`, `render_inner_html` and/or `striptags` instead.') def stashedHTML2text(text: str, md: Markdown, strip_entities: bool = True) -> str: """ Extract raw HTML from stash, reduce to plain text and swap with placeholder. """ def _html_sub(m: re.Match[str]) -> str: @@ -93,11 +97,80 @@ def _html_sub(m: re.Match[str]) -> str: def unescape(text: str) -> str: - """ Unescape escaped text. """ + """ Unescape Markdown backslash escaped text. """ c = UnescapeTreeprocessor() return c.unescape(text) +def strip_tags(text: str) -> str: + """ Strip HTML tags and return plain text. Note: HTML entities are unaffected. """ + # A comment could contain a tag, so strip comments first + while (start := text.find('<!--')) != -1 and (end := text.find('-->', start)) != -1: + text = f'{text[:start]}{text[end + 3:]}' + + while (start := text.find('<')) != -1 and (end := text.find('>', start)) != -1: + text = f'{text[:start]}{text[end + 1:]}' + + # Collapse whitespace + text = ' '.join(text.split()) + return text + + +def escape_cdata(text: str) -> str: + """ Escape character data. """ + if "&" in text: + # Only replace & when not part of an entity + text = RE_AMP.sub('&', text) + if "<" in text: + text = text.replace("<", "<") + if ">" in text: + text = text.replace(">", ">") + return text + + +def run_postprocessors(text: str, md: Markdown) -> str: + """ Run postprocessors from Markdown instance on text. """ + for pp in md.postprocessors: + text = pp.run(text) + return text.strip() + + +def render_inner_html(el: etree.Element, md: Markdown) -> str: + """ Fully render inner html of an `etree` element as a string. """ + # The `UnescapeTreeprocessor` runs after `toc` extension so run here. + text = unescape(md.serializer(el)) + + # strip parent tag + start = text.index('>') + 1 + end = text.rindex('<') + text = text[start:end].strip() + + return run_postprocessors(text, md) + + +def remove_fnrefs(root: etree.Element) -> etree.Element: + """ Remove footnote references from a copy of the element, if any are present. """ + # Remove footnote references, which look like this: `<sup id="fnref:1">...</sup>`. + # If there are no `sup` elements, then nothing to do. + if next(root.iter('sup'), None) is None: + return root + root = deepcopy(root) + # Find parent elements that contain `sup` elements. + for parent in root.findall('.//sup/..'): + carry_text = "" + for child in reversed(parent): # Reversed for the ability to mutate during iteration. + # Remove matching footnote references but carry any `tail` text to preceding elements. + if child.tag == 'sup' and child.get('id', '').startswith('fnref'): + carry_text = f'{child.tail or ""}{carry_text}' + parent.remove(child) + elif carry_text: + child.tail = f'{child.tail or ""}{carry_text}' + carry_text = "" + if carry_text: + parent.text = f'{parent.text or ""}{carry_text}' + return root + + def nest_toc_tokens(toc_list): """Given an unsorted list with errors and skips, return a nested one. @@ -300,27 +373,30 @@ def run(self, doc: etree.Element) -> None: for el in doc.iter(): if isinstance(el.tag, str) and self.header_rgx.match(el.tag): self.set_level(el) - text = get_name(el) + innerhtml = render_inner_html(remove_fnrefs(el), self.md) + name = strip_tags(innerhtml) # Do not override pre-existing ids if "id" not in el.attrib: - innertext = unescape(stashedHTML2text(text, self.md)) - el.attrib["id"] = unique(self.slugify(innertext, self.sep), used_ids) + el.attrib["id"] = unique(self.slugify(html.unescape(name), self.sep), used_ids) + + data_toc_label = '' + if 'data-toc-label' in el.attrib: + data_toc_label = run_postprocessors(unescape(el.attrib['data-toc-label']), self.md) + # Overwrite name with sanitized value of `data-toc-label`. + name = escape_cdata(strip_tags(data_toc_label)) + # Remove the data-toc-label attribute as it is no longer needed + del el.attrib['data-toc-label'] if int(el.tag[-1]) >= self.toc_top and int(el.tag[-1]) <= self.toc_bottom: toc_tokens.append({ 'level': int(el.tag[-1]), 'id': el.attrib["id"], - 'name': unescape(stashedHTML2text( - code_escape(el.attrib.get('data-toc-label', text)), - self.md, strip_entities=False - )) + 'name': name, + 'html': innerhtml, + 'data-toc-label': data_toc_label }) - # Remove the data-toc-label attribute as it is no longer needed - if 'data-toc-label' in el.attrib: - del el.attrib['data-toc-label'] - if self.use_anchors: self.add_anchor(el, el.attrib["id"]) if self.use_permalinks not in [False, None]: diff --git a/libs/markupsafe/_speedups.cpython-38-darwin.so b/libs/markupsafe/_speedups.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..1e95bfdece9d811a0d0e1e5e73366f37847d7ef3 GIT binary patch literal 18712 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 literal 0 HcmV?d00001 diff --git a/libs/msgpack-1.0.7.dist-info/RECORD b/libs/msgpack-1.0.7.dist-info/RECORD deleted file mode 100644 index a24a8c38b..000000000 --- a/libs/msgpack-1.0.7.dist-info/RECORD +++ /dev/null @@ -1,23 +0,0 @@ -msgpack-1.0.7.dist-info/COPYING,sha256=SS3tuoXaWHL3jmCRvNH-pHTWYNNay03ulkuKqz8AdCc,614 -msgpack-1.0.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -msgpack-1.0.7.dist-info/METADATA,sha256=eTTPd8hl96E9Twz499RXt7iV67QBu793z8bmlOsNOQY,9074 -msgpack-1.0.7.dist-info/RECORD,, -msgpack-1.0.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -msgpack-1.0.7.dist-info/WHEEL,sha256=UkJU7GAEhyIKVwGX1j1L5OGjUFT--MirwyCseqfCpZU,109 -msgpack-1.0.7.dist-info/top_level.txt,sha256=2tykSY1pXdiA2xYTDR6jPw0qI5ZGxRihyhf4S5hZyXk,8 -msgpack/__init__.py,sha256=tMxCiw7hJRLJN3JgUmPXOo64qMaUAbKTCf44CvE2tg8,1077 -msgpack/_cmsgpack.cpp,sha256=OzCMmPJHElYxP0pEu781YltqN0UDwMKCvfpU3d6AG_c,1024996 -msgpack/_cmsgpack.cpython-38-darwin.so,sha256=kUdrR4exdyExOu59q8djhksQwZu24Na_c4GCNF4ABK0,215704 -msgpack/_cmsgpack.pyx,sha256=JQb-SpqADciQgq3jEhFskYbQmtZL-o46G7CEkOi5qFc,335 -msgpack/_packer.pyx,sha256=4X3JTr9wbEmkbqEw2NEDnNQsbqlTZjh3X2PFUdAI34w,14607 -msgpack/_unpacker.pyx,sha256=9oq2d3v_0VzsY1biMQ3_3CwPyQfDOYRDjU3ZxPkXXTc,18888 -msgpack/buff_converter.h,sha256=t0RwS7ilhFPHeo83lznAtJsvBBbD85txgvVDOJCSGYg,220 -msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 -msgpack/ext.py,sha256=fKp00BqDLjUtZnPd70Llr138zk8JsCuSpJkkZ5S4dt8,5629 -msgpack/fallback.py,sha256=wdUWJkWX2gzfRW9BBCTOuIE1Wvrf5PtBtR8ZtY7G_EE,33175 -msgpack/pack.h,sha256=tK5VBNP9-R5FJ4etPQ1hWTswfyTnlqNuAYRczwBUCP0,2072 -msgpack/pack_template.h,sha256=Yqe6kpV4w9CVwhCluL5kHoqz1ihceY1zN6Sypx2Lztc,21775 -msgpack/sysdep.h,sha256=g0Be20rldEx2yZHY-s7eFtzx7dZlnognCutLNL2Cys8,6452 -msgpack/unpack.h,sha256=2349vxJmTKqSB9H69ILZqCjb7W9oDNJgmLk0RXN1ax4,10976 -msgpack/unpack_define.h,sha256=ebuKljj6t2eb7UVM-cl6cr2l0oK0PcMx3l7Zhqq6wEQ,2366 -msgpack/unpack_template.h,sha256=iyowdiEgnnnue1Mpj5BU5d0Q_Tc-SWFrbM_rOmE5_qk,14846 diff --git a/libs/msgpack-1.0.7.dist-info/COPYING b/libs/msgpack-1.1.0.dist-info/COPYING similarity index 100% rename from libs/msgpack-1.0.7.dist-info/COPYING rename to libs/msgpack-1.1.0.dist-info/COPYING diff --git a/libs/msgpack-1.0.7.dist-info/INSTALLER b/libs/msgpack-1.1.0.dist-info/INSTALLER similarity index 100% rename from libs/msgpack-1.0.7.dist-info/INSTALLER rename to libs/msgpack-1.1.0.dist-info/INSTALLER diff --git a/libs/msgpack-1.0.7.dist-info/METADATA b/libs/msgpack-1.1.0.dist-info/METADATA similarity index 79% rename from libs/msgpack-1.0.7.dist-info/METADATA rename to libs/msgpack-1.1.0.dist-info/METADATA index 04593911b..0adb412db 100644 --- a/libs/msgpack-1.0.7.dist-info/METADATA +++ b/libs/msgpack-1.1.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: msgpack -Version: 1.0.7 +Version: 1.1.0 Summary: MessagePack serializer Author-email: Inada Naoki <songofacandy@gmail.com> License: Apache 2.0 @@ -39,53 +39,6 @@ It lets you exchange data among multiple languages like JSON. But it's faster and smaller. This package provides CPython bindings for reading and writing MessagePack data. - -## Very important notes for existing users - -### PyPI package name - -Package name on PyPI was changed from `msgpack-python` to `msgpack` from 0.5. - -When upgrading from msgpack-0.4 or earlier, do `pip uninstall msgpack-python` before -`pip install -U msgpack`. - - -### Compatibility with the old format - -You can use `use_bin_type=False` option to pack `bytes` -object into raw type in the old msgpack spec, instead of bin type in new msgpack spec. - -You can unpack old msgpack format using `raw=True` option. -It unpacks str (raw) type in msgpack into Python bytes. - -See note below for detail. - - -### Major breaking changes in msgpack 1.0 - -* Python 2 - - * The extension module does not support Python 2 anymore. - The pure Python implementation (`msgpack.fallback`) is used for Python 2. - -* Packer - - * `use_bin_type=True` by default. bytes are encoded in bin type in msgpack. - **If you are still using Python 2, you must use unicode for all string types.** - You can use `use_bin_type=False` to encode into old msgpack format. - * `encoding` option is removed. UTF-8 is used always. - -* Unpacker - - * `raw=False` by default. It assumes str types are valid UTF-8 string - and decode them to Python str (unicode) object. - * `encoding` option is removed. You can use `raw=True` to support old format. - * Default value of `max_buffer_size` is changed from 0 to 100 MiB. - * Default value of `strict_map_key` is changed to True to avoid hashdos. - You need to pass `strict_map_key=False` if you have data which contain map keys - which type is not bytes or str. - - ## Install ``` @@ -94,12 +47,9 @@ $ pip install msgpack ### Pure Python implementation -The extension module in msgpack (`msgpack._cmsgpack`) does not support -Python 2 and PyPy. - -But msgpack provides a pure Python implementation (`msgpack.fallback`) -for PyPy and Python 2. +The extension module in msgpack (`msgpack._cmsgpack`) does not support PyPy. +But msgpack provides a pure Python implementation (`msgpack.fallback`) for PyPy. ### Windows @@ -111,10 +61,6 @@ Without extension, using pure Python implementation on CPython runs slowly. ## How to use -NOTE: In examples below, I use `raw=False` and `use_bin_type=True` for users -using msgpack < 1.0. These options are default from msgpack 1.0 so you can omit them. - - ### One-shot pack & unpack Use `packb` for packing and `unpackb` for unpacking. @@ -126,23 +72,13 @@ msgpack provides `dumps` and `loads` as an alias for compatibility with ```pycon >>> import msgpack ->>> msgpack.packb([1, 2, 3], use_bin_type=True) +>>> msgpack.packb([1, 2, 3]) '\x93\x01\x02\x03' ->>> msgpack.unpackb(_, raw=False) +>>> msgpack.unpackb(_) [1, 2, 3] ``` -`unpack` unpacks msgpack's array to Python's list, but can also unpack to tuple: - -```pycon ->>> msgpack.unpackb(b'\x93\x01\x02\x03', use_list=False, raw=False) -(1, 2, 3) -``` - -You should always specify the `use_list` keyword argument for backward compatibility. -See performance issues relating to `use_list option`_ below. - -Read the docstring for other options. +Read the docstring for options. ### Streaming unpacking @@ -156,11 +92,11 @@ from io import BytesIO buf = BytesIO() for i in range(100): - buf.write(msgpack.packb(i, use_bin_type=True)) + buf.write(msgpack.packb(i)) buf.seek(0) -unpacker = msgpack.Unpacker(buf, raw=False) +unpacker = msgpack.Unpacker(buf) for unpacked in unpacker: print(unpacked) ``` @@ -191,14 +127,17 @@ def encode_datetime(obj): return obj -packed_dict = msgpack.packb(useful_dict, default=encode_datetime, use_bin_type=True) -this_dict_again = msgpack.unpackb(packed_dict, object_hook=decode_datetime, raw=False) +packed_dict = msgpack.packb(useful_dict, default=encode_datetime) +this_dict_again = msgpack.unpackb(packed_dict, object_hook=decode_datetime) ``` `Unpacker`'s `object_hook` callback receives a dict; the `object_pairs_hook` callback may instead be used to receive a list of key-value pairs. +NOTE: msgpack can encode datetime with tzinfo into standard ext type for now. +See `datetime` option in `Packer` docstring. + ### Extended types @@ -220,8 +159,8 @@ It is also possible to pack/unpack custom data types using the **ext** type. ... return ExtType(code, data) ... >>> data = array.array('d', [1.2, 3.4]) ->>> packed = msgpack.packb(data, default=default, use_bin_type=True) ->>> unpacked = msgpack.unpackb(packed, ext_hook=ext_hook, raw=False) +>>> packed = msgpack.packb(data, default=default) +>>> unpacked = msgpack.unpackb(packed, ext_hook=ext_hook) >>> data == unpacked True ``` @@ -239,7 +178,7 @@ in a map, can be unpacked or skipped individually. ## Notes -### string and binary type +### string and binary type in old msgpack spec Early versions of msgpack didn't distinguish string and binary types. The type for representing both string and binary types was named **raw**. @@ -292,3 +231,41 @@ You can use `gc.disable()` when unpacking large message. List is the default sequence type of Python. But tuple is lighter than list. You can use `use_list=False` while unpacking when performance is important. + + +## Major breaking changes in the history + +### msgpack 0.5 + +Package name on PyPI was changed from `msgpack-python` to `msgpack` from 0.5. + +When upgrading from msgpack-0.4 or earlier, do `pip uninstall msgpack-python` before +`pip install -U msgpack`. + + +### msgpack 1.0 + +* Python 2 support + + * The extension module does not support Python 2 anymore. + The pure Python implementation (`msgpack.fallback`) is used for Python 2. + + * msgpack 1.0.6 drops official support of Python 2.7, as pip and + GitHub Action (setup-python) no longer support Python 2.7. + +* Packer + + * Packer uses `use_bin_type=True` by default. + Bytes are encoded in bin type in msgpack. + * The `encoding` option is removed. UTF-8 is used always. + +* Unpacker + + * Unpacker uses `raw=False` by default. It assumes str types are valid UTF-8 string + and decode them to Python str (unicode) object. + * `encoding` option is removed. You can use `raw=True` to support old format (e.g. unpack into bytes, not str). + * Default value of `max_buffer_size` is changed from 0 to 100 MiB to avoid DoS attack. + You need to pass `max_buffer_size=0` if you have large but safe data. + * Default value of `strict_map_key` is changed to True to avoid hashdos. + You need to pass `strict_map_key=False` if you have data which contain map keys + which type is not bytes or str. diff --git a/libs/msgpack-1.1.0.dist-info/RECORD b/libs/msgpack-1.1.0.dist-info/RECORD new file mode 100644 index 000000000..305695694 --- /dev/null +++ b/libs/msgpack-1.1.0.dist-info/RECORD @@ -0,0 +1,12 @@ +msgpack-1.1.0.dist-info/COPYING,sha256=SS3tuoXaWHL3jmCRvNH-pHTWYNNay03ulkuKqz8AdCc,614 +msgpack-1.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +msgpack-1.1.0.dist-info/METADATA,sha256=UgNSGURjli2SCAvt62QCD4Ixhpp5KfFYK3IN_gG502Y,8361 +msgpack-1.1.0.dist-info/RECORD,, +msgpack-1.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +msgpack-1.1.0.dist-info/WHEEL,sha256=8MbRJsGMYV6Ym1_SoG8YuJPvArpN2Z2wVWusEpp3feg,108 +msgpack-1.1.0.dist-info/top_level.txt,sha256=2tykSY1pXdiA2xYTDR6jPw0qI5ZGxRihyhf4S5hZyXk,8 +msgpack/__init__.py,sha256=reRaiOtEzSjPnr7TpxjgIvbfln5pV66FhricAs2eC-g,1109 +msgpack/_cmsgpack.cpython-38-darwin.so,sha256=w0_QrIPIxL9M2Y0i2fHnsp1XbZJWGqmznXJFdVrvaw8,181448 +msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726 +msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390 diff --git a/libs/msgpack-1.0.7.dist-info/REQUESTED b/libs/msgpack-1.1.0.dist-info/REQUESTED similarity index 100% rename from libs/msgpack-1.0.7.dist-info/REQUESTED rename to libs/msgpack-1.1.0.dist-info/REQUESTED diff --git a/libs/msgpack-1.0.7.dist-info/WHEEL b/libs/msgpack-1.1.0.dist-info/WHEEL similarity index 70% rename from libs/msgpack-1.0.7.dist-info/WHEEL rename to libs/msgpack-1.1.0.dist-info/WHEEL index 844cf17ca..be75fa70d 100644 --- a/libs/msgpack-1.0.7.dist-info/WHEEL +++ b/libs/msgpack-1.1.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: false Tag: cp38-cp38-macosx_12_0_x86_64 diff --git a/libs/msgpack-1.0.7.dist-info/top_level.txt b/libs/msgpack-1.1.0.dist-info/top_level.txt similarity index 100% rename from libs/msgpack-1.0.7.dist-info/top_level.txt rename to libs/msgpack-1.1.0.dist-info/top_level.txt diff --git a/libs/msgpack/__init__.py b/libs/msgpack/__init__.py index 60a088ccf..b61510544 100644 --- a/libs/msgpack/__init__.py +++ b/libs/msgpack/__init__.py @@ -1,20 +1,20 @@ -from .exceptions import * -from .ext import ExtType, Timestamp - +# ruff: noqa: F401 import os +from .exceptions import * # noqa: F403 +from .ext import ExtType, Timestamp -version = (1, 0, 7) -__version__ = "1.0.7" +version = (1, 1, 0) +__version__ = "1.1.0" if os.environ.get("MSGPACK_PUREPYTHON"): - from .fallback import Packer, unpackb, Unpacker + from .fallback import Packer, Unpacker, unpackb else: try: - from ._cmsgpack import Packer, unpackb, Unpacker + from ._cmsgpack import Packer, Unpacker, unpackb except ImportError: - from .fallback import Packer, unpackb, Unpacker + from .fallback import Packer, Unpacker, unpackb def pack(o, stream, **kwargs): diff --git a/libs/msgpack/_cmsgpack.cpp b/libs/msgpack/_cmsgpack.cpp deleted file mode 100644 index 7ce2c20c0..000000000 --- a/libs/msgpack/_cmsgpack.cpp +++ /dev/null @@ -1,25187 +0,0 @@ -/* Generated by Cython 3.0.2 */ - -#ifndef PY_SSIZE_T_CLEAN -#define PY_SSIZE_T_CLEAN -#endif /* PY_SSIZE_T_CLEAN */ -#if defined(CYTHON_LIMITED_API) && 0 - #ifndef Py_LIMITED_API - #if CYTHON_LIMITED_API+0 > 0x03030000 - #define Py_LIMITED_API CYTHON_LIMITED_API - #else - #define Py_LIMITED_API 0x03030000 - #endif - #endif -#endif - -#include "Python.h" - - #if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyFloat_FromString(obj) PyFloat_FromString(obj) - #else - #define __Pyx_PyFloat_FromString(obj) PyFloat_FromString(obj, NULL) - #endif - - - #if PY_MAJOR_VERSION <= 2 - #define PyDict_GetItemWithError _PyDict_GetItemWithError - #endif - - - #if (PY_VERSION_HEX < 0x030700b1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030600)) && !defined(PyContextVar_Get) - #define PyContextVar_Get(var, d, v) ((d) ? ((void)(var), Py_INCREF(d), (v)[0] = (d), 0) : ((v)[0] = NULL, 0) ) - #endif - -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) - #error Cython requires Python 2.7+ or Python 3.3+. -#else -#if CYTHON_LIMITED_API -#define __PYX_EXTRA_ABI_MODULE_NAME "limited" -#else -#define __PYX_EXTRA_ABI_MODULE_NAME "" -#endif -#define CYTHON_ABI "3_0_2" __PYX_EXTRA_ABI_MODULE_NAME -#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI -#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." -#define CYTHON_HEX_VERSION 0x030002F0 -#define CYTHON_FUTURE_DIVISION 1 -#include <stddef.h> -#ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#define __PYX_COMMA , -#ifndef HAVE_LONG_LONG - #define HAVE_LONG_LONG -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX -#if defined(GRAALVM_PYTHON) - /* For very preliminary testing purposes. Most variables are set the same as PyPy. - The existence of this section does not imply that anything works or is even tested */ - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_LIMITED_API 0 - #define CYTHON_COMPILING_IN_GRAAL 1 - #define CYTHON_COMPILING_IN_NOGIL 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 0 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL 0 - #undef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) - #endif - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #undef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 - #endif -#elif defined(PYPY_VERSION) - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_LIMITED_API 0 - #define CYTHON_COMPILING_IN_GRAAL 0 - #define CYTHON_COMPILING_IN_NOGIL 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #ifndef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 0 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL 0 - #undef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) - #endif - #if PY_VERSION_HEX < 0x03090000 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #endif - #undef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 - #endif -#elif defined(CYTHON_LIMITED_API) - #ifdef Py_LIMITED_API - #undef __PYX_LIMITED_VERSION_HEX - #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API - #endif - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_LIMITED_API 1 - #define CYTHON_COMPILING_IN_GRAAL 0 - #define CYTHON_COMPILING_IN_NOGIL 0 - #undef CYTHON_CLINE_IN_TRACEBACK - #define CYTHON_CLINE_IN_TRACEBACK 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 1 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #endif - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL 0 - #undef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS 1 - #endif - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 1 - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #endif - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 - #endif -#elif defined(PY_NOGIL) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_LIMITED_API 0 - #define CYTHON_COMPILING_IN_GRAAL 0 - #define CYTHON_COMPILING_IN_NOGIL 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #ifndef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 1 - #endif - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #define CYTHON_COMPILING_IN_LIMITED_API 0 - #define CYTHON_COMPILING_IN_GRAAL 0 - #define CYTHON_COMPILING_IN_NOGIL 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #ifndef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 0 - #endif - #ifndef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #ifndef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #ifndef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) - #endif - #ifndef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 - #endif - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS 1 - #endif - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #endif - #ifndef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 0 - #endif - #if PY_VERSION_HEX < 0x030400a1 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #elif !defined(CYTHON_USE_TP_FINALIZE) - #define CYTHON_USE_TP_FINALIZE 1 - #endif - #if PY_VERSION_HEX < 0x030600B1 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #elif !defined(CYTHON_USE_DICT_VERSIONS) - #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) - #endif - #if PY_VERSION_HEX < 0x030700A3 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #elif !defined(CYTHON_USE_EXC_INFO_STACK) - #define CYTHON_USE_EXC_INFO_STACK 1 - #endif - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 - #endif -#endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if !defined(CYTHON_VECTORCALL) -#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) -#endif -#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) -#if CYTHON_USE_PYLONG_INTERNALS - #if PY_MAJOR_VERSION < 3 - #include "longintrepr.h" - #endif - #undef SHIFT - #undef BASE - #undef MASK - #ifdef SIZEOF_VOID_P - enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; - #endif -#endif -#ifndef __has_attribute - #define __has_attribute(x) 0 -#endif -#ifndef __has_cpp_attribute - #define __has_cpp_attribute(x) 0 -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifndef CYTHON_UNUSED - #if defined(__cplusplus) - /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 - * but leads to warnings with -pedantic, since it is a C++17 feature */ - #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) - #if __has_cpp_attribute(maybe_unused) - #define CYTHON_UNUSED [[maybe_unused]] - #endif - #endif - #endif -#endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_UNUSED_VAR -# if defined(__cplusplus) - template<class T> void CYTHON_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR - #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_USE_CPP_STD_MOVE - #if defined(__cplusplus) && (\ - __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) - #define CYTHON_USE_CPP_STD_MOVE 1 - #else - #define CYTHON_USE_CPP_STD_MOVE 0 - #endif -#endif -#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) -#ifdef _MSC_VER - #ifndef _MSC_STDINT_H_ - #if _MSC_VER < 1300 - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; - #else - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - #endif - #endif - #if _MSC_VER < 1300 - #ifdef _WIN64 - typedef unsigned long long __pyx_uintptr_t; - #else - typedef unsigned int __pyx_uintptr_t; - #endif - #else - #ifdef _WIN64 - typedef unsigned __int64 __pyx_uintptr_t; - #else - typedef unsigned __int32 __pyx_uintptr_t; - #endif - #endif -#else - #include <stdint.h> - typedef uintptr_t __pyx_uintptr_t; -#endif -#ifndef CYTHON_FALLTHROUGH - #if defined(__cplusplus) - /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 - * but leads to warnings with -pedantic, since it is a C++17 feature */ - #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) - #if __has_cpp_attribute(fallthrough) - #define CYTHON_FALLTHROUGH [[fallthrough]] - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_cpp_attribute(clang::fallthrough) - #define CYTHON_FALLTHROUGH [[clang::fallthrough]] - #elif __has_cpp_attribute(gnu::fallthrough) - #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] - #endif - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_attribute(fallthrough) - #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) - #else - #define CYTHON_FALLTHROUGH - #endif - #endif - #if defined(__clang__) && defined(__apple_build_version__) - #if __apple_build_version__ < 7000000 - #undef CYTHON_FALLTHROUGH - #define CYTHON_FALLTHROUGH - #endif - #endif -#endif -#ifdef __cplusplus - template <typename T> - struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; - #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL<type>::value) -#else - #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) -#endif -#if CYTHON_COMPILING_IN_PYPY == 1 - #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) -#else - #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) -#endif -#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) - -#ifndef __cplusplus - #error "Cython files generated with the C++ option must be compiled with a C++ compiler." -#endif -#ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #else - #define CYTHON_INLINE inline - #endif -#endif -template<typename T> -void __Pyx_call_destructor(T& x) { - x.~T(); -} -template<typename T> -class __Pyx_FakeReference { - public: - __Pyx_FakeReference() : ptr(NULL) { } - __Pyx_FakeReference(const T& ref) : ptr(const_cast<T*>(&ref)) { } - T *operator->() { return ptr; } - T *operator&() { return ptr; } - operator T&() { return *ptr; } - template<typename U> bool operator ==(const U& other) const { return *ptr == other; } - template<typename U> bool operator !=(const U& other) const { return *ptr != other; } - template<typename U> bool operator==(const __Pyx_FakeReference<U>& other) const { return *ptr == *other.ptr; } - template<typename U> bool operator!=(const __Pyx_FakeReference<U>& other) const { return *ptr != *other.ptr; } - private: - T *ptr; -}; - -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_DefaultClassType PyClass_Type - #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" - #define __Pyx_DefaultClassType PyType_Type -#if CYTHON_COMPILING_IN_LIMITED_API - static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, - PyObject *code, PyObject *c, PyObject* n, PyObject *v, - PyObject *fv, PyObject *cell, PyObject* fn, - PyObject *name, int fline, PyObject *lnos) { - PyObject *exception_table = NULL; - PyObject *types_module=NULL, *code_type=NULL, *result=NULL; - PyObject *version_info; // borrowed - PyObject *py_minor_version = NULL; - long minor_version = 0; - PyObject *type, *value, *traceback; - PyErr_Fetch(&type, &value, &traceback); - #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 - minor_version = 11; // we don't yet need to distinguish between versions > 11 - #else - if (!(version_info = PySys_GetObject("version_info"))) goto end; - if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; - minor_version = PyLong_AsLong(py_minor_version); - if (minor_version == -1 && PyErr_Occurred()) goto end; - #endif - if (!(types_module = PyImport_ImportModule("types"))) goto end; - if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; - if (minor_version <= 7) { - (void)p; - result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, - c, n, v, fn, name, fline, lnos, fv, cell); - } else if (minor_version <= 10) { - result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, - c, n, v, fn, name, fline, lnos, fv, cell); - } else { - if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; - result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, - c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); - } - end: - Py_XDECREF(code_type); - Py_XDECREF(exception_table); - Py_XDECREF(types_module); - Py_XDECREF(py_minor_version); - if (type) { - PyErr_Restore(type, value, traceback); - } - return result; - } - #ifndef CO_OPTIMIZED - #define CO_OPTIMIZED 0x0001 - #endif - #ifndef CO_NEWLOCALS - #define CO_NEWLOCALS 0x0002 - #endif - #ifndef CO_VARARGS - #define CO_VARARGS 0x0004 - #endif - #ifndef CO_VARKEYWORDS - #define CO_VARKEYWORDS 0x0008 - #endif - #ifndef CO_ASYNC_GENERATOR - #define CO_ASYNC_GENERATOR 0x0200 - #endif - #ifndef CO_GENERATOR - #define CO_GENERATOR 0x0020 - #endif - #ifndef CO_COROUTINE - #define CO_COROUTINE 0x0080 - #endif -#elif PY_VERSION_HEX >= 0x030B0000 - static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, - PyObject *code, PyObject *c, PyObject* n, PyObject *v, - PyObject *fv, PyObject *cell, PyObject* fn, - PyObject *name, int fline, PyObject *lnos) { - PyCodeObject *result; - PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here - if (!empty_bytes) return NULL; - result = - #if PY_VERSION_HEX >= 0x030C0000 - PyUnstable_Code_NewWithPosOnlyArgs - #else - PyCode_NewWithPosOnlyArgs - #endif - (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); - Py_DECREF(empty_bytes); - return result; - } -#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#endif -#endif -#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) - #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) -#else - #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) -#endif -#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) - #define __Pyx_Py_Is(x, y) Py_Is(x, y) -#else - #define __Pyx_Py_Is(x, y) ((x) == (y)) -#endif -#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) - #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) -#else - #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) -#endif -#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) - #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) -#else - #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) -#endif -#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) - #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) -#else - #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) -#endif -#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) -#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) -#else - #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) -#endif -#ifndef CO_COROUTINE - #define CO_COROUTINE 0x80 -#endif -#ifndef CO_ASYNC_GENERATOR - #define CO_ASYNC_GENERATOR 0x200 -#endif -#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_FINALIZE - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#ifndef Py_TPFLAGS_SEQUENCE - #define Py_TPFLAGS_SEQUENCE 0 -#endif -#ifndef Py_TPFLAGS_MAPPING - #define Py_TPFLAGS_MAPPING 0 -#endif -#ifndef METH_STACKLESS - #define METH_STACKLESS 0 -#endif -#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) - #ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - #endif - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); - typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords -#endif -#if CYTHON_METH_FASTCALL - #define __Pyx_METH_FASTCALL METH_FASTCALL - #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast - #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords -#else - #define __Pyx_METH_FASTCALL METH_VARARGS - #define __Pyx_PyCFunction_FastCall PyCFunction - #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords -#endif -#if CYTHON_VECTORCALL - #define __pyx_vectorcallfunc vectorcallfunc - #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET - #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) -#elif CYTHON_BACKPORT_VECTORCALL - typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, - size_t nargsf, PyObject *kwnames); - #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) - #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) -#else - #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 - #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) -#endif -#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 - #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) - typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); -#else - #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) - #define __Pyx_PyCMethod PyCMethod -#endif -#ifndef METH_METHOD - #define METH_METHOD 0x200 -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif -#if CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_PyThreadState_Current PyThreadState_Get() -#elif !CYTHON_FAST_THREAD_STATE - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#elif PY_VERSION_HEX >= 0x03060000 - #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() -#elif PY_VERSION_HEX >= 0x03000000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#else - #define __Pyx_PyThreadState_Current _PyThreadState_Current -#endif -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) -{ - void *result; - result = PyModule_GetState(op); - if (!result) - Py_FatalError("Couldn't find the module state"); - return result; -} -#endif -#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) -#if CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) -#else - #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) -#endif -#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) -#include "pythread.h" -#define Py_tss_NEEDS_INIT 0 -typedef int Py_tss_t; -static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { - *key = PyThread_create_key(); - return 0; -} -static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { - Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); - *key = Py_tss_NEEDS_INIT; - return key; -} -static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { - PyObject_Free(key); -} -static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { - return *key != Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { - PyThread_delete_key(*key); - *key = Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { - return PyThread_set_key_value(*key, value); -} -static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - return PyThread_get_key_value(*key); -} -#endif -#if PY_MAJOR_VERSION < 3 - #if CYTHON_COMPILING_IN_PYPY - #if PYPY_VERSION_NUM < 0x07030600 - #if defined(__cplusplus) && __cplusplus >= 201402L - [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] - #elif defined(__GNUC__) || defined(__clang__) - __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) - #elif defined(_MSC_VER) - __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) - #endif - static CYTHON_INLINE int PyGILState_Check(void) { - return 0; - } - #else // PYPY_VERSION_NUM < 0x07030600 - #endif // PYPY_VERSION_NUM < 0x07030600 - #else - static CYTHON_INLINE int PyGILState_Check(void) { - PyThreadState * tstate = _PyThreadState_Current; - return tstate && (tstate == PyGILState_GetThisThreadState()); - } - #endif -#endif -#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) -#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) -#else -#define __Pyx_PyDict_NewPresized(n) PyDict_New() -#endif -#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && CYTHON_USE_UNICODE_INTERNALS -#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) -static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { - PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); - if (res == NULL) PyErr_Clear(); - return res; -} -#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) -#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError -#define __Pyx_PyDict_GetItemStr PyDict_GetItem -#else -static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { -#if CYTHON_COMPILING_IN_PYPY - return PyDict_GetItem(dict, name); -#else - PyDictEntry *ep; - PyDictObject *mp = (PyDictObject*) dict; - long hash = ((PyStringObject *) name)->ob_shash; - assert(hash != -1); - ep = (mp->ma_lookup)(mp, name, hash); - if (ep == NULL) { - return NULL; - } - return ep->me_value; -#endif -} -#define __Pyx_PyDict_GetItemStr PyDict_GetItem -#endif -#if CYTHON_USE_TYPE_SLOTS - #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) - #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) - #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) -#else - #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) - #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) - #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next -#endif -#if CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) -#else - #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) -#endif -#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 -#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ - PyTypeObject *type = Py_TYPE(obj);\ - assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ - PyObject_GC_Del(obj);\ - Py_DECREF(type);\ -} -#else -#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) -#endif -#if CYTHON_COMPILING_IN_LIMITED_API - #define CYTHON_PEP393_ENABLED 1 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) - #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) - #define __Pyx_PyUnicode_DATA(u) ((void*)u) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) -#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #if PY_VERSION_HEX >= 0x030C0000 - #define __Pyx_PyUnicode_READY(op) (0) - #else - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #endif - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) - #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) - #if PY_VERSION_HEX >= 0x030C0000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #else - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) - #endif - #endif -#else - #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) - #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #if !defined(PyUnicode_DecodeUnicodeEscape) - #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) - #endif - #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) - #undef PyUnicode_Contains - #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) - #endif - #if !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) - #endif - #if !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) - #endif -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#ifndef PyObject_Unicode - #define PyObject_Unicode PyObject_Str -#endif -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#if CYTHON_COMPILING_IN_CPYTHON - #define __Pyx_PySequence_ListKeepNew(obj)\ - (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) -#else - #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) -#endif -#if PY_VERSION_HEX >= 0x030900A4 - #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) -#else - #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) -#endif -#if CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) - #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) - #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) - #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) - #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) - #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) - #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) - #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) - #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) -#else - #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) - #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) - #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) - #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) - #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) - #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) - #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) - #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) - #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define __Pyx_Py3Int_Check(op) PyLong_Check(op) - #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#else - #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) - #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t -#endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif -#else - #define __Pyx_PyType_AsAsync(obj) NULL -#endif -#ifndef __Pyx_PyAsyncMethodsStruct - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; -#endif - -#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) - #if !defined(_USE_MATH_DEFINES) - #define _USE_MATH_DEFINES - #endif -#endif -#include <math.h> -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif - -#define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } -#define __PYX_ERR(f_index, lineno, Ln_error) \ - { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } - -#ifdef CYTHON_EXTERN_C - #undef __PYX_EXTERN_C - #define __PYX_EXTERN_C CYTHON_EXTERN_C -#elif defined(__PYX_EXTERN_C) - #ifdef _MSC_VER - #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") - #else - #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. - #endif -#else - #define __PYX_EXTERN_C extern "C++" -#endif - -#define __PYX_HAVE__msgpack___cmsgpack -#define __PYX_HAVE_API__msgpack___cmsgpack -/* Early includes */ -#include <string.h> -#include <stdio.h> -#include "datetime.h" - - /* Backport for Python 2.x */ - #if PY_MAJOR_VERSION < 3 - #ifndef PyDateTime_DELTA_GET_DAYS - #define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days) - #endif - #ifndef PyDateTime_DELTA_GET_SECONDS - #define PyDateTime_DELTA_GET_SECONDS(o) (((PyDateTime_Delta*)o)->seconds) - #endif - #ifndef PyDateTime_DELTA_GET_MICROSECONDS - #define PyDateTime_DELTA_GET_MICROSECONDS(o) (((PyDateTime_Delta*)o)->microseconds) - #endif - #endif - - /* Backport for Python < 3.6 */ - #if PY_VERSION_HEX < 0x030600a4 - #ifndef PyDateTime_TIME_GET_FOLD - #define PyDateTime_TIME_GET_FOLD(o) ((void)(o), 0) - #endif - #ifndef PyDateTime_DATE_GET_FOLD - #define PyDateTime_DATE_GET_FOLD(o) ((void)(o), 0) - #endif - #endif - - /* Backport for Python < 3.6 */ - #if PY_VERSION_HEX < 0x030600a4 - #define __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold) ((void)(fold), PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, minute, second, microsecond, tz, PyDateTimeAPI->DateTimeType)) - #define __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold) ((void)(fold), PyDateTimeAPI->Time_FromTime(hour, minute, second, microsecond, tz, PyDateTimeAPI->TimeType)) - #else /* For Python 3.6+ so that we can pass tz */ - #define __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold) PyDateTimeAPI->DateTime_FromDateAndTimeAndFold(year, month, day, hour, minute, second, microsecond, tz, fold, PyDateTimeAPI->DateTimeType) - #define __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold) PyDateTimeAPI->Time_FromTimeAndFold(hour, minute, second, microsecond, tz, fold, PyDateTimeAPI->TimeType) - #endif - - /* Backport for Python < 3.7 */ - #if PY_VERSION_HEX < 0x030700b1 - #define __Pyx_TimeZone_UTC NULL - #define __Pyx_TimeZone_FromOffsetAndName(offset, name) ((void)(offset), (void)(name), (PyObject*)NULL) - #else - #define __Pyx_TimeZone_UTC PyDateTime_TimeZone_UTC - #define __Pyx_TimeZone_FromOffsetAndName(offset, name) PyTimeZone_FromOffsetAndName(offset, name) - #endif - - /* Backport for Python < 3.10 */ - #if PY_VERSION_HEX < 0x030a00a1 - #ifndef PyDateTime_TIME_GET_TZINFO - #define PyDateTime_TIME_GET_TZINFO(o) ((((PyDateTime_Time*)o)->hastzinfo) ? ((PyDateTime_Time*)o)->tzinfo : Py_None) - #endif - #ifndef PyDateTime_DATE_GET_TZINFO - #define PyDateTime_DATE_GET_TZINFO(o) ((((PyDateTime_DateTime*)o)->hastzinfo) ? ((PyDateTime_DateTime*)o)->tzinfo : Py_None) - #endif - #endif - -#include "pythread.h" -#include "pack.h" -#include "buff_converter.h" -#include <stdlib.h> -#include <limits.h> -#include <stdint.h> -#include "unpack.h" -#ifdef _OPENMP -#include <omp.h> -#endif /* _OPENMP */ - -#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 1 -#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) -#define __PYX_DEFAULT_STRING_ENCODING "ascii" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_uchar_cast(c) ((unsigned char)c) -#define __Pyx_long_cast(x) ((long)x) -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ - (sizeof(type) < sizeof(Py_ssize_t)) ||\ - (sizeof(type) > sizeof(Py_ssize_t) &&\ - likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX) &&\ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ - v == (type)PY_SSIZE_T_MIN))) ||\ - (sizeof(type) == sizeof(Py_ssize_t) &&\ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { - return (size_t) i < (size_t) limit; -} -#if defined (__cplusplus) && __cplusplus >= 201103L - #include <cstdlib> - #define __Pyx_sst_abs(value) std::abs(value) -#elif SIZEOF_INT >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) abs(value) -#elif SIZEOF_LONG >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) labs(value) -#elif defined (_MSC_VER) - #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define __Pyx_sst_abs(value) llabs(value) -#elif defined (__GNUC__) - #define __Pyx_sst_abs(value) __builtin_llabs(value) -#else - #define __Pyx_sst_abs(value) ((value<0) ? -value : value) -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) -{ - const wchar_t *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#else -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) -{ - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#endif -#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) -#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); -#define __Pyx_PySequence_Tuple(obj)\ - (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); -#if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #if PY_VERSION_HEX >= 0x030C00A7 - #ifndef _PyLong_SIGN_MASK - #define _PyLong_SIGN_MASK 3 - #endif - #ifndef _PyLong_NON_SIZE_BITS - #define _PyLong_NON_SIZE_BITS 3 - #endif - #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) - #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) - #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) - #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) - #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) - #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) - #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) - #define __Pyx_PyLong_SignedDigitCount(x)\ - ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) - #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) - #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) - #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) - #else - #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) - #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) - #endif - typedef Py_ssize_t __Pyx_compact_pylong; - typedef size_t __Pyx_compact_upylong; - #else // Py < 3.12 - #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) - #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) - #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) - #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) - #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) - #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) - #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) - #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) - #define __Pyx_PyLong_CompactValue(x)\ - ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) - typedef sdigit __Pyx_compact_pylong; - typedef digit __Pyx_compact_upylong; - #endif - #if PY_VERSION_HEX >= 0x030C00A5 - #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) - #else - #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) - #endif -#endif -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = (char) c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ -static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } - -#if !CYTHON_USE_MODULE_STATE -static PyObject *__pyx_m = NULL; -#endif -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm = __FILE__; -static const char *__pyx_filename; - -/* #### Code section: filename_table ### */ - -static const char *__pyx_f[] = { - "msgpack/_packer.pyx", - "msgpack/_unpacker.pyx", - "datetime.pxd", - "contextvars.pxd", - "<stringsource>", - "msgpack/_cmsgpack.pyx", - "type.pxd", - "bool.pxd", - "complex.pxd", -}; -/* #### Code section: utility_code_proto_before_types ### */ -/* #### Code section: numeric_typedefs ### */ -/* #### Code section: complex_type_declarations ### */ -/* #### Code section: type_declarations ### */ - -/*--- Type declarations ---*/ -struct __pyx_obj_7msgpack_9_cmsgpack_Packer; -struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker; -struct __pyx_opt_args_7cpython_11contextvars_get_value; -struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default; - -/* "cpython/contextvars.pxd":112 - * - * - * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< - * """Return a new reference to the value of the context variable, - * or the default value of the context variable, - */ -struct __pyx_opt_args_7cpython_11contextvars_get_value { - int __pyx_n; - PyObject *default_value; -}; - -/* "cpython/contextvars.pxd":129 - * - * - * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< - * """Return a new reference to the value of the context variable, - * or the provided default value if no such value was found. - */ -struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default { - int __pyx_n; - PyObject *default_value; -}; -struct __pyx_opt_args_7cpython_8datetime_time_new; -struct __pyx_opt_args_7cpython_8datetime_datetime_new; -struct __pyx_opt_args_7cpython_8datetime_timezone_new; -struct __pyx_opt_args_7cpython_8datetime_datetime_from_timestamp; - -/* "cpython/datetime.pxd":292 - * # Create time object using DateTime CAPI factory function - * # Note, there are no range checks for any of the arguments. - * cdef inline time time_new(int hour, int minute, int second, int microsecond, object tz, int fold=0): # <<<<<<<<<<<<<< - * return __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold) - * - */ -struct __pyx_opt_args_7cpython_8datetime_time_new { - int __pyx_n; - int fold; -}; - -/* "cpython/datetime.pxd":297 - * # Create datetime object using DateTime CAPI factory function. - * # Note, there are no range checks for any of the arguments. - * cdef inline datetime datetime_new(int year, int month, int day, int hour, int minute, int second, int microsecond, object tz, int fold=0): # <<<<<<<<<<<<<< - * return __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold) - * - */ -struct __pyx_opt_args_7cpython_8datetime_datetime_new { - int __pyx_n; - int fold; -}; - -/* "cpython/datetime.pxd":306 - * - * # Create timedelta object using DateTime CAPI factory function. - * cdef inline object timezone_new(object offset, object name=None): # <<<<<<<<<<<<<< - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') - */ -struct __pyx_opt_args_7cpython_8datetime_timezone_new { - int __pyx_n; - PyObject *name; -}; - -/* "cpython/datetime.pxd":312 - * - * # Create datetime object using DB API constructor. - * cdef inline datetime datetime_from_timestamp(timestamp, tz=None): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.DateTime_FromTimestamp( - * <PyObject*>PyDateTimeAPI.DateTimeType, (timestamp, tz) if tz is not None else (timestamp,), NULL) - */ -struct __pyx_opt_args_7cpython_8datetime_datetime_from_timestamp { - int __pyx_n; - PyObject *tz; -}; -struct __pyx_opt_args_7msgpack_9_cmsgpack_6Packer__pack; -struct __pyx_opt_args_7msgpack_9_cmsgpack_8Unpacker__unpack; -struct __pyx_defaults; -typedef struct __pyx_defaults __pyx_defaults; - -/* "msgpack/_packer.pyx":147 - * self.pk.buf = NULL - * - * cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: # <<<<<<<<<<<<<< - * cdef long long llval - * cdef unsigned long long ullval - */ -struct __pyx_opt_args_7msgpack_9_cmsgpack_6Packer__pack { - int __pyx_n; - int nest_limit; -}; - -/* "msgpack/_unpacker.pyx":455 - * return 0 - * - * cdef object _unpack(self, execute_fn execute, bint iter=0): # <<<<<<<<<<<<<< - * cdef int ret - * cdef object obj - */ -struct __pyx_opt_args_7msgpack_9_cmsgpack_8Unpacker__unpack { - int __pyx_n; - int iter; -}; -struct __pyx_defaults { - PyObject *__pyx_arg_ext_hook; -}; - -/* "msgpack/_packer.pyx":62 - * - * - * cdef class Packer(object): # <<<<<<<<<<<<<< - * """ - * MessagePack Packer - */ -struct __pyx_obj_7msgpack_9_cmsgpack_Packer { - PyObject_HEAD - struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *__pyx_vtab; - struct msgpack_packer pk; - PyObject *_default; - PyObject *_berrors; - char const *unicode_errors; - int strict_types; - int use_float; - int autoreset; - int datetime; -}; - - -/* "msgpack/_unpacker.pyx":213 - * - * - * cdef class Unpacker(object): # <<<<<<<<<<<<<< - * """Streaming unpacker. - * - */ -struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker { - PyObject_HEAD - struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *__pyx_vtab; - unpack_context ctx; - char *buf; - Py_ssize_t buf_size; - Py_ssize_t buf_head; - Py_ssize_t buf_tail; - PyObject *file_like; - PyObject *file_like_read; - Py_ssize_t read_size; - PyObject *object_hook; - PyObject *object_pairs_hook; - PyObject *list_hook; - PyObject *ext_hook; - PyObject *unicode_errors; - Py_ssize_t max_buffer_size; - uint64_t stream_offset; -}; - - - -/* "msgpack/_packer.pyx":62 - * - * - * cdef class Packer(object): # <<<<<<<<<<<<<< - * """ - * MessagePack Packer - */ - -struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer { - int (*_pack)(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *, PyObject *, struct __pyx_opt_args_7msgpack_9_cmsgpack_6Packer__pack *__pyx_optional_args); - PyObject *(*pack)(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *, PyObject *, int __pyx_skip_dispatch); -}; -static struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *__pyx_vtabptr_7msgpack_9_cmsgpack_Packer; - - -/* "msgpack/_unpacker.pyx":213 - * - * - * cdef class Unpacker(object): # <<<<<<<<<<<<<< - * """Streaming unpacker. - * - */ - -struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker { - PyObject *(*append_buffer)(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *, void *, Py_ssize_t); - int (*read_from_file)(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *); - PyObject *(*_unpack)(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *, execute_fn, struct __pyx_opt_args_7msgpack_9_cmsgpack_8Unpacker__unpack *__pyx_optional_args); -}; -static struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *__pyx_vtabptr_7msgpack_9_cmsgpack_Unpacker; -/* #### Code section: utility_code_proto ### */ - -/* --- Runtime support code (head) --- */ -/* Refnanny.proto */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, Py_ssize_t); - void (*DECREF)(void*, PyObject*, Py_ssize_t); - void (*GOTREF)(void*, PyObject*, Py_ssize_t); - void (*GIVEREF)(void*, PyObject*, Py_ssize_t); - void* (*SetupContext)(const char*, Py_ssize_t, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - if (acquire_gil) {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ - PyGILState_Release(__pyx_gilstate_save);\ - } else {\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ - } - #define __Pyx_RefNannyFinishContextNogil() {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __Pyx_RefNannyFinishContext();\ - PyGILState_Release(__pyx_gilstate_save);\ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) - #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() -#endif - #define __Pyx_RefNannyFinishContextNogil() {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __Pyx_RefNannyFinishContext();\ - PyGILState_Release(__pyx_gilstate_save);\ - } - #define __Pyx_RefNannyFinishContext()\ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) - #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContextNogil() - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_Py_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; Py_XDECREF(tmp);\ - } while (0) -#define __Pyx_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_XDECREF(tmp);\ - } while (0) -#define __Pyx_DECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_DECREF(tmp);\ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -/* PyErrExceptionMatches.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) -static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); -#else -#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) -#endif - -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#if PY_VERSION_HEX >= 0x030C00A6 -#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) -#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) -#else -#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) -#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) -#endif -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) -#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -/* PyObjectGetAttrStrNoError.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); - -/* GetBuiltinName.proto */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -/* ExtTypeTest.proto */ -static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); - -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -/* RaiseException.proto */ -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); - -/* TupleAndListFromArray.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); -static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); -#endif - -/* IncludeStringH.proto */ -#include <string.h> - -/* BytesEquals.proto */ -static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); - -/* UnicodeEquals.proto */ -static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); - -/* fastcall.proto */ -#if CYTHON_AVOID_BORROWED_REFS - #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) -#elif CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) -#else - #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) -#endif -#if CYTHON_AVOID_BORROWED_REFS - #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) - #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) -#else - #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op - #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed -#endif -#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) -#define __Pyx_KwValues_VARARGS(args, nargs) NULL -#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) -#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) -#if CYTHON_METH_FASTCALL - #define __Pyx_Arg_FASTCALL(args, i) args[i] - #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) - #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) - static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); - #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) - #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs - #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array -#else - #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS - #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS - #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS - #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS - #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS - #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) - #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS -#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) -#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) -#else -#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) -#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) -#endif - -/* RaiseArgTupleInvalid.proto */ -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -/* KeywordStringCheck.proto */ -static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); - -/* RaiseDoubleKeywords.proto */ -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -/* ParseKeywords.proto */ -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, - PyObject **argnames[], - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, - const char* function_name); - -/* GetTopmostException.proto */ -#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE -static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); -#endif - -/* SaveResetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -#else -#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) -#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) -#endif - -/* GetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#if !CYTHON_VECTORCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); -#endif -#define __Pyx_BUILD_ASSERT_EXPR(cond)\ - (sizeof(char [1 - 2*!(cond)]) - 1) -#ifndef Py_MEMBER_SIZE -#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) -#endif -#if !CYTHON_VECTORCALL -#if PY_VERSION_HEX >= 0x03080000 - #include "frameobject.h" -#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API - #ifndef Py_BUILD_CORE - #define Py_BUILD_CORE 1 - #endif - #include "internal/pycore_frame.h" -#endif - #define __Pxy_PyFrame_Initialize_Offsets() - #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) -#else - static size_t __pyx_pyframe_localsplus_offset = 0; - #include "frameobject.h" - #define __Pxy_PyFrame_Initialize_Offsets()\ - ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ - (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) - #define __Pyx_PyFrame_GetLocalsplus(frame)\ - (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) -#endif -#endif -#endif - -/* PyObjectCallMethO.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); -#endif - -/* PyObjectFastCall.proto */ -#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) -static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); - -/* SwapException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* IterFinish.proto */ -static CYTHON_INLINE int __Pyx_IterFinish(void); - -/* PyObjectCallNoArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); - -/* PyObjectCallOneArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); - -/* PyObjectGetMethod.proto */ -static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); - -/* PyObjectCallMethod0.proto */ -static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); - -/* RaiseNeedMoreValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); - -/* RaiseTooManyValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); - -/* UnpackItemEndCheck.proto */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); - -/* RaiseNoneIterError.proto */ -static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); - -/* UnpackTupleError.proto */ -static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); - -/* UnpackTuple2.proto */ -#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ - (likely(is_tuple || PyTuple_Check(tuple)) ?\ - (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ - __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ - (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ - __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) -static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( - PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); -static int __Pyx_unpack_tuple2_generic( - PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); - -/* dict_iter.proto */ -static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, - Py_ssize_t* p_orig_length, int* p_is_dict); -static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, - PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); - -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); -#else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); -#endif - -/* ReRaiseException.proto */ -static CYTHON_INLINE void __Pyx_ReraiseException(void); - -/* DivInt[Py_ssize_t].proto */ -static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); - -/* GetModuleGlobalName.proto */ -#if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) do {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ - (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ - __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} while(0) -#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ - PY_UINT64_T __pyx_dict_version;\ - PyObject *__pyx_dict_cached_value;\ - (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} while(0) -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); -#else -#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) -#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); -#endif - -/* GCCDiagnostics.proto */ -#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -#define __Pyx_HAS_GCC_DIAGNOSTIC -#endif - -/* BuildPyUnicode.proto */ -static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, - int prepend_sign, char padding_char); - -/* CIntToPyUnicode.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char); - -/* IncludeStructmemberH.proto */ -#include <structmember.h> - -/* FixUpExtensionType.proto */ -#if CYTHON_USE_TYPE_SPECS -static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); -#endif - -/* ValidateBasesTuple.proto */ -#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS -static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); -#endif - -/* PyType_Ready.proto */ -CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); - -/* PyObject_GenericGetAttrNoDict.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr -#endif - -/* PyObject_GenericGetAttr.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr -#endif - -/* SetVTable.proto */ -static int __Pyx_SetVtable(PyTypeObject* typeptr , void* vtable); - -/* GetVTable.proto */ -static void* __Pyx_GetVtable(PyTypeObject *type); - -/* MergeVTables.proto */ -#if !CYTHON_COMPILING_IN_LIMITED_API -static int __Pyx_MergeVtables(PyTypeObject *type); -#endif - -/* SetupReduce.proto */ -#if !CYTHON_COMPILING_IN_LIMITED_API -static int __Pyx_setup_reduce(PyObject* type_obj); -#endif - -/* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_2 -#define __PYX_HAVE_RT_ImportType_proto_3_0_2 -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L -#include <stdalign.h> -#endif -#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_2(s) alignof(s) -#else -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_2(s) sizeof(void*) -#endif -enum __Pyx_ImportType_CheckSize_3_0_2 { - __Pyx_ImportType_CheckSize_Error_3_0_2 = 0, - __Pyx_ImportType_CheckSize_Warn_3_0_2 = 1, - __Pyx_ImportType_CheckSize_Ignore_3_0_2 = 2 -}; -static PyTypeObject *__Pyx_ImportType_3_0_2(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_2 check_size); -#endif - -/* Import.proto */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); - -/* ImportDottedModule.proto */ -static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); -#if PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); -#endif - -/* ImportFrom.proto */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); - -/* FetchSharedCythonModule.proto */ -static PyObject *__Pyx_FetchSharedCythonABIModule(void); - -/* FetchCommonType.proto */ -#if !CYTHON_USE_TYPE_SPECS -static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); -#else -static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); -#endif - -/* PyMethodNew.proto */ -#if CYTHON_COMPILING_IN_LIMITED_API -static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { - PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; - CYTHON_UNUSED_VAR(typ); - if (!self) - return __Pyx_NewRef(func); - typesModule = PyImport_ImportModule("types"); - if (!typesModule) return NULL; - methodType = PyObject_GetAttrString(typesModule, "MethodType"); - Py_DECREF(typesModule); - if (!methodType) return NULL; - result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); - Py_DECREF(methodType); - return result; -} -#elif PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { - CYTHON_UNUSED_VAR(typ); - if (!self) - return __Pyx_NewRef(func); - return PyMethod_New(func, self); -} -#else - #define __Pyx_PyMethod_New PyMethod_New -#endif - -/* PyVectorcallFastCallDict.proto */ -#if CYTHON_METH_FASTCALL -static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); -#endif - -/* CythonFunctionShared.proto */ -#define __Pyx_CyFunction_USED -#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 -#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 -#define __Pyx_CYFUNCTION_CCLASS 0x04 -#define __Pyx_CYFUNCTION_COROUTINE 0x08 -#define __Pyx_CyFunction_GetClosure(f)\ - (((__pyx_CyFunctionObject *) (f))->func_closure) -#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_CyFunction_GetClassObj(f)\ - (((__pyx_CyFunctionObject *) (f))->func_classobj) -#else - #define __Pyx_CyFunction_GetClassObj(f)\ - ((PyObject*) ((PyCMethodObject *) (f))->mm_class) -#endif -#define __Pyx_CyFunction_SetClassObj(f, classobj)\ - __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) -#define __Pyx_CyFunction_Defaults(type, f)\ - ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) -#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ - ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) -typedef struct { -#if CYTHON_COMPILING_IN_LIMITED_API - PyObject_HEAD - PyObject *func; -#elif PY_VERSION_HEX < 0x030900B1 - PyCFunctionObject func; -#else - PyCMethodObject func; -#endif -#if CYTHON_BACKPORT_VECTORCALL - __pyx_vectorcallfunc func_vectorcall; -#endif -#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API - PyObject *func_weakreflist; -#endif - PyObject *func_dict; - PyObject *func_name; - PyObject *func_qualname; - PyObject *func_doc; - PyObject *func_globals; - PyObject *func_code; - PyObject *func_closure; -#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - PyObject *func_classobj; -#endif - void *defaults; - int defaults_pyobjects; - size_t defaults_size; // used by FusedFunction for copying defaults - int flags; - PyObject *defaults_tuple; - PyObject *defaults_kwdict; - PyObject *(*defaults_getter)(PyObject *); - PyObject *func_annotations; - PyObject *func_is_coroutine; -} __pyx_CyFunctionObject; -#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) -#define __Pyx_IsCyOrPyCFunction(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) -#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) -static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, - int flags, PyObject* qualname, - PyObject *closure, - PyObject *module, PyObject *globals, - PyObject* code); -static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); -static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, - size_t size, - int pyobjects); -static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, - PyObject *tuple); -static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, - PyObject *dict); -static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, - PyObject *dict); -static int __pyx_CyFunction_init(PyObject *module); -#if CYTHON_METH_FASTCALL -static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); -static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); -static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); -static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); -#if CYTHON_BACKPORT_VECTORCALL -#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) -#else -#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) -#endif -#endif - -/* CythonFunction.proto */ -static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, - int flags, PyObject* qualname, - PyObject *closure, - PyObject *module, PyObject *globals, - PyObject* code); - -/* CLineInTraceback.proto */ -#ifdef CYTHON_CLINE_IN_TRACEBACK -#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) -#else -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); -#endif - -/* CodeObjectCache.proto */ -#if !CYTHON_COMPILING_IN_LIMITED_API -typedef struct { - PyCodeObject* code_object; - int code_line; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); -#endif - -/* AddTraceback.proto */ -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -/* None.proto */ -#include <new> - -/* CIntFromPy.proto */ -static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_As_PY_LONG_LONG(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - -/* CIntFromPy.proto */ -static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_As_unsigned_PY_LONG_LONG(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE unsigned long __Pyx_PyInt_As_unsigned_long(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value); - -/* FormatTypeName.proto */ -#if CYTHON_COMPILING_IN_LIMITED_API -typedef PyObject *__Pyx_TypeName; -#define __Pyx_FMT_TYPENAME "%U" -static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); -#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) -#else -typedef const char *__Pyx_TypeName; -#define __Pyx_FMT_TYPENAME "%.200s" -#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) -#define __Pyx_DECREF_TypeName(obj) -#endif - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* FastTypeChecks.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) -#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); -#else -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) -#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) -#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) -#endif -#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) - -/* CheckBinaryVersion.proto */ -static int __Pyx_check_binary_version(void); - -/* InitStrings.proto */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - -/* #### Code section: module_declarations ### */ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4date_4year_year(PyDateTime_Date *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4date_5month_month(PyDateTime_Date *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4date_3day_day(PyDateTime_Date *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_4hour_hour(PyDateTime_Time *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_6minute_minute(PyDateTime_Time *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_6second_second(PyDateTime_Time *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_11microsecond_microsecond(PyDateTime_Time *__pyx_v_self); /* proto*/ -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_4time_6tzinfo_tzinfo(PyDateTime_Time *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_4fold_fold(PyDateTime_Time *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_4year_year(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_5month_month(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_3day_day(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_4hour_hour(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_6minute_minute(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_6second_second(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_11microsecond_microsecond(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_8datetime_6tzinfo_tzinfo(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_4fold_fold(PyDateTime_DateTime *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_9timedelta_3day_day(PyDateTime_Delta *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_9timedelta_6second_second(PyDateTime_Delta *__pyx_v_self); /* proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_9timedelta_11microsecond_microsecond(PyDateTime_Delta *__pyx_v_self); /* proto*/ -static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4real_real(PyComplexObject *__pyx_v_self); /* proto*/ -static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4imag_imag(PyComplexObject *__pyx_v_self); /* proto*/ -static int __pyx_f_7msgpack_9_cmsgpack_6Packer__pack(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_o, struct __pyx_opt_args_7msgpack_9_cmsgpack_6Packer__pack *__pyx_optional_args); /* proto*/ -static PyObject *__pyx_f_7msgpack_9_cmsgpack_6Packer_pack(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_skip_dispatch); /* proto*/ -static PyObject *__pyx_f_7msgpack_9_cmsgpack_8Unpacker_append_buffer(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, void *__pyx_v__buf, Py_ssize_t __pyx_v__buf_len); /* proto*/ -static int __pyx_f_7msgpack_9_cmsgpack_8Unpacker_read_from_file(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto*/ -static PyObject *__pyx_f_7msgpack_9_cmsgpack_8Unpacker__unpack(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, execute_fn __pyx_v_execute, struct __pyx_opt_args_7msgpack_9_cmsgpack_8Unpacker__unpack *__pyx_optional_args); /* proto*/ - -/* Module declarations from "libc.string" */ - -/* Module declarations from "libc.stdio" */ - -/* Module declarations from "__builtin__" */ - -/* Module declarations from "cpython.type" */ - -/* Module declarations from "cpython.version" */ - -/* Module declarations from "cpython.ref" */ - -/* Module declarations from "cpython.exc" */ - -/* Module declarations from "cpython.module" */ - -/* Module declarations from "cpython.mem" */ - -/* Module declarations from "cpython.tuple" */ - -/* Module declarations from "cpython.list" */ - -/* Module declarations from "cpython.sequence" */ - -/* Module declarations from "cpython.mapping" */ - -/* Module declarations from "cpython.iterator" */ - -/* Module declarations from "cpython.number" */ - -/* Module declarations from "cpython.int" */ - -/* Module declarations from "__builtin__" */ - -/* Module declarations from "cpython.bool" */ - -/* Module declarations from "cpython.long" */ - -/* Module declarations from "cpython.float" */ - -/* Module declarations from "__builtin__" */ - -/* Module declarations from "cpython.complex" */ - -/* Module declarations from "cpython.string" */ - -/* Module declarations from "cpython.unicode" */ - -/* Module declarations from "cpython.pyport" */ - -/* Module declarations from "cpython.dict" */ - -/* Module declarations from "cpython.instance" */ - -/* Module declarations from "cpython.function" */ - -/* Module declarations from "cpython.method" */ - -/* Module declarations from "cpython.weakref" */ - -/* Module declarations from "cpython.getargs" */ - -/* Module declarations from "cpython.pythread" */ - -/* Module declarations from "cpython.pystate" */ - -/* Module declarations from "cpython.cobject" */ - -/* Module declarations from "cpython.oldbuffer" */ - -/* Module declarations from "cpython.set" */ - -/* Module declarations from "cpython.buffer" */ - -/* Module declarations from "cpython.bytes" */ - -/* Module declarations from "cpython.pycapsule" */ - -/* Module declarations from "cpython.contextvars" */ - -/* Module declarations from "cpython" */ - -/* Module declarations from "cpython.object" */ - -/* Module declarations from "datetime" */ - -/* Module declarations from "cpython.datetime" */ -static CYTHON_INLINE void __pyx_f_7cpython_8datetime_import_datetime(void); /*proto*/ -static CYTHON_INLINE PyDateTime_DateTime *__pyx_f_7cpython_8datetime_datetime_new(int, int, int, int, int, int, int, PyObject *, struct __pyx_opt_args_7cpython_8datetime_datetime_new *__pyx_optional_args); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_datetime_tzinfo(PyObject *); /*proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_timedelta_days(PyObject *); /*proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_timedelta_seconds(PyObject *); /*proto*/ -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_timedelta_microseconds(PyObject *); /*proto*/ - -/* Module declarations from "cpython.bytearray" */ - -/* Module declarations from "libc.stdlib" */ - -/* Module declarations from "libc.limits" */ - -/* Module declarations from "libc.stdint" */ - -/* Module declarations from "msgpack._cmsgpack" */ -static PyObject *__pyx_v_7msgpack_9_cmsgpack_utc = 0; -static PyObject *__pyx_v_7msgpack_9_cmsgpack_epoch = 0; -static PyObject *__pyx_v_7msgpack_9_cmsgpack_ExtType = 0; -static PyObject *__pyx_v_7msgpack_9_cmsgpack_Timestamp = 0; -static int __pyx_v_7msgpack_9_cmsgpack_DEFAULT_RECURSE_LIMIT; -static PY_LONG_LONG __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT; -static PyObject *__pyx_v_7msgpack_9_cmsgpack_giga = 0; -static CYTHON_INLINE int __pyx_f_7msgpack_9_cmsgpack_PyBytesLike_Check(PyObject *); /*proto*/ -static CYTHON_INLINE int __pyx_f_7msgpack_9_cmsgpack_PyBytesLike_CheckExact(PyObject *); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_7msgpack_9_cmsgpack_init_ctx(unpack_context *, PyObject *, PyObject *, PyObject *, PyObject *, int, int, int, int, char const *, Py_ssize_t, Py_ssize_t, Py_ssize_t, Py_ssize_t, Py_ssize_t); /*proto*/ -static CYTHON_INLINE int __pyx_f_7msgpack_9_cmsgpack_get_data_from_buffer(PyObject *, Py_buffer *, char **, Py_ssize_t *); /*proto*/ -/* #### Code section: typeinfo ### */ -/* #### Code section: before_global_var ### */ -#define __Pyx_MODULE_NAME "msgpack._cmsgpack" -extern int __pyx_module_is_main_msgpack___cmsgpack; -int __pyx_module_is_main_msgpack___cmsgpack = 0; - -/* Implementation of "msgpack._cmsgpack" */ -/* #### Code section: global_var ### */ -static PyObject *__pyx_builtin_MemoryError; -static PyObject *__pyx_builtin_TypeError; -static PyObject *__pyx_builtin_ValueError; -static PyObject *__pyx_builtin_OverflowError; -static PyObject *__pyx_builtin_RuntimeError; -static PyObject *__pyx_builtin_NotImplementedError; -static PyObject *__pyx_builtin_BufferError; -static PyObject *__pyx_builtin_AssertionError; -static PyObject *__pyx_builtin_StopIteration; -/* #### Code section: string_decls ### */ -static const char __pyx_k_d[] = "d"; -static const char __pyx_k_k[] = "k"; -static const char __pyx_k_v[] = "v"; -static const char __pyx_k_gc[] = "gc"; -static const char __pyx_k__29[] = "*"; -static const char __pyx_k__30[] = "."; -static const char __pyx_k__62[] = "?"; -static const char __pyx_k_buf[] = "buf"; -static const char __pyx_k_ctx[] = "ctx"; -static const char __pyx_k_ext[] = "ext"; -static const char __pyx_k_obj[] = "obj"; -static const char __pyx_k_off[] = "off"; -static const char __pyx_k_raw[] = "raw"; -static const char __pyx_k_ret[] = "ret"; -static const char __pyx_k_utc[] = "utc"; -static const char __pyx_k_cerr[] = "cerr"; -static const char __pyx_k_code[] = "code"; -static const char __pyx_k_data[] = "data"; -static const char __pyx_k_feed[] = "feed"; -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_name[] = "__name__"; -static const char __pyx_k_pack[] = "pack"; -static const char __pyx_k_read[] = "read"; -static const char __pyx_k_self[] = "self"; -static const char __pyx_k_size[] = "size"; -static const char __pyx_k_skip[] = "skip"; -static const char __pyx_k_spec[] = "__spec__"; -static const char __pyx_k_tell[] = "tell"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_view[] = "view"; -static const char __pyx_k_bytes[] = "bytes"; -static const char __pyx_k_items[] = "items"; -static const char __pyx_k_nread[] = "nread"; -static const char __pyx_k_pairs[] = "pairs"; -static const char __pyx_k_reset[] = "reset"; -static const char __pyx_k_Packer[] = "Packer"; -static const char __pyx_k_enable[] = "enable"; -static const char __pyx_k_import[] = "__import__"; -static const char __pyx_k_nbytes[] = "nbytes"; -static const char __pyx_k_packed[] = "packed"; -static const char __pyx_k_pybuff[] = "pybuff"; -static const char __pyx_k_reduce[] = "__reduce__"; -static const char __pyx_k_unpack[] = "unpack"; -static const char __pyx_k_ExtType[] = "ExtType"; -static const char __pyx_k_buf_len[] = "buf_len"; -static const char __pyx_k_default[] = "default"; -static const char __pyx_k_disable[] = "disable"; -static const char __pyx_k_seconds[] = "seconds"; -static const char __pyx_k_unpackb[] = "unpackb"; -static const char __pyx_k_Unpacker[] = "Unpacker"; -static const char __pyx_k_datetime[] = "datetime"; -static const char __pyx_k_ext_hook[] = "ext_hook"; -static const char __pyx_k_getstate[] = "__getstate__"; -static const char __pyx_k_setstate[] = "__setstate__"; -static const char __pyx_k_timezone[] = "timezone"; -static const char __pyx_k_typecode[] = "typecode"; -static const char __pyx_k_use_list[] = "use_list"; -static const char __pyx_k_ExtraData[] = "ExtraData"; -static const char __pyx_k_OutOfData[] = "OutOfData"; -static const char __pyx_k_Timestamp[] = "Timestamp"; -static const char __pyx_k_TypeError[] = "TypeError"; -static const char __pyx_k_autoreset[] = "autoreset"; -static const char __pyx_k_file_like[] = "file_like"; -static const char __pyx_k_getbuffer[] = "getbuffer"; -static const char __pyx_k_isenabled[] = "isenabled"; -static const char __pyx_k_list_hook[] = "list_hook"; -static const char __pyx_k_pyx_state[] = "__pyx_state"; -static const char __pyx_k_read_size[] = "read_size"; -static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; -static const char __pyx_k_timestamp[] = "timestamp"; -static const char __pyx_k_BufferFull[] = "BufferFull"; -static const char __pyx_k_StackError[] = "StackError"; -static const char __pyx_k_ValueError[] = "ValueError"; -static const char __pyx_k_exceptions[] = "exceptions"; -static const char __pyx_k_next_bytes[] = "next_bytes"; -static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; -static const char __pyx_k_read_bytes[] = "read_bytes"; -static const char __pyx_k_BufferError[] = "BufferError"; -static const char __pyx_k_FormatError[] = "FormatError"; -static const char __pyx_k_MemoryError[] = "MemoryError"; -static const char __pyx_k_Packer_pack[] = "Packer.pack"; -static const char __pyx_k_max_bin_len[] = "max_bin_len"; -static const char __pyx_k_max_ext_len[] = "max_ext_len"; -static const char __pyx_k_max_map_len[] = "max_map_len"; -static const char __pyx_k_max_str_len[] = "max_str_len"; -static const char __pyx_k_nanoseconds[] = "nanoseconds"; -static const char __pyx_k_object_hook[] = "object_hook"; -static const char __pyx_k_Packer_bytes[] = "Packer.bytes"; -static const char __pyx_k_Packer_reset[] = "Packer.reset"; -static const char __pyx_k_RuntimeError[] = "RuntimeError"; -static const char __pyx_k_initializing[] = "_initializing"; -static const char __pyx_k_is_coroutine[] = "_is_coroutine"; -static const char __pyx_k_strict_types[] = "strict_types"; -static const char __pyx_k_stringsource[] = "<stringsource>"; -static const char __pyx_k_use_bin_type[] = "use_bin_type"; -static const char __pyx_k_OverflowError[] = "OverflowError"; -static const char __pyx_k_StopIteration[] = "StopIteration"; -static const char __pyx_k_Unpacker_feed[] = "Unpacker.feed"; -static const char __pyx_k_Unpacker_skip[] = "Unpacker.skip"; -static const char __pyx_k_Unpacker_tell[] = "Unpacker.tell"; -static const char __pyx_k_max_array_len[] = "max_array_len"; -static const char __pyx_k_pack_ext_type[] = "pack_ext_type"; -static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; -static const char __pyx_k_AssertionError[] = "AssertionError"; -static const char __pyx_k_internal_error[] = "internal error"; -static const char __pyx_k_pack_map_pairs[] = "pack_map_pairs"; -static const char __pyx_k_strict_map_key[] = "strict_map_key"; -static const char __pyx_k_unicode_errors[] = "unicode_errors"; -static const char __pyx_k_Unpacker_unpack[] = "Unpacker.unpack"; -static const char __pyx_k_max_buffer_size[] = "max_buffer_size"; -static const char __pyx_k_pack_map_header[] = "pack_map_header"; -static const char __pyx_k_read_map_header[] = "read_map_header"; -static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; -static const char __pyx_k_Packer_getbuffer[] = "Packer.getbuffer"; -static const char __pyx_k_use_single_float[] = "use_single_float"; -static const char __pyx_k_dict_is_too_large[] = "dict is too large"; -static const char __pyx_k_list_is_too_large[] = "list is too large"; -static const char __pyx_k_msgpack__cmsgpack[] = "msgpack._cmsgpack"; -static const char __pyx_k_object_pairs_hook[] = "object_pairs_hook"; -static const char __pyx_k_pack_array_header[] = "pack_array_header"; -static const char __pyx_k_read_array_header[] = "read_array_header"; -static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; -static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; -static const char __pyx_k_NotImplementedError[] = "NotImplementedError"; -static const char __pyx_k_Unpack_failed_error[] = "Unpack failed: error = "; -static const char __pyx_k_Unpacker_read_bytes[] = "Unpacker.read_bytes"; -static const char __pyx_k_msgpack__packer_pyx[] = "msgpack/_packer.pyx"; -static const char __pyx_k_Packer_pack_ext_type[] = "Packer.pack_ext_type"; -static const char __pyx_k_EXT_data_is_too_large[] = "EXT data is too large"; -static const char __pyx_k_Packer_pack_map_pairs[] = "Packer.pack_map_pairs"; -static const char __pyx_k_msgpack__unpacker_pyx[] = "msgpack/_unpacker.pyx"; -static const char __pyx_k_timestamp_must_be_0_3[] = "timestamp must be 0..3"; -static const char __pyx_k_No_more_data_to_unpack[] = "No more data to unpack."; -static const char __pyx_k_Packer___reduce_cython[] = "Packer.__reduce_cython__"; -static const char __pyx_k_Packer_pack_map_header[] = "Packer.pack_map_header"; -static const char __pyx_k_memoryview_is_too_large[] = "memoryview is too large"; -static const char __pyx_k_Packer___setstate_cython[] = "Packer.__setstate_cython__"; -static const char __pyx_k_Packer_pack_array_header[] = "Packer.pack_array_header"; -static const char __pyx_k_Unpacker___reduce_cython[] = "Unpacker.__reduce_cython__"; -static const char __pyx_k_Unpacker_read_map_header[] = "Unpacker.read_map_header"; -static const char __pyx_k_recursion_limit_exceeded[] = "recursion limit exceeded."; -static const char __pyx_k_failed_to_calculate_delta[] = "failed to calculate delta"; -static const char __pyx_k_Integer_value_out_of_range[] = "Integer value out of range"; -static const char __pyx_k_Unpacker___setstate_cython[] = "Unpacker.__setstate_cython__"; -static const char __pyx_k_Unpacker_read_array_header[] = "Unpacker.read_array_header"; -static const char __pyx_k_default_must_be_a_callable[] = "default must be a callable."; -static const char __pyx_k_default_read_extended_type[] = "default_read_extended_type"; -static const char __pyx_k_ext_hook_must_be_a_callable[] = "ext_hook must be a callable."; -static const char __pyx_k_unicode_string_is_too_large[] = "unicode string is too large"; -static const char __pyx_k_list_hook_must_be_a_callable[] = "list_hook must be a callable."; -static const char __pyx_k_Unpack_failed_incomplete_input[] = "Unpack failed: incomplete input"; -static const char __pyx_k_object_hook_must_be_a_callable[] = "object_hook must be a callable."; -static const char __pyx_k_file_like_read_must_be_a_callab[] = "`file_like.read` must be a callable."; -static const char __pyx_k_unpacker_feed_is_not_be_able_to[] = "unpacker.feed() is not be able to use with `file_like`."; -static const char __pyx_k_Cannot_decode_extended_type_with[] = "Cannot decode extended type with typecode=%d"; -static const char __pyx_k_Time_zones_are_not_available_fro[] = "Time zones are not available from the C-API."; -static const char __pyx_k_Unable_to_allocate_internal_buff[] = "Unable to allocate internal buffer."; -static const char __pyx_k_Unable_to_enlarge_internal_buffe[] = "Unable to enlarge internal buffer."; -static const char __pyx_k_cannot_unpack_from_multi_byte_ob[] = "cannot unpack from multi-byte object"; -static const char __pyx_k_could_not_get_buffer_for_memoryv[] = "could not get buffer for memoryview"; -static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; -static const char __pyx_k_object_pairs_hook_and_object_hoo[] = "object_pairs_hook and object_hook are mutually exclusive."; -static const char __pyx_k_object_pairs_hook_must_be_a_call[] = "object_pairs_hook must be a callable."; -static const char __pyx_k_read_size_should_be_less_or_equa[] = "read_size should be less or equal to max_buffer_size"; -/* #### Code section: decls ### */ -static int __pyx_pf_7msgpack_9_cmsgpack_6Packer___cinit__(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self); /* proto */ -static int __pyx_pf_7msgpack_9_cmsgpack_6Packer_2__init__(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_default, int __pyx_v_use_single_float, int __pyx_v_autoreset, int __pyx_v_use_bin_type, int __pyx_v_strict_types, int __pyx_v_datetime, PyObject *__pyx_v_unicode_errors); /* proto */ -static void __pyx_pf_7msgpack_9_cmsgpack_6Packer_4__dealloc__(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_6pack(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_obj); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_8pack_ext_type(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_typecode, PyObject *__pyx_v_data); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_10pack_array_header(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PY_LONG_LONG __pyx_v_size); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_12pack_map_header(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PY_LONG_LONG __pyx_v_size); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_14pack_map_pairs(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_pairs); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_16reset(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_18bytes(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_20getbuffer(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_22__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_24__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_default_read_extended_type(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_typecode, CYTHON_UNUSED PyObject *__pyx_v_data); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_4__defaults__(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_2unpackb(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_packed, PyObject *__pyx_v_object_hook, PyObject *__pyx_v_list_hook, int __pyx_v_use_list, int __pyx_v_raw, int __pyx_v_timestamp, int __pyx_v_strict_map_key, PyObject *__pyx_v_unicode_errors, PyObject *__pyx_v_object_pairs_hook, PyObject *__pyx_v_ext_hook, Py_ssize_t __pyx_v_max_str_len, Py_ssize_t __pyx_v_max_bin_len, Py_ssize_t __pyx_v_max_array_len, Py_ssize_t __pyx_v_max_map_len, Py_ssize_t __pyx_v_max_ext_len); /* proto */ -static int __pyx_pf_7msgpack_9_cmsgpack_8Unpacker___cinit__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static void __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_2__dealloc__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static int __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_4__init__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, PyObject *__pyx_v_file_like, Py_ssize_t __pyx_v_read_size, int __pyx_v_use_list, int __pyx_v_raw, int __pyx_v_timestamp, int __pyx_v_strict_map_key, PyObject *__pyx_v_object_hook, PyObject *__pyx_v_object_pairs_hook, PyObject *__pyx_v_list_hook, PyObject *__pyx_v_unicode_errors, Py_ssize_t __pyx_v_max_buffer_size, PyObject *__pyx_v_ext_hook, Py_ssize_t __pyx_v_max_str_len, Py_ssize_t __pyx_v_max_bin_len, Py_ssize_t __pyx_v_max_array_len, Py_ssize_t __pyx_v_max_map_len, Py_ssize_t __pyx_v_max_ext_len); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_6feed(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, PyObject *__pyx_v_next_bytes); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_8read_bytes(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, Py_ssize_t __pyx_v_nbytes); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_10unpack(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_12skip(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_14read_array_header(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_16read_map_header(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_18tell(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_20__iter__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_22__next__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_24__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_26__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ -static PyObject *__pyx_tp_new_7msgpack_9_cmsgpack_Packer(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_tp_new_7msgpack_9_cmsgpack_Unpacker(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -/* #### Code section: late_includes ### */ -/* #### Code section: module_state ### */ -typedef struct { - PyObject *__pyx_d; - PyObject *__pyx_b; - PyObject *__pyx_cython_runtime; - PyObject *__pyx_empty_tuple; - PyObject *__pyx_empty_bytes; - PyObject *__pyx_empty_unicode; - #ifdef __Pyx_CyFunction_USED - PyTypeObject *__pyx_CyFunctionType; - #endif - #ifdef __Pyx_FusedFunction_USED - PyTypeObject *__pyx_FusedFunctionType; - #endif - #ifdef __Pyx_Generator_USED - PyTypeObject *__pyx_GeneratorType; - #endif - #ifdef __Pyx_IterableCoroutine_USED - PyTypeObject *__pyx_IterableCoroutineType; - #endif - #ifdef __Pyx_Coroutine_USED - PyTypeObject *__pyx_CoroutineAwaitType; - #endif - #ifdef __Pyx_Coroutine_USED - PyTypeObject *__pyx_CoroutineType; - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - PyTypeObject *__pyx_ptype_7cpython_4type_type; - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - PyTypeObject *__pyx_ptype_7cpython_4bool_bool; - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - PyTypeObject *__pyx_ptype_7cpython_7complex_complex; - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - PyTypeObject *__pyx_ptype_7cpython_8datetime_date; - PyTypeObject *__pyx_ptype_7cpython_8datetime_time; - PyTypeObject *__pyx_ptype_7cpython_8datetime_datetime; - PyTypeObject *__pyx_ptype_7cpython_8datetime_timedelta; - PyTypeObject *__pyx_ptype_7cpython_8datetime_tzinfo; - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - PyObject *__pyx_type_7msgpack_9_cmsgpack_Packer; - PyObject *__pyx_type_7msgpack_9_cmsgpack_Unpacker; - #endif - PyTypeObject *__pyx_ptype_7msgpack_9_cmsgpack_Packer; - PyTypeObject *__pyx_ptype_7msgpack_9_cmsgpack_Unpacker; - PyObject *__pyx_n_s_AssertionError; - PyObject *__pyx_n_s_BufferError; - PyObject *__pyx_n_s_BufferFull; - PyObject *__pyx_kp_u_Cannot_decode_extended_type_with; - PyObject *__pyx_kp_u_EXT_data_is_too_large; - PyObject *__pyx_n_s_ExtType; - PyObject *__pyx_n_s_ExtraData; - PyObject *__pyx_n_s_FormatError; - PyObject *__pyx_kp_u_Integer_value_out_of_range; - PyObject *__pyx_n_s_MemoryError; - PyObject *__pyx_kp_u_No_more_data_to_unpack; - PyObject *__pyx_n_s_NotImplementedError; - PyObject *__pyx_n_s_OutOfData; - PyObject *__pyx_n_s_OverflowError; - PyObject *__pyx_n_s_Packer; - PyObject *__pyx_n_s_Packer___reduce_cython; - PyObject *__pyx_n_s_Packer___setstate_cython; - PyObject *__pyx_n_s_Packer_bytes; - PyObject *__pyx_n_s_Packer_getbuffer; - PyObject *__pyx_n_s_Packer_pack; - PyObject *__pyx_n_s_Packer_pack_array_header; - PyObject *__pyx_n_s_Packer_pack_ext_type; - PyObject *__pyx_n_s_Packer_pack_map_header; - PyObject *__pyx_n_s_Packer_pack_map_pairs; - PyObject *__pyx_n_s_Packer_reset; - PyObject *__pyx_n_s_RuntimeError; - PyObject *__pyx_n_s_StackError; - PyObject *__pyx_n_s_StopIteration; - PyObject *__pyx_kp_u_Time_zones_are_not_available_fro; - PyObject *__pyx_n_s_Timestamp; - PyObject *__pyx_n_s_TypeError; - PyObject *__pyx_kp_u_Unable_to_allocate_internal_buff; - PyObject *__pyx_kp_u_Unable_to_enlarge_internal_buffe; - PyObject *__pyx_kp_u_Unpack_failed_error; - PyObject *__pyx_kp_u_Unpack_failed_incomplete_input; - PyObject *__pyx_n_s_Unpacker; - PyObject *__pyx_n_s_Unpacker___reduce_cython; - PyObject *__pyx_n_s_Unpacker___setstate_cython; - PyObject *__pyx_n_s_Unpacker_feed; - PyObject *__pyx_n_s_Unpacker_read_array_header; - PyObject *__pyx_n_s_Unpacker_read_bytes; - PyObject *__pyx_n_s_Unpacker_read_map_header; - PyObject *__pyx_n_s_Unpacker_skip; - PyObject *__pyx_n_s_Unpacker_tell; - PyObject *__pyx_n_s_Unpacker_unpack; - PyObject *__pyx_n_s_ValueError; - PyObject *__pyx_n_s__29; - PyObject *__pyx_kp_u__30; - PyObject *__pyx_n_s__62; - PyObject *__pyx_n_s_asyncio_coroutines; - PyObject *__pyx_n_s_autoreset; - PyObject *__pyx_n_s_buf; - PyObject *__pyx_n_s_buf_len; - PyObject *__pyx_n_s_bytes; - PyObject *__pyx_kp_u_cannot_unpack_from_multi_byte_ob; - PyObject *__pyx_n_s_cerr; - PyObject *__pyx_n_s_cline_in_traceback; - PyObject *__pyx_n_s_code; - PyObject *__pyx_kp_u_could_not_get_buffer_for_memoryv; - PyObject *__pyx_n_s_ctx; - PyObject *__pyx_n_u_d; - PyObject *__pyx_n_s_data; - PyObject *__pyx_n_s_datetime; - PyObject *__pyx_n_s_default; - PyObject *__pyx_kp_u_default_must_be_a_callable; - PyObject *__pyx_n_s_default_read_extended_type; - PyObject *__pyx_kp_u_dict_is_too_large; - PyObject *__pyx_kp_u_disable; - PyObject *__pyx_kp_u_enable; - PyObject *__pyx_n_s_exceptions; - PyObject *__pyx_n_s_ext; - PyObject *__pyx_n_s_ext_hook; - PyObject *__pyx_kp_u_ext_hook_must_be_a_callable; - PyObject *__pyx_kp_u_failed_to_calculate_delta; - PyObject *__pyx_n_s_feed; - PyObject *__pyx_n_s_file_like; - PyObject *__pyx_kp_u_file_like_read_must_be_a_callab; - PyObject *__pyx_kp_u_gc; - PyObject *__pyx_n_s_getbuffer; - PyObject *__pyx_n_s_getstate; - PyObject *__pyx_n_s_import; - PyObject *__pyx_n_s_initializing; - PyObject *__pyx_kp_u_internal_error; - PyObject *__pyx_n_s_is_coroutine; - PyObject *__pyx_kp_u_isenabled; - PyObject *__pyx_n_s_items; - PyObject *__pyx_n_s_k; - PyObject *__pyx_n_s_list_hook; - PyObject *__pyx_kp_u_list_hook_must_be_a_callable; - PyObject *__pyx_kp_u_list_is_too_large; - PyObject *__pyx_n_s_main; - PyObject *__pyx_n_s_max_array_len; - PyObject *__pyx_n_s_max_bin_len; - PyObject *__pyx_n_s_max_buffer_size; - PyObject *__pyx_n_s_max_ext_len; - PyObject *__pyx_n_s_max_map_len; - PyObject *__pyx_n_s_max_str_len; - PyObject *__pyx_kp_u_memoryview_is_too_large; - PyObject *__pyx_n_s_msgpack__cmsgpack; - PyObject *__pyx_kp_s_msgpack__packer_pyx; - PyObject *__pyx_kp_s_msgpack__unpacker_pyx; - PyObject *__pyx_n_s_name; - PyObject *__pyx_n_s_nanoseconds; - PyObject *__pyx_n_s_nbytes; - PyObject *__pyx_n_s_next_bytes; - PyObject *__pyx_kp_s_no_default___reduce___due_to_non; - PyObject *__pyx_n_s_nread; - PyObject *__pyx_n_s_obj; - PyObject *__pyx_n_s_object_hook; - PyObject *__pyx_kp_u_object_hook_must_be_a_callable; - PyObject *__pyx_n_s_object_pairs_hook; - PyObject *__pyx_kp_u_object_pairs_hook_and_object_hoo; - PyObject *__pyx_kp_u_object_pairs_hook_must_be_a_call; - PyObject *__pyx_n_s_off; - PyObject *__pyx_n_s_pack; - PyObject *__pyx_n_s_pack_array_header; - PyObject *__pyx_n_s_pack_ext_type; - PyObject *__pyx_n_s_pack_map_header; - PyObject *__pyx_n_s_pack_map_pairs; - PyObject *__pyx_n_s_packed; - PyObject *__pyx_n_s_pairs; - PyObject *__pyx_n_s_pybuff; - PyObject *__pyx_n_s_pyx_state; - PyObject *__pyx_n_s_pyx_vtable; - PyObject *__pyx_n_s_raw; - PyObject *__pyx_n_s_read; - PyObject *__pyx_n_s_read_array_header; - PyObject *__pyx_n_s_read_bytes; - PyObject *__pyx_n_s_read_map_header; - PyObject *__pyx_n_s_read_size; - PyObject *__pyx_kp_u_read_size_should_be_less_or_equa; - PyObject *__pyx_kp_u_recursion_limit_exceeded; - PyObject *__pyx_n_s_reduce; - PyObject *__pyx_n_s_reduce_cython; - PyObject *__pyx_n_s_reduce_ex; - PyObject *__pyx_n_s_reset; - PyObject *__pyx_n_s_ret; - PyObject *__pyx_n_s_seconds; - PyObject *__pyx_n_s_self; - PyObject *__pyx_n_s_setstate; - PyObject *__pyx_n_s_setstate_cython; - PyObject *__pyx_n_s_size; - PyObject *__pyx_n_s_skip; - PyObject *__pyx_n_s_spec; - PyObject *__pyx_n_s_strict_map_key; - PyObject *__pyx_n_s_strict_types; - PyObject *__pyx_kp_s_stringsource; - PyObject *__pyx_n_s_tell; - PyObject *__pyx_n_s_test; - PyObject *__pyx_n_s_timestamp; - PyObject *__pyx_kp_u_timestamp_must_be_0_3; - PyObject *__pyx_n_s_timezone; - PyObject *__pyx_n_s_typecode; - PyObject *__pyx_n_s_unicode_errors; - PyObject *__pyx_kp_u_unicode_string_is_too_large; - PyObject *__pyx_n_s_unpack; - PyObject *__pyx_n_s_unpackb; - PyObject *__pyx_kp_u_unpacker_feed_is_not_be_able_to; - PyObject *__pyx_n_s_use_bin_type; - PyObject *__pyx_n_s_use_list; - PyObject *__pyx_n_s_use_single_float; - PyObject *__pyx_n_s_utc; - PyObject *__pyx_n_s_v; - PyObject *__pyx_n_s_view; - PyObject *__pyx_int_0; - PyObject *__pyx_int_1000000000; - int __pyx_k__4; - PyObject *__pyx_k__23; - PyObject *__pyx_tuple_; - PyObject *__pyx_tuple__2; - PyObject *__pyx_tuple__3; - PyObject *__pyx_tuple__5; - PyObject *__pyx_tuple__6; - PyObject *__pyx_tuple__7; - PyObject *__pyx_tuple__8; - PyObject *__pyx_tuple__9; - PyObject *__pyx_tuple__10; - PyObject *__pyx_tuple__11; - PyObject *__pyx_tuple__12; - PyObject *__pyx_tuple__13; - PyObject *__pyx_tuple__14; - PyObject *__pyx_tuple__15; - PyObject *__pyx_tuple__16; - PyObject *__pyx_tuple__17; - PyObject *__pyx_tuple__18; - PyObject *__pyx_tuple__19; - PyObject *__pyx_tuple__20; - PyObject *__pyx_tuple__21; - PyObject *__pyx_tuple__22; - PyObject *__pyx_tuple__24; - PyObject *__pyx_tuple__25; - PyObject *__pyx_tuple__26; - PyObject *__pyx_tuple__27; - PyObject *__pyx_tuple__28; - PyObject *__pyx_tuple__31; - PyObject *__pyx_tuple__33; - PyObject *__pyx_tuple__35; - PyObject *__pyx_tuple__38; - PyObject *__pyx_tuple__40; - PyObject *__pyx_tuple__45; - PyObject *__pyx_tuple__47; - PyObject *__pyx_tuple__49; - PyObject *__pyx_tuple__51; - PyObject *__pyx_tuple__53; - PyObject *__pyx_codeobj__32; - PyObject *__pyx_codeobj__34; - PyObject *__pyx_codeobj__36; - PyObject *__pyx_codeobj__37; - PyObject *__pyx_codeobj__39; - PyObject *__pyx_codeobj__41; - PyObject *__pyx_codeobj__42; - PyObject *__pyx_codeobj__43; - PyObject *__pyx_codeobj__44; - PyObject *__pyx_codeobj__46; - PyObject *__pyx_codeobj__48; - PyObject *__pyx_codeobj__50; - PyObject *__pyx_codeobj__52; - PyObject *__pyx_codeobj__54; - PyObject *__pyx_codeobj__55; - PyObject *__pyx_codeobj__56; - PyObject *__pyx_codeobj__57; - PyObject *__pyx_codeobj__58; - PyObject *__pyx_codeobj__59; - PyObject *__pyx_codeobj__60; - PyObject *__pyx_codeobj__61; -} __pyx_mstate; - -#if CYTHON_USE_MODULE_STATE -#ifdef __cplusplus -namespace { - extern struct PyModuleDef __pyx_moduledef; -} /* anonymous namespace */ -#else -static struct PyModuleDef __pyx_moduledef; -#endif - -#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) - -#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) - -#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) -#else -static __pyx_mstate __pyx_mstate_global_static = -#ifdef __cplusplus - {}; -#else - {0}; -#endif -static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; -#endif -/* #### Code section: module_state_clear ### */ -#if CYTHON_USE_MODULE_STATE -static int __pyx_m_clear(PyObject *m) { - __pyx_mstate *clear_module_state = __pyx_mstate(m); - if (!clear_module_state) return 0; - Py_CLEAR(clear_module_state->__pyx_d); - Py_CLEAR(clear_module_state->__pyx_b); - Py_CLEAR(clear_module_state->__pyx_cython_runtime); - Py_CLEAR(clear_module_state->__pyx_empty_tuple); - Py_CLEAR(clear_module_state->__pyx_empty_bytes); - Py_CLEAR(clear_module_state->__pyx_empty_unicode); - #ifdef __Pyx_CyFunction_USED - Py_CLEAR(clear_module_state->__pyx_CyFunctionType); - #endif - #ifdef __Pyx_FusedFunction_USED - Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); - #endif - Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4type_type); - Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_4bool_bool); - Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_7complex_complex); - Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_8datetime_date); - Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_8datetime_time); - Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_8datetime_datetime); - Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_8datetime_timedelta); - Py_CLEAR(clear_module_state->__pyx_ptype_7cpython_8datetime_tzinfo); - Py_CLEAR(clear_module_state->__pyx_ptype_7msgpack_9_cmsgpack_Packer); - Py_CLEAR(clear_module_state->__pyx_type_7msgpack_9_cmsgpack_Packer); - Py_CLEAR(clear_module_state->__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - Py_CLEAR(clear_module_state->__pyx_type_7msgpack_9_cmsgpack_Unpacker); - Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); - Py_CLEAR(clear_module_state->__pyx_n_s_BufferError); - Py_CLEAR(clear_module_state->__pyx_n_s_BufferFull); - Py_CLEAR(clear_module_state->__pyx_kp_u_Cannot_decode_extended_type_with); - Py_CLEAR(clear_module_state->__pyx_kp_u_EXT_data_is_too_large); - Py_CLEAR(clear_module_state->__pyx_n_s_ExtType); - Py_CLEAR(clear_module_state->__pyx_n_s_ExtraData); - Py_CLEAR(clear_module_state->__pyx_n_s_FormatError); - Py_CLEAR(clear_module_state->__pyx_kp_u_Integer_value_out_of_range); - Py_CLEAR(clear_module_state->__pyx_n_s_MemoryError); - Py_CLEAR(clear_module_state->__pyx_kp_u_No_more_data_to_unpack); - Py_CLEAR(clear_module_state->__pyx_n_s_NotImplementedError); - Py_CLEAR(clear_module_state->__pyx_n_s_OutOfData); - Py_CLEAR(clear_module_state->__pyx_n_s_OverflowError); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer___reduce_cython); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer___setstate_cython); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer_bytes); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer_getbuffer); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer_pack); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer_pack_array_header); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer_pack_ext_type); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer_pack_map_header); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer_pack_map_pairs); - Py_CLEAR(clear_module_state->__pyx_n_s_Packer_reset); - Py_CLEAR(clear_module_state->__pyx_n_s_RuntimeError); - Py_CLEAR(clear_module_state->__pyx_n_s_StackError); - Py_CLEAR(clear_module_state->__pyx_n_s_StopIteration); - Py_CLEAR(clear_module_state->__pyx_kp_u_Time_zones_are_not_available_fro); - Py_CLEAR(clear_module_state->__pyx_n_s_Timestamp); - Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); - Py_CLEAR(clear_module_state->__pyx_kp_u_Unable_to_allocate_internal_buff); - Py_CLEAR(clear_module_state->__pyx_kp_u_Unable_to_enlarge_internal_buffe); - Py_CLEAR(clear_module_state->__pyx_kp_u_Unpack_failed_error); - Py_CLEAR(clear_module_state->__pyx_kp_u_Unpack_failed_incomplete_input); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker___reduce_cython); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker___setstate_cython); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker_feed); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker_read_array_header); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker_read_bytes); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker_read_map_header); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker_skip); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker_tell); - Py_CLEAR(clear_module_state->__pyx_n_s_Unpacker_unpack); - Py_CLEAR(clear_module_state->__pyx_n_s_ValueError); - Py_CLEAR(clear_module_state->__pyx_n_s__29); - Py_CLEAR(clear_module_state->__pyx_kp_u__30); - Py_CLEAR(clear_module_state->__pyx_n_s__62); - Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); - Py_CLEAR(clear_module_state->__pyx_n_s_autoreset); - Py_CLEAR(clear_module_state->__pyx_n_s_buf); - Py_CLEAR(clear_module_state->__pyx_n_s_buf_len); - Py_CLEAR(clear_module_state->__pyx_n_s_bytes); - Py_CLEAR(clear_module_state->__pyx_kp_u_cannot_unpack_from_multi_byte_ob); - Py_CLEAR(clear_module_state->__pyx_n_s_cerr); - Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); - Py_CLEAR(clear_module_state->__pyx_n_s_code); - Py_CLEAR(clear_module_state->__pyx_kp_u_could_not_get_buffer_for_memoryv); - Py_CLEAR(clear_module_state->__pyx_n_s_ctx); - Py_CLEAR(clear_module_state->__pyx_n_u_d); - Py_CLEAR(clear_module_state->__pyx_n_s_data); - Py_CLEAR(clear_module_state->__pyx_n_s_datetime); - Py_CLEAR(clear_module_state->__pyx_n_s_default); - Py_CLEAR(clear_module_state->__pyx_kp_u_default_must_be_a_callable); - Py_CLEAR(clear_module_state->__pyx_n_s_default_read_extended_type); - Py_CLEAR(clear_module_state->__pyx_kp_u_dict_is_too_large); - Py_CLEAR(clear_module_state->__pyx_kp_u_disable); - Py_CLEAR(clear_module_state->__pyx_kp_u_enable); - Py_CLEAR(clear_module_state->__pyx_n_s_exceptions); - Py_CLEAR(clear_module_state->__pyx_n_s_ext); - Py_CLEAR(clear_module_state->__pyx_n_s_ext_hook); - Py_CLEAR(clear_module_state->__pyx_kp_u_ext_hook_must_be_a_callable); - Py_CLEAR(clear_module_state->__pyx_kp_u_failed_to_calculate_delta); - Py_CLEAR(clear_module_state->__pyx_n_s_feed); - Py_CLEAR(clear_module_state->__pyx_n_s_file_like); - Py_CLEAR(clear_module_state->__pyx_kp_u_file_like_read_must_be_a_callab); - Py_CLEAR(clear_module_state->__pyx_kp_u_gc); - Py_CLEAR(clear_module_state->__pyx_n_s_getbuffer); - Py_CLEAR(clear_module_state->__pyx_n_s_getstate); - Py_CLEAR(clear_module_state->__pyx_n_s_import); - Py_CLEAR(clear_module_state->__pyx_n_s_initializing); - Py_CLEAR(clear_module_state->__pyx_kp_u_internal_error); - Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); - Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); - Py_CLEAR(clear_module_state->__pyx_n_s_items); - Py_CLEAR(clear_module_state->__pyx_n_s_k); - Py_CLEAR(clear_module_state->__pyx_n_s_list_hook); - Py_CLEAR(clear_module_state->__pyx_kp_u_list_hook_must_be_a_callable); - Py_CLEAR(clear_module_state->__pyx_kp_u_list_is_too_large); - Py_CLEAR(clear_module_state->__pyx_n_s_main); - Py_CLEAR(clear_module_state->__pyx_n_s_max_array_len); - Py_CLEAR(clear_module_state->__pyx_n_s_max_bin_len); - Py_CLEAR(clear_module_state->__pyx_n_s_max_buffer_size); - Py_CLEAR(clear_module_state->__pyx_n_s_max_ext_len); - Py_CLEAR(clear_module_state->__pyx_n_s_max_map_len); - Py_CLEAR(clear_module_state->__pyx_n_s_max_str_len); - Py_CLEAR(clear_module_state->__pyx_kp_u_memoryview_is_too_large); - Py_CLEAR(clear_module_state->__pyx_n_s_msgpack__cmsgpack); - Py_CLEAR(clear_module_state->__pyx_kp_s_msgpack__packer_pyx); - Py_CLEAR(clear_module_state->__pyx_kp_s_msgpack__unpacker_pyx); - Py_CLEAR(clear_module_state->__pyx_n_s_name); - Py_CLEAR(clear_module_state->__pyx_n_s_nanoseconds); - Py_CLEAR(clear_module_state->__pyx_n_s_nbytes); - Py_CLEAR(clear_module_state->__pyx_n_s_next_bytes); - Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non); - Py_CLEAR(clear_module_state->__pyx_n_s_nread); - Py_CLEAR(clear_module_state->__pyx_n_s_obj); - Py_CLEAR(clear_module_state->__pyx_n_s_object_hook); - Py_CLEAR(clear_module_state->__pyx_kp_u_object_hook_must_be_a_callable); - Py_CLEAR(clear_module_state->__pyx_n_s_object_pairs_hook); - Py_CLEAR(clear_module_state->__pyx_kp_u_object_pairs_hook_and_object_hoo); - Py_CLEAR(clear_module_state->__pyx_kp_u_object_pairs_hook_must_be_a_call); - Py_CLEAR(clear_module_state->__pyx_n_s_off); - Py_CLEAR(clear_module_state->__pyx_n_s_pack); - Py_CLEAR(clear_module_state->__pyx_n_s_pack_array_header); - Py_CLEAR(clear_module_state->__pyx_n_s_pack_ext_type); - Py_CLEAR(clear_module_state->__pyx_n_s_pack_map_header); - Py_CLEAR(clear_module_state->__pyx_n_s_pack_map_pairs); - Py_CLEAR(clear_module_state->__pyx_n_s_packed); - Py_CLEAR(clear_module_state->__pyx_n_s_pairs); - Py_CLEAR(clear_module_state->__pyx_n_s_pybuff); - Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); - Py_CLEAR(clear_module_state->__pyx_n_s_pyx_vtable); - Py_CLEAR(clear_module_state->__pyx_n_s_raw); - Py_CLEAR(clear_module_state->__pyx_n_s_read); - Py_CLEAR(clear_module_state->__pyx_n_s_read_array_header); - Py_CLEAR(clear_module_state->__pyx_n_s_read_bytes); - Py_CLEAR(clear_module_state->__pyx_n_s_read_map_header); - Py_CLEAR(clear_module_state->__pyx_n_s_read_size); - Py_CLEAR(clear_module_state->__pyx_kp_u_read_size_should_be_less_or_equa); - Py_CLEAR(clear_module_state->__pyx_kp_u_recursion_limit_exceeded); - Py_CLEAR(clear_module_state->__pyx_n_s_reduce); - Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); - Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); - Py_CLEAR(clear_module_state->__pyx_n_s_reset); - Py_CLEAR(clear_module_state->__pyx_n_s_ret); - Py_CLEAR(clear_module_state->__pyx_n_s_seconds); - Py_CLEAR(clear_module_state->__pyx_n_s_self); - Py_CLEAR(clear_module_state->__pyx_n_s_setstate); - Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); - Py_CLEAR(clear_module_state->__pyx_n_s_size); - Py_CLEAR(clear_module_state->__pyx_n_s_skip); - Py_CLEAR(clear_module_state->__pyx_n_s_spec); - Py_CLEAR(clear_module_state->__pyx_n_s_strict_map_key); - Py_CLEAR(clear_module_state->__pyx_n_s_strict_types); - Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); - Py_CLEAR(clear_module_state->__pyx_n_s_tell); - Py_CLEAR(clear_module_state->__pyx_n_s_test); - Py_CLEAR(clear_module_state->__pyx_n_s_timestamp); - Py_CLEAR(clear_module_state->__pyx_kp_u_timestamp_must_be_0_3); - Py_CLEAR(clear_module_state->__pyx_n_s_timezone); - Py_CLEAR(clear_module_state->__pyx_n_s_typecode); - Py_CLEAR(clear_module_state->__pyx_n_s_unicode_errors); - Py_CLEAR(clear_module_state->__pyx_kp_u_unicode_string_is_too_large); - Py_CLEAR(clear_module_state->__pyx_n_s_unpack); - Py_CLEAR(clear_module_state->__pyx_n_s_unpackb); - Py_CLEAR(clear_module_state->__pyx_kp_u_unpacker_feed_is_not_be_able_to); - Py_CLEAR(clear_module_state->__pyx_n_s_use_bin_type); - Py_CLEAR(clear_module_state->__pyx_n_s_use_list); - Py_CLEAR(clear_module_state->__pyx_n_s_use_single_float); - Py_CLEAR(clear_module_state->__pyx_n_s_utc); - Py_CLEAR(clear_module_state->__pyx_n_s_v); - Py_CLEAR(clear_module_state->__pyx_n_s_view); - Py_CLEAR(clear_module_state->__pyx_int_0); - Py_CLEAR(clear_module_state->__pyx_int_1000000000); - Py_CLEAR(clear_module_state->__pyx_k__23); - Py_CLEAR(clear_module_state->__pyx_tuple_); - Py_CLEAR(clear_module_state->__pyx_tuple__2); - Py_CLEAR(clear_module_state->__pyx_tuple__3); - Py_CLEAR(clear_module_state->__pyx_tuple__5); - Py_CLEAR(clear_module_state->__pyx_tuple__6); - Py_CLEAR(clear_module_state->__pyx_tuple__7); - Py_CLEAR(clear_module_state->__pyx_tuple__8); - Py_CLEAR(clear_module_state->__pyx_tuple__9); - Py_CLEAR(clear_module_state->__pyx_tuple__10); - Py_CLEAR(clear_module_state->__pyx_tuple__11); - Py_CLEAR(clear_module_state->__pyx_tuple__12); - Py_CLEAR(clear_module_state->__pyx_tuple__13); - Py_CLEAR(clear_module_state->__pyx_tuple__14); - Py_CLEAR(clear_module_state->__pyx_tuple__15); - Py_CLEAR(clear_module_state->__pyx_tuple__16); - Py_CLEAR(clear_module_state->__pyx_tuple__17); - Py_CLEAR(clear_module_state->__pyx_tuple__18); - Py_CLEAR(clear_module_state->__pyx_tuple__19); - Py_CLEAR(clear_module_state->__pyx_tuple__20); - Py_CLEAR(clear_module_state->__pyx_tuple__21); - Py_CLEAR(clear_module_state->__pyx_tuple__22); - Py_CLEAR(clear_module_state->__pyx_tuple__24); - Py_CLEAR(clear_module_state->__pyx_tuple__25); - Py_CLEAR(clear_module_state->__pyx_tuple__26); - Py_CLEAR(clear_module_state->__pyx_tuple__27); - Py_CLEAR(clear_module_state->__pyx_tuple__28); - Py_CLEAR(clear_module_state->__pyx_tuple__31); - Py_CLEAR(clear_module_state->__pyx_tuple__33); - Py_CLEAR(clear_module_state->__pyx_tuple__35); - Py_CLEAR(clear_module_state->__pyx_tuple__38); - Py_CLEAR(clear_module_state->__pyx_tuple__40); - Py_CLEAR(clear_module_state->__pyx_tuple__45); - Py_CLEAR(clear_module_state->__pyx_tuple__47); - Py_CLEAR(clear_module_state->__pyx_tuple__49); - Py_CLEAR(clear_module_state->__pyx_tuple__51); - Py_CLEAR(clear_module_state->__pyx_tuple__53); - Py_CLEAR(clear_module_state->__pyx_codeobj__32); - Py_CLEAR(clear_module_state->__pyx_codeobj__34); - Py_CLEAR(clear_module_state->__pyx_codeobj__36); - Py_CLEAR(clear_module_state->__pyx_codeobj__37); - Py_CLEAR(clear_module_state->__pyx_codeobj__39); - Py_CLEAR(clear_module_state->__pyx_codeobj__41); - Py_CLEAR(clear_module_state->__pyx_codeobj__42); - Py_CLEAR(clear_module_state->__pyx_codeobj__43); - Py_CLEAR(clear_module_state->__pyx_codeobj__44); - Py_CLEAR(clear_module_state->__pyx_codeobj__46); - Py_CLEAR(clear_module_state->__pyx_codeobj__48); - Py_CLEAR(clear_module_state->__pyx_codeobj__50); - Py_CLEAR(clear_module_state->__pyx_codeobj__52); - Py_CLEAR(clear_module_state->__pyx_codeobj__54); - Py_CLEAR(clear_module_state->__pyx_codeobj__55); - Py_CLEAR(clear_module_state->__pyx_codeobj__56); - Py_CLEAR(clear_module_state->__pyx_codeobj__57); - Py_CLEAR(clear_module_state->__pyx_codeobj__58); - Py_CLEAR(clear_module_state->__pyx_codeobj__59); - Py_CLEAR(clear_module_state->__pyx_codeobj__60); - Py_CLEAR(clear_module_state->__pyx_codeobj__61); - return 0; -} -#endif -/* #### Code section: module_state_traverse ### */ -#if CYTHON_USE_MODULE_STATE -static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { - __pyx_mstate *traverse_module_state = __pyx_mstate(m); - if (!traverse_module_state) return 0; - Py_VISIT(traverse_module_state->__pyx_d); - Py_VISIT(traverse_module_state->__pyx_b); - Py_VISIT(traverse_module_state->__pyx_cython_runtime); - Py_VISIT(traverse_module_state->__pyx_empty_tuple); - Py_VISIT(traverse_module_state->__pyx_empty_bytes); - Py_VISIT(traverse_module_state->__pyx_empty_unicode); - #ifdef __Pyx_CyFunction_USED - Py_VISIT(traverse_module_state->__pyx_CyFunctionType); - #endif - #ifdef __Pyx_FusedFunction_USED - Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); - #endif - Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4type_type); - Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_4bool_bool); - Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_7complex_complex); - Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_8datetime_date); - Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_8datetime_time); - Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_8datetime_datetime); - Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_8datetime_timedelta); - Py_VISIT(traverse_module_state->__pyx_ptype_7cpython_8datetime_tzinfo); - Py_VISIT(traverse_module_state->__pyx_ptype_7msgpack_9_cmsgpack_Packer); - Py_VISIT(traverse_module_state->__pyx_type_7msgpack_9_cmsgpack_Packer); - Py_VISIT(traverse_module_state->__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - Py_VISIT(traverse_module_state->__pyx_type_7msgpack_9_cmsgpack_Unpacker); - Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); - Py_VISIT(traverse_module_state->__pyx_n_s_BufferError); - Py_VISIT(traverse_module_state->__pyx_n_s_BufferFull); - Py_VISIT(traverse_module_state->__pyx_kp_u_Cannot_decode_extended_type_with); - Py_VISIT(traverse_module_state->__pyx_kp_u_EXT_data_is_too_large); - Py_VISIT(traverse_module_state->__pyx_n_s_ExtType); - Py_VISIT(traverse_module_state->__pyx_n_s_ExtraData); - Py_VISIT(traverse_module_state->__pyx_n_s_FormatError); - Py_VISIT(traverse_module_state->__pyx_kp_u_Integer_value_out_of_range); - Py_VISIT(traverse_module_state->__pyx_n_s_MemoryError); - Py_VISIT(traverse_module_state->__pyx_kp_u_No_more_data_to_unpack); - Py_VISIT(traverse_module_state->__pyx_n_s_NotImplementedError); - Py_VISIT(traverse_module_state->__pyx_n_s_OutOfData); - Py_VISIT(traverse_module_state->__pyx_n_s_OverflowError); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer___reduce_cython); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer___setstate_cython); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer_bytes); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer_getbuffer); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer_pack); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer_pack_array_header); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer_pack_ext_type); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer_pack_map_header); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer_pack_map_pairs); - Py_VISIT(traverse_module_state->__pyx_n_s_Packer_reset); - Py_VISIT(traverse_module_state->__pyx_n_s_RuntimeError); - Py_VISIT(traverse_module_state->__pyx_n_s_StackError); - Py_VISIT(traverse_module_state->__pyx_n_s_StopIteration); - Py_VISIT(traverse_module_state->__pyx_kp_u_Time_zones_are_not_available_fro); - Py_VISIT(traverse_module_state->__pyx_n_s_Timestamp); - Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); - Py_VISIT(traverse_module_state->__pyx_kp_u_Unable_to_allocate_internal_buff); - Py_VISIT(traverse_module_state->__pyx_kp_u_Unable_to_enlarge_internal_buffe); - Py_VISIT(traverse_module_state->__pyx_kp_u_Unpack_failed_error); - Py_VISIT(traverse_module_state->__pyx_kp_u_Unpack_failed_incomplete_input); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker___reduce_cython); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker___setstate_cython); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker_feed); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker_read_array_header); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker_read_bytes); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker_read_map_header); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker_skip); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker_tell); - Py_VISIT(traverse_module_state->__pyx_n_s_Unpacker_unpack); - Py_VISIT(traverse_module_state->__pyx_n_s_ValueError); - Py_VISIT(traverse_module_state->__pyx_n_s__29); - Py_VISIT(traverse_module_state->__pyx_kp_u__30); - Py_VISIT(traverse_module_state->__pyx_n_s__62); - Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); - Py_VISIT(traverse_module_state->__pyx_n_s_autoreset); - Py_VISIT(traverse_module_state->__pyx_n_s_buf); - Py_VISIT(traverse_module_state->__pyx_n_s_buf_len); - Py_VISIT(traverse_module_state->__pyx_n_s_bytes); - Py_VISIT(traverse_module_state->__pyx_kp_u_cannot_unpack_from_multi_byte_ob); - Py_VISIT(traverse_module_state->__pyx_n_s_cerr); - Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); - Py_VISIT(traverse_module_state->__pyx_n_s_code); - Py_VISIT(traverse_module_state->__pyx_kp_u_could_not_get_buffer_for_memoryv); - Py_VISIT(traverse_module_state->__pyx_n_s_ctx); - Py_VISIT(traverse_module_state->__pyx_n_u_d); - Py_VISIT(traverse_module_state->__pyx_n_s_data); - Py_VISIT(traverse_module_state->__pyx_n_s_datetime); - Py_VISIT(traverse_module_state->__pyx_n_s_default); - Py_VISIT(traverse_module_state->__pyx_kp_u_default_must_be_a_callable); - Py_VISIT(traverse_module_state->__pyx_n_s_default_read_extended_type); - Py_VISIT(traverse_module_state->__pyx_kp_u_dict_is_too_large); - Py_VISIT(traverse_module_state->__pyx_kp_u_disable); - Py_VISIT(traverse_module_state->__pyx_kp_u_enable); - Py_VISIT(traverse_module_state->__pyx_n_s_exceptions); - Py_VISIT(traverse_module_state->__pyx_n_s_ext); - Py_VISIT(traverse_module_state->__pyx_n_s_ext_hook); - Py_VISIT(traverse_module_state->__pyx_kp_u_ext_hook_must_be_a_callable); - Py_VISIT(traverse_module_state->__pyx_kp_u_failed_to_calculate_delta); - Py_VISIT(traverse_module_state->__pyx_n_s_feed); - Py_VISIT(traverse_module_state->__pyx_n_s_file_like); - Py_VISIT(traverse_module_state->__pyx_kp_u_file_like_read_must_be_a_callab); - Py_VISIT(traverse_module_state->__pyx_kp_u_gc); - Py_VISIT(traverse_module_state->__pyx_n_s_getbuffer); - Py_VISIT(traverse_module_state->__pyx_n_s_getstate); - Py_VISIT(traverse_module_state->__pyx_n_s_import); - Py_VISIT(traverse_module_state->__pyx_n_s_initializing); - Py_VISIT(traverse_module_state->__pyx_kp_u_internal_error); - Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); - Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); - Py_VISIT(traverse_module_state->__pyx_n_s_items); - Py_VISIT(traverse_module_state->__pyx_n_s_k); - Py_VISIT(traverse_module_state->__pyx_n_s_list_hook); - Py_VISIT(traverse_module_state->__pyx_kp_u_list_hook_must_be_a_callable); - Py_VISIT(traverse_module_state->__pyx_kp_u_list_is_too_large); - Py_VISIT(traverse_module_state->__pyx_n_s_main); - Py_VISIT(traverse_module_state->__pyx_n_s_max_array_len); - Py_VISIT(traverse_module_state->__pyx_n_s_max_bin_len); - Py_VISIT(traverse_module_state->__pyx_n_s_max_buffer_size); - Py_VISIT(traverse_module_state->__pyx_n_s_max_ext_len); - Py_VISIT(traverse_module_state->__pyx_n_s_max_map_len); - Py_VISIT(traverse_module_state->__pyx_n_s_max_str_len); - Py_VISIT(traverse_module_state->__pyx_kp_u_memoryview_is_too_large); - Py_VISIT(traverse_module_state->__pyx_n_s_msgpack__cmsgpack); - Py_VISIT(traverse_module_state->__pyx_kp_s_msgpack__packer_pyx); - Py_VISIT(traverse_module_state->__pyx_kp_s_msgpack__unpacker_pyx); - Py_VISIT(traverse_module_state->__pyx_n_s_name); - Py_VISIT(traverse_module_state->__pyx_n_s_nanoseconds); - Py_VISIT(traverse_module_state->__pyx_n_s_nbytes); - Py_VISIT(traverse_module_state->__pyx_n_s_next_bytes); - Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non); - Py_VISIT(traverse_module_state->__pyx_n_s_nread); - Py_VISIT(traverse_module_state->__pyx_n_s_obj); - Py_VISIT(traverse_module_state->__pyx_n_s_object_hook); - Py_VISIT(traverse_module_state->__pyx_kp_u_object_hook_must_be_a_callable); - Py_VISIT(traverse_module_state->__pyx_n_s_object_pairs_hook); - Py_VISIT(traverse_module_state->__pyx_kp_u_object_pairs_hook_and_object_hoo); - Py_VISIT(traverse_module_state->__pyx_kp_u_object_pairs_hook_must_be_a_call); - Py_VISIT(traverse_module_state->__pyx_n_s_off); - Py_VISIT(traverse_module_state->__pyx_n_s_pack); - Py_VISIT(traverse_module_state->__pyx_n_s_pack_array_header); - Py_VISIT(traverse_module_state->__pyx_n_s_pack_ext_type); - Py_VISIT(traverse_module_state->__pyx_n_s_pack_map_header); - Py_VISIT(traverse_module_state->__pyx_n_s_pack_map_pairs); - Py_VISIT(traverse_module_state->__pyx_n_s_packed); - Py_VISIT(traverse_module_state->__pyx_n_s_pairs); - Py_VISIT(traverse_module_state->__pyx_n_s_pybuff); - Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); - Py_VISIT(traverse_module_state->__pyx_n_s_pyx_vtable); - Py_VISIT(traverse_module_state->__pyx_n_s_raw); - Py_VISIT(traverse_module_state->__pyx_n_s_read); - Py_VISIT(traverse_module_state->__pyx_n_s_read_array_header); - Py_VISIT(traverse_module_state->__pyx_n_s_read_bytes); - Py_VISIT(traverse_module_state->__pyx_n_s_read_map_header); - Py_VISIT(traverse_module_state->__pyx_n_s_read_size); - Py_VISIT(traverse_module_state->__pyx_kp_u_read_size_should_be_less_or_equa); - Py_VISIT(traverse_module_state->__pyx_kp_u_recursion_limit_exceeded); - Py_VISIT(traverse_module_state->__pyx_n_s_reduce); - Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); - Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); - Py_VISIT(traverse_module_state->__pyx_n_s_reset); - Py_VISIT(traverse_module_state->__pyx_n_s_ret); - Py_VISIT(traverse_module_state->__pyx_n_s_seconds); - Py_VISIT(traverse_module_state->__pyx_n_s_self); - Py_VISIT(traverse_module_state->__pyx_n_s_setstate); - Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); - Py_VISIT(traverse_module_state->__pyx_n_s_size); - Py_VISIT(traverse_module_state->__pyx_n_s_skip); - Py_VISIT(traverse_module_state->__pyx_n_s_spec); - Py_VISIT(traverse_module_state->__pyx_n_s_strict_map_key); - Py_VISIT(traverse_module_state->__pyx_n_s_strict_types); - Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); - Py_VISIT(traverse_module_state->__pyx_n_s_tell); - Py_VISIT(traverse_module_state->__pyx_n_s_test); - Py_VISIT(traverse_module_state->__pyx_n_s_timestamp); - Py_VISIT(traverse_module_state->__pyx_kp_u_timestamp_must_be_0_3); - Py_VISIT(traverse_module_state->__pyx_n_s_timezone); - Py_VISIT(traverse_module_state->__pyx_n_s_typecode); - Py_VISIT(traverse_module_state->__pyx_n_s_unicode_errors); - Py_VISIT(traverse_module_state->__pyx_kp_u_unicode_string_is_too_large); - Py_VISIT(traverse_module_state->__pyx_n_s_unpack); - Py_VISIT(traverse_module_state->__pyx_n_s_unpackb); - Py_VISIT(traverse_module_state->__pyx_kp_u_unpacker_feed_is_not_be_able_to); - Py_VISIT(traverse_module_state->__pyx_n_s_use_bin_type); - Py_VISIT(traverse_module_state->__pyx_n_s_use_list); - Py_VISIT(traverse_module_state->__pyx_n_s_use_single_float); - Py_VISIT(traverse_module_state->__pyx_n_s_utc); - Py_VISIT(traverse_module_state->__pyx_n_s_v); - Py_VISIT(traverse_module_state->__pyx_n_s_view); - Py_VISIT(traverse_module_state->__pyx_int_0); - Py_VISIT(traverse_module_state->__pyx_int_1000000000); - Py_VISIT(traverse_module_state->__pyx_k__23); - Py_VISIT(traverse_module_state->__pyx_tuple_); - Py_VISIT(traverse_module_state->__pyx_tuple__2); - Py_VISIT(traverse_module_state->__pyx_tuple__3); - Py_VISIT(traverse_module_state->__pyx_tuple__5); - Py_VISIT(traverse_module_state->__pyx_tuple__6); - Py_VISIT(traverse_module_state->__pyx_tuple__7); - Py_VISIT(traverse_module_state->__pyx_tuple__8); - Py_VISIT(traverse_module_state->__pyx_tuple__9); - Py_VISIT(traverse_module_state->__pyx_tuple__10); - Py_VISIT(traverse_module_state->__pyx_tuple__11); - Py_VISIT(traverse_module_state->__pyx_tuple__12); - Py_VISIT(traverse_module_state->__pyx_tuple__13); - Py_VISIT(traverse_module_state->__pyx_tuple__14); - Py_VISIT(traverse_module_state->__pyx_tuple__15); - Py_VISIT(traverse_module_state->__pyx_tuple__16); - Py_VISIT(traverse_module_state->__pyx_tuple__17); - Py_VISIT(traverse_module_state->__pyx_tuple__18); - Py_VISIT(traverse_module_state->__pyx_tuple__19); - Py_VISIT(traverse_module_state->__pyx_tuple__20); - Py_VISIT(traverse_module_state->__pyx_tuple__21); - Py_VISIT(traverse_module_state->__pyx_tuple__22); - Py_VISIT(traverse_module_state->__pyx_tuple__24); - Py_VISIT(traverse_module_state->__pyx_tuple__25); - Py_VISIT(traverse_module_state->__pyx_tuple__26); - Py_VISIT(traverse_module_state->__pyx_tuple__27); - Py_VISIT(traverse_module_state->__pyx_tuple__28); - Py_VISIT(traverse_module_state->__pyx_tuple__31); - Py_VISIT(traverse_module_state->__pyx_tuple__33); - Py_VISIT(traverse_module_state->__pyx_tuple__35); - Py_VISIT(traverse_module_state->__pyx_tuple__38); - Py_VISIT(traverse_module_state->__pyx_tuple__40); - Py_VISIT(traverse_module_state->__pyx_tuple__45); - Py_VISIT(traverse_module_state->__pyx_tuple__47); - Py_VISIT(traverse_module_state->__pyx_tuple__49); - Py_VISIT(traverse_module_state->__pyx_tuple__51); - Py_VISIT(traverse_module_state->__pyx_tuple__53); - Py_VISIT(traverse_module_state->__pyx_codeobj__32); - Py_VISIT(traverse_module_state->__pyx_codeobj__34); - Py_VISIT(traverse_module_state->__pyx_codeobj__36); - Py_VISIT(traverse_module_state->__pyx_codeobj__37); - Py_VISIT(traverse_module_state->__pyx_codeobj__39); - Py_VISIT(traverse_module_state->__pyx_codeobj__41); - Py_VISIT(traverse_module_state->__pyx_codeobj__42); - Py_VISIT(traverse_module_state->__pyx_codeobj__43); - Py_VISIT(traverse_module_state->__pyx_codeobj__44); - Py_VISIT(traverse_module_state->__pyx_codeobj__46); - Py_VISIT(traverse_module_state->__pyx_codeobj__48); - Py_VISIT(traverse_module_state->__pyx_codeobj__50); - Py_VISIT(traverse_module_state->__pyx_codeobj__52); - Py_VISIT(traverse_module_state->__pyx_codeobj__54); - Py_VISIT(traverse_module_state->__pyx_codeobj__55); - Py_VISIT(traverse_module_state->__pyx_codeobj__56); - Py_VISIT(traverse_module_state->__pyx_codeobj__57); - Py_VISIT(traverse_module_state->__pyx_codeobj__58); - Py_VISIT(traverse_module_state->__pyx_codeobj__59); - Py_VISIT(traverse_module_state->__pyx_codeobj__60); - Py_VISIT(traverse_module_state->__pyx_codeobj__61); - return 0; -} -#endif -/* #### Code section: module_state_defines ### */ -#define __pyx_d __pyx_mstate_global->__pyx_d -#define __pyx_b __pyx_mstate_global->__pyx_b -#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime -#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple -#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes -#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode -#ifdef __Pyx_CyFunction_USED -#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType -#endif -#ifdef __Pyx_FusedFunction_USED -#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType -#endif -#ifdef __Pyx_Generator_USED -#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType -#endif -#ifdef __Pyx_IterableCoroutine_USED -#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType -#endif -#ifdef __Pyx_Coroutine_USED -#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType -#endif -#ifdef __Pyx_Coroutine_USED -#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#define __pyx_ptype_7cpython_4type_type __pyx_mstate_global->__pyx_ptype_7cpython_4type_type -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#define __pyx_ptype_7cpython_4bool_bool __pyx_mstate_global->__pyx_ptype_7cpython_4bool_bool -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#define __pyx_ptype_7cpython_7complex_complex __pyx_mstate_global->__pyx_ptype_7cpython_7complex_complex -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#define __pyx_ptype_7cpython_8datetime_date __pyx_mstate_global->__pyx_ptype_7cpython_8datetime_date -#define __pyx_ptype_7cpython_8datetime_time __pyx_mstate_global->__pyx_ptype_7cpython_8datetime_time -#define __pyx_ptype_7cpython_8datetime_datetime __pyx_mstate_global->__pyx_ptype_7cpython_8datetime_datetime -#define __pyx_ptype_7cpython_8datetime_timedelta __pyx_mstate_global->__pyx_ptype_7cpython_8datetime_timedelta -#define __pyx_ptype_7cpython_8datetime_tzinfo __pyx_mstate_global->__pyx_ptype_7cpython_8datetime_tzinfo -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#define __pyx_type_7msgpack_9_cmsgpack_Packer __pyx_mstate_global->__pyx_type_7msgpack_9_cmsgpack_Packer -#define __pyx_type_7msgpack_9_cmsgpack_Unpacker __pyx_mstate_global->__pyx_type_7msgpack_9_cmsgpack_Unpacker -#endif -#define __pyx_ptype_7msgpack_9_cmsgpack_Packer __pyx_mstate_global->__pyx_ptype_7msgpack_9_cmsgpack_Packer -#define __pyx_ptype_7msgpack_9_cmsgpack_Unpacker __pyx_mstate_global->__pyx_ptype_7msgpack_9_cmsgpack_Unpacker -#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError -#define __pyx_n_s_BufferError __pyx_mstate_global->__pyx_n_s_BufferError -#define __pyx_n_s_BufferFull __pyx_mstate_global->__pyx_n_s_BufferFull -#define __pyx_kp_u_Cannot_decode_extended_type_with __pyx_mstate_global->__pyx_kp_u_Cannot_decode_extended_type_with -#define __pyx_kp_u_EXT_data_is_too_large __pyx_mstate_global->__pyx_kp_u_EXT_data_is_too_large -#define __pyx_n_s_ExtType __pyx_mstate_global->__pyx_n_s_ExtType -#define __pyx_n_s_ExtraData __pyx_mstate_global->__pyx_n_s_ExtraData -#define __pyx_n_s_FormatError __pyx_mstate_global->__pyx_n_s_FormatError -#define __pyx_kp_u_Integer_value_out_of_range __pyx_mstate_global->__pyx_kp_u_Integer_value_out_of_range -#define __pyx_n_s_MemoryError __pyx_mstate_global->__pyx_n_s_MemoryError -#define __pyx_kp_u_No_more_data_to_unpack __pyx_mstate_global->__pyx_kp_u_No_more_data_to_unpack -#define __pyx_n_s_NotImplementedError __pyx_mstate_global->__pyx_n_s_NotImplementedError -#define __pyx_n_s_OutOfData __pyx_mstate_global->__pyx_n_s_OutOfData -#define __pyx_n_s_OverflowError __pyx_mstate_global->__pyx_n_s_OverflowError -#define __pyx_n_s_Packer __pyx_mstate_global->__pyx_n_s_Packer -#define __pyx_n_s_Packer___reduce_cython __pyx_mstate_global->__pyx_n_s_Packer___reduce_cython -#define __pyx_n_s_Packer___setstate_cython __pyx_mstate_global->__pyx_n_s_Packer___setstate_cython -#define __pyx_n_s_Packer_bytes __pyx_mstate_global->__pyx_n_s_Packer_bytes -#define __pyx_n_s_Packer_getbuffer __pyx_mstate_global->__pyx_n_s_Packer_getbuffer -#define __pyx_n_s_Packer_pack __pyx_mstate_global->__pyx_n_s_Packer_pack -#define __pyx_n_s_Packer_pack_array_header __pyx_mstate_global->__pyx_n_s_Packer_pack_array_header -#define __pyx_n_s_Packer_pack_ext_type __pyx_mstate_global->__pyx_n_s_Packer_pack_ext_type -#define __pyx_n_s_Packer_pack_map_header __pyx_mstate_global->__pyx_n_s_Packer_pack_map_header -#define __pyx_n_s_Packer_pack_map_pairs __pyx_mstate_global->__pyx_n_s_Packer_pack_map_pairs -#define __pyx_n_s_Packer_reset __pyx_mstate_global->__pyx_n_s_Packer_reset -#define __pyx_n_s_RuntimeError __pyx_mstate_global->__pyx_n_s_RuntimeError -#define __pyx_n_s_StackError __pyx_mstate_global->__pyx_n_s_StackError -#define __pyx_n_s_StopIteration __pyx_mstate_global->__pyx_n_s_StopIteration -#define __pyx_kp_u_Time_zones_are_not_available_fro __pyx_mstate_global->__pyx_kp_u_Time_zones_are_not_available_fro -#define __pyx_n_s_Timestamp __pyx_mstate_global->__pyx_n_s_Timestamp -#define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError -#define __pyx_kp_u_Unable_to_allocate_internal_buff __pyx_mstate_global->__pyx_kp_u_Unable_to_allocate_internal_buff -#define __pyx_kp_u_Unable_to_enlarge_internal_buffe __pyx_mstate_global->__pyx_kp_u_Unable_to_enlarge_internal_buffe -#define __pyx_kp_u_Unpack_failed_error __pyx_mstate_global->__pyx_kp_u_Unpack_failed_error -#define __pyx_kp_u_Unpack_failed_incomplete_input __pyx_mstate_global->__pyx_kp_u_Unpack_failed_incomplete_input -#define __pyx_n_s_Unpacker __pyx_mstate_global->__pyx_n_s_Unpacker -#define __pyx_n_s_Unpacker___reduce_cython __pyx_mstate_global->__pyx_n_s_Unpacker___reduce_cython -#define __pyx_n_s_Unpacker___setstate_cython __pyx_mstate_global->__pyx_n_s_Unpacker___setstate_cython -#define __pyx_n_s_Unpacker_feed __pyx_mstate_global->__pyx_n_s_Unpacker_feed -#define __pyx_n_s_Unpacker_read_array_header __pyx_mstate_global->__pyx_n_s_Unpacker_read_array_header -#define __pyx_n_s_Unpacker_read_bytes __pyx_mstate_global->__pyx_n_s_Unpacker_read_bytes -#define __pyx_n_s_Unpacker_read_map_header __pyx_mstate_global->__pyx_n_s_Unpacker_read_map_header -#define __pyx_n_s_Unpacker_skip __pyx_mstate_global->__pyx_n_s_Unpacker_skip -#define __pyx_n_s_Unpacker_tell __pyx_mstate_global->__pyx_n_s_Unpacker_tell -#define __pyx_n_s_Unpacker_unpack __pyx_mstate_global->__pyx_n_s_Unpacker_unpack -#define __pyx_n_s_ValueError __pyx_mstate_global->__pyx_n_s_ValueError -#define __pyx_n_s__29 __pyx_mstate_global->__pyx_n_s__29 -#define __pyx_kp_u__30 __pyx_mstate_global->__pyx_kp_u__30 -#define __pyx_n_s__62 __pyx_mstate_global->__pyx_n_s__62 -#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines -#define __pyx_n_s_autoreset __pyx_mstate_global->__pyx_n_s_autoreset -#define __pyx_n_s_buf __pyx_mstate_global->__pyx_n_s_buf -#define __pyx_n_s_buf_len __pyx_mstate_global->__pyx_n_s_buf_len -#define __pyx_n_s_bytes __pyx_mstate_global->__pyx_n_s_bytes -#define __pyx_kp_u_cannot_unpack_from_multi_byte_ob __pyx_mstate_global->__pyx_kp_u_cannot_unpack_from_multi_byte_ob -#define __pyx_n_s_cerr __pyx_mstate_global->__pyx_n_s_cerr -#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback -#define __pyx_n_s_code __pyx_mstate_global->__pyx_n_s_code -#define __pyx_kp_u_could_not_get_buffer_for_memoryv __pyx_mstate_global->__pyx_kp_u_could_not_get_buffer_for_memoryv -#define __pyx_n_s_ctx __pyx_mstate_global->__pyx_n_s_ctx -#define __pyx_n_u_d __pyx_mstate_global->__pyx_n_u_d -#define __pyx_n_s_data __pyx_mstate_global->__pyx_n_s_data -#define __pyx_n_s_datetime __pyx_mstate_global->__pyx_n_s_datetime -#define __pyx_n_s_default __pyx_mstate_global->__pyx_n_s_default -#define __pyx_kp_u_default_must_be_a_callable __pyx_mstate_global->__pyx_kp_u_default_must_be_a_callable -#define __pyx_n_s_default_read_extended_type __pyx_mstate_global->__pyx_n_s_default_read_extended_type -#define __pyx_kp_u_dict_is_too_large __pyx_mstate_global->__pyx_kp_u_dict_is_too_large -#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable -#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable -#define __pyx_n_s_exceptions __pyx_mstate_global->__pyx_n_s_exceptions -#define __pyx_n_s_ext __pyx_mstate_global->__pyx_n_s_ext -#define __pyx_n_s_ext_hook __pyx_mstate_global->__pyx_n_s_ext_hook -#define __pyx_kp_u_ext_hook_must_be_a_callable __pyx_mstate_global->__pyx_kp_u_ext_hook_must_be_a_callable -#define __pyx_kp_u_failed_to_calculate_delta __pyx_mstate_global->__pyx_kp_u_failed_to_calculate_delta -#define __pyx_n_s_feed __pyx_mstate_global->__pyx_n_s_feed -#define __pyx_n_s_file_like __pyx_mstate_global->__pyx_n_s_file_like -#define __pyx_kp_u_file_like_read_must_be_a_callab __pyx_mstate_global->__pyx_kp_u_file_like_read_must_be_a_callab -#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc -#define __pyx_n_s_getbuffer __pyx_mstate_global->__pyx_n_s_getbuffer -#define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate -#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import -#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing -#define __pyx_kp_u_internal_error __pyx_mstate_global->__pyx_kp_u_internal_error -#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine -#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled -#define __pyx_n_s_items __pyx_mstate_global->__pyx_n_s_items -#define __pyx_n_s_k __pyx_mstate_global->__pyx_n_s_k -#define __pyx_n_s_list_hook __pyx_mstate_global->__pyx_n_s_list_hook -#define __pyx_kp_u_list_hook_must_be_a_callable __pyx_mstate_global->__pyx_kp_u_list_hook_must_be_a_callable -#define __pyx_kp_u_list_is_too_large __pyx_mstate_global->__pyx_kp_u_list_is_too_large -#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main -#define __pyx_n_s_max_array_len __pyx_mstate_global->__pyx_n_s_max_array_len -#define __pyx_n_s_max_bin_len __pyx_mstate_global->__pyx_n_s_max_bin_len -#define __pyx_n_s_max_buffer_size __pyx_mstate_global->__pyx_n_s_max_buffer_size -#define __pyx_n_s_max_ext_len __pyx_mstate_global->__pyx_n_s_max_ext_len -#define __pyx_n_s_max_map_len __pyx_mstate_global->__pyx_n_s_max_map_len -#define __pyx_n_s_max_str_len __pyx_mstate_global->__pyx_n_s_max_str_len -#define __pyx_kp_u_memoryview_is_too_large __pyx_mstate_global->__pyx_kp_u_memoryview_is_too_large -#define __pyx_n_s_msgpack__cmsgpack __pyx_mstate_global->__pyx_n_s_msgpack__cmsgpack -#define __pyx_kp_s_msgpack__packer_pyx __pyx_mstate_global->__pyx_kp_s_msgpack__packer_pyx -#define __pyx_kp_s_msgpack__unpacker_pyx __pyx_mstate_global->__pyx_kp_s_msgpack__unpacker_pyx -#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name -#define __pyx_n_s_nanoseconds __pyx_mstate_global->__pyx_n_s_nanoseconds -#define __pyx_n_s_nbytes __pyx_mstate_global->__pyx_n_s_nbytes -#define __pyx_n_s_next_bytes __pyx_mstate_global->__pyx_n_s_next_bytes -#define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non -#define __pyx_n_s_nread __pyx_mstate_global->__pyx_n_s_nread -#define __pyx_n_s_obj __pyx_mstate_global->__pyx_n_s_obj -#define __pyx_n_s_object_hook __pyx_mstate_global->__pyx_n_s_object_hook -#define __pyx_kp_u_object_hook_must_be_a_callable __pyx_mstate_global->__pyx_kp_u_object_hook_must_be_a_callable -#define __pyx_n_s_object_pairs_hook __pyx_mstate_global->__pyx_n_s_object_pairs_hook -#define __pyx_kp_u_object_pairs_hook_and_object_hoo __pyx_mstate_global->__pyx_kp_u_object_pairs_hook_and_object_hoo -#define __pyx_kp_u_object_pairs_hook_must_be_a_call __pyx_mstate_global->__pyx_kp_u_object_pairs_hook_must_be_a_call -#define __pyx_n_s_off __pyx_mstate_global->__pyx_n_s_off -#define __pyx_n_s_pack __pyx_mstate_global->__pyx_n_s_pack -#define __pyx_n_s_pack_array_header __pyx_mstate_global->__pyx_n_s_pack_array_header -#define __pyx_n_s_pack_ext_type __pyx_mstate_global->__pyx_n_s_pack_ext_type -#define __pyx_n_s_pack_map_header __pyx_mstate_global->__pyx_n_s_pack_map_header -#define __pyx_n_s_pack_map_pairs __pyx_mstate_global->__pyx_n_s_pack_map_pairs -#define __pyx_n_s_packed __pyx_mstate_global->__pyx_n_s_packed -#define __pyx_n_s_pairs __pyx_mstate_global->__pyx_n_s_pairs -#define __pyx_n_s_pybuff __pyx_mstate_global->__pyx_n_s_pybuff -#define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state -#define __pyx_n_s_pyx_vtable __pyx_mstate_global->__pyx_n_s_pyx_vtable -#define __pyx_n_s_raw __pyx_mstate_global->__pyx_n_s_raw -#define __pyx_n_s_read __pyx_mstate_global->__pyx_n_s_read -#define __pyx_n_s_read_array_header __pyx_mstate_global->__pyx_n_s_read_array_header -#define __pyx_n_s_read_bytes __pyx_mstate_global->__pyx_n_s_read_bytes -#define __pyx_n_s_read_map_header __pyx_mstate_global->__pyx_n_s_read_map_header -#define __pyx_n_s_read_size __pyx_mstate_global->__pyx_n_s_read_size -#define __pyx_kp_u_read_size_should_be_less_or_equa __pyx_mstate_global->__pyx_kp_u_read_size_should_be_less_or_equa -#define __pyx_kp_u_recursion_limit_exceeded __pyx_mstate_global->__pyx_kp_u_recursion_limit_exceeded -#define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce -#define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython -#define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex -#define __pyx_n_s_reset __pyx_mstate_global->__pyx_n_s_reset -#define __pyx_n_s_ret __pyx_mstate_global->__pyx_n_s_ret -#define __pyx_n_s_seconds __pyx_mstate_global->__pyx_n_s_seconds -#define __pyx_n_s_self __pyx_mstate_global->__pyx_n_s_self -#define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate -#define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython -#define __pyx_n_s_size __pyx_mstate_global->__pyx_n_s_size -#define __pyx_n_s_skip __pyx_mstate_global->__pyx_n_s_skip -#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec -#define __pyx_n_s_strict_map_key __pyx_mstate_global->__pyx_n_s_strict_map_key -#define __pyx_n_s_strict_types __pyx_mstate_global->__pyx_n_s_strict_types -#define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource -#define __pyx_n_s_tell __pyx_mstate_global->__pyx_n_s_tell -#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test -#define __pyx_n_s_timestamp __pyx_mstate_global->__pyx_n_s_timestamp -#define __pyx_kp_u_timestamp_must_be_0_3 __pyx_mstate_global->__pyx_kp_u_timestamp_must_be_0_3 -#define __pyx_n_s_timezone __pyx_mstate_global->__pyx_n_s_timezone -#define __pyx_n_s_typecode __pyx_mstate_global->__pyx_n_s_typecode -#define __pyx_n_s_unicode_errors __pyx_mstate_global->__pyx_n_s_unicode_errors -#define __pyx_kp_u_unicode_string_is_too_large __pyx_mstate_global->__pyx_kp_u_unicode_string_is_too_large -#define __pyx_n_s_unpack __pyx_mstate_global->__pyx_n_s_unpack -#define __pyx_n_s_unpackb __pyx_mstate_global->__pyx_n_s_unpackb -#define __pyx_kp_u_unpacker_feed_is_not_be_able_to __pyx_mstate_global->__pyx_kp_u_unpacker_feed_is_not_be_able_to -#define __pyx_n_s_use_bin_type __pyx_mstate_global->__pyx_n_s_use_bin_type -#define __pyx_n_s_use_list __pyx_mstate_global->__pyx_n_s_use_list -#define __pyx_n_s_use_single_float __pyx_mstate_global->__pyx_n_s_use_single_float -#define __pyx_n_s_utc __pyx_mstate_global->__pyx_n_s_utc -#define __pyx_n_s_v __pyx_mstate_global->__pyx_n_s_v -#define __pyx_n_s_view __pyx_mstate_global->__pyx_n_s_view -#define __pyx_int_0 __pyx_mstate_global->__pyx_int_0 -#define __pyx_int_1000000000 __pyx_mstate_global->__pyx_int_1000000000 -#define __pyx_k__4 __pyx_mstate_global->__pyx_k__4 -#define __pyx_k__23 __pyx_mstate_global->__pyx_k__23 -#define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_ -#define __pyx_tuple__2 __pyx_mstate_global->__pyx_tuple__2 -#define __pyx_tuple__3 __pyx_mstate_global->__pyx_tuple__3 -#define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 -#define __pyx_tuple__6 __pyx_mstate_global->__pyx_tuple__6 -#define __pyx_tuple__7 __pyx_mstate_global->__pyx_tuple__7 -#define __pyx_tuple__8 __pyx_mstate_global->__pyx_tuple__8 -#define __pyx_tuple__9 __pyx_mstate_global->__pyx_tuple__9 -#define __pyx_tuple__10 __pyx_mstate_global->__pyx_tuple__10 -#define __pyx_tuple__11 __pyx_mstate_global->__pyx_tuple__11 -#define __pyx_tuple__12 __pyx_mstate_global->__pyx_tuple__12 -#define __pyx_tuple__13 __pyx_mstate_global->__pyx_tuple__13 -#define __pyx_tuple__14 __pyx_mstate_global->__pyx_tuple__14 -#define __pyx_tuple__15 __pyx_mstate_global->__pyx_tuple__15 -#define __pyx_tuple__16 __pyx_mstate_global->__pyx_tuple__16 -#define __pyx_tuple__17 __pyx_mstate_global->__pyx_tuple__17 -#define __pyx_tuple__18 __pyx_mstate_global->__pyx_tuple__18 -#define __pyx_tuple__19 __pyx_mstate_global->__pyx_tuple__19 -#define __pyx_tuple__20 __pyx_mstate_global->__pyx_tuple__20 -#define __pyx_tuple__21 __pyx_mstate_global->__pyx_tuple__21 -#define __pyx_tuple__22 __pyx_mstate_global->__pyx_tuple__22 -#define __pyx_tuple__24 __pyx_mstate_global->__pyx_tuple__24 -#define __pyx_tuple__25 __pyx_mstate_global->__pyx_tuple__25 -#define __pyx_tuple__26 __pyx_mstate_global->__pyx_tuple__26 -#define __pyx_tuple__27 __pyx_mstate_global->__pyx_tuple__27 -#define __pyx_tuple__28 __pyx_mstate_global->__pyx_tuple__28 -#define __pyx_tuple__31 __pyx_mstate_global->__pyx_tuple__31 -#define __pyx_tuple__33 __pyx_mstate_global->__pyx_tuple__33 -#define __pyx_tuple__35 __pyx_mstate_global->__pyx_tuple__35 -#define __pyx_tuple__38 __pyx_mstate_global->__pyx_tuple__38 -#define __pyx_tuple__40 __pyx_mstate_global->__pyx_tuple__40 -#define __pyx_tuple__45 __pyx_mstate_global->__pyx_tuple__45 -#define __pyx_tuple__47 __pyx_mstate_global->__pyx_tuple__47 -#define __pyx_tuple__49 __pyx_mstate_global->__pyx_tuple__49 -#define __pyx_tuple__51 __pyx_mstate_global->__pyx_tuple__51 -#define __pyx_tuple__53 __pyx_mstate_global->__pyx_tuple__53 -#define __pyx_codeobj__32 __pyx_mstate_global->__pyx_codeobj__32 -#define __pyx_codeobj__34 __pyx_mstate_global->__pyx_codeobj__34 -#define __pyx_codeobj__36 __pyx_mstate_global->__pyx_codeobj__36 -#define __pyx_codeobj__37 __pyx_mstate_global->__pyx_codeobj__37 -#define __pyx_codeobj__39 __pyx_mstate_global->__pyx_codeobj__39 -#define __pyx_codeobj__41 __pyx_mstate_global->__pyx_codeobj__41 -#define __pyx_codeobj__42 __pyx_mstate_global->__pyx_codeobj__42 -#define __pyx_codeobj__43 __pyx_mstate_global->__pyx_codeobj__43 -#define __pyx_codeobj__44 __pyx_mstate_global->__pyx_codeobj__44 -#define __pyx_codeobj__46 __pyx_mstate_global->__pyx_codeobj__46 -#define __pyx_codeobj__48 __pyx_mstate_global->__pyx_codeobj__48 -#define __pyx_codeobj__50 __pyx_mstate_global->__pyx_codeobj__50 -#define __pyx_codeobj__52 __pyx_mstate_global->__pyx_codeobj__52 -#define __pyx_codeobj__54 __pyx_mstate_global->__pyx_codeobj__54 -#define __pyx_codeobj__55 __pyx_mstate_global->__pyx_codeobj__55 -#define __pyx_codeobj__56 __pyx_mstate_global->__pyx_codeobj__56 -#define __pyx_codeobj__57 __pyx_mstate_global->__pyx_codeobj__57 -#define __pyx_codeobj__58 __pyx_mstate_global->__pyx_codeobj__58 -#define __pyx_codeobj__59 __pyx_mstate_global->__pyx_codeobj__59 -#define __pyx_codeobj__60 __pyx_mstate_global->__pyx_codeobj__60 -#define __pyx_codeobj__61 __pyx_mstate_global->__pyx_codeobj__61 -/* #### Code section: module_code ### */ - -/* "cpython/datetime.pxd":72 - * ctypedef extern class datetime.date[object PyDateTime_Date]: - * @property - * cdef inline int year(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_YEAR(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4date_4year_year(PyDateTime_Date *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("year", 0); - - /* "cpython/datetime.pxd":73 - * @property - * cdef inline int year(self): - * return PyDateTime_GET_YEAR(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_GET_YEAR(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":72 - * ctypedef extern class datetime.date[object PyDateTime_Date]: - * @property - * cdef inline int year(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_YEAR(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":76 - * - * @property - * cdef inline int month(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_MONTH(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4date_5month_month(PyDateTime_Date *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("month", 0); - - /* "cpython/datetime.pxd":77 - * @property - * cdef inline int month(self): - * return PyDateTime_GET_MONTH(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_GET_MONTH(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":76 - * - * @property - * cdef inline int month(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_MONTH(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":80 - * - * @property - * cdef inline int day(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_DAY(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4date_3day_day(PyDateTime_Date *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("day", 0); - - /* "cpython/datetime.pxd":81 - * @property - * cdef inline int day(self): - * return PyDateTime_GET_DAY(self) # <<<<<<<<<<<<<< - * - * ctypedef extern class datetime.time[object PyDateTime_Time]: - */ - __pyx_r = PyDateTime_GET_DAY(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":80 - * - * @property - * cdef inline int day(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_DAY(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":85 - * ctypedef extern class datetime.time[object PyDateTime_Time]: - * @property - * cdef inline int hour(self): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_HOUR(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_4hour_hour(PyDateTime_Time *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("hour", 0); - - /* "cpython/datetime.pxd":86 - * @property - * cdef inline int hour(self): - * return PyDateTime_TIME_GET_HOUR(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_TIME_GET_HOUR(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":85 - * ctypedef extern class datetime.time[object PyDateTime_Time]: - * @property - * cdef inline int hour(self): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_HOUR(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":89 - * - * @property - * cdef inline int minute(self): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_MINUTE(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_6minute_minute(PyDateTime_Time *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("minute", 0); - - /* "cpython/datetime.pxd":90 - * @property - * cdef inline int minute(self): - * return PyDateTime_TIME_GET_MINUTE(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_TIME_GET_MINUTE(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":89 - * - * @property - * cdef inline int minute(self): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_MINUTE(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":93 - * - * @property - * cdef inline int second(self): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_SECOND(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_6second_second(PyDateTime_Time *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("second", 0); - - /* "cpython/datetime.pxd":94 - * @property - * cdef inline int second(self): - * return PyDateTime_TIME_GET_SECOND(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_TIME_GET_SECOND(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":93 - * - * @property - * cdef inline int second(self): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_SECOND(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":97 - * - * @property - * cdef inline int microsecond(self): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_MICROSECOND(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_11microsecond_microsecond(PyDateTime_Time *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("microsecond", 0); - - /* "cpython/datetime.pxd":98 - * @property - * cdef inline int microsecond(self): - * return PyDateTime_TIME_GET_MICROSECOND(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_TIME_GET_MICROSECOND(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":97 - * - * @property - * cdef inline int microsecond(self): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_MICROSECOND(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":101 - * - * @property - * cdef inline object tzinfo(self): # <<<<<<<<<<<<<< - * return <object>PyDateTime_TIME_GET_TZINFO(self) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_4time_6tzinfo_tzinfo(PyDateTime_Time *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1; - __Pyx_RefNannySetupContext("tzinfo", 0); - - /* "cpython/datetime.pxd":102 - * @property - * cdef inline object tzinfo(self): - * return <object>PyDateTime_TIME_GET_TZINFO(self) # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyDateTime_TIME_GET_TZINFO(((PyObject *)__pyx_v_self)); - __Pyx_INCREF(((PyObject *)__pyx_t_1)); - __pyx_r = ((PyObject *)__pyx_t_1); - goto __pyx_L0; - - /* "cpython/datetime.pxd":101 - * - * @property - * cdef inline object tzinfo(self): # <<<<<<<<<<<<<< - * return <object>PyDateTime_TIME_GET_TZINFO(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":105 - * - * @property - * cdef inline int fold(self): # <<<<<<<<<<<<<< - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_TIME_GET_FOLD(self) - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_4time_4fold_fold(PyDateTime_Time *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("fold", 0); - - /* "cpython/datetime.pxd":107 - * cdef inline int fold(self): - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_TIME_GET_FOLD(self) # <<<<<<<<<<<<<< - * - * ctypedef extern class datetime.datetime[object PyDateTime_DateTime]: - */ - __pyx_r = PyDateTime_TIME_GET_FOLD(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":105 - * - * @property - * cdef inline int fold(self): # <<<<<<<<<<<<<< - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_TIME_GET_FOLD(self) - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":111 - * ctypedef extern class datetime.datetime[object PyDateTime_DateTime]: - * @property - * cdef inline int year(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_YEAR(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_4year_year(PyDateTime_DateTime *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("year", 0); - - /* "cpython/datetime.pxd":112 - * @property - * cdef inline int year(self): - * return PyDateTime_GET_YEAR(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_GET_YEAR(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":111 - * ctypedef extern class datetime.datetime[object PyDateTime_DateTime]: - * @property - * cdef inline int year(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_YEAR(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":115 - * - * @property - * cdef inline int month(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_MONTH(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_5month_month(PyDateTime_DateTime *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("month", 0); - - /* "cpython/datetime.pxd":116 - * @property - * cdef inline int month(self): - * return PyDateTime_GET_MONTH(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_GET_MONTH(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":115 - * - * @property - * cdef inline int month(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_MONTH(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":119 - * - * @property - * cdef inline int day(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_DAY(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_3day_day(PyDateTime_DateTime *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("day", 0); - - /* "cpython/datetime.pxd":120 - * @property - * cdef inline int day(self): - * return PyDateTime_GET_DAY(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_GET_DAY(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":119 - * - * @property - * cdef inline int day(self): # <<<<<<<<<<<<<< - * return PyDateTime_GET_DAY(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":123 - * - * @property - * cdef inline int hour(self): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_HOUR(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_4hour_hour(PyDateTime_DateTime *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("hour", 0); - - /* "cpython/datetime.pxd":124 - * @property - * cdef inline int hour(self): - * return PyDateTime_DATE_GET_HOUR(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_DATE_GET_HOUR(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":123 - * - * @property - * cdef inline int hour(self): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_HOUR(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":127 - * - * @property - * cdef inline int minute(self): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_MINUTE(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_6minute_minute(PyDateTime_DateTime *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("minute", 0); - - /* "cpython/datetime.pxd":128 - * @property - * cdef inline int minute(self): - * return PyDateTime_DATE_GET_MINUTE(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_DATE_GET_MINUTE(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":127 - * - * @property - * cdef inline int minute(self): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_MINUTE(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":131 - * - * @property - * cdef inline int second(self): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_SECOND(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_6second_second(PyDateTime_DateTime *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("second", 0); - - /* "cpython/datetime.pxd":132 - * @property - * cdef inline int second(self): - * return PyDateTime_DATE_GET_SECOND(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_DATE_GET_SECOND(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":131 - * - * @property - * cdef inline int second(self): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_SECOND(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":135 - * - * @property - * cdef inline int microsecond(self): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_MICROSECOND(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_11microsecond_microsecond(PyDateTime_DateTime *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("microsecond", 0); - - /* "cpython/datetime.pxd":136 - * @property - * cdef inline int microsecond(self): - * return PyDateTime_DATE_GET_MICROSECOND(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_DATE_GET_MICROSECOND(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":135 - * - * @property - * cdef inline int microsecond(self): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_MICROSECOND(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":139 - * - * @property - * cdef inline object tzinfo(self): # <<<<<<<<<<<<<< - * return <object>PyDateTime_DATE_GET_TZINFO(self) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_8datetime_6tzinfo_tzinfo(PyDateTime_DateTime *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1; - __Pyx_RefNannySetupContext("tzinfo", 0); - - /* "cpython/datetime.pxd":140 - * @property - * cdef inline object tzinfo(self): - * return <object>PyDateTime_DATE_GET_TZINFO(self) # <<<<<<<<<<<<<< - * - * @property - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyDateTime_DATE_GET_TZINFO(((PyObject *)__pyx_v_self)); - __Pyx_INCREF(((PyObject *)__pyx_t_1)); - __pyx_r = ((PyObject *)__pyx_t_1); - goto __pyx_L0; - - /* "cpython/datetime.pxd":139 - * - * @property - * cdef inline object tzinfo(self): # <<<<<<<<<<<<<< - * return <object>PyDateTime_DATE_GET_TZINFO(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":143 - * - * @property - * cdef inline int fold(self): # <<<<<<<<<<<<<< - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_DATE_GET_FOLD(self) - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_8datetime_4fold_fold(PyDateTime_DateTime *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("fold", 0); - - /* "cpython/datetime.pxd":145 - * cdef inline int fold(self): - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_DATE_GET_FOLD(self) # <<<<<<<<<<<<<< - * - * ctypedef extern class datetime.timedelta[object PyDateTime_Delta]: - */ - __pyx_r = PyDateTime_DATE_GET_FOLD(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":143 - * - * @property - * cdef inline int fold(self): # <<<<<<<<<<<<<< - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_DATE_GET_FOLD(self) - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":149 - * ctypedef extern class datetime.timedelta[object PyDateTime_Delta]: - * @property - * cdef inline int day(self): # <<<<<<<<<<<<<< - * return PyDateTime_DELTA_GET_DAYS(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_9timedelta_3day_day(PyDateTime_Delta *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("day", 0); - - /* "cpython/datetime.pxd":150 - * @property - * cdef inline int day(self): - * return PyDateTime_DELTA_GET_DAYS(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_DELTA_GET_DAYS(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":149 - * ctypedef extern class datetime.timedelta[object PyDateTime_Delta]: - * @property - * cdef inline int day(self): # <<<<<<<<<<<<<< - * return PyDateTime_DELTA_GET_DAYS(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":153 - * - * @property - * cdef inline int second(self): # <<<<<<<<<<<<<< - * return PyDateTime_DELTA_GET_SECONDS(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_9timedelta_6second_second(PyDateTime_Delta *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("second", 0); - - /* "cpython/datetime.pxd":154 - * @property - * cdef inline int second(self): - * return PyDateTime_DELTA_GET_SECONDS(self) # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = PyDateTime_DELTA_GET_SECONDS(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":153 - * - * @property - * cdef inline int second(self): # <<<<<<<<<<<<<< - * return PyDateTime_DELTA_GET_SECONDS(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":157 - * - * @property - * cdef inline int microsecond(self): # <<<<<<<<<<<<<< - * return PyDateTime_DELTA_GET_MICROSECONDS(self) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_9timedelta_11microsecond_microsecond(PyDateTime_Delta *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("microsecond", 0); - - /* "cpython/datetime.pxd":158 - * @property - * cdef inline int microsecond(self): - * return PyDateTime_DELTA_GET_MICROSECONDS(self) # <<<<<<<<<<<<<< - * - * ctypedef extern class datetime.tzinfo[object PyDateTime_TZInfo]: - */ - __pyx_r = PyDateTime_DELTA_GET_MICROSECONDS(((PyObject *)__pyx_v_self)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":157 - * - * @property - * cdef inline int microsecond(self): # <<<<<<<<<<<<<< - * return PyDateTime_DELTA_GET_MICROSECONDS(self) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":282 - * # Datetime C API initialization function. - * # You have to call it before any usage of DateTime CAPI functions. - * cdef inline void import_datetime(): # <<<<<<<<<<<<<< - * PyDateTime_IMPORT - * - */ - -static CYTHON_INLINE void __pyx_f_7cpython_8datetime_import_datetime(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("import_datetime", 0); - - /* "cpython/datetime.pxd":283 - * # You have to call it before any usage of DateTime CAPI functions. - * cdef inline void import_datetime(): - * PyDateTime_IMPORT # <<<<<<<<<<<<<< - * - * # Create date object using DateTime CAPI factory function. - */ - (void)(PyDateTime_IMPORT); - - /* "cpython/datetime.pxd":282 - * # Datetime C API initialization function. - * # You have to call it before any usage of DateTime CAPI functions. - * cdef inline void import_datetime(): # <<<<<<<<<<<<<< - * PyDateTime_IMPORT - * - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "cpython/datetime.pxd":287 - * # Create date object using DateTime CAPI factory function. - * # Note, there are no range checks for any of the arguments. - * cdef inline date date_new(int year, int month, int day): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.Date_FromDate(year, month, day, PyDateTimeAPI.DateType) - * - */ - -static CYTHON_INLINE PyDateTime_Date *__pyx_f_7cpython_8datetime_date_new(int __pyx_v_year, int __pyx_v_month, int __pyx_v_day) { - PyDateTime_Date *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("date_new", 0); - - /* "cpython/datetime.pxd":288 - * # Note, there are no range checks for any of the arguments. - * cdef inline date date_new(int year, int month, int day): - * return PyDateTimeAPI.Date_FromDate(year, month, day, PyDateTimeAPI.DateType) # <<<<<<<<<<<<<< - * - * # Create time object using DateTime CAPI factory function - */ - __Pyx_XDECREF((PyObject *)__pyx_r); - __pyx_t_1 = ((PyObject *)PyDateTimeAPI->Date_FromDate(__pyx_v_year, __pyx_v_month, __pyx_v_day, PyDateTimeAPI->DateType)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 288, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = ((PyDateTime_Date *)__pyx_t_1); - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "cpython/datetime.pxd":287 - * # Create date object using DateTime CAPI factory function. - * # Note, there are no range checks for any of the arguments. - * cdef inline date date_new(int year, int month, int day): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.Date_FromDate(year, month, day, PyDateTimeAPI.DateType) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("cpython.datetime.date_new", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF((PyObject *)__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":292 - * # Create time object using DateTime CAPI factory function - * # Note, there are no range checks for any of the arguments. - * cdef inline time time_new(int hour, int minute, int second, int microsecond, object tz, int fold=0): # <<<<<<<<<<<<<< - * return __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold) - * - */ - -static CYTHON_INLINE PyDateTime_Time *__pyx_f_7cpython_8datetime_time_new(int __pyx_v_hour, int __pyx_v_minute, int __pyx_v_second, int __pyx_v_microsecond, PyObject *__pyx_v_tz, struct __pyx_opt_args_7cpython_8datetime_time_new *__pyx_optional_args) { - int __pyx_v_fold = ((int)0); - PyDateTime_Time *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("time_new", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_fold = __pyx_optional_args->fold; - } - } - - /* "cpython/datetime.pxd":293 - * # Note, there are no range checks for any of the arguments. - * cdef inline time time_new(int hour, int minute, int second, int microsecond, object tz, int fold=0): - * return __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold) # <<<<<<<<<<<<<< - * - * # Create datetime object using DateTime CAPI factory function. - */ - __Pyx_XDECREF((PyObject *)__pyx_r); - __pyx_t_1 = ((PyObject *)__Pyx_DateTime_TimeWithFold(__pyx_v_hour, __pyx_v_minute, __pyx_v_second, __pyx_v_microsecond, __pyx_v_tz, __pyx_v_fold)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 293, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7cpython_8datetime_time))))) __PYX_ERR(2, 293, __pyx_L1_error) - __pyx_r = ((PyDateTime_Time *)__pyx_t_1); - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "cpython/datetime.pxd":292 - * # Create time object using DateTime CAPI factory function - * # Note, there are no range checks for any of the arguments. - * cdef inline time time_new(int hour, int minute, int second, int microsecond, object tz, int fold=0): # <<<<<<<<<<<<<< - * return __Pyx_DateTime_TimeWithFold(hour, minute, second, microsecond, tz, fold) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("cpython.datetime.time_new", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF((PyObject *)__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":297 - * # Create datetime object using DateTime CAPI factory function. - * # Note, there are no range checks for any of the arguments. - * cdef inline datetime datetime_new(int year, int month, int day, int hour, int minute, int second, int microsecond, object tz, int fold=0): # <<<<<<<<<<<<<< - * return __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold) - * - */ - -static CYTHON_INLINE PyDateTime_DateTime *__pyx_f_7cpython_8datetime_datetime_new(int __pyx_v_year, int __pyx_v_month, int __pyx_v_day, int __pyx_v_hour, int __pyx_v_minute, int __pyx_v_second, int __pyx_v_microsecond, PyObject *__pyx_v_tz, struct __pyx_opt_args_7cpython_8datetime_datetime_new *__pyx_optional_args) { - int __pyx_v_fold = ((int)0); - PyDateTime_DateTime *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("datetime_new", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_fold = __pyx_optional_args->fold; - } - } - - /* "cpython/datetime.pxd":298 - * # Note, there are no range checks for any of the arguments. - * cdef inline datetime datetime_new(int year, int month, int day, int hour, int minute, int second, int microsecond, object tz, int fold=0): - * return __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold) # <<<<<<<<<<<<<< - * - * # Create timedelta object using DateTime CAPI factory function. - */ - __Pyx_XDECREF((PyObject *)__pyx_r); - __pyx_t_1 = ((PyObject *)__Pyx_DateTime_DateTimeWithFold(__pyx_v_year, __pyx_v_month, __pyx_v_day, __pyx_v_hour, __pyx_v_minute, __pyx_v_second, __pyx_v_microsecond, __pyx_v_tz, __pyx_v_fold)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 298, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = ((PyDateTime_DateTime *)__pyx_t_1); - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "cpython/datetime.pxd":297 - * # Create datetime object using DateTime CAPI factory function. - * # Note, there are no range checks for any of the arguments. - * cdef inline datetime datetime_new(int year, int month, int day, int hour, int minute, int second, int microsecond, object tz, int fold=0): # <<<<<<<<<<<<<< - * return __Pyx_DateTime_DateTimeWithFold(year, month, day, hour, minute, second, microsecond, tz, fold) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("cpython.datetime.datetime_new", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF((PyObject *)__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":302 - * # Create timedelta object using DateTime CAPI factory function. - * # Note, there are no range checks for any of the arguments. - * cdef inline timedelta timedelta_new(int days, int seconds, int useconds): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.Delta_FromDelta(days, seconds, useconds, 1, PyDateTimeAPI.DeltaType) - * - */ - -static CYTHON_INLINE PyDateTime_Delta *__pyx_f_7cpython_8datetime_timedelta_new(int __pyx_v_days, int __pyx_v_seconds, int __pyx_v_useconds) { - PyDateTime_Delta *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("timedelta_new", 0); - - /* "cpython/datetime.pxd":303 - * # Note, there are no range checks for any of the arguments. - * cdef inline timedelta timedelta_new(int days, int seconds, int useconds): - * return PyDateTimeAPI.Delta_FromDelta(days, seconds, useconds, 1, PyDateTimeAPI.DeltaType) # <<<<<<<<<<<<<< - * - * # Create timedelta object using DateTime CAPI factory function. - */ - __Pyx_XDECREF((PyObject *)__pyx_r); - __pyx_t_1 = ((PyObject *)PyDateTimeAPI->Delta_FromDelta(__pyx_v_days, __pyx_v_seconds, __pyx_v_useconds, 1, PyDateTimeAPI->DeltaType)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 303, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = ((PyDateTime_Delta *)__pyx_t_1); - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "cpython/datetime.pxd":302 - * # Create timedelta object using DateTime CAPI factory function. - * # Note, there are no range checks for any of the arguments. - * cdef inline timedelta timedelta_new(int days, int seconds, int useconds): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.Delta_FromDelta(days, seconds, useconds, 1, PyDateTimeAPI.DeltaType) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("cpython.datetime.timedelta_new", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF((PyObject *)__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":306 - * - * # Create timedelta object using DateTime CAPI factory function. - * cdef inline object timezone_new(object offset, object name=None): # <<<<<<<<<<<<<< - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') - */ - -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_timezone_new(PyObject *__pyx_v_offset, struct __pyx_opt_args_7cpython_8datetime_timezone_new *__pyx_optional_args) { - PyObject *__pyx_v_name = ((PyObject *)Py_None); - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("timezone_new", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_name = __pyx_optional_args->name; - } - } - - /* "cpython/datetime.pxd":307 - * # Create timedelta object using DateTime CAPI factory function. - * cdef inline object timezone_new(object offset, object name=None): - * if PY_VERSION_HEX < 0x030700b1: # <<<<<<<<<<<<<< - * raise RuntimeError('Time zones are not available from the C-API.') - * return __Pyx_TimeZone_FromOffsetAndName(offset, <PyObject*>name if name is not None else NULL) - */ - __pyx_t_1 = (PY_VERSION_HEX < 0x030700b1); - if (unlikely(__pyx_t_1)) { - - /* "cpython/datetime.pxd":308 - * cdef inline object timezone_new(object offset, object name=None): - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') # <<<<<<<<<<<<<< - * return __Pyx_TimeZone_FromOffsetAndName(offset, <PyObject*>name if name is not None else NULL) - * - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 308, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 308, __pyx_L1_error) - - /* "cpython/datetime.pxd":307 - * # Create timedelta object using DateTime CAPI factory function. - * cdef inline object timezone_new(object offset, object name=None): - * if PY_VERSION_HEX < 0x030700b1: # <<<<<<<<<<<<<< - * raise RuntimeError('Time zones are not available from the C-API.') - * return __Pyx_TimeZone_FromOffsetAndName(offset, <PyObject*>name if name is not None else NULL) - */ - } - - /* "cpython/datetime.pxd":309 - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') - * return __Pyx_TimeZone_FromOffsetAndName(offset, <PyObject*>name if name is not None else NULL) # <<<<<<<<<<<<<< - * - * # Create datetime object using DB API constructor. - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = (__pyx_v_name != Py_None); - if (__pyx_t_1) { - __pyx_t_3 = ((PyObject *)__pyx_v_name); - } else { - __pyx_t_3 = NULL; - } - __pyx_t_2 = __Pyx_TimeZone_FromOffsetAndName(__pyx_v_offset, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 309, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "cpython/datetime.pxd":306 - * - * # Create timedelta object using DateTime CAPI factory function. - * cdef inline object timezone_new(object offset, object name=None): # <<<<<<<<<<<<<< - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("cpython.datetime.timezone_new", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":312 - * - * # Create datetime object using DB API constructor. - * cdef inline datetime datetime_from_timestamp(timestamp, tz=None): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.DateTime_FromTimestamp( - * <PyObject*>PyDateTimeAPI.DateTimeType, (timestamp, tz) if tz is not None else (timestamp,), NULL) - */ - -static CYTHON_INLINE PyDateTime_DateTime *__pyx_f_7cpython_8datetime_datetime_from_timestamp(PyObject *__pyx_v_timestamp, struct __pyx_opt_args_7cpython_8datetime_datetime_from_timestamp *__pyx_optional_args) { - PyObject *__pyx_v_tz = ((PyObject *)Py_None); - PyDateTime_DateTime *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("datetime_from_timestamp", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_tz = __pyx_optional_args->tz; - } - } - - /* "cpython/datetime.pxd":313 - * # Create datetime object using DB API constructor. - * cdef inline datetime datetime_from_timestamp(timestamp, tz=None): - * return PyDateTimeAPI.DateTime_FromTimestamp( # <<<<<<<<<<<<<< - * <PyObject*>PyDateTimeAPI.DateTimeType, (timestamp, tz) if tz is not None else (timestamp,), NULL) - * - */ - __Pyx_XDECREF((PyObject *)__pyx_r); - - /* "cpython/datetime.pxd":314 - * cdef inline datetime datetime_from_timestamp(timestamp, tz=None): - * return PyDateTimeAPI.DateTime_FromTimestamp( - * <PyObject*>PyDateTimeAPI.DateTimeType, (timestamp, tz) if tz is not None else (timestamp,), NULL) # <<<<<<<<<<<<<< - * - * # Create date object using DB API constructor. - */ - __pyx_t_2 = (__pyx_v_tz != Py_None); - if (__pyx_t_2) { - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 314, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_timestamp); - __Pyx_GIVEREF(__pyx_v_timestamp); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_timestamp)) __PYX_ERR(2, 314, __pyx_L1_error); - __Pyx_INCREF(__pyx_v_tz); - __Pyx_GIVEREF(__pyx_v_tz); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_tz)) __PYX_ERR(2, 314, __pyx_L1_error); - __pyx_t_1 = __pyx_t_3; - __pyx_t_3 = 0; - } else { - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 314, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_timestamp); - __Pyx_GIVEREF(__pyx_v_timestamp); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_timestamp)) __PYX_ERR(2, 314, __pyx_L1_error); - __pyx_t_1 = __pyx_t_3; - __pyx_t_3 = 0; - } - - /* "cpython/datetime.pxd":313 - * # Create datetime object using DB API constructor. - * cdef inline datetime datetime_from_timestamp(timestamp, tz=None): - * return PyDateTimeAPI.DateTime_FromTimestamp( # <<<<<<<<<<<<<< - * <PyObject*>PyDateTimeAPI.DateTimeType, (timestamp, tz) if tz is not None else (timestamp,), NULL) - * - */ - __pyx_t_3 = ((PyObject *)PyDateTimeAPI->DateTime_FromTimestamp(((PyObject *)PyDateTimeAPI->DateTimeType), __pyx_t_1, NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 313, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = ((PyDateTime_DateTime *)__pyx_t_3); - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "cpython/datetime.pxd":312 - * - * # Create datetime object using DB API constructor. - * cdef inline datetime datetime_from_timestamp(timestamp, tz=None): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.DateTime_FromTimestamp( - * <PyObject*>PyDateTimeAPI.DateTimeType, (timestamp, tz) if tz is not None else (timestamp,), NULL) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("cpython.datetime.datetime_from_timestamp", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF((PyObject *)__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":317 - * - * # Create date object using DB API constructor. - * cdef inline date date_from_timestamp(timestamp): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.Date_FromTimestamp(<PyObject*>PyDateTimeAPI.DateType, (timestamp,)) - * - */ - -static CYTHON_INLINE PyDateTime_Date *__pyx_f_7cpython_8datetime_date_from_timestamp(PyObject *__pyx_v_timestamp) { - PyDateTime_Date *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("date_from_timestamp", 0); - - /* "cpython/datetime.pxd":318 - * # Create date object using DB API constructor. - * cdef inline date date_from_timestamp(timestamp): - * return PyDateTimeAPI.Date_FromTimestamp(<PyObject*>PyDateTimeAPI.DateType, (timestamp,)) # <<<<<<<<<<<<<< - * - * # More recognizable getters for date/time/datetime/timedelta. - */ - __Pyx_XDECREF((PyObject *)__pyx_r); - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 318, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v_timestamp); - __Pyx_GIVEREF(__pyx_v_timestamp); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_timestamp)) __PYX_ERR(2, 318, __pyx_L1_error); - __pyx_t_2 = ((PyObject *)PyDateTimeAPI->Date_FromTimestamp(((PyObject *)PyDateTimeAPI->DateType), __pyx_t_1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 318, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = ((PyDateTime_Date *)__pyx_t_2); - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "cpython/datetime.pxd":317 - * - * # Create date object using DB API constructor. - * cdef inline date date_from_timestamp(timestamp): # <<<<<<<<<<<<<< - * return PyDateTimeAPI.Date_FromTimestamp(<PyObject*>PyDateTimeAPI.DateType, (timestamp,)) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("cpython.datetime.date_from_timestamp", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF((PyObject *)__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":326 - * - * # Get UTC singleton - * cdef inline object get_utc(): # <<<<<<<<<<<<<< - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') - */ - -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_get_utc(void) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("get_utc", 0); - - /* "cpython/datetime.pxd":327 - * # Get UTC singleton - * cdef inline object get_utc(): - * if PY_VERSION_HEX < 0x030700b1: # <<<<<<<<<<<<<< - * raise RuntimeError('Time zones are not available from the C-API.') - * return <object>__Pyx_TimeZone_UTC - */ - __pyx_t_1 = (PY_VERSION_HEX < 0x030700b1); - if (unlikely(__pyx_t_1)) { - - /* "cpython/datetime.pxd":328 - * cdef inline object get_utc(): - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') # <<<<<<<<<<<<<< - * return <object>__Pyx_TimeZone_UTC - * - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 328, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 328, __pyx_L1_error) - - /* "cpython/datetime.pxd":327 - * # Get UTC singleton - * cdef inline object get_utc(): - * if PY_VERSION_HEX < 0x030700b1: # <<<<<<<<<<<<<< - * raise RuntimeError('Time zones are not available from the C-API.') - * return <object>__Pyx_TimeZone_UTC - */ - } - - /* "cpython/datetime.pxd":329 - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') - * return <object>__Pyx_TimeZone_UTC # <<<<<<<<<<<<<< - * - * # Get tzinfo of time - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__Pyx_TimeZone_UTC)); - __pyx_r = ((PyObject *)__Pyx_TimeZone_UTC); - goto __pyx_L0; - - /* "cpython/datetime.pxd":326 - * - * # Get UTC singleton - * cdef inline object get_utc(): # <<<<<<<<<<<<<< - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("cpython.datetime.get_utc", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":332 - * - * # Get tzinfo of time - * cdef inline object time_tzinfo(object o): # <<<<<<<<<<<<<< - * return <object>PyDateTime_TIME_GET_TZINFO(o) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_time_tzinfo(PyObject *__pyx_v_o) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1; - __Pyx_RefNannySetupContext("time_tzinfo", 0); - - /* "cpython/datetime.pxd":333 - * # Get tzinfo of time - * cdef inline object time_tzinfo(object o): - * return <object>PyDateTime_TIME_GET_TZINFO(o) # <<<<<<<<<<<<<< - * - * # Get tzinfo of datetime - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyDateTime_TIME_GET_TZINFO(__pyx_v_o); - __Pyx_INCREF(((PyObject *)__pyx_t_1)); - __pyx_r = ((PyObject *)__pyx_t_1); - goto __pyx_L0; - - /* "cpython/datetime.pxd":332 - * - * # Get tzinfo of time - * cdef inline object time_tzinfo(object o): # <<<<<<<<<<<<<< - * return <object>PyDateTime_TIME_GET_TZINFO(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":336 - * - * # Get tzinfo of datetime - * cdef inline object datetime_tzinfo(object o): # <<<<<<<<<<<<<< - * return <object>PyDateTime_DATE_GET_TZINFO(o) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_7cpython_8datetime_datetime_tzinfo(PyObject *__pyx_v_o) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1; - __Pyx_RefNannySetupContext("datetime_tzinfo", 0); - - /* "cpython/datetime.pxd":337 - * # Get tzinfo of datetime - * cdef inline object datetime_tzinfo(object o): - * return <object>PyDateTime_DATE_GET_TZINFO(o) # <<<<<<<<<<<<<< - * - * # Get year of date - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyDateTime_DATE_GET_TZINFO(__pyx_v_o); - __Pyx_INCREF(((PyObject *)__pyx_t_1)); - __pyx_r = ((PyObject *)__pyx_t_1); - goto __pyx_L0; - - /* "cpython/datetime.pxd":336 - * - * # Get tzinfo of datetime - * cdef inline object datetime_tzinfo(object o): # <<<<<<<<<<<<<< - * return <object>PyDateTime_DATE_GET_TZINFO(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":340 - * - * # Get year of date - * cdef inline int date_year(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_YEAR(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_date_year(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("date_year", 0); - - /* "cpython/datetime.pxd":341 - * # Get year of date - * cdef inline int date_year(object o): - * return PyDateTime_GET_YEAR(o) # <<<<<<<<<<<<<< - * - * # Get month of date - */ - __pyx_r = PyDateTime_GET_YEAR(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":340 - * - * # Get year of date - * cdef inline int date_year(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_YEAR(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":344 - * - * # Get month of date - * cdef inline int date_month(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_MONTH(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_date_month(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("date_month", 0); - - /* "cpython/datetime.pxd":345 - * # Get month of date - * cdef inline int date_month(object o): - * return PyDateTime_GET_MONTH(o) # <<<<<<<<<<<<<< - * - * # Get day of date - */ - __pyx_r = PyDateTime_GET_MONTH(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":344 - * - * # Get month of date - * cdef inline int date_month(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_MONTH(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":348 - * - * # Get day of date - * cdef inline int date_day(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_DAY(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_date_day(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("date_day", 0); - - /* "cpython/datetime.pxd":349 - * # Get day of date - * cdef inline int date_day(object o): - * return PyDateTime_GET_DAY(o) # <<<<<<<<<<<<<< - * - * # Get year of datetime - */ - __pyx_r = PyDateTime_GET_DAY(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":348 - * - * # Get day of date - * cdef inline int date_day(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_DAY(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":352 - * - * # Get year of datetime - * cdef inline int datetime_year(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_YEAR(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_datetime_year(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("datetime_year", 0); - - /* "cpython/datetime.pxd":353 - * # Get year of datetime - * cdef inline int datetime_year(object o): - * return PyDateTime_GET_YEAR(o) # <<<<<<<<<<<<<< - * - * # Get month of datetime - */ - __pyx_r = PyDateTime_GET_YEAR(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":352 - * - * # Get year of datetime - * cdef inline int datetime_year(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_YEAR(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":356 - * - * # Get month of datetime - * cdef inline int datetime_month(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_MONTH(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_datetime_month(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("datetime_month", 0); - - /* "cpython/datetime.pxd":357 - * # Get month of datetime - * cdef inline int datetime_month(object o): - * return PyDateTime_GET_MONTH(o) # <<<<<<<<<<<<<< - * - * # Get day of datetime - */ - __pyx_r = PyDateTime_GET_MONTH(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":356 - * - * # Get month of datetime - * cdef inline int datetime_month(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_MONTH(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":360 - * - * # Get day of datetime - * cdef inline int datetime_day(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_DAY(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_datetime_day(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("datetime_day", 0); - - /* "cpython/datetime.pxd":361 - * # Get day of datetime - * cdef inline int datetime_day(object o): - * return PyDateTime_GET_DAY(o) # <<<<<<<<<<<<<< - * - * # Get hour of time - */ - __pyx_r = PyDateTime_GET_DAY(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":360 - * - * # Get day of datetime - * cdef inline int datetime_day(object o): # <<<<<<<<<<<<<< - * return PyDateTime_GET_DAY(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":364 - * - * # Get hour of time - * cdef inline int time_hour(object o): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_HOUR(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_time_hour(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("time_hour", 0); - - /* "cpython/datetime.pxd":365 - * # Get hour of time - * cdef inline int time_hour(object o): - * return PyDateTime_TIME_GET_HOUR(o) # <<<<<<<<<<<<<< - * - * # Get minute of time - */ - __pyx_r = PyDateTime_TIME_GET_HOUR(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":364 - * - * # Get hour of time - * cdef inline int time_hour(object o): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_HOUR(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":368 - * - * # Get minute of time - * cdef inline int time_minute(object o): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_MINUTE(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_time_minute(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("time_minute", 0); - - /* "cpython/datetime.pxd":369 - * # Get minute of time - * cdef inline int time_minute(object o): - * return PyDateTime_TIME_GET_MINUTE(o) # <<<<<<<<<<<<<< - * - * # Get second of time - */ - __pyx_r = PyDateTime_TIME_GET_MINUTE(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":368 - * - * # Get minute of time - * cdef inline int time_minute(object o): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_MINUTE(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":372 - * - * # Get second of time - * cdef inline int time_second(object o): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_SECOND(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_time_second(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("time_second", 0); - - /* "cpython/datetime.pxd":373 - * # Get second of time - * cdef inline int time_second(object o): - * return PyDateTime_TIME_GET_SECOND(o) # <<<<<<<<<<<<<< - * - * # Get microsecond of time - */ - __pyx_r = PyDateTime_TIME_GET_SECOND(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":372 - * - * # Get second of time - * cdef inline int time_second(object o): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_SECOND(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":376 - * - * # Get microsecond of time - * cdef inline int time_microsecond(object o): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_MICROSECOND(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_time_microsecond(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("time_microsecond", 0); - - /* "cpython/datetime.pxd":377 - * # Get microsecond of time - * cdef inline int time_microsecond(object o): - * return PyDateTime_TIME_GET_MICROSECOND(o) # <<<<<<<<<<<<<< - * - * # Get fold of time - */ - __pyx_r = PyDateTime_TIME_GET_MICROSECOND(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":376 - * - * # Get microsecond of time - * cdef inline int time_microsecond(object o): # <<<<<<<<<<<<<< - * return PyDateTime_TIME_GET_MICROSECOND(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":380 - * - * # Get fold of time - * cdef inline int time_fold(object o): # <<<<<<<<<<<<<< - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_TIME_GET_FOLD(o) - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_time_fold(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("time_fold", 0); - - /* "cpython/datetime.pxd":382 - * cdef inline int time_fold(object o): - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_TIME_GET_FOLD(o) # <<<<<<<<<<<<<< - * - * # Get hour of datetime - */ - __pyx_r = PyDateTime_TIME_GET_FOLD(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":380 - * - * # Get fold of time - * cdef inline int time_fold(object o): # <<<<<<<<<<<<<< - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_TIME_GET_FOLD(o) - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":385 - * - * # Get hour of datetime - * cdef inline int datetime_hour(object o): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_HOUR(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_datetime_hour(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("datetime_hour", 0); - - /* "cpython/datetime.pxd":386 - * # Get hour of datetime - * cdef inline int datetime_hour(object o): - * return PyDateTime_DATE_GET_HOUR(o) # <<<<<<<<<<<<<< - * - * # Get minute of datetime - */ - __pyx_r = PyDateTime_DATE_GET_HOUR(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":385 - * - * # Get hour of datetime - * cdef inline int datetime_hour(object o): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_HOUR(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":389 - * - * # Get minute of datetime - * cdef inline int datetime_minute(object o): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_MINUTE(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_datetime_minute(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("datetime_minute", 0); - - /* "cpython/datetime.pxd":390 - * # Get minute of datetime - * cdef inline int datetime_minute(object o): - * return PyDateTime_DATE_GET_MINUTE(o) # <<<<<<<<<<<<<< - * - * # Get second of datetime - */ - __pyx_r = PyDateTime_DATE_GET_MINUTE(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":389 - * - * # Get minute of datetime - * cdef inline int datetime_minute(object o): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_MINUTE(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":393 - * - * # Get second of datetime - * cdef inline int datetime_second(object o): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_SECOND(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_datetime_second(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("datetime_second", 0); - - /* "cpython/datetime.pxd":394 - * # Get second of datetime - * cdef inline int datetime_second(object o): - * return PyDateTime_DATE_GET_SECOND(o) # <<<<<<<<<<<<<< - * - * # Get microsecond of datetime - */ - __pyx_r = PyDateTime_DATE_GET_SECOND(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":393 - * - * # Get second of datetime - * cdef inline int datetime_second(object o): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_SECOND(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":397 - * - * # Get microsecond of datetime - * cdef inline int datetime_microsecond(object o): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_MICROSECOND(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_datetime_microsecond(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("datetime_microsecond", 0); - - /* "cpython/datetime.pxd":398 - * # Get microsecond of datetime - * cdef inline int datetime_microsecond(object o): - * return PyDateTime_DATE_GET_MICROSECOND(o) # <<<<<<<<<<<<<< - * - * # Get fold of datetime - */ - __pyx_r = PyDateTime_DATE_GET_MICROSECOND(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":397 - * - * # Get microsecond of datetime - * cdef inline int datetime_microsecond(object o): # <<<<<<<<<<<<<< - * return PyDateTime_DATE_GET_MICROSECOND(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":401 - * - * # Get fold of datetime - * cdef inline int datetime_fold(object o): # <<<<<<<<<<<<<< - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_DATE_GET_FOLD(o) - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_datetime_fold(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("datetime_fold", 0); - - /* "cpython/datetime.pxd":403 - * cdef inline int datetime_fold(object o): - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_DATE_GET_FOLD(o) # <<<<<<<<<<<<<< - * - * # Get days of timedelta - */ - __pyx_r = PyDateTime_DATE_GET_FOLD(__pyx_v_o); - goto __pyx_L0; - - /* "cpython/datetime.pxd":401 - * - * # Get fold of datetime - * cdef inline int datetime_fold(object o): # <<<<<<<<<<<<<< - * # For Python < 3.6 this returns 0 no matter what - * return PyDateTime_DATE_GET_FOLD(o) - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":406 - * - * # Get days of timedelta - * cdef inline int timedelta_days(object o): # <<<<<<<<<<<<<< - * return (<PyDateTime_Delta*>o).days - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_timedelta_days(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("timedelta_days", 0); - - /* "cpython/datetime.pxd":407 - * # Get days of timedelta - * cdef inline int timedelta_days(object o): - * return (<PyDateTime_Delta*>o).days # <<<<<<<<<<<<<< - * - * # Get seconds of timedelta - */ - __pyx_r = ((PyDateTime_Delta *)__pyx_v_o)->days; - goto __pyx_L0; - - /* "cpython/datetime.pxd":406 - * - * # Get days of timedelta - * cdef inline int timedelta_days(object o): # <<<<<<<<<<<<<< - * return (<PyDateTime_Delta*>o).days - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":410 - * - * # Get seconds of timedelta - * cdef inline int timedelta_seconds(object o): # <<<<<<<<<<<<<< - * return (<PyDateTime_Delta*>o).seconds - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_timedelta_seconds(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("timedelta_seconds", 0); - - /* "cpython/datetime.pxd":411 - * # Get seconds of timedelta - * cdef inline int timedelta_seconds(object o): - * return (<PyDateTime_Delta*>o).seconds # <<<<<<<<<<<<<< - * - * # Get microseconds of timedelta - */ - __pyx_r = ((PyDateTime_Delta *)__pyx_v_o)->seconds; - goto __pyx_L0; - - /* "cpython/datetime.pxd":410 - * - * # Get seconds of timedelta - * cdef inline int timedelta_seconds(object o): # <<<<<<<<<<<<<< - * return (<PyDateTime_Delta*>o).seconds - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":414 - * - * # Get microseconds of timedelta - * cdef inline int timedelta_microseconds(object o): # <<<<<<<<<<<<<< - * return (<PyDateTime_Delta*>o).microseconds - * - */ - -static CYTHON_INLINE int __pyx_f_7cpython_8datetime_timedelta_microseconds(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("timedelta_microseconds", 0); - - /* "cpython/datetime.pxd":415 - * # Get microseconds of timedelta - * cdef inline int timedelta_microseconds(object o): - * return (<PyDateTime_Delta*>o).microseconds # <<<<<<<<<<<<<< - * - * cdef inline double total_seconds(timedelta obj): - */ - __pyx_r = ((PyDateTime_Delta *)__pyx_v_o)->microseconds; - goto __pyx_L0; - - /* "cpython/datetime.pxd":414 - * - * # Get microseconds of timedelta - * cdef inline int timedelta_microseconds(object o): # <<<<<<<<<<<<<< - * return (<PyDateTime_Delta*>o).microseconds - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/datetime.pxd":417 - * return (<PyDateTime_Delta*>o).microseconds - * - * cdef inline double total_seconds(timedelta obj): # <<<<<<<<<<<<<< - * # Mirrors the "timedelta.total_seconds()" method. - * # Note that this implementation is not guaranteed to give *exactly* the same - */ - -static CYTHON_INLINE double __pyx_f_7cpython_8datetime_total_seconds(PyDateTime_Delta *__pyx_v_obj) { - double __pyx_v_days; - double __pyx_v_seconds; - double __pyx_v_micros; - double __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("total_seconds", 0); - - /* "cpython/datetime.pxd":423 - * cdef: - * double days, seconds, micros - * days = <double>PyDateTime_DELTA_GET_DAYS(obj) # <<<<<<<<<<<<<< - * seconds = <double>PyDateTime_DELTA_GET_SECONDS(obj) - * micros = <double>PyDateTime_DELTA_GET_MICROSECONDS(obj) - */ - __pyx_v_days = ((double)PyDateTime_DELTA_GET_DAYS(((PyObject *)__pyx_v_obj))); - - /* "cpython/datetime.pxd":424 - * double days, seconds, micros - * days = <double>PyDateTime_DELTA_GET_DAYS(obj) - * seconds = <double>PyDateTime_DELTA_GET_SECONDS(obj) # <<<<<<<<<<<<<< - * micros = <double>PyDateTime_DELTA_GET_MICROSECONDS(obj) - * return days * 24 * 3600 + seconds + micros / 1_000_000 - */ - __pyx_v_seconds = ((double)PyDateTime_DELTA_GET_SECONDS(((PyObject *)__pyx_v_obj))); - - /* "cpython/datetime.pxd":425 - * days = <double>PyDateTime_DELTA_GET_DAYS(obj) - * seconds = <double>PyDateTime_DELTA_GET_SECONDS(obj) - * micros = <double>PyDateTime_DELTA_GET_MICROSECONDS(obj) # <<<<<<<<<<<<<< - * return days * 24 * 3600 + seconds + micros / 1_000_000 - */ - __pyx_v_micros = ((double)PyDateTime_DELTA_GET_MICROSECONDS(((PyObject *)__pyx_v_obj))); - - /* "cpython/datetime.pxd":426 - * seconds = <double>PyDateTime_DELTA_GET_SECONDS(obj) - * micros = <double>PyDateTime_DELTA_GET_MICROSECONDS(obj) - * return days * 24 * 3600 + seconds + micros / 1_000_000 # <<<<<<<<<<<<<< - */ - __pyx_r = ((((__pyx_v_days * 24.0) * 3600.0) + __pyx_v_seconds) + (__pyx_v_micros / 1000000.0)); - goto __pyx_L0; - - /* "cpython/datetime.pxd":417 - * return (<PyDateTime_Delta*>o).microseconds - * - * cdef inline double total_seconds(timedelta obj): # <<<<<<<<<<<<<< - * # Mirrors the "timedelta.total_seconds()" method. - * # Note that this implementation is not guaranteed to give *exactly* the same - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/complex.pxd":19 - * - * @property - * cdef inline double real(self): # <<<<<<<<<<<<<< - * return self.cval.real - * - */ - -static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4real_real(PyComplexObject *__pyx_v_self) { - double __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("real", 0); - - /* "cpython/complex.pxd":20 - * @property - * cdef inline double real(self): - * return self.cval.real # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_r = __pyx_v_self->cval.real; - goto __pyx_L0; - - /* "cpython/complex.pxd":19 - * - * @property - * cdef inline double real(self): # <<<<<<<<<<<<<< - * return self.cval.real - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/complex.pxd":23 - * - * @property - * cdef inline double imag(self): # <<<<<<<<<<<<<< - * return self.cval.imag - * - */ - -static CYTHON_INLINE double __pyx_f_7cpython_7complex_7complex_4imag_imag(PyComplexObject *__pyx_v_self) { - double __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("imag", 0); - - /* "cpython/complex.pxd":24 - * @property - * cdef inline double imag(self): - * return self.cval.imag # <<<<<<<<<<<<<< - * - * # PyTypeObject PyComplex_Type - */ - __pyx_r = __pyx_v_self->cval.imag; - goto __pyx_L0; - - /* "cpython/complex.pxd":23 - * - * @property - * cdef inline double imag(self): # <<<<<<<<<<<<<< - * return self.cval.imag - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/contextvars.pxd":112 - * - * - * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< - * """Return a new reference to the value of the context variable, - * or the default value of the context variable, - */ - -static CYTHON_INLINE PyObject *__pyx_f_7cpython_11contextvars_get_value(PyObject *__pyx_v_var, struct __pyx_opt_args_7cpython_11contextvars_get_value *__pyx_optional_args) { - PyObject *__pyx_v_default_value = ((PyObject *)Py_None); - PyObject *__pyx_v_value; - PyObject *__pyx_v_pyvalue = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("get_value", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_default_value = __pyx_optional_args->default_value; - } - } - - /* "cpython/contextvars.pxd":117 - * or None if no such value or default was found. - * """ - * cdef PyObject *value = NULL # <<<<<<<<<<<<<< - * PyContextVar_Get(var, NULL, &value) - * if value is NULL: - */ - __pyx_v_value = NULL; - - /* "cpython/contextvars.pxd":118 - * """ - * cdef PyObject *value = NULL - * PyContextVar_Get(var, NULL, &value) # <<<<<<<<<<<<<< - * if value is NULL: - * # context variable does not have a default - */ - __pyx_t_1 = PyContextVar_Get(__pyx_v_var, NULL, (&__pyx_v_value)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(3, 118, __pyx_L1_error) - - /* "cpython/contextvars.pxd":119 - * cdef PyObject *value = NULL - * PyContextVar_Get(var, NULL, &value) - * if value is NULL: # <<<<<<<<<<<<<< - * # context variable does not have a default - * pyvalue = default_value - */ - __pyx_t_2 = (__pyx_v_value == NULL); - if (__pyx_t_2) { - - /* "cpython/contextvars.pxd":121 - * if value is NULL: - * # context variable does not have a default - * pyvalue = default_value # <<<<<<<<<<<<<< - * else: - * # value or default value of context variable - */ - __Pyx_INCREF(__pyx_v_default_value); - __pyx_v_pyvalue = __pyx_v_default_value; - - /* "cpython/contextvars.pxd":119 - * cdef PyObject *value = NULL - * PyContextVar_Get(var, NULL, &value) - * if value is NULL: # <<<<<<<<<<<<<< - * # context variable does not have a default - * pyvalue = default_value - */ - goto __pyx_L3; - } - - /* "cpython/contextvars.pxd":124 - * else: - * # value or default value of context variable - * pyvalue = <object>value # <<<<<<<<<<<<<< - * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' - * return pyvalue - */ - /*else*/ { - __pyx_t_3 = ((PyObject *)__pyx_v_value); - __Pyx_INCREF(__pyx_t_3); - __pyx_v_pyvalue = __pyx_t_3; - __pyx_t_3 = 0; - - /* "cpython/contextvars.pxd":125 - * # value or default value of context variable - * pyvalue = <object>value - * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' # <<<<<<<<<<<<<< - * return pyvalue - * - */ - Py_XDECREF(__pyx_v_value); - } - __pyx_L3:; - - /* "cpython/contextvars.pxd":126 - * pyvalue = <object>value - * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' - * return pyvalue # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_pyvalue); - __pyx_r = __pyx_v_pyvalue; - goto __pyx_L0; - - /* "cpython/contextvars.pxd":112 - * - * - * cdef inline object get_value(var, default_value=None): # <<<<<<<<<<<<<< - * """Return a new reference to the value of the context variable, - * or the default value of the context variable, - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("cpython.contextvars.get_value", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_pyvalue); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "cpython/contextvars.pxd":129 - * - * - * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< - * """Return a new reference to the value of the context variable, - * or the provided default value if no such value was found. - */ - -static CYTHON_INLINE PyObject *__pyx_f_7cpython_11contextvars_get_value_no_default(PyObject *__pyx_v_var, struct __pyx_opt_args_7cpython_11contextvars_get_value_no_default *__pyx_optional_args) { - PyObject *__pyx_v_default_value = ((PyObject *)Py_None); - PyObject *__pyx_v_value; - PyObject *__pyx_v_pyvalue = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("get_value_no_default", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_default_value = __pyx_optional_args->default_value; - } - } - - /* "cpython/contextvars.pxd":135 - * Ignores the default value of the context variable, if any. - * """ - * cdef PyObject *value = NULL # <<<<<<<<<<<<<< - * PyContextVar_Get(var, <PyObject*>default_value, &value) - * # value of context variable or 'default_value' - */ - __pyx_v_value = NULL; - - /* "cpython/contextvars.pxd":136 - * """ - * cdef PyObject *value = NULL - * PyContextVar_Get(var, <PyObject*>default_value, &value) # <<<<<<<<<<<<<< - * # value of context variable or 'default_value' - * pyvalue = <object>value - */ - __pyx_t_1 = PyContextVar_Get(__pyx_v_var, ((PyObject *)__pyx_v_default_value), (&__pyx_v_value)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(3, 136, __pyx_L1_error) - - /* "cpython/contextvars.pxd":138 - * PyContextVar_Get(var, <PyObject*>default_value, &value) - * # value of context variable or 'default_value' - * pyvalue = <object>value # <<<<<<<<<<<<<< - * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' - * return pyvalue - */ - __pyx_t_2 = ((PyObject *)__pyx_v_value); - __Pyx_INCREF(__pyx_t_2); - __pyx_v_pyvalue = __pyx_t_2; - __pyx_t_2 = 0; - - /* "cpython/contextvars.pxd":139 - * # value of context variable or 'default_value' - * pyvalue = <object>value - * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' # <<<<<<<<<<<<<< - * return pyvalue - */ - Py_XDECREF(__pyx_v_value); - - /* "cpython/contextvars.pxd":140 - * pyvalue = <object>value - * Py_XDECREF(value) # PyContextVar_Get() returned an owned reference as 'PyObject*' - * return pyvalue # <<<<<<<<<<<<<< - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_pyvalue); - __pyx_r = __pyx_v_pyvalue; - goto __pyx_L0; - - /* "cpython/contextvars.pxd":129 - * - * - * cdef inline object get_value_no_default(var, default_value=None): # <<<<<<<<<<<<<< - * """Return a new reference to the value of the context variable, - * or the provided default value if no such value was found. - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("cpython.contextvars.get_value_no_default", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_pyvalue); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":54 - * - * - * cdef inline int PyBytesLike_Check(object o): # <<<<<<<<<<<<<< - * return PyBytes_Check(o) or PyByteArray_Check(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7msgpack_9_cmsgpack_PyBytesLike_Check(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - __Pyx_RefNannySetupContext("PyBytesLike_Check", 0); - - /* "msgpack/_packer.pyx":55 - * - * cdef inline int PyBytesLike_Check(object o): - * return PyBytes_Check(o) or PyByteArray_Check(o) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_2 = PyBytes_Check(__pyx_v_o); - if (!__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L3_bool_binop_done; - } - __pyx_t_2 = PyByteArray_Check(__pyx_v_o); - __pyx_t_1 = __pyx_t_2; - __pyx_L3_bool_binop_done:; - __pyx_r = __pyx_t_1; - goto __pyx_L0; - - /* "msgpack/_packer.pyx":54 - * - * - * cdef inline int PyBytesLike_Check(object o): # <<<<<<<<<<<<<< - * return PyBytes_Check(o) or PyByteArray_Check(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":58 - * - * - * cdef inline int PyBytesLike_CheckExact(object o): # <<<<<<<<<<<<<< - * return PyBytes_CheckExact(o) or PyByteArray_CheckExact(o) - * - */ - -static CYTHON_INLINE int __pyx_f_7msgpack_9_cmsgpack_PyBytesLike_CheckExact(PyObject *__pyx_v_o) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - __Pyx_RefNannySetupContext("PyBytesLike_CheckExact", 0); - - /* "msgpack/_packer.pyx":59 - * - * cdef inline int PyBytesLike_CheckExact(object o): - * return PyBytes_CheckExact(o) or PyByteArray_CheckExact(o) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_2 = PyBytes_CheckExact(__pyx_v_o); - if (!__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L3_bool_binop_done; - } - __pyx_t_2 = PyByteArray_CheckExact(__pyx_v_o); - __pyx_t_1 = __pyx_t_2; - __pyx_L3_bool_binop_done:; - __pyx_r = __pyx_t_1; - goto __pyx_L0; - - /* "msgpack/_packer.pyx":58 - * - * - * cdef inline int PyBytesLike_CheckExact(object o): # <<<<<<<<<<<<<< - * return PyBytes_CheckExact(o) or PyByteArray_CheckExact(o) - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":116 - * cdef bint datetime - * - * def __cinit__(self): # <<<<<<<<<<<<<< - * cdef int buf_size = 1024*1024 - * self.pk.buf = <char*> PyMem_Malloc(buf_size) - */ - -/* Python wrapper */ -static int __pyx_pw_7msgpack_9_cmsgpack_6Packer_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7msgpack_9_cmsgpack_6Packer_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 116, __pyx_L3_error) - #endif - __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer___cinit__(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7msgpack_9_cmsgpack_6Packer___cinit__(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self) { - int __pyx_v_buf_size; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__cinit__", 0); - - /* "msgpack/_packer.pyx":117 - * - * def __cinit__(self): - * cdef int buf_size = 1024*1024 # <<<<<<<<<<<<<< - * self.pk.buf = <char*> PyMem_Malloc(buf_size) - * if self.pk.buf == NULL: - */ - __pyx_v_buf_size = 0x100000; - - /* "msgpack/_packer.pyx":118 - * def __cinit__(self): - * cdef int buf_size = 1024*1024 - * self.pk.buf = <char*> PyMem_Malloc(buf_size) # <<<<<<<<<<<<<< - * if self.pk.buf == NULL: - * raise MemoryError("Unable to allocate internal buffer.") - */ - __pyx_v_self->pk.buf = ((char *)PyMem_Malloc(__pyx_v_buf_size)); - - /* "msgpack/_packer.pyx":119 - * cdef int buf_size = 1024*1024 - * self.pk.buf = <char*> PyMem_Malloc(buf_size) - * if self.pk.buf == NULL: # <<<<<<<<<<<<<< - * raise MemoryError("Unable to allocate internal buffer.") - * self.pk.buf_size = buf_size - */ - __pyx_t_1 = (__pyx_v_self->pk.buf == NULL); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":120 - * self.pk.buf = <char*> PyMem_Malloc(buf_size) - * if self.pk.buf == NULL: - * raise MemoryError("Unable to allocate internal buffer.") # <<<<<<<<<<<<<< - * self.pk.buf_size = buf_size - * self.pk.length = 0 - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 120, __pyx_L1_error) - - /* "msgpack/_packer.pyx":119 - * cdef int buf_size = 1024*1024 - * self.pk.buf = <char*> PyMem_Malloc(buf_size) - * if self.pk.buf == NULL: # <<<<<<<<<<<<<< - * raise MemoryError("Unable to allocate internal buffer.") - * self.pk.buf_size = buf_size - */ - } - - /* "msgpack/_packer.pyx":121 - * if self.pk.buf == NULL: - * raise MemoryError("Unable to allocate internal buffer.") - * self.pk.buf_size = buf_size # <<<<<<<<<<<<<< - * self.pk.length = 0 - * - */ - __pyx_v_self->pk.buf_size = __pyx_v_buf_size; - - /* "msgpack/_packer.pyx":122 - * raise MemoryError("Unable to allocate internal buffer.") - * self.pk.buf_size = buf_size - * self.pk.length = 0 # <<<<<<<<<<<<<< - * - * def __init__(self, *, default=None, - */ - __pyx_v_self->pk.length = 0; - - /* "msgpack/_packer.pyx":116 - * cdef bint datetime - * - * def __cinit__(self): # <<<<<<<<<<<<<< - * cdef int buf_size = 1024*1024 - * self.pk.buf = <char*> PyMem_Malloc(buf_size) - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":124 - * self.pk.length = 0 - * - * def __init__(self, *, default=None, # <<<<<<<<<<<<<< - * bint use_single_float=False, bint autoreset=True, bint use_bin_type=True, - * bint strict_types=False, bint datetime=False, unicode_errors=None): - */ - -/* Python wrapper */ -static int __pyx_pw_7msgpack_9_cmsgpack_6Packer_3__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7msgpack_9_cmsgpack_6Packer_3__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_default = 0; - int __pyx_v_use_single_float; - int __pyx_v_autoreset; - int __pyx_v_use_bin_type; - int __pyx_v_strict_types; - int __pyx_v_datetime; - PyObject *__pyx_v_unicode_errors = 0; - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[7] = {0,0,0,0,0,0,0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 124, __pyx_L3_error) - #endif - __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_default,&__pyx_n_s_use_single_float,&__pyx_n_s_autoreset,&__pyx_n_s_use_bin_type,&__pyx_n_s_strict_types,&__pyx_n_s_datetime,&__pyx_n_s_unicode_errors,0}; - values[0] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); - - /* "msgpack/_packer.pyx":126 - * def __init__(self, *, default=None, - * bint use_single_float=False, bint autoreset=True, bint use_bin_type=True, - * bint strict_types=False, bint datetime=False, unicode_errors=None): # <<<<<<<<<<<<<< - * self.use_float = use_single_float - * self.strict_types = strict_types - */ - values[6] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); - if (kw_args > 0 && likely(kw_args <= 7)) { - Py_ssize_t index; - for (index = 0; index < 7 && kw_args > 0; index++) { - PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, *__pyx_pyargnames[index]); - if (value) { values[index] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 124, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, 0, "__init__") < 0)) __PYX_ERR(0, 124, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 0)) { - goto __pyx_L5_argtuple_error; - } else { - } - __pyx_v_default = values[0]; - if (values[1]) { - __pyx_v_use_single_float = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_use_single_float == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 125, __pyx_L3_error) - } else { - - /* "msgpack/_packer.pyx":125 - * - * def __init__(self, *, default=None, - * bint use_single_float=False, bint autoreset=True, bint use_bin_type=True, # <<<<<<<<<<<<<< - * bint strict_types=False, bint datetime=False, unicode_errors=None): - * self.use_float = use_single_float - */ - __pyx_v_use_single_float = ((int)0); - } - if (values[2]) { - __pyx_v_autoreset = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_autoreset == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 125, __pyx_L3_error) - } else { - __pyx_v_autoreset = ((int)1); - } - if (values[3]) { - __pyx_v_use_bin_type = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_use_bin_type == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 125, __pyx_L3_error) - } else { - __pyx_v_use_bin_type = ((int)1); - } - if (values[4]) { - __pyx_v_strict_types = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_strict_types == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 126, __pyx_L3_error) - } else { - - /* "msgpack/_packer.pyx":126 - * def __init__(self, *, default=None, - * bint use_single_float=False, bint autoreset=True, bint use_bin_type=True, - * bint strict_types=False, bint datetime=False, unicode_errors=None): # <<<<<<<<<<<<<< - * self.use_float = use_single_float - * self.strict_types = strict_types - */ - __pyx_v_strict_types = ((int)0); - } - if (values[5]) { - __pyx_v_datetime = __Pyx_PyObject_IsTrue(values[5]); if (unlikely((__pyx_v_datetime == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 126, __pyx_L3_error) - } else { - __pyx_v_datetime = ((int)0); - } - __pyx_v_unicode_errors = values[6]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 0, 0, __pyx_nargs); __PYX_ERR(0, 124, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_2__init__(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self), __pyx_v_default, __pyx_v_use_single_float, __pyx_v_autoreset, __pyx_v_use_bin_type, __pyx_v_strict_types, __pyx_v_datetime, __pyx_v_unicode_errors); - - /* "msgpack/_packer.pyx":124 - * self.pk.length = 0 - * - * def __init__(self, *, default=None, # <<<<<<<<<<<<<< - * bint use_single_float=False, bint autoreset=True, bint use_bin_type=True, - * bint strict_types=False, bint datetime=False, unicode_errors=None): - */ - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7msgpack_9_cmsgpack_6Packer_2__init__(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_default, int __pyx_v_use_single_float, int __pyx_v_autoreset, int __pyx_v_use_bin_type, int __pyx_v_strict_types, int __pyx_v_datetime, PyObject *__pyx_v_unicode_errors) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - char const *__pyx_t_3; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__init__", 0); - - /* "msgpack/_packer.pyx":127 - * bint use_single_float=False, bint autoreset=True, bint use_bin_type=True, - * bint strict_types=False, bint datetime=False, unicode_errors=None): - * self.use_float = use_single_float # <<<<<<<<<<<<<< - * self.strict_types = strict_types - * self.autoreset = autoreset - */ - __pyx_v_self->use_float = __pyx_v_use_single_float; - - /* "msgpack/_packer.pyx":128 - * bint strict_types=False, bint datetime=False, unicode_errors=None): - * self.use_float = use_single_float - * self.strict_types = strict_types # <<<<<<<<<<<<<< - * self.autoreset = autoreset - * self.datetime = datetime - */ - __pyx_v_self->strict_types = __pyx_v_strict_types; - - /* "msgpack/_packer.pyx":129 - * self.use_float = use_single_float - * self.strict_types = strict_types - * self.autoreset = autoreset # <<<<<<<<<<<<<< - * self.datetime = datetime - * self.pk.use_bin_type = use_bin_type - */ - __pyx_v_self->autoreset = __pyx_v_autoreset; - - /* "msgpack/_packer.pyx":130 - * self.strict_types = strict_types - * self.autoreset = autoreset - * self.datetime = datetime # <<<<<<<<<<<<<< - * self.pk.use_bin_type = use_bin_type - * if default is not None: - */ - __pyx_v_self->datetime = __pyx_v_datetime; - - /* "msgpack/_packer.pyx":131 - * self.autoreset = autoreset - * self.datetime = datetime - * self.pk.use_bin_type = use_bin_type # <<<<<<<<<<<<<< - * if default is not None: - * if not PyCallable_Check(default): - */ - __pyx_v_self->pk.use_bin_type = __pyx_v_use_bin_type; - - /* "msgpack/_packer.pyx":132 - * self.datetime = datetime - * self.pk.use_bin_type = use_bin_type - * if default is not None: # <<<<<<<<<<<<<< - * if not PyCallable_Check(default): - * raise TypeError("default must be a callable.") - */ - __pyx_t_1 = (__pyx_v_default != Py_None); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":133 - * self.pk.use_bin_type = use_bin_type - * if default is not None: - * if not PyCallable_Check(default): # <<<<<<<<<<<<<< - * raise TypeError("default must be a callable.") - * self._default = default - */ - __pyx_t_1 = (!PyCallable_Check(__pyx_v_default)); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":134 - * if default is not None: - * if not PyCallable_Check(default): - * raise TypeError("default must be a callable.") # <<<<<<<<<<<<<< - * self._default = default - * - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 134, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 134, __pyx_L1_error) - - /* "msgpack/_packer.pyx":133 - * self.pk.use_bin_type = use_bin_type - * if default is not None: - * if not PyCallable_Check(default): # <<<<<<<<<<<<<< - * raise TypeError("default must be a callable.") - * self._default = default - */ - } - - /* "msgpack/_packer.pyx":132 - * self.datetime = datetime - * self.pk.use_bin_type = use_bin_type - * if default is not None: # <<<<<<<<<<<<<< - * if not PyCallable_Check(default): - * raise TypeError("default must be a callable.") - */ - } - - /* "msgpack/_packer.pyx":135 - * if not PyCallable_Check(default): - * raise TypeError("default must be a callable.") - * self._default = default # <<<<<<<<<<<<<< - * - * self._berrors = unicode_errors - */ - __Pyx_INCREF(__pyx_v_default); - __Pyx_GIVEREF(__pyx_v_default); - __Pyx_GOTREF(__pyx_v_self->_default); - __Pyx_DECREF(__pyx_v_self->_default); - __pyx_v_self->_default = __pyx_v_default; - - /* "msgpack/_packer.pyx":137 - * self._default = default - * - * self._berrors = unicode_errors # <<<<<<<<<<<<<< - * if unicode_errors is None: - * self.unicode_errors = NULL - */ - __Pyx_INCREF(__pyx_v_unicode_errors); - __Pyx_GIVEREF(__pyx_v_unicode_errors); - __Pyx_GOTREF(__pyx_v_self->_berrors); - __Pyx_DECREF(__pyx_v_self->_berrors); - __pyx_v_self->_berrors = __pyx_v_unicode_errors; - - /* "msgpack/_packer.pyx":138 - * - * self._berrors = unicode_errors - * if unicode_errors is None: # <<<<<<<<<<<<<< - * self.unicode_errors = NULL - * else: - */ - __pyx_t_1 = (__pyx_v_unicode_errors == Py_None); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":139 - * self._berrors = unicode_errors - * if unicode_errors is None: - * self.unicode_errors = NULL # <<<<<<<<<<<<<< - * else: - * self.unicode_errors = self._berrors - */ - __pyx_v_self->unicode_errors = NULL; - - /* "msgpack/_packer.pyx":138 - * - * self._berrors = unicode_errors - * if unicode_errors is None: # <<<<<<<<<<<<<< - * self.unicode_errors = NULL - * else: - */ - goto __pyx_L5; - } - - /* "msgpack/_packer.pyx":141 - * self.unicode_errors = NULL - * else: - * self.unicode_errors = self._berrors # <<<<<<<<<<<<<< - * - * def __dealloc__(self): - */ - /*else*/ { - __pyx_t_3 = __Pyx_PyObject_AsString(__pyx_v_self->_berrors); if (unlikely((!__pyx_t_3) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L1_error) - __pyx_v_self->unicode_errors = __pyx_t_3; - } - __pyx_L5:; - - /* "msgpack/_packer.pyx":124 - * self.pk.length = 0 - * - * def __init__(self, *, default=None, # <<<<<<<<<<<<<< - * bint use_single_float=False, bint autoreset=True, bint use_bin_type=True, - * bint strict_types=False, bint datetime=False, unicode_errors=None): - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":143 - * self.unicode_errors = self._berrors - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * PyMem_Free(self.pk.buf) - * self.pk.buf = NULL - */ - -/* Python wrapper */ -static void __pyx_pw_7msgpack_9_cmsgpack_6Packer_5__dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_pw_7msgpack_9_cmsgpack_6Packer_5__dealloc__(PyObject *__pyx_v_self) { - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); - __pyx_pf_7msgpack_9_cmsgpack_6Packer_4__dealloc__(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_pf_7msgpack_9_cmsgpack_6Packer_4__dealloc__(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__", 0); - - /* "msgpack/_packer.pyx":144 - * - * def __dealloc__(self): - * PyMem_Free(self.pk.buf) # <<<<<<<<<<<<<< - * self.pk.buf = NULL - * - */ - PyMem_Free(__pyx_v_self->pk.buf); - - /* "msgpack/_packer.pyx":145 - * def __dealloc__(self): - * PyMem_Free(self.pk.buf) - * self.pk.buf = NULL # <<<<<<<<<<<<<< - * - * cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: - */ - __pyx_v_self->pk.buf = NULL; - - /* "msgpack/_packer.pyx":143 - * self.unicode_errors = self._berrors - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * PyMem_Free(self.pk.buf) - * self.pk.buf = NULL - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "msgpack/_packer.pyx":147 - * self.pk.buf = NULL - * - * cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: # <<<<<<<<<<<<<< - * cdef long long llval - * cdef unsigned long long ullval - */ - -static int __pyx_f_7msgpack_9_cmsgpack_6Packer__pack(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_o, struct __pyx_opt_args_7msgpack_9_cmsgpack_6Packer__pack *__pyx_optional_args) { - int __pyx_v_nest_limit = __pyx_k__4; - PY_LONG_LONG __pyx_v_llval; - unsigned PY_LONG_LONG __pyx_v_ullval; - unsigned long __pyx_v_ulval; - long __pyx_v_longval; - float __pyx_v_fval; - double __pyx_v_dval; - char *__pyx_v_rawval; - int __pyx_v_ret; - PyObject *__pyx_v_d = 0; - Py_ssize_t __pyx_v_L; - int __pyx_v_default_used; - int __pyx_v_strict_types; - Py_buffer __pyx_v_view; - CYTHON_UNUSED PyObject *__pyx_v_oe = NULL; - PyObject *__pyx_v_k = NULL; - PyObject *__pyx_v_v = NULL; - PyObject *__pyx_v_delta = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - unsigned PY_LONG_LONG __pyx_t_6; - PY_LONG_LONG __pyx_t_7; - int __pyx_t_8; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - int __pyx_t_11; - PyObject *__pyx_t_12 = NULL; - PyObject *__pyx_t_13 = NULL; - PyObject *__pyx_t_14 = NULL; - int __pyx_t_15; - char const *__pyx_t_16; - PyObject *__pyx_t_17 = NULL; - PyObject *__pyx_t_18 = NULL; - PyObject *__pyx_t_19 = NULL; - PyObject *__pyx_t_20 = NULL; - PyObject *__pyx_t_21 = NULL; - PyObject *__pyx_t_22 = NULL; - long __pyx_t_23; - float __pyx_t_24; - double __pyx_t_25; - PyObject *__pyx_t_26; - char *__pyx_t_27; - Py_ssize_t __pyx_t_28; - Py_ssize_t __pyx_t_29; - struct __pyx_opt_args_7msgpack_9_cmsgpack_6Packer__pack __pyx_t_30; - unsigned long __pyx_t_31; - int __pyx_t_32; - PyObject *(*__pyx_t_33)(PyObject *); - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_pack", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_nest_limit = __pyx_optional_args->nest_limit; - } - } - __Pyx_INCREF(__pyx_v_o); - - /* "msgpack/_packer.pyx":158 - * cdef dict d - * cdef Py_ssize_t L - * cdef int default_used = 0 # <<<<<<<<<<<<<< - * cdef bint strict_types = self.strict_types - * cdef Py_buffer view - */ - __pyx_v_default_used = 0; - - /* "msgpack/_packer.pyx":159 - * cdef Py_ssize_t L - * cdef int default_used = 0 - * cdef bint strict_types = self.strict_types # <<<<<<<<<<<<<< - * cdef Py_buffer view - * - */ - __pyx_t_1 = __pyx_v_self->strict_types; - __pyx_v_strict_types = __pyx_t_1; - - /* "msgpack/_packer.pyx":162 - * cdef Py_buffer view - * - * if nest_limit < 0: # <<<<<<<<<<<<<< - * raise ValueError("recursion limit exceeded.") - * - */ - __pyx_t_1 = (__pyx_v_nest_limit < 0); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":163 - * - * if nest_limit < 0: - * raise ValueError("recursion limit exceeded.") # <<<<<<<<<<<<<< - * - * while True: - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 163, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 163, __pyx_L1_error) - - /* "msgpack/_packer.pyx":162 - * cdef Py_buffer view - * - * if nest_limit < 0: # <<<<<<<<<<<<<< - * raise ValueError("recursion limit exceeded.") - * - */ - } - - /* "msgpack/_packer.pyx":165 - * raise ValueError("recursion limit exceeded.") - * - * while True: # <<<<<<<<<<<<<< - * if o is None: - * ret = msgpack_pack_nil(&self.pk) - */ - while (1) { - - /* "msgpack/_packer.pyx":166 - * - * while True: - * if o is None: # <<<<<<<<<<<<<< - * ret = msgpack_pack_nil(&self.pk) - * elif o is True: - */ - __pyx_t_1 = (__pyx_v_o == Py_None); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":167 - * while True: - * if o is None: - * ret = msgpack_pack_nil(&self.pk) # <<<<<<<<<<<<<< - * elif o is True: - * ret = msgpack_pack_true(&self.pk) - */ - __pyx_v_ret = msgpack_pack_nil((&__pyx_v_self->pk)); - - /* "msgpack/_packer.pyx":166 - * - * while True: - * if o is None: # <<<<<<<<<<<<<< - * ret = msgpack_pack_nil(&self.pk) - * elif o is True: - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":168 - * if o is None: - * ret = msgpack_pack_nil(&self.pk) - * elif o is True: # <<<<<<<<<<<<<< - * ret = msgpack_pack_true(&self.pk) - * elif o is False: - */ - __pyx_t_1 = (__pyx_v_o == Py_True); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":169 - * ret = msgpack_pack_nil(&self.pk) - * elif o is True: - * ret = msgpack_pack_true(&self.pk) # <<<<<<<<<<<<<< - * elif o is False: - * ret = msgpack_pack_false(&self.pk) - */ - __pyx_v_ret = msgpack_pack_true((&__pyx_v_self->pk)); - - /* "msgpack/_packer.pyx":168 - * if o is None: - * ret = msgpack_pack_nil(&self.pk) - * elif o is True: # <<<<<<<<<<<<<< - * ret = msgpack_pack_true(&self.pk) - * elif o is False: - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":170 - * elif o is True: - * ret = msgpack_pack_true(&self.pk) - * elif o is False: # <<<<<<<<<<<<<< - * ret = msgpack_pack_false(&self.pk) - * elif PyLong_CheckExact(o) if strict_types else PyLong_Check(o): - */ - __pyx_t_1 = (__pyx_v_o == Py_False); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":171 - * ret = msgpack_pack_true(&self.pk) - * elif o is False: - * ret = msgpack_pack_false(&self.pk) # <<<<<<<<<<<<<< - * elif PyLong_CheckExact(o) if strict_types else PyLong_Check(o): - * # PyInt_Check(long) is True for Python 3. - */ - __pyx_v_ret = msgpack_pack_false((&__pyx_v_self->pk)); - - /* "msgpack/_packer.pyx":170 - * elif o is True: - * ret = msgpack_pack_true(&self.pk) - * elif o is False: # <<<<<<<<<<<<<< - * ret = msgpack_pack_false(&self.pk) - * elif PyLong_CheckExact(o) if strict_types else PyLong_Check(o): - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":172 - * elif o is False: - * ret = msgpack_pack_false(&self.pk) - * elif PyLong_CheckExact(o) if strict_types else PyLong_Check(o): # <<<<<<<<<<<<<< - * # PyInt_Check(long) is True for Python 3. - * # So we should test long before int. - */ - if (__pyx_v_strict_types) { - __pyx_t_1 = PyLong_CheckExact(__pyx_v_o); - } else { - __pyx_t_1 = PyLong_Check(__pyx_v_o); - } - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":175 - * # PyInt_Check(long) is True for Python 3. - * # So we should test long before int. - * try: # <<<<<<<<<<<<<< - * if o > 0: - * ullval = o - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_5); - /*try:*/ { - - /* "msgpack/_packer.pyx":176 - * # So we should test long before int. - * try: - * if o > 0: # <<<<<<<<<<<<<< - * ullval = o - * ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) - */ - __pyx_t_2 = PyObject_RichCompare(__pyx_v_o, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 176, __pyx_L7_error) - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 176, __pyx_L7_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":177 - * try: - * if o > 0: - * ullval = o # <<<<<<<<<<<<<< - * ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) - * else: - */ - __pyx_t_6 = __Pyx_PyInt_As_unsigned_PY_LONG_LONG(__pyx_v_o); if (unlikely((__pyx_t_6 == (unsigned PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 177, __pyx_L7_error) - __pyx_v_ullval = __pyx_t_6; - - /* "msgpack/_packer.pyx":178 - * if o > 0: - * ullval = o - * ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) # <<<<<<<<<<<<<< - * else: - * llval = o - */ - __pyx_v_ret = msgpack_pack_unsigned_long_long((&__pyx_v_self->pk), __pyx_v_ullval); - - /* "msgpack/_packer.pyx":176 - * # So we should test long before int. - * try: - * if o > 0: # <<<<<<<<<<<<<< - * ullval = o - * ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) - */ - goto __pyx_L15; - } - - /* "msgpack/_packer.pyx":180 - * ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) - * else: - * llval = o # <<<<<<<<<<<<<< - * ret = msgpack_pack_long_long(&self.pk, llval) - * except OverflowError as oe: - */ - /*else*/ { - __pyx_t_7 = __Pyx_PyInt_As_PY_LONG_LONG(__pyx_v_o); if (unlikely((__pyx_t_7 == (PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 180, __pyx_L7_error) - __pyx_v_llval = __pyx_t_7; - - /* "msgpack/_packer.pyx":181 - * else: - * llval = o - * ret = msgpack_pack_long_long(&self.pk, llval) # <<<<<<<<<<<<<< - * except OverflowError as oe: - * if not default_used and self._default is not None: - */ - __pyx_v_ret = msgpack_pack_long_long((&__pyx_v_self->pk), __pyx_v_llval); - } - __pyx_L15:; - - /* "msgpack/_packer.pyx":175 - * # PyInt_Check(long) is True for Python 3. - * # So we should test long before int. - * try: # <<<<<<<<<<<<<< - * if o > 0: - * ullval = o - */ - } - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - goto __pyx_L14_try_end; - __pyx_L7_error:; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_packer.pyx":182 - * llval = o - * ret = msgpack_pack_long_long(&self.pk, llval) - * except OverflowError as oe: # <<<<<<<<<<<<<< - * if not default_used and self._default is not None: - * o = self._default(o) - */ - __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_OverflowError); - if (__pyx_t_8) { - __Pyx_AddTraceback("msgpack._cmsgpack.Packer._pack", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_9, &__pyx_t_10) < 0) __PYX_ERR(0, 182, __pyx_L9_except_error) - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_9); - __Pyx_XGOTREF(__pyx_t_10); - __Pyx_INCREF(__pyx_t_9); - __pyx_v_oe = __pyx_t_9; - /*try:*/ { - - /* "msgpack/_packer.pyx":183 - * ret = msgpack_pack_long_long(&self.pk, llval) - * except OverflowError as oe: - * if not default_used and self._default is not None: # <<<<<<<<<<<<<< - * o = self._default(o) - * default_used = True - */ - __pyx_t_11 = (!(__pyx_v_default_used != 0)); - if (__pyx_t_11) { - } else { - __pyx_t_1 = __pyx_t_11; - goto __pyx_L24_bool_binop_done; - } - __pyx_t_11 = (__pyx_v_self->_default != Py_None); - __pyx_t_1 = __pyx_t_11; - __pyx_L24_bool_binop_done:; - if (likely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":184 - * except OverflowError as oe: - * if not default_used and self._default is not None: - * o = self._default(o) # <<<<<<<<<<<<<< - * default_used = True - * continue - */ - __Pyx_INCREF(__pyx_v_self->_default); - __pyx_t_13 = __pyx_v_self->_default; __pyx_t_14 = NULL; - __pyx_t_8 = 0; - #if CYTHON_UNPACK_METHODS - if (likely(PyMethod_Check(__pyx_t_13))) { - __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_13); - if (likely(__pyx_t_14)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13); - __Pyx_INCREF(__pyx_t_14); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_13, function); - __pyx_t_8 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_14, __pyx_v_o}; - __pyx_t_12 = __Pyx_PyObject_FastCall(__pyx_t_13, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); - __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; - if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 184, __pyx_L21_error) - __Pyx_GOTREF(__pyx_t_12); - __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; - } - __Pyx_DECREF_SET(__pyx_v_o, __pyx_t_12); - __pyx_t_12 = 0; - - /* "msgpack/_packer.pyx":185 - * if not default_used and self._default is not None: - * o = self._default(o) - * default_used = True # <<<<<<<<<<<<<< - * continue - * else: - */ - __pyx_v_default_used = 1; - - /* "msgpack/_packer.pyx":186 - * o = self._default(o) - * default_used = True - * continue # <<<<<<<<<<<<<< - * else: - * raise OverflowError("Integer value out of range") - */ - goto __pyx_L18_continue; - - /* "msgpack/_packer.pyx":183 - * ret = msgpack_pack_long_long(&self.pk, llval) - * except OverflowError as oe: - * if not default_used and self._default is not None: # <<<<<<<<<<<<<< - * o = self._default(o) - * default_used = True - */ - } - - /* "msgpack/_packer.pyx":188 - * continue - * else: - * raise OverflowError("Integer value out of range") # <<<<<<<<<<<<<< - * elif PyInt_CheckExact(o) if strict_types else PyInt_Check(o): - * longval = o - */ - /*else*/ { - __pyx_t_12 = __Pyx_PyObject_Call(__pyx_builtin_OverflowError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 188, __pyx_L21_error) - __Pyx_GOTREF(__pyx_t_12); - __Pyx_Raise(__pyx_t_12, 0, 0, 0); - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - __PYX_ERR(0, 188, __pyx_L21_error) - } - } - - /* "msgpack/_packer.pyx":182 - * llval = o - * ret = msgpack_pack_long_long(&self.pk, llval) - * except OverflowError as oe: # <<<<<<<<<<<<<< - * if not default_used and self._default is not None: - * o = self._default(o) - */ - /*finally:*/ { - __pyx_L21_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; - __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_20, &__pyx_t_21, &__pyx_t_22); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19) < 0)) __Pyx_ErrFetch(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19); - __Pyx_XGOTREF(__pyx_t_17); - __Pyx_XGOTREF(__pyx_t_18); - __Pyx_XGOTREF(__pyx_t_19); - __Pyx_XGOTREF(__pyx_t_20); - __Pyx_XGOTREF(__pyx_t_21); - __Pyx_XGOTREF(__pyx_t_22); - __pyx_t_8 = __pyx_lineno; __pyx_t_15 = __pyx_clineno; __pyx_t_16 = __pyx_filename; - { - __Pyx_DECREF(__pyx_v_oe); __pyx_v_oe = 0; - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_20); - __Pyx_XGIVEREF(__pyx_t_21); - __Pyx_XGIVEREF(__pyx_t_22); - __Pyx_ExceptionReset(__pyx_t_20, __pyx_t_21, __pyx_t_22); - } - __Pyx_XGIVEREF(__pyx_t_17); - __Pyx_XGIVEREF(__pyx_t_18); - __Pyx_XGIVEREF(__pyx_t_19); - __Pyx_ErrRestore(__pyx_t_17, __pyx_t_18, __pyx_t_19); - __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; - __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_15; __pyx_filename = __pyx_t_16; - goto __pyx_L9_except_error; - } - __pyx_L18_continue: { - __Pyx_DECREF(__pyx_v_oe); __pyx_v_oe = 0; - goto __pyx_L16_except_continue; - } - } - __pyx_L16_except_continue:; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - goto __pyx_L13_try_continue; - } - goto __pyx_L9_except_error; - - /* "msgpack/_packer.pyx":175 - * # PyInt_Check(long) is True for Python 3. - * # So we should test long before int. - * try: # <<<<<<<<<<<<<< - * if o > 0: - * ullval = o - */ - __pyx_L9_except_error:; - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); - goto __pyx_L1_error; - __pyx_L13_try_continue:; - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5); - goto __pyx_L4_continue; - __pyx_L14_try_end:; - } - - /* "msgpack/_packer.pyx":172 - * elif o is False: - * ret = msgpack_pack_false(&self.pk) - * elif PyLong_CheckExact(o) if strict_types else PyLong_Check(o): # <<<<<<<<<<<<<< - * # PyInt_Check(long) is True for Python 3. - * # So we should test long before int. - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":189 - * else: - * raise OverflowError("Integer value out of range") - * elif PyInt_CheckExact(o) if strict_types else PyInt_Check(o): # <<<<<<<<<<<<<< - * longval = o - * ret = msgpack_pack_long(&self.pk, longval) - */ - if (__pyx_v_strict_types) { - __pyx_t_1 = PyInt_CheckExact(__pyx_v_o); - } else { - __pyx_t_1 = PyInt_Check(__pyx_v_o); - } - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":190 - * raise OverflowError("Integer value out of range") - * elif PyInt_CheckExact(o) if strict_types else PyInt_Check(o): - * longval = o # <<<<<<<<<<<<<< - * ret = msgpack_pack_long(&self.pk, longval) - * elif PyFloat_CheckExact(o) if strict_types else PyFloat_Check(o): - */ - __pyx_t_23 = __Pyx_PyInt_As_long(__pyx_v_o); if (unlikely((__pyx_t_23 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 190, __pyx_L1_error) - __pyx_v_longval = __pyx_t_23; - - /* "msgpack/_packer.pyx":191 - * elif PyInt_CheckExact(o) if strict_types else PyInt_Check(o): - * longval = o - * ret = msgpack_pack_long(&self.pk, longval) # <<<<<<<<<<<<<< - * elif PyFloat_CheckExact(o) if strict_types else PyFloat_Check(o): - * if self.use_float: - */ - __pyx_v_ret = msgpack_pack_long((&__pyx_v_self->pk), __pyx_v_longval); - - /* "msgpack/_packer.pyx":189 - * else: - * raise OverflowError("Integer value out of range") - * elif PyInt_CheckExact(o) if strict_types else PyInt_Check(o): # <<<<<<<<<<<<<< - * longval = o - * ret = msgpack_pack_long(&self.pk, longval) - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":192 - * longval = o - * ret = msgpack_pack_long(&self.pk, longval) - * elif PyFloat_CheckExact(o) if strict_types else PyFloat_Check(o): # <<<<<<<<<<<<<< - * if self.use_float: - * fval = o - */ - if (__pyx_v_strict_types) { - __pyx_t_1 = PyFloat_CheckExact(__pyx_v_o); - } else { - __pyx_t_1 = PyFloat_Check(__pyx_v_o); - } - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":193 - * ret = msgpack_pack_long(&self.pk, longval) - * elif PyFloat_CheckExact(o) if strict_types else PyFloat_Check(o): - * if self.use_float: # <<<<<<<<<<<<<< - * fval = o - * ret = msgpack_pack_float(&self.pk, fval) - */ - if (__pyx_v_self->use_float) { - - /* "msgpack/_packer.pyx":194 - * elif PyFloat_CheckExact(o) if strict_types else PyFloat_Check(o): - * if self.use_float: - * fval = o # <<<<<<<<<<<<<< - * ret = msgpack_pack_float(&self.pk, fval) - * else: - */ - __pyx_t_24 = __pyx_PyFloat_AsFloat(__pyx_v_o); if (unlikely((__pyx_t_24 == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 194, __pyx_L1_error) - __pyx_v_fval = __pyx_t_24; - - /* "msgpack/_packer.pyx":195 - * if self.use_float: - * fval = o - * ret = msgpack_pack_float(&self.pk, fval) # <<<<<<<<<<<<<< - * else: - * dval = o - */ - __pyx_v_ret = msgpack_pack_float((&__pyx_v_self->pk), __pyx_v_fval); - - /* "msgpack/_packer.pyx":193 - * ret = msgpack_pack_long(&self.pk, longval) - * elif PyFloat_CheckExact(o) if strict_types else PyFloat_Check(o): - * if self.use_float: # <<<<<<<<<<<<<< - * fval = o - * ret = msgpack_pack_float(&self.pk, fval) - */ - goto __pyx_L30; - } - - /* "msgpack/_packer.pyx":197 - * ret = msgpack_pack_float(&self.pk, fval) - * else: - * dval = o # <<<<<<<<<<<<<< - * ret = msgpack_pack_double(&self.pk, dval) - * elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o): - */ - /*else*/ { - __pyx_t_25 = __pyx_PyFloat_AsDouble(__pyx_v_o); if (unlikely((__pyx_t_25 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 197, __pyx_L1_error) - __pyx_v_dval = __pyx_t_25; - - /* "msgpack/_packer.pyx":198 - * else: - * dval = o - * ret = msgpack_pack_double(&self.pk, dval) # <<<<<<<<<<<<<< - * elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o): - * L = Py_SIZE(o) - */ - __pyx_v_ret = msgpack_pack_double((&__pyx_v_self->pk), __pyx_v_dval); - } - __pyx_L30:; - - /* "msgpack/_packer.pyx":192 - * longval = o - * ret = msgpack_pack_long(&self.pk, longval) - * elif PyFloat_CheckExact(o) if strict_types else PyFloat_Check(o): # <<<<<<<<<<<<<< - * if self.use_float: - * fval = o - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":199 - * dval = o - * ret = msgpack_pack_double(&self.pk, dval) - * elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o): # <<<<<<<<<<<<<< - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - */ - if (__pyx_v_strict_types) { - __pyx_t_8 = __pyx_f_7msgpack_9_cmsgpack_PyBytesLike_CheckExact(__pyx_v_o); if (unlikely(__pyx_t_8 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 199, __pyx_L1_error) - __pyx_t_15 = __pyx_t_8; - } else { - __pyx_t_8 = __pyx_f_7msgpack_9_cmsgpack_PyBytesLike_Check(__pyx_v_o); if (unlikely(__pyx_t_8 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 199, __pyx_L1_error) - __pyx_t_15 = __pyx_t_8; - } - __pyx_t_1 = (__pyx_t_15 != 0); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":200 - * ret = msgpack_pack_double(&self.pk, dval) - * elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o): - * L = Py_SIZE(o) # <<<<<<<<<<<<<< - * if L > ITEM_LIMIT: - * PyErr_Format(ValueError, b"%.200s object is too large", Py_TYPE(o).tp_name) - */ - __pyx_v_L = Py_SIZE(__pyx_v_o); - - /* "msgpack/_packer.pyx":201 - * elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o): - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * PyErr_Format(ValueError, b"%.200s object is too large", Py_TYPE(o).tp_name) - * rawval = o - */ - __pyx_t_1 = (__pyx_v_L > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":202 - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - * PyErr_Format(ValueError, b"%.200s object is too large", Py_TYPE(o).tp_name) # <<<<<<<<<<<<<< - * rawval = o - * ret = msgpack_pack_bin(&self.pk, L) - */ - __pyx_t_26 = PyErr_Format(__pyx_builtin_ValueError, ((char *)"%.200s object is too large"), Py_TYPE(__pyx_v_o)->tp_name); if (unlikely(__pyx_t_26 == ((PyObject *)NULL))) __PYX_ERR(0, 202, __pyx_L1_error) - - /* "msgpack/_packer.pyx":201 - * elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o): - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * PyErr_Format(ValueError, b"%.200s object is too large", Py_TYPE(o).tp_name) - * rawval = o - */ - } - - /* "msgpack/_packer.pyx":203 - * if L > ITEM_LIMIT: - * PyErr_Format(ValueError, b"%.200s object is too large", Py_TYPE(o).tp_name) - * rawval = o # <<<<<<<<<<<<<< - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: - */ - __pyx_t_27 = __Pyx_PyObject_AsWritableString(__pyx_v_o); if (unlikely((!__pyx_t_27) && PyErr_Occurred())) __PYX_ERR(0, 203, __pyx_L1_error) - __pyx_v_rawval = __pyx_t_27; - - /* "msgpack/_packer.pyx":204 - * PyErr_Format(ValueError, b"%.200s object is too large", Py_TYPE(o).tp_name) - * rawval = o - * ret = msgpack_pack_bin(&self.pk, L) # <<<<<<<<<<<<<< - * if ret == 0: - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - */ - __pyx_v_ret = msgpack_pack_bin((&__pyx_v_self->pk), __pyx_v_L); - - /* "msgpack/_packer.pyx":205 - * rawval = o - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): - */ - __pyx_t_1 = (__pyx_v_ret == 0); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":206 - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) # <<<<<<<<<<<<<< - * elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): - * if self.unicode_errors == NULL: - */ - __pyx_v_ret = msgpack_pack_raw_body((&__pyx_v_self->pk), __pyx_v_rawval, __pyx_v_L); - - /* "msgpack/_packer.pyx":205 - * rawval = o - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): - */ - } - - /* "msgpack/_packer.pyx":199 - * dval = o - * ret = msgpack_pack_double(&self.pk, dval) - * elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o): # <<<<<<<<<<<<<< - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":207 - * if ret == 0: - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): # <<<<<<<<<<<<<< - * if self.unicode_errors == NULL: - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - */ - if (__pyx_v_strict_types) { - __pyx_t_1 = PyUnicode_CheckExact(__pyx_v_o); - } else { - __pyx_t_1 = PyUnicode_Check(__pyx_v_o); - } - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":208 - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): - * if self.unicode_errors == NULL: # <<<<<<<<<<<<<< - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - * if ret == -2: - */ - __pyx_t_1 = (__pyx_v_self->unicode_errors == NULL); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":209 - * elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): - * if self.unicode_errors == NULL: - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); # <<<<<<<<<<<<<< - * if ret == -2: - * raise ValueError("unicode string is too large") - */ - __pyx_v_ret = msgpack_pack_unicode((&__pyx_v_self->pk), __pyx_v_o, __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - - /* "msgpack/_packer.pyx":210 - * if self.unicode_errors == NULL: - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - * if ret == -2: # <<<<<<<<<<<<<< - * raise ValueError("unicode string is too large") - * else: - */ - __pyx_t_1 = (__pyx_v_ret == -2L); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":211 - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - * if ret == -2: - * raise ValueError("unicode string is too large") # <<<<<<<<<<<<<< - * else: - * o = PyUnicode_AsEncodedString(o, NULL, self.unicode_errors) - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 211, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 211, __pyx_L1_error) - - /* "msgpack/_packer.pyx":210 - * if self.unicode_errors == NULL: - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - * if ret == -2: # <<<<<<<<<<<<<< - * raise ValueError("unicode string is too large") - * else: - */ - } - - /* "msgpack/_packer.pyx":208 - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): - * if self.unicode_errors == NULL: # <<<<<<<<<<<<<< - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - * if ret == -2: - */ - goto __pyx_L33; - } - - /* "msgpack/_packer.pyx":213 - * raise ValueError("unicode string is too large") - * else: - * o = PyUnicode_AsEncodedString(o, NULL, self.unicode_errors) # <<<<<<<<<<<<<< - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - */ - /*else*/ { - __pyx_t_10 = PyUnicode_AsEncodedString(__pyx_v_o, NULL, __pyx_v_self->unicode_errors); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 213, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF_SET(__pyx_v_o, __pyx_t_10); - __pyx_t_10 = 0; - - /* "msgpack/_packer.pyx":214 - * else: - * o = PyUnicode_AsEncodedString(o, NULL, self.unicode_errors) - * L = Py_SIZE(o) # <<<<<<<<<<<<<< - * if L > ITEM_LIMIT: - * raise ValueError("unicode string is too large") - */ - __pyx_v_L = Py_SIZE(__pyx_v_o); - - /* "msgpack/_packer.pyx":215 - * o = PyUnicode_AsEncodedString(o, NULL, self.unicode_errors) - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("unicode string is too large") - * ret = msgpack_pack_raw(&self.pk, L) - */ - __pyx_t_1 = (__pyx_v_L > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":216 - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - * raise ValueError("unicode string is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_raw(&self.pk, L) - * if ret == 0: - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 216, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 216, __pyx_L1_error) - - /* "msgpack/_packer.pyx":215 - * o = PyUnicode_AsEncodedString(o, NULL, self.unicode_errors) - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("unicode string is too large") - * ret = msgpack_pack_raw(&self.pk, L) - */ - } - - /* "msgpack/_packer.pyx":217 - * if L > ITEM_LIMIT: - * raise ValueError("unicode string is too large") - * ret = msgpack_pack_raw(&self.pk, L) # <<<<<<<<<<<<<< - * if ret == 0: - * rawval = o - */ - __pyx_v_ret = msgpack_pack_raw((&__pyx_v_self->pk), __pyx_v_L); - - /* "msgpack/_packer.pyx":218 - * raise ValueError("unicode string is too large") - * ret = msgpack_pack_raw(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * rawval = o - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - */ - __pyx_t_1 = (__pyx_v_ret == 0); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":219 - * ret = msgpack_pack_raw(&self.pk, L) - * if ret == 0: - * rawval = o # <<<<<<<<<<<<<< - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyDict_CheckExact(o): - */ - __pyx_t_27 = __Pyx_PyObject_AsWritableString(__pyx_v_o); if (unlikely((!__pyx_t_27) && PyErr_Occurred())) __PYX_ERR(0, 219, __pyx_L1_error) - __pyx_v_rawval = __pyx_t_27; - - /* "msgpack/_packer.pyx":220 - * if ret == 0: - * rawval = o - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) # <<<<<<<<<<<<<< - * elif PyDict_CheckExact(o): - * d = <dict>o - */ - __pyx_v_ret = msgpack_pack_raw_body((&__pyx_v_self->pk), __pyx_v_rawval, __pyx_v_L); - - /* "msgpack/_packer.pyx":218 - * raise ValueError("unicode string is too large") - * ret = msgpack_pack_raw(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * rawval = o - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - */ - } - } - __pyx_L33:; - - /* "msgpack/_packer.pyx":207 - * if ret == 0: - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): # <<<<<<<<<<<<<< - * if self.unicode_errors == NULL: - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":221 - * rawval = o - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyDict_CheckExact(o): # <<<<<<<<<<<<<< - * d = <dict>o - * L = len(d) - */ - __pyx_t_1 = PyDict_CheckExact(__pyx_v_o); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":222 - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyDict_CheckExact(o): - * d = <dict>o # <<<<<<<<<<<<<< - * L = len(d) - * if L > ITEM_LIMIT: - */ - __pyx_t_10 = __pyx_v_o; - __Pyx_INCREF(__pyx_t_10); - __pyx_v_d = ((PyObject*)__pyx_t_10); - __pyx_t_10 = 0; - - /* "msgpack/_packer.pyx":223 - * elif PyDict_CheckExact(o): - * d = <dict>o - * L = len(d) # <<<<<<<<<<<<<< - * if L > ITEM_LIMIT: - * raise ValueError("dict is too large") - */ - if (unlikely(__pyx_v_d == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(0, 223, __pyx_L1_error) - } - __pyx_t_28 = PyDict_Size(__pyx_v_d); if (unlikely(__pyx_t_28 == ((Py_ssize_t)-1))) __PYX_ERR(0, 223, __pyx_L1_error) - __pyx_v_L = __pyx_t_28; - - /* "msgpack/_packer.pyx":224 - * d = <dict>o - * L = len(d) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) - */ - __pyx_t_1 = (__pyx_v_L > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":225 - * L = len(d) - * if L > ITEM_LIMIT: - * raise ValueError("dict is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 225, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 225, __pyx_L1_error) - - /* "msgpack/_packer.pyx":224 - * d = <dict>o - * L = len(d) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) - */ - } - - /* "msgpack/_packer.pyx":226 - * if L > ITEM_LIMIT: - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) # <<<<<<<<<<<<<< - * if ret == 0: - * for k, v in d.items(): - */ - __pyx_v_ret = msgpack_pack_map((&__pyx_v_self->pk), __pyx_v_L); - - /* "msgpack/_packer.pyx":227 - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * for k, v in d.items(): - * ret = self._pack(k, nest_limit-1) - */ - __pyx_t_1 = (__pyx_v_ret == 0); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":228 - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: - * for k, v in d.items(): # <<<<<<<<<<<<<< - * ret = self._pack(k, nest_limit-1) - * if ret != 0: break - */ - __pyx_t_28 = 0; - if (unlikely(__pyx_v_d == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); - __PYX_ERR(0, 228, __pyx_L1_error) - } - __pyx_t_9 = __Pyx_dict_iterator(__pyx_v_d, 1, __pyx_n_s_items, (&__pyx_t_29), (&__pyx_t_15)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __pyx_t_10 = __pyx_t_9; - __pyx_t_9 = 0; - while (1) { - __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_29, &__pyx_t_28, &__pyx_t_9, &__pyx_t_2, NULL, __pyx_t_15); - if (unlikely(__pyx_t_8 == 0)) break; - if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 228, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_GOTREF(__pyx_t_2); - __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_9); - __pyx_t_9 = 0; - __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_2); - __pyx_t_2 = 0; - - /* "msgpack/_packer.pyx":229 - * if ret == 0: - * for k, v in d.items(): - * ret = self._pack(k, nest_limit-1) # <<<<<<<<<<<<<< - * if ret != 0: break - * ret = self._pack(v, nest_limit-1) - */ - __pyx_t_30.__pyx_n = 1; - __pyx_t_30.nest_limit = (__pyx_v_nest_limit - 1); - __pyx_t_8 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *)__pyx_v_self->__pyx_vtab)->_pack(__pyx_v_self, __pyx_v_k, &__pyx_t_30); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 229, __pyx_L1_error) - __pyx_v_ret = __pyx_t_8; - - /* "msgpack/_packer.pyx":230 - * for k, v in d.items(): - * ret = self._pack(k, nest_limit-1) - * if ret != 0: break # <<<<<<<<<<<<<< - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - */ - __pyx_t_1 = (__pyx_v_ret != 0); - if (__pyx_t_1) { - goto __pyx_L40_break; - } - - /* "msgpack/_packer.pyx":231 - * ret = self._pack(k, nest_limit-1) - * if ret != 0: break - * ret = self._pack(v, nest_limit-1) # <<<<<<<<<<<<<< - * if ret != 0: break - * elif not strict_types and PyDict_Check(o): - */ - __pyx_t_30.__pyx_n = 1; - __pyx_t_30.nest_limit = (__pyx_v_nest_limit - 1); - __pyx_t_8 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *)__pyx_v_self->__pyx_vtab)->_pack(__pyx_v_self, __pyx_v_v, &__pyx_t_30); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 231, __pyx_L1_error) - __pyx_v_ret = __pyx_t_8; - - /* "msgpack/_packer.pyx":232 - * if ret != 0: break - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break # <<<<<<<<<<<<<< - * elif not strict_types and PyDict_Check(o): - * L = len(o) - */ - __pyx_t_1 = (__pyx_v_ret != 0); - if (__pyx_t_1) { - goto __pyx_L40_break; - } - } - __pyx_L40_break:; - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - - /* "msgpack/_packer.pyx":227 - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * for k, v in d.items(): - * ret = self._pack(k, nest_limit-1) - */ - } - - /* "msgpack/_packer.pyx":221 - * rawval = o - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif PyDict_CheckExact(o): # <<<<<<<<<<<<<< - * d = <dict>o - * L = len(d) - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":233 - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - * elif not strict_types and PyDict_Check(o): # <<<<<<<<<<<<<< - * L = len(o) - * if L > ITEM_LIMIT: - */ - __pyx_t_11 = (!__pyx_v_strict_types); - if (__pyx_t_11) { - } else { - __pyx_t_1 = __pyx_t_11; - goto __pyx_L43_bool_binop_done; - } - __pyx_t_11 = PyDict_Check(__pyx_v_o); - __pyx_t_1 = __pyx_t_11; - __pyx_L43_bool_binop_done:; - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":234 - * if ret != 0: break - * elif not strict_types and PyDict_Check(o): - * L = len(o) # <<<<<<<<<<<<<< - * if L > ITEM_LIMIT: - * raise ValueError("dict is too large") - */ - __pyx_t_29 = PyObject_Length(__pyx_v_o); if (unlikely(__pyx_t_29 == ((Py_ssize_t)-1))) __PYX_ERR(0, 234, __pyx_L1_error) - __pyx_v_L = __pyx_t_29; - - /* "msgpack/_packer.pyx":235 - * elif not strict_types and PyDict_Check(o): - * L = len(o) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) - */ - __pyx_t_1 = (__pyx_v_L > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":236 - * L = len(o) - * if L > ITEM_LIMIT: - * raise ValueError("dict is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 236, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 236, __pyx_L1_error) - - /* "msgpack/_packer.pyx":235 - * elif not strict_types and PyDict_Check(o): - * L = len(o) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) - */ - } - - /* "msgpack/_packer.pyx":237 - * if L > ITEM_LIMIT: - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) # <<<<<<<<<<<<<< - * if ret == 0: - * for k, v in o.items(): - */ - __pyx_v_ret = msgpack_pack_map((&__pyx_v_self->pk), __pyx_v_L); - - /* "msgpack/_packer.pyx":238 - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * for k, v in o.items(): - * ret = self._pack(k, nest_limit-1) - */ - __pyx_t_1 = (__pyx_v_ret == 0); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":239 - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: - * for k, v in o.items(): # <<<<<<<<<<<<<< - * ret = self._pack(k, nest_limit-1) - * if ret != 0: break - */ - __pyx_t_29 = 0; - if (unlikely(__pyx_v_o == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); - __PYX_ERR(0, 239, __pyx_L1_error) - } - __pyx_t_2 = __Pyx_dict_iterator(__pyx_v_o, 0, __pyx_n_s_items, (&__pyx_t_28), (&__pyx_t_15)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 239, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_10); - __pyx_t_10 = __pyx_t_2; - __pyx_t_2 = 0; - while (1) { - __pyx_t_8 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_28, &__pyx_t_29, &__pyx_t_2, &__pyx_t_9, NULL, __pyx_t_15); - if (unlikely(__pyx_t_8 == 0)) break; - if (unlikely(__pyx_t_8 == -1)) __PYX_ERR(0, 239, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GOTREF(__pyx_t_9); - __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_2); - __pyx_t_2 = 0; - __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_9); - __pyx_t_9 = 0; - - /* "msgpack/_packer.pyx":240 - * if ret == 0: - * for k, v in o.items(): - * ret = self._pack(k, nest_limit-1) # <<<<<<<<<<<<<< - * if ret != 0: break - * ret = self._pack(v, nest_limit-1) - */ - __pyx_t_30.__pyx_n = 1; - __pyx_t_30.nest_limit = (__pyx_v_nest_limit - 1); - __pyx_t_8 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *)__pyx_v_self->__pyx_vtab)->_pack(__pyx_v_self, __pyx_v_k, &__pyx_t_30); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 240, __pyx_L1_error) - __pyx_v_ret = __pyx_t_8; - - /* "msgpack/_packer.pyx":241 - * for k, v in o.items(): - * ret = self._pack(k, nest_limit-1) - * if ret != 0: break # <<<<<<<<<<<<<< - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - */ - __pyx_t_1 = (__pyx_v_ret != 0); - if (__pyx_t_1) { - goto __pyx_L48_break; - } - - /* "msgpack/_packer.pyx":242 - * ret = self._pack(k, nest_limit-1) - * if ret != 0: break - * ret = self._pack(v, nest_limit-1) # <<<<<<<<<<<<<< - * if ret != 0: break - * elif type(o) is ExtType if strict_types else isinstance(o, ExtType): - */ - __pyx_t_30.__pyx_n = 1; - __pyx_t_30.nest_limit = (__pyx_v_nest_limit - 1); - __pyx_t_8 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *)__pyx_v_self->__pyx_vtab)->_pack(__pyx_v_self, __pyx_v_v, &__pyx_t_30); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 242, __pyx_L1_error) - __pyx_v_ret = __pyx_t_8; - - /* "msgpack/_packer.pyx":243 - * if ret != 0: break - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break # <<<<<<<<<<<<<< - * elif type(o) is ExtType if strict_types else isinstance(o, ExtType): - * # This should be before Tuple because ExtType is namedtuple. - */ - __pyx_t_1 = (__pyx_v_ret != 0); - if (__pyx_t_1) { - goto __pyx_L48_break; - } - } - __pyx_L48_break:; - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - - /* "msgpack/_packer.pyx":238 - * raise ValueError("dict is too large") - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * for k, v in o.items(): - * ret = self._pack(k, nest_limit-1) - */ - } - - /* "msgpack/_packer.pyx":233 - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - * elif not strict_types and PyDict_Check(o): # <<<<<<<<<<<<<< - * L = len(o) - * if L > ITEM_LIMIT: - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":244 - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - * elif type(o) is ExtType if strict_types else isinstance(o, ExtType): # <<<<<<<<<<<<<< - * # This should be before Tuple because ExtType is namedtuple. - * longval = o.code - */ - if (__pyx_v_strict_types) { - __pyx_t_10 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7cpython_4type_type), __pyx_v_o); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_11 = (__pyx_t_10 == __pyx_v_7msgpack_9_cmsgpack_ExtType); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_1 = __pyx_t_11; - } else { - __pyx_t_10 = __pyx_v_7msgpack_9_cmsgpack_ExtType; - __Pyx_INCREF(__pyx_t_10); - __pyx_t_11 = PyObject_IsInstance(__pyx_v_o, __pyx_t_10); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_1 = __pyx_t_11; - } - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":246 - * elif type(o) is ExtType if strict_types else isinstance(o, ExtType): - * # This should be before Tuple because ExtType is namedtuple. - * longval = o.code # <<<<<<<<<<<<<< - * rawval = o.data - * L = len(o.data) - */ - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_o, __pyx_n_s_code); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 246, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_23 = __Pyx_PyInt_As_long(__pyx_t_10); if (unlikely((__pyx_t_23 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 246, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_v_longval = __pyx_t_23; - - /* "msgpack/_packer.pyx":247 - * # This should be before Tuple because ExtType is namedtuple. - * longval = o.code - * rawval = o.data # <<<<<<<<<<<<<< - * L = len(o.data) - * if L > ITEM_LIMIT: - */ - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_o, __pyx_n_s_data); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 247, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_27 = __Pyx_PyObject_AsWritableString(__pyx_t_10); if (unlikely((!__pyx_t_27) && PyErr_Occurred())) __PYX_ERR(0, 247, __pyx_L1_error) - __pyx_v_rawval = __pyx_t_27; - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - - /* "msgpack/_packer.pyx":248 - * longval = o.code - * rawval = o.data - * L = len(o.data) # <<<<<<<<<<<<<< - * if L > ITEM_LIMIT: - * raise ValueError("EXT data is too large") - */ - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_o, __pyx_n_s_data); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 248, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_28 = PyObject_Length(__pyx_t_10); if (unlikely(__pyx_t_28 == ((Py_ssize_t)-1))) __PYX_ERR(0, 248, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_v_L = __pyx_t_28; - - /* "msgpack/_packer.pyx":249 - * rawval = o.data - * L = len(o.data) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("EXT data is too large") - * ret = msgpack_pack_ext(&self.pk, longval, L) - */ - __pyx_t_1 = (__pyx_v_L > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":250 - * L = len(o.data) - * if L > ITEM_LIMIT: - * raise ValueError("EXT data is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_ext(&self.pk, longval, L) - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 250, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 250, __pyx_L1_error) - - /* "msgpack/_packer.pyx":249 - * rawval = o.data - * L = len(o.data) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("EXT data is too large") - * ret = msgpack_pack_ext(&self.pk, longval, L) - */ - } - - /* "msgpack/_packer.pyx":251 - * if L > ITEM_LIMIT: - * raise ValueError("EXT data is too large") - * ret = msgpack_pack_ext(&self.pk, longval, L) # <<<<<<<<<<<<<< - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif type(o) is Timestamp: - */ - __pyx_v_ret = msgpack_pack_ext((&__pyx_v_self->pk), __pyx_v_longval, __pyx_v_L); - - /* "msgpack/_packer.pyx":252 - * raise ValueError("EXT data is too large") - * ret = msgpack_pack_ext(&self.pk, longval, L) - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) # <<<<<<<<<<<<<< - * elif type(o) is Timestamp: - * llval = o.seconds - */ - __pyx_v_ret = msgpack_pack_raw_body((&__pyx_v_self->pk), __pyx_v_rawval, __pyx_v_L); - - /* "msgpack/_packer.pyx":244 - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - * elif type(o) is ExtType if strict_types else isinstance(o, ExtType): # <<<<<<<<<<<<<< - * # This should be before Tuple because ExtType is namedtuple. - * longval = o.code - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":253 - * ret = msgpack_pack_ext(&self.pk, longval, L) - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif type(o) is Timestamp: # <<<<<<<<<<<<<< - * llval = o.seconds - * ulval = o.nanoseconds - */ - __pyx_t_10 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7cpython_4type_type), __pyx_v_o); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 253, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_1 = (__pyx_t_10 == __pyx_v_7msgpack_9_cmsgpack_Timestamp); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":254 - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif type(o) is Timestamp: - * llval = o.seconds # <<<<<<<<<<<<<< - * ulval = o.nanoseconds - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - */ - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_o, __pyx_n_s_seconds); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 254, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_7 = __Pyx_PyInt_As_PY_LONG_LONG(__pyx_t_10); if (unlikely((__pyx_t_7 == (PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 254, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_v_llval = __pyx_t_7; - - /* "msgpack/_packer.pyx":255 - * elif type(o) is Timestamp: - * llval = o.seconds - * ulval = o.nanoseconds # <<<<<<<<<<<<<< - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - * elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)): - */ - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_v_o, __pyx_n_s_nanoseconds); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 255, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_31 = __Pyx_PyInt_As_unsigned_long(__pyx_t_10); if (unlikely((__pyx_t_31 == (unsigned long)-1) && PyErr_Occurred())) __PYX_ERR(0, 255, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_v_ulval = __pyx_t_31; - - /* "msgpack/_packer.pyx":256 - * llval = o.seconds - * ulval = o.nanoseconds - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) # <<<<<<<<<<<<<< - * elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)): - * L = Py_SIZE(o) - */ - __pyx_v_ret = msgpack_pack_timestamp((&__pyx_v_self->pk), __pyx_v_llval, __pyx_v_ulval); - - /* "msgpack/_packer.pyx":253 - * ret = msgpack_pack_ext(&self.pk, longval, L) - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - * elif type(o) is Timestamp: # <<<<<<<<<<<<<< - * llval = o.seconds - * ulval = o.nanoseconds - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":257 - * ulval = o.nanoseconds - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - * elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)): # <<<<<<<<<<<<<< - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - */ - if (__pyx_v_strict_types) { - __pyx_t_1 = PyList_CheckExact(__pyx_v_o); - } else { - __pyx_t_32 = PyTuple_Check(__pyx_v_o); - if (!__pyx_t_32) { - } else { - __pyx_t_11 = __pyx_t_32; - goto __pyx_L52_bool_binop_done; - } - __pyx_t_32 = PyList_Check(__pyx_v_o); - __pyx_t_11 = __pyx_t_32; - __pyx_L52_bool_binop_done:; - __pyx_t_1 = __pyx_t_11; - } - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":258 - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - * elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)): - * L = Py_SIZE(o) # <<<<<<<<<<<<<< - * if L > ITEM_LIMIT: - * raise ValueError("list is too large") - */ - __pyx_v_L = Py_SIZE(__pyx_v_o); - - /* "msgpack/_packer.pyx":259 - * elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)): - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("list is too large") - * ret = msgpack_pack_array(&self.pk, L) - */ - __pyx_t_1 = (__pyx_v_L > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":260 - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - * raise ValueError("list is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_array(&self.pk, L) - * if ret == 0: - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 260, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 260, __pyx_L1_error) - - /* "msgpack/_packer.pyx":259 - * elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)): - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError("list is too large") - * ret = msgpack_pack_array(&self.pk, L) - */ - } - - /* "msgpack/_packer.pyx":261 - * if L > ITEM_LIMIT: - * raise ValueError("list is too large") - * ret = msgpack_pack_array(&self.pk, L) # <<<<<<<<<<<<<< - * if ret == 0: - * for v in o: - */ - __pyx_v_ret = msgpack_pack_array((&__pyx_v_self->pk), __pyx_v_L); - - /* "msgpack/_packer.pyx":262 - * raise ValueError("list is too large") - * ret = msgpack_pack_array(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * for v in o: - * ret = self._pack(v, nest_limit-1) - */ - __pyx_t_1 = (__pyx_v_ret == 0); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":263 - * ret = msgpack_pack_array(&self.pk, L) - * if ret == 0: - * for v in o: # <<<<<<<<<<<<<< - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - */ - if (likely(PyList_CheckExact(__pyx_v_o)) || PyTuple_CheckExact(__pyx_v_o)) { - __pyx_t_10 = __pyx_v_o; __Pyx_INCREF(__pyx_t_10); __pyx_t_28 = 0; - __pyx_t_33 = NULL; - } else { - __pyx_t_28 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_v_o); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 263, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_33 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_10); if (unlikely(!__pyx_t_33)) __PYX_ERR(0, 263, __pyx_L1_error) - } - for (;;) { - if (likely(!__pyx_t_33)) { - if (likely(PyList_CheckExact(__pyx_t_10))) { - if (__pyx_t_28 >= PyList_GET_SIZE(__pyx_t_10)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_28); __Pyx_INCREF(__pyx_t_9); __pyx_t_28++; if (unlikely((0 < 0))) __PYX_ERR(0, 263, __pyx_L1_error) - #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_10, __pyx_t_28); __pyx_t_28++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 263, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - #endif - } else { - if (__pyx_t_28 >= PyTuple_GET_SIZE(__pyx_t_10)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_28); __Pyx_INCREF(__pyx_t_9); __pyx_t_28++; if (unlikely((0 < 0))) __PYX_ERR(0, 263, __pyx_L1_error) - #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_10, __pyx_t_28); __pyx_t_28++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 263, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - #endif - } - } else { - __pyx_t_9 = __pyx_t_33(__pyx_t_10); - if (unlikely(!__pyx_t_9)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 263, __pyx_L1_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_9); - } - __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_9); - __pyx_t_9 = 0; - - /* "msgpack/_packer.pyx":264 - * if ret == 0: - * for v in o: - * ret = self._pack(v, nest_limit-1) # <<<<<<<<<<<<<< - * if ret != 0: break - * elif PyMemoryView_Check(o): - */ - __pyx_t_30.__pyx_n = 1; - __pyx_t_30.nest_limit = (__pyx_v_nest_limit - 1); - __pyx_t_15 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *)__pyx_v_self->__pyx_vtab)->_pack(__pyx_v_self, __pyx_v_v, &__pyx_t_30); if (unlikely(__pyx_t_15 == ((int)-1))) __PYX_ERR(0, 264, __pyx_L1_error) - __pyx_v_ret = __pyx_t_15; - - /* "msgpack/_packer.pyx":265 - * for v in o: - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break # <<<<<<<<<<<<<< - * elif PyMemoryView_Check(o): - * if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: - */ - __pyx_t_1 = (__pyx_v_ret != 0); - if (__pyx_t_1) { - goto __pyx_L57_break; - } - - /* "msgpack/_packer.pyx":263 - * ret = msgpack_pack_array(&self.pk, L) - * if ret == 0: - * for v in o: # <<<<<<<<<<<<<< - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - */ - } - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - goto __pyx_L59_for_end; - __pyx_L57_break:; - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - goto __pyx_L59_for_end; - __pyx_L59_for_end:; - - /* "msgpack/_packer.pyx":262 - * raise ValueError("list is too large") - * ret = msgpack_pack_array(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * for v in o: - * ret = self._pack(v, nest_limit-1) - */ - } - - /* "msgpack/_packer.pyx":257 - * ulval = o.nanoseconds - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - * elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)): # <<<<<<<<<<<<<< - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":266 - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - * elif PyMemoryView_Check(o): # <<<<<<<<<<<<<< - * if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: - * raise ValueError("could not get buffer for memoryview") - */ - __pyx_t_1 = (PyMemoryView_Check(__pyx_v_o) != 0); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":267 - * if ret != 0: break - * elif PyMemoryView_Check(o): - * if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: # <<<<<<<<<<<<<< - * raise ValueError("could not get buffer for memoryview") - * L = view.len - */ - __pyx_t_15 = PyObject_GetBuffer(__pyx_v_o, (&__pyx_v_view), PyBUF_SIMPLE); if (unlikely(__pyx_t_15 == ((int)-1))) __PYX_ERR(0, 267, __pyx_L1_error) - __pyx_t_1 = (__pyx_t_15 != 0); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":268 - * elif PyMemoryView_Check(o): - * if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: - * raise ValueError("could not get buffer for memoryview") # <<<<<<<<<<<<<< - * L = view.len - * if L > ITEM_LIMIT: - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 268, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 268, __pyx_L1_error) - - /* "msgpack/_packer.pyx":267 - * if ret != 0: break - * elif PyMemoryView_Check(o): - * if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: # <<<<<<<<<<<<<< - * raise ValueError("could not get buffer for memoryview") - * L = view.len - */ - } - - /* "msgpack/_packer.pyx":269 - * if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: - * raise ValueError("could not get buffer for memoryview") - * L = view.len # <<<<<<<<<<<<<< - * if L > ITEM_LIMIT: - * PyBuffer_Release(&view); - */ - __pyx_t_28 = __pyx_v_view.len; - __pyx_v_L = __pyx_t_28; - - /* "msgpack/_packer.pyx":270 - * raise ValueError("could not get buffer for memoryview") - * L = view.len - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * PyBuffer_Release(&view); - * raise ValueError("memoryview is too large") - */ - __pyx_t_1 = (__pyx_v_L > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":271 - * L = view.len - * if L > ITEM_LIMIT: - * PyBuffer_Release(&view); # <<<<<<<<<<<<<< - * raise ValueError("memoryview is too large") - * ret = msgpack_pack_bin(&self.pk, L) - */ - PyBuffer_Release((&__pyx_v_view)); - - /* "msgpack/_packer.pyx":272 - * if L > ITEM_LIMIT: - * PyBuffer_Release(&view); - * raise ValueError("memoryview is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 272, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 272, __pyx_L1_error) - - /* "msgpack/_packer.pyx":270 - * raise ValueError("could not get buffer for memoryview") - * L = view.len - * if L > ITEM_LIMIT: # <<<<<<<<<<<<<< - * PyBuffer_Release(&view); - * raise ValueError("memoryview is too large") - */ - } - - /* "msgpack/_packer.pyx":273 - * PyBuffer_Release(&view); - * raise ValueError("memoryview is too large") - * ret = msgpack_pack_bin(&self.pk, L) # <<<<<<<<<<<<<< - * if ret == 0: - * ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L) - */ - __pyx_v_ret = msgpack_pack_bin((&__pyx_v_self->pk), __pyx_v_L); - - /* "msgpack/_packer.pyx":274 - * raise ValueError("memoryview is too large") - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L) - * PyBuffer_Release(&view); - */ - __pyx_t_1 = (__pyx_v_ret == 0); - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":275 - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: - * ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L) # <<<<<<<<<<<<<< - * PyBuffer_Release(&view); - * elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None: - */ - __pyx_v_ret = msgpack_pack_raw_body((&__pyx_v_self->pk), ((char *)__pyx_v_view.buf), __pyx_v_L); - - /* "msgpack/_packer.pyx":274 - * raise ValueError("memoryview is too large") - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: # <<<<<<<<<<<<<< - * ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L) - * PyBuffer_Release(&view); - */ - } - - /* "msgpack/_packer.pyx":276 - * if ret == 0: - * ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L) - * PyBuffer_Release(&view); # <<<<<<<<<<<<<< - * elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None: - * delta = o - epoch - */ - PyBuffer_Release((&__pyx_v_view)); - - /* "msgpack/_packer.pyx":266 - * ret = self._pack(v, nest_limit-1) - * if ret != 0: break - * elif PyMemoryView_Check(o): # <<<<<<<<<<<<<< - * if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: - * raise ValueError("could not get buffer for memoryview") - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":277 - * ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L) - * PyBuffer_Release(&view); - * elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None: # <<<<<<<<<<<<<< - * delta = o - epoch - * if not PyDelta_CheckExact(delta): - */ - if (__pyx_v_self->datetime) { - } else { - __pyx_t_1 = __pyx_v_self->datetime; - goto __pyx_L63_bool_binop_done; - } - __pyx_t_11 = PyDateTime_CheckExact(__pyx_v_o); - if (__pyx_t_11) { - } else { - __pyx_t_1 = __pyx_t_11; - goto __pyx_L63_bool_binop_done; - } - __pyx_t_10 = __pyx_f_7cpython_8datetime_datetime_tzinfo(__pyx_v_o); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 277, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_11 = (__pyx_t_10 != Py_None); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_1 = __pyx_t_11; - __pyx_L63_bool_binop_done:; - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":278 - * PyBuffer_Release(&view); - * elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None: - * delta = o - epoch # <<<<<<<<<<<<<< - * if not PyDelta_CheckExact(delta): - * raise ValueError("failed to calculate delta") - */ - __pyx_t_10 = PyNumber_Subtract(__pyx_v_o, __pyx_v_7msgpack_9_cmsgpack_epoch); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 278, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_v_delta = __pyx_t_10; - __pyx_t_10 = 0; - - /* "msgpack/_packer.pyx":279 - * elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None: - * delta = o - epoch - * if not PyDelta_CheckExact(delta): # <<<<<<<<<<<<<< - * raise ValueError("failed to calculate delta") - * llval = timedelta_days(delta) * <long long>(24*60*60) + timedelta_seconds(delta) - */ - __pyx_t_1 = (!PyDelta_CheckExact(__pyx_v_delta)); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":280 - * delta = o - epoch - * if not PyDelta_CheckExact(delta): - * raise ValueError("failed to calculate delta") # <<<<<<<<<<<<<< - * llval = timedelta_days(delta) * <long long>(24*60*60) + timedelta_seconds(delta) - * ulval = timedelta_microseconds(delta) * 1000 - */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 280, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_Raise(__pyx_t_10, 0, 0, 0); - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(0, 280, __pyx_L1_error) - - /* "msgpack/_packer.pyx":279 - * elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None: - * delta = o - epoch - * if not PyDelta_CheckExact(delta): # <<<<<<<<<<<<<< - * raise ValueError("failed to calculate delta") - * llval = timedelta_days(delta) * <long long>(24*60*60) + timedelta_seconds(delta) - */ - } - - /* "msgpack/_packer.pyx":281 - * if not PyDelta_CheckExact(delta): - * raise ValueError("failed to calculate delta") - * llval = timedelta_days(delta) * <long long>(24*60*60) + timedelta_seconds(delta) # <<<<<<<<<<<<<< - * ulval = timedelta_microseconds(delta) * 1000 - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - */ - __pyx_t_15 = __pyx_f_7cpython_8datetime_timedelta_days(__pyx_v_delta); if (unlikely(__pyx_t_15 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 281, __pyx_L1_error) - __pyx_t_8 = __pyx_f_7cpython_8datetime_timedelta_seconds(__pyx_v_delta); if (unlikely(__pyx_t_8 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 281, __pyx_L1_error) - __pyx_v_llval = ((__pyx_t_15 * ((PY_LONG_LONG)0x15180)) + __pyx_t_8); - - /* "msgpack/_packer.pyx":282 - * raise ValueError("failed to calculate delta") - * llval = timedelta_days(delta) * <long long>(24*60*60) + timedelta_seconds(delta) - * ulval = timedelta_microseconds(delta) * 1000 # <<<<<<<<<<<<<< - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - * elif not default_used and self._default: - */ - __pyx_t_8 = __pyx_f_7cpython_8datetime_timedelta_microseconds(__pyx_v_delta); if (unlikely(__pyx_t_8 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 282, __pyx_L1_error) - __pyx_v_ulval = (__pyx_t_8 * 0x3E8); - - /* "msgpack/_packer.pyx":283 - * llval = timedelta_days(delta) * <long long>(24*60*60) + timedelta_seconds(delta) - * ulval = timedelta_microseconds(delta) * 1000 - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) # <<<<<<<<<<<<<< - * elif not default_used and self._default: - * o = self._default(o) - */ - __pyx_v_ret = msgpack_pack_timestamp((&__pyx_v_self->pk), __pyx_v_llval, __pyx_v_ulval); - - /* "msgpack/_packer.pyx":277 - * ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L) - * PyBuffer_Release(&view); - * elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None: # <<<<<<<<<<<<<< - * delta = o - epoch - * if not PyDelta_CheckExact(delta): - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":284 - * ulval = timedelta_microseconds(delta) * 1000 - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - * elif not default_used and self._default: # <<<<<<<<<<<<<< - * o = self._default(o) - * default_used = 1 - */ - __pyx_t_11 = (!(__pyx_v_default_used != 0)); - if (__pyx_t_11) { - } else { - __pyx_t_1 = __pyx_t_11; - goto __pyx_L67_bool_binop_done; - } - __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_v_self->_default); if (unlikely((__pyx_t_11 < 0))) __PYX_ERR(0, 284, __pyx_L1_error) - __pyx_t_1 = __pyx_t_11; - __pyx_L67_bool_binop_done:; - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":285 - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - * elif not default_used and self._default: - * o = self._default(o) # <<<<<<<<<<<<<< - * default_used = 1 - * continue - */ - __Pyx_INCREF(__pyx_v_self->_default); - __pyx_t_9 = __pyx_v_self->_default; __pyx_t_2 = NULL; - __pyx_t_8 = 0; - #if CYTHON_UNPACK_METHODS - if (likely(PyMethod_Check(__pyx_t_9))) { - __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_9); - if (likely(__pyx_t_2)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9); - __Pyx_INCREF(__pyx_t_2); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_9, function); - __pyx_t_8 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_2, __pyx_v_o}; - __pyx_t_10 = __Pyx_PyObject_FastCall(__pyx_t_9, __pyx_callargs+1-__pyx_t_8, 1+__pyx_t_8); - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 285, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } - __Pyx_DECREF_SET(__pyx_v_o, __pyx_t_10); - __pyx_t_10 = 0; - - /* "msgpack/_packer.pyx":286 - * elif not default_used and self._default: - * o = self._default(o) - * default_used = 1 # <<<<<<<<<<<<<< - * continue - * elif self.datetime and PyDateTime_CheckExact(o): - */ - __pyx_v_default_used = 1; - - /* "msgpack/_packer.pyx":287 - * o = self._default(o) - * default_used = 1 - * continue # <<<<<<<<<<<<<< - * elif self.datetime and PyDateTime_CheckExact(o): - * PyErr_Format(ValueError, b"can not serialize '%.200s' object where tzinfo=None", Py_TYPE(o).tp_name) - */ - goto __pyx_L4_continue; - - /* "msgpack/_packer.pyx":284 - * ulval = timedelta_microseconds(delta) * 1000 - * ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - * elif not default_used and self._default: # <<<<<<<<<<<<<< - * o = self._default(o) - * default_used = 1 - */ - } - - /* "msgpack/_packer.pyx":288 - * default_used = 1 - * continue - * elif self.datetime and PyDateTime_CheckExact(o): # <<<<<<<<<<<<<< - * PyErr_Format(ValueError, b"can not serialize '%.200s' object where tzinfo=None", Py_TYPE(o).tp_name) - * else: - */ - if (__pyx_v_self->datetime) { - } else { - __pyx_t_1 = __pyx_v_self->datetime; - goto __pyx_L69_bool_binop_done; - } - __pyx_t_11 = PyDateTime_CheckExact(__pyx_v_o); - __pyx_t_1 = __pyx_t_11; - __pyx_L69_bool_binop_done:; - if (__pyx_t_1) { - - /* "msgpack/_packer.pyx":289 - * continue - * elif self.datetime and PyDateTime_CheckExact(o): - * PyErr_Format(ValueError, b"can not serialize '%.200s' object where tzinfo=None", Py_TYPE(o).tp_name) # <<<<<<<<<<<<<< - * else: - * PyErr_Format(TypeError, b"can not serialize '%.200s' object", Py_TYPE(o).tp_name) - */ - __pyx_t_26 = PyErr_Format(__pyx_builtin_ValueError, ((char *)"can not serialize '%.200s' object where tzinfo=None"), Py_TYPE(__pyx_v_o)->tp_name); if (unlikely(__pyx_t_26 == ((PyObject *)NULL))) __PYX_ERR(0, 289, __pyx_L1_error) - - /* "msgpack/_packer.pyx":288 - * default_used = 1 - * continue - * elif self.datetime and PyDateTime_CheckExact(o): # <<<<<<<<<<<<<< - * PyErr_Format(ValueError, b"can not serialize '%.200s' object where tzinfo=None", Py_TYPE(o).tp_name) - * else: - */ - goto __pyx_L6; - } - - /* "msgpack/_packer.pyx":291 - * PyErr_Format(ValueError, b"can not serialize '%.200s' object where tzinfo=None", Py_TYPE(o).tp_name) - * else: - * PyErr_Format(TypeError, b"can not serialize '%.200s' object", Py_TYPE(o).tp_name) # <<<<<<<<<<<<<< - * return ret - * - */ - /*else*/ { - __pyx_t_26 = PyErr_Format(__pyx_builtin_TypeError, ((char *)"can not serialize '%.200s' object"), Py_TYPE(__pyx_v_o)->tp_name); if (unlikely(__pyx_t_26 == ((PyObject *)NULL))) __PYX_ERR(0, 291, __pyx_L1_error) - } - __pyx_L6:; - - /* "msgpack/_packer.pyx":292 - * else: - * PyErr_Format(TypeError, b"can not serialize '%.200s' object", Py_TYPE(o).tp_name) - * return ret # <<<<<<<<<<<<<< - * - * cpdef pack(self, object obj): - */ - __pyx_r = __pyx_v_ret; - goto __pyx_L0; - __pyx_L4_continue:; - } - - /* "msgpack/_packer.pyx":147 - * self.pk.buf = NULL - * - * cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: # <<<<<<<<<<<<<< - * cdef long long llval - * cdef unsigned long long ullval - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_12); - __Pyx_XDECREF(__pyx_t_13); - __Pyx_XDECREF(__pyx_t_14); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer._pack", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_d); - __Pyx_XDECREF(__pyx_v_oe); - __Pyx_XDECREF(__pyx_v_k); - __Pyx_XDECREF(__pyx_v_v); - __Pyx_XDECREF(__pyx_v_delta); - __Pyx_XDECREF(__pyx_v_o); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":294 - * return ret - * - * cpdef pack(self, object obj): # <<<<<<<<<<<<<< - * cdef int ret - * try: - */ - -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_7pack(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -static PyObject *__pyx_f_7msgpack_9_cmsgpack_6Packer_pack(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_obj, int __pyx_skip_dispatch) { - int __pyx_v_ret; - PyObject *__pyx_v_buf = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - struct __pyx_opt_args_7msgpack_9_cmsgpack_6Packer__pack __pyx_t_9; - int __pyx_t_10; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("pack", 0); - /* Check if called by wrapper */ - if (unlikely(__pyx_skip_dispatch)) ; - /* Check if overridden in Python */ - else if (unlikely((Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0) || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))) { - #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS - static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; - if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { - PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); - #endif - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - #ifdef __Pyx_CyFunction_USED - if (!__Pyx_IsCyOrPyCFunction(__pyx_t_1) - #else - if (!PyCFunction_Check(__pyx_t_1) - #endif - || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)(void*)__pyx_pw_7msgpack_9_cmsgpack_6Packer_7pack)) { - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_t_1); - __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL; - __pyx_t_5 = 0; - #if CYTHON_UNPACK_METHODS - if (unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - __pyx_t_5 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_4, __pyx_v_obj}; - __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 294, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - goto __pyx_L0; - } - #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS - __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); - __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self)); - if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) { - __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT; - } - #endif - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS - } - #endif - } - - /* "msgpack/_packer.pyx":296 - * cpdef pack(self, object obj): - * cdef int ret - * try: # <<<<<<<<<<<<<< - * ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) - * except: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); - __Pyx_XGOTREF(__pyx_t_6); - __Pyx_XGOTREF(__pyx_t_7); - __Pyx_XGOTREF(__pyx_t_8); - /*try:*/ { - - /* "msgpack/_packer.pyx":297 - * cdef int ret - * try: - * ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) # <<<<<<<<<<<<<< - * except: - * self.pk.length = 0 - */ - __pyx_t_9.__pyx_n = 1; - __pyx_t_9.nest_limit = __pyx_v_7msgpack_9_cmsgpack_DEFAULT_RECURSE_LIMIT; - __pyx_t_5 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *)__pyx_v_self->__pyx_vtab)->_pack(__pyx_v_self, __pyx_v_obj, &__pyx_t_9); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 297, __pyx_L3_error) - __pyx_v_ret = __pyx_t_5; - - /* "msgpack/_packer.pyx":296 - * cpdef pack(self, object obj): - * cdef int ret - * try: # <<<<<<<<<<<<<< - * ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) - * except: - */ - } - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - goto __pyx_L8_try_end; - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - - /* "msgpack/_packer.pyx":298 - * try: - * ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) - * except: # <<<<<<<<<<<<<< - * self.pk.length = 0 - * raise - */ - /*except:*/ { - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) __PYX_ERR(0, 298, __pyx_L5_except_error) - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - - /* "msgpack/_packer.pyx":299 - * ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) - * except: - * self.pk.length = 0 # <<<<<<<<<<<<<< - * raise - * if ret: # should not happen. - */ - __pyx_v_self->pk.length = 0; - - /* "msgpack/_packer.pyx":300 - * except: - * self.pk.length = 0 - * raise # <<<<<<<<<<<<<< - * if ret: # should not happen. - * raise RuntimeError("internal error") - */ - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ErrRestoreWithState(__pyx_t_1, __pyx_t_2, __pyx_t_3); - __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; - __PYX_ERR(0, 300, __pyx_L5_except_error) - } - - /* "msgpack/_packer.pyx":296 - * cpdef pack(self, object obj): - * cdef int ret - * try: # <<<<<<<<<<<<<< - * ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) - * except: - */ - __pyx_L5_except_error:; - __Pyx_XGIVEREF(__pyx_t_6); - __Pyx_XGIVEREF(__pyx_t_7); - __Pyx_XGIVEREF(__pyx_t_8); - __Pyx_ExceptionReset(__pyx_t_6, __pyx_t_7, __pyx_t_8); - goto __pyx_L1_error; - __pyx_L8_try_end:; - } - - /* "msgpack/_packer.pyx":301 - * self.pk.length = 0 - * raise - * if ret: # should not happen. # <<<<<<<<<<<<<< - * raise RuntimeError("internal error") - * if self.autoreset: - */ - __pyx_t_10 = (__pyx_v_ret != 0); - if (unlikely(__pyx_t_10)) { - - /* "msgpack/_packer.pyx":302 - * raise - * if ret: # should not happen. - * raise RuntimeError("internal error") # <<<<<<<<<<<<<< - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 302, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 302, __pyx_L1_error) - - /* "msgpack/_packer.pyx":301 - * self.pk.length = 0 - * raise - * if ret: # should not happen. # <<<<<<<<<<<<<< - * raise RuntimeError("internal error") - * if self.autoreset: - */ - } - - /* "msgpack/_packer.pyx":303 - * if ret: # should not happen. - * raise RuntimeError("internal error") - * if self.autoreset: # <<<<<<<<<<<<<< - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - */ - if (__pyx_v_self->autoreset) { - - /* "msgpack/_packer.pyx":304 - * raise RuntimeError("internal error") - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) # <<<<<<<<<<<<<< - * self.pk.length = 0 - * return buf - */ - __pyx_t_3 = PyBytes_FromStringAndSize(__pyx_v_self->pk.buf, __pyx_v_self->pk.length); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 304, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_buf = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "msgpack/_packer.pyx":305 - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 # <<<<<<<<<<<<<< - * return buf - * - */ - __pyx_v_self->pk.length = 0; - - /* "msgpack/_packer.pyx":306 - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - * return buf # <<<<<<<<<<<<<< - * - * def pack_ext_type(self, typecode, data): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_buf); - __pyx_r = __pyx_v_buf; - goto __pyx_L0; - - /* "msgpack/_packer.pyx":303 - * if ret: # should not happen. - * raise RuntimeError("internal error") - * if self.autoreset: # <<<<<<<<<<<<<< - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - */ - } - - /* "msgpack/_packer.pyx":294 - * return ret - * - * cpdef pack(self, object obj): # <<<<<<<<<<<<<< - * cdef int ret - * try: - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_buf); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_7pack(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_6pack, "Packer.pack(self, obj)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_7pack = {"pack", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_7pack, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_6pack}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_7pack(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PyObject *__pyx_v_obj = 0; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[1] = {0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("pack (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 294, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_obj,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_obj)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 294, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "pack") < 0)) __PYX_ERR(0, 294, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v_obj = values[0]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("pack", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 294, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_6pack(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self), __pyx_v_obj); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_6pack(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_obj) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("pack", 0); - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_f_7msgpack_9_cmsgpack_6Packer_pack(__pyx_v_self, __pyx_v_obj, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 294, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":308 - * return buf - * - * def pack_ext_type(self, typecode, data): # <<<<<<<<<<<<<< - * msgpack_pack_ext(&self.pk, typecode, len(data)) - * msgpack_pack_raw_body(&self.pk, data, len(data)) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_9pack_ext_type(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_8pack_ext_type, "Packer.pack_ext_type(self, typecode, data)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_9pack_ext_type = {"pack_ext_type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_9pack_ext_type, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_8pack_ext_type}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_9pack_ext_type(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PyObject *__pyx_v_typecode = 0; - PyObject *__pyx_v_data = 0; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[2] = {0,0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("pack_ext_type (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 308, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_typecode,&__pyx_n_s_data,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_typecode)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_data)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 308, __pyx_L3_error) - else { - __Pyx_RaiseArgtupleInvalid("pack_ext_type", 1, 2, 2, 1); __PYX_ERR(0, 308, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "pack_ext_type") < 0)) __PYX_ERR(0, 308, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 2)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - } - __pyx_v_typecode = values[0]; - __pyx_v_data = values[1]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("pack_ext_type", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 308, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack_ext_type", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_8pack_ext_type(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self), __pyx_v_typecode, __pyx_v_data); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_8pack_ext_type(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_typecode, PyObject *__pyx_v_data) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - char __pyx_t_1; - Py_ssize_t __pyx_t_2; - char *__pyx_t_3; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("pack_ext_type", 0); - - /* "msgpack/_packer.pyx":309 - * - * def pack_ext_type(self, typecode, data): - * msgpack_pack_ext(&self.pk, typecode, len(data)) # <<<<<<<<<<<<<< - * msgpack_pack_raw_body(&self.pk, data, len(data)) - * - */ - __pyx_t_1 = __Pyx_PyInt_As_char(__pyx_v_typecode); if (unlikely((__pyx_t_1 == (char)-1) && PyErr_Occurred())) __PYX_ERR(0, 309, __pyx_L1_error) - __pyx_t_2 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 309, __pyx_L1_error) - (void)(msgpack_pack_ext((&__pyx_v_self->pk), __pyx_t_1, __pyx_t_2)); - - /* "msgpack/_packer.pyx":310 - * def pack_ext_type(self, typecode, data): - * msgpack_pack_ext(&self.pk, typecode, len(data)) - * msgpack_pack_raw_body(&self.pk, data, len(data)) # <<<<<<<<<<<<<< - * - * def pack_array_header(self, long long size): - */ - __pyx_t_3 = __Pyx_PyObject_AsWritableString(__pyx_v_data); if (unlikely((!__pyx_t_3) && PyErr_Occurred())) __PYX_ERR(0, 310, __pyx_L1_error) - __pyx_t_2 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1))) __PYX_ERR(0, 310, __pyx_L1_error) - (void)(msgpack_pack_raw_body((&__pyx_v_self->pk), __pyx_t_3, __pyx_t_2)); - - /* "msgpack/_packer.pyx":308 - * return buf - * - * def pack_ext_type(self, typecode, data): # <<<<<<<<<<<<<< - * msgpack_pack_ext(&self.pk, typecode, len(data)) - * msgpack_pack_raw_body(&self.pk, data, len(data)) - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack_ext_type", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":312 - * msgpack_pack_raw_body(&self.pk, data, len(data)) - * - * def pack_array_header(self, long long size): # <<<<<<<<<<<<<< - * if size > ITEM_LIMIT: - * raise ValueError - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_11pack_array_header(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_10pack_array_header, "Packer.pack_array_header(self, long long size)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_11pack_array_header = {"pack_array_header", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_11pack_array_header, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_10pack_array_header}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_11pack_array_header(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PY_LONG_LONG __pyx_v_size; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[1] = {0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("pack_array_header (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 312, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_size,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_size)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 312, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "pack_array_header") < 0)) __PYX_ERR(0, 312, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v_size = __Pyx_PyInt_As_PY_LONG_LONG(values[0]); if (unlikely((__pyx_v_size == (PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 312, __pyx_L3_error) - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("pack_array_header", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 312, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack_array_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_10pack_array_header(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self), __pyx_v_size); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_10pack_array_header(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PY_LONG_LONG __pyx_v_size) { - int __pyx_v_ret; - PyObject *__pyx_v_buf = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("pack_array_header", 0); - - /* "msgpack/_packer.pyx":313 - * - * def pack_array_header(self, long long size): - * if size > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError - * cdef int ret = msgpack_pack_array(&self.pk, size) - */ - __pyx_t_1 = (__pyx_v_size > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":314 - * def pack_array_header(self, long long size): - * if size > ITEM_LIMIT: - * raise ValueError # <<<<<<<<<<<<<< - * cdef int ret = msgpack_pack_array(&self.pk, size) - * if ret == -1: - */ - __Pyx_Raise(__pyx_builtin_ValueError, 0, 0, 0); - __PYX_ERR(0, 314, __pyx_L1_error) - - /* "msgpack/_packer.pyx":313 - * - * def pack_array_header(self, long long size): - * if size > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError - * cdef int ret = msgpack_pack_array(&self.pk, size) - */ - } - - /* "msgpack/_packer.pyx":315 - * if size > ITEM_LIMIT: - * raise ValueError - * cdef int ret = msgpack_pack_array(&self.pk, size) # <<<<<<<<<<<<<< - * if ret == -1: - * raise MemoryError - */ - __pyx_v_ret = msgpack_pack_array((&__pyx_v_self->pk), __pyx_v_size); - - /* "msgpack/_packer.pyx":316 - * raise ValueError - * cdef int ret = msgpack_pack_array(&self.pk, size) - * if ret == -1: # <<<<<<<<<<<<<< - * raise MemoryError - * elif ret: # should not happen - */ - __pyx_t_1 = (__pyx_v_ret == -1L); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":317 - * cdef int ret = msgpack_pack_array(&self.pk, size) - * if ret == -1: - * raise MemoryError # <<<<<<<<<<<<<< - * elif ret: # should not happen - * raise TypeError - */ - PyErr_NoMemory(); __PYX_ERR(0, 317, __pyx_L1_error) - - /* "msgpack/_packer.pyx":316 - * raise ValueError - * cdef int ret = msgpack_pack_array(&self.pk, size) - * if ret == -1: # <<<<<<<<<<<<<< - * raise MemoryError - * elif ret: # should not happen - */ - } - - /* "msgpack/_packer.pyx":318 - * if ret == -1: - * raise MemoryError - * elif ret: # should not happen # <<<<<<<<<<<<<< - * raise TypeError - * if self.autoreset: - */ - __pyx_t_1 = (__pyx_v_ret != 0); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":319 - * raise MemoryError - * elif ret: # should not happen - * raise TypeError # <<<<<<<<<<<<<< - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - __Pyx_Raise(__pyx_builtin_TypeError, 0, 0, 0); - __PYX_ERR(0, 319, __pyx_L1_error) - - /* "msgpack/_packer.pyx":318 - * if ret == -1: - * raise MemoryError - * elif ret: # should not happen # <<<<<<<<<<<<<< - * raise TypeError - * if self.autoreset: - */ - } - - /* "msgpack/_packer.pyx":320 - * elif ret: # should not happen - * raise TypeError - * if self.autoreset: # <<<<<<<<<<<<<< - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - */ - if (__pyx_v_self->autoreset) { - - /* "msgpack/_packer.pyx":321 - * raise TypeError - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) # <<<<<<<<<<<<<< - * self.pk.length = 0 - * return buf - */ - __pyx_t_2 = PyBytes_FromStringAndSize(__pyx_v_self->pk.buf, __pyx_v_self->pk.length); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 321, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v_buf = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - - /* "msgpack/_packer.pyx":322 - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 # <<<<<<<<<<<<<< - * return buf - * - */ - __pyx_v_self->pk.length = 0; - - /* "msgpack/_packer.pyx":323 - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - * return buf # <<<<<<<<<<<<<< - * - * def pack_map_header(self, long long size): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_buf); - __pyx_r = __pyx_v_buf; - goto __pyx_L0; - - /* "msgpack/_packer.pyx":320 - * elif ret: # should not happen - * raise TypeError - * if self.autoreset: # <<<<<<<<<<<<<< - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - */ - } - - /* "msgpack/_packer.pyx":312 - * msgpack_pack_raw_body(&self.pk, data, len(data)) - * - * def pack_array_header(self, long long size): # <<<<<<<<<<<<<< - * if size > ITEM_LIMIT: - * raise ValueError - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack_array_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_buf); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":325 - * return buf - * - * def pack_map_header(self, long long size): # <<<<<<<<<<<<<< - * if size > ITEM_LIMIT: - * raise ValueError - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_13pack_map_header(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_12pack_map_header, "Packer.pack_map_header(self, long long size)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_13pack_map_header = {"pack_map_header", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_13pack_map_header, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_12pack_map_header}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_13pack_map_header(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PY_LONG_LONG __pyx_v_size; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[1] = {0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("pack_map_header (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 325, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_size,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_size)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 325, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "pack_map_header") < 0)) __PYX_ERR(0, 325, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v_size = __Pyx_PyInt_As_PY_LONG_LONG(values[0]); if (unlikely((__pyx_v_size == (PY_LONG_LONG)-1) && PyErr_Occurred())) __PYX_ERR(0, 325, __pyx_L3_error) - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("pack_map_header", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 325, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack_map_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_12pack_map_header(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self), __pyx_v_size); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_12pack_map_header(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PY_LONG_LONG __pyx_v_size) { - int __pyx_v_ret; - PyObject *__pyx_v_buf = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("pack_map_header", 0); - - /* "msgpack/_packer.pyx":326 - * - * def pack_map_header(self, long long size): - * if size > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError - * cdef int ret = msgpack_pack_map(&self.pk, size) - */ - __pyx_t_1 = (__pyx_v_size > __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":327 - * def pack_map_header(self, long long size): - * if size > ITEM_LIMIT: - * raise ValueError # <<<<<<<<<<<<<< - * cdef int ret = msgpack_pack_map(&self.pk, size) - * if ret == -1: - */ - __Pyx_Raise(__pyx_builtin_ValueError, 0, 0, 0); - __PYX_ERR(0, 327, __pyx_L1_error) - - /* "msgpack/_packer.pyx":326 - * - * def pack_map_header(self, long long size): - * if size > ITEM_LIMIT: # <<<<<<<<<<<<<< - * raise ValueError - * cdef int ret = msgpack_pack_map(&self.pk, size) - */ - } - - /* "msgpack/_packer.pyx":328 - * if size > ITEM_LIMIT: - * raise ValueError - * cdef int ret = msgpack_pack_map(&self.pk, size) # <<<<<<<<<<<<<< - * if ret == -1: - * raise MemoryError - */ - __pyx_v_ret = msgpack_pack_map((&__pyx_v_self->pk), __pyx_v_size); - - /* "msgpack/_packer.pyx":329 - * raise ValueError - * cdef int ret = msgpack_pack_map(&self.pk, size) - * if ret == -1: # <<<<<<<<<<<<<< - * raise MemoryError - * elif ret: # should not happen - */ - __pyx_t_1 = (__pyx_v_ret == -1L); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":330 - * cdef int ret = msgpack_pack_map(&self.pk, size) - * if ret == -1: - * raise MemoryError # <<<<<<<<<<<<<< - * elif ret: # should not happen - * raise TypeError - */ - PyErr_NoMemory(); __PYX_ERR(0, 330, __pyx_L1_error) - - /* "msgpack/_packer.pyx":329 - * raise ValueError - * cdef int ret = msgpack_pack_map(&self.pk, size) - * if ret == -1: # <<<<<<<<<<<<<< - * raise MemoryError - * elif ret: # should not happen - */ - } - - /* "msgpack/_packer.pyx":331 - * if ret == -1: - * raise MemoryError - * elif ret: # should not happen # <<<<<<<<<<<<<< - * raise TypeError - * if self.autoreset: - */ - __pyx_t_1 = (__pyx_v_ret != 0); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_packer.pyx":332 - * raise MemoryError - * elif ret: # should not happen - * raise TypeError # <<<<<<<<<<<<<< - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - __Pyx_Raise(__pyx_builtin_TypeError, 0, 0, 0); - __PYX_ERR(0, 332, __pyx_L1_error) - - /* "msgpack/_packer.pyx":331 - * if ret == -1: - * raise MemoryError - * elif ret: # should not happen # <<<<<<<<<<<<<< - * raise TypeError - * if self.autoreset: - */ - } - - /* "msgpack/_packer.pyx":333 - * elif ret: # should not happen - * raise TypeError - * if self.autoreset: # <<<<<<<<<<<<<< - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - */ - if (__pyx_v_self->autoreset) { - - /* "msgpack/_packer.pyx":334 - * raise TypeError - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) # <<<<<<<<<<<<<< - * self.pk.length = 0 - * return buf - */ - __pyx_t_2 = PyBytes_FromStringAndSize(__pyx_v_self->pk.buf, __pyx_v_self->pk.length); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 334, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v_buf = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - - /* "msgpack/_packer.pyx":335 - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 # <<<<<<<<<<<<<< - * return buf - * - */ - __pyx_v_self->pk.length = 0; - - /* "msgpack/_packer.pyx":336 - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - * return buf # <<<<<<<<<<<<<< - * - * def pack_map_pairs(self, object pairs): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_buf); - __pyx_r = __pyx_v_buf; - goto __pyx_L0; - - /* "msgpack/_packer.pyx":333 - * elif ret: # should not happen - * raise TypeError - * if self.autoreset: # <<<<<<<<<<<<<< - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - */ - } - - /* "msgpack/_packer.pyx":325 - * return buf - * - * def pack_map_header(self, long long size): # <<<<<<<<<<<<<< - * if size > ITEM_LIMIT: - * raise ValueError - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack_map_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_buf); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":338 - * return buf - * - * def pack_map_pairs(self, object pairs): # <<<<<<<<<<<<<< - * """ - * Pack *pairs* as msgpack map type. - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_15pack_map_pairs(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_14pack_map_pairs, "Packer.pack_map_pairs(self, pairs)\n\n Pack *pairs* as msgpack map type.\n\n *pairs* should be a sequence of pairs.\n (`len(pairs)` and `for k, v in pairs:` should be supported.)\n "); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_15pack_map_pairs = {"pack_map_pairs", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_15pack_map_pairs, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_14pack_map_pairs}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_15pack_map_pairs(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PyObject *__pyx_v_pairs = 0; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[1] = {0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("pack_map_pairs (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 338, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pairs,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pairs)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 338, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "pack_map_pairs") < 0)) __PYX_ERR(0, 338, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v_pairs = values[0]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("pack_map_pairs", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 338, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack_map_pairs", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_14pack_map_pairs(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self), __pyx_v_pairs); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_14pack_map_pairs(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, PyObject *__pyx_v_pairs) { - int __pyx_v_ret; - PyObject *__pyx_v_k = NULL; - PyObject *__pyx_v_v = NULL; - PyObject *__pyx_v_buf = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *(*__pyx_t_4)(PyObject *); - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *(*__pyx_t_9)(PyObject *); - int __pyx_t_10; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("pack_map_pairs", 0); - - /* "msgpack/_packer.pyx":345 - * (`len(pairs)` and `for k, v in pairs:` should be supported.) - * """ - * cdef int ret = msgpack_pack_map(&self.pk, len(pairs)) # <<<<<<<<<<<<<< - * if ret == 0: - * for k, v in pairs: - */ - __pyx_t_1 = PyObject_Length(__pyx_v_pairs); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 345, __pyx_L1_error) - __pyx_v_ret = msgpack_pack_map((&__pyx_v_self->pk), __pyx_t_1); - - /* "msgpack/_packer.pyx":346 - * """ - * cdef int ret = msgpack_pack_map(&self.pk, len(pairs)) - * if ret == 0: # <<<<<<<<<<<<<< - * for k, v in pairs: - * ret = self._pack(k) - */ - __pyx_t_2 = (__pyx_v_ret == 0); - if (__pyx_t_2) { - - /* "msgpack/_packer.pyx":347 - * cdef int ret = msgpack_pack_map(&self.pk, len(pairs)) - * if ret == 0: - * for k, v in pairs: # <<<<<<<<<<<<<< - * ret = self._pack(k) - * if ret != 0: break - */ - if (likely(PyList_CheckExact(__pyx_v_pairs)) || PyTuple_CheckExact(__pyx_v_pairs)) { - __pyx_t_3 = __pyx_v_pairs; __Pyx_INCREF(__pyx_t_3); __pyx_t_1 = 0; - __pyx_t_4 = NULL; - } else { - __pyx_t_1 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_pairs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 347, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 347, __pyx_L1_error) - } - for (;;) { - if (likely(!__pyx_t_4)) { - if (likely(PyList_CheckExact(__pyx_t_3))) { - if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely((0 < 0))) __PYX_ERR(0, 347, __pyx_L1_error) - #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 347, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } else { - if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely((0 < 0))) __PYX_ERR(0, 347, __pyx_L1_error) - #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 347, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } - } else { - __pyx_t_5 = __pyx_t_4(__pyx_t_3); - if (unlikely(!__pyx_t_5)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 347, __pyx_L1_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_5); - } - if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) { - PyObject* sequence = __pyx_t_5; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 347, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - if (likely(PyTuple_CheckExact(sequence))) { - __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); - } else { - __pyx_t_6 = PyList_GET_ITEM(sequence, 0); - __pyx_t_7 = PyList_GET_ITEM(sequence, 1); - } - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(__pyx_t_7); - #else - __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 347, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 347, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - #endif - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } else { - Py_ssize_t index = -1; - __pyx_t_8 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 347, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_9 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_8); - index = 0; __pyx_t_6 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_6)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_6); - index = 1; __pyx_t_7 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_7)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_7); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) __PYX_ERR(0, 347, __pyx_L1_error) - __pyx_t_9 = NULL; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - goto __pyx_L7_unpacking_done; - __pyx_L6_unpacking_failed:; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_9 = NULL; - if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 347, __pyx_L1_error) - __pyx_L7_unpacking_done:; - } - __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_6); - __pyx_t_6 = 0; - __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_7); - __pyx_t_7 = 0; - - /* "msgpack/_packer.pyx":348 - * if ret == 0: - * for k, v in pairs: - * ret = self._pack(k) # <<<<<<<<<<<<<< - * if ret != 0: break - * ret = self._pack(v) - */ - __pyx_t_10 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *)__pyx_v_self->__pyx_vtab)->_pack(__pyx_v_self, __pyx_v_k, NULL); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 348, __pyx_L1_error) - __pyx_v_ret = __pyx_t_10; - - /* "msgpack/_packer.pyx":349 - * for k, v in pairs: - * ret = self._pack(k) - * if ret != 0: break # <<<<<<<<<<<<<< - * ret = self._pack(v) - * if ret != 0: break - */ - __pyx_t_2 = (__pyx_v_ret != 0); - if (__pyx_t_2) { - goto __pyx_L5_break; - } - - /* "msgpack/_packer.pyx":350 - * ret = self._pack(k) - * if ret != 0: break - * ret = self._pack(v) # <<<<<<<<<<<<<< - * if ret != 0: break - * if ret == -1: - */ - __pyx_t_10 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer *)__pyx_v_self->__pyx_vtab)->_pack(__pyx_v_self, __pyx_v_v, NULL); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 350, __pyx_L1_error) - __pyx_v_ret = __pyx_t_10; - - /* "msgpack/_packer.pyx":351 - * if ret != 0: break - * ret = self._pack(v) - * if ret != 0: break # <<<<<<<<<<<<<< - * if ret == -1: - * raise MemoryError - */ - __pyx_t_2 = (__pyx_v_ret != 0); - if (__pyx_t_2) { - goto __pyx_L5_break; - } - - /* "msgpack/_packer.pyx":347 - * cdef int ret = msgpack_pack_map(&self.pk, len(pairs)) - * if ret == 0: - * for k, v in pairs: # <<<<<<<<<<<<<< - * ret = self._pack(k) - * if ret != 0: break - */ - } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L10_for_end; - __pyx_L5_break:; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L10_for_end; - __pyx_L10_for_end:; - - /* "msgpack/_packer.pyx":346 - * """ - * cdef int ret = msgpack_pack_map(&self.pk, len(pairs)) - * if ret == 0: # <<<<<<<<<<<<<< - * for k, v in pairs: - * ret = self._pack(k) - */ - } - - /* "msgpack/_packer.pyx":352 - * ret = self._pack(v) - * if ret != 0: break - * if ret == -1: # <<<<<<<<<<<<<< - * raise MemoryError - * elif ret: # should not happen - */ - __pyx_t_2 = (__pyx_v_ret == -1L); - if (unlikely(__pyx_t_2)) { - - /* "msgpack/_packer.pyx":353 - * if ret != 0: break - * if ret == -1: - * raise MemoryError # <<<<<<<<<<<<<< - * elif ret: # should not happen - * raise TypeError - */ - PyErr_NoMemory(); __PYX_ERR(0, 353, __pyx_L1_error) - - /* "msgpack/_packer.pyx":352 - * ret = self._pack(v) - * if ret != 0: break - * if ret == -1: # <<<<<<<<<<<<<< - * raise MemoryError - * elif ret: # should not happen - */ - } - - /* "msgpack/_packer.pyx":354 - * if ret == -1: - * raise MemoryError - * elif ret: # should not happen # <<<<<<<<<<<<<< - * raise TypeError - * if self.autoreset: - */ - __pyx_t_2 = (__pyx_v_ret != 0); - if (unlikely(__pyx_t_2)) { - - /* "msgpack/_packer.pyx":355 - * raise MemoryError - * elif ret: # should not happen - * raise TypeError # <<<<<<<<<<<<<< - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - __Pyx_Raise(__pyx_builtin_TypeError, 0, 0, 0); - __PYX_ERR(0, 355, __pyx_L1_error) - - /* "msgpack/_packer.pyx":354 - * if ret == -1: - * raise MemoryError - * elif ret: # should not happen # <<<<<<<<<<<<<< - * raise TypeError - * if self.autoreset: - */ - } - - /* "msgpack/_packer.pyx":356 - * elif ret: # should not happen - * raise TypeError - * if self.autoreset: # <<<<<<<<<<<<<< - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - */ - if (__pyx_v_self->autoreset) { - - /* "msgpack/_packer.pyx":357 - * raise TypeError - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) # <<<<<<<<<<<<<< - * self.pk.length = 0 - * return buf - */ - __pyx_t_3 = PyBytes_FromStringAndSize(__pyx_v_self->pk.buf, __pyx_v_self->pk.length); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 357, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_buf = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "msgpack/_packer.pyx":358 - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 # <<<<<<<<<<<<<< - * return buf - * - */ - __pyx_v_self->pk.length = 0; - - /* "msgpack/_packer.pyx":359 - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - * return buf # <<<<<<<<<<<<<< - * - * def reset(self): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_buf); - __pyx_r = __pyx_v_buf; - goto __pyx_L0; - - /* "msgpack/_packer.pyx":356 - * elif ret: # should not happen - * raise TypeError - * if self.autoreset: # <<<<<<<<<<<<<< - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * self.pk.length = 0 - */ - } - - /* "msgpack/_packer.pyx":338 - * return buf - * - * def pack_map_pairs(self, object pairs): # <<<<<<<<<<<<<< - * """ - * Pack *pairs* as msgpack map type. - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.pack_map_pairs", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_k); - __Pyx_XDECREF(__pyx_v_v); - __Pyx_XDECREF(__pyx_v_buf); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":361 - * return buf - * - * def reset(self): # <<<<<<<<<<<<<< - * """Reset internal buffer. - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_17reset(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_16reset, "Packer.reset(self)\nReset internal buffer.\n\n This method is useful only when autoreset=False.\n "); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_17reset = {"reset", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_17reset, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_16reset}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_17reset(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("reset (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 361, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("reset", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "reset", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.reset", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_16reset(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_16reset(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("reset", 0); - - /* "msgpack/_packer.pyx":366 - * This method is useful only when autoreset=False. - * """ - * self.pk.length = 0 # <<<<<<<<<<<<<< - * - * def bytes(self): - */ - __pyx_v_self->pk.length = 0; - - /* "msgpack/_packer.pyx":361 - * return buf - * - * def reset(self): # <<<<<<<<<<<<<< - * """Reset internal buffer. - * - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":368 - * self.pk.length = 0 - * - * def bytes(self): # <<<<<<<<<<<<<< - * """Return internal buffer contents as bytes object""" - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_19bytes(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_18bytes, "Packer.bytes(self)\nReturn internal buffer contents as bytes object"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_19bytes = {"bytes", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_19bytes, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_18bytes}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_19bytes(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("bytes (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 368, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("bytes", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "bytes", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.bytes", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_18bytes(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_18bytes(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("bytes", 0); - - /* "msgpack/_packer.pyx":370 - * def bytes(self): - * """Return internal buffer contents as bytes object""" - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) # <<<<<<<<<<<<<< - * - * def getbuffer(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyBytes_FromStringAndSize(__pyx_v_self->pk.buf, __pyx_v_self->pk.length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 370, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "msgpack/_packer.pyx":368 - * self.pk.length = 0 - * - * def bytes(self): # <<<<<<<<<<<<<< - * """Return internal buffer contents as bytes object""" - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.bytes", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_packer.pyx":372 - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * - * def getbuffer(self): # <<<<<<<<<<<<<< - * """Return view of internal buffer.""" - * return buff_to_buff(self.pk.buf, self.pk.length) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_21getbuffer(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_20getbuffer, "Packer.getbuffer(self)\nReturn view of internal buffer."); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_21getbuffer = {"getbuffer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_21getbuffer, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_20getbuffer}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_21getbuffer(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("getbuffer (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 372, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("getbuffer", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "getbuffer", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.getbuffer", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_20getbuffer(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_20getbuffer(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("getbuffer", 0); - - /* "msgpack/_packer.pyx":374 - * def getbuffer(self): - * """Return view of internal buffer.""" - * return buff_to_buff(self.pk.buf, self.pk.length) # <<<<<<<<<<<<<< - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = buff_to_buff(__pyx_v_self->pk.buf, __pyx_v_self->pk.length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 374, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "msgpack/_packer.pyx":372 - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * - * def getbuffer(self): # <<<<<<<<<<<<<< - * """Return view of internal buffer.""" - * return buff_to_buff(self.pk.buf, self.pk.length) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.getbuffer", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_23__reduce_cython__(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_22__reduce_cython__, "Packer.__reduce_cython__(self)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_23__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_23__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_22__reduce_cython__}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_23__reduce_cython__(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(4, 1, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_22__reduce_cython__(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_22__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); - __PYX_ERR(4, 2, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_25__setstate_cython__(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_6Packer_24__setstate_cython__, "Packer.__setstate_cython__(self, __pyx_state)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_6Packer_25__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_25__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_24__setstate_cython__}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_6Packer_25__setstate_cython__(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[1] = {0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(4, 3, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 3, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(4, 3, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v___pyx_state = values[0]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(4, 3, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_6Packer_24__setstate_cython__(((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)__pyx_v_self), __pyx_v___pyx_state); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_6Packer_24__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7msgpack_9_cmsgpack_Packer *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< - */ - __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); - __PYX_ERR(4, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Packer.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":60 - * void unpack_clear(unpack_context* ctx) - * - * cdef inline init_ctx(unpack_context *ctx, # <<<<<<<<<<<<<< - * object object_hook, object object_pairs_hook, - * object list_hook, object ext_hook, - */ - -static CYTHON_INLINE PyObject *__pyx_f_7msgpack_9_cmsgpack_init_ctx(unpack_context *__pyx_v_ctx, PyObject *__pyx_v_object_hook, PyObject *__pyx_v_object_pairs_hook, PyObject *__pyx_v_list_hook, PyObject *__pyx_v_ext_hook, int __pyx_v_use_list, int __pyx_v_raw, int __pyx_v_timestamp, int __pyx_v_strict_map_key, char const *__pyx_v_unicode_errors, Py_ssize_t __pyx_v_max_str_len, Py_ssize_t __pyx_v_max_bin_len, Py_ssize_t __pyx_v_max_array_len, Py_ssize_t __pyx_v_max_map_len, Py_ssize_t __pyx_v_max_ext_len) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("init_ctx", 0); - - /* "msgpack/_unpacker.pyx":69 - * Py_ssize_t max_array_len, Py_ssize_t max_map_len, - * Py_ssize_t max_ext_len): - * unpack_init(ctx) # <<<<<<<<<<<<<< - * ctx.user.use_list = use_list - * ctx.user.raw = raw - */ - unpack_init(__pyx_v_ctx); - - /* "msgpack/_unpacker.pyx":70 - * Py_ssize_t max_ext_len): - * unpack_init(ctx) - * ctx.user.use_list = use_list # <<<<<<<<<<<<<< - * ctx.user.raw = raw - * ctx.user.strict_map_key = strict_map_key - */ - __pyx_v_ctx->user.use_list = __pyx_v_use_list; - - /* "msgpack/_unpacker.pyx":71 - * unpack_init(ctx) - * ctx.user.use_list = use_list - * ctx.user.raw = raw # <<<<<<<<<<<<<< - * ctx.user.strict_map_key = strict_map_key - * ctx.user.object_hook = ctx.user.list_hook = <PyObject*>NULL - */ - __pyx_v_ctx->user.raw = __pyx_v_raw; - - /* "msgpack/_unpacker.pyx":72 - * ctx.user.use_list = use_list - * ctx.user.raw = raw - * ctx.user.strict_map_key = strict_map_key # <<<<<<<<<<<<<< - * ctx.user.object_hook = ctx.user.list_hook = <PyObject*>NULL - * ctx.user.max_str_len = max_str_len - */ - __pyx_v_ctx->user.strict_map_key = __pyx_v_strict_map_key; - - /* "msgpack/_unpacker.pyx":73 - * ctx.user.raw = raw - * ctx.user.strict_map_key = strict_map_key - * ctx.user.object_hook = ctx.user.list_hook = <PyObject*>NULL # <<<<<<<<<<<<<< - * ctx.user.max_str_len = max_str_len - * ctx.user.max_bin_len = max_bin_len - */ - __pyx_v_ctx->user.object_hook = ((PyObject *)NULL); - __pyx_v_ctx->user.list_hook = ((PyObject *)NULL); - - /* "msgpack/_unpacker.pyx":74 - * ctx.user.strict_map_key = strict_map_key - * ctx.user.object_hook = ctx.user.list_hook = <PyObject*>NULL - * ctx.user.max_str_len = max_str_len # <<<<<<<<<<<<<< - * ctx.user.max_bin_len = max_bin_len - * ctx.user.max_array_len = max_array_len - */ - __pyx_v_ctx->user.max_str_len = __pyx_v_max_str_len; - - /* "msgpack/_unpacker.pyx":75 - * ctx.user.object_hook = ctx.user.list_hook = <PyObject*>NULL - * ctx.user.max_str_len = max_str_len - * ctx.user.max_bin_len = max_bin_len # <<<<<<<<<<<<<< - * ctx.user.max_array_len = max_array_len - * ctx.user.max_map_len = max_map_len - */ - __pyx_v_ctx->user.max_bin_len = __pyx_v_max_bin_len; - - /* "msgpack/_unpacker.pyx":76 - * ctx.user.max_str_len = max_str_len - * ctx.user.max_bin_len = max_bin_len - * ctx.user.max_array_len = max_array_len # <<<<<<<<<<<<<< - * ctx.user.max_map_len = max_map_len - * ctx.user.max_ext_len = max_ext_len - */ - __pyx_v_ctx->user.max_array_len = __pyx_v_max_array_len; - - /* "msgpack/_unpacker.pyx":77 - * ctx.user.max_bin_len = max_bin_len - * ctx.user.max_array_len = max_array_len - * ctx.user.max_map_len = max_map_len # <<<<<<<<<<<<<< - * ctx.user.max_ext_len = max_ext_len - * - */ - __pyx_v_ctx->user.max_map_len = __pyx_v_max_map_len; - - /* "msgpack/_unpacker.pyx":78 - * ctx.user.max_array_len = max_array_len - * ctx.user.max_map_len = max_map_len - * ctx.user.max_ext_len = max_ext_len # <<<<<<<<<<<<<< - * - * if object_hook is not None and object_pairs_hook is not None: - */ - __pyx_v_ctx->user.max_ext_len = __pyx_v_max_ext_len; - - /* "msgpack/_unpacker.pyx":80 - * ctx.user.max_ext_len = max_ext_len - * - * if object_hook is not None and object_pairs_hook is not None: # <<<<<<<<<<<<<< - * raise TypeError("object_pairs_hook and object_hook are mutually exclusive.") - * - */ - __pyx_t_2 = (__pyx_v_object_hook != Py_None); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = (__pyx_v_object_pairs_hook != Py_None); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":81 - * - * if object_hook is not None and object_pairs_hook is not None: - * raise TypeError("object_pairs_hook and object_hook are mutually exclusive.") # <<<<<<<<<<<<<< - * - * if object_hook is not None: - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 81, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 81, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":80 - * ctx.user.max_ext_len = max_ext_len - * - * if object_hook is not None and object_pairs_hook is not None: # <<<<<<<<<<<<<< - * raise TypeError("object_pairs_hook and object_hook are mutually exclusive.") - * - */ - } - - /* "msgpack/_unpacker.pyx":83 - * raise TypeError("object_pairs_hook and object_hook are mutually exclusive.") - * - * if object_hook is not None: # <<<<<<<<<<<<<< - * if not PyCallable_Check(object_hook): - * raise TypeError("object_hook must be a callable.") - */ - __pyx_t_1 = (__pyx_v_object_hook != Py_None); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":84 - * - * if object_hook is not None: - * if not PyCallable_Check(object_hook): # <<<<<<<<<<<<<< - * raise TypeError("object_hook must be a callable.") - * ctx.user.object_hook = <PyObject*>object_hook - */ - __pyx_t_1 = (!PyCallable_Check(__pyx_v_object_hook)); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":85 - * if object_hook is not None: - * if not PyCallable_Check(object_hook): - * raise TypeError("object_hook must be a callable.") # <<<<<<<<<<<<<< - * ctx.user.object_hook = <PyObject*>object_hook - * - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 85, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 85, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":84 - * - * if object_hook is not None: - * if not PyCallable_Check(object_hook): # <<<<<<<<<<<<<< - * raise TypeError("object_hook must be a callable.") - * ctx.user.object_hook = <PyObject*>object_hook - */ - } - - /* "msgpack/_unpacker.pyx":86 - * if not PyCallable_Check(object_hook): - * raise TypeError("object_hook must be a callable.") - * ctx.user.object_hook = <PyObject*>object_hook # <<<<<<<<<<<<<< - * - * if object_pairs_hook is None: - */ - __pyx_v_ctx->user.object_hook = ((PyObject *)__pyx_v_object_hook); - - /* "msgpack/_unpacker.pyx":83 - * raise TypeError("object_pairs_hook and object_hook are mutually exclusive.") - * - * if object_hook is not None: # <<<<<<<<<<<<<< - * if not PyCallable_Check(object_hook): - * raise TypeError("object_hook must be a callable.") - */ - } - - /* "msgpack/_unpacker.pyx":88 - * ctx.user.object_hook = <PyObject*>object_hook - * - * if object_pairs_hook is None: # <<<<<<<<<<<<<< - * ctx.user.has_pairs_hook = False - * else: - */ - __pyx_t_1 = (__pyx_v_object_pairs_hook == Py_None); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":89 - * - * if object_pairs_hook is None: - * ctx.user.has_pairs_hook = False # <<<<<<<<<<<<<< - * else: - * if not PyCallable_Check(object_pairs_hook): - */ - __pyx_v_ctx->user.has_pairs_hook = 0; - - /* "msgpack/_unpacker.pyx":88 - * ctx.user.object_hook = <PyObject*>object_hook - * - * if object_pairs_hook is None: # <<<<<<<<<<<<<< - * ctx.user.has_pairs_hook = False - * else: - */ - goto __pyx_L8; - } - - /* "msgpack/_unpacker.pyx":91 - * ctx.user.has_pairs_hook = False - * else: - * if not PyCallable_Check(object_pairs_hook): # <<<<<<<<<<<<<< - * raise TypeError("object_pairs_hook must be a callable.") - * ctx.user.object_hook = <PyObject*>object_pairs_hook - */ - /*else*/ { - __pyx_t_1 = (!PyCallable_Check(__pyx_v_object_pairs_hook)); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":92 - * else: - * if not PyCallable_Check(object_pairs_hook): - * raise TypeError("object_pairs_hook must be a callable.") # <<<<<<<<<<<<<< - * ctx.user.object_hook = <PyObject*>object_pairs_hook - * ctx.user.has_pairs_hook = True - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 92, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 92, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":91 - * ctx.user.has_pairs_hook = False - * else: - * if not PyCallable_Check(object_pairs_hook): # <<<<<<<<<<<<<< - * raise TypeError("object_pairs_hook must be a callable.") - * ctx.user.object_hook = <PyObject*>object_pairs_hook - */ - } - - /* "msgpack/_unpacker.pyx":93 - * if not PyCallable_Check(object_pairs_hook): - * raise TypeError("object_pairs_hook must be a callable.") - * ctx.user.object_hook = <PyObject*>object_pairs_hook # <<<<<<<<<<<<<< - * ctx.user.has_pairs_hook = True - * - */ - __pyx_v_ctx->user.object_hook = ((PyObject *)__pyx_v_object_pairs_hook); - - /* "msgpack/_unpacker.pyx":94 - * raise TypeError("object_pairs_hook must be a callable.") - * ctx.user.object_hook = <PyObject*>object_pairs_hook - * ctx.user.has_pairs_hook = True # <<<<<<<<<<<<<< - * - * if list_hook is not None: - */ - __pyx_v_ctx->user.has_pairs_hook = 1; - } - __pyx_L8:; - - /* "msgpack/_unpacker.pyx":96 - * ctx.user.has_pairs_hook = True - * - * if list_hook is not None: # <<<<<<<<<<<<<< - * if not PyCallable_Check(list_hook): - * raise TypeError("list_hook must be a callable.") - */ - __pyx_t_1 = (__pyx_v_list_hook != Py_None); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":97 - * - * if list_hook is not None: - * if not PyCallable_Check(list_hook): # <<<<<<<<<<<<<< - * raise TypeError("list_hook must be a callable.") - * ctx.user.list_hook = <PyObject*>list_hook - */ - __pyx_t_1 = (!PyCallable_Check(__pyx_v_list_hook)); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":98 - * if list_hook is not None: - * if not PyCallable_Check(list_hook): - * raise TypeError("list_hook must be a callable.") # <<<<<<<<<<<<<< - * ctx.user.list_hook = <PyObject*>list_hook - * - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 98, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 98, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":97 - * - * if list_hook is not None: - * if not PyCallable_Check(list_hook): # <<<<<<<<<<<<<< - * raise TypeError("list_hook must be a callable.") - * ctx.user.list_hook = <PyObject*>list_hook - */ - } - - /* "msgpack/_unpacker.pyx":99 - * if not PyCallable_Check(list_hook): - * raise TypeError("list_hook must be a callable.") - * ctx.user.list_hook = <PyObject*>list_hook # <<<<<<<<<<<<<< - * - * if ext_hook is not None: - */ - __pyx_v_ctx->user.list_hook = ((PyObject *)__pyx_v_list_hook); - - /* "msgpack/_unpacker.pyx":96 - * ctx.user.has_pairs_hook = True - * - * if list_hook is not None: # <<<<<<<<<<<<<< - * if not PyCallable_Check(list_hook): - * raise TypeError("list_hook must be a callable.") - */ - } - - /* "msgpack/_unpacker.pyx":101 - * ctx.user.list_hook = <PyObject*>list_hook - * - * if ext_hook is not None: # <<<<<<<<<<<<<< - * if not PyCallable_Check(ext_hook): - * raise TypeError("ext_hook must be a callable.") - */ - __pyx_t_1 = (__pyx_v_ext_hook != Py_None); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":102 - * - * if ext_hook is not None: - * if not PyCallable_Check(ext_hook): # <<<<<<<<<<<<<< - * raise TypeError("ext_hook must be a callable.") - * ctx.user.ext_hook = <PyObject*>ext_hook - */ - __pyx_t_1 = (!PyCallable_Check(__pyx_v_ext_hook)); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":103 - * if ext_hook is not None: - * if not PyCallable_Check(ext_hook): - * raise TypeError("ext_hook must be a callable.") # <<<<<<<<<<<<<< - * ctx.user.ext_hook = <PyObject*>ext_hook - * - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 103, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 103, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":102 - * - * if ext_hook is not None: - * if not PyCallable_Check(ext_hook): # <<<<<<<<<<<<<< - * raise TypeError("ext_hook must be a callable.") - * ctx.user.ext_hook = <PyObject*>ext_hook - */ - } - - /* "msgpack/_unpacker.pyx":104 - * if not PyCallable_Check(ext_hook): - * raise TypeError("ext_hook must be a callable.") - * ctx.user.ext_hook = <PyObject*>ext_hook # <<<<<<<<<<<<<< - * - * if timestamp < 0 or 3 < timestamp: - */ - __pyx_v_ctx->user.ext_hook = ((PyObject *)__pyx_v_ext_hook); - - /* "msgpack/_unpacker.pyx":101 - * ctx.user.list_hook = <PyObject*>list_hook - * - * if ext_hook is not None: # <<<<<<<<<<<<<< - * if not PyCallable_Check(ext_hook): - * raise TypeError("ext_hook must be a callable.") - */ - } - - /* "msgpack/_unpacker.pyx":106 - * ctx.user.ext_hook = <PyObject*>ext_hook - * - * if timestamp < 0 or 3 < timestamp: # <<<<<<<<<<<<<< - * raise ValueError("timestamp must be 0..3") - * - */ - __pyx_t_2 = (__pyx_v_timestamp < 0); - if (!__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L15_bool_binop_done; - } - __pyx_t_2 = (3 < __pyx_v_timestamp); - __pyx_t_1 = __pyx_t_2; - __pyx_L15_bool_binop_done:; - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":107 - * - * if timestamp < 0 or 3 < timestamp: - * raise ValueError("timestamp must be 0..3") # <<<<<<<<<<<<<< - * - * # Add Timestamp type to the user object so it may be used in unpack.h - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 107, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 107, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":106 - * ctx.user.ext_hook = <PyObject*>ext_hook - * - * if timestamp < 0 or 3 < timestamp: # <<<<<<<<<<<<<< - * raise ValueError("timestamp must be 0..3") - * - */ - } - - /* "msgpack/_unpacker.pyx":110 - * - * # Add Timestamp type to the user object so it may be used in unpack.h - * ctx.user.timestamp = timestamp # <<<<<<<<<<<<<< - * ctx.user.timestamp_t = <PyObject*>Timestamp - * ctx.user.giga = <PyObject*>giga - */ - __pyx_v_ctx->user.timestamp = __pyx_v_timestamp; - - /* "msgpack/_unpacker.pyx":111 - * # Add Timestamp type to the user object so it may be used in unpack.h - * ctx.user.timestamp = timestamp - * ctx.user.timestamp_t = <PyObject*>Timestamp # <<<<<<<<<<<<<< - * ctx.user.giga = <PyObject*>giga - * ctx.user.utc = <PyObject*>utc - */ - __pyx_v_ctx->user.timestamp_t = ((PyObject *)__pyx_v_7msgpack_9_cmsgpack_Timestamp); - - /* "msgpack/_unpacker.pyx":112 - * ctx.user.timestamp = timestamp - * ctx.user.timestamp_t = <PyObject*>Timestamp - * ctx.user.giga = <PyObject*>giga # <<<<<<<<<<<<<< - * ctx.user.utc = <PyObject*>utc - * ctx.user.unicode_errors = unicode_errors - */ - __pyx_v_ctx->user.giga = ((PyObject *)__pyx_v_7msgpack_9_cmsgpack_giga); - - /* "msgpack/_unpacker.pyx":113 - * ctx.user.timestamp_t = <PyObject*>Timestamp - * ctx.user.giga = <PyObject*>giga - * ctx.user.utc = <PyObject*>utc # <<<<<<<<<<<<<< - * ctx.user.unicode_errors = unicode_errors - * - */ - __pyx_v_ctx->user.utc = ((PyObject *)__pyx_v_7msgpack_9_cmsgpack_utc); - - /* "msgpack/_unpacker.pyx":114 - * ctx.user.giga = <PyObject*>giga - * ctx.user.utc = <PyObject*>utc - * ctx.user.unicode_errors = unicode_errors # <<<<<<<<<<<<<< - * - * def default_read_extended_type(typecode, data): - */ - __pyx_v_ctx->user.unicode_errors = __pyx_v_unicode_errors; - - /* "msgpack/_unpacker.pyx":60 - * void unpack_clear(unpack_context* ctx) - * - * cdef inline init_ctx(unpack_context *ctx, # <<<<<<<<<<<<<< - * object object_hook, object object_pairs_hook, - * object list_hook, object ext_hook, - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("msgpack._cmsgpack.init_ctx", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":116 - * ctx.user.unicode_errors = unicode_errors - * - * def default_read_extended_type(typecode, data): # <<<<<<<<<<<<<< - * raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_1default_read_extended_type(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_default_read_extended_type, "default_read_extended_type(typecode, data)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_1default_read_extended_type = {"default_read_extended_type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_1default_read_extended_type, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_default_read_extended_type}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_1default_read_extended_type(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PyObject *__pyx_v_typecode = 0; - CYTHON_UNUSED PyObject *__pyx_v_data = 0; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[2] = {0,0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("default_read_extended_type (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 116, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_typecode,&__pyx_n_s_data,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_typecode)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 116, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_data)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 116, __pyx_L3_error) - else { - __Pyx_RaiseArgtupleInvalid("default_read_extended_type", 1, 2, 2, 1); __PYX_ERR(1, 116, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "default_read_extended_type") < 0)) __PYX_ERR(1, 116, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 2)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - } - __pyx_v_typecode = values[0]; - __pyx_v_data = values[1]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("default_read_extended_type", 1, 2, 2, __pyx_nargs); __PYX_ERR(1, 116, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.default_read_extended_type", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_default_read_extended_type(__pyx_self, __pyx_v_typecode, __pyx_v_data); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_default_read_extended_type(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_typecode, CYTHON_UNUSED PyObject *__pyx_v_data) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("default_read_extended_type", 0); - - /* "msgpack/_unpacker.pyx":117 - * - * def default_read_extended_type(typecode, data): - * raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) # <<<<<<<<<<<<<< - * - * cdef inline int get_data_from_buffer(object obj, - */ - __pyx_t_1 = __Pyx_PyUnicode_FormatSafe(__pyx_kp_u_Cannot_decode_extended_type_with, __pyx_v_typecode); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 117, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_NotImplementedError, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 117, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(1, 117, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":116 - * ctx.user.unicode_errors = unicode_errors - * - * def default_read_extended_type(typecode, data): # <<<<<<<<<<<<<< - * raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("msgpack._cmsgpack.default_read_extended_type", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":119 - * raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) - * - * cdef inline int get_data_from_buffer(object obj, # <<<<<<<<<<<<<< - * Py_buffer *view, - * char **buf, - */ - -static CYTHON_INLINE int __pyx_f_7msgpack_9_cmsgpack_get_data_from_buffer(PyObject *__pyx_v_obj, Py_buffer *__pyx_v_view, char **__pyx_v_buf, Py_ssize_t *__pyx_v_buffer_len) { - PyObject *__pyx_v_contiguous = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - Py_ssize_t __pyx_t_4; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("get_data_from_buffer", 0); - - /* "msgpack/_unpacker.pyx":125 - * cdef object contiguous - * cdef Py_buffer tmp - * if PyObject_GetBuffer(obj, view, PyBUF_FULL_RO) == -1: # <<<<<<<<<<<<<< - * raise - * if view.itemsize != 1: - */ - __pyx_t_1 = PyObject_GetBuffer(__pyx_v_obj, __pyx_v_view, PyBUF_FULL_RO); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 125, __pyx_L1_error) - __pyx_t_2 = (__pyx_t_1 == -1L); - if (unlikely(__pyx_t_2)) { - - /* "msgpack/_unpacker.pyx":126 - * cdef Py_buffer tmp - * if PyObject_GetBuffer(obj, view, PyBUF_FULL_RO) == -1: - * raise # <<<<<<<<<<<<<< - * if view.itemsize != 1: - * PyBuffer_Release(view) - */ - __Pyx_ReraiseException(); __PYX_ERR(1, 126, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":125 - * cdef object contiguous - * cdef Py_buffer tmp - * if PyObject_GetBuffer(obj, view, PyBUF_FULL_RO) == -1: # <<<<<<<<<<<<<< - * raise - * if view.itemsize != 1: - */ - } - - /* "msgpack/_unpacker.pyx":127 - * if PyObject_GetBuffer(obj, view, PyBUF_FULL_RO) == -1: - * raise - * if view.itemsize != 1: # <<<<<<<<<<<<<< - * PyBuffer_Release(view) - * raise BufferError("cannot unpack from multi-byte object") - */ - __pyx_t_2 = (__pyx_v_view->itemsize != 1); - if (unlikely(__pyx_t_2)) { - - /* "msgpack/_unpacker.pyx":128 - * raise - * if view.itemsize != 1: - * PyBuffer_Release(view) # <<<<<<<<<<<<<< - * raise BufferError("cannot unpack from multi-byte object") - * if PyBuffer_IsContiguous(view, b'A') == 0: - */ - PyBuffer_Release(__pyx_v_view); - - /* "msgpack/_unpacker.pyx":129 - * if view.itemsize != 1: - * PyBuffer_Release(view) - * raise BufferError("cannot unpack from multi-byte object") # <<<<<<<<<<<<<< - * if PyBuffer_IsContiguous(view, b'A') == 0: - * PyBuffer_Release(view) - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_BufferError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 129, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":127 - * if PyObject_GetBuffer(obj, view, PyBUF_FULL_RO) == -1: - * raise - * if view.itemsize != 1: # <<<<<<<<<<<<<< - * PyBuffer_Release(view) - * raise BufferError("cannot unpack from multi-byte object") - */ - } - - /* "msgpack/_unpacker.pyx":130 - * PyBuffer_Release(view) - * raise BufferError("cannot unpack from multi-byte object") - * if PyBuffer_IsContiguous(view, b'A') == 0: # <<<<<<<<<<<<<< - * PyBuffer_Release(view) - * # create a contiguous copy and get buffer - */ - __pyx_t_2 = (PyBuffer_IsContiguous(__pyx_v_view, 'A') == 0); - if (__pyx_t_2) { - - /* "msgpack/_unpacker.pyx":131 - * raise BufferError("cannot unpack from multi-byte object") - * if PyBuffer_IsContiguous(view, b'A') == 0: - * PyBuffer_Release(view) # <<<<<<<<<<<<<< - * # create a contiguous copy and get buffer - * contiguous = PyMemoryView_GetContiguous(obj, PyBUF_READ, b'C') - */ - PyBuffer_Release(__pyx_v_view); - - /* "msgpack/_unpacker.pyx":133 - * PyBuffer_Release(view) - * # create a contiguous copy and get buffer - * contiguous = PyMemoryView_GetContiguous(obj, PyBUF_READ, b'C') # <<<<<<<<<<<<<< - * PyObject_GetBuffer(contiguous, view, PyBUF_SIMPLE) - * # view must hold the only reference to contiguous, - */ - __pyx_t_3 = PyMemoryView_GetContiguous(__pyx_v_obj, PyBUF_READ, 'C'); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 133, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_contiguous = __pyx_t_3; - __pyx_t_3 = 0; - - /* "msgpack/_unpacker.pyx":134 - * # create a contiguous copy and get buffer - * contiguous = PyMemoryView_GetContiguous(obj, PyBUF_READ, b'C') - * PyObject_GetBuffer(contiguous, view, PyBUF_SIMPLE) # <<<<<<<<<<<<<< - * # view must hold the only reference to contiguous, - * # so memory is freed when view is released - */ - __pyx_t_1 = PyObject_GetBuffer(__pyx_v_contiguous, __pyx_v_view, PyBUF_SIMPLE); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(1, 134, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":137 - * # view must hold the only reference to contiguous, - * # so memory is freed when view is released - * Py_DECREF(contiguous) # <<<<<<<<<<<<<< - * buffer_len[0] = view.len - * buf[0] = <char*> view.buf - */ - Py_DECREF(__pyx_v_contiguous); - - /* "msgpack/_unpacker.pyx":130 - * PyBuffer_Release(view) - * raise BufferError("cannot unpack from multi-byte object") - * if PyBuffer_IsContiguous(view, b'A') == 0: # <<<<<<<<<<<<<< - * PyBuffer_Release(view) - * # create a contiguous copy and get buffer - */ - } - - /* "msgpack/_unpacker.pyx":138 - * # so memory is freed when view is released - * Py_DECREF(contiguous) - * buffer_len[0] = view.len # <<<<<<<<<<<<<< - * buf[0] = <char*> view.buf - * return 1 - */ - __pyx_t_4 = __pyx_v_view->len; - (__pyx_v_buffer_len[0]) = __pyx_t_4; - - /* "msgpack/_unpacker.pyx":139 - * Py_DECREF(contiguous) - * buffer_len[0] = view.len - * buf[0] = <char*> view.buf # <<<<<<<<<<<<<< - * return 1 - * - */ - (__pyx_v_buf[0]) = ((char *)__pyx_v_view->buf); - - /* "msgpack/_unpacker.pyx":140 - * buffer_len[0] = view.len - * buf[0] = <char*> view.buf - * return 1 # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = 1; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":119 - * raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) - * - * cdef inline int get_data_from_buffer(object obj, # <<<<<<<<<<<<<< - * Py_buffer *view, - * char **buf, - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("msgpack._cmsgpack.get_data_from_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_contiguous); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":143 - * - * - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - */ - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_4__defaults__(CYTHON_UNUSED PyObject *__pyx_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__defaults__", 0); - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyDict_NewPresized(14); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_object_hook, Py_None) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_list_hook, Py_None) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":144 - * - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, # <<<<<<<<<<<<<< - * unicode_errors=None, - * object_pairs_hook=None, ext_hook=ExtType, - */ - __pyx_t_2 = __Pyx_PyBool_FromLong(((int)1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 144, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_use_list, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyBool_FromLong(((int)0)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 144, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_raw, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyInt_From_int(((int)0)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 144, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_timestamp, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyBool_FromLong(((int)1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 144, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_strict_map_key, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":145 - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, # <<<<<<<<<<<<<< - * object_pairs_hook=None, ext_hook=ExtType, - * Py_ssize_t max_str_len=-1, - */ - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_unicode_errors, Py_None) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":146 - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - * object_pairs_hook=None, ext_hook=ExtType, # <<<<<<<<<<<<<< - * Py_ssize_t max_str_len=-1, - * Py_ssize_t max_bin_len=-1, - */ - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_object_pairs_hook, Py_None) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":143 - * - * - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - */ - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_ext_hook, __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_ext_hook) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":147 - * unicode_errors=None, - * object_pairs_hook=None, ext_hook=ExtType, - * Py_ssize_t max_str_len=-1, # <<<<<<<<<<<<<< - * Py_ssize_t max_bin_len=-1, - * Py_ssize_t max_array_len=-1, - */ - __pyx_t_2 = PyInt_FromSsize_t(((Py_ssize_t)-1L)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_max_str_len, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":148 - * object_pairs_hook=None, ext_hook=ExtType, - * Py_ssize_t max_str_len=-1, - * Py_ssize_t max_bin_len=-1, # <<<<<<<<<<<<<< - * Py_ssize_t max_array_len=-1, - * Py_ssize_t max_map_len=-1, - */ - __pyx_t_2 = PyInt_FromSsize_t(((Py_ssize_t)-1L)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 148, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_max_bin_len, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":149 - * Py_ssize_t max_str_len=-1, - * Py_ssize_t max_bin_len=-1, - * Py_ssize_t max_array_len=-1, # <<<<<<<<<<<<<< - * Py_ssize_t max_map_len=-1, - * Py_ssize_t max_ext_len=-1): - */ - __pyx_t_2 = PyInt_FromSsize_t(((Py_ssize_t)-1L)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 149, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_max_array_len, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":150 - * Py_ssize_t max_bin_len=-1, - * Py_ssize_t max_array_len=-1, - * Py_ssize_t max_map_len=-1, # <<<<<<<<<<<<<< - * Py_ssize_t max_ext_len=-1): - * """ - */ - __pyx_t_2 = PyInt_FromSsize_t(((Py_ssize_t)-1L)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 150, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_max_map_len, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":151 - * Py_ssize_t max_array_len=-1, - * Py_ssize_t max_map_len=-1, - * Py_ssize_t max_ext_len=-1): # <<<<<<<<<<<<<< - * """ - * Unpack packed_bytes to object. Returns an unpacked object. - */ - __pyx_t_2 = PyInt_FromSsize_t(((Py_ssize_t)-1L)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 151, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_max_ext_len, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":143 - * - * - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - */ - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, Py_None)) __PYX_ERR(1, 143, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_1); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1)) __PYX_ERR(1, 143, __pyx_L1_error); - __pyx_t_1 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("msgpack._cmsgpack.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_3unpackb(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_2unpackb, "unpackb(packed, *, object_hook=None, list_hook=None, bool use_list=True, bool raw=False, int timestamp=0, bool strict_map_key=True, unicode_errors=None, object_pairs_hook=None, ext_hook=ExtType, Py_ssize_t max_str_len=-1, Py_ssize_t max_bin_len=-1, Py_ssize_t max_array_len=-1, Py_ssize_t max_map_len=-1, Py_ssize_t max_ext_len=-1)\n\n Unpack packed_bytes to object. Returns an unpacked object.\n\n Raises ``ExtraData`` when *packed* contains extra bytes.\n Raises ``ValueError`` when *packed* is incomplete.\n Raises ``FormatError`` when *packed* is not valid msgpack.\n Raises ``StackError`` when *packed* contains too nested.\n Other exceptions can be raised during unpacking.\n\n See :class:`Unpacker` for options.\n\n *max_xxx_len* options are configured automatically from ``len(packed)``.\n "); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_3unpackb = {"unpackb", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_3unpackb, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_2unpackb}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_3unpackb(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PyObject *__pyx_v_packed = 0; - PyObject *__pyx_v_object_hook = 0; - PyObject *__pyx_v_list_hook = 0; - int __pyx_v_use_list; - int __pyx_v_raw; - int __pyx_v_timestamp; - int __pyx_v_strict_map_key; - PyObject *__pyx_v_unicode_errors = 0; - PyObject *__pyx_v_object_pairs_hook = 0; - PyObject *__pyx_v_ext_hook = 0; - Py_ssize_t __pyx_v_max_str_len; - Py_ssize_t __pyx_v_max_bin_len; - Py_ssize_t __pyx_v_max_array_len; - Py_ssize_t __pyx_v_max_map_len; - Py_ssize_t __pyx_v_max_ext_len; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("unpackb (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 143, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_packed,&__pyx_n_s_object_hook,&__pyx_n_s_list_hook,&__pyx_n_s_use_list,&__pyx_n_s_raw,&__pyx_n_s_timestamp,&__pyx_n_s_strict_map_key,&__pyx_n_s_unicode_errors,&__pyx_n_s_object_pairs_hook,&__pyx_n_s_ext_hook,&__pyx_n_s_max_str_len,&__pyx_n_s_max_bin_len,&__pyx_n_s_max_array_len,&__pyx_n_s_max_map_len,&__pyx_n_s_max_ext_len,0}; - __pyx_defaults *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self); - values[1] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None)); - values[2] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None)); - - /* "msgpack/_unpacker.pyx":145 - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, # <<<<<<<<<<<<<< - * object_pairs_hook=None, ext_hook=ExtType, - * Py_ssize_t max_str_len=-1, - */ - values[7] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None)); - - /* "msgpack/_unpacker.pyx":146 - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - * object_pairs_hook=None, ext_hook=ExtType, # <<<<<<<<<<<<<< - * Py_ssize_t max_str_len=-1, - * Py_ssize_t max_bin_len=-1, - */ - values[8] = __Pyx_Arg_NewRef_FASTCALL(((PyObject *)Py_None)); - values[9] = __Pyx_Arg_NewRef_FASTCALL(__pyx_dynamic_args->__pyx_arg_ext_hook); - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_packed)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 143, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (kw_args > 0 && likely(kw_args <= 14)) { - Py_ssize_t index; - for (index = 1; index < 15 && kw_args > 0; index++) { - PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, *__pyx_pyargnames[index]); - if (value) { values[index] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 143, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "unpackb") < 0)) __PYX_ERR(1, 143, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v_packed = values[0]; - __pyx_v_object_hook = values[1]; - __pyx_v_list_hook = values[2]; - if (values[3]) { - __pyx_v_use_list = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_use_list == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 144, __pyx_L3_error) - } else { - __pyx_v_use_list = ((int)((int)1)); - } - if (values[4]) { - __pyx_v_raw = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_raw == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 144, __pyx_L3_error) - } else { - __pyx_v_raw = ((int)((int)0)); - } - if (values[5]) { - __pyx_v_timestamp = __Pyx_PyInt_As_int(values[5]); if (unlikely((__pyx_v_timestamp == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 144, __pyx_L3_error) - } else { - __pyx_v_timestamp = ((int)((int)0)); - } - if (values[6]) { - __pyx_v_strict_map_key = __Pyx_PyObject_IsTrue(values[6]); if (unlikely((__pyx_v_strict_map_key == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 144, __pyx_L3_error) - } else { - __pyx_v_strict_map_key = ((int)((int)1)); - } - __pyx_v_unicode_errors = values[7]; - __pyx_v_object_pairs_hook = values[8]; - __pyx_v_ext_hook = values[9]; - if (values[10]) { - __pyx_v_max_str_len = __Pyx_PyIndex_AsSsize_t(values[10]); if (unlikely((__pyx_v_max_str_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 147, __pyx_L3_error) - } else { - __pyx_v_max_str_len = ((Py_ssize_t)((Py_ssize_t)-1L)); - } - if (values[11]) { - __pyx_v_max_bin_len = __Pyx_PyIndex_AsSsize_t(values[11]); if (unlikely((__pyx_v_max_bin_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 148, __pyx_L3_error) - } else { - __pyx_v_max_bin_len = ((Py_ssize_t)((Py_ssize_t)-1L)); - } - if (values[12]) { - __pyx_v_max_array_len = __Pyx_PyIndex_AsSsize_t(values[12]); if (unlikely((__pyx_v_max_array_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 149, __pyx_L3_error) - } else { - __pyx_v_max_array_len = ((Py_ssize_t)((Py_ssize_t)-1L)); - } - if (values[13]) { - __pyx_v_max_map_len = __Pyx_PyIndex_AsSsize_t(values[13]); if (unlikely((__pyx_v_max_map_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 150, __pyx_L3_error) - } else { - __pyx_v_max_map_len = ((Py_ssize_t)((Py_ssize_t)-1L)); - } - if (values[14]) { - __pyx_v_max_ext_len = __Pyx_PyIndex_AsSsize_t(values[14]); if (unlikely((__pyx_v_max_ext_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 151, __pyx_L3_error) - } else { - __pyx_v_max_ext_len = ((Py_ssize_t)((Py_ssize_t)-1L)); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("unpackb", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 143, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.unpackb", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_2unpackb(__pyx_self, __pyx_v_packed, __pyx_v_object_hook, __pyx_v_list_hook, __pyx_v_use_list, __pyx_v_raw, __pyx_v_timestamp, __pyx_v_strict_map_key, __pyx_v_unicode_errors, __pyx_v_object_pairs_hook, __pyx_v_ext_hook, __pyx_v_max_str_len, __pyx_v_max_bin_len, __pyx_v_max_array_len, __pyx_v_max_map_len, __pyx_v_max_ext_len); - - /* "msgpack/_unpacker.pyx":143 - * - * - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - */ - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_2unpackb(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_packed, PyObject *__pyx_v_object_hook, PyObject *__pyx_v_list_hook, int __pyx_v_use_list, int __pyx_v_raw, int __pyx_v_timestamp, int __pyx_v_strict_map_key, PyObject *__pyx_v_unicode_errors, PyObject *__pyx_v_object_pairs_hook, PyObject *__pyx_v_ext_hook, Py_ssize_t __pyx_v_max_str_len, Py_ssize_t __pyx_v_max_bin_len, Py_ssize_t __pyx_v_max_array_len, Py_ssize_t __pyx_v_max_map_len, Py_ssize_t __pyx_v_max_ext_len) { - unpack_context __pyx_v_ctx; - Py_ssize_t __pyx_v_off; - int __pyx_v_ret; - Py_buffer __pyx_v_view; - char *__pyx_v_buf; - Py_ssize_t __pyx_v_buf_len; - char const *__pyx_v_cerr; - PyObject *__pyx_v_obj = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - char const *__pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - char const *__pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - PyObject *__pyx_t_13 = NULL; - PyObject *__pyx_t_14 = NULL; - PyObject *__pyx_t_15 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("unpackb", 0); - - /* "msgpack/_unpacker.pyx":166 - * """ - * cdef unpack_context ctx - * cdef Py_ssize_t off = 0 # <<<<<<<<<<<<<< - * cdef int ret - * - */ - __pyx_v_off = 0; - - /* "msgpack/_unpacker.pyx":170 - * - * cdef Py_buffer view - * cdef char* buf = NULL # <<<<<<<<<<<<<< - * cdef Py_ssize_t buf_len - * cdef const char* cerr = NULL - */ - __pyx_v_buf = NULL; - - /* "msgpack/_unpacker.pyx":172 - * cdef char* buf = NULL - * cdef Py_ssize_t buf_len - * cdef const char* cerr = NULL # <<<<<<<<<<<<<< - * - * if unicode_errors is not None: - */ - __pyx_v_cerr = NULL; - - /* "msgpack/_unpacker.pyx":174 - * cdef const char* cerr = NULL - * - * if unicode_errors is not None: # <<<<<<<<<<<<<< - * cerr = unicode_errors - * - */ - __pyx_t_1 = (__pyx_v_unicode_errors != Py_None); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":175 - * - * if unicode_errors is not None: - * cerr = unicode_errors # <<<<<<<<<<<<<< - * - * get_data_from_buffer(packed, &view, &buf, &buf_len) - */ - __pyx_t_2 = __Pyx_PyObject_AsString(__pyx_v_unicode_errors); if (unlikely((!__pyx_t_2) && PyErr_Occurred())) __PYX_ERR(1, 175, __pyx_L1_error) - __pyx_v_cerr = __pyx_t_2; - - /* "msgpack/_unpacker.pyx":174 - * cdef const char* cerr = NULL - * - * if unicode_errors is not None: # <<<<<<<<<<<<<< - * cerr = unicode_errors - * - */ - } - - /* "msgpack/_unpacker.pyx":177 - * cerr = unicode_errors - * - * get_data_from_buffer(packed, &view, &buf, &buf_len) # <<<<<<<<<<<<<< - * - * if max_str_len == -1: - */ - __pyx_t_3 = __pyx_f_7msgpack_9_cmsgpack_get_data_from_buffer(__pyx_v_packed, (&__pyx_v_view), (&__pyx_v_buf), (&__pyx_v_buf_len)); if (unlikely(__pyx_t_3 == ((int)0))) __PYX_ERR(1, 177, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":179 - * get_data_from_buffer(packed, &view, &buf, &buf_len) - * - * if max_str_len == -1: # <<<<<<<<<<<<<< - * max_str_len = buf_len - * if max_bin_len == -1: - */ - __pyx_t_1 = (__pyx_v_max_str_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":180 - * - * if max_str_len == -1: - * max_str_len = buf_len # <<<<<<<<<<<<<< - * if max_bin_len == -1: - * max_bin_len = buf_len - */ - __pyx_v_max_str_len = __pyx_v_buf_len; - - /* "msgpack/_unpacker.pyx":179 - * get_data_from_buffer(packed, &view, &buf, &buf_len) - * - * if max_str_len == -1: # <<<<<<<<<<<<<< - * max_str_len = buf_len - * if max_bin_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":181 - * if max_str_len == -1: - * max_str_len = buf_len - * if max_bin_len == -1: # <<<<<<<<<<<<<< - * max_bin_len = buf_len - * if max_array_len == -1: - */ - __pyx_t_1 = (__pyx_v_max_bin_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":182 - * max_str_len = buf_len - * if max_bin_len == -1: - * max_bin_len = buf_len # <<<<<<<<<<<<<< - * if max_array_len == -1: - * max_array_len = buf_len - */ - __pyx_v_max_bin_len = __pyx_v_buf_len; - - /* "msgpack/_unpacker.pyx":181 - * if max_str_len == -1: - * max_str_len = buf_len - * if max_bin_len == -1: # <<<<<<<<<<<<<< - * max_bin_len = buf_len - * if max_array_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":183 - * if max_bin_len == -1: - * max_bin_len = buf_len - * if max_array_len == -1: # <<<<<<<<<<<<<< - * max_array_len = buf_len - * if max_map_len == -1: - */ - __pyx_t_1 = (__pyx_v_max_array_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":184 - * max_bin_len = buf_len - * if max_array_len == -1: - * max_array_len = buf_len # <<<<<<<<<<<<<< - * if max_map_len == -1: - * max_map_len = buf_len//2 - */ - __pyx_v_max_array_len = __pyx_v_buf_len; - - /* "msgpack/_unpacker.pyx":183 - * if max_bin_len == -1: - * max_bin_len = buf_len - * if max_array_len == -1: # <<<<<<<<<<<<<< - * max_array_len = buf_len - * if max_map_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":185 - * if max_array_len == -1: - * max_array_len = buf_len - * if max_map_len == -1: # <<<<<<<<<<<<<< - * max_map_len = buf_len//2 - * if max_ext_len == -1: - */ - __pyx_t_1 = (__pyx_v_max_map_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":186 - * max_array_len = buf_len - * if max_map_len == -1: - * max_map_len = buf_len//2 # <<<<<<<<<<<<<< - * if max_ext_len == -1: - * max_ext_len = buf_len - */ - __pyx_v_max_map_len = __Pyx_div_Py_ssize_t(__pyx_v_buf_len, 2); - - /* "msgpack/_unpacker.pyx":185 - * if max_array_len == -1: - * max_array_len = buf_len - * if max_map_len == -1: # <<<<<<<<<<<<<< - * max_map_len = buf_len//2 - * if max_ext_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":187 - * if max_map_len == -1: - * max_map_len = buf_len//2 - * if max_ext_len == -1: # <<<<<<<<<<<<<< - * max_ext_len = buf_len - * - */ - __pyx_t_1 = (__pyx_v_max_ext_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":188 - * max_map_len = buf_len//2 - * if max_ext_len == -1: - * max_ext_len = buf_len # <<<<<<<<<<<<<< - * - * try: - */ - __pyx_v_max_ext_len = __pyx_v_buf_len; - - /* "msgpack/_unpacker.pyx":187 - * if max_map_len == -1: - * max_map_len = buf_len//2 - * if max_ext_len == -1: # <<<<<<<<<<<<<< - * max_ext_len = buf_len - * - */ - } - - /* "msgpack/_unpacker.pyx":190 - * max_ext_len = buf_len - * - * try: # <<<<<<<<<<<<<< - * init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, ext_hook, - * use_list, raw, timestamp, strict_map_key, cerr, - */ - /*try:*/ { - - /* "msgpack/_unpacker.pyx":191 - * - * try: - * init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, ext_hook, # <<<<<<<<<<<<<< - * use_list, raw, timestamp, strict_map_key, cerr, - * max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len) - */ - __pyx_t_4 = __pyx_f_7msgpack_9_cmsgpack_init_ctx((&__pyx_v_ctx), __pyx_v_object_hook, __pyx_v_object_pairs_hook, __pyx_v_list_hook, __pyx_v_ext_hook, __pyx_v_use_list, __pyx_v_raw, __pyx_v_timestamp, __pyx_v_strict_map_key, __pyx_v_cerr, __pyx_v_max_str_len, __pyx_v_max_bin_len, __pyx_v_max_array_len, __pyx_v_max_map_len, __pyx_v_max_ext_len); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 191, __pyx_L10_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - - /* "msgpack/_unpacker.pyx":194 - * use_list, raw, timestamp, strict_map_key, cerr, - * max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len) - * ret = unpack_construct(&ctx, buf, buf_len, &off) # <<<<<<<<<<<<<< - * finally: - * PyBuffer_Release(&view); - */ - __pyx_t_3 = unpack_construct((&__pyx_v_ctx), __pyx_v_buf, __pyx_v_buf_len, (&__pyx_v_off)); if (unlikely(__pyx_t_3 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(1, 194, __pyx_L10_error) - __pyx_v_ret = __pyx_t_3; - } - - /* "msgpack/_unpacker.pyx":196 - * ret = unpack_construct(&ctx, buf, buf_len, &off) - * finally: - * PyBuffer_Release(&view); # <<<<<<<<<<<<<< - * - * if ret == 1: - */ - /*finally:*/ { - /*normal exit:*/{ - PyBuffer_Release((&__pyx_v_view)); - goto __pyx_L11; - } - __pyx_L10_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0)) __Pyx_ErrFetch(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9); - __Pyx_XGOTREF(__pyx_t_7); - __Pyx_XGOTREF(__pyx_t_8); - __Pyx_XGOTREF(__pyx_t_9); - __Pyx_XGOTREF(__pyx_t_10); - __Pyx_XGOTREF(__pyx_t_11); - __Pyx_XGOTREF(__pyx_t_12); - __pyx_t_3 = __pyx_lineno; __pyx_t_5 = __pyx_clineno; __pyx_t_6 = __pyx_filename; - { - PyBuffer_Release((&__pyx_v_view)); - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_10); - __Pyx_XGIVEREF(__pyx_t_11); - __Pyx_XGIVEREF(__pyx_t_12); - __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_11, __pyx_t_12); - } - __Pyx_XGIVEREF(__pyx_t_7); - __Pyx_XGIVEREF(__pyx_t_8); - __Pyx_XGIVEREF(__pyx_t_9); - __Pyx_ErrRestore(__pyx_t_7, __pyx_t_8, __pyx_t_9); - __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; - __pyx_lineno = __pyx_t_3; __pyx_clineno = __pyx_t_5; __pyx_filename = __pyx_t_6; - goto __pyx_L1_error; - } - __pyx_L11:; - } - - /* "msgpack/_unpacker.pyx":198 - * PyBuffer_Release(&view); - * - * if ret == 1: # <<<<<<<<<<<<<< - * obj = unpack_data(&ctx) - * if off < buf_len: - */ - __pyx_t_1 = (__pyx_v_ret == 1); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":199 - * - * if ret == 1: - * obj = unpack_data(&ctx) # <<<<<<<<<<<<<< - * if off < buf_len: - * raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) - */ - __pyx_t_4 = unpack_data((&__pyx_v_ctx)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 199, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_v_obj = __pyx_t_4; - __pyx_t_4 = 0; - - /* "msgpack/_unpacker.pyx":200 - * if ret == 1: - * obj = unpack_data(&ctx) - * if off < buf_len: # <<<<<<<<<<<<<< - * raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) - * return obj - */ - __pyx_t_1 = (__pyx_v_off < __pyx_v_buf_len); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":201 - * obj = unpack_data(&ctx) - * if off < buf_len: - * raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) # <<<<<<<<<<<<<< - * return obj - * unpack_clear(&ctx) - */ - __Pyx_GetModuleGlobalName(__pyx_t_13, __pyx_n_s_ExtraData); if (unlikely(!__pyx_t_13)) __PYX_ERR(1, 201, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_13); - __pyx_t_14 = PyBytes_FromStringAndSize((__pyx_v_buf + __pyx_v_off), (__pyx_v_buf_len - __pyx_v_off)); if (unlikely(!__pyx_t_14)) __PYX_ERR(1, 201, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __pyx_t_15 = NULL; - __pyx_t_5 = 0; - #if CYTHON_UNPACK_METHODS - if (unlikely(PyMethod_Check(__pyx_t_13))) { - __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_13); - if (likely(__pyx_t_15)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13); - __Pyx_INCREF(__pyx_t_15); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_13, function); - __pyx_t_5 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[3] = {__pyx_t_15, __pyx_v_obj, __pyx_t_14}; - __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_13, __pyx_callargs+1-__pyx_t_5, 2+__pyx_t_5); - __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 201, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; - } - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 201, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":200 - * if ret == 1: - * obj = unpack_data(&ctx) - * if off < buf_len: # <<<<<<<<<<<<<< - * raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) - * return obj - */ - } - - /* "msgpack/_unpacker.pyx":202 - * if off < buf_len: - * raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) - * return obj # <<<<<<<<<<<<<< - * unpack_clear(&ctx) - * if ret == 0: - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_obj); - __pyx_r = __pyx_v_obj; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":198 - * PyBuffer_Release(&view); - * - * if ret == 1: # <<<<<<<<<<<<<< - * obj = unpack_data(&ctx) - * if off < buf_len: - */ - } - - /* "msgpack/_unpacker.pyx":203 - * raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) - * return obj - * unpack_clear(&ctx) # <<<<<<<<<<<<<< - * if ret == 0: - * raise ValueError("Unpack failed: incomplete input") - */ - unpack_clear((&__pyx_v_ctx)); - - /* "msgpack/_unpacker.pyx":204 - * return obj - * unpack_clear(&ctx) - * if ret == 0: # <<<<<<<<<<<<<< - * raise ValueError("Unpack failed: incomplete input") - * elif ret == -2: - */ - switch (__pyx_v_ret) { - case 0: - - /* "msgpack/_unpacker.pyx":205 - * unpack_clear(&ctx) - * if ret == 0: - * raise ValueError("Unpack failed: incomplete input") # <<<<<<<<<<<<<< - * elif ret == -2: - * raise FormatError - */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 205, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 205, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":204 - * return obj - * unpack_clear(&ctx) - * if ret == 0: # <<<<<<<<<<<<<< - * raise ValueError("Unpack failed: incomplete input") - * elif ret == -2: - */ - break; - case -2L: - - /* "msgpack/_unpacker.pyx":207 - * raise ValueError("Unpack failed: incomplete input") - * elif ret == -2: - * raise FormatError # <<<<<<<<<<<<<< - * elif ret == -3: - * raise StackError - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_FormatError); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 207, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 207, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":206 - * if ret == 0: - * raise ValueError("Unpack failed: incomplete input") - * elif ret == -2: # <<<<<<<<<<<<<< - * raise FormatError - * elif ret == -3: - */ - break; - case -3L: - - /* "msgpack/_unpacker.pyx":209 - * raise FormatError - * elif ret == -3: - * raise StackError # <<<<<<<<<<<<<< - * raise ValueError("Unpack failed: error = %d" % (ret,)) - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_StackError); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 209, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 209, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":208 - * elif ret == -2: - * raise FormatError - * elif ret == -3: # <<<<<<<<<<<<<< - * raise StackError - * raise ValueError("Unpack failed: error = %d" % (ret,)) - */ - break; - default: break; - } - - /* "msgpack/_unpacker.pyx":210 - * elif ret == -3: - * raise StackError - * raise ValueError("Unpack failed: error = %d" % (ret,)) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_4 = __Pyx_PyUnicode_From_int(__pyx_v_ret, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 210, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_13 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Unpack_failed_error, __pyx_t_4); if (unlikely(!__pyx_t_13)) __PYX_ERR(1, 210, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_13); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_13); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 210, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 210, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":143 - * - * - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_13); - __Pyx_XDECREF(__pyx_t_14); - __Pyx_XDECREF(__pyx_t_15); - __Pyx_AddTraceback("msgpack._cmsgpack.unpackb", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_obj); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":320 - * cdef uint64_t stream_offset - * - * def __cinit__(self): # <<<<<<<<<<<<<< - * self.buf = NULL - * - */ - -/* Python wrapper */ -static int __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 320, __pyx_L3_error) - #endif - __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, __pyx_nargs); return -1;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_VARARGS(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker___cinit__(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7msgpack_9_cmsgpack_8Unpacker___cinit__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__", 0); - - /* "msgpack/_unpacker.pyx":321 - * - * def __cinit__(self): - * self.buf = NULL # <<<<<<<<<<<<<< - * - * def __dealloc__(self): - */ - __pyx_v_self->buf = NULL; - - /* "msgpack/_unpacker.pyx":320 - * cdef uint64_t stream_offset - * - * def __cinit__(self): # <<<<<<<<<<<<<< - * self.buf = NULL - * - */ - - /* function exit code */ - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":323 - * self.buf = NULL - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * PyMem_Free(self.buf) - * self.buf = NULL - */ - -/* Python wrapper */ -static void __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_3__dealloc__(PyObject *__pyx_v_self) { - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); - __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_2__dealloc__(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_2__dealloc__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__", 0); - - /* "msgpack/_unpacker.pyx":324 - * - * def __dealloc__(self): - * PyMem_Free(self.buf) # <<<<<<<<<<<<<< - * self.buf = NULL - * - */ - PyMem_Free(__pyx_v_self->buf); - - /* "msgpack/_unpacker.pyx":325 - * def __dealloc__(self): - * PyMem_Free(self.buf) - * self.buf = NULL # <<<<<<<<<<<<<< - * - * def __init__(self, file_like=None, *, Py_ssize_t read_size=0, - */ - __pyx_v_self->buf = NULL; - - /* "msgpack/_unpacker.pyx":323 - * self.buf = NULL - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * PyMem_Free(self.buf) - * self.buf = NULL - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "msgpack/_unpacker.pyx":327 - * self.buf = NULL - * - * def __init__(self, file_like=None, *, Py_ssize_t read_size=0, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * object object_hook=None, object object_pairs_hook=None, object list_hook=None, - */ - -/* Python wrapper */ -static int __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_5__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_5__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_file_like = 0; - Py_ssize_t __pyx_v_read_size; - int __pyx_v_use_list; - int __pyx_v_raw; - int __pyx_v_timestamp; - int __pyx_v_strict_map_key; - PyObject *__pyx_v_object_hook = 0; - PyObject *__pyx_v_object_pairs_hook = 0; - PyObject *__pyx_v_list_hook = 0; - PyObject *__pyx_v_unicode_errors = 0; - Py_ssize_t __pyx_v_max_buffer_size; - PyObject *__pyx_v_ext_hook = 0; - Py_ssize_t __pyx_v_max_str_len; - Py_ssize_t __pyx_v_max_bin_len; - Py_ssize_t __pyx_v_max_array_len; - Py_ssize_t __pyx_v_max_map_len; - Py_ssize_t __pyx_v_max_ext_len; - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 327, __pyx_L3_error) - #endif - __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_file_like,&__pyx_n_s_read_size,&__pyx_n_s_use_list,&__pyx_n_s_raw,&__pyx_n_s_timestamp,&__pyx_n_s_strict_map_key,&__pyx_n_s_object_hook,&__pyx_n_s_object_pairs_hook,&__pyx_n_s_list_hook,&__pyx_n_s_unicode_errors,&__pyx_n_s_max_buffer_size,&__pyx_n_s_ext_hook,&__pyx_n_s_max_str_len,&__pyx_n_s_max_bin_len,&__pyx_n_s_max_array_len,&__pyx_n_s_max_map_len,&__pyx_n_s_max_ext_len,0}; - values[0] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); - - /* "msgpack/_unpacker.pyx":329 - * def __init__(self, file_like=None, *, Py_ssize_t read_size=0, - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * object object_hook=None, object object_pairs_hook=None, object list_hook=None, # <<<<<<<<<<<<<< - * unicode_errors=None, Py_ssize_t max_buffer_size=100*1024*1024, - * object ext_hook=ExtType, - */ - values[6] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); - values[7] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); - values[8] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); - - /* "msgpack/_unpacker.pyx":330 - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * object object_hook=None, object object_pairs_hook=None, object list_hook=None, - * unicode_errors=None, Py_ssize_t max_buffer_size=100*1024*1024, # <<<<<<<<<<<<<< - * object ext_hook=ExtType, - * Py_ssize_t max_str_len=-1, - */ - values[9] = __Pyx_Arg_NewRef_VARARGS(((PyObject *)Py_None)); - values[11] = __Pyx_Arg_NewRef_VARARGS(__pyx_k__23); - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (kw_args > 0) { - PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_file_like); - if (value) { values[0] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 327, __pyx_L3_error) - } - } - if (kw_args > 0 && likely(kw_args <= 16)) { - Py_ssize_t index; - for (index = 1; index < 17 && kw_args > 0; index++) { - PyObject* value = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, *__pyx_pyargnames[index]); - if (value) { values[index] = __Pyx_Arg_NewRef_VARARGS(value); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 327, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(1, 327, __pyx_L3_error) - } - } else { - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_file_like = values[0]; - if (values[1]) { - __pyx_v_read_size = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_read_size == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 327, __pyx_L3_error) - } else { - __pyx_v_read_size = ((Py_ssize_t)0); - } - if (values[2]) { - __pyx_v_use_list = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_use_list == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 328, __pyx_L3_error) - } else { - - /* "msgpack/_unpacker.pyx":328 - * - * def __init__(self, file_like=None, *, Py_ssize_t read_size=0, - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, # <<<<<<<<<<<<<< - * object object_hook=None, object object_pairs_hook=None, object list_hook=None, - * unicode_errors=None, Py_ssize_t max_buffer_size=100*1024*1024, - */ - __pyx_v_use_list = ((int)1); - } - if (values[3]) { - __pyx_v_raw = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_raw == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 328, __pyx_L3_error) - } else { - __pyx_v_raw = ((int)0); - } - if (values[4]) { - __pyx_v_timestamp = __Pyx_PyInt_As_int(values[4]); if (unlikely((__pyx_v_timestamp == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 328, __pyx_L3_error) - } else { - __pyx_v_timestamp = ((int)0); - } - if (values[5]) { - __pyx_v_strict_map_key = __Pyx_PyObject_IsTrue(values[5]); if (unlikely((__pyx_v_strict_map_key == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 328, __pyx_L3_error) - } else { - __pyx_v_strict_map_key = ((int)1); - } - __pyx_v_object_hook = values[6]; - __pyx_v_object_pairs_hook = values[7]; - __pyx_v_list_hook = values[8]; - __pyx_v_unicode_errors = values[9]; - if (values[10]) { - __pyx_v_max_buffer_size = __Pyx_PyIndex_AsSsize_t(values[10]); if (unlikely((__pyx_v_max_buffer_size == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 330, __pyx_L3_error) - } else { - __pyx_v_max_buffer_size = ((Py_ssize_t)0x6400000); - } - __pyx_v_ext_hook = values[11]; - if (values[12]) { - __pyx_v_max_str_len = __Pyx_PyIndex_AsSsize_t(values[12]); if (unlikely((__pyx_v_max_str_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 332, __pyx_L3_error) - } else { - __pyx_v_max_str_len = ((Py_ssize_t)-1L); - } - if (values[13]) { - __pyx_v_max_bin_len = __Pyx_PyIndex_AsSsize_t(values[13]); if (unlikely((__pyx_v_max_bin_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 333, __pyx_L3_error) - } else { - __pyx_v_max_bin_len = ((Py_ssize_t)-1L); - } - if (values[14]) { - __pyx_v_max_array_len = __Pyx_PyIndex_AsSsize_t(values[14]); if (unlikely((__pyx_v_max_array_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 334, __pyx_L3_error) - } else { - __pyx_v_max_array_len = ((Py_ssize_t)-1L); - } - if (values[15]) { - __pyx_v_max_map_len = __Pyx_PyIndex_AsSsize_t(values[15]); if (unlikely((__pyx_v_max_map_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 335, __pyx_L3_error) - } else { - __pyx_v_max_map_len = ((Py_ssize_t)-1L); - } - if (values[16]) { - __pyx_v_max_ext_len = __Pyx_PyIndex_AsSsize_t(values[16]); if (unlikely((__pyx_v_max_ext_len == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 336, __pyx_L3_error) - } else { - __pyx_v_max_ext_len = ((Py_ssize_t)-1L); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 1, __pyx_nargs); __PYX_ERR(1, 327, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_4__init__(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self), __pyx_v_file_like, __pyx_v_read_size, __pyx_v_use_list, __pyx_v_raw, __pyx_v_timestamp, __pyx_v_strict_map_key, __pyx_v_object_hook, __pyx_v_object_pairs_hook, __pyx_v_list_hook, __pyx_v_unicode_errors, __pyx_v_max_buffer_size, __pyx_v_ext_hook, __pyx_v_max_str_len, __pyx_v_max_bin_len, __pyx_v_max_array_len, __pyx_v_max_map_len, __pyx_v_max_ext_len); - - /* "msgpack/_unpacker.pyx":327 - * self.buf = NULL - * - * def __init__(self, file_like=None, *, Py_ssize_t read_size=0, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * object object_hook=None, object object_pairs_hook=None, object list_hook=None, - */ - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_4__init__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, PyObject *__pyx_v_file_like, Py_ssize_t __pyx_v_read_size, int __pyx_v_use_list, int __pyx_v_raw, int __pyx_v_timestamp, int __pyx_v_strict_map_key, PyObject *__pyx_v_object_hook, PyObject *__pyx_v_object_pairs_hook, PyObject *__pyx_v_list_hook, PyObject *__pyx_v_unicode_errors, Py_ssize_t __pyx_v_max_buffer_size, PyObject *__pyx_v_ext_hook, Py_ssize_t __pyx_v_max_str_len, Py_ssize_t __pyx_v_max_bin_len, Py_ssize_t __pyx_v_max_array_len, Py_ssize_t __pyx_v_max_map_len, Py_ssize_t __pyx_v_max_ext_len) { - char const *__pyx_v_cerr; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - long __pyx_t_3; - Py_ssize_t __pyx_t_4; - Py_ssize_t __pyx_t_5; - char const *__pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__init__", 0); - - /* "msgpack/_unpacker.pyx":337 - * Py_ssize_t max_map_len=-1, - * Py_ssize_t max_ext_len=-1): - * cdef const char *cerr=NULL # <<<<<<<<<<<<<< - * - * self.object_hook = object_hook - */ - __pyx_v_cerr = NULL; - - /* "msgpack/_unpacker.pyx":339 - * cdef const char *cerr=NULL - * - * self.object_hook = object_hook # <<<<<<<<<<<<<< - * self.object_pairs_hook = object_pairs_hook - * self.list_hook = list_hook - */ - __Pyx_INCREF(__pyx_v_object_hook); - __Pyx_GIVEREF(__pyx_v_object_hook); - __Pyx_GOTREF(__pyx_v_self->object_hook); - __Pyx_DECREF(__pyx_v_self->object_hook); - __pyx_v_self->object_hook = __pyx_v_object_hook; - - /* "msgpack/_unpacker.pyx":340 - * - * self.object_hook = object_hook - * self.object_pairs_hook = object_pairs_hook # <<<<<<<<<<<<<< - * self.list_hook = list_hook - * self.ext_hook = ext_hook - */ - __Pyx_INCREF(__pyx_v_object_pairs_hook); - __Pyx_GIVEREF(__pyx_v_object_pairs_hook); - __Pyx_GOTREF(__pyx_v_self->object_pairs_hook); - __Pyx_DECREF(__pyx_v_self->object_pairs_hook); - __pyx_v_self->object_pairs_hook = __pyx_v_object_pairs_hook; - - /* "msgpack/_unpacker.pyx":341 - * self.object_hook = object_hook - * self.object_pairs_hook = object_pairs_hook - * self.list_hook = list_hook # <<<<<<<<<<<<<< - * self.ext_hook = ext_hook - * - */ - __Pyx_INCREF(__pyx_v_list_hook); - __Pyx_GIVEREF(__pyx_v_list_hook); - __Pyx_GOTREF(__pyx_v_self->list_hook); - __Pyx_DECREF(__pyx_v_self->list_hook); - __pyx_v_self->list_hook = __pyx_v_list_hook; - - /* "msgpack/_unpacker.pyx":342 - * self.object_pairs_hook = object_pairs_hook - * self.list_hook = list_hook - * self.ext_hook = ext_hook # <<<<<<<<<<<<<< - * - * self.file_like = file_like - */ - __Pyx_INCREF(__pyx_v_ext_hook); - __Pyx_GIVEREF(__pyx_v_ext_hook); - __Pyx_GOTREF(__pyx_v_self->ext_hook); - __Pyx_DECREF(__pyx_v_self->ext_hook); - __pyx_v_self->ext_hook = __pyx_v_ext_hook; - - /* "msgpack/_unpacker.pyx":344 - * self.ext_hook = ext_hook - * - * self.file_like = file_like # <<<<<<<<<<<<<< - * if file_like: - * self.file_like_read = file_like.read - */ - __Pyx_INCREF(__pyx_v_file_like); - __Pyx_GIVEREF(__pyx_v_file_like); - __Pyx_GOTREF(__pyx_v_self->file_like); - __Pyx_DECREF(__pyx_v_self->file_like); - __pyx_v_self->file_like = __pyx_v_file_like; - - /* "msgpack/_unpacker.pyx":345 - * - * self.file_like = file_like - * if file_like: # <<<<<<<<<<<<<< - * self.file_like_read = file_like.read - * if not PyCallable_Check(self.file_like_read): - */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_file_like); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 345, __pyx_L1_error) - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":346 - * self.file_like = file_like - * if file_like: - * self.file_like_read = file_like.read # <<<<<<<<<<<<<< - * if not PyCallable_Check(self.file_like_read): - * raise TypeError("`file_like.read` must be a callable.") - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_file_like, __pyx_n_s_read); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 346, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __Pyx_GOTREF(__pyx_v_self->file_like_read); - __Pyx_DECREF(__pyx_v_self->file_like_read); - __pyx_v_self->file_like_read = __pyx_t_2; - __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":347 - * if file_like: - * self.file_like_read = file_like.read - * if not PyCallable_Check(self.file_like_read): # <<<<<<<<<<<<<< - * raise TypeError("`file_like.read` must be a callable.") - * - */ - __pyx_t_2 = __pyx_v_self->file_like_read; - __Pyx_INCREF(__pyx_t_2); - __pyx_t_1 = (!PyCallable_Check(__pyx_t_2)); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":348 - * self.file_like_read = file_like.read - * if not PyCallable_Check(self.file_like_read): - * raise TypeError("`file_like.read` must be a callable.") # <<<<<<<<<<<<<< - * - * if not max_buffer_size: - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 348, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(1, 348, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":347 - * if file_like: - * self.file_like_read = file_like.read - * if not PyCallable_Check(self.file_like_read): # <<<<<<<<<<<<<< - * raise TypeError("`file_like.read` must be a callable.") - * - */ - } - - /* "msgpack/_unpacker.pyx":345 - * - * self.file_like = file_like - * if file_like: # <<<<<<<<<<<<<< - * self.file_like_read = file_like.read - * if not PyCallable_Check(self.file_like_read): - */ - } - - /* "msgpack/_unpacker.pyx":350 - * raise TypeError("`file_like.read` must be a callable.") - * - * if not max_buffer_size: # <<<<<<<<<<<<<< - * max_buffer_size = INT_MAX - * if max_str_len == -1: - */ - __pyx_t_1 = (!(__pyx_v_max_buffer_size != 0)); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":351 - * - * if not max_buffer_size: - * max_buffer_size = INT_MAX # <<<<<<<<<<<<<< - * if max_str_len == -1: - * max_str_len = max_buffer_size - */ - __pyx_v_max_buffer_size = INT_MAX; - - /* "msgpack/_unpacker.pyx":350 - * raise TypeError("`file_like.read` must be a callable.") - * - * if not max_buffer_size: # <<<<<<<<<<<<<< - * max_buffer_size = INT_MAX - * if max_str_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":352 - * if not max_buffer_size: - * max_buffer_size = INT_MAX - * if max_str_len == -1: # <<<<<<<<<<<<<< - * max_str_len = max_buffer_size - * if max_bin_len == -1: - */ - __pyx_t_1 = (__pyx_v_max_str_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":353 - * max_buffer_size = INT_MAX - * if max_str_len == -1: - * max_str_len = max_buffer_size # <<<<<<<<<<<<<< - * if max_bin_len == -1: - * max_bin_len = max_buffer_size - */ - __pyx_v_max_str_len = __pyx_v_max_buffer_size; - - /* "msgpack/_unpacker.pyx":352 - * if not max_buffer_size: - * max_buffer_size = INT_MAX - * if max_str_len == -1: # <<<<<<<<<<<<<< - * max_str_len = max_buffer_size - * if max_bin_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":354 - * if max_str_len == -1: - * max_str_len = max_buffer_size - * if max_bin_len == -1: # <<<<<<<<<<<<<< - * max_bin_len = max_buffer_size - * if max_array_len == -1: - */ - __pyx_t_1 = (__pyx_v_max_bin_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":355 - * max_str_len = max_buffer_size - * if max_bin_len == -1: - * max_bin_len = max_buffer_size # <<<<<<<<<<<<<< - * if max_array_len == -1: - * max_array_len = max_buffer_size - */ - __pyx_v_max_bin_len = __pyx_v_max_buffer_size; - - /* "msgpack/_unpacker.pyx":354 - * if max_str_len == -1: - * max_str_len = max_buffer_size - * if max_bin_len == -1: # <<<<<<<<<<<<<< - * max_bin_len = max_buffer_size - * if max_array_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":356 - * if max_bin_len == -1: - * max_bin_len = max_buffer_size - * if max_array_len == -1: # <<<<<<<<<<<<<< - * max_array_len = max_buffer_size - * if max_map_len == -1: - */ - __pyx_t_1 = (__pyx_v_max_array_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":357 - * max_bin_len = max_buffer_size - * if max_array_len == -1: - * max_array_len = max_buffer_size # <<<<<<<<<<<<<< - * if max_map_len == -1: - * max_map_len = max_buffer_size//2 - */ - __pyx_v_max_array_len = __pyx_v_max_buffer_size; - - /* "msgpack/_unpacker.pyx":356 - * if max_bin_len == -1: - * max_bin_len = max_buffer_size - * if max_array_len == -1: # <<<<<<<<<<<<<< - * max_array_len = max_buffer_size - * if max_map_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":358 - * if max_array_len == -1: - * max_array_len = max_buffer_size - * if max_map_len == -1: # <<<<<<<<<<<<<< - * max_map_len = max_buffer_size//2 - * if max_ext_len == -1: - */ - __pyx_t_1 = (__pyx_v_max_map_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":359 - * max_array_len = max_buffer_size - * if max_map_len == -1: - * max_map_len = max_buffer_size//2 # <<<<<<<<<<<<<< - * if max_ext_len == -1: - * max_ext_len = max_buffer_size - */ - __pyx_v_max_map_len = __Pyx_div_Py_ssize_t(__pyx_v_max_buffer_size, 2); - - /* "msgpack/_unpacker.pyx":358 - * if max_array_len == -1: - * max_array_len = max_buffer_size - * if max_map_len == -1: # <<<<<<<<<<<<<< - * max_map_len = max_buffer_size//2 - * if max_ext_len == -1: - */ - } - - /* "msgpack/_unpacker.pyx":360 - * if max_map_len == -1: - * max_map_len = max_buffer_size//2 - * if max_ext_len == -1: # <<<<<<<<<<<<<< - * max_ext_len = max_buffer_size - * - */ - __pyx_t_1 = (__pyx_v_max_ext_len == -1L); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":361 - * max_map_len = max_buffer_size//2 - * if max_ext_len == -1: - * max_ext_len = max_buffer_size # <<<<<<<<<<<<<< - * - * if read_size > max_buffer_size: - */ - __pyx_v_max_ext_len = __pyx_v_max_buffer_size; - - /* "msgpack/_unpacker.pyx":360 - * if max_map_len == -1: - * max_map_len = max_buffer_size//2 - * if max_ext_len == -1: # <<<<<<<<<<<<<< - * max_ext_len = max_buffer_size - * - */ - } - - /* "msgpack/_unpacker.pyx":363 - * max_ext_len = max_buffer_size - * - * if read_size > max_buffer_size: # <<<<<<<<<<<<<< - * raise ValueError("read_size should be less or equal to max_buffer_size") - * if not read_size: - */ - __pyx_t_1 = (__pyx_v_read_size > __pyx_v_max_buffer_size); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":364 - * - * if read_size > max_buffer_size: - * raise ValueError("read_size should be less or equal to max_buffer_size") # <<<<<<<<<<<<<< - * if not read_size: - * read_size = min(max_buffer_size, 1024**2) - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 364, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(1, 364, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":363 - * max_ext_len = max_buffer_size - * - * if read_size > max_buffer_size: # <<<<<<<<<<<<<< - * raise ValueError("read_size should be less or equal to max_buffer_size") - * if not read_size: - */ - } - - /* "msgpack/_unpacker.pyx":365 - * if read_size > max_buffer_size: - * raise ValueError("read_size should be less or equal to max_buffer_size") - * if not read_size: # <<<<<<<<<<<<<< - * read_size = min(max_buffer_size, 1024**2) - * - */ - __pyx_t_1 = (!(__pyx_v_read_size != 0)); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":366 - * raise ValueError("read_size should be less or equal to max_buffer_size") - * if not read_size: - * read_size = min(max_buffer_size, 1024**2) # <<<<<<<<<<<<<< - * - * self.max_buffer_size = max_buffer_size - */ - __pyx_t_3 = 0x100000; - __pyx_t_4 = __pyx_v_max_buffer_size; - __pyx_t_1 = (__pyx_t_3 < __pyx_t_4); - if (__pyx_t_1) { - __pyx_t_5 = __pyx_t_3; - } else { - __pyx_t_5 = __pyx_t_4; - } - __pyx_v_read_size = __pyx_t_5; - - /* "msgpack/_unpacker.pyx":365 - * if read_size > max_buffer_size: - * raise ValueError("read_size should be less or equal to max_buffer_size") - * if not read_size: # <<<<<<<<<<<<<< - * read_size = min(max_buffer_size, 1024**2) - * - */ - } - - /* "msgpack/_unpacker.pyx":368 - * read_size = min(max_buffer_size, 1024**2) - * - * self.max_buffer_size = max_buffer_size # <<<<<<<<<<<<<< - * self.read_size = read_size - * self.buf = <char*>PyMem_Malloc(read_size) - */ - __pyx_v_self->max_buffer_size = __pyx_v_max_buffer_size; - - /* "msgpack/_unpacker.pyx":369 - * - * self.max_buffer_size = max_buffer_size - * self.read_size = read_size # <<<<<<<<<<<<<< - * self.buf = <char*>PyMem_Malloc(read_size) - * if self.buf == NULL: - */ - __pyx_v_self->read_size = __pyx_v_read_size; - - /* "msgpack/_unpacker.pyx":370 - * self.max_buffer_size = max_buffer_size - * self.read_size = read_size - * self.buf = <char*>PyMem_Malloc(read_size) # <<<<<<<<<<<<<< - * if self.buf == NULL: - * raise MemoryError("Unable to allocate internal buffer.") - */ - __pyx_v_self->buf = ((char *)PyMem_Malloc(__pyx_v_read_size)); - - /* "msgpack/_unpacker.pyx":371 - * self.read_size = read_size - * self.buf = <char*>PyMem_Malloc(read_size) - * if self.buf == NULL: # <<<<<<<<<<<<<< - * raise MemoryError("Unable to allocate internal buffer.") - * self.buf_size = read_size - */ - __pyx_t_1 = (__pyx_v_self->buf == NULL); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":372 - * self.buf = <char*>PyMem_Malloc(read_size) - * if self.buf == NULL: - * raise MemoryError("Unable to allocate internal buffer.") # <<<<<<<<<<<<<< - * self.buf_size = read_size - * self.buf_head = 0 - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 372, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(1, 372, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":371 - * self.read_size = read_size - * self.buf = <char*>PyMem_Malloc(read_size) - * if self.buf == NULL: # <<<<<<<<<<<<<< - * raise MemoryError("Unable to allocate internal buffer.") - * self.buf_size = read_size - */ - } - - /* "msgpack/_unpacker.pyx":373 - * if self.buf == NULL: - * raise MemoryError("Unable to allocate internal buffer.") - * self.buf_size = read_size # <<<<<<<<<<<<<< - * self.buf_head = 0 - * self.buf_tail = 0 - */ - __pyx_v_self->buf_size = __pyx_v_read_size; - - /* "msgpack/_unpacker.pyx":374 - * raise MemoryError("Unable to allocate internal buffer.") - * self.buf_size = read_size - * self.buf_head = 0 # <<<<<<<<<<<<<< - * self.buf_tail = 0 - * self.stream_offset = 0 - */ - __pyx_v_self->buf_head = 0; - - /* "msgpack/_unpacker.pyx":375 - * self.buf_size = read_size - * self.buf_head = 0 - * self.buf_tail = 0 # <<<<<<<<<<<<<< - * self.stream_offset = 0 - * - */ - __pyx_v_self->buf_tail = 0; - - /* "msgpack/_unpacker.pyx":376 - * self.buf_head = 0 - * self.buf_tail = 0 - * self.stream_offset = 0 # <<<<<<<<<<<<<< - * - * if unicode_errors is not None: - */ - __pyx_v_self->stream_offset = 0; - - /* "msgpack/_unpacker.pyx":378 - * self.stream_offset = 0 - * - * if unicode_errors is not None: # <<<<<<<<<<<<<< - * self.unicode_errors = unicode_errors - * cerr = unicode_errors - */ - __pyx_t_1 = (__pyx_v_unicode_errors != Py_None); - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":379 - * - * if unicode_errors is not None: - * self.unicode_errors = unicode_errors # <<<<<<<<<<<<<< - * cerr = unicode_errors - * - */ - __Pyx_INCREF(__pyx_v_unicode_errors); - __Pyx_GIVEREF(__pyx_v_unicode_errors); - __Pyx_GOTREF(__pyx_v_self->unicode_errors); - __Pyx_DECREF(__pyx_v_self->unicode_errors); - __pyx_v_self->unicode_errors = __pyx_v_unicode_errors; - - /* "msgpack/_unpacker.pyx":380 - * if unicode_errors is not None: - * self.unicode_errors = unicode_errors - * cerr = unicode_errors # <<<<<<<<<<<<<< - * - * init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook, - */ - __pyx_t_6 = __Pyx_PyObject_AsString(__pyx_v_unicode_errors); if (unlikely((!__pyx_t_6) && PyErr_Occurred())) __PYX_ERR(1, 380, __pyx_L1_error) - __pyx_v_cerr = __pyx_t_6; - - /* "msgpack/_unpacker.pyx":378 - * self.stream_offset = 0 - * - * if unicode_errors is not None: # <<<<<<<<<<<<<< - * self.unicode_errors = unicode_errors - * cerr = unicode_errors - */ - } - - /* "msgpack/_unpacker.pyx":382 - * cerr = unicode_errors - * - * init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook, # <<<<<<<<<<<<<< - * ext_hook, use_list, raw, timestamp, strict_map_key, cerr, - * max_str_len, max_bin_len, max_array_len, - */ - __pyx_t_2 = __pyx_f_7msgpack_9_cmsgpack_init_ctx((&__pyx_v_self->ctx), __pyx_v_object_hook, __pyx_v_object_pairs_hook, __pyx_v_list_hook, __pyx_v_ext_hook, __pyx_v_use_list, __pyx_v_raw, __pyx_v_timestamp, __pyx_v_strict_map_key, __pyx_v_cerr, __pyx_v_max_str_len, __pyx_v_max_bin_len, __pyx_v_max_array_len, __pyx_v_max_map_len, __pyx_v_max_ext_len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 382, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":327 - * self.buf = NULL - * - * def __init__(self, file_like=None, *, Py_ssize_t read_size=0, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * object object_hook=None, object object_pairs_hook=None, object list_hook=None, - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":387 - * max_map_len, max_ext_len) - * - * def feed(self, object next_bytes): # <<<<<<<<<<<<<< - * """Append `next_bytes` to internal buffer.""" - * cdef Py_buffer pybuff - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_7feed(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_6feed, "Unpacker.feed(self, next_bytes)\nAppend `next_bytes` to internal buffer."); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_7feed = {"feed", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_7feed, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_6feed}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_7feed(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PyObject *__pyx_v_next_bytes = 0; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[1] = {0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("feed (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 387, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_next_bytes,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_next_bytes)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 387, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "feed") < 0)) __PYX_ERR(1, 387, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v_next_bytes = values[0]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("feed", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 387, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.feed", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_6feed(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self), __pyx_v_next_bytes); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_6feed(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, PyObject *__pyx_v_next_bytes) { - Py_buffer __pyx_v_pybuff; - char *__pyx_v_buf; - Py_ssize_t __pyx_v_buf_len; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_t_3; - int __pyx_t_4; - char const *__pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("feed", 0); - - /* "msgpack/_unpacker.pyx":393 - * cdef Py_ssize_t buf_len - * - * if self.file_like is not None: # <<<<<<<<<<<<<< - * raise AssertionError( - * "unpacker.feed() is not be able to use with `file_like`.") - */ - __pyx_t_1 = (__pyx_v_self->file_like != Py_None); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":394 - * - * if self.file_like is not None: - * raise AssertionError( # <<<<<<<<<<<<<< - * "unpacker.feed() is not be able to use with `file_like`.") - * - */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_AssertionError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 394, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(1, 394, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":393 - * cdef Py_ssize_t buf_len - * - * if self.file_like is not None: # <<<<<<<<<<<<<< - * raise AssertionError( - * "unpacker.feed() is not be able to use with `file_like`.") - */ - } - - /* "msgpack/_unpacker.pyx":397 - * "unpacker.feed() is not be able to use with `file_like`.") - * - * get_data_from_buffer(next_bytes, &pybuff, &buf, &buf_len) # <<<<<<<<<<<<<< - * try: - * self.append_buffer(buf, buf_len) - */ - __pyx_t_3 = __pyx_f_7msgpack_9_cmsgpack_get_data_from_buffer(__pyx_v_next_bytes, (&__pyx_v_pybuff), (&__pyx_v_buf), (&__pyx_v_buf_len)); if (unlikely(__pyx_t_3 == ((int)0))) __PYX_ERR(1, 397, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":398 - * - * get_data_from_buffer(next_bytes, &pybuff, &buf, &buf_len) - * try: # <<<<<<<<<<<<<< - * self.append_buffer(buf, buf_len) - * finally: - */ - /*try:*/ { - - /* "msgpack/_unpacker.pyx":399 - * get_data_from_buffer(next_bytes, &pybuff, &buf, &buf_len) - * try: - * self.append_buffer(buf, buf_len) # <<<<<<<<<<<<<< - * finally: - * PyBuffer_Release(&pybuff) - */ - __pyx_t_2 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self->__pyx_vtab)->append_buffer(__pyx_v_self, __pyx_v_buf, __pyx_v_buf_len); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 399, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } - - /* "msgpack/_unpacker.pyx":401 - * self.append_buffer(buf, buf_len) - * finally: - * PyBuffer_Release(&pybuff) # <<<<<<<<<<<<<< - * - * cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len): - */ - /*finally:*/ { - /*normal exit:*/{ - PyBuffer_Release((&__pyx_v_pybuff)); - goto __pyx_L6; - } - __pyx_L5_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_9, &__pyx_t_10, &__pyx_t_11); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8) < 0)) __Pyx_ErrFetch(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8); - __Pyx_XGOTREF(__pyx_t_6); - __Pyx_XGOTREF(__pyx_t_7); - __Pyx_XGOTREF(__pyx_t_8); - __Pyx_XGOTREF(__pyx_t_9); - __Pyx_XGOTREF(__pyx_t_10); - __Pyx_XGOTREF(__pyx_t_11); - __pyx_t_3 = __pyx_lineno; __pyx_t_4 = __pyx_clineno; __pyx_t_5 = __pyx_filename; - { - PyBuffer_Release((&__pyx_v_pybuff)); - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_9); - __Pyx_XGIVEREF(__pyx_t_10); - __Pyx_XGIVEREF(__pyx_t_11); - __Pyx_ExceptionReset(__pyx_t_9, __pyx_t_10, __pyx_t_11); - } - __Pyx_XGIVEREF(__pyx_t_6); - __Pyx_XGIVEREF(__pyx_t_7); - __Pyx_XGIVEREF(__pyx_t_8); - __Pyx_ErrRestore(__pyx_t_6, __pyx_t_7, __pyx_t_8); - __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; - __pyx_lineno = __pyx_t_3; __pyx_clineno = __pyx_t_4; __pyx_filename = __pyx_t_5; - goto __pyx_L1_error; - } - __pyx_L6:; - } - - /* "msgpack/_unpacker.pyx":387 - * max_map_len, max_ext_len) - * - * def feed(self, object next_bytes): # <<<<<<<<<<<<<< - * """Append `next_bytes` to internal buffer.""" - * cdef Py_buffer pybuff - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.feed", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":403 - * PyBuffer_Release(&pybuff) - * - * cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len): # <<<<<<<<<<<<<< - * cdef: - * char* buf = self.buf - */ - -static PyObject *__pyx_f_7msgpack_9_cmsgpack_8Unpacker_append_buffer(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, void *__pyx_v__buf, Py_ssize_t __pyx_v__buf_len) { - char *__pyx_v_buf; - char *__pyx_v_new_buf; - Py_ssize_t __pyx_v_head; - Py_ssize_t __pyx_v_tail; - Py_ssize_t __pyx_v_buf_size; - Py_ssize_t __pyx_v_new_size; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - char *__pyx_t_1; - Py_ssize_t __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - Py_ssize_t __pyx_t_5; - Py_ssize_t __pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("append_buffer", 0); - - /* "msgpack/_unpacker.pyx":405 - * cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len): - * cdef: - * char* buf = self.buf # <<<<<<<<<<<<<< - * char* new_buf - * Py_ssize_t head = self.buf_head - */ - __pyx_t_1 = __pyx_v_self->buf; - __pyx_v_buf = __pyx_t_1; - - /* "msgpack/_unpacker.pyx":407 - * char* buf = self.buf - * char* new_buf - * Py_ssize_t head = self.buf_head # <<<<<<<<<<<<<< - * Py_ssize_t tail = self.buf_tail - * Py_ssize_t buf_size = self.buf_size - */ - __pyx_t_2 = __pyx_v_self->buf_head; - __pyx_v_head = __pyx_t_2; - - /* "msgpack/_unpacker.pyx":408 - * char* new_buf - * Py_ssize_t head = self.buf_head - * Py_ssize_t tail = self.buf_tail # <<<<<<<<<<<<<< - * Py_ssize_t buf_size = self.buf_size - * Py_ssize_t new_size - */ - __pyx_t_2 = __pyx_v_self->buf_tail; - __pyx_v_tail = __pyx_t_2; - - /* "msgpack/_unpacker.pyx":409 - * Py_ssize_t head = self.buf_head - * Py_ssize_t tail = self.buf_tail - * Py_ssize_t buf_size = self.buf_size # <<<<<<<<<<<<<< - * Py_ssize_t new_size - * - */ - __pyx_t_2 = __pyx_v_self->buf_size; - __pyx_v_buf_size = __pyx_t_2; - - /* "msgpack/_unpacker.pyx":412 - * Py_ssize_t new_size - * - * if tail + _buf_len > buf_size: # <<<<<<<<<<<<<< - * if ((tail - head) + _buf_len) <= buf_size: - * # move to front. - */ - __pyx_t_3 = ((__pyx_v_tail + __pyx_v__buf_len) > __pyx_v_buf_size); - if (__pyx_t_3) { - - /* "msgpack/_unpacker.pyx":413 - * - * if tail + _buf_len > buf_size: - * if ((tail - head) + _buf_len) <= buf_size: # <<<<<<<<<<<<<< - * # move to front. - * memmove(buf, buf + head, tail - head) - */ - __pyx_t_3 = (((__pyx_v_tail - __pyx_v_head) + __pyx_v__buf_len) <= __pyx_v_buf_size); - if (__pyx_t_3) { - - /* "msgpack/_unpacker.pyx":415 - * if ((tail - head) + _buf_len) <= buf_size: - * # move to front. - * memmove(buf, buf + head, tail - head) # <<<<<<<<<<<<<< - * tail -= head - * head = 0 - */ - (void)(memmove(__pyx_v_buf, (__pyx_v_buf + __pyx_v_head), (__pyx_v_tail - __pyx_v_head))); - - /* "msgpack/_unpacker.pyx":416 - * # move to front. - * memmove(buf, buf + head, tail - head) - * tail -= head # <<<<<<<<<<<<<< - * head = 0 - * else: - */ - __pyx_v_tail = (__pyx_v_tail - __pyx_v_head); - - /* "msgpack/_unpacker.pyx":417 - * memmove(buf, buf + head, tail - head) - * tail -= head - * head = 0 # <<<<<<<<<<<<<< - * else: - * # expand buffer. - */ - __pyx_v_head = 0; - - /* "msgpack/_unpacker.pyx":413 - * - * if tail + _buf_len > buf_size: - * if ((tail - head) + _buf_len) <= buf_size: # <<<<<<<<<<<<<< - * # move to front. - * memmove(buf, buf + head, tail - head) - */ - goto __pyx_L4; - } - - /* "msgpack/_unpacker.pyx":420 - * else: - * # expand buffer. - * new_size = (tail-head) + _buf_len # <<<<<<<<<<<<<< - * if new_size > self.max_buffer_size: - * raise BufferFull - */ - /*else*/ { - __pyx_v_new_size = ((__pyx_v_tail - __pyx_v_head) + __pyx_v__buf_len); - - /* "msgpack/_unpacker.pyx":421 - * # expand buffer. - * new_size = (tail-head) + _buf_len - * if new_size > self.max_buffer_size: # <<<<<<<<<<<<<< - * raise BufferFull - * new_size = min(new_size*2, self.max_buffer_size) - */ - __pyx_t_3 = (__pyx_v_new_size > __pyx_v_self->max_buffer_size); - if (unlikely(__pyx_t_3)) { - - /* "msgpack/_unpacker.pyx":422 - * new_size = (tail-head) + _buf_len - * if new_size > self.max_buffer_size: - * raise BufferFull # <<<<<<<<<<<<<< - * new_size = min(new_size*2, self.max_buffer_size) - * new_buf = <char*>PyMem_Malloc(new_size) - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_BufferFull); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 422, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 422, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":421 - * # expand buffer. - * new_size = (tail-head) + _buf_len - * if new_size > self.max_buffer_size: # <<<<<<<<<<<<<< - * raise BufferFull - * new_size = min(new_size*2, self.max_buffer_size) - */ - } - - /* "msgpack/_unpacker.pyx":423 - * if new_size > self.max_buffer_size: - * raise BufferFull - * new_size = min(new_size*2, self.max_buffer_size) # <<<<<<<<<<<<<< - * new_buf = <char*>PyMem_Malloc(new_size) - * if new_buf == NULL: - */ - __pyx_t_2 = __pyx_v_self->max_buffer_size; - __pyx_t_5 = (__pyx_v_new_size * 2); - __pyx_t_3 = (__pyx_t_2 < __pyx_t_5); - if (__pyx_t_3) { - __pyx_t_6 = __pyx_t_2; - } else { - __pyx_t_6 = __pyx_t_5; - } - __pyx_v_new_size = __pyx_t_6; - - /* "msgpack/_unpacker.pyx":424 - * raise BufferFull - * new_size = min(new_size*2, self.max_buffer_size) - * new_buf = <char*>PyMem_Malloc(new_size) # <<<<<<<<<<<<<< - * if new_buf == NULL: - * # self.buf still holds old buffer and will be freed during - */ - __pyx_v_new_buf = ((char *)PyMem_Malloc(__pyx_v_new_size)); - - /* "msgpack/_unpacker.pyx":425 - * new_size = min(new_size*2, self.max_buffer_size) - * new_buf = <char*>PyMem_Malloc(new_size) - * if new_buf == NULL: # <<<<<<<<<<<<<< - * # self.buf still holds old buffer and will be freed during - * # obj destruction - */ - __pyx_t_3 = (__pyx_v_new_buf == NULL); - if (unlikely(__pyx_t_3)) { - - /* "msgpack/_unpacker.pyx":428 - * # self.buf still holds old buffer and will be freed during - * # obj destruction - * raise MemoryError("Unable to enlarge internal buffer.") # <<<<<<<<<<<<<< - * memcpy(new_buf, buf + head, tail - head) - * PyMem_Free(buf) - */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 428, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 428, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":425 - * new_size = min(new_size*2, self.max_buffer_size) - * new_buf = <char*>PyMem_Malloc(new_size) - * if new_buf == NULL: # <<<<<<<<<<<<<< - * # self.buf still holds old buffer and will be freed during - * # obj destruction - */ - } - - /* "msgpack/_unpacker.pyx":429 - * # obj destruction - * raise MemoryError("Unable to enlarge internal buffer.") - * memcpy(new_buf, buf + head, tail - head) # <<<<<<<<<<<<<< - * PyMem_Free(buf) - * - */ - (void)(memcpy(__pyx_v_new_buf, (__pyx_v_buf + __pyx_v_head), (__pyx_v_tail - __pyx_v_head))); - - /* "msgpack/_unpacker.pyx":430 - * raise MemoryError("Unable to enlarge internal buffer.") - * memcpy(new_buf, buf + head, tail - head) - * PyMem_Free(buf) # <<<<<<<<<<<<<< - * - * buf = new_buf - */ - PyMem_Free(__pyx_v_buf); - - /* "msgpack/_unpacker.pyx":432 - * PyMem_Free(buf) - * - * buf = new_buf # <<<<<<<<<<<<<< - * buf_size = new_size - * tail -= head - */ - __pyx_v_buf = __pyx_v_new_buf; - - /* "msgpack/_unpacker.pyx":433 - * - * buf = new_buf - * buf_size = new_size # <<<<<<<<<<<<<< - * tail -= head - * head = 0 - */ - __pyx_v_buf_size = __pyx_v_new_size; - - /* "msgpack/_unpacker.pyx":434 - * buf = new_buf - * buf_size = new_size - * tail -= head # <<<<<<<<<<<<<< - * head = 0 - * - */ - __pyx_v_tail = (__pyx_v_tail - __pyx_v_head); - - /* "msgpack/_unpacker.pyx":435 - * buf_size = new_size - * tail -= head - * head = 0 # <<<<<<<<<<<<<< - * - * memcpy(buf + tail, <char*>(_buf), _buf_len) - */ - __pyx_v_head = 0; - } - __pyx_L4:; - - /* "msgpack/_unpacker.pyx":412 - * Py_ssize_t new_size - * - * if tail + _buf_len > buf_size: # <<<<<<<<<<<<<< - * if ((tail - head) + _buf_len) <= buf_size: - * # move to front. - */ - } - - /* "msgpack/_unpacker.pyx":437 - * head = 0 - * - * memcpy(buf + tail, <char*>(_buf), _buf_len) # <<<<<<<<<<<<<< - * self.buf = buf - * self.buf_head = head - */ - (void)(memcpy((__pyx_v_buf + __pyx_v_tail), ((char *)__pyx_v__buf), __pyx_v__buf_len)); - - /* "msgpack/_unpacker.pyx":438 - * - * memcpy(buf + tail, <char*>(_buf), _buf_len) - * self.buf = buf # <<<<<<<<<<<<<< - * self.buf_head = head - * self.buf_size = buf_size - */ - __pyx_v_self->buf = __pyx_v_buf; - - /* "msgpack/_unpacker.pyx":439 - * memcpy(buf + tail, <char*>(_buf), _buf_len) - * self.buf = buf - * self.buf_head = head # <<<<<<<<<<<<<< - * self.buf_size = buf_size - * self.buf_tail = tail + _buf_len - */ - __pyx_v_self->buf_head = __pyx_v_head; - - /* "msgpack/_unpacker.pyx":440 - * self.buf = buf - * self.buf_head = head - * self.buf_size = buf_size # <<<<<<<<<<<<<< - * self.buf_tail = tail + _buf_len - * - */ - __pyx_v_self->buf_size = __pyx_v_buf_size; - - /* "msgpack/_unpacker.pyx":441 - * self.buf_head = head - * self.buf_size = buf_size - * self.buf_tail = tail + _buf_len # <<<<<<<<<<<<<< - * - * cdef int read_from_file(self) except -1: - */ - __pyx_v_self->buf_tail = (__pyx_v_tail + __pyx_v__buf_len); - - /* "msgpack/_unpacker.pyx":403 - * PyBuffer_Release(&pybuff) - * - * cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len): # <<<<<<<<<<<<<< - * cdef: - * char* buf = self.buf - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.append_buffer", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":443 - * self.buf_tail = tail + _buf_len - * - * cdef int read_from_file(self) except -1: # <<<<<<<<<<<<<< - * cdef Py_ssize_t remains = self.max_buffer_size - (self.buf_tail - self.buf_head) - * if remains <= 0: - */ - -static int __pyx_f_7msgpack_9_cmsgpack_8Unpacker_read_from_file(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - Py_ssize_t __pyx_v_remains; - PyObject *__pyx_v_next_bytes = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - Py_ssize_t __pyx_t_3; - Py_ssize_t __pyx_t_4; - Py_ssize_t __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_t_9; - char *__pyx_t_10; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("read_from_file", 0); - - /* "msgpack/_unpacker.pyx":444 - * - * cdef int read_from_file(self) except -1: - * cdef Py_ssize_t remains = self.max_buffer_size - (self.buf_tail - self.buf_head) # <<<<<<<<<<<<<< - * if remains <= 0: - * raise BufferFull - */ - __pyx_v_remains = (__pyx_v_self->max_buffer_size - (__pyx_v_self->buf_tail - __pyx_v_self->buf_head)); - - /* "msgpack/_unpacker.pyx":445 - * cdef int read_from_file(self) except -1: - * cdef Py_ssize_t remains = self.max_buffer_size - (self.buf_tail - self.buf_head) - * if remains <= 0: # <<<<<<<<<<<<<< - * raise BufferFull - * - */ - __pyx_t_1 = (__pyx_v_remains <= 0); - if (unlikely(__pyx_t_1)) { - - /* "msgpack/_unpacker.pyx":446 - * cdef Py_ssize_t remains = self.max_buffer_size - (self.buf_tail - self.buf_head) - * if remains <= 0: - * raise BufferFull # <<<<<<<<<<<<<< - * - * next_bytes = self.file_like_read(min(self.read_size, remains)) - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_BufferFull); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 446, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(1, 446, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":445 - * cdef int read_from_file(self) except -1: - * cdef Py_ssize_t remains = self.max_buffer_size - (self.buf_tail - self.buf_head) - * if remains <= 0: # <<<<<<<<<<<<<< - * raise BufferFull - * - */ - } - - /* "msgpack/_unpacker.pyx":448 - * raise BufferFull - * - * next_bytes = self.file_like_read(min(self.read_size, remains)) # <<<<<<<<<<<<<< - * if next_bytes: - * self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes)) - */ - __pyx_t_3 = __pyx_v_remains; - __pyx_t_4 = __pyx_v_self->read_size; - __pyx_t_1 = (__pyx_t_3 < __pyx_t_4); - if (__pyx_t_1) { - __pyx_t_5 = __pyx_t_3; - } else { - __pyx_t_5 = __pyx_t_4; - } - __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 448, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_INCREF(__pyx_v_self->file_like_read); - __pyx_t_7 = __pyx_v_self->file_like_read; __pyx_t_8 = NULL; - __pyx_t_9 = 0; - #if CYTHON_UNPACK_METHODS - if (likely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_8)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_8); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - __pyx_t_9 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_8, __pyx_t_6}; - __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 448, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - } - __pyx_v_next_bytes = __pyx_t_2; - __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":449 - * - * next_bytes = self.file_like_read(min(self.read_size, remains)) - * if next_bytes: # <<<<<<<<<<<<<< - * self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes)) - * else: - */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_next_bytes); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(1, 449, __pyx_L1_error) - if (__pyx_t_1) { - - /* "msgpack/_unpacker.pyx":450 - * next_bytes = self.file_like_read(min(self.read_size, remains)) - * if next_bytes: - * self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes)) # <<<<<<<<<<<<<< - * else: - * self.file_like = None - */ - __pyx_t_10 = PyBytes_AsString(__pyx_v_next_bytes); if (unlikely(__pyx_t_10 == ((char *)NULL))) __PYX_ERR(1, 450, __pyx_L1_error) - __pyx_t_5 = PyBytes_Size(__pyx_v_next_bytes); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1L))) __PYX_ERR(1, 450, __pyx_L1_error) - __pyx_t_2 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self->__pyx_vtab)->append_buffer(__pyx_v_self, __pyx_t_10, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 450, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":449 - * - * next_bytes = self.file_like_read(min(self.read_size, remains)) - * if next_bytes: # <<<<<<<<<<<<<< - * self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes)) - * else: - */ - goto __pyx_L4; - } - - /* "msgpack/_unpacker.pyx":452 - * self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes)) - * else: - * self.file_like = None # <<<<<<<<<<<<<< - * return 0 - * - */ - /*else*/ { - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_self->file_like); - __Pyx_DECREF(__pyx_v_self->file_like); - __pyx_v_self->file_like = Py_None; - } - __pyx_L4:; - - /* "msgpack/_unpacker.pyx":453 - * else: - * self.file_like = None - * return 0 # <<<<<<<<<<<<<< - * - * cdef object _unpack(self, execute_fn execute, bint iter=0): - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":443 - * self.buf_tail = tail + _buf_len - * - * cdef int read_from_file(self) except -1: # <<<<<<<<<<<<<< - * cdef Py_ssize_t remains = self.max_buffer_size - (self.buf_tail - self.buf_head) - * if remains <= 0: - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.read_from_file", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_next_bytes); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":455 - * return 0 - * - * cdef object _unpack(self, execute_fn execute, bint iter=0): # <<<<<<<<<<<<<< - * cdef int ret - * cdef object obj - */ - -static PyObject *__pyx_f_7msgpack_9_cmsgpack_8Unpacker__unpack(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, execute_fn __pyx_v_execute, struct __pyx_opt_args_7msgpack_9_cmsgpack_8Unpacker__unpack *__pyx_optional_args) { - int __pyx_v_iter = ((int)0); - int __pyx_v_ret; - PyObject *__pyx_v_obj = 0; - Py_ssize_t __pyx_v_prev_head; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_unpack", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_iter = __pyx_optional_args->iter; - } - } - - /* "msgpack/_unpacker.pyx":460 - * cdef Py_ssize_t prev_head - * - * while 1: # <<<<<<<<<<<<<< - * prev_head = self.buf_head - * if prev_head < self.buf_tail: - */ - while (1) { - - /* "msgpack/_unpacker.pyx":461 - * - * while 1: - * prev_head = self.buf_head # <<<<<<<<<<<<<< - * if prev_head < self.buf_tail: - * ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) - */ - __pyx_t_1 = __pyx_v_self->buf_head; - __pyx_v_prev_head = __pyx_t_1; - - /* "msgpack/_unpacker.pyx":462 - * while 1: - * prev_head = self.buf_head - * if prev_head < self.buf_tail: # <<<<<<<<<<<<<< - * ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) - * self.stream_offset += self.buf_head - prev_head - */ - __pyx_t_2 = (__pyx_v_prev_head < __pyx_v_self->buf_tail); - if (__pyx_t_2) { - - /* "msgpack/_unpacker.pyx":463 - * prev_head = self.buf_head - * if prev_head < self.buf_tail: - * ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) # <<<<<<<<<<<<<< - * self.stream_offset += self.buf_head - prev_head - * else: - */ - __pyx_t_3 = __pyx_v_execute((&__pyx_v_self->ctx), __pyx_v_self->buf, __pyx_v_self->buf_tail, (&__pyx_v_self->buf_head)); if (unlikely(__pyx_t_3 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(1, 463, __pyx_L1_error) - __pyx_v_ret = __pyx_t_3; - - /* "msgpack/_unpacker.pyx":464 - * if prev_head < self.buf_tail: - * ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) - * self.stream_offset += self.buf_head - prev_head # <<<<<<<<<<<<<< - * else: - * ret = 0 - */ - __pyx_v_self->stream_offset = (__pyx_v_self->stream_offset + (__pyx_v_self->buf_head - __pyx_v_prev_head)); - - /* "msgpack/_unpacker.pyx":462 - * while 1: - * prev_head = self.buf_head - * if prev_head < self.buf_tail: # <<<<<<<<<<<<<< - * ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) - * self.stream_offset += self.buf_head - prev_head - */ - goto __pyx_L5; - } - - /* "msgpack/_unpacker.pyx":466 - * self.stream_offset += self.buf_head - prev_head - * else: - * ret = 0 # <<<<<<<<<<<<<< - * - * if ret == 1: - */ - /*else*/ { - __pyx_v_ret = 0; - } - __pyx_L5:; - - /* "msgpack/_unpacker.pyx":468 - * ret = 0 - * - * if ret == 1: # <<<<<<<<<<<<<< - * obj = unpack_data(&self.ctx) - * unpack_init(&self.ctx) - */ - switch (__pyx_v_ret) { - case 1: - - /* "msgpack/_unpacker.pyx":469 - * - * if ret == 1: - * obj = unpack_data(&self.ctx) # <<<<<<<<<<<<<< - * unpack_init(&self.ctx) - * return obj - */ - __pyx_t_4 = unpack_data((&__pyx_v_self->ctx)); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 469, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_v_obj = __pyx_t_4; - __pyx_t_4 = 0; - - /* "msgpack/_unpacker.pyx":470 - * if ret == 1: - * obj = unpack_data(&self.ctx) - * unpack_init(&self.ctx) # <<<<<<<<<<<<<< - * return obj - * elif ret == 0: - */ - unpack_init((&__pyx_v_self->ctx)); - - /* "msgpack/_unpacker.pyx":471 - * obj = unpack_data(&self.ctx) - * unpack_init(&self.ctx) - * return obj # <<<<<<<<<<<<<< - * elif ret == 0: - * if self.file_like is not None: - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_obj); - __pyx_r = __pyx_v_obj; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":468 - * ret = 0 - * - * if ret == 1: # <<<<<<<<<<<<<< - * obj = unpack_data(&self.ctx) - * unpack_init(&self.ctx) - */ - break; - case 0: - - /* "msgpack/_unpacker.pyx":473 - * return obj - * elif ret == 0: - * if self.file_like is not None: # <<<<<<<<<<<<<< - * self.read_from_file() - * continue - */ - __pyx_t_2 = (__pyx_v_self->file_like != Py_None); - if (__pyx_t_2) { - - /* "msgpack/_unpacker.pyx":474 - * elif ret == 0: - * if self.file_like is not None: - * self.read_from_file() # <<<<<<<<<<<<<< - * continue - * if iter: - */ - __pyx_t_3 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self->__pyx_vtab)->read_from_file(__pyx_v_self); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(1, 474, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":475 - * if self.file_like is not None: - * self.read_from_file() - * continue # <<<<<<<<<<<<<< - * if iter: - * raise StopIteration("No more data to unpack.") - */ - goto __pyx_L3_continue; - - /* "msgpack/_unpacker.pyx":473 - * return obj - * elif ret == 0: - * if self.file_like is not None: # <<<<<<<<<<<<<< - * self.read_from_file() - * continue - */ - } - - /* "msgpack/_unpacker.pyx":476 - * self.read_from_file() - * continue - * if iter: # <<<<<<<<<<<<<< - * raise StopIteration("No more data to unpack.") - * else: - */ - if (unlikely(__pyx_v_iter)) { - - /* "msgpack/_unpacker.pyx":477 - * continue - * if iter: - * raise StopIteration("No more data to unpack.") # <<<<<<<<<<<<<< - * else: - * raise OutOfData("No more data to unpack.") - */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_StopIteration, __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 477, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 477, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":476 - * self.read_from_file() - * continue - * if iter: # <<<<<<<<<<<<<< - * raise StopIteration("No more data to unpack.") - * else: - */ - } - - /* "msgpack/_unpacker.pyx":479 - * raise StopIteration("No more data to unpack.") - * else: - * raise OutOfData("No more data to unpack.") # <<<<<<<<<<<<<< - * elif ret == -2: - * raise FormatError - */ - /*else*/ { - __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_OutOfData); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 479, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = NULL; - __pyx_t_3 = 0; - #if CYTHON_UNPACK_METHODS - if (unlikely(PyMethod_Check(__pyx_t_5))) { - __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5); - if (likely(__pyx_t_6)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_5, function); - __pyx_t_3 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_6, __pyx_kp_u_No_more_data_to_unpack}; - __pyx_t_4 = __Pyx_PyObject_FastCall(__pyx_t_5, __pyx_callargs+1-__pyx_t_3, 1+__pyx_t_3); - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 479, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 479, __pyx_L1_error) - } - - /* "msgpack/_unpacker.pyx":472 - * unpack_init(&self.ctx) - * return obj - * elif ret == 0: # <<<<<<<<<<<<<< - * if self.file_like is not None: - * self.read_from_file() - */ - break; - case -2L: - - /* "msgpack/_unpacker.pyx":481 - * raise OutOfData("No more data to unpack.") - * elif ret == -2: - * raise FormatError # <<<<<<<<<<<<<< - * elif ret == -3: - * raise StackError - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_FormatError); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 481, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 481, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":480 - * else: - * raise OutOfData("No more data to unpack.") - * elif ret == -2: # <<<<<<<<<<<<<< - * raise FormatError - * elif ret == -3: - */ - break; - case -3L: - - /* "msgpack/_unpacker.pyx":483 - * raise FormatError - * elif ret == -3: - * raise StackError # <<<<<<<<<<<<<< - * else: - * raise ValueError("Unpack failed: error = %d" % (ret,)) - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_StackError); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 483, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 483, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":482 - * elif ret == -2: - * raise FormatError - * elif ret == -3: # <<<<<<<<<<<<<< - * raise StackError - * else: - */ - break; - default: - - /* "msgpack/_unpacker.pyx":485 - * raise StackError - * else: - * raise ValueError("Unpack failed: error = %d" % (ret,)) # <<<<<<<<<<<<<< - * - * def read_bytes(self, Py_ssize_t nbytes): - */ - __pyx_t_4 = __Pyx_PyUnicode_From_int(__pyx_v_ret, 0, ' ', 'd'); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 485, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Unpack_failed_error, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 485, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 485, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 485, __pyx_L1_error) - break; - } - __pyx_L3_continue:; - } - - /* "msgpack/_unpacker.pyx":455 - * return 0 - * - * cdef object _unpack(self, execute_fn execute, bint iter=0): # <<<<<<<<<<<<<< - * cdef int ret - * cdef object obj - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker._unpack", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_obj); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":487 - * raise ValueError("Unpack failed: error = %d" % (ret,)) - * - * def read_bytes(self, Py_ssize_t nbytes): # <<<<<<<<<<<<<< - * """Read a specified number of raw bytes from the stream""" - * cdef Py_ssize_t nread - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_9read_bytes(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_8read_bytes, "Unpacker.read_bytes(self, Py_ssize_t nbytes)\nRead a specified number of raw bytes from the stream"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_9read_bytes = {"read_bytes", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_9read_bytes, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_8read_bytes}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_9read_bytes(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - Py_ssize_t __pyx_v_nbytes; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[1] = {0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("read_bytes (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 487, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_nbytes,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_nbytes)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 487, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "read_bytes") < 0)) __PYX_ERR(1, 487, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v_nbytes = __Pyx_PyIndex_AsSsize_t(values[0]); if (unlikely((__pyx_v_nbytes == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(1, 487, __pyx_L3_error) - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("read_bytes", 1, 1, 1, __pyx_nargs); __PYX_ERR(1, 487, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.read_bytes", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_8read_bytes(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self), __pyx_v_nbytes); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_8read_bytes(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, Py_ssize_t __pyx_v_nbytes) { - Py_ssize_t __pyx_v_nread; - PyObject *__pyx_v_ret = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - Py_ssize_t __pyx_t_2; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - int __pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - int __pyx_t_10; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("read_bytes", 0); - - /* "msgpack/_unpacker.pyx":490 - * """Read a specified number of raw bytes from the stream""" - * cdef Py_ssize_t nread - * nread = min(self.buf_tail - self.buf_head, nbytes) # <<<<<<<<<<<<<< - * ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread) - * self.buf_head += nread - */ - __pyx_t_1 = __pyx_v_nbytes; - __pyx_t_2 = (__pyx_v_self->buf_tail - __pyx_v_self->buf_head); - __pyx_t_4 = (__pyx_t_1 < __pyx_t_2); - if (__pyx_t_4) { - __pyx_t_3 = __pyx_t_1; - } else { - __pyx_t_3 = __pyx_t_2; - } - __pyx_v_nread = __pyx_t_3; - - /* "msgpack/_unpacker.pyx":491 - * cdef Py_ssize_t nread - * nread = min(self.buf_tail - self.buf_head, nbytes) - * ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread) # <<<<<<<<<<<<<< - * self.buf_head += nread - * if nread < nbytes and self.file_like is not None: - */ - __pyx_t_5 = PyBytes_FromStringAndSize((__pyx_v_self->buf + __pyx_v_self->buf_head), __pyx_v_nread); if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 491, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_v_ret = __pyx_t_5; - __pyx_t_5 = 0; - - /* "msgpack/_unpacker.pyx":492 - * nread = min(self.buf_tail - self.buf_head, nbytes) - * ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread) - * self.buf_head += nread # <<<<<<<<<<<<<< - * if nread < nbytes and self.file_like is not None: - * ret += self.file_like.read(nbytes - nread) - */ - __pyx_v_self->buf_head = (__pyx_v_self->buf_head + __pyx_v_nread); - - /* "msgpack/_unpacker.pyx":493 - * ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread) - * self.buf_head += nread - * if nread < nbytes and self.file_like is not None: # <<<<<<<<<<<<<< - * ret += self.file_like.read(nbytes - nread) - * nread = len(ret) - */ - __pyx_t_6 = (__pyx_v_nread < __pyx_v_nbytes); - if (__pyx_t_6) { - } else { - __pyx_t_4 = __pyx_t_6; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_6 = (__pyx_v_self->file_like != Py_None); - __pyx_t_4 = __pyx_t_6; - __pyx_L4_bool_binop_done:; - if (__pyx_t_4) { - - /* "msgpack/_unpacker.pyx":494 - * self.buf_head += nread - * if nread < nbytes and self.file_like is not None: - * ret += self.file_like.read(nbytes - nread) # <<<<<<<<<<<<<< - * nread = len(ret) - * self.stream_offset += nread - */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->file_like, __pyx_n_s_read); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 494, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = PyInt_FromSsize_t((__pyx_v_nbytes - __pyx_v_nread)); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 494, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = NULL; - __pyx_t_10 = 0; - #if CYTHON_UNPACK_METHODS - if (likely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_9)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_9); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - __pyx_t_10 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_8}; - __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_7, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10); - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (unlikely(!__pyx_t_5)) __PYX_ERR(1, 494, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - } - __pyx_t_7 = PyNumber_InPlaceAdd(__pyx_v_ret, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 494, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF_SET(__pyx_v_ret, __pyx_t_7); - __pyx_t_7 = 0; - - /* "msgpack/_unpacker.pyx":495 - * if nread < nbytes and self.file_like is not None: - * ret += self.file_like.read(nbytes - nread) - * nread = len(ret) # <<<<<<<<<<<<<< - * self.stream_offset += nread - * return ret - */ - __pyx_t_3 = PyObject_Length(__pyx_v_ret); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 495, __pyx_L1_error) - __pyx_v_nread = __pyx_t_3; - - /* "msgpack/_unpacker.pyx":493 - * ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread) - * self.buf_head += nread - * if nread < nbytes and self.file_like is not None: # <<<<<<<<<<<<<< - * ret += self.file_like.read(nbytes - nread) - * nread = len(ret) - */ - } - - /* "msgpack/_unpacker.pyx":496 - * ret += self.file_like.read(nbytes - nread) - * nread = len(ret) - * self.stream_offset += nread # <<<<<<<<<<<<<< - * return ret - * - */ - __pyx_v_self->stream_offset = (__pyx_v_self->stream_offset + __pyx_v_nread); - - /* "msgpack/_unpacker.pyx":497 - * nread = len(ret) - * self.stream_offset += nread - * return ret # <<<<<<<<<<<<<< - * - * def unpack(self): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_ret); - __pyx_r = __pyx_v_ret; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":487 - * raise ValueError("Unpack failed: error = %d" % (ret,)) - * - * def read_bytes(self, Py_ssize_t nbytes): # <<<<<<<<<<<<<< - * """Read a specified number of raw bytes from the stream""" - * cdef Py_ssize_t nread - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.read_bytes", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_ret); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":499 - * return ret - * - * def unpack(self): # <<<<<<<<<<<<<< - * """Unpack one object - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_11unpack(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_10unpack, "Unpacker.unpack(self)\nUnpack one object\n\n Raises `OutOfData` when there are no more bytes to unpack.\n "); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_11unpack = {"unpack", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_11unpack, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_10unpack}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_11unpack(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("unpack (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 499, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("unpack", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "unpack", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.unpack", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_10unpack(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_10unpack(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("unpack", 0); - - /* "msgpack/_unpacker.pyx":504 - * Raises `OutOfData` when there are no more bytes to unpack. - * """ - * return self._unpack(unpack_construct) # <<<<<<<<<<<<<< - * - * def skip(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self->__pyx_vtab)->_unpack(__pyx_v_self, unpack_construct, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 504, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":499 - * return ret - * - * def unpack(self): # <<<<<<<<<<<<<< - * """Unpack one object - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.unpack", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":506 - * return self._unpack(unpack_construct) - * - * def skip(self): # <<<<<<<<<<<<<< - * """Read and ignore one object, returning None - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_13skip(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_12skip, "Unpacker.skip(self)\nRead and ignore one object, returning None\n\n Raises `OutOfData` when there are no more bytes to unpack.\n "); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_13skip = {"skip", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_13skip, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_12skip}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_13skip(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("skip (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 506, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("skip", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "skip", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.skip", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_12skip(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_12skip(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("skip", 0); - - /* "msgpack/_unpacker.pyx":511 - * Raises `OutOfData` when there are no more bytes to unpack. - * """ - * return self._unpack(unpack_skip) # <<<<<<<<<<<<<< - * - * def read_array_header(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self->__pyx_vtab)->_unpack(__pyx_v_self, unpack_skip, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 511, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":506 - * return self._unpack(unpack_construct) - * - * def skip(self): # <<<<<<<<<<<<<< - * """Read and ignore one object, returning None - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.skip", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":513 - * return self._unpack(unpack_skip) - * - * def read_array_header(self): # <<<<<<<<<<<<<< - * """assuming the next object is an array, return its size n, such that - * the next n unpack() calls will iterate over its contents. - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_15read_array_header(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_14read_array_header, "Unpacker.read_array_header(self)\nassuming the next object is an array, return its size n, such that\n the next n unpack() calls will iterate over its contents.\n\n Raises `OutOfData` when there are no more bytes to unpack.\n "); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_15read_array_header = {"read_array_header", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_15read_array_header, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_14read_array_header}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_15read_array_header(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("read_array_header (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 513, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("read_array_header", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "read_array_header", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.read_array_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_14read_array_header(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_14read_array_header(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("read_array_header", 0); - - /* "msgpack/_unpacker.pyx":519 - * Raises `OutOfData` when there are no more bytes to unpack. - * """ - * return self._unpack(read_array_header) # <<<<<<<<<<<<<< - * - * def read_map_header(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self->__pyx_vtab)->_unpack(__pyx_v_self, read_array_header, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 519, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":513 - * return self._unpack(unpack_skip) - * - * def read_array_header(self): # <<<<<<<<<<<<<< - * """assuming the next object is an array, return its size n, such that - * the next n unpack() calls will iterate over its contents. - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.read_array_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":521 - * return self._unpack(read_array_header) - * - * def read_map_header(self): # <<<<<<<<<<<<<< - * """assuming the next object is a map, return its size n, such that the - * next n * 2 unpack() calls will iterate over its key-value pairs. - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_17read_map_header(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_16read_map_header, "Unpacker.read_map_header(self)\nassuming the next object is a map, return its size n, such that the\n next n * 2 unpack() calls will iterate over its key-value pairs.\n\n Raises `OutOfData` when there are no more bytes to unpack.\n "); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_17read_map_header = {"read_map_header", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_17read_map_header, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_16read_map_header}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_17read_map_header(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("read_map_header (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 521, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("read_map_header", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "read_map_header", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.read_map_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_16read_map_header(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_16read_map_header(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("read_map_header", 0); - - /* "msgpack/_unpacker.pyx":527 - * Raises `OutOfData` when there are no more bytes to unpack. - * """ - * return self._unpack(read_map_header) # <<<<<<<<<<<<<< - * - * def tell(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self->__pyx_vtab)->_unpack(__pyx_v_self, read_map_header, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 527, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":521 - * return self._unpack(read_array_header) - * - * def read_map_header(self): # <<<<<<<<<<<<<< - * """assuming the next object is a map, return its size n, such that the - * next n * 2 unpack() calls will iterate over its key-value pairs. - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.read_map_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":529 - * return self._unpack(read_map_header) - * - * def tell(self): # <<<<<<<<<<<<<< - * """Returns the current position of the Unpacker in bytes, i.e., the - * number of bytes that were read from the input, also the starting - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_19tell(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_18tell, "Unpacker.tell(self)\nReturns the current position of the Unpacker in bytes, i.e., the\n number of bytes that were read from the input, also the starting\n position of the next object.\n "); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_19tell = {"tell", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_19tell, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_18tell}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_19tell(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("tell (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(1, 529, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("tell", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "tell", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.tell", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_18tell(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_18tell(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("tell", 0); - - /* "msgpack/_unpacker.pyx":534 - * position of the next object. - * """ - * return self.stream_offset # <<<<<<<<<<<<<< - * - * def __iter__(self): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_uint64_t(__pyx_v_self->stream_offset); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 534, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":529 - * return self._unpack(read_map_header) - * - * def tell(self): # <<<<<<<<<<<<<< - * """Returns the current position of the Unpacker in bytes, i.e., the - * number of bytes that were read from the input, also the starting - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.tell", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":536 - * return self.stream_offset - * - * def __iter__(self): # <<<<<<<<<<<<<< - * return self - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_21__iter__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_21__iter__(PyObject *__pyx_v_self) { - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0); - __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_20__iter__(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_20__iter__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__iter__", 0); - - /* "msgpack/_unpacker.pyx":537 - * - * def __iter__(self): - * return self # <<<<<<<<<<<<<< - * - * def __next__(self): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF((PyObject *)__pyx_v_self); - __pyx_r = ((PyObject *)__pyx_v_self); - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":536 - * return self.stream_offset - * - * def __iter__(self): # <<<<<<<<<<<<<< - * return self - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "msgpack/_unpacker.pyx":539 - * return self - * - * def __next__(self): # <<<<<<<<<<<<<< - * return self._unpack(unpack_construct, 1) - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_23__next__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_23__next__(PyObject *__pyx_v_self) { - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__next__ (wrapper)", 0); - __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_22__next__(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_22__next__(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - struct __pyx_opt_args_7msgpack_9_cmsgpack_8Unpacker__unpack __pyx_t_2; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__next__", 0); - - /* "msgpack/_unpacker.pyx":540 - * - * def __next__(self): - * return self._unpack(unpack_construct, 1) # <<<<<<<<<<<<<< - * - * # for debug. - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2.__pyx_n = 1; - __pyx_t_2.iter = 1; - __pyx_t_1 = ((struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self->__pyx_vtab)->_unpack(__pyx_v_self, unpack_construct, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 540, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "msgpack/_unpacker.pyx":539 - * return self - * - * def __next__(self): # <<<<<<<<<<<<<< - * return self._unpack(unpack_construct, 1) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.__next__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_25__reduce_cython__(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_24__reduce_cython__, "Unpacker.__reduce_cython__(self)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_25__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_25__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_24__reduce_cython__}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_25__reduce_cython__(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(4, 1, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - if (unlikely(__pyx_nargs > 0)) { - __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} - if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; - goto __pyx_L4_argument_unpacking_done; - goto __pyx_L3_error; - __pyx_L3_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_24__reduce_cython__(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_24__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); - __PYX_ERR(4, 2, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_27__setstate_cython__(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_7msgpack_9_cmsgpack_8Unpacker_26__setstate_cython__, "Unpacker.__setstate_cython__(self, __pyx_state)"); -static PyMethodDef __pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_27__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_27__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_26__setstate_cython__}; -static PyObject *__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_27__setstate_cython__(PyObject *__pyx_v_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[1] = {0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); - if (unlikely((__pyx_nargs < 0))) __PYX_ERR(4, 3, __pyx_L3_error) - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(4, 3, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(4, 3, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 1)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - } - __pyx_v___pyx_state = values[0]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(4, 3, __pyx_L3_error) - goto __pyx_L3_error; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7msgpack_9_cmsgpack_8Unpacker_26__setstate_cython__(((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)__pyx_v_self), __pyx_v___pyx_state); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7msgpack_9_cmsgpack_8Unpacker_26__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< - */ - __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); - __PYX_ERR(4, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("msgpack._cmsgpack.Unpacker.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} -static struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Packer __pyx_vtable_7msgpack_9_cmsgpack_Packer; - -static PyObject *__pyx_tp_new_7msgpack_9_cmsgpack_Packer(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - struct __pyx_obj_7msgpack_9_cmsgpack_Packer *p; - PyObject *o; - #if CYTHON_COMPILING_IN_LIMITED_API - allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); - o = alloc_func(t, 0); - #else - if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - #endif - p = ((struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)o); - p->__pyx_vtab = __pyx_vtabptr_7msgpack_9_cmsgpack_Packer; - new((void*)&(p->pk)) struct msgpack_packer(); - p->_default = Py_None; Py_INCREF(Py_None); - p->_berrors = Py_None; Py_INCREF(Py_None); - if (unlikely(__pyx_pw_7msgpack_9_cmsgpack_6Packer_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad; - return o; - bad: - Py_DECREF(o); o = 0; - return NULL; -} - -static void __pyx_tp_dealloc_7msgpack_9_cmsgpack_Packer(PyObject *o) { - struct __pyx_obj_7msgpack_9_cmsgpack_Packer *p = (struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { - if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7msgpack_9_cmsgpack_Packer) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - } - #endif - PyObject_GC_UnTrack(o); - { - PyObject *etype, *eval, *etb; - PyErr_Fetch(&etype, &eval, &etb); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); - __pyx_pw_7msgpack_9_cmsgpack_6Packer_5__dealloc__(o); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); - PyErr_Restore(etype, eval, etb); - } - __Pyx_call_destructor(p->pk); - Py_CLEAR(p->_default); - Py_CLEAR(p->_berrors); - #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY - (*Py_TYPE(o)->tp_free)(o); - #else - { - freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); - if (tp_free) tp_free(o); - } - #endif -} - -static int __pyx_tp_traverse_7msgpack_9_cmsgpack_Packer(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7msgpack_9_cmsgpack_Packer *p = (struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)o; - if (p->_default) { - e = (*v)(p->_default, a); if (e) return e; - } - if (p->_berrors) { - e = (*v)(p->_berrors, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7msgpack_9_cmsgpack_Packer(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7msgpack_9_cmsgpack_Packer *p = (struct __pyx_obj_7msgpack_9_cmsgpack_Packer *)o; - tmp = ((PyObject*)p->_default); - p->_default = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_berrors); - p->_berrors = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyMethodDef __pyx_methods_7msgpack_9_cmsgpack_Packer[] = { - {"pack_ext_type", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_9pack_ext_type, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_8pack_ext_type}, - {"pack_array_header", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_11pack_array_header, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_10pack_array_header}, - {"pack_map_header", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_13pack_map_header, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_12pack_map_header}, - {"pack_map_pairs", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_15pack_map_pairs, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_14pack_map_pairs}, - {"reset", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_17reset, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_16reset}, - {"bytes", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_19bytes, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_18bytes}, - {"getbuffer", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_21getbuffer, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_20getbuffer}, - {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_23__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_22__reduce_cython__}, - {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_6Packer_25__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_6Packer_24__setstate_cython__}, - {0, 0, 0, 0} -}; -#if CYTHON_USE_TYPE_SPECS -static PyType_Slot __pyx_type_7msgpack_9_cmsgpack_Packer_slots[] = { - {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7msgpack_9_cmsgpack_Packer}, - {Py_tp_doc, (void *)PyDoc_STR("Packer(default=None, *, bool use_single_float=False, bool autoreset=True, bool use_bin_type=True, bool strict_types=False, bool datetime=False, unicode_errors=None)\n\n MessagePack Packer\n\n Usage::\n\n packer = Packer()\n astream.write(packer.pack(a))\n astream.write(packer.pack(b))\n\n Packer's constructor has some keyword arguments:\n\n :param default:\n When specified, it should be callable.\n Convert user type to builtin type that Packer supports.\n See also simplejson's document.\n\n :param bool use_single_float:\n Use single precision float type for float. (default: False)\n\n :param bool autoreset:\n Reset buffer after each pack and return its content as `bytes`. (default: True).\n If set this to false, use `bytes()` to get content and `.reset()` to clear buffer.\n\n :param bool use_bin_type:\n Use bin type introduced in msgpack spec 2.0 for bytes.\n It also enables str8 type for unicode. (default: True)\n\n :param bool strict_types:\n If set to true, types will be checked to be exact. Derived classes\n from serializeable types will not be serialized and will be\n treated as unsupported type and forwarded to default.\n Additionally tuples will not be serialized as lists.\n This is useful when trying to implement accurate serialization\n for python types.\n\n :param bool datetime:\n If set to true, datetime with tzinfo is packed into Timestamp type.\n Note that the tzinfo is stripped in the timestamp.\n You can get UTC datetime with `timestamp=3` option of the Unpacker.\n\n :param str unicode_errors:\n The error handler for encoding unicode. (default: 'strict')\n DO NOT USE THIS!! This option is kept for very specific usage.\n ")}, - {Py_tp_traverse, (void *)__pyx_tp_traverse_7msgpack_9_cmsgpack_Packer}, - {Py_tp_clear, (void *)__pyx_tp_clear_7msgpack_9_cmsgpack_Packer}, - {Py_tp_methods, (void *)__pyx_methods_7msgpack_9_cmsgpack_Packer}, - {Py_tp_init, (void *)__pyx_pw_7msgpack_9_cmsgpack_6Packer_3__init__}, - {Py_tp_new, (void *)__pyx_tp_new_7msgpack_9_cmsgpack_Packer}, - {0, 0}, -}; -static PyType_Spec __pyx_type_7msgpack_9_cmsgpack_Packer_spec = { - "msgpack._cmsgpack.Packer", - sizeof(struct __pyx_obj_7msgpack_9_cmsgpack_Packer), - 0, - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, - __pyx_type_7msgpack_9_cmsgpack_Packer_slots, -}; -#else - -static PyTypeObject __pyx_type_7msgpack_9_cmsgpack_Packer = { - PyVarObject_HEAD_INIT(0, 0) - "msgpack._cmsgpack.""Packer", /*tp_name*/ - sizeof(struct __pyx_obj_7msgpack_9_cmsgpack_Packer), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7msgpack_9_cmsgpack_Packer, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 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*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - PyDoc_STR("Packer(default=None, *, bool use_single_float=False, bool autoreset=True, bool use_bin_type=True, bool strict_types=False, bool datetime=False, unicode_errors=None)\n\n MessagePack Packer\n\n Usage::\n\n packer = Packer()\n astream.write(packer.pack(a))\n astream.write(packer.pack(b))\n\n Packer's constructor has some keyword arguments:\n\n :param default:\n When specified, it should be callable.\n Convert user type to builtin type that Packer supports.\n See also simplejson's document.\n\n :param bool use_single_float:\n Use single precision float type for float. (default: False)\n\n :param bool autoreset:\n Reset buffer after each pack and return its content as `bytes`. (default: True).\n If set this to false, use `bytes()` to get content and `.reset()` to clear buffer.\n\n :param bool use_bin_type:\n Use bin type introduced in msgpack spec 2.0 for bytes.\n It also enables str8 type for unicode. (default: True)\n\n :param bool strict_types:\n If set to true, types will be checked to be exact. Derived classes\n from serializeable types will not be serialized and will be\n treated as unsupported type and forwarded to default.\n Additionally tuples will not be serialized as lists.\n This is useful when trying to implement accurate serialization\n for python types.\n\n :param bool datetime:\n If set to true, datetime with tzinfo is packed into Timestamp type.\n Note that the tzinfo is stripped in the timestamp.\n You can get UTC datetime with `timestamp=3` option of the Unpacker.\n\n :param str unicode_errors:\n The error handler for encoding unicode. (default: 'strict')\n DO NOT USE THIS!! This option is kept for very specific usage.\n "), /*tp_doc*/ - __pyx_tp_traverse_7msgpack_9_cmsgpack_Packer, /*tp_traverse*/ - __pyx_tp_clear_7msgpack_9_cmsgpack_Packer, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7msgpack_9_cmsgpack_Packer, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - #if !CYTHON_USE_TYPE_SPECS - 0, /*tp_dictoffset*/ - #endif - __pyx_pw_7msgpack_9_cmsgpack_6Packer_3__init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7msgpack_9_cmsgpack_Packer, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - #if CYTHON_USE_TP_FINALIZE - 0, /*tp_finalize*/ - #else - NULL, /*tp_finalize*/ - #endif - #endif - #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) - 0, /*tp_vectorcall*/ - #endif - #if __PYX_NEED_TP_PRINT_SLOT == 1 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030C0000 - 0, /*tp_watched*/ - #endif - #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 - 0, /*tp_pypy_flags*/ - #endif -}; -#endif -static struct __pyx_vtabstruct_7msgpack_9_cmsgpack_Unpacker __pyx_vtable_7msgpack_9_cmsgpack_Unpacker; - -static PyObject *__pyx_tp_new_7msgpack_9_cmsgpack_Unpacker(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *p; - PyObject *o; - #if CYTHON_COMPILING_IN_LIMITED_API - allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); - o = alloc_func(t, 0); - #else - if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - #endif - p = ((struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)o); - p->__pyx_vtab = __pyx_vtabptr_7msgpack_9_cmsgpack_Unpacker; - new((void*)&(p->ctx)) unpack_context(); - p->file_like = Py_None; Py_INCREF(Py_None); - p->file_like_read = Py_None; Py_INCREF(Py_None); - p->object_hook = Py_None; Py_INCREF(Py_None); - p->object_pairs_hook = Py_None; Py_INCREF(Py_None); - p->list_hook = Py_None; Py_INCREF(Py_None); - p->ext_hook = Py_None; Py_INCREF(Py_None); - p->unicode_errors = Py_None; Py_INCREF(Py_None); - if (unlikely(__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad; - return o; - bad: - Py_DECREF(o); o = 0; - return NULL; -} - -static void __pyx_tp_dealloc_7msgpack_9_cmsgpack_Unpacker(PyObject *o) { - struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *p = (struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && !__Pyx_PyObject_GC_IsFinalized(o)) { - if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_7msgpack_9_cmsgpack_Unpacker) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - } - #endif - PyObject_GC_UnTrack(o); - { - PyObject *etype, *eval, *etb; - PyErr_Fetch(&etype, &eval, &etb); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); - __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_3__dealloc__(o); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); - PyErr_Restore(etype, eval, etb); - } - __Pyx_call_destructor(p->ctx); - Py_CLEAR(p->file_like); - Py_CLEAR(p->file_like_read); - Py_CLEAR(p->object_hook); - Py_CLEAR(p->object_pairs_hook); - Py_CLEAR(p->list_hook); - Py_CLEAR(p->ext_hook); - Py_CLEAR(p->unicode_errors); - #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY - (*Py_TYPE(o)->tp_free)(o); - #else - { - freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); - if (tp_free) tp_free(o); - } - #endif -} - -static int __pyx_tp_traverse_7msgpack_9_cmsgpack_Unpacker(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *p = (struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)o; - if (p->file_like) { - e = (*v)(p->file_like, a); if (e) return e; - } - if (p->file_like_read) { - e = (*v)(p->file_like_read, a); if (e) return e; - } - if (p->object_hook) { - e = (*v)(p->object_hook, a); if (e) return e; - } - if (p->object_pairs_hook) { - e = (*v)(p->object_pairs_hook, a); if (e) return e; - } - if (p->list_hook) { - e = (*v)(p->list_hook, a); if (e) return e; - } - if (p->ext_hook) { - e = (*v)(p->ext_hook, a); if (e) return e; - } - if (p->unicode_errors) { - e = (*v)(p->unicode_errors, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7msgpack_9_cmsgpack_Unpacker(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *p = (struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *)o; - tmp = ((PyObject*)p->file_like); - p->file_like = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->file_like_read); - p->file_like_read = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->object_hook); - p->object_hook = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->object_pairs_hook); - p->object_pairs_hook = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->list_hook); - p->list_hook = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->ext_hook); - p->ext_hook = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->unicode_errors); - p->unicode_errors = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyObject *__pyx_specialmethod___pyx_pw_7msgpack_9_cmsgpack_8Unpacker_23__next__(PyObject *self, CYTHON_UNUSED PyObject *arg) { - PyObject *res = __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_23__next__(self); - if (!res && !PyErr_Occurred()) { PyErr_SetNone(PyExc_StopIteration); } - return res; -} - -static PyMethodDef __pyx_methods_7msgpack_9_cmsgpack_Unpacker[] = { - {"feed", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_7feed, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_6feed}, - {"read_bytes", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_9read_bytes, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_8read_bytes}, - {"unpack", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_11unpack, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_10unpack}, - {"skip", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_13skip, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_12skip}, - {"read_array_header", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_15read_array_header, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_14read_array_header}, - {"read_map_header", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_17read_map_header, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_16read_map_header}, - {"tell", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_19tell, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_18tell}, - {"__next__", (PyCFunction)__pyx_specialmethod___pyx_pw_7msgpack_9_cmsgpack_8Unpacker_23__next__, METH_NOARGS|METH_COEXIST, 0}, - {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_25__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_24__reduce_cython__}, - {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_27__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7msgpack_9_cmsgpack_8Unpacker_26__setstate_cython__}, - {0, 0, 0, 0} -}; -#if CYTHON_USE_TYPE_SPECS -static PyType_Slot __pyx_type_7msgpack_9_cmsgpack_Unpacker_slots[] = { - {Py_tp_dealloc, (void *)__pyx_tp_dealloc_7msgpack_9_cmsgpack_Unpacker}, - {Py_tp_doc, (void *)PyDoc_STR("Unpacker(file_like=None, Py_ssize_t read_size=0, *, bool use_list=True, bool raw=False, int timestamp=0, bool strict_map_key=True, object_hook=None, object_pairs_hook=None, list_hook=None, unicode_errors=None, Py_ssize_t max_buffer_size=0x6400000, ext_hook=ExtType, Py_ssize_t max_str_len=-1, Py_ssize_t max_bin_len=-1, Py_ssize_t max_array_len=-1, Py_ssize_t max_map_len=-1, Py_ssize_t max_ext_len=-1)\nStreaming unpacker.\n\n Arguments:\n\n :param file_like:\n File-like object having `.read(n)` method.\n If specified, unpacker reads serialized data from it and `.feed()` is not usable.\n\n :param int read_size:\n Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`)\n\n :param bool use_list:\n If true, unpack msgpack array to Python list.\n Otherwise, unpack to Python tuple. (default: True)\n\n :param bool raw:\n If true, unpack msgpack raw to Python bytes.\n Otherwise, unpack to Python str by decoding with UTF-8 encoding (default).\n\n :param int timestamp:\n Control how timestamp type is unpacked:\n\n 0 - Timestamp\n 1 - float (Seconds from the EPOCH)\n 2 - int (Nanoseconds from the EPOCH)\n 3 - datetime.datetime (UTC).\n\n :param bool strict_map_key:\n If true (default), only str or bytes are accepted for map (dict) keys.\n\n :param object_hook:\n When specified, it should be callable.\n Unpacker calls it with a dict argument after unpacking msgpack map.\n (See also simplejson)\n\n :param object_pairs_hook:\n When specified, it should be callable.\n Unpacker calls it with a list of key-value pairs after unpacking msgpack map.\n (See also simplejson)\n\n :param str unicode_errors:\n The error handler for decoding unicode. (default: 'strict')\n This option should be used only when you have msgpack data which\n contains invalid UTF-8 string.""\n\n :param int max_buffer_size:\n Limits size of data waiting unpacked. 0 means 2**32-1.\n The default value is 100*1024*1024 (100MiB).\n Raises `BufferFull` exception when it is insufficient.\n You should set this parameter when unpacking data from untrusted source.\n\n :param int max_str_len:\n Deprecated, use *max_buffer_size* instead.\n Limits max length of str. (default: max_buffer_size)\n\n :param int max_bin_len:\n Deprecated, use *max_buffer_size* instead.\n Limits max length of bin. (default: max_buffer_size)\n\n :param int max_array_len:\n Limits max length of array.\n (default: max_buffer_size)\n\n :param int max_map_len:\n Limits max length of map.\n (default: max_buffer_size//2)\n\n :param int max_ext_len:\n Deprecated, use *max_buffer_size* instead.\n Limits max size of ext type. (default: max_buffer_size)\n\n Example of streaming deserialize from file-like object::\n\n unpacker = Unpacker(file_like)\n for o in unpacker:\n process(o)\n\n Example of streaming deserialize from socket::\n\n unpacker = Unpacker()\n while True:\n buf = sock.recv(1024**2)\n if not buf:\n break\n unpacker.feed(buf)\n for o in unpacker:\n process(o)\n\n Raises ``ExtraData`` when *packed* contains extra bytes.\n Raises ``OutOfData`` when *packed* is incomplete.\n Raises ``FormatError`` when *packed* is not valid msgpack.\n Raises ``StackError`` when *packed* contains too nested.\n Other exceptions can be raised during unpacking.\n ")}, - {Py_tp_traverse, (void *)__pyx_tp_traverse_7msgpack_9_cmsgpack_Unpacker}, - {Py_tp_clear, (void *)__pyx_tp_clear_7msgpack_9_cmsgpack_Unpacker}, - {Py_tp_iter, (void *)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_21__iter__}, - {Py_tp_iternext, (void *)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_23__next__}, - {Py_tp_methods, (void *)__pyx_methods_7msgpack_9_cmsgpack_Unpacker}, - {Py_tp_init, (void *)__pyx_pw_7msgpack_9_cmsgpack_8Unpacker_5__init__}, - {Py_tp_new, (void *)__pyx_tp_new_7msgpack_9_cmsgpack_Unpacker}, - {0, 0}, -}; -static PyType_Spec __pyx_type_7msgpack_9_cmsgpack_Unpacker_spec = { - "msgpack._cmsgpack.Unpacker", - sizeof(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker), - 0, - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, - __pyx_type_7msgpack_9_cmsgpack_Unpacker_slots, -}; -#else - -static PyTypeObject __pyx_type_7msgpack_9_cmsgpack_Unpacker = { - PyVarObject_HEAD_INIT(0, 0) - "msgpack._cmsgpack.""Unpacker", /*tp_name*/ - sizeof(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7msgpack_9_cmsgpack_Unpacker, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 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*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - PyDoc_STR("Unpacker(file_like=None, Py_ssize_t read_size=0, *, bool use_list=True, bool raw=False, int timestamp=0, bool strict_map_key=True, object_hook=None, object_pairs_hook=None, list_hook=None, unicode_errors=None, Py_ssize_t max_buffer_size=0x6400000, ext_hook=ExtType, Py_ssize_t max_str_len=-1, Py_ssize_t max_bin_len=-1, Py_ssize_t max_array_len=-1, Py_ssize_t max_map_len=-1, Py_ssize_t max_ext_len=-1)\nStreaming unpacker.\n\n Arguments:\n\n :param file_like:\n File-like object having `.read(n)` method.\n If specified, unpacker reads serialized data from it and `.feed()` is not usable.\n\n :param int read_size:\n Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`)\n\n :param bool use_list:\n If true, unpack msgpack array to Python list.\n Otherwise, unpack to Python tuple. (default: True)\n\n :param bool raw:\n If true, unpack msgpack raw to Python bytes.\n Otherwise, unpack to Python str by decoding with UTF-8 encoding (default).\n\n :param int timestamp:\n Control how timestamp type is unpacked:\n\n 0 - Timestamp\n 1 - float (Seconds from the EPOCH)\n 2 - int (Nanoseconds from the EPOCH)\n 3 - datetime.datetime (UTC).\n\n :param bool strict_map_key:\n If true (default), only str or bytes are accepted for map (dict) keys.\n\n :param object_hook:\n When specified, it should be callable.\n Unpacker calls it with a dict argument after unpacking msgpack map.\n (See also simplejson)\n\n :param object_pairs_hook:\n When specified, it should be callable.\n Unpacker calls it with a list of key-value pairs after unpacking msgpack map.\n (See also simplejson)\n\n :param str unicode_errors:\n The error handler for decoding unicode. (default: 'strict')\n This option should be used only when you have msgpack data which\n contains invalid UTF-8 string.""\n\n :param int max_buffer_size:\n Limits size of data waiting unpacked. 0 means 2**32-1.\n The default value is 100*1024*1024 (100MiB).\n Raises `BufferFull` exception when it is insufficient.\n You should set this parameter when unpacking data from untrusted source.\n\n :param int max_str_len:\n Deprecated, use *max_buffer_size* instead.\n Limits max length of str. (default: max_buffer_size)\n\n :param int max_bin_len:\n Deprecated, use *max_buffer_size* instead.\n Limits max length of bin. (default: max_buffer_size)\n\n :param int max_array_len:\n Limits max length of array.\n (default: max_buffer_size)\n\n :param int max_map_len:\n Limits max length of map.\n (default: max_buffer_size//2)\n\n :param int max_ext_len:\n Deprecated, use *max_buffer_size* instead.\n Limits max size of ext type. (default: max_buffer_size)\n\n Example of streaming deserialize from file-like object::\n\n unpacker = Unpacker(file_like)\n for o in unpacker:\n process(o)\n\n Example of streaming deserialize from socket::\n\n unpacker = Unpacker()\n while True:\n buf = sock.recv(1024**2)\n if not buf:\n break\n unpacker.feed(buf)\n for o in unpacker:\n process(o)\n\n Raises ``ExtraData`` when *packed* contains extra bytes.\n Raises ``OutOfData`` when *packed* is incomplete.\n Raises ``FormatError`` when *packed* is not valid msgpack.\n Raises ``StackError`` when *packed* contains too nested.\n Other exceptions can be raised during unpacking.\n "), /*tp_doc*/ - __pyx_tp_traverse_7msgpack_9_cmsgpack_Unpacker, /*tp_traverse*/ - __pyx_tp_clear_7msgpack_9_cmsgpack_Unpacker, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_21__iter__, /*tp_iter*/ - __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_23__next__, /*tp_iternext*/ - __pyx_methods_7msgpack_9_cmsgpack_Unpacker, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - #if !CYTHON_USE_TYPE_SPECS - 0, /*tp_dictoffset*/ - #endif - __pyx_pw_7msgpack_9_cmsgpack_8Unpacker_5__init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7msgpack_9_cmsgpack_Unpacker, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - #if CYTHON_USE_TP_FINALIZE - 0, /*tp_finalize*/ - #else - NULL, /*tp_finalize*/ - #endif - #endif - #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) - 0, /*tp_vectorcall*/ - #endif - #if __PYX_NEED_TP_PRINT_SLOT == 1 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030C0000 - 0, /*tp_watched*/ - #endif - #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 - 0, /*tp_pypy_flags*/ - #endif -}; -#endif - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; -#ifndef CYTHON_SMALL_CODE -#if defined(__clang__) - #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define CYTHON_SMALL_CODE __attribute__((cold)) -#else - #define CYTHON_SMALL_CODE -#endif -#endif -/* #### Code section: pystring_table ### */ - -static int __Pyx_CreateStringTabAndInitStrings(void) { - __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, - {&__pyx_n_s_BufferError, __pyx_k_BufferError, sizeof(__pyx_k_BufferError), 0, 0, 1, 1}, - {&__pyx_n_s_BufferFull, __pyx_k_BufferFull, sizeof(__pyx_k_BufferFull), 0, 0, 1, 1}, - {&__pyx_kp_u_Cannot_decode_extended_type_with, __pyx_k_Cannot_decode_extended_type_with, sizeof(__pyx_k_Cannot_decode_extended_type_with), 0, 1, 0, 0}, - {&__pyx_kp_u_EXT_data_is_too_large, __pyx_k_EXT_data_is_too_large, sizeof(__pyx_k_EXT_data_is_too_large), 0, 1, 0, 0}, - {&__pyx_n_s_ExtType, __pyx_k_ExtType, sizeof(__pyx_k_ExtType), 0, 0, 1, 1}, - {&__pyx_n_s_ExtraData, __pyx_k_ExtraData, sizeof(__pyx_k_ExtraData), 0, 0, 1, 1}, - {&__pyx_n_s_FormatError, __pyx_k_FormatError, sizeof(__pyx_k_FormatError), 0, 0, 1, 1}, - {&__pyx_kp_u_Integer_value_out_of_range, __pyx_k_Integer_value_out_of_range, sizeof(__pyx_k_Integer_value_out_of_range), 0, 1, 0, 0}, - {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, - {&__pyx_kp_u_No_more_data_to_unpack, __pyx_k_No_more_data_to_unpack, sizeof(__pyx_k_No_more_data_to_unpack), 0, 1, 0, 0}, - {&__pyx_n_s_NotImplementedError, __pyx_k_NotImplementedError, sizeof(__pyx_k_NotImplementedError), 0, 0, 1, 1}, - {&__pyx_n_s_OutOfData, __pyx_k_OutOfData, sizeof(__pyx_k_OutOfData), 0, 0, 1, 1}, - {&__pyx_n_s_OverflowError, __pyx_k_OverflowError, sizeof(__pyx_k_OverflowError), 0, 0, 1, 1}, - {&__pyx_n_s_Packer, __pyx_k_Packer, sizeof(__pyx_k_Packer), 0, 0, 1, 1}, - {&__pyx_n_s_Packer___reduce_cython, __pyx_k_Packer___reduce_cython, sizeof(__pyx_k_Packer___reduce_cython), 0, 0, 1, 1}, - {&__pyx_n_s_Packer___setstate_cython, __pyx_k_Packer___setstate_cython, sizeof(__pyx_k_Packer___setstate_cython), 0, 0, 1, 1}, - {&__pyx_n_s_Packer_bytes, __pyx_k_Packer_bytes, sizeof(__pyx_k_Packer_bytes), 0, 0, 1, 1}, - {&__pyx_n_s_Packer_getbuffer, __pyx_k_Packer_getbuffer, sizeof(__pyx_k_Packer_getbuffer), 0, 0, 1, 1}, - {&__pyx_n_s_Packer_pack, __pyx_k_Packer_pack, sizeof(__pyx_k_Packer_pack), 0, 0, 1, 1}, - {&__pyx_n_s_Packer_pack_array_header, __pyx_k_Packer_pack_array_header, sizeof(__pyx_k_Packer_pack_array_header), 0, 0, 1, 1}, - {&__pyx_n_s_Packer_pack_ext_type, __pyx_k_Packer_pack_ext_type, sizeof(__pyx_k_Packer_pack_ext_type), 0, 0, 1, 1}, - {&__pyx_n_s_Packer_pack_map_header, __pyx_k_Packer_pack_map_header, sizeof(__pyx_k_Packer_pack_map_header), 0, 0, 1, 1}, - {&__pyx_n_s_Packer_pack_map_pairs, __pyx_k_Packer_pack_map_pairs, sizeof(__pyx_k_Packer_pack_map_pairs), 0, 0, 1, 1}, - {&__pyx_n_s_Packer_reset, __pyx_k_Packer_reset, sizeof(__pyx_k_Packer_reset), 0, 0, 1, 1}, - {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, - {&__pyx_n_s_StackError, __pyx_k_StackError, sizeof(__pyx_k_StackError), 0, 0, 1, 1}, - {&__pyx_n_s_StopIteration, __pyx_k_StopIteration, sizeof(__pyx_k_StopIteration), 0, 0, 1, 1}, - {&__pyx_kp_u_Time_zones_are_not_available_fro, __pyx_k_Time_zones_are_not_available_fro, sizeof(__pyx_k_Time_zones_are_not_available_fro), 0, 1, 0, 0}, - {&__pyx_n_s_Timestamp, __pyx_k_Timestamp, sizeof(__pyx_k_Timestamp), 0, 0, 1, 1}, - {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, - {&__pyx_kp_u_Unable_to_allocate_internal_buff, __pyx_k_Unable_to_allocate_internal_buff, sizeof(__pyx_k_Unable_to_allocate_internal_buff), 0, 1, 0, 0}, - {&__pyx_kp_u_Unable_to_enlarge_internal_buffe, __pyx_k_Unable_to_enlarge_internal_buffe, sizeof(__pyx_k_Unable_to_enlarge_internal_buffe), 0, 1, 0, 0}, - {&__pyx_kp_u_Unpack_failed_error, __pyx_k_Unpack_failed_error, sizeof(__pyx_k_Unpack_failed_error), 0, 1, 0, 0}, - {&__pyx_kp_u_Unpack_failed_incomplete_input, __pyx_k_Unpack_failed_incomplete_input, sizeof(__pyx_k_Unpack_failed_incomplete_input), 0, 1, 0, 0}, - {&__pyx_n_s_Unpacker, __pyx_k_Unpacker, sizeof(__pyx_k_Unpacker), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker___reduce_cython, __pyx_k_Unpacker___reduce_cython, sizeof(__pyx_k_Unpacker___reduce_cython), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker___setstate_cython, __pyx_k_Unpacker___setstate_cython, sizeof(__pyx_k_Unpacker___setstate_cython), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker_feed, __pyx_k_Unpacker_feed, sizeof(__pyx_k_Unpacker_feed), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker_read_array_header, __pyx_k_Unpacker_read_array_header, sizeof(__pyx_k_Unpacker_read_array_header), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker_read_bytes, __pyx_k_Unpacker_read_bytes, sizeof(__pyx_k_Unpacker_read_bytes), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker_read_map_header, __pyx_k_Unpacker_read_map_header, sizeof(__pyx_k_Unpacker_read_map_header), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker_skip, __pyx_k_Unpacker_skip, sizeof(__pyx_k_Unpacker_skip), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker_tell, __pyx_k_Unpacker_tell, sizeof(__pyx_k_Unpacker_tell), 0, 0, 1, 1}, - {&__pyx_n_s_Unpacker_unpack, __pyx_k_Unpacker_unpack, sizeof(__pyx_k_Unpacker_unpack), 0, 0, 1, 1}, - {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, - {&__pyx_n_s__29, __pyx_k__29, sizeof(__pyx_k__29), 0, 0, 1, 1}, - {&__pyx_kp_u__30, __pyx_k__30, sizeof(__pyx_k__30), 0, 1, 0, 0}, - {&__pyx_n_s__62, __pyx_k__62, sizeof(__pyx_k__62), 0, 0, 1, 1}, - {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, - {&__pyx_n_s_autoreset, __pyx_k_autoreset, sizeof(__pyx_k_autoreset), 0, 0, 1, 1}, - {&__pyx_n_s_buf, __pyx_k_buf, sizeof(__pyx_k_buf), 0, 0, 1, 1}, - {&__pyx_n_s_buf_len, __pyx_k_buf_len, sizeof(__pyx_k_buf_len), 0, 0, 1, 1}, - {&__pyx_n_s_bytes, __pyx_k_bytes, sizeof(__pyx_k_bytes), 0, 0, 1, 1}, - {&__pyx_kp_u_cannot_unpack_from_multi_byte_ob, __pyx_k_cannot_unpack_from_multi_byte_ob, sizeof(__pyx_k_cannot_unpack_from_multi_byte_ob), 0, 1, 0, 0}, - {&__pyx_n_s_cerr, __pyx_k_cerr, sizeof(__pyx_k_cerr), 0, 0, 1, 1}, - {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, - {&__pyx_n_s_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 0, 1, 1}, - {&__pyx_kp_u_could_not_get_buffer_for_memoryv, __pyx_k_could_not_get_buffer_for_memoryv, sizeof(__pyx_k_could_not_get_buffer_for_memoryv), 0, 1, 0, 0}, - {&__pyx_n_s_ctx, __pyx_k_ctx, sizeof(__pyx_k_ctx), 0, 0, 1, 1}, - {&__pyx_n_u_d, __pyx_k_d, sizeof(__pyx_k_d), 0, 1, 0, 1}, - {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, - {&__pyx_n_s_datetime, __pyx_k_datetime, sizeof(__pyx_k_datetime), 0, 0, 1, 1}, - {&__pyx_n_s_default, __pyx_k_default, sizeof(__pyx_k_default), 0, 0, 1, 1}, - {&__pyx_kp_u_default_must_be_a_callable, __pyx_k_default_must_be_a_callable, sizeof(__pyx_k_default_must_be_a_callable), 0, 1, 0, 0}, - {&__pyx_n_s_default_read_extended_type, __pyx_k_default_read_extended_type, sizeof(__pyx_k_default_read_extended_type), 0, 0, 1, 1}, - {&__pyx_kp_u_dict_is_too_large, __pyx_k_dict_is_too_large, sizeof(__pyx_k_dict_is_too_large), 0, 1, 0, 0}, - {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, - {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, - {&__pyx_n_s_exceptions, __pyx_k_exceptions, sizeof(__pyx_k_exceptions), 0, 0, 1, 1}, - {&__pyx_n_s_ext, __pyx_k_ext, sizeof(__pyx_k_ext), 0, 0, 1, 1}, - {&__pyx_n_s_ext_hook, __pyx_k_ext_hook, sizeof(__pyx_k_ext_hook), 0, 0, 1, 1}, - {&__pyx_kp_u_ext_hook_must_be_a_callable, __pyx_k_ext_hook_must_be_a_callable, sizeof(__pyx_k_ext_hook_must_be_a_callable), 0, 1, 0, 0}, - {&__pyx_kp_u_failed_to_calculate_delta, __pyx_k_failed_to_calculate_delta, sizeof(__pyx_k_failed_to_calculate_delta), 0, 1, 0, 0}, - {&__pyx_n_s_feed, __pyx_k_feed, sizeof(__pyx_k_feed), 0, 0, 1, 1}, - {&__pyx_n_s_file_like, __pyx_k_file_like, sizeof(__pyx_k_file_like), 0, 0, 1, 1}, - {&__pyx_kp_u_file_like_read_must_be_a_callab, __pyx_k_file_like_read_must_be_a_callab, sizeof(__pyx_k_file_like_read_must_be_a_callab), 0, 1, 0, 0}, - {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, - {&__pyx_n_s_getbuffer, __pyx_k_getbuffer, sizeof(__pyx_k_getbuffer), 0, 0, 1, 1}, - {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, - {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, - {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, - {&__pyx_kp_u_internal_error, __pyx_k_internal_error, sizeof(__pyx_k_internal_error), 0, 1, 0, 0}, - {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, - {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, - {&__pyx_n_s_items, __pyx_k_items, sizeof(__pyx_k_items), 0, 0, 1, 1}, - {&__pyx_n_s_k, __pyx_k_k, sizeof(__pyx_k_k), 0, 0, 1, 1}, - {&__pyx_n_s_list_hook, __pyx_k_list_hook, sizeof(__pyx_k_list_hook), 0, 0, 1, 1}, - {&__pyx_kp_u_list_hook_must_be_a_callable, __pyx_k_list_hook_must_be_a_callable, sizeof(__pyx_k_list_hook_must_be_a_callable), 0, 1, 0, 0}, - {&__pyx_kp_u_list_is_too_large, __pyx_k_list_is_too_large, sizeof(__pyx_k_list_is_too_large), 0, 1, 0, 0}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_max_array_len, __pyx_k_max_array_len, sizeof(__pyx_k_max_array_len), 0, 0, 1, 1}, - {&__pyx_n_s_max_bin_len, __pyx_k_max_bin_len, sizeof(__pyx_k_max_bin_len), 0, 0, 1, 1}, - {&__pyx_n_s_max_buffer_size, __pyx_k_max_buffer_size, sizeof(__pyx_k_max_buffer_size), 0, 0, 1, 1}, - {&__pyx_n_s_max_ext_len, __pyx_k_max_ext_len, sizeof(__pyx_k_max_ext_len), 0, 0, 1, 1}, - {&__pyx_n_s_max_map_len, __pyx_k_max_map_len, sizeof(__pyx_k_max_map_len), 0, 0, 1, 1}, - {&__pyx_n_s_max_str_len, __pyx_k_max_str_len, sizeof(__pyx_k_max_str_len), 0, 0, 1, 1}, - {&__pyx_kp_u_memoryview_is_too_large, __pyx_k_memoryview_is_too_large, sizeof(__pyx_k_memoryview_is_too_large), 0, 1, 0, 0}, - {&__pyx_n_s_msgpack__cmsgpack, __pyx_k_msgpack__cmsgpack, sizeof(__pyx_k_msgpack__cmsgpack), 0, 0, 1, 1}, - {&__pyx_kp_s_msgpack__packer_pyx, __pyx_k_msgpack__packer_pyx, sizeof(__pyx_k_msgpack__packer_pyx), 0, 0, 1, 0}, - {&__pyx_kp_s_msgpack__unpacker_pyx, __pyx_k_msgpack__unpacker_pyx, sizeof(__pyx_k_msgpack__unpacker_pyx), 0, 0, 1, 0}, - {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, - {&__pyx_n_s_nanoseconds, __pyx_k_nanoseconds, sizeof(__pyx_k_nanoseconds), 0, 0, 1, 1}, - {&__pyx_n_s_nbytes, __pyx_k_nbytes, sizeof(__pyx_k_nbytes), 0, 0, 1, 1}, - {&__pyx_n_s_next_bytes, __pyx_k_next_bytes, sizeof(__pyx_k_next_bytes), 0, 0, 1, 1}, - {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, - {&__pyx_n_s_nread, __pyx_k_nread, sizeof(__pyx_k_nread), 0, 0, 1, 1}, - {&__pyx_n_s_obj, __pyx_k_obj, sizeof(__pyx_k_obj), 0, 0, 1, 1}, - {&__pyx_n_s_object_hook, __pyx_k_object_hook, sizeof(__pyx_k_object_hook), 0, 0, 1, 1}, - {&__pyx_kp_u_object_hook_must_be_a_callable, __pyx_k_object_hook_must_be_a_callable, sizeof(__pyx_k_object_hook_must_be_a_callable), 0, 1, 0, 0}, - {&__pyx_n_s_object_pairs_hook, __pyx_k_object_pairs_hook, sizeof(__pyx_k_object_pairs_hook), 0, 0, 1, 1}, - {&__pyx_kp_u_object_pairs_hook_and_object_hoo, __pyx_k_object_pairs_hook_and_object_hoo, sizeof(__pyx_k_object_pairs_hook_and_object_hoo), 0, 1, 0, 0}, - {&__pyx_kp_u_object_pairs_hook_must_be_a_call, __pyx_k_object_pairs_hook_must_be_a_call, sizeof(__pyx_k_object_pairs_hook_must_be_a_call), 0, 1, 0, 0}, - {&__pyx_n_s_off, __pyx_k_off, sizeof(__pyx_k_off), 0, 0, 1, 1}, - {&__pyx_n_s_pack, __pyx_k_pack, sizeof(__pyx_k_pack), 0, 0, 1, 1}, - {&__pyx_n_s_pack_array_header, __pyx_k_pack_array_header, sizeof(__pyx_k_pack_array_header), 0, 0, 1, 1}, - {&__pyx_n_s_pack_ext_type, __pyx_k_pack_ext_type, sizeof(__pyx_k_pack_ext_type), 0, 0, 1, 1}, - {&__pyx_n_s_pack_map_header, __pyx_k_pack_map_header, sizeof(__pyx_k_pack_map_header), 0, 0, 1, 1}, - {&__pyx_n_s_pack_map_pairs, __pyx_k_pack_map_pairs, sizeof(__pyx_k_pack_map_pairs), 0, 0, 1, 1}, - {&__pyx_n_s_packed, __pyx_k_packed, sizeof(__pyx_k_packed), 0, 0, 1, 1}, - {&__pyx_n_s_pairs, __pyx_k_pairs, sizeof(__pyx_k_pairs), 0, 0, 1, 1}, - {&__pyx_n_s_pybuff, __pyx_k_pybuff, sizeof(__pyx_k_pybuff), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, - {&__pyx_n_s_raw, __pyx_k_raw, sizeof(__pyx_k_raw), 0, 0, 1, 1}, - {&__pyx_n_s_read, __pyx_k_read, sizeof(__pyx_k_read), 0, 0, 1, 1}, - {&__pyx_n_s_read_array_header, __pyx_k_read_array_header, sizeof(__pyx_k_read_array_header), 0, 0, 1, 1}, - {&__pyx_n_s_read_bytes, __pyx_k_read_bytes, sizeof(__pyx_k_read_bytes), 0, 0, 1, 1}, - {&__pyx_n_s_read_map_header, __pyx_k_read_map_header, sizeof(__pyx_k_read_map_header), 0, 0, 1, 1}, - {&__pyx_n_s_read_size, __pyx_k_read_size, sizeof(__pyx_k_read_size), 0, 0, 1, 1}, - {&__pyx_kp_u_read_size_should_be_less_or_equa, __pyx_k_read_size_should_be_less_or_equa, sizeof(__pyx_k_read_size_should_be_less_or_equa), 0, 1, 0, 0}, - {&__pyx_kp_u_recursion_limit_exceeded, __pyx_k_recursion_limit_exceeded, sizeof(__pyx_k_recursion_limit_exceeded), 0, 1, 0, 0}, - {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, - {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, - {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, - {&__pyx_n_s_reset, __pyx_k_reset, sizeof(__pyx_k_reset), 0, 0, 1, 1}, - {&__pyx_n_s_ret, __pyx_k_ret, sizeof(__pyx_k_ret), 0, 0, 1, 1}, - {&__pyx_n_s_seconds, __pyx_k_seconds, sizeof(__pyx_k_seconds), 0, 0, 1, 1}, - {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1}, - {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, - {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, - {&__pyx_n_s_size, __pyx_k_size, sizeof(__pyx_k_size), 0, 0, 1, 1}, - {&__pyx_n_s_skip, __pyx_k_skip, sizeof(__pyx_k_skip), 0, 0, 1, 1}, - {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, - {&__pyx_n_s_strict_map_key, __pyx_k_strict_map_key, sizeof(__pyx_k_strict_map_key), 0, 0, 1, 1}, - {&__pyx_n_s_strict_types, __pyx_k_strict_types, sizeof(__pyx_k_strict_types), 0, 0, 1, 1}, - {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, - {&__pyx_n_s_tell, __pyx_k_tell, sizeof(__pyx_k_tell), 0, 0, 1, 1}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_timestamp, __pyx_k_timestamp, sizeof(__pyx_k_timestamp), 0, 0, 1, 1}, - {&__pyx_kp_u_timestamp_must_be_0_3, __pyx_k_timestamp_must_be_0_3, sizeof(__pyx_k_timestamp_must_be_0_3), 0, 1, 0, 0}, - {&__pyx_n_s_timezone, __pyx_k_timezone, sizeof(__pyx_k_timezone), 0, 0, 1, 1}, - {&__pyx_n_s_typecode, __pyx_k_typecode, sizeof(__pyx_k_typecode), 0, 0, 1, 1}, - {&__pyx_n_s_unicode_errors, __pyx_k_unicode_errors, sizeof(__pyx_k_unicode_errors), 0, 0, 1, 1}, - {&__pyx_kp_u_unicode_string_is_too_large, __pyx_k_unicode_string_is_too_large, sizeof(__pyx_k_unicode_string_is_too_large), 0, 1, 0, 0}, - {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, - {&__pyx_n_s_unpackb, __pyx_k_unpackb, sizeof(__pyx_k_unpackb), 0, 0, 1, 1}, - {&__pyx_kp_u_unpacker_feed_is_not_be_able_to, __pyx_k_unpacker_feed_is_not_be_able_to, sizeof(__pyx_k_unpacker_feed_is_not_be_able_to), 0, 1, 0, 0}, - {&__pyx_n_s_use_bin_type, __pyx_k_use_bin_type, sizeof(__pyx_k_use_bin_type), 0, 0, 1, 1}, - {&__pyx_n_s_use_list, __pyx_k_use_list, sizeof(__pyx_k_use_list), 0, 0, 1, 1}, - {&__pyx_n_s_use_single_float, __pyx_k_use_single_float, sizeof(__pyx_k_use_single_float), 0, 0, 1, 1}, - {&__pyx_n_s_utc, __pyx_k_utc, sizeof(__pyx_k_utc), 0, 0, 1, 1}, - {&__pyx_n_s_v, __pyx_k_v, sizeof(__pyx_k_v), 0, 0, 1, 1}, - {&__pyx_n_s_view, __pyx_k_view, sizeof(__pyx_k_view), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} - }; - return __Pyx_InitStrings(__pyx_string_tab); -} -/* #### Code section: cached_builtins ### */ -static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(0, 120, __pyx_L1_error) - __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 134, __pyx_L1_error) - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 163, __pyx_L1_error) - __pyx_builtin_OverflowError = __Pyx_GetBuiltinName(__pyx_n_s_OverflowError); if (!__pyx_builtin_OverflowError) __PYX_ERR(0, 182, __pyx_L1_error) - __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(0, 302, __pyx_L1_error) - __pyx_builtin_NotImplementedError = __Pyx_GetBuiltinName(__pyx_n_s_NotImplementedError); if (!__pyx_builtin_NotImplementedError) __PYX_ERR(1, 117, __pyx_L1_error) - __pyx_builtin_BufferError = __Pyx_GetBuiltinName(__pyx_n_s_BufferError); if (!__pyx_builtin_BufferError) __PYX_ERR(1, 129, __pyx_L1_error) - __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(1, 394, __pyx_L1_error) - __pyx_builtin_StopIteration = __Pyx_GetBuiltinName(__pyx_n_s_StopIteration); if (!__pyx_builtin_StopIteration) __PYX_ERR(1, 477, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} -/* #### Code section: cached_constants ### */ - -static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "cpython/datetime.pxd":308 - * cdef inline object timezone_new(object offset, object name=None): - * if PY_VERSION_HEX < 0x030700b1: - * raise RuntimeError('Time zones are not available from the C-API.') # <<<<<<<<<<<<<< - * return __Pyx_TimeZone_FromOffsetAndName(offset, <PyObject*>name if name is not None else NULL) - * - */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_Time_zones_are_not_available_fro); if (unlikely(!__pyx_tuple_)) __PYX_ERR(2, 308, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple_); - __Pyx_GIVEREF(__pyx_tuple_); - - /* "msgpack/_packer.pyx":120 - * self.pk.buf = <char*> PyMem_Malloc(buf_size) - * if self.pk.buf == NULL: - * raise MemoryError("Unable to allocate internal buffer.") # <<<<<<<<<<<<<< - * self.pk.buf_size = buf_size - * self.pk.length = 0 - */ - __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_Unable_to_allocate_internal_buff); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__2); - __Pyx_GIVEREF(__pyx_tuple__2); - - /* "msgpack/_packer.pyx":134 - * if default is not None: - * if not PyCallable_Check(default): - * raise TypeError("default must be a callable.") # <<<<<<<<<<<<<< - * self._default = default - * - */ - __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_default_must_be_a_callable); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 134, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__3); - __Pyx_GIVEREF(__pyx_tuple__3); - - /* "msgpack/_packer.pyx":163 - * - * if nest_limit < 0: - * raise ValueError("recursion limit exceeded.") # <<<<<<<<<<<<<< - * - * while True: - */ - __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_recursion_limit_exceeded); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 163, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__5); - __Pyx_GIVEREF(__pyx_tuple__5); - - /* "msgpack/_packer.pyx":188 - * continue - * else: - * raise OverflowError("Integer value out of range") # <<<<<<<<<<<<<< - * elif PyInt_CheckExact(o) if strict_types else PyInt_Check(o): - * longval = o - */ - __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_Integer_value_out_of_range); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 188, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__6); - __Pyx_GIVEREF(__pyx_tuple__6); - - /* "msgpack/_packer.pyx":211 - * ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - * if ret == -2: - * raise ValueError("unicode string is too large") # <<<<<<<<<<<<<< - * else: - * o = PyUnicode_AsEncodedString(o, NULL, self.unicode_errors) - */ - __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_unicode_string_is_too_large); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 211, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__7); - __Pyx_GIVEREF(__pyx_tuple__7); - - /* "msgpack/_packer.pyx":225 - * L = len(d) - * if L > ITEM_LIMIT: - * raise ValueError("dict is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_map(&self.pk, L) - * if ret == 0: - */ - __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_dict_is_too_large); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 225, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__8); - __Pyx_GIVEREF(__pyx_tuple__8); - - /* "msgpack/_packer.pyx":250 - * L = len(o.data) - * if L > ITEM_LIMIT: - * raise ValueError("EXT data is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_ext(&self.pk, longval, L) - * ret = msgpack_pack_raw_body(&self.pk, rawval, L) - */ - __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_EXT_data_is_too_large); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 250, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__9); - __Pyx_GIVEREF(__pyx_tuple__9); - - /* "msgpack/_packer.pyx":260 - * L = Py_SIZE(o) - * if L > ITEM_LIMIT: - * raise ValueError("list is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_array(&self.pk, L) - * if ret == 0: - */ - __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_list_is_too_large); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 260, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__10); - __Pyx_GIVEREF(__pyx_tuple__10); - - /* "msgpack/_packer.pyx":268 - * elif PyMemoryView_Check(o): - * if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: - * raise ValueError("could not get buffer for memoryview") # <<<<<<<<<<<<<< - * L = view.len - * if L > ITEM_LIMIT: - */ - __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_could_not_get_buffer_for_memoryv); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 268, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__11); - __Pyx_GIVEREF(__pyx_tuple__11); - - /* "msgpack/_packer.pyx":272 - * if L > ITEM_LIMIT: - * PyBuffer_Release(&view); - * raise ValueError("memoryview is too large") # <<<<<<<<<<<<<< - * ret = msgpack_pack_bin(&self.pk, L) - * if ret == 0: - */ - __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_u_memoryview_is_too_large); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 272, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__12); - __Pyx_GIVEREF(__pyx_tuple__12); - - /* "msgpack/_packer.pyx":280 - * delta = o - epoch - * if not PyDelta_CheckExact(delta): - * raise ValueError("failed to calculate delta") # <<<<<<<<<<<<<< - * llval = timedelta_days(delta) * <long long>(24*60*60) + timedelta_seconds(delta) - * ulval = timedelta_microseconds(delta) * 1000 - */ - __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_u_failed_to_calculate_delta); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 280, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__13); - __Pyx_GIVEREF(__pyx_tuple__13); - - /* "msgpack/_packer.pyx":302 - * raise - * if ret: # should not happen. - * raise RuntimeError("internal error") # <<<<<<<<<<<<<< - * if self.autoreset: - * buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_u_internal_error); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 302, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__14); - __Pyx_GIVEREF(__pyx_tuple__14); - - /* "msgpack/_unpacker.pyx":81 - * - * if object_hook is not None and object_pairs_hook is not None: - * raise TypeError("object_pairs_hook and object_hook are mutually exclusive.") # <<<<<<<<<<<<<< - * - * if object_hook is not None: - */ - __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_u_object_pairs_hook_and_object_hoo); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(1, 81, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__15); - __Pyx_GIVEREF(__pyx_tuple__15); - - /* "msgpack/_unpacker.pyx":85 - * if object_hook is not None: - * if not PyCallable_Check(object_hook): - * raise TypeError("object_hook must be a callable.") # <<<<<<<<<<<<<< - * ctx.user.object_hook = <PyObject*>object_hook - * - */ - __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_u_object_hook_must_be_a_callable); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 85, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__16); - __Pyx_GIVEREF(__pyx_tuple__16); - - /* "msgpack/_unpacker.pyx":92 - * else: - * if not PyCallable_Check(object_pairs_hook): - * raise TypeError("object_pairs_hook must be a callable.") # <<<<<<<<<<<<<< - * ctx.user.object_hook = <PyObject*>object_pairs_hook - * ctx.user.has_pairs_hook = True - */ - __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_u_object_pairs_hook_must_be_a_call); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(1, 92, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__17); - __Pyx_GIVEREF(__pyx_tuple__17); - - /* "msgpack/_unpacker.pyx":98 - * if list_hook is not None: - * if not PyCallable_Check(list_hook): - * raise TypeError("list_hook must be a callable.") # <<<<<<<<<<<<<< - * ctx.user.list_hook = <PyObject*>list_hook - * - */ - __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_u_list_hook_must_be_a_callable); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(1, 98, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__18); - __Pyx_GIVEREF(__pyx_tuple__18); - - /* "msgpack/_unpacker.pyx":103 - * if ext_hook is not None: - * if not PyCallable_Check(ext_hook): - * raise TypeError("ext_hook must be a callable.") # <<<<<<<<<<<<<< - * ctx.user.ext_hook = <PyObject*>ext_hook - * - */ - __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_u_ext_hook_must_be_a_callable); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(1, 103, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__19); - __Pyx_GIVEREF(__pyx_tuple__19); - - /* "msgpack/_unpacker.pyx":107 - * - * if timestamp < 0 or 3 < timestamp: - * raise ValueError("timestamp must be 0..3") # <<<<<<<<<<<<<< - * - * # Add Timestamp type to the user object so it may be used in unpack.h - */ - __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_u_timestamp_must_be_0_3); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(1, 107, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__20); - __Pyx_GIVEREF(__pyx_tuple__20); - - /* "msgpack/_unpacker.pyx":129 - * if view.itemsize != 1: - * PyBuffer_Release(view) - * raise BufferError("cannot unpack from multi-byte object") # <<<<<<<<<<<<<< - * if PyBuffer_IsContiguous(view, b'A') == 0: - * PyBuffer_Release(view) - */ - __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_u_cannot_unpack_from_multi_byte_ob); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(1, 129, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__21); - __Pyx_GIVEREF(__pyx_tuple__21); - - /* "msgpack/_unpacker.pyx":205 - * unpack_clear(&ctx) - * if ret == 0: - * raise ValueError("Unpack failed: incomplete input") # <<<<<<<<<<<<<< - * elif ret == -2: - * raise FormatError - */ - __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_u_Unpack_failed_incomplete_input); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(1, 205, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__22); - __Pyx_GIVEREF(__pyx_tuple__22); - - /* "msgpack/_unpacker.pyx":348 - * self.file_like_read = file_like.read - * if not PyCallable_Check(self.file_like_read): - * raise TypeError("`file_like.read` must be a callable.") # <<<<<<<<<<<<<< - * - * if not max_buffer_size: - */ - __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_u_file_like_read_must_be_a_callab); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(1, 348, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__24); - __Pyx_GIVEREF(__pyx_tuple__24); - - /* "msgpack/_unpacker.pyx":364 - * - * if read_size > max_buffer_size: - * raise ValueError("read_size should be less or equal to max_buffer_size") # <<<<<<<<<<<<<< - * if not read_size: - * read_size = min(max_buffer_size, 1024**2) - */ - __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_u_read_size_should_be_less_or_equa); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(1, 364, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__25); - __Pyx_GIVEREF(__pyx_tuple__25); - - /* "msgpack/_unpacker.pyx":394 - * - * if self.file_like is not None: - * raise AssertionError( # <<<<<<<<<<<<<< - * "unpacker.feed() is not be able to use with `file_like`.") - * - */ - __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_u_unpacker_feed_is_not_be_able_to); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(1, 394, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__26); - __Pyx_GIVEREF(__pyx_tuple__26); - - /* "msgpack/_unpacker.pyx":428 - * # self.buf still holds old buffer and will be freed during - * # obj destruction - * raise MemoryError("Unable to enlarge internal buffer.") # <<<<<<<<<<<<<< - * memcpy(new_buf, buf + head, tail - head) - * PyMem_Free(buf) - */ - __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_u_Unable_to_enlarge_internal_buffe); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(1, 428, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__27); - __Pyx_GIVEREF(__pyx_tuple__27); - - /* "msgpack/_unpacker.pyx":477 - * continue - * if iter: - * raise StopIteration("No more data to unpack.") # <<<<<<<<<<<<<< - * else: - * raise OutOfData("No more data to unpack.") - */ - __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_u_No_more_data_to_unpack); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(1, 477, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__28); - __Pyx_GIVEREF(__pyx_tuple__28); - - /* "msgpack/_packer.pyx":294 - * return ret - * - * cpdef pack(self, object obj): # <<<<<<<<<<<<<< - * cdef int ret - * try: - */ - __pyx_tuple__31 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 294, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__31); - __Pyx_GIVEREF(__pyx_tuple__31); - __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__packer_pyx, __pyx_n_s_pack, 294, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 294, __pyx_L1_error) - - /* "msgpack/_packer.pyx":308 - * return buf - * - * def pack_ext_type(self, typecode, data): # <<<<<<<<<<<<<< - * msgpack_pack_ext(&self.pk, typecode, len(data)) - * msgpack_pack_raw_body(&self.pk, data, len(data)) - */ - __pyx_tuple__33 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_typecode, __pyx_n_s_data); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 308, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__33); - __Pyx_GIVEREF(__pyx_tuple__33); - __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__packer_pyx, __pyx_n_s_pack_ext_type, 308, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 308, __pyx_L1_error) - - /* "msgpack/_packer.pyx":312 - * msgpack_pack_raw_body(&self.pk, data, len(data)) - * - * def pack_array_header(self, long long size): # <<<<<<<<<<<<<< - * if size > ITEM_LIMIT: - * raise ValueError - */ - __pyx_tuple__35 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_size, __pyx_n_s_ret, __pyx_n_s_buf); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 312, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__35); - __Pyx_GIVEREF(__pyx_tuple__35); - __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__35, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__packer_pyx, __pyx_n_s_pack_array_header, 312, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) __PYX_ERR(0, 312, __pyx_L1_error) - - /* "msgpack/_packer.pyx":325 - * return buf - * - * def pack_map_header(self, long long size): # <<<<<<<<<<<<<< - * if size > ITEM_LIMIT: - * raise ValueError - */ - __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__35, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__packer_pyx, __pyx_n_s_pack_map_header, 325, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 325, __pyx_L1_error) - - /* "msgpack/_packer.pyx":338 - * return buf - * - * def pack_map_pairs(self, object pairs): # <<<<<<<<<<<<<< - * """ - * Pack *pairs* as msgpack map type. - */ - __pyx_tuple__38 = PyTuple_Pack(6, __pyx_n_s_self, __pyx_n_s_pairs, __pyx_n_s_ret, __pyx_n_s_k, __pyx_n_s_v, __pyx_n_s_buf); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 338, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__38); - __Pyx_GIVEREF(__pyx_tuple__38); - __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__packer_pyx, __pyx_n_s_pack_map_pairs, 338, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 338, __pyx_L1_error) - - /* "msgpack/_packer.pyx":361 - * return buf - * - * def reset(self): # <<<<<<<<<<<<<< - * """Reset internal buffer. - * - */ - __pyx_tuple__40 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 361, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__40); - __Pyx_GIVEREF(__pyx_tuple__40); - __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__packer_pyx, __pyx_n_s_reset, 361, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 361, __pyx_L1_error) - - /* "msgpack/_packer.pyx":368 - * self.pk.length = 0 - * - * def bytes(self): # <<<<<<<<<<<<<< - * """Return internal buffer contents as bytes object""" - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__packer_pyx, __pyx_n_s_bytes, 368, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(0, 368, __pyx_L1_error) - - /* "msgpack/_packer.pyx":372 - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * - * def getbuffer(self): # <<<<<<<<<<<<<< - * """Return view of internal buffer.""" - * return buff_to_buff(self.pk.buf, self.pk.length) - */ - __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__packer_pyx, __pyx_n_s_getbuffer, 372, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(0, 372, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - */ - __pyx_codeobj__44 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__44)) __PYX_ERR(4, 1, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - __pyx_tuple__45 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_pyx_state); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(4, 3, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__45); - __Pyx_GIVEREF(__pyx_tuple__45); - __pyx_codeobj__46 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__45, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__46)) __PYX_ERR(4, 3, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":116 - * ctx.user.unicode_errors = unicode_errors - * - * def default_read_extended_type(typecode, data): # <<<<<<<<<<<<<< - * raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) - * - */ - __pyx_tuple__47 = PyTuple_Pack(2, __pyx_n_s_typecode, __pyx_n_s_data); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(1, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__47); - __Pyx_GIVEREF(__pyx_tuple__47); - __pyx_codeobj__48 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__47, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_default_read_extended_type, 116, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__48)) __PYX_ERR(1, 116, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":143 - * - * - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - */ - __pyx_tuple__49 = PyTuple_Pack(23, __pyx_n_s_packed, __pyx_n_s_object_hook, __pyx_n_s_list_hook, __pyx_n_s_use_list, __pyx_n_s_raw, __pyx_n_s_timestamp, __pyx_n_s_strict_map_key, __pyx_n_s_unicode_errors, __pyx_n_s_object_pairs_hook, __pyx_n_s_ext_hook, __pyx_n_s_max_str_len, __pyx_n_s_max_bin_len, __pyx_n_s_max_array_len, __pyx_n_s_max_map_len, __pyx_n_s_max_ext_len, __pyx_n_s_ctx, __pyx_n_s_off, __pyx_n_s_ret, __pyx_n_s_view, __pyx_n_s_buf, __pyx_n_s_buf_len, __pyx_n_s_cerr, __pyx_n_s_obj); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__49); - __Pyx_GIVEREF(__pyx_tuple__49); - __pyx_codeobj__50 = (PyObject*)__Pyx_PyCode_New(1, 0, 14, 23, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__49, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_unpackb, 143, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__50)) __PYX_ERR(1, 143, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":387 - * max_map_len, max_ext_len) - * - * def feed(self, object next_bytes): # <<<<<<<<<<<<<< - * """Append `next_bytes` to internal buffer.""" - * cdef Py_buffer pybuff - */ - __pyx_tuple__51 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_next_bytes, __pyx_n_s_pybuff, __pyx_n_s_buf, __pyx_n_s_buf_len); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(1, 387, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__51); - __Pyx_GIVEREF(__pyx_tuple__51); - __pyx_codeobj__52 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__51, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_feed, 387, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__52)) __PYX_ERR(1, 387, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":487 - * raise ValueError("Unpack failed: error = %d" % (ret,)) - * - * def read_bytes(self, Py_ssize_t nbytes): # <<<<<<<<<<<<<< - * """Read a specified number of raw bytes from the stream""" - * cdef Py_ssize_t nread - */ - __pyx_tuple__53 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_nbytes, __pyx_n_s_nread, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(1, 487, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__53); - __Pyx_GIVEREF(__pyx_tuple__53); - __pyx_codeobj__54 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__53, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_read_bytes, 487, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__54)) __PYX_ERR(1, 487, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":499 - * return ret - * - * def unpack(self): # <<<<<<<<<<<<<< - * """Unpack one object - * - */ - __pyx_codeobj__55 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_unpack, 499, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__55)) __PYX_ERR(1, 499, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":506 - * return self._unpack(unpack_construct) - * - * def skip(self): # <<<<<<<<<<<<<< - * """Read and ignore one object, returning None - * - */ - __pyx_codeobj__56 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_skip, 506, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__56)) __PYX_ERR(1, 506, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":513 - * return self._unpack(unpack_skip) - * - * def read_array_header(self): # <<<<<<<<<<<<<< - * """assuming the next object is an array, return its size n, such that - * the next n unpack() calls will iterate over its contents. - */ - __pyx_codeobj__57 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_read_array_header, 513, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__57)) __PYX_ERR(1, 513, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":521 - * return self._unpack(read_array_header) - * - * def read_map_header(self): # <<<<<<<<<<<<<< - * """assuming the next object is a map, return its size n, such that the - * next n * 2 unpack() calls will iterate over its key-value pairs. - */ - __pyx_codeobj__58 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_read_map_header, 521, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__58)) __PYX_ERR(1, 521, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":529 - * return self._unpack(read_map_header) - * - * def tell(self): # <<<<<<<<<<<<<< - * """Returns the current position of the Unpacker in bytes, i.e., the - * number of bytes that were read from the input, also the starting - */ - __pyx_codeobj__59 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_msgpack__unpacker_pyx, __pyx_n_s_tell, 529, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__59)) __PYX_ERR(1, 529, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - */ - __pyx_codeobj__60 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__60)) __PYX_ERR(4, 1, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - __pyx_codeobj__61 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__45, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__61)) __PYX_ERR(4, 3, __pyx_L1_error) - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} -/* #### Code section: init_constants ### */ - -static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { - if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(5, 1, __pyx_L1_error); - __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(5, 1, __pyx_L1_error) - __pyx_int_1000000000 = PyInt_FromLong(1000000000L); if (unlikely(!__pyx_int_1000000000)) __PYX_ERR(5, 1, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} -/* #### Code section: init_globals ### */ - -static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - return 0; -} -/* #### Code section: init_module ### */ - -static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ - -static int __Pyx_modinit_global_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); - /*--- Global init code ---*/ - __pyx_v_7msgpack_9_cmsgpack_utc = Py_None; Py_INCREF(Py_None); - __pyx_v_7msgpack_9_cmsgpack_epoch = Py_None; Py_INCREF(Py_None); - __pyx_v_7msgpack_9_cmsgpack_ExtType = Py_None; Py_INCREF(Py_None); - __pyx_v_7msgpack_9_cmsgpack_Timestamp = Py_None; Py_INCREF(Py_None); - __pyx_v_7msgpack_9_cmsgpack_giga = Py_None; Py_INCREF(Py_None); - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); - /*--- Variable export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); - /*--- Function export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_init_code(void) { - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); - /*--- Type init code ---*/ - __pyx_vtabptr_7msgpack_9_cmsgpack_Packer = &__pyx_vtable_7msgpack_9_cmsgpack_Packer; - __pyx_vtable_7msgpack_9_cmsgpack_Packer._pack = (int (*)(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *, PyObject *, struct __pyx_opt_args_7msgpack_9_cmsgpack_6Packer__pack *__pyx_optional_args))__pyx_f_7msgpack_9_cmsgpack_6Packer__pack; - __pyx_vtable_7msgpack_9_cmsgpack_Packer.pack = (PyObject *(*)(struct __pyx_obj_7msgpack_9_cmsgpack_Packer *, PyObject *, int __pyx_skip_dispatch))__pyx_f_7msgpack_9_cmsgpack_6Packer_pack; - #if CYTHON_USE_TYPE_SPECS - __pyx_ptype_7msgpack_9_cmsgpack_Packer = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7msgpack_9_cmsgpack_Packer_spec, NULL); if (unlikely(!__pyx_ptype_7msgpack_9_cmsgpack_Packer)) __PYX_ERR(0, 62, __pyx_L1_error) - if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7msgpack_9_cmsgpack_Packer_spec, __pyx_ptype_7msgpack_9_cmsgpack_Packer) < 0) __PYX_ERR(0, 62, __pyx_L1_error) - #else - __pyx_ptype_7msgpack_9_cmsgpack_Packer = &__pyx_type_7msgpack_9_cmsgpack_Packer; - #endif - #if !CYTHON_COMPILING_IN_LIMITED_API - #endif - #if !CYTHON_USE_TYPE_SPECS - if (__Pyx_PyType_Ready(__pyx_ptype_7msgpack_9_cmsgpack_Packer) < 0) __PYX_ERR(0, 62, __pyx_L1_error) - #endif - #if PY_MAJOR_VERSION < 3 - __pyx_ptype_7msgpack_9_cmsgpack_Packer->tp_print = 0; - #endif - #if !CYTHON_COMPILING_IN_LIMITED_API - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7msgpack_9_cmsgpack_Packer->tp_dictoffset && __pyx_ptype_7msgpack_9_cmsgpack_Packer->tp_getattro == PyObject_GenericGetAttr)) { - __pyx_ptype_7msgpack_9_cmsgpack_Packer->tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - #endif - if (__Pyx_SetVtable(__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_vtabptr_7msgpack_9_cmsgpack_Packer) < 0) __PYX_ERR(0, 62, __pyx_L1_error) - #if !CYTHON_COMPILING_IN_LIMITED_API - if (__Pyx_MergeVtables(__pyx_ptype_7msgpack_9_cmsgpack_Packer) < 0) __PYX_ERR(0, 62, __pyx_L1_error) - #endif - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Packer, (PyObject *) __pyx_ptype_7msgpack_9_cmsgpack_Packer) < 0) __PYX_ERR(0, 62, __pyx_L1_error) - #if !CYTHON_COMPILING_IN_LIMITED_API - if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7msgpack_9_cmsgpack_Packer) < 0) __PYX_ERR(0, 62, __pyx_L1_error) - #endif - __pyx_vtabptr_7msgpack_9_cmsgpack_Unpacker = &__pyx_vtable_7msgpack_9_cmsgpack_Unpacker; - __pyx_vtable_7msgpack_9_cmsgpack_Unpacker.append_buffer = (PyObject *(*)(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *, void *, Py_ssize_t))__pyx_f_7msgpack_9_cmsgpack_8Unpacker_append_buffer; - __pyx_vtable_7msgpack_9_cmsgpack_Unpacker.read_from_file = (int (*)(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *))__pyx_f_7msgpack_9_cmsgpack_8Unpacker_read_from_file; - __pyx_vtable_7msgpack_9_cmsgpack_Unpacker._unpack = (PyObject *(*)(struct __pyx_obj_7msgpack_9_cmsgpack_Unpacker *, execute_fn, struct __pyx_opt_args_7msgpack_9_cmsgpack_8Unpacker__unpack *__pyx_optional_args))__pyx_f_7msgpack_9_cmsgpack_8Unpacker__unpack; - #if CYTHON_USE_TYPE_SPECS - __pyx_ptype_7msgpack_9_cmsgpack_Unpacker = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_7msgpack_9_cmsgpack_Unpacker_spec, NULL); if (unlikely(!__pyx_ptype_7msgpack_9_cmsgpack_Unpacker)) __PYX_ERR(1, 213, __pyx_L1_error) - if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_7msgpack_9_cmsgpack_Unpacker_spec, __pyx_ptype_7msgpack_9_cmsgpack_Unpacker) < 0) __PYX_ERR(1, 213, __pyx_L1_error) - #else - __pyx_ptype_7msgpack_9_cmsgpack_Unpacker = &__pyx_type_7msgpack_9_cmsgpack_Unpacker; - #endif - #if !CYTHON_COMPILING_IN_LIMITED_API - #endif - #if !CYTHON_USE_TYPE_SPECS - if (__Pyx_PyType_Ready(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker) < 0) __PYX_ERR(1, 213, __pyx_L1_error) - #endif - #if PY_MAJOR_VERSION < 3 - __pyx_ptype_7msgpack_9_cmsgpack_Unpacker->tp_print = 0; - #endif - #if !CYTHON_COMPILING_IN_LIMITED_API - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_7msgpack_9_cmsgpack_Unpacker->tp_dictoffset && __pyx_ptype_7msgpack_9_cmsgpack_Unpacker->tp_getattro == PyObject_GenericGetAttr)) { - __pyx_ptype_7msgpack_9_cmsgpack_Unpacker->tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - #endif - if (__Pyx_SetVtable(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker, __pyx_vtabptr_7msgpack_9_cmsgpack_Unpacker) < 0) __PYX_ERR(1, 213, __pyx_L1_error) - #if !CYTHON_COMPILING_IN_LIMITED_API - if (__Pyx_MergeVtables(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker) < 0) __PYX_ERR(1, 213, __pyx_L1_error) - #endif - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_Unpacker, (PyObject *) __pyx_ptype_7msgpack_9_cmsgpack_Unpacker) < 0) __PYX_ERR(1, 213, __pyx_L1_error) - #if !CYTHON_COMPILING_IN_LIMITED_API - if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_7msgpack_9_cmsgpack_Unpacker) < 0) __PYX_ERR(1, 213, __pyx_L1_error) - #endif - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_type_import_code(void) { - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); - /*--- Type import code ---*/ - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(6, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_2(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", - #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyTypeObject), - #elif CYTHON_COMPILING_IN_LIMITED_API - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyTypeObject), - #else - sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyHeapTypeObject), - #endif - __Pyx_ImportType_CheckSize_Warn_3_0_2); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(6, 9, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(7, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_2(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_2); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(7, 8, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(8, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_2(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_2); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(8, 15, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule("datetime"); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 70, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_8datetime_date = __Pyx_ImportType_3_0_2(__pyx_t_1, "datetime", "date", sizeof(PyDateTime_Date), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyDateTime_Date),__Pyx_ImportType_CheckSize_Warn_3_0_2); if (!__pyx_ptype_7cpython_8datetime_date) __PYX_ERR(2, 70, __pyx_L1_error) - __pyx_ptype_7cpython_8datetime_time = __Pyx_ImportType_3_0_2(__pyx_t_1, "datetime", "time", sizeof(PyDateTime_Time), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyDateTime_Time),__Pyx_ImportType_CheckSize_Warn_3_0_2); if (!__pyx_ptype_7cpython_8datetime_time) __PYX_ERR(2, 83, __pyx_L1_error) - __pyx_ptype_7cpython_8datetime_datetime = __Pyx_ImportType_3_0_2(__pyx_t_1, "datetime", "datetime", sizeof(PyDateTime_DateTime), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyDateTime_DateTime),__Pyx_ImportType_CheckSize_Warn_3_0_2); if (!__pyx_ptype_7cpython_8datetime_datetime) __PYX_ERR(2, 109, __pyx_L1_error) - __pyx_ptype_7cpython_8datetime_timedelta = __Pyx_ImportType_3_0_2(__pyx_t_1, "datetime", "timedelta", sizeof(PyDateTime_Delta), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyDateTime_Delta),__Pyx_ImportType_CheckSize_Warn_3_0_2); if (!__pyx_ptype_7cpython_8datetime_timedelta) __PYX_ERR(2, 147, __pyx_L1_error) - __pyx_ptype_7cpython_8datetime_tzinfo = __Pyx_ImportType_3_0_2(__pyx_t_1, "datetime", "tzinfo", sizeof(PyDateTime_TZInfo), __PYX_GET_STRUCT_ALIGNMENT_3_0_2(PyDateTime_TZInfo),__Pyx_ImportType_CheckSize_Warn_3_0_2); if (!__pyx_ptype_7cpython_8datetime_tzinfo) __PYX_ERR(2, 160, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_variable_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); - /*--- Variable import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); - /*--- Function import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - - -#if PY_MAJOR_VERSION >= 3 -#if CYTHON_PEP489_MULTI_PHASE_INIT -static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec__cmsgpack(PyObject* module); /*proto*/ -static PyModuleDef_Slot __pyx_moduledef_slots[] = { - {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec__cmsgpack}, - {0, NULL} -}; -#endif - -#ifdef __cplusplus -namespace { - struct PyModuleDef __pyx_moduledef = - #else - static struct PyModuleDef __pyx_moduledef = - #endif - { - PyModuleDef_HEAD_INIT, - "_cmsgpack", - 0, /* m_doc */ - #if CYTHON_PEP489_MULTI_PHASE_INIT - 0, /* m_size */ - #elif CYTHON_USE_MODULE_STATE - sizeof(__pyx_mstate), /* m_size */ - #else - -1, /* m_size */ - #endif - __pyx_methods /* m_methods */, - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_moduledef_slots, /* m_slots */ - #else - NULL, /* m_reload */ - #endif - #if CYTHON_USE_MODULE_STATE - __pyx_m_traverse, /* m_traverse */ - __pyx_m_clear, /* m_clear */ - NULL /* m_free */ - #else - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ - #endif - }; - #ifdef __cplusplus -} /* anonymous namespace */ -#endif -#endif - -#ifndef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC -#elif PY_MAJOR_VERSION < 3 -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" void -#else -#define __Pyx_PyMODINIT_FUNC void -#endif -#else -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * -#else -#define __Pyx_PyMODINIT_FUNC PyObject * -#endif -#endif - - -#if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC init_cmsgpack(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC init_cmsgpack(void) -#else -__Pyx_PyMODINIT_FUNC PyInit__cmsgpack(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit__cmsgpack(void) -#if CYTHON_PEP489_MULTI_PHASE_INIT -{ - return PyModuleDef_Init(&__pyx_moduledef); -} -static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { - #if PY_VERSION_HEX >= 0x030700A1 - static PY_INT64_T main_interpreter_id = -1; - PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); - if (main_interpreter_id == -1) { - main_interpreter_id = current_id; - return (unlikely(current_id == -1)) ? -1 : 0; - } else if (unlikely(main_interpreter_id != current_id)) - #else - static PyInterpreterState *main_interpreter = NULL; - PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; - if (!main_interpreter) { - main_interpreter = current_interpreter; - } else if (unlikely(main_interpreter != current_interpreter)) - #endif - { - PyErr_SetString( - PyExc_ImportError, - "Interpreter change detected - this module can only be loaded into one interpreter per process."); - return -1; - } - return 0; -} -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) -#else -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) -#endif -{ - PyObject *value = PyObject_GetAttrString(spec, from_name); - int result = 0; - if (likely(value)) { - if (allow_none || value != Py_None) { -#if CYTHON_COMPILING_IN_LIMITED_API - result = PyModule_AddObject(module, to_name, value); -#else - result = PyDict_SetItemString(moddict, to_name, value); -#endif - } - Py_DECREF(value); - } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } else { - result = -1; - } - return result; -} -static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { - PyObject *module = NULL, *moddict, *modname; - CYTHON_UNUSED_VAR(def); - if (__Pyx_check_single_interpreter()) - return NULL; - if (__pyx_m) - return __Pyx_NewRef(__pyx_m); - modname = PyObject_GetAttrString(spec, "name"); - if (unlikely(!modname)) goto bad; - module = PyModule_NewObject(modname); - Py_DECREF(modname); - if (unlikely(!module)) goto bad; -#if CYTHON_COMPILING_IN_LIMITED_API - moddict = module; -#else - moddict = PyModule_GetDict(module); - if (unlikely(!moddict)) goto bad; -#endif - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; - return module; -bad: - Py_XDECREF(module); - return NULL; -} - - -static CYTHON_SMALL_CODE int __pyx_pymod_exec__cmsgpack(PyObject *__pyx_pyinit_module) -#endif -#endif -{ - int stringtab_initialized = 0; - #if CYTHON_USE_MODULE_STATE - int pystate_addmodule_run = 0; - #endif - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_PEP489_MULTI_PHASE_INIT - if (__pyx_m) { - if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module '_cmsgpack' has already been imported. Re-initialisation is not supported."); - return -1; - } - #elif PY_MAJOR_VERSION >= 3 - if (__pyx_m) return __Pyx_NewRef(__pyx_m); - #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; - Py_INCREF(__pyx_m); - #else - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("_cmsgpack", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - if (unlikely(!__pyx_m)) __PYX_ERR(5, 1, __pyx_L1_error) - #elif CYTHON_USE_MODULE_STATE - __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 1, __pyx_L1_error) - { - int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); - __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to _cmsgpack pseudovariable */ - if (unlikely((add_module_result < 0))) __PYX_ERR(5, 1, __pyx_L1_error) - pystate_addmodule_run = 1; - } - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - if (unlikely(!__pyx_m)) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - #endif - CYTHON_UNUSED_VAR(__pyx_t_1); - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(5, 1, __pyx_L1_error) - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(5, 1, __pyx_L1_error) - Py_INCREF(__pyx_b); - __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(5, 1, __pyx_L1_error) - Py_INCREF(__pyx_cython_runtime); - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #if CYTHON_REFNANNY -__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); -if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); -} -#endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__cmsgpack(void)", 0); - if (__Pyx_check_binary_version() < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #ifdef __Pxy_PyFrame_Initialize_Offsets - __Pxy_PyFrame_Initialize_Offsets(); - #endif - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(5, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(5, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(5, 1, __pyx_L1_error) - #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - PyEval_InitThreads(); - #endif - /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitConstants() < 0) __PYX_ERR(5, 1, __pyx_L1_error) - stringtab_initialized = 1; - if (__Pyx_InitGlobals() < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - if (__pyx_module_is_main_msgpack___cmsgpack) { - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(5, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "msgpack._cmsgpack")) { - if (unlikely((PyDict_SetItemString(modules, "msgpack._cmsgpack", __pyx_m) < 0))) __PYX_ERR(5, 1, __pyx_L1_error) - } - } - #endif - /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(5, 1, __pyx_L1_error) - /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(5, 1, __pyx_L1_error) - /*--- Global type/function init code ---*/ - (void)__Pyx_modinit_global_init_code(); - (void)__Pyx_modinit_variable_export_code(); - (void)__Pyx_modinit_function_export_code(); - if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(5, 1, __pyx_L1_error) - if (unlikely((__Pyx_modinit_type_import_code() < 0))) __PYX_ERR(5, 1, __pyx_L1_error) - (void)__Pyx_modinit_variable_import_code(); - (void)__Pyx_modinit_function_import_code(); - /*--- Execution code ---*/ - #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(5, 1, __pyx_L1_error) - #endif - - /* "msgpack/_cmsgpack.pyx":4 - * #cython: embedsignature=True, c_string_encoding=ascii, language_level=3 - * from cpython.datetime cimport import_datetime, datetime_new - * import_datetime() # <<<<<<<<<<<<<< - * - * import datetime - */ - __pyx_f_7cpython_8datetime_import_datetime(); if (unlikely(PyErr_Occurred())) __PYX_ERR(5, 4, __pyx_L1_error) - - /* "msgpack/_cmsgpack.pyx":6 - * import_datetime() - * - * import datetime # <<<<<<<<<<<<<< - * cdef object utc = datetime.timezone.utc - * cdef object epoch = datetime_new(1970, 1, 1, 0, 0, 0, 0, tz=utc) - */ - __pyx_t_2 = __Pyx_ImportDottedModule(__pyx_n_s_datetime, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_datetime, __pyx_t_2) < 0) __PYX_ERR(5, 6, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_cmsgpack.pyx":7 - * - * import datetime - * cdef object utc = datetime.timezone.utc # <<<<<<<<<<<<<< - * cdef object epoch = datetime_new(1970, 1, 1, 0, 0, 0, 0, tz=utc) - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_datetime); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_timezone); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_utc); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_XGOTREF(__pyx_v_7msgpack_9_cmsgpack_utc); - __Pyx_DECREF_SET(__pyx_v_7msgpack_9_cmsgpack_utc, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __pyx_t_2 = 0; - - /* "msgpack/_cmsgpack.pyx":8 - * import datetime - * cdef object utc = datetime.timezone.utc - * cdef object epoch = datetime_new(1970, 1, 1, 0, 0, 0, 0, tz=utc) # <<<<<<<<<<<<<< - * - * include "_packer.pyx" - */ - __pyx_t_2 = __pyx_v_7msgpack_9_cmsgpack_utc; - __Pyx_INCREF(__pyx_t_2); - __pyx_t_3 = ((PyObject *)__pyx_f_7cpython_8datetime_datetime_new(0x7B2, 1, 1, 0, 0, 0, 0, __pyx_t_2, NULL)); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XGOTREF(__pyx_v_7msgpack_9_cmsgpack_epoch); - __Pyx_DECREF_SET(__pyx_v_7msgpack_9_cmsgpack_epoch, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; - - /* "msgpack/_packer.pyx":13 - * cdef Timestamp - * - * from .ext import ExtType, Timestamp # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_s_ExtType); - __Pyx_GIVEREF(__pyx_n_s_ExtType); - if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_ExtType)) __PYX_ERR(0, 13, __pyx_L1_error); - __Pyx_INCREF(__pyx_n_s_Timestamp); - __Pyx_GIVEREF(__pyx_n_s_Timestamp); - if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_Timestamp)) __PYX_ERR(0, 13, __pyx_L1_error); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_ext, __pyx_t_3, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ExtType); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_v_7msgpack_9_cmsgpack_ExtType); - __Pyx_DECREF_SET(__pyx_v_7msgpack_9_cmsgpack_ExtType, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Timestamp); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_v_7msgpack_9_cmsgpack_Timestamp); - __Pyx_DECREF_SET(__pyx_v_7msgpack_9_cmsgpack_Timestamp, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_packer.pyx":50 - * object buff_to_buff(char *, Py_ssize_t) - * - * cdef int DEFAULT_RECURSE_LIMIT=511 # <<<<<<<<<<<<<< - * cdef long long ITEM_LIMIT = (2**32)-1 - * - */ - __pyx_v_7msgpack_9_cmsgpack_DEFAULT_RECURSE_LIMIT = 0x1FF; - - /* "msgpack/_packer.pyx":51 - * - * cdef int DEFAULT_RECURSE_LIMIT=511 - * cdef long long ITEM_LIMIT = (2**32)-1 # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_7msgpack_9_cmsgpack_ITEM_LIMIT = 0xffffffff; - - /* "msgpack/_packer.pyx":147 - * self.pk.buf = NULL - * - * cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: # <<<<<<<<<<<<<< - * cdef long long llval - * cdef unsigned long long ullval - */ - __pyx_k__4 = __pyx_v_7msgpack_9_cmsgpack_DEFAULT_RECURSE_LIMIT; - - /* "msgpack/_packer.pyx":294 - * return ret - * - * cpdef pack(self, object obj): # <<<<<<<<<<<<<< - * cdef int ret - * try: - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_7pack, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer_pack, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__32)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 294, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_n_s_pack, __pyx_t_2) < 0) __PYX_ERR(0, 294, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Packer); - - /* "msgpack/_packer.pyx":308 - * return buf - * - * def pack_ext_type(self, typecode, data): # <<<<<<<<<<<<<< - * msgpack_pack_ext(&self.pk, typecode, len(data)) - * msgpack_pack_raw_body(&self.pk, data, len(data)) - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_9pack_ext_type, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer_pack_ext_type, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 308, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_n_s_pack_ext_type, __pyx_t_2) < 0) __PYX_ERR(0, 308, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Packer); - - /* "msgpack/_packer.pyx":312 - * msgpack_pack_raw_body(&self.pk, data, len(data)) - * - * def pack_array_header(self, long long size): # <<<<<<<<<<<<<< - * if size > ITEM_LIMIT: - * raise ValueError - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_11pack_array_header, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer_pack_array_header, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__36)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 312, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_n_s_pack_array_header, __pyx_t_2) < 0) __PYX_ERR(0, 312, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Packer); - - /* "msgpack/_packer.pyx":325 - * return buf - * - * def pack_map_header(self, long long size): # <<<<<<<<<<<<<< - * if size > ITEM_LIMIT: - * raise ValueError - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_13pack_map_header, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer_pack_map_header, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 325, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_n_s_pack_map_header, __pyx_t_2) < 0) __PYX_ERR(0, 325, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Packer); - - /* "msgpack/_packer.pyx":338 - * return buf - * - * def pack_map_pairs(self, object pairs): # <<<<<<<<<<<<<< - * """ - * Pack *pairs* as msgpack map type. - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_15pack_map_pairs, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer_pack_map_pairs, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 338, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_n_s_pack_map_pairs, __pyx_t_2) < 0) __PYX_ERR(0, 338, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Packer); - - /* "msgpack/_packer.pyx":361 - * return buf - * - * def reset(self): # <<<<<<<<<<<<<< - * """Reset internal buffer. - * - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_17reset, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer_reset, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__41)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 361, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_n_s_reset, __pyx_t_2) < 0) __PYX_ERR(0, 361, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Packer); - - /* "msgpack/_packer.pyx":368 - * self.pk.length = 0 - * - * def bytes(self): # <<<<<<<<<<<<<< - * """Return internal buffer contents as bytes object""" - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_19bytes, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer_bytes, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__42)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 368, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_n_s_bytes, __pyx_t_2) < 0) __PYX_ERR(0, 368, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Packer); - - /* "msgpack/_packer.pyx":372 - * return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - * - * def getbuffer(self): # <<<<<<<<<<<<<< - * """Return view of internal buffer.""" - * return buff_to_buff(self.pk.buf, self.pk.length) - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_21getbuffer, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer_getbuffer, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 372, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Packer, __pyx_n_s_getbuffer, __pyx_t_2) < 0) __PYX_ERR(0, 372, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Packer); - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_23__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer___reduce_cython, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__44)); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(4, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_6Packer_25__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Packer___setstate_cython, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__46)); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 3, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(4, 3, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":14 - * - * from .exceptions import ( - * BufferFull, # <<<<<<<<<<<<<< - * OutOfData, - * ExtraData, - */ - __pyx_t_2 = PyList_New(5); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_BufferFull); - __Pyx_GIVEREF(__pyx_n_s_BufferFull); - if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_BufferFull)) __PYX_ERR(1, 14, __pyx_L1_error); - __Pyx_INCREF(__pyx_n_s_OutOfData); - __Pyx_GIVEREF(__pyx_n_s_OutOfData); - if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_OutOfData)) __PYX_ERR(1, 14, __pyx_L1_error); - __Pyx_INCREF(__pyx_n_s_ExtraData); - __Pyx_GIVEREF(__pyx_n_s_ExtraData); - if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_ExtraData)) __PYX_ERR(1, 14, __pyx_L1_error); - __Pyx_INCREF(__pyx_n_s_FormatError); - __Pyx_GIVEREF(__pyx_n_s_FormatError); - if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_FormatError)) __PYX_ERR(1, 14, __pyx_L1_error); - __Pyx_INCREF(__pyx_n_s_StackError); - __Pyx_GIVEREF(__pyx_n_s_StackError); - if (__Pyx_PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_StackError)) __PYX_ERR(1, 14, __pyx_L1_error); - - /* "msgpack/_unpacker.pyx":13 - * from libc.stdint cimport uint64_t - * - * from .exceptions import ( # <<<<<<<<<<<<<< - * BufferFull, - * OutOfData, - */ - __pyx_t_3 = __Pyx_Import(__pyx_n_s_exceptions, __pyx_t_2, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_BufferFull); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_BufferFull, __pyx_t_2) < 0) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_OutOfData); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_OutOfData, __pyx_t_2) < 0) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_ExtraData); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_ExtraData, __pyx_t_2) < 0) __PYX_ERR(1, 16, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_FormatError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_FormatError, __pyx_t_2) < 0) __PYX_ERR(1, 17, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_StackError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_StackError, __pyx_t_2) < 0) __PYX_ERR(1, 18, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "msgpack/_unpacker.pyx":20 - * StackError, - * ) - * from .ext import ExtType, Timestamp # <<<<<<<<<<<<<< - * - * cdef object giga = 1_000_000_000 - */ - __pyx_t_3 = PyList_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_s_ExtType); - __Pyx_GIVEREF(__pyx_n_s_ExtType); - if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_ExtType)) __PYX_ERR(1, 20, __pyx_L1_error); - __Pyx_INCREF(__pyx_n_s_Timestamp); - __Pyx_GIVEREF(__pyx_n_s_Timestamp); - if (__Pyx_PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_s_Timestamp)) __PYX_ERR(1, 20, __pyx_L1_error); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_ext, __pyx_t_3, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ExtType); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_v_7msgpack_9_cmsgpack_ExtType); - __Pyx_DECREF_SET(__pyx_v_7msgpack_9_cmsgpack_ExtType, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Timestamp); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_v_7msgpack_9_cmsgpack_Timestamp); - __Pyx_DECREF_SET(__pyx_v_7msgpack_9_cmsgpack_Timestamp, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":22 - * from .ext import ExtType, Timestamp - * - * cdef object giga = 1_000_000_000 # <<<<<<<<<<<<<< - * - * - */ - __Pyx_INCREF(__pyx_int_1000000000); - __Pyx_XGOTREF(__pyx_v_7msgpack_9_cmsgpack_giga); - __Pyx_DECREF_SET(__pyx_v_7msgpack_9_cmsgpack_giga, __pyx_int_1000000000); - __Pyx_GIVEREF(__pyx_int_1000000000); - - /* "msgpack/_unpacker.pyx":116 - * ctx.user.unicode_errors = unicode_errors - * - * def default_read_extended_type(typecode, data): # <<<<<<<<<<<<<< - * raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) - * - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_1default_read_extended_type, 0, __pyx_n_s_default_read_extended_type, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__48)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_default_read_extended_type, __pyx_t_2) < 0) __PYX_ERR(1, 116, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":143 - * - * - * def unpackb(object packed, *, object object_hook=None, object list_hook=None, # <<<<<<<<<<<<<< - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_3unpackb, 0, __pyx_n_s_unpackb, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__50)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (!__Pyx_CyFunction_InitDefaults(__pyx_t_2, sizeof(__pyx_defaults), 1)) __PYX_ERR(1, 143, __pyx_L1_error) - - /* "msgpack/_unpacker.pyx":146 - * bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - * unicode_errors=None, - * object_pairs_hook=None, ext_hook=ExtType, # <<<<<<<<<<<<<< - * Py_ssize_t max_str_len=-1, - * Py_ssize_t max_bin_len=-1, - */ - __Pyx_INCREF(__pyx_v_7msgpack_9_cmsgpack_ExtType); - __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_2)->__pyx_arg_ext_hook = __pyx_v_7msgpack_9_cmsgpack_ExtType; - __Pyx_GIVEREF(__pyx_v_7msgpack_9_cmsgpack_ExtType); - __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_2, __pyx_pf_7msgpack_9_cmsgpack_4__defaults__); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_unpackb, __pyx_t_2) < 0) __PYX_ERR(1, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_unpacker.pyx":331 - * object object_hook=None, object object_pairs_hook=None, object list_hook=None, - * unicode_errors=None, Py_ssize_t max_buffer_size=100*1024*1024, - * object ext_hook=ExtType, # <<<<<<<<<<<<<< - * Py_ssize_t max_str_len=-1, - * Py_ssize_t max_bin_len=-1, - */ - __Pyx_INCREF(__pyx_v_7msgpack_9_cmsgpack_ExtType); - __pyx_k__23 = __pyx_v_7msgpack_9_cmsgpack_ExtType; - __Pyx_GIVEREF(__pyx_v_7msgpack_9_cmsgpack_ExtType); - - /* "msgpack/_unpacker.pyx":387 - * max_map_len, max_ext_len) - * - * def feed(self, object next_bytes): # <<<<<<<<<<<<<< - * """Append `next_bytes` to internal buffer.""" - * cdef Py_buffer pybuff - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_7feed, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker_feed, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__52)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 387, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Unpacker, __pyx_n_s_feed, __pyx_t_2) < 0) __PYX_ERR(1, 387, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - - /* "msgpack/_unpacker.pyx":487 - * raise ValueError("Unpack failed: error = %d" % (ret,)) - * - * def read_bytes(self, Py_ssize_t nbytes): # <<<<<<<<<<<<<< - * """Read a specified number of raw bytes from the stream""" - * cdef Py_ssize_t nread - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_9read_bytes, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker_read_bytes, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__54)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 487, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Unpacker, __pyx_n_s_read_bytes, __pyx_t_2) < 0) __PYX_ERR(1, 487, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - - /* "msgpack/_unpacker.pyx":499 - * return ret - * - * def unpack(self): # <<<<<<<<<<<<<< - * """Unpack one object - * - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_11unpack, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker_unpack, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__55)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 499, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Unpacker, __pyx_n_s_unpack, __pyx_t_2) < 0) __PYX_ERR(1, 499, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - - /* "msgpack/_unpacker.pyx":506 - * return self._unpack(unpack_construct) - * - * def skip(self): # <<<<<<<<<<<<<< - * """Read and ignore one object, returning None - * - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_13skip, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker_skip, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__56)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 506, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Unpacker, __pyx_n_s_skip, __pyx_t_2) < 0) __PYX_ERR(1, 506, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - - /* "msgpack/_unpacker.pyx":513 - * return self._unpack(unpack_skip) - * - * def read_array_header(self): # <<<<<<<<<<<<<< - * """assuming the next object is an array, return its size n, such that - * the next n unpack() calls will iterate over its contents. - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_15read_array_header, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker_read_array_header, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__57)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 513, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Unpacker, __pyx_n_s_read_array_header, __pyx_t_2) < 0) __PYX_ERR(1, 513, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - - /* "msgpack/_unpacker.pyx":521 - * return self._unpack(read_array_header) - * - * def read_map_header(self): # <<<<<<<<<<<<<< - * """assuming the next object is a map, return its size n, such that the - * next n * 2 unpack() calls will iterate over its key-value pairs. - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_17read_map_header, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker_read_map_header, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__58)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 521, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Unpacker, __pyx_n_s_read_map_header, __pyx_t_2) < 0) __PYX_ERR(1, 521, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - - /* "msgpack/_unpacker.pyx":529 - * return self._unpack(read_map_header) - * - * def tell(self): # <<<<<<<<<<<<<< - * """Returns the current position of the Unpacker in bytes, i.e., the - * number of bytes that were read from the input, also the starting - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_19tell, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker_tell, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__59)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 529, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_7msgpack_9_cmsgpack_Unpacker, __pyx_n_s_tell, __pyx_t_2) < 0) __PYX_ERR(1, 529, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7msgpack_9_cmsgpack_Unpacker); - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_25__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker___reduce_cython, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__60)); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(4, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" - */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_7msgpack_9_cmsgpack_8Unpacker_27__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_Unpacker___setstate_cython, NULL, __pyx_n_s_msgpack__cmsgpack, __pyx_d, ((PyObject *)__pyx_codeobj__61)); if (unlikely(!__pyx_t_2)) __PYX_ERR(4, 3, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(4, 3, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "msgpack/_cmsgpack.pyx":1 - * # coding: utf-8 # <<<<<<<<<<<<<< - * #cython: embedsignature=True, c_string_encoding=ascii, language_level=3 - * from cpython.datetime cimport import_datetime, datetime_new - */ - __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(5, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - if (__pyx_m) { - if (__pyx_d && stringtab_initialized) { - __Pyx_AddTraceback("init msgpack._cmsgpack", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - #if !CYTHON_USE_MODULE_STATE - Py_CLEAR(__pyx_m); - #else - Py_DECREF(__pyx_m); - if (pystate_addmodule_run) { - PyObject *tp, *value, *tb; - PyErr_Fetch(&tp, &value, &tb); - PyState_RemoveModule(&__pyx_moduledef); - PyErr_Restore(tp, value, tb); - } - #endif - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init msgpack._cmsgpack"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if CYTHON_PEP489_MULTI_PHASE_INIT - return (__pyx_m != NULL) ? 0 : -1; - #elif PY_MAJOR_VERSION >= 3 - return __pyx_m; - #else - return; - #endif -} -/* #### Code section: cleanup_globals ### */ -/* #### Code section: cleanup_module ### */ -/* #### Code section: main_method ### */ -/* #### Code section: utility_code_pragmas ### */ -#ifdef _MSC_VER -#pragma warning( push ) -/* Warning 4127: conditional expression is constant - * Cython uses constant conditional expressions to allow in inline functions to be optimized at - * compile-time, so this warning is not useful - */ -#pragma warning( disable : 4127 ) -#endif - - - -/* #### Code section: utility_code_def ### */ - -/* --- Runtime support code --- */ -/* Refnanny */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule(modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, "RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -/* PyErrExceptionMatches */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; i<n; i++) { - if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1; - } -#endif - for (i=0; i<n; i++) { - if (__Pyx_PyErr_GivenExceptionMatches(exc_type, PyTuple_GET_ITEM(tuple, i))) return 1; - } - return 0; -} -static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) { - int result; - PyObject *exc_type; -#if PY_VERSION_HEX >= 0x030C00A6 - PyObject *current_exception = tstate->current_exception; - if (unlikely(!current_exception)) return 0; - exc_type = (PyObject*) Py_TYPE(current_exception); - if (exc_type == err) return 1; -#else - exc_type = tstate->curexc_type; - if (exc_type == err) return 1; - if (unlikely(!exc_type)) return 0; -#endif - #if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(exc_type); - #endif - if (unlikely(PyTuple_Check(err))) { - result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); - } else { - result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); - } - #if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(exc_type); - #endif - return result; -} -#endif - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { -#if PY_VERSION_HEX >= 0x030C00A6 - PyObject *tmp_value; - assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); - if (value) { - #if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) - #endif - PyException_SetTraceback(value, tb); - } - tmp_value = tstate->current_exception; - tstate->current_exception = value; - Py_XDECREF(tmp_value); -#else - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#endif -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { -#if PY_VERSION_HEX >= 0x030C00A6 - PyObject* exc_value; - exc_value = tstate->current_exception; - tstate->current_exception = 0; - *value = exc_value; - *type = NULL; - *tb = NULL; - if (exc_value) { - *type = (PyObject*) Py_TYPE(exc_value); - Py_INCREF(*type); - #if CYTHON_COMPILING_IN_CPYTHON - *tb = ((PyBaseExceptionObject*) exc_value)->traceback; - Py_XINCREF(*tb); - #else - *tb = PyException_GetTraceback(exc_value); - #endif - } -#else - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -#endif -} -#endif - -/* PyObjectGetAttrStr */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* PyObjectGetAttrStrNoError */ -static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - __Pyx_PyErr_Clear(); -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { - PyObject *result; -#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { - return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); - } -#endif - result = __Pyx_PyObject_GetAttrStr(obj, attr_name); - if (unlikely(!result)) { - __Pyx_PyObject_GetAttrStr_ClearAttributeError(); - } - return result; -} - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); - if (unlikely(!result) && !PyErr_Occurred()) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* ExtTypeTest */ -static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { - __Pyx_TypeName obj_type_name; - __Pyx_TypeName type_name; - if (unlikely(!type)) { - PyErr_SetString(PyExc_SystemError, "Missing type object"); - return 0; - } - if (likely(__Pyx_TypeCheck(obj, type))) - return 1; - obj_type_name = __Pyx_PyType_GetName(Py_TYPE(obj)); - type_name = __Pyx_PyType_GetName(type); - PyErr_Format(PyExc_TypeError, - "Cannot convert " __Pyx_FMT_TYPENAME " to " __Pyx_FMT_TYPENAME, - obj_type_name, type_name); - __Pyx_DECREF_TypeName(obj_type_name); - __Pyx_DECREF_TypeName(type_name); - return 0; -} - -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = Py_TYPE(func)->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* RaiseException */ -#if PY_MAJOR_VERSION < 3 -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - __Pyx_PyThreadState_declare - CYTHON_UNUSED_VAR(cause); - Py_XINCREF(type); - if (!value || value == Py_None) - value = NULL; - else - Py_INCREF(value); - if (!tb || tb == Py_None) - tb = NULL; - else { - Py_INCREF(tb); - if (!PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - } - if (PyType_Check(type)) { -#if CYTHON_COMPILING_IN_PYPY - if (!value) { - Py_INCREF(Py_None); - value = Py_None; - } -#endif - PyErr_NormalizeException(&type, &value, &tb); - } else { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - value = type; - type = (PyObject*) Py_TYPE(type); - Py_INCREF(type); - if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto raise_error; - } - } - __Pyx_PyThreadState_assign - __Pyx_ErrRestore(type, value, tb); - return; -raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - return; -} -#else -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - PyObject* owned_instance = NULL; - if (tb == Py_None) { - tb = 0; - } else if (tb && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto bad; - } - if (value == Py_None) - value = 0; - if (PyExceptionInstance_Check(type)) { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto bad; - } - value = type; - type = (PyObject*) Py_TYPE(value); - } else if (PyExceptionClass_Check(type)) { - PyObject *instance_class = NULL; - if (value && PyExceptionInstance_Check(value)) { - instance_class = (PyObject*) Py_TYPE(value); - if (instance_class != type) { - int is_subclass = PyObject_IsSubclass(instance_class, type); - if (!is_subclass) { - instance_class = NULL; - } else if (unlikely(is_subclass == -1)) { - goto bad; - } else { - type = instance_class; - } - } - } - if (!instance_class) { - PyObject *args; - if (!value) - args = PyTuple_New(0); - else if (PyTuple_Check(value)) { - Py_INCREF(value); - args = value; - } else - args = PyTuple_Pack(1, value); - if (!args) - goto bad; - owned_instance = PyObject_Call(type, args, NULL); - Py_DECREF(args); - if (!owned_instance) - goto bad; - value = owned_instance; - if (!PyExceptionInstance_Check(value)) { - PyErr_Format(PyExc_TypeError, - "calling %R should have returned an instance of " - "BaseException, not %R", - type, Py_TYPE(value)); - goto bad; - } - } - } else { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto bad; - } - if (cause) { - PyObject *fixed_cause; - if (cause == Py_None) { - fixed_cause = NULL; - } else if (PyExceptionClass_Check(cause)) { - fixed_cause = PyObject_CallObject(cause, NULL); - if (fixed_cause == NULL) - goto bad; - } else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - Py_INCREF(fixed_cause); - } else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); - goto bad; - } - PyException_SetCause(value, fixed_cause); - } - PyErr_SetObject(type, value); - if (tb) { - #if PY_VERSION_HEX >= 0x030C00A6 - PyException_SetTraceback(value, tb); - #elif CYTHON_FAST_THREAD_STATE - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); - } -#else - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); - Py_INCREF(tb); - PyErr_Restore(tmp_type, tmp_value, tb); - Py_XDECREF(tmp_tb); -#endif - } -bad: - Py_XDECREF(owned_instance); - return; -} -#endif - -/* TupleAndListFromArray */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { - PyObject *v; - Py_ssize_t i; - for (i = 0; i < length; i++) { - v = dest[i] = src[i]; - Py_INCREF(v); - } -} -static CYTHON_INLINE PyObject * -__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) -{ - PyObject *res; - if (n <= 0) { - Py_INCREF(__pyx_empty_tuple); - return __pyx_empty_tuple; - } - res = PyTuple_New(n); - if (unlikely(res == NULL)) return NULL; - __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); - return res; -} -static CYTHON_INLINE PyObject * -__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) -{ - PyObject *res; - if (n <= 0) { - return PyList_New(0); - } - res = PyList_New(n); - if (unlikely(res == NULL)) return NULL; - __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); - return res; -} -#endif - -/* BytesEquals */ -static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { -#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API - return PyObject_RichCompareBool(s1, s2, equals); -#else - if (s1 == s2) { - return (equals == Py_EQ); - } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { - const char *ps1, *ps2; - Py_ssize_t length = PyBytes_GET_SIZE(s1); - if (length != PyBytes_GET_SIZE(s2)) - return (equals == Py_NE); - ps1 = PyBytes_AS_STRING(s1); - ps2 = PyBytes_AS_STRING(s2); - if (ps1[0] != ps2[0]) { - return (equals == Py_NE); - } else if (length == 1) { - return (equals == Py_EQ); - } else { - int result; -#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) - Py_hash_t hash1, hash2; - hash1 = ((PyBytesObject*)s1)->ob_shash; - hash2 = ((PyBytesObject*)s2)->ob_shash; - if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { - return (equals == Py_NE); - } -#endif - result = memcmp(ps1, ps2, (size_t)length); - return (equals == Py_EQ) ? (result == 0) : (result != 0); - } - } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { - return (equals == Py_NE); - } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { - return (equals == Py_NE); - } else { - int result; - PyObject* py_result = PyObject_RichCompare(s1, s2, equals); - if (!py_result) - return -1; - result = __Pyx_PyObject_IsTrue(py_result); - Py_DECREF(py_result); - return result; - } -#endif -} - -/* UnicodeEquals */ -static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { -#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API - return PyObject_RichCompareBool(s1, s2, equals); -#else -#if PY_MAJOR_VERSION < 3 - PyObject* owned_ref = NULL; -#endif - int s1_is_unicode, s2_is_unicode; - if (s1 == s2) { - goto return_eq; - } - s1_is_unicode = PyUnicode_CheckExact(s1); - s2_is_unicode = PyUnicode_CheckExact(s2); -#if PY_MAJOR_VERSION < 3 - if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { - owned_ref = PyUnicode_FromObject(s2); - if (unlikely(!owned_ref)) - return -1; - s2 = owned_ref; - s2_is_unicode = 1; - } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { - owned_ref = PyUnicode_FromObject(s1); - if (unlikely(!owned_ref)) - return -1; - s1 = owned_ref; - s1_is_unicode = 1; - } else if (((!s2_is_unicode) & (!s1_is_unicode))) { - return __Pyx_PyBytes_Equals(s1, s2, equals); - } -#endif - if (s1_is_unicode & s2_is_unicode) { - Py_ssize_t length; - int kind; - void *data1, *data2; - if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) - return -1; - length = __Pyx_PyUnicode_GET_LENGTH(s1); - if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { - goto return_ne; - } -#if CYTHON_USE_UNICODE_INTERNALS - { - Py_hash_t hash1, hash2; - #if CYTHON_PEP393_ENABLED - hash1 = ((PyASCIIObject*)s1)->hash; - hash2 = ((PyASCIIObject*)s2)->hash; - #else - hash1 = ((PyUnicodeObject*)s1)->hash; - hash2 = ((PyUnicodeObject*)s2)->hash; - #endif - if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { - goto return_ne; - } - } -#endif - kind = __Pyx_PyUnicode_KIND(s1); - if (kind != __Pyx_PyUnicode_KIND(s2)) { - goto return_ne; - } - data1 = __Pyx_PyUnicode_DATA(s1); - data2 = __Pyx_PyUnicode_DATA(s2); - if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { - goto return_ne; - } else if (length == 1) { - goto return_eq; - } else { - int result = memcmp(data1, data2, (size_t)(length * kind)); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_EQ) ? (result == 0) : (result != 0); - } - } else if ((s1 == Py_None) & s2_is_unicode) { - goto return_ne; - } else if ((s2 == Py_None) & s1_is_unicode) { - goto return_ne; - } else { - int result; - PyObject* py_result = PyObject_RichCompare(s1, s2, equals); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - if (!py_result) - return -1; - result = __Pyx_PyObject_IsTrue(py_result); - Py_DECREF(py_result); - return result; - } -return_eq: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_EQ); -return_ne: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_NE); -#endif -} - -/* fastcall */ -#if CYTHON_METH_FASTCALL -static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) -{ - Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); - for (i = 0; i < n; i++) - { - if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; - } - for (i = 0; i < n; i++) - { - int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); - if (unlikely(eq != 0)) { - if (unlikely(eq < 0)) return NULL; // error - return kwvalues[i]; - } - } - return NULL; // not found (no exception set) -} -#endif - -/* RaiseArgTupleInvalid */ -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -/* KeywordStringCheck */ -static int __Pyx_CheckKeywordStrings( - PyObject *kw, - const char* function_name, - int kw_allowed) -{ - PyObject* key = 0; - Py_ssize_t pos = 0; -#if CYTHON_COMPILING_IN_PYPY - if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) - goto invalid_keyword; - return 1; -#else - if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { - Py_ssize_t kwsize; -#if CYTHON_ASSUME_SAFE_MACROS - kwsize = PyTuple_GET_SIZE(kw); -#else - kwsize = PyTuple_Size(kw); - if (kwsize < 0) return 0; -#endif - if (unlikely(kwsize == 0)) - return 1; - if (!kw_allowed) { -#if CYTHON_ASSUME_SAFE_MACROS - key = PyTuple_GET_ITEM(kw, 0); -#else - key = PyTuple_GetItem(kw, pos); - if (!key) return 0; -#endif - goto invalid_keyword; - } -#if PY_VERSION_HEX < 0x03090000 - for (pos = 0; pos < kwsize; pos++) { -#if CYTHON_ASSUME_SAFE_MACROS - key = PyTuple_GET_ITEM(kw, pos); -#else - key = PyTuple_GetItem(kw, pos); - if (!key) return 0; -#endif - if (unlikely(!PyUnicode_Check(key))) - goto invalid_keyword_type; - } -#endif - return 1; - } - while (PyDict_Next(kw, &pos, &key, 0)) { - #if PY_MAJOR_VERSION < 3 - if (unlikely(!PyString_Check(key))) - #endif - if (unlikely(!PyUnicode_Check(key))) - goto invalid_keyword_type; - } - if (!kw_allowed && unlikely(key)) - goto invalid_keyword; - return 1; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - return 0; -#endif -invalid_keyword: - #if PY_MAJOR_VERSION < 3 - PyErr_Format(PyExc_TypeError, - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - PyErr_Format(PyExc_TypeError, - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif - return 0; -} - -/* RaiseDoubleKeywords */ -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -/* ParseKeywords */ -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject *const *kwvalues, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); - while (1) { - Py_XDECREF(key); key = NULL; - Py_XDECREF(value); value = NULL; - if (kwds_is_tuple) { - Py_ssize_t size; -#if CYTHON_ASSUME_SAFE_MACROS - size = PyTuple_GET_SIZE(kwds); -#else - size = PyTuple_Size(kwds); - if (size < 0) goto bad; -#endif - if (pos >= size) break; -#if CYTHON_AVOID_BORROWED_REFS - key = __Pyx_PySequence_ITEM(kwds, pos); - if (!key) goto bad; -#elif CYTHON_ASSUME_SAFE_MACROS - key = PyTuple_GET_ITEM(kwds, pos); -#else - key = PyTuple_GetItem(kwds, pos); - if (!key) goto bad; -#endif - value = kwvalues[pos]; - pos++; - } - else - { - if (!PyDict_Next(kwds, &pos, &key, &value)) break; -#if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(key); -#endif - } - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; -#if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(value); // transfer ownership of value to values - Py_DECREF(key); -#endif - key = NULL; - value = NULL; - continue; - } -#if !CYTHON_AVOID_BORROWED_REFS - Py_INCREF(key); -#endif - Py_INCREF(value); - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; -#if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values -#endif - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = ( - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key) - ); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; -#if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values -#endif - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - Py_XDECREF(key); - Py_XDECREF(value); - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - #if PY_MAJOR_VERSION < 3 - PyErr_Format(PyExc_TypeError, - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - PyErr_Format(PyExc_TypeError, - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - Py_XDECREF(key); - Py_XDECREF(value); - return -1; -} - -/* GetTopmostException */ -#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE -static _PyErr_StackItem * -__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) -{ - _PyErr_StackItem *exc_info = tstate->exc_info; - while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && - exc_info->previous_item != NULL) - { - exc_info = exc_info->previous_item; - } - return exc_info; -} -#endif - -/* SaveResetException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - PyObject *exc_value = exc_info->exc_value; - if (exc_value == NULL || exc_value == Py_None) { - *value = NULL; - *type = NULL; - *tb = NULL; - } else { - *value = exc_value; - Py_INCREF(*value); - *type = (PyObject*) Py_TYPE(exc_value); - Py_INCREF(*type); - *tb = PyException_GetTraceback(exc_value); - } - #elif CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - *type = exc_info->exc_type; - *value = exc_info->exc_value; - *tb = exc_info->exc_traceback; - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); - #else - *type = tstate->exc_type; - *value = tstate->exc_value; - *tb = tstate->exc_traceback; - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); - #endif -} -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 - _PyErr_StackItem *exc_info = tstate->exc_info; - PyObject *tmp_value = exc_info->exc_value; - exc_info->exc_value = value; - Py_XDECREF(tmp_value); - Py_XDECREF(type); - Py_XDECREF(tb); - #else - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = type; - exc_info->exc_value = value; - exc_info->exc_traceback = tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); - #endif -} -#endif - -/* GetException */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) -#endif -{ - PyObject *local_type = NULL, *local_value, *local_tb = NULL; -#if CYTHON_FAST_THREAD_STATE - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030C00A6 - local_value = tstate->current_exception; - tstate->current_exception = 0; - if (likely(local_value)) { - local_type = (PyObject*) Py_TYPE(local_value); - Py_INCREF(local_type); - local_tb = PyException_GetTraceback(local_value); - } - #else - local_type = tstate->curexc_type; - local_value = tstate->curexc_value; - local_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; - #endif -#else - PyErr_Fetch(&local_type, &local_value, &local_tb); -#endif - PyErr_NormalizeException(&local_type, &local_value, &local_tb); -#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 - if (unlikely(tstate->current_exception)) -#elif CYTHON_FAST_THREAD_STATE - if (unlikely(tstate->curexc_type)) -#else - if (unlikely(PyErr_Occurred())) -#endif - goto bad; - #if PY_MAJOR_VERSION >= 3 - if (local_tb) { - if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) - goto bad; - } - #endif - Py_XINCREF(local_tb); - Py_XINCREF(local_type); - Py_XINCREF(local_value); - *type = local_type; - *value = local_value; - *tb = local_tb; -#if CYTHON_FAST_THREAD_STATE - #if CYTHON_USE_EXC_INFO_STACK - { - _PyErr_StackItem *exc_info = tstate->exc_info; - #if PY_VERSION_HEX >= 0x030B00a4 - tmp_value = exc_info->exc_value; - exc_info->exc_value = local_value; - tmp_type = NULL; - tmp_tb = NULL; - Py_XDECREF(local_type); - Py_XDECREF(local_tb); - #else - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = local_type; - exc_info->exc_value = local_value; - exc_info->exc_traceback = local_tb; - #endif - } - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = local_type; - tstate->exc_value = local_value; - tstate->exc_traceback = local_tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#else - PyErr_SetExcInfo(local_type, local_value, local_tb); -#endif - return 0; -bad: - *type = 0; - *value = 0; - *tb = 0; - Py_XDECREF(local_type); - Py_XDECREF(local_value); - Py_XDECREF(local_tb); - return -1; -} - -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; - } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { - return NULL; - } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif - -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectFastCall */ -static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { - PyObject *argstuple; - PyObject *result = 0; - size_t i; - argstuple = PyTuple_New((Py_ssize_t)nargs); - if (unlikely(!argstuple)) return NULL; - for (i = 0; i < nargs; i++) { - Py_INCREF(args[i]); - if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; - } - result = __Pyx_PyObject_Call(func, argstuple, kwargs); - bad: - Py_DECREF(argstuple); - return result; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { - Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); -#if CYTHON_COMPILING_IN_CPYTHON - if (nargs == 0 && kwargs == NULL) { -#if defined(__Pyx_CyFunction_USED) && defined(NDEBUG) - if (__Pyx_IsCyOrPyCFunction(func)) -#else - if (PyCFunction_Check(func)) -#endif - { - if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { - return __Pyx_PyObject_CallMethO(func, NULL); - } - } - } - else if (nargs == 1 && kwargs == NULL) { - if (PyCFunction_Check(func)) - { - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, args[0]); - } - } - } -#endif - #if PY_VERSION_HEX < 0x030800B1 - #if CYTHON_FAST_PYCCALL - if (PyCFunction_Check(func)) { - if (kwargs) { - return _PyCFunction_FastCallDict(func, args, nargs, kwargs); - } else { - return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); - } - } - #if PY_VERSION_HEX >= 0x030700A1 - if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { - return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); - } - #endif - #endif - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); - } - #endif - #endif - #if CYTHON_VECTORCALL - #if Py_VERSION_HEX < 0x03090000 - vectorcallfunc f = _PyVectorcall_Function(func); - #else - vectorcallfunc f = PyVectorcall_Function(func); - #endif - if (f) { - return f(func, args, (size_t)nargs, kwargs); - } - #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL - if (__Pyx_CyFunction_CheckExact(func)) { - __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); - if (f) return f(func, args, (size_t)nargs, kwargs); - } - #endif - if (nargs == 0) { - return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); - } - return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); -} - -/* SwapException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_value = exc_info->exc_value; - exc_info->exc_value = *value; - if (tmp_value == NULL || tmp_value == Py_None) { - Py_XDECREF(tmp_value); - tmp_value = NULL; - tmp_type = NULL; - tmp_tb = NULL; - } else { - tmp_type = (PyObject*) Py_TYPE(tmp_value); - Py_INCREF(tmp_type); - #if CYTHON_COMPILING_IN_CPYTHON - tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; - Py_XINCREF(tmp_tb); - #else - tmp_tb = PyException_GetTraceback(tmp_value); - #endif - } - #elif CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = *type; - exc_info->exc_value = *value; - exc_info->exc_traceback = *tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = *type; - tstate->exc_value = *value; - tstate->exc_traceback = *tb; - #endif - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); - PyErr_SetExcInfo(*type, *value, *tb); - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#endif - -/* IterFinish */ -static CYTHON_INLINE int __Pyx_IterFinish(void) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - PyObject* exc_type = __Pyx_PyErr_CurrentExceptionType(); - if (unlikely(exc_type)) { - if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) - return -1; - __Pyx_PyErr_Clear(); - return 0; - } - return 0; -} - -/* PyObjectCallNoArg */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { - PyObject *arg = NULL; - return __Pyx_PyObject_FastCall(func, (&arg)+1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); -} - -/* PyObjectCallOneArg */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *args[2] = {NULL, arg}; - return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); -} - -/* PyObjectGetMethod */ -static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { - PyObject *attr; -#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP - __Pyx_TypeName type_name; - PyTypeObject *tp = Py_TYPE(obj); - PyObject *descr; - descrgetfunc f = NULL; - PyObject **dictptr, *dict; - int meth_found = 0; - assert (*method == NULL); - if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { - attr = __Pyx_PyObject_GetAttrStr(obj, name); - goto try_unpack; - } - if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { - return 0; - } - descr = _PyType_Lookup(tp, name); - if (likely(descr != NULL)) { - Py_INCREF(descr); -#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR - if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) -#elif PY_MAJOR_VERSION >= 3 - #ifdef __Pyx_CyFunction_USED - if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) - #else - if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) - #endif -#else - #ifdef __Pyx_CyFunction_USED - if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) - #else - if (likely(PyFunction_Check(descr))) - #endif -#endif - { - meth_found = 1; - } else { - f = Py_TYPE(descr)->tp_descr_get; - if (f != NULL && PyDescr_IsData(descr)) { - attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); - Py_DECREF(descr); - goto try_unpack; - } - } - } - dictptr = _PyObject_GetDictPtr(obj); - if (dictptr != NULL && (dict = *dictptr) != NULL) { - Py_INCREF(dict); - attr = __Pyx_PyDict_GetItemStr(dict, name); - if (attr != NULL) { - Py_INCREF(attr); - Py_DECREF(dict); - Py_XDECREF(descr); - goto try_unpack; - } - Py_DECREF(dict); - } - if (meth_found) { - *method = descr; - return 1; - } - if (f != NULL) { - attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); - Py_DECREF(descr); - goto try_unpack; - } - if (likely(descr != NULL)) { - *method = descr; - return 0; - } - type_name = __Pyx_PyType_GetName(tp); - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", - type_name, name); -#else - "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", - type_name, PyString_AS_STRING(name)); -#endif - __Pyx_DECREF_TypeName(type_name); - return 0; -#else - attr = __Pyx_PyObject_GetAttrStr(obj, name); - goto try_unpack; -#endif -try_unpack: -#if CYTHON_UNPACK_METHODS - if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { - PyObject *function = PyMethod_GET_FUNCTION(attr); - Py_INCREF(function); - Py_DECREF(attr); - *method = function; - return 1; - } -#endif - *method = attr; - return 0; -} - -/* PyObjectCallMethod0 */ -static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { - PyObject *method = NULL, *result = NULL; - int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); - if (likely(is_method)) { - result = __Pyx_PyObject_CallOneArg(method, obj); - Py_DECREF(method); - return result; - } - if (unlikely(!method)) goto bad; - result = __Pyx_PyObject_CallNoArg(method); - Py_DECREF(method); -bad: - return result; -} - -/* RaiseNeedMoreValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { - PyErr_Format(PyExc_ValueError, - "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", - index, (index == 1) ? "" : "s"); -} - -/* RaiseTooManyValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); -} - -/* UnpackItemEndCheck */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { - if (unlikely(retval)) { - Py_DECREF(retval); - __Pyx_RaiseTooManyValuesError(expected); - return -1; - } - return __Pyx_IterFinish(); -} - -/* RaiseNoneIterError */ -static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); -} - -/* UnpackTupleError */ -static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { - if (t == Py_None) { - __Pyx_RaiseNoneNotIterableError(); - } else if (PyTuple_GET_SIZE(t) < index) { - __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); - } else { - __Pyx_RaiseTooManyValuesError(index); - } -} - -/* UnpackTuple2 */ -static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( - PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { - PyObject *value1 = NULL, *value2 = NULL; -#if CYTHON_COMPILING_IN_PYPY - value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; - value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; -#else - value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); - value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); -#endif - if (decref_tuple) { - Py_DECREF(tuple); - } - *pvalue1 = value1; - *pvalue2 = value2; - return 0; -#if CYTHON_COMPILING_IN_PYPY -bad: - Py_XDECREF(value1); - Py_XDECREF(value2); - if (decref_tuple) { Py_XDECREF(tuple); } - return -1; -#endif -} -static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, - int has_known_size, int decref_tuple) { - Py_ssize_t index; - PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; - iternextfunc iternext; - iter = PyObject_GetIter(tuple); - if (unlikely(!iter)) goto bad; - if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } - iternext = __Pyx_PyObject_GetIterNextFunc(iter); - value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } - value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } - if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; - Py_DECREF(iter); - *pvalue1 = value1; - *pvalue2 = value2; - return 0; -unpacking_failed: - if (!has_known_size && __Pyx_IterFinish() == 0) - __Pyx_RaiseNeedMoreValuesError(index); -bad: - Py_XDECREF(iter); - Py_XDECREF(value1); - Py_XDECREF(value2); - if (decref_tuple) { Py_XDECREF(tuple); } - return -1; -} - -/* dict_iter */ -static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, - Py_ssize_t* p_orig_length, int* p_source_is_dict) { - is_dict = is_dict || likely(PyDict_CheckExact(iterable)); - *p_source_is_dict = is_dict; - if (is_dict) { -#if !CYTHON_COMPILING_IN_PYPY - *p_orig_length = PyDict_Size(iterable); - Py_INCREF(iterable); - return iterable; -#elif PY_MAJOR_VERSION >= 3 - static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; - PyObject **pp = NULL; - if (method_name) { - const char *name = PyUnicode_AsUTF8(method_name); - if (strcmp(name, "iteritems") == 0) pp = &py_items; - else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; - else if (strcmp(name, "itervalues") == 0) pp = &py_values; - if (pp) { - if (!*pp) { - *pp = PyUnicode_FromString(name + 4); - if (!*pp) - return NULL; - } - method_name = *pp; - } - } -#endif - } - *p_orig_length = 0; - if (method_name) { - PyObject* iter; - iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); - if (!iterable) - return NULL; -#if !CYTHON_COMPILING_IN_PYPY - if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) - return iterable; -#endif - iter = PyObject_GetIter(iterable); - Py_DECREF(iterable); - return iter; - } - return PyObject_GetIter(iterable); -} -static CYTHON_INLINE int __Pyx_dict_iter_next( - PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, - PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { - PyObject* next_item; -#if !CYTHON_COMPILING_IN_PYPY - if (source_is_dict) { - PyObject *key, *value; - if (unlikely(orig_length != PyDict_Size(iter_obj))) { - PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); - return -1; - } - if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { - return 0; - } - if (pitem) { - PyObject* tuple = PyTuple_New(2); - if (unlikely(!tuple)) { - return -1; - } - Py_INCREF(key); - Py_INCREF(value); - PyTuple_SET_ITEM(tuple, 0, key); - PyTuple_SET_ITEM(tuple, 1, value); - *pitem = tuple; - } else { - if (pkey) { - Py_INCREF(key); - *pkey = key; - } - if (pvalue) { - Py_INCREF(value); - *pvalue = value; - } - } - return 1; - } else if (PyTuple_CheckExact(iter_obj)) { - Py_ssize_t pos = *ppos; - if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; - *ppos = pos + 1; - next_item = PyTuple_GET_ITEM(iter_obj, pos); - Py_INCREF(next_item); - } else if (PyList_CheckExact(iter_obj)) { - Py_ssize_t pos = *ppos; - if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; - *ppos = pos + 1; - next_item = PyList_GET_ITEM(iter_obj, pos); - Py_INCREF(next_item); - } else -#endif - { - next_item = PyIter_Next(iter_obj); - if (unlikely(!next_item)) { - return __Pyx_IterFinish(); - } - } - if (pitem) { - *pitem = next_item; - } else if (pkey && pvalue) { - if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) - return -1; - } else if (pkey) { - *pkey = next_item; - } else { - *pvalue = next_item; - } - return 1; -} - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* ReRaiseException */ -static CYTHON_INLINE void __Pyx_ReraiseException(void) { - PyObject *type = NULL, *value = NULL, *tb = NULL; -#if CYTHON_FAST_THREAD_STATE - PyThreadState *tstate = PyThreadState_GET(); - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - value = exc_info->exc_value; - #if PY_VERSION_HEX >= 0x030B00a4 - if (unlikely(value == Py_None)) { - value = NULL; - } else if (value) { - Py_INCREF(value); - type = (PyObject*) Py_TYPE(value); - Py_INCREF(type); - tb = PyException_GetTraceback(value); - } - #else - type = exc_info->exc_type; - tb = exc_info->exc_traceback; - Py_XINCREF(type); - Py_XINCREF(value); - Py_XINCREF(tb); - #endif - #else - type = tstate->exc_type; - value = tstate->exc_value; - tb = tstate->exc_traceback; - Py_XINCREF(type); - Py_XINCREF(value); - Py_XINCREF(tb); - #endif -#else - PyErr_GetExcInfo(&type, &value, &tb); -#endif - if (unlikely(!type || type == Py_None)) { - Py_XDECREF(type); - Py_XDECREF(value); - Py_XDECREF(tb); - PyErr_SetString(PyExc_RuntimeError, - "No active exception to reraise"); - } else { - PyErr_Restore(type, value, tb); - } -} - -/* DivInt[Py_ssize_t] */ -static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { - Py_ssize_t q = a / b; - Py_ssize_t r = a - q*b; - q -= ((r != 0) & ((r ^ b) < 0)); - return q; -} - -/* GetModuleGlobalName */ -#if CYTHON_USE_DICT_VERSIONS -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) -#else -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) -#endif -{ - PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 - result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } else if (unlikely(PyErr_Occurred())) { - return NULL; - } -#elif CYTHON_COMPILING_IN_LIMITED_API - if (unlikely(!__pyx_m)) { - return NULL; - } - result = PyObject_GetAttr(__pyx_m, name); - if (likely(result)) { - return result; - } -#else - result = PyDict_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } -#endif -#else - result = PyObject_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } - PyErr_Clear(); -#endif - return __Pyx_GetBuiltinName(name); -} - -/* CIntToDigits */ -static const char DIGIT_PAIRS_10[2*10*10+1] = { - "00010203040506070809" - "10111213141516171819" - "20212223242526272829" - "30313233343536373839" - "40414243444546474849" - "50515253545556575859" - "60616263646566676869" - "70717273747576777879" - "80818283848586878889" - "90919293949596979899" -}; -static const char DIGIT_PAIRS_8[2*8*8+1] = { - "0001020304050607" - "1011121314151617" - "2021222324252627" - "3031323334353637" - "4041424344454647" - "5051525354555657" - "6061626364656667" - "7071727374757677" -}; -static const char DIGITS_HEX[2*16+1] = { - "0123456789abcdef" - "0123456789ABCDEF" -}; - -/* BuildPyUnicode */ -static PyObject* __Pyx_PyUnicode_BuildFromAscii(Py_ssize_t ulength, char* chars, int clength, - int prepend_sign, char padding_char) { - PyObject *uval; - Py_ssize_t uoffset = ulength - clength; -#if CYTHON_USE_UNICODE_INTERNALS - Py_ssize_t i; -#if CYTHON_PEP393_ENABLED - void *udata; - uval = PyUnicode_New(ulength, 127); - if (unlikely(!uval)) return NULL; - udata = PyUnicode_DATA(uval); -#else - Py_UNICODE *udata; - uval = PyUnicode_FromUnicode(NULL, ulength); - if (unlikely(!uval)) return NULL; - udata = PyUnicode_AS_UNICODE(uval); -#endif - if (uoffset > 0) { - i = 0; - if (prepend_sign) { - __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, 0, '-'); - i++; - } - for (; i < uoffset; i++) { - __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, i, padding_char); - } - } - for (i=0; i < clength; i++) { - __Pyx_PyUnicode_WRITE(PyUnicode_1BYTE_KIND, udata, uoffset+i, chars[i]); - } -#else - { - PyObject *sign = NULL, *padding = NULL; - uval = NULL; - if (uoffset > 0) { - prepend_sign = !!prepend_sign; - if (uoffset > prepend_sign) { - padding = PyUnicode_FromOrdinal(padding_char); - if (likely(padding) && uoffset > prepend_sign + 1) { - PyObject *tmp; - PyObject *repeat = PyInt_FromSsize_t(uoffset - prepend_sign); - if (unlikely(!repeat)) goto done_or_error; - tmp = PyNumber_Multiply(padding, repeat); - Py_DECREF(repeat); - Py_DECREF(padding); - padding = tmp; - } - if (unlikely(!padding)) goto done_or_error; - } - if (prepend_sign) { - sign = PyUnicode_FromOrdinal('-'); - if (unlikely(!sign)) goto done_or_error; - } - } - uval = PyUnicode_DecodeASCII(chars, clength, NULL); - if (likely(uval) && padding) { - PyObject *tmp = PyNumber_Add(padding, uval); - Py_DECREF(uval); - uval = tmp; - } - if (likely(uval) && sign) { - PyObject *tmp = PyNumber_Add(sign, uval); - Py_DECREF(uval); - uval = tmp; - } -done_or_error: - Py_XDECREF(padding); - Py_XDECREF(sign); - } -#endif - return uval; -} - -/* CIntToPyUnicode */ -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_From_int(int value, Py_ssize_t width, char padding_char, char format_char) { - char digits[sizeof(int)*3+2]; - char *dpos, *end = digits + sizeof(int)*3+2; - const char *hex_digits = DIGITS_HEX; - Py_ssize_t length, ulength; - int prepend_sign, last_one_off; - int remaining; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (format_char == 'X') { - hex_digits += 16; - format_char = 'x'; - } - remaining = value; - last_one_off = 0; - dpos = end; - do { - int digit_pos; - switch (format_char) { - case 'o': - digit_pos = abs((int)(remaining % (8*8))); - remaining = (int) (remaining / (8*8)); - dpos -= 2; - memcpy(dpos, DIGIT_PAIRS_8 + digit_pos * 2, 2); - last_one_off = (digit_pos < 8); - break; - case 'd': - digit_pos = abs((int)(remaining % (10*10))); - remaining = (int) (remaining / (10*10)); - dpos -= 2; - memcpy(dpos, DIGIT_PAIRS_10 + digit_pos * 2, 2); - last_one_off = (digit_pos < 10); - break; - case 'x': - *(--dpos) = hex_digits[abs((int)(remaining % 16))]; - remaining = (int) (remaining / 16); - break; - default: - assert(0); - break; - } - } while (unlikely(remaining != 0)); - assert(!last_one_off || *dpos == '0'); - dpos += last_one_off; - length = end - dpos; - ulength = length; - prepend_sign = 0; - if (!is_unsigned && value <= neg_one) { - if (padding_char == ' ' || width <= length + 1) { - *(--dpos) = '-'; - ++length; - } else { - prepend_sign = 1; - } - ++ulength; - } - if (width > ulength) { - ulength = width; - } - if (ulength == 1) { - return PyUnicode_FromOrdinal(*dpos); - } - return __Pyx_PyUnicode_BuildFromAscii(ulength, dpos, (int) length, prepend_sign, padding_char); -} - -/* FixUpExtensionType */ -#if CYTHON_USE_TYPE_SPECS -static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { -#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - CYTHON_UNUSED_VAR(spec); - CYTHON_UNUSED_VAR(type); -#else - const PyType_Slot *slot = spec->slots; - while (slot && slot->slot && slot->slot != Py_tp_members) - slot++; - if (slot && slot->slot == Py_tp_members) { - int changed = 0; -#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) - const -#endif - PyMemberDef *memb = (PyMemberDef*) slot->pfunc; - while (memb && memb->name) { - if (memb->name[0] == '_' && memb->name[1] == '_') { -#if PY_VERSION_HEX < 0x030900b1 - if (strcmp(memb->name, "__weaklistoffset__") == 0) { - assert(memb->type == T_PYSSIZET); - assert(memb->flags == READONLY); - type->tp_weaklistoffset = memb->offset; - changed = 1; - } - else if (strcmp(memb->name, "__dictoffset__") == 0) { - assert(memb->type == T_PYSSIZET); - assert(memb->flags == READONLY); - type->tp_dictoffset = memb->offset; - changed = 1; - } -#if CYTHON_METH_FASTCALL - else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { - assert(memb->type == T_PYSSIZET); - assert(memb->flags == READONLY); -#if PY_VERSION_HEX >= 0x030800b4 - type->tp_vectorcall_offset = memb->offset; -#else - type->tp_print = (printfunc) memb->offset; -#endif - changed = 1; - } -#endif -#else - if ((0)); -#endif -#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON - else if (strcmp(memb->name, "__module__") == 0) { - PyObject *descr; - assert(memb->type == T_OBJECT); - assert(memb->flags == 0 || memb->flags == READONLY); - descr = PyDescr_NewMember(type, memb); - if (unlikely(!descr)) - return -1; - if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { - Py_DECREF(descr); - return -1; - } - Py_DECREF(descr); - changed = 1; - } -#endif - } - memb++; - } - if (changed) - PyType_Modified(type); - } -#endif - return 0; -} -#endif - -/* ValidateBasesTuple */ -#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS -static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { - Py_ssize_t i, n; -#if CYTHON_ASSUME_SAFE_MACROS - n = PyTuple_GET_SIZE(bases); -#else - n = PyTuple_Size(bases); - if (n < 0) return -1; -#endif - for (i = 1; i < n; i++) - { -#if CYTHON_AVOID_BORROWED_REFS - PyObject *b0 = PySequence_GetItem(bases, i); - if (!b0) return -1; -#elif CYTHON_ASSUME_SAFE_MACROS - PyObject *b0 = PyTuple_GET_ITEM(bases, i); -#else - PyObject *b0 = PyTuple_GetItem(bases, i); - if (!b0) return -1; -#endif - PyTypeObject *b; -#if PY_MAJOR_VERSION < 3 - if (PyClass_Check(b0)) - { - PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", - PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - return -1; - } -#endif - b = (PyTypeObject*) b0; - if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) - { - __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); - PyErr_Format(PyExc_TypeError, - "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); - __Pyx_DECREF_TypeName(b_name); -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - return -1; - } -#if !CYTHON_USE_TYPE_SLOTS - if (dictoffset == 0) { - PyErr_Format(PyExc_TypeError, - "extension type '%s.200s': " - "unable to validate whether bases have a __dict__ " - "when CYTHON_USE_TYPE_SLOTS is off " - "(likely because you are building in the limited API). " - "Therefore, all extension types with multiple bases " - "must add 'cdef dict __dict__' in this compilation mode", - type_name); -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - return -1; - } -#else - if (dictoffset == 0 && b->tp_dictoffset) - { - __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); - PyErr_Format(PyExc_TypeError, - "extension type '%.200s' has no __dict__ slot, " - "but base type '" __Pyx_FMT_TYPENAME "' has: " - "either add 'cdef dict __dict__' to the extension type " - "or add '__slots__ = [...]' to the base type", - type_name, b_name); - __Pyx_DECREF_TypeName(b_name); -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - return -1; - } -#endif -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - } - return 0; -} -#endif - -/* PyType_Ready */ -static int __Pyx_PyType_Ready(PyTypeObject *t) { -#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) - (void)__Pyx_PyObject_CallMethod0; -#if CYTHON_USE_TYPE_SPECS - (void)__Pyx_validate_bases_tuple; -#endif - return PyType_Ready(t); -#else - int r; - PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); - if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) - return -1; -#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) - { - int gc_was_enabled; - #if PY_VERSION_HEX >= 0x030A00b1 - gc_was_enabled = PyGC_Disable(); - (void)__Pyx_PyObject_CallMethod0; - #else - PyObject *ret, *py_status; - PyObject *gc = NULL; - #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) - gc = PyImport_GetModule(__pyx_kp_u_gc); - #endif - if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); - if (unlikely(!gc)) return -1; - py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); - if (unlikely(!py_status)) { - Py_DECREF(gc); - return -1; - } - gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); - Py_DECREF(py_status); - if (gc_was_enabled > 0) { - ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); - if (unlikely(!ret)) { - Py_DECREF(gc); - return -1; - } - Py_DECREF(ret); - } else if (unlikely(gc_was_enabled == -1)) { - Py_DECREF(gc); - return -1; - } - #endif - t->tp_flags |= Py_TPFLAGS_HEAPTYPE; -#if PY_VERSION_HEX >= 0x030A0000 - t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; -#endif -#else - (void)__Pyx_PyObject_CallMethod0; -#endif - r = PyType_Ready(t); -#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) - t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; - #if PY_VERSION_HEX >= 0x030A00b1 - if (gc_was_enabled) - PyGC_Enable(); - #else - if (gc_was_enabled) { - PyObject *tp, *v, *tb; - PyErr_Fetch(&tp, &v, &tb); - ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); - if (likely(ret || r == -1)) { - Py_XDECREF(ret); - PyErr_Restore(tp, v, tb); - } else { - Py_XDECREF(tp); - Py_XDECREF(v); - Py_XDECREF(tb); - r = -1; - } - } - Py_DECREF(gc); - #endif - } -#endif - return r; -#endif -} - -/* PyObject_GenericGetAttrNoDict */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { - __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", - type_name, attr_name); -#else - "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", - type_name, PyString_AS_STRING(attr_name)); -#endif - __Pyx_DECREF_TypeName(type_name); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { - PyObject *descr; - PyTypeObject *tp = Py_TYPE(obj); - if (unlikely(!PyString_Check(attr_name))) { - return PyObject_GenericGetAttr(obj, attr_name); - } - assert(!tp->tp_dictoffset); - descr = _PyType_Lookup(tp, attr_name); - if (unlikely(!descr)) { - return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); - } - Py_INCREF(descr); - #if PY_MAJOR_VERSION < 3 - if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) - #endif - { - descrgetfunc f = Py_TYPE(descr)->tp_descr_get; - if (unlikely(f)) { - PyObject *res = f(descr, obj, (PyObject *)tp); - Py_DECREF(descr); - return res; - } - } - return descr; -} -#endif - -/* PyObject_GenericGetAttr */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { - if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { - return PyObject_GenericGetAttr(obj, attr_name); - } - return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); -} -#endif - -/* SetVTable */ -static int __Pyx_SetVtable(PyTypeObject *type, void *vtable) { - PyObject *ob = PyCapsule_New(vtable, 0, 0); - if (unlikely(!ob)) - goto bad; -#if CYTHON_COMPILING_IN_LIMITED_API - if (unlikely(PyObject_SetAttr((PyObject *) type, __pyx_n_s_pyx_vtable, ob) < 0)) -#else - if (unlikely(PyDict_SetItem(type->tp_dict, __pyx_n_s_pyx_vtable, ob) < 0)) -#endif - goto bad; - Py_DECREF(ob); - return 0; -bad: - Py_XDECREF(ob); - return -1; -} - -/* GetVTable */ -static void* __Pyx_GetVtable(PyTypeObject *type) { - void* ptr; -#if CYTHON_COMPILING_IN_LIMITED_API - PyObject *ob = PyObject_GetAttr((PyObject *)type, __pyx_n_s_pyx_vtable); -#else - PyObject *ob = PyObject_GetItem(type->tp_dict, __pyx_n_s_pyx_vtable); -#endif - if (!ob) - goto bad; - ptr = PyCapsule_GetPointer(ob, 0); - if (!ptr && !PyErr_Occurred()) - PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); - Py_DECREF(ob); - return ptr; -bad: - Py_XDECREF(ob); - return NULL; -} - -/* MergeVTables */ -#if !CYTHON_COMPILING_IN_LIMITED_API -static int __Pyx_MergeVtables(PyTypeObject *type) { - int i; - void** base_vtables; - __Pyx_TypeName tp_base_name; - __Pyx_TypeName base_name; - void* unknown = (void*)-1; - PyObject* bases = type->tp_bases; - int base_depth = 0; - { - PyTypeObject* base = type->tp_base; - while (base) { - base_depth += 1; - base = base->tp_base; - } - } - base_vtables = (void**) malloc(sizeof(void*) * (size_t)(base_depth + 1)); - base_vtables[0] = unknown; - for (i = 1; i < PyTuple_GET_SIZE(bases); i++) { - void* base_vtable = __Pyx_GetVtable(((PyTypeObject*)PyTuple_GET_ITEM(bases, i))); - if (base_vtable != NULL) { - int j; - PyTypeObject* base = type->tp_base; - for (j = 0; j < base_depth; j++) { - if (base_vtables[j] == unknown) { - base_vtables[j] = __Pyx_GetVtable(base); - base_vtables[j + 1] = unknown; - } - if (base_vtables[j] == base_vtable) { - break; - } else if (base_vtables[j] == NULL) { - goto bad; - } - base = base->tp_base; - } - } - } - PyErr_Clear(); - free(base_vtables); - return 0; -bad: - tp_base_name = __Pyx_PyType_GetName(type->tp_base); - base_name = __Pyx_PyType_GetName((PyTypeObject*)PyTuple_GET_ITEM(bases, i)); - PyErr_Format(PyExc_TypeError, - "multiple bases have vtable conflict: '" __Pyx_FMT_TYPENAME "' and '" __Pyx_FMT_TYPENAME "'", tp_base_name, base_name); - __Pyx_DECREF_TypeName(tp_base_name); - __Pyx_DECREF_TypeName(base_name); - free(base_vtables); - return -1; -} -#endif - -/* SetupReduce */ -#if !CYTHON_COMPILING_IN_LIMITED_API -static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { - int ret; - PyObject *name_attr; - name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name); - if (likely(name_attr)) { - ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); - } else { - ret = -1; - } - if (unlikely(ret < 0)) { - PyErr_Clear(); - ret = 0; - } - Py_XDECREF(name_attr); - return ret; -} -static int __Pyx_setup_reduce(PyObject* type_obj) { - int ret = 0; - PyObject *object_reduce = NULL; - PyObject *object_getstate = NULL; - PyObject *object_reduce_ex = NULL; - PyObject *reduce = NULL; - PyObject *reduce_ex = NULL; - PyObject *reduce_cython = NULL; - PyObject *setstate = NULL; - PyObject *setstate_cython = NULL; - PyObject *getstate = NULL; -#if CYTHON_USE_PYTYPE_LOOKUP - getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); -#else - getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); - if (!getstate && PyErr_Occurred()) { - goto __PYX_BAD; - } -#endif - if (getstate) { -#if CYTHON_USE_PYTYPE_LOOKUP - object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); -#else - object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); - if (!object_getstate && PyErr_Occurred()) { - goto __PYX_BAD; - } -#endif - if (object_getstate != getstate) { - goto __PYX_GOOD; - } - } -#if CYTHON_USE_PYTYPE_LOOKUP - object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; -#else - object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; -#endif - reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; - if (reduce_ex == object_reduce_ex) { -#if CYTHON_USE_PYTYPE_LOOKUP - object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; -#else - object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; -#endif - reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; - if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { - reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); - if (likely(reduce_cython)) { - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - } else if (reduce == object_reduce || PyErr_Occurred()) { - goto __PYX_BAD; - } - setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); - if (!setstate) PyErr_Clear(); - if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { - setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); - if (likely(setstate_cython)) { - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - } else if (!setstate || PyErr_Occurred()) { - goto __PYX_BAD; - } - } - PyType_Modified((PyTypeObject*)type_obj); - } - } - goto __PYX_GOOD; -__PYX_BAD: - if (!PyErr_Occurred()) { - __Pyx_TypeName type_obj_name = - __Pyx_PyType_GetName((PyTypeObject*)type_obj); - PyErr_Format(PyExc_RuntimeError, - "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); - __Pyx_DECREF_TypeName(type_obj_name); - } - ret = -1; -__PYX_GOOD: -#if !CYTHON_USE_PYTYPE_LOOKUP - Py_XDECREF(object_reduce); - Py_XDECREF(object_reduce_ex); - Py_XDECREF(object_getstate); - Py_XDECREF(getstate); -#endif - Py_XDECREF(reduce); - Py_XDECREF(reduce_ex); - Py_XDECREF(reduce_cython); - Py_XDECREF(setstate); - Py_XDECREF(setstate_cython); - return ret; -} -#endif - -/* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType_3_0_2 -#define __PYX_HAVE_RT_ImportType_3_0_2 -static PyTypeObject *__Pyx_ImportType_3_0_2(PyObject *module, const char *module_name, const char *class_name, - size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_2 check_size) -{ - PyObject *result = 0; - char warning[200]; - Py_ssize_t basicsize; - Py_ssize_t itemsize; -#if CYTHON_COMPILING_IN_LIMITED_API - PyObject *py_basicsize; - PyObject *py_itemsize; -#endif - result = PyObject_GetAttrString(module, class_name); - if (!result) - goto bad; - if (!PyType_Check(result)) { - PyErr_Format(PyExc_TypeError, - "%.200s.%.200s is not a type object", - module_name, class_name); - goto bad; - } -#if !CYTHON_COMPILING_IN_LIMITED_API - basicsize = ((PyTypeObject *)result)->tp_basicsize; - itemsize = ((PyTypeObject *)result)->tp_itemsize; -#else - py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); - if (!py_basicsize) - goto bad; - basicsize = PyLong_AsSsize_t(py_basicsize); - Py_DECREF(py_basicsize); - py_basicsize = 0; - if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) - goto bad; - py_itemsize = PyObject_GetAttrString(result, "__itemsize__"); - if (!py_itemsize) - goto bad; - itemsize = PyLong_AsSsize_t(py_itemsize); - Py_DECREF(py_itemsize); - py_itemsize = 0; - if (itemsize == (Py_ssize_t)-1 && PyErr_Occurred()) - goto bad; -#endif - if (itemsize) { - if (size % alignment) { - alignment = size % alignment; - } - if (itemsize < (Py_ssize_t)alignment) - itemsize = (Py_ssize_t)alignment; - } - if ((size_t)(basicsize + itemsize) < size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize+itemsize); - goto bad; - } - if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_2 && - ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd-%zd from PyObject", - module_name, class_name, size, basicsize, basicsize+itemsize); - goto bad; - } - else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_2 && (size_t)basicsize > size) { - PyOS_snprintf(warning, sizeof(warning), - "%s.%s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; - } - return (PyTypeObject *)result; -bad: - Py_XDECREF(result); - return NULL; -} -#endif - -/* Import */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { - PyObject *module = 0; - PyObject *empty_dict = 0; - PyObject *empty_list = 0; - #if PY_MAJOR_VERSION < 3 - PyObject *py_import; - py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); - if (unlikely(!py_import)) - goto bad; - if (!from_list) { - empty_list = PyList_New(0); - if (unlikely(!empty_list)) - goto bad; - from_list = empty_list; - } - #endif - empty_dict = PyDict_New(); - if (unlikely(!empty_dict)) - goto bad; - { - #if PY_MAJOR_VERSION >= 3 - if (level == -1) { - if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { - module = PyImport_ImportModuleLevelObject( - name, __pyx_d, empty_dict, from_list, 1); - if (unlikely(!module)) { - if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) - goto bad; - PyErr_Clear(); - } - } - level = 0; - } - #endif - if (!module) { - #if PY_MAJOR_VERSION < 3 - PyObject *py_level = PyInt_FromLong(level); - if (unlikely(!py_level)) - goto bad; - module = PyObject_CallFunctionObjArgs(py_import, - name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); - Py_DECREF(py_level); - #else - module = PyImport_ImportModuleLevelObject( - name, __pyx_d, empty_dict, from_list, level); - #endif - } - } -bad: - Py_XDECREF(empty_dict); - Py_XDECREF(empty_list); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_import); - #endif - return module; -} - -/* ImportDottedModule */ -#if PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { - PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; - if (unlikely(PyErr_Occurred())) { - PyErr_Clear(); - } - if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { - partial_name = name; - } else { - slice = PySequence_GetSlice(parts_tuple, 0, count); - if (unlikely(!slice)) - goto bad; - sep = PyUnicode_FromStringAndSize(".", 1); - if (unlikely(!sep)) - goto bad; - partial_name = PyUnicode_Join(sep, slice); - } - PyErr_Format( -#if PY_MAJOR_VERSION < 3 - PyExc_ImportError, - "No module named '%s'", PyString_AS_STRING(partial_name)); -#else -#if PY_VERSION_HEX >= 0x030600B1 - PyExc_ModuleNotFoundError, -#else - PyExc_ImportError, -#endif - "No module named '%U'", partial_name); -#endif -bad: - Py_XDECREF(sep); - Py_XDECREF(slice); - Py_XDECREF(partial_name); - return NULL; -} -#endif -#if PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { - PyObject *imported_module; -#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) - PyObject *modules = PyImport_GetModuleDict(); - if (unlikely(!modules)) - return NULL; - imported_module = __Pyx_PyDict_GetItemStr(modules, name); - Py_XINCREF(imported_module); -#else - imported_module = PyImport_GetModule(name); -#endif - return imported_module; -} -#endif -#if PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { - Py_ssize_t i, nparts; - nparts = PyTuple_GET_SIZE(parts_tuple); - for (i=1; i < nparts && module; i++) { - PyObject *part, *submodule; -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - part = PyTuple_GET_ITEM(parts_tuple, i); -#else - part = PySequence_ITEM(parts_tuple, i); -#endif - submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); -#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) - Py_DECREF(part); -#endif - Py_DECREF(module); - module = submodule; - } - if (unlikely(!module)) { - return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); - } - return module; -} -#endif -static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { -#if PY_MAJOR_VERSION < 3 - PyObject *module, *from_list, *star = __pyx_n_s__29; - CYTHON_UNUSED_VAR(parts_tuple); - from_list = PyList_New(1); - if (unlikely(!from_list)) - return NULL; - Py_INCREF(star); - PyList_SET_ITEM(from_list, 0, star); - module = __Pyx_Import(name, from_list, 0); - Py_DECREF(from_list); - return module; -#else - PyObject *imported_module; - PyObject *module = __Pyx_Import(name, NULL, 0); - if (!parts_tuple || unlikely(!module)) - return module; - imported_module = __Pyx__ImportDottedModule_Lookup(name); - if (likely(imported_module)) { - Py_DECREF(module); - return imported_module; - } - PyErr_Clear(); - return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); -#endif -} -static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 - PyObject *module = __Pyx__ImportDottedModule_Lookup(name); - if (likely(module)) { - PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); - if (likely(spec)) { - PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); - if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { - Py_DECREF(spec); - spec = NULL; - } - Py_XDECREF(unsafe); - } - if (likely(!spec)) { - PyErr_Clear(); - return module; - } - Py_DECREF(spec); - Py_DECREF(module); - } else if (PyErr_Occurred()) { - PyErr_Clear(); - } -#endif - return __Pyx__ImportDottedModule(name, parts_tuple); -} - -/* ImportFrom */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { - PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); - if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { - const char* module_name_str = 0; - PyObject* module_name = 0; - PyObject* module_dot = 0; - PyObject* full_name = 0; - PyErr_Clear(); - module_name_str = PyModule_GetName(module); - if (unlikely(!module_name_str)) { goto modbad; } - module_name = PyUnicode_FromString(module_name_str); - if (unlikely(!module_name)) { goto modbad; } - module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__30); - if (unlikely(!module_dot)) { goto modbad; } - full_name = PyUnicode_Concat(module_dot, name); - if (unlikely(!full_name)) { goto modbad; } - #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) - { - PyObject *modules = PyImport_GetModuleDict(); - if (unlikely(!modules)) - goto modbad; - value = PyObject_GetItem(modules, full_name); - } - #else - value = PyImport_GetModule(full_name); - #endif - modbad: - Py_XDECREF(full_name); - Py_XDECREF(module_dot); - Py_XDECREF(module_name); - } - if (unlikely(!value)) { - PyErr_Format(PyExc_ImportError, - #if PY_MAJOR_VERSION < 3 - "cannot import name %.230s", PyString_AS_STRING(name)); - #else - "cannot import name %S", name); - #endif - } - return value; -} - -/* FetchSharedCythonModule */ -static PyObject *__Pyx_FetchSharedCythonABIModule(void) { - PyObject *abi_module = PyImport_AddModule((char*) __PYX_ABI_MODULE_NAME); - if (unlikely(!abi_module)) return NULL; - Py_INCREF(abi_module); - return abi_module; -} - -/* FetchCommonType */ -static int __Pyx_VerifyCachedType(PyObject *cached_type, - const char *name, - Py_ssize_t basicsize, - Py_ssize_t expected_basicsize) { - if (!PyType_Check(cached_type)) { - PyErr_Format(PyExc_TypeError, - "Shared Cython type %.200s is not a type object", name); - return -1; - } - if (basicsize != expected_basicsize) { - PyErr_Format(PyExc_TypeError, - "Shared Cython type %.200s has the wrong size, try recompiling", - name); - return -1; - } - return 0; -} -#if !CYTHON_USE_TYPE_SPECS -static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { - PyObject* abi_module; - const char* object_name; - PyTypeObject *cached_type = NULL; - abi_module = __Pyx_FetchSharedCythonABIModule(); - if (!abi_module) return NULL; - object_name = strrchr(type->tp_name, '.'); - object_name = object_name ? object_name+1 : type->tp_name; - cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); - if (cached_type) { - if (__Pyx_VerifyCachedType( - (PyObject *)cached_type, - object_name, - cached_type->tp_basicsize, - type->tp_basicsize) < 0) { - goto bad; - } - goto done; - } - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; - PyErr_Clear(); - if (PyType_Ready(type) < 0) goto bad; - if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) - goto bad; - Py_INCREF(type); - cached_type = type; -done: - Py_DECREF(abi_module); - return cached_type; -bad: - Py_XDECREF(cached_type); - cached_type = NULL; - goto done; -} -#else -static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { - PyObject *abi_module, *cached_type = NULL; - const char* object_name = strrchr(spec->name, '.'); - object_name = object_name ? object_name+1 : spec->name; - abi_module = __Pyx_FetchSharedCythonABIModule(); - if (!abi_module) return NULL; - cached_type = PyObject_GetAttrString(abi_module, object_name); - if (cached_type) { - Py_ssize_t basicsize; -#if CYTHON_COMPILING_IN_LIMITED_API - PyObject *py_basicsize; - py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); - if (unlikely(!py_basicsize)) goto bad; - basicsize = PyLong_AsSsize_t(py_basicsize); - Py_DECREF(py_basicsize); - py_basicsize = 0; - if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; -#else - basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; -#endif - if (__Pyx_VerifyCachedType( - cached_type, - object_name, - basicsize, - spec->basicsize) < 0) { - goto bad; - } - goto done; - } - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; - PyErr_Clear(); - CYTHON_UNUSED_VAR(module); - cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); - if (unlikely(!cached_type)) goto bad; - if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; - if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; -done: - Py_DECREF(abi_module); - assert(cached_type == NULL || PyType_Check(cached_type)); - return (PyTypeObject *) cached_type; -bad: - Py_XDECREF(cached_type); - cached_type = NULL; - goto done; -} -#endif - -/* PyVectorcallFastCallDict */ -#if CYTHON_METH_FASTCALL -static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) -{ - PyObject *res = NULL; - PyObject *kwnames; - PyObject **newargs; - PyObject **kwvalues; - Py_ssize_t i, pos; - size_t j; - PyObject *key, *value; - unsigned long keys_are_strings; - Py_ssize_t nkw = PyDict_GET_SIZE(kw); - newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); - if (unlikely(newargs == NULL)) { - PyErr_NoMemory(); - return NULL; - } - for (j = 0; j < nargs; j++) newargs[j] = args[j]; - kwnames = PyTuple_New(nkw); - if (unlikely(kwnames == NULL)) { - PyMem_Free(newargs); - return NULL; - } - kwvalues = newargs + nargs; - pos = i = 0; - keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; - while (PyDict_Next(kw, &pos, &key, &value)) { - keys_are_strings &= Py_TYPE(key)->tp_flags; - Py_INCREF(key); - Py_INCREF(value); - PyTuple_SET_ITEM(kwnames, i, key); - kwvalues[i] = value; - i++; - } - if (unlikely(!keys_are_strings)) { - PyErr_SetString(PyExc_TypeError, "keywords must be strings"); - goto cleanup; - } - res = vc(func, newargs, nargs, kwnames); -cleanup: - Py_DECREF(kwnames); - for (i = 0; i < nkw; i++) - Py_DECREF(kwvalues[i]); - PyMem_Free(newargs); - return res; -} -static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) -{ - if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { - return vc(func, args, nargs, NULL); - } - return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); -} -#endif - -/* CythonFunctionShared */ -static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { -#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - __Pyx_Py_XDECREF_SET( - __Pyx_CyFunction_GetClassObj(f), - ((classobj) ? __Pyx_NewRef(classobj) : NULL)); -#else - __Pyx_Py_XDECREF_SET( - ((PyCMethodObject *) (f))->mm_class, - (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); -#endif -} -static PyObject * -__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) -{ - CYTHON_UNUSED_VAR(closure); - if (unlikely(op->func_doc == NULL)) { -#if CYTHON_COMPILING_IN_LIMITED_API - op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); - if (unlikely(!op->func_doc)) return NULL; -#else - if (((PyCFunctionObject*)op)->m_ml->ml_doc) { -#if PY_MAJOR_VERSION >= 3 - op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); -#else - op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); -#endif - if (unlikely(op->func_doc == NULL)) - return NULL; - } else { - Py_INCREF(Py_None); - return Py_None; - } -#endif - } - Py_INCREF(op->func_doc); - return op->func_doc; -} -static int -__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); - if (value == NULL) { - value = Py_None; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->func_doc, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(context); - if (unlikely(op->func_name == NULL)) { -#if CYTHON_COMPILING_IN_LIMITED_API - op->func_name = PyObject_GetAttrString(op->func, "__name__"); -#elif PY_MAJOR_VERSION >= 3 - op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); -#else - op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); -#endif - if (unlikely(op->func_name == NULL)) - return NULL; - } - Py_INCREF(op->func_name); - return op->func_name; -} -static int -__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); -#if PY_MAJOR_VERSION >= 3 - if (unlikely(value == NULL || !PyUnicode_Check(value))) -#else - if (unlikely(value == NULL || !PyString_Check(value))) -#endif - { - PyErr_SetString(PyExc_TypeError, - "__name__ must be set to a string object"); - return -1; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->func_name, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(context); - Py_INCREF(op->func_qualname); - return op->func_qualname; -} -static int -__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); -#if PY_MAJOR_VERSION >= 3 - if (unlikely(value == NULL || !PyUnicode_Check(value))) -#else - if (unlikely(value == NULL || !PyString_Check(value))) -#endif - { - PyErr_SetString(PyExc_TypeError, - "__qualname__ must be set to a string object"); - return -1; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->func_qualname, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(context); - if (unlikely(op->func_dict == NULL)) { - op->func_dict = PyDict_New(); - if (unlikely(op->func_dict == NULL)) - return NULL; - } - Py_INCREF(op->func_dict); - return op->func_dict; -} -static int -__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); - if (unlikely(value == NULL)) { - PyErr_SetString(PyExc_TypeError, - "function's dictionary may not be deleted"); - return -1; - } - if (unlikely(!PyDict_Check(value))) { - PyErr_SetString(PyExc_TypeError, - "setting function's dictionary to a non-dict"); - return -1; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->func_dict, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(context); - Py_INCREF(op->func_globals); - return op->func_globals; -} -static PyObject * -__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(op); - CYTHON_UNUSED_VAR(context); - Py_INCREF(Py_None); - return Py_None; -} -static PyObject * -__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) -{ - PyObject* result = (op->func_code) ? op->func_code : Py_None; - CYTHON_UNUSED_VAR(context); - Py_INCREF(result); - return result; -} -static int -__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { - int result = 0; - PyObject *res = op->defaults_getter((PyObject *) op); - if (unlikely(!res)) - return -1; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - op->defaults_tuple = PyTuple_GET_ITEM(res, 0); - Py_INCREF(op->defaults_tuple); - op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); - Py_INCREF(op->defaults_kwdict); - #else - op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); - if (unlikely(!op->defaults_tuple)) result = -1; - else { - op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); - if (unlikely(!op->defaults_kwdict)) result = -1; - } - #endif - Py_DECREF(res); - return result; -} -static int -__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { - CYTHON_UNUSED_VAR(context); - if (!value) { - value = Py_None; - } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { - PyErr_SetString(PyExc_TypeError, - "__defaults__ must be set to a tuple object"); - return -1; - } - PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " - "currently affect the values used in function calls", 1); - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { - PyObject* result = op->defaults_tuple; - CYTHON_UNUSED_VAR(context); - if (unlikely(!result)) { - if (op->defaults_getter) { - if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; - result = op->defaults_tuple; - } else { - result = Py_None; - } - } - Py_INCREF(result); - return result; -} -static int -__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { - CYTHON_UNUSED_VAR(context); - if (!value) { - value = Py_None; - } else if (unlikely(value != Py_None && !PyDict_Check(value))) { - PyErr_SetString(PyExc_TypeError, - "__kwdefaults__ must be set to a dict object"); - return -1; - } - PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " - "currently affect the values used in function calls", 1); - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { - PyObject* result = op->defaults_kwdict; - CYTHON_UNUSED_VAR(context); - if (unlikely(!result)) { - if (op->defaults_getter) { - if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; - result = op->defaults_kwdict; - } else { - result = Py_None; - } - } - Py_INCREF(result); - return result; -} -static int -__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { - CYTHON_UNUSED_VAR(context); - if (!value || value == Py_None) { - value = NULL; - } else if (unlikely(!PyDict_Check(value))) { - PyErr_SetString(PyExc_TypeError, - "__annotations__ must be set to a dict object"); - return -1; - } - Py_XINCREF(value); - __Pyx_Py_XDECREF_SET(op->func_annotations, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { - PyObject* result = op->func_annotations; - CYTHON_UNUSED_VAR(context); - if (unlikely(!result)) { - result = PyDict_New(); - if (unlikely(!result)) return NULL; - op->func_annotations = result; - } - Py_INCREF(result); - return result; -} -static PyObject * -__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { - int is_coroutine; - CYTHON_UNUSED_VAR(context); - if (op->func_is_coroutine) { - return __Pyx_NewRef(op->func_is_coroutine); - } - is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; -#if PY_VERSION_HEX >= 0x03050000 - if (is_coroutine) { - PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; - fromlist = PyList_New(1); - if (unlikely(!fromlist)) return NULL; - Py_INCREF(marker); -#if CYTHON_ASSUME_SAFE_MACROS - PyList_SET_ITEM(fromlist, 0, marker); -#else - if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { - Py_DECREF(marker); - Py_DECREF(fromlist); - return NULL; - } -#endif - module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); - Py_DECREF(fromlist); - if (unlikely(!module)) goto ignore; - op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); - Py_DECREF(module); - if (likely(op->func_is_coroutine)) { - return __Pyx_NewRef(op->func_is_coroutine); - } -ignore: - PyErr_Clear(); - } -#endif - op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); - return __Pyx_NewRef(op->func_is_coroutine); -} -#if CYTHON_COMPILING_IN_LIMITED_API -static PyObject * -__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { - CYTHON_UNUSED_VAR(context); - return PyObject_GetAttrString(op->func, "__module__"); -} -static int -__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { - CYTHON_UNUSED_VAR(context); - return PyObject_SetAttrString(op->func, "__module__", value); -} -#endif -static PyGetSetDef __pyx_CyFunction_getsets[] = { - {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, - {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, - {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, - {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, - {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, - {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, - {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, - {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, - {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, - {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, - {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, - {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, - {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, - {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, - {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, - {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, - {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, - {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, -#if CYTHON_COMPILING_IN_LIMITED_API - {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, -#endif - {0, 0, 0, 0, 0} -}; -static PyMemberDef __pyx_CyFunction_members[] = { -#if !CYTHON_COMPILING_IN_LIMITED_API - {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, -#endif -#if CYTHON_USE_TYPE_SPECS - {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, -#if CYTHON_METH_FASTCALL -#if CYTHON_BACKPORT_VECTORCALL - {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, -#else -#if !CYTHON_COMPILING_IN_LIMITED_API - {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, -#endif -#endif -#endif -#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API - {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, -#else - {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, -#endif -#endif - {0, 0, 0, 0, 0} -}; -static PyObject * -__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) -{ - CYTHON_UNUSED_VAR(args); -#if PY_MAJOR_VERSION >= 3 - Py_INCREF(m->func_qualname); - return m->func_qualname; -#else - return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); -#endif -} -static PyMethodDef __pyx_CyFunction_methods[] = { - {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, - {0, 0, 0, 0} -}; -#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API -#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) -#else -#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) -#endif -static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, - PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { -#if !CYTHON_COMPILING_IN_LIMITED_API - PyCFunctionObject *cf = (PyCFunctionObject*) op; -#endif - if (unlikely(op == NULL)) - return NULL; -#if CYTHON_COMPILING_IN_LIMITED_API - op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); - if (unlikely(!op->func)) return NULL; -#endif - op->flags = flags; - __Pyx_CyFunction_weakreflist(op) = NULL; -#if !CYTHON_COMPILING_IN_LIMITED_API - cf->m_ml = ml; - cf->m_self = (PyObject *) op; -#endif - Py_XINCREF(closure); - op->func_closure = closure; -#if !CYTHON_COMPILING_IN_LIMITED_API - Py_XINCREF(module); - cf->m_module = module; -#endif - op->func_dict = NULL; - op->func_name = NULL; - Py_INCREF(qualname); - op->func_qualname = qualname; - op->func_doc = NULL; -#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - op->func_classobj = NULL; -#else - ((PyCMethodObject*)op)->mm_class = NULL; -#endif - op->func_globals = globals; - Py_INCREF(op->func_globals); - Py_XINCREF(code); - op->func_code = code; - op->defaults_pyobjects = 0; - op->defaults_size = 0; - op->defaults = NULL; - op->defaults_tuple = NULL; - op->defaults_kwdict = NULL; - op->defaults_getter = NULL; - op->func_annotations = NULL; - op->func_is_coroutine = NULL; -#if CYTHON_METH_FASTCALL - switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { - case METH_NOARGS: - __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; - break; - case METH_O: - __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; - break; - case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: - __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; - break; - case METH_FASTCALL | METH_KEYWORDS: - __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; - break; - case METH_VARARGS | METH_KEYWORDS: - __Pyx_CyFunction_func_vectorcall(op) = NULL; - break; - default: - PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); - Py_DECREF(op); - return NULL; - } -#endif - return (PyObject *) op; -} -static int -__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) -{ - Py_CLEAR(m->func_closure); -#if CYTHON_COMPILING_IN_LIMITED_API - Py_CLEAR(m->func); -#else - Py_CLEAR(((PyCFunctionObject*)m)->m_module); -#endif - Py_CLEAR(m->func_dict); - Py_CLEAR(m->func_name); - Py_CLEAR(m->func_qualname); - Py_CLEAR(m->func_doc); - Py_CLEAR(m->func_globals); - Py_CLEAR(m->func_code); -#if !CYTHON_COMPILING_IN_LIMITED_API -#if PY_VERSION_HEX < 0x030900B1 - Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); -#else - { - PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; - ((PyCMethodObject *) (m))->mm_class = NULL; - Py_XDECREF(cls); - } -#endif -#endif - Py_CLEAR(m->defaults_tuple); - Py_CLEAR(m->defaults_kwdict); - Py_CLEAR(m->func_annotations); - Py_CLEAR(m->func_is_coroutine); - if (m->defaults) { - PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); - int i; - for (i = 0; i < m->defaults_pyobjects; i++) - Py_XDECREF(pydefaults[i]); - PyObject_Free(m->defaults); - m->defaults = NULL; - } - return 0; -} -static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) -{ - if (__Pyx_CyFunction_weakreflist(m) != NULL) - PyObject_ClearWeakRefs((PyObject *) m); - __Pyx_CyFunction_clear(m); - __Pyx_PyHeapTypeObject_GC_Del(m); -} -static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) -{ - PyObject_GC_UnTrack(m); - __Pyx__CyFunction_dealloc(m); -} -static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) -{ - Py_VISIT(m->func_closure); -#if CYTHON_COMPILING_IN_LIMITED_API - Py_VISIT(m->func); -#else - Py_VISIT(((PyCFunctionObject*)m)->m_module); -#endif - Py_VISIT(m->func_dict); - Py_VISIT(m->func_name); - Py_VISIT(m->func_qualname); - Py_VISIT(m->func_doc); - Py_VISIT(m->func_globals); - Py_VISIT(m->func_code); -#if !CYTHON_COMPILING_IN_LIMITED_API - Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); -#endif - Py_VISIT(m->defaults_tuple); - Py_VISIT(m->defaults_kwdict); - Py_VISIT(m->func_is_coroutine); - if (m->defaults) { - PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); - int i; - for (i = 0; i < m->defaults_pyobjects; i++) - Py_VISIT(pydefaults[i]); - } - return 0; -} -static PyObject* -__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) -{ -#if PY_MAJOR_VERSION >= 3 - return PyUnicode_FromFormat("<cyfunction %U at %p>", - op->func_qualname, (void *)op); -#else - return PyString_FromFormat("<cyfunction %s at %p>", - PyString_AsString(op->func_qualname), (void *)op); -#endif -} -static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { -#if CYTHON_COMPILING_IN_LIMITED_API - PyObject *f = ((__pyx_CyFunctionObject*)func)->func; - PyObject *py_name = NULL; - PyCFunction meth; - int flags; - meth = PyCFunction_GetFunction(f); - if (unlikely(!meth)) return NULL; - flags = PyCFunction_GetFlags(f); - if (unlikely(flags < 0)) return NULL; -#else - PyCFunctionObject* f = (PyCFunctionObject*)func; - PyCFunction meth = f->m_ml->ml_meth; - int flags = f->m_ml->ml_flags; -#endif - Py_ssize_t size; - switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { - case METH_VARARGS: - if (likely(kw == NULL || PyDict_Size(kw) == 0)) - return (*meth)(self, arg); - break; - case METH_VARARGS | METH_KEYWORDS: - return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); - case METH_NOARGS: - if (likely(kw == NULL || PyDict_Size(kw) == 0)) { -#if CYTHON_ASSUME_SAFE_MACROS - size = PyTuple_GET_SIZE(arg); -#else - size = PyTuple_Size(arg); - if (unlikely(size < 0)) return NULL; -#endif - if (likely(size == 0)) - return (*meth)(self, NULL); -#if CYTHON_COMPILING_IN_LIMITED_API - py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); - if (!py_name) return NULL; - PyErr_Format(PyExc_TypeError, - "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", - py_name, size); - Py_DECREF(py_name); -#else - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", - f->m_ml->ml_name, size); -#endif - return NULL; - } - break; - case METH_O: - if (likely(kw == NULL || PyDict_Size(kw) == 0)) { -#if CYTHON_ASSUME_SAFE_MACROS - size = PyTuple_GET_SIZE(arg); -#else - size = PyTuple_Size(arg); - if (unlikely(size < 0)) return NULL; -#endif - if (likely(size == 1)) { - PyObject *result, *arg0; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - arg0 = PyTuple_GET_ITEM(arg, 0); - #else - arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; - #endif - result = (*meth)(self, arg0); - #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) - Py_DECREF(arg0); - #endif - return result; - } -#if CYTHON_COMPILING_IN_LIMITED_API - py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); - if (!py_name) return NULL; - PyErr_Format(PyExc_TypeError, - "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", - py_name, size); - Py_DECREF(py_name); -#else - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", - f->m_ml->ml_name, size); -#endif - return NULL; - } - break; - default: - PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); - return NULL; - } -#if CYTHON_COMPILING_IN_LIMITED_API - py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); - if (!py_name) return NULL; - PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", - py_name); - Py_DECREF(py_name); -#else - PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", - f->m_ml->ml_name); -#endif - return NULL; -} -static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *self, *result; -#if CYTHON_COMPILING_IN_LIMITED_API - self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); - if (unlikely(!self) && PyErr_Occurred()) return NULL; -#else - self = ((PyCFunctionObject*)func)->m_self; -#endif - result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); - return result; -} -static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { - PyObject *result; - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; -#if CYTHON_METH_FASTCALL - __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); - if (vc) { -#if CYTHON_ASSUME_SAFE_MACROS - return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); -#else - (void) &__Pyx_PyVectorcall_FastCallDict; - return PyVectorcall_Call(func, args, kw); -#endif - } -#endif - if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { - Py_ssize_t argc; - PyObject *new_args; - PyObject *self; -#if CYTHON_ASSUME_SAFE_MACROS - argc = PyTuple_GET_SIZE(args); -#else - argc = PyTuple_Size(args); - if (unlikely(!argc) < 0) return NULL; -#endif - new_args = PyTuple_GetSlice(args, 1, argc); - if (unlikely(!new_args)) - return NULL; - self = PyTuple_GetItem(args, 0); - if (unlikely(!self)) { - Py_DECREF(new_args); -#if PY_MAJOR_VERSION > 2 - PyErr_Format(PyExc_TypeError, - "unbound method %.200S() needs an argument", - cyfunc->func_qualname); -#else - PyErr_SetString(PyExc_TypeError, - "unbound method needs an argument"); -#endif - return NULL; - } - result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); - Py_DECREF(new_args); - } else { - result = __Pyx_CyFunction_Call(func, args, kw); - } - return result; -} -#if CYTHON_METH_FASTCALL -static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) -{ - int ret = 0; - if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { - if (unlikely(nargs < 1)) { - PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", - ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); - return -1; - } - ret = 1; - } - if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); - return -1; - } - return ret; -} -static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) -{ - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; - PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; -#if CYTHON_BACKPORT_VECTORCALL - Py_ssize_t nargs = (Py_ssize_t)nargsf; -#else - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); -#endif - PyObject *self; - switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { - case 1: - self = args[0]; - args += 1; - nargs -= 1; - break; - case 0: - self = ((PyCFunctionObject*)cyfunc)->m_self; - break; - default: - return NULL; - } - if (unlikely(nargs != 0)) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", - def->ml_name, nargs); - return NULL; - } - return def->ml_meth(self, NULL); -} -static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) -{ - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; - PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; -#if CYTHON_BACKPORT_VECTORCALL - Py_ssize_t nargs = (Py_ssize_t)nargsf; -#else - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); -#endif - PyObject *self; - switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { - case 1: - self = args[0]; - args += 1; - nargs -= 1; - break; - case 0: - self = ((PyCFunctionObject*)cyfunc)->m_self; - break; - default: - return NULL; - } - if (unlikely(nargs != 1)) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", - def->ml_name, nargs); - return NULL; - } - return def->ml_meth(self, args[0]); -} -static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) -{ - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; - PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; -#if CYTHON_BACKPORT_VECTORCALL - Py_ssize_t nargs = (Py_ssize_t)nargsf; -#else - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); -#endif - PyObject *self; - switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { - case 1: - self = args[0]; - args += 1; - nargs -= 1; - break; - case 0: - self = ((PyCFunctionObject*)cyfunc)->m_self; - break; - default: - return NULL; - } - return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); -} -static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) -{ - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; - PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; - PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); -#if CYTHON_BACKPORT_VECTORCALL - Py_ssize_t nargs = (Py_ssize_t)nargsf; -#else - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); -#endif - PyObject *self; - switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { - case 1: - self = args[0]; - args += 1; - nargs -= 1; - break; - case 0: - self = ((PyCFunctionObject*)cyfunc)->m_self; - break; - default: - return NULL; - } - return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); -} -#endif -#if CYTHON_USE_TYPE_SPECS -static PyType_Slot __pyx_CyFunctionType_slots[] = { - {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, - {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, - {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, - {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, - {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, - {Py_tp_methods, (void *)__pyx_CyFunction_methods}, - {Py_tp_members, (void *)__pyx_CyFunction_members}, - {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, - {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, - {0, 0}, -}; -static PyType_Spec __pyx_CyFunctionType_spec = { - __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", - sizeof(__pyx_CyFunctionObject), - 0, -#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR - Py_TPFLAGS_METHOD_DESCRIPTOR | -#endif -#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) - _Py_TPFLAGS_HAVE_VECTORCALL | -#endif - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, - __pyx_CyFunctionType_slots -}; -#else -static PyTypeObject __pyx_CyFunctionType_type = { - PyVarObject_HEAD_INIT(0, 0) - __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", - sizeof(__pyx_CyFunctionObject), - 0, - (destructor) __Pyx_CyFunction_dealloc, -#if !CYTHON_METH_FASTCALL - 0, -#elif CYTHON_BACKPORT_VECTORCALL - (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), -#else - offsetof(PyCFunctionObject, vectorcall), -#endif - 0, - 0, -#if PY_MAJOR_VERSION < 3 - 0, -#else - 0, -#endif - (reprfunc) __Pyx_CyFunction_repr, - 0, - 0, - 0, - 0, - __Pyx_CyFunction_CallAsMethod, - 0, - 0, - 0, - 0, -#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR - Py_TPFLAGS_METHOD_DESCRIPTOR | -#endif -#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL - _Py_TPFLAGS_HAVE_VECTORCALL | -#endif - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, - 0, - (traverseproc) __Pyx_CyFunction_traverse, - (inquiry) __Pyx_CyFunction_clear, - 0, -#if PY_VERSION_HEX < 0x030500A0 - offsetof(__pyx_CyFunctionObject, func_weakreflist), -#else - offsetof(PyCFunctionObject, m_weakreflist), -#endif - 0, - 0, - __pyx_CyFunction_methods, - __pyx_CyFunction_members, - __pyx_CyFunction_getsets, - 0, - 0, - __Pyx_PyMethod_New, - 0, - offsetof(__pyx_CyFunctionObject, func_dict), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, -#if PY_VERSION_HEX >= 0x030400a1 - 0, -#endif -#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) - 0, -#endif -#if __PYX_NEED_TP_PRINT_SLOT - 0, -#endif -#if PY_VERSION_HEX >= 0x030C0000 - 0, -#endif -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 - 0, -#endif -}; -#endif -static int __pyx_CyFunction_init(PyObject *module) { -#if CYTHON_USE_TYPE_SPECS - __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); -#else - CYTHON_UNUSED_VAR(module); - __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); -#endif - if (unlikely(__pyx_CyFunctionType == NULL)) { - return -1; - } - return 0; -} -static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { - __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->defaults = PyObject_Malloc(size); - if (unlikely(!m->defaults)) - return PyErr_NoMemory(); - memset(m->defaults, 0, size); - m->defaults_pyobjects = pyobjects; - m->defaults_size = size; - return m->defaults; -} -static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { - __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->defaults_tuple = tuple; - Py_INCREF(tuple); -} -static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { - __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->defaults_kwdict = dict; - Py_INCREF(dict); -} -static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { - __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->func_annotations = dict; - Py_INCREF(dict); -} - -/* CythonFunction */ -static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, - PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { - PyObject *op = __Pyx_CyFunction_Init( - PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), - ml, flags, qualname, closure, module, globals, code - ); - if (likely(op)) { - PyObject_GC_Track(op); - } - return op; -} - -/* CLineInTraceback */ -#ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { - PyObject *use_cline; - PyObject *ptype, *pvalue, *ptraceback; -#if CYTHON_COMPILING_IN_CPYTHON - PyObject **cython_runtime_dict; -#endif - CYTHON_MAYBE_UNUSED_VAR(tstate); - if (unlikely(!__pyx_cython_runtime)) { - return c_line; - } - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); -#if CYTHON_COMPILING_IN_CPYTHON - cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); - if (likely(cython_runtime_dict)) { - __PYX_PY_DICT_LOOKUP_IF_MODIFIED( - use_cline, *cython_runtime_dict, - __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) - } else -#endif - { - PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); - if (use_cline_obj) { - use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; - Py_DECREF(use_cline_obj); - } else { - PyErr_Clear(); - use_cline = NULL; - } - } - if (!use_cline) { - c_line = 0; - (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); - } - else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { - c_line = 0; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - return c_line; -} -#endif - -/* CodeObjectCache */ -#if !CYTHON_COMPILING_IN_LIMITED_API -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = start + (end - start) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} -#endif - -/* AddTraceback */ -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API - #ifndef Py_BUILD_CORE - #define Py_BUILD_CORE 1 - #endif - #include "internal/pycore_frame.h" -#endif -#if CYTHON_COMPILING_IN_LIMITED_API -static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, - PyObject *firstlineno, PyObject *name) { - PyObject *replace = NULL; - if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; - if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; - replace = PyObject_GetAttrString(code, "replace"); - if (likely(replace)) { - PyObject *result; - result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); - Py_DECREF(replace); - return result; - } - #if __PYX_LIMITED_VERSION_HEX < 0x030780000 - PyErr_Clear(); - { - PyObject *compiled = NULL, *result = NULL; - if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; - if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; - compiled = Py_CompileString( - "out = type(code)(\n" - " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" - " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" - " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" - " code.co_lnotab)\n", "<dummy>", Py_file_input); - if (!compiled) return NULL; - result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); - Py_DECREF(compiled); - if (!result) PyErr_Print(); - Py_DECREF(result); - result = PyDict_GetItemString(scratch_dict, "out"); - if (result) Py_INCREF(result); - return result; - } - #endif -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; - PyObject *replace = NULL, *getframe = NULL, *frame = NULL; - PyObject *exc_type, *exc_value, *exc_traceback; - int success = 0; - if (c_line) { - (void) __pyx_cfilenm; - (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); - } - PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); - code_object = Py_CompileString("_getframe()", filename, Py_eval_input); - if (unlikely(!code_object)) goto bad; - py_py_line = PyLong_FromLong(py_line); - if (unlikely(!py_py_line)) goto bad; - py_funcname = PyUnicode_FromString(funcname); - if (unlikely(!py_funcname)) goto bad; - dict = PyDict_New(); - if (unlikely(!dict)) goto bad; - { - PyObject *old_code_object = code_object; - code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); - Py_DECREF(old_code_object); - } - if (unlikely(!code_object)) goto bad; - getframe = PySys_GetObject("_getframe"); - if (unlikely(!getframe)) goto bad; - if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; - frame = PyEval_EvalCode(code_object, dict, dict); - if (unlikely(!frame) || frame == Py_None) goto bad; - success = 1; - bad: - PyErr_Restore(exc_type, exc_value, exc_traceback); - Py_XDECREF(code_object); - Py_XDECREF(py_py_line); - Py_XDECREF(py_funcname); - Py_XDECREF(dict); - Py_XDECREF(replace); - if (success) { - PyTraceBack_Here( - (struct _frame*)frame); - } - Py_XDECREF(frame); -} -#else -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = NULL; - PyObject *py_funcname = NULL; - #if PY_MAJOR_VERSION < 3 - PyObject *py_srcfile = NULL; - py_srcfile = PyString_FromString(filename); - if (!py_srcfile) goto bad; - #endif - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - if (!py_funcname) goto bad; - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - if (!py_funcname) goto bad; - funcname = PyUnicode_AsUTF8(py_funcname); - if (!funcname) goto bad; - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - if (!py_funcname) goto bad; - #endif - } - #if PY_MAJOR_VERSION < 3 - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - #else - py_code = PyCode_NewEmpty(filename, funcname, py_line); - #endif - Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline - return py_code; -bad: - Py_XDECREF(py_funcname); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_srcfile); - #endif - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject *ptype, *pvalue, *ptraceback; - if (c_line) { - c_line = __Pyx_CLineForTraceback(tstate, c_line); - } - py_code = __pyx_find_code_object(c_line ? -c_line : py_line); - if (!py_code) { - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) { - /* If the code object creation fails, then we should clear the - fetched exception references and propagate the new exception */ - Py_XDECREF(ptype); - Py_XDECREF(pvalue); - Py_XDECREF(ptraceback); - goto bad; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); - } - py_frame = PyFrame_New( - tstate, /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} -#endif - -/* CIntFromPyVerify */ -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ - } - -/* CIntFromPy */ -static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_As_PY_LONG_LONG(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const PY_LONG_LONG neg_one = (PY_LONG_LONG) -1, const_zero = (PY_LONG_LONG) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if ((sizeof(PY_LONG_LONG) < sizeof(long))) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (PY_LONG_LONG) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - if (unlikely(__Pyx_PyLong_IsNeg(x))) { - goto raise_neg_overflow; - } else if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_DigitCount(x)) { - case 2: - if ((8 * sizeof(PY_LONG_LONG) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) >= 2 * PyLong_SHIFT)) { - return (PY_LONG_LONG) (((((PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0])); - } - } - break; - case 3: - if ((8 * sizeof(PY_LONG_LONG) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) >= 3 * PyLong_SHIFT)) { - return (PY_LONG_LONG) (((((((PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0])); - } - } - break; - case 4: - if ((8 * sizeof(PY_LONG_LONG) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) >= 4 * PyLong_SHIFT)) { - return (PY_LONG_LONG) (((((((((PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0])); - } - } - break; - } - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (PY_LONG_LONG) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if ((sizeof(PY_LONG_LONG) <= sizeof(unsigned long))) { - __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_SignedDigitCount(x)) { - case -2: - if ((8 * sizeof(PY_LONG_LONG) - 1 > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT)) { - return (PY_LONG_LONG) (((PY_LONG_LONG)-1)*(((((PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); - } - } - break; - case 2: - if ((8 * sizeof(PY_LONG_LONG) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT)) { - return (PY_LONG_LONG) ((((((PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); - } - } - break; - case -3: - if ((8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT)) { - return (PY_LONG_LONG) (((PY_LONG_LONG)-1)*(((((((PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); - } - } - break; - case 3: - if ((8 * sizeof(PY_LONG_LONG) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT)) { - return (PY_LONG_LONG) ((((((((PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); - } - } - break; - case -4: - if ((8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT)) { - return (PY_LONG_LONG) (((PY_LONG_LONG)-1)*(((((((((PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); - } - } - break; - case 4: - if ((8 * sizeof(PY_LONG_LONG) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(PY_LONG_LONG, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT)) { - return (PY_LONG_LONG) ((((((((((PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (PY_LONG_LONG)digits[0]))); - } - } - break; - } - } -#endif - if ((sizeof(PY_LONG_LONG) <= sizeof(long))) { - __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(PY_LONG_LONG) <= sizeof(PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(PY_LONG_LONG, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { - PY_LONG_LONG val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); -#if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } -#endif - if (likely(v)) { - int ret = -1; -#if !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); -#else - PyObject *stepval = NULL, *mask = NULL, *shift = NULL; - int bits, remaining_bits, is_negative = 0; - long idigit; - int chunk_size = (sizeof(long) < 8) ? 30 : 62; - if (unlikely(!PyLong_CheckExact(v))) { - PyObject *tmp = v; - v = PyNumber_Long(v); - assert(PyLong_CheckExact(v)); - Py_DECREF(tmp); - if (unlikely(!v)) return (PY_LONG_LONG) -1; - } -#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(x) == 0) - return (PY_LONG_LONG) 0; - is_negative = Py_SIZE(x) < 0; -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (PY_LONG_LONG) -1; - is_negative = result == 1; - } -#endif - if (is_unsigned && unlikely(is_negative)) { - goto raise_neg_overflow; - } else if (is_negative) { - stepval = PyNumber_Invert(v); - if (unlikely(!stepval)) - return (PY_LONG_LONG) -1; - } else { - stepval = __Pyx_NewRef(v); - } - val = (PY_LONG_LONG) 0; - mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; - shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; - for (bits = 0; bits < (int) sizeof(PY_LONG_LONG) * 8 - chunk_size; bits += chunk_size) { - PyObject *tmp, *digit; - digit = PyNumber_And(stepval, mask); - if (unlikely(!digit)) goto done; - idigit = PyLong_AsLong(digit); - Py_DECREF(digit); - if (unlikely(idigit < 0)) goto done; - tmp = PyNumber_Rshift(stepval, shift); - if (unlikely(!tmp)) goto done; - Py_DECREF(stepval); stepval = tmp; - val |= ((PY_LONG_LONG) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(stepval) == 0) - goto unpacking_done; - #endif - } - idigit = PyLong_AsLong(stepval); - if (unlikely(idigit < 0)) goto done; - remaining_bits = ((int) sizeof(PY_LONG_LONG) * 8) - bits - (is_unsigned ? 0 : 1); - if (unlikely(idigit >= (1L << remaining_bits))) - goto raise_overflow; - val |= ((PY_LONG_LONG) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - unpacking_done: - #endif - if (!is_unsigned) { - if (unlikely(val & (((PY_LONG_LONG) 1) << (sizeof(PY_LONG_LONG) * 8 - 1)))) - goto raise_overflow; - if (is_negative) - val = ~val; - } - ret = 0; - done: - Py_XDECREF(shift); - Py_XDECREF(mask); - Py_XDECREF(stepval); -#endif - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (PY_LONG_LONG) -1; - } - } else { - PY_LONG_LONG val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (PY_LONG_LONG) -1; - val = __Pyx_PyInt_As_PY_LONG_LONG(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to PY_LONG_LONG"); - return (PY_LONG_LONG) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to PY_LONG_LONG"); - return (PY_LONG_LONG) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if ((sizeof(int) < sizeof(long))) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - if (unlikely(__Pyx_PyLong_IsNeg(x))) { - goto raise_neg_overflow; - } else if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_DigitCount(x)) { - case 2: - if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if ((sizeof(int) <= sizeof(unsigned long))) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_SignedDigitCount(x)) { - case -2: - if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } - } -#endif - if ((sizeof(int) <= sizeof(long))) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); -#if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } -#endif - if (likely(v)) { - int ret = -1; -#if !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); -#else - PyObject *stepval = NULL, *mask = NULL, *shift = NULL; - int bits, remaining_bits, is_negative = 0; - long idigit; - int chunk_size = (sizeof(long) < 8) ? 30 : 62; - if (unlikely(!PyLong_CheckExact(v))) { - PyObject *tmp = v; - v = PyNumber_Long(v); - assert(PyLong_CheckExact(v)); - Py_DECREF(tmp); - if (unlikely(!v)) return (int) -1; - } -#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(x) == 0) - return (int) 0; - is_negative = Py_SIZE(x) < 0; -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - is_negative = result == 1; - } -#endif - if (is_unsigned && unlikely(is_negative)) { - goto raise_neg_overflow; - } else if (is_negative) { - stepval = PyNumber_Invert(v); - if (unlikely(!stepval)) - return (int) -1; - } else { - stepval = __Pyx_NewRef(v); - } - val = (int) 0; - mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; - shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; - for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { - PyObject *tmp, *digit; - digit = PyNumber_And(stepval, mask); - if (unlikely(!digit)) goto done; - idigit = PyLong_AsLong(digit); - Py_DECREF(digit); - if (unlikely(idigit < 0)) goto done; - tmp = PyNumber_Rshift(stepval, shift); - if (unlikely(!tmp)) goto done; - Py_DECREF(stepval); stepval = tmp; - val |= ((int) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(stepval) == 0) - goto unpacking_done; - #endif - } - idigit = PyLong_AsLong(stepval); - if (unlikely(idigit < 0)) goto done; - remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); - if (unlikely(idigit >= (1L << remaining_bits))) - goto raise_overflow; - val |= ((int) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - unpacking_done: - #endif - if (!is_unsigned) { - if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) - goto raise_overflow; - if (is_negative) - val = ~val; - } - ret = 0; - done: - Py_XDECREF(shift); - Py_XDECREF(mask); - Py_XDECREF(stepval); -#endif - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; -#if !CYTHON_COMPILING_IN_LIMITED_API - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); -#else - PyObject *from_bytes, *result = NULL; - PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; - from_bytes = PyObject_GetAttrString((PyObject*)&PyInt_Type, "from_bytes"); - if (!from_bytes) return NULL; - py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); - if (!py_bytes) goto limited_bad; - order_str = PyUnicode_FromString(little ? "little" : "big"); - if (!order_str) goto limited_bad; - arg_tuple = PyTuple_Pack(2, py_bytes, order_str); - if (!arg_tuple) goto limited_bad; - kwds = PyDict_New(); - if (!kwds) goto limited_bad; - if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(!is_unsigned ? Py_True : Py_False))) goto limited_bad; - result = PyObject_Call(from_bytes, arg_tuple, kwds); - limited_bad: - Py_XDECREF(from_bytes); - Py_XDECREF(py_bytes); - Py_XDECREF(order_str); - Py_XDECREF(arg_tuple); - Py_XDECREF(kwds); - return result; -#endif - } -} - -/* CIntFromPy */ -static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_As_unsigned_PY_LONG_LONG(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG) -1, const_zero = (unsigned PY_LONG_LONG) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if ((sizeof(unsigned PY_LONG_LONG) < sizeof(long))) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (unsigned PY_LONG_LONG) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - if (unlikely(__Pyx_PyLong_IsNeg(x))) { - goto raise_neg_overflow; - } else if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_DigitCount(x)) { - case 2: - if ((8 * sizeof(unsigned PY_LONG_LONG) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) >= 2 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - } - } - break; - case 3: - if ((8 * sizeof(unsigned PY_LONG_LONG) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) >= 3 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - } - } - break; - case 4: - if ((8 * sizeof(unsigned PY_LONG_LONG) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) >= 4 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - } - } - break; - } - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (unsigned PY_LONG_LONG) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if ((sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned long))) { - __PYX_VERIFY_RETURN_INT_EXC(unsigned PY_LONG_LONG, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(unsigned PY_LONG_LONG) <= sizeof(unsigned PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(unsigned PY_LONG_LONG, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_SignedDigitCount(x)) { - case -2: - if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) (((unsigned PY_LONG_LONG)-1)*(((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); - } - } - break; - case 2: - if ((8 * sizeof(unsigned PY_LONG_LONG) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) ((((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); - } - } - break; - case -3: - if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) (((unsigned PY_LONG_LONG)-1)*(((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); - } - } - break; - case 3: - if ((8 * sizeof(unsigned PY_LONG_LONG) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) ((((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); - } - } - break; - case -4: - if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) (((unsigned PY_LONG_LONG)-1)*(((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); - } - } - break; - case 4: - if ((8 * sizeof(unsigned PY_LONG_LONG) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned PY_LONG_LONG, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT)) { - return (unsigned PY_LONG_LONG) ((((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0]))); - } - } - break; - } - } -#endif - if ((sizeof(unsigned PY_LONG_LONG) <= sizeof(long))) { - __PYX_VERIFY_RETURN_INT_EXC(unsigned PY_LONG_LONG, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(unsigned PY_LONG_LONG) <= sizeof(PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(unsigned PY_LONG_LONG, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { - unsigned PY_LONG_LONG val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); -#if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } -#endif - if (likely(v)) { - int ret = -1; -#if !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); -#else - PyObject *stepval = NULL, *mask = NULL, *shift = NULL; - int bits, remaining_bits, is_negative = 0; - long idigit; - int chunk_size = (sizeof(long) < 8) ? 30 : 62; - if (unlikely(!PyLong_CheckExact(v))) { - PyObject *tmp = v; - v = PyNumber_Long(v); - assert(PyLong_CheckExact(v)); - Py_DECREF(tmp); - if (unlikely(!v)) return (unsigned PY_LONG_LONG) -1; - } -#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(x) == 0) - return (unsigned PY_LONG_LONG) 0; - is_negative = Py_SIZE(x) < 0; -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (unsigned PY_LONG_LONG) -1; - is_negative = result == 1; - } -#endif - if (is_unsigned && unlikely(is_negative)) { - goto raise_neg_overflow; - } else if (is_negative) { - stepval = PyNumber_Invert(v); - if (unlikely(!stepval)) - return (unsigned PY_LONG_LONG) -1; - } else { - stepval = __Pyx_NewRef(v); - } - val = (unsigned PY_LONG_LONG) 0; - mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; - shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; - for (bits = 0; bits < (int) sizeof(unsigned PY_LONG_LONG) * 8 - chunk_size; bits += chunk_size) { - PyObject *tmp, *digit; - digit = PyNumber_And(stepval, mask); - if (unlikely(!digit)) goto done; - idigit = PyLong_AsLong(digit); - Py_DECREF(digit); - if (unlikely(idigit < 0)) goto done; - tmp = PyNumber_Rshift(stepval, shift); - if (unlikely(!tmp)) goto done; - Py_DECREF(stepval); stepval = tmp; - val |= ((unsigned PY_LONG_LONG) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(stepval) == 0) - goto unpacking_done; - #endif - } - idigit = PyLong_AsLong(stepval); - if (unlikely(idigit < 0)) goto done; - remaining_bits = ((int) sizeof(unsigned PY_LONG_LONG) * 8) - bits - (is_unsigned ? 0 : 1); - if (unlikely(idigit >= (1L << remaining_bits))) - goto raise_overflow; - val |= ((unsigned PY_LONG_LONG) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - unpacking_done: - #endif - if (!is_unsigned) { - if (unlikely(val & (((unsigned PY_LONG_LONG) 1) << (sizeof(unsigned PY_LONG_LONG) * 8 - 1)))) - goto raise_overflow; - if (is_negative) - val = ~val; - } - ret = 0; - done: - Py_XDECREF(shift); - Py_XDECREF(mask); - Py_XDECREF(stepval); -#endif - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (unsigned PY_LONG_LONG) -1; - } - } else { - unsigned PY_LONG_LONG val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (unsigned PY_LONG_LONG) -1; - val = __Pyx_PyInt_As_unsigned_PY_LONG_LONG(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to unsigned PY_LONG_LONG"); - return (unsigned PY_LONG_LONG) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to unsigned PY_LONG_LONG"); - return (unsigned PY_LONG_LONG) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if ((sizeof(long) < sizeof(long))) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - if (unlikely(__Pyx_PyLong_IsNeg(x))) { - goto raise_neg_overflow; - } else if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_DigitCount(x)) { - case 2: - if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if ((sizeof(long) <= sizeof(unsigned long))) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_SignedDigitCount(x)) { - case -2: - if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } - } -#endif - if ((sizeof(long) <= sizeof(long))) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); -#if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } -#endif - if (likely(v)) { - int ret = -1; -#if !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); -#else - PyObject *stepval = NULL, *mask = NULL, *shift = NULL; - int bits, remaining_bits, is_negative = 0; - long idigit; - int chunk_size = (sizeof(long) < 8) ? 30 : 62; - if (unlikely(!PyLong_CheckExact(v))) { - PyObject *tmp = v; - v = PyNumber_Long(v); - assert(PyLong_CheckExact(v)); - Py_DECREF(tmp); - if (unlikely(!v)) return (long) -1; - } -#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(x) == 0) - return (long) 0; - is_negative = Py_SIZE(x) < 0; -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - is_negative = result == 1; - } -#endif - if (is_unsigned && unlikely(is_negative)) { - goto raise_neg_overflow; - } else if (is_negative) { - stepval = PyNumber_Invert(v); - if (unlikely(!stepval)) - return (long) -1; - } else { - stepval = __Pyx_NewRef(v); - } - val = (long) 0; - mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; - shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; - for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { - PyObject *tmp, *digit; - digit = PyNumber_And(stepval, mask); - if (unlikely(!digit)) goto done; - idigit = PyLong_AsLong(digit); - Py_DECREF(digit); - if (unlikely(idigit < 0)) goto done; - tmp = PyNumber_Rshift(stepval, shift); - if (unlikely(!tmp)) goto done; - Py_DECREF(stepval); stepval = tmp; - val |= ((long) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(stepval) == 0) - goto unpacking_done; - #endif - } - idigit = PyLong_AsLong(stepval); - if (unlikely(idigit < 0)) goto done; - remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); - if (unlikely(idigit >= (1L << remaining_bits))) - goto raise_overflow; - val |= ((long) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - unpacking_done: - #endif - if (!is_unsigned) { - if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) - goto raise_overflow; - if (is_negative) - val = ~val; - } - ret = 0; - done: - Py_XDECREF(shift); - Py_XDECREF(mask); - Py_XDECREF(stepval); -#endif - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE unsigned long __Pyx_PyInt_As_unsigned_long(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const unsigned long neg_one = (unsigned long) -1, const_zero = (unsigned long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if ((sizeof(unsigned long) < sizeof(long))) { - __PYX_VERIFY_RETURN_INT(unsigned long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (unsigned long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - if (unlikely(__Pyx_PyLong_IsNeg(x))) { - goto raise_neg_overflow; - } else if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(unsigned long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_DigitCount(x)) { - case 2: - if ((8 * sizeof(unsigned long) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) >= 2 * PyLong_SHIFT)) { - return (unsigned long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - } - } - break; - case 3: - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) >= 3 * PyLong_SHIFT)) { - return (unsigned long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - } - } - break; - case 4: - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) >= 4 * PyLong_SHIFT)) { - return (unsigned long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - } - } - break; - } - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (unsigned long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if ((sizeof(unsigned long) <= sizeof(unsigned long))) { - __PYX_VERIFY_RETURN_INT_EXC(unsigned long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(unsigned long) <= sizeof(unsigned PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(unsigned long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(unsigned long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_SignedDigitCount(x)) { - case -2: - if ((8 * sizeof(unsigned long) - 1 > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) - 1 > 2 * PyLong_SHIFT)) { - return (unsigned long) (((unsigned long)-1)*(((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))); - } - } - break; - case 2: - if ((8 * sizeof(unsigned long) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) - 1 > 2 * PyLong_SHIFT)) { - return (unsigned long) ((((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))); - } - } - break; - case -3: - if ((8 * sizeof(unsigned long) - 1 > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) - 1 > 3 * PyLong_SHIFT)) { - return (unsigned long) (((unsigned long)-1)*(((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))); - } - } - break; - case 3: - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) - 1 > 3 * PyLong_SHIFT)) { - return (unsigned long) ((((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))); - } - } - break; - case -4: - if ((8 * sizeof(unsigned long) - 1 > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) - 1 > 4 * PyLong_SHIFT)) { - return (unsigned long) (((unsigned long)-1)*(((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))); - } - } - break; - case 4: - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(unsigned long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(unsigned long) - 1 > 4 * PyLong_SHIFT)) { - return (unsigned long) ((((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))); - } - } - break; - } - } -#endif - if ((sizeof(unsigned long) <= sizeof(long))) { - __PYX_VERIFY_RETURN_INT_EXC(unsigned long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(unsigned long) <= sizeof(PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(unsigned long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { - unsigned long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); -#if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } -#endif - if (likely(v)) { - int ret = -1; -#if !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); -#else - PyObject *stepval = NULL, *mask = NULL, *shift = NULL; - int bits, remaining_bits, is_negative = 0; - long idigit; - int chunk_size = (sizeof(long) < 8) ? 30 : 62; - if (unlikely(!PyLong_CheckExact(v))) { - PyObject *tmp = v; - v = PyNumber_Long(v); - assert(PyLong_CheckExact(v)); - Py_DECREF(tmp); - if (unlikely(!v)) return (unsigned long) -1; - } -#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(x) == 0) - return (unsigned long) 0; - is_negative = Py_SIZE(x) < 0; -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (unsigned long) -1; - is_negative = result == 1; - } -#endif - if (is_unsigned && unlikely(is_negative)) { - goto raise_neg_overflow; - } else if (is_negative) { - stepval = PyNumber_Invert(v); - if (unlikely(!stepval)) - return (unsigned long) -1; - } else { - stepval = __Pyx_NewRef(v); - } - val = (unsigned long) 0; - mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; - shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; - for (bits = 0; bits < (int) sizeof(unsigned long) * 8 - chunk_size; bits += chunk_size) { - PyObject *tmp, *digit; - digit = PyNumber_And(stepval, mask); - if (unlikely(!digit)) goto done; - idigit = PyLong_AsLong(digit); - Py_DECREF(digit); - if (unlikely(idigit < 0)) goto done; - tmp = PyNumber_Rshift(stepval, shift); - if (unlikely(!tmp)) goto done; - Py_DECREF(stepval); stepval = tmp; - val |= ((unsigned long) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(stepval) == 0) - goto unpacking_done; - #endif - } - idigit = PyLong_AsLong(stepval); - if (unlikely(idigit < 0)) goto done; - remaining_bits = ((int) sizeof(unsigned long) * 8) - bits - (is_unsigned ? 0 : 1); - if (unlikely(idigit >= (1L << remaining_bits))) - goto raise_overflow; - val |= ((unsigned long) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - unpacking_done: - #endif - if (!is_unsigned) { - if (unlikely(val & (((unsigned long) 1) << (sizeof(unsigned long) * 8 - 1)))) - goto raise_overflow; - if (is_negative) - val = ~val; - } - ret = 0; - done: - Py_XDECREF(shift); - Py_XDECREF(mask); - Py_XDECREF(stepval); -#endif - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (unsigned long) -1; - } - } else { - unsigned long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (unsigned long) -1; - val = __Pyx_PyInt_As_unsigned_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to unsigned long"); - return (unsigned long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to unsigned long"); - return (unsigned long) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const char neg_one = (char) -1, const_zero = (char) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if ((sizeof(char) < sizeof(long))) { - __PYX_VERIFY_RETURN_INT(char, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (char) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - if (unlikely(__Pyx_PyLong_IsNeg(x))) { - goto raise_neg_overflow; - } else if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_DigitCount(x)) { - case 2: - if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) >= 2 * PyLong_SHIFT)) { - return (char) (((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - case 3: - if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) >= 3 * PyLong_SHIFT)) { - return (char) (((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - case 4: - if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) >= 4 * PyLong_SHIFT)) { - return (char) (((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0])); - } - } - break; - } - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (char) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if ((sizeof(char) <= sizeof(unsigned long))) { - __PYX_VERIFY_RETURN_INT_EXC(char, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(char) <= sizeof(unsigned PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(char, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(char, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_SignedDigitCount(x)) { - case -2: - if ((8 * sizeof(char) - 1 > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { - return (char) (((char)-1)*(((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 2: - if ((8 * sizeof(char) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { - return (char) ((((((char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case -3: - if ((8 * sizeof(char) - 1 > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { - return (char) (((char)-1)*(((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 3: - if ((8 * sizeof(char) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { - return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case -4: - if ((8 * sizeof(char) - 1 > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { - return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 4: - if ((8 * sizeof(char) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(char) - 1 > 4 * PyLong_SHIFT)) { - return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - } - } -#endif - if ((sizeof(char) <= sizeof(long))) { - __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(char) <= sizeof(PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { - char val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); -#if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } -#endif - if (likely(v)) { - int ret = -1; -#if !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); -#else - PyObject *stepval = NULL, *mask = NULL, *shift = NULL; - int bits, remaining_bits, is_negative = 0; - long idigit; - int chunk_size = (sizeof(long) < 8) ? 30 : 62; - if (unlikely(!PyLong_CheckExact(v))) { - PyObject *tmp = v; - v = PyNumber_Long(v); - assert(PyLong_CheckExact(v)); - Py_DECREF(tmp); - if (unlikely(!v)) return (char) -1; - } -#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(x) == 0) - return (char) 0; - is_negative = Py_SIZE(x) < 0; -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (char) -1; - is_negative = result == 1; - } -#endif - if (is_unsigned && unlikely(is_negative)) { - goto raise_neg_overflow; - } else if (is_negative) { - stepval = PyNumber_Invert(v); - if (unlikely(!stepval)) - return (char) -1; - } else { - stepval = __Pyx_NewRef(v); - } - val = (char) 0; - mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; - shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; - for (bits = 0; bits < (int) sizeof(char) * 8 - chunk_size; bits += chunk_size) { - PyObject *tmp, *digit; - digit = PyNumber_And(stepval, mask); - if (unlikely(!digit)) goto done; - idigit = PyLong_AsLong(digit); - Py_DECREF(digit); - if (unlikely(idigit < 0)) goto done; - tmp = PyNumber_Rshift(stepval, shift); - if (unlikely(!tmp)) goto done; - Py_DECREF(stepval); stepval = tmp; - val |= ((char) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(stepval) == 0) - goto unpacking_done; - #endif - } - idigit = PyLong_AsLong(stepval); - if (unlikely(idigit < 0)) goto done; - remaining_bits = ((int) sizeof(char) * 8) - bits - (is_unsigned ? 0 : 1); - if (unlikely(idigit >= (1L << remaining_bits))) - goto raise_overflow; - val |= ((char) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - unpacking_done: - #endif - if (!is_unsigned) { - if (unlikely(val & (((char) 1) << (sizeof(char) * 8 - 1)))) - goto raise_overflow; - if (is_negative) - val = ~val; - } - ret = 0; - done: - Py_XDECREF(shift); - Py_XDECREF(mask); - Py_XDECREF(stepval); -#endif - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (char) -1; - } - } else { - char val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (char) -1; - val = __Pyx_PyInt_As_char(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to char"); - return (char) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to char"); - return (char) -1; -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint64_t(uint64_t value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const uint64_t neg_one = (uint64_t) -1, const_zero = (uint64_t) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(uint64_t) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(uint64_t) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(uint64_t) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(uint64_t) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(uint64_t) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; -#if !CYTHON_COMPILING_IN_LIMITED_API - return _PyLong_FromByteArray(bytes, sizeof(uint64_t), - little, !is_unsigned); -#else - PyObject *from_bytes, *result = NULL; - PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; - from_bytes = PyObject_GetAttrString((PyObject*)&PyInt_Type, "from_bytes"); - if (!from_bytes) return NULL; - py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(uint64_t)); - if (!py_bytes) goto limited_bad; - order_str = PyUnicode_FromString(little ? "little" : "big"); - if (!order_str) goto limited_bad; - arg_tuple = PyTuple_Pack(2, py_bytes, order_str); - if (!arg_tuple) goto limited_bad; - kwds = PyDict_New(); - if (!kwds) goto limited_bad; - if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(!is_unsigned ? Py_True : Py_False))) goto limited_bad; - result = PyObject_Call(from_bytes, arg_tuple, kwds); - limited_bad: - Py_XDECREF(from_bytes); - Py_XDECREF(py_bytes); - Py_XDECREF(order_str); - Py_XDECREF(arg_tuple); - Py_XDECREF(kwds); - return result; -#endif - } -} - -/* FormatTypeName */ -#if CYTHON_COMPILING_IN_LIMITED_API -static __Pyx_TypeName -__Pyx_PyType_GetName(PyTypeObject* tp) -{ - PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, - __pyx_n_s_name); - if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { - PyErr_Clear(); - Py_XDECREF(name); - name = __Pyx_NewRef(__pyx_n_s__62); - } - return name; -} -#endif - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; -#if !CYTHON_COMPILING_IN_LIMITED_API - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); -#else - PyObject *from_bytes, *result = NULL; - PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; - from_bytes = PyObject_GetAttrString((PyObject*)&PyInt_Type, "from_bytes"); - if (!from_bytes) return NULL; - py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); - if (!py_bytes) goto limited_bad; - order_str = PyUnicode_FromString(little ? "little" : "big"); - if (!order_str) goto limited_bad; - arg_tuple = PyTuple_Pack(2, py_bytes, order_str); - if (!arg_tuple) goto limited_bad; - kwds = PyDict_New(); - if (!kwds) goto limited_bad; - if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(!is_unsigned ? Py_True : Py_False))) goto limited_bad; - result = PyObject_Call(from_bytes, arg_tuple, kwds); - limited_bad: - Py_XDECREF(from_bytes); - Py_XDECREF(py_bytes); - Py_XDECREF(order_str); - Py_XDECREF(arg_tuple); - Py_XDECREF(kwds); - return result; -#endif - } -} - -/* FastTypeChecks */ -#if CYTHON_COMPILING_IN_CPYTHON -static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { - while (a) { - a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); - if (a == b) - return 1; - } - return b == &PyBaseObject_Type; -} -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (a == b) return 1; - mro = a->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(a, b); -} -static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (cls == a || cls == b) return 1; - mro = cls->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - PyObject *base = PyTuple_GET_ITEM(mro, i); - if (base == (PyObject *)a || base == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); -} -#if PY_MAJOR_VERSION == 2 -static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { - PyObject *exception, *value, *tb; - int res; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&exception, &value, &tb); - res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - if (!res) { - res = PyObject_IsSubclass(err, exc_type2); - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - } - __Pyx_ErrRestore(exception, value, tb); - return res; -} -#else -static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { - if (exc_type1) { - return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); - } else { - return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); - } -} -#endif -static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - assert(PyExceptionClass_Check(exc_type)); - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; i<n; i++) { - if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1; - } -#endif - for (i=0; i<n; i++) { - PyObject *t = PyTuple_GET_ITEM(tuple, i); - #if PY_MAJOR_VERSION < 3 - if (likely(exc_type == t)) return 1; - #endif - if (likely(PyExceptionClass_Check(t))) { - if (__Pyx_inner_PyErr_GivenExceptionMatches2(exc_type, NULL, t)) return 1; - } else { - } - } - return 0; -} -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject* exc_type) { - if (likely(err == exc_type)) return 1; - if (likely(PyExceptionClass_Check(err))) { - if (likely(PyExceptionClass_Check(exc_type))) { - return __Pyx_inner_PyErr_GivenExceptionMatches2(err, NULL, exc_type); - } else if (likely(PyTuple_Check(exc_type))) { - return __Pyx_PyErr_GivenExceptionMatchesTuple(err, exc_type); - } else { - } - } - return PyErr_GivenExceptionMatches(err, exc_type); -} -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *exc_type1, PyObject *exc_type2) { - assert(PyExceptionClass_Check(exc_type1)); - assert(PyExceptionClass_Check(exc_type2)); - if (likely(err == exc_type1 || err == exc_type2)) return 1; - if (likely(PyExceptionClass_Check(err))) { - return __Pyx_inner_PyErr_GivenExceptionMatches2(err, exc_type1, exc_type2); - } - return (PyErr_GivenExceptionMatches(err, exc_type1) || PyErr_GivenExceptionMatches(err, exc_type2)); -} -#endif - -/* CheckBinaryVersion */ -static int __Pyx_check_binary_version(void) { - char ctversion[5]; - int same=1, i, found_dot; - const char* rt_from_call = Py_GetVersion(); - PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); - found_dot = 0; - for (i = 0; i < 4; i++) { - if (!ctversion[i]) { - same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); - break; - } - if (rt_from_call[i] != ctversion[i]) { - same = 0; - break; - } - } - if (!same) { - char rtversion[5] = {'\0'}; - char message[200]; - for (i=0; i<4; ++i) { - if (rt_from_call[i] == '.') { - if (found_dot) break; - found_dot = 1; - } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { - break; - } - rtversion[i] = rt_from_call[i]; - } - PyOS_snprintf(message, sizeof(message), - "compile time version %s of module '%.100s' " - "does not match runtime version %s", - ctversion, __Pyx_MODULE_NAME, rtversion); - return PyErr_WarnEx(NULL, message, 1); - } - return 0; -} - -/* InitStrings */ -#if PY_MAJOR_VERSION >= 3 -static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { - if (t.is_unicode | t.is_str) { - if (t.intern) { - *str = PyUnicode_InternFromString(t.s); - } else if (t.encoding) { - *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); - } else { - *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); - } - } else { - *str = PyBytes_FromStringAndSize(t.s, t.n - 1); - } - if (!*str) - return -1; - if (PyObject_Hash(*str) == -1) - return -1; - return 0; -} -#endif -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { - while (t->p) { - #if PY_MAJOR_VERSION >= 3 - __Pyx_InitString(*t, t->p); - #else - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - if (!*t->p) - return -1; - if (PyObject_Hash(*t->p) == -1) - return -1; - #endif - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#if !CYTHON_PEP393_ENABLED -static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -} -#else -static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (likely(PyUnicode_IS_ASCII(o))) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -} -#endif -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { - return __Pyx_PyUnicode_AsStringAndSize(o, length); - } else -#endif -#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { - int retval; - if (unlikely(!x)) return -1; - retval = __Pyx_PyObject_IsTrue(x); - Py_DECREF(x); - return retval; -} -static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { - __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); -#if PY_MAJOR_VERSION >= 3 - if (PyLong_Check(result)) { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " - "The ability to return an instance of a strict subclass of int is deprecated, " - "and may be removed in a future version of Python.", - result_type_name)) { - __Pyx_DECREF_TypeName(result_type_name); - Py_DECREF(result); - return NULL; - } - __Pyx_DECREF_TypeName(result_type_name); - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", - type_name, type_name, result_type_name); - __Pyx_DECREF_TypeName(result_type_name); - Py_DECREF(result); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS - PyNumberMethods *m; -#endif - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x) || PyLong_Check(x))) -#else - if (likely(PyLong_Check(x))) -#endif - return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS - m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = m->nb_int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = m->nb_long(x); - } - #else - if (likely(m && m->nb_int)) { - name = "int"; - res = m->nb_int(x); - } - #endif -#else - if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { - res = PyNumber_Int(x); - } -#endif - if (likely(res)) { -#if PY_MAJOR_VERSION < 3 - if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { -#else - if (unlikely(!PyLong_CheckExact(res))) { -#endif - return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) { - if (sizeof(Py_ssize_t) >= sizeof(long)) - return PyInt_AS_LONG(b); - else - return PyInt_AsSsize_t(b); - } -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_USE_PYLONG_INTERNALS - if (likely(__Pyx_PyLong_IsCompact(b))) { - return __Pyx_PyLong_CompactValue(b); - } else { - const digit* digits = __Pyx_PyLong_Digits(b); - const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); - switch (size) { - case 2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - } - } - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { - if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { - return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); -#if PY_MAJOR_VERSION < 3 - } else if (likely(PyInt_CheckExact(o))) { - return PyInt_AS_LONG(o); -#endif - } else { - Py_ssize_t ival; - PyObject *x; - x = PyNumber_Index(o); - if (!x) return -1; - ival = PyInt_AsLong(x); - Py_DECREF(x); - return ival; - } -} -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { - return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -/* #### Code section: utility_code_pragmas_end ### */ -#ifdef _MSC_VER -#pragma warning( pop ) -#endif - - - -/* #### Code section: end ### */ -#endif /* Py_PYTHON_H */ diff --git a/libs/msgpack/_cmsgpack.cpython-38-darwin.so b/libs/msgpack/_cmsgpack.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..d8eaf4c85d8e037e9de56e0e4ee22b519dad7845 GIT binary patch literal 181448 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ôjU(1Xyl)~)HXRhn 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 Q=&?^YMt|32|9zr=1LU88EC2ui literal 0 HcmV?d00001 diff --git a/libs/msgpack/_cmsgpack.pyx b/libs/msgpack/_cmsgpack.pyx deleted file mode 100644 index 1faaac3aa..000000000 --- a/libs/msgpack/_cmsgpack.pyx +++ /dev/null @@ -1,11 +0,0 @@ -# coding: utf-8 -#cython: embedsignature=True, c_string_encoding=ascii, language_level=3 -from cpython.datetime cimport import_datetime, datetime_new -import_datetime() - -import datetime -cdef object utc = datetime.timezone.utc -cdef object epoch = datetime_new(1970, 1, 1, 0, 0, 0, 0, tz=utc) - -include "_packer.pyx" -include "_unpacker.pyx" diff --git a/libs/msgpack/_packer.pyx b/libs/msgpack/_packer.pyx deleted file mode 100644 index 3c398672b..000000000 --- a/libs/msgpack/_packer.pyx +++ /dev/null @@ -1,374 +0,0 @@ -# coding: utf-8 - -from cpython cimport * -from cpython.bytearray cimport PyByteArray_Check, PyByteArray_CheckExact -from cpython.datetime cimport ( - PyDateTime_CheckExact, PyDelta_CheckExact, - datetime_tzinfo, timedelta_days, timedelta_seconds, timedelta_microseconds, -) - -cdef ExtType -cdef Timestamp - -from .ext import ExtType, Timestamp - - -cdef extern from "Python.h": - - int PyMemoryView_Check(object obj) - char* PyUnicode_AsUTF8AndSize(object obj, Py_ssize_t *l) except NULL - - -cdef extern from "pack.h": - struct msgpack_packer: - char* buf - size_t length - size_t buf_size - bint use_bin_type - - int msgpack_pack_int(msgpack_packer* pk, int d) - int msgpack_pack_nil(msgpack_packer* pk) - int msgpack_pack_true(msgpack_packer* pk) - int msgpack_pack_false(msgpack_packer* pk) - int msgpack_pack_long(msgpack_packer* pk, long d) - int msgpack_pack_long_long(msgpack_packer* pk, long long d) - int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d) - int msgpack_pack_float(msgpack_packer* pk, float d) - int msgpack_pack_double(msgpack_packer* pk, double d) - int msgpack_pack_array(msgpack_packer* pk, size_t l) - int msgpack_pack_map(msgpack_packer* pk, size_t l) - int msgpack_pack_raw(msgpack_packer* pk, size_t l) - int msgpack_pack_bin(msgpack_packer* pk, size_t l) - int msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l) - int msgpack_pack_ext(msgpack_packer* pk, char typecode, size_t l) - int msgpack_pack_timestamp(msgpack_packer* x, long long seconds, unsigned long nanoseconds); - int msgpack_pack_unicode(msgpack_packer* pk, object o, long long limit) - -cdef extern from "buff_converter.h": - object buff_to_buff(char *, Py_ssize_t) - -cdef int DEFAULT_RECURSE_LIMIT=511 -cdef long long ITEM_LIMIT = (2**32)-1 - - -cdef inline int PyBytesLike_Check(object o): - return PyBytes_Check(o) or PyByteArray_Check(o) - - -cdef inline int PyBytesLike_CheckExact(object o): - return PyBytes_CheckExact(o) or PyByteArray_CheckExact(o) - - -cdef class Packer(object): - """ - MessagePack Packer - - Usage:: - - packer = Packer() - astream.write(packer.pack(a)) - astream.write(packer.pack(b)) - - Packer's constructor has some keyword arguments: - - :param default: - When specified, it should be callable. - Convert user type to builtin type that Packer supports. - See also simplejson's document. - - :param bool use_single_float: - Use single precision float type for float. (default: False) - - :param bool autoreset: - Reset buffer after each pack and return its content as `bytes`. (default: True). - If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. - - :param bool use_bin_type: - Use bin type introduced in msgpack spec 2.0 for bytes. - It also enables str8 type for unicode. (default: True) - - :param bool strict_types: - If set to true, types will be checked to be exact. Derived classes - from serializeable types will not be serialized and will be - treated as unsupported type and forwarded to default. - Additionally tuples will not be serialized as lists. - This is useful when trying to implement accurate serialization - for python types. - - :param bool datetime: - If set to true, datetime with tzinfo is packed into Timestamp type. - Note that the tzinfo is stripped in the timestamp. - You can get UTC datetime with `timestamp=3` option of the Unpacker. - - :param str unicode_errors: - The error handler for encoding unicode. (default: 'strict') - DO NOT USE THIS!! This option is kept for very specific usage. - """ - cdef msgpack_packer pk - cdef object _default - cdef object _berrors - cdef const char *unicode_errors - cdef bint strict_types - cdef bint use_float - cdef bint autoreset - cdef bint datetime - - def __cinit__(self): - cdef int buf_size = 1024*1024 - self.pk.buf = <char*> PyMem_Malloc(buf_size) - if self.pk.buf == NULL: - raise MemoryError("Unable to allocate internal buffer.") - self.pk.buf_size = buf_size - self.pk.length = 0 - - def __init__(self, *, default=None, - bint use_single_float=False, bint autoreset=True, bint use_bin_type=True, - bint strict_types=False, bint datetime=False, unicode_errors=None): - self.use_float = use_single_float - self.strict_types = strict_types - self.autoreset = autoreset - self.datetime = datetime - self.pk.use_bin_type = use_bin_type - if default is not None: - if not PyCallable_Check(default): - raise TypeError("default must be a callable.") - self._default = default - - self._berrors = unicode_errors - if unicode_errors is None: - self.unicode_errors = NULL - else: - self.unicode_errors = self._berrors - - def __dealloc__(self): - PyMem_Free(self.pk.buf) - self.pk.buf = NULL - - cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: - cdef long long llval - cdef unsigned long long ullval - cdef unsigned long ulval - cdef long longval - cdef float fval - cdef double dval - cdef char* rawval - cdef int ret - cdef dict d - cdef Py_ssize_t L - cdef int default_used = 0 - cdef bint strict_types = self.strict_types - cdef Py_buffer view - - if nest_limit < 0: - raise ValueError("recursion limit exceeded.") - - while True: - if o is None: - ret = msgpack_pack_nil(&self.pk) - elif o is True: - ret = msgpack_pack_true(&self.pk) - elif o is False: - ret = msgpack_pack_false(&self.pk) - elif PyLong_CheckExact(o) if strict_types else PyLong_Check(o): - # PyInt_Check(long) is True for Python 3. - # So we should test long before int. - try: - if o > 0: - ullval = o - ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) - else: - llval = o - ret = msgpack_pack_long_long(&self.pk, llval) - except OverflowError as oe: - if not default_used and self._default is not None: - o = self._default(o) - default_used = True - continue - else: - raise OverflowError("Integer value out of range") - elif PyInt_CheckExact(o) if strict_types else PyInt_Check(o): - longval = o - ret = msgpack_pack_long(&self.pk, longval) - elif PyFloat_CheckExact(o) if strict_types else PyFloat_Check(o): - if self.use_float: - fval = o - ret = msgpack_pack_float(&self.pk, fval) - else: - dval = o - ret = msgpack_pack_double(&self.pk, dval) - elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o): - L = Py_SIZE(o) - if L > ITEM_LIMIT: - PyErr_Format(ValueError, b"%.200s object is too large", Py_TYPE(o).tp_name) - rawval = o - ret = msgpack_pack_bin(&self.pk, L) - if ret == 0: - ret = msgpack_pack_raw_body(&self.pk, rawval, L) - elif PyUnicode_CheckExact(o) if strict_types else PyUnicode_Check(o): - if self.unicode_errors == NULL: - ret = msgpack_pack_unicode(&self.pk, o, ITEM_LIMIT); - if ret == -2: - raise ValueError("unicode string is too large") - else: - o = PyUnicode_AsEncodedString(o, NULL, self.unicode_errors) - L = Py_SIZE(o) - if L > ITEM_LIMIT: - raise ValueError("unicode string is too large") - ret = msgpack_pack_raw(&self.pk, L) - if ret == 0: - rawval = o - ret = msgpack_pack_raw_body(&self.pk, rawval, L) - elif PyDict_CheckExact(o): - d = <dict>o - L = len(d) - if L > ITEM_LIMIT: - raise ValueError("dict is too large") - ret = msgpack_pack_map(&self.pk, L) - if ret == 0: - for k, v in d.items(): - ret = self._pack(k, nest_limit-1) - if ret != 0: break - ret = self._pack(v, nest_limit-1) - if ret != 0: break - elif not strict_types and PyDict_Check(o): - L = len(o) - if L > ITEM_LIMIT: - raise ValueError("dict is too large") - ret = msgpack_pack_map(&self.pk, L) - if ret == 0: - for k, v in o.items(): - ret = self._pack(k, nest_limit-1) - if ret != 0: break - ret = self._pack(v, nest_limit-1) - if ret != 0: break - elif type(o) is ExtType if strict_types else isinstance(o, ExtType): - # This should be before Tuple because ExtType is namedtuple. - longval = o.code - rawval = o.data - L = len(o.data) - if L > ITEM_LIMIT: - raise ValueError("EXT data is too large") - ret = msgpack_pack_ext(&self.pk, longval, L) - ret = msgpack_pack_raw_body(&self.pk, rawval, L) - elif type(o) is Timestamp: - llval = o.seconds - ulval = o.nanoseconds - ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - elif PyList_CheckExact(o) if strict_types else (PyTuple_Check(o) or PyList_Check(o)): - L = Py_SIZE(o) - if L > ITEM_LIMIT: - raise ValueError("list is too large") - ret = msgpack_pack_array(&self.pk, L) - if ret == 0: - for v in o: - ret = self._pack(v, nest_limit-1) - if ret != 0: break - elif PyMemoryView_Check(o): - if PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) != 0: - raise ValueError("could not get buffer for memoryview") - L = view.len - if L > ITEM_LIMIT: - PyBuffer_Release(&view); - raise ValueError("memoryview is too large") - ret = msgpack_pack_bin(&self.pk, L) - if ret == 0: - ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L) - PyBuffer_Release(&view); - elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None: - delta = o - epoch - if not PyDelta_CheckExact(delta): - raise ValueError("failed to calculate delta") - llval = timedelta_days(delta) * <long long>(24*60*60) + timedelta_seconds(delta) - ulval = timedelta_microseconds(delta) * 1000 - ret = msgpack_pack_timestamp(&self.pk, llval, ulval) - elif not default_used and self._default: - o = self._default(o) - default_used = 1 - continue - elif self.datetime and PyDateTime_CheckExact(o): - PyErr_Format(ValueError, b"can not serialize '%.200s' object where tzinfo=None", Py_TYPE(o).tp_name) - else: - PyErr_Format(TypeError, b"can not serialize '%.200s' object", Py_TYPE(o).tp_name) - return ret - - cpdef pack(self, object obj): - cdef int ret - try: - ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) - except: - self.pk.length = 0 - raise - if ret: # should not happen. - raise RuntimeError("internal error") - if self.autoreset: - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - def pack_ext_type(self, typecode, data): - msgpack_pack_ext(&self.pk, typecode, len(data)) - msgpack_pack_raw_body(&self.pk, data, len(data)) - - def pack_array_header(self, long long size): - if size > ITEM_LIMIT: - raise ValueError - cdef int ret = msgpack_pack_array(&self.pk, size) - if ret == -1: - raise MemoryError - elif ret: # should not happen - raise TypeError - if self.autoreset: - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - def pack_map_header(self, long long size): - if size > ITEM_LIMIT: - raise ValueError - cdef int ret = msgpack_pack_map(&self.pk, size) - if ret == -1: - raise MemoryError - elif ret: # should not happen - raise TypeError - if self.autoreset: - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - def pack_map_pairs(self, object pairs): - """ - Pack *pairs* as msgpack map type. - - *pairs* should be a sequence of pairs. - (`len(pairs)` and `for k, v in pairs:` should be supported.) - """ - cdef int ret = msgpack_pack_map(&self.pk, len(pairs)) - if ret == 0: - for k, v in pairs: - ret = self._pack(k) - if ret != 0: break - ret = self._pack(v) - if ret != 0: break - if ret == -1: - raise MemoryError - elif ret: # should not happen - raise TypeError - if self.autoreset: - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - def reset(self): - """Reset internal buffer. - - This method is useful only when autoreset=False. - """ - self.pk.length = 0 - - def bytes(self): - """Return internal buffer contents as bytes object""" - return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - - def getbuffer(self): - """Return view of internal buffer.""" - return buff_to_buff(self.pk.buf, self.pk.length) diff --git a/libs/msgpack/_unpacker.pyx b/libs/msgpack/_unpacker.pyx deleted file mode 100644 index 56126f436..000000000 --- a/libs/msgpack/_unpacker.pyx +++ /dev/null @@ -1,547 +0,0 @@ -# coding: utf-8 - -from cpython cimport * -cdef extern from "Python.h": - ctypedef struct PyObject - object PyMemoryView_GetContiguous(object obj, int buffertype, char order) - -from libc.stdlib cimport * -from libc.string cimport * -from libc.limits cimport * -from libc.stdint cimport uint64_t - -from .exceptions import ( - BufferFull, - OutOfData, - ExtraData, - FormatError, - StackError, -) -from .ext import ExtType, Timestamp - -cdef object giga = 1_000_000_000 - - -cdef extern from "unpack.h": - ctypedef struct msgpack_user: - bint use_list - bint raw - bint has_pairs_hook # call object_hook with k-v pairs - bint strict_map_key - int timestamp - PyObject* object_hook - PyObject* list_hook - PyObject* ext_hook - PyObject* timestamp_t - PyObject *giga; - PyObject *utc; - char *unicode_errors - Py_ssize_t max_str_len - Py_ssize_t max_bin_len - Py_ssize_t max_array_len - Py_ssize_t max_map_len - Py_ssize_t max_ext_len - - ctypedef struct unpack_context: - msgpack_user user - PyObject* obj - Py_ssize_t count - - ctypedef int (*execute_fn)(unpack_context* ctx, const char* data, - Py_ssize_t len, Py_ssize_t* off) except? -1 - execute_fn unpack_construct - execute_fn unpack_skip - execute_fn read_array_header - execute_fn read_map_header - void unpack_init(unpack_context* ctx) - object unpack_data(unpack_context* ctx) - void unpack_clear(unpack_context* ctx) - -cdef inline init_ctx(unpack_context *ctx, - object object_hook, object object_pairs_hook, - object list_hook, object ext_hook, - bint use_list, bint raw, int timestamp, - bint strict_map_key, - const char* unicode_errors, - Py_ssize_t max_str_len, Py_ssize_t max_bin_len, - Py_ssize_t max_array_len, Py_ssize_t max_map_len, - Py_ssize_t max_ext_len): - unpack_init(ctx) - ctx.user.use_list = use_list - ctx.user.raw = raw - ctx.user.strict_map_key = strict_map_key - ctx.user.object_hook = ctx.user.list_hook = <PyObject*>NULL - ctx.user.max_str_len = max_str_len - ctx.user.max_bin_len = max_bin_len - ctx.user.max_array_len = max_array_len - ctx.user.max_map_len = max_map_len - ctx.user.max_ext_len = max_ext_len - - if object_hook is not None and object_pairs_hook is not None: - raise TypeError("object_pairs_hook and object_hook are mutually exclusive.") - - if object_hook is not None: - if not PyCallable_Check(object_hook): - raise TypeError("object_hook must be a callable.") - ctx.user.object_hook = <PyObject*>object_hook - - if object_pairs_hook is None: - ctx.user.has_pairs_hook = False - else: - if not PyCallable_Check(object_pairs_hook): - raise TypeError("object_pairs_hook must be a callable.") - ctx.user.object_hook = <PyObject*>object_pairs_hook - ctx.user.has_pairs_hook = True - - if list_hook is not None: - if not PyCallable_Check(list_hook): - raise TypeError("list_hook must be a callable.") - ctx.user.list_hook = <PyObject*>list_hook - - if ext_hook is not None: - if not PyCallable_Check(ext_hook): - raise TypeError("ext_hook must be a callable.") - ctx.user.ext_hook = <PyObject*>ext_hook - - if timestamp < 0 or 3 < timestamp: - raise ValueError("timestamp must be 0..3") - - # Add Timestamp type to the user object so it may be used in unpack.h - ctx.user.timestamp = timestamp - ctx.user.timestamp_t = <PyObject*>Timestamp - ctx.user.giga = <PyObject*>giga - ctx.user.utc = <PyObject*>utc - ctx.user.unicode_errors = unicode_errors - -def default_read_extended_type(typecode, data): - raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) - -cdef inline int get_data_from_buffer(object obj, - Py_buffer *view, - char **buf, - Py_ssize_t *buffer_len) except 0: - cdef object contiguous - cdef Py_buffer tmp - if PyObject_GetBuffer(obj, view, PyBUF_FULL_RO) == -1: - raise - if view.itemsize != 1: - PyBuffer_Release(view) - raise BufferError("cannot unpack from multi-byte object") - if PyBuffer_IsContiguous(view, b'A') == 0: - PyBuffer_Release(view) - # create a contiguous copy and get buffer - contiguous = PyMemoryView_GetContiguous(obj, PyBUF_READ, b'C') - PyObject_GetBuffer(contiguous, view, PyBUF_SIMPLE) - # view must hold the only reference to contiguous, - # so memory is freed when view is released - Py_DECREF(contiguous) - buffer_len[0] = view.len - buf[0] = <char*> view.buf - return 1 - - -def unpackb(object packed, *, object object_hook=None, object list_hook=None, - bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - unicode_errors=None, - object_pairs_hook=None, ext_hook=ExtType, - Py_ssize_t max_str_len=-1, - Py_ssize_t max_bin_len=-1, - Py_ssize_t max_array_len=-1, - Py_ssize_t max_map_len=-1, - Py_ssize_t max_ext_len=-1): - """ - Unpack packed_bytes to object. Returns an unpacked object. - - Raises ``ExtraData`` when *packed* contains extra bytes. - Raises ``ValueError`` when *packed* is incomplete. - Raises ``FormatError`` when *packed* is not valid msgpack. - Raises ``StackError`` when *packed* contains too nested. - Other exceptions can be raised during unpacking. - - See :class:`Unpacker` for options. - - *max_xxx_len* options are configured automatically from ``len(packed)``. - """ - cdef unpack_context ctx - cdef Py_ssize_t off = 0 - cdef int ret - - cdef Py_buffer view - cdef char* buf = NULL - cdef Py_ssize_t buf_len - cdef const char* cerr = NULL - - if unicode_errors is not None: - cerr = unicode_errors - - get_data_from_buffer(packed, &view, &buf, &buf_len) - - if max_str_len == -1: - max_str_len = buf_len - if max_bin_len == -1: - max_bin_len = buf_len - if max_array_len == -1: - max_array_len = buf_len - if max_map_len == -1: - max_map_len = buf_len//2 - if max_ext_len == -1: - max_ext_len = buf_len - - try: - init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, ext_hook, - use_list, raw, timestamp, strict_map_key, cerr, - max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len) - ret = unpack_construct(&ctx, buf, buf_len, &off) - finally: - PyBuffer_Release(&view); - - if ret == 1: - obj = unpack_data(&ctx) - if off < buf_len: - raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) - return obj - unpack_clear(&ctx) - if ret == 0: - raise ValueError("Unpack failed: incomplete input") - elif ret == -2: - raise FormatError - elif ret == -3: - raise StackError - raise ValueError("Unpack failed: error = %d" % (ret,)) - - -cdef class Unpacker(object): - """Streaming unpacker. - - Arguments: - - :param file_like: - File-like object having `.read(n)` method. - If specified, unpacker reads serialized data from it and `.feed()` is not usable. - - :param int read_size: - Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) - - :param bool use_list: - If true, unpack msgpack array to Python list. - Otherwise, unpack to Python tuple. (default: True) - - :param bool raw: - If true, unpack msgpack raw to Python bytes. - Otherwise, unpack to Python str by decoding with UTF-8 encoding (default). - - :param int timestamp: - Control how timestamp type is unpacked: - - 0 - Timestamp - 1 - float (Seconds from the EPOCH) - 2 - int (Nanoseconds from the EPOCH) - 3 - datetime.datetime (UTC). - - :param bool strict_map_key: - If true (default), only str or bytes are accepted for map (dict) keys. - - :param object_hook: - When specified, it should be callable. - Unpacker calls it with a dict argument after unpacking msgpack map. - (See also simplejson) - - :param object_pairs_hook: - When specified, it should be callable. - Unpacker calls it with a list of key-value pairs after unpacking msgpack map. - (See also simplejson) - - :param str unicode_errors: - The error handler for decoding unicode. (default: 'strict') - This option should be used only when you have msgpack data which - contains invalid UTF-8 string. - - :param int max_buffer_size: - Limits size of data waiting unpacked. 0 means 2**32-1. - The default value is 100*1024*1024 (100MiB). - Raises `BufferFull` exception when it is insufficient. - You should set this parameter when unpacking data from untrusted source. - - :param int max_str_len: - Deprecated, use *max_buffer_size* instead. - Limits max length of str. (default: max_buffer_size) - - :param int max_bin_len: - Deprecated, use *max_buffer_size* instead. - Limits max length of bin. (default: max_buffer_size) - - :param int max_array_len: - Limits max length of array. - (default: max_buffer_size) - - :param int max_map_len: - Limits max length of map. - (default: max_buffer_size//2) - - :param int max_ext_len: - Deprecated, use *max_buffer_size* instead. - Limits max size of ext type. (default: max_buffer_size) - - Example of streaming deserialize from file-like object:: - - unpacker = Unpacker(file_like) - for o in unpacker: - process(o) - - Example of streaming deserialize from socket:: - - unpacker = Unpacker() - while True: - buf = sock.recv(1024**2) - if not buf: - break - unpacker.feed(buf) - for o in unpacker: - process(o) - - Raises ``ExtraData`` when *packed* contains extra bytes. - Raises ``OutOfData`` when *packed* is incomplete. - Raises ``FormatError`` when *packed* is not valid msgpack. - Raises ``StackError`` when *packed* contains too nested. - Other exceptions can be raised during unpacking. - """ - cdef unpack_context ctx - cdef char* buf - cdef Py_ssize_t buf_size, buf_head, buf_tail - cdef object file_like - cdef object file_like_read - cdef Py_ssize_t read_size - # To maintain refcnt. - cdef object object_hook, object_pairs_hook, list_hook, ext_hook - cdef object unicode_errors - cdef Py_ssize_t max_buffer_size - cdef uint64_t stream_offset - - def __cinit__(self): - self.buf = NULL - - def __dealloc__(self): - PyMem_Free(self.buf) - self.buf = NULL - - def __init__(self, file_like=None, *, Py_ssize_t read_size=0, - bint use_list=True, bint raw=False, int timestamp=0, bint strict_map_key=True, - object object_hook=None, object object_pairs_hook=None, object list_hook=None, - unicode_errors=None, Py_ssize_t max_buffer_size=100*1024*1024, - object ext_hook=ExtType, - Py_ssize_t max_str_len=-1, - Py_ssize_t max_bin_len=-1, - Py_ssize_t max_array_len=-1, - Py_ssize_t max_map_len=-1, - Py_ssize_t max_ext_len=-1): - cdef const char *cerr=NULL - - self.object_hook = object_hook - self.object_pairs_hook = object_pairs_hook - self.list_hook = list_hook - self.ext_hook = ext_hook - - self.file_like = file_like - if file_like: - self.file_like_read = file_like.read - if not PyCallable_Check(self.file_like_read): - raise TypeError("`file_like.read` must be a callable.") - - if not max_buffer_size: - max_buffer_size = INT_MAX - if max_str_len == -1: - max_str_len = max_buffer_size - if max_bin_len == -1: - max_bin_len = max_buffer_size - if max_array_len == -1: - max_array_len = max_buffer_size - if max_map_len == -1: - max_map_len = max_buffer_size//2 - if max_ext_len == -1: - max_ext_len = max_buffer_size - - if read_size > max_buffer_size: - raise ValueError("read_size should be less or equal to max_buffer_size") - if not read_size: - read_size = min(max_buffer_size, 1024**2) - - self.max_buffer_size = max_buffer_size - self.read_size = read_size - self.buf = <char*>PyMem_Malloc(read_size) - if self.buf == NULL: - raise MemoryError("Unable to allocate internal buffer.") - self.buf_size = read_size - self.buf_head = 0 - self.buf_tail = 0 - self.stream_offset = 0 - - if unicode_errors is not None: - self.unicode_errors = unicode_errors - cerr = unicode_errors - - init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook, - ext_hook, use_list, raw, timestamp, strict_map_key, cerr, - max_str_len, max_bin_len, max_array_len, - max_map_len, max_ext_len) - - def feed(self, object next_bytes): - """Append `next_bytes` to internal buffer.""" - cdef Py_buffer pybuff - cdef char* buf - cdef Py_ssize_t buf_len - - if self.file_like is not None: - raise AssertionError( - "unpacker.feed() is not be able to use with `file_like`.") - - get_data_from_buffer(next_bytes, &pybuff, &buf, &buf_len) - try: - self.append_buffer(buf, buf_len) - finally: - PyBuffer_Release(&pybuff) - - cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len): - cdef: - char* buf = self.buf - char* new_buf - Py_ssize_t head = self.buf_head - Py_ssize_t tail = self.buf_tail - Py_ssize_t buf_size = self.buf_size - Py_ssize_t new_size - - if tail + _buf_len > buf_size: - if ((tail - head) + _buf_len) <= buf_size: - # move to front. - memmove(buf, buf + head, tail - head) - tail -= head - head = 0 - else: - # expand buffer. - new_size = (tail-head) + _buf_len - if new_size > self.max_buffer_size: - raise BufferFull - new_size = min(new_size*2, self.max_buffer_size) - new_buf = <char*>PyMem_Malloc(new_size) - if new_buf == NULL: - # self.buf still holds old buffer and will be freed during - # obj destruction - raise MemoryError("Unable to enlarge internal buffer.") - memcpy(new_buf, buf + head, tail - head) - PyMem_Free(buf) - - buf = new_buf - buf_size = new_size - tail -= head - head = 0 - - memcpy(buf + tail, <char*>(_buf), _buf_len) - self.buf = buf - self.buf_head = head - self.buf_size = buf_size - self.buf_tail = tail + _buf_len - - cdef int read_from_file(self) except -1: - cdef Py_ssize_t remains = self.max_buffer_size - (self.buf_tail - self.buf_head) - if remains <= 0: - raise BufferFull - - next_bytes = self.file_like_read(min(self.read_size, remains)) - if next_bytes: - self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes)) - else: - self.file_like = None - return 0 - - cdef object _unpack(self, execute_fn execute, bint iter=0): - cdef int ret - cdef object obj - cdef Py_ssize_t prev_head - - while 1: - prev_head = self.buf_head - if prev_head < self.buf_tail: - ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) - self.stream_offset += self.buf_head - prev_head - else: - ret = 0 - - if ret == 1: - obj = unpack_data(&self.ctx) - unpack_init(&self.ctx) - return obj - elif ret == 0: - if self.file_like is not None: - self.read_from_file() - continue - if iter: - raise StopIteration("No more data to unpack.") - else: - raise OutOfData("No more data to unpack.") - elif ret == -2: - raise FormatError - elif ret == -3: - raise StackError - else: - raise ValueError("Unpack failed: error = %d" % (ret,)) - - def read_bytes(self, Py_ssize_t nbytes): - """Read a specified number of raw bytes from the stream""" - cdef Py_ssize_t nread - nread = min(self.buf_tail - self.buf_head, nbytes) - ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread) - self.buf_head += nread - if nread < nbytes and self.file_like is not None: - ret += self.file_like.read(nbytes - nread) - nread = len(ret) - self.stream_offset += nread - return ret - - def unpack(self): - """Unpack one object - - Raises `OutOfData` when there are no more bytes to unpack. - """ - return self._unpack(unpack_construct) - - def skip(self): - """Read and ignore one object, returning None - - Raises `OutOfData` when there are no more bytes to unpack. - """ - return self._unpack(unpack_skip) - - def read_array_header(self): - """assuming the next object is an array, return its size n, such that - the next n unpack() calls will iterate over its contents. - - Raises `OutOfData` when there are no more bytes to unpack. - """ - return self._unpack(read_array_header) - - def read_map_header(self): - """assuming the next object is a map, return its size n, such that the - next n * 2 unpack() calls will iterate over its key-value pairs. - - Raises `OutOfData` when there are no more bytes to unpack. - """ - return self._unpack(read_map_header) - - def tell(self): - """Returns the current position of the Unpacker in bytes, i.e., the - number of bytes that were read from the input, also the starting - position of the next object. - """ - return self.stream_offset - - def __iter__(self): - return self - - def __next__(self): - return self._unpack(unpack_construct, 1) - - # for debug. - #def _buf(self): - # return PyString_FromStringAndSize(self.buf, self.buf_tail) - - #def _off(self): - # return self.buf_head diff --git a/libs/msgpack/buff_converter.h b/libs/msgpack/buff_converter.h deleted file mode 100644 index 86b4196df..000000000 --- a/libs/msgpack/buff_converter.h +++ /dev/null @@ -1,8 +0,0 @@ -#include "Python.h" - -/* cython does not support this preprocessor check => write it in raw C */ -static PyObject * -buff_to_buff(char *buff, Py_ssize_t size) -{ - return PyMemoryView_FromMemory(buff, size, PyBUF_READ); -} diff --git a/libs/msgpack/ext.py b/libs/msgpack/ext.py index 02c2c4300..9694819a7 100644 --- a/libs/msgpack/ext.py +++ b/libs/msgpack/ext.py @@ -1,6 +1,6 @@ -from collections import namedtuple import datetime import struct +from collections import namedtuple class ExtType(namedtuple("ExtType", "code data")): @@ -157,7 +157,9 @@ def to_datetime(self): :rtype: `datetime.datetime` """ utc = datetime.timezone.utc - return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta(seconds=self.to_unix()) + return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta( + seconds=self.seconds, microseconds=self.nanoseconds // 1000 + ) @staticmethod def from_datetime(dt): @@ -165,4 +167,4 @@ def from_datetime(dt): :rtype: Timestamp """ - return Timestamp.from_unix(dt.timestamp()) + return Timestamp(seconds=int(dt.timestamp()), nanoseconds=dt.microsecond * 1000) diff --git a/libs/msgpack/fallback.py b/libs/msgpack/fallback.py index a174162af..b02e47cfb 100644 --- a/libs/msgpack/fallback.py +++ b/libs/msgpack/fallback.py @@ -1,27 +1,22 @@ """Fallback pure Python implementation of msgpack""" -from datetime import datetime as _DateTime -import sys -import struct +import struct +import sys +from datetime import datetime as _DateTime if hasattr(sys, "pypy_version_info"): - # StringIO is slow on PyPy, StringIO is faster. However: PyPy's own - # StringBuilder is fastest. from __pypy__ import newlist_hint + from __pypy__.builders import BytesBuilder - try: - from __pypy__.builders import BytesBuilder as StringBuilder - except ImportError: - from __pypy__.builders import StringBuilder - USING_STRINGBUILDER = True + _USING_STRINGBUILDER = True - class StringIO: + class BytesIO: def __init__(self, s=b""): if s: - self.builder = StringBuilder(len(s)) + self.builder = BytesBuilder(len(s)) self.builder.append(s) else: - self.builder = StringBuilder() + self.builder = BytesBuilder() def write(self, s): if isinstance(s, memoryview): @@ -34,17 +29,17 @@ def getvalue(self): return self.builder.build() else: - USING_STRINGBUILDER = False - from io import BytesIO as StringIO + from io import BytesIO - newlist_hint = lambda size: [] + _USING_STRINGBUILDER = False + def newlist_hint(size): + return [] -from .exceptions import BufferFull, OutOfData, ExtraData, FormatError, StackError +from .exceptions import BufferFull, ExtraData, FormatError, OutOfData, StackError from .ext import ExtType, Timestamp - EX_SKIP = 0 EX_CONSTRUCT = 1 EX_READ_ARRAY_HEADER = 2 @@ -231,6 +226,7 @@ class Unpacker: def __init__( self, file_like=None, + *, read_size=0, use_list=True, raw=False, @@ -333,6 +329,7 @@ def feed(self, next_bytes): # Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython self._buffer.extend(view) + view.release() def _consume(self): """Gets rid of the used parts of the buffer.""" @@ -649,32 +646,13 @@ class Packer: The error handler for encoding unicode. (default: 'strict') DO NOT USE THIS!! This option is kept for very specific usage. - Example of streaming deserialize from file-like object:: - - unpacker = Unpacker(file_like) - for o in unpacker: - process(o) - - Example of streaming deserialize from socket:: - - unpacker = Unpacker() - while True: - buf = sock.recv(1024**2) - if not buf: - break - unpacker.feed(buf) - for o in unpacker: - process(o) - - Raises ``ExtraData`` when *packed* contains extra bytes. - Raises ``OutOfData`` when *packed* is incomplete. - Raises ``FormatError`` when *packed* is not valid msgpack. - Raises ``StackError`` when *packed* contains too nested. - Other exceptions can be raised during unpacking. + :param int buf_size: + Internal buffer size. This option is used only for C implementation. """ def __init__( self, + *, default=None, use_single_float=False, autoreset=True, @@ -682,17 +660,17 @@ def __init__( strict_types=False, datetime=False, unicode_errors=None, + buf_size=None, ): self._strict_types = strict_types self._use_float = use_single_float self._autoreset = autoreset self._use_bin_type = use_bin_type - self._buffer = StringIO() + self._buffer = BytesIO() self._datetime = bool(datetime) self._unicode_errors = unicode_errors or "strict" - if default is not None: - if not callable(default): - raise TypeError("default must be callable") + if default is not None and not callable(default): + raise TypeError("default must be callable") self._default = default def _pack( @@ -823,18 +801,18 @@ def pack(self, obj): try: self._pack(obj) except: - self._buffer = StringIO() # force reset + self._buffer = BytesIO() # force reset raise if self._autoreset: ret = self._buffer.getvalue() - self._buffer = StringIO() + self._buffer = BytesIO() return ret def pack_map_pairs(self, pairs): self._pack_map_pairs(len(pairs), pairs) if self._autoreset: ret = self._buffer.getvalue() - self._buffer = StringIO() + self._buffer = BytesIO() return ret def pack_array_header(self, n): @@ -843,7 +821,7 @@ def pack_array_header(self, n): self._pack_array_header(n) if self._autoreset: ret = self._buffer.getvalue() - self._buffer = StringIO() + self._buffer = BytesIO() return ret def pack_map_header(self, n): @@ -852,7 +830,7 @@ def pack_map_header(self, n): self._pack_map_header(n) if self._autoreset: ret = self._buffer.getvalue() - self._buffer = StringIO() + self._buffer = BytesIO() return ret def pack_ext_type(self, typecode, data): @@ -941,11 +919,11 @@ def reset(self): This method is useful only when autoreset=False. """ - self._buffer = StringIO() + self._buffer = BytesIO() def getbuffer(self): """Return view of internal buffer.""" - if USING_STRINGBUILDER: + if _USING_STRINGBUILDER: return memoryview(self.bytes()) else: return self._buffer.getbuffer() diff --git a/libs/msgpack/pack.h b/libs/msgpack/pack.h deleted file mode 100644 index 2453428ca..000000000 --- a/libs/msgpack/pack.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * MessagePack for Python packing routine - * - * Copyright (C) 2009 Naoki INADA - * - * 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. - */ - -#include <stddef.h> -#include <stdlib.h> -#include "sysdep.h" -#include <limits.h> -#include <string.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct msgpack_packer { - char *buf; - size_t length; - size_t buf_size; - bool use_bin_type; -} msgpack_packer; - -typedef struct Packer Packer; - -static inline int msgpack_pack_write(msgpack_packer* pk, const char *data, size_t l) -{ - char* buf = pk->buf; - size_t bs = pk->buf_size; - size_t len = pk->length; - - if (len + l > bs) { - bs = (len + l) * 2; - buf = (char*)PyMem_Realloc(buf, bs); - if (!buf) { - PyErr_NoMemory(); - return -1; - } - } - memcpy(buf + len, data, l); - len += l; - - pk->buf = buf; - pk->buf_size = bs; - pk->length = len; - return 0; -} - -#define msgpack_pack_append_buffer(user, buf, len) \ - return msgpack_pack_write(user, (const char*)buf, len) - -#include "pack_template.h" - -// return -2 when o is too long -static inline int -msgpack_pack_unicode(msgpack_packer *pk, PyObject *o, long long limit) -{ - assert(PyUnicode_Check(o)); - - Py_ssize_t len; - const char* buf = PyUnicode_AsUTF8AndSize(o, &len); - if (buf == NULL) - return -1; - - if (len > limit) { - return -2; - } - - int ret = msgpack_pack_raw(pk, len); - if (ret) return ret; - - return msgpack_pack_raw_body(pk, buf, len); -} - -#ifdef __cplusplus -} -#endif diff --git a/libs/msgpack/pack_template.h b/libs/msgpack/pack_template.h deleted file mode 100644 index 7d479b6d4..000000000 --- a/libs/msgpack/pack_template.h +++ /dev/null @@ -1,820 +0,0 @@ -/* - * MessagePack packing routine template - * - * Copyright (C) 2008-2010 FURUHASHI Sadayuki - * - * 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. - */ - -#if defined(__LITTLE_ENDIAN__) -#define TAKE8_8(d) ((uint8_t*)&d)[0] -#define TAKE8_16(d) ((uint8_t*)&d)[0] -#define TAKE8_32(d) ((uint8_t*)&d)[0] -#define TAKE8_64(d) ((uint8_t*)&d)[0] -#elif defined(__BIG_ENDIAN__) -#define TAKE8_8(d) ((uint8_t*)&d)[0] -#define TAKE8_16(d) ((uint8_t*)&d)[1] -#define TAKE8_32(d) ((uint8_t*)&d)[3] -#define TAKE8_64(d) ((uint8_t*)&d)[7] -#endif - -#ifndef msgpack_pack_append_buffer -#error msgpack_pack_append_buffer callback is not defined -#endif - - -/* - * Integer - */ - -#define msgpack_pack_real_uint8(x, d) \ -do { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_8(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ -} while(0) - -#define msgpack_pack_real_uint16(x, d) \ -do { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ - } else if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ -} while(0) - -#define msgpack_pack_real_uint32(x, d) \ -do { \ - if(d < (1<<8)) { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else { \ - if(d < (1<<16)) { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } \ -} while(0) - -#define msgpack_pack_real_uint64(x, d) \ -do { \ - if(d < (1ULL<<8)) { \ - if(d < (1ULL<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else { \ - if(d < (1ULL<<16)) { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else if(d < (1ULL<<32)) { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else { \ - /* unsigned 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } \ - } \ -} while(0) - -#define msgpack_pack_real_int8(x, d) \ -do { \ - if(d < -(1<<5)) { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_8(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ - } \ -} while(0) - -#define msgpack_pack_real_int16(x, d) \ -do { \ - if(d < -(1<<5)) { \ - if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ - } else { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ - } \ -} while(0) - -#define msgpack_pack_real_int32(x, d) \ -do { \ - if(d < -(1<<5)) { \ - if(d < -(1<<15)) { \ - /* signed 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ - } else { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else if(d < (1<<16)) { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } \ -} while(0) - -#define msgpack_pack_real_int64(x, d) \ -do { \ - if(d < -(1LL<<5)) { \ - if(d < -(1LL<<15)) { \ - if(d < -(1LL<<31)) { \ - /* signed 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xd3; _msgpack_store64(&buf[1], d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } else { \ - /* signed 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } else { \ - if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ - } else { \ - if(d < (1LL<<16)) { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ - } else { \ - if(d < (1LL<<32)) { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else { \ - /* unsigned 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } \ - } \ - } \ -} while(0) - - -static inline int msgpack_pack_uint8(msgpack_packer* x, uint8_t d) -{ - msgpack_pack_real_uint8(x, d); -} - -static inline int msgpack_pack_uint16(msgpack_packer* x, uint16_t d) -{ - msgpack_pack_real_uint16(x, d); -} - -static inline int msgpack_pack_uint32(msgpack_packer* x, uint32_t d) -{ - msgpack_pack_real_uint32(x, d); -} - -static inline int msgpack_pack_uint64(msgpack_packer* x, uint64_t d) -{ - msgpack_pack_real_uint64(x, d); -} - -static inline int msgpack_pack_int8(msgpack_packer* x, int8_t d) -{ - msgpack_pack_real_int8(x, d); -} - -static inline int msgpack_pack_int16(msgpack_packer* x, int16_t d) -{ - msgpack_pack_real_int16(x, d); -} - -static inline int msgpack_pack_int32(msgpack_packer* x, int32_t d) -{ - msgpack_pack_real_int32(x, d); -} - -static inline int msgpack_pack_int64(msgpack_packer* x, int64_t d) -{ - msgpack_pack_real_int64(x, d); -} - - -//#ifdef msgpack_pack_inline_func_cint - -static inline int msgpack_pack_short(msgpack_packer* x, short d) -{ -#if defined(SIZEOF_SHORT) -#if SIZEOF_SHORT == 2 - msgpack_pack_real_int16(x, d); -#elif SIZEOF_SHORT == 4 - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif - -#elif defined(SHRT_MAX) -#if SHRT_MAX == 0x7fff - msgpack_pack_real_int16(x, d); -#elif SHRT_MAX == 0x7fffffff - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif - -#else -if(sizeof(short) == 2) { - msgpack_pack_real_int16(x, d); -} else if(sizeof(short) == 4) { - msgpack_pack_real_int32(x, d); -} else { - msgpack_pack_real_int64(x, d); -} -#endif -} - -static inline int msgpack_pack_int(msgpack_packer* x, int d) -{ -#if defined(SIZEOF_INT) -#if SIZEOF_INT == 2 - msgpack_pack_real_int16(x, d); -#elif SIZEOF_INT == 4 - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif - -#elif defined(INT_MAX) -#if INT_MAX == 0x7fff - msgpack_pack_real_int16(x, d); -#elif INT_MAX == 0x7fffffff - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif - -#else -if(sizeof(int) == 2) { - msgpack_pack_real_int16(x, d); -} else if(sizeof(int) == 4) { - msgpack_pack_real_int32(x, d); -} else { - msgpack_pack_real_int64(x, d); -} -#endif -} - -static inline int msgpack_pack_long(msgpack_packer* x, long d) -{ -#if defined(SIZEOF_LONG) -#if SIZEOF_LONG == 2 - msgpack_pack_real_int16(x, d); -#elif SIZEOF_LONG == 4 - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif - -#elif defined(LONG_MAX) -#if LONG_MAX == 0x7fffL - msgpack_pack_real_int16(x, d); -#elif LONG_MAX == 0x7fffffffL - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif - -#else -if(sizeof(long) == 2) { - msgpack_pack_real_int16(x, d); -} else if(sizeof(long) == 4) { - msgpack_pack_real_int32(x, d); -} else { - msgpack_pack_real_int64(x, d); -} -#endif -} - -static inline int msgpack_pack_long_long(msgpack_packer* x, long long d) -{ -#if defined(SIZEOF_LONG_LONG) -#if SIZEOF_LONG_LONG == 2 - msgpack_pack_real_int16(x, d); -#elif SIZEOF_LONG_LONG == 4 - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif - -#elif defined(LLONG_MAX) -#if LLONG_MAX == 0x7fffL - msgpack_pack_real_int16(x, d); -#elif LLONG_MAX == 0x7fffffffL - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif - -#else -if(sizeof(long long) == 2) { - msgpack_pack_real_int16(x, d); -} else if(sizeof(long long) == 4) { - msgpack_pack_real_int32(x, d); -} else { - msgpack_pack_real_int64(x, d); -} -#endif -} - -static inline int msgpack_pack_unsigned_short(msgpack_packer* x, unsigned short d) -{ -#if defined(SIZEOF_SHORT) -#if SIZEOF_SHORT == 2 - msgpack_pack_real_uint16(x, d); -#elif SIZEOF_SHORT == 4 - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif - -#elif defined(USHRT_MAX) -#if USHRT_MAX == 0xffffU - msgpack_pack_real_uint16(x, d); -#elif USHRT_MAX == 0xffffffffU - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif - -#else -if(sizeof(unsigned short) == 2) { - msgpack_pack_real_uint16(x, d); -} else if(sizeof(unsigned short) == 4) { - msgpack_pack_real_uint32(x, d); -} else { - msgpack_pack_real_uint64(x, d); -} -#endif -} - -static inline int msgpack_pack_unsigned_int(msgpack_packer* x, unsigned int d) -{ -#if defined(SIZEOF_INT) -#if SIZEOF_INT == 2 - msgpack_pack_real_uint16(x, d); -#elif SIZEOF_INT == 4 - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif - -#elif defined(UINT_MAX) -#if UINT_MAX == 0xffffU - msgpack_pack_real_uint16(x, d); -#elif UINT_MAX == 0xffffffffU - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif - -#else -if(sizeof(unsigned int) == 2) { - msgpack_pack_real_uint16(x, d); -} else if(sizeof(unsigned int) == 4) { - msgpack_pack_real_uint32(x, d); -} else { - msgpack_pack_real_uint64(x, d); -} -#endif -} - -static inline int msgpack_pack_unsigned_long(msgpack_packer* x, unsigned long d) -{ -#if defined(SIZEOF_LONG) -#if SIZEOF_LONG == 2 - msgpack_pack_real_uint16(x, d); -#elif SIZEOF_LONG == 4 - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif - -#elif defined(ULONG_MAX) -#if ULONG_MAX == 0xffffUL - msgpack_pack_real_uint16(x, d); -#elif ULONG_MAX == 0xffffffffUL - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif - -#else -if(sizeof(unsigned long) == 2) { - msgpack_pack_real_uint16(x, d); -} else if(sizeof(unsigned long) == 4) { - msgpack_pack_real_uint32(x, d); -} else { - msgpack_pack_real_uint64(x, d); -} -#endif -} - -static inline int msgpack_pack_unsigned_long_long(msgpack_packer* x, unsigned long long d) -{ -#if defined(SIZEOF_LONG_LONG) -#if SIZEOF_LONG_LONG == 2 - msgpack_pack_real_uint16(x, d); -#elif SIZEOF_LONG_LONG == 4 - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif - -#elif defined(ULLONG_MAX) -#if ULLONG_MAX == 0xffffUL - msgpack_pack_real_uint16(x, d); -#elif ULLONG_MAX == 0xffffffffUL - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif - -#else -if(sizeof(unsigned long long) == 2) { - msgpack_pack_real_uint16(x, d); -} else if(sizeof(unsigned long long) == 4) { - msgpack_pack_real_uint32(x, d); -} else { - msgpack_pack_real_uint64(x, d); -} -#endif -} - -//#undef msgpack_pack_inline_func_cint -//#endif - - - -/* - * Float - */ - -static inline int msgpack_pack_float(msgpack_packer* x, float d) -{ - unsigned char buf[5]; - buf[0] = 0xca; - -#if PY_VERSION_HEX >= 0x030B00A7 - PyFloat_Pack4(d, (char *)&buf[1], 0); -#else - _PyFloat_Pack4(d, &buf[1], 0); -#endif - msgpack_pack_append_buffer(x, buf, 5); -} - -static inline int msgpack_pack_double(msgpack_packer* x, double d) -{ - unsigned char buf[9]; - buf[0] = 0xcb; -#if PY_VERSION_HEX >= 0x030B00A7 - PyFloat_Pack8(d, (char *)&buf[1], 0); -#else - _PyFloat_Pack8(d, &buf[1], 0); -#endif - msgpack_pack_append_buffer(x, buf, 9); -} - - -/* - * Nil - */ - -static inline int msgpack_pack_nil(msgpack_packer* x) -{ - static const unsigned char d = 0xc0; - msgpack_pack_append_buffer(x, &d, 1); -} - - -/* - * Boolean - */ - -static inline int msgpack_pack_true(msgpack_packer* x) -{ - static const unsigned char d = 0xc3; - msgpack_pack_append_buffer(x, &d, 1); -} - -static inline int msgpack_pack_false(msgpack_packer* x) -{ - static const unsigned char d = 0xc2; - msgpack_pack_append_buffer(x, &d, 1); -} - - -/* - * Array - */ - -static inline int msgpack_pack_array(msgpack_packer* x, unsigned int n) -{ - if(n < 16) { - unsigned char d = 0x90 | n; - msgpack_pack_append_buffer(x, &d, 1); - } else if(n < 65536) { - unsigned char buf[3]; - buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n); - msgpack_pack_append_buffer(x, buf, 5); - } -} - - -/* - * Map - */ - -static inline int msgpack_pack_map(msgpack_packer* x, unsigned int n) -{ - if(n < 16) { - unsigned char d = 0x80 | n; - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); - } else if(n < 65536) { - unsigned char buf[3]; - buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n); - msgpack_pack_append_buffer(x, buf, 5); - } -} - - -/* - * Raw - */ - -static inline int msgpack_pack_raw(msgpack_packer* x, size_t l) -{ - if (l < 32) { - unsigned char d = 0xa0 | (uint8_t)l; - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); - } else if (x->use_bin_type && l < 256) { // str8 is new format introduced with bin. - unsigned char buf[2] = {0xd9, (uint8_t)l}; - msgpack_pack_append_buffer(x, buf, 2); - } else if (l < 65536) { - unsigned char buf[3]; - buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l); - msgpack_pack_append_buffer(x, buf, 5); - } -} - -/* - * bin - */ -static inline int msgpack_pack_bin(msgpack_packer *x, size_t l) -{ - if (!x->use_bin_type) { - return msgpack_pack_raw(x, l); - } - if (l < 256) { - unsigned char buf[2] = {0xc4, (unsigned char)l}; - msgpack_pack_append_buffer(x, buf, 2); - } else if (l < 65536) { - unsigned char buf[3] = {0xc5}; - _msgpack_store16(&buf[1], (uint16_t)l); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5] = {0xc6}; - _msgpack_store32(&buf[1], (uint32_t)l); - msgpack_pack_append_buffer(x, buf, 5); - } -} - -static inline int msgpack_pack_raw_body(msgpack_packer* x, const void* b, size_t l) -{ - if (l > 0) msgpack_pack_append_buffer(x, (const unsigned char*)b, l); - return 0; -} - -/* - * Ext - */ -static inline int msgpack_pack_ext(msgpack_packer* x, char typecode, size_t l) -{ - if (l == 1) { - unsigned char buf[2]; - buf[0] = 0xd4; - buf[1] = (unsigned char)typecode; - msgpack_pack_append_buffer(x, buf, 2); - } - else if(l == 2) { - unsigned char buf[2]; - buf[0] = 0xd5; - buf[1] = (unsigned char)typecode; - msgpack_pack_append_buffer(x, buf, 2); - } - else if(l == 4) { - unsigned char buf[2]; - buf[0] = 0xd6; - buf[1] = (unsigned char)typecode; - msgpack_pack_append_buffer(x, buf, 2); - } - else if(l == 8) { - unsigned char buf[2]; - buf[0] = 0xd7; - buf[1] = (unsigned char)typecode; - msgpack_pack_append_buffer(x, buf, 2); - } - else if(l == 16) { - unsigned char buf[2]; - buf[0] = 0xd8; - buf[1] = (unsigned char)typecode; - msgpack_pack_append_buffer(x, buf, 2); - } - else if(l < 256) { - unsigned char buf[3]; - buf[0] = 0xc7; - buf[1] = l; - buf[2] = (unsigned char)typecode; - msgpack_pack_append_buffer(x, buf, 3); - } else if(l < 65536) { - unsigned char buf[4]; - buf[0] = 0xc8; - _msgpack_store16(&buf[1], (uint16_t)l); - buf[3] = (unsigned char)typecode; - msgpack_pack_append_buffer(x, buf, 4); - } else { - unsigned char buf[6]; - buf[0] = 0xc9; - _msgpack_store32(&buf[1], (uint32_t)l); - buf[5] = (unsigned char)typecode; - msgpack_pack_append_buffer(x, buf, 6); - } - -} - -/* - * Pack Timestamp extension type. Follows msgpack-c pack_template.h. - */ -static inline int msgpack_pack_timestamp(msgpack_packer* x, int64_t seconds, uint32_t nanoseconds) -{ - if ((seconds >> 34) == 0) { - /* seconds is unsigned and fits in 34 bits */ - uint64_t data64 = ((uint64_t)nanoseconds << 34) | (uint64_t)seconds; - if ((data64 & 0xffffffff00000000L) == 0) { - /* no nanoseconds and seconds is 32bits or smaller. timestamp32. */ - unsigned char buf[4]; - uint32_t data32 = (uint32_t)data64; - msgpack_pack_ext(x, -1, 4); - _msgpack_store32(buf, data32); - msgpack_pack_raw_body(x, buf, 4); - } else { - /* timestamp64 */ - unsigned char buf[8]; - msgpack_pack_ext(x, -1, 8); - _msgpack_store64(buf, data64); - msgpack_pack_raw_body(x, buf, 8); - - } - } else { - /* seconds is signed or >34bits */ - unsigned char buf[12]; - _msgpack_store32(&buf[0], nanoseconds); - _msgpack_store64(&buf[4], seconds); - msgpack_pack_ext(x, -1, 12); - msgpack_pack_raw_body(x, buf, 12); - } - return 0; -} - - -#undef msgpack_pack_append_buffer - -#undef TAKE8_8 -#undef TAKE8_16 -#undef TAKE8_32 -#undef TAKE8_64 - -#undef msgpack_pack_real_uint8 -#undef msgpack_pack_real_uint16 -#undef msgpack_pack_real_uint32 -#undef msgpack_pack_real_uint64 -#undef msgpack_pack_real_int8 -#undef msgpack_pack_real_int16 -#undef msgpack_pack_real_int32 -#undef msgpack_pack_real_int64 diff --git a/libs/msgpack/sysdep.h b/libs/msgpack/sysdep.h deleted file mode 100644 index 70673004a..000000000 --- a/libs/msgpack/sysdep.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - * MessagePack system dependencies - * - * Copyright (C) 2008-2010 FURUHASHI Sadayuki - * - * 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. - */ -#ifndef MSGPACK_SYSDEP_H__ -#define MSGPACK_SYSDEP_H__ - -#include <stdlib.h> -#include <stddef.h> -#if defined(_MSC_VER) && _MSC_VER < 1600 -typedef __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#elif defined(_MSC_VER) // && _MSC_VER >= 1600 -#include <stdint.h> -#else -#include <stdint.h> -#include <stdbool.h> -#endif - -#ifdef _WIN32 -#define _msgpack_atomic_counter_header <windows.h> -typedef long _msgpack_atomic_counter_t; -#define _msgpack_sync_decr_and_fetch(ptr) InterlockedDecrement(ptr) -#define _msgpack_sync_incr_and_fetch(ptr) InterlockedIncrement(ptr) -#elif defined(__GNUC__) && ((__GNUC__*10 + __GNUC_MINOR__) < 41) -#define _msgpack_atomic_counter_header "gcc_atomic.h" -#else -typedef unsigned int _msgpack_atomic_counter_t; -#define _msgpack_sync_decr_and_fetch(ptr) __sync_sub_and_fetch(ptr, 1) -#define _msgpack_sync_incr_and_fetch(ptr) __sync_add_and_fetch(ptr, 1) -#endif - -#ifdef _WIN32 - -#ifdef __cplusplus -/* numeric_limits<T>::min,max */ -#ifdef max -#undef max -#endif -#ifdef min -#undef min -#endif -#endif - -#else /* _WIN32 */ -#include <arpa/inet.h> /* ntohs, ntohl */ -#endif - -#if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -#define __LITTLE_ENDIAN__ -#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -#define __BIG_ENDIAN__ -#elif _WIN32 -#define __LITTLE_ENDIAN__ -#endif -#endif - - -#ifdef __LITTLE_ENDIAN__ - -#ifdef _WIN32 -# if defined(ntohs) -# define _msgpack_be16(x) ntohs(x) -# elif defined(_byteswap_ushort) || (defined(_MSC_VER) && _MSC_VER >= 1400) -# define _msgpack_be16(x) ((uint16_t)_byteswap_ushort((unsigned short)x)) -# else -# define _msgpack_be16(x) ( \ - ((((uint16_t)x) << 8) ) | \ - ((((uint16_t)x) >> 8) ) ) -# endif -#else -# define _msgpack_be16(x) ntohs(x) -#endif - -#ifdef _WIN32 -# if defined(ntohl) -# define _msgpack_be32(x) ntohl(x) -# elif defined(_byteswap_ulong) || defined(_MSC_VER) -# define _msgpack_be32(x) ((uint32_t)_byteswap_ulong((unsigned long)x)) -# else -# define _msgpack_be32(x) \ - ( ((((uint32_t)x) << 24) ) | \ - ((((uint32_t)x) << 8) & 0x00ff0000U ) | \ - ((((uint32_t)x) >> 8) & 0x0000ff00U ) | \ - ((((uint32_t)x) >> 24) ) ) -# endif -#else -# define _msgpack_be32(x) ntohl(x) -#endif - -#if defined(_byteswap_uint64) || defined(_MSC_VER) -# define _msgpack_be64(x) (_byteswap_uint64(x)) -#elif defined(bswap_64) -# define _msgpack_be64(x) bswap_64(x) -#elif defined(__DARWIN_OSSwapInt64) -# define _msgpack_be64(x) __DARWIN_OSSwapInt64(x) -#else -#define _msgpack_be64(x) \ - ( ((((uint64_t)x) << 56) ) | \ - ((((uint64_t)x) << 40) & 0x00ff000000000000ULL ) | \ - ((((uint64_t)x) << 24) & 0x0000ff0000000000ULL ) | \ - ((((uint64_t)x) << 8) & 0x000000ff00000000ULL ) | \ - ((((uint64_t)x) >> 8) & 0x00000000ff000000ULL ) | \ - ((((uint64_t)x) >> 24) & 0x0000000000ff0000ULL ) | \ - ((((uint64_t)x) >> 40) & 0x000000000000ff00ULL ) | \ - ((((uint64_t)x) >> 56) ) ) -#endif - -#define _msgpack_load16(cast, from) ((cast)( \ - (((uint16_t)((uint8_t*)(from))[0]) << 8) | \ - (((uint16_t)((uint8_t*)(from))[1]) ) )) - -#define _msgpack_load32(cast, from) ((cast)( \ - (((uint32_t)((uint8_t*)(from))[0]) << 24) | \ - (((uint32_t)((uint8_t*)(from))[1]) << 16) | \ - (((uint32_t)((uint8_t*)(from))[2]) << 8) | \ - (((uint32_t)((uint8_t*)(from))[3]) ) )) - -#define _msgpack_load64(cast, from) ((cast)( \ - (((uint64_t)((uint8_t*)(from))[0]) << 56) | \ - (((uint64_t)((uint8_t*)(from))[1]) << 48) | \ - (((uint64_t)((uint8_t*)(from))[2]) << 40) | \ - (((uint64_t)((uint8_t*)(from))[3]) << 32) | \ - (((uint64_t)((uint8_t*)(from))[4]) << 24) | \ - (((uint64_t)((uint8_t*)(from))[5]) << 16) | \ - (((uint64_t)((uint8_t*)(from))[6]) << 8) | \ - (((uint64_t)((uint8_t*)(from))[7]) ) )) - -#else - -#define _msgpack_be16(x) (x) -#define _msgpack_be32(x) (x) -#define _msgpack_be64(x) (x) - -#define _msgpack_load16(cast, from) ((cast)( \ - (((uint16_t)((uint8_t*)from)[0]) << 8) | \ - (((uint16_t)((uint8_t*)from)[1]) ) )) - -#define _msgpack_load32(cast, from) ((cast)( \ - (((uint32_t)((uint8_t*)from)[0]) << 24) | \ - (((uint32_t)((uint8_t*)from)[1]) << 16) | \ - (((uint32_t)((uint8_t*)from)[2]) << 8) | \ - (((uint32_t)((uint8_t*)from)[3]) ) )) - -#define _msgpack_load64(cast, from) ((cast)( \ - (((uint64_t)((uint8_t*)from)[0]) << 56) | \ - (((uint64_t)((uint8_t*)from)[1]) << 48) | \ - (((uint64_t)((uint8_t*)from)[2]) << 40) | \ - (((uint64_t)((uint8_t*)from)[3]) << 32) | \ - (((uint64_t)((uint8_t*)from)[4]) << 24) | \ - (((uint64_t)((uint8_t*)from)[5]) << 16) | \ - (((uint64_t)((uint8_t*)from)[6]) << 8) | \ - (((uint64_t)((uint8_t*)from)[7]) ) )) -#endif - - -#define _msgpack_store16(to, num) \ - do { uint16_t val = _msgpack_be16(num); memcpy(to, &val, 2); } while(0) -#define _msgpack_store32(to, num) \ - do { uint32_t val = _msgpack_be32(num); memcpy(to, &val, 4); } while(0) -#define _msgpack_store64(to, num) \ - do { uint64_t val = _msgpack_be64(num); memcpy(to, &val, 8); } while(0) - -/* -#define _msgpack_load16(cast, from) \ - ({ cast val; memcpy(&val, (char*)from, 2); _msgpack_be16(val); }) -#define _msgpack_load32(cast, from) \ - ({ cast val; memcpy(&val, (char*)from, 4); _msgpack_be32(val); }) -#define _msgpack_load64(cast, from) \ - ({ cast val; memcpy(&val, (char*)from, 8); _msgpack_be64(val); }) -*/ - - -#endif /* msgpack/sysdep.h */ diff --git a/libs/msgpack/unpack.h b/libs/msgpack/unpack.h deleted file mode 100644 index 23aa62201..000000000 --- a/libs/msgpack/unpack.h +++ /dev/null @@ -1,391 +0,0 @@ -/* - * MessagePack for Python unpacking routine - * - * Copyright (C) 2009 Naoki INADA - * - * 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. - */ - -#define MSGPACK_EMBED_STACK_SIZE (1024) -#include "unpack_define.h" - -typedef struct unpack_user { - bool use_list; - bool raw; - bool has_pairs_hook; - bool strict_map_key; - int timestamp; - PyObject *object_hook; - PyObject *list_hook; - PyObject *ext_hook; - PyObject *timestamp_t; - PyObject *giga; - PyObject *utc; - const char *unicode_errors; - Py_ssize_t max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len; -} unpack_user; - -typedef PyObject* msgpack_unpack_object; -struct unpack_context; -typedef struct unpack_context unpack_context; -typedef int (*execute_fn)(unpack_context *ctx, const char* data, Py_ssize_t len, Py_ssize_t* off); - -static inline msgpack_unpack_object unpack_callback_root(unpack_user* u) -{ - return NULL; -} - -static inline int unpack_callback_uint16(unpack_user* u, uint16_t d, msgpack_unpack_object* o) -{ - PyObject *p = PyInt_FromLong((long)d); - if (!p) - return -1; - *o = p; - return 0; -} -static inline int unpack_callback_uint8(unpack_user* u, uint8_t d, msgpack_unpack_object* o) -{ - return unpack_callback_uint16(u, d, o); -} - - -static inline int unpack_callback_uint32(unpack_user* u, uint32_t d, msgpack_unpack_object* o) -{ - PyObject *p = PyInt_FromSize_t((size_t)d); - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int unpack_callback_uint64(unpack_user* u, uint64_t d, msgpack_unpack_object* o) -{ - PyObject *p; - if (d > LONG_MAX) { - p = PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)d); - } else { - p = PyInt_FromLong((long)d); - } - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int unpack_callback_int32(unpack_user* u, int32_t d, msgpack_unpack_object* o) -{ - PyObject *p = PyInt_FromLong(d); - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int unpack_callback_int16(unpack_user* u, int16_t d, msgpack_unpack_object* o) -{ - return unpack_callback_int32(u, d, o); -} - -static inline int unpack_callback_int8(unpack_user* u, int8_t d, msgpack_unpack_object* o) -{ - return unpack_callback_int32(u, d, o); -} - -static inline int unpack_callback_int64(unpack_user* u, int64_t d, msgpack_unpack_object* o) -{ - PyObject *p; - if (d > LONG_MAX || d < LONG_MIN) { - p = PyLong_FromLongLong((PY_LONG_LONG)d); - } else { - p = PyInt_FromLong((long)d); - } - *o = p; - return 0; -} - -static inline int unpack_callback_double(unpack_user* u, double d, msgpack_unpack_object* o) -{ - PyObject *p = PyFloat_FromDouble(d); - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int unpack_callback_float(unpack_user* u, float d, msgpack_unpack_object* o) -{ - return unpack_callback_double(u, d, o); -} - -static inline int unpack_callback_nil(unpack_user* u, msgpack_unpack_object* o) -{ Py_INCREF(Py_None); *o = Py_None; return 0; } - -static inline int unpack_callback_true(unpack_user* u, msgpack_unpack_object* o) -{ Py_INCREF(Py_True); *o = Py_True; return 0; } - -static inline int unpack_callback_false(unpack_user* u, msgpack_unpack_object* o) -{ Py_INCREF(Py_False); *o = Py_False; return 0; } - -static inline int unpack_callback_array(unpack_user* u, unsigned int n, msgpack_unpack_object* o) -{ - if (n > u->max_array_len) { - PyErr_Format(PyExc_ValueError, "%u exceeds max_array_len(%zd)", n, u->max_array_len); - return -1; - } - PyObject *p = u->use_list ? PyList_New(n) : PyTuple_New(n); - - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int unpack_callback_array_item(unpack_user* u, unsigned int current, msgpack_unpack_object* c, msgpack_unpack_object o) -{ - if (u->use_list) - PyList_SET_ITEM(*c, current, o); - else - PyTuple_SET_ITEM(*c, current, o); - return 0; -} - -static inline int unpack_callback_array_end(unpack_user* u, msgpack_unpack_object* c) -{ - if (u->list_hook) { - PyObject *new_c = PyObject_CallFunctionObjArgs(u->list_hook, *c, NULL); - if (!new_c) - return -1; - Py_DECREF(*c); - *c = new_c; - } - return 0; -} - -static inline int unpack_callback_map(unpack_user* u, unsigned int n, msgpack_unpack_object* o) -{ - if (n > u->max_map_len) { - PyErr_Format(PyExc_ValueError, "%u exceeds max_map_len(%zd)", n, u->max_map_len); - return -1; - } - PyObject *p; - if (u->has_pairs_hook) { - p = PyList_New(n); // Or use tuple? - } - else { - p = PyDict_New(); - } - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int unpack_callback_map_item(unpack_user* u, unsigned int current, msgpack_unpack_object* c, msgpack_unpack_object k, msgpack_unpack_object v) -{ - if (u->strict_map_key && !PyUnicode_CheckExact(k) && !PyBytes_CheckExact(k)) { - PyErr_Format(PyExc_ValueError, "%.100s is not allowed for map key when strict_map_key=True", Py_TYPE(k)->tp_name); - return -1; - } - if (PyUnicode_CheckExact(k)) { - PyUnicode_InternInPlace(&k); - } - if (u->has_pairs_hook) { - msgpack_unpack_object item = PyTuple_Pack(2, k, v); - if (!item) - return -1; - Py_DECREF(k); - Py_DECREF(v); - PyList_SET_ITEM(*c, current, item); - return 0; - } - else if (PyDict_SetItem(*c, k, v) == 0) { - Py_DECREF(k); - Py_DECREF(v); - return 0; - } - return -1; -} - -static inline int unpack_callback_map_end(unpack_user* u, msgpack_unpack_object* c) -{ - if (u->object_hook) { - PyObject *new_c = PyObject_CallFunctionObjArgs(u->object_hook, *c, NULL); - if (!new_c) - return -1; - - Py_DECREF(*c); - *c = new_c; - } - return 0; -} - -static inline int unpack_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_unpack_object* o) -{ - if (l > u->max_str_len) { - PyErr_Format(PyExc_ValueError, "%u exceeds max_str_len(%zd)", l, u->max_str_len); - return -1; - } - - PyObject *py; - - if (u->raw) { - py = PyBytes_FromStringAndSize(p, l); - } else { - py = PyUnicode_DecodeUTF8(p, l, u->unicode_errors); - } - if (!py) - return -1; - *o = py; - return 0; -} - -static inline int unpack_callback_bin(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_unpack_object* o) -{ - if (l > u->max_bin_len) { - PyErr_Format(PyExc_ValueError, "%u exceeds max_bin_len(%zd)", l, u->max_bin_len); - return -1; - } - - PyObject *py = PyBytes_FromStringAndSize(p, l); - if (!py) - return -1; - *o = py; - return 0; -} - -typedef struct msgpack_timestamp { - int64_t tv_sec; - uint32_t tv_nsec; -} msgpack_timestamp; - -/* - * Unpack ext buffer to a timestamp. Pulled from msgpack-c timestamp.h. - */ -static int unpack_timestamp(const char* buf, unsigned int buflen, msgpack_timestamp* ts) { - switch (buflen) { - case 4: - ts->tv_nsec = 0; - { - uint32_t v = _msgpack_load32(uint32_t, buf); - ts->tv_sec = (int64_t)v; - } - return 0; - case 8: { - uint64_t value =_msgpack_load64(uint64_t, buf); - ts->tv_nsec = (uint32_t)(value >> 34); - ts->tv_sec = value & 0x00000003ffffffffLL; - return 0; - } - case 12: - ts->tv_nsec = _msgpack_load32(uint32_t, buf); - ts->tv_sec = _msgpack_load64(int64_t, buf + 4); - return 0; - default: - return -1; - } -} - -#include "datetime.h" - -static int unpack_callback_ext(unpack_user* u, const char* base, const char* pos, - unsigned int length, msgpack_unpack_object* o) -{ - int8_t typecode = (int8_t)*pos++; - if (!u->ext_hook) { - PyErr_SetString(PyExc_AssertionError, "u->ext_hook cannot be NULL"); - return -1; - } - if (length-1 > u->max_ext_len) { - PyErr_Format(PyExc_ValueError, "%u exceeds max_ext_len(%zd)", length, u->max_ext_len); - return -1; - } - - PyObject *py = NULL; - // length also includes the typecode, so the actual data is length-1 - if (typecode == -1) { - msgpack_timestamp ts; - if (unpack_timestamp(pos, length-1, &ts) < 0) { - return -1; - } - - if (u->timestamp == 2) { // int - PyObject *a = PyLong_FromLongLong(ts.tv_sec); - if (a == NULL) return -1; - - PyObject *c = PyNumber_Multiply(a, u->giga); - Py_DECREF(a); - if (c == NULL) { - return -1; - } - - PyObject *b = PyLong_FromUnsignedLong(ts.tv_nsec); - if (b == NULL) { - Py_DECREF(c); - return -1; - } - - py = PyNumber_Add(c, b); - Py_DECREF(c); - Py_DECREF(b); - } - else if (u->timestamp == 0) { // Timestamp - py = PyObject_CallFunction(u->timestamp_t, "(Lk)", ts.tv_sec, ts.tv_nsec); - } - else if (u->timestamp == 3) { // datetime - // Calculate datetime using epoch + delta - // due to limitations PyDateTime_FromTimestamp on Windows with negative timestamps - PyObject *epoch = PyDateTimeAPI->DateTime_FromDateAndTime(1970, 1, 1, 0, 0, 0, 0, u->utc, PyDateTimeAPI->DateTimeType); - if (epoch == NULL) { - return -1; - } - - PyObject* d = PyDelta_FromDSU(ts.tv_sec/(24*3600), ts.tv_sec%(24*3600), ts.tv_nsec / 1000); - if (d == NULL) { - Py_DECREF(epoch); - return -1; - } - - py = PyNumber_Add(epoch, d); - - Py_DECREF(epoch); - Py_DECREF(d); - } - else { // float - PyObject *a = PyFloat_FromDouble((double)ts.tv_nsec); - if (a == NULL) return -1; - - PyObject *b = PyNumber_TrueDivide(a, u->giga); - Py_DECREF(a); - if (b == NULL) return -1; - - PyObject *c = PyLong_FromLongLong(ts.tv_sec); - if (c == NULL) { - Py_DECREF(b); - return -1; - } - - a = PyNumber_Add(b, c); - Py_DECREF(b); - Py_DECREF(c); - py = a; - } - } else { - py = PyObject_CallFunction(u->ext_hook, "(iy#)", (int)typecode, pos, (Py_ssize_t)length-1); - } - if (!py) - return -1; - *o = py; - return 0; -} - -#include "unpack_template.h" diff --git a/libs/msgpack/unpack_define.h b/libs/msgpack/unpack_define.h deleted file mode 100644 index 0dd708d17..000000000 --- a/libs/msgpack/unpack_define.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * MessagePack unpacking routine template - * - * Copyright (C) 2008-2010 FURUHASHI Sadayuki - * - * 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. - */ -#ifndef MSGPACK_UNPACK_DEFINE_H__ -#define MSGPACK_UNPACK_DEFINE_H__ - -#include "msgpack/sysdep.h" -#include <stdlib.h> -#include <string.h> -#include <assert.h> -#include <stdio.h> - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifndef MSGPACK_EMBED_STACK_SIZE -#define MSGPACK_EMBED_STACK_SIZE 32 -#endif - - -// CS is first byte & 0x1f -typedef enum { - CS_HEADER = 0x00, // nil - - //CS_ = 0x01, - //CS_ = 0x02, // false - //CS_ = 0x03, // true - - CS_BIN_8 = 0x04, - CS_BIN_16 = 0x05, - CS_BIN_32 = 0x06, - - CS_EXT_8 = 0x07, - CS_EXT_16 = 0x08, - CS_EXT_32 = 0x09, - - CS_FLOAT = 0x0a, - CS_DOUBLE = 0x0b, - CS_UINT_8 = 0x0c, - CS_UINT_16 = 0x0d, - CS_UINT_32 = 0x0e, - CS_UINT_64 = 0x0f, - CS_INT_8 = 0x10, - CS_INT_16 = 0x11, - CS_INT_32 = 0x12, - CS_INT_64 = 0x13, - - //CS_FIXEXT1 = 0x14, - //CS_FIXEXT2 = 0x15, - //CS_FIXEXT4 = 0x16, - //CS_FIXEXT8 = 0x17, - //CS_FIXEXT16 = 0x18, - - CS_RAW_8 = 0x19, - CS_RAW_16 = 0x1a, - CS_RAW_32 = 0x1b, - CS_ARRAY_16 = 0x1c, - CS_ARRAY_32 = 0x1d, - CS_MAP_16 = 0x1e, - CS_MAP_32 = 0x1f, - - ACS_RAW_VALUE, - ACS_BIN_VALUE, - ACS_EXT_VALUE, -} msgpack_unpack_state; - - -typedef enum { - CT_ARRAY_ITEM, - CT_MAP_KEY, - CT_MAP_VALUE, -} msgpack_container_type; - - -#ifdef __cplusplus -} -#endif - -#endif /* msgpack/unpack_define.h */ diff --git a/libs/msgpack/unpack_template.h b/libs/msgpack/unpack_template.h deleted file mode 100644 index 8b9fcc195..000000000 --- a/libs/msgpack/unpack_template.h +++ /dev/null @@ -1,464 +0,0 @@ -/* - * MessagePack unpacking routine template - * - * Copyright (C) 2008-2010 FURUHASHI Sadayuki - * - * 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. - */ - -#ifndef USE_CASE_RANGE -#if !defined(_MSC_VER) -#define USE_CASE_RANGE -#endif -#endif - -typedef struct unpack_stack { - PyObject* obj; - Py_ssize_t size; - Py_ssize_t count; - unsigned int ct; - PyObject* map_key; -} unpack_stack; - -struct unpack_context { - unpack_user user; - unsigned int cs; - unsigned int trail; - unsigned int top; - /* - unpack_stack* stack; - unsigned int stack_size; - unpack_stack embed_stack[MSGPACK_EMBED_STACK_SIZE]; - */ - unpack_stack stack[MSGPACK_EMBED_STACK_SIZE]; -}; - - -static inline void unpack_init(unpack_context* ctx) -{ - ctx->cs = CS_HEADER; - ctx->trail = 0; - ctx->top = 0; - /* - ctx->stack = ctx->embed_stack; - ctx->stack_size = MSGPACK_EMBED_STACK_SIZE; - */ - ctx->stack[0].obj = unpack_callback_root(&ctx->user); -} - -/* -static inline void unpack_destroy(unpack_context* ctx) -{ - if(ctx->stack_size != MSGPACK_EMBED_STACK_SIZE) { - free(ctx->stack); - } -} -*/ - -static inline PyObject* unpack_data(unpack_context* ctx) -{ - return (ctx)->stack[0].obj; -} - -static inline void unpack_clear(unpack_context *ctx) -{ - Py_CLEAR(ctx->stack[0].obj); -} - -template <bool construct> -static inline int unpack_execute(unpack_context* ctx, const char* data, Py_ssize_t len, Py_ssize_t* off) -{ - assert(len >= *off); - - const unsigned char* p = (unsigned char*)data + *off; - const unsigned char* const pe = (unsigned char*)data + len; - const void* n = p; - - unsigned int trail = ctx->trail; - unsigned int cs = ctx->cs; - unsigned int top = ctx->top; - unpack_stack* stack = ctx->stack; - /* - unsigned int stack_size = ctx->stack_size; - */ - unpack_user* user = &ctx->user; - - PyObject* obj = NULL; - unpack_stack* c = NULL; - - int ret; - -#define construct_cb(name) \ - construct && unpack_callback ## name - -#define push_simple_value(func) \ - if(construct_cb(func)(user, &obj) < 0) { goto _failed; } \ - goto _push -#define push_fixed_value(func, arg) \ - if(construct_cb(func)(user, arg, &obj) < 0) { goto _failed; } \ - goto _push -#define push_variable_value(func, base, pos, len) \ - if(construct_cb(func)(user, \ - (const char*)base, (const char*)pos, len, &obj) < 0) { goto _failed; } \ - goto _push - -#define again_fixed_trail(_cs, trail_len) \ - trail = trail_len; \ - cs = _cs; \ - goto _fixed_trail_again -#define again_fixed_trail_if_zero(_cs, trail_len, ifzero) \ - trail = trail_len; \ - if(trail == 0) { goto ifzero; } \ - cs = _cs; \ - goto _fixed_trail_again - -#define start_container(func, count_, ct_) \ - if(top >= MSGPACK_EMBED_STACK_SIZE) { ret = -3; goto _end; } \ - if(construct_cb(func)(user, count_, &stack[top].obj) < 0) { goto _failed; } \ - if((count_) == 0) { obj = stack[top].obj; \ - if (construct_cb(func##_end)(user, &obj) < 0) { goto _failed; } \ - goto _push; } \ - stack[top].ct = ct_; \ - stack[top].size = count_; \ - stack[top].count = 0; \ - ++top; \ - goto _header_again - -#define NEXT_CS(p) ((unsigned int)*p & 0x1f) - -#ifdef USE_CASE_RANGE -#define SWITCH_RANGE_BEGIN switch(*p) { -#define SWITCH_RANGE(FROM, TO) case FROM ... TO: -#define SWITCH_RANGE_DEFAULT default: -#define SWITCH_RANGE_END } -#else -#define SWITCH_RANGE_BEGIN { if(0) { -#define SWITCH_RANGE(FROM, TO) } else if(FROM <= *p && *p <= TO) { -#define SWITCH_RANGE_DEFAULT } else { -#define SWITCH_RANGE_END } } -#endif - - if(p == pe) { goto _out; } - do { - switch(cs) { - case CS_HEADER: - SWITCH_RANGE_BEGIN - SWITCH_RANGE(0x00, 0x7f) // Positive Fixnum - push_fixed_value(_uint8, *(uint8_t*)p); - SWITCH_RANGE(0xe0, 0xff) // Negative Fixnum - push_fixed_value(_int8, *(int8_t*)p); - SWITCH_RANGE(0xc0, 0xdf) // Variable - switch(*p) { - case 0xc0: // nil - push_simple_value(_nil); - //case 0xc1: // never used - case 0xc2: // false - push_simple_value(_false); - case 0xc3: // true - push_simple_value(_true); - case 0xc4: // bin 8 - again_fixed_trail(NEXT_CS(p), 1); - case 0xc5: // bin 16 - again_fixed_trail(NEXT_CS(p), 2); - case 0xc6: // bin 32 - again_fixed_trail(NEXT_CS(p), 4); - case 0xc7: // ext 8 - again_fixed_trail(NEXT_CS(p), 1); - case 0xc8: // ext 16 - again_fixed_trail(NEXT_CS(p), 2); - case 0xc9: // ext 32 - again_fixed_trail(NEXT_CS(p), 4); - case 0xca: // float - case 0xcb: // double - case 0xcc: // unsigned int 8 - case 0xcd: // unsigned int 16 - case 0xce: // unsigned int 32 - case 0xcf: // unsigned int 64 - case 0xd0: // signed int 8 - case 0xd1: // signed int 16 - case 0xd2: // signed int 32 - case 0xd3: // signed int 64 - again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03)); - case 0xd4: // fixext 1 - case 0xd5: // fixext 2 - case 0xd6: // fixext 4 - case 0xd7: // fixext 8 - again_fixed_trail_if_zero(ACS_EXT_VALUE, - (1 << (((unsigned int)*p) & 0x03))+1, - _ext_zero); - case 0xd8: // fixext 16 - again_fixed_trail_if_zero(ACS_EXT_VALUE, 16+1, _ext_zero); - case 0xd9: // str 8 - again_fixed_trail(NEXT_CS(p), 1); - case 0xda: // raw 16 - case 0xdb: // raw 32 - case 0xdc: // array 16 - case 0xdd: // array 32 - case 0xde: // map 16 - case 0xdf: // map 32 - again_fixed_trail(NEXT_CS(p), 2 << (((unsigned int)*p) & 0x01)); - default: - ret = -2; - goto _end; - } - SWITCH_RANGE(0xa0, 0xbf) // FixRaw - again_fixed_trail_if_zero(ACS_RAW_VALUE, ((unsigned int)*p & 0x1f), _raw_zero); - SWITCH_RANGE(0x90, 0x9f) // FixArray - start_container(_array, ((unsigned int)*p) & 0x0f, CT_ARRAY_ITEM); - SWITCH_RANGE(0x80, 0x8f) // FixMap - start_container(_map, ((unsigned int)*p) & 0x0f, CT_MAP_KEY); - - SWITCH_RANGE_DEFAULT - ret = -2; - goto _end; - SWITCH_RANGE_END - // end CS_HEADER - - - _fixed_trail_again: - ++p; - - default: - if((size_t)(pe - p) < trail) { goto _out; } - n = p; p += trail - 1; - switch(cs) { - case CS_EXT_8: - again_fixed_trail_if_zero(ACS_EXT_VALUE, *(uint8_t*)n+1, _ext_zero); - case CS_EXT_16: - again_fixed_trail_if_zero(ACS_EXT_VALUE, - _msgpack_load16(uint16_t,n)+1, - _ext_zero); - case CS_EXT_32: - again_fixed_trail_if_zero(ACS_EXT_VALUE, - _msgpack_load32(uint32_t,n)+1, - _ext_zero); - case CS_FLOAT: { - double f; -#if PY_VERSION_HEX >= 0x030B00A7 - f = PyFloat_Unpack4((const char*)n, 0); -#else - f = _PyFloat_Unpack4((unsigned char*)n, 0); -#endif - push_fixed_value(_float, f); } - case CS_DOUBLE: { - double f; -#if PY_VERSION_HEX >= 0x030B00A7 - f = PyFloat_Unpack8((const char*)n, 0); -#else - f = _PyFloat_Unpack8((unsigned char*)n, 0); -#endif - push_fixed_value(_double, f); } - case CS_UINT_8: - push_fixed_value(_uint8, *(uint8_t*)n); - case CS_UINT_16: - push_fixed_value(_uint16, _msgpack_load16(uint16_t,n)); - case CS_UINT_32: - push_fixed_value(_uint32, _msgpack_load32(uint32_t,n)); - case CS_UINT_64: - push_fixed_value(_uint64, _msgpack_load64(uint64_t,n)); - - case CS_INT_8: - push_fixed_value(_int8, *(int8_t*)n); - case CS_INT_16: - push_fixed_value(_int16, _msgpack_load16(int16_t,n)); - case CS_INT_32: - push_fixed_value(_int32, _msgpack_load32(int32_t,n)); - case CS_INT_64: - push_fixed_value(_int64, _msgpack_load64(int64_t,n)); - - case CS_BIN_8: - again_fixed_trail_if_zero(ACS_BIN_VALUE, *(uint8_t*)n, _bin_zero); - case CS_BIN_16: - again_fixed_trail_if_zero(ACS_BIN_VALUE, _msgpack_load16(uint16_t,n), _bin_zero); - case CS_BIN_32: - again_fixed_trail_if_zero(ACS_BIN_VALUE, _msgpack_load32(uint32_t,n), _bin_zero); - case ACS_BIN_VALUE: - _bin_zero: - push_variable_value(_bin, data, n, trail); - - case CS_RAW_8: - again_fixed_trail_if_zero(ACS_RAW_VALUE, *(uint8_t*)n, _raw_zero); - case CS_RAW_16: - again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load16(uint16_t,n), _raw_zero); - case CS_RAW_32: - again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load32(uint32_t,n), _raw_zero); - case ACS_RAW_VALUE: - _raw_zero: - push_variable_value(_raw, data, n, trail); - - case ACS_EXT_VALUE: - _ext_zero: - push_variable_value(_ext, data, n, trail); - - case CS_ARRAY_16: - start_container(_array, _msgpack_load16(uint16_t,n), CT_ARRAY_ITEM); - case CS_ARRAY_32: - /* FIXME security guard */ - start_container(_array, _msgpack_load32(uint32_t,n), CT_ARRAY_ITEM); - - case CS_MAP_16: - start_container(_map, _msgpack_load16(uint16_t,n), CT_MAP_KEY); - case CS_MAP_32: - /* FIXME security guard */ - start_container(_map, _msgpack_load32(uint32_t,n), CT_MAP_KEY); - - default: - goto _failed; - } - } - -_push: - if(top == 0) { goto _finish; } - c = &stack[top-1]; - switch(c->ct) { - case CT_ARRAY_ITEM: - if(construct_cb(_array_item)(user, c->count, &c->obj, obj) < 0) { goto _failed; } - if(++c->count == c->size) { - obj = c->obj; - if (construct_cb(_array_end)(user, &obj) < 0) { goto _failed; } - --top; - /*printf("stack pop %d\n", top);*/ - goto _push; - } - goto _header_again; - case CT_MAP_KEY: - c->map_key = obj; - c->ct = CT_MAP_VALUE; - goto _header_again; - case CT_MAP_VALUE: - if(construct_cb(_map_item)(user, c->count, &c->obj, c->map_key, obj) < 0) { goto _failed; } - if(++c->count == c->size) { - obj = c->obj; - if (construct_cb(_map_end)(user, &obj) < 0) { goto _failed; } - --top; - /*printf("stack pop %d\n", top);*/ - goto _push; - } - c->ct = CT_MAP_KEY; - goto _header_again; - - default: - goto _failed; - } - -_header_again: - cs = CS_HEADER; - ++p; - } while(p != pe); - goto _out; - - -_finish: - if (!construct) - unpack_callback_nil(user, &obj); - stack[0].obj = obj; - ++p; - ret = 1; - /*printf("-- finish --\n"); */ - goto _end; - -_failed: - /*printf("** FAILED **\n"); */ - ret = -1; - goto _end; - -_out: - ret = 0; - goto _end; - -_end: - ctx->cs = cs; - ctx->trail = trail; - ctx->top = top; - *off = p - (const unsigned char*)data; - - return ret; -#undef construct_cb -} - -#undef SWITCH_RANGE_BEGIN -#undef SWITCH_RANGE -#undef SWITCH_RANGE_DEFAULT -#undef SWITCH_RANGE_END -#undef push_simple_value -#undef push_fixed_value -#undef push_variable_value -#undef again_fixed_trail -#undef again_fixed_trail_if_zero -#undef start_container - -template <unsigned int fixed_offset, unsigned int var_offset> -static inline int unpack_container_header(unpack_context* ctx, const char* data, Py_ssize_t len, Py_ssize_t* off) -{ - assert(len >= *off); - uint32_t size; - const unsigned char *const p = (unsigned char*)data + *off; - -#define inc_offset(inc) \ - if (len - *off < inc) \ - return 0; \ - *off += inc; - - switch (*p) { - case var_offset: - inc_offset(3); - size = _msgpack_load16(uint16_t, p + 1); - break; - case var_offset + 1: - inc_offset(5); - size = _msgpack_load32(uint32_t, p + 1); - break; -#ifdef USE_CASE_RANGE - case fixed_offset + 0x0 ... fixed_offset + 0xf: -#else - case fixed_offset + 0x0: - case fixed_offset + 0x1: - case fixed_offset + 0x2: - case fixed_offset + 0x3: - case fixed_offset + 0x4: - case fixed_offset + 0x5: - case fixed_offset + 0x6: - case fixed_offset + 0x7: - case fixed_offset + 0x8: - case fixed_offset + 0x9: - case fixed_offset + 0xa: - case fixed_offset + 0xb: - case fixed_offset + 0xc: - case fixed_offset + 0xd: - case fixed_offset + 0xe: - case fixed_offset + 0xf: -#endif - ++*off; - size = ((unsigned int)*p) & 0x0f; - break; - default: - PyErr_SetString(PyExc_ValueError, "Unexpected type header on stream"); - return -1; - } - unpack_callback_uint32(&ctx->user, size, &ctx->stack[0].obj); - return 1; -} - -#undef SWITCH_RANGE_BEGIN -#undef SWITCH_RANGE -#undef SWITCH_RANGE_DEFAULT -#undef SWITCH_RANGE_END - -static const execute_fn unpack_construct = &unpack_execute<true>; -static const execute_fn unpack_skip = &unpack_execute<false>; -static const execute_fn read_array_header = &unpack_container_header<0x90, 0xdc>; -static const execute_fn read_map_header = &unpack_container_header<0x80, 0xde>; - -#undef NEXT_CS - -/* vim: set ts=4 sw=4 sts=4 expandtab */ diff --git a/libs/platformdirs-4.2.0.dist-info/RECORD b/libs/platformdirs-4.2.0.dist-info/RECORD deleted file mode 100644 index ea93ae82c..000000000 --- a/libs/platformdirs-4.2.0.dist-info/RECORD +++ /dev/null @@ -1,15 +0,0 @@ -platformdirs-4.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -platformdirs-4.2.0.dist-info/METADATA,sha256=X56m-b_JHiqOrUAm-s_dYgd76fm_XwHnBeFDa_a0PtQ,11366 -platformdirs-4.2.0.dist-info/RECORD,, -platformdirs-4.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -platformdirs-4.2.0.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 -platformdirs-4.2.0.dist-info/licenses/LICENSE,sha256=KeD9YukphQ6G6yjD_czwzv30-pSHkBHP-z0NS-1tTbY,1089 -platformdirs/__init__.py,sha256=CAub30GCY26r5nDzxkh4xH4VmMtT6vO-pX0-uTZd3JQ,22134 -platformdirs/__main__.py,sha256=ybWxtmp6igI2xuyHUYRJVtaN4xoiP2WHG_8debtDBEo,1489 -platformdirs/android.py,sha256=NSxs_zcVet9BQVu0G92lAxrZLY68Od5OhPyVVakROQo,7582 -platformdirs/api.py,sha256=LYtB8bojKxtFO5vLQP_UgybhUNRB-U3qZkgOEU2Ymck,8940 -platformdirs/macos.py,sha256=IeKjw1o0W-PB6JyY7Nc-AK_8d5HbYvnmQuf7jib83FM,5572 -platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -platformdirs/unix.py,sha256=0nWYC6vYOcqFtEdAQny95aQAFk6KCHFGIszpN7Q_WwU,10591 -platformdirs/version.py,sha256=zHPCgW3qJaxaiNpnv9yL0Rd88yr7i297-fD3SAuwRGg,411 -platformdirs/windows.py,sha256=N-ThMYOHeN2YfUOoceYGsuKHHx9YFv8eZbWC41707bQ,10008 diff --git a/libs/platformdirs-4.2.0.dist-info/INSTALLER b/libs/platformdirs-4.3.6.dist-info/INSTALLER similarity index 100% rename from libs/platformdirs-4.2.0.dist-info/INSTALLER rename to libs/platformdirs-4.3.6.dist-info/INSTALLER diff --git a/libs/platformdirs-4.2.0.dist-info/METADATA b/libs/platformdirs-4.3.6.dist-info/METADATA similarity index 89% rename from libs/platformdirs-4.2.0.dist-info/METADATA rename to libs/platformdirs-4.3.6.dist-info/METADATA index 96dea9bd3..91c59c9a2 100644 --- a/libs/platformdirs-4.2.0.dist-info/METADATA +++ b/libs/platformdirs-4.3.6.dist-info/METADATA @@ -1,11 +1,12 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: platformdirs -Version: 4.2.0 -Summary: A small Python package for determining appropriate platform-specific dirs, e.g. a "user data dir". +Version: 4.3.6 +Summary: A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +Project-URL: Changelog, https://github.com/tox-dev/platformdirs/releases Project-URL: Documentation, https://platformdirs.readthedocs.io -Project-URL: Homepage, https://github.com/platformdirs/platformdirs -Project-URL: Source, https://github.com/platformdirs/platformdirs -Project-URL: Tracker, https://github.com/platformdirs/platformdirs/issues +Project-URL: Homepage, https://github.com/tox-dev/platformdirs +Project-URL: Source, https://github.com/tox-dev/platformdirs +Project-URL: Tracker, https://github.com/tox-dev/platformdirs/issues Maintainer-email: Bernát Gábor <gaborjbernat@gmail.com>, Julian Berman <Julian@GrayVines.com>, Ofek Lev <oss@ofek.dev>, Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> License-Expression: MIT License-File: LICENSE @@ -21,28 +22,37 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development :: Libraries :: Python Modules Requires-Python: >=3.8 Provides-Extra: docs -Requires-Dist: furo>=2023.9.10; extra == 'docs' -Requires-Dist: proselint>=0.13; extra == 'docs' -Requires-Dist: sphinx-autodoc-typehints>=1.25.2; extra == 'docs' -Requires-Dist: sphinx>=7.2.6; extra == 'docs' +Requires-Dist: furo>=2024.8.6; extra == 'docs' +Requires-Dist: proselint>=0.14; extra == 'docs' +Requires-Dist: sphinx-autodoc-typehints>=2.4; extra == 'docs' +Requires-Dist: sphinx>=8.0.2; extra == 'docs' Provides-Extra: test Requires-Dist: appdirs==1.4.4; extra == 'test' Requires-Dist: covdefaults>=2.3; extra == 'test' -Requires-Dist: pytest-cov>=4.1; extra == 'test' -Requires-Dist: pytest-mock>=3.12; extra == 'test' -Requires-Dist: pytest>=7.4.3; extra == 'test' +Requires-Dist: pytest-cov>=5; extra == 'test' +Requires-Dist: pytest-mock>=3.14; extra == 'test' +Requires-Dist: pytest>=8.3.2; extra == 'test' +Provides-Extra: type +Requires-Dist: mypy>=1.11.2; extra == 'type' Description-Content-Type: text/x-rst The problem =========== -.. image:: https://github.com/platformdirs/platformdirs/actions/workflows/check.yml/badge.svg +.. image:: https://badge.fury.io/py/platformdirs.svg + :target: https://badge.fury.io/py/platformdirs +.. image:: https://img.shields.io/pypi/pyversions/platformdirs.svg + :target: https://pypi.python.org/pypi/platformdirs/ +.. image:: https://github.com/tox-dev/platformdirs/actions/workflows/check.yaml/badge.svg :target: https://github.com/platformdirs/platformdirs/actions +.. image:: https://static.pepy.tech/badge/platformdirs/month + :target: https://pepy.tech/project/platformdirs When writing desktop application, finding the right location to store user data and configuration varies per platform. Even for single-platform apps, there diff --git a/libs/platformdirs-4.3.6.dist-info/RECORD b/libs/platformdirs-4.3.6.dist-info/RECORD new file mode 100644 index 000000000..a4024095d --- /dev/null +++ b/libs/platformdirs-4.3.6.dist-info/RECORD @@ -0,0 +1,15 @@ +platformdirs-4.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +platformdirs-4.3.6.dist-info/METADATA,sha256=085GgRFo5U1nc9NR8e6unEWKxUjDMsgSHDyaCETsCQ4,11868 +platformdirs-4.3.6.dist-info/RECORD,, +platformdirs-4.3.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +platformdirs-4.3.6.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +platformdirs-4.3.6.dist-info/licenses/LICENSE,sha256=KeD9YukphQ6G6yjD_czwzv30-pSHkBHP-z0NS-1tTbY,1089 +platformdirs/__init__.py,sha256=mVCfMmBM4q24lq6336V3VJncdxaOegI4qQSmQCjkR5E,22284 +platformdirs/__main__.py,sha256=HnsUQHpiBaiTxwcmwVw-nFaPdVNZtQIdi1eWDtI-MzI,1493 +platformdirs/android.py,sha256=kV5oL3V3DZ6WZKu9yFiQupv18yp_jlSV2ChH1TmPcds,9007 +platformdirs/api.py,sha256=2dfUDNbEXeDhDKarqtR5NY7oUikUZ4RZhs3ozstmhBQ,9246 +platformdirs/macos.py,sha256=UlbyFZ8Rzu3xndCqQEHrfsYTeHwYdFap1Ioz-yxveT4,6154 +platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +platformdirs/unix.py,sha256=uRPJWRyQEtv7yOSvU94rUmsblo5XKDLA1SzFg55kbK0,10393 +platformdirs/version.py,sha256=oH4KgTfK4AklbTYVcV_yynvJ9JLI3pyvDVay0hRsLCs,411 +platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125 diff --git a/libs/platformdirs-4.2.0.dist-info/REQUESTED b/libs/platformdirs-4.3.6.dist-info/REQUESTED similarity index 100% rename from libs/platformdirs-4.2.0.dist-info/REQUESTED rename to libs/platformdirs-4.3.6.dist-info/REQUESTED diff --git a/libs/pygments-2.17.2.dist-info/WHEEL b/libs/platformdirs-4.3.6.dist-info/WHEEL similarity index 67% rename from libs/pygments-2.17.2.dist-info/WHEEL rename to libs/platformdirs-4.3.6.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/pygments-2.17.2.dist-info/WHEEL +++ b/libs/platformdirs-4.3.6.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/platformdirs-4.2.0.dist-info/licenses/LICENSE b/libs/platformdirs-4.3.6.dist-info/licenses/LICENSE similarity index 100% rename from libs/platformdirs-4.2.0.dist-info/licenses/LICENSE rename to libs/platformdirs-4.3.6.dist-info/licenses/LICENSE diff --git a/libs/platformdirs/__init__.py b/libs/platformdirs/__init__.py index 75c8bff94..afe8351d2 100644 --- a/libs/platformdirs/__init__.py +++ b/libs/platformdirs/__init__.py @@ -1,6 +1,8 @@ """ -Utilities for determining application-specific dirs. See <https://github.com/platformdirs/platformdirs> for details and -usage. +Utilities for determining application-specific dirs. + +See <https://github.com/platformdirs/platformdirs> for details and usage. + """ from __future__ import annotations @@ -17,30 +19,34 @@ from pathlib import Path from typing import Literal +if sys.platform == "win32": + from platformdirs.windows import Windows as _Result +elif sys.platform == "darwin": + from platformdirs.macos import MacOS as _Result +else: + from platformdirs.unix import Unix as _Result -def _set_platform_dir_class() -> type[PlatformDirsABC]: - if sys.platform == "win32": - from platformdirs.windows import Windows as Result - elif sys.platform == "darwin": - from platformdirs.macos import MacOS as Result - else: - from platformdirs.unix import Unix as Result +def _set_platform_dir_class() -> type[PlatformDirsABC]: if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system": if os.getenv("SHELL") or os.getenv("PREFIX"): - return Result + return _Result - from platformdirs.android import _android_folder + from platformdirs.android import _android_folder # noqa: PLC0415 if _android_folder() is not None: - from platformdirs.android import Android + from platformdirs.android import Android # noqa: PLC0415 - return Android # return to avoid redefinition of result + return Android # return to avoid redefinition of a result - return Result + return _Result -PlatformDirs = _set_platform_dir_class() #: Currently active platform +if TYPE_CHECKING: + # Work around mypy issue: https://github.com/python/mypy/issues/10962 + PlatformDirs = _Result +else: + PlatformDirs = _set_platform_dir_class() #: Currently active platform AppDirs = PlatformDirs #: Backwards compatibility with appdirs @@ -507,7 +513,7 @@ def user_log_path( def user_documents_path() -> Path: - """:returns: documents path tied to the user""" + """:returns: documents a path tied to the user""" return PlatformDirs().user_documents_path @@ -585,41 +591,41 @@ def site_runtime_path( __all__ = [ - "__version__", - "__version_info__", - "PlatformDirs", "AppDirs", + "PlatformDirs", "PlatformDirsABC", - "user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "user_documents_dir", - "user_downloads_dir", - "user_pictures_dir", - "user_videos_dir", - "user_music_dir", - "user_desktop_dir", - "user_runtime_dir", - "site_data_dir", - "site_config_dir", + "__version__", + "__version_info__", "site_cache_dir", + "site_cache_path", + "site_config_dir", + "site_config_path", + "site_data_dir", + "site_data_path", "site_runtime_dir", - "user_data_path", - "user_config_path", + "site_runtime_path", + "user_cache_dir", "user_cache_path", - "user_state_path", - "user_log_path", + "user_config_dir", + "user_config_path", + "user_data_dir", + "user_data_path", + "user_desktop_dir", + "user_desktop_path", + "user_documents_dir", "user_documents_path", + "user_downloads_dir", "user_downloads_path", - "user_pictures_path", - "user_videos_path", + "user_log_dir", + "user_log_path", + "user_music_dir", "user_music_path", - "user_desktop_path", + "user_pictures_dir", + "user_pictures_path", + "user_runtime_dir", "user_runtime_path", - "site_data_path", - "site_config_path", - "site_cache_path", - "site_runtime_path", + "user_state_dir", + "user_state_path", + "user_videos_dir", + "user_videos_path", ] diff --git a/libs/platformdirs/__main__.py b/libs/platformdirs/__main__.py index 4bf27c9c9..922c52135 100644 --- a/libs/platformdirs/__main__.py +++ b/libs/platformdirs/__main__.py @@ -24,7 +24,7 @@ def main() -> None: - """Run main entry point.""" + """Run the main entry point.""" app_name = "MyApp" app_author = "MyCompany" diff --git a/libs/platformdirs/android.py b/libs/platformdirs/android.py index 4acdb6383..7004a8524 100644 --- a/libs/platformdirs/android.py +++ b/libs/platformdirs/android.py @@ -6,17 +6,18 @@ import re import sys from functools import lru_cache -from typing import cast +from typing import TYPE_CHECKING, cast from .api import PlatformDirsABC class Android(PlatformDirsABC): """ - Follows the guidance `from here <https://android.stackexchange.com/a/216132>`_. Makes use of the - `appname <platformdirs.api.PlatformDirsABC.appname>`, - `version <platformdirs.api.PlatformDirsABC.version>`, - `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. + Follows the guidance `from here <https://android.stackexchange.com/a/216132>`_. + + Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, `version + <platformdirs.api.PlatformDirsABC.version>`, `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. + """ @property @@ -44,7 +45,7 @@ def site_config_dir(self) -> str: @property def user_cache_dir(self) -> str: - """:return: cache directory tied to the user, e.g. e.g. ``/data/user/<userid>/<packagename>/cache/<AppName>``""" + """:return: cache directory tied to the user, e.g.,``/data/user/<userid>/<packagename>/cache/<AppName>``""" return self._append_app_name_and_version(cast(str, _android_folder()), "cache") @property @@ -116,16 +117,33 @@ def site_runtime_dir(self) -> str: @lru_cache(maxsize=1) -def _android_folder() -> str | None: +def _android_folder() -> str | None: # noqa: C901 """:return: base folder for the Android OS or None if it cannot be found""" - try: - # First try to get path to android app via pyjnius - from jnius import autoclass - - context = autoclass("android.content.Context") - result: str | None = context.getFilesDir().getParentFile().getAbsolutePath() - except Exception: # noqa: BLE001 - # if fails find an android folder looking path on the sys.path + result: str | None = None + # type checker isn't happy with our "import android", just don't do this when type checking see + # https://stackoverflow.com/a/61394121 + if not TYPE_CHECKING: + try: + # First try to get a path to android app using python4android (if available)... + from android import mActivity # noqa: PLC0415 + + context = cast("android.content.Context", mActivity.getApplicationContext()) # noqa: F821 + result = context.getFilesDir().getParentFile().getAbsolutePath() + except Exception: # noqa: BLE001 + result = None + if result is None: + try: + # ...and fall back to using plain pyjnius, if python4android isn't available or doesn't deliver any useful + # result... + from jnius import autoclass # noqa: PLC0415 + + context = autoclass("android.content.Context") + result = context.getFilesDir().getParentFile().getAbsolutePath() + except Exception: # noqa: BLE001 + result = None + if result is None: + # and if that fails, too, find an android folder looking at path on the sys.path + # warning: only works for apps installed under /data, not adopted storage etc. pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files") for path in sys.path: if pattern.match(path): @@ -133,6 +151,16 @@ def _android_folder() -> str | None: break else: result = None + if result is None: + # one last try: find an android folder looking at path on the sys.path taking adopted storage paths into + # account + pattern = re.compile(r"/mnt/expand/[a-fA-F0-9-]{36}/(data|user/\d+)/(.+)/files") + for path in sys.path: + if pattern.match(path): + result = path.split("/files")[0] + break + else: + result = None return result @@ -141,7 +169,7 @@ def _android_documents_folder() -> str: """:return: documents folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") @@ -157,7 +185,7 @@ def _android_downloads_folder() -> str: """:return: downloads folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") @@ -173,7 +201,7 @@ def _android_pictures_folder() -> str: """:return: pictures folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") @@ -189,7 +217,7 @@ def _android_videos_folder() -> str: """:return: videos folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") @@ -205,7 +233,7 @@ def _android_music_folder() -> str: """:return: music folder for the Android OS""" # Get directories with pyjnius try: - from jnius import autoclass + from jnius import autoclass # noqa: PLC0415 context = autoclass("android.content.Context") environment = autoclass("android.os.Environment") diff --git a/libs/platformdirs/api.py b/libs/platformdirs/api.py index 031a38a3d..18d660e4f 100644 --- a/libs/platformdirs/api.py +++ b/libs/platformdirs/api.py @@ -11,10 +11,10 @@ from typing import Iterator, Literal -class PlatformDirsABC(ABC): +class PlatformDirsABC(ABC): # noqa: PLR0904 """Abstract base class for platform directories.""" - def __init__( # noqa: PLR0913 + def __init__( # noqa: PLR0913, PLR0917 self, appname: str | None = None, appauthor: str | None | Literal[False] = None, @@ -34,34 +34,47 @@ def __init__( # noqa: PLR0913 :param multipath: See `multipath`. :param opinion: See `opinion`. :param ensure_exists: See `ensure_exists`. + """ self.appname = appname #: The name of application. self.appauthor = appauthor """ - The name of the app author or distributing body for this application. Typically, it is the owning company name. - Defaults to `appname`. You may pass ``False`` to disable it. + The name of the app author or distributing body for this application. + + Typically, it is the owning company name. Defaults to `appname`. You may pass ``False`` to disable it. + """ self.version = version """ - An optional version path element to append to the path. You might want to use this if you want multiple versions - of your app to be able to run independently. If used, this would typically be ``<major>.<minor>``. + An optional version path element to append to the path. + + You might want to use this if you want multiple versions of your app to be able to run independently. If used, + this would typically be ``<major>.<minor>``. + """ self.roaming = roaming """ - Whether to use the roaming appdata directory on Windows. That means that for users on a Windows network setup - for roaming profiles, this user data will be synced on login (see - `here <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>`_). + Whether to use the roaming appdata directory on Windows. + + That means that for users on a Windows network setup for roaming profiles, this user data will be synced on + login (see + `here <https://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>`_). + """ self.multipath = multipath """ An optional parameter which indicates that the entire list of data dirs should be returned. + By default, the first item would only be returned. + """ self.opinion = opinion #: A flag to indicating to use opinionated values. self.ensure_exists = ensure_exists """ Optionally create the directory (and any missing parents) upon access if it does not exist. + By default, no directories are created. + """ def _append_app_name_and_version(self, *base: str) -> str: @@ -78,6 +91,12 @@ def _optionally_create_directory(self, path: str) -> None: if self.ensure_exists: Path(path).mkdir(parents=True, exist_ok=True) + def _first_item_as_path_if_multipath(self, directory: str) -> Path: + if self.multipath: + # If multipath is True, the first path is returned. + directory = directory.split(os.pathsep)[0] + return Path(directory) + @property @abstractmethod def user_data_dir(self) -> str: @@ -200,7 +219,7 @@ def user_log_path(self) -> Path: @property def user_documents_path(self) -> Path: - """:return: documents path tied to the user""" + """:return: documents a path tied to the user""" return Path(self.user_documents_dir) @property diff --git a/libs/platformdirs/macos.py b/libs/platformdirs/macos.py index b7b48808c..e4b0391ab 100644 --- a/libs/platformdirs/macos.py +++ b/libs/platformdirs/macos.py @@ -4,17 +4,24 @@ import os.path import sys +from typing import TYPE_CHECKING from .api import PlatformDirsABC +if TYPE_CHECKING: + from pathlib import Path + class MacOS(PlatformDirsABC): """ - Platform directories for the macOS operating system. Follows the guidance from `Apple documentation - <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_. + Platform directories for the macOS operating system. + + Follows the guidance from + `Apple documentation <https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html>`_. Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, `version <platformdirs.api.PlatformDirsABC.version>`, `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. + """ @property @@ -28,7 +35,7 @@ def site_data_dir(self) -> str: :return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``. If we're using a Python binary managed by `Homebrew <https://brew.sh>`_, the directory will be under the Homebrew prefix, e.g. ``/opt/homebrew/share/$appname/$version``. - If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled and we're in Homebrew, + If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled, and we're in Homebrew, the response is a multi-path string separated by ":", e.g. ``/opt/homebrew/share/$appname/$version:/Library/Application Support/$appname/$version`` """ @@ -39,6 +46,11 @@ def site_data_dir(self) -> str: return os.pathsep.join(path_list) return path_list[0] + @property + def site_data_path(self) -> Path: + """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" + return self._first_item_as_path_if_multipath(self.site_data_dir) + @property def user_config_dir(self) -> str: """:return: config directory tied to the user, same as `user_data_dir`""" @@ -60,7 +72,7 @@ def site_cache_dir(self) -> str: :return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``. If we're using a Python binary managed by `Homebrew <https://brew.sh>`_, the directory will be under the Homebrew prefix, e.g. ``/opt/homebrew/var/cache/$appname/$version``. - If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled and we're in Homebrew, + If `multipath <platformdirs.api.PlatformDirsABC.multipath>` is enabled, and we're in Homebrew, the response is a multi-path string separated by ":", e.g. ``/opt/homebrew/var/cache/$appname/$version:/Library/Caches/$appname/$version`` """ @@ -71,6 +83,11 @@ def site_cache_dir(self) -> str: return os.pathsep.join(path_list) return path_list[0] + @property + def site_cache_path(self) -> Path: + """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" + return self._first_item_as_path_if_multipath(self.site_cache_dir) + @property def user_state_dir(self) -> str: """:return: state directory tied to the user, same as `user_data_dir`""" diff --git a/libs/platformdirs/unix.py b/libs/platformdirs/unix.py index ca4728e60..f1942e92e 100644 --- a/libs/platformdirs/unix.py +++ b/libs/platformdirs/unix.py @@ -6,13 +6,13 @@ import sys from configparser import ConfigParser from pathlib import Path -from typing import Iterator +from typing import Iterator, NoReturn from .api import PlatformDirsABC if sys.platform == "win32": - def getuid() -> int: + def getuid() -> NoReturn: msg = "should only be used on Unix" raise RuntimeError(msg) @@ -20,17 +20,17 @@ def getuid() -> int: from os import getuid -class Unix(PlatformDirsABC): +class Unix(PlatformDirsABC): # noqa: PLR0904 """ - On Unix/Linux, we follow the - `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_. The spec allows - overriding directories with environment variables. The examples show are the default values, alongside the name of - the environment variable that overrides them. Makes use of the - `appname <platformdirs.api.PlatformDirsABC.appname>`, - `version <platformdirs.api.PlatformDirsABC.version>`, - `multipath <platformdirs.api.PlatformDirsABC.multipath>`, - `opinion <platformdirs.api.PlatformDirsABC.opinion>`, - `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. + On Unix/Linux, we follow the `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec- + latest.html>`_. + + The spec allows overriding directories with environment variables. The examples shown are the default values, + alongside the name of the environment variable that overrides them. Makes use of the `appname + <platformdirs.api.PlatformDirsABC.appname>`, `version <platformdirs.api.PlatformDirsABC.version>`, `multipath + <platformdirs.api.PlatformDirsABC.multipath>`, `opinion <platformdirs.api.PlatformDirsABC.opinion>`, `ensure_exists + <platformdirs.api.PlatformDirsABC.ensure_exists>`. + """ @property @@ -205,25 +205,19 @@ def site_runtime_dir(self) -> str: @property def site_data_path(self) -> Path: - """:return: data path shared by users. Only return first item, even if ``multipath`` is set to ``True``""" + """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" return self._first_item_as_path_if_multipath(self.site_data_dir) @property def site_config_path(self) -> Path: - """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``""" + """:return: config path shared by the users, returns the first item, even if ``multipath`` is set to ``True``""" return self._first_item_as_path_if_multipath(self.site_config_dir) @property def site_cache_path(self) -> Path: - """:return: cache path shared by users. Only return first item, even if ``multipath`` is set to ``True``""" + """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" return self._first_item_as_path_if_multipath(self.site_cache_dir) - def _first_item_as_path_if_multipath(self, directory: str) -> Path: - if self.multipath: - # If multipath is True, the first path is returned. - directory = directory.split(os.pathsep)[0] - return Path(directory) - def iter_config_dirs(self) -> Iterator[str]: """:yield: all user and site configuration directories.""" yield self.user_config_dir @@ -246,7 +240,12 @@ def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str: def _get_user_dirs_folder(key: str) -> str | None: - """Return directory from user-dirs.dirs config file. See https://freedesktop.org/wiki/Software/xdg-user-dirs/.""" + """ + Return directory from user-dirs.dirs config file. + + See https://freedesktop.org/wiki/Software/xdg-user-dirs/. + + """ user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs" if user_dirs_config_path.exists(): parser = ConfigParser() diff --git a/libs/platformdirs/version.py b/libs/platformdirs/version.py index cc1e34568..afb49243e 100644 --- a/libs/platformdirs/version.py +++ b/libs/platformdirs/version.py @@ -12,5 +12,5 @@ __version_tuple__: VERSION_TUPLE version_tuple: VERSION_TUPLE -__version__ = version = '4.2.0' -__version_tuple__ = version_tuple = (4, 2, 0) +__version__ = version = '4.3.6' +__version_tuple__ = version_tuple = (4, 3, 6) diff --git a/libs/platformdirs/windows.py b/libs/platformdirs/windows.py index c62d0c8d2..d7bc96091 100644 --- a/libs/platformdirs/windows.py +++ b/libs/platformdirs/windows.py @@ -2,7 +2,6 @@ from __future__ import annotations -import ctypes import os import sys from functools import lru_cache @@ -16,15 +15,13 @@ class Windows(PlatformDirsABC): """ - `MSDN on where to store app data files - <http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120>`_. - Makes use of the - `appname <platformdirs.api.PlatformDirsABC.appname>`, - `appauthor <platformdirs.api.PlatformDirsABC.appauthor>`, - `version <platformdirs.api.PlatformDirsABC.version>`, - `roaming <platformdirs.api.PlatformDirsABC.roaming>`, - `opinion <platformdirs.api.PlatformDirsABC.opinion>`, - `ensure_exists <platformdirs.api.PlatformDirsABC.ensure_exists>`. + `MSDN on where to store app data files <https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid>`_. + + Makes use of the `appname <platformdirs.api.PlatformDirsABC.appname>`, `appauthor + <platformdirs.api.PlatformDirsABC.appauthor>`, `version <platformdirs.api.PlatformDirsABC.version>`, `roaming + <platformdirs.api.PlatformDirsABC.roaming>`, `opinion <platformdirs.api.PlatformDirsABC.opinion>`, `ensure_exists + <platformdirs.api.PlatformDirsABC.ensure_exists>`. + """ @property @@ -165,7 +162,7 @@ def get_win_folder_from_env_vars(csidl_name: str) -> str: def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None: - """Get folder for a CSIDL name that does not exist as an environment variable.""" + """Get a folder for a CSIDL name that does not exist as an environment variable.""" if csidl_name == "CSIDL_PERSONAL": return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents") # noqa: PTH118 @@ -189,6 +186,7 @@ def get_win_folder_from_registry(csidl_name: str) -> str: This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer for all CSIDL_* names. + """ shell_folder_name = { "CSIDL_APPDATA": "AppData", @@ -205,7 +203,7 @@ def get_win_folder_from_registry(csidl_name: str) -> str: raise ValueError(msg) if sys.platform != "win32": # only needed for mypy type checker to know that this code runs only on Windows raise NotImplementedError - import winreg + import winreg # noqa: PLC0415 key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") directory, _ = winreg.QueryValueEx(key, shell_folder_name) @@ -218,6 +216,8 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str: # Use 'CSIDL_PROFILE' (40) and append the default folder 'Downloads' instead. # https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid + import ctypes # noqa: PLC0415 + csidl_const = { "CSIDL_APPDATA": 26, "CSIDL_COMMON_APPDATA": 35, @@ -250,10 +250,15 @@ def get_win_folder_via_ctypes(csidl_name: str) -> str: def _pick_get_win_folder() -> Callable[[str], str]: - if hasattr(ctypes, "windll"): - return get_win_folder_via_ctypes try: - import winreg # noqa: F401 + import ctypes # noqa: PLC0415 + except ImportError: + pass + else: + if hasattr(ctypes, "windll"): + return get_win_folder_via_ctypes + try: + import winreg # noqa: PLC0415, F401 except ImportError: return get_win_folder_from_env_vars else: diff --git a/libs/pvectorc.cpython-38-darwin.so b/libs/pvectorc.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..56e9bb21f0305b9d76fe9c65f346a7df35c7dda3 GIT binary patch literal 39120 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 aD(LK{S@Raok+)PtjhmAamjjNk2mTXV!bj== literal 0 HcmV?d00001 diff --git a/libs/pycountry-23.12.11.dist-info/METADATA b/libs/pycountry-23.12.11.dist-info/METADATA deleted file mode 100644 index b64240387..000000000 --- a/libs/pycountry-23.12.11.dist-info/METADATA +++ /dev/null @@ -1,384 +0,0 @@ -Metadata-Version: 2.1 -Name: pycountry -Version: 23.12.11 -Summary: ISO country, subdivision, language, currency and script definitions and their translations -Home-page: https://github.com/flyingcircusio/pycountry -License: LGPL 2.1 -Keywords: country,subdivision,language,currency,iso,3166,639,4217,15924,3166-1,3166-2,3166-3 -Author: Christian Theune -Author-email: ct@flyingcircus.io -Maintainer: Nate Schimmoller -Maintainer-email: nschimmo@gmail.com -Requires-Python: >=3.8 -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2) -Classifier: License :: Other/Proprietary License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -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 :: 3.12 -Classifier: Topic :: Software Development :: Internationalization -Classifier: Topic :: Software Development :: Localization -Requires-Dist: importlib-resources (>=5.12.0,<6.0.0) ; python_version < "3.9" -Project-URL: Repository, https://github.com/flyingcircusio/pycountry -Description-Content-Type: text/x-rst - -pycountry -========= - -.. image:g: https://travis-ci.org/flyingcircusio/pycountry.svg?branch=master - -pycountry provides the ISO databases for the standards: - -* `639-3 <https://en.wikipedia.org/wiki/ISO_639-3>`_ Languages -* `3166 <https://en.wikipedia.org/wiki/ISO_3166>`_ Codes for representation of names of countries and their subdivisions -* `3166-1 <https://en.wikipedia.org/wiki/ISO_3166-1>`_ Countries -* `3166-3 <https://en.wikipedia.org/wiki/ISO_3166-3>`_ Deleted countries -* `3166-2 <https://en.wikipedia.org/wiki/ISO_3166-2>`_ Subdivisions of countries -* `4217 <https://en.wikipedia.org/wiki/ISO_4217>`_ Currencies -* `15924 <https://en.wikipedia.org/wiki/ISO_15924>`_ Scripts - -The package includes a copy from Debian's `pkg-isocodes -<https://salsa.debian.org/iso-codes-team/iso-codes>`_ and makes the data -accessible through a Python API. - -Translation files for the various strings are included as well. - -Data update policy ------------------- - -No changes to the data will be accepted into pycountry. This is a pure wrapper -around the ISO standard using the `pkg-isocodes` database from Debian *as is*. -If you need changes to the political situation in the world, please talk to -the ISO or Debian people, not me. - -Donations / Monetary Support ----------------------------- - -This is a small project that I maintain in my personal time. I am not -interested in personal financial gain. However, if you would like to support -the project then I would love if you would donate to `Feminist Frequency -<https://feministfrequency.com/donate/>`_ instead. Also, let the world know you -did so, so that others can follow your path. - -Contributions -------------- - -The code lives in a `git repository on GitHub -<https://github.com/flyingcircusio/pycountry>`_, and issues must be reported in there as well. - -Countries (ISO 3166-1) ----------------------- - -Countries are accessible through a database object that is already configured -upon import of pycountry and works as an iterable: - -.. code:: pycon - - >>> import pycountry - >>> len(pycountry.countries) - 249 - >>> list(pycountry.countries)[0] - Country(alpha_2='AF', alpha_3='AFG', name='Afghanistan', numeric='004', official_name='Islamic Republic of Afghanistan') - -Specific countries can be looked up by their various codes and provide the -information included in the standard as attributes: - -.. code:: pycon - - >>> germany = pycountry.countries.get(alpha_2='DE') - >>> germany - Country(alpha_2='DE', alpha_3='DEU', name='Germany', numeric='276', official_name='Federal Republic of Germany') - >>> germany.alpha_2 - 'DE' - >>> germany.alpha_3 - 'DEU' - >>> germany.numeric - '276' - >>> germany.name - 'Germany' - >>> germany.official_name - 'Federal Republic of Germany' - -There's also a "fuzzy" search to help people discover "proper" countries for -names that might only actually be subdivisions. The fuzziness also includes -normalizing unicode accents. There's also a bit of prioritization included -to prefer matches on country names before subdivision names and have countries -with more matches be listed before ones with fewer matches: - -.. code:: pycon - - >>> pycountry.countries.search_fuzzy('England') - [Country(alpha_2='GB', alpha_3='GBR', name='United Kingdom', numeric='826', official_name='United Kingdom of Great Britain and Northern Ireland')] - - >>> pycountry.countries.search_fuzzy('Cote') - [Country(alpha_2='CI', alpha_3='CIV', name="Côte d'Ivoire", numeric='384', official_name="Republic of Côte d'Ivoire"), - Country(alpha_2='FR', alpha_3='FRA', name='France', numeric='250', official_name='French Republic'), - Country(alpha_2='HN', alpha_3='HND', name='Honduras', numeric='340', official_name='Republic of Honduras')] - -Attributes for the country class can be accessed using the `__getattr__` method. If the requested attribute is a key for the country class, it will return the corresponding value. In the special cases of missing 'common_name' or 'official_name' attributes, `__getattr__` will return 'name'. Here are some examples: - -.. code:: pycon - - >>> aland = pycountry.countries.get(alpha_2='AX') - - >>> print(aland) - Country(alpha_2='AX', alpha_3='ALA', flag='🇦🇽', name='Åland Islands', numeric='248') - - >>> aland.common_name - UserWarning: Country's common_name not found. Country name provided instead. - warnings.warn(warning_message, UserWarning) - 'Åland Islands' - - >>> aland.official_name - Country's official_name not found. Country name provided instead. - warnings.warn(warning_message, UserWarning) - 'Åland Islands' - - >>> aland.flag - '🇦🇽' - - >>> aland.foo # Raises AttributeError - -Historic Countries (ISO 3166-3) -------------------------------- - -The `historic_countries` database contains former countries that have been -removed from the standard and are now included in ISO 3166-3, excluding -existing ones: - -.. code:: pycon - - >>> ussr = pycountry.historic_countries.get(alpha_3='SUN') - >>> ussr - Country(alpha_3='SUN', alpha_4='SUHH', withdrawal_date='1992-08-30', name='USSR, Union of Soviet Socialist Republics', numeric='810') - >>> ussr.alpha_4 - 'SUHH' - >>> ussr.alpha_3 - 'SUN' - >>> ussr.name - 'USSR, Union of Soviet Socialist Republics' - >>> ussr.withdrawal_date - '1992-08-30' - - -Country subdivisions (ISO 3166-2) ---------------------------------- - -The country subdivisions are a little more complex than the countries itself -because they provide a nested and typed structure. - -All subdivisons can be accessed directly: - -.. code:: pycon - - >>> len(pycountry.subdivisions) - 4847 - >>> list(pycountry.subdivisions)[0] - Subdivision(code='AD-07', country_code='AD', name='Andorra la Vella', parent_code=None, type='Parish') - -Subdivisions can be accessed using their unique code. The resulting object will provide at least -their code, name and type: - -.. code:: pycon - - >>> de_st = pycountry.subdivisions.get(code='DE-ST') - >>> de_st.code - 'DE-ST' - >>> de_st.name - 'Sachsen-Anhalt' - >>> de_st.type - 'State' - >>> de_st.country - Country(alpha_2='DE', alpha_3='DEU', name='Germany', numeric='276', official_name='Federal Republic of Germany') - -Some subdivisions specify another subdivision as a parent: - -.. code:: pycon - - >>> al_br = pycountry.subdivisions.get(code='AL-BU') - >>> al_br.code - 'AL-BU' - >>> al_br.name - 'Bulqiz\xeb' - >>> al_br.type - 'District' - >>> al_br.parent_code - 'AL-09' - >>> al_br.parent - Subdivision(code='AL-09', country_code='AL', name='Dib\xebr', parent_code=None, type='County') - >>> al_br.parent.name - 'Dib\xebr' - -The divisions of a single country can be queried using the country_code index: - -.. code:: pycon - - >>> len(pycountry.subdivisions.get(country_code='DE')) - 16 - - >>> len(pycountry.subdivisions.get(country_code='US')) - 57 - -Similar to countries, the `search_fuzzy` method has been implemented for subdivisions to facilitate finding relevant subdivision entries. This method includes unicode normalization for accents and prioritizes matches on subdivision names. The search algorithm is designed to return more relevant matches first: - -This method is especially useful for cases where the exact name or code of the subdivision is not known. - -.. code:: pycon - - >>> pycountry.subdivisions.search_fuzzy('York') - [Subdivision(code='GB-YOR', country_code='GB', name='York', parent='GB-ENG', parent_code='GB-GB-ENG', type='Unitary authority') - Subdivision(code='GB-ERY', country_code='GB', name='East Riding of Yorkshire', parent='GB-ENG', parent_code='GB-GB-ENG', type='Unitary authority') - Subdivision(code='GB-NYK', country_code='GB', name='North Yorkshire', parent='GB-ENG', parent_code='GB-GB-ENG', type='Two-tier county') - Subdivision(code='US-NY', country_code='US', name='New York', parent_code=None, type='State')] - -Scripts (ISO 15924) -------------------- - -Scripts are available from a database similar to the countries: - -.. code:: pycon - - >>> len(pycountry.scripts) - 169 - >>> list(pycountry.scripts)[0] - Script(alpha_4='Afak', name='Afaka', numeric='439') - - >>> latin = pycountry.scripts.get(name='Latin') - >>> latin - Script(alpha_4='Latn', name='Latin', numeric='215') - >>> latin.alpha4 - 'Latn' - >>> latin.name - 'Latin' - >>> latin.numeric - '215' - - -Currencies (ISO 4217) ---------------------- - -The currencies database is, again, similar to the ones before: - -.. code:: pycon - - >>> len(pycountry.currencies) - 182 - >>> list(pycountry.currencies)[0] - Currency(alpha_3='AED', name='UAE Dirham', numeric='784') - >>> argentine_peso = pycountry.currencies.get(alpha_3='ARS') - >>> argentine_peso - Currency(alpha_3='ARS', name='Argentine Peso', numeric='032') - >>> argentine_peso.alpha_3 - 'ARS' - >>> argentine_peso.name - 'Argentine Peso' - >>> argentine_peso.numeric - '032' - - -Languages (ISO 639-3) ---------------------- - -The languages database is similar too: - -.. code:: pycon - - >>> len(pycountry.languages) - 7874 - >>> list(pycountry.languages)[0] - Language(alpha_3='aaa', name='Ghotuo', scope='I', type='L') - - >>> aragonese = pycountry.languages.get(alpha_2='an') - >>> aragonese.alpha_2 - 'an' - >>> aragonese.alpha_3 - 'arg' - >>> aragonese.name - 'Aragonese' - - >>> bengali = pycountry.languages.get(alpha_2='bn') - >>> bengali.name - 'Bengali' - >>> bengali.common_name - 'Bangla' - -Locales -------- - -Locales are available in the `pycountry.LOCALES_DIR` subdirectory of this -package. The translation domains are called `isoXXX` according to the standard -they provide translations for. The directory is structured in a way compatible -to Python's gettext module. - -Here is an example translating language names: - -.. code:: pycon - - >>> import gettext - >>> german = gettext.translation('iso3166-1', pycountry.LOCALES_DIR, - ... languages=['de']) - >>> german.install() - >>> _('Germany') - 'Deutschland' - - -Lookups -------- - -For each database (countries, languages, scripts, etc.), you can also look up -entities case insensitively without knowing which key the value may match. For -example: - -.. code:: pycon - - >>> pycountry.countries.lookup('de') - <pycountry.db.Country object at 0x...> - -The search ends with the first match, which is returned. - - -Dict Compatibility ------------------- - -You can cast each object type into a `dict`: - -.. code:: pycon - - >>> country = pycountry.countries.lookup('de') - >>> dict(country) - {'alpha_2': 'DE', 'name': 'Germany', ...} - - -Custom Countries ----------------- - -While pycountry will not be adding non-ISO values to its standard library, -you can add or remove entries at runtime to fit your needs. - -Add a non-ISO country: - -.. code:: pycon - - >>> pycountry.countries.add_entry(alpha_2="XK", alpha_3="XXK", name="Kosovo", numeric="926") - -Remove a country from a database: - -.. code:: pycon - - >>> pycountry.countries.remove_entry(alpha_2="XK") - - -PyInstaller Compatibility -------------------------- - -Some users have reported issues using PyCountry with PyInstaller guidance on -how to handle the issues can be found in the `PyInstaller Google Group -<https://groups.google.com/g/pyinstaller/c/OYhJdeZ9010/m/vLhYAWUzAQAJ>`_. - diff --git a/libs/pycountry-23.12.11.dist-info/WHEEL b/libs/pycountry-23.12.11.dist-info/WHEEL deleted file mode 100644 index d73ccaae8..000000000 --- a/libs/pycountry-23.12.11.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/libs/pycountry-23.12.11.dist-info/INSTALLER b/libs/pycountry-24.6.1.dist-info/INSTALLER similarity index 100% rename from libs/pycountry-23.12.11.dist-info/INSTALLER rename to libs/pycountry-24.6.1.dist-info/INSTALLER diff --git a/libs/pycountry-23.12.11.dist-info/LICENSE.txt b/libs/pycountry-24.6.1.dist-info/LICENSE.txt similarity index 100% rename from libs/pycountry-23.12.11.dist-info/LICENSE.txt rename to libs/pycountry-24.6.1.dist-info/LICENSE.txt diff --git a/libs/pycountry-24.6.1.dist-info/METADATA b/libs/pycountry-24.6.1.dist-info/METADATA new file mode 100644 index 000000000..67e077ff2 --- /dev/null +++ b/libs/pycountry-24.6.1.dist-info/METADATA @@ -0,0 +1,410 @@ +Metadata-Version: 2.1 +Name: pycountry +Version: 24.6.1 +Summary: ISO country, subdivision, language, currency and script definitions and their translations +Home-page: https://github.com/flyingcircusio/pycountry +License: LGPL-2.1-only +Keywords: country,subdivision,language,currency,iso,3166,639,4217,15924,3166-1,3166-2,3166-3 +Author: Christian Theune +Author-email: ct@flyingcircus.io +Maintainer: Nate Schimmoller +Maintainer-email: nschimmo@gmail.com +Requires-Python: >=3.8 +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Information Technology +Classifier: License :: OSI Approved +Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +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 :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Topic :: Software Development :: Internationalization +Classifier: Topic :: Software Development :: Localization +Requires-Dist: importlib-resources (>5.12.0) ; python_version < "3.9" +Project-URL: Repository, https://github.com/flyingcircusio/pycountry +Description-Content-Type: text/x-rst + +########### + pycountry +########### + +.. + image:g: https://travis-ci.org/flyingcircusio/pycountry.svg?branch=master + +pycountry provides the ISO databases for the standards: + +- `639-3 <https://en.wikipedia.org/wiki/ISO_639-3>`_ Languages +- `3166 <https://en.wikipedia.org/wiki/ISO_3166>`_ Codes for + representation of names of countries and their subdivisions +- `3166-1 <https://en.wikipedia.org/wiki/ISO_3166-1>`_ Countries +- `3166-3 <https://en.wikipedia.org/wiki/ISO_3166-3>`_ Deleted + countries +- `3166-2 <https://en.wikipedia.org/wiki/ISO_3166-2>`_ Subdivisions of + countries +- `4217 <https://en.wikipedia.org/wiki/ISO_4217>`_ Currencies +- `15924 <https://en.wikipedia.org/wiki/ISO_15924>`_ Scripts + +The package includes a copy from Debian's `pkg-isocodes +<https://salsa.debian.org/iso-codes-team/iso-codes>`_ and makes the data +accessible through a Python API. + +Translation files for the various strings are included as well. + +******************** + Data update policy +******************** + +No changes to the data will be accepted into pycountry. This is a pure +wrapper around the ISO standard using the ``pkg-isocodes`` database from +Debian *as is*. If you need changes to the political situation in the +world, please talk to the ISO or Debian people, not me. + +****************************** + Donations / Monetary Support +****************************** + +This is a small project that I maintain in my personal time. I am not +interested in personal financial gain. However, if you would like to +support the project then I would love if you would donate to `Feminist +Frequency <https://feministfrequency.com/donate/>`_ instead. Also, let +the world know you did so, so that others can follow your path. + +*************** + Contributions +*************** + +The code lives in a `git repository on GitHub +<https://github.com/pycountry/pycountry>`_, and issues must be reported +in there as well. + +************************ + Countries (ISO 3166-1) +************************ + +Countries are accessible through a database object that is already +configured upon import of pycountry and works as an iterable: + +.. code:: pycon + + >>> import pycountry + >>> len(pycountry.countries) + 249 + >>> list(pycountry.countries)[0] + Country(alpha_2='AF', alpha_3='AFG', name='Afghanistan', numeric='004', official_name='Islamic Republic of Afghanistan') + +Specific countries can be looked up by their various codes and provide +the information included in the standard as attributes: + +.. code:: pycon + + >>> germany = pycountry.countries.get(alpha_2='DE') + >>> germany + Country(alpha_2='DE', alpha_3='DEU', name='Germany', numeric='276', official_name='Federal Republic of Germany') + >>> germany.alpha_2 + 'DE' + >>> germany.alpha_3 + 'DEU' + >>> germany.numeric + '276' + >>> germany.name + 'Germany' + >>> germany.official_name + 'Federal Republic of Germany' + +There's also a "fuzzy" search to help people discover "proper" countries +for names that might only actually be subdivisions. The fuzziness also +includes normalizing unicode accents. There's also a bit of +prioritization included to prefer matches on country names before +subdivision names and have countries with more matches be listed before +ones with fewer matches: + +.. code:: pycon + + >>> pycountry.countries.search_fuzzy('England') + [Country(alpha_2='GB', alpha_3='GBR', name='United Kingdom', numeric='826', official_name='United Kingdom of Great Britain and Northern Ireland')] + + >>> pycountry.countries.search_fuzzy('Cote') + [Country(alpha_2='CI', alpha_3='CIV', name="Côte d'Ivoire", numeric='384', official_name="Republic of Côte d'Ivoire"), + Country(alpha_2='FR', alpha_3='FRA', name='France', numeric='250', official_name='French Republic'), + Country(alpha_2='HN', alpha_3='HND', name='Honduras', numeric='340', official_name='Republic of Honduras')] + +Attributes for the country class can be accessed using the +``__getattr__`` method. If the requested attribute is a key for the +country class, it will return the corresponding value. In the special +cases of missing 'common_name' or 'official_name' attributes, +``__getattr__`` will return 'name'. Here are some examples: + +.. code:: pycon + + >>> aland = pycountry.countries.get(alpha_2='AX') + + >>> print(aland) + Country(alpha_2='AX', alpha_3='ALA', flag='🇦🇽', name='Åland Islands', numeric='248') + + >>> aland.common_name + UserWarning: Country's common_name not found. Country name provided instead. + warnings.warn(warning_message, UserWarning) + 'Åland Islands' + + >>> aland.official_name + Country's official_name not found. Country name provided instead. + warnings.warn(warning_message, UserWarning) + 'Åland Islands' + + >>> aland.flag + '🇦🇽' + + >>> aland.foo # Raises AttributeError + +********************************* + Historic Countries (ISO 3166-3) +********************************* + +The ``historic_countries`` database contains former countries that have +been removed from the standard and are now included in ISO 3166-3, +excluding existing ones: + +.. code:: pycon + + >>> ussr = pycountry.historic_countries.get(alpha_3='SUN') + >>> ussr + Country(alpha_3='SUN', alpha_4='SUHH', withdrawal_date='1992-08-30', name='USSR, Union of Soviet Socialist Republics', numeric='810') + >>> ussr.alpha_4 + 'SUHH' + >>> ussr.alpha_3 + 'SUN' + >>> ussr.name + 'USSR, Union of Soviet Socialist Republics' + >>> ussr.withdrawal_date + '1992-08-30' + +*********************************** + Country subdivisions (ISO 3166-2) +*********************************** + +The country subdivisions are a little more complex than the countries +itself because they provide a nested and typed structure. + +All subdivisons can be accessed directly: + +.. code:: pycon + + >>> len(pycountry.subdivisions) + 4847 + >>> list(pycountry.subdivisions)[0] + Subdivision(code='AD-07', country_code='AD', name='Andorra la Vella', parent_code=None, type='Parish') + +Subdivisions can be accessed using their unique code. The resulting +object will provide at least their code, name and type: + +.. code:: pycon + + >>> de_st = pycountry.subdivisions.get(code='DE-ST') + >>> de_st.code + 'DE-ST' + >>> de_st.name + 'Sachsen-Anhalt' + >>> de_st.type + 'State' + >>> de_st.country + Country(alpha_2='DE', alpha_3='DEU', name='Germany', numeric='276', official_name='Federal Republic of Germany') + +Some subdivisions specify another subdivision as a parent: + +.. code:: pycon + + >>> al_br = pycountry.subdivisions.get(code='AL-BU') + >>> al_br.code + 'AL-BU' + >>> al_br.name + 'Bulqiz\xeb' + >>> al_br.type + 'District' + >>> al_br.parent_code + 'AL-09' + >>> al_br.parent + Subdivision(code='AL-09', country_code='AL', name='Dib\xebr', parent_code=None, type='County') + >>> al_br.parent.name + 'Dib\xebr' + +The divisions of a single country can be queried using the country_code +index: + +.. code:: pycon + + >>> len(pycountry.subdivisions.get(country_code='DE')) + 16 + + >>> len(pycountry.subdivisions.get(country_code='US')) + 57 + +Similar to countries, the ``search_fuzzy`` method has been implemented +for subdivisions to facilitate finding relevant subdivision entries. +This method includes unicode normalization for accents and prioritizes +matches on subdivision names. The search algorithm is designed to return +more relevant matches first: + +This method is especially useful for cases where the exact name or code +of the subdivision is not known. + +.. code:: pycon + + >>> pycountry.subdivisions.search_fuzzy('York') + [Subdivision(code='GB-YOR', country_code='GB', name='York', parent='GB-ENG', parent_code='GB-GB-ENG', type='Unitary authority') + Subdivision(code='GB-ERY', country_code='GB', name='East Riding of Yorkshire', parent='GB-ENG', parent_code='GB-GB-ENG', type='Unitary authority') + Subdivision(code='GB-NYK', country_code='GB', name='North Yorkshire', parent='GB-ENG', parent_code='GB-GB-ENG', type='Two-tier county') + Subdivision(code='US-NY', country_code='US', name='New York', parent_code=None, type='State')] + +********************* + Scripts (ISO 15924) +********************* + +Scripts are available from a database similar to the countries: + +.. code:: pycon + + >>> len(pycountry.scripts) + 169 + >>> list(pycountry.scripts)[0] + Script(alpha_4='Afak', name='Afaka', numeric='439') + + >>> latin = pycountry.scripts.get(name='Latin') + >>> latin + Script(alpha_4='Latn', name='Latin', numeric='215') + >>> latin.alpha4 + 'Latn' + >>> latin.name + 'Latin' + >>> latin.numeric + '215' + +*********************** + Currencies (ISO 4217) +*********************** + +The currencies database is, again, similar to the ones before: + +.. code:: pycon + + >>> len(pycountry.currencies) + 182 + >>> list(pycountry.currencies)[0] + Currency(alpha_3='AED', name='UAE Dirham', numeric='784') + >>> argentine_peso = pycountry.currencies.get(alpha_3='ARS') + >>> argentine_peso + Currency(alpha_3='ARS', name='Argentine Peso', numeric='032') + >>> argentine_peso.alpha_3 + 'ARS' + >>> argentine_peso.name + 'Argentine Peso' + >>> argentine_peso.numeric + '032' + +*********************** + Languages (ISO 639-3) +*********************** + +The languages database is similar too: + +.. code:: pycon + + >>> len(pycountry.languages) + 7874 + >>> list(pycountry.languages)[0] + Language(alpha_3='aaa', name='Ghotuo', scope='I', type='L') + + >>> aragonese = pycountry.languages.get(alpha_2='an') + >>> aragonese.alpha_2 + 'an' + >>> aragonese.alpha_3 + 'arg' + >>> aragonese.name + 'Aragonese' + + >>> bengali = pycountry.languages.get(alpha_2='bn') + >>> bengali.name + 'Bengali' + >>> bengali.common_name + 'Bangla' + +********* + Locales +********* + +Locales are available in the ``pycountry.LOCALES_DIR`` subdirectory of +this package. The translation domains are called ``isoXXX`` according to +the standard they provide translations for. The directory is structured +in a way compatible to Python's gettext module. + +Here is an example translating language names: + +.. code:: pycon + + >>> import gettext + >>> german = gettext.translation('iso3166-1', pycountry.LOCALES_DIR, + ... languages=['de']) + >>> german.install() + >>> _('Germany') + 'Deutschland' + +********* + Lookups +********* + +For each database (countries, languages, scripts, etc.), you can also +look up entities case insensitively without knowing which key the value +may match. For example: + +.. code:: pycon + + >>> pycountry.countries.lookup('de') + <pycountry.db.Country object at 0x...> + +The search ends with the first match, which is returned. + +******************** + Dict Compatibility +******************** + +You can cast each object type into a ``dict``: + +.. code:: pycon + + >>> country = pycountry.countries.lookup('de') + >>> dict(country) + {'alpha_2': 'DE', 'name': 'Germany', ...} + +****************** + Custom Countries +****************** + +While pycountry will not be adding non-ISO values to its standard +library, you can add or remove entries at runtime to fit your needs. + +Add a non-ISO country: + +.. code:: pycon + + >>> pycountry.countries.add_entry(alpha_2="XK", alpha_3="XXK", name="Kosovo", numeric="926") + +Remove a country from a database: + +.. code:: pycon + + >>> pycountry.countries.remove_entry(alpha_2="XK") + +*************************** + PyInstaller Compatibility +*************************** + +Some users have reported issues using PyCountry with PyInstaller +guidance on how to handle the issues can be found in the `PyInstaller +Google Group +<https://groups.google.com/g/pyinstaller/c/OYhJdeZ9010/m/vLhYAWUzAQAJ>`_. + diff --git a/libs/pycountry-23.12.11.dist-info/RECORD b/libs/pycountry-24.6.1.dist-info/RECORD similarity index 80% rename from libs/pycountry-23.12.11.dist-info/RECORD rename to libs/pycountry-24.6.1.dist-info/RECORD index 7266a2f46..5d8fb037e 100644 --- a/libs/pycountry-23.12.11.dist-info/RECORD +++ b/libs/pycountry-24.6.1.dist-info/RECORD @@ -1,22 +1,23 @@ -pycountry-23.12.11.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pycountry-23.12.11.dist-info/LICENSE.txt,sha256=P6OcbhijpEEQgrZMFk3q4dj0ewOk1FMEwfCuR4Ym44I,24463 -pycountry-23.12.11.dist-info/METADATA,sha256=Dc1L4pmTWyoPheIg2zld-9UnODLSyealeDzkRnMntPo,12447 -pycountry-23.12.11.dist-info/RECORD,, -pycountry-23.12.11.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pycountry-23.12.11.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 -pycountry/__init__.py,sha256=X0f7dfQlqujBseP3BtDA-eZBCrnsGgaXtsjcDBlhoeU,10405 +pycountry-24.6.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pycountry-24.6.1.dist-info/LICENSE.txt,sha256=P6OcbhijpEEQgrZMFk3q4dj0ewOk1FMEwfCuR4Ym44I,24463 +pycountry-24.6.1.dist-info/METADATA,sha256=eQp7PAiAqzFjGMPZCPGYmDuB3JbA8vSwxUqeJg8y9Uo,13035 +pycountry-24.6.1.dist-info/RECORD,, +pycountry-24.6.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pycountry-24.6.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 +pycountry/COPYRIGHT.txt,sha256=9LAWFwZLzZ6f49ti7Jxu-NCvzDiN2ljZspNaVR15YOQ,2054 +pycountry/__init__.py,sha256=YLNhtu9WmoG-K6yDc3MwQFHlCk5o-kLiA6BfSdf65xE,10577 pycountry/databases/iso15924.json,sha256=Z009yLGKO5ma9xlvd5QopGXl-wr0FNBxlX0QNIvJgX4,17097 pycountry/databases/iso3166-1.json,sha256=8BuBK1f7qfMf9iG_M-fHVwoBlk2-tb4hZ-lN7PU4yJ8,43284 -pycountry/databases/iso3166-2.json,sha256=B40tocOoaBiXZb5QmM6dVRMY0Svn48CxjpKC3VSBqDE,501099 +pycountry/databases/iso3166-2.json,sha256=Td3W3F6nzH26HuKJxlnJTGHUWBPw5feXNj3ii_Po4po,498094 pycountry/databases/iso3166-3.json,sha256=65LRzOPjUlWfYQ5g4qyyNofrHPB7I2dfsRKGOldBpvo,6193 pycountry/databases/iso4217.json,sha256=ycN7QmMXgJpv_gZ9o6M0oxUPQklPrpGCNVevt70aQTU,16584 pycountry/databases/iso639-3.json,sha256=ljbOUmYFOGdicUDOWtofmqiXygenUBMCwbFLjRFHzdo,874782 pycountry/databases/iso639-5.json,sha256=EswG_z7ZXrgJF0pobLKuczFfPLFlgs9v5CZ856KtYZg,8486 -pycountry/db.py,sha256=q9su9q6fA_T4dJbedKv4Vc_eF5YibPg3dMijzLbEh1k,6624 +pycountry/db.py,sha256=DZOSHXrX7B9nfbUyUBUA7qUWyCxrXnSE18dlAI1hvNU,5730 pycountry/locales/ab/LC_MESSAGES/iso3166-1.mo,sha256=k3uGEcGMyUV9r-Lb71LOqXroLQp_IhkTAhr0PD3U9e0,528 pycountry/locales/ab/LC_MESSAGES/iso639-5.mo,sha256=5Gbou7M6kfDcvKTN-rjYaO5EhzF19peITObAKV4GBlM,371 pycountry/locales/ace/LC_MESSAGES/iso3166-1.mo,sha256=6Vkm8uXyq25_SQj_rzs-GBpNZPd8IXKAoQ9XIfeXpFk,524 -pycountry/locales/ach/LC_MESSAGES/iso3166-1.mo,sha256=P1BK5KYFH2Kw3YbS7vphv0h7DWYw6F37w383MnGzNuo,9088 +pycountry/locales/ach/LC_MESSAGES/iso3166-1.mo,sha256=2usbjDzDqMgZazSwE-vdgc08TO7cgtvCtsoJL4fJJ34,9144 pycountry/locales/af/LC_MESSAGES/iso3166-1.mo,sha256=4VxdeFM3YYXCgtjcd_oHRZRCtOwlIm8OSJHZ29UtVCc,22487 pycountry/locales/af/LC_MESSAGES/iso3166-3.mo,sha256=3s548xWglPw-c-szsi2VPtStJA9YZMKN5skK3wmT4Q4,1001 pycountry/locales/af/LC_MESSAGES/iso639-3.mo,sha256=FmEu-2iY9g700VLvruD8LVEGIuHofjxuUaSFl7OAST8,5414 @@ -38,7 +39,7 @@ pycountry/locales/ast/LC_MESSAGES/iso3166-2.mo,sha256=_MhjBaxHk5eg6-ntsvqEnmYxp5 pycountry/locales/ast/LC_MESSAGES/iso3166-3.mo,sha256=rmQaVdr-XS2nXnO6abzuyU2EFEG6YEYgQFzI2ORqt_o,2670 pycountry/locales/ast/LC_MESSAGES/iso4217.mo,sha256=KNPjXdmAfShoiU3wJvyox22mFd-N6UAobV_DmiyshZg,371 pycountry/locales/ast/LC_MESSAGES/iso639-3.mo,sha256=YMAQ-2GWeKLqMZz8GB0lNta2Tz6rabkwQI4v1qg93-0,311331 -pycountry/locales/ast/LC_MESSAGES/iso639-5.mo,sha256=GtaVroRkKl7oE2xtbl9JkpmQg_Rv05S7VEfcgNKI4JQ,372 +pycountry/locales/ast/LC_MESSAGES/iso639-5.mo,sha256=qn-We9gdhe_PEYMLPhrc3q4vAOe5Bgk2JtfotbOGMew,4029 pycountry/locales/ay/LC_MESSAGES/iso3166-1.mo,sha256=cBggVpg-cvg496_r1P2iP8c6pXeV5tXAWHeI4MUGjS8,521 pycountry/locales/az/LC_MESSAGES/iso3166-1.mo,sha256=YVWW1lokxjKqOJutVRom6sIwd2Kgg2_-9Dex0GUvy20,10337 pycountry/locales/az/LC_MESSAGES/iso3166-2.mo,sha256=KOq3mDw9DYUS-rjkJuUPnx4Gy-UAOi8VNSuEi4V4lRA,3341 @@ -48,14 +49,14 @@ pycountry/locales/ba/LC_MESSAGES/iso3166-1.mo,sha256=V-M118MNtoP1d8Ieo28BjZUm8rN pycountry/locales/bar/LC_MESSAGES/iso3166-1.mo,sha256=ZIp9uz675vRJx3f83vGmkkz0X_BI4K1ECL2tlz4HYhg,6864 pycountry/locales/be/LC_MESSAGES/iso15924.mo,sha256=_N0zYkRXhRxc6OY_uM0nEdTTQGkJemjPJbweseMkY-E,12701 pycountry/locales/be/LC_MESSAGES/iso3166-1.mo,sha256=BLzhRMgKoRbCdH_-IR2ktrxoUlv7umx3i3vLhmbpMtA,30045 -pycountry/locales/be/LC_MESSAGES/iso3166-2.mo,sha256=bwaktvBZcvbvkx1l02ohTVqmnq33vbPxxWTJD9sYgYA,201179 +pycountry/locales/be/LC_MESSAGES/iso3166-2.mo,sha256=7dvTbx2XXzaGDM77eZuOGunGghqlWF_Qr1cwR1BsQ2c,194548 pycountry/locales/be/LC_MESSAGES/iso3166-3.mo,sha256=NY8tsH-xZAISTaPkv-sZoeSe4pS1XwLo0UevpYfPE9M,3661 pycountry/locales/be/LC_MESSAGES/iso4217.mo,sha256=LWwT3Fk73ol8TAPhKJYvN7wC9i2FFQZFIkmnr3uhZ3M,12256 pycountry/locales/be/LC_MESSAGES/iso639-3.mo,sha256=6n5MlHRR5j8DFbjEWxgX5_cLsvRcI-n84-tpxuYMFto,18766 pycountry/locales/be/LC_MESSAGES/iso639-5.mo,sha256=71r8IrsY_YGNzqaX4W6IwaWRRkdg_GJXemcQlDCozRI,9437 pycountry/locales/bg/LC_MESSAGES/iso15924.mo,sha256=ek0OdIRZK1sg51aer-aBKmTWPTvANA2j6IXDG3GbktA,2003 pycountry/locales/bg/LC_MESSAGES/iso3166-1.mo,sha256=XiHw6_WKu_Z80bstGu7AxWA_t4Z3HxLLyd14pUIgE0Y,28945 -pycountry/locales/bg/LC_MESSAGES/iso3166-2.mo,sha256=3E_CW-5yV3xt_WynK55oMizgs02RW1ZndVRjg96fxEM,15126 +pycountry/locales/bg/LC_MESSAGES/iso3166-2.mo,sha256=Rfv2XakO8KebOwl5UgAW4x68txJMo0-sHruTk4F82Ck,15883 pycountry/locales/bg/LC_MESSAGES/iso3166-3.mo,sha256=ajS_H5nLTATojKgYS-VUJHBblcGMlKy4c3xzZfIbZIU,3381 pycountry/locales/bg/LC_MESSAGES/iso639-3.mo,sha256=K_5aQ06aBayWyvHGM7PyzKV32vYDEpI81U6cYs51vR0,24471 pycountry/locales/bi/LC_MESSAGES/iso3166-1.mo,sha256=_VIBxp1rhKVdnoUMCJGdHw7tunzjUH_VjXYpz9soUrU,526 @@ -63,11 +64,11 @@ pycountry/locales/bn/LC_MESSAGES/iso3166-1.mo,sha256=ashBjzxU8D7XQxzZLsuAm2D6xke pycountry/locales/bn/LC_MESSAGES/iso3166-3.mo,sha256=PUeYbYkNPrt_VO7Ex_zt51qqrI20ANBQpQTI9de2S_c,4015 pycountry/locales/bn/LC_MESSAGES/iso4217.mo,sha256=4oYedxUp0lHxdllCSVGv7VShAeRHqxaaiLFTZtQJam8,6448 pycountry/locales/bn/LC_MESSAGES/iso639-3.mo,sha256=TfCKcL6WYGVXojn6_r9S1wqCYUfGCzdEzgY2REioGRc,96597 -pycountry/locales/bn/LC_MESSAGES/iso639-5.mo,sha256=9hpOWieEpo7WN92mDiYkiZ9yPrTHCsBtnrCZtjNEJGU,1205 +pycountry/locales/bn/LC_MESSAGES/iso639-5.mo,sha256=GDRlAiAPncL-NNs1DjcvszQ-Wk9RkO4L65zyO-H1vHY,5688 pycountry/locales/bn_BD/LC_MESSAGES/iso15924.mo,sha256=ovwmvIRPtPMDH4T9o4efoMjZZ2odclx7JjsbBNGMl6E,14811 pycountry/locales/bn_BD/LC_MESSAGES/iso3166-2.mo,sha256=QXTOHWYkINzQgpTWYgc9kwv7eVta683ZrVsccKC-fMI,1161 pycountry/locales/bn_BD/LC_MESSAGES/iso639-5.mo,sha256=xXfd6IKyzFc2dJtsBSa5_0mBCRBvPz7tCcId3NjDzJ8,2772 -pycountry/locales/bn_IN/LC_MESSAGES/iso3166-1.mo,sha256=jEvxwELGulN460FaLkNScwSOWNdZNuXo0uuNW7f9oBc,35713 +pycountry/locales/bn_IN/LC_MESSAGES/iso3166-1.mo,sha256=5Px391j-95rq_YCKjQgXRZ1zfZXWhjtXCHdtd4ywLNY,36015 pycountry/locales/bn_IN/LC_MESSAGES/iso3166-3.mo,sha256=pIptGQpE8d5nuzL0jTYJLPv3JZY0gxUuCMWgdXI0TgQ,4091 pycountry/locales/br/LC_MESSAGES/iso15924.mo,sha256=FHcA4B8HH6tW9s6V38M1RanR8vLCPwT5Uqs0xKUgm1s,6545 pycountry/locales/br/LC_MESSAGES/iso3166-1.mo,sha256=AXx3h9JbJouvTQcKKT-gjdgd5thutVMognb3Cp36oEI,10555 @@ -101,30 +102,30 @@ pycountry/locales/cs/LC_MESSAGES/iso3166-2.mo,sha256=NWMUzpPFs_inKaa8KiZWQ--HdMf pycountry/locales/cs/LC_MESSAGES/iso3166-3.mo,sha256=XlpGocVlJciJE6HrOH1yri3lvbXfXjqVDPA6LlTBM8A,2879 pycountry/locales/cs/LC_MESSAGES/iso4217.mo,sha256=xwx_BJqjmzr_mmzYjR5Wt5g3SbWOAk4rUoc1HcNbTZk,9477 pycountry/locales/cs/LC_MESSAGES/iso639-3.mo,sha256=SzZZh2Z2QGKCbxsolAiDSaUAl6t73j66HGkLbi7Tjpc,14412 -pycountry/locales/cs/LC_MESSAGES/iso639-5.mo,sha256=ynS-61ix_-HDrgN_1OlI3d8Gq3Ni_woUc7NLo0lcnmU,371 +pycountry/locales/cs/LC_MESSAGES/iso639-5.mo,sha256=Us1dtkxGW_FZIiuzaeFgJtihU33i-xIieqlYRywCKlk,3971 pycountry/locales/csb/LC_MESSAGES/iso3166-1.mo,sha256=O6VFwNjiIBO6J2cQ2THq6nsDRX0Nrj_2HYcjIIwpHeQ,4448 pycountry/locales/cv/LC_MESSAGES/iso15924.mo,sha256=mt3g5WZ6prfb64-Wo6IGYbhkDetKnwKu7hHTQACh2Qk,10986 pycountry/locales/cv/LC_MESSAGES/iso3166-1.mo,sha256=x5y2q0VpspabSAL1TzR_t_OaOfi316tLdX45_eI_KGw,10906 pycountry/locales/cy/LC_MESSAGES/iso15924.mo,sha256=sxBCf6VU1IgCJ-K9OdwRBIC1kEexZEKt23NUKOUCZpM,3619 pycountry/locales/cy/LC_MESSAGES/iso3166-1.mo,sha256=bZcvDOVpLy693csdzJa9EU6SO6vDi-qcuTWCDNdzFM4,23789 -pycountry/locales/cy/LC_MESSAGES/iso3166-2.mo,sha256=0M0IuL_4DIXfK_NFyRZld03OSJjK0VYavCfNF2VSeUI,35290 +pycountry/locales/cy/LC_MESSAGES/iso3166-2.mo,sha256=YQcHAwAOE7d0y6KUYZisn3NIn8oDty2Vldbunj51geo,34985 pycountry/locales/cy/LC_MESSAGES/iso3166-3.mo,sha256=A1pcNJOs0wk8co-v1yRG_lF6i-j-_EyL0jSi88DI_yo,2876 pycountry/locales/cy/LC_MESSAGES/iso4217.mo,sha256=Q_XAA9wuKeTjIfA1fTyRs3lTPdBbw_qf38HReYkvln8,1790 pycountry/locales/cy/LC_MESSAGES/iso639-3.mo,sha256=N0JMXN9X2y5oAc3FppwF_2ejp5DdAOOnsbPt2CRaais,14506 -pycountry/locales/cy/LC_MESSAGES/iso639-5.mo,sha256=idx3xlyb1T1hagZ-DLrhciv4djPbayMJM346cBmII5U,1419 +pycountry/locales/cy/LC_MESSAGES/iso639-5.mo,sha256=V2Ow87MXb2B-y4iCVWCZPfXnj3J_NJbN05IvCoQg7m0,2109 pycountry/locales/da/LC_MESSAGES/iso15924.mo,sha256=Njhq1F6ZvIvdpR2xy3sQGjvYnopq4VmFYqAsHht0yFY,10182 pycountry/locales/da/LC_MESSAGES/iso3166-1.mo,sha256=sGYEO6DUweOnXEujMTvaDRJfK9DEb2i8EG-keSkpetw,23328 -pycountry/locales/da/LC_MESSAGES/iso3166-2.mo,sha256=FUcYDSsV1gYD_nmpdjt0y7kwdSc-Z_EDcckvWVMH5Ho,135392 +pycountry/locales/da/LC_MESSAGES/iso3166-2.mo,sha256=eY60uUOd31mrjQ4yxqiURV5lUJ9w7eBqfrWjXJTKWQs,134479 pycountry/locales/da/LC_MESSAGES/iso3166-3.mo,sha256=ujrGCZUJOjnhZSjYF7zcuG8JLhBtN285ktQjqRlLC8s,2671 pycountry/locales/da/LC_MESSAGES/iso4217.mo,sha256=sIUU5sEf89-trTQAgxEqT562xPi5z03hUVqRLVzOz9o,8861 pycountry/locales/da/LC_MESSAGES/iso639-3.mo,sha256=apW4_GcBnKIxA1gTlD47CKInRLioHZ5Bnu8gqsCYbss,19729 -pycountry/locales/da/LC_MESSAGES/iso639-5.mo,sha256=3t9IxZYnnrzXU1ohY1xdfTEf26FseCBeiT1TJpuW8F4,910 +pycountry/locales/da/LC_MESSAGES/iso639-5.mo,sha256=RxLEyc0Xe-CWsmJXY0H7VtXMnOZjiyHaipYE_IEZrAA,3961 pycountry/locales/de/LC_MESSAGES/iso15924.mo,sha256=ZYrOcYO7mU2HtDKo431U1dlgnsSepnH3PVNIh6lME9k,10383 pycountry/locales/de/LC_MESSAGES/iso3166-1.mo,sha256=61jN9MqyRZ-QQ0stb44pOn9xFvdny13P0VBksFUXnxs,23454 -pycountry/locales/de/LC_MESSAGES/iso3166-2.mo,sha256=Gnl8NyRxGLaduVpBzeI9AnsNkMuE7WTW6Kx56u8YVPQ,219517 +pycountry/locales/de/LC_MESSAGES/iso3166-2.mo,sha256=RmqrahSmqr_uTORk80tATDJS0Pbygzbx3alyZY7Xqhk,212230 pycountry/locales/de/LC_MESSAGES/iso3166-3.mo,sha256=ROp9ZyyraJszLaXxy6ToJSj1h2MTAeDFU9YpzcWvrt4,2815 pycountry/locales/de/LC_MESSAGES/iso4217.mo,sha256=-WNvFBFdc_F52si4GtVELc94pXQwg1Vek8H6Vi5-lcw,9904 -pycountry/locales/de/LC_MESSAGES/iso639-3.mo,sha256=ic_bOKkbqQOdF_3ed-zLzLbGZHjW015hmzjPpXFfNwk,395556 +pycountry/locales/de/LC_MESSAGES/iso639-3.mo,sha256=YCZPZM3duYrFiDvt5uvp2mYy975JdgkU9ub0sngTD0s,395660 pycountry/locales/de/LC_MESSAGES/iso639-5.mo,sha256=rMJ6B4Yt8rtbeLvWaw-TcDbOxf8ggfytflQOKlKU8jk,7860 pycountry/locales/dv/LC_MESSAGES/iso3166-1.mo,sha256=XDsoK_W6k_U96CcC5YauBU2pA9kMOFT5cyVl6aR7g2I,11257 pycountry/locales/dz/LC_MESSAGES/iso3166-1.mo,sha256=uV4vcsy0e-e8-cC5n3m7dQle39x5THKOcuX7ybdQr1g,40229 @@ -136,31 +137,31 @@ pycountry/locales/el/LC_MESSAGES/iso3166-2.mo,sha256=3PIeh6MRCdG0AL_0VN10_pk7uht pycountry/locales/el/LC_MESSAGES/iso3166-3.mo,sha256=-EQ2ULB1zDz_-q8E_RoeyNEDulJH0lDiRPg_ukBpKCU,3428 pycountry/locales/el/LC_MESSAGES/iso4217.mo,sha256=hwuizS_gpzXs17LR0KDg7DCXChAqxbo0OPiI44yOoNw,9431 pycountry/locales/el/LC_MESSAGES/iso639-3.mo,sha256=A78zCtB-KAgGcc_I_UwlzQ6wEMumiXM38le68DdZ_AU,57390 -pycountry/locales/el/LC_MESSAGES/iso639-5.mo,sha256=0pwBU3Xwsc5u0apiZOnkYvv-caqviuEdq8SWv5Ha6Ss,1951 -pycountry/locales/en/LC_MESSAGES/iso3166-2.mo,sha256=uyHc5LUT7RYopQqNmtGlsjc4HbTdfzoDJEnN-u9grDA,91227 +pycountry/locales/el/LC_MESSAGES/iso639-5.mo,sha256=7KaqAqDWDQgtpqPIBEYfN2Nn-4oL9651RpjvWFw0EWE,2391 +pycountry/locales/en/LC_MESSAGES/iso3166-2.mo,sha256=8uY3WaRyWfDcgAftUjP9yhLDeO-6_zYHthsBzYncZyc,90768 pycountry/locales/eo/LC_MESSAGES/iso15924.mo,sha256=OedZ3T7f97tZ8LMMptEh_Vua3VaAZYRaOCTm0p3iZck,8524 pycountry/locales/eo/LC_MESSAGES/iso3166-1.mo,sha256=dr01nC8FEUgGjZCdOMzXbm7xt8W_4q4NjkoDWaVcAks,23042 -pycountry/locales/eo/LC_MESSAGES/iso3166-2.mo,sha256=-35gyDeJofVX4DB7WHnoZiW8TxoJpQg7IixxOuqYvI8,47595 +pycountry/locales/eo/LC_MESSAGES/iso3166-2.mo,sha256=Xopo3v14n2Oua8e7yFUdUrRdOS6dzV7R5e_UzVWr5yc,46967 pycountry/locales/eo/LC_MESSAGES/iso3166-3.mo,sha256=mOFUjyiPsHicME4Lt5_1qHrgLrXhqfcYF-AEmakcJko,2599 pycountry/locales/eo/LC_MESSAGES/iso4217.mo,sha256=epKWtcArMSTraE47QbQ9ji8vITvxD6Ph1xG3Elnb_Q4,8374 pycountry/locales/eo/LC_MESSAGES/iso639-3.mo,sha256=8w197bKO5-bipI24moC5t6a1SHcC7-QvAlQcTTi9ckw,48656 -pycountry/locales/eo/LC_MESSAGES/iso639-5.mo,sha256=sxvsdhKjdmeE4rea-qeF9DdJgm0ZVKBdhfWIDmyw2cM,5484 +pycountry/locales/eo/LC_MESSAGES/iso639-5.mo,sha256=6WlSyNLvedWIBv04knXYPEwqFH5eTyC4hjWfwGnkwzQ,6705 pycountry/locales/es/LC_MESSAGES/iso15924.mo,sha256=gdkpJiaiQSKCYw9nomHgm4rSdvg65nWMeaaWeW5Qd-k,10493 -pycountry/locales/es/LC_MESSAGES/iso3166-1.mo,sha256=DN45SxP9nlcxOfblhi490Xs-hzaMfS-e09ooFy052jU,23741 -pycountry/locales/es/LC_MESSAGES/iso3166-2.mo,sha256=ShtfXo10hiFcfIxfrhUroczLPBPuWLQwlz_5z84k7VM,15724 -pycountry/locales/es/LC_MESSAGES/iso3166-3.mo,sha256=Yr3SgIDe4qsM11mV-RXQ5OBUmS5smHVFaPXrXSxP7ZM,2796 -pycountry/locales/es/LC_MESSAGES/iso4217.mo,sha256=b927zNSR1veLwK9h7qCRJsqi6ajpchei8i8JD1t3ilU,8923 +pycountry/locales/es/LC_MESSAGES/iso3166-1.mo,sha256=h3Hzd2DyCMAtOkEu8fjiAKywX4MQPlcn7JTl1IrvkyQ,24037 +pycountry/locales/es/LC_MESSAGES/iso3166-2.mo,sha256=2HCnjjkXXUvGrIZAOwLpb8aAmjIR7Qi8-pzrv5hMTnE,15680 +pycountry/locales/es/LC_MESSAGES/iso3166-3.mo,sha256=MTW-LfPGXXKazp_9140BPRBvk8Ehj1qF9zfPjUd-I8I,2927 +pycountry/locales/es/LC_MESSAGES/iso4217.mo,sha256=zXh9O43AU_gvnJ9zp6l-D_F5RKkmFDMFqTOfOlbfNm4,9745 pycountry/locales/es/LC_MESSAGES/iso639-3.mo,sha256=R32b8YA1xni3qAwYb0yUmgEkLSH3M7sr1qmn57Gc9zU,33190 pycountry/locales/et/LC_MESSAGES/iso15924.mo,sha256=bBa-lP-KW8kk92aI6iytdmRso7ckXLn2QRM68D4T0rw,9689 pycountry/locales/et/LC_MESSAGES/iso3166-1.mo,sha256=JkdyhAU40azro986veHLyFW1WnNx_dKVfXIbTHmrp1A,23059 -pycountry/locales/et/LC_MESSAGES/iso3166-2.mo,sha256=OgLt_I00NIVq_qA2gw_NTk776lVlrpaGOuB014mJYmI,5140 +pycountry/locales/et/LC_MESSAGES/iso3166-2.mo,sha256=1v3cr3e1XE9miKSntAOB_y42DBq7_8-7JdOpSnRQZ10,12218 pycountry/locales/et/LC_MESSAGES/iso3166-3.mo,sha256=fWoF_uCGivdUfWpLdcfMbxOIMzPr4Lg3KYtFbp2MjeM,2748 -pycountry/locales/et/LC_MESSAGES/iso4217.mo,sha256=SAr0A2C10mjD-m7vUZNP-5vY_Ow1nUmsHy9_Z2Vmk6s,9145 -pycountry/locales/et/LC_MESSAGES/iso639-3.mo,sha256=EUktLfqMRKwIAaXG74ucjNgBObltxsXUyYkwNKDH9_c,30637 +pycountry/locales/et/LC_MESSAGES/iso4217.mo,sha256=JMU7n6uUa9fQ3ULXCuoJ4EeOlUm8tU_vjS4tK7DkiVI,9565 +pycountry/locales/et/LC_MESSAGES/iso639-3.mo,sha256=02PjBSBx7RHgbNQf8sVbhx0k2LM5xYrXSBGfQP4sVqA,32017 pycountry/locales/et/LC_MESSAGES/iso639-5.mo,sha256=u2UzyeBVJ4EfgURDtAotsgLFc84jalBE9_OhQqvIu5I,7437 pycountry/locales/eu/LC_MESSAGES/iso15924.mo,sha256=DGTqul6pkxC1N3_tNru3up577rnHLULk_OvqrD2b7XE,10499 pycountry/locales/eu/LC_MESSAGES/iso3166-1.mo,sha256=nINnO49UTvGw_P6GqParxGP2Ra-3uBSQHfxx4EcLt3M,23811 -pycountry/locales/eu/LC_MESSAGES/iso3166-2.mo,sha256=1grbZtgFekKdgM1zogUM5gRy_-7YvVFn0of7QZQoivU,23772 +pycountry/locales/eu/LC_MESSAGES/iso3166-2.mo,sha256=VHeL7j9VeX0pmIrevJsIC-lr-XfI2jLMoJZBZZaxHpw,23745 pycountry/locales/eu/LC_MESSAGES/iso3166-3.mo,sha256=WDxWO7IFnw8NWJT2ozJuWIAG3EDekFDN8NVm7WNd1JY,2745 pycountry/locales/eu/LC_MESSAGES/iso4217.mo,sha256=_9cNERxaRATG5mlsgcx4OgTlZ52nr_GJKskhk-CldC0,856 pycountry/locales/eu/LC_MESSAGES/iso639-3.mo,sha256=2ksCA4389wGczCflrrqKOSc93mdOIePvCYndei-QtHQ,20888 @@ -172,7 +173,7 @@ pycountry/locales/fa/LC_MESSAGES/iso639-3.mo,sha256=WWUyB1VwOCphybCzND1GPh42PsU2 pycountry/locales/ff/LC_MESSAGES/iso3166-1.mo,sha256=SmjnFB-fFSYNCZKLP04fQOuhtENGAmQOuqgos48y1vU,3704 pycountry/locales/fi/LC_MESSAGES/iso15924.mo,sha256=30xDiP6wZe9WSIaoGbXd9XbTf3TW9RrhewXOOuByPak,9006 pycountry/locales/fi/LC_MESSAGES/iso3166-1.mo,sha256=bemhvHKjMonjuuBfwfK0mWieb1xYovqJUDGlbC72SXs,22418 -pycountry/locales/fi/LC_MESSAGES/iso3166-2.mo,sha256=i59S_cHNleiY1xo9AloDT6ni6Cc2c8NUZzCkQEbaP34,5172 +pycountry/locales/fi/LC_MESSAGES/iso3166-2.mo,sha256=mQtnJpLmI2HOFZvUdgTmKIecmMtoBdXP6pdD2mXLJDA,5183 pycountry/locales/fi/LC_MESSAGES/iso3166-3.mo,sha256=TVMIlCs7iYo7FJecpg_BYTHfIfnA9ZqIS4X6bcT-93M,2647 pycountry/locales/fi/LC_MESSAGES/iso4217.mo,sha256=dflS5jOAIcqzJ2XKkTP3LxI8YcxZ2O3QvuBXBbkzFAY,7172 pycountry/locales/fi/LC_MESSAGES/iso639-3.mo,sha256=hTeZ1_Uz9D26qP5iWfQYM1RNR3JP2aK3iH9b_EV_oYE,13276 @@ -181,18 +182,18 @@ pycountry/locales/fil/LC_MESSAGES/iso3166-1.mo,sha256=CYgq3YrtaoqSms_KiG-lw2ljv0 pycountry/locales/fil/LC_MESSAGES/iso3166-2.mo,sha256=GRpA98El7KAGhLqrYxt4cExJ8P0LOHVZ6q_ydGzKVwQ,3047 pycountry/locales/fo/LC_MESSAGES/iso3166-1.mo,sha256=_gC9v3TLsART2i3d83FTHnmWvpmpG9R-Wf4L3evp-ak,5837 pycountry/locales/fo/LC_MESSAGES/iso3166-3.mo,sha256=5mYU9BUU_7BucS0iceQGWyeamCkcMbIzpTC4ovDYkr8,393 -pycountry/locales/fr/LC_MESSAGES/iso15924.mo,sha256=qnf4fT8M7l-KW2sf7IrbV_xj2UnWoA47uK-9Ds6E17I,10249 -pycountry/locales/fr/LC_MESSAGES/iso3166-1.mo,sha256=rDnLY3J_MNSDZT_px0wweEBbli1DZIpX_C87ioRd7l4,24141 -pycountry/locales/fr/LC_MESSAGES/iso3166-2.mo,sha256=V7ZyGqDp0_KwLTq-01tnQepUlF12AkgssfJ8gpu0cbg,166186 -pycountry/locales/fr/LC_MESSAGES/iso3166-3.mo,sha256=321zzwh4N_rWewsn-Rt4Qv66VyD2JQhd65ODUqSCdVI,2725 -pycountry/locales/fr/LC_MESSAGES/iso4217.mo,sha256=6b8Mip9fqRKrhqm0ZANAle5ShqjouzYU4oidfhFkMBs,9303 -pycountry/locales/fr/LC_MESSAGES/iso639-3.mo,sha256=mVf-NKdvwa-42rTnezbXatBrHsC1XAPBgm9mQ5ct__0,407281 -pycountry/locales/fr/LC_MESSAGES/iso639-5.mo,sha256=ENkd_nil8vA7puUVO39CthxlHCX7YrYGIx71tinm_ps,7886 +pycountry/locales/fr/LC_MESSAGES/iso15924.mo,sha256=js32YkDs2dmkHI9_WFvO9eIzJw7Jr0dVRIiykfBt5No,10260 +pycountry/locales/fr/LC_MESSAGES/iso3166-1.mo,sha256=0xquoUO2OaXbl5OPBVw7qCSYqVBJciTZvjgG1ngsO-Y,24340 +pycountry/locales/fr/LC_MESSAGES/iso3166-2.mo,sha256=SOv40Jm_MLFCUQevW7LrXCz0dLb4JL9CBGXjr5NtAd4,160680 +pycountry/locales/fr/LC_MESSAGES/iso3166-3.mo,sha256=_kUqnSih1FWAMxZ6KnF7pETF9kB73nyPHHUSAS0JIGQ,2860 +pycountry/locales/fr/LC_MESSAGES/iso4217.mo,sha256=xkf83c1q_fH-YZ-Lf1GvaUjNVajhD4QVHUoxMN3byTA,9998 +pycountry/locales/fr/LC_MESSAGES/iso639-3.mo,sha256=woJzt9pMpa8c-6vdkHAhmjevosuIvYWaqWunEnGn3O4,418827 +pycountry/locales/fr/LC_MESSAGES/iso639-5.mo,sha256=w4gK091KSpZ-h5jsHMUO8rBqh25CaI-DCrGAZOBAALU,7943 pycountry/locales/frp/LC_MESSAGES/iso3166-1.mo,sha256=IvjxXG0W4tSh-ltlxuhP-mCS-nUhu0T6CiPPw_25HWE,9173 -pycountry/locales/fur/LC_MESSAGES/iso3166-1.mo,sha256=xVG9mVs1Td2-EmxdxoLj87LYsiRjIQg5DIh_Yeat7yc,23756 -pycountry/locales/fur/LC_MESSAGES/iso3166-3.mo,sha256=MqEBc_lThRdbfTksFVdbFpTJkUCba2ibJ5RgHGSiKlA,1048 +pycountry/locales/fur/LC_MESSAGES/iso3166-1.mo,sha256=0BP25keqdfR4xusOFaQ8bKMADYINpzMjOJm2_Szzbrg,23950 +pycountry/locales/fur/LC_MESSAGES/iso3166-3.mo,sha256=hvBD-ZkMSEuNqYjQvRJH5C_y-Fn99zy82p8b2RmT3z8,1483 pycountry/locales/fur/LC_MESSAGES/iso639-3.mo,sha256=7ldEmDsfzEH735euvsKTDxGe85NseqCoLjssaXeVnJo,755 -pycountry/locales/fur/LC_MESSAGES/iso639-5.mo,sha256=7m6B8IpluVljWNCnFb8A6UqTz5NbxWVae1r7X-GCHl8,7043 +pycountry/locales/fur/LC_MESSAGES/iso639-5.mo,sha256=P1rvQRKyur4ODVrNHFCT_3v4kp8CpILKMTtx9wGzhKo,7791 pycountry/locales/fy/LC_MESSAGES/iso3166-1.mo,sha256=KYhmJx_lEHsdCuY7ZdaZtz2gI75ZBkZ888Dd_dZ5pBo,9356 pycountry/locales/ga/LC_MESSAGES/iso3166-1.mo,sha256=eYYdvb0znruo9eAvmBbnAFZMTNfvb8svRX95q-fs6ng,23528 pycountry/locales/ga/LC_MESSAGES/iso3166-2.mo,sha256=Hat1IzOSoDduYMlZ0VYqTy6xWW4ctSMCzFN_2IDkcHo,2380 @@ -217,7 +218,7 @@ pycountry/locales/haw/LC_MESSAGES/iso3166-1.mo,sha256=iRcwqDVb2jDSHf5H1PYWmS_0nW pycountry/locales/haw/LC_MESSAGES/iso3166-3.mo,sha256=HK1sDsEiXNA_NK6XqUtXKNRfP-dfwjYx9WHUHKLBI6A,395 pycountry/locales/he/LC_MESSAGES/iso15924.mo,sha256=_3Nlkzr0LiLDKke0T0CsXbgs9x5N0eJOQscqbYH33G8,3410 pycountry/locales/he/LC_MESSAGES/iso3166-1.mo,sha256=5v6_NYS1q3s5R9-jsoD_VVCiRpFAn8CvAL_FIKccoK8,27802 -pycountry/locales/he/LC_MESSAGES/iso3166-2.mo,sha256=o5tqKY_6rOI4VzAMoz8T0VEPpZFNQA2KNiHwcb8OcIk,34323 +pycountry/locales/he/LC_MESSAGES/iso3166-2.mo,sha256=dzm0v3NnXSecuWexx3oW1-PKg2LXnJMgwaWmfqkxJPk,43708 pycountry/locales/he/LC_MESSAGES/iso3166-3.mo,sha256=F-OSPpj7nitjFo8mJHrJP61KZ3QJPYylusCpad8_e_g,3369 pycountry/locales/he/LC_MESSAGES/iso639-3.mo,sha256=NuCJOIa-FqJ_FQuDWZ_auFhu06sSOhWYsa5Our3B_5E,5910 pycountry/locales/hi/LC_MESSAGES/iso3166-1.mo,sha256=Q95AylmMfANJAGv0dhovcs0r6lxjWshQhoa0I_t4xE8,35310 @@ -226,27 +227,27 @@ pycountry/locales/hi/LC_MESSAGES/iso639-3.mo,sha256=luMW2-6Pp3sTvB9buOB34UDI15WZ pycountry/locales/hi/LC_MESSAGES/iso639-5.mo,sha256=RTUHKIcxhISyqJCqGfUysfQa2m2nIYwmkA_c7Pc3DfM,632 pycountry/locales/hr/LC_MESSAGES/iso15924.mo,sha256=vuHO5WUcYSss-53qa4Pu4xuRKMsyhZnIbAtbulE0X2Q,10432 pycountry/locales/hr/LC_MESSAGES/iso3166-1.mo,sha256=Rdhem8HnWKsJE5evHcxajZ0_NdVXIhXecRZ6vlLwe3Q,23488 -pycountry/locales/hr/LC_MESSAGES/iso3166-2.mo,sha256=EaNUB5fL_tgJ0i-i6VQfphU2sOIlLFwJcv4q-7Wi-pA,26178 +pycountry/locales/hr/LC_MESSAGES/iso3166-2.mo,sha256=eIfp6z7nrt_vdSifl0rwIc7CBUhJCHV2iwM5yNMueYM,25948 pycountry/locales/hr/LC_MESSAGES/iso3166-3.mo,sha256=X-RNvwujPoNxjm5yRjTCDWGYikvgPPW_3soWw3PARaM,2755 pycountry/locales/hr/LC_MESSAGES/iso4217.mo,sha256=LKkmodvlp_dTo93mNCsL_fNJ_aWMSrbkKECe2eo7qu8,10437 pycountry/locales/hr/LC_MESSAGES/iso639-3.mo,sha256=QtArEyn7AdKwmye6VoNo0-dHRcQuoUaqxakqGqArano,52545 pycountry/locales/hr/LC_MESSAGES/iso639-5.mo,sha256=e4HigZoiybRHAoCU0W5fvIEwcFwXlc6SkiHMUDUftuA,7671 pycountry/locales/ht/LC_MESSAGES/iso3166-1.mo,sha256=zH-6PntafPCOEc5uX0cMqq8OyBbmOCCZmwGPzsrSPrw,7744 pycountry/locales/hu/LC_MESSAGES/iso15924.mo,sha256=4yVUZPWcTvsPt3gjXBo_io3IZqzoainMJSopZhPUCJc,10301 -pycountry/locales/hu/LC_MESSAGES/iso3166-1.mo,sha256=txSMau67E6QmDCfhvw7SedSYmUuRrBOMs8_db7YxEd4,24519 -pycountry/locales/hu/LC_MESSAGES/iso3166-2.mo,sha256=9XlgKSZ1Br-186TqV999gL49EKeDwKmmVm1oRye2WUE,69162 +pycountry/locales/hu/LC_MESSAGES/iso3166-1.mo,sha256=I6lBfkjygbj1Bj1vrzuuGDG4AKE5R3uj1iQjtxLO3PQ,24602 +pycountry/locales/hu/LC_MESSAGES/iso3166-2.mo,sha256=h1z536RGjQhxQmx8IfaQO2Wpxffj6-wwYuvuXtK6jaE,68957 pycountry/locales/hu/LC_MESSAGES/iso3166-3.mo,sha256=4fAqt1b4fSFw63xk8jvdw5bHwfsGe6SXwhzfcHLwkl8,2749 -pycountry/locales/hu/LC_MESSAGES/iso4217.mo,sha256=0lXEeSi3WiSzGDGDAZwyjURrDF34c2bBOFo6voXxsLk,8986 +pycountry/locales/hu/LC_MESSAGES/iso4217.mo,sha256=rLNyDbd0ZzKgCFDngXk82EdYSpqIT_tB20Aw2XArRVY,9822 pycountry/locales/hu/LC_MESSAGES/iso639-3.mo,sha256=numYY-s-qG2n6jz8yW94gEEmhEIBF8en3CQnbSLBoRc,37180 pycountry/locales/hu/LC_MESSAGES/iso639-5.mo,sha256=Gi5BDPXcwIMgQMVBmgI1pA3FSp6l0j12yfrmlv9vbcc,7550 pycountry/locales/hy/LC_MESSAGES/iso3166-1.mo,sha256=SgoKIEZqOiJsfjFAVm-UEbIbO8J-4t-GIsNGi5CVdCc,30567 pycountry/locales/hy/LC_MESSAGES/iso3166-3.mo,sha256=DFerwwdEXTrsOKykW5P_ShRYkT5sPebh-VPHO6oJd00,3474 pycountry/locales/ia/LC_MESSAGES/iso15924.mo,sha256=1PBiVydopGdzqCdISFT_li4SvVSbcrdWsZRfs3w_8LE,8085 -pycountry/locales/ia/LC_MESSAGES/iso3166-1.mo,sha256=dohDBTa82xMp2vmapUIGhBhoHqkKuh8Ms1RQwYx3Zuc,23338 +pycountry/locales/ia/LC_MESSAGES/iso3166-1.mo,sha256=g8rup6qwLOGQdWBvdLX5wBILn3Xut0ksPwhiczD5U-Y,23347 pycountry/locales/ia/LC_MESSAGES/iso3166-3.mo,sha256=qhAUSwo3yGpiUNpwuwSzMhGTR-9yF3JQ2h3dTjJO5uQ,2678 pycountry/locales/id/LC_MESSAGES/iso15924.mo,sha256=3LEl9wkbCLMt9olNSdtyydFD9Sl5MBa2h0_glewmFNE,10195 pycountry/locales/id/LC_MESSAGES/iso3166-1.mo,sha256=1VlyKfhYIZ431EQldXjUZXkDgLAUkiVpqBu6IMS9cRQ,23086 -pycountry/locales/id/LC_MESSAGES/iso3166-2.mo,sha256=KsOrneXHcgvbJsdpPDsPXdMmiabhD-3yOw1LY1C9NEU,165253 +pycountry/locales/id/LC_MESSAGES/iso3166-2.mo,sha256=8KzPIwuGBKn0WT6lrCeF8z8G7yZu7dDAZwXPwmG_JZY,159848 pycountry/locales/id/LC_MESSAGES/iso3166-3.mo,sha256=ozybktlkBokoXXbkf-urGvEv43JWCSxDO1Vda7O7BIw,2702 pycountry/locales/id/LC_MESSAGES/iso4217.mo,sha256=bZa_WATIF-LFNvAhseqzbtQFaQ6eYFClFJ9RXwFCMsE,9513 pycountry/locales/id/LC_MESSAGES/iso639-3.mo,sha256=kApzflAdWd4t9eHUq15iJXA-FiHiJ2KBdL3VbSG0yLE,292415 @@ -261,29 +262,29 @@ pycountry/locales/is/LC_MESSAGES/iso639-3.mo,sha256=MoMDngccs6iCtwBXty1GnjaajKyV pycountry/locales/is/LC_MESSAGES/iso639-5.mo,sha256=bVNRcpSArWK7djnpmhOM8EGw9uYGTzrVN6_MlBqsCJI,8015 pycountry/locales/it/LC_MESSAGES/iso15924.mo,sha256=3PcifL8wKpwbWx9dFSHkVeROgTZLqJZvXxle-073dWc,9447 pycountry/locales/it/LC_MESSAGES/iso3166-1.mo,sha256=PoHfAmyCRWOlnbTgEbxATpn4MxEN9zd1S4FdxpxGdHM,23660 -pycountry/locales/it/LC_MESSAGES/iso3166-2.mo,sha256=qHEAAOIUEaO2JgmIAHmeJZQ-pad2Z4_JfhSXWc3LNmo,163383 +pycountry/locales/it/LC_MESSAGES/iso3166-2.mo,sha256=ga7v0RIDdcdhbQTAuYGsMkdT0NYLH7vYFN8mbvBUJwc,157445 pycountry/locales/it/LC_MESSAGES/iso3166-3.mo,sha256=OHn1oi0HReKAuA5iL8UuvcJkTsB1JgfB-QnQivGhtM8,2720 pycountry/locales/it/LC_MESSAGES/iso4217.mo,sha256=Ho2xKcqhfDiGjSdCPI0rI6_9JIE7nnjnUFaHkaB7Tg8,9244 pycountry/locales/it/LC_MESSAGES/iso639-3.mo,sha256=aPsP1OZAeba1cMeTwGNnRp-jFStALeX0onPnssISNWQ,369645 -pycountry/locales/it/LC_MESSAGES/iso639-5.mo,sha256=iNoIG5Y_IrQac0E9ILcxcAmBH5jpdTaMrROf7-SYwI0,6606 +pycountry/locales/it/LC_MESSAGES/iso639-5.mo,sha256=lZR81FkGkil6wZCILOorTOuybp_AdUiw5l5aIPn0HOM,6985 pycountry/locales/iu/LC_MESSAGES/iso3166-1.mo,sha256=KML26LA8WfyalJ2HpmWRo2vRw3yV0RnxeRouMsEmbx0,1634 pycountry/locales/ja/LC_MESSAGES/iso15924.mo,sha256=-jJCTC-JMAHR2milX9I6jOURullaz3REgv_WxUr0Rx0,4131 pycountry/locales/ja/LC_MESSAGES/iso3166-1.mo,sha256=B6HRa1uWbjbpXpYr9oCO3Iut79PvhX9mw7DT5nardY4,24942 -pycountry/locales/ja/LC_MESSAGES/iso3166-2.mo,sha256=kdJ4XXosV3zXw1Azj3xS8RlYy9dNa-dYMQWb-uxgBoY,100171 +pycountry/locales/ja/LC_MESSAGES/iso3166-2.mo,sha256=9grxJjonmTxBNcbfJ8HmXqygDOkEwup4se4O48MiXr4,99516 pycountry/locales/ja/LC_MESSAGES/iso3166-3.mo,sha256=fhh7_zTxzd3FhSVEbhqzKUcQ8mwoCkDjTHyHJGV46D8,2724 pycountry/locales/ja/LC_MESSAGES/iso4217.mo,sha256=OpOggFonS1d7L8ayRakkdMi6PMkUkP3dKtwGNGIy13c,10051 pycountry/locales/ja/LC_MESSAGES/iso639-3.mo,sha256=FZWYk_X_VAFXgarDvUOlPQg363NhY3ynh_6vvlbL4ao,16790 pycountry/locales/jam/LC_MESSAGES/iso3166-1.mo,sha256=uwGY95PKQaNhrVHycFQvwW1Rmzxa99R0o5EH_tJeh2I,8321 -pycountry/locales/ka/LC_MESSAGES/iso15924.mo,sha256=3868Kwh8wYkEELh0C1PkTfDsXXv0JhenThGm5s8ev5s,4520 +pycountry/locales/ka/LC_MESSAGES/iso15924.mo,sha256=X7EaDENBGyFA5t46us0J9PBdS3U1vT8t3ojjPoWXU0I,6755 pycountry/locales/ka/LC_MESSAGES/iso3166-1.mo,sha256=ZoDszEZ3RoUf0RmmC-ZMWNF0pDRNTex5lucgJdTBFYc,36655 -pycountry/locales/ka/LC_MESSAGES/iso3166-2.mo,sha256=5Bj9NhVX1KqFfKyqfsm61j8G0NH9zYiEKveCBzry01Y,109788 +pycountry/locales/ka/LC_MESSAGES/iso3166-2.mo,sha256=SDWPbTZRDy6cxI4YEGcGiCclTpG4FcNUfZGGOLmQQPM,111221 pycountry/locales/ka/LC_MESSAGES/iso3166-3.mo,sha256=USd-N-sbW_zNmAuC_-yvitKenHAr8-jgJjUPEtQ8nw0,4426 pycountry/locales/ka/LC_MESSAGES/iso4217.mo,sha256=3ENLfUSCC793IMX80iSktX4rpj4hd_zDokzEEIcJYJI,13229 pycountry/locales/ka/LC_MESSAGES/iso639-3.mo,sha256=aC4dBiZ3RhvTpGZlw1y2auiq6kgjWke8ALnIaqhPse4,371 pycountry/locales/ka/LC_MESSAGES/iso639-5.mo,sha256=9Vm75nkeluDlrDbgxEsVA4u-xeTrBhe5bTKiPgZ07nY,11127 pycountry/locales/kab/LC_MESSAGES/iso15924.mo,sha256=WQ04VkSplBiAbzyUG5IdEwUd0id88G9Mo915Iy5S2T8,571 pycountry/locales/kab/LC_MESSAGES/iso3166-1.mo,sha256=wlwveOA7MtH7NnfdppMvke-oizv1Hq0EZLtFyWu4zq4,6371 -pycountry/locales/kab/LC_MESSAGES/iso3166-2.mo,sha256=EygZLp9dodjOqg7YGOPBWIGRqnDhREqjU5uyX7N5riQ,572 +pycountry/locales/kab/LC_MESSAGES/iso3166-2.mo,sha256=RZ2aoXFVl9w0mH4-1u2zrE_aVgtuNVjLhcFMNt_xibs,1099 pycountry/locales/kab/LC_MESSAGES/iso4217.mo,sha256=WEAogp5MgADVviLyZjT64FhWkiIPrCWAgqXua00xtIQ,830 pycountry/locales/kab/LC_MESSAGES/iso639-3.mo,sha256=JkAo9SMzPrJFc-PurqUQ6kbvPwlxb19xaNzxbQOgf9s,979 pycountry/locales/kab/LC_MESSAGES/iso639-5.mo,sha256=XJdqi1jdqzyerEao1SFBOOUe_UZgtz58Rshzk2mu2Eg,372 @@ -291,8 +292,10 @@ pycountry/locales/ki/LC_MESSAGES/iso3166-1.mo,sha256=mWIyJogZzDehTwYKmxXK8bdpdk2 pycountry/locales/kk/LC_MESSAGES/iso3166-1.mo,sha256=5f5iQLfEVfkHOLbQ0WK-aJB8nMOuGHxaQAjm9Ze5ofU,29652 pycountry/locales/kk/LC_MESSAGES/iso3166-3.mo,sha256=W5bf02Qa5Psz9AWQR44QFx1BAOC2hzggCk33dz0S8Zs,3237 pycountry/locales/kl/LC_MESSAGES/iso3166-1.mo,sha256=k81CXX4w66zGYW2eLG_5C_7H8Drqg8-xSneTDtK8pf4,530 -pycountry/locales/km/LC_MESSAGES/iso3166-1.mo,sha256=G-gEzuP1kjDjveAkXBO0TXVjFajYs2fQVGpu7Szz7Pk,35806 +pycountry/locales/km/LC_MESSAGES/iso3166-1.mo,sha256=3FTC8RZ6c4jN1nJ_2Mac5WcZ9SHL43Nzu6g1yFRcorg,36282 +pycountry/locales/km/LC_MESSAGES/iso3166-2.mo,sha256=aRMO25FLuuJsXc_X21V09B9V3Ctds-nG7kB8lx3aJgY,372 pycountry/locales/km/LC_MESSAGES/iso3166-3.mo,sha256=YklIULLU34pf4DJeUUFs_mJ-gE2V_42-OZs1pyur-94,4069 +pycountry/locales/km/LC_MESSAGES/iso4217.mo,sha256=x6Z9uZDQcGCBpVzDXixvB3b1bZ65ilqxMu1baxQNLds,5396 pycountry/locales/kmr/LC_MESSAGES/iso3166-1.mo,sha256=zGBNbF0LUNqh1aTAQICfM5h-S_dCY9vdl5hH_Iov_5o,21966 pycountry/locales/kmr/LC_MESSAGES/iso3166-3.mo,sha256=hyMipX89DXSas_Ut-NJHBxvps90OTLKl4aB1x46Nr6g,2695 pycountry/locales/kmr/LC_MESSAGES/iso639-3.mo,sha256=zlbjl066YcmcUvZcsar8lCH3EYbjuBPxo7d0W1wjDGs,770 @@ -300,10 +303,10 @@ pycountry/locales/kn/LC_MESSAGES/iso3166-1.mo,sha256=T6dtyPAolD3mTkF-nFzEyjyJSAn pycountry/locales/kn/LC_MESSAGES/iso3166-3.mo,sha256=pZnO4_hvideU6kf6qhDNvr7fGsFEQRr-Q0796Tl7rn0,419 pycountry/locales/kn/LC_MESSAGES/iso639-3.mo,sha256=AYCMdh8NjdapUwVSGDzUCZmrK4wV-u341qo29NLpjSQ,390349 pycountry/locales/ko/LC_MESSAGES/iso15924.mo,sha256=NkRygCl0Pguf15xKrTF9-NcCY4V-OlDIsUMdcsX9cjg,2668 -pycountry/locales/ko/LC_MESSAGES/iso3166-1.mo,sha256=I6ZwXS7Y9Bu5KZyRSlGJmAjSBhwl_tk3FlGzIJVZxH0,24204 -pycountry/locales/ko/LC_MESSAGES/iso3166-2.mo,sha256=890PtO_mXdVU7bfEcvjwYKnbQWN7zNIl7HuDpYxcDdI,3047 -pycountry/locales/ko/LC_MESSAGES/iso3166-3.mo,sha256=9-ZP4qKD-oNuOrUCruDC2b46wQZJZ_6cS92AAaZCW9k,2577 -pycountry/locales/ko/LC_MESSAGES/iso4217.mo,sha256=RthDRr8ZMwCcRXYjzkM9rruCm03Uq_lyOEomXktNK1k,9975 +pycountry/locales/ko/LC_MESSAGES/iso3166-1.mo,sha256=srf9KWiBvy8MsyrJ1Xj-maVD8ZNlLTtr7C1oJfeyiCo,24296 +pycountry/locales/ko/LC_MESSAGES/iso3166-2.mo,sha256=PveY_Yqmkr4y53TzZ5nikMEiKAAU5uh6k4-anuJDB5o,4513 +pycountry/locales/ko/LC_MESSAGES/iso3166-3.mo,sha256=NkIgm4Bv9odil2Dew18uCTygia4XisFmnivqeBRpH8M,2783 +pycountry/locales/ko/LC_MESSAGES/iso4217.mo,sha256=mSbaU3uFMgEmxVNt_WDwGz96t-hZ26thZ-wE46cnWfM,10767 pycountry/locales/ko/LC_MESSAGES/iso639-3.mo,sha256=ayL0NVXCjlkiYu6GA5SGDbARF2VH1JTW8P89zNESfTM,18040 pycountry/locales/kok/LC_MESSAGES/iso639-3.mo,sha256=5S4r9mRLkIXhlEoDoYpjQKOGlaYnIi59kulMJaV0OPM,6584 pycountry/locales/kv/LC_MESSAGES/iso3166-1.mo,sha256=BZbH8N87ExrFP0-ZJOCdu5XRt3svWGnB3MMdKKXM9Dk,5803 @@ -311,12 +314,13 @@ pycountry/locales/kw/LC_MESSAGES/iso3166-1.mo,sha256=Dxg932KVJl8zZ37knp-LOO-lYXo pycountry/locales/ky/LC_MESSAGES/iso3166-1.mo,sha256=0rvHR3neRAG5sPD_VTZpyZV9rIu8fi2Iqc9PNwmq3bA,29069 pycountry/locales/ky/LC_MESSAGES/iso3166-2.mo,sha256=YNzhvpBhs7kqZbjtU3OrnVWwR33DkDqTgX2Lncnl4VA,1419 pycountry/locales/lo/LC_MESSAGES/iso3166-1.mo,sha256=KUVxvsDSnxv1LQ3gc0AAG3y5Ysg5YhwVDSd-x0Otij4,5756 -pycountry/locales/lt/LC_MESSAGES/iso15924.mo,sha256=y-Yhj33mZLqJ1Q8O1O3rESl8dYZFArRcai0HvlYh-Ag,7253 -pycountry/locales/lt/LC_MESSAGES/iso3166-1.mo,sha256=KlTdAL2BkPdhwaXPBZfU6PWbYfhj8j0rQu-Dsj6Fr9c,23186 -pycountry/locales/lt/LC_MESSAGES/iso3166-2.mo,sha256=8x1feJ1SHiNxNBBCQ_mGDi_SQji3PWluO1dZlfl8g_M,75936 -pycountry/locales/lt/LC_MESSAGES/iso3166-3.mo,sha256=wAI3qoLmkvflhNAEby-Ll9mJzdgRYfUaz5wFApKQCZc,2767 -pycountry/locales/lt/LC_MESSAGES/iso4217.mo,sha256=jlokRrlOg9eLfnyzojVruKR1jm_h1nCC7SsuiFWOxFg,7034 +pycountry/locales/lt/LC_MESSAGES/iso15924.mo,sha256=9QYebB0VXZr3l08a9NlFNI2epclur8RiIxKjF1RS2Es,10170 +pycountry/locales/lt/LC_MESSAGES/iso3166-1.mo,sha256=oWNw_HLnYXVraRY0JYf2q2VqK_ux5zeX7uI7zz1QuLc,24199 +pycountry/locales/lt/LC_MESSAGES/iso3166-2.mo,sha256=Bnp6shUfWxRuWfWdRvYhyUsL-M9qRIfySCBl_9zTzz8,75519 +pycountry/locales/lt/LC_MESSAGES/iso3166-3.mo,sha256=kVA78seKlAPiIVsAurshuYvJCbuw-itdcQGhCL25BCQ,2987 +pycountry/locales/lt/LC_MESSAGES/iso4217.mo,sha256=pWPemu3SsvgecohxWkQydWvrn-YO8Bk082LbIReJoe0,10089 pycountry/locales/lt/LC_MESSAGES/iso639-3.mo,sha256=c4HrVVFW1WIHg2LoDw1eGki7mgA4EaVl_tIyOefQSfw,31678 +pycountry/locales/lt/LC_MESSAGES/iso639-5.mo,sha256=rQGaYxSU5AAqer2AIW1Xx0JQF63GgaWzNO6aIwT_h8U,7646 pycountry/locales/lv/LC_MESSAGES/iso15924.mo,sha256=OoS8qucwkeEXxfn1RGtFTltZnRlfO_lvmUs_J3tPNl8,9267 pycountry/locales/lv/LC_MESSAGES/iso3166-1.mo,sha256=FbigEYJkunPuKaXRK8op-FQBSts_ehkPH7T5UxFm0Os,22888 pycountry/locales/lv/LC_MESSAGES/iso3166-2.mo,sha256=MaAHhZQbeXynbc_J4_iTsaEwqMj3soPIVsVwSMe8MSE,2565 @@ -338,7 +342,6 @@ pycountry/locales/mn/LC_MESSAGES/iso3166-1.mo,sha256=_xQUlpY_x_hWtWV8T8HMorrm24V pycountry/locales/mn/LC_MESSAGES/iso3166-3.mo,sha256=Tyr2sUeOHxFeqCxCyKYFR8kz_MMsEf5RIipQXcEceKw,427 pycountry/locales/mn/LC_MESSAGES/iso4217.mo,sha256=CdhlTrQlm_9TFLzt6d1MxXLFTXlsnMeaMMriyPaC4Bk,5207 pycountry/locales/mn/LC_MESSAGES/iso639-3.mo,sha256=n_gwivkBpobWRq7mB--L1JdB172cHm78xbwqA_KUNd4,6401 -pycountry/locales/mo/LC_MESSAGES/iso3166-1.mo,sha256=8AiYPq4bSuyBEGrJsLYmgB5O-Bn1AO6IiB0Z2eyO_30,1779 pycountry/locales/mr/LC_MESSAGES/iso3166-1.mo,sha256=BnSxHnjfkTcXH03VahbT3kxr1b6zbHEYXwh33ERlC7g,35144 pycountry/locales/mr/LC_MESSAGES/iso3166-3.mo,sha256=KFmyk3-Uf6vDStG14wk9kMk4qx34jDClz6PfLl-kIPs,3916 pycountry/locales/mr/LC_MESSAGES/iso639-3.mo,sha256=AkCjp5dpBhLUvrBhBIy_mPBCxgHIQRsyiG7jcQldXkA,425099 @@ -351,18 +354,18 @@ pycountry/locales/mt/LC_MESSAGES/iso639-3.mo,sha256=KyLeF56ABhY1GES7FPy9CNYBpAl5 pycountry/locales/my/LC_MESSAGES/iso3166-1.mo,sha256=XRheiVAoJlgFplfbVXr4jqmYjHfazkDxHxPbr26tzGQ,15588 pycountry/locales/na/LC_MESSAGES/iso3166-1.mo,sha256=oHg0zdK3UGG6on99NzrvTpWLNoC2C2mK_TKU4cTtt04,6574 pycountry/locales/nah/LC_MESSAGES/iso3166-1.mo,sha256=M83IQ32HXa150nN5RqyumBNkBO0vJrgma8AJHU--G7Y,8116 -pycountry/locales/nb/LC_MESSAGES/iso15924.mo,sha256=ZEh0GY5fQesNRed0yWel58JmU-cVr7WiEWeYVPoRCKc,4069 -pycountry/locales/nb/LC_MESSAGES/iso3166-1.mo,sha256=1H22jNjjlcCda0k_dq8saRHzC5l11XRWmv7v62ep1uU,23349 -pycountry/locales/nb/LC_MESSAGES/iso3166-3.mo,sha256=1gHSXz1DOns2yeM9joeizjP0SUzUHiE0WrHXIYoSBo8,2713 -pycountry/locales/nb/LC_MESSAGES/iso4217.mo,sha256=XyDB11iBY7HYZw0hPntMaEEsPipm6Rlq-fK9He-aOC4,8569 -pycountry/locales/nb/LC_MESSAGES/iso639-3.mo,sha256=l6jiErTbYHJ4AFcfenmlPq9wQtDcy1PvA1SRItdyzKg,5570 -pycountry/locales/nb_NO/LC_MESSAGES/iso3166-2.mo,sha256=UlB7DBFdWL2ku3z-LqDr0bWyHgSXpiExSN-OWieMuKU,1294 +pycountry/locales/nb_NO/LC_MESSAGES/iso15924.mo,sha256=ZEh0GY5fQesNRed0yWel58JmU-cVr7WiEWeYVPoRCKc,4069 +pycountry/locales/nb_NO/LC_MESSAGES/iso3166-1.mo,sha256=Arn3Zn3jGewiogV__nJGrHjIIS04M1j37an8CJdPwR8,23547 +pycountry/locales/nb_NO/LC_MESSAGES/iso3166-2.mo,sha256=R_aHdRjjiA7PICO2q69-xzk0xtQ2Z_93TVktIMHa7bM,1305 +pycountry/locales/nb_NO/LC_MESSAGES/iso3166-3.mo,sha256=-o90o0KauhkoyIMQ6NuVMQCuRax0jC1HWLlzxO5hCYs,2838 +pycountry/locales/nb_NO/LC_MESSAGES/iso4217.mo,sha256=XyDB11iBY7HYZw0hPntMaEEsPipm6Rlq-fK9He-aOC4,8569 +pycountry/locales/nb_NO/LC_MESSAGES/iso639-3.mo,sha256=l6jiErTbYHJ4AFcfenmlPq9wQtDcy1PvA1SRItdyzKg,5570 pycountry/locales/nb_NO/LC_MESSAGES/iso639-5.mo,sha256=bidWzaFBsRoOv2OWh_plbhZz00MmUZHuBsGfeZU1BTU,1237 pycountry/locales/ne/LC_MESSAGES/iso3166-1.mo,sha256=KqYeIe99y3Ew9AHs8RvpYAdkmgxEswtuUaknRtcDSt4,32389 pycountry/locales/ne/LC_MESSAGES/iso3166-3.mo,sha256=rRjEPNnu3Y-W_VoLzmKc72CnqLhyxFQxWtbPJuMrvoU,3799 pycountry/locales/nl/LC_MESSAGES/iso15924.mo,sha256=a9799cDp42S4QxtT8ofhkvYRXFh9kn5tUD9P-2D5fKw,10224 pycountry/locales/nl/LC_MESSAGES/iso3166-1.mo,sha256=sPXfhapd55zYe57bTbiHuIYdiUk0xHIvtG8oQQotSlk,23512 -pycountry/locales/nl/LC_MESSAGES/iso3166-2.mo,sha256=2HowSNa1sslqhJLQW2jJzArC7UH72Fh3YsmUB1j-XEI,213685 +pycountry/locales/nl/LC_MESSAGES/iso3166-2.mo,sha256=Rnq8tMHb8IsIUcxrK-naH9jIyuRbKFU4kmQmOWOyHtE,215191 pycountry/locales/nl/LC_MESSAGES/iso3166-3.mo,sha256=QzLPYfbj8ko6LQLQPh0Qfdkx4xRN1RxOLR4DoVUfiaY,2959 pycountry/locales/nl/LC_MESSAGES/iso4217.mo,sha256=bRJeb7rmRFiMPm6CrJ6fY6vSsmE8v9OYGp5nbTjUp9g,10365 pycountry/locales/nl/LC_MESSAGES/iso639-3.mo,sha256=4C7AFhBEw3zd8FYYv3_Xbc_FcsrUvoY-d1rPjqFdxzM,86365 @@ -379,16 +382,16 @@ pycountry/locales/nso/LC_MESSAGES/iso639-3.mo,sha256=lAzl_ZZmKdS4Xexh20QcVi1GUiA pycountry/locales/nv/LC_MESSAGES/iso3166-1.mo,sha256=TvwEZNkDekfC7Pwo98I7s5rEuXo1Sy166H5Pzm_s57M,5808 pycountry/locales/oc/LC_MESSAGES/iso15924.mo,sha256=JbJNE3pUlwNeuEqWGM8EqRkmYxV2z-fqwfQs-vbVjZ8,1713 pycountry/locales/oc/LC_MESSAGES/iso3166-1.mo,sha256=x36bwuWld6kT8GQ5hXmTWWyZFb8rTcTtvx9MfYCMcXw,23749 -pycountry/locales/oc/LC_MESSAGES/iso3166-2.mo,sha256=v6vW0CZXgjY-shtKtP_7CELs-DHwka0CC8Ri4j9PeNM,5714 +pycountry/locales/oc/LC_MESSAGES/iso3166-2.mo,sha256=Ig7I7dxfosV1l98AyUlZ3SO15y85pnk_eIGbBy4dGNM,5637 pycountry/locales/oc/LC_MESSAGES/iso3166-3.mo,sha256=ECpyuk5S_Rnzwley3Qo2mAKyehN2Rl4HwmU3js18OFc,1105 pycountry/locales/oc/LC_MESSAGES/iso4217.mo,sha256=3w9xX-qdcOvwQE1zILof_dCdCkqLT42X0-9h0zgr0Ow,527 pycountry/locales/oc/LC_MESSAGES/iso639-3.mo,sha256=XCztvixWxvZdsv7exOJqn_bzvZmqcmEBGeSkwKzlVLA,3446 -pycountry/locales/oc/LC_MESSAGES/iso639-5.mo,sha256=FmoDxroZjAiMPz1pWJx7tv0q3uLfzK6GhNzFlWO3MKA,807 +pycountry/locales/oc/LC_MESSAGES/iso639-5.mo,sha256=tz9tIGP47WFBJkd3bBCWTV4RdOU1U0FZgbENT7qGiE4,856 pycountry/locales/or/LC_MESSAGES/iso3166-1.mo,sha256=l_IeB2IJTCvBKpjxpgzsOvx-p7psmaRtW8f_oVeKKAY,34110 pycountry/locales/or/LC_MESSAGES/iso3166-3.mo,sha256=DzJxc6bigfxYLlpkdUGrcEzb1b8lx2ZVnl_Sr9ITGdo,3975 pycountry/locales/or/LC_MESSAGES/iso639-3.mo,sha256=yZFsd6SCJlAcMURl06SoxbAGV_jQ2bQbpatjUL3nQ7M,217560 -pycountry/locales/pa/LC_MESSAGES/iso3166-1.mo,sha256=w_jtAb8Ybmc0vEvO2L7vLBQ2lNNaLi8jNqb4cDnPdik,30504 -pycountry/locales/pa/LC_MESSAGES/iso3166-3.mo,sha256=qbf2U8jx3NSfBU-GJPH7wg951vRMJGSLs5-kfWRtoRQ,3356 +pycountry/locales/pa/LC_MESSAGES/iso3166-1.mo,sha256=9ErCZdyNlZYAeAPRMvT-2gk7yxbaF3n-9p4kkxibi4g,30877 +pycountry/locales/pa/LC_MESSAGES/iso3166-3.mo,sha256=Tk-lQ6dBpKC8UXjFfTs7q5TTiq2Uk7IFnE_qgBlPIps,3558 pycountry/locales/pa/LC_MESSAGES/iso639-3.mo,sha256=T54oKUkzOnvS06ffITy4IDNZ6N0biTyUQMdwOrVBOfA,410401 pycountry/locales/pa_PK/LC_MESSAGES/iso15924.mo,sha256=LJ-WjXSCxdR7deHiNLN_80s1izE8-7Njtgq7JvZQiNk,1418 pycountry/locales/pa_PK/LC_MESSAGES/iso3166-2.mo,sha256=qlW7oyRPyaCgtkARCmw5qYtL47ULlyJ2hubStN0r3ck,1018 @@ -397,7 +400,7 @@ pycountry/locales/pap/LC_MESSAGES/iso3166-1.mo,sha256=FBb09ZfgpfjYTvXwOKXQz7_Fzv pycountry/locales/pi/LC_MESSAGES/iso3166-1.mo,sha256=pFlBizXn1qcFEftRLHC1OvO5YEY8pXhPYKA1G658Lqk,9264 pycountry/locales/pl/LC_MESSAGES/iso15924.mo,sha256=ChZDUSPyEhTcn_CmTJkUN-OVScdBsVXnBH-GksUraVM,10158 pycountry/locales/pl/LC_MESSAGES/iso3166-1.mo,sha256=hwzk101N_IVUvwufamjDcNe1fJ35SvOnrB4Ifwy70y8,23849 -pycountry/locales/pl/LC_MESSAGES/iso3166-2.mo,sha256=Ph-5omy5NltI-SZa_7Any4zFCywvcbFLhobSGcwXJUo,188055 +pycountry/locales/pl/LC_MESSAGES/iso3166-2.mo,sha256=dDeL9yhP7MJnUwmHA_qZWXjMcnxVto9d3FIe40tS8t8,203350 pycountry/locales/pl/LC_MESSAGES/iso3166-3.mo,sha256=DrapsF8pgNEYySgjjUYr4b5_VaSC4rSQaSo2cXcF3FE,3054 pycountry/locales/pl/LC_MESSAGES/iso4217.mo,sha256=XDBLhQVRL4QgTdo7EgA-l0QUBLAofjT4dDDMjc6n-aM,9807 pycountry/locales/pl/LC_MESSAGES/iso639-3.mo,sha256=1467OYlnc9nfNzHOWF6yijaZP0YD2alsnaAM5sRww6Y,121821 @@ -413,19 +416,21 @@ pycountry/locales/pt/LC_MESSAGES/iso639-3.mo,sha256=56AzlSwKl3EY9LejPNhNxVJX2VsH pycountry/locales/pt_BR/LC_MESSAGES/iso15924.mo,sha256=8PbEoQcRvIjgHHofQW00hndDMuwmWZYYTNAssU50Gc8,10363 pycountry/locales/pt_BR/LC_MESSAGES/iso3166-1.mo,sha256=N2ZJSGXno7X6FXWPdIuAwlrY3ogUnwFq55972aw1JQY,24079 pycountry/locales/pt_BR/LC_MESSAGES/iso3166-2.mo,sha256=7qWV_nMXP2DzALW4yhfdL1hguzywzQvoY0QWszs6g4I,858 -pycountry/locales/pt_BR/LC_MESSAGES/iso3166-3.mo,sha256=TU7O7A8PkMY2fSX9sLH9s7WrSGymbeCV3ncabP1tnMI,2728 +pycountry/locales/pt_BR/LC_MESSAGES/iso3166-3.mo,sha256=DCpWd3635J0iZDReha3WpsMjqMb8hbalzVOwFn3yao8,2874 pycountry/locales/pt_BR/LC_MESSAGES/iso4217.mo,sha256=4jkfYCQ7l7g2KOYehzby6gX5hZc5nk5cP3GPltz4j_4,9032 pycountry/locales/pt_BR/LC_MESSAGES/iso639-3.mo,sha256=wZESsoY5izriySsHA-qWdmGwevHu-A_YAmFJSRnyyN0,17829 pycountry/locales/pt_BR/LC_MESSAGES/iso639-5.mo,sha256=9rvvH1v8spqAF__R_WLf3gLqTS2zjQ_MMrWZsk2GTm0,7751 -pycountry/locales/ro/LC_MESSAGES/iso15924.mo,sha256=77CAqAC7cA9FrFV4ptph8DuK0K82ak12qwWBPCEbQeo,8284 -pycountry/locales/ro/LC_MESSAGES/iso3166-1.mo,sha256=IYp0ZNOEWXrkcm1Tvaki35ZU3AXsv3l3IGQJo7An3v4,22866 -pycountry/locales/ro/LC_MESSAGES/iso3166-2.mo,sha256=IqFOQHuItLBP4lvAPjTQTQhtTXa56OylW3AW9DYNTK4,27706 -pycountry/locales/ro/LC_MESSAGES/iso3166-3.mo,sha256=cztiFO-61wRNWlDQbb4meoAOzhq6v81xg3o7quCUyL0,2818 -pycountry/locales/ro/LC_MESSAGES/iso4217.mo,sha256=c6BqUNLdWOWNowjvDxlE19lKucOKq2iMBPvxho9z7Xw,7042 +pycountry/locales/ro/LC_MESSAGES/iso15924.mo,sha256=1hb54cTl8Ar7XJ6NsRq-I1RB66rFpbQ_aFB_Iyl7okk,10632 +pycountry/locales/ro/LC_MESSAGES/iso3166-1.mo,sha256=9adL4zOH3Uj-U_XzcfBfEyhnhXptt3QhnUKDziTULvo,23486 +pycountry/locales/ro/LC_MESSAGES/iso3166-2.mo,sha256=2AJIFTDrgKN4ZfOk6pfSmMYu1xeth536mNOB25CewZE,229998 +pycountry/locales/ro/LC_MESSAGES/iso3166-3.mo,sha256=6at6aDNhW5PJf9Fu38J8SG8lTrA7x9xZNay5sA8whr0,2987 +pycountry/locales/ro/LC_MESSAGES/iso4217.mo,sha256=uL3NPnUt7wptPaNm19-TrSjuxK1jUExTqu0CIGLoiCA,9977 pycountry/locales/ro/LC_MESSAGES/iso639-3.mo,sha256=P3QxxTJqqULInvWK8bq25xaJMurvEO2qsqAGEA84AHA,10854 +pycountry/locales/ro/LC_MESSAGES/iso639-5.mo,sha256=Gs01_bLv7tVgk6YHOBMdo8YwxxFzQOegik4j4izamzo,10650 +pycountry/locales/ro_MD/LC_MESSAGES/iso3166-1.mo,sha256=8AiYPq4bSuyBEGrJsLYmgB5O-Bn1AO6IiB0Z2eyO_30,1779 pycountry/locales/ru/LC_MESSAGES/iso15924.mo,sha256=D5nhIbZqZHViF0o7WCIIhyeto0fXS86S7K8KCnY31rM,12713 pycountry/locales/ru/LC_MESSAGES/iso3166-1.mo,sha256=9pk6rUxpE7I96m134PUhpMsa0aQdPyepjnE9xfu0Qgg,29823 -pycountry/locales/ru/LC_MESSAGES/iso3166-2.mo,sha256=uDX7Vs23Lw1h_CGOCYqZKMDtIaPeDcdYwjyyL_weH-8,112174 +pycountry/locales/ru/LC_MESSAGES/iso3166-2.mo,sha256=I-RxALMIdmlGpmVQNOog8kJrJ-guGvFqD-Nhi5R4444,105964 pycountry/locales/ru/LC_MESSAGES/iso3166-3.mo,sha256=qg0LShA2DRa0FseecDzAwz0KqeSRKjyNtlJGgUf7Pc8,3480 pycountry/locales/ru/LC_MESSAGES/iso4217.mo,sha256=Ko1sklB9eL6rTchOfDhyijv5p1RfWhjd9q9HJgKAL4A,11510 pycountry/locales/ru/LC_MESSAGES/iso639-3.mo,sha256=BRjNeHk99_CZr_nyfgDjv0am70NrDdhbNGR04b_PN-4,18412 @@ -436,7 +441,7 @@ pycountry/locales/rw/LC_MESSAGES/iso4217.mo,sha256=p3aVUk8p6Wp0bHdh0bu_N-3HBbXOZ pycountry/locales/rw/LC_MESSAGES/iso639-3.mo,sha256=ty7dUCVZtqhhipVkC8FFfjbBpXFbjwZRNT4kUrBpgt4,14237 pycountry/locales/sc/LC_MESSAGES/iso15924.mo,sha256=puEq5iMH0DSy_PoPfzpm1MJlxgCSSK_6LLX3-P7YeLc,10473 pycountry/locales/sc/LC_MESSAGES/iso3166-1.mo,sha256=a-5NsP93OJzAomcXMuhAmmUFOGz9PyKXoMhBYtHstYw,24430 -pycountry/locales/sc/LC_MESSAGES/iso3166-2.mo,sha256=u9e2nOo2RjyXTVtykVBAMurbZrsYXPkqL0-4JkFjiro,104509 +pycountry/locales/sc/LC_MESSAGES/iso3166-2.mo,sha256=I1K9JxJWVrdqqXZiw88INw0Zk-er9UbfITtcgigt5yU,99178 pycountry/locales/sc/LC_MESSAGES/iso3166-3.mo,sha256=49J-KVKf6uO1GkN1XDla2hfNVn8G_WvfnE-3yLSG9b0,2948 pycountry/locales/sc/LC_MESSAGES/iso4217.mo,sha256=n9dy-L4xLPMUoK4THCi402jIBwfUicixAqhcop1IZTI,9999 pycountry/locales/sc/LC_MESSAGES/iso639-3.mo,sha256=g5yoELm4g5lREZ-VW7dD45gr-lRBJnM7_VEhMb_jdAg,19985 @@ -446,14 +451,14 @@ pycountry/locales/si/LC_MESSAGES/iso15924.mo,sha256=r8OMAYoDUkZIV8uLQqsl3v6OOIq_ pycountry/locales/si/LC_MESSAGES/iso3166-1.mo,sha256=MVytBciZLPiFg1A8hdZjrUUgyasQhm7wBNe44Qg5i-k,31931 pycountry/locales/si/LC_MESSAGES/iso3166-3.mo,sha256=zsvrlfeeg_GXVuSI0yhZj3nYwCnnqsYBf_5Gpkz6Rc4,3816 pycountry/locales/sk/LC_MESSAGES/iso15924.mo,sha256=Sfg3wQLW7k337omWSP1sgOk_UtaoMtoXA3BtVAWmGpI,1782 -pycountry/locales/sk/LC_MESSAGES/iso3166-1.mo,sha256=ce9aOq1TPm0tHSoCFYa2zKrlUYeVCmBn1056eRJjAJ0,23531 -pycountry/locales/sk/LC_MESSAGES/iso3166-2.mo,sha256=hanQwf7JHKwP32o2Cdny_MotQvZ7SacWidHEx6RYqP4,13211 -pycountry/locales/sk/LC_MESSAGES/iso3166-3.mo,sha256=NYUQd-3aBaXbt19o4qUTMb2a5-L3eGZX_QIpXkfxDKY,2690 +pycountry/locales/sk/LC_MESSAGES/iso3166-1.mo,sha256=T45425Ar2I0Gb7HUOkh3h6pnmtVmu0CSlLikzy_-oYs,24190 +pycountry/locales/sk/LC_MESSAGES/iso3166-2.mo,sha256=Ha6oIfiN1HtxZBSEenVf2jCh-EWTHjvD_IcNLYE3_zQ,13180 +pycountry/locales/sk/LC_MESSAGES/iso3166-3.mo,sha256=Qlk2HG60ssgXDYEU0kKyc8LgYc2wwaQUdIzMT3XKPt0,2887 pycountry/locales/sk/LC_MESSAGES/iso4217.mo,sha256=_fmxcCaFZiO_sPGHyP3QQpch8J-QfsQk6jFnMbEyWfM,4911 pycountry/locales/sk/LC_MESSAGES/iso639-3.mo,sha256=7fb1U7ylNLw0RwO-2Zsg5yHLU-eCkkaSrKLlY7JiKS4,11443 pycountry/locales/sl/LC_MESSAGES/iso15924.mo,sha256=v12SjHgRm8aD-fvGzzO1t_ly2TGq_cVRzlbaBOqdAYk,6350 pycountry/locales/sl/LC_MESSAGES/iso3166-1.mo,sha256=Eo4U8KyzSl5YjeqZTwpcXRWtPwOn5e44zUZ6y2tsUXY,22611 -pycountry/locales/sl/LC_MESSAGES/iso3166-2.mo,sha256=4FB1NERsHzi4e5sAaniAkJwSboy22Y1nuMkOFpX1d4Q,79740 +pycountry/locales/sl/LC_MESSAGES/iso3166-2.mo,sha256=qJzdttVJy_27na2WMlMnIsnNpgVBgnD1PUuQ0xB3lxY,79342 pycountry/locales/sl/LC_MESSAGES/iso3166-3.mo,sha256=he-9cSPr8xanRF6OlaSpRSnCdDnFyQbvt6Iccevlt1I,2596 pycountry/locales/sl/LC_MESSAGES/iso4217.mo,sha256=BR6o-Jdk-MGqAgY7HOjmjoX2bd-_cV3WMuj3yCTL05c,7114 pycountry/locales/sl/LC_MESSAGES/iso639-3.mo,sha256=mS5lyMCtHsOtfBYCtQ_ZkVuEWk_VFKXoae_Lvl5AmHw,14346 @@ -470,39 +475,43 @@ pycountry/locales/sq/LC_MESSAGES/iso3166-2.mo,sha256=4s5zR0XhpAuw-SnXpaoJFUkt9jV pycountry/locales/sq/LC_MESSAGES/iso3166-3.mo,sha256=TsSeS0Yq30VDTikdJ2JAl7l4qiKGcg2norY1YHuoJ2M,2664 pycountry/locales/sq/LC_MESSAGES/iso4217.mo,sha256=Xth9DE39BemxDH03jrg88695KNirBqFajadu-fbU2_0,370 pycountry/locales/sq/LC_MESSAGES/iso639-3.mo,sha256=3mL_7NdlD2lX4q0_ODbr11iUOut7rUDvyRfRFpz94Zk,371 -pycountry/locales/sq/LC_MESSAGES/iso639-5.mo,sha256=IzECQVCqM1uETvct3rlhAyK0HO3MQDn7saxvgopCRSE,371 +pycountry/locales/sq/LC_MESSAGES/iso639-5.mo,sha256=c_6ngFn97IVi-zbhR4oljfnAhpg_jYjJrePIVnuY18Y,3810 pycountry/locales/sr/LC_MESSAGES/iso15924.mo,sha256=eYo1GKGjHbLQlhambmHYpRvw8XsW0cyCTYijz8h5aGE,12875 pycountry/locales/sr/LC_MESSAGES/iso3166-1.mo,sha256=vgEgAcY81cjYqHK4tsAOY77vdSXpdk-O3gRpEwcQnXs,28915 -pycountry/locales/sr/LC_MESSAGES/iso3166-2.mo,sha256=Bpvvy1jeNCiNatb3j_856sbMMoRY2LRg29YbX5ejEQ8,145300 +pycountry/locales/sr/LC_MESSAGES/iso3166-2.mo,sha256=TbKirHfaYQWszhFuH-RtFULHoCgfOhNH2IhVjsGz1I0,144341 pycountry/locales/sr/LC_MESSAGES/iso3166-3.mo,sha256=Y9sDJ32tTzNbl3m5OOk62DIc86BQ-x64fS3ryCK4dXk,3352 pycountry/locales/sr/LC_MESSAGES/iso4217.mo,sha256=Ygprf9YtRR3N-I-8iaO9cm2CCaprdvBoWjqYnCF6wnY,9338 pycountry/locales/sr/LC_MESSAGES/iso639-3.mo,sha256=pXTHorjW00WRE2JMR5R0EPGz_vsTrEYIWb3oLnkApmc,17095 -pycountry/locales/sr/LC_MESSAGES/iso639-5.mo,sha256=zxjWXiZ8dP-WBK4zZK-oMuR-t8FlQCxRIHhyCeRpS1Y,4031 +pycountry/locales/sr/LC_MESSAGES/iso639-5.mo,sha256=34piuKMjb1CmXWZUcp12HZ0OQdbYTtZTPOGre96UgIM,6247 pycountry/locales/sr@latin/LC_MESSAGES/iso15924.mo,sha256=sw6yQ4S_MFdl_i-Gy9kKLXwJisA_V4kK_5RgSSJUw88,10451 pycountry/locales/sr@latin/LC_MESSAGES/iso3166-1.mo,sha256=mQh3QCxwNJiXB_40sJRVOE6mfFiO73KXHBFnQzZDMQE,23246 -pycountry/locales/sr@latin/LC_MESSAGES/iso3166-2.mo,sha256=-zKRsrqd_Pg-_dLkfWhgtVkaCYE4Q3HUVFrw8-NgrAA,122426 +pycountry/locales/sr@latin/LC_MESSAGES/iso3166-2.mo,sha256=joWuPaXmGktimuPSrEeJjDYWZMocTAHNBhev4HxyOk0,121630 pycountry/locales/sr@latin/LC_MESSAGES/iso3166-3.mo,sha256=2zlS7CRGoi4QBqgQdX1VfUMYD1FMK9EQ6qbcdbFWVS0,2709 pycountry/locales/sr@latin/LC_MESSAGES/iso4217.mo,sha256=wF9LQtk76mPxthujLL6iRDkBiPzjH5sy74Zc_7_roIU,7652 pycountry/locales/sr@latin/LC_MESSAGES/iso639-3.mo,sha256=ERPiEnQ4UyQl9vFTw3hoAvpb4nkORa739qjtzkGFMAI,14420 -pycountry/locales/sr@latin/LC_MESSAGES/iso639-5.mo,sha256=OzTuD58Z-_49CaJYZ4ctZxGBgP55i1lq_miHgLUAYQM,3277 +pycountry/locales/sr@latin/LC_MESSAGES/iso639-5.mo,sha256=3ZtgzQqOCZ5DqaU3W9x9YngC7PI7opZAR1EWo0o1nzg,5040 pycountry/locales/sv/LC_MESSAGES/iso15924.mo,sha256=jiv0-ieSaizYyJmBKJnbw-4zvv9bJp2l7qc33qvWOC8,10290 pycountry/locales/sv/LC_MESSAGES/iso3166-1.mo,sha256=hdzOp52V6XQV4x_QU2SXGmz-Z0BV9h0S-QOJvtca07Q,23553 -pycountry/locales/sv/LC_MESSAGES/iso3166-2.mo,sha256=cHn5v6kcINzsFG3DiTCcpXim8-CyXgr6D2gaAz2MDJo,164336 +pycountry/locales/sv/LC_MESSAGES/iso3166-2.mo,sha256=Wc9RbAQziL3BRERy2jTGRP7TpIVRoNFC6fKcEoRFIoU,158999 pycountry/locales/sv/LC_MESSAGES/iso3166-3.mo,sha256=btjqVszhhQZnYBe2uV652pN5pmKE4Q0A7xWtlgBK9LE,2738 pycountry/locales/sv/LC_MESSAGES/iso4217.mo,sha256=9SFR12NZzak2ibCMtpc-odXlNWVXeReCQ8QtCv2-S4g,9466 pycountry/locales/sv/LC_MESSAGES/iso639-3.mo,sha256=gNjeBOXjQZwuhvsYcQ0l0YKdJddP6FGcUy8f1-1_O64,398696 pycountry/locales/sv/LC_MESSAGES/iso639-5.mo,sha256=yK2_LQZ7UpcPnGFGua3NkNr3yt7qWIs8XIsn9BSl-hU,7469 pycountry/locales/sw/LC_MESSAGES/iso3166-1.mo,sha256=puo5AcrjhUMrPVvv4ctytx2y-hl8nLZvRM8hcfeXSIE,7984 pycountry/locales/sw/LC_MESSAGES/iso3166-3.mo,sha256=GTz8tO8hTl6B30ZJ6hNboAvBlocq7aIOpHufsw0835o,456 -pycountry/locales/ta/LC_MESSAGES/iso3166-1.mo,sha256=adTisxSLrrh6OwuT5EwWPVM_EfmB25T861NduVnLqGM,31984 -pycountry/locales/ta/LC_MESSAGES/iso3166-3.mo,sha256=nvFcrMj6YBgZU-9n2_2WEbESA2xdjGTT_qRYXcXBNa0,4036 -pycountry/locales/ta/LC_MESSAGES/iso639-3.mo,sha256=L6VD_Mt7Xrl61O9lNwrwhnZ4LEUTJECpVN3gZPR1XBU,438383 +pycountry/locales/ta/LC_MESSAGES/iso15924.mo,sha256=w-AOQsewUK2prYIDoyxecb0h74K7WQ_39UuG2YWZFDc,15455 +pycountry/locales/ta/LC_MESSAGES/iso3166-1.mo,sha256=JzDcKSbmcmQk8qSEys_KOMoslUy9D4wlqD3q0sbFfH0,35476 +pycountry/locales/ta/LC_MESSAGES/iso3166-2.mo,sha256=S-PGRpwJ1Sg6rps2dXt4AmdNEPz-I_t7J7FNBZj5VEA,372 +pycountry/locales/ta/LC_MESSAGES/iso3166-3.mo,sha256=cPKoxYmPgZV9MFKxuJ6Ku2xHCzkjO9Z2LSXMxqsaNNI,4343 +pycountry/locales/ta/LC_MESSAGES/iso4217.mo,sha256=6AwG1as7eikFI0O-EJVk7pTJpWPclSi9OooVqHq3mAM,14738 +pycountry/locales/ta/LC_MESSAGES/iso639-3.mo,sha256=SKhcrQG7pA-ueZBfh9UAmvvyG40KpLhAiUtYAe6gLxo,438885 +pycountry/locales/ta/LC_MESSAGES/iso639-5.mo,sha256=ANCGgfbY4F7ou3YoEbHTpRDDPyQkz9Q1OuyJm1ZV0qU,11658 pycountry/locales/te/LC_MESSAGES/iso3166-1.mo,sha256=mcFUynzR9m9pOA7DQhz2eiiNwJNbjWiekP3y7_R7I74,35338 pycountry/locales/te/LC_MESSAGES/iso3166-3.mo,sha256=1J3pjyPhcOEx0r5ai_wGP-CYtmMbey3j3f_64VBOcHs,4169 pycountry/locales/tg/LC_MESSAGES/iso3166-1.mo,sha256=Q1GsbdEj1Pyrysbq2yzBLVdMdhCr9G2YWJ2Z0NKQb_U,28527 pycountry/locales/th/LC_MESSAGES/iso15924.mo,sha256=ImX6_DD65iAEA-A8dORr6wrqob6QxPY5ASbydbHqVHs,11584 pycountry/locales/th/LC_MESSAGES/iso3166-1.mo,sha256=6ThLMem5BNLYZ0u6S5VqaB5IhlavWZqDYTt1hBk0gNI,33663 -pycountry/locales/th/LC_MESSAGES/iso3166-2.mo,sha256=VLY_QdW1H_TFSx1RsyaXNXrhVY4EvI3AQcfk6yphnMg,83632 +pycountry/locales/th/LC_MESSAGES/iso3166-2.mo,sha256=18LfmN92xfFzmPruPXCMh1qUU_gkGpzXcpyn4TtquXE,82740 pycountry/locales/th/LC_MESSAGES/iso3166-3.mo,sha256=IpVULSIJH4a9rErHYMd6PhXvfRZp1_OUQHZNlDdTiRA,3819 pycountry/locales/th/LC_MESSAGES/iso4217.mo,sha256=g6uA11k1shQdjskX_P-To_m6_mja4KpeS33_ImpU6h8,10193 pycountry/locales/th/LC_MESSAGES/iso639-3.mo,sha256=ZRCDEoiUegTcELdrKJaGiLwJj2aMhhEQiFqOs6X4KGw,53438 @@ -518,7 +527,7 @@ pycountry/locales/tl/LC_MESSAGES/iso3166-1.mo,sha256=J1GKGeMDNvkJgjiMjbSNMUwNwp8 pycountry/locales/tl/LC_MESSAGES/iso3166-3.mo,sha256=I2g0ohTAhPm_9UhASYSNX8Xw4g3iEPlUvi-Ho9l3NJM,477 pycountry/locales/tr/LC_MESSAGES/iso15924.mo,sha256=LByG1pluXvEtX58EmSSM2C1FejG7OFF6YdlaWtlPRA0,10222 pycountry/locales/tr/LC_MESSAGES/iso3166-1.mo,sha256=yr_-WN2CQuw21YwQehdipCiBbMsTUKRYTlriLU0Z_Nc,23676 -pycountry/locales/tr/LC_MESSAGES/iso3166-2.mo,sha256=1QwM68Xs2E8bfNZXgXpFzFlGf0lJxoLrDjRFi7OIPo8,77264 +pycountry/locales/tr/LC_MESSAGES/iso3166-2.mo,sha256=YwAD7hziqNJFf_axlTgiZzUS7c2IdfR2g8xI4dmOco4,76675 pycountry/locales/tr/LC_MESSAGES/iso3166-3.mo,sha256=CNAu-ntnaWEiDS8l2zWeIAS9voMHRDkX9VUO-fI8tiM,2771 pycountry/locales/tr/LC_MESSAGES/iso4217.mo,sha256=fSUr6ax4xjMSSa_xlObeBjhUyeroWZuOsbCuwNlleUs,9693 pycountry/locales/tr/LC_MESSAGES/iso639-3.mo,sha256=9YRTy65obg3k-BJBtaWJKgooMg0_PZ5g2Czts2mj_Co,343245 @@ -536,7 +545,7 @@ pycountry/locales/ug/LC_MESSAGES/iso3166-1.mo,sha256=XQVt-M9x-VTRB1iWsuOURL7SIwi pycountry/locales/ug/LC_MESSAGES/iso3166-3.mo,sha256=8zmB7JZ74Ns5Ij9bujcs0Ikdpbcp0sPRUVvzSKLHyPo,3467 pycountry/locales/uk/LC_MESSAGES/iso15924.mo,sha256=MoqwZqWVtxzHJtZohk8WB0JRGhplE5vEatsycFhNiMg,12713 pycountry/locales/uk/LC_MESSAGES/iso3166-1.mo,sha256=zSv-T1bAy0B0_q5qnMwitrP4CntTCQnRWcMKzVDp9_k,29887 -pycountry/locales/uk/LC_MESSAGES/iso3166-2.mo,sha256=P3N1yorg4KtUsOLprLuUoG7HKNNcr8sKw7Qfeg1X07g,265202 +pycountry/locales/uk/LC_MESSAGES/iso3166-2.mo,sha256=x3BIJcVLF_mQwoFZCdMqLFGyPKOBIlIT4mLs-28VVcM,255945 pycountry/locales/uk/LC_MESSAGES/iso3166-3.mo,sha256=NB2QqOD1clWnT2yT0ePxA8VzxdgZKdDzxbR0qrwOt4o,3668 pycountry/locales/uk/LC_MESSAGES/iso4217.mo,sha256=Kj2Ww7jwvurvNC6dvOVvnCUItSlBYrV_ZdXpkzxtMN0,12535 pycountry/locales/uk/LC_MESSAGES/iso639-3.mo,sha256=wkqhL4HmtRNccl5d-OdGoRbEjZsWQfgg6VyUZhSWPX4,511201 @@ -549,7 +558,7 @@ pycountry/locales/ve/LC_MESSAGES/iso3166-3.mo,sha256=3NgTS5O5xyhV4eGgQQQfgH1JZB1 pycountry/locales/ve/LC_MESSAGES/iso639-3.mo,sha256=tzbEkeGyMcCiADL2GaoaaM66NmOcEr__mh0P5sXrvvY,1997 pycountry/locales/vi/LC_MESSAGES/iso15924.mo,sha256=19Gv8QMvlccPkOy0keeSzz4UedM30N7rMDFy_xL_lGk,7457 pycountry/locales/vi/LC_MESSAGES/iso3166-1.mo,sha256=ymVEYnAP_TPBhwzWXdhJpYlh6HBmsdbkgMElEZ9CdJs,24644 -pycountry/locales/vi/LC_MESSAGES/iso3166-2.mo,sha256=18C-kMFO0j0r1or7w-iYzC85pRhuVF9wYKaheSeIwvk,135733 +pycountry/locales/vi/LC_MESSAGES/iso3166-2.mo,sha256=6HQ4_kJekZWUO-FOKyfhSyZx7himx15XqQFXFvKDwGA,135199 pycountry/locales/vi/LC_MESSAGES/iso3166-3.mo,sha256=8KWsYZAmqADgIwh2V9CGv4otl0d-O-1fbn3kYuml7tc,2686 pycountry/locales/vi/LC_MESSAGES/iso4217.mo,sha256=o10Kb3UE8GRTUrtovFCGP3ZHlloGUHWpPC7YYHTk86E,8278 pycountry/locales/vi/LC_MESSAGES/iso639-3.mo,sha256=QeaUje99ocE7WSsPWQV6xEGwRW4Tr0LnogKem69b6Xg,16925 @@ -567,7 +576,7 @@ pycountry/locales/xh/LC_MESSAGES/iso639-3.mo,sha256=b7f1geW_5oIXnTcJdd5EzUHuaZ-o pycountry/locales/yo/LC_MESSAGES/iso3166-1.mo,sha256=vXJUAuLaCWXvxbmLfdztNJmW7AEfCCoTk6BjAuIiGdo,11032 pycountry/locales/zh_CN/LC_MESSAGES/iso15924.mo,sha256=73edCLVOwivnJWxbRcqrT0B1suCwpYDmJQw-5ESuZJY,7170 pycountry/locales/zh_CN/LC_MESSAGES/iso3166-1.mo,sha256=cFvm2thL8VrUOBg_wgRSCNpE8kl5W50oFWU_2ouL8aU,23425 -pycountry/locales/zh_CN/LC_MESSAGES/iso3166-2.mo,sha256=Xao0LO_dE2QqJX1arUHMIRe66Sk43I_YTvRUHFJql_k,117078 +pycountry/locales/zh_CN/LC_MESSAGES/iso3166-2.mo,sha256=5GXMVkjvIYpLRFCXD6ye7nyKvqinds-4OB5t-FOEfSk,116542 pycountry/locales/zh_CN/LC_MESSAGES/iso3166-3.mo,sha256=jGDFtKMfZqEVephlYDTyEes8xxpKmnKBHDNWAifoT_s,2696 pycountry/locales/zh_CN/LC_MESSAGES/iso4217.mo,sha256=K1NVIoFpGsgCLWByDVn9ThoS68my9bu-0BicPSweioI,9620 pycountry/locales/zh_CN/LC_MESSAGES/iso639-3.mo,sha256=T_LY18QKETT27xLi9OhZEyMig0-MiaYa0V6SXoHjlCk,14527 @@ -579,7 +588,7 @@ pycountry/locales/zh_Hans/LC_MESSAGES/iso639-5.mo,sha256=HfSKsdJZGmr9k-E4OnfWDHP pycountry/locales/zh_Hant/LC_MESSAGES/iso639-5.mo,sha256=MAmFhM-eAAF9PwLmpfJQyCMdfRpATE-eEjQ7KRF3KjA,7424 pycountry/locales/zh_TW/LC_MESSAGES/iso15924.mo,sha256=rdTojxMvRAvyA-P2mofNpubQBeuw9mQSYA4CCecbJFc,10644 pycountry/locales/zh_TW/LC_MESSAGES/iso3166-1.mo,sha256=jZHJGmfv_rcv6SI3xWgLLmH_iiWzR_t9eCB4BPxuVO0,23390 -pycountry/locales/zh_TW/LC_MESSAGES/iso3166-2.mo,sha256=oZaRP5JLPJHtWp-JfrHNnLiq-A2Iu35umkSmXjmS72E,18281 +pycountry/locales/zh_TW/LC_MESSAGES/iso3166-2.mo,sha256=hI-cDmSoWhYrzDVx04_sGQkqvrjA1QEzi-O60qA5V9U,18208 pycountry/locales/zh_TW/LC_MESSAGES/iso3166-3.mo,sha256=tcw6oJie_J4xxELZd-w6rhMuxLdDTEk8kAt95lcqJwI,2685 pycountry/locales/zh_TW/LC_MESSAGES/iso4217.mo,sha256=lx1x5_mZKbQkC__xebK2v-I55EU4yBh27HhDR9xq2Rg,9664 pycountry/locales/zh_TW/LC_MESSAGES/iso639-3.mo,sha256=KroXcTbtcwXJubSGfIrloFYskt1cPZPzGVZGBcButNA,32698 @@ -587,4 +596,4 @@ pycountry/locales/zu/LC_MESSAGES/iso3166-1.mo,sha256=MfXG5fBPOFvJHdiGFlSxSPPMijm pycountry/locales/zu/LC_MESSAGES/iso3166-3.mo,sha256=U8swrNDQXoC5L2-ujZdcO68vePFKT6Wn7HQHn3Bmaq4,415 pycountry/locales/zu/LC_MESSAGES/iso639-3.mo,sha256=Q4EhRCks8BThDf7KzLbMx788L_JsLfUmJ8ZFimyF_FE,2596 pycountry/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pycountry/tests/test_general.py,sha256=sBGtsHN7Mfbq86k48HaEoyFdpZB4IoRXkdDqGEICYPA,15140 +pycountry/tests/test_general.py,sha256=HLy1GcvTAB1YyMK81XNFdDK1I4VNLrZ6VYCAfjpJ4Wk,15209 diff --git a/libs/pycountry-23.12.11.dist-info/REQUESTED b/libs/pycountry-24.6.1.dist-info/REQUESTED similarity index 100% rename from libs/pycountry-23.12.11.dist-info/REQUESTED rename to libs/pycountry-24.6.1.dist-info/REQUESTED diff --git a/libs/pycountry-24.6.1.dist-info/WHEEL b/libs/pycountry-24.6.1.dist-info/WHEEL new file mode 100644 index 000000000..8b9b3a1bf --- /dev/null +++ b/libs/pycountry-24.6.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: poetry-core 1.9.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/libs/pycountry/COPYRIGHT.txt b/libs/pycountry/COPYRIGHT.txt new file mode 100644 index 000000000..7b6d508a7 --- /dev/null +++ b/libs/pycountry/COPYRIGHT.txt @@ -0,0 +1,46 @@ +COPYRIGHT (c) 2008 - 2023, pycountry + +Pycountry is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or any later version. + +This project is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +Contributors: +- Christian Theune (2008-2020, 2022) +- Nate Schimmoller (2022-2023) +- Zachary Ware (2016, 2023) +- Alan Orth (2023) +- Ashok Argent-Katwala (2020) +- Bastien Vallet (2020) +- Chris R Bunney 2020 +- Christian Zagrodnick (2012-2013) +- Christoph Zwerschke (2013) +- Jakub Wilk (2020) +- Janis Kirsteins (2019) +- Justin Ryan Wagner 2014 +- Kevin Deldycke (2014, 2016) +- Louis Sautier (2020) +- Lucas Wiman (2015) +- Mario Vilas (2014) +- Michael Howitz (2020) +- Michał Bielawski (2021, 2023) +- Michał Górny (2020) +- Mike Taves (2023) +- Pedro Ferreira (2013) +- Stuart Prescott (2021) +- Victor Mireyev (2016) +- simon klemenc (2016) + +Additional Acknowledgements and Licensing Information: +- Data in the /src/databases/ and /src/locales/ folders is sourced from the Debian iso-codes project, available at: https://salsa.debian.org/iso-codes-team/iso-codes. This data is used under the terms of the GNU Lesser General Public License Version 2.1 (February 1999). + +The Debian iso-codes project is a collection of code lists for different standards, maintained and made available under the GNU Lesser General Public License Version 2.1. We gratefully acknowledge the Debian iso-codes team and contributors for their work and for making this resource freely available. + +The full text of the GNU Lesser General Public License Version 2.1 can be found at: https://salsa.debian.org/iso-codes-team/iso-codes/-/blob/main/COPYING. + +For the full text of the GNU Lesser General Public License, +see https://github.com/pycountry/pycountry/blob/main/LICENSE.txt. diff --git a/libs/pycountry/__init__.py b/libs/pycountry/__init__.py index 9075f8cc3..33c3b1d52 100644 --- a/libs/pycountry/__init__.py +++ b/libs/pycountry/__init__.py @@ -2,7 +2,7 @@ import os.path import unicodedata -from importlib import metadata as importlib_metadata +from importlib import metadata as _importlib_metadata from typing import Dict, List, Optional, Type import pycountry.db @@ -15,7 +15,7 @@ try: import importlib_resources # type: ignore except ModuleNotFoundError: - from importlib import resources as importlib_resources + from importlib import resources as importlib_resources # type: ignore def resource_filename(package_or_requirement: str, resource_name: str) -> str: @@ -26,8 +26,8 @@ def resource_filename(package_or_requirement: str, resource_name: str) -> str: def get_version(distribution_name: str) -> Optional[str]: try: - return importlib_metadata.version(distribution_name) - except importlib_metadata.PackageNotFoundError: + return _importlib_metadata.version(distribution_name) + except _importlib_metadata.PackageNotFoundError: return "n/a" @@ -76,7 +76,6 @@ def add_result(country: "pycountry.db.Country", points: int) -> None: self=subdivisions, query=query ) for candidate in match_subdivions: - print(candidate) add_result(candidate.country, 49) # Prio 3: partial matches on country names @@ -170,7 +169,10 @@ def __init__(self, **kw): super().__init__(**kw) self.country_code = self.code.split("-")[0] if self.parent_code is not None: - self.parent_code = f"{self.country_code}-{self.parent_code}" + # Split the parent_code to check if the country_code is already present + parts = self.parent_code.split("-") + if parts[0] != self.country_code: + self.parent_code = f"{self.country_code}-{self.parent_code}" @property def country(self): diff --git a/libs/pycountry/databases/iso3166-2.json b/libs/pycountry/databases/iso3166-2.json index 59b471bce..e16038b9a 100644 --- a/libs/pycountry/databases/iso3166-2.json +++ b/libs/pycountry/databases/iso3166-2.json @@ -733,7 +733,7 @@ { "code": "AZ-BAB", "name": "Babək", - "parent": "NX", + "parent": "AZ-NX", "type": "Rayon" }, { @@ -769,7 +769,7 @@ { "code": "AZ-CUL", "name": "Culfa", - "parent": "NX", + "parent": "AZ-NX", "type": "Rayon" }, { @@ -830,7 +830,7 @@ { "code": "AZ-KAN", "name": "Kǝngǝrli", - "parent": "NX", + "parent": "AZ-NX", "type": "Rayon" }, { @@ -881,7 +881,7 @@ { "code": "AZ-NV", "name": "Naxçıvan", - "parent": "NX", + "parent": "AZ-NX", "type": "Municipality" }, { @@ -897,7 +897,7 @@ { "code": "AZ-ORD", "name": "Ordubad", - "parent": "NX", + "parent": "AZ-NX", "type": "Rayon" }, { @@ -948,13 +948,13 @@ { "code": "AZ-SAD", "name": "Sədərək", - "parent": "NX", + "parent": "AZ-NX", "type": "Rayon" }, { "code": "AZ-SAH", "name": "Şahbuz", - "parent": "NX", + "parent": "AZ-NX", "type": "Rayon" }, { @@ -970,7 +970,7 @@ { "code": "AZ-SAR", "name": "Şərur", - "parent": "NX", + "parent": "AZ-NX", "type": "Rayon" }, { @@ -1161,385 +1161,385 @@ { "code": "BD-01", "name": "Bandarban", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-02", "name": "Barguna", - "parent": "A", + "parent": "BD-A", "type": "District" }, { "code": "BD-03", "name": "Bogura", - "parent": "E", + "parent": "BD-E", "type": "District" }, { "code": "BD-04", "name": "Brahmanbaria", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-05", "name": "Bagerhat", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-06", "name": "Barishal", - "parent": "A", + "parent": "BD-A", "type": "District" }, { "code": "BD-07", "name": "Bhola", - "parent": "A", + "parent": "BD-A", "type": "District" }, { "code": "BD-08", "name": "Cumilla", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-09", "name": "Chandpur", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-10", "name": "Chattogram", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-11", "name": "Cox's Bazar", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-12", "name": "Chuadanga", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-13", "name": "Dhaka", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-14", "name": "Dinajpur", - "parent": "F", + "parent": "BD-F", "type": "District" }, { "code": "BD-15", "name": "Faridpur", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-16", "name": "Feni", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-17", "name": "Gopalganj", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-18", "name": "Gazipur", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-19", "name": "Gaibandha", - "parent": "F", + "parent": "BD-F", "type": "District" }, { "code": "BD-20", "name": "Habiganj", - "parent": "G", + "parent": "BD-G", "type": "District" }, { "code": "BD-21", "name": "Jamalpur", - "parent": "H", + "parent": "BD-H", "type": "District" }, { "code": "BD-22", "name": "Jashore", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-23", "name": "Jhenaidah", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-24", "name": "Joypurhat", - "parent": "E", + "parent": "BD-E", "type": "District" }, { "code": "BD-25", "name": "Jhalakathi", - "parent": "A", + "parent": "BD-A", "type": "District" }, { "code": "BD-26", "name": "Kishoreganj", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-27", "name": "Khulna", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-28", "name": "Kurigram", - "parent": "F", + "parent": "BD-F", "type": "District" }, { "code": "BD-29", "name": "Khagrachhari", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-30", "name": "Kushtia", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-31", "name": "Lakshmipur", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-32", "name": "Lalmonirhat", - "parent": "F", + "parent": "BD-F", "type": "District" }, { "code": "BD-33", "name": "Manikganj", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-34", "name": "Mymensingh", - "parent": "H", + "parent": "BD-H", "type": "District" }, { "code": "BD-35", "name": "Munshiganj", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-36", "name": "Madaripur", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-37", "name": "Magura", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-38", "name": "Moulvibazar", - "parent": "G", + "parent": "BD-G", "type": "District" }, { "code": "BD-39", "name": "Meherpur", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-40", "name": "Narayanganj", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-41", "name": "Netrakona", - "parent": "H", + "parent": "BD-H", "type": "District" }, { "code": "BD-42", "name": "Narsingdi", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-43", "name": "Narail", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-44", "name": "Natore", - "parent": "E", + "parent": "BD-E", "type": "District" }, { "code": "BD-45", "name": "Chapai Nawabganj", - "parent": "E", + "parent": "BD-E", "type": "District" }, { "code": "BD-46", "name": "Nilphamari", - "parent": "F", + "parent": "BD-F", "type": "District" }, { "code": "BD-47", "name": "Noakhali", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-48", "name": "Naogaon", - "parent": "E", + "parent": "BD-E", "type": "District" }, { "code": "BD-49", "name": "Pabna", - "parent": "E", + "parent": "BD-E", "type": "District" }, { "code": "BD-50", "name": "Pirojpur", - "parent": "A", + "parent": "BD-A", "type": "District" }, { "code": "BD-51", "name": "Patuakhali", - "parent": "A", + "parent": "BD-A", "type": "District" }, { "code": "BD-52", "name": "Panchagarh", - "parent": "F", + "parent": "BD-F", "type": "District" }, { "code": "BD-53", "name": "Rajbari", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-54", "name": "Rajshahi", - "parent": "E", + "parent": "BD-E", "type": "District" }, { "code": "BD-55", "name": "Rangpur", - "parent": "F", + "parent": "BD-F", "type": "District" }, { "code": "BD-56", "name": "Rangamati", - "parent": "B", + "parent": "BD-B", "type": "District" }, { "code": "BD-57", "name": "Sherpur", - "parent": "H", + "parent": "BD-H", "type": "District" }, { "code": "BD-58", "name": "Satkhira", - "parent": "D", + "parent": "BD-D", "type": "District" }, { "code": "BD-59", "name": "Sirajganj", - "parent": "E", + "parent": "BD-E", "type": "District" }, { "code": "BD-60", "name": "Sylhet", - "parent": "G", + "parent": "BD-G", "type": "District" }, { "code": "BD-61", "name": "Sunamganj", - "parent": "G", + "parent": "BD-G", "type": "District" }, { "code": "BD-62", "name": "Shariatpur", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-63", "name": "Tangail", - "parent": "C", + "parent": "BD-C", "type": "District" }, { "code": "BD-64", "name": "Thakurgaon", - "parent": "F", + "parent": "BD-F", "type": "District" }, { @@ -1584,19 +1584,19 @@ }, { "code": "BE-BRU", - "name": "Brussels Hoofdstedelijk Gewest", + "name": "Bruxelles-Capitale, Région de", "type": "Region" }, { "code": "BE-VAN", "name": "Antwerpen", - "parent": "VLG", + "parent": "BE-VLG", "type": "Province" }, { "code": "BE-VBR", "name": "Vlaams-Brabant", - "parent": "VLG", + "parent": "BE-VLG", "type": "Province" }, { @@ -1607,19 +1607,19 @@ { "code": "BE-VLI", "name": "Limburg", - "parent": "VLG", + "parent": "BE-VLG", "type": "Province" }, { "code": "BE-VOV", "name": "Oost-Vlaanderen", - "parent": "VLG", + "parent": "BE-VLG", "type": "Province" }, { "code": "BE-VWV", "name": "West-Vlaanderen", - "parent": "VLG", + "parent": "BE-VLG", "type": "Province" }, { @@ -1630,31 +1630,31 @@ { "code": "BE-WBR", "name": "Brabant wallon", - "parent": "WAL", + "parent": "BE-WAL", "type": "Province" }, { "code": "BE-WHT", "name": "Hainaut", - "parent": "WAL", + "parent": "BE-WAL", "type": "Province" }, { "code": "BE-WLG", "name": "Liège", - "parent": "WAL", + "parent": "BE-WAL", "type": "Province" }, { "code": "BE-WLX", "name": "Luxembourg", - "parent": "WAL", + "parent": "BE-WAL", "type": "Province" }, { "code": "BE-WNA", "name": "Namur", - "parent": "WAL", + "parent": "BE-WAL", "type": "Province" }, { @@ -1725,271 +1725,271 @@ { "code": "BF-BAL", "name": "Balé", - "parent": "01", + "parent": "BF-01", "type": "Province" }, { "code": "BF-BAM", "name": "Bam", - "parent": "05", + "parent": "BF-05", "type": "Province" }, { "code": "BF-BAN", "name": "Banwa", - "parent": "01", + "parent": "BF-01", "type": "Province" }, { "code": "BF-BAZ", "name": "Bazèga", - "parent": "07", + "parent": "BF-07", "type": "Province" }, { "code": "BF-BGR", "name": "Bougouriba", - "parent": "13", + "parent": "BF-13", "type": "Province" }, { "code": "BF-BLG", "name": "Boulgou", - "parent": "04", + "parent": "BF-04", "type": "Province" }, { "code": "BF-BLK", "name": "Boulkiemdé", - "parent": "06", + "parent": "BF-06", "type": "Province" }, { "code": "BF-COM", "name": "Comoé", - "parent": "02", + "parent": "BF-02", "type": "Province" }, { "code": "BF-GAN", "name": "Ganzourgou", - "parent": "11", + "parent": "BF-11", "type": "Province" }, { "code": "BF-GNA", "name": "Gnagna", - "parent": "08", + "parent": "BF-08", "type": "Province" }, { "code": "BF-GOU", "name": "Gourma", - "parent": "08", + "parent": "BF-08", "type": "Province" }, { "code": "BF-HOU", "name": "Houet", - "parent": "09", + "parent": "BF-09", "type": "Province" }, { "code": "BF-IOB", "name": "Ioba", - "parent": "13", + "parent": "BF-13", "type": "Province" }, { "code": "BF-KAD", "name": "Kadiogo", - "parent": "03", + "parent": "BF-03", "type": "Province" }, { "code": "BF-KEN", "name": "Kénédougou", - "parent": "09", + "parent": "BF-09", "type": "Province" }, { "code": "BF-KMD", "name": "Komondjari", - "parent": "08", + "parent": "BF-08", "type": "Province" }, { "code": "BF-KMP", "name": "Kompienga", - "parent": "08", + "parent": "BF-08", "type": "Province" }, { "code": "BF-KOP", "name": "Koulpélogo", - "parent": "04", + "parent": "BF-04", "type": "Province" }, { "code": "BF-KOS", "name": "Kossi", - "parent": "01", + "parent": "BF-01", "type": "Province" }, { "code": "BF-KOT", "name": "Kouritenga", - "parent": "04", + "parent": "BF-04", "type": "Province" }, { "code": "BF-KOW", "name": "Kourwéogo", - "parent": "11", + "parent": "BF-11", "type": "Province" }, { "code": "BF-LER", "name": "Léraba", - "parent": "02", + "parent": "BF-02", "type": "Province" }, { "code": "BF-LOR", "name": "Loroum", - "parent": "10", + "parent": "BF-10", "type": "Province" }, { "code": "BF-MOU", "name": "Mouhoun", - "parent": "01", + "parent": "BF-01", "type": "Province" }, { "code": "BF-NAM", "name": "Namentenga", - "parent": "05", + "parent": "BF-05", "type": "Province" }, { "code": "BF-NAO", "name": "Nahouri", - "parent": "07", + "parent": "BF-07", "type": "Province" }, { "code": "BF-NAY", "name": "Nayala", - "parent": "01", + "parent": "BF-01", "type": "Province" }, { "code": "BF-NOU", "name": "Noumbiel", - "parent": "13", + "parent": "BF-13", "type": "Province" }, { "code": "BF-OUB", "name": "Oubritenga", - "parent": "11", + "parent": "BF-11", "type": "Province" }, { "code": "BF-OUD", "name": "Oudalan", - "parent": "12", + "parent": "BF-12", "type": "Province" }, { "code": "BF-PAS", "name": "Passoré", - "parent": "10", + "parent": "BF-10", "type": "Province" }, { "code": "BF-PON", "name": "Poni", - "parent": "13", + "parent": "BF-13", "type": "Province" }, { "code": "BF-SEN", "name": "Séno", - "parent": "12", + "parent": "BF-12", "type": "Province" }, { "code": "BF-SIS", "name": "Sissili", - "parent": "06", + "parent": "BF-06", "type": "Province" }, { "code": "BF-SMT", "name": "Sanmatenga", - "parent": "05", + "parent": "BF-05", "type": "Province" }, { "code": "BF-SNG", "name": "Sanguié", - "parent": "06", + "parent": "BF-06", "type": "Province" }, { "code": "BF-SOM", "name": "Soum", - "parent": "12", + "parent": "BF-12", "type": "Province" }, { "code": "BF-SOR", "name": "Sourou", - "parent": "01", + "parent": "BF-01", "type": "Province" }, { "code": "BF-TAP", "name": "Tapoa", - "parent": "08", + "parent": "BF-08", "type": "Province" }, { "code": "BF-TUI", "name": "Tuy", - "parent": "09", + "parent": "BF-09", "type": "Province" }, { "code": "BF-YAG", "name": "Yagha", - "parent": "12", + "parent": "BF-12", "type": "Province" }, { "code": "BF-YAT", "name": "Yatenga", - "parent": "10", + "parent": "BF-10", "type": "Province" }, { "code": "BF-ZIR", "name": "Ziro", - "parent": "06", + "parent": "BF-06", "type": "Province" }, { "code": "BF-ZON", "name": "Zondoma", - "parent": "10", + "parent": "BF-10", "type": "Province" }, { "code": "BF-ZOU", "name": "Zoundwéogo", - "parent": "07", + "parent": "BF-07", "type": "Province" }, { @@ -3159,7 +3159,7 @@ }, { "code": "CF-KG", - "name": "Kemö-Gïrïbïngï", + "name": "Kémo-Gribingui", "type": "Prefecture" }, { @@ -3279,7 +3279,7 @@ }, { "code": "CH-BE", - "name": "Bern", + "name": "Berne", "type": "Canton" }, { @@ -3294,7 +3294,7 @@ }, { "code": "CH-FR", - "name": "Freiburg", + "name": "Fribourg", "type": "Canton" }, { @@ -3699,7 +3699,7 @@ }, { "code": "CN-NX", - "name": "Ningxia Huizi Zizhiqu", + "name": "Ningxia Huizu Zizhiqu", "type": "Autonomous region" }, { @@ -4050,79 +4050,79 @@ { "code": "CV-BR", "name": "Brava", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-BV", "name": "Boa Vista", - "parent": "B", + "parent": "CV-B", "type": "Municipality" }, { "code": "CV-CA", "name": "Santa Catarina", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-CF", "name": "Santa Catarina do Fogo", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-CR", "name": "Santa Cruz", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-MA", "name": "Maio", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-MO", "name": "Mosteiros", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-PA", "name": "Paul", - "parent": "B", + "parent": "CV-B", "type": "Municipality" }, { "code": "CV-PN", "name": "Porto Novo", - "parent": "B", + "parent": "CV-B", "type": "Municipality" }, { "code": "CV-PR", "name": "Praia", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-RB", "name": "Ribeira Brava", - "parent": "B", + "parent": "CV-B", "type": "Municipality" }, { "code": "CV-RG", "name": "Ribeira Grande", - "parent": "B", + "parent": "CV-B", "type": "Municipality" }, { "code": "CV-RS", "name": "Ribeira Grande de Santiago", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { @@ -4133,55 +4133,55 @@ { "code": "CV-SD", "name": "São Domingos", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-SF", "name": "São Filipe", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-SL", "name": "Sal", - "parent": "B", + "parent": "CV-B", "type": "Municipality" }, { "code": "CV-SM", "name": "São Miguel", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-SO", "name": "São Lourenço dos Órgãos", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-SS", "name": "São Salvador do Mundo", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-SV", "name": "São Vicente", - "parent": "B", + "parent": "CV-B", "type": "Municipality" }, { "code": "CV-TA", "name": "Tarrafal", - "parent": "S", + "parent": "CV-S", "type": "Municipality" }, { "code": "CV-TS", "name": "Tarrafal de São Nicolau", - "parent": "B", + "parent": "CV-B", "type": "Municipality" }, { @@ -4227,73 +4227,73 @@ { "code": "CZ-201", "name": "Benešov", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-202", "name": "Beroun", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-203", "name": "Kladno", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-204", "name": "Kolín", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-205", "name": "Kutná Hora", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-206", "name": "Mělník", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-207", "name": "Mladá Boleslav", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-208", "name": "Nymburk", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-209", "name": "Praha-východ", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-20A", "name": "Praha-západ", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-20B", "name": "Příbram", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { "code": "CZ-20C", "name": "Rakovník", - "parent": "20", + "parent": "CZ-20", "type": "District" }, { @@ -4304,43 +4304,43 @@ { "code": "CZ-311", "name": "České Budějovice", - "parent": "31", + "parent": "CZ-31", "type": "District" }, { "code": "CZ-312", "name": "Český Krumlov", - "parent": "31", + "parent": "CZ-31", "type": "District" }, { "code": "CZ-313", "name": "Jindřichův Hradec", - "parent": "31", + "parent": "CZ-31", "type": "District" }, { "code": "CZ-314", "name": "Písek", - "parent": "31", + "parent": "CZ-31", "type": "District" }, { "code": "CZ-315", "name": "Prachatice", - "parent": "31", + "parent": "CZ-31", "type": "District" }, { "code": "CZ-316", "name": "Strakonice", - "parent": "31", + "parent": "CZ-31", "type": "District" }, { "code": "CZ-317", "name": "Tábor", - "parent": "31", + "parent": "CZ-31", "type": "District" }, { @@ -4351,43 +4351,43 @@ { "code": "CZ-321", "name": "Domažlice", - "parent": "32", + "parent": "CZ-32", "type": "District" }, { "code": "CZ-322", "name": "Klatovy", - "parent": "32", + "parent": "CZ-32", "type": "District" }, { "code": "CZ-323", "name": "Plzeň-město", - "parent": "32", + "parent": "CZ-32", "type": "District" }, { "code": "CZ-324", "name": "Plzeň-jih", - "parent": "32", + "parent": "CZ-32", "type": "District" }, { "code": "CZ-325", "name": "Plzeň-sever", - "parent": "32", + "parent": "CZ-32", "type": "District" }, { "code": "CZ-326", "name": "Rokycany", - "parent": "32", + "parent": "CZ-32", "type": "District" }, { "code": "CZ-327", "name": "Tachov", - "parent": "32", + "parent": "CZ-32", "type": "District" }, { @@ -4398,19 +4398,19 @@ { "code": "CZ-411", "name": "Cheb", - "parent": "41", + "parent": "CZ-41", "type": "District" }, { "code": "CZ-412", "name": "Karlovy Vary", - "parent": "41", + "parent": "CZ-41", "type": "District" }, { "code": "CZ-413", "name": "Sokolov", - "parent": "41", + "parent": "CZ-41", "type": "District" }, { @@ -4421,43 +4421,43 @@ { "code": "CZ-421", "name": "Děčín", - "parent": "42", + "parent": "CZ-42", "type": "District" }, { "code": "CZ-422", "name": "Chomutov", - "parent": "42", + "parent": "CZ-42", "type": "District" }, { "code": "CZ-423", "name": "Litoměřice", - "parent": "42", + "parent": "CZ-42", "type": "District" }, { "code": "CZ-424", "name": "Louny", - "parent": "42", + "parent": "CZ-42", "type": "District" }, { "code": "CZ-425", "name": "Most", - "parent": "42", + "parent": "CZ-42", "type": "District" }, { "code": "CZ-426", "name": "Teplice", - "parent": "42", + "parent": "CZ-42", "type": "District" }, { "code": "CZ-427", "name": "Ústí nad Labem", - "parent": "42", + "parent": "CZ-42", "type": "District" }, { @@ -4468,25 +4468,25 @@ { "code": "CZ-511", "name": "Česká Lípa", - "parent": "51", + "parent": "CZ-51", "type": "District" }, { "code": "CZ-512", "name": "Jablonec nad Nisou", - "parent": "51", + "parent": "CZ-51", "type": "District" }, { "code": "CZ-513", "name": "Liberec", - "parent": "51", + "parent": "CZ-51", "type": "District" }, { "code": "CZ-514", "name": "Semily", - "parent": "51", + "parent": "CZ-51", "type": "District" }, { @@ -4497,31 +4497,31 @@ { "code": "CZ-521", "name": "Hradec Králové", - "parent": "52", + "parent": "CZ-52", "type": "District" }, { "code": "CZ-522", "name": "Jičín", - "parent": "52", + "parent": "CZ-52", "type": "District" }, { "code": "CZ-523", "name": "Náchod", - "parent": "52", + "parent": "CZ-52", "type": "District" }, { "code": "CZ-524", "name": "Rychnov nad Kněžnou", - "parent": "52", + "parent": "CZ-52", "type": "District" }, { "code": "CZ-525", "name": "Trutnov", - "parent": "52", + "parent": "CZ-52", "type": "District" }, { @@ -4532,25 +4532,25 @@ { "code": "CZ-531", "name": "Chrudim", - "parent": "53", + "parent": "CZ-53", "type": "District" }, { "code": "CZ-532", "name": "Pardubice", - "parent": "53", + "parent": "CZ-53", "type": "District" }, { "code": "CZ-533", "name": "Svitavy", - "parent": "53", + "parent": "CZ-53", "type": "District" }, { "code": "CZ-534", "name": "Ústí nad Orlicí", - "parent": "53", + "parent": "CZ-53", "type": "District" }, { @@ -4561,31 +4561,31 @@ { "code": "CZ-631", "name": "Havlíčkův Brod", - "parent": "63", + "parent": "CZ-63", "type": "District" }, { "code": "CZ-632", "name": "Jihlava", - "parent": "63", + "parent": "CZ-63", "type": "District" }, { "code": "CZ-633", "name": "Pelhřimov", - "parent": "63", + "parent": "CZ-63", "type": "District" }, { "code": "CZ-634", "name": "Třebíč", - "parent": "63", + "parent": "CZ-63", "type": "District" }, { "code": "CZ-635", "name": "Žďár nad Sázavou", - "parent": "63", + "parent": "CZ-63", "type": "District" }, { @@ -4596,43 +4596,43 @@ { "code": "CZ-641", "name": "Blansko", - "parent": "64", + "parent": "CZ-64", "type": "District" }, { "code": "CZ-642", "name": "Brno-město", - "parent": "64", + "parent": "CZ-64", "type": "District" }, { "code": "CZ-643", "name": "Brno-venkov", - "parent": "64", + "parent": "CZ-64", "type": "District" }, { "code": "CZ-644", "name": "Břeclav", - "parent": "64", + "parent": "CZ-64", "type": "District" }, { "code": "CZ-645", "name": "Hodonín", - "parent": "64", + "parent": "CZ-64", "type": "District" }, { "code": "CZ-646", "name": "Vyškov", - "parent": "64", + "parent": "CZ-64", "type": "District" }, { "code": "CZ-647", "name": "Znojmo", - "parent": "64", + "parent": "CZ-64", "type": "District" }, { @@ -4643,31 +4643,31 @@ { "code": "CZ-711", "name": "Jeseník", - "parent": "71", + "parent": "CZ-71", "type": "District" }, { "code": "CZ-712", "name": "Olomouc", - "parent": "71", + "parent": "CZ-71", "type": "District" }, { "code": "CZ-713", "name": "Prostějov", - "parent": "71", + "parent": "CZ-71", "type": "District" }, { "code": "CZ-714", "name": "Přerov", - "parent": "71", + "parent": "CZ-71", "type": "District" }, { "code": "CZ-715", "name": "Šumperk", - "parent": "71", + "parent": "CZ-71", "type": "District" }, { @@ -4678,25 +4678,25 @@ { "code": "CZ-721", "name": "Kroměříž", - "parent": "72", + "parent": "CZ-72", "type": "District" }, { "code": "CZ-722", "name": "Uherské Hradiště", - "parent": "72", + "parent": "CZ-72", "type": "District" }, { "code": "CZ-723", "name": "Vsetín", - "parent": "72", + "parent": "CZ-72", "type": "District" }, { "code": "CZ-724", "name": "Zlín", - "parent": "72", + "parent": "CZ-72", "type": "District" }, { @@ -4707,37 +4707,37 @@ { "code": "CZ-801", "name": "Bruntál", - "parent": "80", + "parent": "CZ-80", "type": "District" }, { "code": "CZ-802", "name": "Frýdek-Místek", - "parent": "80", + "parent": "CZ-80", "type": "District" }, { "code": "CZ-803", "name": "Karviná", - "parent": "80", + "parent": "CZ-80", "type": "District" }, { "code": "CZ-804", "name": "Nový Jičín", - "parent": "80", + "parent": "CZ-80", "type": "District" }, { "code": "CZ-805", "name": "Opava", - "parent": "80", + "parent": "CZ-80", "type": "District" }, { "code": "CZ-806", "name": "Ostrava-město", - "parent": "80", + "parent": "CZ-80", "type": "District" }, { @@ -4842,7 +4842,7 @@ }, { "code": "DJ-OB", - "name": "Awbūk", + "name": "Obock", "type": "Region" }, { @@ -4928,193 +4928,193 @@ { "code": "DO-01", "name": "Distrito Nacional (Santo Domingo)", - "parent": "40", + "parent": "DO-40", "type": "District" }, { "code": "DO-02", "name": "Azua", - "parent": "41", + "parent": "DO-41", "type": "Province" }, { "code": "DO-03", "name": "Baoruco", - "parent": "38", + "parent": "DO-38", "type": "Province" }, { "code": "DO-04", "name": "Barahona", - "parent": "38", + "parent": "DO-38", "type": "Province" }, { "code": "DO-05", "name": "Dajabón", - "parent": "34", + "parent": "DO-34", "type": "Province" }, { "code": "DO-06", "name": "Duarte", - "parent": "33", + "parent": "DO-33", "type": "Province" }, { "code": "DO-07", "name": "Elías Piña", - "parent": "37", + "parent": "DO-37", "type": "Province" }, { "code": "DO-08", "name": "El Seibo", - "parent": "42", + "parent": "DO-42", "type": "Province" }, { "code": "DO-09", "name": "Espaillat", - "parent": "35", + "parent": "DO-35", "type": "Province" }, { "code": "DO-10", "name": "Independencia", - "parent": "38", + "parent": "DO-38", "type": "Province" }, { "code": "DO-11", "name": "La Altagracia", - "parent": "42", + "parent": "DO-42", "type": "Province" }, { "code": "DO-12", "name": "La Romana", - "parent": "42", + "parent": "DO-42", "type": "Province" }, { "code": "DO-13", "name": "La Vega", - "parent": "36", + "parent": "DO-36", "type": "Province" }, { "code": "DO-14", "name": "María Trinidad Sánchez", - "parent": "33", + "parent": "DO-33", "type": "Province" }, { "code": "DO-15", "name": "Monte Cristi", - "parent": "34", + "parent": "DO-34", "type": "Province" }, { "code": "DO-16", "name": "Pedernales", - "parent": "38", + "parent": "DO-38", "type": "Province" }, { "code": "DO-17", "name": "Peravia", - "parent": "41", + "parent": "DO-41", "type": "Province" }, { "code": "DO-18", "name": "Puerto Plata", - "parent": "35", + "parent": "DO-35", "type": "Province" }, { "code": "DO-19", "name": "Hermanas Mirabal", - "parent": "33", + "parent": "DO-33", "type": "Province" }, { "code": "DO-20", "name": "Samaná", - "parent": "33", + "parent": "DO-33", "type": "Province" }, { "code": "DO-21", "name": "San Cristóbal", - "parent": "41", + "parent": "DO-41", "type": "Province" }, { "code": "DO-22", "name": "San Juan", - "parent": "37", + "parent": "DO-37", "type": "Province" }, { "code": "DO-23", "name": "San Pedro de Macorís", - "parent": "39", + "parent": "DO-39", "type": "Province" }, { "code": "DO-24", "name": "Sánchez Ramírez", - "parent": "36", + "parent": "DO-36", "type": "Province" }, { "code": "DO-25", "name": "Santiago", - "parent": "35", + "parent": "DO-35", "type": "Province" }, { "code": "DO-26", "name": "Santiago Rodríguez", - "parent": "34", + "parent": "DO-34", "type": "Province" }, { "code": "DO-27", "name": "Valverde", - "parent": "34", + "parent": "DO-34", "type": "Province" }, { "code": "DO-28", "name": "Monseñor Nouel", - "parent": "36", + "parent": "DO-36", "type": "Province" }, { "code": "DO-29", "name": "Monte Plata", - "parent": "39", + "parent": "DO-39", "type": "Province" }, { "code": "DO-30", "name": "Hato Mayor", - "parent": "39", + "parent": "DO-39", "type": "Province" }, { "code": "DO-31", "name": "San José de Ocoa", - "parent": "41", + "parent": "DO-41", "type": "Province" }, { "code": "DO-32", "name": "Santo Domingo", - "parent": "40", + "parent": "DO-40", "type": "Province" }, { @@ -5407,6 +5407,56 @@ "name": "Relizane", "type": "Province" }, + { + "code": "DZ-49", + "name": "Timimoun", + "type": "Province" + }, + { + "code": "DZ-50", + "name": "Bordj Badji Mokhtar", + "type": "Province" + }, + { + "code": "DZ-51", + "name": "Ouled Djellal", + "type": "Province" + }, + { + "code": "DZ-52", + "name": "Béni Abbès", + "type": "Province" + }, + { + "code": "DZ-53", + "name": "In Salah", + "type": "Province" + }, + { + "code": "DZ-54", + "name": "In Guezzam", + "type": "Province" + }, + { + "code": "DZ-55", + "name": "Touggourt", + "type": "Province" + }, + { + "code": "DZ-56", + "name": "Djanet", + "type": "Province" + }, + { + "code": "DZ-57", + "name": "El Meghaier", + "type": "Province" + }, + { + "code": "DZ-58", + "name": "El Meniaa", + "type": "Province" + }, { "code": "EC-A", "name": "Azuay", @@ -5530,151 +5580,151 @@ { "code": "EE-130", "name": "Alutaguse", - "parent": "45", + "parent": "EE-45", "type": "Rural municipality" }, { "code": "EE-141", "name": "Anija", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-142", "name": "Antsla", - "parent": "87", + "parent": "EE-87", "type": "Rural municipality" }, { "code": "EE-171", "name": "Elva", - "parent": "79", + "parent": "EE-79", "type": "Rural municipality" }, { "code": "EE-184", "name": "Haapsalu", - "parent": "56", + "parent": "EE-56", "type": "Urban municipality" }, { "code": "EE-191", "name": "Haljala", - "parent": "60", + "parent": "EE-60", "type": "Rural municipality" }, { "code": "EE-198", "name": "Harku", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-205", "name": "Hiiumaa", - "parent": "39", + "parent": "EE-39", "type": "Rural municipality" }, { "code": "EE-214", "name": "Häädemeeste", - "parent": "68", + "parent": "EE-68", "type": "Rural municipality" }, { "code": "EE-245", "name": "Jõelähtme", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-247", "name": "Jõgeva", - "parent": "50", + "parent": "EE-50", "type": "Rural municipality" }, { "code": "EE-251", "name": "Jõhvi", - "parent": "45", + "parent": "EE-45", "type": "Rural municipality" }, { "code": "EE-255", "name": "Järva", - "parent": "52", + "parent": "EE-52", "type": "Rural municipality" }, { "code": "EE-272", "name": "Kadrina", - "parent": "60", + "parent": "EE-60", "type": "Rural municipality" }, { "code": "EE-283", "name": "Kambja", - "parent": "79", + "parent": "EE-79", "type": "Rural municipality" }, { "code": "EE-284", "name": "Kanepi", - "parent": "64", + "parent": "EE-64", "type": "Rural municipality" }, { "code": "EE-291", "name": "Kastre", - "parent": "79", + "parent": "EE-79", "type": "Rural municipality" }, { "code": "EE-293", "name": "Kehtna", - "parent": "71", + "parent": "EE-71", "type": "Rural municipality" }, { "code": "EE-296", "name": "Keila", - "parent": "37", + "parent": "EE-37", "type": "Urban municipality" }, { "code": "EE-303", "name": "Kihnu", - "parent": "68", + "parent": "EE-68", "type": "Rural municipality" }, { "code": "EE-305", "name": "Kiili", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-317", "name": "Kohila", - "parent": "71", + "parent": "EE-71", "type": "Rural municipality" }, { "code": "EE-321", "name": "Kohtla-Järve", - "parent": "45", + "parent": "EE-45", "type": "Urban municipality" }, { "code": "EE-338", "name": "Kose", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-353", "name": "Kuusalu", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { @@ -5690,43 +5740,43 @@ { "code": "EE-424", "name": "Loksa", - "parent": "37", + "parent": "EE-37", "type": "Urban municipality" }, { "code": "EE-430", "name": "Lääneranna", - "parent": "68", + "parent": "EE-68", "type": "Rural municipality" }, { "code": "EE-431", "name": "Lääne-Harju", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-432", "name": "Luunja", - "parent": "79", + "parent": "EE-79", "type": "Rural municipality" }, { "code": "EE-441", "name": "Lääne-Nigula", - "parent": "56", + "parent": "EE-56", "type": "Rural municipality" }, { "code": "EE-442", "name": "Lüganuse", - "parent": "45", + "parent": "EE-45", "type": "Rural municipality" }, { "code": "EE-446", "name": "Maardu", - "parent": "37", + "parent": "EE-37", "type": "Urban municipality" }, { @@ -5737,19 +5787,19 @@ { "code": "EE-478", "name": "Muhu", - "parent": "74", + "parent": "EE-74", "type": "Rural municipality" }, { "code": "EE-480", "name": "Mulgi", - "parent": "84", + "parent": "EE-84", "type": "Rural municipality" }, { "code": "EE-486", "name": "Mustvee", - "parent": "50", + "parent": "EE-50", "type": "Rural municipality" }, { @@ -5760,19 +5810,19 @@ { "code": "EE-503", "name": "Märjamaa", - "parent": "71", + "parent": "EE-71", "type": "Rural municipality" }, { "code": "EE-511", "name": "Narva", - "parent": "45", + "parent": "EE-45", "type": "Urban municipality" }, { "code": "EE-514", "name": "Narva-Jõesuu", - "parent": "45", + "parent": "EE-45", "type": "Urban municipality" }, { @@ -5783,13 +5833,13 @@ { "code": "EE-528", "name": "Nõo", - "parent": "79", + "parent": "EE-79", "type": "Rural municipality" }, { "code": "EE-557", "name": "Otepää", - "parent": "81", + "parent": "EE-81", "type": "Rural municipality" }, { @@ -5800,13 +5850,13 @@ { "code": "EE-567", "name": "Paide", - "parent": "52", + "parent": "EE-52", "type": "Urban municipality" }, { "code": "EE-586", "name": "Peipsiääre", - "parent": "79", + "parent": "EE-79", "type": "Rural municipality" }, { @@ -5817,31 +5867,31 @@ { "code": "EE-615", "name": "Põhja-Sakala", - "parent": "84", + "parent": "EE-84", "type": "Rural municipality" }, { "code": "EE-618", "name": "Põltsamaa", - "parent": "50", + "parent": "EE-50", "type": "Rural municipality" }, { "code": "EE-622", "name": "Põlva", - "parent": "64", + "parent": "EE-64", "type": "Rural municipality" }, { "code": "EE-624", "name": "Pärnu", - "parent": "68", + "parent": "EE-68", "type": "Urban municipality" }, { "code": "EE-638", "name": "Põhja-Pärnumaa", - "parent": "68", + "parent": "EE-68", "type": "Rural municipality" }, { @@ -5852,31 +5902,31 @@ { "code": "EE-651", "name": "Raasiku", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-653", "name": "Rae", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-661", "name": "Rakvere", - "parent": "60", + "parent": "EE-60", "type": "Rural municipality" }, { "code": "EE-663", "name": "Rakvere", - "parent": "60", + "parent": "EE-60", "type": "Urban municipality" }, { "code": "EE-668", "name": "Rapla", - "parent": "71", + "parent": "EE-71", "type": "Rural municipality" }, { @@ -5887,19 +5937,19 @@ { "code": "EE-689", "name": "Ruhnu", - "parent": "74", + "parent": "EE-74", "type": "Rural municipality" }, { "code": "EE-698", "name": "Rõuge", - "parent": "87", + "parent": "EE-87", "type": "Rural municipality" }, { "code": "EE-708", "name": "Räpina", - "parent": "64", + "parent": "EE-64", "type": "Rural municipality" }, { @@ -5910,37 +5960,37 @@ { "code": "EE-712", "name": "Saarde", - "parent": "68", + "parent": "EE-68", "type": "Rural municipality" }, { "code": "EE-714", "name": "Saaremaa", - "parent": "74", + "parent": "EE-74", "type": "Rural municipality" }, { "code": "EE-719", "name": "Saku", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-726", "name": "Saue", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-732", "name": "Setomaa", - "parent": "87", + "parent": "EE-87", "type": "Rural municipality" }, { "code": "EE-735", "name": "Sillamäe", - "parent": "45", + "parent": "EE-45", "type": "Urban municipality" }, { @@ -5951,7 +6001,7 @@ { "code": "EE-784", "name": "Tallinn", - "parent": "37", + "parent": "EE-37", "type": "Urban municipality" }, { @@ -5962,31 +6012,31 @@ { "code": "EE-792", "name": "Tapa", - "parent": "60", + "parent": "EE-60", "type": "Rural municipality" }, { "code": "EE-793", "name": "Tartu", - "parent": "79", + "parent": "EE-79", "type": "Urban municipality" }, { "code": "EE-796", "name": "Tartu", - "parent": "79", + "parent": "EE-79", "type": "Rural municipality" }, { "code": "EE-803", "name": "Toila", - "parent": "45", + "parent": "EE-45", "type": "Rural municipality" }, { "code": "EE-809", "name": "Tori", - "parent": "68", + "parent": "EE-68", "type": "Rural municipality" }, { @@ -5997,13 +6047,13 @@ { "code": "EE-824", "name": "Tõrva", - "parent": "81", + "parent": "EE-81", "type": "Rural municipality" }, { "code": "EE-834", "name": "Türi", - "parent": "52", + "parent": "EE-52", "type": "Rural municipality" }, { @@ -6014,7 +6064,7 @@ { "code": "EE-855", "name": "Valga", - "parent": "81", + "parent": "EE-81", "type": "Rural municipality" }, { @@ -6025,55 +6075,55 @@ { "code": "EE-890", "name": "Viimsi", - "parent": "37", + "parent": "EE-37", "type": "Rural municipality" }, { "code": "EE-897", "name": "Viljandi", - "parent": "84", + "parent": "EE-84", "type": "Urban municipality" }, { "code": "EE-899", "name": "Viljandi", - "parent": "84", + "parent": "EE-84", "type": "Rural municipality" }, { "code": "EE-901", "name": "Vinni", - "parent": "60", + "parent": "EE-60", "type": "Rural municipality" }, { "code": "EE-903", "name": "Viru-Nigula", - "parent": "60", + "parent": "EE-60", "type": "Rural municipality" }, { "code": "EE-907", "name": "Vormsi", - "parent": "56", + "parent": "EE-56", "type": "Rural municipality" }, { "code": "EE-917", "name": "Võru", - "parent": "87", + "parent": "EE-87", "type": "Rural municipality" }, { "code": "EE-919", "name": "Võru", - "parent": "87", + "parent": "EE-87", "type": "Urban municipality" }, { "code": "EE-928", "name": "Väike-Maarja", - "parent": "60", + "parent": "EE-60", "type": "Rural municipality" }, { @@ -6244,19 +6294,19 @@ { "code": "ES-A", "name": "Alacant*", - "parent": "VC", + "parent": "ES-VC", "type": "Province" }, { "code": "ES-AB", "name": "Albacete", - "parent": "CM", + "parent": "ES-CM", "type": "Province" }, { "code": "ES-AL", "name": "Almería", - "parent": "AN", + "parent": "ES-AN", "type": "Province" }, { @@ -6277,43 +6327,43 @@ { "code": "ES-AV", "name": "Ávila", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { "code": "ES-B", "name": "Barcelona [Barcelona]", - "parent": "CT", + "parent": "ES-CT", "type": "Province" }, { "code": "ES-BA", "name": "Badajoz", - "parent": "EX", + "parent": "ES-EX", "type": "Province" }, { "code": "ES-BI", "name": "Bizkaia", - "parent": "PV", + "parent": "ES-PV", "type": "Province" }, { "code": "ES-BU", "name": "Burgos", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { "code": "ES-C", "name": "A Coruña [La Coruña]", - "parent": "GA", + "parent": "ES-GA", "type": "Province" }, { "code": "ES-CA", "name": "Cádiz", - "parent": "AN", + "parent": "ES-AN", "type": "Province" }, { @@ -6324,7 +6374,7 @@ { "code": "ES-CC", "name": "Cáceres", - "parent": "EX", + "parent": "ES-EX", "type": "Province" }, { @@ -6350,19 +6400,19 @@ { "code": "ES-CO", "name": "Córdoba", - "parent": "AN", + "parent": "ES-AN", "type": "Province" }, { "code": "ES-CR", "name": "Ciudad Real", - "parent": "CM", + "parent": "ES-CM", "type": "Province" }, { "code": "ES-CS", "name": "Castelló*", - "parent": "VC", + "parent": "ES-VC", "type": "Province" }, { @@ -6373,7 +6423,7 @@ { "code": "ES-CU", "name": "Cuenca", - "parent": "CM", + "parent": "ES-CM", "type": "Province" }, { @@ -6389,37 +6439,37 @@ { "code": "ES-GC", "name": "Las Palmas", - "parent": "CN", + "parent": "ES-CN", "type": "Province" }, { "code": "ES-GI", "name": "Girona [Gerona]", - "parent": "CT", + "parent": "ES-CT", "type": "Province" }, { "code": "ES-GR", "name": "Granada", - "parent": "AN", + "parent": "ES-AN", "type": "Province" }, { "code": "ES-GU", "name": "Guadalajara", - "parent": "CM", + "parent": "ES-CM", "type": "Province" }, { "code": "ES-H", "name": "Huelva", - "parent": "AN", + "parent": "ES-AN", "type": "Province" }, { "code": "ES-HU", "name": "Huesca", - "parent": "AR", + "parent": "ES-AR", "type": "Province" }, { @@ -6430,43 +6480,43 @@ { "code": "ES-J", "name": "Jaén", - "parent": "AN", + "parent": "ES-AN", "type": "Province" }, { "code": "ES-L", "name": "Lleida [Lérida]", - "parent": "CT", + "parent": "ES-CT", "type": "Province" }, { "code": "ES-LE", "name": "León", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { "code": "ES-LO", "name": "La Rioja", - "parent": "RI", + "parent": "ES-RI", "type": "Province" }, { "code": "ES-LU", "name": "Lugo [Lugo]", - "parent": "GA", + "parent": "ES-GA", "type": "Province" }, { "code": "ES-M", "name": "Madrid", - "parent": "MD", + "parent": "ES-MD", "type": "Province" }, { "code": "ES-MA", "name": "Málaga", - "parent": "AN", + "parent": "ES-AN", "type": "Province" }, { @@ -6487,13 +6537,13 @@ { "code": "ES-MU", "name": "Murcia", - "parent": "MC", + "parent": "ES-MC", "type": "Province" }, { "code": "ES-NA", "name": "Nafarroa*", - "parent": "NC", + "parent": "ES-NC", "type": "Province" }, { @@ -6504,31 +6554,31 @@ { "code": "ES-O", "name": "Asturias", - "parent": "AS", + "parent": "ES-AS", "type": "Province" }, { "code": "ES-OR", "name": "Ourense [Orense]", - "parent": "GA", + "parent": "ES-GA", "type": "Province" }, { "code": "ES-P", "name": "Palencia", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { "code": "ES-PM", "name": "Illes Balears [Islas Baleares]", - "parent": "IB", + "parent": "ES-IB", "type": "Province" }, { "code": "ES-PO", "name": "Pontevedra [Pontevedra]", - "parent": "GA", + "parent": "ES-GA", "type": "Province" }, { @@ -6544,73 +6594,73 @@ { "code": "ES-S", "name": "Cantabria", - "parent": "CB", + "parent": "ES-CB", "type": "Province" }, { "code": "ES-SA", "name": "Salamanca", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { "code": "ES-SE", "name": "Sevilla", - "parent": "AN", + "parent": "ES-AN", "type": "Province" }, { "code": "ES-SG", "name": "Segovia", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { "code": "ES-SO", "name": "Soria", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { "code": "ES-SS", "name": "Gipuzkoa", - "parent": "PV", + "parent": "ES-PV", "type": "Province" }, { "code": "ES-T", "name": "Tarragona [Tarragona]", - "parent": "CT", + "parent": "ES-CT", "type": "Province" }, { "code": "ES-TE", "name": "Teruel", - "parent": "AR", + "parent": "ES-AR", "type": "Province" }, { "code": "ES-TF", "name": "Santa Cruz de Tenerife", - "parent": "CN", + "parent": "ES-CN", "type": "Province" }, { "code": "ES-TO", "name": "Toledo", - "parent": "CM", + "parent": "ES-CM", "type": "Province" }, { "code": "ES-V", "name": "Valencia", - "parent": "VC", + "parent": "ES-VC", "type": "Province" }, { "code": "ES-VA", "name": "Valladolid", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { @@ -6621,19 +6671,19 @@ { "code": "ES-VI", "name": "Araba*", - "parent": "PV", + "parent": "ES-PV", "type": "Province" }, { "code": "ES-Z", "name": "Zaragoza", - "parent": "AR", + "parent": "ES-AR", "type": "Province" }, { "code": "ES-ZA", "name": "Zamora", - "parent": "CL", + "parent": "ES-CL", "type": "Province" }, { @@ -6676,6 +6726,11 @@ "name": "Oromia", "type": "Regional state" }, + { + "code": "ET-SI", + "name": "Sidama", + "type": "Regional state" + }, { "code": "ET-SN", "name": "Southern Nations, Nationalities and Peoples", @@ -6686,6 +6741,11 @@ "name": "Somali", "type": "Regional state" }, + { + "code": "ET-SW", + "name": "Southwest Ethiopia Peoples", + "type": "Regional state" + }, { "code": "ET-TI", "name": "Tigrai", @@ -6693,7 +6753,7 @@ }, { "code": "FI-01", - "name": "Åland", + "name": "Landskapet Åland", "type": "Region" }, { @@ -6789,85 +6849,85 @@ { "code": "FJ-01", "name": "Ba", - "parent": "W", + "parent": "FJ-W", "type": "Province" }, { "code": "FJ-02", "name": "Bua", - "parent": "N", + "parent": "FJ-N", "type": "Province" }, { "code": "FJ-03", "name": "Cakaudrove", - "parent": "N", + "parent": "FJ-N", "type": "Province" }, { "code": "FJ-04", "name": "Kadavu", - "parent": "E", + "parent": "FJ-E", "type": "Province" }, { "code": "FJ-05", "name": "Lau", - "parent": "E", + "parent": "FJ-E", "type": "Province" }, { "code": "FJ-06", "name": "Lomaiviti", - "parent": "E", + "parent": "FJ-E", "type": "Province" }, { "code": "FJ-07", "name": "Macuata", - "parent": "N", + "parent": "FJ-N", "type": "Province" }, { "code": "FJ-08", "name": "Nadroga and Navosa", - "parent": "W", + "parent": "FJ-W", "type": "Province" }, { "code": "FJ-09", "name": "Naitasiri", - "parent": "C", + "parent": "FJ-C", "type": "Province" }, { "code": "FJ-10", "name": "Namosi", - "parent": "C", + "parent": "FJ-C", "type": "Province" }, { "code": "FJ-11", "name": "Ra", - "parent": "W", + "parent": "FJ-W", "type": "Province" }, { "code": "FJ-12", "name": "Rewa", - "parent": "C", + "parent": "FJ-C", "type": "Province" }, { "code": "FJ-13", "name": "Serua", - "parent": "C", + "parent": "FJ-C", "type": "Province" }, { "code": "FJ-14", "name": "Tailevu", - "parent": "C", + "parent": "FJ-C", "type": "Province" }, { @@ -6918,115 +6978,115 @@ { "code": "FR-01", "name": "Ain", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-02", "name": "Aisne", - "parent": "HDF", + "parent": "FR-HDF", "type": "Metropolitan department" }, { "code": "FR-03", "name": "Allier", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-04", "name": "Alpes-de-Haute-Provence", - "parent": "PAC", + "parent": "FR-PAC", "type": "Metropolitan department" }, { "code": "FR-05", "name": "Hautes-Alpes", - "parent": "PAC", + "parent": "FR-PAC", "type": "Metropolitan department" }, { "code": "FR-06", "name": "Alpes-Maritimes", - "parent": "PAC", + "parent": "FR-PAC", "type": "Metropolitan department" }, { "code": "FR-07", "name": "Ardèche", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-08", "name": "Ardennes", - "parent": "GES", + "parent": "FR-GES", "type": "Metropolitan department" }, { "code": "FR-09", "name": "Ariège", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-10", "name": "Aube", - "parent": "GES", + "parent": "FR-GES", "type": "Metropolitan department" }, { "code": "FR-11", "name": "Aude", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-12", "name": "Aveyron", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-13", "name": "Bouches-du-Rhône", - "parent": "PAC", + "parent": "FR-PAC", "type": "Metropolitan department" }, { "code": "FR-14", "name": "Calvados", - "parent": "NOR", + "parent": "FR-NOR", "type": "Metropolitan department" }, { "code": "FR-15", "name": "Cantal", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-16", "name": "Charente", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-17", "name": "Charente-Maritime", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-18", "name": "Cher", - "parent": "CVL", + "parent": "FR-CVL", "type": "Metropolitan department" }, { "code": "FR-19", "name": "Corrèze", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { @@ -7037,494 +7097,501 @@ { "code": "FR-21", "name": "Côte-d'Or", - "parent": "BFC", + "parent": "FR-BFC", "type": "Metropolitan department" }, { "code": "FR-22", "name": "Côtes-d'Armor", - "parent": "BRE", + "parent": "FR-BRE", "type": "Metropolitan department" }, { "code": "FR-23", "name": "Creuse", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-24", "name": "Dordogne", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-25", "name": "Doubs", - "parent": "BFC", + "parent": "FR-BFC", "type": "Metropolitan department" }, { "code": "FR-26", "name": "Drôme", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-27", "name": "Eure", - "parent": "NOR", + "parent": "FR-NOR", "type": "Metropolitan department" }, { "code": "FR-28", "name": "Eure-et-Loir", - "parent": "CVL", + "parent": "FR-CVL", "type": "Metropolitan department" }, { "code": "FR-29", "name": "Finistère", - "parent": "BRE", + "parent": "FR-BRE", "type": "Metropolitan department" }, { "code": "FR-2A", "name": "Corse-du-Sud", - "parent": "20R", + "parent": "FR-20R", "type": "Metropolitan department" }, { "code": "FR-2B", "name": "Haute-Corse", - "parent": "20R", + "parent": "FR-20R", "type": "Metropolitan department" }, { "code": "FR-30", "name": "Gard", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-31", "name": "Haute-Garonne", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-32", "name": "Gers", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-33", "name": "Gironde", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-34", "name": "Hérault", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-35", "name": "Ille-et-Vilaine", - "parent": "BRE", + "parent": "FR-BRE", "type": "Metropolitan department" }, { "code": "FR-36", "name": "Indre", - "parent": "CVL", + "parent": "FR-CVL", "type": "Metropolitan department" }, { "code": "FR-37", "name": "Indre-et-Loire", - "parent": "CVL", + "parent": "FR-CVL", "type": "Metropolitan department" }, { "code": "FR-38", "name": "Isère", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-39", "name": "Jura", - "parent": "BFC", + "parent": "FR-BFC", "type": "Metropolitan department" }, { "code": "FR-40", "name": "Landes", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-41", "name": "Loir-et-Cher", - "parent": "CVL", + "parent": "FR-CVL", "type": "Metropolitan department" }, { "code": "FR-42", "name": "Loire", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-43", "name": "Haute-Loire", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-44", "name": "Loire-Atlantique", - "parent": "PDL", + "parent": "FR-PDL", "type": "Metropolitan department" }, { "code": "FR-45", "name": "Loiret", - "parent": "CVL", + "parent": "FR-CVL", "type": "Metropolitan department" }, { "code": "FR-46", "name": "Lot", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-47", "name": "Lot-et-Garonne", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-48", "name": "Lozère", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-49", "name": "Maine-et-Loire", - "parent": "PDL", + "parent": "FR-PDL", "type": "Metropolitan department" }, { "code": "FR-50", "name": "Manche", - "parent": "NOR", + "parent": "FR-NOR", "type": "Metropolitan department" }, { "code": "FR-51", "name": "Marne", - "parent": "GES", + "parent": "FR-GES", "type": "Metropolitan department" }, { "code": "FR-52", "name": "Haute-Marne", - "parent": "GES", + "parent": "FR-GES", "type": "Metropolitan department" }, { "code": "FR-53", "name": "Mayenne", - "parent": "PDL", + "parent": "FR-PDL", "type": "Metropolitan department" }, { "code": "FR-54", "name": "Meurthe-et-Moselle", - "parent": "GES", + "parent": "FR-GES", "type": "Metropolitan department" }, { "code": "FR-55", "name": "Meuse", - "parent": "GES", + "parent": "FR-GES", "type": "Metropolitan department" }, { "code": "FR-56", "name": "Morbihan", - "parent": "BRE", + "parent": "FR-BRE", "type": "Metropolitan department" }, { "code": "FR-57", "name": "Moselle", - "parent": "GES", + "parent": "FR-GES", "type": "Metropolitan department" }, { "code": "FR-58", "name": "Nièvre", - "parent": "BFC", + "parent": "FR-BFC", "type": "Metropolitan department" }, { "code": "FR-59", "name": "Nord", - "parent": "HDF", + "parent": "FR-HDF", "type": "Metropolitan department" }, { "code": "FR-60", "name": "Oise", - "parent": "HDF", + "parent": "FR-HDF", "type": "Metropolitan department" }, { "code": "FR-61", "name": "Orne", - "parent": "NOR", + "parent": "FR-NOR", "type": "Metropolitan department" }, { "code": "FR-62", "name": "Pas-de-Calais", - "parent": "HDF", + "parent": "FR-HDF", "type": "Metropolitan department" }, { "code": "FR-63", "name": "Puy-de-Dôme", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-64", "name": "Pyrénées-Atlantiques", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-65", "name": "Hautes-Pyrénées", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-66", "name": "Pyrénées-Orientales", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-67", "name": "Bas-Rhin", - "parent": "GES", + "parent": "FR-6AE", "type": "Metropolitan department" }, { "code": "FR-68", "name": "Haut-Rhin", - "parent": "GES", + "parent": "FR-6AE", "type": "Metropolitan department" }, { "code": "FR-69", "name": "Rhône", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, + { + "code": "FR-69M", + "name": "Métropole de Lyon", + "parent": "FR-ARA", + "type": "Metropolitan collectivity with special status" + }, + { + "code": "FR-6AE", + "name": "Alsace", + "parent": "FR-GES", + "type": "European collectivity" + }, { "code": "FR-70", "name": "Haute-Saône", - "parent": "BFC", + "parent": "FR-BFC", "type": "Metropolitan department" }, { "code": "FR-71", "name": "Saône-et-Loire", - "parent": "BFC", + "parent": "FR-BFC", "type": "Metropolitan department" }, { "code": "FR-72", "name": "Sarthe", - "parent": "PDL", + "parent": "FR-PDL", "type": "Metropolitan department" }, { "code": "FR-73", "name": "Savoie", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { "code": "FR-74", "name": "Haute-Savoie", - "parent": "ARA", + "parent": "FR-ARA", "type": "Metropolitan department" }, { - "code": "FR-75", + "code": "FR-75C", "name": "Paris", - "parent": "IDF", - "type": "Metropolitan department" + "parent": "FR-IDF", + "type": "Metropolitan collectivity with special status" }, { "code": "FR-76", "name": "Seine-Maritime", - "parent": "NOR", + "parent": "FR-NOR", "type": "Metropolitan department" }, { "code": "FR-77", "name": "Seine-et-Marne", - "parent": "IDF", + "parent": "FR-IDF", "type": "Metropolitan department" }, { "code": "FR-78", "name": "Yvelines", - "parent": "IDF", + "parent": "FR-IDF", "type": "Metropolitan department" }, { "code": "FR-79", "name": "Deux-Sèvres", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-80", "name": "Somme", - "parent": "HDF", + "parent": "FR-HDF", "type": "Metropolitan department" }, { "code": "FR-81", "name": "Tarn", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-82", "name": "Tarn-et-Garonne", - "parent": "OCC", + "parent": "FR-OCC", "type": "Metropolitan department" }, { "code": "FR-83", "name": "Var", - "parent": "PAC", + "parent": "FR-PAC", "type": "Metropolitan department" }, { "code": "FR-84", "name": "Vaucluse", - "parent": "PAC", + "parent": "FR-PAC", "type": "Metropolitan department" }, { "code": "FR-85", "name": "Vendée", - "parent": "PDL", + "parent": "FR-PDL", "type": "Metropolitan department" }, { "code": "FR-86", "name": "Vienne", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-87", "name": "Haute-Vienne", - "parent": "NAQ", + "parent": "FR-NAQ", "type": "Metropolitan department" }, { "code": "FR-88", "name": "Vosges", - "parent": "GES", + "parent": "FR-GES", "type": "Metropolitan department" }, { "code": "FR-89", "name": "Yonne", - "parent": "BFC", + "parent": "FR-BFC", "type": "Metropolitan department" }, { "code": "FR-90", "name": "Territoire de Belfort", - "parent": "BFC", + "parent": "FR-BFC", "type": "Metropolitan department" }, { "code": "FR-91", "name": "Essonne", - "parent": "IDF", + "parent": "FR-IDF", "type": "Metropolitan department" }, { "code": "FR-92", "name": "Hauts-de-Seine", - "parent": "IDF", + "parent": "FR-IDF", "type": "Metropolitan department" }, { "code": "FR-93", "name": "Seine-Saint-Denis", - "parent": "IDF", + "parent": "FR-IDF", "type": "Metropolitan department" }, { "code": "FR-94", "name": "Val-de-Marne", - "parent": "IDF", + "parent": "FR-IDF", "type": "Metropolitan department" }, { "code": "FR-95", "name": "Val-d'Oise", - "parent": "IDF", + "parent": "FR-IDF", "type": "Metropolitan department" }, { "code": "FR-971", "name": "Guadeloupe", - "parent": "GP", - "type": "Overseas department" + "type": "Overseas departmental collectivity" }, { "code": "FR-972", "name": "Martinique", - "parent": "MQ", - "type": "Overseas department" + "type": "Overseas unique territorial collectivity" }, { "code": "FR-973", "name": "Guyane (française)", - "parent": "GF", - "type": "Overseas department" + "type": "Overseas unique territorial collectivity" }, { "code": "FR-974", "name": "La Réunion", - "parent": "RE", - "type": "Overseas department" + "type": "Overseas departmental collectivity" }, { "code": "FR-976", "name": "Mayotte", - "parent": "YT", - "type": "Overseas department" + "type": "Overseas departmental collectivity" }, { "code": "FR-ARA", @@ -7561,16 +7628,6 @@ "name": "Grand-Est", "type": "Metropolitan region" }, - { - "code": "FR-GF", - "name": "Guyane (française)", - "type": "Overseas region" - }, - { - "code": "FR-GP", - "name": "Guadeloupe", - "type": "Overseas region" - }, { "code": "FR-HDF", "name": "Hauts-de-France", @@ -7586,11 +7643,6 @@ "name": "Saint-Martin", "type": "Overseas collectivity" }, - { - "code": "FR-MQ", - "name": "Martinique", - "type": "Overseas region" - }, { "code": "FR-NAQ", "name": "Nouvelle-Aquitaine", @@ -7631,11 +7683,6 @@ "name": "Saint-Pierre-et-Miquelon", "type": "Overseas collectivity" }, - { - "code": "FR-RE", - "name": "La Réunion", - "type": "Overseas region" - }, { "code": "FR-TF", "name": "Terres australes françaises", @@ -7646,11 +7693,6 @@ "name": "Wallis-et-Futuna", "type": "Overseas collectivity" }, - { - "code": "FR-YT", - "name": "Mayotte", - "type": "Overseas region" - }, { "code": "GA-1", "name": "Estuaire", @@ -7814,7 +7856,7 @@ "code": "GB-BKM", "name": "Buckinghamshire", "parent": "GB-ENG", - "type": "Two-tier county" + "type": "Unitary authority" }, { "code": "GB-BNE", @@ -8505,16 +8547,16 @@ "type": "District" }, { - "code": "GB-NSM", - "name": "North Somerset", + "code": "GB-NNH", + "name": "North Northamptonshire", "parent": "GB-ENG", "type": "Unitary authority" }, { - "code": "GB-NTH", - "name": "Northamptonshire", + "code": "GB-NSM", + "name": "North Somerset", "parent": "GB-ENG", - "type": "Two-tier county" + "type": "Unitary authority" }, { "code": "GB-NTL", @@ -8952,6 +8994,12 @@ "parent": "GB-ENG", "type": "London borough" }, + { + "code": "GB-WNH", + "name": "West Northamptonshire", + "parent": "GB-ENG", + "type": "Unitary authority" + }, { "code": "GB-WNM", "name": "Windsor and Maidenhead", @@ -9250,19 +9298,19 @@ { "code": "GN-BE", "name": "Beyla", - "parent": "N", + "parent": "GN-N", "type": "Prefecture" }, { "code": "GN-BF", "name": "Boffa", - "parent": "B", + "parent": "GN-B", "type": "Prefecture" }, { "code": "GN-BK", "name": "Boké", - "parent": "B", + "parent": "GN-B", "type": "Prefecture" }, { @@ -9273,7 +9321,7 @@ { "code": "GN-CO", "name": "Coyah", - "parent": "D", + "parent": "GN-D", "type": "Prefecture" }, { @@ -9284,25 +9332,25 @@ { "code": "GN-DB", "name": "Dabola", - "parent": "F", + "parent": "GN-F", "type": "Prefecture" }, { "code": "GN-DI", "name": "Dinguiraye", - "parent": "F", + "parent": "GN-F", "type": "Prefecture" }, { "code": "GN-DL", "name": "Dalaba", - "parent": "M", + "parent": "GN-M", "type": "Prefecture" }, { "code": "GN-DU", "name": "Dubréka", - "parent": "D", + "parent": "GN-D", "type": "Prefecture" }, { @@ -9313,31 +9361,31 @@ { "code": "GN-FA", "name": "Faranah", - "parent": "F", + "parent": "GN-F", "type": "Prefecture" }, { "code": "GN-FO", "name": "Forécariah", - "parent": "D", + "parent": "GN-D", "type": "Prefecture" }, { "code": "GN-FR", "name": "Fria", - "parent": "B", + "parent": "GN-B", "type": "Prefecture" }, { "code": "GN-GA", "name": "Gaoual", - "parent": "B", + "parent": "GN-B", "type": "Prefecture" }, { "code": "GN-GU", "name": "Guékédou", - "parent": "N", + "parent": "GN-N", "type": "Prefecture" }, { @@ -9348,43 +9396,43 @@ { "code": "GN-KA", "name": "Kankan", - "parent": "K", + "parent": "GN-K", "type": "Prefecture" }, { "code": "GN-KB", "name": "Koubia", - "parent": "L", + "parent": "GN-L", "type": "Prefecture" }, { "code": "GN-KD", "name": "Kindia", - "parent": "D", + "parent": "GN-D", "type": "Prefecture" }, { "code": "GN-KE", "name": "Kérouané", - "parent": "K", + "parent": "GN-K", "type": "Prefecture" }, { "code": "GN-KN", "name": "Koundara", - "parent": "B", + "parent": "GN-B", "type": "Prefecture" }, { "code": "GN-KO", "name": "Kouroussa", - "parent": "K", + "parent": "GN-K", "type": "Prefecture" }, { "code": "GN-KS", "name": "Kissidougou", - "parent": "F", + "parent": "GN-F", "type": "Prefecture" }, { @@ -9395,19 +9443,19 @@ { "code": "GN-LA", "name": "Labé", - "parent": "L", + "parent": "GN-L", "type": "Prefecture" }, { "code": "GN-LE", "name": "Lélouma", - "parent": "L", + "parent": "GN-L", "type": "Prefecture" }, { "code": "GN-LO", "name": "Lola", - "parent": "N", + "parent": "GN-N", "type": "Prefecture" }, { @@ -9418,25 +9466,25 @@ { "code": "GN-MC", "name": "Macenta", - "parent": "N", + "parent": "GN-N", "type": "Prefecture" }, { "code": "GN-MD", "name": "Mandiana", - "parent": "K", + "parent": "GN-K", "type": "Prefecture" }, { "code": "GN-ML", "name": "Mali", - "parent": "L", + "parent": "GN-L", "type": "Prefecture" }, { "code": "GN-MM", "name": "Mamou", - "parent": "M", + "parent": "GN-M", "type": "Prefecture" }, { @@ -9447,95 +9495,95 @@ { "code": "GN-NZ", "name": "Nzérékoré", - "parent": "N", + "parent": "GN-N", "type": "Prefecture" }, { "code": "GN-PI", "name": "Pita", - "parent": "M", + "parent": "GN-M", "type": "Prefecture" }, { "code": "GN-SI", "name": "Siguiri", - "parent": "K", + "parent": "GN-K", "type": "Prefecture" }, { "code": "GN-TE", "name": "Télimélé", - "parent": "D", + "parent": "GN-D", "type": "Prefecture" }, { "code": "GN-TO", "name": "Tougué", - "parent": "L", + "parent": "GN-L", "type": "Prefecture" }, { "code": "GN-YO", "name": "Yomou", - "parent": "N", + "parent": "GN-N", "type": "Prefecture" }, { "code": "GQ-AN", "name": "Annobon", - "parent": "I", + "parent": "GQ-I", "type": "Province" }, { "code": "GQ-BN", "name": "Bioko Nord", - "parent": "I", + "parent": "GQ-I", "type": "Province" }, { "code": "GQ-BS", "name": "Bioko Sud", - "parent": "I", + "parent": "GQ-I", "type": "Province" }, { "code": "GQ-C", - "name": "Região Continental", + "name": "Région Continentale", "type": "Region" }, { "code": "GQ-CS", "name": "Centro Sud", - "parent": "C", + "parent": "GQ-C", "type": "Province" }, { "code": "GQ-DJ", "name": "Djibloho", - "parent": "C", + "parent": "GQ-C", "type": "Province" }, { "code": "GQ-I", - "name": "Região Insular", + "name": "Région Insulaire", "type": "Region" }, { "code": "GQ-KN", "name": "Kié-Ntem", - "parent": "C", + "parent": "GQ-C", "type": "Province" }, { "code": "GQ-LI", - "name": "Litoral", - "parent": "C", + "name": "Littoral", + "parent": "GQ-C", "type": "Province" }, { "code": "GQ-WN", "name": "Wele-Nzas", - "parent": "C", + "parent": "GQ-C", "type": "Province" }, { @@ -9609,131 +9657,131 @@ "type": "Administrative region" }, { - "code": "GT-AV", - "name": "Alta Verapaz", + "code": "GT-01", + "name": "Guatemala", "type": "Department" }, { - "code": "GT-BV", - "name": "Baja Verapaz", + "code": "GT-02", + "name": "El Progreso", "type": "Department" }, { - "code": "GT-CM", - "name": "Chimaltenango", + "code": "GT-03", + "name": "Sacatepéquez", "type": "Department" }, { - "code": "GT-CQ", - "name": "Chiquimula", + "code": "GT-04", + "name": "Chimaltenango", "type": "Department" }, { - "code": "GT-ES", + "code": "GT-05", "name": "Escuintla", "type": "Department" }, { - "code": "GT-GU", - "name": "Guatemala", + "code": "GT-06", + "name": "Santa Rosa", "type": "Department" }, { - "code": "GT-HU", - "name": "Huehuetenango", + "code": "GT-07", + "name": "Sololá", "type": "Department" }, { - "code": "GT-IZ", - "name": "Izabal", + "code": "GT-08", + "name": "Totonicapán", "type": "Department" }, { - "code": "GT-JA", - "name": "Jalapa", + "code": "GT-09", + "name": "Quetzaltenango", "type": "Department" }, { - "code": "GT-JU", - "name": "Jutiapa", + "code": "GT-10", + "name": "Suchitepéquez", "type": "Department" }, { - "code": "GT-PE", - "name": "Petén", + "code": "GT-11", + "name": "Retalhuleu", "type": "Department" }, { - "code": "GT-PR", - "name": "El Progreso", + "code": "GT-12", + "name": "San Marcos", "type": "Department" }, { - "code": "GT-QC", - "name": "Quiché", + "code": "GT-13", + "name": "Huehuetenango", "type": "Department" }, { - "code": "GT-QZ", - "name": "Quetzaltenango", + "code": "GT-14", + "name": "Quiché", "type": "Department" }, { - "code": "GT-RE", - "name": "Retalhuleu", + "code": "GT-15", + "name": "Baja Verapaz", "type": "Department" }, { - "code": "GT-SA", - "name": "Sacatepéquez", + "code": "GT-16", + "name": "Alta Verapaz", "type": "Department" }, { - "code": "GT-SM", - "name": "San Marcos", + "code": "GT-17", + "name": "Petén", "type": "Department" }, { - "code": "GT-SO", - "name": "Sololá", + "code": "GT-18", + "name": "Izabal", "type": "Department" }, { - "code": "GT-SR", - "name": "Santa Rosa", + "code": "GT-19", + "name": "Zacapa", "type": "Department" }, { - "code": "GT-SU", - "name": "Suchitepéquez", + "code": "GT-20", + "name": "Chiquimula", "type": "Department" }, { - "code": "GT-TO", - "name": "Totonicapán", + "code": "GT-21", + "name": "Jalapa", "type": "Department" }, { - "code": "GT-ZA", - "name": "Zacapa", + "code": "GT-22", + "name": "Jutiapa", "type": "Department" }, { "code": "GW-BA", "name": "Bafatá", - "parent": "L", + "parent": "GW-L", "type": "Region" }, { "code": "GW-BL", "name": "Bolama / Bijagós", - "parent": "S", + "parent": "GW-S", "type": "Region" }, { "code": "GW-BM", "name": "Biombo", - "parent": "N", + "parent": "GW-N", "type": "Region" }, { @@ -9744,13 +9792,13 @@ { "code": "GW-CA", "name": "Cacheu", - "parent": "N", + "parent": "GW-N", "type": "Region" }, { "code": "GW-GA", "name": "Gabú", - "parent": "L", + "parent": "GW-L", "type": "Region" }, { @@ -9766,13 +9814,13 @@ { "code": "GW-OI", "name": "Oio", - "parent": "N", + "parent": "GW-N", "type": "Region" }, { "code": "GW-QU", "name": "Quinara", - "parent": "S", + "parent": "GW-S", "type": "Region" }, { @@ -9783,7 +9831,7 @@ { "code": "GW-TO", "name": "Tombali", - "parent": "S", + "parent": "GW-S", "type": "Region" }, { @@ -10043,7 +10091,7 @@ }, { "code": "HT-GA", - "name": "Grandans", + "name": "Grande’Anse", "type": "Department" }, { @@ -10058,7 +10106,7 @@ }, { "code": "HT-NI", - "name": "Nip", + "name": "Nippes", "type": "Department" }, { @@ -10068,17 +10116,17 @@ }, { "code": "HT-OU", - "name": "Lwès", + "name": "Ouest", "type": "Department" }, { "code": "HT-SD", - "name": "Sid", + "name": "Sud", "type": "Department" }, { "code": "HT-SE", - "name": "Sidès", + "name": "Sud-Est", "type": "Department" }, { @@ -10113,7 +10161,7 @@ }, { "code": "HU-CS", - "name": "Csongrád", + "name": "Csongrád-Csanád", "type": "County" }, { @@ -10299,67 +10347,67 @@ { "code": "ID-AC", "name": "Aceh", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-BA", "name": "Bali", - "parent": "NU", + "parent": "ID-NU", "type": "Province" }, { "code": "ID-BB", "name": "Kepulauan Bangka Belitung", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-BE", "name": "Bengkulu", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-BT", "name": "Banten", - "parent": "JW", + "parent": "ID-JW", "type": "Province" }, { "code": "ID-GO", "name": "Gorontalo", - "parent": "SL", + "parent": "ID-SL", "type": "Province" }, { "code": "ID-JA", "name": "Jambi", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-JB", "name": "Jawa Barat", - "parent": "JW", + "parent": "ID-JW", "type": "Province" }, { "code": "ID-JI", "name": "Jawa Timur", - "parent": "JW", + "parent": "ID-JW", "type": "Province" }, { "code": "ID-JK", "name": "Jakarta Raya", - "parent": "JW", + "parent": "ID-JW", "type": "Capital district" }, { "code": "ID-JT", "name": "Jawa Tengah", - "parent": "JW", + "parent": "ID-JW", "type": "Province" }, { @@ -10375,49 +10423,49 @@ { "code": "ID-KB", "name": "Kalimantan Barat", - "parent": "KA", + "parent": "ID-KA", "type": "Province" }, { "code": "ID-KI", "name": "Kalimantan Timur", - "parent": "KA", + "parent": "ID-KA", "type": "Province" }, { "code": "ID-KR", "name": "Kepulauan Riau", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-KS", "name": "Kalimantan Selatan", - "parent": "KA", + "parent": "ID-KA", "type": "Province" }, { "code": "ID-KT", "name": "Kalimantan Tengah", - "parent": "KA", + "parent": "ID-KA", "type": "Province" }, { "code": "ID-KU", "name": "Kalimantan Utara", - "parent": "KA", + "parent": "ID-KA", "type": "Province" }, { "code": "ID-LA", "name": "Lampung", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-MA", "name": "Maluku", - "parent": "ML", + "parent": "ID-ML", "type": "Province" }, { @@ -10428,19 +10476,19 @@ { "code": "ID-MU", "name": "Maluku Utara", - "parent": "ML", + "parent": "ID-ML", "type": "Province" }, { "code": "ID-NB", "name": "Nusa Tenggara Barat", - "parent": "NU", + "parent": "ID-NU", "type": "Province" }, { "code": "ID-NT", "name": "Nusa Tenggara Timur", - "parent": "NU", + "parent": "ID-NU", "type": "Province" }, { @@ -10451,13 +10499,25 @@ { "code": "ID-PA", "name": "Papua", - "parent": "PP", + "parent": "ID-PP", "type": "Province" }, { "code": "ID-PB", "name": "Papua Barat", - "parent": "PP", + "parent": "ID-PP", + "type": "Province" + }, + { + "code": "ID-PD", + "name": "Papua Barat Daya", + "parent": "ID-PP", + "type": "Province" + }, + { + "code": "ID-PE", + "name": "Papua Pengunungan", + "parent": "ID-PP", "type": "Province" }, { @@ -10465,28 +10525,40 @@ "name": "Papua", "type": "Geographical unit" }, + { + "code": "ID-PS", + "name": "Papua Selatan", + "parent": "ID-PP", + "type": "Province" + }, + { + "code": "ID-PT", + "name": "Papua Tengah", + "parent": "ID-PP", + "type": "Province" + }, { "code": "ID-RI", "name": "Riau", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-SA", "name": "Sulawesi Utara", - "parent": "SL", + "parent": "ID-SL", "type": "Province" }, { "code": "ID-SB", "name": "Sumatera Barat", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-SG", "name": "Sulawesi Tenggara", - "parent": "SL", + "parent": "ID-SL", "type": "Province" }, { @@ -10502,37 +10574,37 @@ { "code": "ID-SN", "name": "Sulawesi Selatan", - "parent": "SL", + "parent": "ID-SL", "type": "Province" }, { "code": "ID-SR", "name": "Sulawesi Barat", - "parent": "SL", + "parent": "ID-SL", "type": "Province" }, { "code": "ID-SS", "name": "Sumatera Selatan", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-ST", "name": "Sulawesi Tengah", - "parent": "SL", + "parent": "ID-SL", "type": "Province" }, { "code": "ID-SU", "name": "Sumatera Utara", - "parent": "SM", + "parent": "ID-SM", "type": "Province" }, { "code": "ID-YO", "name": "Yogyakarta", - "parent": "JW", + "parent": "ID-JW", "type": "Special region" }, { @@ -10543,61 +10615,61 @@ { "code": "IE-CE", "name": "Clare", - "parent": "M", + "parent": "IE-M", "type": "County" }, { "code": "IE-CN", "name": "Cavan", - "parent": "U", + "parent": "IE-U", "type": "County" }, { "code": "IE-CO", "name": "Cork", - "parent": "M", + "parent": "IE-M", "type": "County" }, { "code": "IE-CW", "name": "Carlow", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-D", "name": "Dublin", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-DL", "name": "Donegal", - "parent": "U", + "parent": "IE-U", "type": "County" }, { "code": "IE-G", "name": "Galway", - "parent": "C", + "parent": "IE-C", "type": "County" }, { "code": "IE-KE", "name": "Kildare", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-KK", "name": "Kilkenny", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-KY", "name": "Kerry", - "parent": "M", + "parent": "IE-M", "type": "County" }, { @@ -10608,31 +10680,31 @@ { "code": "IE-LD", "name": "Longford", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-LH", "name": "Louth", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-LK", "name": "Limerick", - "parent": "M", + "parent": "IE-M", "type": "County" }, { "code": "IE-LM", "name": "Leitrim", - "parent": "C", + "parent": "IE-C", "type": "County" }, { "code": "IE-LS", "name": "Laois", - "parent": "L", + "parent": "IE-L", "type": "County" }, { @@ -10643,43 +10715,43 @@ { "code": "IE-MH", "name": "Meath", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-MN", "name": "Monaghan", - "parent": "U", + "parent": "IE-U", "type": "County" }, { "code": "IE-MO", "name": "Mayo", - "parent": "C", + "parent": "IE-C", "type": "County" }, { "code": "IE-OY", "name": "Offaly", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-RN", "name": "Roscommon", - "parent": "C", + "parent": "IE-C", "type": "County" }, { "code": "IE-SO", "name": "Sligo", - "parent": "C", + "parent": "IE-C", "type": "County" }, { "code": "IE-TA", "name": "Tipperary", - "parent": "M", + "parent": "IE-M", "type": "County" }, { @@ -10690,25 +10762,25 @@ { "code": "IE-WD", "name": "Waterford", - "parent": "M", + "parent": "IE-M", "type": "County" }, { "code": "IE-WH", "name": "Westmeath", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-WW", "name": "Wicklow", - "parent": "L", + "parent": "IE-L", "type": "County" }, { "code": "IE-WX", "name": "Wexford", - "parent": "L", + "parent": "IE-L", "type": "County" }, { @@ -10766,16 +10838,16 @@ "name": "Bihār", "type": "State" }, + { + "code": "IN-CG", + "name": "Chhattīsgarh", + "type": "State" + }, { "code": "IN-CH", "name": "Chandīgarh", "type": "Union territory" }, - { - "code": "IN-CT", - "name": "Chhattīsgarh", - "type": "State" - }, { "code": "IN-DH", "name": "Dādra and Nagar Haveli and Damān and Diu", @@ -10867,7 +10939,7 @@ "type": "State" }, { - "code": "IN-OR", + "code": "IN-OD", "name": "Odisha", "type": "State" }, @@ -10891,11 +10963,6 @@ "name": "Sikkim", "type": "State" }, - { - "code": "IN-TG", - "name": "Telangāna", - "type": "State" - }, { "code": "IN-TN", "name": "Tamil Nādu", @@ -10907,15 +10974,20 @@ "type": "State" }, { - "code": "IN-UP", - "name": "Uttar Pradesh", + "code": "IN-TS", + "name": "Telangāna", "type": "State" }, { - "code": "IN-UT", + "code": "IN-UK", "name": "Uttarākhand", "type": "State" }, + { + "code": "IN-UP", + "name": "Uttar Pradesh", + "type": "State" + }, { "code": "IN-WB", "name": "West Bengal", @@ -10929,6 +11001,7 @@ { "code": "IQ-AR", "name": "Arbīl", + "parent": "IQ-KR", "type": "Governorate" }, { @@ -10949,6 +11022,7 @@ { "code": "IQ-DA", "name": "Dahūk", + "parent": "IQ-KR", "type": "Governorate" }, { @@ -10971,6 +11045,11 @@ "name": "Kirkūk", "type": "Governorate" }, + { + "code": "IQ-KR", + "name": "Herêm-î Kurdistan", + "type": "Region" + }, { "code": "IQ-MA", "name": "Maysān", @@ -11004,6 +11083,7 @@ { "code": "IQ-SU", "name": "As Sulaymānīyah", + "parent": "IQ-KR", "type": "Governorate" }, { @@ -11206,436 +11286,388 @@ "name": "Suðurland", "type": "Region" }, - { - "code": "IS-AKH", - "name": "Akrahreppur", - "parent": "5", - "type": "Municipality" - }, { "code": "IS-AKN", "name": "Akraneskaupstaður", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { "code": "IS-AKU", "name": "Akureyrarbær", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-ARN", "name": "Árneshreppur", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-ASA", "name": "Ásahreppur", - "parent": "8", - "type": "Municipality" - }, - { - "code": "IS-BFJ", - "name": "Borgarfjarðarhreppur", - "parent": "7", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-BLA", "name": "Bláskógabyggð", - "parent": "8", - "type": "Municipality" - }, - { - "code": "IS-BLO", - "name": "Blönduósbær", - "parent": "5", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-BOG", "name": "Borgarbyggð", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { "code": "IS-BOL", "name": "Bolungarvíkurkaupstaður", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-DAB", "name": "Dalabyggð", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { "code": "IS-DAV", "name": "Dalvíkurbyggð", - "parent": "6", - "type": "Municipality" - }, - { - "code": "IS-DJU", - "name": "Djúpavogshreppur", - "parent": "7", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-EOM", "name": "Eyja- og Miklaholtshreppur", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { "code": "IS-EYF", "name": "Eyjafjarðarsveit", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-FJD", "name": "Fjarðabyggð", - "parent": "7", + "parent": "IS-7", "type": "Municipality" }, { "code": "IS-FJL", "name": "Fjallabyggð", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-FLA", "name": "Flóahreppur", - "parent": "8", - "type": "Municipality" - }, - { - "code": "IS-FLD", - "name": "Fljótsdalshérað", - "parent": "7", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-FLR", "name": "Fljótsdalshreppur", - "parent": "7", + "parent": "IS-7", "type": "Municipality" }, { "code": "IS-GAR", "name": "Garðabær", - "parent": "1", + "parent": "IS-1", "type": "Municipality" }, { "code": "IS-GOG", "name": "Grímsnes- og Grafningshreppur", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-GRN", "name": "Grindavíkurbær", - "parent": "2", + "parent": "IS-2", "type": "Municipality" }, { "code": "IS-GRU", "name": "Grundarfjarðarbær", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { "code": "IS-GRY", "name": "Grýtubakkahreppur", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-HAF", "name": "Hafnarfjarðarkaupstaður", - "parent": "1", - "type": "Municipality" - }, - { - "code": "IS-HEL", - "name": "Helgafellssveit", - "parent": "3", + "parent": "IS-1", "type": "Municipality" }, { "code": "IS-HRG", "name": "Hörgársveit", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-HRU", "name": "Hrunamannahreppur", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { - "code": "IS-HUT", - "name": "Húnavatnshreppur", - "parent": "5", + "code": "IS-HUG", + "name": "Húnabyggð", + "parent": "IS-5", "type": "Municipality" }, { "code": "IS-HUV", "name": "Húnaþing vestra", - "parent": "5", + "parent": "IS-5", "type": "Municipality" }, { "code": "IS-HVA", "name": "Hvalfjarðarsveit", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { "code": "IS-HVE", "name": "Hveragerðisbær", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-ISA", "name": "Ísafjarðarbær", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-KAL", "name": "Kaldrananeshreppur", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-KJO", "name": "Kjósarhreppur", - "parent": "1", + "parent": "IS-1", "type": "Municipality" }, { "code": "IS-KOP", "name": "Kópavogsbær", - "parent": "1", + "parent": "IS-1", "type": "Municipality" }, { "code": "IS-LAN", "name": "Langanesbyggð", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-MOS", "name": "Mosfellsbær", - "parent": "1", + "parent": "IS-1", + "type": "Municipality" + }, + { + "code": "IS-MUL", + "name": "Múlaþing", + "parent": "IS-7", "type": "Municipality" }, { "code": "IS-MYR", "name": "Mýrdalshreppur", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-NOR", "name": "Norðurþing", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-RGE", "name": "Rangárþing eystra", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-RGY", "name": "Rangárþing ytra", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-RHH", "name": "Reykhólahreppur", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-RKN", "name": "Reykjanesbær", - "parent": "2", + "parent": "IS-2", "type": "Municipality" }, { "code": "IS-RKV", "name": "Reykjavíkurborg", - "parent": "1", - "type": "Municipality" - }, - { - "code": "IS-SBH", - "name": "Svalbarðshreppur", - "parent": "6", + "parent": "IS-1", "type": "Municipality" }, { "code": "IS-SBT", "name": "Svalbarðsstrandarhreppur", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-SDN", "name": "Suðurnesjabær", - "parent": "2", + "parent": "IS-2", "type": "Municipality" }, { "code": "IS-SDV", "name": "Súðavíkurhreppur", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-SEL", "name": "Seltjarnarnesbær", - "parent": "1", - "type": "Municipality" - }, - { - "code": "IS-SEY", - "name": "Seyðisfjarðarkaupstaður", - "parent": "7", + "parent": "IS-1", "type": "Municipality" }, { "code": "IS-SFA", "name": "Sveitarfélagið Árborg", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-SHF", "name": "Sveitarfélagið Hornafjörður", - "parent": "7", + "parent": "IS-7", "type": "Municipality" }, { "code": "IS-SKF", "name": "Skaftárhreppur", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-SKG", "name": "Skagabyggð", - "parent": "5", + "parent": "IS-5", "type": "Municipality" }, { "code": "IS-SKO", "name": "Skorradalshreppur", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { - "code": "IS-SKU", - "name": "Skútustaðahreppur", - "parent": "6", + "code": "IS-SKR", + "name": "Skagafjörður", + "parent": "IS-5", "type": "Municipality" }, { "code": "IS-SNF", "name": "Snæfellsbær", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { "code": "IS-SOG", "name": "Skeiða- og Gnúpverjahreppur", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-SOL", "name": "Sveitarfélagið Ölfus", - "parent": "8", - "type": "Municipality" - }, - { - "code": "IS-SSF", - "name": "Sveitarfélagið Skagafjörður", - "parent": "5", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-SSS", "name": "Sveitarfélagið Skagaströnd", - "parent": "5", + "parent": "IS-5", "type": "Municipality" }, { "code": "IS-STR", "name": "Strandabyggð", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-STY", "name": "Stykkishólmsbær", - "parent": "3", + "parent": "IS-3", "type": "Municipality" }, { "code": "IS-SVG", "name": "Sveitarfélagið Vogar", - "parent": "2", + "parent": "IS-2", "type": "Municipality" }, { "code": "IS-TAL", "name": "Tálknafjarðarhreppur", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-THG", "name": "Þingeyjarsveit", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-TJO", "name": "Tjörneshreppur", - "parent": "6", + "parent": "IS-6", "type": "Municipality" }, { "code": "IS-VEM", "name": "Vestmannaeyjabær", - "parent": "8", + "parent": "IS-8", "type": "Municipality" }, { "code": "IS-VER", "name": "Vesturbyggð", - "parent": "4", + "parent": "IS-4", "type": "Municipality" }, { "code": "IS-VOP", "name": "Vopnafjarðarhreppur", - "parent": "7", + "parent": "IS-7", "type": "Municipality" }, { @@ -11741,637 +11773,637 @@ { "code": "IT-AG", "name": "Agrigento", - "parent": "82", + "parent": "IT-82", "type": "Free municipal consortium" }, { "code": "IT-AL", "name": "Alessandria", - "parent": "21", + "parent": "IT-21", "type": "Province" }, { "code": "IT-AN", "name": "Ancona", - "parent": "57", + "parent": "IT-57", "type": "Province" }, { "code": "IT-AP", "name": "Ascoli Piceno", - "parent": "57", + "parent": "IT-57", "type": "Province" }, { "code": "IT-AQ", "name": "L'Aquila", - "parent": "65", + "parent": "IT-65", "type": "Province" }, { "code": "IT-AR", "name": "Arezzo", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-AT", "name": "Asti", - "parent": "21", + "parent": "IT-21", "type": "Province" }, { "code": "IT-AV", "name": "Avellino", - "parent": "72", + "parent": "IT-72", "type": "Province" }, { "code": "IT-BA", "name": "Bari", - "parent": "75", + "parent": "IT-75", "type": "Metropolitan city" }, { "code": "IT-BG", "name": "Bergamo", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-BI", "name": "Biella", - "parent": "21", + "parent": "IT-21", "type": "Province" }, { "code": "IT-BL", "name": "Belluno", - "parent": "34", + "parent": "IT-34", "type": "Province" }, { "code": "IT-BN", "name": "Benevento", - "parent": "72", + "parent": "IT-72", "type": "Province" }, { "code": "IT-BO", "name": "Bologna", - "parent": "45", + "parent": "IT-45", "type": "Metropolitan city" }, { "code": "IT-BR", "name": "Brindisi", - "parent": "75", + "parent": "IT-75", "type": "Province" }, { "code": "IT-BS", "name": "Brescia", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-BT", "name": "Barletta-Andria-Trani", - "parent": "75", + "parent": "IT-75", "type": "Province" }, { "code": "IT-BZ", "name": "Bolzano", - "parent": "32", + "parent": "IT-32", "type": "Autonomous province" }, { "code": "IT-CA", "name": "Cagliari", - "parent": "88", + "parent": "IT-88", "type": "Metropolitan city" }, { "code": "IT-CB", "name": "Campobasso", - "parent": "67", + "parent": "IT-67", "type": "Province" }, { "code": "IT-CE", "name": "Caserta", - "parent": "72", + "parent": "IT-72", "type": "Province" }, { "code": "IT-CH", "name": "Chieti", - "parent": "65", + "parent": "IT-65", "type": "Province" }, { "code": "IT-CL", "name": "Caltanissetta", - "parent": "82", + "parent": "IT-82", "type": "Free municipal consortium" }, { "code": "IT-CN", "name": "Cuneo", - "parent": "21", + "parent": "IT-21", "type": "Province" }, { "code": "IT-CO", "name": "Como", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-CR", "name": "Cremona", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-CS", "name": "Cosenza", - "parent": "78", + "parent": "IT-78", "type": "Province" }, { "code": "IT-CT", "name": "Catania", - "parent": "82", + "parent": "IT-82", "type": "Metropolitan city" }, { "code": "IT-CZ", "name": "Catanzaro", - "parent": "78", + "parent": "IT-78", "type": "Province" }, { "code": "IT-EN", "name": "Enna", - "parent": "82", + "parent": "IT-82", "type": "Free municipal consortium" }, { "code": "IT-FC", "name": "Forlì-Cesena", - "parent": "45", + "parent": "IT-45", "type": "Province" }, { "code": "IT-FE", "name": "Ferrara", - "parent": "45", + "parent": "IT-45", "type": "Province" }, { "code": "IT-FG", "name": "Foggia", - "parent": "75", + "parent": "IT-75", "type": "Province" }, { "code": "IT-FI", "name": "Firenze", - "parent": "52", + "parent": "IT-52", "type": "Metropolitan city" }, { "code": "IT-FM", "name": "Fermo", - "parent": "57", + "parent": "IT-57", "type": "Province" }, { "code": "IT-FR", "name": "Frosinone", - "parent": "62", + "parent": "IT-62", "type": "Province" }, { "code": "IT-GE", "name": "Genova", - "parent": "42", + "parent": "IT-42", "type": "Metropolitan city" }, { "code": "IT-GO", "name": "Gorizia", - "parent": "36", + "parent": "IT-36", "type": "Decentralized regional entity" }, { "code": "IT-GR", "name": "Grosseto", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-IM", "name": "Imperia", - "parent": "42", + "parent": "IT-42", "type": "Province" }, { "code": "IT-IS", "name": "Isernia", - "parent": "67", + "parent": "IT-67", "type": "Province" }, { "code": "IT-KR", "name": "Crotone", - "parent": "78", + "parent": "IT-78", "type": "Province" }, { "code": "IT-LC", "name": "Lecco", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-LE", "name": "Lecce", - "parent": "75", + "parent": "IT-75", "type": "Province" }, { "code": "IT-LI", "name": "Livorno", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-LO", "name": "Lodi", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-LT", "name": "Latina", - "parent": "62", + "parent": "IT-62", "type": "Province" }, { "code": "IT-LU", "name": "Lucca", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-MB", "name": "Monza e Brianza", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-MC", "name": "Macerata", - "parent": "57", + "parent": "IT-57", "type": "Province" }, { "code": "IT-ME", "name": "Messina", - "parent": "82", + "parent": "IT-82", "type": "Metropolitan city" }, { "code": "IT-MI", "name": "Milano", - "parent": "25", + "parent": "IT-25", "type": "Metropolitan city" }, { "code": "IT-MN", "name": "Mantova", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-MO", "name": "Modena", - "parent": "45", + "parent": "IT-45", "type": "Province" }, { "code": "IT-MS", "name": "Massa-Carrara", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-MT", "name": "Matera", - "parent": "77", + "parent": "IT-77", "type": "Province" }, { "code": "IT-NA", "name": "Napoli", - "parent": "72", + "parent": "IT-72", "type": "Metropolitan city" }, { "code": "IT-NO", "name": "Novara", - "parent": "21", + "parent": "IT-21", "type": "Province" }, { "code": "IT-NU", "name": "Nuoro", - "parent": "88", + "parent": "IT-88", "type": "Province" }, { "code": "IT-OR", "name": "Oristano", - "parent": "88", + "parent": "IT-88", "type": "Province" }, { "code": "IT-PA", "name": "Palermo", - "parent": "82", + "parent": "IT-82", "type": "Metropolitan city" }, { "code": "IT-PC", "name": "Piacenza", - "parent": "45", + "parent": "IT-45", "type": "Province" }, { "code": "IT-PD", "name": "Padova", - "parent": "34", + "parent": "IT-34", "type": "Province" }, { "code": "IT-PE", "name": "Pescara", - "parent": "65", + "parent": "IT-65", "type": "Province" }, { "code": "IT-PG", "name": "Perugia", - "parent": "55", + "parent": "IT-55", "type": "Province" }, { "code": "IT-PI", "name": "Pisa", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-PN", "name": "Pordenone", - "parent": "36", + "parent": "IT-36", "type": "Decentralized regional entity" }, { "code": "IT-PO", "name": "Prato", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-PR", "name": "Parma", - "parent": "45", + "parent": "IT-45", "type": "Province" }, { "code": "IT-PT", "name": "Pistoia", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-PU", "name": "Pesaro e Urbino", - "parent": "57", + "parent": "IT-57", "type": "Province" }, { "code": "IT-PV", "name": "Pavia", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-PZ", "name": "Potenza", - "parent": "77", + "parent": "IT-77", "type": "Province" }, { "code": "IT-RA", "name": "Ravenna", - "parent": "45", + "parent": "IT-45", "type": "Province" }, { "code": "IT-RC", "name": "Reggio Calabria", - "parent": "78", + "parent": "IT-78", "type": "Metropolitan city" }, { "code": "IT-RE", "name": "Reggio Emilia", - "parent": "45", + "parent": "IT-45", "type": "Province" }, { "code": "IT-RG", "name": "Ragusa", - "parent": "82", + "parent": "IT-82", "type": "Free municipal consortium" }, { "code": "IT-RI", "name": "Rieti", - "parent": "62", + "parent": "IT-62", "type": "Province" }, { "code": "IT-RM", "name": "Roma", - "parent": "62", + "parent": "IT-62", "type": "Metropolitan city" }, { "code": "IT-RN", "name": "Rimini", - "parent": "45", + "parent": "IT-45", "type": "Province" }, { "code": "IT-RO", "name": "Rovigo", - "parent": "34", + "parent": "IT-34", "type": "Province" }, { "code": "IT-SA", "name": "Salerno", - "parent": "72", + "parent": "IT-72", "type": "Province" }, { "code": "IT-SI", "name": "Siena", - "parent": "52", + "parent": "IT-52", "type": "Province" }, { "code": "IT-SO", "name": "Sondrio", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-SP", "name": "La Spezia", - "parent": "42", + "parent": "IT-42", "type": "Province" }, { "code": "IT-SR", "name": "Siracusa", - "parent": "82", + "parent": "IT-82", "type": "Free municipal consortium" }, { "code": "IT-SS", "name": "Sassari", - "parent": "88", + "parent": "IT-88", "type": "Province" }, { "code": "IT-SU", "name": "Sud Sardegna", - "parent": "88", + "parent": "IT-88", "type": "Province" }, { "code": "IT-SV", "name": "Savona", - "parent": "42", + "parent": "IT-42", "type": "Province" }, { "code": "IT-TA", "name": "Taranto", - "parent": "75", + "parent": "IT-75", "type": "Province" }, { "code": "IT-TE", "name": "Teramo", - "parent": "65", + "parent": "IT-65", "type": "Province" }, { "code": "IT-TN", "name": "Trento", - "parent": "32", + "parent": "IT-32", "type": "Autonomous province" }, { "code": "IT-TO", "name": "Torino", - "parent": "21", + "parent": "IT-21", "type": "Metropolitan city" }, { "code": "IT-TP", "name": "Trapani", - "parent": "82", + "parent": "IT-82", "type": "Free municipal consortium" }, { "code": "IT-TR", "name": "Terni", - "parent": "55", + "parent": "IT-55", "type": "Province" }, { "code": "IT-TS", "name": "Trieste", - "parent": "36", + "parent": "IT-36", "type": "Decentralized regional entity" }, { "code": "IT-TV", "name": "Treviso", - "parent": "34", + "parent": "IT-34", "type": "Province" }, { "code": "IT-UD", "name": "Udine", - "parent": "36", + "parent": "IT-36", "type": "Decentralized regional entity" }, { "code": "IT-VA", "name": "Varese", - "parent": "25", + "parent": "IT-25", "type": "Province" }, { "code": "IT-VB", "name": "Verbano-Cusio-Ossola", - "parent": "21", + "parent": "IT-21", "type": "Province" }, { "code": "IT-VC", "name": "Vercelli", - "parent": "21", + "parent": "IT-21", "type": "Province" }, { "code": "IT-VE", "name": "Venezia", - "parent": "34", + "parent": "IT-34", "type": "Metropolitan city" }, { "code": "IT-VI", "name": "Vicenza", - "parent": "34", + "parent": "IT-34", "type": "Province" }, { "code": "IT-VR", "name": "Verona", - "parent": "34", + "parent": "IT-34", "type": "Province" }, { "code": "IT-VT", "name": "Viterbo", - "parent": "62", + "parent": "IT-62", "type": "Province" }, { "code": "IT-VV", "name": "Vibo Valentia", - "parent": "78", + "parent": "IT-78", "type": "Province" }, { @@ -13161,12 +13193,12 @@ }, { "code": "KM-A", - "name": "Andjouân", + "name": "Anjouan", "type": "Island" }, { "code": "KM-G", - "name": "Andjazîdja", + "name": "Grande Comore", "type": "Island" }, { @@ -13177,85 +13209,85 @@ { "code": "KN-01", "name": "Christ Church Nichola Town", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { "code": "KN-02", "name": "Saint Anne Sandy Point", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { "code": "KN-03", "name": "Saint George Basseterre", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { "code": "KN-04", "name": "Saint George Gingerland", - "parent": "N", + "parent": "KN-N", "type": "Parish" }, { "code": "KN-05", "name": "Saint James Windward", - "parent": "N", + "parent": "KN-N", "type": "Parish" }, { "code": "KN-06", "name": "Saint John Capisterre", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { "code": "KN-07", "name": "Saint John Figtree", - "parent": "N", + "parent": "KN-N", "type": "Parish" }, { "code": "KN-08", "name": "Saint Mary Cayon", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { "code": "KN-09", "name": "Saint Paul Capisterre", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { "code": "KN-10", "name": "Saint Paul Charlestown", - "parent": "N", + "parent": "KN-N", "type": "Parish" }, { "code": "KN-11", "name": "Saint Peter Basseterre", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { "code": "KN-12", "name": "Saint Thomas Lowland", - "parent": "N", + "parent": "KN-N", "type": "Parish" }, { "code": "KN-13", "name": "Saint Thomas Middle Island", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { "code": "KN-15", "name": "Trinity Palmetto Point", - "parent": "K", + "parent": "KN-K", "type": "Parish" }, { @@ -13328,6 +13360,11 @@ "name": "Nampho", "type": "Metropolitan city" }, + { + "code": "KP-15", + "name": "Kaeseong", + "type": "Metropolitan city" + }, { "code": "KR-11", "name": "Seoul-teukbyeolsi", @@ -13370,8 +13407,8 @@ }, { "code": "KR-42", - "name": "Gangwon-do", - "type": "Province" + "name": "Gangwon-teukbyeoljachido", + "type": "Special self-governing province" }, { "code": "KR-43", @@ -13444,89 +13481,104 @@ "type": "Governorate" }, { - "code": "KZ-AKM", + "code": "KZ-10", + "name": "Abajskaja oblast’", + "type": "Region" + }, + { + "code": "KZ-11", "name": "Akmolinskaja oblast'", "type": "Region" }, { - "code": "KZ-AKT", + "code": "KZ-15", "name": "Aktjubinskaja oblast'", "type": "Region" }, { - "code": "KZ-ALA", - "name": "Almaty", - "type": "City" + "code": "KZ-19", + "name": "Almatinskaja oblast'", + "type": "Region" }, { - "code": "KZ-ALM", - "name": "Almatinskaja oblast'", + "code": "KZ-23", + "name": "Atyrauskaja oblast'", "type": "Region" }, { - "code": "KZ-AST", - "name": "Nur-Sultan", - "type": "City" + "code": "KZ-27", + "name": "Batys Qazaqstan oblysy", + "type": "Region" }, { - "code": "KZ-ATY", - "name": "Atyrauskaja oblast'", + "code": "KZ-31", + "name": "Zhambyl oblysy", + "type": "Region" + }, + { + "code": "KZ-33", + "name": "Zhetisū oblysy", "type": "Region" }, { - "code": "KZ-KAR", + "code": "KZ-35", "name": "Karagandinskaja oblast'", "type": "Region" }, { - "code": "KZ-KUS", + "code": "KZ-39", "name": "Kostanajskaja oblast'", "type": "Region" }, { - "code": "KZ-KZY", + "code": "KZ-43", "name": "Kyzylordinskaja oblast'", "type": "Region" }, { - "code": "KZ-MAN", + "code": "KZ-47", "name": "Mangghystaū oblysy", "type": "Region" }, { - "code": "KZ-PAV", + "code": "KZ-55", "name": "Pavlodar oblysy", "type": "Region" }, { - "code": "KZ-SEV", + "code": "KZ-59", "name": "Severo-Kazahstanskaja oblast'", "type": "Region" }, { - "code": "KZ-SHY", - "name": "Shymkent", - "type": "City" + "code": "KZ-61", + "name": "Turkestankaya oblast'", + "type": "Region" }, { - "code": "KZ-VOS", - "name": "Shyghys Qazaqstan oblysy", + "code": "KZ-62", + "name": "Ulytauskaja oblast’", "type": "Region" }, { - "code": "KZ-YUZ", - "name": "Turkestankaya oblast'", + "code": "KZ-63", + "name": "Shyghys Qazaqstan oblysy", "type": "Region" }, { - "code": "KZ-ZAP", - "name": "Batys Qazaqstan oblysy", - "type": "Region" + "code": "KZ-71", + "name": "Astana", + "type": "City" }, { - "code": "KZ-ZHA", - "name": "Zhambyl oblysy", - "type": "Region" + "code": "KZ-75", + "name": "Almaty", + "type": "City" + }, + { + "code": "KZ-79", + "name": "Shymkent", + "type": "City" }, { "code": "LA-AT", @@ -13771,19 +13823,19 @@ { "code": "LK-11", "name": "Colombo", - "parent": "1", + "parent": "LK-1", "type": "District" }, { "code": "LK-12", "name": "Gampaha", - "parent": "1", + "parent": "LK-1", "type": "District" }, { "code": "LK-13", "name": "Kalutara", - "parent": "1", + "parent": "LK-1", "type": "District" }, { @@ -13794,19 +13846,19 @@ { "code": "LK-21", "name": "Kandy", - "parent": "2", + "parent": "LK-2", "type": "District" }, { "code": "LK-22", "name": "Matale", - "parent": "2", + "parent": "LK-2", "type": "District" }, { "code": "LK-23", "name": "Nuwara Eliya", - "parent": "2", + "parent": "LK-2", "type": "District" }, { @@ -13817,19 +13869,19 @@ { "code": "LK-31", "name": "Galle", - "parent": "3", + "parent": "LK-3", "type": "District" }, { "code": "LK-32", "name": "Matara", - "parent": "3", + "parent": "LK-3", "type": "District" }, { "code": "LK-33", "name": "Hambantota", - "parent": "3", + "parent": "LK-3", "type": "District" }, { @@ -13840,31 +13892,31 @@ { "code": "LK-41", "name": "Jaffna", - "parent": "4", + "parent": "LK-4", "type": "District" }, { "code": "LK-42", "name": "Kilinochchi", - "parent": "4", + "parent": "LK-4", "type": "District" }, { "code": "LK-43", "name": "Mannar", - "parent": "4", + "parent": "LK-4", "type": "District" }, { "code": "LK-44", "name": "Vavuniya", - "parent": "4", + "parent": "LK-4", "type": "District" }, { "code": "LK-45", "name": "Mullaittivu", - "parent": "4", + "parent": "LK-4", "type": "District" }, { @@ -13875,19 +13927,19 @@ { "code": "LK-51", "name": "Batticaloa", - "parent": "5", + "parent": "LK-5", "type": "District" }, { "code": "LK-52", "name": "Ampara", - "parent": "5", + "parent": "LK-5", "type": "District" }, { "code": "LK-53", "name": "Trincomalee", - "parent": "5", + "parent": "LK-5", "type": "District" }, { @@ -13898,13 +13950,13 @@ { "code": "LK-61", "name": "Kurunegala", - "parent": "6", + "parent": "LK-6", "type": "District" }, { "code": "LK-62", "name": "Puttalam", - "parent": "6", + "parent": "LK-6", "type": "District" }, { @@ -13915,13 +13967,13 @@ { "code": "LK-71", "name": "Anuradhapura", - "parent": "7", + "parent": "LK-7", "type": "District" }, { "code": "LK-72", "name": "Polonnaruwa", - "parent": "7", + "parent": "LK-7", "type": "District" }, { @@ -13932,13 +13984,13 @@ { "code": "LK-81", "name": "Badulla", - "parent": "8", + "parent": "LK-8", "type": "District" }, { "code": "LK-82", "name": "Monaragala", - "parent": "8", + "parent": "LK-8", "type": "District" }, { @@ -13949,13 +14001,13 @@ { "code": "LK-91", "name": "Ratnapura", - "parent": "9", + "parent": "LK-9", "type": "District" }, { "code": "LK-92", "name": "Kegalla", - "parent": "9", + "parent": "LK-9", "type": "District" }, { @@ -14086,301 +14138,361 @@ { "code": "LT-01", "name": "Akmenė", + "parent": "LT-SA", "type": "District municipality" }, { "code": "LT-02", "name": "Alytaus miestas", + "parent": "LT-AL", "type": "City municipality" }, { "code": "LT-03", "name": "Alytus", + "parent": "LT-AL", "type": "District municipality" }, { "code": "LT-04", "name": "Anykščiai", + "parent": "LT-UT", "type": "District municipality" }, { "code": "LT-05", - "name": "Birštono", + "name": "Birštonas", + "parent": "LT-KU", "type": "Municipality" }, { "code": "LT-06", "name": "Biržai", + "parent": "LT-PN", "type": "District municipality" }, { "code": "LT-07", "name": "Druskininkai", + "parent": "LT-AL", "type": "Municipality" }, { "code": "LT-08", "name": "Elektrėnai", + "parent": "LT-VL", "type": "Municipality" }, { "code": "LT-09", "name": "Ignalina", + "parent": "LT-UT", "type": "District municipality" }, { "code": "LT-10", "name": "Jonava", + "parent": "LT-KU", "type": "District municipality" }, { "code": "LT-11", "name": "Joniškis", + "parent": "LT-SA", "type": "District municipality" }, { "code": "LT-12", "name": "Jurbarkas", + "parent": "LT-TA", "type": "District municipality" }, { "code": "LT-13", "name": "Kaišiadorys", + "parent": "LT-KU", "type": "District municipality" }, { "code": "LT-14", - "name": "Kalvarijos", + "name": "Kalvarija", + "parent": "LT-MR", "type": "Municipality" }, { "code": "LT-15", "name": "Kauno miestas", + "parent": "LT-KU", "type": "City municipality" }, { "code": "LT-16", "name": "Kaunas", + "parent": "LT-KU", "type": "District municipality" }, { "code": "LT-17", "name": "Kazlų Rūdos", + "parent": "LT-MR", "type": "Municipality" }, { "code": "LT-18", "name": "Kėdainiai", + "parent": "LT-KU", "type": "District municipality" }, { "code": "LT-19", "name": "Kelmė", + "parent": "LT-SA", "type": "District municipality" }, { "code": "LT-20", "name": "Klaipėdos miestas", + "parent": "LT-KL", "type": "City municipality" }, { "code": "LT-21", "name": "Klaipėda", + "parent": "LT-KL", "type": "District municipality" }, { "code": "LT-22", "name": "Kretinga", + "parent": "LT-KL", "type": "District municipality" }, { "code": "LT-23", "name": "Kupiškis", + "parent": "LT-PN", "type": "District municipality" }, { "code": "LT-24", "name": "Lazdijai", + "parent": "LT-AL", "type": "District municipality" }, { "code": "LT-25", "name": "Marijampolė", + "parent": "LT-MR", "type": "District municipality" }, { "code": "LT-26", "name": "Mažeikiai", + "parent": "LT-TE", "type": "District municipality" }, { "code": "LT-27", "name": "Molėtai", + "parent": "LT-UT", "type": "District municipality" }, { "code": "LT-28", "name": "Neringa", + "parent": "LT-KL", "type": "Municipality" }, { "code": "LT-29", "name": "Pagėgiai", + "parent": "LT-TA", "type": "Municipality" }, { "code": "LT-30", "name": "Pakruojis", + "parent": "LT-SA", "type": "District municipality" }, { "code": "LT-31", "name": "Palangos miestas", + "parent": "LT-KL", "type": "City municipality" }, { "code": "LT-32", "name": "Panevėžio miestas", + "parent": "LT-PN", "type": "City municipality" }, { "code": "LT-33", "name": "Panevėžys", + "parent": "LT-PN", "type": "District municipality" }, { "code": "LT-34", "name": "Pasvalys", + "parent": "LT-PN", "type": "District municipality" }, { "code": "LT-35", "name": "Plungė", + "parent": "LT-TE", "type": "District municipality" }, { "code": "LT-36", "name": "Prienai", + "parent": "LT-KU", "type": "District municipality" }, { "code": "LT-37", "name": "Radviliškis", + "parent": "LT-SA", "type": "District municipality" }, { "code": "LT-38", "name": "Raseiniai", + "parent": "LT-KU", "type": "District municipality" }, { "code": "LT-39", - "name": "Rietavo", + "name": "Rietavas", + "parent": "LT-TE", "type": "Municipality" }, { "code": "LT-40", "name": "Rokiškis", + "parent": "LT-PN", "type": "District municipality" }, { "code": "LT-41", "name": "Šakiai", + "parent": "LT-MR", "type": "District municipality" }, { "code": "LT-42", "name": "Šalčininkai", + "parent": "LT-VL", "type": "District municipality" }, { "code": "LT-43", "name": "Šiaulių miestas", + "parent": "LT-SA", "type": "City municipality" }, { "code": "LT-44", "name": "Šiauliai", + "parent": "LT-SA", "type": "District municipality" }, { "code": "LT-45", "name": "Šilalė", + "parent": "LT-TA", "type": "District municipality" }, { "code": "LT-46", "name": "Šilutė", + "parent": "LT-KL", "type": "District municipality" }, { "code": "LT-47", "name": "Širvintos", + "parent": "LT-VL", "type": "District municipality" }, { "code": "LT-48", "name": "Skuodas", + "parent": "LT-KL", "type": "District municipality" }, { "code": "LT-49", "name": "Švenčionys", + "parent": "LT-VL", "type": "District municipality" }, { "code": "LT-50", "name": "Tauragė", + "parent": "LT-TA", "type": "District municipality" }, { "code": "LT-51", "name": "Telšiai", + "parent": "LT-TE", "type": "District municipality" }, { "code": "LT-52", "name": "Trakai", + "parent": "LT-VL", "type": "District municipality" }, { "code": "LT-53", "name": "Ukmergė", + "parent": "LT-VL", "type": "District municipality" }, { "code": "LT-54", "name": "Utena", + "parent": "LT-UT", "type": "District municipality" }, { "code": "LT-55", "name": "Varėna", + "parent": "LT-AL", "type": "District municipality" }, { "code": "LT-56", "name": "Vilkaviškis", + "parent": "LT-MR", "type": "District municipality" }, { "code": "LT-57", "name": "Vilniaus miestas", + "parent": "LT-VL", "type": "City municipality" }, { "code": "LT-58", "name": "Vilnius", + "parent": "LT-VL", "type": "District municipality" }, { "code": "LT-59", "name": "Visaginas", + "parent": "LT-UT", "type": "Municipality" }, { "code": "LT-60", "name": "Zarasai", + "parent": "LT-UT", "type": "District municipality" }, { @@ -14440,7 +14552,7 @@ }, { "code": "LU-CL", - "name": "Clerf", + "name": "Clervaux", "type": "Canton" }, { @@ -14455,7 +14567,7 @@ }, { "code": "LU-ES", - "name": "Esch an der Alzette", + "name": "Esch-sur-Alzette", "type": "Canton" }, { @@ -14485,7 +14597,7 @@ }, { "code": "LU-VD", - "name": "Veianen", + "name": "Vianden", "type": "Canton" }, { @@ -14494,288 +14606,78 @@ "type": "Canton" }, { - "code": "LV-001", - "name": "Aglonas novads", + "code": "LV-002", + "name": "Aizkraukles novads", "type": "Municipality" }, { - "code": "LV-002", - "name": "Aizkraukles novads", + "code": "LV-007", + "name": "Alūksnes novads", "type": "Municipality" }, { - "code": "LV-003", - "name": "Aizputes novads", + "code": "LV-011", + "name": "Ādažu novads", "type": "Municipality" }, { - "code": "LV-004", - "name": "Aknīstes novads", + "code": "LV-015", + "name": "Balvu novads", "type": "Municipality" }, { - "code": "LV-005", - "name": "Alojas novads", + "code": "LV-016", + "name": "Bauskas novads", "type": "Municipality" }, { - "code": "LV-006", - "name": "Alsungas novads", + "code": "LV-022", + "name": "Cēsu novads", "type": "Municipality" }, { - "code": "LV-007", - "name": "Alūksnes novads", + "code": "LV-026", + "name": "Dobeles novads", "type": "Municipality" }, { - "code": "LV-008", - "name": "Amatas novads", + "code": "LV-033", + "name": "Gulbenes novads", "type": "Municipality" }, { - "code": "LV-009", - "name": "Apes novads", + "code": "LV-041", + "name": "Jelgavas novads", "type": "Municipality" }, { - "code": "LV-010", - "name": "Auces novads", + "code": "LV-042", + "name": "Jēkabpils novads", "type": "Municipality" }, { - "code": "LV-011", - "name": "Ādažu novads", + "code": "LV-047", + "name": "Krāslavas novads", "type": "Municipality" }, { - "code": "LV-012", - "name": "Babītes novads", + "code": "LV-050", + "name": "Kuldīgas novads", "type": "Municipality" }, { - "code": "LV-013", - "name": "Baldones novads", + "code": "LV-052", + "name": "Ķekavas novads", "type": "Municipality" }, { - "code": "LV-014", - "name": "Baltinavas novads", + "code": "LV-054", + "name": "Limbažu novads", "type": "Municipality" }, { - "code": "LV-015", - "name": "Balvu novads", - "type": "Municipality" - }, - { - "code": "LV-016", - "name": "Bauskas novads", - "type": "Municipality" - }, - { - "code": "LV-017", - "name": "Beverīnas novads", - "type": "Municipality" - }, - { - "code": "LV-018", - "name": "Brocēnu novads", - "type": "Municipality" - }, - { - "code": "LV-019", - "name": "Burtnieku novads", - "type": "Municipality" - }, - { - "code": "LV-020", - "name": "Carnikavas novads", - "type": "Municipality" - }, - { - "code": "LV-021", - "name": "Cesvaines novads", - "type": "Municipality" - }, - { - "code": "LV-022", - "name": "Cēsu novads", - "type": "Municipality" - }, - { - "code": "LV-023", - "name": "Ciblas novads", - "type": "Municipality" - }, - { - "code": "LV-024", - "name": "Dagdas novads", - "type": "Municipality" - }, - { - "code": "LV-025", - "name": "Daugavpils novads", - "type": "Municipality" - }, - { - "code": "LV-026", - "name": "Dobeles novads", - "type": "Municipality" - }, - { - "code": "LV-027", - "name": "Dundagas novads", - "type": "Municipality" - }, - { - "code": "LV-028", - "name": "Durbes novads", - "type": "Municipality" - }, - { - "code": "LV-029", - "name": "Engures novads", - "type": "Municipality" - }, - { - "code": "LV-030", - "name": "Ērgļu novads", - "type": "Municipality" - }, - { - "code": "LV-031", - "name": "Garkalnes novads", - "type": "Municipality" - }, - { - "code": "LV-032", - "name": "Grobiņas novads", - "type": "Municipality" - }, - { - "code": "LV-033", - "name": "Gulbenes novads", - "type": "Municipality" - }, - { - "code": "LV-034", - "name": "Iecavas novads", - "type": "Municipality" - }, - { - "code": "LV-035", - "name": "Ikšķiles novads", - "type": "Municipality" - }, - { - "code": "LV-036", - "name": "Ilūkstes novads", - "type": "Municipality" - }, - { - "code": "LV-037", - "name": "Inčukalna novads", - "type": "Municipality" - }, - { - "code": "LV-038", - "name": "Jaunjelgavas novads", - "type": "Municipality" - }, - { - "code": "LV-039", - "name": "Jaunpiebalgas novads", - "type": "Municipality" - }, - { - "code": "LV-040", - "name": "Jaunpils novads", - "type": "Municipality" - }, - { - "code": "LV-041", - "name": "Jelgavas novads", - "type": "Municipality" - }, - { - "code": "LV-042", - "name": "Jēkabpils novads", - "type": "Municipality" - }, - { - "code": "LV-043", - "name": "Kandavas novads", - "type": "Municipality" - }, - { - "code": "LV-044", - "name": "Kārsavas novads", - "type": "Municipality" - }, - { - "code": "LV-045", - "name": "Kocēnu novads", - "type": "Municipality" - }, - { - "code": "LV-046", - "name": "Kokneses novads", - "type": "Municipality" - }, - { - "code": "LV-047", - "name": "Krāslavas novads", - "type": "Municipality" - }, - { - "code": "LV-048", - "name": "Krimuldas novads", - "type": "Municipality" - }, - { - "code": "LV-049", - "name": "Krustpils novads", - "type": "Municipality" - }, - { - "code": "LV-050", - "name": "Kuldīgas novads", - "type": "Municipality" - }, - { - "code": "LV-051", - "name": "Ķeguma novads", - "type": "Municipality" - }, - { - "code": "LV-052", - "name": "Ķekavas novads", - "type": "Municipality" - }, - { - "code": "LV-053", - "name": "Lielvārdes novads", - "type": "Municipality" - }, - { - "code": "LV-054", - "name": "Limbažu novads", - "type": "Municipality" - }, - { - "code": "LV-055", - "name": "Līgatnes novads", - "type": "Municipality" - }, - { - "code": "LV-056", - "name": "Līvānu novads", - "type": "Municipality" - }, - { - "code": "LV-057", - "name": "Lubānas novads", + "code": "LV-056", + "name": "Līvānu novads", "type": "Municipality" }, { @@ -14788,41 +14690,11 @@ "name": "Madonas novads", "type": "Municipality" }, - { - "code": "LV-060", - "name": "Mazsalacas novads", - "type": "Municipality" - }, - { - "code": "LV-061", - "name": "Mālpils novads", - "type": "Municipality" - }, { "code": "LV-062", "name": "Mārupes novads", "type": "Municipality" }, - { - "code": "LV-063", - "name": "Mērsraga novads", - "type": "Municipality" - }, - { - "code": "LV-064", - "name": "Naukšēnu novads", - "type": "Municipality" - }, - { - "code": "LV-065", - "name": "Neretas novads", - "type": "Municipality" - }, - { - "code": "LV-066", - "name": "Nīcas novads", - "type": "Municipality" - }, { "code": "LV-067", "name": "Ogres novads", @@ -14833,96 +14705,21 @@ "name": "Olaines novads", "type": "Municipality" }, - { - "code": "LV-069", - "name": "Ozolnieku novads", - "type": "Municipality" - }, - { - "code": "LV-070", - "name": "Pārgaujas novads", - "type": "Municipality" - }, - { - "code": "LV-071", - "name": "Pāvilostas novads", - "type": "Municipality" - }, - { - "code": "LV-072", - "name": "Pļaviņu novads", - "type": "Municipality" - }, { "code": "LV-073", "name": "Preiļu novads", "type": "Municipality" }, - { - "code": "LV-074", - "name": "Priekules novads", - "type": "Municipality" - }, - { - "code": "LV-075", - "name": "Priekuļu novads", - "type": "Municipality" - }, - { - "code": "LV-076", - "name": "Raunas novads", - "type": "Municipality" - }, { "code": "LV-077", "name": "Rēzeknes novads", "type": "Municipality" }, - { - "code": "LV-078", - "name": "Riebiņu novads", - "type": "Municipality" - }, - { - "code": "LV-079", - "name": "Rojas novads", - "type": "Municipality" - }, { "code": "LV-080", "name": "Ropažu novads", "type": "Municipality" }, - { - "code": "LV-081", - "name": "Rucavas novads", - "type": "Municipality" - }, - { - "code": "LV-082", - "name": "Rugāju novads", - "type": "Municipality" - }, - { - "code": "LV-083", - "name": "Rundāles novads", - "type": "Municipality" - }, - { - "code": "LV-084", - "name": "Rūjienas novads", - "type": "Municipality" - }, - { - "code": "LV-085", - "name": "Salas novads", - "type": "Municipality" - }, - { - "code": "LV-086", - "name": "Salacgrīvas novads", - "type": "Municipality" - }, { "code": "LV-087", "name": "Salaspils novads", @@ -14938,61 +14735,26 @@ "name": "Saulkrastu novads", "type": "Municipality" }, - { - "code": "LV-090", - "name": "Sējas novads", - "type": "Municipality" - }, { "code": "LV-091", "name": "Siguldas novads", "type": "Municipality" }, - { - "code": "LV-092", - "name": "Skrīveru novads", - "type": "Municipality" - }, - { - "code": "LV-093", - "name": "Skrundas novads", - "type": "Municipality" - }, { "code": "LV-094", "name": "Smiltenes novads", "type": "Municipality" }, - { - "code": "LV-095", - "name": "Stopiņu novads", - "type": "Municipality" - }, - { - "code": "LV-096", - "name": "Strenču novads", - "type": "Municipality" - }, { "code": "LV-097", "name": "Talsu novads", "type": "Municipality" }, - { - "code": "LV-098", - "name": "Tērvetes novads", - "type": "Municipality" - }, { "code": "LV-099", "name": "Tukuma novads", "type": "Municipality" }, - { - "code": "LV-100", - "name": "Vaiņodes novads", - "type": "Municipality" - }, { "code": "LV-101", "name": "Valkas novads", @@ -15003,90 +14765,60 @@ "name": "Varakļānu novads", "type": "Municipality" }, - { - "code": "LV-103", - "name": "Vārkavas novads", - "type": "Municipality" - }, - { - "code": "LV-104", - "name": "Vecpiebalgas novads", - "type": "Municipality" - }, - { - "code": "LV-105", - "name": "Vecumnieku novads", - "type": "Municipality" - }, { "code": "LV-106", "name": "Ventspils novads", "type": "Municipality" }, { - "code": "LV-107", - "name": "Viesītes novads", + "code": "LV-111", + "name": "Augšdaugavas novads", "type": "Municipality" }, { - "code": "LV-108", - "name": "Viļakas novads", + "code": "LV-112", + "name": "Dienvidkurzemes Novads", "type": "Municipality" }, { - "code": "LV-109", - "name": "Viļānu novads", - "type": "Municipality" - }, - { - "code": "LV-110", - "name": "Zilupes novads", + "code": "LV-113", + "name": "Valmieras Novads", "type": "Municipality" }, { "code": "LV-DGV", "name": "Daugavpils", - "type": "Republican city" + "type": "State city" }, { "code": "LV-JEL", "name": "Jelgava", - "type": "Republican city" - }, - { - "code": "LV-JKB", - "name": "Jēkabpils", - "type": "Republican city" + "type": "State city" }, { "code": "LV-JUR", "name": "Jūrmala", - "type": "Republican city" + "type": "State city" }, { "code": "LV-LPX", "name": "Liepāja", - "type": "Republican city" + "type": "State city" }, { "code": "LV-REZ", "name": "Rēzekne", - "type": "Republican city" + "type": "State city" }, { "code": "LV-RIX", "name": "Rīga", - "type": "Republican city" + "type": "State city" }, { "code": "LV-VEN", "name": "Ventspils", - "type": "Republican city" - }, - { - "code": "LV-VMR", - "name": "Valmiera", - "type": "Republican city" + "type": "State city" }, { "code": "LY-BA", @@ -15261,451 +14993,451 @@ { "code": "MA-AGD", "name": "Agadir-Ida-Ou-Tanane", - "parent": "09", + "parent": "MA-09", "type": "Prefecture" }, { "code": "MA-AOU", "name": "Aousserd (EH)", - "parent": "12", + "parent": "MA-12", "type": "Province" }, { "code": "MA-ASZ", "name": "Assa-Zag (EH-partial)", - "parent": "10", + "parent": "MA-10", "type": "Province" }, { "code": "MA-AZI", "name": "Azilal", - "parent": "05", + "parent": "MA-05", "type": "Province" }, { "code": "MA-BEM", "name": "Béni Mellal", - "parent": "05", + "parent": "MA-05", "type": "Province" }, { "code": "MA-BER", "name": "Berkane", - "parent": "02", + "parent": "MA-02", "type": "Province" }, { "code": "MA-BES", "name": "Benslimane", - "parent": "06", + "parent": "MA-06", "type": "Province" }, { "code": "MA-BOD", "name": "Boujdour (EH)", - "parent": "11", + "parent": "MA-11", "type": "Province" }, { "code": "MA-BOM", "name": "Boulemane", - "parent": "03", + "parent": "MA-03", "type": "Province" }, { "code": "MA-BRR", "name": "Berrechid", - "parent": "06", + "parent": "MA-06", "type": "Province" }, { "code": "MA-CAS", "name": "Casablanca", - "parent": "06", + "parent": "MA-06", "type": "Prefecture" }, { "code": "MA-CHE", "name": "Chefchaouen", - "parent": "01", + "parent": "MA-01", "type": "Province" }, { "code": "MA-CHI", "name": "Chichaoua", - "parent": "07", + "parent": "MA-07", "type": "Province" }, { "code": "MA-CHT", "name": "Chtouka-Ait Baha", - "parent": "06", + "parent": "MA-06", "type": "Province" }, { "code": "MA-DRI", "name": "Driouch", - "parent": "02", + "parent": "MA-02", "type": "Province" }, { "code": "MA-ERR", "name": "Errachidia", - "parent": "08", + "parent": "MA-08", "type": "Province" }, { "code": "MA-ESI", "name": "Essaouira", - "parent": "07", + "parent": "MA-07", "type": "Province" }, { "code": "MA-ESM", "name": "Es-Semara (EH-partial)", - "parent": "11", + "parent": "MA-11", "type": "Province" }, { "code": "MA-FAH", "name": "Fahs-Anjra", - "parent": "01", + "parent": "MA-01", "type": "Province" }, { "code": "MA-FES", "name": "Fès", - "parent": "03", + "parent": "MA-03", "type": "Prefecture" }, { "code": "MA-FIG", "name": "Figuig", - "parent": "02", + "parent": "MA-02", "type": "Province" }, { "code": "MA-FQH", "name": "Fquih Ben Salah", - "parent": "05", + "parent": "MA-05", "type": "Province" }, { "code": "MA-GUE", "name": "Guelmim", - "parent": "10", + "parent": "MA-10", "type": "Province" }, { "code": "MA-GUF", "name": "Guercif", - "parent": "02", + "parent": "MA-02", "type": "Province" }, { "code": "MA-HAJ", "name": "El Hajeb", - "parent": "03", + "parent": "MA-03", "type": "Province" }, { "code": "MA-HAO", "name": "Al Haouz", - "parent": "07", + "parent": "MA-07", "type": "Province" }, { "code": "MA-HOC", "name": "Al Hoceïma", - "parent": "01", + "parent": "MA-01", "type": "Province" }, { "code": "MA-IFR", "name": "Ifrane", - "parent": "03", + "parent": "MA-03", "type": "Province" }, { "code": "MA-INE", "name": "Inezgane-Ait Melloul", - "parent": "09", + "parent": "MA-09", "type": "Prefecture" }, { "code": "MA-JDI", "name": "El Jadida", - "parent": "06", + "parent": "MA-06", "type": "Province" }, { "code": "MA-JRA", "name": "Jerada", - "parent": "02", + "parent": "MA-02", "type": "Province" }, { "code": "MA-KEN", "name": "Kénitra", - "parent": "04", + "parent": "MA-04", "type": "Province" }, { "code": "MA-KES", "name": "El Kelâa des Sraghna", - "parent": "07", + "parent": "MA-07", "type": "Province" }, { "code": "MA-KHE", "name": "Khémisset", - "parent": "04", + "parent": "MA-04", "type": "Province" }, { "code": "MA-KHN", "name": "Khénifra", - "parent": "05", + "parent": "MA-05", "type": "Province" }, { "code": "MA-KHO", "name": "Khouribga", - "parent": "05", + "parent": "MA-05", "type": "Province" }, { "code": "MA-LAA", "name": "Laâyoune (EH)", - "parent": "11", + "parent": "MA-11", "type": "Province" }, { "code": "MA-LAR", "name": "Larache", - "parent": "01", + "parent": "MA-01", "type": "Province" }, { "code": "MA-MAR", "name": "Marrakech", - "parent": "07", + "parent": "MA-07", "type": "Prefecture" }, { "code": "MA-MDF", "name": "M’diq-Fnideq", - "parent": "01", + "parent": "MA-01", "type": "Prefecture" }, { "code": "MA-MED", "name": "Médiouna", - "parent": "06", + "parent": "MA-06", "type": "Province" }, { "code": "MA-MEK", "name": "Meknès", - "parent": "03", + "parent": "MA-03", "type": "Prefecture" }, { "code": "MA-MID", "name": "Midelt", - "parent": "08", + "parent": "MA-08", "type": "Province" }, { "code": "MA-MOH", "name": "Mohammadia", - "parent": "06", + "parent": "MA-06", "type": "Prefecture" }, { "code": "MA-MOU", "name": "Moulay Yacoub", - "parent": "03", + "parent": "MA-03", "type": "Province" }, { "code": "MA-NAD", "name": "Nador", - "parent": "02", + "parent": "MA-02", "type": "Province" }, { "code": "MA-NOU", "name": "Nouaceur", - "parent": "04", + "parent": "MA-04", "type": "Province" }, { "code": "MA-OUA", "name": "Ouarzazate", - "parent": "08", + "parent": "MA-08", "type": "Province" }, { "code": "MA-OUD", "name": "Oued Ed-Dahab (EH)", - "parent": "12", + "parent": "MA-12", "type": "Province" }, { "code": "MA-OUJ", "name": "Oujda-Angad", - "parent": "02", + "parent": "MA-02", "type": "Prefecture" }, { "code": "MA-OUZ", "name": "Ouezzane", - "parent": "01", + "parent": "MA-01", "type": "Province" }, { "code": "MA-RAB", "name": "Rabat", - "parent": "04", + "parent": "MA-04", "type": "Prefecture" }, { "code": "MA-REH", "name": "Rehamna", - "parent": "07", + "parent": "MA-07", "type": "Province" }, { "code": "MA-SAF", "name": "Safi", - "parent": "07", + "parent": "MA-07", "type": "Province" }, { "code": "MA-SAL", "name": "Salé", - "parent": "04", + "parent": "MA-04", "type": "Prefecture" }, { "code": "MA-SEF", "name": "Sefrou", - "parent": "03", + "parent": "MA-03", "type": "Province" }, { "code": "MA-SET", "name": "Settat", - "parent": "06", + "parent": "MA-06", "type": "Province" }, { "code": "MA-SIB", "name": "Sidi Bennour", - "parent": "06", + "parent": "MA-06", "type": "Province" }, { "code": "MA-SIF", "name": "Sidi Ifni", - "parent": "10", + "parent": "MA-10", "type": "Province" }, { "code": "MA-SIK", "name": "Sidi Kacem", - "parent": "04", + "parent": "MA-04", "type": "Province" }, { "code": "MA-SIL", "name": "Sidi Slimane", - "parent": "04", + "parent": "MA-04", "type": "Province" }, { "code": "MA-SKH", "name": "Skhirate-Témara", - "parent": "04", + "parent": "MA-04", "type": "Prefecture" }, { "code": "MA-TAF", "name": "Tarfaya (EH-partial)", - "parent": "11", + "parent": "MA-11", "type": "Province" }, { "code": "MA-TAI", "name": "Taourirt", - "parent": "02", + "parent": "MA-02", "type": "Province" }, { "code": "MA-TAO", "name": "Taounate", - "parent": "03", + "parent": "MA-03", "type": "Province" }, { "code": "MA-TAR", "name": "Taroudannt", - "parent": "09", + "parent": "MA-09", "type": "Province" }, { "code": "MA-TAT", "name": "Tata", - "parent": "09", + "parent": "MA-09", "type": "Province" }, { "code": "MA-TAZ", "name": "Taza", - "parent": "03", + "parent": "MA-03", "type": "Province" }, { "code": "MA-TET", "name": "Tétouan", - "parent": "01", + "parent": "MA-01", "type": "Province" }, { "code": "MA-TIN", "name": "Tinghir", - "parent": "08", + "parent": "MA-08", "type": "Province" }, { "code": "MA-TIZ", "name": "Tiznit", - "parent": "09", + "parent": "MA-09", "type": "Province" }, { "code": "MA-TNG", "name": "Tanger-Assilah", - "parent": "01", + "parent": "MA-01", "type": "Prefecture" }, { "code": "MA-TNT", "name": "Tan-Tan (EH-partial)", - "parent": "10", + "parent": "MA-10", "type": "Province" }, { "code": "MA-YUS", "name": "Youssoufia", - "parent": "07", + "parent": "MA-07", "type": "Province" }, { "code": "MA-ZAG", "name": "Zagora", - "parent": "08", + "parent": "MA-08", "type": "Province" }, { @@ -16098,6 +15830,11 @@ "name": "Tuzi", "type": "Municipality" }, + { + "code": "ME-25", + "name": "Zeta", + "type": "Municipality" + }, { "code": "MG-A", "name": "Toamasina", @@ -16131,61 +15868,61 @@ { "code": "MH-ALK", "name": "Ailuk", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-ALL", "name": "Ailinglaplap", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-ARN", "name": "Arno", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-AUR", "name": "Aur", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-EBO", "name": "Ebon", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-ENI", "name": "Enewetak & Ujelang", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-JAB", "name": "Jabat", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-JAL", "name": "Jaluit", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-KIL", "name": "Bikini & Kili", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-KWA", "name": "Kwajalein", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { @@ -16196,61 +15933,61 @@ { "code": "MH-LAE", "name": "Lae", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-LIB", "name": "Lib", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-LIK", "name": "Likiep", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-MAJ", "name": "Majuro", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-MAL", "name": "Maloelap", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-MEJ", "name": "Mejit", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-MIL", "name": "Mili", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-NMK", "name": "Namdrik", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-NMU", "name": "Namu", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-RON", "name": "Rongelap", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { @@ -16261,25 +15998,25 @@ { "code": "MH-UJA", "name": "Ujae", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-UTI", "name": "Utrik", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { "code": "MH-WTH", "name": "Wotho", - "parent": "L", + "parent": "MH-L", "type": "Municipality" }, { "code": "MH-WTJ", "name": "Wotje", - "parent": "T", + "parent": "MH-T", "type": "Municipality" }, { @@ -17505,13 +17242,13 @@ { "code": "MW-BA", "name": "Balaka", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-BL", "name": "Blantyre", - "parent": "S", + "parent": "MW-S", "type": "District" }, { @@ -17522,91 +17259,91 @@ { "code": "MW-CK", "name": "Chikwawa", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-CR", "name": "Chiradzulu", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-CT", "name": "Chitipa", - "parent": "N", + "parent": "MW-N", "type": "District" }, { "code": "MW-DE", "name": "Dedza", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-DO", "name": "Dowa", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-KR", "name": "Karonga", - "parent": "N", + "parent": "MW-N", "type": "District" }, { "code": "MW-KS", "name": "Kasungu", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-LI", "name": "Lilongwe", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-LK", "name": "Likoma", - "parent": "N", + "parent": "MW-N", "type": "District" }, { "code": "MW-MC", "name": "Mchinji", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-MG", "name": "Mangochi", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-MH", "name": "Machinga", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-MU", "name": "Mulanje", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-MW", "name": "Mwanza", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-MZ", "name": "Mzimba", - "parent": "N", + "parent": "MW-N", "type": "District" }, { @@ -17617,49 +17354,49 @@ { "code": "MW-NB", "name": "Nkhata Bay", - "parent": "N", + "parent": "MW-N", "type": "District" }, { "code": "MW-NE", "name": "Neno", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-NI", "name": "Ntchisi", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-NK", "name": "Nkhotakota", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-NS", "name": "Nsanje", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-NU", "name": "Ntcheu", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-PH", "name": "Phalombe", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-RU", "name": "Rumphi", - "parent": "N", + "parent": "MW-N", "type": "District" }, { @@ -17670,19 +17407,19 @@ { "code": "MW-SA", "name": "Salima", - "parent": "C", + "parent": "MW-C", "type": "District" }, { "code": "MW-TH", "name": "Thyolo", - "parent": "S", + "parent": "MW-S", "type": "District" }, { "code": "MW-ZO", "name": "Zomba", - "parent": "S", + "parent": "MW-S", "type": "District" }, { @@ -17718,7 +17455,7 @@ { "code": "MX-CMX", "name": "Ciudad de México", - "type": "Federal district" + "type": "Federal entity" }, { "code": "MX-COA", @@ -18515,110 +18252,19 @@ "name": "Romssa ja Finnmárkku", "type": "County" }, - { - "code": "NP-1", - "name": "Central", - "type": "Development region" - }, - { - "code": "NP-2", - "name": "Mid Western", - "type": "Development region" - }, - { - "code": "NP-3", - "name": "Western", - "type": "Development region" - }, - { - "code": "NP-4", - "name": "Eastern", - "type": "Development region" - }, - { - "code": "NP-5", - "name": "Far Western", - "type": "Development region" - }, - { - "code": "NP-BA", - "name": "Bagmati", - "parent": "1", - "type": "Zone" - }, - { - "code": "NP-BH", - "name": "Bheri", - "parent": "2", - "type": "Zone" - }, - { - "code": "NP-DH", - "name": "Dhawalagiri", - "parent": "3", - "type": "Zone" - }, - { - "code": "NP-GA", - "name": "Gandaki", - "parent": "3", - "type": "Zone" - }, - { - "code": "NP-JA", - "name": "Janakpur", - "parent": "1", - "type": "Zone" - }, - { - "code": "NP-KA", - "name": "Karnali", - "parent": "2", - "type": "Zone" - }, - { - "code": "NP-KO", - "name": "Kosi", - "parent": "4", - "type": "Zone" - }, - { - "code": "NP-LU", - "name": "Lumbini", - "parent": "3", - "type": "Zone" - }, - { - "code": "NP-MA", - "name": "Mahakali", - "parent": "5", - "type": "Zone" - }, - { - "code": "NP-ME", - "name": "Mechi", - "parent": "4", - "type": "Zone" - }, - { - "code": "NP-NA", - "name": "Narayani", - "parent": "1", - "type": "Zone" - }, { "code": "NP-P1", - "name": "Province 1", + "name": "Koshi", "type": "Province" }, { "code": "NP-P2", - "name": "Province 2", + "name": "Madhesh", "type": "Province" }, { "code": "NP-P3", - "name": "Bāgmatī", + "name": "Bagmati", "type": "Province" }, { @@ -18628,7 +18274,7 @@ }, { "code": "NP-P5", - "name": "Province 5", + "name": "Lumbini", "type": "Province" }, { @@ -18638,27 +18284,9 @@ }, { "code": "NP-P7", - "name": "Sudūr Pashchim", + "name": "Sudurpashchim", "type": "Province" }, - { - "code": "NP-RA", - "name": "Rapti", - "parent": "2", - "type": "Zone" - }, - { - "code": "NP-SA", - "name": "Sagarmatha", - "parent": "4", - "type": "Zone" - }, - { - "code": "NP-SE", - "name": "Seti", - "parent": "5", - "type": "Zone" - }, { "code": "NR-01", "name": "Aiwo", @@ -18766,7 +18394,7 @@ }, { "code": "NZ-MWT", - "name": "Manawatu-Wanganui", + "name": "Manawatū-Whanganui", "type": "Region" }, { @@ -18801,7 +18429,7 @@ }, { "code": "NZ-WGN", - "name": "Wellington", + "name": "Greater Wellington", "type": "Region" }, { @@ -18931,7 +18559,12 @@ }, { "code": "PA-NB", - "name": "Ngöbe-Buglé", + "name": "Ngäbe-Buglé", + "type": "Indigenous region" + }, + { + "code": "PA-NT", + "name": "Naso Tjër Di", "type": "Indigenous region" }, { @@ -19262,487 +18895,493 @@ { "code": "PH-ABR", "name": "Abra", - "parent": "15", + "parent": "PH-15", "type": "Province" }, { "code": "PH-AGN", "name": "Agusan del Norte", - "parent": "13", + "parent": "PH-13", "type": "Province" }, { "code": "PH-AGS", "name": "Agusan del Sur", - "parent": "13", + "parent": "PH-13", "type": "Province" }, { "code": "PH-AKL", "name": "Aklan", - "parent": "06", + "parent": "PH-06", "type": "Province" }, { "code": "PH-ALB", "name": "Albay", - "parent": "05", + "parent": "PH-05", "type": "Province" }, { "code": "PH-ANT", "name": "Antique", - "parent": "06", + "parent": "PH-06", "type": "Province" }, { "code": "PH-APA", "name": "Apayao", - "parent": "15", + "parent": "PH-15", "type": "Province" }, { "code": "PH-AUR", "name": "Aurora", - "parent": "03", + "parent": "PH-03", "type": "Province" }, { "code": "PH-BAN", "name": "Bataan", - "parent": "03", + "parent": "PH-03", "type": "Province" }, { "code": "PH-BAS", "name": "Basilan", - "parent": "09", + "parent": "PH-09", "type": "Province" }, { "code": "PH-BEN", "name": "Benguet", - "parent": "15", + "parent": "PH-15", "type": "Province" }, { "code": "PH-BIL", "name": "Biliran", - "parent": "08", + "parent": "PH-08", "type": "Province" }, { "code": "PH-BOH", "name": "Bohol", - "parent": "07", + "parent": "PH-07", "type": "Province" }, { "code": "PH-BTG", "name": "Batangas", - "parent": "40", + "parent": "PH-40", "type": "Province" }, { "code": "PH-BTN", "name": "Batanes", - "parent": "02", + "parent": "PH-02", "type": "Province" }, { "code": "PH-BUK", "name": "Bukidnon", - "parent": "10", + "parent": "PH-10", "type": "Province" }, { "code": "PH-BUL", "name": "Bulacan", - "parent": "03", + "parent": "PH-03", "type": "Province" }, { "code": "PH-CAG", "name": "Cagayan", - "parent": "02", + "parent": "PH-02", "type": "Province" }, { "code": "PH-CAM", "name": "Camiguin", - "parent": "10", + "parent": "PH-10", "type": "Province" }, { "code": "PH-CAN", "name": "Camarines Norte", - "parent": "05", + "parent": "PH-05", "type": "Province" }, { "code": "PH-CAP", "name": "Capiz", - "parent": "06", + "parent": "PH-06", "type": "Province" }, { "code": "PH-CAS", "name": "Camarines Sur", - "parent": "05", + "parent": "PH-05", "type": "Province" }, { "code": "PH-CAT", "name": "Catanduanes", - "parent": "05", + "parent": "PH-05", "type": "Province" }, { "code": "PH-CAV", "name": "Cavite", - "parent": "40", + "parent": "PH-40", "type": "Province" }, { "code": "PH-CEB", "name": "Cebu", - "parent": "07", + "parent": "PH-07", "type": "Province" }, { "code": "PH-COM", "name": "Davao de Oro", - "parent": "11", + "parent": "PH-11", "type": "Province" }, { "code": "PH-DAO", "name": "Davao Oriental", - "parent": "11", + "parent": "PH-11", "type": "Province" }, { "code": "PH-DAS", "name": "Davao del Sur", - "parent": "11", + "parent": "PH-11", "type": "Province" }, { "code": "PH-DAV", "name": "Davao del Norte", - "parent": "11", + "parent": "PH-11", "type": "Province" }, { "code": "PH-DIN", "name": "Dinagat Islands", - "parent": "13", + "parent": "PH-13", "type": "Province" }, { "code": "PH-DVO", "name": "Davao Occidental", - "parent": "11", + "parent": "PH-11", "type": "Province" }, { "code": "PH-EAS", "name": "Eastern Samar", - "parent": "08", + "parent": "PH-08", "type": "Province" }, { "code": "PH-GUI", "name": "Guimaras", - "parent": "06", + "parent": "PH-06", "type": "Province" }, { "code": "PH-IFU", "name": "Ifugao", - "parent": "15", + "parent": "PH-15", "type": "Province" }, { "code": "PH-ILI", "name": "Iloilo", - "parent": "06", + "parent": "PH-06", "type": "Province" }, { "code": "PH-ILN", "name": "Ilocos Norte", - "parent": "01", + "parent": "PH-01", "type": "Province" }, { "code": "PH-ILS", "name": "Ilocos Sur", - "parent": "01", + "parent": "PH-01", "type": "Province" }, { "code": "PH-ISA", "name": "Isabela", - "parent": "02", + "parent": "PH-02", "type": "Province" }, { "code": "PH-KAL", "name": "Kalinga", - "parent": "15", + "parent": "PH-15", "type": "Province" }, { "code": "PH-LAG", "name": "Laguna", - "parent": "40", + "parent": "PH-40", "type": "Province" }, { "code": "PH-LAN", "name": "Lanao del Norte", - "parent": "12", + "parent": "PH-12", "type": "Province" }, { "code": "PH-LAS", "name": "Lanao del Sur", - "parent": "14", + "parent": "PH-14", "type": "Province" }, { "code": "PH-LEY", "name": "Leyte", - "parent": "08", + "parent": "PH-08", "type": "Province" }, { "code": "PH-LUN", "name": "La Union", - "parent": "01", + "parent": "PH-01", "type": "Province" }, { "code": "PH-MAD", "name": "Marinduque", - "parent": "41", - "type": "Province" - }, - { - "code": "PH-MAG", - "name": "Maguindanao", - "parent": "14", + "parent": "PH-41", "type": "Province" }, { "code": "PH-MAS", "name": "Masbate", - "parent": "05", + "parent": "PH-05", "type": "Province" }, { "code": "PH-MDC", "name": "Mindoro Occidental", - "parent": "41", + "parent": "PH-41", "type": "Province" }, { "code": "PH-MDR", "name": "Mindoro Oriental", - "parent": "41", + "parent": "PH-41", + "type": "Province" + }, + { + "code": "PH-MGN", + "name": "Maguindanao del Norte", + "parent": "PH-14", + "type": "Province" + }, + { + "code": "PH-MGS", + "name": "Maguindanao del Sur", + "parent": "PH-14", "type": "Province" }, { "code": "PH-MOU", "name": "Mountain Province", - "parent": "15", + "parent": "PH-15", "type": "Province" }, { "code": "PH-MSC", "name": "Misamis Occidental", - "parent": "10", + "parent": "PH-10", "type": "Province" }, { "code": "PH-MSR", "name": "Misamis Oriental", - "parent": "10", + "parent": "PH-10", "type": "Province" }, { "code": "PH-NCO", "name": "Cotabato", - "parent": "12", + "parent": "PH-12", "type": "Province" }, { "code": "PH-NEC", "name": "Negros Occidental", - "parent": "06", + "parent": "PH-06", "type": "Province" }, { "code": "PH-NER", "name": "Negros Oriental", - "parent": "07", + "parent": "PH-07", "type": "Province" }, { "code": "PH-NSA", "name": "Northern Samar", - "parent": "08", + "parent": "PH-08", "type": "Province" }, { "code": "PH-NUE", "name": "Nueva Ecija", - "parent": "03", + "parent": "PH-03", "type": "Province" }, { "code": "PH-NUV", "name": "Nueva Vizcaya", - "parent": "02", + "parent": "PH-02", "type": "Province" }, { "code": "PH-PAM", "name": "Pampanga", - "parent": "03", + "parent": "PH-03", "type": "Province" }, { "code": "PH-PAN", "name": "Pangasinan", - "parent": "01", + "parent": "PH-01", "type": "Province" }, { "code": "PH-PLW", "name": "Palawan", - "parent": "41", + "parent": "PH-41", "type": "Province" }, { "code": "PH-QUE", "name": "Quezon", - "parent": "40", + "parent": "PH-40", "type": "Province" }, { "code": "PH-QUI", "name": "Quirino", - "parent": "02", + "parent": "PH-02", "type": "Province" }, { "code": "PH-RIZ", "name": "Rizal", - "parent": "40", + "parent": "PH-40", "type": "Province" }, { "code": "PH-ROM", "name": "Romblon", - "parent": "41", + "parent": "PH-41", "type": "Province" }, { "code": "PH-SAR", "name": "Sarangani", - "parent": "11", + "parent": "PH-11", "type": "Province" }, { "code": "PH-SCO", "name": "South Cotabato", - "parent": "11", + "parent": "PH-11", "type": "Province" }, { "code": "PH-SIG", "name": "Siquijor", - "parent": "07", + "parent": "PH-07", "type": "Province" }, { "code": "PH-SLE", "name": "Southern Leyte", - "parent": "08", + "parent": "PH-08", "type": "Province" }, { "code": "PH-SLU", "name": "Sulu", - "parent": "14", + "parent": "PH-14", "type": "Province" }, { "code": "PH-SOR", "name": "Sorsogon", - "parent": "05", + "parent": "PH-05", "type": "Province" }, { "code": "PH-SUK", "name": "Sultan Kudarat", - "parent": "12", + "parent": "PH-12", "type": "Province" }, { "code": "PH-SUN", "name": "Surigao del Norte", - "parent": "13", + "parent": "PH-13", "type": "Province" }, { "code": "PH-SUR", "name": "Surigao del Sur", - "parent": "13", + "parent": "PH-13", "type": "Province" }, { "code": "PH-TAR", "name": "Tarlac", - "parent": "03", + "parent": "PH-03", "type": "Province" }, { "code": "PH-TAW", "name": "Tawi-Tawi", - "parent": "14", + "parent": "PH-14", "type": "Province" }, { "code": "PH-WSA", "name": "Samar", - "parent": "08", + "parent": "PH-08", "type": "Province" }, { "code": "PH-ZAN", "name": "Zamboanga del Norte", - "parent": "09", + "parent": "PH-09", "type": "Province" }, { "code": "PH-ZAS", "name": "Zamboanga del Sur", - "parent": "09", + "parent": "PH-09", "type": "Province" }, { "code": "PH-ZMB", "name": "Zambales", - "parent": "03", + "parent": "PH-03", "type": "Province" }, { "code": "PH-ZSI", "name": "Zamboanga Sibugay", - "parent": "09", + "parent": "PH-09", "type": "Province" }, { @@ -19787,7 +19426,7 @@ }, { "code": "PL-04", - "name": "Kujawsko-pomorskie", + "name": "Kujawsko-Pomorskie", "type": "Voivodship" }, { @@ -19847,7 +19486,7 @@ }, { "code": "PL-28", - "name": "Warmińsko-mazurskie", + "name": "Warmińsko-Mazurskie", "type": "Voivodship" }, { @@ -20468,43 +20107,43 @@ { "code": "RS-01", "name": "Severnobački okrug", - "parent": "VO", + "parent": "RS-VO", "type": "District" }, { "code": "RS-02", "name": "Srednjebanatski okrug", - "parent": "VO", + "parent": "RS-VO", "type": "District" }, { "code": "RS-03", "name": "Severnobanatski okrug", - "parent": "VO", + "parent": "RS-VO", "type": "District" }, { "code": "RS-04", "name": "Južnobanatski okrug", - "parent": "VO", + "parent": "RS-VO", "type": "District" }, { "code": "RS-05", "name": "Zapadnobački okrug", - "parent": "VO", + "parent": "RS-VO", "type": "District" }, { "code": "RS-06", "name": "Južnobački okrug", - "parent": "VO", + "parent": "RS-VO", "type": "District" }, { "code": "RS-07", "name": "Sremski okrug", - "parent": "VO", + "parent": "RS-VO", "type": "District" }, { @@ -20595,31 +20234,31 @@ { "code": "RS-25", "name": "Kosovski okrug", - "parent": "KM", + "parent": "RS-KM", "type": "District" }, { "code": "RS-26", "name": "Pećki okrug", - "parent": "KM", + "parent": "RS-KM", "type": "District" }, { "code": "RS-27", "name": "Prizrenski okrug", - "parent": "KM", + "parent": "RS-KM", "type": "District" }, { "code": "RS-28", "name": "Kosovsko-Mitrovački okrug", - "parent": "KM", + "parent": "RS-KM", "type": "District" }, { "code": "RS-29", "name": "Kosovsko-Pomoravski okrug", - "parent": "KM", + "parent": "RS-KM", "type": "District" }, { @@ -21610,7 +21249,7 @@ { "code": "SI-011", "name": "Celje", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-012", @@ -21774,7 +21413,7 @@ }, { "code": "SI-044", - "name": "Kanal", + "name": "Kanal ob Soči", "type": "Municipality" }, { @@ -21805,7 +21444,7 @@ { "code": "SI-050", "name": "Koper", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-051", @@ -21815,7 +21454,7 @@ { "code": "SI-052", "name": "Kranj", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-053", @@ -21825,7 +21464,7 @@ { "code": "SI-054", "name": "Krško", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-055", @@ -21860,7 +21499,7 @@ { "code": "SI-061", "name": "Ljubljana", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-062", @@ -21905,7 +21544,7 @@ { "code": "SI-070", "name": "Maribor", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-071", @@ -21955,7 +21594,7 @@ { "code": "SI-080", "name": "Murska Sobota", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-081", @@ -21975,12 +21614,12 @@ { "code": "SI-084", "name": "Nova Gorica", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-085", "name": "Novo Mesto", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-086", @@ -22035,7 +21674,7 @@ { "code": "SI-096", "name": "Ptuj", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-097", @@ -22115,7 +21754,7 @@ { "code": "SI-112", "name": "Slovenj Gradec", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-113", @@ -22220,7 +21859,7 @@ { "code": "SI-133", "name": "Velenje", - "type": "Municipality" + "type": "Urban municipality" }, { "code": "SI-134", @@ -22534,7 +22173,7 @@ }, { "code": "SI-197", - "name": "Kosanjevica na Krki", + "name": "Kostanjevica na Krki", "type": "Municipality" }, { @@ -23184,7 +22823,7 @@ }, { "code": "TD-BA", - "name": "Al Baţḩā’", + "name": "Batha", "type": "Province" }, { @@ -23229,7 +22868,7 @@ }, { "code": "TD-LC", - "name": "Al Buḩayrah", + "name": "Lac", "type": "Province" }, { @@ -23264,7 +22903,7 @@ }, { "code": "TD-ND", - "name": "Madīnat Injamīnā", + "name": "Ville de Ndjamena", "type": "Province" }, { @@ -23289,7 +22928,7 @@ }, { "code": "TD-TI", - "name": "Tibastī", + "name": "Tibesti", "type": "Province" }, { @@ -24900,811 +24539,811 @@ { "code": "UG-101", "name": "Kalangala", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-102", "name": "Kampala", - "parent": "C", + "parent": "UG-C", "type": "City" }, { "code": "UG-103", "name": "Kiboga", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-104", "name": "Luwero", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-105", "name": "Masaka", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-106", "name": "Mpigi", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-107", "name": "Mubende", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-108", "name": "Mukono", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-109", "name": "Nakasongola", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-110", "name": "Rakai", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-111", "name": "Sembabule", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-112", "name": "Kayunga", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-113", "name": "Wakiso", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-114", "name": "Lyantonde", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-115", "name": "Mityana", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-116", "name": "Nakaseke", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-117", "name": "Buikwe", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-118", "name": "Bukomansibi", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-119", "name": "Butambala", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-120", "name": "Buvuma", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-121", "name": "Gomba", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-122", "name": "Kalungu", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-123", "name": "Kyankwanzi", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-124", "name": "Lwengo", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-125", "name": "Kyotera", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-126", "name": "Kasanda", - "parent": "C", + "parent": "UG-C", "type": "District" }, { "code": "UG-201", "name": "Bugiri", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-202", "name": "Busia", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-203", "name": "Iganga", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-204", "name": "Jinja", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-205", "name": "Kamuli", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-206", "name": "Kapchorwa", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-207", "name": "Katakwi", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-208", "name": "Kumi", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-209", "name": "Mbale", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-210", "name": "Pallisa", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-211", "name": "Soroti", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-212", "name": "Tororo", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-213", "name": "Kaberamaido", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-214", "name": "Mayuge", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-215", "name": "Sironko", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-216", "name": "Amuria", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-217", "name": "Budaka", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-218", "name": "Bududa", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-219", "name": "Bukedea", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-220", "name": "Bukwo", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-221", "name": "Butaleja", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-222", "name": "Kaliro", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-223", "name": "Manafwa", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-224", "name": "Namutumba", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-225", "name": "Bulambuli", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-226", "name": "Buyende", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-227", "name": "Kibuku", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-228", "name": "Kween", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-229", "name": "Luuka", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-230", "name": "Namayingo", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-231", "name": "Ngora", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-232", "name": "Serere", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-233", "name": "Butebo", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-234", "name": "Namisindwa", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-235", "name": "Bugweri", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-236", "name": "Kapelebyong", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-237", "name": "Kalaki", - "parent": "E", + "parent": "UG-E", "type": "District" }, { "code": "UG-301", "name": "Adjumani", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-302", "name": "Apac", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-303", "name": "Arua", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-304", "name": "Gulu", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-305", "name": "Kitgum", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-306", "name": "Kotido", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-307", "name": "Lira", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-308", "name": "Moroto", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-309", "name": "Moyo", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-310", "name": "Nebbi", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-311", "name": "Nakapiripirit", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-312", "name": "Pader", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-313", "name": "Yumbe", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-314", "name": "Abim", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-315", "name": "Amolatar", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-316", "name": "Amuru", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-317", "name": "Dokolo", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-318", "name": "Kaabong", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-319", "name": "Koboko", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-320", "name": "Maracha", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-321", "name": "Oyam", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-322", "name": "Agago", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-323", "name": "Alebtong", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-324", "name": "Amudat", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-325", "name": "Kole", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-326", "name": "Lamwo", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-327", "name": "Napak", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-328", "name": "Nwoya", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-329", "name": "Otuke", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-330", "name": "Zombo", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-331", "name": "Omoro", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-332", "name": "Pakwach", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-333", "name": "Kwania", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-334", "name": "Nabilatuk", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-335", "name": "Karenga", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-336", "name": "Madi-Okollo", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-337", "name": "Obongi", - "parent": "N", + "parent": "UG-N", "type": "District" }, { "code": "UG-401", "name": "Bundibugyo", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-402", "name": "Bushenyi", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-403", "name": "Hoima", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-404", "name": "Kabale", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-405", "name": "Kabarole", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-406", "name": "Kasese", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-407", "name": "Kibaale", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-408", "name": "Kisoro", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-409", "name": "Masindi", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-410", "name": "Mbarara", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-411", "name": "Ntungamo", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-412", "name": "Rukungiri", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-413", "name": "Kamwenge", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-414", "name": "Kanungu", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-415", "name": "Kyenjojo", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-416", "name": "Buliisa", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-417", "name": "Ibanda", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-418", "name": "Isingiro", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-419", "name": "Kiruhura", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-420", "name": "Buhweju", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-421", "name": "Kiryandongo", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-422", "name": "Kyegegwa", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-423", "name": "Mitooma", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-424", "name": "Ntoroko", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-425", "name": "Rubirizi", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-426", "name": "Sheema", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-427", "name": "Kagadi", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-428", "name": "Kakumiro", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-429", "name": "Rubanda", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-430", "name": "Bunyangabu", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-431", "name": "Rukiga", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-432", "name": "Kikuube", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-433", "name": "Kazo", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-434", "name": "Kitagwenda", - "parent": "W", + "parent": "UG-W", "type": "District" }, { "code": "UG-435", "name": "Rwampara", - "parent": "W", + "parent": "UG-W", "type": "District" }, { diff --git a/libs/pycountry/db.py b/libs/pycountry/db.py index bfc0f28ff..08f24e8c9 100644 --- a/libs/pycountry/db.py +++ b/libs/pycountry/db.py @@ -1,7 +1,6 @@ import json import logging import threading -import warnings from typing import Any, Iterator, List, Optional, Type, Union logger = logging.getLogger("pycountry.db") @@ -14,7 +13,7 @@ def __init__(self, **fields: str): def __getattr__(self, key): if key in self._fields: return self._fields[key] - raise AttributeError() + raise AttributeError(key) def __setattr__(self, key: str, value: str) -> None: if key != "_fields": @@ -36,26 +35,7 @@ def __iter__(self): class Country(Data): - def __getattr__(self, key): - if key in ("common_name", "official_name"): - # First try to get the common_name or official_name - value = self._fields.get(key) - if value is not None: - return value - # Fall back to name if common_name or official_name is not found - name = self._fields.get("name") - if name is not None: - warning_message = ( - f"Country's {key} not found. Country name provided instead." - ) - warnings.warn(warning_message, UserWarning) - return name - raise AttributeError() - else: - # For other keys, simply return the value or raise an error - if key in self._fields: - return self._fields[key] - raise AttributeError() + pass class Subdivision(Data): @@ -174,9 +154,9 @@ def __len__(self) -> int: return len(self.objects) @lazy_load - def get(self, **kw: Optional[str]) -> Optional[Any]: - kw.setdefault("default", None) - default = kw.pop("default") + def get( + self, *, default: Optional[Any] = None, **kw: Optional[str] + ) -> Optional[Any]: if len(kw) != 1: raise TypeError("Only one criteria may be given") field, value = kw.popitem() diff --git a/libs/pycountry/locales/ach/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/ach/LC_MESSAGES/iso3166-1.mo index cac1369ce1f4f8e050fdef0f06b217f7bb08f952..27643b8debab487df43b72bfc831e658ad7f97e5 100644 GIT binary patch literal 9144 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 Uymh(2Th|qMb3d(qhFNv~A4Zy=*8l(j literal 9088 zcmaKwdz2(qeaA1d1X<)QA-qf>f*|(3Kpw*`IMcg3J3BMG!_Mq3FNNFPwcRycUDaD% zwX;0|d@LA12tp)i042N>2)Ym?V1l3<L{wgCR3s9ONzlVN9y~_=AV%}~R^6Tlf_2WX zKlgoq_x+uD@xTSw8@}&iM_>>9i7|)nX3WSwN;PKZ0mkeN?}K~7M;srA`x1Z3#s3Xb z)%+)XD|{I)g#QEgg1?8Vzt@4r>;VseN<RcD{V1sN$GiARj>}#8N~m_%yY#aiFNEs1 z0o88o(leKSv5Q{{RsSlep<VCtZ-eh3emDG6_#{-hpTM`lUqJcys!RW!<DLf<{q7Gn z4~M`%gU7-J@JuLwRywYQ`x767hd>L}PZz5Fk3#i#CDc6J;L>k}YVU5S@?V4+??X`i zJ_=R;X~*wFm3z_gC5X%B6_>yJ+Y7(;hFaGHAWLJ8glcE8<0(+>oC!5wYoPqt<nqsh z@}uhVC!xl-9Ucy^fExcDQ04A{YX5%6FT4D&LG6QYK$ZKBi$4!l{%270@iJ8Zue$vI zh4OEYgNu6mLiu^HiysZu|9hayErIIiG^lpVj>Ayp#$En7Q2kV0egkTr+ED&o1XX^A z%fG_KuXXu1IDQ7o?>k)nPAESfbor0E{I9$Cb5MT$(D5gZKZok?6{zvO3N?-eY*w|u zuj8Rm{=EyTpA#HUf*Q{XsCEXR)@cn?{c{{^Q0>N0esrPQ`-qEQ?&6<-YX1hP`nNdV z16A)q7ypWjKk4`!RR7OA{yWsX{uk7^e&yo7hw@`@4vESi4At)8P~$inYTq9Rb>2>a z@^j4PZ-(;ke5m@q%Wp!BJ8}6tpxV0%%8zTI+PT@~-|o`yg=*(vC_f&BD)$6bKTo^- zA3)8=kD<=-&!Niy2CDr3x%>q<t^EC<#(4x(JI6XMhWime6{`LksPbb_etrPTp8)3T z<>Fnac0L5v-{nx{uW|7kq5QiQs@%Pf4?>lD6ly-c1=a7fQ2qSS#b1Q-<G-QW|Fz?5 zE`PT}jp0a|y`a|T9Z>69f@<${sQ$|?z7ER&O)h>RRJ{gNzf(~CTny#!r7r(!_&wgI zo1og?%4L&}+wpR!cCLl$_ZG*`yZoI{{XXpCyBxm_)$hMT&BqH+<z9mF`&Ur@{1&R+ z-FYmPzc*C;V8<gJkAW&*f@=397w>cNeyDnbQ2wunn%}db>iJObQV0)&ABXDiPN;G_ zq3S;ZRsV4pe;TU(_o43nA48_fyaKhp3y&<gACzBjhnla$AVtjaQ0=XTYG*yve%u5# z4_l!6-3rxS*TpY^s`oJ{|E_WAH$k;?yUV}F@c}6R9&!24I{pBv{)<rO^<}93ehbz9 z0wzW4z7JIW!=e0G1l7-pQ04oe+8KaqXFb&TE`%EQ#ZcvUK$X7|s{QMr+Pe{IzHfml ze>YUQosJK={Kufmf78XEarw_f)%z*betHS2zhArb*P!|{e_r&n7gYX1Q2iVRRsWqX z|2U|Ambvs(pxRvlRes2&pXK74q1wB^rEhTzq3R_rehHKxmqL}l8fu+C>EfS-YX43b z|ALEu3Ch1mpw?p-R6EZ({s^j_pFy?zOPBr|sCoSz)Og<N747T;r9%#as&@>OpG#bP zIg}rRj_Vya!+e}j{cnM)A3IJ%<zEJse-%_a*E`+}HI6$R?{Vq(L5=HSD1V=Dd=9Go z3sCL+6lxs5fJiL!OUTliw;WZJI|?fQ-B9hk*QK8f<=1kk^H+xQZv#~M^PtLK2-V*t zRDW%#@ok5yzr&?p>EhQx)%!G5z1yJ5-vxCZ9)N1+t1kaZm;a2*{}GfQFG02QisNfg z_xpl(7WEH>I)6t&-47>0`LhzLzhS8UH$k;`zRUMrJaq94YMn1~>6g3oYoYx86x4j& z0p<7IQ0?CD;txTUdkm`oryRfM_yW|r{0G!LzY4XkdmLT(br4klM?lp-4r<(sq53-w zB1ud?RKI6KmHQynxO}L68^PUR6Z<qqH)eNC-vIVV9x8sm4W7ep#y*2xg?$Or_g4jG zej`E+>;stQA;HEmeRmfy_c?wR>aHKgu61cWJVRg^cDzei1fRk*H>Y70>{v|SAokbT z<5-H-Fnv!KFgxJ~v3?i-5M+Cp)h;evfoWg72fGP74$~JGFk9g_v8!EtBb;{OC*VJ0 z2Vh^pMlh|B-oaIv=KoTxjp?gm_hRQO!l(U*EHUp=gwMxxCiQ)%fVl%Mb>a8H^RTaC zXSuW!;5S@Yct2Lcx|sIIb(q%wz1aTP-(#0xS7J-B6<7!R7B=@=Ph=9?hTS$N<DUqh ziG2~f9{U>h7ufySlbF6wU?0sx#m^bwE^IOO^&-hU<~ZdjoQwS<*1{gd)?modd|!i^ z?_fe3umB6Oi?DOBE!fAfi?Oq@Q!%b@^JPrm<puKJNBO<g#Xk-=yYRknCH5A~!@hv& z`$&PA-y;b<jQuV4FW3>-4cI2Ej`d-GgN<PqV7+f20-wVsdI|7t*t6K3*oU!qV|!vl zn7$JWn9sw9uu<$3>~w4$b|LmDY&oWHZ2^<PvI|>y3wAR0UF;Za2X-{J2eu2-y?G<{ zm)L>W-(i<whhzVM^}dq`Z0|+jHP{2#C$W35+cDF>rQWbn&`E7%`ojuA3+sL&wm{WJ z-nebWM59`qBw{@db7Vo72U43<Q%aitr0z#)5GmC1^R|+#LM-c~i4E1JLgKWaRBSLw zw*$6eTec%6Hc&jOhqmT-8U!g+i^=mtn`AlbLDo_{nD#-W3VzbcYSs)iG7V!O4ufrU zF%YMnDT^-yakkA*y`fHMqna5=>~s)<APqVVZz!q-3~_zc=Xb(SNRE^4O!lTAsRxm( zOaEC|xAK1=OPY++TWveBA{ot?vTapjnp40};y5A@Sv)J-Zj0s%4?3pIBrzRc|CVBY zH~8(W5(ZUMZrB<>LFnrj*UOEBwPAL8-k0NQ-0_YZ_L+dFe*A2caTvEM>N;-42{TrX z<K~=P7TDXMB`PPeO;t|oQqB^)>vJ|X<!)QkTb}l-4R6*RMJc<|k6Jcqnw675CC<{o ztc+Vhq}F<YXtvU-YQ~Z!W>vl0PR**2-4kvrQnqH6$qg9!U=~EaHLIBIMC_!ocFU@? z5yWi*t8EhdGw!brCIhoNi1PJYo!F@Ao7IUQ;VTVkiCt_g4!e=xQ3FNxIPNz5WOii( zzhee%g{2u}u_!p`$E>iJutZ%m$Z;SRR9GPPwHZu&pYDXBe?s}14l+zXjI%bGnQiGO z^;?z$F__U~$EU4glm$uyL8oIg61(bQjb;CtHE~p94LS<cy<vXLnk-_Ab<I$fJ<op4 zH>iH&Vq`;!-D-vsm)Qw@FW%yfvhRmFiS<J>l-jUs)^en@Kx=KAthIh3f7ZrHjo7fA zw#`O<<cIyJYt3+w1Qm9L8P29~%M5pudUrZ6Fk(}kr4gU2fk_+jJ8{~G%}7wmuLwx} zk$`=Y`cWtKIgTSi+Q{;YWF*_}b0V^&Zbmr<b=#>jqod5xRFI>qr6OJnwy`b*^5j%$ zNvC1MaApgTz`YV|&3y7QwoTqa5e(S5qqZBTDVhHEpc<ReIIP9nXeW+r9@U+tzTyZ! z{d%GzQQG0W+mv7uSMy@i+7x*wEE0R(th22^+hiS`W@eq=wjsaTQ(Bx3;VG|dL!Z@A zDPrgPjE{9&$Mh$*o{<`GpBBF=6EKE#ak3>2dk0j}Vw*Bd?dO?clQCtxW<6WejM-*! zPmj?-Ml`Z53)-3W)Un%bV@0oBGv?#*7?(-VZgbi?hSMR(#^@}oGmbI#X&UQVh|O76 zn|(t}NBFpbdy{Kx!>+rsC}7!(2Vk5lOb$jd30W=h`V*_U8P|-`-Z)o!9_>~eei+i@ zc%TXPMtt@z5jJ)^P6&mpO;be)<j=&ouCI9Zh8)Kctyg}2-970d<6QN4)Yelmo&?^A zjhYlJQrQ{I3O!8uHJ|*cAmyRShdp5fMr9`KWZ>p;!ba2ia3>lzD9Qv}o+UOpJ82@W z$NV%oXc@$JGr??V$4+qh>v_vh$V9fyhMCz|&!=o-Q*W4WHbz0}*YX+iR<#0l8Pnks zhna|4-0DTg(;_p;*eqSMak}C=2RGS>OC>X#nBeIQN6e<cPZ^-uEEl=f#(6t=lF#vR z$DCW-Xy*p4imgofX4hpJ)XZKQOX5ktnwExYrA^!itZSbabm9w6Tzc}!rKJnG_1PGu z(M~<6l?JkUr!*1wd5tt}cls7D?%1$n7u9?gI9kMwxtN-zYRoHLN`2d!jS}i)erMs> z`qBn}8`Bj>rIie@&s(-+=_#e9%Sy}M=Pfz0Z^?-#Ea6)?VmoPRf;*kpna82e%b&b_ z%h;smEw4_7jkx98S}pNAo%h$d*1|>AxOE0KBPOiwmnLwa&+D%?IO5*&p2v-tDXJ}+ z@+&m#=RUWK8R*ROHZBztu-H}`i)UNy^N24T9U5IVJ6lT^Em>I3ZxCGWwi#3EZ%-Gu zLzet>ugX$%{B*^}iPfc3XUl15Tl}Q7Dq^}=`9AN|N{}ub3%U2h(&{*Ab^5%hoku$> zmYwbu!4;8rhPU+eg=d!rS$+18=4Nv-7;o94rKgo@{<ejtzio2?SJjP(a^oJ)Wml*> zhpn1xxF!b|Nitu<{h^3!rU56Ze^$Z;^EBL4Mkl;GYPAR}G&x7ddAg7WEW3S<jH{9& z5eM19NtTlrw-9lYGa}9w8g53y=_*0OReKVyf`seWF_nUwl!DVU5LCT4RB(u~EaYCa zEwAN!J+W7)IjOkd^)ik-uqWe&doqpycc>oBLdDH#ao7)ZC+A8oM#;5#LN(1Bg0@A< zHIaOha=DUYHh5!^dQ_>pG0gRDIBv$(08wYXw%?48H^V(KH=K*Pc|#e_n&fly&=spS zj82lA8<w0KW=l1t=4{YTY?V3in{zx0IQ|sP)f{3DQB|20bF@{6xp|{l)y#Yzf>C@= z0>oUP$Bwt3G_tfQ14gfxhuof+W1Hl!;YeJGz5WVywIzqDbEc0+Dn`T2>N*}H={jVd zgc~j9B56#Kz~kZKPL=O8>1#o`iR<225Oo!ys*1g-uG2~>_jS4szmRpgs+7E&BkJBz z(@AwwAs=e~i=eB{>bd@0&#f=?T-6Y8dX7JrcrzJ(@x;uPa~ctHu4#&W&7TLeVou`0 zskxv~bF5IV<`nJV%G$UPbCW!!#qs|`HRnss*?KTt6hO`CSk0=rYMjm!bIJ_-CK`zf zPR#YRToo;6drGdV%{Qy$d_2hGH8uzHI!DUQ-RYyYicUa7NXs=dm799KnA5(URdY=` za&nFhE;*M+=gGOCC+C8yF3Mca<)tR|AU4hDAJuX-$+cX$4bSShAokYgcg;G+`KBsv z-j+tHwd3aeZQhe}skSR~5~K8{Sh^WKS1ijL2|7F&)Tzqloaz*EE?0B9UUM<WFH$a+ zl;bSwMu@ot-bBiE3oTbX1pHx&L%EhK&((5VXt|av=gO|kx=P8hB;~nMu3ShtZkiyB zE4h@*L%EilH!I~r*y+#GT+q3T(i_UBL?@WrjeR_OqG>bNc4clHC+_kR`eU^acjZFd zm8bakf!1!GvMXj3X~(}7*plSsMVzqHt~PI??6iX?Y%c6vBiyO;l${R58wk5z+8@<* zf!R1IVOKOQWyha6{Qu&0!meyR_FHdyIGr9VQg;GxZ6Wa1_5|MCqt(waYv%s}ECZ4J diff --git a/libs/pycountry/locales/ast/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/ast/LC_MESSAGES/iso639-5.mo index 35e674f2425297d3a6422cd680fa60984d71e224..4708f32917cc0a911c765169089edff0d52a1068 100644 GIT binary patch literal 4029 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 WbNULf?!s5V8j*enm{a;4aQ*{wLR32d delta 66 xcmdlh|Aoooo)F7a1|VPrVi_P-0b*t#)&XJ=umEB!prj>`2C0F8&HFfQ7y$}n250~P diff --git a/libs/pycountry/locales/be/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/be/LC_MESSAGES/iso3166-2.mo index 9090bfe4ec6860998b3823894bda753150ae8463..ccd9fc0ed23f1e4bcde09e2f2aceab2043f39926 100644 GIT binary patch delta 82393 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 literal 201179 zcmXWjcih)w`^WJ}Lu8ax5>Z-c&@xggWTZrkP*k#_gh*B-*`tIqLQxV)5*3*xGZ~dT zQbyTHR&~E#*XRBF=lM9!aU92aem>vtbzR-}{rg{~?Z%ek|MuUxRH;32=oO_(9kyGk zQcHe!v{b1%?YAkl9lnHRa6Xp9H?S-&!HT#vevPjGCH{fsiT_T#ZHHoiIdpty+ySeh z`|4!A0d7y+G~<WiPQ-1|eVx%hdZK;x$@qZ87oqzvMfY8U_Io>Wyi#M4BbS<*`MK!& zMTwW<F2t)7Z$SIo_Nb!Ya%kPk==rNBu7^7kADH-1wBNQ^8jnT$=#=?W;;Cr<K3EC+ zqx}s-*N;Z?-htMg5GSF1K8fDPOXxXXi|?Z6U54KCy7(uWf7_$CDOCY0q4PD-^E5#F zZkh46Xq^+#e5Ye&9FqA_=sn+!_VFm%$5ZinG~Ybj1K-N{*KvK^i0<E-xZE+txpzhL z?S<B<kM`LTJ;zb#Il7_e=!34mAmf*z{a%Oe8;joOV`#o-(Yg!b+i1TZp!fed`g~Sp zd=2^>enR(cK<oaS@p2uDek!8#)zCb(Vm&l}BP=-wmYf5tGTtrmg=n86&~;-Hk4K-! z6KMX~X#V-}O?3Sdw9az$oZn>p_l%c1w%E5ldY)a-^}A<$Z!~}1#EoKe^u7<r8h8wv z|7>*q5VXH5(R;ZCU4I|i=Oiq7KN3HW)}M>6e-+KMB=eud6&YWR-pe|4{iay@xZ>P9 zqx);3>-IzI9hC9I(S04z`|gr>Ai8d7;;Yeq$DsFl7y2GNobkuwG&J8#+#Tm*6<mg% zYdxCxH+28M==xH}7x{NY`>mX~M%)*@w+85QX@;(Ao%ks9y*@GVS@C?d@1b!x`hH!X z`Mc5YnFrDSo<Z}@im#yc-bnl&+V`@!9PMjW=GUS1e$V{hXx=Ru-|mFs{5!-d=zZ>u zz9$Ew@6Qn#?}YYq8hVdsqxr8u^In^H6x!EqXuo%(&+|d_zMn_;%|r9O5tpF-e-c;4 zb?Ewy@jo<w=}v{^(f6q$T5pex*G9kJ>!bS*K!2VdjMnLb`{QZod2T}2O+@oNj`lYl zJ>Lr%e;Hl(2Abzx^u75s<EzpBen9vAjJx6==<_anVzF;`^q%)gd=Q$qHCner;uFw* zPDb<fPJ9;nyv|3T(-mm`(P*CW@nJOIWVFv`(D!U^#@~y}&^lknZ!`W2dY(;a{r}KB z+jcJc-wCa|H~QW;MxRIf*ahw9baa2e#OI;)2BZ70MC**n{2l1}acI2>=siA(=AVn^ zeH%UB`{?>l(dV)feg5B}>(-<De@E+X*QIzLE28VGqU-jJ4bb<ZN#di?{GHJHC!_iM zp!xcteOwqXjU&)=-H7fRlkxlF!|47g=+E(I(YkM<{jA9RYBc})#2e7Q|3mYZJE?dc zyP@~BA6Cbv=)U98^(SZkjEtX$)*pg?K8B-p$H#}!b5BnEbbKCt@8+WSun2u0-$VOZ zf%fq|TK|vuADVx=uEqEc=(@^@_fA|7y|;ri-U|KxXp8PYE}oS6p6EIHpzF>}d`aS~ z5|4^^pywK&_#w2<Dd;`T$o$-lzlzp<C*vQ)Wtm?Qzd_fnNBjRh@us*1?XS$q#eMCJ z#x>FRvmUzt5VXIxnLj#lm)ITs{^*UazcAxN(fhv=J<m<?4)k32q3b7Q{Hesxq4nmV z>*mKrXueO-eP74#(SCnHzfZO~rI_C>)<Em;8ylkcaS+zRmgsZu8T+B{{l(~gj6&b1 zJ2U?fnr|xloM)o>UPk+VHNJ)JUy}G!bp1;7eO-&buYY9zugq^j_m%5boMYEm4b8uI z;{6gIfcAe7+Sd`8KN{_;Q^vcZ^-o3foSpe|Ge0QtWoZ53==bQ2XutQP_x@y@f##Ww zu73r6K5wDF=PX6*t;_rd^f_&gJ9jVo-3Q&*0Dayq&^kw=_udiB-yJ<)AN0Hf(e*>I z8eW6;Gag;{5Zd=-^!<DR?dL6Y-3MsiWoZ3XXx$&t{2S2sX)9W%Qja38iSBQLu4{qT zYlq(VacG{-=(_Hi?~Uf`hxTzfTL0R_W6(VJp!f7(#;2qG&yH`Sbw7`5(4SksqJKY? z>RI$#1I<?#JzpcV?qRqWc1V0Sy6yrr&rr1Q8!|p7<9DO?FbO^1bTr?r#PiU7Z=m%S zXZ$m?|No)+e?jYQMfaEMRm8iXaWypmJ{hl{@g`{fLo(h0U3Wq}IrFC`?vLiX0PX8i zw2$GLzZHF6_n_;>qw5|`JO$1FY<v+t*L<}9chU7r(fwa!d^NgmUEG9z9=1ERc%N&a z?`4C;t>V$>`)~@H?+mogIf*Zd!!mvy`X1aI$Hqs|dzy~sn-dqJd6&dxX#W49{eFv{ zcSFYiLEoosPb>D-M9*6n&3iz`TcG>epmmRqC!wF;-e}$P(0!Mn@4<-7--h1DgJ_<q z==$g4-1s`0e@Wuc(0pH^=UA8d-xF_+WqKFuDx&$TqWSki^VN$7p?|NoM$g#`U3X?2 zi2hzQ7|k;Z?fbUG6VSge9!vZ(`Z->R_V)=|Z)L{6L-YTg`E5@x;tJ^c%4q%?=zH4` z{r)%%&2u7p{$A*Na5lQ{qKsdTp5r?7`|+m4kD&ceM&JMGiD$-_GX5&M|4sD$co)t8 zIr?0`Li_s}y_e1Cc`Kb!SO<N7TA=GrLihE_{2=uAylc^ZCZgwh96iqrwC>9pe+T_} zv=sgM{2h9Ko6-Gc&n)&=ME6%i`>%r~_lNd>SjO9<`HxN99j)IRz1MTl{DU)oCA$8` z%-@~)3GoTE?lWk;xfy>Ky_ZkWyx*d~5C4kRtI(%-4pq?iXAd;bLFo6!5t;9X-ruR{ z{(<Ouu1E8XiDNVV2zoD1qW3TZt^Wd=e?jKo&G^UYc~_!!)}nbgpn0~S?@O7!={r`5 zwb1<gqkT2ccx$wN$9N)|?-aD&Y3ROwi3cUV9PQ(}#CIgVAAPT;pmi3a_q`a+vjWY( z7X3W`h}J28R?+vaXg_<R_q{JVe<)h7J^KB05_<l=Xx<CrWoW%?u@>Hi-sep8InU4h zhiILz(f!|{`F=z1@jvu)v(4GX`0i-m`=IBlADd*n720Q;jCV}jCG)+|I(^VO=b?2j z&HR;U-s{kQZ;oT*qv*crXy0=Z&qw=Ogx3Es<6mH1;x%ZU9r_jXyP$Qd$9>Se4Km*h z&EFdRJheyHcZogGI(^W(=c3Q)V)T5Y(e-zu>mESQ^B9_UM&@5Y_s>Juy@9?D@1g5| zK=W*jo6-Db`WN3<JEQ&Wh4#Ncny&?x^pEauACE`ZpNy{SgRVOVt$!h!=Q4EPb?Ezc zGy1;Wm+>j+`Wa}RIf)mb``<yoPnV+SSdI4mGg|*IbX}PNg}cNWXui7fK(u}{^gV2c z*6o4z-3R@i8G!D)7Oi&^n*Sd391kU)jIMhw@f`H?@OoT^_Wd1t-apa$WzQ-4-VM#a z58B6pXdf*SAD;Lqbl>qA@0Ibh;=s%g%KTO6=k-Q3|2XuXCZXq;fu3V7`hB|)t@}mh zSD`<5*P(rFM)#K;SgflYtD|}LM(fl=@8e)}{h{doW6=CvGT$BDcRG46{n2%oX8vll z&l@v-C;GhZN8jgXu;lv>_aR<^=G%<+QRdvDk6qEc)zIg#586i)G=B?p-;rqF$D%)H zyCfbEFN{Oc=Q}*!hJFt`jOKY9t@AYce!h&>c@yp9!;F8C@o&(5Kcjv9iLU!E<7Lh( z`l=XrL)X=a`=Isfq4f?x^R<Xa#G}!BJ`p|V8L@x7AYOvr=apz56VSX*WPS#EKeN&I zaS57tIePEw(ENX*eQb_p&M($iM8|8y+UUOh(Q~y#_qRsxtpnOe=ZyD6&wD0XzaRSk z4ncoUx*2^w6Vdl?2Kt`7lJWP@-wRiv`Ts)em%gCrYiD#{RWwhX*aEHB5o=<1w2z@^ zzgM82muu1U-IMVL(SPrlgsz{Ao^u*n_qoLL(0hIz-Tz+VW$5`=CH@}0|KHKN<u6R% zXuhhkcE%f{`&%Y%8#|)?bV1+OZfL%KnLj`Cm!Rh!hOQfx@v&&V2hj6OM)yA*pO16V zdwvb=V+ne`W$1JJ61}%S(Ea5G75A_cy02QSo$*HK`_?LPN8FpZE852pH2*O4-mgu3 z16u!9^c-W+_u_H%950~v@f!O4-$M5<&HQI*{%_Fd^aFY?8_;^&TvYVCJsR&8_e9s% zN!$qSqXk;84SMbl@p$y#DY_;ejIJAozTYFzKJG&6+?V)awC^X-^)us(X#Q8w`+PmV zkM92h&G$9h=XdD(-xB|Y_Pg!H#rhr4`O1m+K<{r~^gbG8{P2u-K%Z9^^f~v*_$6pR z*P#85LF?avp5uPBugPeiPiKA>+RuD+-`nW=C0KGEEIALl?mIN^uZjOb*OeYzoMQ)c zeWh3pJ<ncf-iGM@mgv4C6CaD-!^!A5PR)G(cwxL0%{KyFcQg84-HYxYkDlXUH2>r1 zd--(6=b`l%W`0S=KgswP8UH5Z>(M&DqWS;L{I)}i{1wo8mC(FZ(dV`gy1sG7TcG{4 zMenC$JTc>^pm}<u&$lny_h9tiuSfUa67NCtKbUwDdcRXM{$iY;@i)=^A7jbSm&~t2 z@9($78_{$8hxS?alHzl+BRXCS?WbYJ4@Ubq2F-sWdSBhq^YlgY3_!mpE<m5(aI}w` z65ogBe+<n(9nCu%-8T=-w*=k)5nAudxE9U#6Z*N>jIP^dXmO8wqWKR*$6F?DkM`Rs zaZj}FS?IcR(dT(-=0~FIZ$s~Ue8!(ZpVtiZ_o`Pjz6?Fjs>I);d4G>v(0mmxE!I^* z&$SnN-n!`g{;>sm&Lh#EyC<Rf&O`gY3_a%vwC+tAzY~29_a&Z))_ENLetbIdyXd~9 zXr7gczeVri7qtFnw7-g%6;?v?SB*8%@7LOBzLw}Y+M;!jN7tW>KCfQrx(ni^=>1+D zZ$ZyD9?kPGnrCX98Rw$w7NYAGW&D%45`Ev-p!L4b_;2X?ztOteU0&qhHC9K*_d)kH zLhH0ld<5FhG3d|X&glIO$oR$R`eEq%d`;rp(R^d$Lvc#xpGEt65zW64y|={~{}AnK z1^OO*AOFaBsbNJQ718;su{QcV8z*iZkB!~17V~}4{MW}j;)M7V`g`4MG~YYu`|&Ay z&TrB4ZA8~?LGNLgE7DJ_jgB`)--j0Hd5_KfNtr)Aalg!8jMg2NcvRxs(R>r)W9Yq2 zP5dmH|3$RF1&QB5@B2ga`K>@d*K5&rf1-J|CN6VjF}_o*itek0)^CXBYnu7P(fvmy zJ|6uXoq|4}Ug*8`k3-S=BhmWzW_%*r|I=|6TJII~dA*M2`w+dKm6=}`e?$BD3thJb z?YqM8qRwt;zM5!1b>hM3zIN#Pj%XiU6Q7Fq*$+MUh3NO;u*~0<@%zv|C!zIcWd3Dz z|C?x?_t8E+LF=qQKfm9^@6i40(e<0+W^`ZatBU?BpmFtB3%4b%m$)JN9GaqeTA=Ui z;fYT~zt2uV-_L<)Kf|%)`JnIpy=ecBqxGhvd1j&KeG9#prJ4U9mb_o+zCY3PZAJ5! z9#Q1k0gWr6&vTE&_0fKtpwFoVdf!K(&*#+G53M^0?dJ;gytl+V(L7_(z8{Q}(7I2> z=g>Z1iVM*^@1pnfAzF70dQU&2{cdx0aX&kw^LwLt8=&i&qIElD{CKpVlhJ$amH1qA z-9_mB%QAj7dafJLeB;pjehOVb8(lvy@tf#5mY{W(q5n>`BI6s;``m)=uXs(-$8P9( z>Y(`!LeG6DdhaKq{hp29%O&W&4@2M6k%{j>>pp<q$0KOIsp$ThXnzaQb?>5me1xw5 zJoBsL`uGQ0Z!@~C{Ix~Dm0~S4Pb0KmbM(GiqwirCv|eAd-*eFOU6S#e(7tX%^Nd6D zOhoVN33UIgjL*fAbD;gai{9U|_zk-LH}t+Xq3ixb^On7?xYwP~K5L`nEzrN)k3iR- zf}Z<~crN-r3`OgYLigQ)_I+Q*A41PLCF9Sd>*gk2i0)s6K9`R(zB>MZ*8def|34Yu z{`z9yF0negZeKM20cgL?(0gx#p05kq_t_c06zz8uy6-mhd5q2cQ<<Ne`Pa}s7NPxq zp84<NFX(yxj9bzBFF&&QyzGSbSp(g_A6maT`g{&gd?eaWM|6Fc#HS`cD_(%sy9{gN zHR!&_GCmF6KMOtgeDt|~h<<**Mb~eL|Dt`AzM<%=Jeq&!#MRLA?~V4~DC0+<b&iUi z(Y(E4-*|532c!2g9L;}S=Er3G?l?Z<55>tDe+GTNvl1^r^Sp`ve)v9mj<p$IhxWYz zz3**rEc)9Xy@y@Ve)h_E9rSz$pzrVD==nOLb-JSaPRsZ}w4Wj9xkqIDMzr1?iO0o9 zGCmc3FP}r}ypiz_6Mu&0`zGV-(LR4i>;0AS(xZxX70^7Du;e^wzje?)4n+HImhmIe z`p2Q)ucv2xNF0vtyCLx{Xg~L&btYu~$;2}fzl`43LUjF-jDM1N1=`m)iGPfLp!NPs zT>7Ts96O-TZ&&oW*20p{51OYrdfp?@&wB?nPq&QsM*BD`^XJ9k=-+v_qWAd(+V`{Q zz05`Ty@w^=t7x5X(ELB3pSxet{kx4W=J!VT?T3D!9EkRPB-;1U=y|%M|2b)Y^ylNX zXx<0VI*%rvg64ZB@$AgcOZ<A~7o+`uj6R>0=>2?;_V-)n|4Ur<=AzE7X#T3``n}Qq z>Sw-X;?{{zK<}d~`ri-egYF-J-v5o69~U1-`<jWqf3KkH7NPZ)qyPEgH|Y1&zvw+w z98)}p-O#umx~~zsuTAWT-tS3hAKlUQXT<&)zX07gH1P=Zo^C|%`!2N4`_TQ5X8cL? zyw9NdU&;6zXuid0o~0RIh2Hnt%>Rn!{X22#TZ((w5nWe3)<N?%M(eji_q9RKeJon% z)Hnd$KO~OG_-HiGy&0c~_WxwYXQR(yLE<Ioxt5{%zC`POkJkG=<6GkPw-)(#L;I|m zxDLASKy+Wr#O-4zw67kC`=E8tL+^hG`uq7Xblp|)#?0T2*1H$2^I*oGK<iCI`+qU< z!o=^Rb-svS#~<Qv=;!ip^q#iAt;kaqt+y}QUxU~feczg+c@IVVZHLxB9__C?y1!52 zbI?44(a+cAxF3!}^E{2NpOyIK#IK|K7RL|cr*S1(Z#A0tN3@@R(R|z8UgX~)Rz}Bb zpn3OATt9JR^!;d_xE-3WW8#z0{XG(&k@<dT{R`3OcollCYtj21jh=Tr`u#c|&HE9$ zZaI3dtI_=5#h=l28{-yqUAa4oygQ=%_e9s#Nqiuhr#X6_!_o5|o47N&uQ!^nAG-cr zEcx#<Bp!|KzXM%A0j={mdhgRS{vx`60s3?0t<0~=_z&p5U(q~&XMCGGi~8kb#aIcg zTNPbjC-DL3ISxU;7uuk8yP)Uj5qoF6FWToo^f?Sc^IeaAZpNT}jf)SX>z_pP&WtZ* z{MEP^ecwMppZ6;C`G13cj((4&?kf7-3C+7(;=N)Wv`$0xy=aQ|)gj|u(0+TMdCx@e z<-*KgnfdDy-<<ePwBGo{lhAWcMepHx^d4VF^DfH#XK1~z&_2FL^ZbF{?-sP*(svj8 zE1>Z%=zUa8yl>_kp!*x6^$$V&Z-@5L8Qpg#y6!x5-B7fT5$JQi5nVqHtv4CnHy!PB z4!ZsgbpMjL3|;>}H2+%kIsFp1py#i6PqD5B`upI%iCdz-#~gw7-4)G$CYo;`T7L*y z=jwPPn)g<;?+4KJQ_=mi(Dn1s&)Xa5c~+v&<vX;`pU`{%4_&{_y+xk#=y@xl{q2F) zX@ssjBJ)SZPO)1&9qqe6+Sg#T&hU6G+UJdEzT46Bk45{Ngw}sDJ{#wt`(8zVpIL<N zUxA))b>@GHf1>?wO<Z|wQD;wdUjuYs6SUr8Xus_fcS6^7L+kd=c>lx~qWxZ$@vGtu z=)POgbKjHk@fm*vtvdy+H#6g}#MjY&7RQg#^~=#d*2bUF`kT-^n`60g#q-@2ov(%N zuN#}j!_oeZLGzw~e!q4@`yZ6?OA}v>_H|>tE#qU+d!B%Po}P`bq3b`6%hC6Cb^H~r zy9NDzDtBMu9_V=vMEh@vu4|3<bu{{Zbwc;`Lf2i8`61~3E71BQ(R1FC_)av>cr?$$ z==(Gc?SCHnKE99EU4iCbgXUY8_;)nVUm4$;@p9vf^%Y}f^zY~D=>8_?zE<dSX@k}| z4y|)Cx~><xu5acCW_&P~oG<Z6blok9?@s(cd^F=vqWAD@;up~Sn}^o@5dC+IPc#1` zn)eU1zkkv1ukG$Ho_BThc^-(aI}Bad4n5cL=>2v_zi-Y$f1V9S|314E?dMK(|JcM6 z(DOZt=AVW>kC)JX-$I|$7a3oNuHTgLZ5}A@uM)a`544{H6SqS5ACLCi8@=!Ti7!O^ zzAW+enZE_?^PY@9knzXR{L|3y$=T?-x8i%~IX*$xtw!tqgr5J;jQ@+ihh-lu_E$si zYj5=YwXx*=LHD<cN22{6hvx5&uIn4mMe7Vk`@0NXKPujhu73!vGdbhW#|3Er@1ps? z$oLvG->>NNEj6Kdk9J1;tAgJ1Ua>Lyeznbfcl5nGGjabo2<_)`^d7It_^8BpWPV)Y zhtTsqf##cv_W3OOUc8LvdlNm!dx=+|_wWsR@4uk+wwYM0E05;g9o=68&0ibM-vC|T zEaQhIJ~DPh_jN|!!yf4V^U(Xb7~Ovby6##u@94z$Wd1>P{iMXx(0nr!zlok}N#f<` z`mfRc*P;1;$^52_Z%JJGp`xz}X#HK#zG|TR_C@cpVd7@-@Yn%;&L^OCPe<R20r4{Q zy&8qCy9ZtOI9g{q`u@y9@8|W5FNz;#{ImEay8oNZ|Co3K`aJ(b`!4@*;V$U?R73aG zMb|Y(`#LQ19b<R&edw3@%g~>1BhmiuL-$Wa^F4*un~C1vT=ZOTqW8Z9-S-iCkDsBR z>#xysuSNI$f$rOi<}3S1;Z9ic9%9LJNxX03dg%T}XkUk*eI147IT5Yf9qpqJ*2e+p z?}vAwd8eS~eg^I9)r@}-KSk?&nfQA&|1WV<#<!w%%0623u_Ic)3i@8`o$<zKy;d1N z4t=jrMbCR7+Q$%d|8;2nThQ~3L;HRhtv4B6_cZ#vXU8|td-)jM|G)SHn*R^9uhNr> zyp_@Cy(jwbhfUBr$Du#RPeSVtMDq?#JR**YccAarc(ku4&^$9TKO60P0ow1InO~am z<%z#a{2f~NCp6!m=)O{q75BIkny(i6T<W6h8=>cJnfZ3;_i)FIpMmyyE}Hi;^ggad z^WBN|Jq~?eCZhRY$oM>T{TpbVPvR=H{yOw?zX8p^-Q&f&ozVWP$9m{<Z;tLe6kXpQ z&D#mR@1C(Ay6$51d0m0_bsM^GEZYCW=zH}<;yGxZ`RKV9qwm3IXq|5p|CaeuPZZ-7 z(eqbB&)X#9ZPEAmc(l&xXugZ%HE7=3(S7$PehNMREcAXBqUTwf@s;TB<Ll6W4=z2q z*k23H-vq7K20d@rjQ2*L@A;X(F5ZjwF$L{oCR%S{d>76433{L3q4)G}EH|Zi4=Tq! z(7OAe=h#2vhs3t%^Ed{r(-}*iAG*F@91^e1{O#!b_5k`l`6ycF3AFziXx_Q#^IeGM zdk5|N)3^@JvjtsW=E-7RMfADXK*#H&{WVE^2%7K6jCV%s_C)iYjo#mRnZFY4ZzP)U zHgx@1bp0b4pOSb6`ut|2eY}Z2|Bn-YgMJQvMe}Y<ycIp~c25=eQUP7JQ>={EuNG^e z=c<p^Ynt)4XkQ%@cSg_C1HJEaGJZaK50@mq4y|`{;@i=E<Iuh)qy0XO)}4*6Uw}UM zH_*BtX8bd>-<26(gYH|8=KCZ5lkrkhi*sy`=Bb9}-y2<DCpJXS(F9%B49$C3?0|lr zI-&c|%lJj;Jq^qFO=#X*(R1F7KCej`pMm!O0{Xn?#dk8k6uplX=;vxJ+Q(mL-fgB8 z`O2a9vm08!7Miy)nzv=<+oAoQh@S6c^u6hU<{KCX#i8i=uZ-8B^+%(9-G$b9Fg}*~ zX^CgWSJ3z1jm&?Xctz%aK>Pd+?c=}1+df^?sfdnOjWyBp)<)0M7~S72wn6(k4(+!q z+V5%TdHbXJE{j*8d9FwI-IVb=(7wkeehkg`6uNFE`aI_*ejDxM12o@qw9YE@`L9Lm zZ$$ekJH1%HORRzBuZ!kyobi@uopzb;objIM^Eo^7=b`m3NB57&{EcW|w<f+1{dw~c zy6#!Dzd4EDi65fp_#CbOCEDLQwC;wC|C8}@&lK~!pwFi|dd~gO^^MU!T4er6w0@_= z-7?=7?dJmY=hs!}xyGV-9z^p@iqp|LbI|@4qU+wx_{SMvnenxWe~cT^&&?L}ycK5@ zeN{r^J<$4l$NkX$_DAa;hMwanw0@_=-O+VtWPA{s?{c)it1><k-G6K1d*ej(oRiV_ z@HzB3EI{)vLF=!~__v8S#LejYR_@uNuWIOX*$3TsAX>L2nzv0nA@jY^-viD@*Ij|W zH`k$g??LlCj-Kn8_<Y9ap#3k5@1f`T9If|l#y6n%wgtWCa?cg}D#mKDHoC46dj6JZ zU&qAGu?L#xO!R+e)gSF+BwF`&^ymD8Xg@PDJ`c^e7~TJI{5<pj%lvw@j}7R1^B;O2 zJIpM`_eAe`KXkllY!^>PpMO8}=g9f!zl)7V`<saFn~L`Ra(oLt&qwIJ|AOB8-)P@k z(Dh}XFY@n-=BtJ!{bamp##^ELj>>o^G~X#`o?hrV`=NO*ME`!d5`8c3Li?D4-q&+z zz8BH+Ey(;^=zH@a`g3eG`usMc=PWa;*ta{HZ!fgp`e;AR&^`{ycsumx*NJG|u4vt! zXudw^a~+)dYta2SqWf;o_}yrq<Iy?~qw5~e_;mChX2k{Q^In|!FVMPQ#qZJmzoPf` zcgD-UQ1rPIx_&pbzdg}&HcZ?C-Pa-UN$7o?iJtRZbp1u>`!XEOcV`@r-s>Z1AJ3xw zzl8381FgFlJ@@D6{#EGu@6dI>X8cdI{uZ=u`Ps#~-O%xx=>B>cZ;a+`mADO>uOoVI zC!%>yNBcS#%`+73>uNOLt>}AlFPd*kd?xcRp!?^=chGxVioR!Gp?Q8s^Z$b-|L*)^ zF<u?Lr+v`6P0`O`8}#$l8%zH8t7x7HSn^(=b*7`=A9K-jy^p?kU!v#z8SU>6wEwN> zdCJZy>Q+bdG(hKDpzmL6w4Zip-Y)3BbDxR!aV47Pdh|SF(Q`~i>&`{<y^8ktHhLc` z(0o6k_wgUPzU)iI`W<6sbl)E6d?PIR{3SjFy@xhv{~ghDcgy$yw9kt&emQy%qtU+Z zLH9j?=9z-#e-_>M0@~la%)gEH{bA-;W&XRwzoGg5&Uo3mMV(z@RW$EjXr8)>n<s9K z);j?`Z}-gij{VTSFF?<E3EJ-s8NV6Le`n(H@nJOIWb}LTY4jczqR;m|wC)P@9@e7y ze@6FhO<d;XBLD8_y1in(j5k61X@%}<jrQ9f&3_zP?-aDpv(S4u58Zb~ygKtE(LQfM z^NmCAcLJL4DfIjQdGx(ojDDV%C;k>)|0nwI9Hn0=tbvXnjIM8szP~4+_4=asbODyU z-{|_W==w?V8Fc;J_-6btu0ZecTlCzUVwrixzRGBwz0h+sL-QY>xCdHyP#li-IU4;O zPDDRXbI^T@(e<CAzo&ka@&C|!E<eAx_o{JkbbUSa=TI~B^VSMW-owmyN6&FK`rL-1 z=ea8J81y;co%sIDKbr9w=<}N$U&;7F^gUXX@sH8EpQCkFCtiov{{yX4W<lYOX#bUC zE%ZG&5KG=aY(U%|J^zL1`m4}7H>36MLC-xQ@v~^Xm(b_CI4(o?eT6=^b!fg)uNL=T z5#3iE&D#*|_h9tC4$XK+bl*v6zh|K59fbCM8Cv%$bpK6gz1z|HkE7>#CeB0GFG1g< z&(QbbXS9!hGGF?&qV7&;o*HpKbX{XCdH(1*PDp$@`oBjXjPAP&UH@R>$Kx~TIp$>k z)x?X?b9{uJ`}2&iMf3cG=KT{rf2oB<|7FqlyAryu4w}Cyn(vU<HXeiC=ZT5WK=<{J zL(tFjHJQIV-X9-9^G`wVcLrL2e&P?&epjLEzDJ+yujqYkLC>-C>qURnV=Z)jz1SFi zUM<n@y>{q%jzROEnE4*)b3Y4xF2m3~x5j(p1T@d%Xg^P(eZLqNq5D>#>%KwH_dR+) zo8oqF6n*WAo?}mRUtRQkjnL=QCgVq;>pG$5>4EltRy;rBL(%hHgMKfKO8hXoe=?f) zS+xJzXx%r^=eY#!b0zv-|A6k>h}PYj`3i3q<5kgo`=EL1p?Ml-yiLZBLi_5J_!PAN z-iiC8c`iijU6Sz;8NV^!g5Kv{XrGUueN9K}&q4FP8W*AYK2E$6UAGqf-vR%Wc*nPj z`n#d)_dxU3N!%EHE{CA!I1WAMNg3~(@ge9ru1I`M9EJ9M8~VAJfW9{~(7dmqeSM7n z=SIuX`hTGHwxW5<zFn-}5nW#so!<{V_W>Dij-I1+#*c|z&^*1+eP^P124sFv#xF<r zU!C#M==*$E;&JHyhtYhK(L7IQd{%rJ?Q0==o_EnapJsjq`kt*${4<(wW5)kQpL4l) ziu>LTy~jH7;MfjbcM@9X4D|V&i+--JK=1nwbpNC1x@Y6dXdiE(`#whdUXA|zUynYw zvWtrS)zNkJ(R*qY+r<;m&sTT!J?n?o8;O3u+>Z7&30*fQ^KT{o2<>MTdam_o|9_!* zDl9JgtAf_w3w@93qvtyW?XM%cz9;&8&d&Jx=<^$np7VNi-7RRnad-eehW7g*x_=Ft z|3~yW{fq9~=G`LCj%Yts(DA*|eGSp|2W7q$`g>42wEod(-p=Sb&OrOW2tD^TnZGMO zg1$#H(EYPAJ`b(GBz}ta@fCWX>*FRgZ|NmPohoR5`=R%;Kbrp_bYIJiw@33Ght}zq z`7_b)+w(Ji1A33Q#|P1ScoNP3Y~mNud<!zZIO89ozej(O@!!yOe`UV(dqrP6py#L> z8=&vgVVOS`{r`8>E%9J9&j|GQm(ggS52N?^G}_+_=zYABcp-Y;Md*DjMf0r6{5rJm zZ|L{eR`k5p-!I$;UEd&avv@dKrvqB|xOh_RnfWu(y8Y2U24{YFyguHHp5xBM_s2)j zex{)B-3)Zy^BI2y?c)vfJ{F_>eumavjjsP0{kvcjx_-wGioBK3^?RW2@qXyNH$(S# zLHGBL{n35~p?NMt&wo|sN5)&xbz{+UPekiaLG!+X?t3SGfF<9r=;vnzT6aDAe*TfT z;)g}v-O>5I(0%pLa~y!yYl(hO9f{WIk?}Lo^#e10A=>BA%wL7(8I|}h^!xL{#LuAl z<|JN#?q8JgkI?;}qxbU-`tLM9p#7BnsMx<J+DGlg_0jc>(fetR<~cH+fY#}O);}}x z0Q4RPW&Cn<|JCSwJqFD)9{oOiEb}j-d0t2NFHXD^{T^G6?pvSnKhgS|W0{YO{T0#s z-VL4K3$0rhJx?<<&!LHrN_;$8zdO3`boBl0kM=Vp<HOPXBjaruzYksaFk0uy%s-QO z4w`>Hn*Ytj@5N8heJe8mHQMJ7XuUts_izikZl|S1zTIMtxG$Q&0oqSf^c;s~{FvAo z&C>(DpVQI)&W}UTJXfH3u0z+4$@rb<`tj)J^kKB$XVCZPC3N3>G|$`Ux(_n`KlJ&3 zhvxYg{r=tdlVbgDaZmL9sgt+~`hD9facA`X=z-=RnDNWe`qv~LjrM;hdY|Jm{s>zC z$;30_i|D!q=)Og0z7Np*`W)T&EqcD65^qGG(|;M?aanOMyP<jZPP`wwzX|$$S|;v* z);S)ne@fyr(0e#1@g?XzUxl9kI&}TrnV*2xdm{7G(DkpN{l1p@Md)+;0DT_I(RDwg z{cVW<#BDw;?zudgrz+OLz0rCd(C2d;nzwJf0PX*B^!sOI#veg{j!Z+(Jp(<*9JG&x z=)SkndP~v!UxBXs0o}g=t-mR5M%R`8tQg-FU0)T=vk!W24bXEQiuQXX`aDj^crSEc zAGE*o(7czR>#sxW-iki=yU}%%(EFU0cmaBjcM^Ys_Wfo28vR~hi{9T~XkR;jUgX~$ zUB4%qzZN>*AaN7)z79dpcSPooM*Hl9_R|ynoLzvfyBh6(6nd^((a+HX@hNoO9JJo6 ziQh)=<pcB{zd--JWgXgIg)fSqua(ibKANW~n&*(jZP9z_i1v93n)gg}-??c1A!vUi z(L8s>`_Z4{kD}{mqvu%=-$d)Zi{|+l&HoKr_ow(bx~|Of!X44Pm9eCMtVP@u&EFO6 zqi5`cKL3Gn7~1b>^ghR-`JaeS$LG<0=AwDuK<{BO`tx}ix^F#N@Avo*+W)pIius+; z`6{s{`uEa)X#X8D-YIs=`041q3_$B%j^@1{&38Mxe_X~NM*E$H_Vog~{}puod+2$W zq50Ni{ugw8sg;H0(EHsfacy*cL-h04JaId;UZ>b2<9*Th{Q|V#!D!tPnZFf%-|s`; z_i1R}d1$|j(S0k>=ky)={5GQJDD!3UcSA*V|9)8VJ)O8i?2i6^IuPyi1~l*O==ulH zd{g2KwBCzo|8JtteKFR;57EDqe?$Lsv>pFf<ZXz4FEm5%@%W5)jlI$P8-V5?jGpHj z^j_{j>pT=6NBf$Je(%go{3hD}d+`hOTx&D`OWcIM7hBPDmS0u$R|Tzi0Gj_Wbboua z?@k#%C2?=Gud~tnI5*>i(EOL8`>&3pGk<ryAN^i@1g-ZtdJj*dd0#~H%**^+Xr1@b zewHR)j_zB9?pqgs&HSJ7UvyomuZsOUp!qAI`)b5}GG7n9pGN4q!_f0|K=1uTw2!_S zADHnW@kVstcy!&P=yQD%{eGB()_os+Pd`D=_bpm?J-Yud^!s_6uZwm2pr4O}6CZ=# zUoR}_C-FdZ-Nk608{%!~x^d{fiRisNfj<9d;{tTw`<eeN<EzpAzoGs9h4#N0J<rao zi#%1(b#>73{n2_&(R(}ueg5sy_x2cc{mJOMQ!{@SdLIMOJeOqt3UvK-Xui=IzZ>oQ z0kp5j&~-1wSJ3mm9^cRS7igZZ&~vTJ_%G<a{E6->^G(suF6eko^n2+5^u1`E@h<2& z&O|@g=b+EyQuIBz8T}r;A3gsw=>EBAAMc_2KFj=C^d5doye0D$))akIL+jN;&)XQi zhZg9*HfY`xGT$BT|8%sU3o?II9EG0iPBibM@hLR#b7<dlGyWD@_x;Q-OZ>mYYtcME zC;l_>R`fZQTU+F<j^^Draihd76Sqgdw@*Op4b1pO=sAa>&*?_=zVAfO@p$4F(0f>f zzE4ZhJYS%Fe1)FxceIax(Z0)lTin;qXuKD?u5N6M=4pl2Z-cHoE_Oxl`Bb#-dFZ-} z(K^G?_u(e=xlf2w(K>SyzlQezLHq*i@c-EE8?=7;ABy!mqxq|$_fi|ZhbHLHqa)G0 zJ!4<=eK;@i73jX}(Vu5`p#4wJ{JhM+h2~wF@imEmLi25j71tI0?1`?gm$((Wu08r( zyP|am;l4N=t^W}E?`p50_w*_H_sIIpmtSA3tBdC8fY#}Qo^vqz?}=BU_i{J-??Dq2 z&qmk3hJOA(M*H|I^J~!i{RPeUC)UQTXkWE|EY8sy?e7G%PTzO|y6$rHymz7R+au_I z-)3g!Kgs;h==-}F?R(dsiu-SX#)qK&os{u2(4Q-V(C2#t?uQS?*U)?X4(+?l&qe(P zXr05*b9F}h?uovKXQO=%M%Rr@d|!Mj<1eHAe30>#=sABz&$k)9-@Sh+@-;#0wM%?F z)+0V0J>QM!{)uQmPosUjnDIsNb2RUFX#Ky?yk&kZzE5{T_wR$QI{<w?tux*=<ENwb z2BG^$p!r5+{vNci$I+k1uiyc=5`Evc|E+kw`=N0gbp2`Q`b*IK_n`euLi0~YpW9rt zzYo#p^EJA^%<si`O>})DbpK(AkB%p!`TJ!4qKsdO{#>~U+u#G}d$=53{|EXxD!rk& zms;p^ZjRPF7X93JPdosve+hc7tI<3UWqx|*=O%s=eQqDeHStfhukwEs`)i<|$A;)V zv`6cog1*mvu?`MHpWj4u|IGL%y8d&t-dglIZbJJlwXtvq^nAOcpO1#<eRs+HQ1rdO z2Hk%fT4x-Z|EV}Tz8*hB*L{ih|0{Yg+x%JV+Xbyx6YZxxI)7r~)6x6`(dT|Cn&&q3 zd+;H2-)rc;CFswM73jL}GX59Zcezc4yP$nlNB13o);TQm9nrie#oie|2Yrt(M&FlP z(R-SV?q3`~i)%9f8=9}mUq$^|==V;8#K)k0bctu8{SQL-U6b)K@&3#|i9Yw2(DS^H zuKzmzh$YV({r)cXck!Idp#4@y$Lpfs<NIg)AZ$zA2F-shcEhn)3)iFjcl@X5yE+=z zN9#9F+%|D1^gKP$&&|1+zXI)V6uR#Y^gVkZ^G~Ah?F;Dhe;d8;Rp|Yf{<p9unx`fD z`D>f;KIpw(iS~DM=EtG=W}|uDN9%u&uHS(6yX}8PzRKwSgJWBCzEk2e(0%8leOwtw zqUXI8T|WW+-k*-m@B{RFZoAFJd$kAJM+-F1k!aoH(D$VW`u<&-`Mc2bK9G1W`n~Xa z#+Re(|3UNYzNP4+Hk!W~`rfogpMMv0T@SR+ewiN???=!1G}`CO==!(NpHoW{|C{;p zTZ{LtGMc|0y1!9u9Z!g-p?#f)KA%f6eoMw5Nc<T3`Jah(aT(gjf0^H&|F6cz)zI&? z{m^?p1ihcmi3h~1@Ic1zM*DjeeeXZW{F;pagFeUYx7oJTp|}V7{nZVvHypi}(TVR# z{0Lfq8hQ_}q2KH8p#6P~*4v2Iudr>AuR0pnP23!PpW0=-D_XBFdT$qG{!%pWjc8x@ zqw6Loehxjyd^Fz&iC3ZT!>?%F(xr=amC*gQ(eXxT-qz^)<1&AG<_Bi}@{HdQ@5uZE znSUzIM*Dv~@sjujTJKx*eb|_|;&$7Xd>-~h`#2Qs?-=y+&^7UpI0F3~j7I-Xcs%3J zp!f6=dLQqh_5O#x|39JmcP>+m?}^6yqxD*$&#gUr4?WTM>wI+G_2{}guogamevV(x z{1@?CwC;w)+m<cflbzA`Y<INJlVX4L=l&JwzK787vFX?t-_H0Z^ju}j757^e?Wb1U zADwTJ_?X09(cgd0M&H+K(dTnh=I=z$`zU(OS@E^_K3Zo5y6;=`eg6gRw|x0xUsZIz z4%)|o==>4r{!W?ineo1fFGkm2f&RPj81(#4q5ED(`+7g|3bfyE(f8nQ^n0Vq_C=n< zV<+@^o`L?m<t1pI+tK|GqII7^>nzCpVzlqiGX5>P{x@{}b``cQ`Tvhl1>JW<JQjUl zPeJ<{imtyi^N%Ke8oj@HXg{B#@7Xu#_s>6Qy;?gI@9n{8oo?uOA9UX(=zU+C_-1t7 zxWtd5@BK6Ac|Jt<uS)!T+-Aq(es)3o-9H|V_R|S{UoSzQ%T4I{9>pd&554D~(Y{Jo zEI!}6pmpoxLD&+_e;&GSIQl&>8twZLbp15+KIWq9KSI~9PW(&aQacs<Dx!I+q3fEU z{k2A)M=vzb6>$t&=fOA?-S<-Bx8gGNdwxygf6#T?@4Riv?=8Ed=ROo2?~LZ{jh^Rx zwEkt8ABR4#$Ix|8qw8KqpUYclo-Z=~Eqd?2B`&i|v3?hHU5&)`(ftRb>yJi%o}QZV z5$O5vO#En^h30uXeuDP%HM;)C#GBFkEWc~fcb#}Jy1rfFPKkS?`_IYvu*5ed9*;h+ zDd_$MXdjDlfBX!+pVF0z`AX>dYNC0Ypz}wf_unP<M?Y6rqU-NL*H1=&&wMeiK;N&e zXx-f_7x`+V>kmrY9?jDg{T%gAd{gEhNc>ddSK_-FU!M3UH1B_CzZG{Y>g|gyh?}DK zFfiknpzE*4T6hoI=PdN|_Zqr>1s;IkX1;Qj;(e=y-cMV!UgwPWL-XE%<{OKyn-rfz zpYyBe&x@7l&!xZ7&%s{17x&Q&y}x77{b!(cE=2pf9{v66w!|-^_1;3?|D}mnX8wna z|B-kzTCaT7;<@dGevaCq&*3a=fH$DOr#_STQ#^>cRJD9>qWij`-(#1e^ADo^zn}57 zXr3La7wZm2<6h|J=sNW0%j4+%y^Ee_CHj8+fcE<zdj3j#6u%eLMAsdLj(0@w>16aC z2BP;j7|nYvy8f<=KZN!<J@ap5d|6zB*581hvuuqbUtRQlZ=Sdp`rZsg>tB!l9&jIe z&WF(YZzcXL^IOq<W%n%ZyB2zm<Iwfp(7)#fpns<iL(g?XybV3iIJE9#=<jQDGQJQ! z{|D&L=l`MS`5UdXW6h$^s_6J$v1#mp=I;^vVaa`>zXxB7_H$>vKl78&{+~;{Fn)yQ z`zrH4q0e;-dQZFURpdV$?e};z&j7UF%kdz*9?kPY<`-hgdynQ>nepxRF1`n=p!p6& z@2Ml2_jL5!gV5)29X7`Y(eKZX;t%Ne-Zr(0I(wk|YR48CKNkHwcg^_aXy0Sddm9@c zNBe(1^RH(7U9_*|8DF3HPqbdSeNrFITN};W2t8Np*cE-R&q4QHjjq2d@r1-P(EW4K z^^5R0{0hC#{r4^Ao5l8Me_heMXQO#9%lvid_s5;+`DSK(0lNNuH1F5g5Z9saca_>j zoqA~g7U<8}W6;mhX_-F@-9H#zcO^E$ThR4$(eu0?zl=Yk-@E^!pW~`^3R|Lm_DI|h z-G4*82YqiQq3h<M=UtrnW$3xqWPB6)9&Ni{QEyLleJeC?`@~%npN^j60`&ezWc=Rv z82TR0MDKMm`n~fb+RrX^3v0%P==zrE_i<;m?xkoSH=y6MccA-cqjg_L?{7K!J@YgA zKK+BP+qqs5?}_%&6#e;iGJ4*N(fb_}C!_lpqWAq7x^ENONA>!}x$B^DbM*7o7VWne z`kV)5elVK<D)hd_qj{e~zdshmRcPIfXr2lUitmH!Xq_X`{U@N$_4LHU(C@RG(RKHu z^&d|>9lfVH=zV;E-t$Vd&L8Od(hZCKJEH5VqJ7pu-;)mL`W|SX1JHhkqkre#iawvI z=yU!EkHn4WzLxtJd5%WoUU49LKbND=?;bS&!)TsaXg{B0eO#M(rvr-d8nHh5T$`iM zt1Ei0p=iAk*c5L?&oe)Ml=(G@H^j0B7W=BB_gX*k!Lc3M*GcgVwBGsXzq1Zad<9zX zdUX9*G~cAe)6w(KMfZQ2@m1)$9}{oFBZ#+aRP@z8c173q#aeg)dVjZ}c_(FlK3abf zdLN(0wdnis2byQc#>Kj-Xy0|vzFMOD+Ge~ny8f(qVH}2ju0~=boQVEhTY|nHf1rKU zXj1%s+7f+U{SuEt_dk!Wdk=lje!wR95Bgs0-?aGmfX?XpLFn(5qtSk6qvu_K?q8Dl z%eW5xe%^$x--4c}+(E^CR6^s1=;y0By6z}6?}_O5&S~iVU4-^^6Z-Gk)8b3$=lpGS z-Ir*-jcA@S2N(TSLgU(KohIn{56O79cvj{wLca%wq36E`J<oKsuUTmS@1S{?#;@W} z==1$2R%}*0-&*MNYK(pl_dxp@f!^aNbl-jG_sZ0azlQevapIq`HSt!okJinLJRQ+I zC!u|v6)!^HgR9Wr-ycHry@P(9)}Z@-K+pLPT7R1sMV@Nt`?(+becUW@C-gpgC%!md zgXX^-?PDsM|3&n?@1T8u6j$OQ#NTCppO(eChG@Nm(e)>w`FbSohxU0<;!$Y+yU=wH zpmnF9pW8X;{l15;`zrAd==%TA_1m{9+yg!L{%HL}6CV{%LEpQx6Awp!ZyAHWKNHY< ze-Z8Ti_HIu*5CG!qMsemb$g+8+M;!jNBcQ7o{v7CtI&HNiT-@J56$-i`uUiT?q7oL zUxB`FKce|79a^lfiN<x&`)P{a_tEG*otgO|iASLKbZ6p;Xq{){g7`lA^X*Ht{${lA zoenGNRYBugXuf*rIhvv8=!)(;4b6W+#)qSQ-H`G7GCmpYe+GJ<H_*Hv#Fc2hAJDwN zqU*OgyjZ_Gx_+O;jnMUn#I_kf221)w&v#lJj^=$3?f2>UGMaaB;?K~!-)8*ZSiW_! zt_r$;Uo3eZ89y5B=VY}0sc5~k(en;PpYJv3z9-QB=3*^ej^_P0Ryd-#$LeUl1JFFp z(eJyq==*gl`Z*qie$S3U@Bb0B{_|LJ-{|}P0h(_e`nlME*4?2^;U4Jw)d2nbz8zYp zKl<;_SD>Gt@fn|*cz)s!6R$z<^-uJ?rP~(us-g9opyO@O&)q3#zvrXpxeEOr9*>^q zRdnA{blqxn--cM>$YR|-=(=WT{r2d2yP)-Y#X;!jc_jM1_C&^4q5J+o>u%GosJ9z> zkNctXO=4@b-f?&k_R9FJ@qRSVWOUt2Xx(?vbFM@CE8D(sXS7bWSR4Jh+6dj>HTFgO zxENhO0)1Yi(a-5LH2)&B{#x|j{zB_*-=WxF3EjVUY#5uzwrIZN(R$~`%h30IB$|H= znr9-~?~~{`m!Ru@M(b}x-_x>373bL#&AWf%R`D3D#d!C`m&Z})`myNwCMBMq`FG=T z^!Mo>(7raJ^-CRHd=7U-$6KQBb362$r=WR<pr5nb<CAFL3(?Qb=ji%h(e*nWQ;au6 z_qB_?@nGW15>G|<zkz-pS7v+@ns3*Rg^kgB?Sww}K4||Jq4lms`=5aRJ~aj1{~~%n z%h1oyYII+PV~g*b8tD9C=y^J#^Jiem&uKL8sKj?Aelk8E=cDh@BDBAc<JTGg7483T zH2;pr75QtT>zko<+9y5{?dx>(Jm;a$<x2E9-iqcMkLH_({$BJ-;@8lAK1Sca73h6z zMW08_<BPZ@y1yGbJ^=0K+Kk_U_VoyQAJfo03(@EG724;&=(_SJ6m=`3-{*UxeIAak z>zw)C=yUHMM`U~~y6zz~-?TUz{oK5U_WKU{{rd&l?_aT8r()mk==eUdNo<4WIT5YX zE#qfpd~h6w-upG^x;xN*Cd4V|ea%d~1YP$Tmi&I2_y@G!pXmP0=>3&Hv54!U&!;K+ z{m>2V`*QUDMxo!+lQaG@nrAVZXIb13ckNvC(HQOTaP+>qqkWu%<{yOiJ0gxjpXYs< zpNYOduc6O<G5US_HTpca>r&*ciuP9@?YA|$@ANnT?e`+I-j!(mo8q|mM4W~8`#PHE z6ZC$*MC)#IQgQCx(D&z{cpN%^7MlN3bl(kVo+r`z&!PRyN53}~C0>i}`!(@abbW=c z#dE2OwTKTv`#Tk#KOfyUEZ&6nF)s5@p?`<Y&iER%?xxIFKDl^Kwb18zD4Mq?*24bi zIYy!TrlQaBE%f~Fq5IY*E`3UI-Wq71b<ljx(f6TU#(QV{LbU%Y(Y|j^JR$Sb63@x} z+i^Miynl)nyA^p3jEAFtw;hlEo_8tQ&x2^cPow8rjMo1-^PACrcj}&Vpncat$B#hs z9FO+f8-4#SLht7W^n3gf^f}K)@9Q<R&O7llY()GmHpD7Dio9*H4)ICodvh6D_nOS# ziuOM-<1b@LUbNn4Xn(7*<oB_RSLj)cS3&dDMfV+yu4|X^UU2}L=MwaDc>|jNVRYZr z%)f-*!{Us8iQdPL=>2ZftGNIDu;h85<Cmg++>h3oobeaY`(BaxjcC1XPc7cJUD19T zp!++-lh8b8#EZ~=uSL&yOU5Um&*^z|{|D$juS~oat@nH4ZB8rJ?S$s95f4DuwZ=p7 zgv2*xejM)4_!RU#U5dVk8_>^9_1?w)rm-#BM`yIJo*D0to?|Hb{d^7D|D))-d1xPt z(dY0*;veI`=(-B07xPuo_pu?muPHj;7Ome2t=B#CeKUV?=0~9SFbZ9FU*bvV_w(~; zo=?&ItI+fQjMgc8Mqy>N-&*MUgEM|O`h9gQ`o3I_zE6*$b!Vf`^X<g{Lw`>Gg67|f z*4^>UBCdhX*GI=&W&9ZQxtxOL9g6mGW8&M<^$(+YpNTJ{eZP}<Mf@K9J8dI+FFW-q z_E$&u*GIn>nxplO$6DAMy|)o)y+`5<bl-e*{ks`oiQdQh%=2HsE19o|uHOs&_l*4$ z9}<s7^Pimfti%^3zB=B5)*FxB$5ZI%ac1HriI<`IenHQ>1^rxae^wD67+az1+N0lF zUC}--M(=S1dY(HIKY>1%Iq162(f58WTBqFEg_ZDd;+kllQ!{>H9ERTONc0?&(cjl* zp!wg&X83cg-LI(E6J6gw@t`<7jz;?!8y|_&(0iMWp66}!+$+)k)}!ayg09=4fAOC$ z?}?7rMW5Tj=;!4~v`#Pd{`)1qI`PeD|Bs<{K1c8OyUdpvP`r<OqxD*$eH@FPzc;$? zD)jG?ThRT_qjf*R7PvBT<#USfoxRX}hsNX4`|6GE>yIVRH;zE-j6wI^pYf^azhk_J z?t2%#w@)*_KI4C(=Py05$Ws$te*pS<YKeXybjo-?^!wu?wBAItpJ&iMUe5U9#4FJI zScl$!g>#Gi)zE#l(eK+PXn!Z5dHcp8==(VmegB_8_btl!r)d9wq4_JFSM*&Aja$SH z=zVlWpZ@^#d{?9S?nVFpdKCRWdmjBe>~-`$KFIuX^qfDU`Ts@tZ-0KVZ}(UiOX{P~ zuLJsXp%c3P6f|$&ctOT5k2l1-(D&-0_#FB?-azkZ1)A?iw6DJtm%pHhtDyH=C$>fR z^+xMoi1s%Ot#e)Cdow=~&HE&JUoWEf^d4Gw6}s<7G~d=(;lgc8wIi;AKA)cG{E#>T zy`RzO=VBb%$E-LnzJ=EL0IjnU?dO+_Z;3k$D#oj!>+7NQnk8<7_HhE*{{ZwJhGqU{ zbp1HAk4NLw%s-F5$FHK#@hh~C@6h}G6FXw1i;8upp?wTT*NsN^-Iwu);<U`qLHl_d zt^YZi_v_4Wjyqml<g0=9+Yo&pnxpkjK;QFTXx$6Zd{-sD5&fRN7v29nx_^G=m!W;E zi5oLsc5soW3N~bZFEszLXr7*l&qn(glJRTe7_^VE@gekmnu6w;hd$pWXuehG=YCz{ z9fuVAtHxSrod)Q>7Kx9I-O>DKqvyE-turR^{pkLwXuTKF_hKRX`TqpH$2I74`wP9N zt>}BS`z6Ki$xYC69go&I1<lt#;}@gfTUW%1XkV|P^*=+`uR*_;e#v~fp+(-BXy0|w z_01EvLw|oeDe-Xh=gb(iznN%XOVIad8QR}(XufSPEk1X<#>VLSPH3I(XkTY19)x~B z4^Mn2x_%;>Z*s<8NW2iezmL#7Ycv0A+#D-hR(xKnqJ6hS*PoQ}-e~@-;w|Vo9!NY5 z?RPHv9=whIp12&%w;@)%yjWKc{rj(3;$G<Y&j9rK-hk$R5Y6{AdhP{iolnsIzDA$d zkLdkwH>_A!3*Fxw?fYo-xpYJCV+8s>-G$~IpLjaDeipj_^~9f`f7g72_PPBPIS0DF zS!^G>qTj216JLbZxf*?5_rwWkohQ(9%|^f9UeEkD8UGQj^LH$NWwEa+`uVJn<~<I* zmy<Jp26}%Np?{}ckLGy>y|;O2-DPNht24hTaoOR;`WooEhG@Sn6L(D94Xrx>%|AF^ zi|)Gv?QcTjCo(@1?e8@-?<Z)UwVD4lZjC!#RjjXx)@g$7YlH6VlKImzKL|bNh|G^g z&-n;i_l5Wl`dn9_`ToZGSYbrb|H0^dTeQv@X#I2JF!Y=^q2CAhqTe_3<7zZ-*{h3n zRnhOCI%q$KqVt{6{e9w?%+EsWE<)FRg4SD$zR$m-?@ifjigk6-`KIXlBhdTrjK23h z(R^pd^U%7NqUU@VeXr)>fw&6YU-8;v-|p!7_d&;-Wc-kfcR=f(jMnRet~&=?;l=3w zr_gnC(C6_c+VAHX{~`VvOJ7&a?}8=u(fv&lw?@x(LdJW<esOTT8tvy6G|#>0_tj%) zzptR*7q6rF*Q0s=Lf4nRzWBSV5_&()(Z0_{=Z7X9iJt3TG~X2Td+GzU&U$qJ?`S`@ zMizA%pm8(wJ!u_JM&IXi@&9c72VhiH*S-%25S5}LDous4P$fuL0R=+uy@()8k|7x~ znSn_rkXQh*P^1e|r72QGKswTsNJl_aL;(Q-k)nd4QvcU|&I(U{@AvKZIdkp3_G){b zeaZ~rtMfF}I16eYZG_6>Ak=<11)Y4~cF$)~sOM`<DEp?ycqqHKj1!^kKDO}+s5)es z`~Xxvezy7ZCcj}U^p3mEQc!lajg6qz(;h0{zEE*rgIe$VQ1zMwwf`1C+3$j?*Y{BC zKL(ZGRb&2lT|W;)JwM7q`Kbq`*AB|ht59*0pw^!X<!=I1T^2#z=Qo)ABviiFj78pa z-#5xZ<=@cQ73%N7B|-Tc4ppDoQ1KT-t!F*ddHD%yKishSr-!@xHK6ogGPW`Hgvvh& zs$PR^Ji<8HI1g%l%b?<~gUT}tsvbX>`~uW{;~yIr8sXNh7*w9oQ1RM9?bn`Aeg{E4 z*M>s*9}DGw8kGK0lW(x`cH<$ab)A47_y?5zgCpJbJO*VS4W(BH%5MuBziRWzQ0vdI z@hGU@NvA;hTLJaHvB~BSL+PJ}%Kxg#Z$s%99_8+<;!yERL&=|kieKC0t&H8F{Q02t z(o8<oI0kATOt<k`sQP6?<#hte?{%pCSLA(ny;Y$6y$H2`n%lS!R9;EOK_-94I1VbG z={EnFjn_e42fIvu0;;Z;pz3uK%C5v{SFa+}erN!--#Z)oLFGBb#veg_Z&?YI?>A6> zjv0T4iW4=)UFQQ(`9BR+|7uWnb)fcR6R7LDJJh;+n|vUYpOMC?#syG**4TK9jlYJ9 za~R6+X{h!83+3m5u`WwP)jt~Q`5Xf~!oIL3TnFXn64bh{L!G~p<J`P!LCrUS^3%rT zu_jN3x;`?X@*Hj)4^^jWP;nPS`TyGF7op<ZGL{;j*ZJ>e)Q0kt234QIQ0x29xCknr zjmBM2_5B_y-bpCCD^TaP&;&Qm6Hw>-MJRa(sQsA$^<F*{Y8~^T2d;#b;kQu!^G<Z- z_d&&}0#%RtHtuZnLDfGE>iPN(l>J9gc`vl_YU5U@eD>J<Nt6F>yk^Y*f$O&jRNOL9 z^{fe1$Bs~Of>80(q2djP(w}7Wi(oCrtDx3#-gpD5&i74n{du7L)r0cW4C;Nlv&n}T zM?u}+CqvbDHI$!SQ2viXU4NILzTXy@?9P{jva1ZWKU$l-zsZL|t!ti*Hye*b>EDLR z>!}aj^HddT-MygV2aJQEelMN?rN0Ww?>4CV9W&lAd8sL`|JqRb^)P0@+Ki{!`~fIG zf7|%MsqXWw7S!{kmvJzZpE*$Rw!$j#xXs@`&AoqCh041PtPcA?#hVCg!d+1Ix1r)b zKHYt8zW`O|-cWV!52Zf}DvvG3lTdnh&2aA%k3iL<vhf8d|4ohYQ2X*N8&84KUv12U zdVkmtb>2^!{HihEOjo}MRNTj*{8fRv?iw3kg}Pn`LHQX6weLQLx=${Js>^DqeY_Lu zJRgJ7y9g`6e_>tt)JHCRL*+XiN`C>=^|%Jg-+n0jQ&4)BY<wLmkGp5N@={Rwm$&ir zP<3ho<tNUVX7eL#JlVzzq2jNGikA(w-u+N<eub*X4XFAQo9*8JDnt3NW#i^h_8p-9 z9!O7<dyV~|){z1gZwOT0W1;-dw)yo?ezrsD9faCXC!p$m)8u!}ar1l#O79t{`*Ix{ zH-g$<9ijZCLghOc>OF4)l>U0Cb!I~4_r1w~fvV$0lNXxn=34^FUqxe0lh=p3?%SI@ z6)NAsHh$MQ9%?-^Y`hjK|4gWQ9E8>3DX9F4&2#6=K-H-Vl)O1~>J4?idP41=RGS|S zwVugP{^voh{|l36+xQ?<KBuAl<@wmnyD-%C^AJ>h%0fNAUx13=9?IX#Q2Rarwceq| z;ZXOLu~7Lfh4R1Mc+hwhD$ieye?#S)_Y;>78a+_;dDg}apzPW~)upG+r$OcOp3TpI z%5x!9{0%n09m?NNCckL>7pfll=DX`G17%+U%5Pn$xb30x>}B%-sQoe+D$Y#f0;qbe zfU?_Q<DF1`4?^jmw)sDx{NA+r!k@Z!WuW3$hVs`C%C05U?*v_-uFt_x>zV}hJe&_@ zcM!_&S>six^O=8vYxfw`e08Yv-4M!u7pQ&J$HwVUdT&FmXCjpU*-+opRzd0i2&MNI z)cbe7h3?p6d=_dQFG1Cz8C2dqpyDP$org3iKND<z4wU{EQ1P>&^bgwnQJcSH@;r;& z{0c+)e*$VhR)@M?TSDa#gz`5K%KzI?em{hYKNsr#V7bY+ntYGRe}wXL9?H*OP=4|( zcK5}@Q1jKH=Ih$HIn<x0b%2W33+ld=2o-mvaVk{)3!wDYLFr}L_zaZ)KcUXUHK;hA z&)oeH4dt&Jl)Nw0^_c>7{Y-?a_Y&hysQgbu{T}i!)P1wu5?9_9s(xOmyxxJ@2a}=p z)nceP+o0<GHI%=zQ2N)P_HCih-Mnf+<<l6-Z#-1I;ZW;Z26cZ~2jyoA)IR+N>b#tV z+IRmzT?a*$y7`oYidPq^Zmps0x|uu)%HQiY9t(9H&xWekCa87nH6DTTa~9Twm!a&- zFLUG7f%-ny4l0kJ@ogx7)1cO~5X#RNP<7jA^9P~wJppw-E*tM(?#e3}>q5=9hN@el zaX3`I3!w5_1uMbdpw7c1U%2&+hRVAGRJ?dt14eAT5Gv30P<dxU=^uphe;Uf)WvF!) zT;a++Q1WOfyC%lYQ2yee)*FC|I~2<A1gL%c3DkOaL)GUz)Oo)O75Ape3$AqMAAvew z9^*?;_C0O<I&|s|6>lNb`Cku}&pxR5-$SQPQ0sYQm3v)00~NQ4u_KiK-ca^~Z9E(* z&jnC<FNKP`9?IWND7)iO{%%9XExg*zs|?ipaaAb$R#5)CLh1K52B7?<+juP0^*aM9 z-fAen*-+~}Y~ypr8&G-=ta0mB8Y*5rsPong>ibA<D809!;*W>Q?<141gNn1m=6{6B z<5wH!UF*hw!03UBQw_>rJ(IV9T2Bv?_lNTP22}iUQ0tgw^UI+8Y&7nGs_QpUey%|2 z7g*=|DFvPV2o<*p^uUf#eo~BYLfvmhK-n*cdjHu5b)6l8y1)DZ<)^@USFafKFfI?3 zZ*wU9ZcuSkU==tD)`#n%?x)wF^ecSn@;Rt=H-&m$z6@2*G^p!h98|umq4c&w<#7n= zescoqI*8if?(fo2`=`3GE|kB<Q2D(ItHKPZJQhQp_w~>Nk3#vo1r_(Pjc&a1Q1|DW zP<8JPwJ!!i<uwsXe?C-x%Z;0$hw*M3Ux3Q*KV#laZXSi8uFq0X{;Qb0t+5wWUID0h zBcYz3GojA^La6h%8R~l654FDUO@7As4^%zw-R#ak31wH!#xYR$sSYOZ3$>ns#<!u? zIUdT-43n?6aVAuLN1^oofcpLBI#fOdwz&REK&_`NR9zdHJON5C)yBi1{EUOD+jOYk zg+7Mbr#qpZgFiyqoi|>Cs$+qzu3bf_e5*tGYi;ai^RZC*B-wa`%}+4SgikQP0O~ov z3#x7>pyFJH%CG1)mybf_^E6aFYe3bpIn;UX0#z43)IJ{wmETO8Ut{ClQ0MnF)IPlq ztH9Ek?!TvQ12vy&<B?ExSq`P233Z*Efzr#L<<36}6+ha>b)o9m#>Ty%^g~el{2d$5 zHm-)!-vd4HC#dss6KZ`=X1ns*P~&dKB&fUwL%j#hg<AI>sC>>q>Hh_#ckfs3_!+2m z)rYEU2PpkMP<aNS_Wj#X=V=twK3rn+TcFO<cTo0Mq2lJ>?vBeqou4W;t_yV^YiaUW zW61bA)cs@xRGd$s&i`7deX$kF-$9!{4xN2s@}fK3eOLx6P9>;y#6bD&4wYXjjD}-u zya7u8JE;0!GTwr!*Zn(Pc{Ql}X+x-bzG@6Z)$v`ZeK!Rv&L*h%hoP>6OHg$xyvxn= zQ7FA~Q0r;{rQZfhKMqQND0Hq@sC_>jN`D#Db-ocQ{s}05SD@B=-)=Y0ictIFMJWFX zQ0sid=0`)Ve-2dL*Fn{L50u_f=z$lZ^16SIyUxn6Hsg*^@kc<}O*ei9<!>X@I`-T6 zxQ#DEtt-!7cU^^{*7XFGpDNJVpHO-opw{0L>bwttdXA2_`9;Q6P=2=9crVob<uKHK z{v9f>tHuKR-2MF+)P8#jDqb@vKOLd+?+vy7Ae6uNjq{-LT@R(V8>*g1pzafwq2fLG zwd?O`DF4-LTo1~w1(cueHt#p4+WcUsxMN@y_zA28583=}<Nf>HIFCccsRUK8T2T3S zfyyt%=0`!*Wir%tJ`-x)o1yIXK;?hI<hPB554iiFBvjq%L)kTlT1OWsyS_F~xA~D! z>-`XF|IUYX;4UaX`477G_e14h1}d*gP<E}MuESTL_VXa)7^v&=V;ir9TIW8fe9l1m z`v=NT-f!IN<UuHTG*tf2+qemoUVEtDKYH7E6jYwmp#07=`AR51nZ|uk*W(XRd0v6q zzXcAteoGspq5RZ?I=^jTIT&yAqhM{u)1dM@02SvL)cHIIWq;4NE=xekD?;fvgSsDd zHhF(2`!O~@73#h<A8K8Dp!C0mIzN9x)&G(2T))pj>34y8&wUN*JkNuQw;IYW6Uxt7 zs5<8R-kmQBH7;Z0Dp2{?HF;|rzXFv{z~m9*+s27d@#aFsUkc@C8`OUO1}e@GD7|w~ z>%MC8JcnI*5#!@f_LZRSJ9VM_w1LW_Gt~XCm&uc%^i!eM`3_Xw=RnnGv&m0G)g#Xj zZXL@)U02PF2~hLzLD?;~@d2p1{|%*I{D>RpIjDWo3F`jW4{ClG)IOO9J@5!rUe}@W zD*mIJZ!Kd}sC9OOx=#F1_CulSwifF7w;fi7zd^^(PwsxM1+|}BLHX$e^;``@<ue<q z?pvVhwAXkH>iy?;sQe2ab^SgC<*y->U00~<C(g!iK=~PIoDNlo&)};t6RM6+9&_!R zLZ?np=e-})K8ZlpWjIuQKZeTpE2y|<pw9Ods5;z$vMY4ljb9o{|5+&ec2MVS0IUi> zH2DswIKM&pyZdL?-vdx~rES~*YTfOO@lf&7q3&nzL#Lj`El}(E*?1nx|5d2-blc>W zPq==bgQ{Cg8@~dpGY&$Xw>ePfe+ATiYB$unPe8@_!^YR4&VRv^Zk;MX&DVmuUp26C z0+fB&I239<<Dky_JgB;Cf{J?tYMqy%-c#;A<&LXD<<}TW-W4jpAyDUOGSs@~89#%{ zXBAYuEl_!U1Lgmu&0mG`ljj%r{kk}mT|HwnsC9O<aepX3ui1DcRQyRco@-oUTnlwR zGokDboBS-4-DMl!w)ujmUA>Y}^A(J>pzc30Q0K1&RGvMc_Ky#$j_*Omn`c}LrN0;I zdN>AUm-mbt=RPR?$Drz84L%E7m^>XSk1<gBPd6@t^0Ut7v!LP}FrI|czhdLOXWje9 zLr~|hHk98!#$>4TmjQJj7zX8U2GsL*2~@lvpzMCJ`9GoT^8V_c=R#0%OG7=6qM_`% zK<B;$r5}d!^BR=?aHx16LhY9Y#xJ4XFZS8^Je1unW1(}deF-Rec_=?Mq2e}y-C=vE z^Ry5u-fpNojzHO+g3|v3D$nas=jFcNTz^kO+0}rui-EFh1!dRW7zY(U2(^yEHl6@= z|D0#?jZpUcq5K}T@dc>;{vVW|;^$re6`=HM7#kSd*nAHg`=G9;u#Ja9`I!Wj=X|K= z=5m|gYTO5<_oMLwR9-is)=~I^%Q8@TR5#X#^4l89zMG8`Z9WCc&k!4rHO??DwE5Lg z_SsPJzJt2Yo`dpV;G!G%VW{yFHm(fi{{>@nsOL;K8wa8E-+-$BaN}H)Z-83Qb|^oG zjHhh=vW;&-=@q`@=2y~K8EQY&hq7-DrPmGW{u*!c!LS13F*d&j>O5!J{7IAl3AOKT z+4!N~T{{ny{}xc+W4c4FXQ0W)L)CA#jh92Mdka)PyKQ_JD&JE!z5wO-AE>(D{fBE; z5=#CwRGb<nZv&;*9m;PK)H()1#h(n7|EEy#H<)}ol>T8T`_nf6ugUZM>BcJprB?>Z zUu7G=2$gqBsC+s><(CX~-+dh_-V__pgVNg!<?jdM8K~>~3e^1||7F*%Jd|E_D8Kb> z+!pFQzGCAvsQdFUsCX-2CAbMHk8@DZxBOS!`*}%Ni*Yrm`2?uv$S|llBcawg)#Qty z@>>p-PbSp$ydSD=XQ1r=gQ`c=UoHzk?faroc~ykcuL%{W8C3kPP=3Qu=V>sM-3L(q z7DL&sgz~c;>bZ0fO8+;L--g<U1^;&aSA_EaJk)wRL;3aD_;skfM;kwYy1u7FJ&(SG z%Ih@L``cwG{SsGQe`TQNs~TT~`uiv?ZQKqj-=0wM6QG{AgP_jy45&J6g3{XywLcC+ zt?x3d1`Gb<#;Ip)0cF<}sxCgLyaz$WnPOZB_50v@DE;HcOHg^=G#32VtxIvJdRBqb zZ)EHURaY-menU(?4a(0#sCBJ|ihl%ZJ?Bk+73z2MQvbR3<)HRc1E~BvLhUCXl)u-E z!=aw@lc4mr!aDE}l>Y~=xp|f{R)os$d1FVYItQTg8v|wc1=RXBLdDwyweBBmd<klw zT!(sJD0<!1t7B{iW#1VpuQ;gvk!JE4P<|J~ns6;tT`rpZ7E~UEZn*oq7}P#31Ep6N z%Dy#JoR^J>Q2Syal-^h<z1dLrgC#cJ0ab@@q4N73YJcRt>FPged={#n^`P<@2&Mm) zaguR?@k^-lw$H{tL)l${s`D+V`>yAfTkn^k>K6;k!I4nwTn;P4y*9oEWnb*J%jcoi z*Tcq1Q0H$ntO}Rg_$1W6ygMqNvro!G)vE*4`RijG2<2}KRJ~?FU00t$-CvGDt>Y|g z2rt9hux6fo&cDA;g7Uin>UvrOrT-IDz0N}UzXnyGLV5E!=i_nc+<&0-Izz=vfU@ro z<@YtH^EcAupFsIrX54B#2<7h-)H-fM`6-+)pHuhZ@I}V8U?rFWb>2UMs_!Nn{|ps3 z>aKjwK6wD@zE;s#70T~(P<k=O4#qxE`#l7e$0Vrx-dr1h3Ke%H)Ors=`8jIy7og(( z2NfqOzdJ4jwZDtnxDu3oH5=D4HiU}X9Lm0njr&09CmYkC;tqyd{}?E{Wl(k-O}@kA zzd@a+f1sX^1@Ct48bH~_8beU$;dQ8eIR(n!2B<jOq4GEfwGS^tozDXI<a7SJf2E-G zIz#8aVVnV#?>4A-2W)%{R$zP)s;<TEb^X<birdV_9ii@HaZr8-LB;vV=C>FRK;0is zLdCfOm2ZIpu3b^6@$*pUqal>u%TV$9LghICs$N5&&i_OkPl3`~45hak>U?KI)oYK< z|6#li<^S%2?)n~rs&5S_KkcCID?MyH2x?u!pz8VwbmG{2Hq`sjeyF%ng<L=PK%I}G zP<9oe>Qx77o$a8m!vv`BcW;?|7E~T<px&dlL7j*1pz3%PDxV^S-Fj4qx-T_>iW6^) zK&|s#sC*|H=i2;oD1Y0a^nQZQK7v~RWvIAC?sM&{LgiH-%C4m`9_qgPrg1)0J@!G> z^_H>J{jT5I(78WB#Z7>Un`+}XY&;Umej-%7rBLhG31xQ}D$mm<&-Z}qw<y$nS*Utf zw{bIAm2qdNb-ZKpaZq|Qq3ZVq)VedF&dVw2fl)==_)kFPTNTRB3sC#NvCa20rbFd1 z9BLhtY`omK$+#QJ&ta&#oHF@UW4;I7^%sGPTM0_9hOsHs`F|N|9fP3WZ$?A;od>1= zIaEGdjr(98#yM?Jez(`}9^Q3qVyFH9*4pEIX}%Yoy*L?W^7iQdsFy98hvR+hn!%X7 z{Eo?-+DG)q&_7y$cL<A7g}&NtPH0c&)t-d|I8wQ|Pa^*aSrr!i6!DI+kVKBjTwpVZ z_mXp=@eD&}i1~U$POMEM&UJEp!E(zW{<(bQh^!6$DVE0@#LB?tamMwCQ(pzk)m|e0 ze0=n@dVC4LvwTmX&;RSyJMC%w-(zzUerY+@gx?Y8ReXO=><i3&uNxTcKi1hB?uHv# zM{(vm<nnn5+sWim51qcYmWr$)C6|u;<iqY=VmD;2BED{*JBNJK$}l>&H65udQz+ z^KTMw0`irty*%Uf=>E*OFnXhj*&bgXnGa{<F~1La8+7K%G3{<_^RX||h#5`%UD(dB z+<r&zAJ+LJ$GgZD6T6Vr{WWyAu(qby?d5o$T-K21ar~>@M(=0(oss{`F&^9d@bQj2 z9krFbo@BfXn-__*o&3k(rx&tW=yoIboc0j9cM<OixRLomFdCh_^q=C;weCZIIlj~e zz%%$djbF8n=%`ge_9L=sa6EjA{7w^h1-{;aH(Ad$*1Cq{9sI4vt}g3%7Jq%wUC+1~ zvCq-J#PJYydyo059BMn6|D2;2esZ^lHb}#!DfT|}FA-w_ez%}snE1!xXy$$<j}NF< z3v!%--5ic*@HfNO@)hH4%;&U!(R)#~qdv><KMJ2~(f83;8^So~cAd{}{!ebFh`p42 z-ZP!ua2EdlHNE1*{T*NZ(NlYvJk@p*Pwh1Rr&+8z<Pt-_26O-5;}||hxoS~gGX9Y` z0giLI&h3Zjzk%I8{4Qcn?Ir3^hW@MO_b4%@6aOCkU1jav(M`2{Ix+4^E%}NUwb3<? z8in2x<O4Z+FxQhcJWKrT_<0=PA7fh|{qh{s@%44Cd@5p-j-J{C%O{;Yu4AY60duL? z#nJaN|Dx$G#mA5IN5W0W8=&))*-s&#g~VTs54|_2<s;5BtUIT*CPo4BoNqSc@wFKr zf1`JXIex-)+J5}Jfb4DZ_Op(m=$&MZO>!K;n#{e8pP~5cNB=PK<IsH$A1`66mOw7$ z;A7bTjZd|2Ek>s0^@i4jtTBG((eI4S0FJ*o*5Usec8}mYr)8r1w%I;RoMyyU>q!3_ z;_Qam9RJ{JB|fjw_i)VS$Yc#_RhXNE&lmBvivC}${XUM#_&SG=armD|?2YJuifkwS zavbk5*8{uL*r;8^r&@LV{L9?e^t)m68@~Eci(bTkm37QS|1)H2k0Wo+n!2J_6<=O# zOIuz$i5rdV8mx`oYp#j&In(N=!Jqh0>t}TsO>XUpb((Pr>>nZL0Djk7o;&bAo%w>y zzefKS_AkNj$=QS6b?jR*-;<aV@H>|IQ|S7cf0FqWTW1gSmNHis+hfFdkomXie}L^m zbpF78D*E#|CLvpDYu-v<Eel<>48|Xj+Yo$wglss+gWTsv!W3eBg5Q^+&sC4=h#wEK z-0eL1m1M1#$>$2XYVTqHI(qY&JBsYA+04fNJ9O7`v_pR)aYvx5_A&h$^#7v2iM(gQ znb@oKCCAxL&;95I7Lj|5$!>B^HelbMqn*{dFa8e@C#TiM*I{z0OD>(z8IFA{`HaVA zDK-0?{x+-6KNw9!RvcL|%RzpAuyyprcTRg5nci#jT3pG$!{<WNEe%I7F3p<$CZDS4 zZNhg4jz%24@bxRQ#+<XStrj`HcUwLhzm+QwjoY!7Z;&NHwKnnxXW;98@_rM4`;n=o zP@k5>*^h2-j#rRB&2bF9R^-=+{L~H^)jx*sSaQCXL+xXHG`GIS`#2^NV<A4&e#5pL zvDaD7Yb>v>R;zaCyo%2_eDuYx5pnm!+$};*<&fP#Z!LC(%~v68zD9P!>T{Ahb|BVG zWb4rHjFX=DJA&M&c*v(PU((k9Gol}m&9X7WsCD>E;HXQC^_FWgI$e-`%9>Kq-GJT+ zj-L3<W9y71hu?{n&G8tqt1zc_mim;z{x#wrHr+B@OMfu_j^iwOeFLvxa|Hg2&2RWB zU~4Ky4*jv4&Uh+w-H87HvH|$-g8o;;Q@cc*&B%UczIm?mRT<qc(VL+B&<WtH7&bp( z^DOdj(XEZ_L-f92jlVN~mANv^RUx;k=srWfP2fe=k<-G=&0}1Ryw&RCJEz^FILtT4 z?>g-En$AF&guI`fzpli{K(`>d9kqIWW9MQG@(I{~&!JX{Sbnz~^{B;KfxQpASeVm( zA^(y1&ri<Z5bFnyTjt}0#W;kof~;39g?Y98R<qx2{0T88Qja&?>8Qb$*Nt4UiZRb0 z>qUJ?{xw-=dE!>$n9Vvr!T(*@{D}T&%eR8Xe3<z65$8|FWzl_^7z4?%9mg2*$d3<8 zH7W_eYG*C}KRFYwIBG5SwbA!-lp~jKY^^h~%OG|c?3NLquZd9?kZmBgT7UXAvB}+b znQd$I8xp4)`2|^<T3&Q_BVT}@O#JpC)^hr4&!U^b_yB8agw4MkL(v&U>`TZ-FvnjP zaN47c@1uVUokRG0$MUI->?d;Sk5+SHJ&ey}V&~!b6TO1SUPWgfcI~iP&-im<sNKuC z9z*WCkg4(0byPBO{%`w*e72a)I{2^k&k&;;bA5<&kophBa5cwE_z5un9la-+=ckmY zAr|9vqhgdM{*(B42-$k_n1jtun-9ZBINoJGr!}UNk9DZsHoei<s1;$|D>&53;A=Sj zr%m?&;|9o|C(owHU<vTuwbkakN42pv4)SD_&*vR+xX(qkh45lf@XqnmV8x!}{js zs@VYan<E>Ker1k=)Sy1Hp742W`Qy&0X6TP2ryp3uYR=tsWM1+ZhJIb<R@(k}4cXn; zmd0)pvKHt^Y)z;}^|AACmvY39+S|tUtTmY!`SINrxgX|7Z!k8^$nSl|x!Y^VDx=R| zt8m&G#%h%rPeeY<;$Fl40J$7y{$*SDZ{+tG{Q~5hyX{4HEw(wW8u>Rgzd5o$$hR?h z{e}Os9B)$7Elge{M!{UVoALbzz78{A!s1TDpIU2j%w#Sen<B*Qj-ReJR~5S<%8zj^ z`itr3w4czQjQlY2Q^eXs%|2w@i7|g%7j?~Q`4@bUIkmjVpJcufc~oHkK2HBx)t~k! z$5!UmKE}6N1N2IfQ||UWI-7C{Hkj_a<kp+Dg<)T-cURN<&wMPkSP~bt+Ezk;IytUG zww(EYSVKj8o+kF)xoRkz50LSbWYnYhdqM)*b=I(qxIba{IpnWGIjt3bKXAKIw=C|P z#N0rv$@nPG+->So5uYt>eg`%)@R7iH2C<KDyvn><m^BS!egSh{*wEsvM*b-N-bZJZ z$$H}VCGrWA=QOMREqwW~UC2?5JjPi~`r@k!G0NJw81o(Q`62$=k!u*=x6mob@i6C1 zZ6C6}_*WZ?-72@Me`XbxjjyrPq_fTUMs^%O1<B)Ie6M0Yh%dDz%*7y|@PF#;&bpsJ zf!_GbX>a4Vr|H*$&sdxz_<GIyB`nX6v3r|(UL)SK<b0M~7vX3(`Sio~LB{du++gl$ z^o}w92|w}7mB`sc<QG7HE;?%a$p0uh*K91=FZ4&Uww~1WbL@&@Ka)dk8Tu`--;Ir0 zGDlbP`PdopPRE>DH*Eh#H!oCs6`djU^N^F;@65eQj4`Zn8hy1I<X(XJU+}S<Jo}sO zd2HW8w<zNqtg8&;b(YUiY&Ro6PCiG-JKo~ALB7=d?tyO-XOz|RLG05w4p~hU`#$Ds z;`;%M*_wEB@O2TrbEbEk`J6V)`U5P+4)nhu=bX0PV&#m*zpyDn-fPjlLVuLS+G=Z& z&Pt9k%+;V)Pn*B_`1%mpF7oJ%ycqkTKK%rA|3xRnTu!Tnd<J!_Mc&2G-9}wLCeB3G zlE?H`BX7$1ZgT(CWO?!VBlVj`Zf`KB_BOT^VM{yLD~)T=`yBtf;W6gl!OwB{Rjzfs zOI{mneM~tm3)!FO%w|37u<1n}Q^_@(*^Bh2;D0?n4>Nur+fC#$lJ)E)$4{|c%JCHT z>#gQf$zd@1&R=2!_gcI{=*`04_vm&&eo#8Jc>JlAhV8K3fX+!<(+|X{&bYVo!%tqA zyA8)j502gB@-X?Q;$uI#t5sn9zV$WkhTiG_W1oOd5ArHU?iGo%g&Kd0Y%F^3TD`|< z&aU-ECX>G{=&Aijj@kJBn4CK@-yQwB?o`x^%&E1^m50V}A%6q?L*)GtIXA^u7puc8 zi_sFD68QbUtvj+>*xsgA1F&02UFNceEA;o7?GD>NPoQ^!bq!_yMI4o2z5#kKk<UZe z=d?#y-y^K~bB>+lf0yO^GCGHd_mTNMNvze#3d$!s74X{&Cc?t#wB~q(W2xm`06n!@ z@E&~sPQNw&)k63h!WtW4tF{S0^{`EVC1LLNJ^s?o=X==QWDU<yuW`ug;rlOS$MGM8 z9WlHFyHkT_i1j%A*I_SoL*$->-v86=97%SF`A>-74IabhJ9LZE{~Fsr@$)|8hw=M_ z)%R`Y)|#`gu-i&b6)g9CjC*iAX6s!<|8eFXC*OCmFNxhAt%<edv?AE|uzm0rc569* z6VQ2%eh2FGCAL+WKab5@_}YgofZq=2jIcURW<5XInwnw1#p35B<~r=vUd8@(=4x52 z2FO1{Z;|=vO#fy4sx3yRGUHy%4a7z*KjX7DukpS3=C8v#Z6r1M!tF+_B2GZ(1pRy9 z6l_XS!{?YEZn-Q%U+o3Px6nJzS~BRD(?RTOtR)XN(;3g_P<!0+9%btsNN%rDkEyUD zan!olIZ{8!+|R^*A1)xL&*{%2RwWL#1I9PWWf-xxGJewhX#Q>DuEh62TjP7^y{mI) z?O*0gnGcED<3Eg_%g84~wa?LSf{*do`e1+ZSV;e@`6-3(lH|-^V~t8OUw;`p**fK? zRnGe8KaKAF_$iHSCARNaEa^?MTtA~<!|dNAZj#9pkv~9x3HG^LWBlySwf2hGKE-&b z`Th?5=c)hQ_<9W8?^tUu<`$FdOvWc!&vWK8A3DpCseNnYuah`!3$;0kUK>X5VLzQ( zsMUid@ww3Ql#D-Wjw)pF=W`C#9>)Gd^m4Zg=<vtkQMYY>Xl@HS_bNa1e<6ntZEZ&x zuOR1tn0pZYb>?d{IvcIOmRRqT;|^+YH~Hk8hS$jP1N6SKwKQg&Vdv^)*8D!>$KZT? zcY@LQ_=>m-aS$ff>-7Iaei-`?(J93JH$blUkW)NzwG@2($+$B7++@q}GmAJ65W5w2 zYSlTOc6z*{qwB@zJLLT~F}7l_HVxfT$`{*t__~{Z0d&>&F}KGS)&aXmm>*1zozUHl z{YtCF6pJUDy7Z5u_bK{4s7tKn7a`^~Y<rXECh~a7&f#R@wItr(P^}SuZ_^K<r?vw> zXUSn0wy$x#X?C0O`y6An<LD+?oEhjpjlcWIQSCDMBoKQw^WDj}67w%3dy)QebOz%4 zF?)uWu=UiJ9=2t$>4fi^w!R>F6);`LIUjNO`+@b8M#qD%XpXPxKacJo=C1*=Omy$Z zwlV!n=r6`^8jM)pg)QG}*iE&5PK*)w8P6IzvG!`_b0L%Gv3=Nd+gn{euzA@&X6Lve zG1cbc<6-h`N`9qnPV$oEv6{GP_&d+|48De9b5xVGPdQ@I`O$37QunU-XoJ76E$&my zUBJg$i~kSf_weW8Tx@2oi^%g`s8*ahJjL8-a%qHpYi#mbjyK^xWEHXd7yVwuP^*Ky zHa1!AFzO5ZpGB`feovrxnPZ~O#ao=K=wCwCnq1XhWxT`f@^_Z31BO_?0zT8}-wm&G zG-S=C$m3PZO%`Vu=Wey}J<H-%pud>4<i|F5`-FNeB+t3#=P3PJX7hrv7i&2~>=0D@ zjoQ4#IEYP2>a~@Amf1JOJ_@}=Y?t6WiJWerUlW~F%dfQgm9N^Imq8r0?Rt?+?G@Jd zsntf~!T4-yI>nJ6Al}E&i)<$SS?G7ekJ^98Bgo^3_ZR&a>DSM-?i2I}qx&zpZY8&N z<fe9=yyh_X8L_@MUwQFS2H*U({-|NLe_U<er|=zXIVEG;9)DxeZN$Dv!SDC*5XT~9 zZ<6B&_!@+9J^U=f_9i~p!otdt<8NYjWbOrY7h~U*{&<VonQ=~g)Yj4&d$pSA_k^Y4 zWpenE{yXG<hVkq8RqJ9l?ugu&Q|m--S?GKN8`xSTUz_V3?I4HwI<MAZ$YlUF?Kvjl zw*t1K$YmDmyG1_{-M6i#FEc-peh<rkh5RzEPhBoqjBIjULq8ApYEPrfU$2guh0br} zxtRU~%qNluf6Xz<!!dzelhNzT+<9Wu!RHIebJ~9788%)@Kiww0#Og<Wf51If+dWzb z{h!fOOC?r$_Vt^@D1q<0iE{?oFX(&&zd`;i{r((3&|k*U3fqwuuP^!^p?3q@D#+I0 zb1Q564&Fds71<E_YJ;s#?udIGbBD0M58uO~*XA2ji@&Kw6835<$axJur`mWvvMJbZ zWW0r3mZ3k8eh9r(?2?&N>#98QtM(hdt5b&^=*(ok0{(6h_YiZBv8L7dh~T3yvZ1V{ zCP#7PIW0f>Ijz6#CymFV_X{=NMSm#qe8ii=IH&C(R$XkrMNjQ{<^~dLF1ZY(--f&@ zxKmO0qSu9S4RZY1;;oY{^G}dV1@w=S<7BJTW_&!P+Trgza_YkI9`T;$e8!l)Tpu8> zlguTd`zZEmTd-Bjwl&5wo}&X_7m#&B_Z3@5UgFg!r&j2nqraWGEOcJRS1Z<akTst` zUc-FPg;j06iZLAhyYX8BALAsTwM9Rtl|=t}=674pZ=v^~`Fa7{bI6Ocu65+s2fsg) zS3)lTRq!<$XYX>ngdeqIcHZ~kCm!9#=zL%?XXCRX`S(HR9;?Hz*t|}R)6}UF`nMQg zArG}zkX59Ha`^<d4>5m`eqVfCA-6fqsg*?U8~R_tchU2sSB1V>3-fh|e2S4rn4>aB z8)DYO=1ufJM*k<ci}h8)cTQ`<no`mG)7B(;5Au#Db}atNahyW71N$@Re9BnuBsyO( zu8#e$#6N-0)y&Pnf2QRly;x%Y&2f&oH^?awoA1%R2bo%1;;8k89f<LN+XL*kGYCmB zDw?A+YhHu@cRAj&Tx3%Oy(P@u#c`7H9LwPWVygMcvpKAS&0bso6ys;`3UxZhp|+1) z8e@Ng9A~ng*7$r9*$t@n3&&`S9fbE2qaSnc(Lax``NaC!beF-Oku|ryAp5NxZCOxN z^tYm`R){z`Z5K5vYW^iVVZQc~gW8j<HAsG~$gd`L-w?kD{S9yfb|diZLB7rGIxtt# z{HGA_Yx8}H`D}c?!FUjSh4l}@Z*TIw%v=C}^Hq4-C)jUh?o;d^!QVhv?0ha^tX6<E z-psYmi`Z0P+$5K5KXInv^CvhS_T!u%#b-ry1`x9xzGjfeTgV<H-fDboMOMjt{79Ui zsm~U4_4lRKu9L4?Bg;d7Z~bG|RG0i0;lDgSqVe^K?XT7N-)%OIAs>a&UBXeFywsj2 zw<oY$j*TDr6=JH5BW^0PZ<$ZA{qi!Ljjq~Q;yy(lA&waO`Anxe_AfARYEi{lUlaU9 z<9og3{U!QuJ6>2X{(r^hSDSkhJ+%Z_8z<E`9>PaXn`UvIK~RlaeGePjdS77N5?`6N zwo>Nv7B-vkH;1Dnx@(YMq%Jqj?_zwsV>XYX8^VVdy-&&Q7<E`l4r7rAkqyLdj`_U{ z`*X~FLfqEa|Ao92HXAqxU!&W>&Sg8+TY?y`AWLL^G<MH$G-IsR68(IPn_$mBXN-Ca zot$<6`5@%mVL`5kICQ75j_!;rqZd#7|4hFbIkcdE2$@<Q`ah!=i+mhw%4sQd`ZKqZ z_|M|6BmTa@CIP+8=1aQ2GFBUbj@qNFJ+Jxs1KGXwFJK!X=a$(0!8+BtQnMHFH^Rm# z@GJCAA$tzJd*B#!KHzwn{M5?WK25{tO~%8}|BZD&K#nJ<<1VY^GuV_z_b>cB$J{?A zuVMDT;ctxj{DC-Xotc}3FSV=Wl81bo*xd8T%jK#K|7<bp1@u2;?a{<&MSq2zr-N3H zbZkoyBirK0Z!w!wU#%{4cU#P_uwTjilf*g6y1rw48=ZRSJb=zMV!lpZSCMZ-wubR2 z;*Mag_o81O9i`B~)*7SS=?_OQ4|`%KzRw~$XY<wZrBl`ry&=fT=F06S#`W;I5r;kO zysn2GS*zMiY>%RoMjpQq|9fKOw3FmNoV-?<zmeGan6E?*_oKhX{H>wCm;TvYaqE*y z0<uS8h*%rR;a;nchj?EQt1LW)%_G?7v^>PDX?h39Z9ef|#(osXVaE4kQzb_k-jD91 z*ql<qXl;r25wX;|SU&l%c^bX4<Wm?vhkP!2+d2NkXI)}+VeTH*bp>1f`@VzZbcJII z^RE$m4!Wzb&1u^#hQ>2<){V}tT=l!a8r523-vmFiiPH+56Q;9~yw$=+^_LT~4ti<} z(0dHu&slwz;76??vER17#`A3LgYcb<?Pcbb-WwLb0<v+$&uRD2uV*oyM`w|2ET{jN zJ50Qz=6?&0I+5QkxCr?m_!)KRgH1434nI=A0*vdJpC{0L#p;rdtQ@sftIE01zpt7A zmoi@nU+d|&wfy=p_Xoaz!TvUOU!hZg@ixXq(NmMFsl=PY_!Ih{F}FZ@Qiq!4&=kA2 z*r+L;s(f5RU(JI&!~6uX8G`L;Y^Jit6&y{`NyN`8tEp_}V)FxfYNgQmHP@VEv8o|H zH&Op;#41kzRn!08*0mBJGtlcpthX$_Y<-M(kVh5#zKs1x=v;+$In?xTqjFk3WIy7k zi55jW$(ovA{|)^D*hQ%2fB4QOzpLo|1oL7ujT-JEpC7CS!-%E!6t+pWmUNqwe2>Yd zBP);2?{GJM2H-mpzppVr5q~e>SFH>F%CgQU$zeRXeSpmn_zvSV%k{}zYi@?^1^n$Z z*$UT9)a&T0-Ea|=hq}xoMsbd2#JHdN2FP+Q!x~oO#^mz{{@S1yWU`>G?;`$_$vwgR zF0*{=7$3ry+B>%13wEv~`_Y1oK)0LOzd#JNt&A_4ZV7xm%y9*IQRdT4cY*nQ9Y3#< zLn-v5>9<2?HB7~3JGx!T^$6p?scU)5doKDlEXT6U?M3fbYC6#BRg#)+XZ#8=yTT{X z^`rAKzQ47a)G{jH(%2P+r_gPRUT1vfv;cWML9X?41lY|cx4ZGVi#*h}(+^<#pv5mu zU+o~aJ<vae&u6V3)zE#3waiC%kLka{x>9q+Y=C_xHa}U8<7|(_k^ge~`H8Q#5WNNH zeT3~K(|wXSmC*SP-yPvS#L8(c7*|5?RpM>K<{@-i;LC?!wHSQeGCz-#r`i}|tiy+g z8hm2w{UTScJ?VEs_iK))@S6yy+PeN>?k?=|;r~y3%r>8Gk?pi|Ig=Py$tw+>LFW*2 zW6)cUjn{OP#}nk~;l@_Y)}BEwb;#`<4z<nLO~kGfv74du499=SuaZL;)?r>Pne`Q+ zMqiun+l<fJ+*#x`khie0YvF!gL-q^vFERfx`KtYsD?g1NqJD4UZxFgW$?r>Ie`xiu zjl8|(D&6;4-%;i^V59aW`u8wj2)+8O<3rPZjQP#X7q*z6nS7(wIEz?o@%1@J1LAFi zYKiz+;&$(RPNFvpe}^saH_gX6d>15_I%Zpt@z<93D&qZtO>1n2;J-M2w-Ylz{oL&g zdUI?olGn7!Q}`KyO%Z%g#V(r~s<ndEn43(j1k2+s)?F9BG00D%`xbgx*ygmx_$W+_ zZ#lPlurH3SS~0UvM|Ky-1FUa6I<as+bMN8r1JivPzt3~DL-q`FUvZSdFaKE|r#<Q- zsw46=ThCy8R^%99xx{j=-ogG9{*Rc>5^`UFO#$ZAZc>jK#8De=GIzwi3SSq=FQ@HC zZ;Xu#kjG*AP4T5xn*QU+1`=yMyf2sChm6NEzCg{+p_@idY74P#Mhs7`b5w(Twvl6P z<|Fv}1G`?VJDUCs$IAWq4ZDNnvme&SrYJuB9Cx9o_BHG6K-}`I=`onoD&g-KHYpaf z5dAacaUa+06#Tu<Q5l;n#8fMfpKkb!#&;UJJF!22ygssLnVW94{s@~Vk$*xiBk}Pf zhuVFt<pQ!VIC9!k=KFd4ts!;>I%*}XF6tM>_g?h6o1Z?G@6+f!g0D-k7dpMkW4R1y z@8GX9`NYz{2y0o)71$P{zl=KU;TTN3IQ(W<yt>TgHC_4fu*SvMKZo6R^lKAGt%#j# z^<P8hFmr0d@bv>ee=>hBAa9RNA6r*tJ16^X-2r0@_!oZE?t&qcyApgNdyKlikFTQm z7=+)3R);N?Z(U@^(D@yCGxVAxugW+o*Lv!bUn9nMng8qLbrXM+&~M8+AH%j7CNnHw z#b3o-Db_mzy$H5vv0bNJ@jZ{2{jgIT1OwPbGe4d2J=m3F{DsYj80WNd%8NFWeEzlk zmLv1$id%{Cv&0=|vWJNO0KStMXW;88I|o1DBhGy1vAWCmm*{Rqr<lc(Ol<+<&CIEt z##cOCz__Eu`H8iyLWeCBRh|C#9AD<Dq3qOVv39jK#Q&D~Z7iRU;CJX}{vVsc=&4np z#(QBS0{mz;k{=-ESn}VFtOw&D{YS9zqhF1+PeYc6eok9LUH>zm!-(}T<JMN|W~}F4 z{1-I;1JJ9ZyjaWAT9~!ph`E#gL&Pe=oZ3H@cX!sem~~ahS6nU|=?r7;Ppj7^a@#=v zevUuQwqdUGP@DOjHX6I3%(W+<h~-w5xRr>L$Z?4IW~}j~*)KsShVf_Qsdm(IY-#Im z%iJdVw~0F&Teacnd_*1QGXCB2c^%m#eDvpNV7|Vzyvky8m+8rVCAKTbWe@W;7%yb) zlZkVL{`>gpz<49`YEAG}o&IQ8(sGmhKWfny`_DKgaa6`<KdYDK%dxH%=+~luH}~7C z%unS|tB0>s<o+b<x}UuA5nC<9xDV%Iw#9a(tQ~n%9oV<Q?l0o>#`pcionSFvwDoPW znxD5=_u{W6Hm#9Al`B8_ekmt_u^a1t5<io$dBAipz`L;RNlw3WY{Ksio7-!#ieZ;& zwMj#kZT)%px{B}P=-<ZYOgrbFFz$hk+I_6yhMg~sOQLhd^p+Fv2zF|FI0{pP$FTbh z`v;L<=jes~0OBo2R*3njR=dKs{xG#|i|jYYi~F(I@~ePODXZHp%cnB=cei|=gLCme z7#}V0ueKJO7dbjG9*XU2=*KYbh<z#Yeg)s3Q14n6qa`^Oz(-DdmK?h?7ea8;)|mv` zaD0c}Kw>3h-=Cu^veJyp5aT*?pCX%0zd!a9IBL;<o#PmJw171@uA=u0dOzE`6!(6{ zpHYLQmc&7;(R1kMv?Jv8H0$tkq~c>4YY!1)B(^!NDB~>Vsxwy<`4akS57IwCp80G& ziOk>R_!9p=!Ee!9gwAPVbg??0xAVH1d9@?>{)qYQ?l9^o{?f_is;#3s<1yGQfNEvA zrqsS?T$ppQhS>jbTz17#Gl`eaY>%5wg2imY`d5)#UyEItoW8|}7u&nw8_4^^N#t~Z z<5%?k$iBv=IKHkjr}hhThmpO4Y%%k_@n0O>Ld?GgyW@8+YmY;(5PF~3+9Ry<S7g7F zV{2qT!2PVX8~JZzZW6kMu*-*^Q^@PFj!~Ao;<m*0Z#V(FBk0XXuQEBji*0p$sC|TN z7kX+FnTyAd+8*W~hHvEBA8nXVC*}@vc?X}n$zAPr{LN*qImaW+=jSME{!6<mQTecW zlN{>6Qk;`#=>JXsDf<7B^JQ$8p}Ut{=9#TbpECRAmY0SP6E~jt+1R{+?tdIh>Hk6= zVO#$=a!~ske@_rgZ4mquy_`0d@ihE~u>Tdi5!kCeh|UW9CvvEr##aUUw>fv^@Hd*8 zy@ISIb5p6$z1SUMPHhCo2aLDd8Y-fHFjve8mWy;((I3Fv5p;($&V+IJyFgAKv&K2Z z$%n6+jAxm@e)uav-PFEP4bYp5P9f&~$h$G$&T{#Tek!)l;Bz>7-*7a+=V;a%fy3Z4 z==Q+A82!QcyiHEU>5oUY4Lh|g;@rh~x*y#~@bQJ^vJ;&+>sNs{IO15(EAU7BU$V81 zWBi`gU<bY)!GBJBi2f4%l)~@N)HKWVzGQrm{MBB^*C_gZ(e;{bA9A_Q@fh=`m@8(v zN`C>z=N$Wqe-)pPl6!e#OvH92vbFgBm7Mlao1(-k%iMH)d`@l!;3do9JpS7vQ|p7D zVbr%RvOgHV!C39Q#T|?9Z!Nd7*tB47Ir`5-KRUbcIe}v~@gFBfVRAZ%ukqxfHkUO% zf$USpofx<0D2`qO^qb@NGOUiDdd$Cv|MJ9thP?Zt_cwE`(0z_$8{<9rQp-d>0=)&S zbD+ttk&_>PS;(WYS8I%(+IaH0OkI9sZXV-wvk4$qTSorhBiqRFE&cNNeUN;5F*g#M z7>;+5<!(*zHyHnER+~EXKSeLUty{X6@iz#)eI`4P&U%h7EdGnqXWY)t#lzI$3D%*u zmNly#L?;~|YAuWtkyRz`5{`88ZEyaHSe%bF=Gcbs=Qz~Pp_kJ}(l1D?am4ru9|`F6 zre@ditM)iK95B1*jYY`Ohh0PFJ~dwtA$x)O=ZJeBwH#u#_?CWq^YtO~%ZR1c9KHRp z5Bv*1Dag~%oy59YT74U0*MQuwp*Nj4zuVecU~><?R$x;N-OKO+Z11BV$8o>Kej8ay z^R*3Mb?A>ZA6HmoDUL76`v`Np@NqYJ)UaABN45O;xSP3XY@0Hd<cg!ppsTjeIE8$Q za3rBS8F@B-Z;(etWZgN`zQEUbWUK7lh0#&lXuQc>dt$sVAK1Kwd<{8fF;=@DyZXe7 zpf{OAt&R)+J9V57Y^GD2G01kY&cXE6s=0{Dv|Mc%^&k43@Hv$A|7I~X*9W~v$u)^J zzt7woR<rz8OD}WX$n5~OFEO9Vk<+?xp1!g;9f@DwY{y{p2mS5vQQI@qEoM7-*lKbw zeB9P{leK%y*EDi1L(G0058)#j-!a(T2Yu*lz$OdElgl{f8^OlJDS^BcHGLdeD`ea7 zUj-j({ai$4k=F;vYY}4<F*C61jI1;I{Vc}~^gqPU0Blx4wMU7ag8vivR(qY}ven2D z@Uax1YNt8k(LaaoW2Up&=4#=igyr-ean$D6x{sr~k7F-+bw~aWKAM}|7p5!yN3d^B z&Rxj&I^%g}f1O+>U|*E`ZXRsaF2c^p+hRYDeCokXrvDOiU(kQW#$CuQr@erm?!-`Q zKws^c)k6Jqb`I6g-JZbbWb})$hBIcDLjSA(Kl(+<KN+7xiPOsReZ_44hJTXJ)46g| zoKMkh%=$Oy@^=w=d&cMSvA}W;6I1OyV-)i<?EI#>Q_g>bu?2B9V^_=0>j}nhU^9=p zznm*ZBlBAp`6JlxwR5<X+I2;LBfhWN8hrTbZLv<{V_L3rcLe>5_*lrk``dgdohyt# zA@&ZAv6i1O9NQO(9myrTg?-R$j}vpJ#p;div()Q6HnlC^y!ibB*-CQy6rvLKE;gf) zKS<tX?VO&FkMd0--l&G<y+J;`NlBS=!!VrSjYKt!^@ZbozM!X(KQ;Z%C?(M!_A&CK zAL~!%BPr3F;f%r(g(DdmA(%bO7Y+s0S?uYt=TmPiF5-NNd?W?@!4x<k;!X3XVG}2Z z@t(%s0p7$w*5Y(8TJhdwZ%CP`Gti+jjPDmo_6GfQ!d?=M&sv_&JYo8#hk{Aous6}4 zqKO1=yf4FnKOEg6-W%O665W|K28op54fqngo)#$qZ!n%j5(1&1H^mbSrForU*q`7F zrm}{Fh&Lt98}KvoNiUM(4SM2z0Z-ddI8~1B2s%ZGndlAh5%I<)di!V2At!%aBANOV zywU#XfRFeZ1$<Q2PYDtN-v0bggGdse$-aQ!uZ}E(-Y^OH!;VRcvi1*@AR{U4jU)wp z|4Y}O(LX|Zchc|Y4eMm|iw~t`&&e8%r>KTW{#1RkUOt0ai&JtNBvCLgCnsqjHHi&z zMgyLP15>=&^VEy+o>;pu?C~O_ldRezj9`(Rwb<=v&kJS^#dE;Z)Egd1*G{3v>FL>v z9gj^T{k-X%9;r1;^oC>aC^hFibE*QK=Ak%W=F(&`4RCUjI62<%9j%t$SZ}~dBPsF3 z+VO54cZB9qmMy)(?8SJ`-FJ4BrUv$P#F4(1Nz1Io8E#IkC<4U~cv>ZT2ZlY=!W*CH zX`JXyO3Yep+O6)`wejL%fYjS~6K%GQH{8#aga>$I-5w<yn6)_78Tf<gSwpRty}0k4 zm9>eW<qey^4&DGI`(JfBc(Z3^xh3q7HI!@5O}Cqujo=isTO=iWUgjJ*?v^z)K5Max z)Y3~QUa}Kw7ewN{>G7`e$sto3lH8p^){yL3{$yu})G56;A>?JV2fY0vzJSh!ms0^^ z-H$k*c0MC^On@7NHWu5FD<j_7cYy?-wus-;$s6m}<sR_IhQe(80N0UblD)c_1d@H> z%q6l7^~-hb1^W9^qA8?5mCHd{XdLg0Zti7|N4F1$(tN=<#ZQR@6LQ<7dOclzVQ+u0 zc2a7{)1K4G<*P_G3OY5)UYx|$^uMbm*_-SvC0UnjRKsL%N;*lAV=m{(-VEI!5c|UZ zIBo%*yvZSH1-+@BM(pK~kKLaf3Sh+wlOs+c02g}D)6DM;CeWe2Oa_Uk+hj1#n?iAd zad-yt-asVIsRv!|XCBJwY3q**Vf4QnRWP2t=4l`1-sTv``}^q*8;lRJdprS^AfQvG zQ_;_tMy~XILBF3H7H1&nOVte^nBeK07;<vrF0Y)pkMWrp;iM({oC!a1DYJ7&1xg;I zcw@DLgDE~wOo$tqo)H=}N!7^hcMPR-dv*KX$RJO9=UyL7Wn0Sy8SsB$e;PNlV5&bf zAflTUy#Wy!rH1-?Ij`DO!PKxn*{y?bU}|U}ImG%npTX1=E&_Q`f1oeiU)2w0gfi!( z`Vu0nGnDLXxKJb|g$J0YLX+kdqZ;=2#_1#7OW^+AtkFbcZ{4|T_Qy*G)$=rTtip+* zc)7hJZV?Rn!gr(*6({WJ=pDcli=LNDjs510+cPheikY+b9AvI=hG8%F0Pfs6BVnTZ zdDxIhIG&0w=BYs^QRjx|ErB>2;rJAH?L29?4Y7R5G8e=pDzcBV^_MH3^Q;Xg_;yTX zl#tE>v~yy(S{UOpL6?AbttVaA1W$vwkg7{<olos-jWQP`$by@0igtQ9nMX5QBOFwg zjzKEdanSGhP34g$rPMS%tHOFpha=h{;Ydm%Nbz)v4D_a>k`m_&ruel<Q{qD06x#a{ z;4&qVt>#V68k+OCcLm`Ac2{(USwq8qr@lC4hhUZBjqc%1&>4;H?+vH=y#dZFQpE;5 zXxKWsyiy$XR9%V6!tGS%((wo5s9b!A$2jr`Bj*gI=&=>mFx4C9+yr4rZc=$-+SW`B z@JLVPij>sp#!Dg9+n<X7gxLbAszf9f&yl!Xdn>{l4`&6bg6fKkgdO*hl+-Y<7hLX* zy#0AZ2RxnGWd77pn3Kk2By4u6p&*+&lH%#;OQ4z_f6&t=k`mzhXyfOG5%h*U6&iMI z(}rq9(tP2Bpf9>(V&+QV+(DxnruqDOpGaeev-Q+TcV5m0a^s0=nC^{>#3dq5=Y5JY zr2Eo&kbC3FBE!=oYv@3~^8n582c(^$Rq~<PJ)b)7c05+HhNf#XnB>lrDsySj)7aNn zcO`W@XD(zNY~mo-L)NS~Z|u&g@toPLS={zqWX}@AS<3}ZXJ1U|Q044d37lyRv*&rT z=X!a92DtiSyk4F|Nzu)HVcwt^az*8Oy<xm_Y7*kOtYHxl@9h`LaF~>slBlze%omLA zmboFEn(9mDk(MA)M0e5{qNnm)i1G4NOC&TM-cTK*1RfH82||1%au<v7`hA|(-VEJ2 zoqi{;pBG0Dw@(TBc{$4gf8S6z=qUd`V=kDmtCRB-i}5D;a&G<1B!xm+TM}i7@dms+ zksa)us{8}-p<K^2#>y+ewd_D83WRtSrI?N+mAgRN|DJEmrbTjYgbXrVtqfl{MV6Th z^_jIi$;W+{Zn6&Y5qOD>_@iUE&9I;4JLvVsJ6i0@aI7mzpvoD%k4cT&Gw2u5T7oG_ zq1bdT0e@Ul=0*?iGyNn@<-QAe<>!;P8Ru5gmw|%w&Z8TaIzgT%FqXF)F(Km06+kz) z=x$Ws9q8FDAz3=)cB1&<BqYx5vN5MO$n8kNfRBqg+IfU}qdODE@xh~0lfje#k03g! zx=v!eDO_gkdUd*FE_6$!x9M1)zBowk3q-f(+E3v-L0`F$pi`<h-svYMad!{tv{dHG zPU#<s4fvfio5GdmxaE679B&meOz}mx3Z?S3BnE+=5e{`DrjwZKVbO%=r>9ehmz5MJ z>(nHtqN)0tgsM{}9z?nrxDvIz2yb|I9)&Sn*c_fvUr+l0*Qqn|2BR}42NL`?(Cb4; z=OaBf64p}EeSs8ZneGcKNCuA+hP)tnx_SeAy`mq_&X0%wekyw>1@`rm63<+18Q6|@ zBQ6zQJN-E2>rjR>3PiYNF=XGy$tvh+80KcEo-f{?B-Nmg7em#CUiO?&nmP$dkpPRN z<H!@7*I5lCDhtmg?w|TTNSAky7+)ws&+!=EA|0U~*$jM2k*~waa-!#>RKwgw1?M9a zalr!}QP@XK9XH|hJ8y0=zSP8kFVV*iBT>H8<odoD;~V5`Dqp&8IDGD$IzVSCk(W(A zd8>?y;jt6&RIr<W*NO<77rhvNqRs;EdI8>eLxFze#*0`S-y)&jlEj@;QzB`)di-3k zxTO4<tGNLDq2yRn_H*gzGl~D{*-2N|wR1W6!`T~rv9Xb?Ig+Pvi3%y&JKRm2*NRXq zdo5LW97nQax;MIQ*02<AwiLn71m}q-nzIUSDZD?#@Fmu(TcBUJ7UfQM+zX;({eckM zip}WB-W2K2rKkN7@Wv&vIBuoZ@93w5ZlB#3^bGW~{TuVZ(l(cNf9GBq@cM%6zh;OX z%Y=|G%{{|hTZEG?yIUJB;3L<7UpJCKC<#G`S83fY)#HgD6XMlJU&v!ZytX^P0CWyH zL+SSA2^AAc;4!S-$qINY(wPV)@GTi|hv3E*;!N_Hl(|4|lC*SQi1_Iwc@W?6>4y?@ zWrp~=!ZJeIxgp((r5(sz;+#OPX_gX7mVVHypJ5<RE8e2{HpQD}43}6xPfRGn6%x)| z81~02ayTL6Y2!`c&B3u?DCgm1ofDo$ioh4EpuR59OG)y3LP_C>{DxCP@zD)qy_xI# zMfdO}_va3$Al#nx`Wh2T4eglf+##K3I^WbH_TIr<Brf3d#78`BLXkx05(!0k#a4(& z0=MQge}JzE8iaUD;{}c`J67PQi%8ggZD$nlxmPJYH}Oay$?r>!cPbd+F2`Fjdkm8V zO6ZGj%C_ePBf3#2In~ig^TjdEJB}XY+?zS;e7$$?N@2E3P_O+>sZ9#S<rd)Hr}R3n zVS+c9`Ki-OB#&4gBhDa6CyPkDI<N_;6@5S7D$;V5FYHaBPWr0BY^tB1o0z@xqzm&5 z)<i}Iui8#6!rmQIb?f5G03W_&?dPzwd&w=%i3^kTCXp73<$HP7ds0aCvTSuS*m*jK zVPEzp-m~fGZJW))4_b+AE9V)}oUhQ51mpcF&QuB)XJzLnK5qG%A=5-pBX(f2e&dT_ zgG481O-Ie`bE8divJAy#O$`3;#UUJu*G1evl%i$+KbLSgloaY8;%h1%LdnkEE*uH^ z{LyV9&K-vVZ&_R(e1G5pnZhqYp}z6_NX2h${(ecGX1;;$$sxA8!mMFDA<@qooy4oW zbLY`>Aj0b%pPXWCG~T=28=3o)C1bv~?U<^!HeMR^papyhlwrK{8WD-tIbolMQuI*L zLpGA&*L^s`?~a^kFBcMHDtJfG5h<xhlE_xZN&fhtF5w8bBHe%?--TE@`_~=&`H7NY za;m<c(cx6YMiLwqo>hD=i;0Be^*+eP(&HWYg50dQNokWi62GUT-d7@F$5l8r==UZ4 z?_BWHgOfDhBVzbU<_o542`M_A5x!<P&)vu%=N1;paNdhE=ftH%x8fGBhgs%AURQ{p zxllJ?eP%9oI^4F1p1DwrbG~*l2>Ly3^f;mjxdzd#5;fvyGQ^(+xkG=o?5jCiuQO_& z_|>u#Ury)BbcUT1BPZ4`QD~`VjXUw>s37mH{GP?z<6>fF4Nd0PGZeCh1$InlHQ7^r zaa>Sz7PG)avfVi~9KUmFRLqI>bK*R${h5on%bi%iG|qm3ar>>9#fu|v>sO2u>o@bg zggav+uYNJg$Xu^phVy$+BkmTN%Q**h^hHYy@qLCf$!2cEFTMPj+lYHaI%n4Cyz%(b z?>w$sw5X^lzUFaC8hI0W_ie-_%rB{2t9&Ey#_E<rC*Fw@i06)`Ur=&=S)j`+9}ix= zn`(j|s@VpOaFUR@fj3h1xTN{c>HaePzp=hoFd{~L0zVq*nZZ!MZ2&*-<4#A<S~*Vc z&)bWm(Vt(QQc|=={aWK>#(h#>GbG}E<xEi%U%FE;-4o;?m=xjHf0&xHF8%c52z<%B z=4r;qOFKKWkvHU_`pel9|36=UJr$bsV*@t_)vmukgHN7u`YP54VJy#Mr^B!KId4VX zTeyYhhU(7km>S(lFI&zE!+O!hROc<lBOm=>r^Jvqpaq2kp@Bk>*Y8~4jF511l{@x2 z7oc;(a=LiuY@|Aq)JRq1ou6;`M)~FUC+CE5E8`7K&j{Wo5T{Z={UX!ar>Ay~fNu)i zUU+z^kg4|asP3K3!Y+u9I4}Q_y5|h?l~Zo@>k^+SKJGW%!1Xl%eNQvq;+0IAvq#hP z6HX)DkQ!-gb4GmLu<GiIWh?vi4%vujjyLSd-pD(cGtdoALg?XbKx@bu@l&IAq7CgW z-}adaoA4(dsl3hJ@#Sg4pZxG6hqj#Qv}V@?@0?5bRN9pL)_X_Oef!I?>%<M-+h6ZB zITGI6xEfRL`0DCx3;8k~Uvv}h_>Q_Sn#(0Vr{6B3M}bXr;`P<Ke1qYY&(k{OTs(XS zphljc*VBx!!G0-8ywx{C>O7g8j>;4M|0sL6?#QY;!84xyDb74hgI7Cja98*Aa+P}~ zo%hrgNhu&-W`(3kDWs4>#6?PJ^#f@PxE98MVdw_RK;jFgn5+UP2}MHUhmfl6wdO(k z2=phJ-|xToIT2E(yH}Iw?CaTQU;g`l-#a#-RqI$3h;}=u1wh=ywN3HdfdLvRh|V^V zY+~L)&NURu=wc94dZ;Q*#1qo7S{LW6iKLWhiJ{jO0Ez51w$}#q1If0508Qnny15PH z(gz65%C?w5ii3qJB9I^UA=?6TRW!BRSmHD5X2^ChUpZ1~<Rhnz6dGkTuvv;YW11`8 zLQI9#wm;1!A0QQ2Zq{X7%q9Q&@*2h;k<nTc{V+H-)e7#W|A^UkIw7t?!FH5-lGO_M zwj7*7$=U#Znox~9JISF%bS_7kjmUx;QUcG(GkOp)7H4Y^SZuAuide{0rP*p>977{P z)+V^Pn&1`^R6;luxPR0J_+Y*<F&afvy9o<m6y9=Qk<=*p!`sICDsl<`{8npAN_-YU z@jA~AYDAvP!#f78UQ@b(41s3XZNApo9Q0wsh-?+G0d^Nz;2HKq$kwK$^bWWSe^i`Z z8-N5)rV1<!3Yf)$`eiB(Rxs$Eg;yMGpaW_33p87POumYZW^8HT8Voi%eK_5{qOlXY z$*nyU1|c+1wz<v6t;E=Sjp*$F3nv-i*0l%WptXd6h}d<uB~x2!qRzIO$SrKV;Z68s zzKt37`hYx!ge3dtx1gxRx=8s7<=Uv#SzPEgn;--_*@C58Db5V~;8?gSn>xYT<qC66 zv0JK4m8s!JH`MZ;Z6g}M@w1c}owWnW`-GEaeC-z20rWRU2ke>-utG=u&NT?kY6l+l zEP6M12y9G7RS=!+04d_a&N>VuV?hdp<s(3+kkV2<GXO1jJmQ~3f+6g=_l<2fcU$WY z8m(|VqTwxUf{@h?7P9T6*CxKzTt;i{qII^^G=XY-FX9O6Mt6P5u`HouF{<(Utfm<i z1ZP2!$|uq1GFqHjQJJ9rx{o-{whq1Yqi4^|eb+ZwZ6r&jEF%oaZ+4lHNW(ybUK~48 z>K{<@5b5QoGGriM)=+NqY^N7u<5`5w?Zyq@yfe6d-EIL*nADeG3?OO5+L#2)-)X@8 z#gqbWh-u`A{vG6vM|yxX<dV25?XyT(>Jteen*=SyO(dqX-3|b`l95|rnMrn60o}B$ zhax_d5X4!3U+nA!O!TM)HHCJ7q_HxbRTdE!liWu$!l0;~67%k8ke?f5&_;=H77-(e z;$Tz$fHaZ;2E)WDA~5+S0-NhLkV=ifbA&yD=nf2tH6p~}A;{TaZ?J`+<)Dew&JN!P zGlFJd_)%^#zw}oAYIvu+0?$X}GiGz;ks0R5C_?=sn1ebbVZ9HYQ%I#5P}QH`im5ty zy;lhyXaDjRu)TNiDI@y}8x-aimD<^F?|lf1z4ouSYUkkH7#RvzXqW*^Z@J;s!akr2 zJqN42B>bO4VC(u^YwOIx;+$Wpp94KDB~8IOIcb}OIqf7x4>}>}T`^#uiK1<?6;*eu zZd#&SfWWy1>WH1~7JT3+I_lC6OzMcm{4RCOnF$C6m{W4(5;985c%Q@Lp=e-2!J~l0 z;d>kC;#AoiM?JJ(JJ&>`;1jhWWbj;b1*CBfV@+|s4Ww${K-z%xz`YQGiRB5C5YOVw zW&@G7V@lP75%eM89@ZPC0Kg)Hwl0NFOo~syP9xQwW9^VNJ1c{T?xVmv*Te>jWPqlj zS6l!&!R`Sd=fDel>6s8A8K^epEa%z&z_(ok6TmzZ8QiGP5C5<uXq}@=j0qPCz6Y;x zaFe0pUBR$Is6N+P8h%VxAbO1cpe7S2A|X`gTI$u#p&@HA&Ftsi+B1Y(Ku*aT^99oD zGB!kzup&^4v`3d(XoNs$L_$;9mpFh+lU5^T;u%m%9ufyscS;ylS)PMY#&lyD>l^Ig zqw^rrPH_%Z9J?E+z>VqPWxI>vY^i~jhAyGmbOh_zO$V?O=b-4!X9ZfFC0IT(yO1ln zZljRn2;CbbL1lH+x@(=C;v%#FJ=VF-iVA{ropodhf(@tyLA%)Qwu;Gh3<&FN0CN&+ z3T5BMgkbCKbsxF|MA$ier+x4|G~6=eNa&m`Z8i?S$uDdkexn?E4tfIP1%pLwCGUEo z@Hb2@_|EQtJ5)ju(X<p{XT?Ah#5oYAZ4Z`Mu?}q1Idor1+kQ?)6N&R&m*sNsT@6*% z7=9pjzYYq)B4hfqO{$?U0>zyJtL_1l+Dn*)LCln@pgKnSW*<T4qyowsC@pAqu!L?J zTtI9^J=D3u=5_XRvbA4SDTwSu?v^Ugo#8Eo8&WGk-Du@VH=9K`#hn{$x0`@H_*gV= zxbHj)dSfp@=1^jsL(>OBs+}8t0Abx}Nq)}_Zwt4>ulHRfjHoDJaNQyL&cVw=G$QA* z<{=>m@9U#Dv)4`gFj80?mRMi3ozCPQYY^G=8N>pb8><Qkv1jGzfS{-~+3Cw5r^Iw~ z7YP+BG*cR-bMRZ;=I&Svb1mr6svGHPNc>pAd~=)4A8*a8!n+Z1?IY$9y3bPAOpN5e zviK4jN;O=)>IHmkz>H=2L!>&?D(6wl#{-7`JY7SaSzY^Htc<!$vzmW?$FS?fz)YRj zJLx>kI!PT^@Z~|vP&<!<98HLF_Zll}5p$!EgSMp&p(S>yv5quD<Vs^jTLH0&W*az# z<3pDK$G675C3gmtYygom#O<Onyv+_U-UaTPDZbF?(#LjV|KQVu_lTfyaV@k!gM|nO zJTT)l>T_v>*3PpNH@69{WB;LT_Z|;yENht|A%%{!g1qyvuhc;HE#`)|f#vgC1FSvg zyG@k==P{VW)t!ew19s2jL&V-&VfUTy?qh0;8vCdcH*4p6XggRB)Ggz#7w2I<&{y^9 zd=?adNtT++$a)5-mT;dSw$Z{B6p@Fh-wQq0`5q!C6Wb?qdw5%)2fV7Z;GM_3lq><n z^m9SsmOVA=A@Y?p&YA)mxJ3i|d1OQWSdiO>gD{VrH~rf>zJ2Quomx)LcGkd>n~f@C z9&}VYuTzhYdb3|w*sq-jRh_@V<ZU)k#~R1?w08dRz3Yu|9JtVUge7Z()j<!n3k}_? zI)rPz`k5^dG|@Kl+m@l$HNtKv=+=zE07cje$(#&d?cz8=0LM=4Ai>K}Ye*ALYelQT z$6*->2m@1-;&m)M1i<M9d>?3UHJO2DK<BhV9!)~5`Bv>h7^5z*+x>FChyU6I{qZie zuG5r?z*Pb{`r#j#hYQ+@loe<JwFj<IwF~XW@-sXk>h4rxROzK4l<H>Keq^~pE_ARt z86b(8O}Nu)DoYUWwuk?39aRXjw5d(Z28O7fLC?+%OTSiNn*}apgTk!S!ixxl5=d4N zC1>dyMjVtpk3NpJ<)JTtx#_+0G+3us2*pj%=!L-sE(kt5kOM=o7>jxVjDKA!eL-WA zkNQ+|V=E=TMrx-7_JtyzD595$Jl9Ufgp2UBY@ue22qe2>=!*vTcwT2@7aOaMM}Q-E z&4}X$QYO$t;MZq%yP;;Aa20a|`X^#iBZA?rZRAOtM57aRHzD|2q#;ckzOw}ro`y(# zKa61mvh56B)NKM3T|Bhj8g4XT1u8so5jZ9nZhx%_!+ue3OJ?gLQiBiXuixB`n9SD2 zCYbah7zjJKkZ=)u2}GX&#*b-eVsT^%F6uyX5u>X{9Ftg)yBm)ng={=h!(n%8pN^wp zS_$g{v3=Y<$T_&#=Xv-tA8H}Wp}V=*y3Sx);ci+Y1JkRmKF%lj1t>O<u|3$|0I)9t zvAA{_!m-dH<U{AZ1$k)E&^q}zJoIHgF9Ovqx`|kiM*%@^wX>UO`^C0CfPB3TYXXDI za6*56k&On>Ui3?y*6<du!EW{X2RHd7Hg!ITp|<@9JP2F2RApU6des25PANNZsl&pC z0uf^#?ju_7<)q15#ZXMp(x=|=@K&f6iN?FIibT;Z7ITf2Ri)QRwt_`0<Fm~^pol%1 zvd)TLV!e%ss}y4Ka5{lyW%xh};16pMTz{j0ZDu?$oAE$$fm|&`T$8yhM1!53Scx<G zej;hmA@WhRn8rI5#|ma5vh-UitIGmt4aOXw3YDf)42Z&2IK?M$n@zD<)i@EYgV7_F z`Z`z|eyyZJRuiD@7H5{1!EvOTTf6em#OP<}Q-~t|BPgj#yojY44h9r(vD;Z{9lkK) z>d07uIX<;$sxG#$zFA-Mi&N0)!SuNbYQ=Dq7QLo8B-5=%KI;Af3=h%P*6?<ex1{Q1 zZ2H)01W%o!>uSRzy1Js4A@5^qt=?!A*U-Lgt?mzsYps3NiBS<b1;s$Tq_vn9ab2S` z#&+On;?t<XNw2u~@O^RW4AAi9Fp1IAtjI~SPH}g+b=_*Xvp|<F4qyxL`LYE<R@lfs zX8o$K?9Fj}f<A*P=sGVBn0ub$<ckB$WX<AHY=YX<(P@5{JeX|tZA3IHV*0OL+=Y)_ z0Rs09Ut`UD)~7m<`TBfkn-!^D9DcqRJ}gFP2{0Ody*d2)@I9~!LqGViv5wm*gqg9D z=mNn8s|O#7zKHe^0Ss^8#D5V#!q~fqU+aKy5syUF7=L+-R*}`0F)3bx(8I3~Huzh@ z`;~2cDO?Bk3=cki232~SsG8qACy_w!2HOZE`r`V^@LnCC9roR&bkfEq!{Or+-0q5< zAR-rQ2(#4N)VIaGbz#tkZ#R28VWCU#8v4OpVmVlD0>sS9VUQ%IZF5&qG5c}I#VP_1 z5l_%WP8XvW>3$mt6r6JjM}NuJB}_|Jge9B8PUI&BeRwEvELb!WlTa_bP$E9Xkr5Ux z;xntA4(pf_;Tjj&**DI3NGhn>QXE1Q%v(w&_qG&I)|M1UHNdK-I7}k0NyQK7+U64c z&+sF9hA+tQpQ{Qx9c0?Fwob4)v53~OOu(Uev>=s$efMZ+Yxq&l=|NR`un(y`4j=@t zky?uMd{Z9mQX>qEF4qo>CnD(KKkpz#A^ToJ&(U&<b~l=#b!1ALOU=^7p16>F33iAr zFNad@`%7+BsOlxH3?(edi`jteA6mp68b;EUS2w&4^PQn0c5LMKPvlBeFEv47esjlh zu65RM`Mm_AhF=X~62OSG5`4g?0Wu&YvcP%4CSB@qCI)LxfsF^ZF?xYM0t81L)Y^Qu zvw>?D+`**|Oiap0^Nv(S4%k2J43{8eZWfuo{nY?^Sd?ug<4YKW=qDHn&l!NTv%@?9 z=J<kuQ!U?><H$S!Nz`8T`F1NgFI@^9NihMUMFl7rf~oL~*dVg4WfKQV1RJ`^+AgmF zvv5WLg`t{m0;C>%q}7~V!jHRJtU+^)j%BmYC9o*$4uL+Nm(=<599t|@v@0E{!X=Q~ z)&S&2<hHeT1A3eFrNIUmze<A2owGd@P_;`aXw#7qW7F<=!*9Pr>v{=*Zw%1UUmE@s zO8(%wFAeXkY&Q1~Uqf5b1D9$@qx|!oUSP;e|N04#_4M!`8RfV4euD@8+VGFCb|h{O z@`o<N5@1k48(~Zz8zO3XFUy*eiz-1b^YYSC?J`5Yywa#IwvY=!BgBEC%PXAn;mNTR zvM^AM8PP9`?whsC*WrDsxyt{6NG`7rc59bC3&@j`YF{9aR}AUp_H~R~m%(|u+W|mu znriWBpv=STu*%X8fo5=dRPj^#CX&IaJEXZqmdNc&8kqog&j{S-W!$2111R;oXcTfz z($nXJnp~nS_@>Kk&kv1xmtV%R1HNX^5aY|ZPe|u3!ysa(xeScyJ9L@ORhm^(AtVuk zw&Pg}oF<$5%nok**xq!i!Rd`mFh46{F^4cXCv=M#h-bOI2X}jU>)>U~b!{xtvf-#u zF004CtfK8Q%ApmWY-AF6E}#!hfk{*`_Li-^p>gvvy8^u|<G@ob9!@<5tt(g*w)zMp z7Hl?_U=EGN%2521#+ob+Sxr?#PwH$Ish-LCWe~}pX<AqBei_kUuZYX+=~KR*mwO?6 zUgl86@E$chwo$u`s^Z|~WN&w4Ufxy6ySz_77z_soRJL9r)%OW{zzwf*VKfKPY#DpK z=c#%Ssw)~2I4(Aas)qz8Fe6a3G>I{Z0A5N-hsaWkC&w+&DZ?h6>1s{O=C1Er(%489 zJ#<*i<Jo&~^AYmFJZlD!{^I<NPC7(FdZ*PZoIDWx6{;Ws5Du{ZBO8ou8uPYW7zfC% zHbu(BJua^^#~JN9M-|y0F?^y62yTeWk-dQF*+FRexWd^e-b2fHC4H+5N6l&1^cc?- zFn}+BPE8;fq2$;k2K7*v9FgJe4I&;AKrXnV-@yiM=u8%Jb_1e97bI$xSQ;tV*~Hvl zfrqm5Ewp~%QbL#rw8A6*NVCB1;~7j6HG!k5k*$@(x8V0Bx(WGHj%4Js6EfeG7Vecd zNGE0LmChQ5Pb}tVaC)RMoN}2T2ynYe&pW&O>yo1@ojumn;~rNAOF%nP(OUBc<IX9( z6X9U4-~qVDlg-cL@D?P6HqapiKn)JR*<u@VLU7~|dL?I$!zUC$N&5=Od%r&2SXKX9 zpWjDO-(h}-zwPb-i+o{tcNLvoL=RryXe@=n>Pi)@K;rOY<T<wQL<6k^4NtgDnh|u7 zQjM^#o2*cWI0$NsV5KGHA@mHzMB_Rtaj*>$tXFXotFgDSMmpAvK&>G`W(p=e0Sn8b zV8G#>iAHN{FfhPLADTYV*l27je^1aaU^6-g_J}Ws3%<fTg)k5*iZU>dWz1s%J5?t` z`B<d{>t=w#2-xKD$-#d1I4A}2iN+>2`Q*KTL;D_;H{}rskkEYx|AhvN0;z-<F{x07 zcL^lk2_+rbDuqblU(V6F36?rfk1`-hKC&fkuo6@hwMI9^#<n>n8!>qFY{Wf!N5Iim z=dZKYYY{bulEMyd<E_EDEMuLX)(K)*;D%pYsP+~lwbQBN5Yy$f4y5p;!;N*AW9uRX z1Fb|>_Sw1-gYt`yOaElb%mG%%U3pXPUa{D~o=$?X#>>o*-9q8RV*qI-KuZawnn1M# zbDn}CT&iMz%pKWLDF(Y(3#ycW5AuL*-ih$6uVKHjv1`j501Y^W*kKwsM_ay6R>HX_ zg5ru0K9^@e+MW%Y^5Af7f>RBon#;Ox4L@Q%o1!fA`2mAOkRO9yl`cl@Ueni5UiiSZ znDIBa@jU^?i@6pi^$C^R*6CvDWR_Ft88aKkX6p0cB{1m(Xsw0Hr&L3y^!z~2{t0&o zZi*2@G!p>u`EqsPxygkYK;Cj00kGm})M*S7fQHTyV!nj~q!%Dmp-K0k382{+u(;&d zaY1$d*7iUJ#cX3^tv}e>SQD<+;8)j*OT#}JKYSUb3&F?xS-CZVsxpuXI(gesbnw{? z$9EuDi?aEs_@QfrZfW!*7I_eaCufnc5=^w@f($rC$MiLEc`_kxt|G;NjaOXaAl|90 z1*X82ML>f;v>ANznvv7R(cJU^Z>K20n&#Jo(uUYh9F>?^J#e6>4~X|yF>*}cAyA)2 zk3uY&(<j;ue7S1`xLVQct<G*70Gj}_<4{{8Y^ez%#1c!e+(39Rgb?x^_m7|GteVGZ z10cOb*Awh)DF+42nNR31o3K2AL54!q1p37Mj9Qzm?=ff9c`=GNkvWP9u2_KMea8A` zJcEI$wNcCih>+<{CkoJrvLbe669yypLT6J$=O#+FeUxdeA%*yBI3?_BY~%nuplu44 zi6^r|fCd`53k1=rZ=j|82KsawTOgN~u*0N-u2ArQIQ*CpQ&&2nt|#RLhmXvQ2Pz13 z?|qKVK*-7Lj2)@SNh-9|Z~DE_R7K4W+bVMsV<p{&9cIOSViO`j$AKD}Feo8zJoawj zi3b9BeZT_dyTu7T7k1Fz=6qjJNrY3tJE~!}$}@-;26oSsxjXzQRooBIz%KxSYC>ja zCo)*@(SgSa@HeISBNvN%Jt_riLt<JtQ}@zvG^J%OH&Bb)sqaI1PchCE0-<!2laB)p zY!!g9Mh*5jXbtTh#n|0}IH;)~jYSiIvib+_9KJQYefSLtP9Do%jM^9+-qO3I60D*3 zI3tWm1y(Cq+HtxDKjel0Ab0KZwrc`dvkHR^P2m&t^5Ek!-gW|Ma+6h{1dI@4!3&Di zR^!_*VJet(++_%Kf+E0GgYkgTz>L5tW*itV!ag*oK(%0eUu3k~U{j#1F{YW5z{1^z zu9$FKdZ$l7!voRoaurK$0#1Luvrg4Lwq3i?*uY*pu@{}&V{TxRaY>ngH^VAIyP>oU zJOZB$T+%v`@!Vj9&__&g#u(kAe(*&5jWxH^!A(_%1lt^RIJjwyLmlIjiGafa@@}9O z;vB`@2sBJQTUICj+po7)|J$$eZK_S+cZKp2wPm+9`N$cpXi$U6M=Fn{$wqMo4<ZQ) z6GlqU!)A&A*f_LA;v6Qyh@hfN;h=%tB;G&;3TxvllPyRHsu|-`ESu6pMA-|e#;jbG zd9&QiK`__izK@7NDpHlX;YScL5I@E95Gf=KW7|y)AjGbgg+#QblC>y5ISJ?U5l^eH zt_96C0&VP@gB^pX9PMPI1^YJqU_cDM$R~tjWfw=$6yL;h#B4R%FdVI5{3n&T_b@-( zI3}I`njyy|RwG=)x@21RY?5K<r`itFuJy~biUU$;`onHS6l_S28i>ip_I8VB%&5fO z7rQ%gz;}}UJ4<Jv-$oZ0gE6eJj%7z2A9J|h>X06Oum?&)t?o4!RkA+c*uZ*rUbltK z({_7medqz^Nl*dXbkZw+TI;n*NC<>@60wtsX)e1EJgLw`1IH8LPczskmIuc6D)ZHU zP|>?P2q7^J5Qz{=&SVpe%@Z!fhP&|GlaN9bxhOiE7#rug3$<oXPd4`=xxWU%NCzb* z(ZXT7rc$dBhM6n~0)}J(ig-xnutH8Hh<3UK21;2pjLPt>cq|n&kD&HkRnI$#v0#Ud zrzc02uF2XyxamZ*6=GNtq{$XojM;%OfL#pGAsSJQyKB!P8|dK(>!_)u)TfYP!^#uc z=0u!fKs4Mq5?`K8c_T_#(xfP`ciW+vpN!dT^_DO_P7-+f6`;aLr3a^oEex~&B%UnM z&wj$`3hd;85!;4k1ocrU{U@Oa9s%XNlsAA(CVGybACzZw47c<x<HLBF`NBH>=M1Md z2{ROHLWtkpWXIljkf$fP%Z0~k9d|F7il~b7o@<16g-S04l}Pv+M%((>g&UCp&;+{B zXEfU!2w;)q9w$9f$jSNa`E7a?8)OQzj>SCn;ACzWKT#N))N3JZwZ<Sg1RYqNNfdz@ zYY<D`GUkO>3QK^@$Dh3}jTVz~;j0BIS`I=`XbQ;@+z3+ekgHD)Sq7S8i|&~gk)UG5 zMoEB`Qq2^no003*K~Ej7vjIhF*O}~aoYUTMmR=0pVXNY4gtxd@z!bV%XcEBG`Swec zwUYv(_?LdbB@!r|5Tf)8(n~B(d=qluA6iTVL1n}&Ob(XOuT2i{K^^S^JpJQT>7<U6 za1E2PKiQEv#r0#J96aNj95ykKi=P}Y7WzN9!JQglb>?J%w#Wk6$4O)~s-eG}9KNp` zCN1L@7f1hIcLImM9sU+YXsKt;X%!%o7z$Z2I5c8yVv(gMYHd=UqCaMcB!g`|I;A>! z`0{Fl$;GgTFD?vLZPEjQ*k1ni)>dt*ffFu#g&`bOM9`41l2eG9^va+c#DW;qySj^s zB$oJU)=1)Vh4wVe>86ktQUJVibYlzIX@v?YbKk&A0q|@^UgBakw20(2;biO^)5(Qn z8X)WfKGTSW_6Z9NivhWbIGC0!Jw~P)n8@a#EgK?IQz%aBpgmm$BaN>?jB1SqgK40O zJBk1~t#f!Au5<j5@l>N#pT_YNyiF7aA)X_(HA%a$t}imd;Vtyw8^kuGqK4Q*!X*=R zi7LdgyjHT7QAh366d<g*(onv^Q0<CgA7+UVSn7Ec(71Dsct<R%IF5D)>37=*zCAf8 zuA*u7Wnl(31-{{Sgx8UIO{=Xp>;t(GLB%}a0uknD3nLdr(&rQep(Dy7#7t*(J~^wa zYuski;JQOpO?y3;0ftji&<NrRKBMWCGy_fq!xJz#9|05_ZiJ9(OqRqDsluQSdNl%{ zAK~CSi)99GD?IT#j%@5(=5i&VBZ<6F3`GLWY#vHs?~5|JwKn`sR7?X@U2Xm<ZW4wF z`gQ`1%nFBjoB|w&yvxN%_?Hj~c)*q%CsIfQcH*}x1}kzsT8oju+X7u6Cdzw_8{D@b zr0Dw{SAY?9;<{Xh5i{c@ah%Sj)D1I_euAF5Ujo$_w7Hum(g7bmh>`uoG#7(M>*Jau z|D&p+$x4_V&pQwOJW)wULo<RD6F%c*h=klfb=Co<ra9ZR#<7up-xcVg?n1nn0&VE$ z9pBQ7<V1{R!QkdB^gIFKsJWsFDl6N8zjAIczK6?6v{=SL|6GUDrkG<YJ|Q3kaV#hh z0+LIt2B$kU-FqB_a1c9apA|xA1MhPfglTKQmzE656q0m!O_wtBRO9fcFer&|Of}+u zCqA_lI}Q39Gr)ChbTyg(r&J}cv&`Y^FojzV0|yMq;iKRyn3dJ~Vh656#|GMJuI%7n zWf&-n+fjH`2e>Js-GKh)I>wmN4-a#g)P<nA(S+;~!Lk$?7;*9CAP0s3#UEi{N*-JW zL$a%~nLxTUg<@0^ii#l~i1>zFW5b;hP<I?nWJk?{(VS`?yrvOFF?_@fO~nNZyapR8 z_QV9CPe?>M4eWE?5?ajYtjj{QR)R?r$Y4)`GbRuB^Byh$16Vdv9=swDY5)Qv*)yAH zf1O+1Vl%XysfsC_awS^`hC7Gf$VBK=uQs#rH~}!P+~)&cjlf>w@mFYyC&o;`>*HqQ z*Cbpx>opKdNN|}TobmE9ozhuslvSR2q0Z`G-Wq<$1%n`m77*7{7$=s<MyY6@f?Jgn zA>@876)&aE$1K^N=E2KExwj3Y*oiOZtkD;}LoWJ?Hle-jOYlLkxkP&YuP|j?9VZcJ zg-gt743usL`$$7X_F;qBZ8#*OvOxZ>O`+jKVZaqDO*I&`DP8_}6J?##*I5JL@!q)9 z!O7p$<|dk13)Vq@+$cDu8!3-9uE2p*8^x^yo|g*+Km*P_5F#K6df=etj@D@5iv;?Q z6zcn623~ngseEm_K#NJ28TKk>2s~4Xsv3?^9)`57<8wFs6yXLpF7#TYIkY*r5s+>i zf8Cgp?1O7LWXKbt(ISaiNNcpJZ;nd;XoT~8a@pw<eU^HqnF>ItXn!KU-zWemL?gBB zQyti8rYbYuQ=RSj0#qZYtHwQLiweP*0k{_B0TsP^$>^Y9-5*&YB3FLV2$0J&Tz`oy z;Yj7Ip%+2aC-lUu0opOU=g~ZZyqi0{4e2I87>^WX0k%;0n#+-^XeHfMGljyBt@bp_ zHCUn?MIb_=;SM@*&kqu3cVLS2PEy1-KON^rr#c|v`b>6&B4sD`TU}ItQ`;@UaT|`6 zZ7KhS+n7`xO*BuK6a=QJekiD>VB6)62@y*h8(!*)?T)Kx$y(uZo~gkG77J$p4&7z) z7_1+`cP6mWdPEi1$+}^eQHgKvh_cbK2*eSnNnULsg$6g8IfI1o=22@48iVfs;28pR zIxB7;PpMB0FsnF(!NGe1<p9gy6dE=mfdSATm1o*e*kt=0BqblW9A=#GBMgozW{eF# ziVy}l!Ze4&e}R4OtQH)6=)q{!rVehdF!-BB+T*%O(p?-aM}&;4=IkZgo0&Oyz1u_f ztQ;ez4&G_wt;AN=6`2|N@6U4k;4}3La2Ke}ryC8puxaQwG?t(ZYc&n5cYVT*O>>2t zD@O#t=|lh<(lWA#9j^shB_4(r!u9CHG(-z6NXx%Ixf@uzIO`k{cC?Z$am_T-Q0$E| zF$)1j5ub}@S?Ez}uF=QT*HhDw%jYqs+pTD4zQtKfF_k_6<guft8%eVAQWfF?pVc>! zOZ*}$l@!@TRn8C$;^CM%XO8ISr+j70vxV97&Lo&9ESp3*HEs@9GFcftGbnEwOJzJD zK+`e}KG2>T;4J{39Z@ZJs=Uo69(7xwH8X@E7*}F@w#S{ZaB^_c>B7wFbl;<T3m2k; z-qPN8AFP<Kk)Q#pP(0Yc=V<KyqG?sGy+(<@NOthJn{M22>kz0hgGD0B{kDz+jyo0< zY{0ggZZ<YKYBU{oMV|P7KpCc+*ZcUVTEB_ayoD_WDY|Vl9OH=N6-2;1<K(Z*DXHHy zerVurK&5g4p7s*eX*51#*A!3V@{JV5wwi8oly3Neb`GLkH1Lt%(^_f(mFJli$LY`) zC<C`?Ab}%bmtb0wBFfZdu&ca>aXdkKc#s;MYQ{b_8u$;Q2?jJ7{B7|hWYf>=#z8S7 zFq^2Tl1XpDV`}7G2MGkr6Z{eCTnP)4-P{Fy4Z3^ZW8`SLno%Qe!JP);8jz-%5oCcN zyT(^IP+?|&8(<<rnYV3BGw)6AoC>e+>D9Gwzj{$6(ex_7$NZqTN2~mi5v<nJ_{=Re z>s<QeQT^!_JA(m32`S=KtlJxrh>2phSWZSEPsTwA8f<x7N0C4u%aj^^uC&-iZ_2jg zQh9pQf>8v0PPYKR7Wa2ex7z58*sFdawi)1l1I;adh5I;vXP<AcDk|b~B&rcD?@Pj^ z$=grdG3s1#A=ubUH)&3{xV)ZRkTsw}GXPv%(FNdEhZ3gI`k{rQ96u_9!&?&Jl1NXZ zKfqH;o{=cDfLkBvdq=&38ycX5+3<|UCe9Mfz8Tn}qX?x~ct1?T7_8KPqJ9SBc}n3P zn!rlcoOiI)&qJ6aGSS+xA+k6>S7u)2T}Y?dB{yumY6Gvw7FW1Z|2mMz^mn?~J8jkp zA5*~Bg^H8+@su}Lt4Dz=5;9sm^W8Q%o^H0uiSo>4O8x|ET6z&Ygj<dBL@GH~PLa1Z zhgg~NgZZBvSM%ol>TaBrjuSU2I@#Dl$j)2QP8JV&zq;l#z2nY;nMlK3D?*G-C8GnI zk&d}aeU7LSSroAQ;T^}mT9ptH>*lsiA*QR`tR#|XAPTZts`9LS>bt3R3rj@okW8n8 zp4GbxY#7zmfSfhTCGK;r2nzmDa+k%%*)3J(1h3VHpQIa;i>BAg#+p=F_&ld9cxhe8 zK`_Y2DOwJfpKgF#ra)b%*poXZ6b9>>(d70Ve9k)C07amH3fRKN%0U~|I@5>+_&kE! zQylB6S<#stq<8R@8F<;0K55giRT2<rI+uwVcro8JJ{hYGoJyw$VD93)#{kQCcA!ip z^Kl-qEL&{tFSEg;W~WG2lWA1ZqB=BL(<sHzBZ?@AweeQKdNvI!w!=Y%>4A*%G;AL8 ziZ&}cJ)Qy)1WR!uFZo?f2L-Q9?`h~@Z|rfVv$?v5KM4%s^nN(%V@emPa`6P0s}tTy zH)Tx2(jD>>3DXB3k7*=GZFUb|-mgvL(T21lKR3g14W@VoI2gyQGfNo-D?)17Zq{a& zx5A%!hK0cQR@K$aie@DOgi;n|hT8>jOU-<G{W3f}LQR>R^jLkF5X}8K0y1DON|nhB zrp4OK8h8ogG3~CQ0-fQiot4^*F=f6PRhcsztOuOh%m!Ejed7!gyS_QK8C0F@)~Y=~ zn~5Qt!+@Ivo~l?b!^)gBgQ8$&v#}-*Im3<skJhKQ^*))|WL=QCW?~?qH;&ZTW)N-a zi`cNmbs)x>ZP*;1=odl{J5%a-W|)?mkJYBsdxLmLe*^>LSaum1YYJ0GAo`{q@vhIv zj8k}glB=+|{;srL&EVyaSHX;G!Wph5q(Z3fX7G>YFPdThL0K$8N8v7->8+z1z;QrT z(`i%G3}*wV0b*}qZ<=vib5BCPqH@NAe=~7w+e{xh09FMDqqA$!@tHn1e<NG3d#%~b zKxGoo?ke1w;XZO5`m!1B3dn99Gh86VILTV!_5rVH^+<Pd^4<}$a4~gogIG78^;u*$ zV10(GOub7QcP`?a1vcWJU?$>74oPl8w~7Zy*7164*Jf^vPHfBoGqo9H#~EEg$M1HW zId~68h}p&x^FNClM%Sl0;aR1@Re}wUiXbW(Irw-ZVtA=RuV)#}F5@ADUjsoI@sKbf zN{UEt@*6GLJ9ZXYK#OK`^D7tSc(T7oYO8_6kRehCSYpj6n};U~4WQgFuxNNA+Bqeh zSrpRwnURQx;>kujW9m`I8<h*<7=}?j2Mvd}kvxb1f0{1JShXF<fS={bhT<77$5s9$ zqKP=H1FmjFHGRBi;o|}m5$Ut$WJp|;nP8(xgmVlb5E5+8ER#n*$Lf4?C={s58va>+ z<iMXNVH1YEk_vlD$(;Me-+^v(VsE21D`$w%;^Z~g^aG+7>WDdvO1Op(^CqVqX0ZVj z7qO+n)S5s$$R-Dr8tpna#6*<K+sxVO?QsM}@BLZyc78$iN~H9&Bgq<ZQo!%Ty(|PU z5cCYS(iZYY)ZuDVUx7>RpvbwZQ>ZT_)j45oMZ!Lr@Ufn9R$ZCSmSV;wqG*8{@5PE` zL{bHF*;%16pa&ijUXV+?0nQYMKoRq&ICQZEik8^4RTNfu)_d8It_b_g=Kw1KaYW#P z!P5ip$7|iFaLg<YNySL|J+n9Pi}4jbzhF%_Fc@+2<uh;9b0@3~@3G+De)V#S#`&1p zmgYYJ0&h-1(mn{|#Jna7<Upi9e4hZ<&=?O|qqu)&mdKc=_iXGY5Msv}mJG~t_}J$T zSO<+;VE!jtZLS1oDTGdT6YYa;@Q^gjvyXDlpIITpkOT9{6)&f6SODa3C_mo9rH*67 zq&Ya%G9Qm~xt7`X9@`g{{A_!_dHD1CdaH_NyqODn-k6zdjkIvH9S#}?dqZra(cQ)! z87fPHewMN3nqJi8$xe)92r}TI9Cc>}(C>49i?vGES7KY+5RtgxySM<$hpIjjO~i^W zgxizR`p`ve55Fo7b{3-}q?Yr;Ew+zcq2nP@6hizC!KOLr3s3ZgjND=Ox~Cpd8z8=U zd_NQj7eSRPDH_)M6!jbn2SDvvx9=}aENg%<!LEiYh$w59-UO^E=@jsJDcZ}EPcGMQ zu;HixY^;mIk*K<z`aHJ)#{FER6AVHRdjcU?w}F;qwzJFcsmwx3F=;>;)mA5)>c}j? z(QBZU^C|SlDB8(zd5FZIv5jbk5=sG$f$&QTjXHd2Fk>l&W_24%Wg-X)ni@I?%f~2i zE?FxUTU-wSc%a+HU)690BTi(r4!*A3UC37mQPX@We6Y#DYY8To2)^S@z3Yv8Q~wy0 zAyC7Vj#wgot%Zye4Rc0pn>WFitYfDRR4Ve0+h!<aCqbmqLat;C;TvS)O664%B=+Hj z#y~XAg5TmMM#@;2gLl?N$69Q8s~#ss>-k<ZG=}{4i9^OQm!FbhOnol@n+4a(R?ecE zg^$<Sdv?&|G?Ia^;D)Uda~^n}Makg&!iEnDFiH?__6|gcOpF^#2G*081EN`eRdHwu ziR?*s&c&rjqr<E9k^c;pt23?j()mvUq}w8m@C~loF#Qpv!qjc_k_2}lEK!VRm7j+i z`*E(>gPUB$$ow=argc_-RXl}Cg~9B>*U+KE7e=7KHO<UpZC2+}^gEliCxlV#1k-%& z3FxwqXIlO^)Du`~pV7gB0Y1T@ohP86@!Y{5qV`0S-&#T$k$jt(xF<q(L!}lMdys<D zd7^`B3-p@^UqbkA)t+GLP#->_Yod=8&Baf!HV`lZ;2`!bQKS?1qPcx8Dr6tBB$0$` zBo}f3!$yc)Zd*tU+^G{0KG`VdI*|a>4Anh70m`M9gdDw8SK{r~RchMV$R#MAeq$$7 zJykqaVxh}r*tI9(NIJjeP@6-M(ofF<HwU09a<H-^kk)lQ4Ik7w56l9Qh8j=^*?}-F zVJM7z3>SyDEa*TrWV`1YI2G_*U9IjuG{sm5)|cS53}NhGVCUeU<H-nZ9eY@)*5{zF z8wG0&wwwc!kQ8hZPGD2%#F(~SLLCTv6Xd%}u-y*0BNEkMBu8*H$I6cyO&mjXhF>$G zHM_^oslam1gP|Z-LR5z=4Swf(Of@&j+CzFWNMGH@5q5<nzpIEhG$?8gQ+WJ{fOUDN z1noJD;BRqHSX=y=+Tf}bS9h+tg2=%2+Qyb)4rQ~>N|FPz$VBL%GfjVi0Tl{fTDlYF zbh_fnR0~&(@#{);sa?S?6;)3cqB1@+{1DY&FTINW28(uAo4qn{+(J5!lB<R59W@Y2 zoDW#ekX7c!ul6DlKY?Jke}ZJE3Yk2oVUgRaz_TRtZ_{wi)wYW5InM&}g#K}w1ii%^ z-n#J~7=a%f^H)K@1bPI_she{q>a&R4`=qh4mWVn1N>y#n^D}dp9vCeaMP<}7b+OB< zOl>Yq$x?-vM%P*jPL(Q#;|_Ho+BG=0m8^GW7Mw56RgU8*(n4JNbrk%QalG)8I$NlM z^4sHiI$)SXjVo{^9ygnVeZ#-fMaJFUFTh1b0*$aK)U5i04T?EjV)cccV;yXUdzI$A zA~v4-bwxx+A&<_Gz(OO(P|X)+l>}8pbfugNe|{+7JOn0IATq)?XRgyK&hxGDUs#;$ zZ0s%LE<`R^pNHpT3BhHbDNhjN3>6+!bKF-m=E6D$rPbgx*FlEj0Fv+YXu?o<+er3m z5>P({VPbmb&4FZuKp2;XyNf%@$6VXz2A~?w_YmT0TTzWUlv5r>W>p3o=uGAi&vcz4 zw0nlzq9Du%D33-A!<;S~b7;JU#DPEF#?~I}L_e@sqCuYXC_`;-Zy8}?2S`C4+T!E` zXElL8usLK2b4-e|eTpj{w3-|K)1TjB(s=#g^?j~|qJ<n8p&UIAYjcMmuXCtogo)<C zJq;}9^O!6U?-~(_ev#9c6wQOq<FV!wTbcpeKz+-6W0^(f<jFHA8BB$3A%}H-u@Ur7 zHr`e92;%V&A(=oRMg$_NFd08YhSdY7#N8^fHHw8ke1#tfj9=MFwa@ZCstLxL(%fu{ zZY#yli$=mJKBeQvr?O&7Am*bj2<u0FDd%6LhgpxCUcQ7R%zCB7mDr(UagLL31uIup zKwcP&0v6kdSsGc!bGgurYuiRyz2>&l%Z+q^ss36io;ds*A1v>c*@%ldI)w^;6fG-| z%LV(Akg^OsgEBRz&>bKwmG6c6AbrE=gFQ~U9PR^><1VvY+1V>wH2&a}A|7)Ib*{s2 zdTxSy(#t7P;82`_&7tQ^e2Q>BDltmb=e`s419;OmH}e?LXW+Y>TEpTSVp*z+49skY ztCSvlqK{M{M#*tm(~mgJ5Yy<-7f=Pc5hjl?Ox;?lNjPQg#_}pZi8Y26%%d$h5@XdK zi^RC~-wf0s)>;{iS3~LHo@-x6hhTt=XSh1N1BbVcf0ilH837EG&!~?U+r+-kYDVDq zG*4{BEhP~{sT2l_XT&YUR&YNkJV6fI?rLqSe<aW&o?y@~5TNi4$O(p@25t#{y}Tw< zY|R@yIhf8SMa2CcuYoy(h4Y6ZB<22oAoNxwZ_RMx8Q#GqFOppJ2fvCMF3=XTqg~Gk ztc=tr<Hn5eKQeDJEpdvl`;*9N2`kRc7}3I%1Sow2MHa}>@`y<Sag|1yb~{yN#;`IY z5L#ssIaHkqaqdh&evWG%aj77Kvo~OUA{b&KfI4PEZ{|RYERl^q`Y`M-&K?QWs%(S2 zHvG^Co}J{!D)LMo3}oQPYknW(-EIxvx0jQ{Kgx2Mi*_?jpoUG(JuX4HbAi(f#;cMX zWG+jH+75ORa3VJ*rk2iU%w?+=%1r2D*}`HRI7yYm*ch*|zOH!Y&B{n2tsmZIuG2?l zZTzG+h*!1AXcy<jcd-n}mE711LXDb;X2k+mz##ay0}*h>qCmXlZODmUU`93@I{6!e zC5NOL+eL*)$WIo;;L+~{712OPKK!1xDK*C=dQ1^vpL>~O;`#%D#d>JO;<?>;1O>X^ z;Fr3*fv2MDu!Jtp2AIYrGU1DHVUt08efZDtQS*)X^-}yXlU{Wm{Ob1!u3umCH%=k} z6yaIwFLqJ_`rK`;*0C+?&K2dmdrW5YI(kb3o#IM!S=`?wVoRo-luUT+9J)oIlqM3E z3lC=ucT9?)ExCdRA%rC@K*1Xv`ymy)XC+?g=)t7J&=EttjR1E?QV6Q{11D>=2ZXY_ zdIZkPhVt-7WeA4%Vr!#0fhxe(lLuG%z@-vZ?wE5OdEpvM7@YAu{;Kjs^Vbom=bg#w zA`VhZO{NiTP`>42JSW|BVa_f>6CoYvfk3mG<!+N~V)i!-nThe1*>in`Jw){D>B?GS z;o3_W>{+HlOt(I3KEbw31wv)AC=%;6+nCsFy|o|LcFyy=nJZr2IKPI#(~HA(^QiEJ ziM2hw@C$VZ&!`C~HTCnr9Nu;KM#++)4W7rv9jJhC!{QZ5i9ia1YONK{C9u`bEX7Tp zIlTp!$Va1)pRAW1GJg5GoioOT8i<$?<x;9N5>&@<{U~$hWej<O-P}Qh;|F!;TP?(b zd7P2GE1PhG19bEDCSF3Tul0H!?9}G)7a_M4^VI($T7zA7+n{@3_ISb-Nb=9C4(YeV zx+bS!L&1|Iwjm_Do)rkqV~iOa_qqVizFt=3H?j_nST~l`GDJGa?PT;2lTpBJ;;#w# z5+B#WQH&+ewgFzAdw+Rr-)ryZTL-reZnZe!SDRlS{$3*@a~PP!UvK~~f{e&$;o3-m zLUd(}`ftc2;LcxKOqpU&O%Nbp@Kgmp-wqQ60jYIqinpexq<X^YYN#@cBaa=VR1^{O zY*XfDBu&ioi|)Y?be6d$0=&mPkRy)<e^zK7l#P(2>SUh7ZYZ+|oJ*g@qwHIR@m|A< zxGkdwGnCUHAF-J&O)i(aMu-s#Ck%2>b|e2*o*hK6J@f3Wf<+M2wCg6;AwIZ;WM;Yt z`jp%n!zYDEJhsvCMD{jIM`qALpK?f4jJ{*MU`f!acC_!}!?jVIfiYq2aE0&@7*qow zC{s5mvS9BGFe=0|JI~~Ja-PWvU=Zmz=7s8`3(Qk-<w28^h?6L|?3|UeLrqGALrsoW zjx#BJ`jXa^JIU@TeP~in<sp-j;UN>z<Pj6m<O7pBfby`eO+k8Qhrqy91n^=@qXR0L z>6ovmQ*f{}Uua&wR-^;1RZ@*ln(XZ55+%DKaBz25(p6)1fEek?)8+>%=DEusD^sVA zra*1lDb+VD)<^9yFx2Kz&9m_6a7G$G^YAoTVot_PRpf4t6m9eU?-wDE@iBgSdt{I% zwI$ElL~TnPHO(~`6d_NYX@LhUFqO<S^H5*R$}tf9*<n~A&;5?S%PNX91|@b@7reBC zjE!cbn9V2$WJen0d0+>TA$BNH2pMlslS|JkM9}BgN+X*q1BB;(_u#qo>m>7BTL$e& zcQDNNhyMiAQ{Xhm8{G8uy#nVy?~HB~uvB^-@r&{Y&+&tjEOH;!^~%XBsOGr`IQFK$ zn>;3%50+(s_<2bjV{gkg4_5dsMf})|BsVr=SDAWr5cB?i4IUQr7*j!i{ALwO6LhI6 zmiTMn*%XP0AoS^TQ|1>i8gQv}FISW$^}eqYX~chKp{$Wkzmb$2PT<p!8?<|}%~3Z+ z@<}=JpYc~*{4UmkL<2y^rQAN)hR|oqgZ5R)GFVAS5njK+q$bT7C*Z3bPs5wG?+B3K zGJiUn#|_n^D*fj%+qxqLrPEf9dh%m_r-4I0sycxQehIdH<$>$i=K1BD%-<7hvCwg< z&}@975l?YMndb-a8eHZw&uOS<m}iI}>`ZNbZ-tYT3265)%hEG{IEO1j=23NU=7byY z@elE)6c181>BT-Sy{sP!p&phqCCq$n7a`0actExf-zV-IxZZ^S=*E>z<r%gD?YLf2 zaHuMNGb7JPO<hp12d0c8i39H_d(lYtis9>BYy|?DWu<UtTs;DlXtWf>)M4WNuT*Gu zC6eK}hQAU3F#O1iD+r_paOK?kJMSi8gv`zG&N6534xV$)hhML8`wyGFHqXuH{8an= z!RzZ|)S1gGbkgE7Yd{u<E+mHJwKaeEF<LF^|LZLTP2e)_*X{o0t&Q3OcWX47JA_Ld z*y|X=fW)(5z-5aBSSYQs3?sx7cM(|Y;T_^D>&y(W&(DN-ieLe?7YJlQ2YgeqcJ!Qx zE-3`snF+#jzktZYAL0<&Y$D;rzM!^&RJ&K<mIZ1cMs7zwtIB~8mHA{RN6Q6%8J)kA z7buefK8h#4?h*0}tnneIwthzTC^{ZV7$1D+Y3K~MHFTDn!+(aY;Vn2elnVT|#X`g5 z5>Rm?T^U6pd#WZE8r!gg3v6kmM1y7NtP#X4UnBx8HN<ESr$OvGo)M?}%dI~+hOfmZ z;u25lp_j3`AL(wX@3{!3S7IaG#Zu(RQbaj50BqVHDo2%1f!g2b$qn`_8R4&G2Kp8s zOK4%x2N^}v6s`7g_U|`1(T{Z@+Z!m~L1jy@+hU$!92em1YYUj6Vc8a%YjMV6!QTv8 zY49r=3rc6{VpOBy{%fX$EbKB*cBxB$fFYO~!2{QhK0Ve50!w3~=@)YrK#cfC5rA`m zEbHJ);}fe(feb2FLu}-W0PIi*9pS{AbAkxLhgmJSR#Yeps4slz7O>E~AxI%v@iRAA zUKtZ-u~9pDYC?4CHC%Vh<*EprehB?d0sOwT%0>w91`Mz5>8rSarzIjw*cVfLdUdep zt*@lM2I+c-xehNM!&uPNKW^18VQl<UZ2?Ab9Y+C#E90CfAYeD*I!0t!TjqiaKMhL! zO18hhM+Tg`moNK@zr;rXju~7x#JP<v%!YB9;urD&VPXK{&?fQMD)=dJJR+<nqq=~! z01pE9O>_rhx1i_y48I7<I9vNrXac<D-T$p`zXHdk`*9cAjT_4{-3zEK(KXc;I&9Wn z)Pt=>zrvZV1rK0DbQk!6_O&Jo)df!M(O{?i<p*Mro&^p7f+Y!<16m|>4|cdN-FCe% z4f=sVZcE;0u<U7<1po;6-8Kf$j7i`NoKN!=o(vwo!g++-MsKr#1%=&dxQ4HfeSzx1 zx5Urxk?2#MOc*(|U<;icv{3jhp#Qzp;2Z<W>ji$hE_%1GxAFpeUjsE^@M}hdYj?ch z%2{2P0&ae-RXk0Rs>zfDs-q%(z`F}0um#N}-H{1FKdK&y@k!5t>|!<|;>32qRcN2i ztZ=F!<uS0}%7CZp3<5b|6-#i?c7akD3Y&<#ADA0|x)C45O>`fSu`oiA9fn;(aYDf* zoc#11+QJ3YoMTQS3vOZrl7%im^MUQsNFUn{AqGjF!}lS3n9~=!2x=%`7B~vdnIr-{ zVtB77WHJj}0o~|nMOi@M#(?GKR1_~@i^4CDCcRpBVbF#JG(erbNr<bPxtgIl8inT= zdQ;QOsD}*w*%iKI6s6JvB3@$4iL&Z`*IimX0Wv2sycGm6ba;Xxcl*G^*!$r}e8_Ra z;&W-tN2;bvx<TY~2Fz(U7@d*)x&Q+UKkAsd>Z0$3P*)+a&DvFN1}!kDqfCRq03%ni zTKnK+6A1+xp41T!k%7>Im(E9V#j4We!8^69>-g1OZG#`y2~<eduBIO^yt=umk^G6q z9*32;YF9xBDsQf`$T$@sE!acO3U|6}@qXJ=gq0G=N_(}d{uE_V{>)ExZAHos5imtL zIzu0#a=J1l#UbXn$<%XoPz!nuyh>9#<h`rxud8TuL#uzaha}+7Db(PT*LbMR$^-9n zp%8Z&UqvO?Rgcf@K-M6I)JOhKuXYucExkB=4}M~ip9!dU>io`);`AbC2KRa5&CfpT z80!x}6@-T`U;?k~6^pPSz}+Hlp8V{hj^hz+s-0vdNYF+EAX!KU89GzM8>ov)&?K9~ z%pk56YcMtO478no8amQ+J_=Y}2vl3Im5}5q+yu`@Ar|WNgH>draKZY%2&=IOjPTdk zIQSYquVRqQI{XHhIq8N)He22oKy{03DE?Tl=zb5;i}YZb1D007;f@EwtF?9-k2ptr zor4##tMJL@GWQgMc~{4V+GKN{@QPlP?t``rX@$*)vIoyV5pAUOCJcEvB|8Ny3VWK_ z3|DR6-10Uc1MeLp?Dyi5-6~d1G}E-44FZ?ZnDd)}c`hg04SxS-k#fA6?FQ%{RLPHY zwmS706nhXWGQkb(Ga^{C`-UpM3GnS(C*%+lzZLQcWYl;%(PDIeJ1hr_&7CC9E~*=p z!#@kT_FTy#a9*%xVrUxF{sQJF<g&8}nMYP>{AL#lB{!C?pt|G<(#$`UK+rq*cnqO< zjXJy;j32Reba&85-vsXPcL5HFhrW3c@{bCOyL-4?tK8k+E3STj{`)yIzNm$(FV*yd zKs0Hf^>HoYB3l7a(4EDV1%E)K2=Or+2Yb>d;E}@)o8D*O0il{lA2#_p2l->?x{a~w z<Juy3RKY$j;(>|FDgif9$Tlo?v<7lX1<Y>{DWZ6Wp1whNvD4$1N^6S{4vB%GPBMhs zc)x_YjW~)wvUG|i#1!sDo{Qe51eeQ*`2~`7H7_Sd%neCt0{8Gdf`}~+KL~oWIJ}## z+h07m$qg(!V_V_iqb*K`NlF$Ys%!Id?a2n81)QH`s)AV{QfjHpY$kO)G3hf0K2R{r z;$HxDG7)6-$TI{VZt9ooY(B}F_jciE*Nm>N477i^a(tZ(buUjMmxBrkHd}{3bD*2t zw8)6@7bcS_iU6#ys85auPm>D&Nja1<pT(AEuc7$jSK9a4O{&1k;^+(yIBYmD`kCUT zsxOlK9<yDx<kYVrMqZd33+}F$m5Lm$_ljRbj0C4oz1pC!8(U=L-!+VQ0&HN|)cEll z(`pEFSe(Iaws_RvCeyJ0-BEs}5-n@u$G`-o*T;SzvCJ8%6U!WS2P-@J@q$J4(Ux)g z+T}3@PL?o7oCOSR`;*N$Wm0>RY4;~Kp5&Yxcjo4sUP#e-=@n0IK)~mhlLLq+fCWt0 zgjbAVHRj?&nte!xNladU<z0MNF(=TZFLK5K5s4V^1S0@g72F|(rVjsN*1QFru&7?i z?-c^ICp*Y&ac1vH_;haV^pakpJK<{Nfkjf!bUJ%2?Zw!$Xrlv~b@=&9tSxZf>4Qn0 z+zXp&?MW^bIQUp*<=cPx1M04u{n}Fvej*4w_Ee(<Vu#HKPZRIqXG>y>xYvg1Px=&B zC<58Fr<%JP9?g4-7di1y1gwlzUwM9&1i}@O;_4oZV0D`JDZTJkM@gg=U4fn=+_8CL z+;g#6d&-;6Z06uoek8K?G$)4|JfR{ybkTkq;8g-i5w(&L+j1uvLvclb-Exayn?FrE zdxrdK!lvIO%920b;0hNV6P|`WQ+M%nV}GUgG^YtL7(VUA8c$<=0GIf~4NrSAji;&r zkCpo9@PLm%24q(}&Cj|ZV?B+pS1?vjdqV|DkA-kwHM`gVr3_N1`n;!ipw}w-JcglB zzE!&hzFy~=D1Jn(wVn<%Uuz&DH7KD~eqp3%4CKS*prhMmujxK~5~rf3j>VvQ=&K`0 zj<A@V{SyBBOQ$VZ*SNjDNtwscY_aqLz2@Zm@Hl@D4Il}{LOO4x!(796fW-MdKDNrE zNy%Sa<^b%d9MdEE>b<d?(e0t5TIQi0wbpfME1~-KYfwYz9U;E@T7$==&TEZl0EXxx zEQnVjU2E)g5df}X;$@Q&!W^I!h3~lr;#=Blm-f+XYh1P@P^KjzsoIy}X|MEPA|2s! z-0czDdX3EscDbel<h6E#UnYsO6$Lloa6QSjw)8HZBM<*;Tb*@OD%X^xdBV<udkMo7 zx<PE<AKoG92IXtr@LawoqlPE*HJjy^$h7dM(Xc&vU;PFL?5`c%^djABY#=Z1;p0d= z+!|85_Wyl2xDMT{?LyLoS`<v^JvF`zZ(=BK)P~PTd&3vingMmqno)nnnH@5Gu><X` z4gda`0f5JX4F4XwH2ixGKJex*Ay0VX=bwifzSdN+w9NUh;hQ_d&;9*zS9<t1sAzOy zvdQ7?a6bfNg3HD-W-yp64{z5Fo?U^juGs8@U+9e7s2%*mpTxL@N6T$CLrQ&wDt;vn zEy&fRy!!?BIB#lmB(3s<HLuSswTa7wAN+!C@9_)fl{kFl2`_20I8MV)MjyP2%H>6N zr8*;0h||;G-n$EA9K8DNy?@>)rae?;;w!FgET*wzlyUV?+qHvV@w02Avmpn+=Q>(2 z>A^p?4{mPO4nBcRcn>Ul@Cgb+e>h&GL;|MI)jarQ-`kQ8KIaypkrYny1QT?4lOI9a zm&G`IyM6F{FdK(&@3s!!!nV}i-%A<qdcnk2?eN{k+7gl(;b!9oUn8=`R|np{bNFtH zU)-<~7uuKv27n17=&M^1Y@%z72!~l~hwqDsnM5M^T2S$QJbZOisxNZv1D|<w;K!ND zh^)gNz~!fSG(f3W*q|mf6SJ1B;#wk4S>F(ooZt~DLk6SDMrRowJR;X&=_kF3%G~S8 zm;dm6j2Ym$ZBG2~i!WU4utqU?Xh*aOay-;t=L~CcJ8TPo?ZfwRm6zux=8+hlFb@PQ zzzRoID_m#}{iZJ;c;61og`2_QS6*qv5WeCjl)=F*=(;>L$#pnOLTo=6UTTN;xnF19 zf!t@mEfav6(Dm6VqUy^CL1ujUKE@Dcq5NeE(g^TAIdUM+d3c{=ZtT10%l(5_Fvi5* z!qUPoZi7_*{9ie)gc&0#hX4Fu`_1bRAEbbT=W5da^>rr4$hZIUnjTWS{Teskomt0> zv6W(RyEHC&>&@kU{qjm3Y0WFiepJ9d|KI=a@&E82>OcGrPV%tE^{F1N7+xXLt1onZ zRIK&;+r1zC;0N&2y~g)fa6NBqeV-rs`~h#)m(>H*u|IB(lEiv=e1B(lraq_ojL+21 zfq8yZ{P3|K{;>Y|WA(@XkK(b%e)RAE=HEWXf8Uve&E>i=WDt;Wr~9K~v9+PTLIE2E z;|{p7_&c7iB1VKx_y6KI7h3J_<Hr4;cp2o|SjG8*KKw|9b%X2Q>0<GBWyjYz@zY%S z{;sE)`pxJ%t^`g*??k6N^)wGZSZe-Y)bNjrrRI00E>E2wP1)n$f9yMFJx;krzxTEo zSigCr{{zl{w6^}%lOz6U{Ex3LT&VxYQ9Z|Zon3XFo05^$R)19d$E8;PJDhNYRYc{| z-R%9S*xHU{@5le{Z;KTD@z($T_+vl*@#Dq6`8S2p$Nsk;KmK^}e-@7w)F%C(e*D9- z=<j~~H%1?gYJd0mW5s{|&*>HFJoa7Qd7O8C__yDAs-EtVj=6p^%}Vh%-+%nyLkD)g zQ#-nS{O-{wwWC*$J~_HyM(!Pba{O%M9Y1??hs1LxK0Ufi^0T8aj^8}G|3Jp^&yQb9 zFMWFa=J6|0PQ|ZN<awIsy)ysV^rcUapFMu=_=S}C6D_>V2fjJFe|+=k-tn6SiBFDS z%ilVFu730et<XA69=}N4=WYAm(O358_+})IpQFkj$@pVx^d4V$sTMCfsOPPmI`J75 zzqWF!_>g3tj?a!hr&X)ok53<c7X6C(`HV5YlFIDV&mOV6bcyNnYkcdbal6Je^5)B_ zpDDq7)sJ3aMn9<^{pR?mej)zu+SbkEpV|n6d8x>+e|2=%W>RZkSv5}-vt`vUqr?%@ z=I6&RQ%<8PlX<Z+wZ1z31?^CjI`bX{@ABbqj$b4*eTzk*-%flg{fv^=s-BEWUu8mV zFfA8TdH0BJ9lvt?Q$Ffa(B>yce@acgdi3S-3uy+wbQtyHH|xCna{cH7Dn#GE<n_D9 z@A~qat`yz6V~aEq&$8gTqkAd(HG_0T-!$WPf|M_vMFA_S#6kcu6vkAHK;z4!FVeg* ze1Yf}<uJx3(>i|&5EUNBr<n<kudx1n=jcmj{F~!<0pS;!{R}z0Q!W4>C}-gwlL=e^ z_NUvt=d6!b@}96MfPBiU?4#eO6^#lmqN~L?Up~4+d$CPEbPMtpTZmWg7C`1VR<9ks z#vrWv<<ZwJ!EMJ|kKCU|-Pq5O_uJ?KUyg1vxLnu#U)qf_&HBb9u&nWk*W<;!`E#Y; zk@xP=7u8FqZvrKBBLSu$9mA#<>?^lZRr!r0Vc5ZcRWH9P#Iax8Quz}Pt5tR7K>$8E zVJE<wW?x~-m?@z8_-B0g3p+Xb4!Q3h|7<*mx<AXK2e6|0+xCukg-~a?IQpH7P`&l` z=$+j1Klrusow2;<Q_EvHV&BiJmV7VJ^U<fZBNNYy`P_TuEA;6;aLttdLqzRupuc}O zImm+YH0o!|elU#K6TcMUjxCDAyGdgJg3&h<a*J{P%2B62KLDy!ec0Uo8c+q)EPEq9 z=$2>BffJEsY^y+E_s9Se@|@NKKfW{qq9`0s-l1VS8uf`h&+uM$3#JBMajWOVShGe2 zPf=rfQ{W5C!~iLU{*@bAL=`x41hy>q(dQ)*1S{2#ZrSTcj_#(fz8UQYJqpOk`F5Kx zLZwpf*YTN*SHv1$+S^m;$Nv0DZ2g{_h9&^9R4w77s{B{c+VjA{E8x;k;sx4F`<nrz zuij)cgKHoDA%|Q)iiUU-Y@X*8$fAT6$r0l3M62a=oh-{3@hiULcE2AK=)qwz6^x~t zb(4J0J~~M^6D+61gXq)RUnJa@dYET2s9umtDu5JS6(+1~m#!WEv^e@OjRG(UTxerV zzN1JWE?&s^i4H^}xT5>;HLo~%_ENMf5Cz3I!C=ykundqp{&}i)FZDAe<UN=f_f=Xw zaACYF4vtA;g9re>X5;0ZFk0?{R>zoy+$12+n$(34nv(IzUxsBlf^?-(`k|l@bq5=Z z9J@YfTE@sMm1re%X=&x&Jo>VJ<mQdlzEA7SQ`zL5;^>1IUY-)b4!oJC<c{M6El0Ox z)b7I+0PKac$ND}$YP8%hu@@_@Dvhtg22Rjj=RER{Zx%<d(G$taH&xDUdiRavs&d|E z)UTY#iJf6@0%ru{G&U1ycn;CUWd_+lsWCVj+LqF%Ig`a<jqavWp+`dE6tG6+OK^5> z+PtQ}IR2$Y$8uqeE3rsvT3kCb`70ZQ$ztyQ<Oa&ap<DzKe1KU2-F|_DvmGydmVR)D zVm4GFPVVGa(li-`qxS7TC5Su0?8Mg?87Ne?;Z>G1TBRf31fGtroT~K#y%u4ftP>lD z58amcec!Ic(5MBJ+F>J3*9$BWyh)WMJ6R?8Y+2$9iQhB=da0_FtXN(wDoRqA-@Nc< z@CwAfY|L`Fs`Q!9046uxd(=6>AVaClC~Kvi#Xw&c3^KklnYT=Q22Lh6APEKsUHdB9 ze(e$0K3YosNTn&`CC3t6vRx2j1O+fh2BgRWPnESZ?u#Uc|A7#A1t(OL0h*!_ftw7G zn|s<lNfPEiBBOR8M}dXqRCD))Yr3ABplWR1^j^6%On=&mbnUt0pWC%tM3{*h^y8Zn zO&z~m9Q`JwJ-Fc5H^Ll!3ZnTQ-vkyNEO;W#HSZ#w5PujG@dxr5WZHr$5sayQqYr^$ z;CWx=BcQndLe8DyQ6-bul44?ZbK%cXr8?yps2<{L+PP@~^5)=spByL2l+q;C#OOve z;=v>&mdsy_-ecMl7>PU`e_qU#47_ZYekyL}T^A+fp0Nz4B?0VMreK|3gnX8z&QWZz zpQfGku3V!#`7|L7X-M>9^>@=d3@cS;GduQ_D5(z1mY9@SAO}u=$*k5)?Bx7W!0U<0 zzv(L!&~zGK`qI1cG7!mRoEC73<L45mD!U?wBOGT6dGxhKvX7EZH_9jYThC2RxvDI% zNE7-Z&H;A_2(LyHX@0Dr9Fr6sCLB{hVEJ;!I82Cxa{^ug=AILd`~m`?8?<)xg7YIp zQ4x)Y%=i}x>fCWbBvhcdq|u6FiTR93BB);!0j5Z@H6x)&NVCp&?xP1`I)7#p>C5DN zz=n}2L50FF-Lh=f*ablI-PE@SVK?dkcK>T7u3&s1t+X;lxeDVd8+z@KO77KZDMA0| zViGzQDE|ZUZ6byv@fLQ1+djHiM-p)5;N;9ij`cm}@ifpzK9yuH<&{TYv*aH01+!+9 z)f3Z-#;Rn(5;?;Ogb@NS!|OY%P9V*}%)|?Vo)b?((k{5Bk~=}|Y@6w~YEoUWged{A zCQR`jt-=PSCITd0JAy5JhgZbW?6gSBrrs}DNLrBb`<zLBMFjXZ1@5k&#a<Le162u8 zW<?FHQ15^Kl4E$~0oMK$rhbj?ehGSF64FqBdO_Dw5ls=ML<}~bP{;JJ#rP_AP+3M3 z?ict-+hbT|6XL_FQtU`OTh8rQD*u=!-Uu}WI3=N-Jl$V8)ox%AT<XNB4+Z%uVe@nu z%iyf19{qx*#9kR<U@glM2{ck53y^09q1bmsOVwncZ=oNuy$FPss?!n~SDy%Em9RzG zP+&3Yd|K8L9rIekD7lq#uI?YHpv)^0Q$|HMN#JK@=3$#9^nc|b?~AX}d;(6$t@M^f zSJ%O}a;Kupc0U7uj37y5QHf8w6jdoh9;+<Mh-zR-=0~8D4dQd7e3vWDazZh=J_{JQ zGJQoJi@6B)=?x0lb}=`1rPZm5vN_vQ6rW`nq5Ok1=hX)(qgwfn^HxG%?EFCH?+5I& z3(LJkZ_DT_Zra~ap@azg8Q=I6I1Pp-8fQ}n@~X!U52{KxN4bBnuXcow@fzwzmR<4# z2o*7+pBuGP&X3Q$Zi1f3s9eUNE9pgRo$Bh_po_?LlA;lTH;q3fh08MILDts^{SBW~ zLKDxx8s7>s4Pv0*)m;A6U6Hmf?SY5XM>3-5{0kY0(}5t~<>xD?lKWuOru=th;mha) z+t{_S5XxO=Y(GQTbuIXGXj2>}f;pWg7Zqv7G3HggHrz-w4<rJ;PH{@QV60|Jus0|P zg-p3{%v5~22r&LimVz`L`YdB*Sf}^sN&ssrVUMN=bgVeKEw?e2epfofSCEVXtFfqG zrq0+EREs%(w5QCMBUDg~J;cBj&ER3uBDyUS<-b?9WQM4e8Oj5QO#qXeX53fq&}pzq zLhLCcjWx>n>gY`=UQC!R#`YO4s#zcrhlrrf{EIG_6-Jl$VH&E5+=#=^jg!k1+gkYs zP?5mg*PW5T&nBt}gBVLxD9vW!i?E5nw77r#B<LUI87oF95cVsur3}?w{)tBD$RAT# zj7*MVj7Cr@pOMjp+U#mlA{u=!X_sF+4pHGXz|OrQM8_^lZ^ed1JyAS*^gb<TWqz>; z<N6x9!`wC<WaA~6c{Ak-@4OfEh(_!^93KNkNO;W*-f^e_nkK<YENuek2PiWy1gQ#O zA^{}O?ZkA^kXEiwl@n>1RulgcQ6`6sz)-PVk<3)DoK9<q20zV20tHlR$!^fcGLhgg z5p!os5xNk41g-&U)132(5p4r4{aVb)AM_`+6cu9|P*vnsO*Ors;ROCR6CH<ta>DKs zq^TWEl2|V$lSWV~^KO2nIFjoA$@!%nTcC3QMx8wLV&ulwh`fT8MQ0>LRrQ#QfZpQh zi%@<u4Y4(8FbG+^7}OvrI|Hy$pY@~HQ`P(h^4u&K&R7-~9L+@<)<bcxEoCktIul9f zC}E@oN2!}{mh@Z<7fLM=pquASc2ve8X0ZCck$8H^cv{nV3z|}=OIde>X0R$u*bdB{ z-u{MRC|rf=D>di1LeGFea5ra(r}GO6MpRF7LE2I&5xos)jn2iZY5*asR1>izqf^Ot z($V`g6su@Grz7x+ENRK&!s`Hzu0iUF&BbOisl1x8A<@iar1b)30@wMCEJfUNJPaez zjhGU)ZW!be4iCKKc8<2G$xPHW@|YK37)?6Sl_;T@l;AuXEc@waj=_wqS?F-->o^q4 z#6vUuKn#n-&*|4^a!;SKl1Olhui!-hJIHIQR`MRqK+0gwvbsfb#47!qWrtz?W&J2* z?#N^cXd~c(;ZO<7OhQm{oS~#j^%7g>+Gi9*4_$fo5xq(u2=tb!e-4CEni9N0Z_^6W zywoRXuTd$oV*wyj<uDSMOz1-3qB>m(+kXA%w`2&DjOOi#AQbW@Q^a;vu?5(J9b*Ul ziVDFDxB;aZuf@xBm<B`#^dA&K<Dhk#P75h6E6d~`T-3m0emE^lG((hT5?f*hkQ}3o zWfEBi8uKN;5OWk=cW`6`gA)K4tqBi0QG|Tt5DH%$1BLhmR8HuzW^|E?up4v&KufQl zB8`4Afkb>oNos5nDHTS7+n_v23o$85_(7<gq0wYXxbwJNAw?Npe<)LFGil=n4v1D& ziHfWe;767gIt02j;V&gkV}60Y!gTSxAKb5Y+jo!tm}@48$O0HGl>%o5Pc!1x5$+XS z6i?;s5`|#MXtwGsY9PUKl_T#@w&`-myyf-(#;(SqpJqYC9U0Hd2Y_Uq*3rjL6Q^jE zxeMwP;$>P-@m40PVgXD!?ss-(>PQ;A`3_D>L^s2x;J);8tiJ#pV-1bp16~Pkg2Z)> zFN8Z=AboWNbVaoOB1;^6hU(D_A)!}h?f@scK)%~pUX`sJAd+^zxZOoAcT~uuLX7=R z35*nyuAGrF%hC+D2@?g`dR3xmd#Q@N*|Uj3dhW;>c4>ngIc1rb^h>A8-cOZAs7wh7 z+{iO`&G8^qv8b^L#8hr$KrwyUB;89}AyC>_8NG5#=BB<*aF}*_ATohA7_U3{C#CkB zJC{Da!vc-aCkdhOf51Y-XcB_9UrD6RnY<WZV4n0vNz9C8RR@V;*P%xvZJi)MRjF}Q zwR*^X6}wz&Hh+<4pB2tq>bV4aF`=2Q%&rXOgnYruBpQDFB1oJU5vW<DAn-tgFvFL} zS}3E5A)ucEO{x-6mA;t_QI)YsnuAkMYM97FA6@2!8q<0xIvJ?L48DbhdC4VDYZY0c z3Wa^C>L9O3BQqqV*Rl^@W_$n~0W(SN@*aw~zAwv_1a7{n1?q)_wk?YZP2&!F!z7fN zGP`)3Bo;m!u2GCXb3ym$b2fL!KFl49iY{vA#+-qm86rWbSd8Ec8%Y_`1$gI_O!N^y z6~|yX_)@5<%ER~1;Ru<6YE)w%L%z}*LTrrs4Jyc(K>&+rE0>&-uDlK_ip65DByi)) zG1XwXh|&@pgxR=Pc0_3Z)XD<J>+z*u*v-^$Wij~(HxpP?P;fBx2BI#)7XWxMWrp)a zWQFde`UJcS8=Y3aDQ80>FYgoTj-=-WQ6$Sx5v@fx0VOqBOkt`s=CtP*M|E;{<$_`` zeCzWPiN4KOf;kd`;x*<{<w==z)y4-RS9o`{)FxwVr0s4CtOQdQlp>f6k+UEMVP=n~ z8fow3?nf4%bZJ0WWm16nf~;TS2^Y;~%U#)qTN-*_z92=a)+)7;h!oO7PC8bWgw6kU zY~!#}v9B}Mv6h-EhXCJxYn;e2CR{S&g&_R0)IbGL2G`*H1mJv<f$UFwC4=@onnO;= z%N_H8Se=jwAB+q@_7u22b-4ssD^znE2^iB`bYE_iKIDZW8mhBb$7j26;Jico32Ms> z29x_oDM0Q9V~$BU61rUBh7qQYreaEHE~eCOF_1(Oc<G^;(OF-U2HS=&B@lrpOBuW? zYc!T9A!ST@w-iFo8p2~KISEpDiIm7eD0?Y3U-F%KhdB!B8qJOs{`Y6!2;+-5oEDNn z@01OMZBh1DAd0<Ip@o<Ppfh1<mLV;5%C5G2SxX+qzNYbIe}&(WtJYZN_jCRQ?)rvI zbOuLX1~>XT6DwBDa3qe%dr}5Bgc3#u+Q~>&XBrv=Zh0+#(I^Z{awTPZDO3NRF9dg| zL&lqofel>c#-v)&6*?^;<TpokRH?lh8|L0a+eqckQ~>cqzLJ%4)W~8`iI;vKV^4Tv ztUtE{N#H^eX!o!8`!<Uu`!r^MerWIC0nG+Lp4xwD`#tQHShB3Md&q#&w7t*5{Piih z#U7I%(^wDZ^N?1YmS2fOT;Nk(TMW$bK-c_m?PyG2uhjilY9)G+X^MJ=zf$kN&}i2F z|4&=1ERlb;wdy0uufHPNtO4H%29PR%ioVl#3qi1e=!$8D*bqK|3Y2AKHR)?edR2zx zpiCqY1W8>~p42Z4^&P+E<hvi)x+c>*H-iqV$jicf#iZI|QoVz+*i&G~K<K&<${Dgv zp_wigt&*A6-iV7V9iv;3%qSx$vKgV_6VpTjjz((`BQz;q7TqxqwqLd#6gNJ`z^rHc z8IV2{l`w!{AaiNpA&@|tVPBA9e~F2UK&<j<)k~C5e~9U^jTqsHWO3U0l)AuNs-xN< zUO7d9_+X5}L4~-+MACbPLx-^GV(<G`cENktW}ERiPq>#e_g(*fO!9J|y#J$1hUj zU2CT?qUi?Bv8kv}Enj}X2K5I)>%<08kzsTB9LpH6pC}1rY&{7~wDBQp6lz6>^b#}Z z>OdltXQ~YPpK~5@S?Lvs{P!}`N;JQxw=fz}KaC~;GQc$O5uXS*C7=|Wz;T#-X#1G6 zJN~5)$pOV0rlehvhdK>3^if^Da3AEitR0lW4m*toyf3oGCNcg6j}U}>8ntXB7&Ee@ zEOtsZ1c5ds=xQP<A$ZyB@oRGJx7Dbz3a+Jw<_{U*r|M;lq_qWvz<EsayYkY4DxZkq zMEUQ?(C0;@PJ@<bEtl+qs}h>z5-PF^Bh%;TcX%Mx{UUvSk-4?&$2SYxGAG%6<uloQ z#nA^b+04%GC{&%GTpfU{PZfPqXNm?X?EC_E>P0YH0TemI-RB;Umr(JPKq?TkXQ--Z z&h$S(a(%@OAB;?byF?YzgwgK1;x|hqcRwF(fQRlLmc)(X4AO_Y!lCNb>OfD0@d9BA z23d3aYEtSs!c=shU8saY6#-lDk+uGLtS(4_hM92zG}uGeIZ!#H{j4}b$I1%~i;#(V z_2fKA{VI)F5wdGwLG238H}t@7(h&}*AdRWJX1GLv{uAFpAO{y_)bVz7<zDR60QGX` zQ;;@x)UbKh0-T-rEm4mmk6Mf>3yn|ka{>tE0WEBt;^-DR?hyOWMvh9ypey%Z+J))8 zpmC`bkYZ7IDJ8KPx(7?X&(E{5(_1Do6PVP_Bl$9ax00cwJiR6N%3%Q3A~)kHDwVX- zx?sYyX6Wtc<2PlVlLSPRytvr)F8KH+^B&p)tE<_@+{|jS)|q7%4=1=5Zwc3_A7j}m zi|OPg@P;kL95YRbhGjbvsytlK%h>cWTWK@O8nQI`3ue=koatT=le-;(O}-^^36|0h zvvVHsH+=N$nYj?*08IClE)>c{qS>q^2pbNq-Hl#T8YneE9>Z|D7y`JbTEYORFLGn_ zpaMssKPMrrysNKa9K3VE$`?irAs*Ora6EoW)Zr9i+KNeJF3~&iUcv@=z)&dMF%9-7 zWjH&MqdaLrWnhb9e)B?!N<6a>Nh_oQWk>*ZxD#Ka;Sg<7N9}Kn)RPwJRX%}8lk%PJ zB+sxz9}u?0uHYk3gA4Xfv~WlJ3%2%n-`(UU*8s<Qr@UbAnGiuZzU863fEY=NEE!`= zf~9<pdm4P^>^LczrAqT&@xo%@x5cHDGrCi{71!ldIn4#WxM$@zj#LCQ!=cp+c7y@h zjl5$h%}SV9V3UmLD-no;7-?_ad+ys(85Kn?Lk!k>p-O&Rx5Zek;63e3Vu7-Eu#Nsw zq0%jNio+Qz5t@EU<Du8g%jy@)y=hOf4h|gPGMDH{qgj$r>4!LzspX@r7gX^xz0%)} z<r>R)m6~yW$<E0Rz*Nyb`c|cGj#N7NB68VoAiLbh6>)Nw_3QVoq%}%AJu(6_QG-Ur zmQo*AJ4`1h*CIZHvehl~MpO&3pAyhD<~WvAWL~}w=<`*95`sg=PC0Mcj7~Bc{Y6vq z1#|&`Of3T_&Ina0p?f-6y(|g4?IUILLO#A>i+K#`b=Jg;<I47*nu3?6rp`~4fU0cg zS-nZpSLt=o4)#Pa999V3N;OCujAqeYQI|EfiBp+kl43LmcFwKxp!NzRIwp$xQdPIy zQe!I32g=4&nPX*dFi%kbIzf0?gFjO*^_L4#4!C&`6v6@-<nN0Tl*DLGVz`&uEFcn% z84d7$ftXWA0Hp~)kfZV2Z105qbg)5!v5rfW-8~}d#z_&TyNregSQduu#3Uk-jhFdF zCNovWIvUVSjZjm?>gtqRma{ET-~29iN7eOEZYHy}8c0yGeGp<;TK61q%r-7FzYr#B zN55q<K1-X>u~A>ereMTNpYf-sL>do$f_;n@QnX~DXp(8;crq(}E7924c4-RT57f6K z5LF=W__g{`lA~S0H1M(gVV#WrEEci_Gy9V)a<KchA~T!kP@>Bq(_}rH_>QuY<S%5+ zHyBy?o*0oYOdBN-EpYRIyIA^$sF<e3pree>OOd<G!udO9Cb}i<(Gy-=an~Wd6nHu@ zH(<6`-9yx%*#cxKs!D_*7L5svtdVt<uY=cMh0Cr82M?^909{a{Y8!`8^5VFi`#i1g z1GUgE!L_nFd^M?Nf?Kk4Y~wUOre7{L4FxS@Ebcvq6+2LL97Hc_9O;s#$P+^A8$cam zUX-W3IgURli<3)!$9nSKN;|@#6Gy+y443BA@dpI^{9=X3e1R6|arT!JemsHnI{6X; z%wnl!$rW2MeLF2yg`+D{K%`);1#XxmPDj%>JxbjLc2pD#y=Q3ZtUllic+CKCZ0EAZ z=Ve4=d%XE;VDEE!ETs^g-vw%H0ccTm!8-B`dq0ap+6H1n#J4oZjb(j4{yl32?JK7* zouhOEvO`ll%J`Liwakj`Q*MaN8}U)*%xMaGoRR`k*(FMqUD4e$7tE2edu)>|{Jat9 zhN4heyb%lF!0x1_;I&xs;FeS3C3_Z8s=09kiMenrC$k%jm56{zi%-!KtLPg^i^w=r zLaGm)Hb3c)0vD0+4LZa^BuU(Zt%;|JxuzhN!o4InCx>m_=t#WIDrQ7%QZ^uAU@Cs* zTJTY#U(;0~HytW`ogBIidlObYd*wua8LQ3k(x4OnCzg9~tB8l;w$g}_XO_q`krB$+ zuA}4^wq7PbeXup(vge5@d^a%<*3YUU#ls|Mm{no6UqT8s9tLRJd#IS*66yK&%f~NL zor%Wq3}Dl#F+N}{>Vy_Yx9LMxzMWzgu+6hdYAWFRLkNqVQ%RGjs;A8nG+ZP`>kn@> zVF3D@=r=Q#_W!BokU!Wi5J5*WUKXcuehs|E7F9Fh0;ewqfQ(mWfbfX)MKEx?1+qL@ zBep?4NyZU}qnl*hOI2OIla-I4m|&uyp%0WGu<<bjvy*Sp;}aRG@ufF$=ohF1#=&i5 zs16A2*{K&`aj5eUbIN!R;$+0HX(hBaasR=1u{=SVYBA8MlK+93LzDe&HgB-bIRaf^ zQ^P6?XF!Nd6hQX><cx68i&FAKSRx^Vf1ADmQ$&LBqXDre?0|$A!<8O*4#t<!3jKog zZE_N~2Q+}@^sxYTm2iTblFK^fTE8QY-N7oM(9U^D5{V5$*{H6ft!NCa_L+-vD^}r7 z+P3*!B&V@ALQ1IGRcsY)gf?)Ln_2<j0xMPdBF<;an@nC|x8it~3#H`X2R4lv>WPE% z%n9)~xd4YWjYBo>Q&aX;ng?jzro)mgbd-_E=$V<agbh~H;NnhD0YJ+d3@NbRxsFTt z0D|)Em@G-dv#Ks=!H%Y{gl{OTZjqZYI?vcM+e{@AfKBRw2|YdZxB^i{zsZt+6nBNm zB)x*e3QfX_nFRH?<CJ}Q|F4}Ore4f|9E-dKZ{?x$7Ax*d{r{bv%Z_Eom7e)1IrKn; zpTdB9;HlA5!!Y2H2eu!8WJ?qQwb)rzl!z{}l2xRnCeWZLUaAOI6~$M`d?SC~|F76* zpG%gy4T6<BZYx%-d#s4PkI?d>X22?4)MkgiRoE_y714LsN)$h#WZ}%DGs-Im`aY*N z&W{oDOnkz)Fpajq=;v&gl-Ch;9#M5d8OQc@75JamRq+9Ma;5u9OTIAZXu4As^Ww;8 z<X(|uXY7RgRaAl;h4|#P<J%>-67`0Ak*kY64j5wsAlEqICTuoXMog|dAqkvz=69M# zTC;z(8b$A&EX_Dj(-9dne`fei;e8(2At*P>)F1c*?fKUj&HvMs2KW`r?=bqoJXo)A zzbIVC$~{jL0?J^~eQGm{c7m1jisxstN}2amLTI)|1yVrvw==$0pqJClEvS#l!TPxE z<{J6CYcL#>eB`3w?jw=VyJwlT{KOTGq@fS=&I5=<-BAFC-jqyqZNuslge`b)DP;Wv z(<M;tQotqYXR0%M=7RtlCF`<Z(kNLF)h%NEgX!k5P5-3IhTsNM@^W)pe~3LLB=W)Q zF$uWnjxn;z`1H5xQ97pZ0RU0XRneoo9dxOlqKbi;u&WBa=Q|U83zw6qEJu)Nj+j6# z>Dnb8&3Pe80tqgf4RSP^qd&ys{K~L|?Zn#=Xcs7Jhkoy3L1SsWW*BluE|sjUN2o?4 zl9cMZ-vBBqnRm<R2oR^sh}u7dQ(t)D`z(KemG5IE-R(#v7--T$x#%N;%@VdEESsYW z+m+>C3SkLSD9?tcS0{5PKHOjsW>=%ZJPmtA?=FeFP_#^A&1@CH2Iu+*tqgKB415Gv z68))at|k>g(f);K1~F$l#|{IfH2|fe4z$B2o4@1#x`26MVpSrzH0c|54ZKuHB@$;m zU7&K2?WV)>T0-p3jWWq`7>hP}OhD82rt@=j)T*BKZ@?(ZLb>YzomZ0k7ulB{?o4$D z?H>20s<nc!h<X+PZhb`gtx-%C38115{?*1DgdnD?U8fu3kDU3gDAuPf9Brze>a?>b zhn9yLhO`niOcg7`a99LDiKoHUqwYQzVXH?*$nft2JbKP3Q06kAkkc}dPz0hrMaz24 zo~ZysY~&Mp!&o>ynSO<oN7{6@=`6~zg4W}0;g?`PMgn1Km<C)#{LHsL0`#i}Qkn{e zroy17N5x>|{sI%{>}_}bifTSn#Q;`>wGvTR<Y6kZUD8;Tw%-Yx08`4*!ry?RfK-5V z++ArY#s;+!b!8HIZ3Pw@P~JF8f`oOW@D_0#PDS_GzdQm7)go3{5w4uGO$g{DM0N|K zgXbMlNgriKlO@@ETu{lsCdTQ-U)TFWL}ZM7axbvn;kW88Mk4KsL$#cR=M4#_(g8hR z0MILEpCU9&V(d`-Kz4W28(w#6O?7fnt;-xwB@;xDBUwM47))5z9cHzA)qRHCnf}xm zF{KmQ9}x2e6Zt-9xXMTcoM^{<ZANbvnGUNHsbnT7om<pz8^f_v$5G0LLO+^_vmX@S zSuvl}A@b%lsh6+SyeWR4SpDwZIviZl>UU^}*ANK^i}~Jl$qsvr$b#qA)0by|ZkG1O zr5+7Q^HELALBwYVMB&}_y7IMH>W*Q3r4$}|?Pzv`KyuinZ4u>%DzwG`65}PVYu_?b zQ=3c(K^cpW#gRzyoZ)0Db3PhhkoSGp(A-FZ=$aO=H@$gqaXTxTHh{*qy}?_hpJvN# zO%8U#5QseYi>HXqNP38A69wrcRQcMz@LQALYHhomj{`u;LKU;o>@>vNo<^y)pe@RZ z)y7V#odmLsj_RJSR1y~hqjvB@kg@s^j#qx1kT@VQlqRi3jn@@ma4J?n%=NV(Dr*F$ z>%?ZVW3T|-%5}6z!%3SISy-Cu%2nJopvDY<vO4=*<<MY$gQ~<NP2Mr9_<BzByhy}? z?%Oo#ip-YgB2)|dIWT%WvnG;)&p|Q;+tu!Si1;J<d0!NbW_atyr27h}cGBk34Z0;f zeD1^RZDF9b3lR;j^{bmyB2f}cky*qtAc65M=G7Tv9Ex_OV*-MYLP)}R9hNlZu~xu$ zPl<TBM3_tz1tC2^=)U9M@fL1eT>fzS0qgNj%>`G0X20gF<pZUi<s*sLk>8bPS6%@` za&bL;r%i2v^jqz7j|?@+EFo^h4#pQ{l8XYq=Q(U1Bb<Buq|a;^{z$imbwqh7^pCax z?zUsA@||Gu)s^SXKzP{O1gBG6kO5)mHYuyd$9)B4;=9%=#<Bt?O+|0e`-y@06>DEc zeHQ^(^#mujsW2{B-lVuC-r5>zRv+%(%Qn#sfSWL={m1B=-}+Ae)8VS`T;pJP2#0Mw zyB0!M`Ltn3K^%w~J1X(itVzZJH^w%tZWTUUJ#%>>)hz0jp{DlEiVF6dHVO8U5@jEc zyw3S4b&=(V(c^q<Rp0S=`cB?y*J_sHlTZ#~>Jd)bK4qQQH1+1B<@)wJ#&NcsD+jXp zYS-l)l4(LnZ-!E*sNAES`!UJYl(-3C&e~2e5D*j~lLy_xuCoym#G|0|c}`$GV=bZ1 zf6U7li4DP${2sK6?}5&CA~KYsyWvLVet+iTEICBH*mSK8f#n2e2Vn7LpQ+9oNtlRp zIcYsA=HwM&F?u1+<1=}rZN+-qdmpOI8KNi1O@+LISp#zeGM?(Xj|K!X#DcnCigSXU zzD|TqX(|9>TvBzA*1AU|y^Nl{!M$D0YP;W=z5Ft2Ix{eJ`g`Vp(lsXPaFZ`H<z$cg zNm$IhtJ4Pj77f)(!Yb}{Tj4et{JvlMPjW6>x|$*i@16DtBo(PZ%{zviedCF<K`3;W zOFQ|Je%OnOl;Y+_XHndZz(Jr;KIos7yD?%^fs{L>$yiAB@44KOJIcYBfI|e#{740c zXJ!N-F@WqvuPD;)XA_k&%uh|E;RzAB*&HZlynkcV`#F$rMmWs;e7MX|lWf_B%{=te zA^ytA-?~Mqvpz>7hDLKPEO6o9vskE#7EDud&URK0={y@k55qNUAiWWb)?X{o&qAti zUGZ#%B$RB0pYNllDS|*v5*MQZ1l*7ahiL^jIfblFbN?@theXeO!1EKP6#2<K7)|K0 zz5u4j4|Mgh=L+8nih+>&9x=@kY*YcAGKKEH%{&Msk`bE-f4&WH+GF-5s~h$EA@39b z1p*aiAr^3OM6ZI`2I!B@!FqlrEkCmv(!>w%>Yrq#IhOk4-2+gh!!_`?7i|?T=hl7Z zG2dNAbplF*BC}Abq%R}8QD(Og%;OC@G|OC!`U*vKaNkKvi*b|)?q;U+$5CuKvLW%c zq=`?@h0_-0N4WJhOveuPw+f7QpkfM<k0_5tqO9C@_YZyi&Z0&a;WaFy1}rl&2j}g+ z{Vc%yiX2_yo;A^1=IMR%E{Y|p;bT&8g+sRKeVM*k|2|5_7ac?*HXx4>2n<zOCE*w{ zwVJFOFkJeAsN+2zNYv1zMBs4atPh?ms<`X1PQqumnIaU31OgOtL@VJ+B+2%FObi93 z)S|4hxXUJY00oI+<&j!OvQ0n!oRo*BJt~2{C|%MMj9lGU>+Y)EQELiIKb%on&i6P@ z=oOtcQk5fO6#M9(-kQ&L!f!*HfFOXd%N)>Gg1QseX!I$&KV67}IOkp44MSRF<E`6y z2$i;&q}{nlGu+4gAYvxmJ_WMqBmB<Hey(<gXRNAK9-SC!4+s1@BF;;Z0cpgvy?)&u zRGx3E_;__q*EP^%X8bIyLB50Gca_e?!+LfOcr_R;U=pJY)nbM;+F6rHaiSha#rQ3l z7BOlnQMv=H<N7dB302+=^qmmZ)nmAzk<Ri*T(>H7cWa<Wyb5||KXDma<(wm&D29d| z-Rjb!WFR=3hkpexG6@hM5v1$!2<|rua>N!_<tCp#+nVEQVDtL{Vz3^vu?j~@vf9#o zAo}Vy*)*giRw`|p|6<dHhS2{iBfAIr=++}&NMMZdH4n164o^)2C44(`O=f@VQ4gpf zfA1&A&|G?BC<@P^vrLV)Fq1<`A)O;$?TkE9#q=%8lI%;mK^8qjV`%!do8wO@!$>q- z6O`92Mx&XLJTRcx8RxQI4zub0(p`?wY6Es!9zRSEEPf_elDvK79S>wtWmv$KR0QWl z4%R5*KCMxUY~!8n>pLQpe#8zVe8F<31GxD$5QWe~ky9Id=yU#J(%01l(wTS;gR?n6 zoqDc}N8nkL`h~89pVNABVtoa5qpPsUab6?QL}@Th)gnZ{6G335+Y~OW3K|Fi0V5ny zTtgIPN~md-%*#z08Jq1FM*>hUGPt*h2xeB)#C4$hq7aiHm304wtaK@GIb9RJ&R)r! zc=SR<pLY)dn)9GHwj*|eY=R;y|K}8(G{qyCq7w0q6rDTjlb#c{oHE?m)=yYPSuddX z=+3|aGy2x8*u)h$j8H3ksU$xkaN<-K(7@CEh`W&tQMh-<CcjbMCGkIlS0G<wayTTo z3YFPvYOd%~9<oS8ZfPj3NQV5|6p0@`0)c4Y;uFbk)zBzsw7n9dBrr?ZrdvhSBtoP| zK3-|Q)vn)DXFZerSsLe$n<<dXVS@b#193aCHYWs+H5VY}@se%3)cu~W;3xM1rlb*P z5dyjaRI177VV2MwHxLl8nkQ+$2I&zYQ(ALg_dAh6Q?vuQa&=Mxuzk4a%4;H7|6@iv zHVlBXJj|ZV7OlG5VIrq?#kEoq8C}Xjzr}Eeh`zt+fu46ra?w*T(3IE%&f?l8B1%7c zLN5%)c9|_?%GKh&YqpuroZo55a(>zr$9G?VU~++=GLM=Fst`SkFZti?`i5g%R;J~t zeR#-BGbE-(2up<bHWTU!_N>p5JQ(#}>~&^k@9nv_xcALDQ^=)Rh|&~3ZWSuQ7BHOc zZH4d}rxhtblAN?af>_cPP!ptMAm@O+0)54Pjh$mrXuXlvuOYIAH6p(tkPw@GFbN{A zL5a5*ggV>Rad7M)8CDR6rcHd)BcZc_O^09^9HgDuDlWL3w!IX_>WFt}t!^CKk%C&O zS2GRq7tGhYo_)0~bWlm{_%rxm+zz-xC-zC`?qCuv^5m=oEM^H&Y2T?<@x0%(@#$%H z+6HjFfDN*lE0EOZ;z7|sdF<I^W3(}&v91Srm-tR!RUv5F^OXC$_RRvG1e~mX^=g)o z;;@7IuxvO?v1Wg*W2hWm&3>$~h>RT9#Tq0cAZI!Q*3YjbJ!q%LURQFXcGuQNY5ROZ zHHe7QN?VjXG#v{9qc_gmLqEnhQPxVfn^d$(JslDN<5KL7&&(f%2mPqf;$-HnNJr)3 zjGc@@N2CnvgII@q%!({q@Iy4w6FwfLm}t(bMM<mFkY*Qjuvm`DZcs3+0ODuU=jAHg z#=x_GXXsW3893XRKZR7unE?_mZWh48CW%`i36xm&Z7n{Kb1_)Ez)ANEhg}iA31p4t zpyEBfbIpxK<fsUd54|B(q}jjmN-m26(3+{k>pnJ?fEuHIx|0ZNs(r1}#39^p+krd& zGkB2iN;zPlp#=%+mDE~71}9}%d6vv_-%j*p9ZK3aw?sCXUz-O<C^(6io}f-YO8F}y zEW{3Y$kamCJ+~8NfEEaLxjQvf+XAe|=!_czDWHs}xSTQt&0=ChTbd%0A2W@yYF5yZ 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̹n3??199{vEp%an#o}YevRes5Gzd7uUwGmk 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 bLz@t89)plvBT1n5w9Oa6(5x0{qwxO#QOH2G diff --git a/libs/pycountry/locales/bg/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/bg/LC_MESSAGES/iso3166-2.mo index 6d63848e9192518d716e89b57d246ba8423383dd..958264c18336ada640031728556058f633e5e6bd 100644 GIT binary patch literal 15883 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 delta 6954 zcmY+I3w+M?9>@RFTsFhZW$a>``|LiHu{4)zA|*PJ${t}>ZM5M;@i66*6Xn4fC(22g zqhg+88KOjvTzcG2D5WDM>Ev?A$)WT9?ElqEzt`*YyuaV?@B91xzQ5o9@;uv|=N3)y zei;$G(4l1nIZg~*5#l(Dv6CAq>NqbqcbwYr6<7-{Hve^4AHUq<?-{pP{|?Ah&R&au zX7Mj!9pc}@nvUaje!>VPa0v!OC(3a!otjV!#u?i}6_R3pXQ=#a^Ls$elWYD!r~)2_ zb>Rr8g~vk8GZEHeeP^0=%rd?LHDC#(Lgy{0Lf$st4>eI042Ro{2cgD&1H<4ssBzbz z<_V5=$Av-_+DJa@J1sC&Q9IZWra=wt0V829)Pi|X3lx|?-Z%wn{7m!b8OvZ};>)25 zsI>TI^LIe6Cf<#qi4Q?le!>!dgqrvw)I?XI^1``MG%g0JzYSEuDNvWB6I5OnjDUAq z|6r(lW|;X!F`U0D8&5z3o`uyrfx33{%wKF=Zd_%ofI7-5r~<ZIe7Er+)I6U<ZR`}( zIu|T{J%;mFLY-K*BLZr|7En7$gz8U)Dy)n7Ip*I3weSPx4>8|k91XR>G1fmG>f|Py zKf{Zmh2}yn<b%4YmO@SZuEp0w?O-cZ{vN1__8X5u<)4Hae+JfrSFJy!g_|D%wZUlf zy=^g6VVZSxHs)BouW<m>2|NU~&@iZiM_GKV`Om-x#7m)$dcMV%L5(Xnu7RxUbt*Ab z(Prz|Y24=~IESGY{v2xOC(S<%HSQeLNnAAs$GJPN2Q@C**a|8y$@)9N>gT^FhIY~i zs^WoAiNmTB9A~s~4Ag`Z%%5WZ3sCtlS$vWCOO0<?d=1nksWfhfp<V(9WWeK4M|T=( z!Yfd3!k~Ef5=BE5kYIiy)Z>%}b#HWs8s8T-gF~Snzj3e$oC)<-UkbI+3h33&-^b9= z?u5D*_CPIk0IHB<=AVSRhCe{%U4R;Q1uA|GYFu!F%P^?C#!wrKf-1BPRDNax*Ixs& zETIR~g#9dG095~As6z6f3NC=!QHjN8LoG1hxYXk1PzzN+y}&j=?R>Ark0yBC1x^sC zK6<EYbOq`$s@2l1I1*~2)=&i|8PlN_?hLil9H;{Cf-3las2vZ1ntv2j{silv<~8F* zs0Dpc16DvKRzRJ=W~hm`Llv^m;)kIYI&S>d`hSAD_Lrf?hqQ7FY-o&xD##m)p_?cL zYT<0Ch5JAq)gX)KK`mSewct4GpKShYs7o>*s?c(%{B=+#Q)S$0+~M|no!zeC9Du6y zsPSv#_pmkb^H4|M6i0c{P!qR;+CZYkyBKqz3dlA8KB&SUf*O}s-Ou$OWgUf3l~1sQ zsnrRNGXv^GUV_1}4C-W-LftE?puV=>v-mC;jDHwvzGF}Ye*;y}Sr`m2!kVn_T)|Lf z*P#}w-Nqdd0X0Ds)WFuTCQO1ug80b>wevY`-AlIw%3le&f1OH;A2FV?{tHm|Mo>Gh zzpi;>3=K?x>PUwwq?g6}LlyWaOopSN#`&P~UWXdL+Tt6b@^_jafSUKX`RAbWueIa( zZ;BDt-o5)<K~3Dr*aK={f9v-^<rhOOJR2&1f%(g!o}#y*7I+_W+c<lm-hAhveo+M{ zy5nLJIe$%*NI(NSLA@yMH2-0!iJpX-XcE+d%gkR5HSSZWaVMbiFIhaegX=djwl;Qz zTy3YP7b6rSA8Mjv^QS{iG#BczT59xL|1PLP4ncmEIbTDa)HSGa;Yn_PoG}@O63>Fl z?+vw{H_tkrhWfI34r<~>#y6n8Ox8k8ybCJti1lB9TKHG%k4Sd&5}@MgPz(2hVX(h( zD5L<dGa5q^PqdC%<}ZXg(iKqGyb5Z<0IUN~ntv8*{IACPDXt$2!-yxFp9NJ&u5n;> zKiB^;OL)>a$v7KoKpE7+Z<t>RHSvc~N4O8_ruqu1u%Dp{a#CG3fXZ(H`Q7OxL7iZ( z`t|$|$IwJiLoHMa^=@7WRlu9pzZU8){?OuwjVEAz;y)OFftoKQ&5cJv&6@~SNH)|x z)dzZ&I1EDzjkSbl&7TEz349hWH?D`;={Bf^cbk9A{F6`%UVxgvX1dF!Q1i8e8ke2U z^;boGEif2rU_MlQ5)6kkjb#>JWvn!Q1T|s6{IASE3&V+DwRl*D>o+%c$l(07P&WcP zl3b`GehfB*#pXW`^%RuBdawd^fLozX?hI4`m&^~&<PTT;22hV%8swL_(-%^UQvmgf zUgE{zesMNKC7yvQq*h0_fEcI+QjJ+q3-yND*+BD0Ky9Q1Dt{`}C7NUY0;qAXLFK(` zaqlLK2m&8NJ!VHO;T+U}Yp?+f>*P)t12sV#sQygzdqB<8A8KbFr~;?MMsR`o<;E(= zJYMG$4800JgWCE3+zuzAv%5eX)X}9vJvRNIj&>Am0%t%K^eU_cS3&K3Eo=y@%-;=F z;325OzJrmh?_9yq0^zs1m8L@NxF^&OAAovpJ+LvHV)Q{RTy9(sb@bby#_fe#=nLbI zQ2E!PzDw%fhR^y=8iodD!(ezf)V<ITYR98t6Icp0VHs=+SHVd50o24tp!!ci?ewzw zAzd7YuY4y8DzAsJKdk=#ABv#@MjJ~kVTy4M)Q-xGD=l6LdlCN#>ga1{xeL^XnlBn^ zBW<C^_cRWGDkLw9^H;@%1jH#&1Ls-75~!W5G;Xy1y~ZOJKWYADs0D+%x;J60@eZgH z^FYo24Ai{SyK??oc#(Cigt~dw88<=oZ-*Li7;1vk7QbkIa5wh^8bE%TIa5(7(%3S@ zEmqws_`DsJqj;qIue$xy7{ln@W()VAS5PeRrSKo9saBw!L&s5T{2j0b^uep>7HmJf z(cZ?;S{KktG#06OU*zLnG#tHv9z=gZY7e01)t37)1pE>0LBmi8Qu`J)tG3*a?q)x4 zd;;=S;H)wKJ=hn0rJ5F4a5Fq=w(wt6i9SXjBDG|8rS=%oqo{TQ4M1O_RY<SrOq7bA zL|>zpjN><_a}lMZzam}c8ak6>7-|tDy#p6kd%XGJKGdH0EpVg7`@vh$qo{+$guyr2 z)h6TA{*FSi=R-XO_n|2$4;|Ds(Z62nqh>Z>8!^4PCL^A#-`WhUY}6lxlluWwd&Y%R z$HsTWuW7MbP%pE)P&@i-qA1IIjhNQ2e*JEhL90#Y8OV+OyH<FU_Xq4nNH41~=zFC0 z5PBA!Mk|n77Mh5PP!&3if~)}ke(^eI3B(cTfPTVmWSw_o*F|cLiM<7Rp*cKZ&TRBJ z3MT#?T!uQKJ5VB0Yl&LXpNN{Hw)pp>o=B|$u><b@9p`TZcA^caEgezt61urv#+iwF zqiLuqT8CPoPtaU+bDM+nCVCyckG7+ykXjgO!a9GhK7X8{r~ut)$r$5NJW11Gd$b;{ zM&F>%P#Aq`52II6r1^@C&<E`Y7r%X;$BIRv=sDzlnh&)E^fQ`-lF%DS?SCj5T|tp( z7aE2Bg>JN$&G-}Cg4UvwXb{?j-bLvY=YjQL8dCdJ*Z&LGc7A~wW*>oVNSX(ipoTUe z4toN+x&6nS{V<8Vaj*x9wlV5njABp<u@pEE6{A_Y{-0yq-0sAQu)s)Ii$Nu@HVVOh z1U5k*A+_Zwm3R*9h16a`b&1_*hcFWG|9v9>Kb5Tkd(kO5v{vXx)CbjIKrU>AZnS)i z(daq~SkQMgYK?z-^!gxQ_t+f&3$c@fd|`2YeZ%6Kg%^5?#!MLF^qn}qWZcN25e2@5 zaS!^>$HfKtBNK9K_?~EW&i8oh3%*C&RMaT&_><dq5AvpGrDSBJWOk0vOz)c6DJeZO zJw3Far(|5ppkhx^$y1(jV~V@R_x2P{^c2PSnV|XOvquyb<%}3PyueeGI;J?kJNZTV z<30H!QwELn6n2g8IsU19Pcgk@7Cb&KXH<zNWqAJYQ@h3w&kwz~&%M6*_JjQg+xHIg z*Y8mG7GKL0kAH5;+#0@=^ito(^km=p^mt!P#v=cwj8j4WcRH2?g#@+))&(}i2bTF0 zJNs(*KE3UckQet)4O9d+?4ReqwaXnr{?e?~LB6it@{*SApSHi0J{z$$uq8gQ5r1u< hDo_E}2Py*_0_*pe2DbPryKVBN-CoPTHhXB${{i_m<+=a> diff --git a/libs/pycountry/locales/bn/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/bn/LC_MESSAGES/iso639-5.mo index fe07f5dc214d22aacc7c0facdd4291c035f6a095..87024da6c43ceccedbe3f3db6e1813b1d8e1dcf2 100644 GIT binary patch literal 5688 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 delta 260 zcmdm?vz4>{o)F7a1|Z-BVi_P#0b*VtUIWA+@BoO#fcPO0ivaNtAm#^RUPcIC7Dx*K z`9@H_Gmw@5@*|*hA&@==#9csa1QZWtW?;|;(j7n=XkQ$|79hg}C~y%-s{&~@76t|- zAgu$WK^pv_bQ6#Un!x~6#=s85Oh6120y~@)NOJ%&I$)dJ%NjQM3#<BM12&n-iEJX9 V^SBzACJXYqPj2CLo&1|u9sq{T8(07U diff --git a/libs/pycountry/locales/bn_IN/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/bn_IN/LC_MESSAGES/iso3166-1.mo index 521bd3e20565978b42dce831d08931c69c7dd7c1..f6ac138f7f5345ab13d1d8ca594f56d6f2daa2c1 100644 GIT binary patch delta 9381 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 A2mk;8 delta 9217 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 V;)q4Z{EDv^t@AHlv!s6D{{bxS4;%mh diff --git a/libs/pycountry/locales/cs/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/cs/LC_MESSAGES/iso639-5.mo index 0ac09896f05e243f5efea3d55f909422e63173e3..134e17b44c8a66ea9bf1f72ce6e7e687662d04d3 100644 GIT binary patch literal 3971 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 delta 66 xcmZpc|IB1@Pl#nI0}wC*u?!Ha05LNV>i{tbSOBplP|^}egVeyl=6#&ji~#!u1}gvn diff --git a/libs/pycountry/locales/cy/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/cy/LC_MESSAGES/iso3166-2.mo index f734a60958ec94728cf6887b7363abf7dcf18d39..7cd1e36f24724b50b98be0adbfd1f42b3524c89b 100644 GIT binary patch literal 34985 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 O{K*gBX8sSJ`uKmp>`jXR literal 35290 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 D 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 F`F|;LntT8N diff --git a/libs/pycountry/locales/cy/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/cy/LC_MESSAGES/iso639-5.mo index 680f8bc2e19b35e0190d243fc3c4ff7673aebc9f..563106c247caed0dbe5731aea841fb9f29a02545 100644 GIT binary patch literal 2109 zcmZvczmFS56vr0``C)!1kc1z_AQW^bH2#@8lD!zP&E4sMQ%;HD=wQ72yq;ve>&)z) z;|6*pL`8?-AE1DO8d1<iN{<8u9Tf#o(D8k{d))Yxk;b2WZ{NIMv(LYsJ@KW7^&<95 z*neYR!oK$qey~1%*z?YV3Vas43qB2g4n6~ZUFpB8_;bZyK(_l6JPUe{c-~XMxr(n; z?0{@Hs5k`AL8eMxfG<P-3}ipwg6!u<@Coofcmezs<b3|A-k&<*c~3&V0J8sAEBSTs zG;-Pk`P}uBWqlFIcAtRk{|oRr@SE!W50!imWV_!%&gU<X?N6R6<DCatz67$}TE#7p z`?nABxftYre_H9k0{PtcAlLO1_&j*O(*IHMUy$oMbGr0@5#)ZYf_!D{8>M+L^B%)K zgY7P^iR19%J4Y+L$FVsk`{kS;#pYh}f?E$I7P;_ufcAPXV7rUsU&O9eO0JU^_t)!< zO)7g<t4s$XR!Nkrh^*I(qcpjbYn8alnF=Q4D$JA;wpkggsg4(`Ue9EDtOKoL*DRZ; znX<vMv)pDz#mf=;DqhZ`&wlB)8?>*IP&wZF%HGN8D22Yt)NS`YnGqRRp(n~{M=?-& zpwI%h)&U*MWIze$D|%BhnoHS9!sR2|WTq-vYU8#ca&y_al{#_ZA(flCNoTYa`yF&E zA?wuit}^6icN1-K9Nmo7!BSkSBiDS-q_-%@<W49*AY*l!_(I$CqxH^JxmLSDv(#jA z*G4*&{XDXAnEGOpWi#tH8dk+t)k7Mg*m`QB1`f&~4av%k)bvQilg-K2_O8ntbf7tk zd|PGYi*~c!k<E^5HAS=KcdowH#HzigY$k_BB{o)BYJ3qI(veoVxMnl-IF5{-QrPai z6-||n>p?nw1Bc2lR1Oi_7yA_3iMV!{>m<d=us){|TvCzktSsFw<(bN&@<y;|9J%yG zu&C|s>~0?Qs8w&)25FMv>g8}TLn#^E%^I^<>10C$_>3%N-S>xE^2(7NS2QLgHxqP8 zCy_6%jC5Api*tNFaw|1c>x*Poh_<`FA<D<@O498%SH+v6DSW{~i-lGtv{`6ZLWhNp z@Y!mepD*LZ+D7d|xlIX~vYq>77sTayYrWo<Asy7b9n#q(r7#q|@!{a>Fm&}i_`w{P zO_8fEMjzvifu~5UWR%DGs$-yd@W;4y6+7BqIr)(~7Gz$`{xK~N|5DI$_yckr7Q^ph z<f8{>!LuK@=Edy0iemO1#X=0!9MeCyj*^G}SaJiEr11z<P7eP89Q$58Rg@e%v2D_& sYB2lGk#hFu#q4u)%9(#qXN%c)PV(%#Vywo9qyN8IW#)@8#PoUp0k-fd>;M1& delta 449 zcmXw#u}%U(5Qf*g<L(so@PH5#0>s8>;tSXr3n}O+tkhtmF@{Es1&xhbnF$@O4`3{b zA)&Uiu+dP^TH0Fp%`r^!-#7d3?Ck8l6&~}wNgDJWQ9xBRKo!jw_z>4n_io@Ce1Ii5 zF#iQ6tjER=^QXpN^8?Sh73xY*`)@${_1rGWDn<+HMTfRNhcUV}|1Owa)Q4s2o}tzc z&3}j5=iB@rn6mz}{UkRVpbppZcVNQ(?tnxOwxKpWg++J;8Q$elgy!K}qO~#7v&`t0 z&^$Pry>{7*5H2ES$^KSm?_D09$dlKQFK<)Iem&Re9(THO;a6qkH(x8kz9;u#Lq5YT RNu!!=pG7qpMolTk+y8ugETRAa diff --git a/libs/pycountry/locales/da/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/da/LC_MESSAGES/iso3166-2.mo index 9436c84f4940a10a98746750de66d2185a96a89d..71471b21b4ed0f8d9600711569c0b58b03e2f6cf 100644 GIT binary patch literal 134479 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 literal 135392 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 diff --git a/libs/pycountry/locales/da/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/da/LC_MESSAGES/iso639-5.mo index 1412ce29bb715ee674a4145cb9f2ee9e1d5c825e..1a0e9ac6ea5501090daf37868a1ea530d63d195d 100644 GIT binary patch literal 3961 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 delta 263 zcmew<*T-IePl#nI0}yZku?!H$05LZZ&jDf(I03{0KztI2`GNQr5Q_uxD<BpGVkSn2 zya<pM0rFLWG)UYENS_B{A0Xxf@@1GA7<hrSHjowt(v}c@0E0h}0WvriNP{%y0%?$j zdLRwd%fJT2AOLb82mpn_fC)&l12GE_vw}n%b4n63lP7DkyH1|Mp*HyphtTHzoEI56 gK*Gh@sS1;=cr7Nk@G0>Z<>w~mfkcW6it^JL0JGpA=l}o! diff --git a/libs/pycountry/locales/de/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/de/LC_MESSAGES/iso3166-2.mo index 9644eb2477cb0da25b1429e79a6743018cc0d277..a4fb7d8ae523d49fc7086bc7a4fec01ceeebd3b6 100644 GIT binary patch literal 212230 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 IN2Rs>|Mgb@<NyEw literal 219517 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Ði$U-Q9=gnV<fp==>FFzlY}iIDU=R^FQ?a?N2n% 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%0A0<<;i`sT7WDq}_EFK-I(*vj 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 diff --git a/libs/pycountry/locales/de/LC_MESSAGES/iso639-3.mo b/libs/pycountry/locales/de/LC_MESSAGES/iso639-3.mo index 785468c9999a947ee23d0bb602020b1d00055cd5..c48f5d092f13b73a6849b483fca0048d932e0ff9 100644 GIT binary patch literal 395660 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 literal 395556 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/k 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 XHvema5ywyZ75uM%975k?oArMIit!+j diff --git a/libs/pycountry/locales/el/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/el/LC_MESSAGES/iso639-5.mo index b1132b43ea425de224506fad97b1c0443eb022ef..7eea0aa3ee79bd806a27ea6c1e22f26d87c63d8e 100644 GIT binary patch delta 798 zcmZ9~&ubG=5Ww+C(j-Q!)zsK(D{UwutrnU;K@|LP5i}Q%YY1gA-3msJMw*^HR5TO> zMTK}0CA1-Eh(-Gk%z_rYNX3H}&)!7wJDZ182VOpJ-p;<wo86~FpR%>>?7*rJql|IJ zXT~wc;}}20TwLT37H~hF!-IIm893``bq~?%S~!gFUA~2R@^6^MbRw#+$q^>DP{1KP zgCkhP16aWcyp6W;6Sv-SZlXQ-qr3hc_mcm_Ee??x5Sbz0PWJc7r20-{UTPxenM_k~ z4Nu^zE7*(*M83K_krp}2^(maPdbIj`F7M${@-KK2f1&;HnO!2M@dA$F3LeK7nCJQO zfr;Jl1MP-<MkI%)(B8rxhINDkL_t~9DVIj@tf<{~aylG^?P0+-GRW9%3Bh@UrbJP& zcWG_47Sgf5v5%Rx-@?8Pdqq(+Ud6@}m8#e7#Y(Y@mlhYipj4i$c)|QlZ@zp(E|(Yl zs$bf<;s=YfMgMBK>IFNOE8eYt>WZG<9!?C#GxxO@F6&x&xA81F(w<1(iO=aH@@4Jn zhQ8CbcCe$ZaA}gH7p{c$u&$kONwlf2^{sXrzmsF5&3^r?zG1S?b=zP~HyYPdxpY%| R%-0{J4(FchOYQ!@(;q#ioMiw2 delta 456 zcmX}oJx&5a6u|Mf!wMo_vKll2ml!KR0tYZyP<R1os62)3nrH(pvDO1nU^ejrG#r3n zVdMrj&{*<+vlCwO_BU@P^YQjOcrQhpz<(1WAZz4|ydv*BKExa=_=)GZbpATGZarf} zPFWA}3_Gsw<2CgF^^Pah^TtUX$p?cH6ER-k0?YV=b^Jp;xR4TAaao8>>Ybmgheyc; zJ!~-lh%KC;?*DS@Yghl{1M`<@ksFEFz(6;=+6g*F{R1n!#VzVV^^8a#@3D$6$a`#X zrtL0|#boO6<^49aNsTO-BehBC>W9z{k4c)cL6dUg#@u6rcSvE{Hnn(UhF+ZYJrg(6 G&t?zu79(N+ diff --git a/libs/pycountry/locales/en/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/en/LC_MESSAGES/iso3166-2.mo index 27d0974aad874647a2291ade7c3af876b4499960..c8a4213b10a7b68dce0d521a45581694dd6a856a 100644 GIT binary patch literal 90768 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 }M-} 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 AD*ylh literal 91227 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 diff --git a/libs/pycountry/locales/eo/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/eo/LC_MESSAGES/iso3166-2.mo index 882d9e1a0db5b6500f601fde946d226aae9db662..2a3351dd5c6920f187a86acca89b3edfd0b9b994 100644 GIT binary patch delta 20899 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 delta 21410 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 F{{wS(`qBUZ diff --git a/libs/pycountry/locales/eo/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/eo/LC_MESSAGES/iso639-5.mo index 78cccb2dafa252d1a4367817928799ca9dc7697b..566c6a261794d0939891ac0538facf5d472b8d58 100644 GIT binary patch literal 6705 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 E0d+JIod5s; delta 1864 zcmXxlduWqa7{~FawYtVNZERfAs!Qy2-lo=N+SzSh>us*yC|-w%6?GRelnpD$mjBkW zVHq49DjR}TP*FFjLq!;~8<Y8$3TpHZ#}E`{3@0Kg!u<Y{CkLK<&UxSW+|T>w<m7+G zWp7oN?KaX9Vi>Wj)a+BN=+6)7%mA|*Jd4$M2?yhCjNubE@{-vg%0p21$73zd^70xl zXHe~RA@#GipG*}OesX^;+^|dT-x%lqLoW{~H>;<dz!BJlb+{HapbobSRc|kj#N(*v zui)$W7^~^uhD8bwHeiAq&G-s_h^o+z>R>l&1%5=$pwGSG*B`k31{Nk%<BmeL+lZ>S z7`0LxF;4&1K}IA0#&3L&Ln)s?t;|K#Om4dWq8ciF*(`;1r~x*imb?|!-WK-@)RuIk zI_`0Q#%v`QE|5_N*ZjtPR0q#d4aF-8jzo1h1=Znl)N>h(;#a7d?!qB>3|0Svn{)4> zo_kio`fI7Hsja0RgBnl^UMpb>Py<V|3|fhK{AdO%y!?^7-R(j>zX#R9F)#m)s+U9c zcOTV{#aMsxR>d%73N_*eFV93(T#BmDhDmJ4;rK18qmzFBPdA5po9^ORETfTeI1wk{ zYUGx6W<9e9wRcBQBkV(+@*HZ3pP>dgh!d!CJ!+;?Q4O^qkJwt&Kr`-_sP=ZEp6~JN zr&0B?fB1##s1EL+2J+aiS5Zq9ll-Vc8g-bOQ7f?uHJ}c+8#RDK?kUv3enVamyNYV( zufqMTJ@5zq$NUUwT^-c(!}ePvs=+z<Dz>6#)Q*hNI#JK<^XrFEhw~RyM>$lx_fYLT zMIFv^8cFE=A3;Wk?_K0z+B)Ry<&$1R?b{sU4Pp$T^kxB@=8i_q?gN5(m_D8j#CYOu zVg~URF_mZ{CJ}tk^!=k_Wk`z%%}C2XpGXlp18Jg|7JBAAS6{Yb((LqQWBmCU7O%@j zVlpwDC?k|666)VxBNh{^j4dFFiN6BlD`|WNtc93DDCq=i@3p)-{n}q8ZBH}NkC;tp zTliMxS9J*%(<m}?3ASl={`HtgVLG8#M(G`57NKn^ruWI{pw09P+Ee~}%)-v{?l38m z34M`N_%Cv{_uRlAO2Vd!&XA5K!}@4rxEkFN+A3SZ`O2-KwW=rdkJX2!*s|WEv9{8X zjBf}B;;C>sezf=N!3Rsiw3_YVQO(ehN~A+)qCJ$?P7f<<+rrJ-??SdN8BWx#jLzTq Q+2@%pA8*~fE%S-J0Q5JlGXMYp diff --git a/libs/pycountry/locales/es/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/es/LC_MESSAGES/iso3166-1.mo index 0fb63f1e33056acefccac1cd23525e5df3572f76..6a8cbefa6f3c627161a47a0082da1fee54780898 100644 GIT binary patch delta 9410 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 a#g`u6RXTHY{^;VB18)DfLGi!_rTznu67c%~ delta 9221 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 CJi0Cb diff --git a/libs/pycountry/locales/es/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/es/LC_MESSAGES/iso3166-2.mo index af279658843d0e356d254e9fe1a867dc424717a0..02967c2d3f41f05de0a560f70dbebda45f2cab48 100644 GIT binary patch literal 15680 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 literal 15724 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 H7sr1A*KF#U diff --git a/libs/pycountry/locales/es/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/es/LC_MESSAGES/iso3166-3.mo index 0b6c06c3996255dc53b8f19728d54dc51f7703d8..38b5758d901be51c30ef5de857b67dada65bc337 100644 GIT binary patch delta 940 zcmYk)KTH!*9Ki8s3sk9!qTnAC9+ANUJ$uv+HVjT0r7=-V6r5h^3tn<?<gQ?(Lk9=q z<Up8Ba4-(&z@!c)nizG^IQeHVad43MZ*?Hy`)f<mU-Itr?s~89_xrv3)%CZ#`mM8N zMG=~DOvVnShQt^b;tlrTTTI~(9K?=z{rx<i;{F;Ya0xr{9=78u9>g{5#+NAn^97G8 zRaNnp+C=qY2S1#_y?6m-;dR`NGYuE9pZg`;kB_hmpJN+-Y&`#rn)?lu4U?@(9mX8W z^Gldye-$tp;XwtZ^2aC@e8ul{<2P#VKTw`j`VTXxch(cXjI!QG>A-zFgbz^)d4bZw z_bBT&Q1<EBrPKiXtMg2xH9ks3cW@7`pj7q%r2|iKAHGIO<P#pj1bse${U{yCp>%Q- z9V}oLD@e=L6Fh<Mu*y(>xD4WdJdFd%`o<GT18SkUN>bY)-%2k-Dw8B7BuObis^@rB zA43Y0W0ZY3iCSkRISIOTku#`QA+4eyMYolFd&e2gLDy<k$}_1_Iw2uvDpjfVwb;*C z-^BcM5cy`oGsF7icrfJ|-;2sAea@C_X#C~7t*etG*|eKUyIJjK@)>t1L$nu6R8C(F z%`A({L73NLW~LZ~UZ6*}XKwE7d}PDOnGHfa=ihd222t6ToLjcY8tVk%^zvfcW<2M( t>y^Zf_*io;1*5OnxmVAMzBgqW*_6En)0Cu1>5^5G#tZFm^UEdct1ae`fvf-k delta 803 zcmX}qKTH#07{~FKwzLWe%AbM=^-ve9t-T^djETr%;)V$^>U1qfQZ1a8HcEo2jIfcW zP7FjRanUg0q%jT*ESPBG;7W`}1_$Gy;rqKopXBcIzIVO8&-1+RZv1;!^-FuCZiwSt zeO#Rl#+=5M5I5o_9>Z6t=UbS>U#Q=o2pe+_FJlZnY{v)KgiF|ob&TU0>VMv1uQ65g zEf|<+#F#c-3}7qTs1HZ61t<2+;Q(_FkKi(P;WLcl#{Tm+XffYLE%+0Au)i^QK8($* zZ*DNi@*<DQ{0V-d3(wJFzCc;3@F`|+8_C>+4+P&OP?e8kH{L`Qa39sV$EfdC@C<I@ zDg2Fb);EcRK_x?Yi1}4iMH8sX@8V&6h)QG;kKzV);0ILYJE#u+z%>5FK}@j^O4z}Z zIFH(zRc_TJgBJ|6;76oz|17BWG{BE$?y69sinOSLpZ^afpvAQ%>VnROLIwN_B|*`C zmsJp5QsaYzAvsfqr2S;ni3FGSjIHx4?#J-@`_R`=?Q>(j)xMC**r`m`vWG7Yp07QM zb|<e)dc`Tvy5`JHyVjUfDiz$BvNvm8nktmNJGs$Ht};`ur1Rc%Z8Q2Ol1<wq>zlFL a;rK15P;$>&*WG*XUgwI1ykkweMY9J3H&-qI diff --git a/libs/pycountry/locales/es/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/es/LC_MESSAGES/iso4217.mo index f61e004b854fa9f3b754efc889d736bb20a732bc..94e820e5b7c38865dbcb7373f97fd8aa144ae83a 100644 GIT binary patch delta 4621 zcmZve3vg7`8OKiykN^P!NF+SM1&JhJVip>C1VkW!kvHKbVC9CrgiVvZVK*BR3SB5r z#QLHO6vdWD6_tXtEF*)qj%|icspCj#Ww5Q(4t;1HbSyYRtJ2?p_hg2SJ(K_b&UfxP z=ljn0oxPhsPTesxez8}FU50i74M0EZXv`;Yc~?GYP7h;x!@)2Mmc#CFg5^xu4SSho z2=>HY3v=Oi$e($d53M^4JHS)0lQD7g8Xf-3X+E^zZKw_ZZtbhEGj>NFYU3U-00+ZS zuo{kq+u&&U3n)j|q4vpUk(g&W6tblm3A^LpOr|3T^B{j_86TR^0Q<lVFb5`J8Qc%$ z;J23VLCyad;?vxKN?vZS^nL?i7wl4~ea1pgZl=k`znMjcted4!8?UgoZ|xXV%C<lS zwB3&HgZMHpS^IUUd2hiy_<N{8K7?}k8B`!&LIvEJy2iC2pN=LJK-IVqDrF^>6;LOu zvd@>=@fxTTHCk?fa`*_8gWZ;gEMJE5_bbacdXs-SI?I3pxM&~z4Jwd-TKiv6nfVN6 z!cMoQpLc=ETrVhxeW3y>f+}e_l*5Vkc_oy;1yGr*xt08DVG{#dxCIV|JFK0Adj2{j zYvwGJ!%LPQSbhu@;HQ=ysMA2~-caiTP!21ty$EJwhvIaU+6a`R%}^&#KyA1e>LiDu zGIYY)uR^Um4RxaPQ0xB+weeM`^<O|`AcqT~()5Jde<0L&ypWDA#c(@N4wZ><P!p#^ zIi3UMXpwy$g#EGCK%MY0C<ptY<{g0w@D-@_Z&>>rR0%IZ{^I5zcHm2>6WnrJdO<Hp zHcdX%cqvrs?}0j5rDZjg!y2dn8leub9_obKEgy#pGy%2GAvj6j|08tzG4K&oq@DYw z9ppl7Gzb!#xf3c=Q=m#R8!EshPyseTIoJSI>nH8=gK!x3NvOd83>DZ%Fk9dMD|EEs z=P-4<^V28k0%hkxov<I&21QT~M?;-tI(#>S_XuPQGlIIPbd^x^XId_UI#3-{Y1YEH zB7T^TBHn8s9EDo=8dRijLS^P0)Vz0~Hu%u;b35LR9}pd65Y#0shU4K#I1&1A3OoiU z!7BsEzfMxlcSW2E72!fC2Q`*a`+N&j33ftW1!f;qKuM_ir=ixLhXHsAYTrHu>F0$| z^Y6C2uYmk3(xnWjmMftyQ47>YTcA$91F8gjVCwQfIXq(RpF=rngUZ<NpzhQKsC8GM z0?rte-nS3bydiNq+GrS5%Ev%$G#x5{#ZU`_P<NrlK3@+N_@ma|1+~v}P$zsD>JI$c zj-Q1(*k3F!Lj@MUPDghj%dwXXDu5!W2*+4XfC_LjR7U1OJzoM9*n`$~q2{fE8jnE* z(h8NiO;CYug9H>ed+5mFvrrqJu=Xjajm}v60@T9yp(4KyZ--gDuXVB!P$wS^dFh!d zsJrqIl;b+fMyP$8Q;Zw4l@9mB?1cKBAGbUMmHPLfQhgO_;TM)UL(-Y(4;9!DsFRMe z;}uZrCfnyTpaNfRSqHQ5Z(8Um0~?_-@FZ02cWDAVXvYsjo%9$~Ag@B5@HbHN-iF%e zT|0i++SefW&t#J>9cUQTJ{2%7N7L!(4lIC5RV~!S2AByqK|SAU?LAPAo`JdxN1#%l zgqn96YM%>GfnK!FFGKmeVVN_O`YV$Bq3M$sS`LSDa2M1@6JZsc3gzetD8~n&9J~OP ziIY&Z|0PsOE?D~mcn9_kJAOxDI?&OD<X;=!&w#%F%OP{j8mJ9-!w&EOR4otL@ncYq zUx7N&8JG#rL)G{XPzQJ)DkIlmN7$7pGGGa+LqAddA4V^r(a1+5&~)@2r1!a+f@p8| z)6r&2+6Q1Qnv8UMwVg-@i^!mjOT#>GDa=9fd_HsnUg4?#e1KV~kDJ<~^j-7~)PN?S zVQ3Q4Da%lM(>JNTy+r40Xg~6hn##BbjhDf%@yVQ?dIzSmR0JPFP3Q=^xm98uwF493 zy=WgAiNc5<@6>P0x8Pl9H432vXe)XOJ&rabwP|QBTCaD|UOF4le6$jM9jQHmbPaSR zwjtf2B<h5QqxM!!=Y%yDLA^$nTDuh<M(eCS0RGVSSELv>W}_W=8fM%6i<U8Xx9v}b z%h31Gar6VER)f~2dg%{+djr<y%a*#^)-=25%(TWg;eGf|UFJ=24O)fD(X*%#sm((V zpeQ<qvXEM5^i$M~iqUt`A@mq3L<zJ2wV-}TZ7dp->hZ3F@gMO~if%ze&}`%&H3j$W zRL_`t_+#7e2Jb<$&@*-{(^A-N`vvep6ht%7b7(tSjt(N)aI=HYEvbI`&G>!#kD$e9 z6uJ{tpxnf#-Rg5Et@9!^Zm7-;JG0!d+mu+*y`@Ke+tFq>;#B)JUc?RiiHaTrlAm-x zl#$cmM?%b;#^}oA&fG~ET|;57eIRkJ=kbodGb7ZP*wpKQ<F$lV@@Qc=6m)}5&~vK7 z&0ZuL^21Ki!pf@Rgws3FVODd{PtNHb$&6P!m41CaUW;aXElp0)Z7ntnYu#|rb*fi~ z>gz+{T4VQ`8}XV$+Q_YMA7cAyeuEco@^2bh<ktHUXTGOtkyvfaZFS~)QQz^}qw=Bz z74%x%pxY@*R0Q=_US7|t`Oef>#5arSq>h@nly~NVQ6+)0lE5e@P&TeCFrtjsWu_Z# zDp^1>qV;Z*9~tM&a2sk!k?)Le?*+>5jYT<jY1of=jrFaitNmz`7c5=t)v(4Z^&_>3 zf8X|>%<|Ge;#%M4?x`X;Zn`S1iMsra*^~WrJrale4NZ3I_fAF@W$?mLFZrkbD>8bd zBJ`cwSgI5hYv8F&)!@p&=WqW?^4pR&`%Xi;K5pWvg7Pl72sKk#Kbm~AV0UJ`vMs4n zc+n;|=*Os_+&M+nA-s@e&k432b&JiE)gGaRotWy>_F}X>_y4~@tG-g8=2U?qD$xHF qrXqM#WmK4S^@>fk-{8d7)p#p?v&e0V8I{SQOvWaGZesJ0CI1DPxk(!U delta 3804 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 Jf4$p;e*qmVa<>2g diff --git a/libs/pycountry/locales/et/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/et/LC_MESSAGES/iso3166-2.mo index 4d83a0359cd730010adbe885c5236d9ba98b49fe..a91e2cf3dccb9618ac57cf4514f65dfe1e4070ec 100644 GIT binary patch literal 12218 zcmeI037A|}mB*iuK+*}w4iT3Z1jAO@kj0KMboQi|bkd!LAj++-N7w7Bdav{9y(HD* zK!OX42#!W+Cy)dqF+_xz5XFfiRP{g*MNk19Wr^SjD!2~fhQI%-+eyHI!5N+JoB8H` zed>45UC&+LJ^jdGL)JKi*S`jVe;DRC?;-yELzU_{cOUIIBssg_2>5{IBk*AKr{N*+ zd7IvFjN=@DeiS?qz5xz}C%}W?DK`IYQ2m_^8{m01Jr7kcgz9$%RQ-$Le((cO?Oz6E z&(%=n)<Tv0wAHs*eLGZpUxGv6omRgKs@{E2?L7=t|52O%q}88+!%6=&l%0QqYG?SU zdi{gpYtfH}BjFgRa&LvIHwCJnIZ$>iuv}`Hg(}wr)qe~%Pkm5!T?&tYS3wtUglc~P zYW}|o)$gM={ijgvJO@?(k5K&&d0m|cLDfIXax~ODo@(>Yf~wbK_1Tv5ZTeEEaTus} ze5=Pc|3a%@0@dynHvJRuF!bx7?A{8sZ@vmu?tZ9#e*oVIpMaX@{g18pH_Y-7sPP<Q z_0drCb&}Q3gc|=8sCk(IRek}~Jf90?w+GdJuT4*&%3lOk{zH~)pvqqdHSWz;-)i-p zP<GcWzh?OWR6E~=vS+tV|1p#u&q9s+d8qv}l*1tXNT~KkL-lu}<#?NZmer?NeHK)` zHmLrVLfPA8^8={<5}SSzRQb!T{&A>!8!T_M+y-?8?1Zxa8&LLq+w%K1{Rt?0pSJvk z<!_<-c>${b5pSs5btF`I*Xm=S+MNis9*s7A3Y1-QZGMO4xlsG33u?V0sB#xUwR@@6 zuY&6L8k>GS)VyrA+-~!4hpN8|Y8@Vc8uxCfasL`>pZ*SV^qmoGPVM94q3WFp)$Z9) z^_!vWI2USMS*Uh;pvw0`*;Rq6cZt<M3|0ObtFO1b5vtwoP<GXz#{D4F{QeMXKAwg9 z!#_dwx8IxU{SAYf*F&v-6jZ-&f+}}1ls)62+HZuiqXlZ*olxaHo8AjmekGJ0t1YjB zvS%$+`Onz&ZC3xP<=3Fj>w{K*0;=A#Q0@KRa+q7U??|ZmJQiyHj)Us|6e#;ohf1Gh zIUTD1R(K>_V)X#3Tm>EuS3|Y)am)2k`8Pt%*EXwv5vu<?pvvD3(|rQf&u%C?eg>8Q zE2#PVBUJv-(RKY0DE%0ye%=h#?x{BYG^qK02UPueQ0*?ZJP)c~mt_&k&ID@x`{42L zGMoQ7sCK>p)z0lub`L<=@g1o49<zK3%AQ}^{O6(8Wyo>$^h2Qb$I(#zo&+`Cu~7Y- zWqGzupAFUC0;vAZv3d^5o&r?=%WQfdRC}wS+PlK$e-vt8thMQzEw|eI+pK;kRDbta z-f#0Cw)v0S^rxWu`8mA*HJocGJMLxjl>Qy4aX$(*uRnq5`G*?Eh!g7l90g_P8=%H> z0!-gGP<Ffx@+5N3hN`#3rguTr>w)Swf<xhZ;C^rwRQ>ls*>MF_xlh2MaJ|)Uu=>qV z?cEB8z%N_<PN;hKK(+TRI23-*raxx&r=Z6DER>zkL$x#HE%o}tq4v#TQ0s6URJn0b z^%|l2nGR(~tK~w=^PtLka3~C+<|%;(z)PUoyBw<hHCDeKYW{D6D!<e69;kL6h6lh$ zp!$E(@)@Z1p0nI<Onn{?f+{x(9srNC`bm}(q1v4U4}?un?aYCy*9lecJgD*Hpw=gV z2f{w6@4{**yVpSNn~hNAZiT9U2V{z!yP@X!8F(Q4mF4fD`rH4+diqGH@gHIJ<Dl$3 z8EU@9!(nhTlwC8S>~4o@|6H4XK2-T0I1H|^ycnwdWl(l}%<5~cz6r|in=N-(ei;rU zy#{5^*KPW@pzQb_)VQC3nvb7D_45K$dkrVm`#aQf6jb_XsP;~@`dFxTPKU!_6I45M zp~@|U!{NC$-GeIMYxN7E>V44iYRi5&ob>CV#{F5#?Up;C+OI*`bq~~h-f#5>q2}`k zmQO?3^_<P$@8r5Z9IE{zpz6QgrjLfQ>r|V6y5(f3^_~IMeg{;!^P%kUt=<cVqgQPD zC9nbga?3SP`Rk$T-w3rIw?VaAgBsucQ0w!M&HoY9K7J0WUc)K%b`OWL>y1!$oC-Cr z)1ca!1XaEXs^7VA1nji>`B3G1tR7ij2-W`wpzK=%N5C5_KM$4v6{z>k*I{ZmRDTaa z&Ff=Ue-bvJKLb_nc_@2cfV#(qpIWzL6x29JLzRE4O`if)eij@F=UcuDjzBL!m0w}g zS6lrm%TGeh)2FSz4XWN(;7E9n<wH>RJpnbJPeYC87f}8G&gKuv*mbZx9IF4<L%nat zSbeh1pAGfCnGe;DXBpc33RJ(Vt$ry~{~v)We+|@k{(7i>wnLS_-R2KKt>b+*{~@dI zw))dh?feF+-50EWz}R}dLoAPh%6FmK9|JZ1jO7_n>pBG<45vfAzdNAH6`|}%pz6OD zj)a$3UJX_5TFV=t`nwrwTsz=F@D7`PAJl$$5USs&pvLhGR6oD9bjH=whe5S>7*u<s ztbRO{J*PnRKf$IqLbcZf)n2pB?|`!Voi^RKTxRntR$mR(-{qDcvH927{0%mJGgLpf zK%O_wnaF%(7|L9@1Nl61CvpyQHKOo3^0&bSh{ms=eRMwZeq<J+@F=2n_%L!Q(uOG9 zTgPAg-a-mbdgm#mXmdBi@7eeu{?$g_ZutfHj=@Yg(Z<iUd;x0S2g4L1Gm!=j+J?K} z<H&C0i^#8#hmiejneD`D$c>2B1XtDJnn>@7w?KvO*5Mp#>u3$$jQrB3e+U+kqip_T z#HS;D$g!ktg4z#%KokO`2U&!C8F>WxDx&Zw<Vfn=3_avD<UI&mFAWncg**}?pOiw- znSB`1o>N$h{07mTdIqBK8ruF0yb{@kG$LO^wjv5EkWVAJXJ;b{zpcZmz-JNMV5b9# z5WQD_jEtn+@4(+9Pa|JPZbSYZc@9xH0r^B4<A?H9a67UdX-4iq{sCEqJb}2#t;k8p za^wc&hlm1O+j%~X)qhS0haqR#w4cIjkQ0$<$Px6X|8FXEBKILzAtmIsq;G)NAwNJa zMidSv{okPOh#b;{^dkx%Lq3IkA9*Lzjl3IC_zCjQ$TLz14<NrzWBkty9zeT?A@hhY zMYbUCLK0*K@*|`d`4aL?WDRl&@;+oCawO7@ybe+L7BVW0@jnpDQMBJ>;~$4N+4wP} zE4-}^=K{-bTb>L*fb37XBj8cU5L;&safLr3Ey#JulZe9NI-IY-&mkL;)yN^#{TciS zqHs4dGL7LESq|btA_K@0<T&J7MB#ATzv8XPzaSq(mLVgM!LW|VJ;*_n|Ex`1IhYB5 zj_gE+lYc$DAMp`|(RHNv<}Zk6kuk{S$nl86H;`k~SpEN#Wg8bRLq3WeXl;G35(x*_ zk@|r)>I|jKsVGyC5IGwCpWyG15yU6KE070~@yI_SgW;_<k{L{}oGdnF2iAE}7$~yE zU3%{(ldU*SMR#V>V=9r!J541o^1Dpnc9>FVoTeZbMv-xg#$DtUizGy*+jQOgsW7IE z$V4UvC9~X*V3MUkIq!DlYpWuEnVKudlyRDpavYhWPrK7huOFMD+v!D-ABPd$*Vc8J z?5_TtuV~Jc>KIrjQvU+#6G@z@hCd1xK+Y8MWx5H7cjt@sNTIeBwP*^v`juWR<oS)V zNlq0bKm7^1!<6N`DLPZVqTlC%G?m}PV~kTh4Qr}bDemfDW@yPLQcjkeh-h`QGc_z$ zZ%VbOc4Z-Sb3UW<3sgzGAS}C0e&m%=qHZrJnjq&)t*y#+=WAO?tgR|lQe$`ZN4Z`7 z&NP$t1MHh-0>4-cVQfk!>LMj?y3q3xt-I6mNz|1`OR`DqO!MQox}JVnrNC`vXaOaC z#+h@QlDN7p2usGzdG3o0n#M}{UJzs3v;?z4cNz<(kxT6}nYJ*By+NfTDH1I*`O}iX z3zQz2>Lx?!>b58sveeUd^=Bhfscog?uKuE5G+C2#rkjCvEI?UnFrDdKVIt3&?q{o8 zB4>J!pDl*@FpY#s>^svjp;7@+RAqjq*H%>uNsy~;ab^^=rp)Zm2)azE7j&m{IU|T8 z&s|WxDJ(lPB5%1$l)FqZ=an;*38S0|D$b19D^@pVnoZQhei&5S!+ehkN@h<&hglvv zGfh-mm3L-(Io7?)?=kMwupD@<@6Pt3F0VUW?lb(Ez85(&!>AONjWe^lvo9(7&P?_> z%b9g%d12J;8(7<5qQaOY@C##{S$WeJFqB#Ofh!|tR*xTr1yhbS6SKm|1lh2nNEmP+ zLT6TDa$Ye^dObx;`iZ@g%%4@=p3i9R!bHlBN_TZfF^#YwG{M<nDR%Xz(V&ZMHQRL6 zwk|VS7IC&$ENK%mnA)n?nN8E#5L9oX<+<UCz8>wzxk*n_ahi=EBne<k>I^Fuo6PL$ z#**hWd*y<k**k}Iy(0-rzSGPI%dyiOM%7K#Eig6}CZIVfXjPk&z&w82Ix&~@In9-l z4u&a|L#MgAF=9&wM0V;xl(<NmnNbV}y_}iaDyR9bYlH5)u8o-SW;PllWsH&2V%Ym- z_J~omon4Yf7WiS0BHj6tM%Kb$$_3Nw#cuWe=@x1+y}dr^)lIdn<a?!FpF66Bi?6_M zU!DQ9gpc3WPZ^yPvaoybc+}%M9WBX9kE!ICJ1qlOc5^$lu;<zOtgO>&=&IWjeSV_Y z5Bz0`^s*@yxu;r9C5$<4tsW<_&p54qZiT71bILNYj2d+B>aT9{bhEblWj_o!x2@qy zpG%?5T)>W@mo`%}6-p|p<Yzq)U`V=jZDyqgr~}gGT@bTVSnoD3S(a2cD`|z>!3oT} zi%pT1+k9>R>W*^Ez3lniHEn)3J6?A}-ircvPQ+Pe8|_KZwPOOa$KpL1dvEr(+Llr@ zaAlv<Hn2t4n3iK+_Ql=Ii*mZX05?I-nO9rK4rw=q*ymuSk=m9*8e?Q-KVUfRCg|b% zu0+J56>7BIj|%mJy?1*m7W(Bqcfg?jmnG6$pgr-TICK|ie%q@X{hsQ^*lzs!W~DRV z^yxRu@+HHB`TEr9C#SWXpLkx7E*#M^8)1HW9QkTE3(W3|`^zpLyk;ye@kw0Z<w9+$ z1zvBGE&2uHc0|2wP)B!~+vasgq0?bZtcE-IIz;KM+QG?;-KHQHc`HbklHNI<Rpy!! zt60yN8|H&O(X!W@w@ORWRk2YPZ%>rPHeS(Yv>SGIy_t58y)YQh`$fOkDxG;gFY2rq z8~s+85YU&^QQ+Oc9@L@`OIGq5xN|v1X{06bRWJQ!aUv9r$u0W&nt5(Z_4DkhG}XA% zA~u2w7<Z;d8N|Nn=40y>-5J`Ynx!b?x$UXJvEj2JbGpJf-KQOS^_ee(IbF9Mexcx( zKxJ2dpT11>y}##O;&j9w7kr7k+v!NU_+oV=rDgiI#ZE`1ew%ls*KDNsM<=fjU5}kQ zZb5}bBwA+RSl?-uCj%RtP8}D`11Yr38%mbXO!%IVz!kwQ1H+=z87^m}ok>?xs%{9J zPA-sG*W1D_cGAL9Nt<WBsc<_4&ceWty`0+-^Jyr%ToPgA&P(E=E`dEKaUnC8uE4^i z?CWc{uzC|$(IOM+{BR`dclIJ~pxOuBxnbli^2+sDTjY1~CSw$fid^MeoJD-5q9RAO z+gWT1p6!A-pV@-5m}<Hk_D<ts9vIFNqgycGJ-38Awq*L8B_UsE_OrNLS<aH$);<!> zp`qH=lJd^+mKQl<OAW6lewP_tan92Ew_quix_Mv(4l(-9I<;F${=hme*V-*iydEKH zWZ*i(lOz!HS!NZM%*r&wk8~9dT$c>2Gk|6EQ<Mtau+pOhu4icq&hCq^Y3fP89_>-s z<8{TEIl0UtkNFFOM%OQg?>=q98E0fBHgJf!ATzDyZa<fqnsk>lonfP!kK^8Q<G68L z^<^_Q=ViGl$MQfJN6k!EsHaNonbKaBSUK^^4ej$X3%K#sO=dbv+~`gmKk>B8_%kyT zC%EG$G)_GIl<|ay7G4pVP6o=Q!+JHk?UC<ulB&0Ix$dm)jNP~ASCHkM-4l9IlEh=X z!qPja#tYYUdznspZ`3gg*|7nIt-<+_1<j3J;bm1hHMzGw0p%AN8)oX`ALqs6_BPw- zdT~SRoYon8r)t93@eR{>-|+0rbXIy9Q0%RY$MqJu!6vy}JW<(;Cok-rnK^53IgRTA zFXB1JT(Pkm-LtZO+|XX+1zODL4OVV+gWgmvPo6l*tw$#Z?&!(xgh>rcGP8KF@`l&U zEUu5mJ$>x>OwL>0u&)c0xYP68usA@OeH|b@1h|!7!2ycPujKz^UdI2C1LXF4AmF>H z-TgOoeR#G_rAZw;MfP!hvT}X&lR7z&C)Iz|^~r`s-`~geQKJPuXLvjRGp>*Qc<9OS zqAvGwZkp@PO*3C-jkvvfE3f`c^9uPmPD}Mx9;1WWf7`*~PB%;ke#|R5IC67d&cE>o z9h^BhI6hYy&dEM5&Rp+heVmr+j&vy2$Fb_(=Z#I+*T<1#!yd%N!5fInsc*w4!JS#% zA?GLN;^BV-|B0)^eNs+coo<eAA+L{P{#Cg;IA{NhT%DJAI+>0zloRxqj!qB5-^bCx ze|eQ|PU@chjl7(u{BkegTgMLPA1rmgqJP7lwcd?AAgN<Bcs{I>6w0_bui)YI{PiAA z+3*j6+~3{7;q8;LhrRCMG!;!LlfG2gymjZsj(m<Er88#L)Un|ym$O#~PaOTHif2($ za{eQirn<K1?QQziIyAj{JEjhe|6-43`OA7V_9n9j-kQ7jz}tksuRAkF&P?W|&P<0F z@nqof;4Z>l;W1M9e|P3@;m!=K594%i4s2jYzJfnvw|f00u7}3H9!>eB9!*dE(tZ^l z4ZXg^rNQUNSz*U>*X--aygE-NGw8`w*XH@phjxmO=a)A<#$F6B<GtXM^K!Ab@FLR_ q#{8psdf#8+yx@rYt~wcXUs|dgs~ZEaekquA(iZu6rT>@wmp=pRi#rGa literal 5140 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 diff --git a/libs/pycountry/locales/et/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/et/LC_MESSAGES/iso4217.mo index fdf3a009f0109a78f93db7e20806ac77f0a6f11b..d30ce668386c691415e26bf8c50622695b700f41 100644 GIT binary patch delta 4263 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 delta 3835 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 YEpOCpL9L?0aY^OZ;|ha{Znl{FKMm+bi~s-t diff --git a/libs/pycountry/locales/et/LC_MESSAGES/iso639-3.mo b/libs/pycountry/locales/et/LC_MESSAGES/iso639-3.mo index 8abc1c2103a366c17e275ac59519b46e62f179fb..ccf9c094ba4d6bc99acfd2d2fa83c2246045f5c2 100644 GIT binary patch literal 32017 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 Uqu1sBZoI@H5uanFz#n@5KeXz+?f?J) literal 30637 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 diff --git a/libs/pycountry/locales/eu/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/eu/LC_MESSAGES/iso3166-2.mo index d392b04f430ed74a3cf14d8b74253bead0518785..301a8bc11b2a094575e827c316f163ba2d542987 100644 GIT binary patch literal 23745 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 literal 23772 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 Pa)?9u!*Pa(1?T?&_{!oR diff --git a/libs/pycountry/locales/fi/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/fi/LC_MESSAGES/iso3166-2.mo index 5d38c806e698af2bbc5b78a30fee90c084b156a2..c4444d1abb660190b9e241d058a93ef2f8071d8c 100644 GIT binary patch delta 1850 zcmZ9MTS!z<6o$9srAaf>H0|Ogth7igyJ)GEUA3&Vn^vYyX`@twWk^JMD9opdz^EQV z$e><StO>dx1zJcC5s45X1lEfWK@`165Pkp5_NB%7_qX>t`>eJ0W#(z->&(8k5GU3c z6CQ<NBAg17VI<73{u~&_IM4bEVKn1nI0YVrZdeWVy%+MBGuD3zMlf!NGvIaW?~F1| z;Kd^x3fK#kxZiTfP8^0Ra1<uOG3%dz(;2&_8N*{@X_8<HRKdAWg%v;*u+{oYA&)7a z<^(IQW~9m+U<^D9wKG>BkGVxdE^{9$VUP9qLnU|z_1!R3oUc&xzC#}Khb95KS*6~m zKrJZKp|gNaHdMv?ptiIUDqyW0H$f#j4;AP#)K1-jJf@3Af%~Aoe+gSdj2W=wB7$iL zN}viWgPP~m&{1G7R7Fj2Hf(|V;3f<tg0mQR!I|&{oDbha74!otPB;gwoth3co&)1y zx*g|1rkbMQ*fHgFRMBC`V;X4`-~v>I?Upy73b_rnQ}>}({LsGdgId6IsKl?Ve+X*+ z2dD*&Kpn{_OyK^Rar@#gRN`<BJ`Kh~1<HY{I3Mc$PCKr!V=q);%}@ojLKW6#dBghe zLKV^pHU9yOCco*Wqm}kUC42)F;5}5rPuBkpYTkD^2mZGHn7H7|k|4)zQlS!LS>{2- z-3(P=Db!K!g$^=}G%Vg+ggT1rkl5xPRK>ke0sK%~*bkLx5NazwLKXbQavW;MenG`? zabYws9%@1Jq4H$SWdHS|00(nT3DgR!paRxG1@b{9Y=ydP*X;W)s1<cXUB)L+1&=_* z`3&{_m>vIwTF8X;yW)2Sw<?Y+s)@-^iL;;r<U)Q$<{&zZb|DqI3GGL+9cVGy((yJT z)!8c-re*C$`YmOn6f|ihHT%$VREm}$*>RMETpD1hXnmj;Yz}}Lv>F{kOVJ)AQ`H;U zsldtVKTvio2(u6_LMPBFv<B%QSzW-6(r!cfh^;YR^uOie2t|2Fw@>Ej_&6oqsiL<X z%|jJPrc;=UHls4sfVLvt%MzqhNJFv$q*E<MD^L+yhjbviCUr=bjB3$ZRF5{Gm6}>f zN0yGVPzEYQ)o9X|*-oaV?%|P+9(Q6$x&N(ulPkto*L>2`RDUjQ@aid#ug)J9)$Q^> Xi+&s$S=7){@ALRhdpv$`?11YZ9|Dz2 delta 1853 zcmZ9MZA^_}7{_m?S573U6QYPp<Sh=8UQpgrUP4GZRN4?944chkk=bNyXQi$9rdeC9 zIm`z}iA^&TAAIokh0Sa}*ladt`2EkheR1vi-@p65p8L73>wY=sLFTQ@zOy5o2xCly z+nABi4M)KQD1Ryphw0Wo3yx;&g;8)7jE1F9-*1IHW{>qBfRT)k!m;qA^|x4mtJ^ri zfSov$xZCo!o!Adm$Po0v=hpuTj$!;2#=t)?3C1u`!84!=%YrH($NF<2k13#0!KE=y zsIv`6ERGr&2aiA=(?mmTa|tS8hxK<uCAb6iT|ZR7VW@epA&>b?lK{U%y^mr0w4g*d z9VR<;RB;j1mX<&TEVJWks6_Qpfeu6MR5Ro;muVFE8r1hUpjO-mPmQ2J>-Q2={(Ptc zi=pN_6?BxK3aYX?H~}7j`k)yqVGB%zS71Esg;U`}sKP!%#rX-fV__V)#<6fbOtRx_ z$Q0uZjU7`$M-`Pr9#c)D0EeL}JZX6bs*np%JJtrZ@(%m{I@AJspb`hH{~px*M^FnI zf;yUEn85ur@9c|jP>FxSR2a!cP@oK`iswPSFSO%QJFbFC+yGTjqvZ+fZ-Oe|Jk$a% zLQciB!zl8bE;>ro3l-oFRH6ave+IP^ui!-Z-uiz)t;jVl6mTR|0*~c1sJPis1$v>5 zFc0#WEi?{`HT86K1jivU%{i!w+o1wng-X-~Re2B87T$#__=)99sGWKX73T}oyx&j@ za&vK%#{=b0k7xgRXL4|8g(Xk{%b)^PLM3c~x@5=f`xdAbwLx9NPN;(KL&X_{`u?dM zzkyoF2kZX=wNt<1*M}xXaYdEb0~KH@)P$LkUy<30cA!$Ef{V}=BwLGSqLu!~ktxn5 zxiGD71JZ9vHYJ2$yN-4<nu{pFWFgsJG#|M%z*5liU@z2EfNHc5RifFb49Qe|0hcd$ z!ul_i`9d%=U^=QpIcO2mfwH=wRnZosT*TIxdi1|}afG48NViZ{<9`vA=Io+Zf|AiT zB-3e3LMu=?+K*NtZR#4N(?~@PXc^M!u151vAzF%bg1RpIkZdyAgO;FLl#dpu=<Rf5 zX($_Ipggo2{j)i?lWD2@xYOSg?FrvV&tDju5O^1z<?^478z0Dax4I$+n-BULYXbwL XZ-xa<#SOUJMGeR58hwq2d_MCRcrBBF diff --git a/libs/pycountry/locales/fr/LC_MESSAGES/iso15924.mo b/libs/pycountry/locales/fr/LC_MESSAGES/iso15924.mo index 9dd0aee69ca046c07cd3c9ea4af47de55f937da4..62b78b1843917c3b19924cfcff24cf15e1a8ee54 100644 GIT binary patch delta 3927 zcmZXW4UAk>6@YK0Em-~vrO>6@?JdwUBfD!seoQ5X?G|^p`)hZkVideH^LF0ddGqe@ zezqAf83j!s;V&6b)Bt7!$|4jKq7o32=3z{TMvcUn2pTXZV!#lMF)<SS&YM>(ve~@v z+`n_rJ@=e*=Z=N@7Jl&ZhVIMjlzR4jr8X#~?iuX!es~t`Z^J40WYPaGI6(Uy_+fb7 zjy`w6Q)piTH^R%I==(&$F?cfV2`KC4;TiDy9jdF&M)2tn1-BIZDwG9x6}-RTgHSej z6pErJiuRA7=y@J)g1>@d!0+J@d=2h|(zp<4xEmfA>h>ot)4`!s8=eF2f}&^@@~@uc zBOduVJRSZ4o(tcEGXEsBZ-v|7HaH6N6T|Ja=izy<2~UH!7324I3*iB{o`LT`QSc}{ z6}|x3L%jqqhHt=+z_YYcBk*d-?Wtub9{Cy+!|#D&z_*}yb`^?;z7NGSFF@I+`yzr^ z_A0y#{u6!_mUbz11^g@&1$RSH_>F=O!_Bn6SByVX@E8=sUxE@Vzb*JSl#MrC(ATpW z;<>KchEQT)1a5)XLH^Y;AKCaWC>wtrih_rrSpEo<lRpo|bH9TURIfsbkvE|j@{fY= zLb<wA2>_Wt05`I~8p;I%0*dQ~p}6uYC<crb{Rg2K@);<1{{<)pCs6M6b|?niU-Ul$ z<?f#;`d@}}fImSo@D1r_fAu!PN$_1L8=iDgf5K@{4A}zZBs-wEybPJD_CZl}LqQL& zryW39cN65$>J}&-eh7-5pFuJ7H?S)%d>uhz;2kImx9;v+I#}=mD2A1wob=LypM;`l z8p^uQLGhr0k_`crthp76!S}&E@EIuc{<s_ei%b7nbo?EPqIZh+dS;(V`%EYs?SwLa z6pG<jLQ(W-D29C=%E>L1bukpfZ-WwycNXpMLP~;qY7hR`2*03XC;VG6@r;Z6ib_y6 zybQ`o_CeWjrszKmH`2Zl%0^323~<GGrx^bV+(7^B#rWM&V&{Qt5M<#KQ10f35F6An zxE}rm%E{j<#{UCl{wXD;J_OHt`i@hdIP>twM)qDca_Lq2(!Klke*BWX{B4>saWYbg zOc)0yanU}VhBvld!`!T|J}zC8#$FVUhA#5jL1)x=apKiSk9bv9c%v?A^uDzH-=!-? z_m0%Pl}&1_9+;LITQW_fvRi%E8rBtKbuPwgviIQNz`&%<)*{ykI&I&Jb>Pw!n|SfC zp6vZ{@Vt}9B2)F$SnsXDf$~_?%GN^bg=%cYixYcO>Z$!Eu%WRrLd&Hs5XYuBw0WSr z*lAT=fXe-WjbpXo`GL1$bzL^GE0M<%*LE$p<kbEsTlHJnQ3PXy0Ie=<q@vWNzO8#| z+(h}d4Zmt~1IB&RY#9Ywy7c0mMh;e^QC2|C)7*r*aT_JR8t?sj$Iv?Yo^x90LS1w9 zYz>{#vDt<+5-)1mu-|$4(C(ART|1EpUmP0Twb%&)Q#Cg7bj|OyBkN?S6JclWfbrgg zLqoL#*%}w)CAu{0qLvHGik=k{W~&VoVaZ~G=UgK)ZQpwOK-vymCtH(AEtfk|XKRg4 zJCRf77h*op+Z)=st$S@yHL(d*c1Pk{*JipdO?WRo=iNN4C(`V(o4vA{$kqsid}y|b zGwP8`151Bk8ZNN?dz<KQt0oAy#5d5ZsR@_Xm$7#>$&R8oUG9r4bt$Jxn;U%2GSz!_ z=g^f?_)QMfYH^{H20K=`B$RnNwykzxmxwE@dH=lL8G6T{%r+}tO&<>cT_TE1tlKW_ z9XtEnZuVTDOU!Eg^vQrgMDWs}tPorpW=}h$Bq~C2GFz)gUW(Tu(=ee?L@Z&7W3Ylq zuqIGbVLg3+1llmJMHYX%kO4!OczI;z{k>Q8DeDgQ{;YRhbdadl^)$ButIF!2X*-Gc z6HR`2%Z_!6y{TQg_sW*@Z;)g-m_{|9tDH7A5tmJyFf@_TrEx5bOqq^^oW$B`(=k2? zp{9Kkxtiaf?%PB>ihIMlM`&Pcl16xQy7$_yf$p^5@*-Ba<)$e2xi)je)U%_*dXa$6 zcce3kxi+gyV{z<SiCM|xKog{ME{&T^h=_`5^0z@&l%{8<bbIP1bD*ro9p07Ddhc4I z;~vnL=*cS#@jczn9t#3uc*YP)oOOnfExsqjLN&5+9tShMqZgdtJALc6u1nR7WLut7 zV<*V_k>gaCJ{1{~sjOxkDL&Jw<=Q)S!L0GK)n)SPC}M!`q`uAKC9zioE9sw${TrBb z33hS5mcg}ae0w)uxZ&FO7rhpWVm0eg_$(7UUXzCC)J@wo&D5&#G>Yw#Ca@xxJ=IU4 z$==$9+iSDdI9*zBREelwR<jfrY;*WDAWMsj)3eTDUX-fYG~jBPvfoB65_yi=LT$j} zIn(s5Zlqq-C@yHlGpSBY_S8twJ9h52?u>0yJX1ZFt+fg1x$GygpQ^dnzx>UnQ}Yen zFdyio=G&%KhtiOw^f4lGHbyLsh2lj$S#*_E(LtQ$WlWc-C{Y?y(uehYA6`-$En`YF zLdbTjtUtc0E%lP-IN7*nm#BE2rjLtmOMx-O!D3pMWmTz>q_Ayus18)l`G~*^f$bPI zADaeUF^-U|Sunmi;%lG!*`N`$I>(cI!A!c8`fEe&8{%idH;uLdQUvn&IPrOD$0j8t zqgWmCsApk=;Fj9ZAn^|Mj_w}XxMYc75%+Wt$yG)25x3<febKbU*!&orA+c)Fq>&*x zqx{K<Ox=)aBy8O%up+K4Asi{IMO&})4#7tF-t|jbHp0W`B-a=U8$N-{i5Fd$sz7$O zJsC*DdfyW~I!<b^ydU}VQM{$<y+`$b)z)jdW%78DC&|c*d|Wso37x#2+%yH`|3|N+ zUh|eyXc{;(a37q(1Xru^3KtqGxH9NHKCqocHmZ_GsFzdoknkMONU`G~W<;;p?D0fZ zvel*>qe3-J1Aw<vf}tWirpT(o`Hz@LRY-5DV#Q~%s@N)Tvs^=k*CaFzUzhfKQ8jx^ zN?~QIjiksCMk$YM@vbfQethws;p=2MWu4z2m=N14zbOuLm4rf#iR!SUa><<Qt@<y_ C+8#>) delta 3924 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 diff --git a/libs/pycountry/locales/fr/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/fr/LC_MESSAGES/iso3166-1.mo index 1aebf77b57751c31c6dd019cef4fe8867ed0e34e..65516dd1c37a5b9bcb712bf73a725a5a9626f441 100644 GIT binary patch delta 9468 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 delta 9320 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 diff --git a/libs/pycountry/locales/fr/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/fr/LC_MESSAGES/iso3166-2.mo index 75067973ad47bb7bc55ac1a036833a768d42f17c..e55fc69c8ae0e0dc4080b6ae71f569c7ff625198 100644 GIT binary patch literal 160680 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�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 literal 166186 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 Jqx`b-{{hPONY?-W diff --git a/libs/pycountry/locales/fr/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/fr/LC_MESSAGES/iso3166-3.mo index 47db7f43dc057659b33fc39efa40505a710434c4..3e76d0c1f83c6d7f7e2526905e0d5605f6c6a20a 100644 GIT binary patch delta 900 zcmYk)KWGzC9Ki9PNt@P2Tdk(8|C$q_Hkw}3#?V?E1VPlnK?hqL<Z7Pj$=Qp!q+%U{ zi=~4)1VNlca0r+Rc66!%(NSEigW%v$L69yEUHtxH0zP>8y!Y<%e((2t_cHdXul%jI z?TOGV`a$j6M2@Q=erO-?0Di;-{=j3{6aM%96pk{#f*rVoz4#cr@CEM08usBk)P2@* zzeriaZH<8pVh;~aVmF>g{o^$5z*|ih@i6lx+>KR?;aiO0r{?+>w3z=y4H#_~8Ndwc z`bCTqUwj7REZjrQd<8XwulSj2{KBKm*GNwTZlJ!uh5OL%6q&?x$dcSg&2$+xk>}0% zYt;SUV-h#<2=OJpU8En+;7+`Xnz7qlU%)8yN4N){p&oFh`FssE;5upre&a6ugBq}t zd&uAk)T_LSL-+v8R7YwIY<z=h{EoU|jHnc#(JX%TaIL1_${<}g)beZ7Lu-XJ8Ln62 zblpd<ku61I>B04ywNb4Ljm)%+S}G1KR9p1hJ4FA#QLRSyx~5rbhT8N_`H)0bYoU!$ ze5RE11J7A-ouoB<*}v{Oo*NVs)>)G^1;?u_w?FM3PmiP~M#d(rvD8#*vN9U!PnYJe z<^7zqXq{?}PL~2x2<&;kVDjEwd(IDvCTrg@vz}8lwqM9q+{jiqW2aW<I)=jO8NU_S lB&|#JYQ8k<xwlKkx>2uY>s3M<YdC0~$0V$*sXXi&_zUo~b-Vxo delta 815 zcmX}qPe>GD7{~Fa-E}oJE7RS|v@yXb-N~8M)PnR>2fIjrz=D`<jihC_X5EA?d+SgT zgy=0gRFDx=NQa1^&~A0<SP*m!FF{C$E`5JHTMxebdEc3F-sgGVd6s(IUisFVSTtfU zV-KTkli2}mj`2ghzz%$gy8a0d;&0UR`{HJY@Hp0E5nFK{8}T-_;UcE+De67%akp8; z)}x6f6J}ev(Ty$Wq5g3koAFG|EOxUl;&!};?f4Lr__}ue9XhN(qc;47JF&Aax;~6e z>~H6o_}sXJ%6tje=)yAYXI-EyZM1}X?g{R~uQ-Am$e+0lQH8^(0#4P|7qE|Y3H$K@ z_TWcMv%mdhvIQG9N0p{9&AJDh@F?!U6Q~5w*X|ckExm=R{622ON2m>7;ShdD9buaD z=*7cGGi(|wE|ZH)^rE{+;ni<Jt)~IiP!g(8p%*C`1&{v^C7|O|r<A<D4TX;GUvS<= zt<@rwC|y!Rqs=AXl#y)pJk^mdhR#gcs^y)G_{xXakJ!SOx;rPmBN@-n_#=+*jSY_W z4G@i!L1`{?It&V>d@xrG$DE0LHYhk}XLCW`ITmQ)-q2$FW--iN39h=A!-coWKMCLU hMpxd{_r}xH!RqsHrr()bUA|V%=4Y>$XPjKw{sK|YSR?=d diff --git a/libs/pycountry/locales/fr/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/fr/LC_MESSAGES/iso4217.mo index 71762ddcbebff000cbea58a4da1a5fcb084155cb..a73aa850da75e63bcc67221bf650602df276cbb8 100644 GIT binary patch delta 4592 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 delta 3879 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 RD&!Bk8~vebZ%>aY{{VvDcAWqK diff --git a/libs/pycountry/locales/fr/LC_MESSAGES/iso639-3.mo b/libs/pycountry/locales/fr/LC_MESSAGES/iso639-3.mo index d3b01dc41fa1d77e06934310280947aa8e61c701..d805737466a1db9c3b8123271161ff5dd3729798 100644 GIT binary patch literal 418827 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 (11v&~rbARdH;_7ovH7h~~cxz4xoo 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%0DAh2Z~^19(6PB;1%iC@-y5xI7XOjO1Z=cZ(S63o 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 AIsgCw literal 407281 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�%3t0L?cLJ-6!; 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�Ha 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˱F<v7Uqqg!Zy%I;72<IWw^NI^| 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 diff --git a/libs/pycountry/locales/fr/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/fr/LC_MESSAGES/iso639-5.mo index a9c44785ab15ce5b10054e92ca7953c5b83664af..3e6f04de0626d0b861ced5bf639b78773c0c4cfb 100644 GIT binary patch literal 7943 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 JOX&~w_kaB|f!zQA delta 2900 zcmZ{ldx#ZP9LLYa9-!uHx4rl7<L+o%?4sA&rH5<wBrq`|F{1uZId^96%<<058PCkD zDdAubghB|X|0<#=bM+6ShXf{3m;MonBBK6D>A%3l?O*?hzQ4PJ_snR^azFR?JLmk~ z=iDQY{`kme-z-TlR2Ul^V64U%`*V=7JHcxpRBRQ5)!+mO6?+gQ{dRB_xF=r^!Ih9- z&DW2CLy(Vy_-E(vQ3rp?^;f`Q$hQo!w6`#h-DF@EBnR7ac^60l_#in<!4=@!;2Q7) zkj{Oc%in|K@Yh_v3{FA*7n}qqtBf_k9U%D$tLdVF*P$Rs@8mq5Z}=J<f&KzG2L6@v zHk6ATP2}7RjzfM9q|8E)9KV(8zXE%Kf$N~Z3{pi_r1+#rCP6Ck7LWqjk?T$H4#@k# z<=`9n`Z16keGI}D`xYcSzvuiLqzcg{;s8jMy9Xru4}i#prCafZ9PG(A_#l<&6_85% zZq8Hr`dN@1od?O##e97M>^Vfas8s_XRb&E0EbJ+eTCf|WN*)0x;GcbhFLdyH&OdT4 zfE4kP(M5x6K&sGPAno4-QUKfY^<5wZ9DsE05J-U@1?k*}AO&(JU;hbQ3IFU8zEH$h zb5eNJyVW36>|u~1ei0wkf;o^3y#`W-?}Oy%97vV?86<m`KythQV*c2zC@aaM;977R z97PG(PJCGph9E`$9!Qy-0x8q8U%YhtmgP@RKh&I_Y0hjiW~MjaKfC@u{4ITkM{)Cc z#e>M>u~eIlC%hI9j2DE(J!1<eVdESLj~|rEa(QQCTV+=Ut}UC{I6d36?75|kXa5Y= zQtok+dr6xIcC^9pc;F;<#Cis}h>AK#?8BnI%aOspM3j!kynDK|G32IOIH`Ej^O*Ks zD!!k0G~>$e&IiH{jLA0lh3DB*jH_6*g(+-EdK|IKLmru>9Aab>Q^-wI29DHBCsC}p z2iw79!4BzVlShL0&gm|)dxz?2i+iztphbao=R4i`zHwCE;@U~bu`HCW#UlizrPboG zo_Whwt?mh>J6i0^*2riHmn#u5lUtT7=4<lAMCeFLKWW-tITw+wtWH(@Y_>XSL^82> z(Ce#V+5weCKOJX>s{^U&a$nb)u4qB0B?(O+MWp3qs_wjmEyIqDP*{!#5cG{Y0|Vz_ z&~Ccc#(Z}_<<I`lawt`tIK9I%K?LPIEyZyK$^~(<H*4dSC_7mjMh$+bP2v01no*h0 zR@Db9c6N7tUD_5wAe%CARQYsUDqlv$!aKI|^BVTYz)`kYyacX~DQx<%*x%*K4)051 z@8XcwdUsF+R_VTp>|%X5g<duVN>h&Q<~q4AL1*;#i5RnAjBPIuWq?X*4eW5GN7`{^ z_cRjUu=M(k?PQ0CtBsD5Nk0XPAJ9kH&&~`tQdGy%uLxw>((a>=L)tL;-7kY?$MtR1 zw@bC7andyjE?Qp>coR+n-A};XgvZ`8ZBw>;WV{k&heqlZx(3zk^vLRpnSD1hR&laR zBNJ(mw90jrzATTHj3tsloBF0nCHi8BiWY8t=n7ASVezpHRrjNg67luCa7)k`6LD*; zP~=R{JwgK`x9=<}-cN|~K=*`IIMSW>Z@3{*wlG?MG7>U*Su^JGxxz`5-sM_qkyN~; z@8~@!+w}Lxuo7cuVwH^=c+wTFBxbG9%UCxbXXnQ1l{outY<wGDPV_w~jBlKTS}<{< zilZ!({At%COtQxsLqqs|;gMT<Af2q!Sc^B{Xk!%b!O6z@nFDa3{SX~2O>h1iX`sAD JBpft`{RdHrAnpJF diff --git a/libs/pycountry/locales/fur/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/fur/LC_MESSAGES/iso3166-1.mo index 40cb730347221a7563d0305d46d7e791eaa768f7..ca89847bbf801be43435b4a106bb98b6fab6f020 100644 GIT binary patch delta 9302 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 delta 9178 zcmZA433yLe8prV)kwr*CB(Wq-LL@?(J(dvr8mT3=pcSp9I;EwEQuLy<C|V7QSW6eB zrDEt}rW<8y>l$6g(pG6_Oshj%OUrzJ|NG{7JaeDt^*QG~=bm%!xywJ6zU6o14L|o( zMD-O8$Mb%U6N_C#9Ve%n<BV^ptmCv!bex))he6oQ?2Td62U&eI22vl7!8jR1a3<Ep zComezu?FtK2*+`qeH1kCaSXr{*5Rb(&!YzV+3MHKYE8U+2x`J8)HrcwGHOBTsBv3Z zzOCiEU;^_yy{usz#?x`KufcK3P%GYzn&2?9InHOOfxpE#{1MeJILUG9U_7dS7S_Tx zsD<@FT}WSRA10aK8AZXjb*L?!jP-FYR>yJ-z>Ve$SeyEGtcQO?P53$Lyi*v1zvJy# zH`!Z2M+~6e6KQh#psN*5p`ew`L9KK#YU1UnfmdT7K8IT1R#d;&t^N*bz~iV1f5pbw zxT)hb$8M<p6H(($Gv_pA|9J?UMI^N1br^(ipjP@W>ft+x+S*Ss2){S~gBtKx^9E|1 zpcL;`B_b&&3%N_qP*nS)=9(1tUx_^=bT2=_+wd3E4um)JCXB>D>anP2AQ5#7vM?Mw zqsHlvTKI#g1y4bp_c#XO5_1Kr-#V8<4GNpF0ltDd;h^P@p-%h)b&JlR7WQvzzlg!q zuc6NKXTP<;5LCTBYNB}50+X;2c0w)C9YsM`T#6c~3~S(8%)}Q^3pin(#w6<JQJ;v= zRBwV5)OqQs3u%p7Xn)lC#i+My1nMDmksWuPRTT8$*^4#tGt|n@ptkrt>I$x)2D)MO zK%O-9t7X>35b6z4{gY77R;t+^b;U)f57H=Kp8Nl>B^LP-j<eo;4RykP)N59WTF_6H zzlj>CPMVibLhVRP)J_&*G7dv6WDaV<%TdovIfm%{-$o$;_gIG$sEJRZuK1#P#dOlW zD-6a^+QU#=AB)<7WNXht*66gd{AknyCZHBL6<rlv3c6PdP+PYIb){vf0k@btP!qk0 zTG)QnfJadG_EXDW!bs}Zt-W@JH(@>0cnM}|2KQeBwX{TgRK36~LM>>hIRa}^AA`E` zhpg_R7WO2n{|eMN<){nWjA8f^>ioSJj_+r%|9TofC7~<1fI8t4YG<yX2K3`q(7g^q z^@~C6P-9fT9BhjDsGS&%dKTuP#@m3JcnhlkPSp424VQuj{K6VeqbB+R_0au+dOahv zydRlt)IbHOg$+XWzZ3P4O|bf0b0zA>>1C_Gi*=}fj`~Eq=PBr3g=BliqXx`Ho!Haz zBd|90DX0PFTmD&8zwM~=-beL2ff4uvYA3Fv=84Yn`lTWl=sF!J=n9Lip%gX1LaVPq zP53HC;X9~-D^VYsAFb}6>-CF9O_YLlv7P0MQ0I?AjXxcuncrDt9X4Sk4Hc*f4xtA4 z8g=5&s4ER<;kCzNB=ro`fL&1w9fVOh7IpqC)OpLS{*t*5>oC9b5rruH7WIw3q6Um? z=}nZ3nkWx7Q6I~Xz-a1|P!lb*{5s3;L_ORGQRAOMjq{u3Yqnzl^^i58poV;m#v;^H zd>?Ay1*jcaYwbHM{{d>DUs?MF)HpX$6Gpc7#%qoV)H|W_BT*MRtu_0v#BvgPUtdN| zv<vlC96(KQ1ohgSvif<{m+dO*{Nz0Et;k0`Y&}uW#wbj{S*W*VJ^DUqsPlH@vH!Iw z93Y_ue1e+zE9>|Ts{I1$19KG{pnn_h19BT`VQFSd)O+2*+DlO5K8PA;Dr(`6p<d&i zt`+v7R(J?C(J>6iFU%iMU$85venD-$oe4!PARcw=QcxGr0d?!Tqb3@Lx;6J&`wY~D zxN|9JOV*+WdJ*+=ywmDOQ3F(>zGUB`ZpnGnm0d+G$S>cUFbI{8L0xeo*2hfL!V1iO zNI%yprl6ILFsGodbRp*AD%8C?iZS>d>f3)4n_y@=Z-Q*p#D%B}8esJj)Q;YZ`pah` z>O!CKwR8W=De!*^XEWBrgQx|aMqTM;)Pe%rdsiBTx{?^wK#fuTQ&G2|BdUKfe(1-< zs2$Ae=q<3F*$rzmztfw71}rhhpavd~T6rmIAuj5kEkj-5Hq_4SL0$O~)UEgob>3H~ z{8?203s(Q#yos(Ff;xE<Mxa(2gIZ8iGaWT>3)FyZE#C!o3wl|80wz#@81?Y2GPk2H z=pEEE@ekBEm7Tc%`V~4wA{PBRdlSc@PDnzXkdD5IE#JlJcbEgsyHL-@Xw*(kLOryL z&1L3F)Z10wnf=#2+eShYzK42R51VI^KLMOSQ42`xVmpD2skcS#SP5z;??>M)Lrv_W z#+`@S!6m3qco}Mkx2S_wvJIQzTbPC4qqeqQSMSg8eAEOFpiZ2I8rVfW0}C(#*P|Bt zHfq9ys0AKHeObS>_6w$anSuuT!x91AyiaH-YNaWdih0-^$6x|Jjq&&z#^J~2MazeG z_jVuyHGVE?;q6ct+!a}n>kOozhh;2kpcxo|Yb?JJ1F7#uZS7m;0aU-^sGa#7b?eSx zAYQe+)5F`5ny7wtu{y?K4d!<eDQJahs1sYF9-?+uFGNk$9~<Hj)OTVsYT-{}3T{A+ za|pH2kFh6yZTTitf~coqQ*40^_5Kg1pb4g-PJ9%#6AMr)eGzryc5H&X@izPt^$`A! zjj&;X_qODt`WK+?c@gTuMq>>eXZ2Ea)nO)uV0;R-MXOK?+KhSzwxT{jZ=&wq5%Zs@ z^Dm(K-85_W^1gtLQ29*MTh__)L(H+g*nbT?m4vo@0cyaNs0D4cj=QY=UDTBvN4?*b zsHgiPHp4$qSDswx-I{dNg>**cdz$?$KctZT*Tf|xG~sv*!BXom8+kFD$1Q&twSY=g z|C8o9)UEm%HQ{B{PF+Kd7jlPZ6lx&}W{OKe17@OLr&g$ei%}2R-PS(M^6IYv7no(J z3D;Zu7V{O<M0?D?qxyY-HSh>(fo>%Q?Z7!}xQtrR4b(ycdV5zEhU!-r_3PFMb*nN_ z4{H}x|B<Mj7-#i~sEMbe-WC_NurlO)*D0r<6JNzt+>3guzeBxlfqlFI8lhI+6xBZq zwPS5i0}iwNNYu`aLwy+^L;bd_M*U3h!J2p&1N8o%prDQ?t-~d&2lw^zai|YVF6yD{ zjT&ey>b0ARns7bpDc@rrHP4#YQ9BUP&oddLncrzcK@$|A2D%@$wR2G?tU$f*TTu%= zh??jmYC)GV0mF*C_6*ed-B9BVK`nS9YM%L4UyrW-q^h8hfX7i2UPPT(y}vhLEGnOk z%6GSV3Hp9!Q4=giEo>8Np|6|AEPoc&|GMR)2C)AcFm-@8K^L<aHNZI3fOAm&R-x|s zPHX=N>ry|5YQKgF7%|Yx=b*;vfodO)kyvW^MFZJ?O|X%K+-n_<p;r1G>LL6SH9-AA zUcXGU2kPM}!6=-8I&T?jq1#XkJd9Cz8rA-*)x+Jv-ine?9onEK>Sy`;EI$kNnw437 z7wTRf!btoE^%neQ?Ke=bab&SKZVakD3+rGW>Wk?XQqT%ZQLn{9)D^A3dbkU<;tx^p z@mbXC_b-gbOBjYBL%azZpeAmF`cS1{EzCi^z8z8H_d@1%ow3$112yn`)N8dAHSkW< z%HKu}co5U@6AVRXsAm{z;#kx~iC7!c%=Q>gy)WuQMqq^A|1lIa!8FuX&PENi0(FIJ zQ46cU2DlH^UWs}(PNEie1=Y`gnD@HYLM^1ZnTz@|wny!F7v-7XDW;$m-GjO}V^Is5 zj@r68sApp-YJx4O1-ydlw;OfdK2*PBs0E$Hbo?3XW89tI*0)0K+(2|&P#8&}0j@#~ zxC=GFn^r%7x{{-qgeNTjrx|dU_i%=y?(OZU2@6nLJ`%OSNvI2*hq{18cd`GvqGcp> zuhw7$ZbPl`@92jg5%nod#9hQM#3G_CxxZmA)X#JZQH^pVq7~7A(D9(DavP!_^-u62 zKkYvU7vekgnSGTwLcB|SNa*+r5o?3=xn(eaD}P4&974O)p4?2LJLLn!zX%;O$W6!5 zz8Zf)Q%`XDrw56;SewxC4)G#UlX?Ncx5pWZs|bFTea901Ehi?Dt4EZ0Y2PpBQ<OUp zY@TxuZB4Nq4##qwhU<vsggb_RP7~vayJ-A3cEwWcj5>7h3W+AfLgE?n{Qtz6P0XUa z!TK$xuA?FK*+e(O&)U8szlrh<{GJ%%<-PsCMB;9uJIQrKBIU6-j0hv1q`sS|Iy#cm z@f;q*X1*E^E%i>6R}k@(2NHS^vxuvNjwi|K(DN0n`~NV7kBL8sTaUSPJVfF>;%#e) z!Eo|vHb^(>(N=D5K7#GZUnIUIbOe!GjSH<$7o0_XpRQjY108)loHN*x=w<buc2XNN z9Y3e-zeE%fM#K|)iH)?~PVA(7KT(TFBE}Lc?R<*PJ;VvZtz*gCsXRhFL98X-Aar~{ zd`<j7OeORiQAvby-c5X&s5<&vA%?btRY`o`%1JiYW$NQ7x6t=LjmmYRjKn|je(UrA z<<*q?6C)|>C?oE$_6xoY-w13<ZZ7Vy+<dd1c_;1p#E(`VU}}D629-%P{s(K}{~z<o zB@?}gXRZAKv!``_!s=D$-d9z?>DCrWIe>DU)qkh{nC}0xL_0#qQ#7vhiq29zN92)v z28-;();QSuY{VMWpTk9%MU)cPsQ18PViYlk(6Pi!rQDHlf90RvL^ErMrd)LtQ^+Uw zTVjj#S&orb9*mD#`v`L>xxQAu*ZOUsemCV*VjeL_?S9&SJD$eTG=$(F+>Q%y0?~kS z6C6&wKv~CO;x*zdkw82~+n+d@$fg{DIyO@tK=kvf&R<QDqxb)LOMHQitQ>&95e<p) zoE(ftiB6QOj!6{uR8_DgZG}V!LYI|I6y4H(it-h!H>S@NmDTYd#99)|h=+-3#FykA zC*C502p#8%2Z`gvRQgmM4_P4xw-FguuZHu8bmCJYmvinTPEyXW^L_ijibPvN#~N#R z)C?r|m#WTYXZ0g0h>_%mVFXskaN;LIM+v!PY~`zY|Gacd`CeUrE{SEt0wRzT5{dQ1 zrdv9yIEt7;UdJoMIAW_R9M#GDV;nJ)h@$=tRvja#-$v+|gRkQRUybYUOX6{2voFD) zOPEI#Sp7|0PqZe65-sREnMfgqP~Sp)N9f2TVu{+s^RzD}RuDQe&E{U!`?q3KqJMD3 z*3@;?Dhkt&*Qm&7{l0(MmA2nkoXcNbEi@}FD?2SaCm}1ZO?In_#T|0|0&~-|GSjmv j-s?C#xS~lxd9{lDh5JJ)HVppQzijHTUn(Zt8DH&x?BAs$ diff --git a/libs/pycountry/locales/fur/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/fur/LC_MESSAGES/iso3166-3.mo index 50d85f5c5acfdbb4b89736258f01e6f9e1b3a6cc..7e3ac265ff63e56c406505b24a67f4d65dbbe8cd 100644 GIT binary patch delta 696 zcmYk2&ubGw6vy8tRcmYg(bkGq@F5CD8);f{kt%}phlN&YMNvFB$-dNq%}klyR6GU2 ziy(*u!HXWedlD}m74hI-pa<_By^HvLn+^2Am(RYLd6W6%_3-!6?yvEoSA;r<oJ5`@ z6UbjgYb7F@2Cst^P{8xx3vdMd1Wtlq!71=3sOSC^>(eEo1L$W9UIve#Uj>g6b?H7n zE?^;m-!SwRJb}J7)L(y6@I814>pwvK!QbFn@E@oTJhP{N@l|jP{RXH~55VJ~2UYAD zSOwpJ5iJv8J|6(`(jhH<HO}Og+G`CXqevOqhwMl8BBhrfJEs;+n(-~$_JNjyaZQ=w zHOYeC_KD4m>s6vV?RDv7!6baoJE3)X#4FMWHkOob8fV&uuK~sOri6wyY+TH1-euxs zD|ouw+45;(cC4A<bDO?tO=8om!b=j1-n=2(okn7t>|4EV^mJ^#TAQoR)wni$sb23L zE*%>;u{3?igck;1AFh-}qH_J>eD6ki=d>EI4^~|E<y}&^aC^7P=ko2xs=!Wt^whHR vsZDuNZEQ;UW{l^+2iqK5?h8_GB`mw0RtHY_%Lea%DBMydolXauf{W-sF?E?v delta 262 zcmX@jJ%gkEo)F7a1|VPuVi_O~0b*_-?g3&D*a5`SK)e%(HG%jl5NiSPe;^hEu^A!a zjzC%j$j=7S7l60{h^2u1KxPI8Z6KWkrDp(XRUrQekOrD-#_$Tr5CjUau`n<I^)LV_ z6abWFU<G231KEI>35XdcyE2wezQq_ec^*?Uuc5Aik*<NUf}x?6iP2;|W^r-1#H7r8 sg^>K*#1aLYG`$kNg3_d%%;e4C%v_A@CVHm2DXC?XQ&`F-|7QsX0N}eNxc~qF diff --git a/libs/pycountry/locales/fur/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/fur/LC_MESSAGES/iso639-5.mo index 9deaced73e5e320dc62339daf2e746b1bf3927d0..6323898b10c4fc23fa1849ed9ccf8321427f3e30 100644 GIT binary patch delta 2928 zcmYk83ry8j9LEpx5D*YSUV?cwUzyhgq$_6mM9|dKG(<`L1Gjsxz?Ha|`Di!Ot=ZD) z{%LdOQd>3GbQMe6dOBQVZ7j^SYOPE+t+|zJMYhW7^S$@n>WuIIbI$pn^Lw512X^^x z%#41MmvYe1x=<N<H`$n@uyHUCT7QNyh42C#4!?(a@D>~jb2H=f9+=Cx%5s5aJ=FRj z90s>T+1VRs)SRGG%*0vyqTi0MLOK2m%5cGuxS{b-j;k#fS~ggQpw@4-d<M$#5tt88 z+4*yDw22z?DV^JS@e3@0#aVF!6_)d$GFWNH0VqR{!?EyLsQquiaqu&!^?yLE%gHvT z2#$dTa0b-+Wv~SQri+d??1ReqxaHe+{u9e9P?--vl`u6YJ{|#?GL!6hI+VjYD0>^A zDzF7Apgm9(ItrtDahi?{e+V`1hl=zHl;Pi?9Hz0T6qZ7*_wkUST0341<sfLe!_M!A zvU|+(O(;9(hf;q<_$?Eo;7zC_D8j1lL^+g$MV4!!*0(_!+-2tvLIwDWoqxx&&+-yf zg@1zNVp7<wK=X%De;Jy<Lx!s%Ys@lB2l8V&Eq6l&dI&1eGf?~bp(^zqROtuc2$+pm z*_#OExY~~EEE}S9RO*e8AM+#+8F20VYfzWv9Hcnrs^tKb!Bo=tIEn0`_FbY3yfQZ- zF_=t@D}XYnjJ<X|2Wo$Gh3z<&9Z;D>p-Q^f@&r`IXYKd`)Dc~Ss=(h+4htE?GKR8K zZCMNXAj~Q|Zi1|fnhrXOWG9q?{ZNsfu;VjOpH(lM0Dpw~MO8?;T3=~d1684Vs0sw& zZEzc`gooiY*az>1gNQy~-+y(iW6Tn$vvr^{-3cecBXA@<4`uj@eLnzIp`k3+{8*^5 z4=RwwP?czeszf{FSB%*X75LMz5dY>d9ja$uw=X`j{KE3O<)2W7a=2M?PzJScGL+%D zkm8u7Pyzd)*6)I<@ByeJI0hBKDHv6$KcJ(97wwD7P!4{E`c9L1P&G3Oj)y)t2Cjp; zoI9a1eHqH|8K{c%+VNLVetxjyB+gIk^2?~d9F1c_8>*lpt%HiR-Y#sh?;nH8cn{RN z7cEai*?G^h59-c*4Rs{Rlmp+U7^+g!pc0xrlKPXRS<Qqph(I~s4Q22ERHVnD40S`T z>xCZpCDi`k;T^Dm8>dRnf(md6RAP;guhj6j%v5V0=~C+cnT<$B)oPI<)Wv%k`O#dY z=;cU3%tm3Prr_?0_4vbLDLjZ2z!a2*mLs*9D1;tDi%?YO*@1LEt5KqjPIMs2#oBb9 zZD<|Zfa;L$f&Nu!Kxzw+E@3)KL5Vh>&RR4F4MLkxOFVyL?qraRRwA97E|ppnYDYDw z9O?VN56wc&XcSW8OEiz7dy)Pm^P$ArRGtpv8kh*ukxoKOQ4r<D>Q9H`F`Y=i7!s|5 z&RvNCtU}Y!VmsGp>49s|WE4R4$ctLh1E>q#kCq`d-4iwbfik`gJW|pBn{H;J>9*@a zCE5zxSq~qv{e_mR;5^&cC5|=sRQl)XL8rrsG&^B;OU910_E4L@)$d-*XiS?M3Ob!3 z*O&QLk<%V(_Ov<Sz-A}lkC=JEP*Zcz33p%0tVznMiL{2=H+ko@`8RjDC0Xq$b(>lp zcU#s=IZmfP{NFaWH2Y$zcfLRDcQ0r6W_Xv#o*yemaxw;`I;~D5=pM>lU(m3*Bh>oe zHnYYFxA@)bxi4f_ddn-k73H4tsWYmoy4_*Eq~xk8mF|VSz9CLmB8`yyT>cY@Jko|Q zPiu<jv2^(RB?L_-!BE63_J;$|!$7HYCl@@Ql;e*uBo#-ggxr0F8&iYi5_WGC9!*g) z?o&nmgS{<1C&N7_-P+>IgT3vsB)ZE=eoac>63c<*w+f0}PwC3Za<Em|{OfKTx%8Zj T4V|7>Bc2u~<catL;fVPMKK@ZB delta 2386 zcmYk-drZ}39LMqJC`N*u!~H4(DOeWBL2iOsi4ti_7!)aK#~>nC=1$q#T4#yV)vV2a z(2YO(LzC6kMmw@$*8HR8bY+dPXl_ZhR)0{NRAXH%>is$AOY0fm-|Kmv-|xBqew-`o z`s*T7=?R05)JrTS+7~+aJRZG<3u)w9=d$rV%*6AUj+ZfjGgj{wJC{m1%PceNP|vqu z8tz2(^C;#z7jXxzVklnWMo<G@Ky~;HYM`G@UsAlBW|p9y3!(<tfEn0s^$%kS<)?8u z4q+aijoptpcPW-}ZW`6_Dz3mla=bw`mQwCSt>jtMbH^|T-@+{X5H-LAYJlHR&!;Vk zFK7j-+-PpY0OPw58EwgaOu@stfdi-kPM~(=1Jnv9P!sqbweml#K8eP<zZ5m03RHg^ zxv2l`Sb)8#{`)ba4m_(kf$I2_dEV;3LUsHTs)ISyg!28)6=4vy;x^<=-Ck6`hs;4# z`;%54Lrv&{pYzv^DSKeXT)_0SRhdYYTZx)jE$aErs0nnT1`3;p?EauRjGEwS)C4b~ z+Wm^G!6l`#|JveQddbI1REJx*Xy7g@?=_!6ZS9MwcE_!J26gu1sCKjXna{ZdW~=8W zSdA9+BNr`T4td0-Mp%|sR>DOUHK-1n%?`60HRCX9>z+fc=oKrEptk;F)C#9i1I?n^ zCDKS{A+L*DZskZN84bK1)u0t=<3d(`67}{U!Ik(f>i@(ScK;XD$`aU?Wtf9&uokQF z5v;{GQT<Mu)5y_8+#DILWEs=G9_z6XL#U1;$QbTrD-T=wedHM3=comIjeK!#2DOmC zkU!^V{~5xSqUsyXtuZ<O-Bz(5)nPxXfrskwZB$32sEK`w+RACvQT>kE(nR)O17xCB zT84VA0o88{>g(x5nz$#hjPc!3GS^`g^%6~@R`e&T!(_Hc7NR;{ZRIAj12sS|YR8^J zP3#5K#9l|WKWX>JPz(G7BYN;#GI9ph(LZK@PeNy3ggSyvs1@u$?aTqxN)94_?hP)Q z_$X@NbEy6%P!sqL)z2&zV^RU<Pu|@~uQy;bY6XuYUr%gO;K~TSOt%tML<7O^j$1(J zhpUCyO4Jh@2_@Fx?jgE}3PMTmmtNiwaXYb%@&8LY<N4G>Mq8~^8z(m74)Qy#+-h#Y z9mE5~cA|#hC&cLobTgr^W<Ked*Ad$OSkm~n5f8<SvF%Z|o9MK<JFwmI+MP|rDneU- zGohpxt&O;k(3amx=m>Ot`YhKI8;Jj>L<*5+E|r9i;Xy(#;3DEKB7vAsyU6H>ZXr0G z*!ka$s|o#DD)9^L?k9L}-Mz$oT4))4J$etyt-M?FT4RNqOuax#bwo)l$NPbe#9Cqx z(L@vxLGR+?FTK-A`@F{FR&OZzooL^ZdY?Czvd3HHf7KiJk9(&AXQGEwull@!^fqr% z#<7&j@?ceYu(~){(@?cGdOV}fmsnj<UEbYuz`LAz(L0+J_L{Prz1Olwqx*7R@_9LV tyS)Cq0k1UwocDMBWb}uEX`k1Z>-Vk{wg*BV4Tp=nLw&{Jp5Dj8?q9Yp;5q;R diff --git a/libs/pycountry/locales/he/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/he/LC_MESSAGES/iso3166-2.mo index 865ecff8a7a7c6bfd056827c895ec1b60b870506..c16da1986af0d07c59b63084bce726d82b794f3e 100644 GIT binary patch literal 43708 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 literal 34323 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 PDroUxq8C(XY4CplQ~c$1 diff --git a/libs/pycountry/locales/hr/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/hr/LC_MESSAGES/iso3166-2.mo index 5253949713ab6c7563c16dbf1214421958748d73..ab220d1bb55e6813b3b77af20d2c2fd07ca00a82 100644 GIT binary patch literal 25948 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 DVU3rj literal 26178 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 diff --git a/libs/pycountry/locales/hu/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/hu/LC_MESSAGES/iso3166-1.mo index 156f5898ef4c7ec7f13592da24307e50b9fa34a5..36a7cf92315deab7f4cac2c7b3135bb39379a25a 100644 GIT binary patch delta 9095 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 ZYhACG3m8#Y^nBULyw#CqV+IfR|1VWIwR`{o delta 9032 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 diff --git a/libs/pycountry/locales/hu/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/hu/LC_MESSAGES/iso3166-2.mo index d01ef2761f505d28e17ceee880aa1b11a42df0e8..b1b580d5627a3fe55112aa776aa2c0efe5362c3e 100644 GIT binary patch literal 68957 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 BTkZe= literal 69162 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 U1p?V?0ozb5Y+0tE8MN{L0c;6%^8f$< diff --git a/libs/pycountry/locales/hu/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/hu/LC_MESSAGES/iso4217.mo index f993b94a05e2affa4b7b9a07ca4ac1782ccb4e17..0da2c7d5d2e351624f886d91bfb9d840705cec18 100644 GIT binary patch delta 4588 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 delta 3757 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 QqUlpzVdm@tFS2RIe~~O=XaE2J diff --git a/libs/pycountry/locales/ia/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/ia/LC_MESSAGES/iso3166-1.mo index 575eab34633797b8b83c08fcb9fc698f588a2d55..2c051683b84ea8fde7b9bc1b380872479160f05c 100644 GIT binary patch delta 3486 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 delta 3482 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 diff --git a/libs/pycountry/locales/id/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/id/LC_MESSAGES/iso3166-2.mo index bd9609669d6328d34f753eaa93b465652a347702..81ff7c71ce18ccf88d8c754a4e16e7b65ba2cc1f 100644 GIT binary patch literal 159848 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 SIx zz&Oupe;v9l$VKfne5u`q@9o5=c0K%ORZnbfg5DRshb+bx@PEVB5cEDL)|2=?3xCy! zWfom+2lQkchpii!%*0L%n<d8h1f5ps@}IX%`P*m>E$(g>_h8VWFXS4XhW;@0!zMEp zA0I%w37=(^{K-@!(^tsd@DU@{9^fQohmy-$7$3oFjodM-!+X#U5vy7;K3br22)mCn zzSU|Z-p9z);#zdW))?YShjuPD3z1oYt(VE?EbM-bZauIEJ%a4@=o~~|Z7w#ygr+tw z0V#Ldwb8UD<F54UiRo8l$1>ilWN0rjS9_Fs3H}z@{A+6QB{95V*Kj1`Zl;sT_;mcg zMC_v&ms-8<LH1wt=bH`L-9w$!&LY-Q=p&4G0rZ>5MXj~fsWtZBF<aNc`v=)|^k&e; z;3wIR5a+x28bTgj;O#;7Y38?^z}4_CBEBb}kB3&@{3P}3p>u`BRnOwN4Xi`XO_6ns zC;7WgDTn%=M||H~4fJn<rV$hWOe`e_+FtyrRhYdf^Idj*x*JwAyZ7VgEBJTN!|1+j zHcz+Qug2y$a=3u}lI=6A(P-?y3GZw3_c=E2GG2eijZrv?{Wq|65<3%-TaEk|#QHe% zgY+kf=P`7Kz&j6~+C1h%iQ_AJF5?VaPdN#8$^ht(V&hSZ@oDJ8ka->1WndWm1lrA( z|NFLXq&^efZOD9%zg%z!F&ssH1GXk3|0?u{pxwauSz=GNy7*gf{vIW_9Be*`zS>jJ z|A7A^^v9S_MPKa|tM!lAyq%tGZQxHt{}FW5UIPC`_H>iqgzrPtq76DBV(0|@PiQSI zkCot7bhhA6t(EG5Y#BI&SoV<5L*SkC%kgy*-Zk*l&IS*fU(JUiGoEYvDE?+KZ^&Hj zIs7eQJdECjJhS2Vwd*qn`MLO>3w@5+{S6;sTO&{7zbA3ujQmK(ztGi|WAiigj*!m+ z_z%+`LuL)QjGXRf+#i2WVXL*}D!oe>Uk&|))w>iMm!b2e)p-N?Op+k&USfC_`R|bL z%=`w%)4&|&1L?ovqa69;#L^5KYCl0!TWYx+w(H=xd^W+mpK%uc(~zBp|DE_g3;BWM z)|T<R(6^bMY+Y=&G*<h?c&}M4&NAQCvAYx9bFpz7v7SZlj>+s|JOiJ*iF*k)UPI?5 z>}-dA12L#|LuZbSk27zEyn|d3Jp!)^c`nD^cx<$?>;4)tY8A|%MfVQoy^y~gnOBKp z9X-hWPU3nCnL=cKWgY~VBeRv<CJ{#=G_{)0)cT;e9+}OI{{+?ePa&sVNRH!8b{Fw{ z3;kn!{tC{=Rynlm>1ywTE6v_I<~I>T8FtS{zYR9uMz5bM$+;f-QpVp9%P{<02mfQn zW%Mz2?Ic<c`fOysv%LG^^IgU($n87ywllvTKlSn3ANf*zrBSmhp#4p)lWie3JJNe$ z?<@Fc+I9K@xenN0K;KSRt3eDGB6klwwIlfW1-q;9xdq=xLAAb&2jXKI*oLmw2H7{z zO}4H^{}cUt&1Vmz6<XZ}<F63j7btxR=HvHyXuZwP<K&raFGBmQQeIi)eFpPtm1@== zUoSyB2`?9X6n}SOcVwlwicS6m_J)!7)A+j$xu4M;M_h4YxCNQJptm5WD(H^3Yx@E+ z)1a@0R*3F2_&=i4(}Mg6-8^i4fbB)lu0;N0;#i3O(~Q0J0Q4NNay!ZVL3CDupTp=* zzuRimf$<aAosG{T#y{cz46Dmc$ZxmU-XqV&mFk7)sWyW+)ylDxY_rV%Q{>T{m~X>w zTjcty7RLL5d2{%6=xU|NWG9CI^|uMLR``De|Hm!2CFu5{k7hm>y?xX{?J#m`|B`Ri z;>kybe_oxkpB!tz{|7q{5yNrwEBPnrmt*H4dMf=-><!>L^(6m}j0^0#_O#fGvGXE2 zo$&E0_TM3|+Q=5*SFOn8G;WT}jo4g_jc<_4rawsxQ<w*3yHXs_K_6kclwqqKvZG{# z){}gbtuZ#MD0gJ$WBYY%Tnn~izKc8`!1h9HsojNa7x<l+Uy6>}=gg-gdm8;q(eOD4 zU&;0l^hW6Y4B-Z3SJ5BDeqCh#fL0Bj+Fo-0i}7G=7lIiHa>^UTx`v)lKTcl;{cda& z)77rUelu$HvDp!AB{AGh|Hx|hI6Ta!EXQvOde<`<iT_Qe(+HmviTwj;AE0w1^qJrp z^ikB{C3x9(-I{?9U?*ldzJ$FM$f&hJz8bQF;4i_(v&7qv@hn?Q0eF8w3leig0nzS3 z_c;8giC3*Y<8jzb1$WcOW9K;X=Of2I1?RsHihpE30DrOTlF(!w5mPDs7(Ep~YOm1` z;P-22KSIkV#yO0WZ5Fl{$saOXAkJg{E%TNZPbbD|{}Rh=^pDtFw7Jxx5pk^jpEw#K zcdO}F$QL%%>Y{rl{Uyd%l7D-~z42SQJ%l~Ay4ZM_K9Bkhq4$PXADcfBe=fQ;%w{3H zyP%(A{-paU<41}24DA1by#d6qin&@H^d?)pZJ>RDJ+;5E`9fmo{=FZ&0rbX$FL4bv z+V$#*y^D$YSMz^5KGfFWGZ$I4P1vuF%zmr$add9Bye>d*2zjaH8SMv)?Mis7%|;>q z;uhOI=6fmfFJpI($t0{K{^kRFiL*?0v0oG4n~CW!lkJF)E6r~`Y#b%V3XA=D%jGna zz1{FRY+XXX0o{ET>mozQDK)Y2q|K}2y9as&R@*DUvn=jzcJH)A=TXKv^cyXf8pJsn z`UCVS#I*r?FIwJ^+?GL{Rk7C%`}2wAOvXzYKaFk_*>joS&UlXL6*9jWotDIugM2H- zN3irZbO$WOxBfRWAJgx~r`lKW-mvj*>d}@srZPWd`K4k@Erz`&(C)`Zn$_(>V)=;i z4>ljhJPUh0iD@4?+vpb%!v<(8(3=2XtvUD}GRZcC_?u9hb`WOZqbK}3(c5kUdx@t# z^vzbg<y_yht;P~L*JAygIJ#o17q)LD?&p}#r@zd&jQA&F_j_Wwh&~;e)%bYTVj76; zztFvf-V~c#@NqfagKS%LH$uOU`N!D1hw&rmf2cg5?Sxhvnpz&?%I#_BgV8_3{B*`= zKJ&KFXOct2gkOdBCo!}}|7K`K$R*nrv)vP3Z|qD*ZWnP~LkyMMMa<*yZ?@X_sLPKC zT!-vp@Ea5U68)b{_ZDh%B|86te&|)u%>}Cxk6LYXefYhc>+?C|TF`0|&%fs5Hs+md z{YZWU^v=fn9J`;JpZ<)$pjHoH>r-eY^a=R647<&-yOCIHTh2byABxOy=;xt#7r4P< zDj?Qe=DFBv2Y$}Hg~f0Q^Y@s)jKBNff5H4Ka0IA!0G|Qk{{q{0V)tj}$@Vz&XYl<S zviG7t5gE0c4Vz*2Fg=9+8u}B+4=}%jp{sQ#mwa@G;&VFlEsWLvM(%gw-wS=S<@pvm zzhdJRXzeVH`;mDE`XFMM4L#YercN<@CfkeXb+?>uf_M?U4CY^$zpJpbopEdQUV}H2 zxE@CCW~<?C_-lus*WvZCdS7ik`S=F@L44dw?)m0N^eyC32c5^UooPA8(VvcewS(~H zqNnyC_HMTvUO{#;I`=9T@~@7}eq?TdzJ~c8?E3II$zqv+?lNTRp??`N3oNg$$h>Ru zbOZ-Lf57Tl!h9?G_k#6_`vABb>`H8}gKF#X^B^*l=~am(AD+Xw2fmKu=Lz^l_$)`Z zExh%_(G+Y0Z$7B@g5~!I`u(YIAu;)hVXgVN*K%$NmYB{X*tv!AvnC@u&zju1@Z1J| zfbCw;J@}i>_#<Mwlswd)WUST%J0F6}@Ov%ss@;yvMTw#N_eSD+kJ@a<-<Q}*wi0L_ z^wb8RQ-RMh<PkO72~OhgHQ2ZkUs2=^nxBgqKaPHVL>8czZ08{ts^q68cF!Y^!N{xK z2|w9xr&eRpy$0Tm#uslU{%&Kw*{=1&$a$>R!!2gX-2<%;_9jAWfld%#-{9*Z#><Ie z9rTNlnPuzZA9U_O{!g2qjqlp%v?k|YjP^R?tI6?uWZPA$MLssqVE%C>|ND&J0vq!z z=TR2(3TU;^Igk0p$bCTH#Wh%Ce8vAAI`<$mm~kARH!uzo(~pdsnmsS^J}P0_*S1a; zkkebpZH9LSex9U1$Xu;4@hvBp&%m4M_qkM_jqop}zd?W3Xs=q$N8`7F>5FwCalVM| zW#&(`_nE70#AmWyL@u)`%?FX=%h<WjVh_PPhklyrzDwK}klSH1@Co$2@VA-#Ys^>S zJBFNEQ?L=ay_1-x+=cxh<J+;JcDluPB|gt5=c?#mfd1pqFF^K5WCqbMF}W$kdkmZ3 zBU2UrhuBWGi_rfH+Bw8hj-3;lo1d?Vu`xWg3!(Kx|2g>2Ge2OlhM}nqqLyl#&F67+ zzogDTo4yC1t(ljj*AbncO#cCB4<Oqcxyi&(1A1-ZoeS+Ebn1XFBXbk{x!BLJ*j#7) z83ylf;(o@i<2AO<o`Kd2-73UWO3Z&+oX>-AoALo{eqQPNUxB|HpxuIeKXhkXoj%0Y zz34QfAEGy6{t<T0#J5@&I0)Lq#D5j>eSzN9_}vR{8RK!-QhSB*Lg-J>7cehkel|KS z@%K73wGPC87dRB&0enoLH!xmnVr>NPDVyI9UW@LV`0t3F`P6O|G9LQv%+Ik}Rfpe# z7_LC}e#X_YSqpw!y4retHnut(1K+~;KgPR|ymrHX$Le}3^SAKR$*y-N>ZNuNy9?mW zMek#Ld5LWjeG9ho@Y@5K>B#hBJ`5ix(A$Ka^BIo;ldXc751Y*xJ}lLgMZ}zJb+O+S zn@dfvK043Q%b_Xkd*Oe>crD5=LVt$XebCefqjNR=LwY)VLP{yX_Q#3`ow3k1ny+tQ zJ`DXmXycGyhmEF;AA&ys97ZppC)*XscE;cJ*ij3b&sV6+0mk#7olZ^<q0<T*^`YGe z?R;#jJ&E3OWRvY`;(m@88k)V!&7K$eQTS227TR{kH&WLw$ZjzDTVRICCnQ;C*gl7T znqAwwh~ZgmZRHxAME@`1`WC$<%p=HMfc{0ygNy@=XP`ISYSRvx&*5!Hr$6Is$!jP1 zM~Jzrt(BzTdKO1F<keatyT)i)jIW~?6Z=Z^z5^?_tC-ZL*Q4*lcOT-N3Qn^e-iPkP z|9-2{jre#4T7A1Nuu={|yN=lYr1xO_x8-mz<38Al;&%$XZ>hmH^c=-cd`;o+!@y5W ztJyW`Pc6<vzccd^__rXt1DP=6m!TbIJQUiQjGHok4ZD9^EFT(TF6A-!%Pi&{_&RLk zZP@wSa=XfE@dz}v+wt8M+7e_N6Dws)SpfF7T1w`3d=AEE2V|3NsOje+w*%Y#!3Nm5 z%k<u`dU&y=_BQsX5uaLj#%Ew_5c3UY^9g*Yod#YFZ94XQFn-(g?;_7P8TYV!^Qgx^ z#B`ncnGA0Nyav$j#eNm|CoI?Nu+^0qr(o|!_#?6ZhsC)V*-uTbA2K(Yzr7aE6lm*- zbDqVi7+*2ogV<e%&&Q#~=<l1I&d3&9edge2yV0v-`yb-{9^RjphwLr4@g~DRi19{z z)<Aa>y*GMSqqmyg5czBI@3;8Vh+plP`N%=93m35gI@9R4Tdb1li{B@pRiWPr{bG6) z`lrm*p2Yw4*zId`(Q0D94Yk}y9sVJ&Gr-#P2kA4B>qh^BehqS8B3HRxOdQt|PaEux z)55CMZeqTW`Dw&mOukK!8>Cz;-hAe2L3owhNBAm3W(;voHJL@wo@9Iy+68u<o&!D9 zYd1N^twxg>cR*Gx0`|doFY;(d-0jevf_$=V$H!`H-j3WMaJR*^7um_!UW=`ZEVde^ zbUC&Lnf<dEABF!0*aV&Kj9)@;qw(i5j$n5ex^Lop0QCO!Z=uacN39z3kC^wi_<N!A z7BPQ<{1wFdFZ8|%(UhI=Qf&=1r`|Ks8%~YOu~7qiJHR}%E0ww?`z^NKLH-8%XyU9% z{|(x|*n5W@)jrf5d&zbaymacZ7n^D;;Qc@^Kz=IvmqA~IP9tci<L5KzKSP_vd=&T~ zaleI)rTA1k4Z0V5Yte0v>?G#Dn(fDs%Ouy@(7wcGxy2;Co1m%vhTeVnc?=tm8~+0I z&qa4}WqD*ShhC2SSoC&cFWFvWT!VUDhmGdu+aM{DaxVV5aUDlvH%bos%yzDHOllK8 zrZK;QKFijJSWV4Xf79`qd=c`$VsD$pvY6P^2AbSP%P~M~^|5&=yl$=pdm%Kn!`SF< zYxgtsn_}+)uJt|OC+M$%pKJ}0n}N)2*uMf|9yb5C-Ho2wN5oW<@!911E;_$+y&UF~ zuzef-R?F{Jcq8%i1#%<M83Mk^d<8bvfiI)?9kg4Je+<7zp|>!<ONr+vc(vdi!}jUe z-HOa7%s*s&1N^1%C)!%c#@9h;XTn>DOa}C0V6qKIw=s2D2EQ75)94N{{B8Ap1YQR7 z53zBQ{ytsp7sG$S;n;iynUB$J!gwN>MZ9CFV`J!JvAu^rhHH8W@|zhK6Z=r)l5H>J zhv1i5+{2kqvFq>?@!n6*#^zFbIx$}c_N7l_yb>dA(fbkG)fv}@Hk<Jwa!<DV@Oc%n zJOtqYdLHC&$7U9B+*c`%FOfM&?rp)==zl92>|JVcO+a=QwiZECtA>6z?EP*wE+&Vm z)a)8)SAh@GKgEVxZER%Gms?&RqLYJ<*4Vqx>K#J%J!Ef2t_QTG*jvMRtnn8idyM&w z*jMWUwx=IM?pbtwij~;aJ|(t?tp>wQ{wL&;t(4f_M(0fkv(Wn$AM?;{QK@cCh;bPF zx$wuLdo6WMwmCMq3cWvwD~`RP=3A^sDvfV3zoW2sBk{Mlnn-RBael%41b!>9^#OCW zvCN;KzkvKsY;Cl-mNEaHe7ZyPB6lmc&xLk`c?EVJ1oxT0ZD3vIqs->p=-rNw#g+VD z3$GP+Zo|gC$X<$0f8z9z^MzJ7#j~8bT5W339vgpg9q(lPBe|<Z(CLBQE3o$}dY2>r z1Nea1$V4aEjv~7e{s?^S!0#mH8<6`A-E$aMAb1%1EasO$4?;^L|C_LJE<S#N-iLah zYQ#_vTW`?ShFh%$Tg;-RVxuYahl%@f%Rfl`3+MyjZIuu$AHSU|#VXok|1%fuJNnz$ z+J(H@-Hh`p)ipuoz9oj2ZE_cWe#hSj%vV*Cy@-6uD#e=Aec$qU(|k-t?kvWeu%R{s zdukKx8eCGTCgc9c-r4XLQlA6#AF#Uyy_o6C#t3XYMel@<4e<A{76#DOiY$(q@SjCz z2)U~5W84NmtB~u2-Cwv?hpE+JXcs{H9=$2xmFSIvK9;zPus@1eP9X1xzXV(N!heN& ze8spxzAM#cA^KymcP;*|sdOFEvGqQBPoYz4^ruZP3hyUq9njs1y@~izyWZk{gShK6 zE{3mmCF9E&pRSrQ-i6(o3@^62H(-7rHkZ)V>Jfi#rCQ%CJ=z-luS7o;y{qt>Y%h>= z2zeiIY=T~7aXta|#P4dGC*{Z4{4;Wp={5Mj4x5?S8IAlM;M>><Kvx@$-NDpeZ9O`V zz<(8d9$E?G8!&PvHoqmdI%c~g_AWwy3Ua5@E4QDJI|F_k`di5VY;}@Mrse%9HXk8| zzo30rDObsKv3h8HCN)d1#II{{eg!YN{Ni?fBtH<}YS-d-JbtU7{|7l-h29p6^Bt4_ z1^x#ZX^hN%<d=h&;%guBY6bK=na{R((%_$Iyhg~EF`t30=NVr{--fNr@qd==FwTb- zLVpf2ov^jp?1U@T>jW_zLuRGfoo_OiK+A@AF?biT|G{{pU9T<{|3U08#+Ta2WHA{3 z0(}NP9yYm0(Z2@Thu~SzT4D1K{9K7_2WTbOz6pe!(!uO8O!<<Yh0jA=%c<~x#m0@s z|CV{OJqA64egd1<bA7AJP^IRB_6|PM$Z@^p*~|F3U<t9`3LYW0{`l)n4eO%Q8rr4U zRhxnSXyQ22Y(Ig_o7j3Dp9_$=!{iduJU58*b#xA5^K<$L^u7bP(nAQX!q&s|8t6Ta zY)$N)!+bq?<<NIpeqEuB!_T?szh^$CpzldK0)6mKAd^eYClmMeRwEBKud;lT;<b?Z zfE*V?pFr%FGX5DKTPn%@08K5^{QZsn74-eYzF+k**~4H5=G%z11-ZUM9b?$sX#9Wi zul5-DMq-%q8Zsxb)rvU30^fpOf_^dhB)EiFiimM1I)9PJL}GZ!;;4Z3EjpE31@i{@ zJBHnP_->3$KWx`v{xyO**h{uK#CQ)j>yXDI$W?BQkh>Va5$NgkcGy_OygKx%=!MWp zr+;R#G{@&jc<agk7W{THduJ2R`N(C%Zw6jW92a4$HGbRD=h27YxB&hrtMd=&t962> zwwgYWT0Dn-vh_2+nzw{LmDpzBe;cu#BR|->iTU~17=Z5OU=A_;2(1;mOX0UgcM<cB z@E^B$Pe<-;cwZCG)$qSJKaUdAZe;$&kJ=n$9-^<r*PYDUlV^M8YAX#ju5R)-6W8n5 zm`Lt_<1dciCoRu1cqh?0#{4yW+=1RX_&o=k*E0W(SYEgI{GwZ3s$=JxO1_pczX#n~ z$X9OT(JjW-Vr0Ljk2YJMnVqEU*%nU=<=h}E?xdtOa6<fb^7G4<M!-m}6HiIY_C>rt zU&xaYh?Sh0Mg4(@k68fu>_7p3^8HS!JBx@EiI<j!!HPw`NH~;|mgDpDCqEbnMZwW= zrzlW_T#k%*J(<pE#~&<TQ{o`ybqbuYqS2t(MMdS!ix)Vd0E37_aNhC_CGaslsw5oB zcOs5I5EUcW@%l<#2t-o5dY#nX@zeq26~a@l6ZGXep03fL6Y>&BZX}TF3&jXDH||7p zoM3>NPmFlf33<G}pr=<j5|idBLjO2U{7#TRaVN*`6qYR^h(L~?&;q$mY9KY}!=YwD zALR>>b8gTn<o|0D&*yJ}FBk}DAkB~yA%H-{Rf#IhK(Pp=`4K0cAM`~%p>UC-aPypq zDxBvH7ga1NpNeKmT7Dp=za+$83gB>!@{7qaJIqxHdeVxcPQ@~f(w$>lS4BJyGzJB# z6~s6i1?6iJ<BDaW^062SdOA6gVup4}G%qQsSmRpk6wh-?D7VBq`<+PkDWNW0H%cG$ zbP4D9%GMPSSde1pQ*0-4N~)Wa?F8L0^8LrQ&Pc>@if9(4+06-6tigKavAaUVDjwyM z<D)E+ZsluA6EStC2-G&{>F#%mBOYquc>SJCzmxATUt`kUPwDk^urONUJsrPsdpeQ4 z1SK-s$xe(YS#kNAm^%rCO3KIDsAA2iQ<?RQBjrTQUSB6j$^KKFzD~uW@<a*ymXGEB zNrXGd;X1p;92AdMEGt_g!-LAlddt_SNZlL;UeS(iT^aW}CEkSa$M?-mBRF>gxV3h2 z!w$<N=;XzHK^5Pj_CR*xPmWJ3nHftY$X%_4!}4OKd);*v%=Kwa1U&tn?11jqU?4jj zVIc>(FT^Quv;zbSe37!X(k=8wQ>j%T#)6h#&Aq<VE>1k=OYIX07x_Xt@)&bG1AP&v z(9z<Eg*|<^Lfmk&WwVf*cEy@}*8hLjdx2Bn23w$;EG4bLiI(8Dz$p!flqYcna=1<V zI|X6ULr%<-!Ga9?Si%M2pcB*DDu}zu0o;rsPv?LW%4I;!V21FZ{VJ5>L`gW5gJr<$ z1mihwjttpkJe0`OE07aL=|8(i$jgH9^og+HxXRu@p0>J>H_Q_71eJ79mqF#t^A!;* zV_zr`U{j&0Azw^4Z7A0>z#n#FV!KsL>^1!L$GH%GpUVi~mqNPR9H8KVsFST_7>fEl z>0ve-ZPuD(#WYKd`-Mx`^AckxKE~6>-GD<e)}~Al0sk)&C}P72#RB2cacwY+M#rTT z3y*Sgov0Q{C>9A6B<kQRj)jYfA=}3l48@|XWLeR;*cT~O^+ToMvL!KJZk#;B1@0mW z$D>i6B%X#@T^gmN6*@WkQ{v#b&?%paw?Z^ashB6tm5lhqUYR;Y?ivdDBB!Wv6(r*6 z=Zxmj!N}nraaWZKWt-6CIpJ`_vWu$n5xfN0NpTqQQn@wk;0*k_20Y*}PSqpcXd*{; zefA8}6s>G!j$ht<l&4UpeD1?7lIz<uk6CUBL2HGiv+kK=GFOXRtJ71W)y__x6IK<e zq5D@WShKQ~xzb>VjA}(k3V1HE1R^0t=_<sy2SWkZZj8r^gknW{ZbbBmjKsAPBJrpn zh<f_Ri=7fgqB*`$G@!*8%?Wcu_X$A2WYo`+atg}FCZDwlLS(dUVeYhiY$V{;6r-#J zw4zSxP$yScF165!!~#x`D+pD-0iFsh5#2^nS3IUWPEjNVO}Rw^p&Tmb4f9Ba9%trW zp{SlQDQPh$$KAkUJjHD3#ezImW886Y6GJcdV=<?YMGi!`+%Z)ko{hygCkrkB1KHP2 z6pw@zP&^uo@Komx&TtBOQU*N(SVMtWIKuUT8IPD=EF5B;#-pBozFZ3D34}a7<Ix~X zzGr|vAmoHS4b%Gd>`CJBB3~po<V)@6FWU^b+g?gqkuRXfco7SjRi;6Sd+;e{FG)!& zadP50e#j-9TgbS?SHc6<@e)O;XK4A@;(+^LD-8rCU8=<RBkukco}v3!IBfUjV@q`1 zjdJP<QnoJS$@GoVMx)_?vQ^~4dJVDk%NON1*?Z@CxrpV9*vS%5u}Byx-yq=1jY5?H zg{@eW%SA=8VwtC6sl$^k$jz1RI6N-$Q@i*g99)=UG9Sn(9~TF_PF}dw#e9F%uL}yz z7fKye_Ch2U^A+%<$rUNC%`hErF*fsbhlh<HR}47$xk|Y_Ujib8`Qv9JN_PT2PY<V5 zo1Z)G?*urXdDsC($aA==!N90+B;*SJ*PMGHl8{M0deWVIUvl?`lOGN%mwd{Q?gSkk zlrHR@r}%@4Bgk#(f=Un!bHbxoE~O}*Jd?pFP0&hxk*MU#R_Sl~hI}6zBf|o9ya_l7 z#sjJ8><_F?SqeFh*Og+8MY0p5TxwX#sYhb$pFmz*k%prA;p`F?bRZ|c>_rc!hCESY zY?1&6W&UzzaQA>wOyr!Cg?1VZLTvb8HfIQ7ZahJk1MNzwgQ#s{qKB)9L@CT?;BIf3 zT(c0{hloKRH({##Xme5rVBJ;aktSv+8syQyAg0Bh?nJp)Sh@^|BipBwwkEz{Y7g$( zD2M1#(i5S7%<;Noe?D7qSOss&JsB;GX9olBHHvbNxVAW0=kSP^V$_$~Jsjg4pAJDA zxr^E@8Tc#h=vh3>JpIF*9HMThv3$3BF}+A2>XwA3g_bq<kaCK1ggSL1N#~ZNd%~kU zeS+L!?#v0Lmdy#~25h2dd04eC$&N>qN{KHRRg@*Zh@6zN=QHJL?HT9<gKX02J}+z7 z3kLF3>;7`=%aaffLoE-mHwP6KJ?FXrMtOfIb!Wjin+?;Lc31`>Pg;a+Oe3E+kT21Y zk8_x6!>D3OxJZNC{CJQg8MyRZ_q?cSTxH?m!Oo{QCWagY(tY7vJz�#JNO0SDE+} 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 B4VeG{ literal 165253 zcmXWkcl^)w`p0pFhS5SOi84x(qD4Z91}dSFLQ*7^($YXu(T=vFkiuyxN`;0bRFukU zSgBOfRLOZfyq~{+?zihTuIqZe-tW)n`^7ou_vId?9w@>8?X+u&64kKlwIxdIU9m)o z(Hk9QyybQ!O5x5}8h61Ru_Eq()v!G79}h*>H;=7wC*qS5cR=@_nelEJ@15~}xHI!t zWqc6sLVOFFXC%6RG}_Pjj895D72W?Dy6+vd&&9~GN-RZ=TH>e7|A($Ge_XM?GVVrP zC-IT!d0JyxJO!<LCVK936Zge(#QhWBg!X$2mc+ZzKJLr>!|@3;|9IR3pGEt716{uW z&HD*j_v^S0?Q;WqA6w9Kls>+2SM<D9(Y_nRCTRZFSOz<1ya#%oerVs<XZ#kl&b?^9 zC$R!f%lrrEJ%5Jwu@>#)$M`3jZ@X68mDmf*p!2okA@OK*|M7`WLC@VO@%d<-OVB>A zN6#@FJ;x*HIme^<U�jwBI@CzNKj1Z_#?c#edO0OPx^MdwKM^R7A(CqW8Zay6*tA zUc-zZgZ6P;=G&pquT$)b=IM#{aS7W0K&*@-5<i9Z_Y%5pR^o-|b6AGf{{hYaYy2Bs zzg_F1&aUWvRYAw=X8dq;-?8X<PRRHv8SjYZKPPd|crkju{<t^ZfaZS~T|W`+?|JlI zW~1vDp!GgSpUant*Q51+M%Vw2=Gm@Iv3}>c8#-PYy_bE__4VUX==oZq>pGz8x}fzg z%6NZt-*xDH4@>+wy6)M;Q_+5Bp?Tj!--AyxzBGP~=KB`+#9y%zmN~IFR}D089dv&~ zH1FYPpT{I_6;DC$s{{I;oQtlzF!816dwfmeJK`ub@8fYi`d&@W{OjoV%Dd=&e~#u| z8P}rqeoXua+V6j{<Vi(eJE8k3p!N1f*X@Vqt()<K(Q`MB$D;RmBKm%GM&Fx@GJZ9h z_ZIa2?nLuHh30)W@$+cCX=uN%qtEeOwB8DI-#RqkkLZ2=9!s2D#AVTSd&YgxytU$i z==;+Et<yB)t<dlBlhFO`(4Utbaogtt4<fz+J;yWXx|wL6IcQ%WqUZW7<15g0YtcL# z(D&-kjF&v6=&uaAZ&%zME1}Q1F1qhX^nQ;^d<L5LJhX1F#Qo5I2B7(FOgt2QPIscu z=TS8OvuK{z;%qeET(r-R(D!S3#(#=`pmqL>JGL$M?S|fW6}0|7XrBGi{trRxwm{$a z)6nN}LF|wAa}&CMSmHa-diSIIA4BU*&io7L`srxBH_>~Xhvr|7=3S4T?`L%VpXmK= zL7)Fl?TU5f(ESzAy0y{wumQUMC^X;k@nrP9I6d)2X#Pvl`UBAXL(qJ~&_3>t55_0Z zb3Kjjo1F1i<81Wj^!sSNm1rNoqIv&D^OkI1#AVSu718^ziQdm)SQU>&*Pn%+t9$1A zX8am7?;!N^a64LWLY#u0b86z(;%xLin~R?NGxYsihW4`_?c;Z}{&uGp?u_Q&J#iIu zU5&)`6E{ZhsYS+5K%Y-LbpM(0yv+AP&(RNEcXi^yiH9d18Aqe%nvi%h+ULvYJ-w0n zxfx%G)?JeE6>(MO*T;?My1&r=w<a!iS}|T0?QakCzN#gzhrW-E(fzH_{@P{!jKt^0 zp6K)LgRUQ#@geB_--e!NR2+?-YdpIC`HW9XJQJ-q2VFNmeun1z2Hp2l{2lH0U-bK9 zm(z>+n(+X%{vq*5^gfzn4Qz!z_g=9-`o7<Y-p@$%ejd;KWHjG&^f}K$^SzJuy)b@) z?q8aCHM;&g^nKlgzOUPLDE5^`=gXq|Dx&ACp848|4@!I(+V@dtKdmy~7VYPZjGu+( z?T+@>C-awOen8?I(7Hp=@5?*TKF6SaJQrU<^Sptse;a)+3(((RmZJ4GW_~mJd`g~C zSPAX7F1qg!^f@1c)@g&@cY8E{S9JY_=y@+i*AK)hI1KIQ33T0fwC^eCd-*!r&jNJa z5;X5}wEkMO?j|(<X7oKO-La@s1&#Md_aA|-I|i+HB6{Dap?Nx?>$+zCe02ZCXdgGC z^>0mlFPi5O^q!u~_*At2H{wFH?w9d<^ykwb=%0sn=v4Gu6U|p2JzrzAZp(Ob=FdR) zpM&<>H{<;?ejR$x!_jk%Li0S9cs#mqGFs=wjL$^-o`dH94DDwfy8oxde<t3F=HIDv zv2Is%U1hX>jf@|Ju4@#VWWHtMw&=byaNGT(eVm{9E79jP5M4J2U3YupyV3j)#V62n zO+fp930*$}-9J0y^U!sR;+N>>;0N?Q-u}$uecTO=_l*am??F>E-w9})_K7>kZW-^5 zKL5+(4e@sLo<^bh#>8jQyi?;FX#P29zYEdxF3b2g=zH`Xy06q(#d*u4c`Kmf`=I;k zpmh(9N1^9C9$j}jx~~iR9$b+50qE!RW;D-z==z7_lW`K7e`?~HXui4VITmGpY2r0; z1G?@vH2;5S{?ca``F4p_(LaCILZ533bY1IsD*F4+S!kYqXx{@855;YN-cI}!`uTkp z?eBH8|93L}A)5c|%zu~om&AXg`M2*<ytlif-y8d(c@9U<)dGDFPDbl=&iHxgIeMet zi<c(84ekFf^!*=|_>nj^;}g;SQ_%P0B{csm^tsMO`&)wE%Nq2&n`7B?iuY$9blp+t zzBcH(PU!D-7oq*!f}ZOR^gIuub)U-k^XSi^8R*aB57GNugYN$k-Txc9e=FL5*{-=i zwEz9k@p@?fhKZY@`;SNOwLO~utc>?S*I$zP>oPwy-ig+IAn}vvIVYj{-avoveGk3& zuhI8qExK<D`aQApxy5`9^uB7N`x>GBw?q5v6uW1<FM1DGqURfk)*X!IACdV7GyXVw zzKLj^7tp*j(LD3eK0nU*lK6G}0nPsh+E<D5iv2sG^(&xxs-ksjpz9Az+$ixeX#LiS zJ0?C4{r<TG&3_yE{e2IbXDph368gD)5v{WjJ;!HgAK#$&{B7p9qV;y_R(ucbiLS4M z<~=kvMeCh_HLx>!kJq5jb!g@vK<hk>?w^9@n}*)sTj=NGy^JqM`(B5h>&N(e#<!s7 zDAm1~FOSBR(0$d>I<?U{hoE(uWWG6?w>8>t``9I3i0-=r?fb^WL(%+qqxBxh_!C%% z_*vZcK4g9gTIb8S4$b>h<~O7Hx9?GWZgxV~SBm?fb!wx}rvZAd)|o#o^Jk&w=z-?z zm-#Evey>OK+>E{lccAMhqV=Z6*U|j%p!*i0`9973GW7GkD)T>Q{tq<&zv%f&pI_wN z4SkQQpg+&*Wc&zp{jq4BHi_G#`_Dwb56?&Y?2q<!BU=A9bls>p2F)`mzKGU+6}P=t zXuaj=dDfuc7vH1%O7$%2ltuGaM(<_6#P!g1hbKM;eZSkpv(bM0qURil)*pfP`!ITr z31}ZLqJ7LrJUj6`bl*oAUzzcBaYN=eWxm7(#piElH2+>`y*lVQ8lmSn7X99Ajn+Lk z^F7g@mzSb_4MF#hK-WDKA4l_yL+eaN?_)Z;ekQtqKDzJI%r8UteS_Z1cj&s!ncu!w z(dW+Sct!Mi?SsCjhoRpu?Xf0yL-P$m`xuV)@c_DiH2NGSpnbfI-op%Z-yC%PLiFe3 zr-{Fhzr?@L=esrTeqr&s-XG0#09vOZ`d&6i>zsu4(J|xaX8a;_-xX+I1JQMZGd>*c z>%RCfx^7IIfPSw`M(e$R=9>}Ujvt`+yco^5Dt;F?#y`>f{15G;#zjTm1JQkr(EDkE zzK^G&dCx=d{Ze$@K(vn`aX7mEzQkkVM0DTt=(%1;_rHbS+xuuApJaRmdfwG&zV+z) z`v>~_P5Iu%^Qnoxe~r-hq(#P0M}ME|iRQlnt$!QZ??`mtW9V~!CeA?XEx>(n8QRBR zXun&~&r7L3MV`v&_`c}hOVmNv*F(>F2wL~>#4XY1*9Pt5^u%YQ=kJ;L67>GBM)Ti^ z+xkZHJr*Zsd@8#C^~CR@&uc;A6=+{;(D(K`H1A)T-<tUyFD}ks4qdkwy6-^rJPpu& zjbqbz9BzC6(LOq&{ho_Hw_fPI-GJ`D2fc>}(S2j%<cv>4`=6coW89Z`8QRC+X#Ns? zi+kS*jmx3+E291HgT5E_(R*u#p64X=`L{=(+c}x<hUV{!_SYYMAFfC94@djGFY)L& z9$h~r@ierLnP|Pa=(!ifPp~@ivc#LwbtNt--tW?AA63!1`zEf7_I)tAzDaD3=5K}e zcS`Jx?(c!->x1@r8M^+u#Dmd(N1*FRX8y6nPoeiW3B8YL8Gkq93()8F1^S%Vqka5? z_PIm9qHbBV|4L{-`=Rv?$b3Vzk0$88<I(jeqU$=L`_4tz^+eBeN#?Ic&vg^JZdkkn z?f*VB-{a`MNod}e6TgA(e-G_{VdlSxU&r-mzK!U*f6@17$4iU-WzqikK=W5d-@|<~ z-Vm*Sc;=gDyiLa2X1sI8&qM3<MEkom^H;?i(R#zsyd%(cqY^)c_Avpym;c478GjAk z{}%cj-$VQT487-X(fu3aUugakmlfkXqW8KhI$kaApYeL={v*-+%`<;0dT*T*cR~B_ zf%e%qaeuUr>(TH3ThKZWqj|@m_cIYa$4lt`>FD>so9OdefZN_vw9a}o?<O?gKj`}H zFE8@!j_%tNt+QXOhvqp9ecz8m*L6bgtp}R_ij3co_;$3<`x8Ho)}4s%e-8b8&B*-w z==#Oz{jSXT_h_Bp5|{2@oMTtCZWT1&ez5_XrwMxA6VUUtNAIh1=Ff>2qUY<6{u~{G z=6e+F_i41w|ImEXGd>%=_qmA|qIEt+zwcHg{s-Mx@`@r)IW*oAJ^#LF{e#i|n#JSL z{B2@8^nEx3-G32!&dbrd*Q4u)qR(kKx^8rwfZpqK@pbfk@1uD>Lh~$(tK#?Qx=rZ1 z%^5FsWwE{-TBl;-eb9Ba(RvLt-YlMw@pkCGE@=Lqi7!U`xDx$&dOdpo_h)=Gx_&(R z{!UIj1I_nV{2+dk`4wnitI_;Fq4)Ji#{Wg1`;G&OzAK=0YoO!x(C2kT;#Tpr*cEFq z-y1#m@c3XH7hgbs4|@~M_YwO1SEA?n5k1Gh=(^HZ73Zyt_EA07%lHxK^KOQo>$J?D zmH7)2_s#q@Xx%}H?@IgtdavW+B=mk>OgtUUKNIcmy~H1(_xd?{U#rm1>jre)7BtTe zR~K=)SSeOV_tiz~AByHXD)Yyq``ae&fPPNSLGPnGdT*D+>(Tln(E5*Md_3C!)c87D z?;Z4ceSqfs9KD~_ng1pJh4!%(U03>=qVL_&I(wt}YN7oc6q}&?PD0OlD%!`{iF=^? z`=aL_fd08~Q07Nv{0X$rXVLo8GXFNZe*s!&3EIbUw9YE@=g#->Cv^WNbp3y^)V0OF zGHCz1C$16e;`WR;NPH;z9F9WsG(+Fl;}ds6zpu_g-_Og?es0EX&j)?)A4B_}jQ0I9 zn&)-&ybIBLS(f>=xb6Ky_iaJXx5ITs{xWEuJrY+%pJ&a)hoJo)iJr3=df#o)=hGwh zMeAOL_A?kg@BQ&1G|y<X-c#{e^qeomSJ6Ia$9d@b#b~~z=skUj*58EQ*S~1ryACYw zX&-d{U^M@c=(^@;z782b8@<;aXn*}Pe@*6Z%J{A5x$Z>sJb~W#i)g-?Xq`EU7oz9* z6wSL5{d=X=8Q+55=ML8w`zxV+R71~EA3bLi^uF6?z9)JQSEBcQE&6^AO?(ep?@{#p zW6{1Qq4{4z`+6H)Hy`bP5xV}1%&&?+#NRT%1?_Lg8wx9-`}ard)I;y*F!a4U0j<*+ z?XxR-uHG5H0qy5zG|wGqp8L`Jc@*9MY{s8Q*H1_Lm>oYv*R4SBXBB#$Z_#|ep!c{L z?QfSGi$6!#MAsdO-e=3$7Jc4lqV@Wqd9FbF9GLMT=($E@{6Tcx<B2Dr`=_Ay|4PQ^ z#06;mPtfzO%=iX$->+!Ce-oFwsaRhg9j}b`y)Sy-_0aP*Mf-1`@$P8f{n35bqR(M) z=0|0ILguHS{k)9!{Z8gTiObObzKP$X_x~&Ux!8=JYllI_{@u{}HPGi%H*tNmpGN5V zrio8T+%BGp*6V@$<HhK{yEFbEx_=CM?q|`zCwU$1XA!#o%eW5h<0rJQU(x)3CoVa- z$X6y-ME6&Zbz+0eAAz2~1)8UI=1<M|nep6=_l$irekJ-GuS<Ljnr8(1d)-L1-$@yN z9(_KqqW#ZB`};6{hMxONw67mB{tNm%H>2<E&O?fGRzmCToA>~<pTp3+%`$!hTJO}v zon!ZmUyQzg{n7llWc=R54<#Ol=AD%ICA81i(7LlS{sFpfQR1a&-mlU18_>QtW&R)Z z+}qz=jPHu}Qw9C}AC&PH==*X~;xo{5bxqt8t$PVtXF%o$qV<O)zAKJG*FA>jeG=V2 zIrCE!&p`WqJMsMZ30i-7;#FwA@6qSH5q<t!(dSocXpyHPx^5rz^S?iur*X!cqJ6Z? z{7JD3`scU4=zZUU_I(d}Uyq>srl9#>M)S@<KYwqb`_^WDBf9<%^n2w$wBJ2$Df+F9 zo}(`M?~+HLKMzkw^Y%sST#@)%G~b}aw`KnB#G^9*7~1zZ^tt>Gz2Dc+{@%{~!o;7W zbylJI*Q4t<qWx{o{7%D)co*Duzv$1K{n3ASKNQ{H9=-R@nZGDrh4wWReIM^a*FB2X zn~eUu-OK3r)dKV$zC`bTZQ{SseOu9eyWLt?6}{j6(0z4d1GKNh(e=#|w?^-$J$jxl zXn)-kUmPz-&v`YP=N2^2o#_4t(EU%M_d7B3FQNHfPdo=b_lM}Z<#Ao+e?j~H8{N0v zZN)juqIIgp1JM1AWAlukjP}(z<K57{FV6V2X#F9H??%t_5SnicT6Yp!@8yioj`Pv{ zpP_wzm3SSx?`L%1=ES9MFUEI8_f<{2A6mCQdT))<-@lun>yC|WGJhIcuQOWb+{|B; z`ODF|SEJ{+Iq_YIA3^Jlk5l5y@eTC7c^Ca2nTOunQZ(PUX#GuSznkM$bYJP=MgB5q z|9hbO_D1`ygYIvb_((KQOZ4;A25Vzyw9gyR^|vIxBk@Rd-=lGCd^%1+>%D~LeFN=h zKAP`SH2?CrI^#c}c{e5gEAdwJeJMSnnBN1<S0!;xG;iI+4Km*tt=|lNu5Hn}r=j<I z7JA;^=;!)wH1Ct>x=HB0zJ%tV9%rKK=EM)tb)TboSD^bhWd66rThKhE?<mew4n1$x z#QUQA>ZAD@qw9}GzmHlZJ`25%Zs__;(0&G>_kLr>Z$tOrgZ?~uF!Rr6{55pn?8NiX zx*x|SaT!|gE8KRj#J{2aZ+B<${jeiiuL_!H-&hOn>p=8=8licPM?Wv8pnaSfyQAy- zp!u$h12aA(-hsZ~51`L?Ec(31qo13p@h!B^kI=kJ5`PufqIG^i--AtPU#0IV#&<{i zt%ByQf!;@h%s0*aacKUN6L&<<)fGK=FSL)V&^*^?emI){e)QfRMf(|pu75i56!g4P z6VJ^29JKCywB8c5zc10cKcM^mLD%hYcd>3av~E@O=U7d2{b6YR<IsI4q4&`dUEdw8 z(>wN$1JQj$(K;j0=P@ddL(lyZx^6c5d*9r|E70FhR-^s@iPkA~Pm!-Y+DBz{|NgNa zn)gt&|K@1@Q_=lrqwCK{KSzDgdmV!IcN==|52EWHL-#+0o_7k`*UM=B_tAA<Wd5u8 zZTva@8MmT+?|5&Kw*p#kpST~|XI(UJL-hPdqJ6eP`#3pvh+WWq=cB);^hNjIh(5Pl zGJg-c|KY@A(epf;_)WCld+7d8(EZEMeQVMC_%ZRH=(??F{T=Qr*6oVMmC?RyWV}vn zfbKg2J%6)|AD8iy(YmLj^}1&K!q^Y(XF$9Gx1AHMdry2At^XvNXJUL2ecrEU{sVO1 z$7r6VaZUUg?elMR-B$E_bf^1^bJRq~4@i6{+TT&JMaEA=@B38rbJjBsK-Uk8ccJg` z192Rh|3&nBX+~U#p6hG$oZqACHlp{t8GYYMj4bw*L)Yz#&eulw*GKCgfu8f&#K)uS zPC@f@K;N(P(Ecw+-<Kh1-Mi8J525)UPdow5GdbfgWqd}Q9p6L$9K8VDzZ%{51NvMx zp>?*Pb#@q4tSg7EtBB6;o$*?@?R<%kK-V3c_=LpmVn_7+=VZQn;@*k-q4$3kTK{(R z?=SAo{CG6~6ts`2==a(i=yP9$KG(JAx?j<Cf1~Fs`9N{cyP)sqUg*!W1JU&dqkk@I zjP`kI#yciH2R(0hw9duo^SKu7dl>rM9?tl)==y2sea}YMy^r>@Jn=eo-)6MmG7lE( zE8w>KM&FNGi5q7AXteK^89y=Or=$7LM!!cdK-Ue3*Q5R4jIO&Et@9Xq?(rFa7JVOI zM)$vmo?{_;Z%fegFU|NmG|x}*Pu%wTc&MmT4&7fFt+OxMUoCW9<JbaS*A~s+G2=aA zKeYer(Ee}B`2A?UC(!5n9Qq!;iT3pldd~~uO7#8uDf6WsF4mVv*H?(u(0*#;w)Z6C zjT1M^e5=H5(es^w);|mF^E~u@=!53F5<SQDiHD>2a36Z_kE8XTN7qe5^S+DjpNHmO zgy#PoUB4>h-zEMz{(<h>g1(2PA1U@%LC;$q-Cq}7*8t6XMB<j2KM7rbT0A@B=c9T1 zB)$RdduZbO(0vc1=Xf&XPbdCg;+N2Ky@uAGmGKYIz80bPxHR$V_(S{^ea`=&^~yb3 zycd;XZS=i599?%Dy6z10{9V!arzhIS6&b%a4$Ang@lJIA{h5C(@l)vYoQ&3+j`sg9 zdM^vmeap~wtI>5oXa3(<=CR^^sDjSdL%;8iMEg4h?fY~z&sk{R3($J~(0jZJT{jrL z|J%_0ccS-sKl-^Ijh=sO=ATFRzk=?cjpm&jKSJ|;p7|AtS0`SN?*AF>?{Bof9Yz;< zc18QBjP|il;<|VM@xkctlbzA}m!hAKtI$4g%lL!wakSp}#LuJsPKz@${vKL)A==L; zX#ExF_sF`8|AE%qn(^HqFW&Q-=(!uCeH@MMKM}3p0qyr(w9W;YzZiY~1LDo-z1)lL z8yzR2eY}MB_cr?6=c9jb_!XLeGx~GA#1qB3%4ohCiR;J1<FV*_)CTRhBbw*D%=be3 zy%e|gnfaSDK0NU~i62D!8;$0hfbM%9y|*{fd>^6DVF|i^C3@a<ng0d-KK?V~<;N6# zRzdUDM(^VgG+%SH?-S7Xqb-{Mf{b5+uD=qkGc?|f)_(;3{6B@}pPKnM(f;3$pP|or z4Z80;bp0kY@4x7M?>M%YuYf+MYG^+V(e+26eIJK@Po9|g9CUvV^ttpy-=~3S{^5y7 zWqw@7UqH|OI(p7eGQJwU_n*)@C7vwuRfzkcc@IVR9h0~%dhRpPd+CLq_iD7xpv*sn z{(e3I{d?e<XrAS0-#?&r|3=SU{;6WTGWvY$p!3JXQ_+6TNAvVU>)se|Mc3bh-s@B7 zeNBsRqwm3oaS2*?1$v%!8UHQ*gFct-#}#$Tp!q7G>-UWZ$EKM-39Zu!{hsWK*6EJ+ ze=(Z(D)c$uh~^uL_I+QRfUbKD-TxMvcRsprapu23_kWGP7e8hEAM}1ojxX|*L)TSA z$M-|~IS9>r1bVN{GT#oZ+ZpYnJG#C%y8g<H4@`VB`do*jeLRf59}^N!Lq8wypn2a< zycj*t=jeT{%=kBP9a{f~_$%7~KWM#D6N>o?XkU9L-VZ%bJv48Vj2|0Yqy4l`d<MGy z9JHUlXrKMjde@`tZ$aOK;b^@FGCmsZ^T~`qi|%^?&G%ZImGL=f{~w}xR^qnr4|M%^ z@n^LE-_doO(Yz&|F5DUYeC>hmKP2Og(frLa-WJV!I(p7C(dTqg#s{GN4@95y&GD{` zKaAeTSoCu?3GL%eH1B(8z6I$0EJf?DMf3iK=KVMGJ5DV6t$?1d3i`fOL-QRR8^xp1 z^EZ#J(faLh+k1-E=^lG${_@1v#UbeDV0h*qN<236&!K%zL;H9u@m#dd;*76|tI+eV zNALePbpPg9>Y1XiUD19kqj_qe=dFj<X&PIidD@`oX`AtmXy08D_eS$wimtl`z5hXp z??n3;h2|TB))|jJ|4C^58E8NA(e+E>*J%D9aNG0C_`ez7@!4YiZs>E_8?C<|TIUdS z-{F~WhURaT_*C@gPiJ&pZ?vz=6AzBJqy68D=6?X~>nXJE<cz<R@mcYG^tmiT&$kj? z|1H|bPnqA0)-OG&SYIBUuZs3l3;j9P7(G`zG|w66x-PL7TIX`Kzk%qwp&1{M@lhFn zJn{JWKlJl54L$E1w66~mFGlNs9#^9Mtw!tqimu;+)-OG|h<8EP?TL=pLGvGi_SZP$ zP0{_W61R<=&~u)LzJGnt=Wq?0_ZGDNsEj|6cyfFNea~j0^*_dK-w&Bzi`M-a&HHC8 zHKoYAJNo;;-srkR(f8(PH18>B{jTV_E{uIMemUCzz&H#&$GvF1Co(=6?Qa@-&$BW< zCw?54qwCh8=l>b)Yir!`e?`12nx``Q--Fr*?V~ALw>A3n{tUFAi!y!{n(t<G|A=^R z<{!-bIJA$+=zH@rdLQp({8RLvS7!XX_;)P(T=D#?p+7(NNB^Fz1=?RHG~fAX-&e+) z(DMvO?|mYA?=PZ#Pea$wMBlG@XugkeTR$29F5?@~eOoeK`uQSXIW*7i=sByQd1|A7 zjyVi{FHS=H=!V``A2i=(X#Hz4e-rxN+>ZYIdK7(r|3lCDCc5uKG~Z`vzh9&0+kp1* zOUD03e{SvYLQ%I2x_>t`UlsJZ9+>$f(f!TPeXTQoGTP^9Xq_|BbzL*w3%!R+;x*{= zzB%*vp>-dQW6}N3p!fA+#%H4U^IqZwXn&ug=UkQeCv@MxiFbanxR1){{+j6ey6F4T z2(5o&JPp0qv(P?zqy6_s_uqily%|0Cz3Bdj(Dh@`b<bq{IrMo<L+j2)*Dc8S5_JDp z8UGf|yD{;fXuc9J75BCSnx_)lS4}j3eYCG5(0r}X_oOYFuUot@^Zn5MSH;2Tz1@Mn zXAh%!CZYLX!fk&Ko$*EJJuOA+eusVz|3p7u6{i;e{nEqGJRQ+<cSY;;Lcc$*K;MU3 z(f95F^t?}_{Y^pppN^hqCR%q9n&+F$|AfAOzoY&9jpp6y<>K$VE2DiJhURI4o~Ip} z?|iiG6==O{(f$UZ_c0R9Hvzqmm(lez(e>}f`RKmInO}$7K7WaSLGR&DwEq&X6z49F zj#o$ftef#e(0gcs);R^;*8yGM4b9&h-PaH8@2boXLi@fw^ABZyOyXzJd@p8vCR*qH z_z{}-Gc?baiGNJ|J6f;QwBkN?LDyGA^Hf8h>;7n;jWd2Ux~@gy6XU7qy>>>wAG@OG zzXE-(H=_0KK+pdGn*RxO-}8xILG!<duKO^4p7F2Ie%7P=enk8I70v%QTCddfBF`S^ z`S(Ki9T*#Az7g7IQ#4;|^j_Pd`OZea_j{u6+d%YlJR<Rf==!J8zlWF_=VyF1x_%@2 z-u{c$+x^wzo~ohm^<ik96VUY?;(6%$i{n*saJ&P(#|P1KPmHf*{vGsre2AW74VwR- z#5=xL)U6&5Li;=l{r9GJ=;x?6x^E!b=dI}Prz0~y1-<82(dRceeuS?79R2yT2K}6^ zNALIF%<nLxI7bC^e=YPp^%FNipYw5vPs;r18SjQZzYF6f8NUL3kFLx3&1l`*(K`1h zel+oTw9XW?@2PP%`urE7bynhmxEeio`PYl})zJJ0qIDag=RGFzY3TDh8@D~zcon*D zF#5bkp!LV1_x?Y0-)m^z570h8LGNi<#@D0!enI>F5AAoCH;Q@{(S7@(b?TsXk3rAT zI(9<)y8wM}E<^jc6|H}N<{v}rJ&op>8s9|M%|*}uG1~u{#J{8ez3`pi%zfdu`$~LF zY>hsr(=vZn;vVQZ`k?hM&-jgKo?&P|ccbTj814TF^nIR$?t25xKM&2fD1H&YLho^1 z;y=)RTVk1+#pky&y1!mLG#-WKZ;sw?8?=7s#J$meuR+%hM(^o%wEsuYyyM~|blr>b zHS{^Xg?_&+z-{M1^L~-}Z_wwx0ev3Z&noil8LP)SXr2b>d({Z-w`Dv7t=|h>*AG3{ z73jSTiFc!YJ%*m+X>{KU==oknpUb?Ae}u049NqT~+W&_5d&d7m&$sjJ;`?VeG(HgB z-w@5)B(^}$(HgDa5q+Lr(S9#M-;3+e{ln1u_hkOjj88=KzKG_Tj^>$_@sBdT1np;K z;x)MK9EpEN^K3!um3*tnR~{X&6!%8&wI<qUL$t4EX#Eq>yr;#p(R}A8z64!&75d-b zy)p4<w9a^R{UkK+%ZX>9&u1Qbj%DaMzsdM78Q=cxBG1m~x?SU*Xy5ywKiBG`?@x0y z@9Ah?=cE5lbTL~07BtU2Xnzl)>qcjMJbK>A8Gjk=|BZ~l7e7Mxe}U%v63w$V^FL<% z4|M;QjPLkP@jmZ{)~ST<ua4%cjpjKh<BehybbU+o94Dini%yyEg1%op68A&%4aoRF z^!eV3-t$QG{>H_Z;#=stkI_0S(e>-m&-GvEJ@4{vvA+ho?vU67?c)S=-|1-IJ<y-? z7o*Q>7+U{fblpVso~FmQ(9hF+^u1b&*7*zlUMV@J=%+He?qGDjY2wysA05&2bVvK{ zhproh_B8^nI}&|w9!L9n4(;nrbp1l~xqOlFuhHkW5zX@_x~{}~MZL0EpRfwr?+NJs zv(fxL(C2eGy6<W<&k(eq5$O6+=(^Dve+vEmW(vCg1vKAlX#ek{eJ@4N`(5V$iDl*% z?@d*7e|2<!U9|2Iu?5=K$>=?Hial`KJ)(66q5a*1-p2#zdpR22_hiQZhvs`3turh0 z^U&Y#mSp@V^m+XiOTS;-!yah<y%N_%^BtJ+#u;yl{(gLX#?L|5ouB!BXkS;M=NJ-4 zqVLg!%uhxC_oZefUXJGZ7X3YC6WZs_^NM@i6YXzb^gik&u8*F#5n8tyn&+g<cSP%+ zgMLr-L7)53cn7+EWa1~{(`cRN(7G?j*W=rnpNH1{2<>Be=GVpz@mKVH_&agQ4~o2H z&~xsN_EjBy|LUOY>t(zV+D}t-eM_|O_GtaH(e=I1-}^7k{7`h?-MH<2N8iWM=>1Pd z_s>Q5e-c-q>(`?De?;%$*UbMNOU^IWl|#>85v^Yx&D#jw*F3gH-`{rV``rPpdp`P} z_Dy^XTK}%Z51{*=K+io6t@j-Iz4>b557BjBpmkTGdDdip1G@i@#M><>zAww7`KqJ) z4oG|my8q~mw?y}!h~CQ?=-<1XjrMUhy8lkJkCBNVM%Rx)?_~m-=f(I2`ku~3>n*`; z{U=_7-qVJR|BmMQ7u~nh!Xn?E==WhwbpCKOPfK+FiHT1~zt7G>`{<ML0cic}<Is%X zf!@#k86S<-9gm*tB{a{giQh>)53T<xns+(+{;o#**_iRoX#VX!EG&zzuY|7K2dz^l z^Ys%Sf#yF3U4MMyQ(^~n-`Sb(hW2?8TJH+<J-h*3cPE<f{`g27i{_t*_VYY?j#o22 zCoV+uEJ5#QIhyagxDn0sCz@v~x_+mRis!WpI=>gXZ$I?&dLY{OQRsVhJi7lxbp7e* zy0bIh8+{M@qj`p*-^X{N>z{~EqwmRciD#hSzi%gAioPe`p!qjte7lc}`a7ff_CU|E z7kaNXGF~qpmhmR&x>o4@oQ(E&7MiD9;)~Gda%skILeGCIy8ph6Ka}w?Xr4*vb9piG zO!S`SpnZLq_zU#h-z5GKz1Kg`^ZtXbFSn@Jzb9IEUvyt>blsuozT?pT+o0=CMf>f9 zK8Nn;x&dgP*Tuo{HuQe)M)N$5wQvHO?*sI?e2nJ(Hf}=u*@Au#?Yy{{uY>*^ITStr z;plmeMf*4r-PaDScQ*PwdZ6nrL-${Y*1s_hMb`~a{1CeSaWv0F^j@Av&p8|IcP{!| z7H9k`bl*C(zl~_#&FK0aKPl?&fxZV-&~*o(_jzdI6VP+CPuvCVyJx%z{e8GEdVe>e zeLaAlYc#t4DK!7nnSVa<H1xh^q33%y^9#^EK0!ZM-)4R@ns>WTi}UP=KG#aI7MiCK z+DFsG$D#LeGJ1a<(Z5&eh4wWJ{keK~;&Eu6DQKRT6Tgn$$2;gfeuU;-hUQs==Km4B z@Bh#|<(3pyMC(*T*B^?Wr%7yq)@zOCX_xpsv`#Oy{$=s{%-<I8M)N*^HSh^E|17kR zIdLKS+?T|)XurRs_gV6@qK`dd)mQ`Vqb{2FQ1l*-M1MXXhxUIKTCZEY2)Ff}`Rg-& za~y&GIq811{}(epBfg#S572x01g*OU&HFQ2?;o_UlAjlOc1Gv-K>Mza_ICi9=MZ#X z3-sJ4qIu8E{Q2nmE8{@)`3*_@AiDl>^z-*j;#bgmv*QOD{}g@Sze4+3gVx=c`K{=C zU*?PAy|0euZHV^U46WB5-G4Uv+<KwU^GftQL(xA++<|_6#-X3jSI~S5GQKqafd0O^ z1?{`)(jx!<==wv@yvM{=Xx+BxdAgwY-VJMDFZ9pLx1#@E_9U8j7TU)=^j^Qt__y&F z^nCxI`FB`WoU0;wPqolGjpEU0U(M0)p*D%Tp!airycDfJF!Q&>JJI)T6nf6b(f%f( z_1;4Be~j+`0_}TM#=lGa3)<IT=zaW`@si7n{AJMn72-Z<p1QFC`aO9#TJLD|9$KP# z+oFAT$ox5Iot|i(-ia?m_YFYz4T{4ue@DC*UH1UGe=M4RBD(K|j88-F<;~20fS%(M z^uAZ3`!{C%&x~)kqL{CU=B<maYlyz5N21>sZP0q>qVH)>^jue=bqAvRZ$rPY??u<W zfPPNiPW%~qZ|iYeKZ*ZD*KI}fR9IP94P93o-B%yIkH+Y8ZywvD`_9e$g&FUU?jMZy zdmGx<o#=U<K=X`8*G<j%47A>C^d8?wpZj9;ef<nwzY1OVUFLs5@8fqg|Mp)N^E;vI zcSG}4&Uj6<?*q}k4nx<qil?CG?GVq+cyBb%W$3xC%lJ*`d4{3;Mxp(T$@moX`{{M` zy;zX(uh4V+gnpj?K%YmcuZs7e3i^F|0DAsr=>C(?KDwg&F3kJ@wC>=<cV+$&w7-dH zy=mxqXQKBo2i^A}ns<5T*P{D2pzq~BnJ@cwv91z&u6@zG4dYR0-WF)zCuO`7TKC+{ zUy!(8;sI!$8xs#pd^h@>9?bYNXx<kSznS>G#Ea4I>*b06M9){^o8tMDNAI}`+JF7T z&Cv6oj=o3dp#Anh>-R>_H4v>o6z%sO^qw9{{4~1mxi}roGaG$B=A!!+$7SgKu0rc> zLf8F;)+xEFcn@|(pLeZz7;d}g#3!NspNag@u0#*?J#DzA$a^?iw<+4s@o2u2<5}qX z3u9k2|K*9VL-*g5@mn)~PsT@~^+#v?Y4lzuqj_ea``<y&IX~lz5-&sde~s?@9_@28 z`Z*}Ewz#KC=zMK-edEN(qR+Ek;`7k+^h59Q3bgJ`=(%r6d_VerJe+s}+V5oa`{!k} zk5@B4E6zdl&qqI(AEVE4HM;&+H1FSN-5u8zmPh-nfZj(f^c?l$5$JhapnZ3WJ<$C9 z(D&oUjNgu)XB67^QyHI()|rmxdmnx8S7!bf^d7gMeU$sQ=%Zq+j^;Z6{e9)ojJJ)Q zV|R4_#fh&#&wWGU;b@(aXrE7^=Xe1<$87YR^U-_wJmcS>{cb?_l~`Zo-36_;cibQC z^C0xz8>7#qX~tWi_kR+)?^LwjnHlei_R%Nv1JFD-#Gz>Z5ojMH(f*%Ae~)}I@jUe0 zOVM@f690xihwZ*A>hFQ(-z(Nc*B^k^IU;fM*e>Jep!+UB&(k;K{WCrgJ>QVT!{fc^ z`5r>Q7oS3($4qqnLbSgn=)J5%*Kb1WZ9$()sqc$;7qosQbp76Fp1PSoBp#9RX6U_~ zfUfTl&qL3BF}nX+blqUI-d!1g2;DaZz3<71-$B=Xlz1uH?^-nP2J}7nJL6m94nGw6 z%A>!}Rz-i`YKWezHJZ0Ay1z4;_Z+m(^Alej`=j@DE&BY1qU-KVJPLh}A5Z*ZoPp+j zCw_pwSBo<L4f?(EJ=)h6G;hfbg=Nut6%toN`>hoZMEh!x`J>T#Ei->2nzvoX&p^-J zC0>Bu<E7~PaRd6^+?DasXg`zC`+Et^|2~@cqr^+lzE+_9euF;8@6meO|5)rRhvut* z_Puwk6Awl69}|y9^PU_}Mc<!}Xq_GzzZm@<zYN`fCHn6%1JOF8@E{z6o?||`?i)1E zdbF=!&~t6h_*Qh?PCpfSc17RQz0mPGXnzNz`wl~Yk2nf_&L^YwyP)^mEAiFn{vl}H z+Y{f5_VW;$Z*1bH(dYC$`h4C*^DjX2tca`8eBYyeZbIL$|1!S&&&7OIv`)=fFXN5S z^E5^4w?Ol>M*Hu8*6oSD?^mMF<F+^o?dM5!|1*i7L+ibQ?w^U)`7raJpzD{R^}a^$ zaRZwFKQwRIjYa=^pzHTS@3#i}{0~Cc9fIyZ0<C)@`W~K+u0ID|cVX;@z83=$k3jR^ zht_`x%|9N^_Y8W^FUHs6Tj;swq5D3}`0}_K{W<*uTCc<}MIU>jdG|r{)=As|&2uDr z|E<vb>4d)DJ<#>nqvsl$`MWdzD4O>v^zUycqvw7<euSR$v&1XnYV<w(9zFMF^!?j{ z_EUCK(MJ`ueyvy^&EGh2Q?%dX6Q7#+O!S_5X1q80d@e`#4~#=He>-}Pd(m}|Bp#P| zO5$m87J9Dt6Mu;I`8j$|UuFLLjBiBi{+02qvGlLSzOu0bx^8c@|NRozjSbNL4oB~+ zdE$2H`*<e0zYp5q<(a=a@!)tX`n>N%*FT=|@#y_eLeDcj&O*;M7hS(N<4Y5NgVtM* zuKOu&M)Q^Wt=PAFtb+EtFZ%s)XvSN`Q_%VyVi)v2&c_;f5&GP3kE77{eJpxE)6n~w zo%s*Ze9O@1yb8_t1KRh-_y@ZG-^4roUaT*NzOR+g_q7(f?|{rVK=&Pq-cQTSpP0CP z;!bGa=b-&ul=;ihey+~=^=O|%(K>f#{{GBAlz0qUcRc!i`5fBk+h`w);umP1uh8{t z(dY6r`uoejXuS%56!X>4=Tj#hh4y<gx~~KJoV%fQE=KRWKbn6Kx_&r%-uuw?kE8!i z{tVjBTj;vEXx|^9@8y?hKR=`E{zCKqht}We&!TQ6G=DYpJvsob(=>5wbpP4tx^8H_ zzUX~liS~ajx^7VBhoSlILi-qt)_*qfR5Z^U=smrg@z2oyzCzEj0j;|w?)+Er^QjX0 z=b_qYzb(*wr=a`KK<jpoeKLOq`txld+V6;r-<$D=(R|OK=bDP<nUVM%bl(SPosToV z676>ln*VpSpVFI){pHbk&&1Wy{B<+lAmc}%^_yq>WOQAJcy{KyC+>^(cLmzl^=KbM zGJik%oE|~fJ%O&9nD~Ea{%P?|^jz<v{Vqb+FGcr%mGSlHx{YxQ`Z*}`ckv$AMBm3l z5+57eqVGW$G~Weioqmb0iZ^BaHuU-56CaBc(R-ST=9?McNAoU@%hCL6(0(_d=iQv~ z68{wM(N5^T{n7K*NAn(*@ng_^C!lrP#xv2+?fK~b%h7$;q3^-a%#TFx<4H8n3+Vdk zadw=C=3kt6C7N#?dX9~m|0{9He~a<5=(-AM{(aE=wa|PA$D`0ce;$vXvm3guSG*Mc z{pT7q&z)%BBNIP`{<-1V#BZUW-}lk}mZ9}lW&B4p|JKa!w55o5L)TYD^VdY*+lJ`( zMoTnLNAz6X(D$GZy6>ut--w>$HuQV(uEbBH{ZB#P|EY;zjk7ZT9=d-%`hF}z^M8px z*L7%rzoGY1^1tG|RnUIxq2EJI(RH2CeZA0oxf1=oZW!9nQ|P&#MbGmxT6cEF7otCh zzCeE-Z$R&F`>n<PvgrOj(Ea<M{U3<-a|qghi;SO$=5L?)9CUvV^j<GP^Ix6uLFoDs znSUtrPsT}T-KmLZ;kM_G=39pT-n$09_y5rMrDTcix9!^-{hp|c&L4~3*YW7S)6xF> zqJ3T&Z_4;^^d9d+&;2l3_X)JGXEOhC#$QLzHwUfrA)0pun&(@zkDoIBYy2<nyj_vM zBHCAVbblSR{-J1|Bhfm?qW!c<e0t(8X#EQkUxB_aH=ys&9ccci(dYOanr9Z8e;)d| z{TQvY0qx^=w2u<oZ@=xHcR=T>qxI^d-$RF^>rX)Qo)){H^)A2~colk&52DZYsm#BO z)|rFupO5BSg5KZP=;vc?#{Wk9E?u%XSGiab9j}J=xqrs%CvKeiW@w#OXr1<GowGB4 z9(rHB(0=>H>(F~0hVC1M_B|%?1hoDOX#MFKpN(~h=c9EtW&TgJPKi>5JE3`ZL-+5E z=C6f*Zt9`ykBrUHb#2hk!D;BZdT0KM%nwA*F%->rPv##$`+XeEGah{p{)eught^vX zSEBjXqWgYE^Zk+ef6+cml`iIYN9U`c`KzPntBdA641JH9pzqO%89xhM-yN;fC-LRz z{_D`^a0}Y!NVKmpX#Ho=b<^ToXr2Y}6SVF!^u1b-*4u*iyTcB}_eD8$Umdj0!D!y2 z(f(T{Zi}uvGx2%o``ssAkM?^Pdd|^k{V8a_Gtm5V(LO#w`&f~9RpKAeeZORUYsPol zu~@$gI$sgZvmg5TI|$8x3|j9*^c<bgb96_)H+!RX2W5U3`t$N$G~YOM{}goHYjGBu zXAW9tA$lK6(e+=W`+r3D{gL^9(S0R%D(<B$x^8cDe=W4ngED>u`n;N>?`cQ$e3xTQ z9D?Q>hxRcU%`+X%I}?2lbJ0FNL-Vgd_kD}5{~7)H_($S$I~U^>;$G<Utr;7kpX(FQ zJSU@dI-u`m5428Sw2!MZJ}BeE(S4)PzDA?#p33-Sw6Cdg2D<L8I2WzI5UsZu&9@@1 zi5t-O?>97GsWOFS;~udpdY?7WK8{24o|5@a=>2p>-?uB!yo1quzZcCv8tr3ToQ$rY zn)t0a58by2J=aQf|7!H!zDN7`J>&nO>q?g`@|8v3->T^EHx1F}(+Yk6I-~DN&x{X1 zf1kS*%|8ZRHwo=;dg3|gxfY}OR%QM-^gq|LeYxV^YoPtsMxT3q^xRD|emwg35+|e2 zsXf~N8R)ssPTUK<=f3Fvs}kRcp8vMQ_oDazC|dUgbp3QR->f)4<DaAZze>CwJ=ey> zCCV3l?S%GU9?e?~&AWf*4?^#!A-e9^jJHG2(*fOgR_qopMDMvD+Q+qM-XZ978;*X@ zj79fPMekt-y6@fiQO1{{{jW*<8~UG*`48=*`YuKOTIjvkPuvi#e-zq(OZ2@s4ZXJ> z==14^z7JQR`v+xyD4PEsw7&<?`xt|s=YMFwuOyxw-_Q8RiI<~&tVZi?K+pY4{0sfh z18z-Reb-`LZS?)FhxTzSTDMi=wrJlS(7fH^1!(?0Xn&W->(TwUqWSJd&ov5N|3u;m zXur>+>tD_M?8I}?`}+vJkL4NvF5|zT&ua_%oXhW4^ic!t^B}ZtL$v=UXg_VxdhIgb z3GJgBy0167z8|`7AiD2nblvS}-up8D7<#U8=(<Vq1+@QZXuh}6eIKEDmnQxO-Two6 zkDD^TC6?a3SYIB^R|#EL6SuvG=>CRi|3{+vk3rwVRvGVv*6)(}3o?F5#`|ad`iu`n z>)ej!9~mD-^FN8!dlt?6T;^X*JPTbn551Q~@$-zYME9>npX2vvzkj3mTy~FQf5li0 z?W0!WgV1|zl<^j^O~%`!_0K``_ssm2=)Db0d=uLLFtpEm5<h_UF$Vp7JcHJM1I_ym zdO!2gb9{#GUygnce1kr(jcEOU(K_WS6nXbV^X-eSuY=|}9NpIht<yTTNAq+>-}ejA zb=RTyHVn=GV8+KLo`Uu{E%94u-TCPL#pvhj%gk>;*Z+au?{*c7yt|-vsw6%Ty`M&j zk3sXbjvdfE=b`KRpy#;)J?Fs84~iqu^F4t69G!sXn~C=O0eZegXujncUxVKJ4~c(4 z>->eautcRIu8r<H7|nA;;uh%nPeSXTiS~C<yadhPKVF0W+`bXbcMp2bhtay@(Djqi z=ky}F?%lW$z1Pp;YV>>?(L8^mdA8rPuuR+oUAGsyu4cyT$Hr)#V-lZ$u4{+ZJ1gV8 zV!w=Eh3>l<&3{MY`_VogLw}x*L+@=y#@|KPFF@blPZF;}^L-aL#eXtis&dg+Sv3Ei z=zUescrEm~AA<JX6s>z=#yg<T>%7F5#B1X%ScCa{(fu#RnQ?yn0)38a(R_cR&%bn) z;yjhmbJRlD9gLp0Ic|H;V~32Nhd%FK=((=V{NT*rnRsO8$Dnm5CVnOHn`oW+aWQ&7 zOA~*E=3j^Q_fz6O(dWGty{|G=i_dFCbX{#UPlLpbW3$*A-FGTl|7<j0_ssW2_YX)s z5dEACMepNw^gS3A$D!XBFQN6{$@l`a|K)KtTJHz+d2K@TZAI^=>|Vuu)mQ`Vqb|Dc zV6^X}(K^SY`P!oWoDt7Q_w`5DUxW5BB=K-`|48)QqtQPXPR#rp8GjG$a}iqq%gld| z?*9#~vjy#=<laS{GU(5pJ>s6|{=Lxkbz*&V-(hI~M<+fpo{Ike5AK}!Z1g#FNAvVT z-`Bp0Z$y874MpG2htP9R!fnq7eed5v`~L*3zXHv(8a?mt=)G)Tt(Y&5?yrdMtBszo z0h<3XG*6SnEz#$BQsOhwe!HRP?1kR<0QC6`k0a5#kE8uOgPwOroQ39j7p?a}T!i-V zMf@7=bA9{;UH><lZ@Ybpd)fi5zZZI6wa~tgMDOW@%y&ZbcSF}*gytKV@geB?;b?!4 zWPVKMpU(Jm=(%1-^Sp=N_fj<9I<(G@iGN4W@h_UUboJuzmCE9_=YZa419X2gw2xNk zIXa^6!};iaU!D0o(0h0cz3;K;`#CxBbhO^v=>5Ep_O%$zzYMMaJ-Y5!wEkvveTjXG z`7*IWtcK3lM*BM?HbeKHg4XGP-cJ|wz3Ye8xe4v_7W7>AW_&!_&m=U@R5Z^F^nTt( z_b<x$=ji&c&_343KhSlhY83ZV2JLrOG+$Np9&4ig9fAHi`XqE+H}pRH!~y8@9)#Ar z56$x^+UHXle-=I0OBtVuuA7s1A-exl^!`_7{KxnkTK^yPyrpXv`75IP_D1v7N?adZ ze|W~5qkXqQ@4EwfzMg3RS7-cowC_jId}DFj@5`BgBl8P0|0&wf3bgMZGXGE9e!rr> zo#P(p{qK!_E^4BEHbD0uh1Ne2eSc3)+!5{P9CUrp#QhRq6$hdBF&y{D`_X;VGCmXC zKNmgsBJ}yLM*G=}uHRw*!d=il_C)*I8_mC8;)Bq9hs9&i{jFpB*g5m(q37?7=D9TU z*JON99G3Ar;>e6YhCat96Hh_&yoCN<_d43|;*5WeKA*4A{(naM`y>8`o_mK{MPC)r z`KsvisENL}hoa|fhSqD7_%yViF6h2q8SjVIyC(5X@%D`0kG_A8p!ug{{ME#>63<8T zE>64*y}xhJy5DAe6S{75;_Ye|d3QqBS48{X3+-!v^xX9_ek9sY3-t4UM#g)i=kA~Q zdUXFSiSIz`jza5<&iqs8xt>k@N_+!d_YRtO9=iXN%r8&83hnp%#J|RW(E26o6#L4c z`Sw7ca~1UY*F~RSeKgN8=(-co&;KcCo~{}1iT2Sa^Znz^=%3$4qW3)o?Rz?UUvHuN zK1K7dK=ZCbKY!n$`^wiX=BuFVtE1m5b<lpBp#3&S&v7dH?~>=C|1NtSns+2x=h4Jt z(R>pVKcD$&iQmZlJ80kY(dV)Ry_av${=U!r?}@jfb;=x2<lhZlUj^;2COY3R@ezqn zK!4txg4_OgIne&DM(_Qm%-<6qNBf$LzK^e<>)uA|eS-eG-3s*k>NoTrb~v!O|MF;D z1Kn2_-FH-MiQezY=(<y5XSA<#(e=F&Uy9z()#&+dM*F)x@%`~(^qfzid8VLwUPkx7 ziSD0=-tR}5Uxwyeo%l!e+<&0!O4cjf1<h9#?R!6T-+|~k8=-Yt#naIJUE@U=zXHv3 zQ^s#Y`@TQpW6}E0CZ2|#XBL`oE?RdnT5m<h*T-Mc{QseS?s!lU?}F~DjP9$M_~3XX zy02y8lhL{z(R=HP{{DSFy6(bwS>~@r>)nLb8J78bGXF4I_X+eIlM=s@_${>Fg7|4% z5!aya%?9*y`3rh)+tn}f?TXgl3+=aNtc&hD7|nke+J6(YkK@sP+oSu>O56?2(+B;0 zU52&sCN$4@bp4dXQxm_A?t44FA3uzrqV<-cdDo!*{EFuL7tLSt;KH)#cm*`?UWscY zu8Y1e2PbZV=4+AoBy|6&i92V$D_Xx7`dkN~b+1M5cQAV1d(rRJX=vVg=(@$|y)HxZ ze-+oE>wb)XpzF4xc}q1Y_E$vLRZCnO&2un%p2p~TTPALU*6oPq>x!=LfqozLPCOXh ze;c}f6k2CAdhZi5{ye&WI{NcuX68T7_&4aj^@)E$>;4tD#O)6$>g|ZutC+YN+W&#* z_roD*y%uPmHnA<**Xiiz;~X^4MTsv%`?x;dg08;{&G%4zBI6U{^XU8i8v1<SMW6Tk z=;!A1xEAg6S2XYD#3dUR<2$2uc17QVJ<&c7%=qDGzsI0?TcP*gA@kibe<7Ox(!|%I z=NgQ@7sJs$9zpYr$^8G&{L|2Tn~C=G4!Zt>#2=&Q{XFri%zua0{TZ#d8SQWTLyNk* zqWktm*VRMUHAd?;L!aLXXrG<Y`WK@6`l0u6ExP^|bpM_4f%pWvZz5XfIrMqF8t0<t z{tR8W2K~M7hr}fgD}F!O5$%6(w9Wx&zC+PInxgyL#P(?3PH6u<(e+oN`)@?o-->>Y z?n3W%0@~kX^xkKn>t><*-$T#)G5UMc7ij(s=(>M1U$RlLu57Fj_m2CceIJD8Jrb?g zGPXwhJO$0$5k3DoXrH~&J}!+{$D7c7x1ztN+=K3a5`AvZWPU2T|Bb}&qUTwd_#3p| z_vrpV(f$9S`*v<z^u0S8?~Sh8AFW?6<BbwGMf+}*@snc*bYB<r{5>*$Va6{->t2Q4 z)8LGci1(rOAC6;j+d0ubrp7nW`g71c^Wzfqd4HAppU{23p?S8%oenR?E1-Q=OI#EE z9<7I-<M@o9ocIj1zb^6oj9-l2cYpMAHY`4fuAdm6N8jV=aSqzwC+PRmiuf~nuI-N~ z&RGs!w+GtS-st<bAG)srdLJz_-v-^^9<6^Cdd}{Nd!c#yp?L<N@7G|o|NGJRWgJ@f z1vLL_XuesA=c0KQX8hBPuZXMSdi2lHKcV|eA6e`xk3N@*Xq|o0ItQTZ8ld@)$b7Sm zx5jPfOMDi(u6yE(5?>atM$dm^=5J0sBJn-wJwAlipM?JX#S58#56%A}+UFAVd+kf~ z`{q~lxt2YuSXUKYR|7rYf#^LqM(?);`t$5`G;b&L&t+ZFKCj964T*=M=e-@Rb3gig z#-e@y56wF}<BQPsU!wQ89$mK)?Wg3?MZ62TuO`~>Vd(m%iH}G7Zkzb5%=bY1?vwG$ zGkzVKe+c?LdMCPWbR38FKM7s;Dq8m)^xO+Fz6gCESD^cULi_q1y|*ps`L}CQjPHWx z*)#5o_I&_ar!l&}Ia;R;+Fx6AUDwzfT{i&De?!KH#|O~<pG5OMpYa)JzW31YpU=?u zXf4{;59mGr7E3oR-mg8;`TFSk!xJ}+t<Zkj;kNfA<6RT?%KRmX2cYM>9?drx?ekXj zeYg+J_ZWJPafx3<@8LD{-shn8K1bJmiRRsa?*9eNzZuQH6<uHEm|}c)G_D-0qx)*3 z@8QAd{ub!@TchhwMb~vk^PZQuPv-lh>#vPNGCl&$dtc)5Xy20)zlQFcjh<s(#y?EF zB=It|uW!)$-)4Lh+Sg|E9=B^&#ARcJ_<y#}1i;3!@Bfo5NhFC%=@hbLsFWonGxmL7 zlkS;0X3or+bH+JyhM5u)$(9mXlC82;*6d1VMz%H~DoI5u2`#AP|M}kMcRcev|Mz;| z`+TnJcm3AuzV79msi!JX=eZhGya%B6MRQ|ksC_jEN-rHs?+K{-pMlyx6QS~$ZSwiX z#U_8-xE9KOlg;PbcsJDf{0u7IQK<Y+L9NU0P<F*0j_Q?x(yI(LU)^{=)P8ux=6gUr z=LSRN7lz6^7b@N;D8G}S;!THI$GK2?OQ6<&1(f|-sP)_g-S>N_`ghv==TP=XpzKdV z`Tf;+9?IWkn=jrXIxYjHUmnW7GE{zdLFHEu%1<MxJX%2I(b~pcVJ*hJq3-WbLHU~j zwH|Y!@?2r^ca4Qm@%GyIbEr698&8=0G*sL_pz`?}Dt_@tqWh&Bl)NfbyqYF&0=3WE zL)HB#R2~kLeHK*wJg9ufLdBV6^Djc3-&c&wpw?vrlwE=GW2k-m1ymkCL7n&Cpnf+j z)iUb;PN?;%1*P{0l)v^i?rnU`m<qMevY_%E0hQ;oHa`U_-<P5CoNM#TO}^U38*Ka@ zRNO)+e;+~F9fDf76HxvxK%Iwwq4Y~8MC-jCYW`NJ=e@_|4WaUE3FWs7)Oz%T(ociR zI{;OG1j_$plTU}ze+6n?-!!g=ioYG|`riZP|0|n60hRw*<7KGxTsARkR{=`D3Y6a( zQ0slK%{PNOPpzTy=?|svK;@kQwSR`%_!%hs2~hRUfZ9)sp!~14@m8DPYx2WTb$<_4 z=RYRDu2pp1D?`Pp4dt(yu_Kh<0Z?{c8%Ln(9tE{7Q=ryq9@Kl*5}V%&6?YHR@4(+d z`QcxHapRPS@^c4N-SH-G1a*GfK;`wQF$k5<(@=gUL&cqId;>~<1=PB3hgz?L#&4na z!D-_kP;vi(%A;hP=zK+E6{z!a7gU@&Q2rV~>9;U;HV(9TA5@$O)P3?vs5qmb@}B_Z zcRJL0o(tt~5mer*jD=8ohoS6`LHYd|%I=)aUx2cYYa87c<)G}UK;>P{#&x0e9x!<V zR6ZS{{Puxb*FiR)2^BX7%HJp`{qa!x(@Z|w#tWhL&r+!UxdCc_6x#S8)b;Tll;4v! zJ_l9LdFZ|`n*6GEQT>uo@yi%*gsQ6wRJ`gYZvd57QyV8h)zbmW?*NlOW*h>QPr$}u zDE%j(@|g&g=L=Br=0NGc2DJ~CLdAQ><XfQfeBb1|pzJ<@@^{#H)a1vZ@;?pb=Mt3v z;_ajQrH$7^<$n{D-YrmmJ;vHl*Vp|}_FYZh3(Ef>ll!6a7z$PAFsSqNtjS-3%6~T0 zd0uFI%j6rN)?*vgb+#KSk0VfiPeA!Q1+_jGq2ib55cOLT%I|GZ^EILJZ2(nYW2pVo z49Z_;V^3p$sQL#Rhd{;8gzi3t?mjh+xB00yo@HDBbsa3V`Smv5X7e9G<#`Y)k7G9e z0V>WplmBBZ)-hVoHBj|bgtEWISRE>_`cU~cg7WhSRJ|Rb;tVu8P<~RO?EEIrhRQq7 z#^a&<O@Y#T8EXCK+4xPUJk~<_dk-p30o3{54Hf?jsC<5g(*MI4*D31143z(hQ1iE$ zyrzxsg*q=yq2eb%#pw!V*W2a?LD{F+I0*IJ&w<h#50%$c8_zc`fy#d+l>c|2>fR0& zcaO>Unf$2nB-B1T3sv7GDE(5Mqj{8rn!g1qehnMP+k6wKd|E;M&eRL4u1qLDVW@iY zjANnVOohsCHk95XlP@#*T9a?Jae?tesO#k*RK3Tc^7_ff=b+-BH(r9u@9HkmxHm%S z-wqYOhK=h%=`}QY8z}!>q4Mix@_|tHDK_>SBT#id1-1X4gE|i{L-~CTs_wNWf7ix) zj0d3h*-@yx&OrD6VDlxqM&n)&<+rl2I+Wl0pxy_XLgm*TYTxvS@|yvr_aszZ<BStc zJ{2ne*~ZtQ>R1UC?_HDcfy(b7)H)wE`ElbJ<KIwvCA&rIzaA>DJB&4r^`ZPUg8KKM znnUF=5Gw8vsONncDxYUfJ{`*6LMZ!X#+5d|&gS!>^4J5lZ}vm2$9E?G9crB~nY?uO z==`n5d!WvLGpOfBBGfuR4wYXHl)o`hdB0?w2UX89sCC~7weI_%^8Or3|0tCIpP>Am zh05n&lV95-D!&2Bt}2xN-BAAGq5RwrRcCW3KW(6XpX>>hZ#q;SqoCGn0+he0Q2u7x z{5+_AvlQz2wHa#vegswL*HCu9LisxnmG4zOqxqDD%A*35yb9EFt0q+3d!X#^gYwq| z>b!Qa`F>FLk3rd`nmhw4&!JFt4~NnlVe)ZM>oD0k6Y6{~via3eaW@*@hqB)VwO;#7 zeiSOtA8h;!RDORz)pK>P==gdlyW4GC2WmYUL)j-l>9>P=-|qz#-)9^OwXV5Pc{~S| z|BF!ebD`ocf~tEJl>G)M{cTWsyG;HuRQ%7O;vR$2`^DscLfOalj>@lr@_U1gZ-(-B zC)B#tg!0o6Dz5}6|DB=o>I>!13$;%&q5O?9K5O$+pzLQD7eKAsn^5~~Bb1*#Q2sxI zTCXD}KL@o=e?i5)womjrycz2HdJyX0FYO8CCjwRX2&g#Ypza^jpz2x-weQwJ)%yWd zejh^Re+a6cqfl|rLHQ}xH#&bk)c&gkl}{BYzqO%$?`{m0M^7j}1EJ~(K=~U36?Ym` zyjf8B&4*f#wNU<cK&{6CDE*^Q`p1o@pzMCL`BMGt`h(K10JRP`L*;)bRNeJV-U2Gm zb|&uzwGIwc96yv@7|PEmsJfqnvYP^x-wd0d50&>)o8Msb+ibiW%HKYdABBqZqwx%s z-}6v@F59?V|LC|9RJ<Bc_0@;ce-O$~bEx`SLFL)o<O87e92@(LSx|n4LERrmK-E7D z>b$-R74J=``qx4Ee-Fy;6B{3d^8W*r-mk_BCckPxG@sH?cIBY*tqA463RJurP<|Rf z)!!7Vjt<7IHs1>>&qtyBr9!Q1CX~NCsQdmiQ2T8T)OEbv#_OT<KY;q(VZZT|$%_w+ z>fZphZ*PZ+cR$oRHHX^QJ)!&zf$|?Vj)c;mXq;hOV0;s59oIwEz0-Km=D&xE^D9&x zB_56XzYS_!3o334V<)IQ`$JuS0jTTfIjFqmK<O`rdOuxj@(-cb`7qSFpERC<(!T)p z{3$UgdYzSqTHo8D=4(RL@c@*4Yp8lU+jt<<c}})*y3L17J__pmJ!_n7@@Y`}Xtv20 zLB(AP6=#i&H`}-nD$a*cdF?kIgF64Gq2l}tYs2D?MeD8yrQaONe+Q_zy`b(ZgKRt$ zs?I#<o>$`xD7ytv=W98XzxScm{Ua#5FQEMX43+2aQ0w%!$x9E8+Eswc_YSCh>qEtR z5X$Zms5ot*;tqm3f2qbCDE+Ze`(!Fq9*d#kud(?pP<eg;<!8U~Ybd>wQ1zdM%D=?p z(QzfHe=ocabk_^I>t*9X##E^DG}PvEZTvJ;9TTA9zhLrLq5Ql7<#z>C{Tre3e-COu z?}4&A0_FcFD1YaS7maaFbRA1U%~yu9t7^Ol>iTVL^Bs*njQyefKMu9NX;ATp+4woA zd}l)GEr435rBL~Af{I&U+ykYz&-ew@dHNRW{`L!W>wxlm(dLUKMbCFxsPj<`%1<L> z3u9X-KV6~rRWGP~lZ@F=cH^M*ra;v-4QgE$8dpH&wFRn<51{Nmg{to`)Oq>I<Y%Dt zE<o88OOEDW)>sKjeg{;2b)fD)_u04ulzn$7zXOd9R2`{M@gq>z#R#Z;CqwOv*--Xx zK*d>U^P5e+6Uy&CC_jgw{Cs2bGbaBND!+eiTq4ElfU>Iu<)<oCyy_;eXYz)|W>D*z z0F`HVsJtG7^5cU#zeA0AQ2xf)crujU45<ITf>&+46)Juql>QzlzXxpm4b=Jh39632 zq3SH=jmj%P$*V#6sbk}Njg6r4ei-Vy=nS=g9*6Q9g34<Q)Zd9FLdAa_%I``jzw4p& zwwk;Us@}aOKLC~g5tIL5JOgEa5z60XC_g2KMD5E#$ty$IS2cMpsQrAOjT=JgwSe;1 z2Fgz-llL+Xgvu)ks*VgOKRGu41l0a|+Qw6${7g6bT&VNA6l$H;L9O3T<LAZ`P<nqr z#VM8=JuhXU?&G&Z**Ac)Zw;l_%QzS+k94T>nFE!_IH>3R6sYsH6v}=Jl-?ewb^6kH z9O`=d6>48yf{JrnTJ*kB6DpskP<q{=<_Ft29V(CEQ1v_mmG=u!dW)de^KGcO>!J3| z`%ro9gUag|l>S+$I{q<vabNVjRfO_W1xl|vRJ{7IE^G#MAM`=lkAU(&7V3Pz1Z6iH z%FpXi`MeFKzX3{bo5^=Tz2AHSrN1A_-w~+%PeJ8<398<*>CyQ+jP;=QO>-#w1e14! ziaWrV0+m+)Y8`WpW1+i_P;nMP<+lcEA8&;6zYWT+(Bz*&`8xy^=R2GK1?v8K(c~2} zqU(2?u{P8?G=%d1u#H<o`Ri=*ekLCb^?sac@{v$_<81x~sJv!D)$zJ<J=8whW%Hjy z{qIYCXXDFIe#-cx?<tj_&T~A}Iz9xIUn10cbg*$ZsCxTC#dV<kWZL|2sJJ7c?o*SY z>RoJH0j0m*#@mg%q2la=ihIa-)Of<?e}Rho8&n>bZN7A7)ULd-GE^N^ZCuk>530@w zq4G+A+J7CO^t+h6FH}B*q4d2_d556lkATvD4(h%CMVns?Ww#o-`yFaOZ-ZL@kD=^; zhO$3zj0;5dOGDY;0JRR4p<9QsCY0ZMq3Ul86+Z#WZ(k_8WMewi{v8UnzjL7cjf2{! z&)awjl;2f0-Uwy49jfjRpyKU=x=(#&<8x4Y|3JmPDj4;14U~R)DEnJ&Tm$NUS>MJ9 zP<EYc+!HE~K_>S?+54f^Wf;`&pCh31m<?sW5-N}NHr@iIpAWSzyP*6WFn$BIPk)Ar zcM-bzXIcJG>r@^}ehZWz50qV9D1Q$@-49#ae19l?FO<FC#u2Fd*^^LqlTAJoD*im< zVw10cTEBHB-v$+TCsbVrq5OPh;~#AN3sn3IP<}5%?cY*Eqxn>XlHU&HzlO2C$(ums z-4ZHJ2b=F^;{j0qABXajYU7|W2g+`Q&5wb~b0So{8BqIhK9t@{D1YmWTa5)!{`WxT z^BGhfUzz+z<5?&_7opbYGL*lvp(rat`Kbcsry7)gU8wVUzs)}kW!DDkdhHCA_oGnz zDiylt6Utu%N^gY8CqeCl=}>-_Lfwy7Lg{Ze?uLrH&&FRveNQ}L<4aKcq(nICzY>&v z4XF6>Hf{)2$HP$T+REfzjD1Z07?fTb)cORV@_Q1>?-(0TggP%TntUNt{mY>2-!b`S zljlSE`3UN~9I)}XP<j3cmDf2N{{vNbiR|e74N&WPD^$IAK<VFW^AADAO@y**52e=| z%5Df${uxkuVW@m_q0YlIP<k_=@|<gY&A1%u{H=!a^FFKzcR~3(3w2)3L-{QiiROI^ zR6ch>-G}Ny&3A-)j`V@5e*jcH$xwM@LfM6&;ynd*KE^@my#!_dDpdT1#wAdCZ`*ha zl>T-oKYO9pWj|D%$D#5$1$AD|o4j~V)UFIvem6n+tqP@I7b<QesD02JO0P52diJq# zI#eBD8;^v_d%STH)ct)b)cP%g%4-vp|M#KvKY;ST$L9Cj_)Dnu`W~vjA8r0DR2~<g zuB+>YMdzzR`Mn#ep1M%y^&w+>C_nw6@_5|FsZi?}gj&B`sNYp4K;^Xz>bbhc#yg?> zd<x~~u#LZgT91=Z>-amA-^);bN)M0vuK<-_H7Gy#8Jj@GX$hs@2dbXIMlV#n45&Oq zHXZ{NX986Gm*7=!zRfQ*E`{>D5_;f9DF0tT<?)U2B-D97V~op<=35?WJ*z_H5pR6J z*c2*{1Sr3qpw^)W)bn`|lwBAqUY_x3sJtiG{0x)NHNFn@J?Sl|{P&vtfbodQk3+4? zX{flDq5NK(7mZg5DzB<geyT(1#Y5%Y7%IO6C_n9?@*DtFcM_ETP@8`eN`JEPC8+Z^ z$Hpt6^w&dOf7@;RF;u)SjNhC5G*o^Uq4K^A6}QY2Q9rjr?fV)~`@RX3-;PlE_JfM& zGkG@DJ{t{nKA(rGXCBn|h{Yy<4=V4Eq5OSs^0QEJu6i>1zIr26-u0pKYXYU;8p>}E z;{d3*Nl@2s7F1mk=z&i_eP4bB>hERiq5K|zx=$R1TGu~Ke#uyBM6|vep#0wkRaYJ8 zUguD8+8et<<<%SNJ~YV2Sy1^8H$DRuf2z&THZFwPC(EGfTmzNgHmG=?L-{`eWq%qf z?+YfsY~xZ-Me`~LwH_6r^lpLj?}4(fZERrk&5f;~?vov%;&p{O&wZilO@i{1X7fX# z;^acbdCJCPq3k9=*-bajvH1nYH=y*EL)ou`^1l_zZimVDLaobZHvbJ&9X~>?_is@4 zB}Yc(WufGijdh^>Hiyz{19d(-L-&3G6)z064|AdFng|tlDwO?PsQdLBP<lI{u9HJH zJ_WUI|3WvPQPFW(D7~AY{M0ty52e=>$}RzFJvu<0_uj@7D7&!DKWXx3q3mZs<vSND zuZ2+ctcCKk2}*C5$v=ULcMxhFzlJ*RC!zN1DJcC5P<oebzSQXGdX$0ke>2p4RVe+t zq5Q?0yb)C1Euivh2c<Uv>OSB=)th4+ZS#|${7i#xT_#@$RnJl=yA4q1C*S0sK;55? zLY@CJCcpaWXr2|IuIF2!&POe%eb5XlpH5KqJ5ctSP<f1kvYTM@Goj+XX5&>hzZELK zJy7fN1ysG?LaoD(P<H2_{9d;C(qp1_<)QMq18Tm$u?bXNiBNuf86So6n*x=0rpa@m z;*PfY@iu<J#xtS(EU@uX8?S~sPn%4>7s~Ge8y~arPd5G&>i31qHm>qaw7%+4=jT4C zb#4Zge>WRDQ1wNi_R&bFe8)n?p9EFct5ES5L*=^$YJE4`csG>ZKI4~Ae!ho_|1*@` zpT>Wo*0<!?XxvIrdbdHvsR^|Y8bF=zcE&!?U1u9-LgoJi)cemRl6rvufx5OB-7815 z%ADxG3BE@E!*#UbCclL2eI;3>jbM|fbF?OzEd=_?=0C>fJ^~$NksinQhm5Zx)}tIj z^smC#n<~)SVJ!}=Eq<OPv6dF|UB-pv6K{S`;qNhB@U-{ggW8nV?p8sxAJG}Fi;wmq z{hn6GREv?Tg`;&P{x<7RAlDtt-;8V~`Bu{+{!hCLpRXuC>Wo;d4~yt*CzovG5#}pd zj_VlzV|D(6{~6eS&K&=lthkCCg&e&4#;qeB|H&Y?btFz3%XK!ATj@WflW1)fJ}%<p zl<CCebE&m4a}$c_zRx-?MfR($#~91&F!lD=Mxbfm#@a~M`9<_=lS@7F?qd4Cpu3y# z8apr2U&`Uf?=@`9N6_Cz{ky5-wE3-FWDVCccb21soeSB2YxVL99oLuK)drLMROF9x zylnQbBL9(ECvl82-w&bx9eI9h`7Olm)gtk}L$3`w^RQXO+*x!Ro9zbt%^(-G>yU4u z|C-g+p16I<rw!wS%uS#_+3c1u9%^=(*f!%h$he7}hYqaW5M*K2>6pnFy6rLM7SOA~ zaVz<JkKJyo`BiH8fOy?4hfkTCNZjXODPpQ+<MSV65p-(f>$v5lxtE!%&3H9_r?3WN z7{}TJoSz-ooJMvXI`#2c61}O&2jEAoCb<U5VHP^o$?0%Z9Cr`#vXLLh=ilg_vzp#! zzN+Q*34Z3{e<r@qaty(LtR-VNLiVibOpfX3mVq^i-`{GT$ao`mt%=>8*gI`az93#x z?A883Ki0aTcbvR(@p~V_PUs!RuUZxSsI9@SEcsPOC&V#EKCv5S{vM(~#B?W^Y$mc# zIFj&vCwv<_wN9qjl^Da3b+WquLXTIAxUsBBB6Agp(aLg{-J9gK0NanKGYy?1#5utH z7ucM_KmVEHxH0H_#Q1aOUc|=-<~!HcS$?WpZ2|mzirm5W1J+{*_T$N?fvxvmVy(x| zJ;?VG=R3<~Av$}|`2oA;_<s(6+Zca}?)AvNCjMSzN9e~|SIZ+dUPYeQ+We2qrE(l# zya*rfV!PS$?T0Lz{-?HfWyvLlT)kF9n)!X%^nYXgw#gLhQ(Nodmiv3;R=vo%uS&dE z@Tpb~A8E|h!sZV0d(QIvg;<R_BFt}R-jDo4=GBInuV2moD2x3S`u8wbj=XE&?;ghA zvfg{J+hF@t_D>;K>&yCe!2cF>e@16K{mHNm^NHmAJbt<}zM6cez{`wVGq(obgUuNF z6PcTipS#Wfm&~2zc$hi<6RU9_!eQ9Hg71FVsAVw!JN<u{i?x0Dxslx4;b%7fiqroH zotccwa9qQ<5B@5nr`8IeqnZCRI*c1(@ilaqQ`7f^>+q%aPLWs|&m@PM$cp15ll2?T zS|$^tEBcMFuSBd<=q%&#B72(g>%^W*e>XO_(tn;cdJ^5=I2z(B%g$XnbZ^7g3dSp` zTdgzffz8$U`w<^$un$M9Z81HKccOQm@dEVP+qu1fzq3{s|H;s}veY{S``77zA{(pE zG1h0kRuP{=sBdtQcuVkgg5!4d7Zj2A!fppKmz(S(`a7^a!7+hYEnzNH8xEUWj5Xw{ zR>JINF*g`rC0K)+9Q?cx=SOEPvdg9`{VDj{P7d>61J?CT>{?jOU!(gvN5s~30Ss^y zGJgsm$BF$SHuWv$BFjsDE8_2W>dR#<i?)gQ%VMqqwsPwsb_4vSGCo9(_rbyVRQniz zU(m0|+WU|%WnRDizJh%#?D{jFPd@>@<!~x<o6w(wzjnmF45x9#+H2(bVv!sr-+~{t z+EKWlC6y!gb?`Zo{CCigaHw6v{}~eRNNlwSRRnDbx~r^TlkqdeT7n-ne#(w}+1C6% z;)U=TMm`Vy^Bjk%??90}Q>e8O`kS$P2E8M4LMz62FZ%DJ`?2}^99^|DmXG?yd5^l8 z*i+E?2>o|#PQU9NFuQ-qVJ~rmjGJ@(WPV<z&a3eMsjW*F#=WgSk3Ro6z?Jrk`KpVb z>C~^bfVjo<1%uX(7~f#Kf%!+U8-wgLvQJpUd*NHmy^fE=c20WP8ka#fAKe0U)ZT~P z&>3p;g{<vbY-f|_-OSa)Ujg$MEQe`~|D><qz0_Vux4+G4ycnCe$w@6>HFTu@@91~L z=L;6+I(QD-uPna@%;s)%Y9edG_zirW<9LObYOBy!`-|~1=6l)rHsarltf~2UiSyDG z|K%;#YRm5>e5vKY^U4jIu0?XM$~w-($0*`|W#?=VvP_H98~t(|YU}a+5B(LU*BXDV zk^f-(au|NIsO1@}Pd1;~ockqG0&7p;XC(F`8PCAZkKL2>%X2P%MLw4p{3jISg4Ct< z3i-^ShF6)(;P?QWI?Sixrzzu()R1C%N`Ii$eNF?~BUVoYyQk5;nmzRmI=!$}yP29R zS**_Jyn(M9Y`m5E99!3anNwRy>{BKyjckYcIbpTGVSJAm_cOPjx+c+|L!4M!9$Om( zYtb*j-%jd&-p*-V<l|WvwU3x@154xQYx0`MIN55_{Ih2BI=L((#>paaK4$(-i}fU| zg3q4hlueD@@pYZq%Fid*mm`mZ*q1}+yv47Nd;qz9%eXyt+-$XfPY%1tX$F2i#lC^b zAH?Syj2Gjl3^q+ot{AbFh3$9v<WE6y`-t^BG1T@`TNZhahNrQ86x+wp`x(6u^ADpt zp8mVU9EOk0#LD4VPF`x8$fqgtH<6V`?>_vD#m67`7=}%E=F;hJMix*1e)RhgXEwSu zIDW^+JdU@>=RM@Rk;U58*d52F9h^tJq2%fQ&SkNscQg6zCgxJ~>Y;ZCA0^>Cthau< zS8K|#o^fYltNn(J+GHE6e;@se$ot^iLoP$`p|+iTKA?_`X7dO#{#+hcADP+)>bjkN zZ_E2Za(n>WI<O(~P3Gr%@*0GX=E!TYR%$1ZsYR@w+ws-VWRiEmXI<*rkDq<y|89}G zTQJuE-x1_hvFnWA5!jX}qVp;`hnc%e&S(eGQLBPX?GbdVVIN@qN|ReF{7olTnEJOO zf7SNLZLCcaa|iI(ihd=_zXY6*{)5Q>wmRi^8vVKWEMvJ8gMSeFDEbBX<R3qB+cKL^ zgnyaOp0Fvpjqs~B89%+Kt2#M1XM7G`vO4Z0=a+50PSW4Z{9t@P%&`=`U&!Ms`u7&e zEraoRYEvt3@jqZ(i2mywXUVUCx%XK2L~^(do%YmxhCDtdw^XQBU_P(5Tvp>_7<2vb zpThi6Y>Kv}X7>|*|He;(#g@)b=0kn`oo5S23y!<Ur;r>Tptgtbn}96VTG{%n!yo_o z-ng##8(}`bME4qwhSYK!>%%`b8TW^s%kt>nOaC1lO=PYbu`A(UZ6rC5p{@hbVO&d# zVZ*oybapdenm9+WebnskU_8P6uf)fom;p>ie;+aPOt&fPl*!Q+-_K$90r|&T34HWN zF9|NE_7CX4%~8*6f258GaSO3qgZ&v;oOp9>t#7B6mG~QnzC(;Z>Fak}kF9+UxqQXi zzYD{*=5NB!7_0q&Kee~v24a26@e+AFPpq4X`-1$S-yPqbO;`FKptlvjC5ZPOxm=5G zN&5NNsx@VN9pn3Ke1ZJtp+DO4{tTw0_ZqTe@NME<i_UiJj$t$2a&1eVg&YC1`xpI2 z9ABH?vE=s{<GUHx#8xdGU+e7LXk38pQygE=KhN={gtSIhPi4iXz9u$Kz|SA(r;`7V z_*P3Hw|LkbUA1?JcMCSdINn3|psn{S=-r5)x5#-3YZPmb<Lh?Qxw=Sh1FepCh`9n^ z`Pg>Fb{g`Zu~8ck#eaQn!uMU|w##xZZ+ZU3y3MdSE%6g;W%2bO{;M$8k@#=p{~Y7h z=)XnIH&Mgej5}j+yZNd}t<8z^G)H^%bI@CF^~d}cWjW@$qw^5Lo_79jLw1tb4J;?= zkH){>42Mv62KkJ^PVGjkIXa4dzK)M#%%|9Tma>|Ew>)3NcTMs?M9d3T^Bzol;I{%g zOQ@?K_N$Qfu{c5GV;P6A*~l>(`Fvt;AfI!@`2wF?&DT}v?nSnb@lfKZjmLLcY$h@; zZhHJlH?9x4wm?6Kj?yfTZ?#*Q``FI)d&uVC{}{Sz6NvdOK0arDG&#J8?)|o2*Ak}( z`ENAa6ZF*%qw}S$m4j^}`hAd<vv{w-W8@KQFPeN3{_^Nwur<{D?^e@Q$nIk90mc_# zh5zGRtg^f+X|Le_X|p|m{8?=7p{5y@>qhd)K<^gDf8gsEV!QE>tNjG`S^x8>DDDpY zbjF8|TyAH5=P}=e^-<$bR&j&yaR+g3;F!V@Yg37_nOxo?r#e>mc6=-@vIf%a%J?*P zZxg2itb$ER%j+mU@)$oxyl&X`CjJxHe9Zc;MqXffe1qP6a_I}-#oxo|cKe^TdK%fg zR$Djx4`F^2`usU7?iu{-uye1R+A((xb7~{-_mtK3sQJ8Lb32)zKpsD1KLY!2@pTKF zYk56WWIbGGMLtg1zUgVc8dLuZ)ORcPAE9@MemDFj!oK8C(e$b?-x1yatG&m%#M&}q zHz!6n><63hHp{=BjqfDS?>UaK9{(VlUc^2d`2wrsEsJ-x<uKjWu>-X?B)7jz9*doX zeiLH<PVA!XcjA{uH`C&LX#PX6y(zBZJY6<_^=*y5BF=Bf)$XGH_c)eY4o!(Q^MB$* zHQAf!snx`GC%&@K-9-)^Y#lli_j~3VqjQV-@9tVeKT1<u3hUU-@?4L&n)w`zEXQ;^ zsb1uMVl*Y!^RO{B-VIYsKjt<ApS!5981~oV`vuEI^99uOIOpOIa#=`C1M#I+f$<QI z$;`cq{x`0acX-RWnCY1~ZY42#A&cku+H&`zdjPrGAeaxo#@BpuKgCg+<8O{y=#NLY zIkAQ_{~R*4{p8vNnc6_=Qrm$4@^&t7M(<a2)W$Nu6(8pr@1UkX@i_}$pRpGEV61(~ zI^<!$5c$d?=Wrx(x?;NtyF%=LK&LJ9i!AQn^nbUw@->3kGtmn(@1wSsrk8-<8u;?y zC!fAr0=8eGGnL#M6XP;=LFRMOdl*h+J|5p&Y!Cj1ZV#*L9%OrL&3_=~i};&{erM!Q zz@C=Vchq<@{h+N~AN0oH<5y(Uko|;is^z#9+d7t;^7CoUE#C8%gXEu)Us;Ykj#b#| zC$dt^H-JkSH^ZhXer~gvvKeK5-lDFztbYI=MXw)vE3vzi`hBd$lf->lM*q{EB;MDo zf!ZMAtwmSuBKAkHRlA;gULwYTB6ZwGtw->=mpQcnemWP)O|m@A<1Y=y+H7L2Ax^+# zf0E;5e2qt88T|oPhxGsAD1%-I-}+~ex)49f;`QY`wL`vwnBSPqeC*d)4jIJoGyjU! z@Rgm{Q5JU+dhe6VX~qYcdxvo^VtDbjlUg?*JBch2KWcU01>_w#Ml;u(x+)Uyy!ksu zUTKz_^m`Yn<0f>@66-B;xf)i(*Z27LQn%Vf>RJwy@LL7DZ_$ahKP>*e_`ct2(cDec z_Jo})jsL>e3g&kZs~q;dnZKXoU*(DI$K<N^n)!I&@@|Z7y7|c^_Cj)ahGQK1PryFt z-EMgvrT;9x=95!TY>HWp@zj!uu3AslN9|j59k?Fbp3JMQ!|qnIxsRGjFYXh@tI>TL zyMxTXga0qh$CKvsJ?xJn`wecy?mULau=$04Jof*>?iOQ))p-=oXKo&LSK;>(b)PZ6 zpJKmK!D&-CS`p_W^QrVZk#9ERzLuwSZo=0O<n=jm)LNr+BjaM^&<efd_^pP#7P114 z0Q#lye+Jp(#Gc9;H=+L`{e0p)g#8Ug&hbg+PT>0|&13r_@lP_|$1xsRBWxPtcM_~m z%x5`HFy4iq^~A|1KL46e+y|_|E7+9M&4bnxUzgGS5P37?YOmsNABRJX4$KclRubDC z<kJTE494~Fx0AYN!k^G<XSr4())8zf;I9eu-Pr?ga!hBee-`XsVq8XN5yuDQwx8H) zKf;Fi>4l%q$opwzv$4Aqoh``Ih(8?L9PAF`cPDwMML2q(pM~8W=&C)+d?oafvH28v zUFLsg9BUVlZzP}c<o<^Vt63hK(e;{d5AkY~!$4b?$M7+X7-RAIIX+6Ddkg(>%(s>d zAH%8rS;jk=i?!kS8;PtE@m{hxtMSv4y7poB2Kio%d?`As$*U1@?j&v@@>u%=y?*Fi zga3B;QLE1J7qXvVG3;V(CNi~y#K^}k)&|gTWrLZ-=x24Vgxk^mkoaodI9e0`H)@<t ze<Z%Ukn2ul7tP-b$iJk<JZ$sG=UL{}zQNBZ^p3z2<WY?{)tPI9?6T?nip^Z=_yIPA znbg@IA1}jk*u`2ut5f4Uv0cpEF=TI$r?*JGTkxGrUWd`yLc9!fPzwF+rk6p#0G&?E zs~ttYnEWqb8*AHa-CC1Ztd%F$!{j)qNIcCwz){Kcr{LoU{O-d4jp*J(9sja+u~v(@ z*~ogBkEQh0;?a4PyeipPvgOnlPs~J<@vnfz`D`7U!Ew~Mf;ctF@ow~<MYf4LZbW~D z=@loh{pdW*{J->5(cMgcBeA|gXAH;B=%2%GCNZ}csaH8<+Zt71{(sw0{C!VOQ}ADo zTsEO_hppj#=r<+K&&;U}F#D6}skKCYGyVIBUD<5DHa>{o&K!5Kemn91xN2c8p7C?! z_b<ak`1azXC;1(MJLHtM3cVy-ud~?3+5+nBg8k$ob$n#~m$6xiKeb=+wF=!%^fQos z#P}2Ry5aK|&Y2G%=keRi^kwrf`b)`UEAmFn$J&S3eS+_MIMilSZv&2=)TZ_jwalZx zk@_6Vr3CllN%(lk_QzWEcN4p0Y|m*eXos--f*j5;H;W^^$ax!uuNCGm7oA0BQ=mS2 z>F8gJzXO(Q8o5_TcErwgBj!e-+n=Kw`a_X_j=zVg<40s_Z%T&W*IA#|`1uq2SZl!C z_sDv%E{81d<&2+atachsVXe+m!*l3*%yujOe!*X?RcCwz`-aNLgwt7%>#?nf-dcPP z!q@fWl?a!TV_Wo67%#xD+MD>8fV?`#RF2B%-GskP?5E=AUwoV*{`cr^LUsnb^VEEY z*(ViQ*Av)w!AE1}p1{XL_#TaI7v$Gs8^TvI$7seAkk`Pr6#B!-d6U(soa)gZK<rri z4Sz4;?{4@U_U|et^V_hCwLH_`Ms2-0YH&Qp{G}rK-GEH(MLS3TlE>r3y54kNz_;4N zjQ=K9h?pB0e}LT|%-zNKJ<|;lZxsHkaC~98e~8U!<||q*Yw;h(#$$2idnxPSwfLR! z`5^lItI=_bI65#FYa>~^-#OF<z&#v~pnE4VZpJPTAJ5ajmHuw#wpm^m$)^TuI+wjO z$MPD&+^^;<>XCb)<ya2A@x*<E`4dczR8I82BzLtbmg{2pHo9uL@CNKZ#cxHEy-8fP zIhMyJ#&huTn8jH~E-#R8Dt@-p|A9EMb`ANyVuP#fT`M-Xj?Qvoe1)I8$ZH7poAFc4 z{I0Pz`;9eTLF|u_e`U3vMlaT;(N7^KANJ|Q8*6LR-|9?5t~L_;Qur)Ie!Z|cWAjV! z{}OYl*cKum#Q1II?qK{R$L&`CJJ?p`D9iX}@@|h!d-N{gZwf~<)2ofVE%|oAmzTJo zF#d*q8>sez?U}*spRMHf4|Au9^FIAMk$uf^E5}p#*h4K@_}xRCuhCKanIpy4LE{nn zpsmIK!`Q`IOFMselk;MH%`^L_?fkT3yos0t&E_NW%C|L%`M8I16XZAGtG3z4=2jE0 zC4TFe;4z!8hdhG*tHf!6?R4Vbi|iSwwgjKg!>Y_*OKopZe;@qRwe@=g+b_`h0)Mq^ ztscex5$um6+ih{`AbZf}<@Xo*73^F;fX_EfZwGOHMm~ZVzriKc`!BKfv4+!NedI3^ z&x_tcVt+(mtqk&(_#DW%H+p`?_gM|EnNCmS&G9#pc$e|L7#~I3Mbq2He5~DXIcmI& zcvYw))=FFdHFDp8O>N?JVGo=}UW@qOV4Gkue8ink{1xUq7n`>j??<--M-aV_wU!*m zu^VF7#S!=uwcl^!S=c0@vjLqC$+tLh)XLIdgO6unI{Hr`8*8~Iu`b1sSF^oSoOrp| z<)L36Srf);m5{xR>>*;^h)oyMZ_E4(*x$u*H}Y34mv_;vOFj2fcWZQK)4!FYx5b@C zo^ztE<A$O$6}w5u#^K{ea(sYep>n0BIjl#2;@^V(gN*g>j;JkTzA^Gv%*W$n3OUqc zycZp{+2o+MmHCs{hKOCCeBb1_A6vDZmQQrVdRzVr5qxLDj*5-%A7e_e6F$@ykn<nv z6SFP0chC=`zXo|J#_OS4koamhsUBptEbcyZlF6?wYc!b}9wo07=9l3kOn;Bn5Veke z#^d85jvtwO3Z2bGbnd{f*J91Z$2<7X=Xijl2Xn8ZdlT{gw>jAK$EVt#*xiH9b&TI2 zr$5N;=OQsqq4R^SpKHL!c-s$eSzRYtuVu)laXxRiwUX}J<na{ab{uaJrwuyIp;`uY zUxb&5`4skQ*O1pl#<BLd`Fb4Lwb(sRULA>{HrV{Ae}??uQ-}5#IgKOVjo5sK{ciMA z(9N-PQx8@_|7K#9wL0^#`@+_73iFR3f0}V|tIu`J$69=LWbPQpWPA@q=OKKRApaYQ z(Ux&FbY3%qf2n^t;|yEt7Z|Gzw(%tL9A@<lz~^AgQ99GneGpbhem(wo(a*Ge9)&Ca z=bZdW9%?-}CSltb4j`Yu;cE0hB+e>wxxwr{MaR#09sUQRQ<nM4)O6nRK@@iuodz6g zb<k6L1N&5T##=6TQOhsL_L$u)^s15XBFjfMt67@|kRPYNjGWX?n%`#VR>uB&?Ek{o zwXDHX`V(OQ`EvHm9Z>BMewvxzL+GBv$1KJNqtkJ(QqMNqn-Z1PI-!?j_9v+Cd2HSx z=C78&^fsf@9(j3N|8+LEkGTjoYIU(uYtP(eYT00Uj3M6V)O4KK<M43-onDs1qx3() zZU#PXB8PnR)|=gJ_(-v}klz;Al%&2o<S@iyCSv2@^E`9E;b*4hun?V&GNN4|pPPvN zGB$JRXW_R8e$+mJcc6Qad9~vBTEzG!{JhC{74aJ|Ry%2H6djQdI%`Z;0zZ}Udl}i} zm;y{7=AXoT4z~Os`>~9h6{+tg%gIj;YR7E9EMYy?F#guor3?8iC(c){7VqydzsTmB z&2_fEQu&c{cM~~OHTwi&K8t)5`d;*3haJ#=6Tdg0`!ssB(a%G+5#8sQe}Nb`P~RWO zw~$|Zbe^XFx5XX^525=2_Svju0XhTi9DQLrXQ*#5Hfkr($s~3<HW}zXgzwqR)gXr^ z#65!UA?BZA{vPbp(D7h*H9ohQk0$6gLViE_eTMxtjMYlRXE?6MR&9>yufSh3<c}gB zifk-3+(NAP8E4ztNPivv)W%x=_eY0ueTa36y!#OADvOnd{cp(cCC3r?NQP55?qMB@ zwk^meb6hg{d+6$PKVdnJ#NWGSFc5!#68i``-H7EU@5UV8SdM=qyBXaw<dUu&$syM6 z#A$PU)s;T;>+$s{F+Zl>7a9AQZv$V0+o*Gn<#UNVg2-~r*Br*p@KM~xHxPRnLHy|d zWb1h?u^oIZx4e`?5_1)hzmM;avA>4+)sbb<AAql0$*nfB1Y&Jr`~XJ~-7?I_T9&Q9 z#z`FAiE$1eV~E|t*8Lysdz-;*)8Eg!RHA<jz4{yvGru0&uaT>rqdy9}@2Tw+=faf{ z{{*@xiJ#2ecZ|0)pG8d@=+{LrfX^SW9e|$NkH~kK&&}kMh3rimA12R7i`4Qfx`!E; z#a^updUxZm7kmYOcSgl=yRhqluZD~p5%XsBH)E^zH|zDd&NJ;h<Fyu}E`D~Sy9wPJ zne)SU$-Nu0XQ<~1_zkkL)bu@LwW-7^Nemyd8qC+Q^^49%KR?B0A2HI&aV*CT=zgP^ z_&$!G=EzE+a~jcN@;ktIJab9-Q+tlXgDgx=r!DRUJ9pQ^>xg+9c50dU`3K(tvwaE< z#dbe-Ve~S{^-Y+K?nLTcOa8Z5{j#r1jQ7az1#D{I^G@vfSK8h73*#l|55<StC1M{( z_B6hW;p=hyG-kdn3|oE|nHxa=U(34$`d?Ao0dzja&o9UiVXO87aS~x6<58BsJ7FKK zm~Y6DZN46%j!x*kfb1h={n6`;?-x1L9zfOtU)$VK^ur<MG4$1DQKwpWYJG=8tp&0t z(K$$dP4V9l4n{TruIEsjW%hfhbua53YsJmSSJZe7J|48Wb@U5ZgN2OCliMTsyAB^E z`K{vxd|WmMqmA{c>3)2j;<yT5w_DtQ=&Q9V5;GHDHSv{?>?(Yp#<nVYOUZpJc6T9r zlKw*0q6g#G&DUG3%O*QVe<QmNKNHZohJFrn-LWan@w?S@0NwYa;p3VSD-oSxjOUrZ zcJy<oQ|$?KA5)I-F6JBJw<LKKy0g?ze$SbmiCp|i?#cB2!q1b`w8$pkLw=s)e*Am} z)%qD9hR@^sHV(B%U|sZPAuo=fq2!rLzasswsb!DyqFqN0f1ul`NFLMdymm#WnEZ2o z-bZ#X{@z9ZC5}}bCGd63{K(f<WF_%^6t+bEFMg|`vzhS&oL{vK<dJRb-3))t@H>zB zRE~ep4>4Dwh)>z{z{gzjILdiY8%F;f^1Y99)tY#HvH1%BuOR;m-V67mHwm4S#4Fl< zWjv0UKVY-h{9Uqm_agh3STB*sN_4KnS0cWOGk%Bu%gjH6jf3A0h`W~jJ20o#4_SNW zf2WSo=zdFX4C89T0D2+(T#fGo^wlbm#~x(QVpj&8Dk#sz=V@{&Lu|El`Wum{C7}B} z{Z-68j=VB{`dI$=Auo=Pqs$fJ=XLbc%ucpnVEZd`716KGF`4{cLf!#3v-LSa9+%L& z1^XwcVHW-e(O++CBR_ATqt?NEk3s)ce8k#d%ja|K>(Kud{W%=vte&;xsP-LpZCJOk z`RUI59_D_>*IDcqnNL6c@95XyxQ%==$fdbrvW{w}@!iGx{fMbH0UIA|V(UE3mHy}B z9QvQ&L+uH(tqprJUO*nl$)f_cW35){b+vv=t3$FJa++)79OkzX|8>R<kblN}7h<$! z{r<B3k%nvyx!sSfF?C-=@2nir)^gl|ekJ4&;p-V}iZTBcxqN}_d-^$6-<OR0;wRQx zkZV3Zx1&?ERbsHm@_UWBOk0n0b`GRF#m?;$`1^<cx9CkGc2(24n*P(oO*32B{6?%A zwr=b2Ux$2#qgM<2gY2bV_<95V+U8>tb=AV=d2D*2doT5U%lu+wQ;~Ix)q?&_R-@u9 zW-iEhA@j2sPqZA8v9E`pspwzDv5*{IvpxI=Hsz4@K-LD?aK^K(#=g|HfL!h-Ze5Er z4emn!bF+Vjen(_wvHuyny{4yp5XF5)+=0}p)>r~s74n--PIocBm3V5)i1jEw4>LYP zyj1)iLcRd|M(8&}rnZ-w>Y}T5J-Mlsv9bCK$l+Gv-9x`C{t4r@>G(d1&jj;xZEOvh zeG#Q~_?p4d4|xq@zD)lO`a$}6^k)+HN#dki-74t}cHc9XWU@)N-Zv3<61shuQ@ext zt>pD3@sDCSjN@)}wr~`pa~1Pm>VC<R{RVkubbn&}2!3wFb{hPMTwbN$3VkixZydF$ z=W6C+?G(1pFkVfJarjO~zaEF$40ON3b^&=Fjf&!i8{Z<<E!bYd@psI7uy2dqJ>(H< zhv|Qdz1nB^N@SczPMfi5gls+bx2SJ*bU?O}{qQ*4q<YBbPu4UZ-`^s89{&&FXBPU` zkaJ(g?<+2Pj^&J6Tt();hIN=Lg}&M{{OsrGOw8WIRC}H|54p!PE<v6f8TZFm4fFLS zF-mjXMJ~OOT_m@T<o_UJwHcQ82lO9it~$PB?Oo;;A=}0A6uz6P9*$P{pTjZTa%h3S z$(G|H@@ql7>xosFqdj^zVsoqQlP)+9aFn+-osW-?&Cd_SdyW1#%ylB><M>&E?~(Lh z#@DZwSVd%NZPEJ#`L~Q0qNDa0$Gyn5QAdC1L;e`Ky+jUgt2XjcONU>R>*M&?M*keK zccT9ZzSf{y8JmSL)_z4k3;o&1Cy>`T=)vD!6n=sIVv6uBj=uQ44|xmXUn(+JofsvF zb(r(2R)F3C{N7DJKn%5qiMs*WMEdt~T!qaz*ch8F#4e3ZI~Z%j$^ScSCy>)$_-@Di zG-Q>C-@$5FhV3V|&a>c2J0J4lLH{iFXYuJ^laCLzc(c8o`A(MaM&^FBwf+gY+U@3d z9QrBb+7jJ{<bRSJDx*6RMv%=w7Hh4|$6wftCGVPyUqUaL9O_xzDkxt?JP&fUOng+P zUjf-s^6kgbfP6nhR+G8XmWOov<8v;&#p2v<J~gLSk~n9~?|anonb{5{f3>brxSvz4 z&Y0*FzDH0?JMwrORwH&Ba>*vvIP4RUkHMw_K3^cl6Lzi+!q1rh1>KjJKM&O+=&y#u zEQhV+dI-N8h*KZgM^LRL$2DeC4V!DwSp@Tmzm6l!QH6NpIJZ~h{~i34=U9)ATIBXQ zbH5?Kf%!I;ll)%7N37LiJ=Jy~tBJ1KWNe?q_6Wz{#1F#|vD8Z8=N5R}e0Z_%L(I>q z^CI@oSxxWL--YZYavs6_3_CCFksqU<i`}!#mx6uqwZiIr8{LkU>kef1qhE~tFCssI z-BQ!L6ZzHH*T(<<wkObk7X2N}&qMDc`cKi1wFbnaq_}~s^P_auF<wpHRsRoPgRuV| zIf%>U;~M<jY3E1&J|v&*a6d7cQcErR?JU;vqHAvJw-3EodlG+7A@7CVb_KBZGd}B) z(+AXXH}k7FZop@K^5}<sg5}wloTsDn3dc6HAI1ENm?Jn9U#-w9ZR@`T*+}en!#6Fb z#YNU;lG*N|#@Ddj3KPj?7dZ~c?mm2dN?m*5AdWwoD@**Jl_T@}k+nwmWAd2K_<G_l zHlHzkNxWf}PXg?Z54Fj}Q|pMY3zpOMMb_m@`sMK7$<}`{cDHiOLH<k;J^9Gxc$)aH zq5FmTm;7n7t!VKZ!V%b(LMKEWu~v-y-{nwSSj2Z#^j;?iGmjfgt{&q2ZGNl5LDb<x z{tCMFu@AByKhyuv{M^X;^<dvE;aH2WCz*Q?9|IY;Cgv^J_C)7L%V#I@cUh00(Rl>j zSeuW01@Ue++3X_u@3*zQi2pjwKSsj4(fyEI)K)Y9Bl2!$8^ZT>^xr2A-MGu>?<bF; z3>pyUdi4LnS8rmJk%G0ytfpq@e2>j-_<w`rYg@Y|wl2xceTMBX*lj1yQ`EPT{<D^I zN&K|O=5b;!hGBFrV%wdVO_1G4%p=I^Fji}0>`mN1$!!JxpT$Qf{JxC+Zv0LxlBaBT zVe=h&Uvm7wI2pY&mcQn^(*GD=Rat}HW;+PoRAlqXA=X;Ze+^r=)odMc;#$^p0(?3d z8TkuCFqG;<;#wwoLn&Twz?109&b=}Ur};u&Mn3eDe3^V?q&a!+C?ruRl9v~Rh4Z|j zU?8q#vNw&748JcBhC?GxjxPtjWI0Lkv~q?zY5s!cxei(>PNox7HtGy>sjO1cBbiRX zM<?WvTuQ;JT;_2-BsUnya6(R+FRY1FC&ioR!WW8fpW?)Kjl}n&t^koz9ltl#@w5;7 zoj?kSr22yaC+rCXa~yXV@}+tM+2oxXal*-t-^a)+y-3&zcv8H6PnTdQTaK;>dPazu z=J@%DILT>FR{jEV@+GH{sV~)u_r?3Y#Mj90Wi@>)L8{-$;{P>>Wbm2k_4|D4$THxB zNWd3zO~T6BH%x-OjF1z_@O%H0t}ibuLV8!yPj^B(0qH5hoWcbKlkpVSGQ*dxPwM3} zP_R5))F6Web2z6N!&sA~AZO9<X*n$H6fROP!8x{JX~^Rsqm!w%MHs;%vtW6&U$`hx zFdEN(Pa7vRjINzRjdODgm%AR@MADsHPLI^ura7UcD@yG+&zvg1r(H1Fo4+EHO#Pgk z3{H*{x}w#=Npk#d8X0NFHoOqc<BHHc%CdtKC|r*BqJ4KqX=>OIR~#8)nRF;vo)^uj zBa6V|`#l}goM9mkYvH7%d0M488EFN}O}pb2yUq?ChDyD&lV-D>oltsI5*q3xMSCpS zu!7~;?!XtwEf{UR!sSD*RMt6ymJ>36-5ozm_Mg@1?i9`|h%RCGg3(-W(RBMdYy@{P z`$ocri}Dx9ao>W`DFw^5NF5wHDUu!Auq2Y=<fcTGza2HRCCRx1;I6fk8g$s*ekVQR z^=t7R)*d89Ka#!L>WtVTe(nO=N$fu^g%o$A`BS~x6FyH*C&{Pl+wV&XhS=$TE*#Bd zI=W-{Grghww`3bkFLJT@v%KMWR?e5r{#O<nr+DMrIc)0qZlPd~H;}CO;Yc90s9m<> z>EjJKS&p_&cF@y}^T+k7NHz+%i&D5egUjbXmq(_P>6VhIYc#H9rW4L3DRM00Jk!b3 z9Raa7<V)t7@9AU)r4?|pJ&A1IpqK5Q8T4aCg_#j|Aplo)z|+>}1XAg+zDx#)r+Z-_ z*$J~afn+>`6vrP)cGrV0H!u&&>FMH24r275J5wNq&E@G9;%4R=r})x!8x5oc*)ATx zmcXx5rc;sb%^_F%-hj`?9f~s$@Mi0Z52Si}r3KxbxRom>Zd`n(ML20`UU$MrT$b6r zg#slH!cLO5Y#{9QBm}v0=|P}D>uimp{T{(w?x)ed6B+L5=HA=`+3aJvAOrp{<jdji z70C7lhemXFqBk@mqwL@ihx4jU703?xGNbF@9hMy&Mh;0{&SxMy%&wOg^@n*wSz7%- zUNC<_wl_6Goxx0Z!v!PZFi$B@t=8>o$F<CIlJ$}65ID;zm`pVG)|K027GCmLJx@#5 zDwGyXk=rZc_JM#mbVVA`;)FasoS{6T=s8?l?tXKTzXnU5M-CS{w`ZM&5D|SmQ3xJN zVHKD2XrPm(^TC4@=bV91N;q0Cj}z`Slq^~PlH@c+^RiS~a^-a&qM=mp&RL97b4gme zC4no1F)mZJ?X^=qxw;Ox<tGQVqO7O;soktm{*qK#aAyr`cZV{0{<0lH0cGhLWOMBX ze6HVYo?BAN&d~!Yq(^ZmqFoV+gwsIS(=#&6$weic><xr{+L+<wAUA?;J_NW7r?I`9 z%!1LeXL?i+8fv#bcUUkw<a5^)r|b%>!cP1ECsk)LKFbMZ`y4-K6RBbYo+fM;T~c9J zJzH0wvWRx-a=G{d$*f#TkY_dW2qX6lh4pNTYnkmNyEndU9*4FKv;91;v$^`1jdoM; zpPlVwvEf08)19pqh$P`Ll3ZjTMR=XzY#>!IU0sn-P}xPo*&*H?xU>_UES|r9PcJr< zFFP3GWHA{DnO$};zy^+lJw3dstfI#k@N|xZ{ag#3ecT)ZPS8`UWslCCS%pZBH<TLi z#`j3eUklv3Wn9Y~uTL)vIqYV(oI1Jg+tx5{GI1?)o#aSz8sc1DmMA~ho6A$$Ng<0o z&wzr_!+h@3G0*3hcAl!_L$iAqdj{-X?C{Je7@ez4V3I43q5KsAPb=>b-GS8YmA{la z*t`L*gMxX<PSUPfDV))QdEDZnD4ZvT3RVf6#vz!}VU-K#rE-QbEL`L%T<Gw4^mC;p zI1bO8jQDom5U)oJxsr;!yD;80D+6(I!I%h0angf%E;G`?X*%1;yn*<>`CCHS+1^YZ zU#SvBbk|HEdN$911cxVB8lma%`so^_@<8xO5ac6`J63|@^LjctdAduw{hp4Gw?YrM zN(s^(&a&S(Bp3>~%KtUyLJ386Vo$6DC&L@N%`=k`463#amL<XQJ3M_|?3$(g{VBmB z&o9Qx%g;6JLQCWi@}9|Jx{_?J{+$0j%b3lH#BO>F@}gRK-cVSU`AhX#uqwmLJ(g~! z4)PIrLyh?26S%#wpXEE?I4Q0cyE2p%6{WJudAw{%jaxBDkEoVFI3t*p%O&7T&dA^D z;bkRV(roUrfcJSmc~x<5Aww7_I4?B1QK=K)*#VPybrDk|QMm%>rWW6q)sGJJoR*L* z#SA*`-LVyCHNf3RLcf=5INp6qI`O^m?way+)MOy+=P5%cTbD<I6Xxn-v(q7uB(J^! zXyEn7cj7t^^Kw5#b`tc=c2eAaS_XIUpiV(uuHtZ3B+2h{&tjOX%Jszye==_iG7Nj; zI|j4)evyDc&jFXZ+0scX@<3?KbJ5c?$V*7rO*K2iUA=65-$B(~5*{|%_*`|WDZ-oE zl}B6x7cqw?IK<P<&o$|eoIrg341cQ626`<BYVC8AA|aKM>-C3~Wv(}*AbC7881mrv z^l|)rPokf~E>D5Jbggwy1@@*(iD#*{2kgo_50?e6lRljCy(Z5c`6Jw(7_vu`WfkzW z3~}RA&zs`QkZQoo3!m18Ug3gZjykCs5kE!JapkG*YpRA3Eep>c?v?stN0)bs1aB}^ z&*uc*4qc%h%M83qk?*pZa-wITR72b`1@|KuiGqhVqL7z0b=`z=ue^~Zc(c>|-ZU@U zibVN#Qsj$cf_J#Plf1dQx$wDb)=-_PG+rY4<ZUr7fk%wrQ_F7jeQG0cU*HmaX*vtM z!})oW4f@l`jTfwBz79gY{fN6}g(Eq-QhZ#SxMcbB*Kx7=f|*IA?Bg=gX9oYT=ObNR z!|pZU3l(nhCM87*7DyiEaumYaJKQ<kSBGE{do5dc7gw@#juYRdU`&`BD~sS`g7d`F z%dLXj2k!_8d>eIiyYuNbqTI=j>pnio=MS>2*o>aScOzL`Z`vPzCpm-SxNTa$hmR$U z_St;_&oCd`zZDNBZF6a7x%WlC;|;L?+9Gx>Q-j`|=o#kPBAj&D-P&+|FS+`Cx@q`> z83=;BBJ0+u9#8j#Ag?$2W}Oh^b=>_b-z(@2r8|VDQ9>}4N3M1!74YVxGZEx|z}+jz zDdaOFe~IifR5Nco{NRx}oNwv$gQ>bCgM9xW|Dd*PQ1@GD`}5y&&m0#sH3T!IA8_>J z3FMK)YcXGsc#TZp+Di8%1S4D;q5P#GUy34!QiGn(PAablt_4Fm4`u3P@W@dFz9|Lt z{!cHQ;qwGDLJ|25g@Y;aEt8!5P3iFiyqQ_t@fC#olHN@dg4w~Hv)uck`{3rQSHxZ} zn2RL)y`Gear*klp=3X1Y2=B}a5lQ9#o8$BI-mgKBS1{hr=(1G>etd|8qVM61{NCv0 zNiUjs#Gm2wW~R6+7~%HDD=(W1lT?<_8{dZg&Rax$VlXq?)yeTDGtG;Pp4QxyIo*6g zkKT?#?2~}r<J+({VHTHbKYD}W{hVa<8OUGk_R`2BiD!j7$k53m67L7>KGur9kFN<i zMV2q*gjpwjcVIT##}7u#UU{5_c+hGhFOT<VcP&EB&RM!=@uts*H&Yuq<ZfGXOLpVJ z481Po1e5rpUGS_FvK`7+Cyy<sa~Sd#zROEA9lc7kS@=mRjcw&V9NO`nSdu`BFYHc* zxhm_rKg@Bj*9@7ac@o)ynfhfefejL$Suh8+XrDW5hMQ$DxnNr0KW_)2V2ZBZtYBDW z{@1k|3T6bef_(49Lon05&4nTXuP?rH#J$xp;8lvtBZTv42?b+#_8};koWYB@dr#3F zKEg{HpPWPOB;KB*x2WhZiH!NCwR4u<y?FHN5eoR)Cc_l>WgwEGMQ0-h!+PB4@fk_= z=?)v=r$Nr7!<E9ACAuQ$ft1`L8Qv5<1tJ-~lz^_$2satsS|Q(LsErL89sBqdkzr=G zzFpB_t&<|Dt_n{fzEveeLMeKyW9R6>4ZHzvL)?C}i(QG&(?hQxk&x>ulpXMSGyb#K z{8->7&9{LBzEF7sxhf&7^A+LCg8M{`40mr%kv#Y9Hh)2KIKCq{Z#|~+m+~S){QRZ5 zwdyl}h1=o2MD+ZnVzT?Ci9x{U>8uA0i%?_`-!V-ie#t`oW`KL|j+HwWs9tx}Ep5lj zW1Hu2>AAyRX^~@_-co3(7EC?1d18RKPkwUZ9dJ1@3r1)10~ZPfWBfbkP)*@1Z!%X5 zo#hmmMz*_Vg;I9Sic2`QX+g55lP`Z6x3OcJRwUbRCeeOJX7S?6yZ992*rxaRcEPPL z(a~=_dHI{v%X5FhN#u5rzlw7}M_-r3Am2(jlkC<+evIY!)<kXsxtv*}`!3_nz49P# z-@dk{__D?+Np#Y9gH7Zb<;PAgM&9e4B;7OUq_}bXDcrL3n@5pXe!9HO@krIHrY86; znQf4WlhphzykM%wHOn{0=#R($8SC2tBVwea@-vSf3JmpY1n}`z?RNAOmE+7T-b-AK zEPg8rhgG9~UvV?zMyM|f5^+Ovr&tqjuDf8m=;a}h5#dL9m>sK2Ki0ScZzeBrn(^}L z&CX18f*w|X6?@|U`x5J^)sCMExcaqrS-w0zd5Gx?RU*P9p0sX<AKGK@JN?>67n(a} zbZ+OY_?~)=aw`n!6&6#Sx3EV((qYfEpyO9TA%Ad~5a7kS$oCs0+&$%vz0L*bp0HRK z@0^Wncak;Is_{0@_jIHD@{5ss!uUy?cP~8zcuzo_%>wH8lulkfmSY0G18{rc>7<3s zw%0;+uWS}}K}y7Zt(P=<&LCeL<yOB9@fr4Vzu^w87ku<RZFxUeGCA%Z&Cw4qiMk;r zYHM>wyiQ2#>P=!Rd-Zmh$V0^mc?!4kcI6IqgOd<?c-*Uo*oYqowG(Y<@9(zHOxT(~ zN@Vk%dc~KgHGiDprwVO3)9J*n30ygs(Nk$t(f8Ran$h>Vm|ah9@J^OqTw)U5$haEA zSA6wxw}pI}jyJwFcYIgf8_(sE66<%3=uu!3J$W&;F5gXfne%iCx)%>`_pFg8;CR{+ zHjp09;C($2srzJdJ6fJl2G6Q=e)Ojs3i9Qi8#jIZ`H0UP-f;f&Gf$$I?=0@Rb90X4 zCt!Y2;R{HZ9~U)nKY4Vd#_OJwrkj+$m(t^xSZzQ$xlUGEggp2wk;B(ulwH-#EOstA z@SsV_(w#t09R7&pc6j`79dcQ4uV;N&9_w8B$=sFr`8w&&p`RK1u2SUZro=RF5{kNU z@WRa67yXiod`NN{e}mBtC(X;Rw%kXfTJ9@Kc1?+uSoG%P(bv-djQVm$+&!#$?i<Xc zMR+NO`W>9BMd`cU9@eE|SHu&K8D1RubTe>!oPa>Yy;G(6SanUZ9MKi=@i!`dJ3y4l z{r1Wt`uP46y{RyvYeZk*^}(9*mp*m*Ej5$Jyt=#~=IINiy2$h2QZHLSwZfgVd;vXe z6Zx7qgwJ4d{u;p-_Ufs?R{(x>)kT~Z%#3977DXrE;UTX?d6gf^Zg;;EYozD6N)7S$ z<4H`5aEtrzk%wRW^~KQBOTYc17)jx;sENGlMKbuo!k6vg*Cz$jTN9U&dPxzjek3E9 z&5LTT$H{SjKMdsZMc;krXD%~~;8LRMu;XSM;ZKYRxO1lc|2x2!#1}ihE+zW(P8$2Q zDADKTYX_HA{%BrriOt_ZheVK365l{~&f<AVFT}TVeVNuDhV@%Rn~>Mb<xY}5Uf5DR zEhE|7L3wAAtN(g&Gld>r-Mga7sC3R>I$XcRCi;1^=Y^e<Xg4drdkfbmFQU}v_wj2z zzq_a#Nsr@p%3m~COq>kh@sS$j4KtD7#&|>EZ$9ek_pZbsdqj7-U^=gZ)WVlIUg!Y7 z1w_Ysu1UbA()G-@H$4I<Ay-$ndYRr~zH}AMFSqW8>o~w4<#=cY`HNLn^fzbv0dF$D zEbF8N1Nw!C8;R`PK3}rc9VR2ylEiN#>gun@iTYECzSt*n1Ju_GH|JQ_(=tUr0_Zp9 zY`#WwLA$>l*Gg>JqqZzK+k7$9mn3y4NHIgKh&$%>n7fH;=S$`iew?8bwoiQpbZ@Pk zL%mBT2E*>RzC^w&W;w&z=Rvj+f6PwedC!xIo}b_8m1mB_OP#xx>@&VzA<<o3)eWy1 zW-s#;q_5wb6Zv+eANwFrL*V0UBHwfpLqT?8irvKA8%rlHD-VxD&4u}u-2K&nJ||v= z!CZGUgwf(5$s>UqnYMhy&)4}xz7n_(F}=a_r?}`F9p7AJ3dox827EnKhj#<_*MGV> zyf{e1CI9Sz``C%(Mgn}}Q5AIJ67%PCcjH#Ui#b0pu~LNBdr<zGP|E+K>+Y5#%dY#t z=QW=q@0yGeNJ-=IC}?|PPz4l#0t%=G(ADg^nMeRxKmrLQ8i@o7xN;B2(m2MPv4#;2 zw;48Bl)_Z2-6knYw4>RgFA|`s2){)8N#^%oCo_@N)KnDCT6>?9=VO1Yy}mcz4D#2S z=ir?!A03o*{SKqcKoN_4_uWW~ZiC$X_T&2YyYCNY0>b0J``9SGx%;^e`||Uj;D3*P z^QN_gu`(4YH!Uy$IMV5SjmGnLRFF&f*u4zjCDPPIjz|4CLulgVgM}s3Wv`Lbm%`@e zmN>^jqhFzlu^6>S2p^P^CwGa)>@af<dZr_nI+Oud=RHi?1N!hvS2)NA{_h*ENzGOb zKx45fKDbmol*1J-@fc`#SSeWK74Cm{LIoDBc<{j?uYsj5c|J$lI_uX`_rRQAVh?FA z_l>uh5QqZS46FqNhv{equVZ`hv_sw;q!htF2yFz?p_8rHMv)5lS}mWF24BbP61kRi z7(sAwFe>zx-fXGMq=;=N=MURY&=$OyQL$uN-!#XDj;Wwg4BNM3_7a5iY9=zy7BYIh zurvOPtBj{5ujHG!Ab6gY{q7^5$~(blmBhQ$+Z%tXs^~NuI?9p){hxJasTXzD68%(9 zGn<veqYuF|BWKFDdV=zCxDE*Mr$BT#H(senAA=r2N<nxT+Kv=9I)$c^p?xYAgtpU| zh5etMo3z10#b#%pfeWwp^&NC@&|abl!v+}@+<@-Bm)B*R+UqcccqIzOe8Dl3<Om<I zH1IYL9GN11%<;l%6P7rr)wE#dh9ZKrK%06rxN5H;<+MmkgM&!#OM_#KK5&A_1O4{- zMX$YaOmBZ|0;Hzl8!gP|H21lC|2T(O*9#8rf6%}CXO`fcBjj18a;MYI{jVoKIKBUM zgv2Gw0gef01Ur~abtuL}<Dy!59RwpPAV{n?1qTNK(fltVd%5>$Pmc}oKT9-EjgosQ zY$0)Q=|Xqq<1b<h$`#`uhep4$9<qL<{MV;0qpd;LmZ)EDjLDcOw8E%bDtej)Ht+5w zDdcVSPp+U*aNE%yl`vWWJBSu&X>|I^TyD(RD^bZ2Y}B4b;dnKE6UjsAz^HqmQ_9_L zyBx`uM(6#mVUGxh9}c`tJ7(z3{lF?k!>~lph9I?;#y_?$UiGqiE{#9SxE+6Sn@(b< zq#fb<0{y|=_r}x}%M513*J4_8XfNJeH1n`Z6#aYpm##4_d7}@i+B+jG$lTnehLAZM zhRg`6t2PFg;cT12X7`%-$k3}v>+Cjm>7si*cZcnsMd&aS=>seD+=-p;xyfI@+KD^D z>%wD}NFA7Y*1TE@55n2>^eX*e)KA0N54fzLjMMXfkH|&mu}m9Y2b}n_S0ig29{pbR zOf-q9>i+fzffs2QywGx-eU@?Aitz{G8bbxpTIOKp79qJeor9yoGEvk}h4ihiu+`2n zF$D6oa}X6hY`xnzPBCl*eGJ=?d8>8{Ne-|`1@dU<j6X92f?pW--3H(7TzJQR=l1UB zcRz&ChNLg}Bi#(Xg&cNHu8sWV7=2MCaOA+6(plJUCTwfj%sf2@UNOUXR_3AuQ^(PS z%}}C{oQ=d~+^8!?3@ytS-AL=p?9v#sWh|EQyUZ=e{5voMmoIKvx$25ry1vua@{l@0 zpU{WQdp0cNIw+Ke3m%0Guzb35pP&{%_rps8cGBZQNnU~Gd8LS29-eoir0|Wy^YLeK zEoc{ARVJ90E*=&)5*o3Ix8p*|YtwZuS7xxGFR^1U6YTuyl+OZ3WuRD2`Og>l#~oXE zT9e}Q!4XP%+L=}CAW5y|_{rq3(7jxUG~QZ9u9jbu>`y!NrNQ}cwwCXI_^MO(`6r!s zbXy-~M<QBJI`LQ<fJeiH#WO@2+9!gY1;(%iUX%vyC>SQFV6Q}H75V7}{{#Tj?dn>F z_pR8LCw^e<UYjeyJ|Tu}r|a}F8w+5pKH*~Eeus?(b_+>&7j<rF!S<}y6Jx>AjL(xV zhg`y*#KrAN@0D9cQ+Ei2DIfoZc6btNP1t>RpqJon)OynI?0@KJVb5%Zxn$UY(t4*N z_pho<k|zUJp8&#Ss==#XH{t;NqCfr*3v?9(;gn7(?gQzDk?6FHu0Lusiy9YUh03tf z<D|o+gV09Gh_r?ep^<>*K`6F2PTP!*y$M;ii+nyAov`lbIIs)^qFy@k2}=JetMikX zaB^69);&3E3SSVjox!#^<w!fc2l;Nl(eSTOKgI|J=K6ro9bfr~mCj-39YY3dSvbdv zX@S0gS6r(5ooJcCL#6?`AXpY3VEpEs^p{)GuGF=s*7q}IE73`QbB57wz6^d_mZy>G zybPz~K0xW@5F2UWNyo}RBLgdjtXdrXQJ1B8CBBLpX@z8vgJ!$zo);G0YNd;Ct{^b1 z&FS<NwhL=KfY0lK%zIjXB`z5&Oq<N*7)&0mXSZIJ!snoL`><Os6Kd{0x^%q%o?G`w zT(l}Hy;okpSMHh9nV#}t?~(%tdwb*p73ZVd6Qg#;aO4&hh$Zm~#JIF{5B=}C(Xo1t z1ef71R}9&n7bAAF)C0rA!F98Euk_<H=jnaC2M*Q;l=gbXEHWZj@}xm;{Kn7lQ^U)< zk35pC+5<_FF|{1SOr^bnZYxzCyBG(ISir*;t2<<K1$uER54?X<N<3)&7T*V@#cOYO z4h|zwR<T$7-V}e{y)@9+be$`ujPBs9f#>vj`rbIUwinypY2$mnFK)38L=WrDUg0q{ zhX?4GmJKhk7+*-Df|pQF)sZr9O%4gZw5sCoF}*x%c#Nsc*v-iZwGC#BaGh=Nb#9~$ z_B?8oLKl$Z!kTv-?Tx>PsG+KB7+$m&_xF(|rS92vm|&RqEPV!)6i(8K5^sf}77Jo7 zuUriFdiQ_)z?P{vbE<BN;q0;&sv2U@(#TOj@emFfY;a3k=81ZG^AY9*+B+M6R_A+J zaaEk=aMmgQw?U7iRxb4LAaea=61wW}b+7%BqU-GNcGP~^yN%ASE+kWs-0MfNtGXjk zE-w@83inZurcYKr$i(3ul2!_!Oq;+)<lWTxZ!f=2U+ni@<uV>0){m8u<(mss?f~k{ zAh!(Qvv)Pk=7|ACgG(qBS4NuIF?4ig#NO0xf1PnH)@SO&Z>Yl%N3{iseU6d5wQ`N; zJTTa9?*CNx<hbx`U^!mc8Jz2p*2?&oH|6FL#GQ<o@fWA#FYbScK=|~#pLC9SUs^zY ztHOoB8gO{`lh7XM5W61un#1}Ex4N2!_g}<RzrsO}p5gC4c2{!sKHJ=?1sPuf?r{J$ zLs!edeiL~2^AG8x`_QOXC+$%M>MiV@0oN%w{(ON;i|Mu6M3Lln<rcAuD?P{yK*DVX zVrYh^as9{?dNS(cuTy>A5R+B>K-@%Db%m}5h=ViVIYsv2)E?5|=Hci(1~5n>MXKh4 z<w*ImPf|oqR{6JQ-C1Ry$%WXaXN)a*#OQM2nFt8|Qux;4V4$m-LV1NXZt0D-tide~ z#XB{n#<8ox8*4;^V@GvXgX7US<+Q)$si%9`kMSp%E6xz(pUy708W1a|SI5<JQg}gc zH!Wb0;w;~sK{IdM=xqGSq-Kcj53S_Q`EseR)xWt@m3O*ffmS<ZfJ;wY;rmE|_dmTN z$PhnQsTz9ey6cl}sqeH_cdt8j8i!|quHr__<S+}<>Aad5Xr)_?hJHFs!V2XE;l3Dk zuH2Zg8CE&)72bE!;WZJf_VTUTEPJb6lqt`=%6A?OjySfi;*&U*fQ<|U=`~%CO)?tL z8C6JGaV)C?VI3?X?U+(R2vrQwE!R*Cd+gwZQ<D{Yb%3#G>glctHfqrC($ue7elicj zbKM@+c*ZuIM>t(&Nb#Ns4c8IlZg8a?jNk)Ha47cb;5uBuWR+H=d0N=%_Zsh=)lyTm z*U?W}xC}i6i08lw<UE!?u7l(Xuc>eMkBn2?ia`+=T`@rD;0YY%)hci0S!a#9M_z1V zGFe3&u^>Ra8&{(>cbw}is?mc%i2W*>bv8n?AfM%`>l(e?g}u=ULOv^^&}p+9I-u4n z#b^@*5o|NlIq=J0(RQvH@SPDY_v-jRQj-_cyE^{G!D;vQ{!b|khDc<LP|pAIYFLDC z^*28=vOXC9rLX+*^FQNXel-3o?3Ti3qsfETIKeVWPzVHz4+<pO)wQsTYDx3q{MPpN zT5CRe?Vz*pqDL%4A>c;Q+JU$gM}ZWon0V%l%xj_I-PYPG{HQAr{nrXEJ04xP))LO< zDA?*h5s7C^;#&U|^UxY{7DqD!2=^CtxEoCC_}k5@VyAZ-&VJFoOuh0{2pl6!z0gIO zuFBYR3|SET;Tq>(X7Z_ul~6yaX}k<3g(y>@J<6`Nej;M#e5lvhMv!7(V~t(oUXbN$ z4GYK8v1W|Lw`R@D&6Jxdm5c(S$aS2`dntBrwGQWW)~h(3@cL4TsOyQG7Gfas<qZts z+3(-rKiAIgzQ^FzXR!@yOpCD={rOsSU2F6+2aYDP0?R&?WCK#94awV@+9xp#u9+27 zqrO8tLOzzqRvpp<EJIHz^v^EI3ORAw*~8@ps}6GdQRgTOjH+&wH1Eghs!GEYclObf zo0L5y8t^p&c$^2;Ozp2YJFX2&1Y8qAF#g;XR0Vh6YYftvnQPY(xYlmHfv@2oABE>r zrOO=A2aaenC%)7W$o3hu6CyOUIz5dtUj)=Pb&G;1!U7TPQe>6^@JJCqAbUMWQ3dq6 z*q_CV7^Ef^qi^I)=cKtXfphI0POWzzy`vuKISR0>x0hcJnpg?ttKP7kW<%khc1FzN zSoyixlDhLA#k}g-Y-lR`b7kEn9xsg^2i-z<Nm0bq24}C$%g5^QRG5!}LBsd7dDav@ z+%6`;M5jD8_45OCGzBsX<-#e<vJpLQA>+?ZAn}36(my5Ob}S*Dn<Z=}7*+{S+Hj~( zF++Ld9yJ@v31SndVISN9Q-zk#S7;em8ZNV&oE_YMj6cs3+mL$aNiR7LN(Ot{<4yQl zxzS!e9UL(fvM?|5@pCgis2as`+wbbr!S(HN7N4i1Jwuu7a@2k86DOtB0n44z@#x0U z1b4W9W7+UaB72RQ(fzN_Of_+B4_=Q?CzbO<5MjPu*z6oey}Gb-OAkKKgyTQIxH8P# zdHgqr)M16*egCAhSN5Q%GjuwwpWc5;+A=5CI}BN9_<CkQx4;D%F^H}^)gJ>m;&TQZ z^s=gei2_*fyrOYNNg#|v6+_gyIXP0U9s;6}111apdIB`DBjM$RpR9L!XQNR7*K_Oj zdI#rHPdn+HMhaf{euiPaB+^iCP!8r1p`FAeL>Ds|w{sOc3{79TW-_4XF50bOoeES6 zFpukzquYsHe(H0v-Z^EtZfyMAwQpQ}8a@CZJLfm7{2dd<a){wbG4d4e3(I&KR=KL9 zgHhr=E%<9)S5KNL;+vv}oQ3}9A}b~3!bOA4&1h#%>f@=h;0YcB1Z1Wi2S>vmG#FJu zUhtexg9xKwgJFySFov%27daUPDLQmDSl}>nA@1aN+!1n(HqNzVRihPhaLa9`Fsplr z?bHd^xzre|^Zu$$?M?edhw)j#x7LrfP+p6o#bIRm1SkTnM(Z5G%of0!(hM(DoryZ1 znAp?6ODg63MnGbXL`xNea%y7I&QTkuRUuSCATHIh#?Vb}oKgZ=TkE{>mAd<JP8xrr zr@A3Q6yi0yAcVSFW~R<H{b4shqddrg<E$_1p7Xshird>ghUoQZhI38qV0w!3GSp!L z6AzUKFh1sZ_kSUa>&R7)x@D@%ZOS{NIH<2@4sgaRjO>&ywu%#u(l<s;`vX>R-)EFs zpFpNhteY1=8#6@W8MAJP1~b6+^4WYV({x8S=6U;h=j7;ebarx-!E%JrJZi6w|0?+X z_vkx-Pj4rBqxGI;%qLR+6~Um=&h5hb=Xg<`+rBwQ+0@gJ<4wTcD<1$DQM4DiB9RP^ zf@$d5*Lz`R0)%{N$1bm*6hd@oNPA>%wO2)reWhwwgQSbeS=hYX#@OK`QkW?HI(NZ! zI%h^4fa(MbRo-JrwsNGC3K$}J@uUwvIt{oyWHkWDDC>;x3!Bs)u*Ooo-tX{XZULN- ze8$<}y5gADQFD%@EwC5G4amp|>~{zSfo$N8^N!!^gTvHuqc;bpq<Y<K&T8R=w#?D; zYT`{p3sginS{KnUIo4IDz2DP_vj`}sPstMPb<zJg*$;DlDn4Yp>7BH93{k7_U{ELM zB6U$-<rM!=vt)1@8{#ST*DW=dzIBo-L>gw07%@lf0nqP~ppb#V!U-+mudPO3r3oa= z>0r|4h!RctPsX2u>_$!WbbJQa1<<6f4)g>R+Lt0gEYd0mbI}2lq6>P_FXnj<jZ;?+ zOsxr*Fn8vnlNZ+EIWn#Q6cH!y1lGF8vn6jgit|2zYd0LQ(LGUS>B>?6eEdlwY=WcN z8C98JQ9?IpBB2}Xdi+Uq;cX2DMs}jndKi_fs?fy`0eb7Gw6i>K+b?d0E-Erd_Bl>v z94X7C(wzm~$4PLoaBH3Y3h(QrG3n(*>WyNlnhhy^)G_IiIO;X08L^EqYi1r=ofcxM zzwdr<|MB><`(G=FlnpcSaF5abo49JsL}aTw%l^ZH!2E+ZonO6hJ(&WA;B{X4Jbhvy z>xI!t?8@uj^6t|)W_6uhc&ZniK@{p+Mxlrro6iXl_aT74gYVGthgK}e@CaK4URqJw zlmo$ULyoRHhCg*nuy8s2QK~k6h}f#QU$0xBi^k&7j|az|ePd?zJDn5O&h?vmn;VUR z(dE#wj`d<>aKlm~7Tv%p8;I@;nXfHAhbm!R5G-w9T)d%|ouka3yN{yK1J3#I-+dHJ zyuy6z5luumUljF#ixoYoZ-7s1lI#EV-<}=**MG}1sI~rgANQ#fDH1PQ8}BT#KUohp z-kJIPY;@X-{BN{ZqG6QccGqnXBbhr$6_yy&3ZY$V;0T-M+x&uJ62}s3qh}GJRSEt~ zKZXA<)ZlNfcphdcb<d@V0JeLQPZVO6XfD|ve_|O!?48~*i^vGU&bzTVz}}mlgv1W1 z>P6VZ4GhgEj=B8ss218FR>#ZKFd{gHVcqETaAo5kkAj`_&g-`L9z`wyor7!ck_~>! zKBL(>eQZasB9b>EHQ%t{<|zy(mq&p@0S*fuvEif~_6y7t5-m<6UnbK0Xj+a2K#3;4 zOf*o$P)$?`8=dp>o@2Fd__O@*;;Ld)H%#B>-pG0$bk`RJW7W);U4^Jui{ADI%Htp3 zph(o-$-poxF6?wp7^;@z0&x0O`?srplEB*yl)x<ANV=KcacjexVJY4qMrxhze!9ic z1zoB%N5WhzP7m1R!_2a2eH0lkOj-%hnvxGB>@lirbP;SvTuE+xfwA7O_R+}FSfpWc zbH{700H*dv_oj-sN7jobB4C3$jSbjEy-pcUCNiEusmj3QZ8U*1+B6-ogNrunU$`~K zS<ET#pZ3-}^p}TG*ltkfUzvvSikPTFRGr^_l!i7j>a(&QZ5U1&JJtn6CV(<9Nc6GS zd9$iEghXLJ+^SK$I~hLFclSsN=Nh(mTH_nbO}v}5X1F6~bZH~-=k3l*d%jVv*&FV$ z@@)VK;54ZCdkis)%u>wf8@xj5Jue%Q9syh(!q^X-BJ@C|nBTA<B$!cPP!d&aG|M@` zy%wH_NYbgFmIw3L$`6jYV*8xd2JVON+QuMnJs=`)NH5}WxWHu!_fVH`fJ@)-PKeej zQb-l@Gj`Dh86dFWm7b(343;7q@w?n$y^KC2SbUHld}Wjm+5b|1I8}}Wj|N-idHa!m zgD||79W<B)1{h#wHmL9>L<6=x{w(AJR_+`@^AeYN-Kn`@BW(C#n{t)UzmqAE2a!gk zAn}<wVlj)#nUgmuhkQ_uvJV0*gi$Gp$R({Eqa6dORZz$nTQ&wF5%YH9ze9ir<|a2C zp3<52Dbd1Ol8hb?#`pmdML_zwT3cZimJEtYx7b2RBM;ob#%P}=Y-7Y@^I@EGYp)2% zjkp<N3pPd{<{A+a0pZCvMqbmajb2OVfL{CD5lv1`gcIB#dbx~Jabx_WxF@;?cd?3B z`+nMH{O998r=6TCe<$T=E;bnDbOvS%)`wM9JTzMyVGl0njD9Li(TCW{jr;E%cC;HK z8Xr}>QfnhoYz!j5d2`l!*5RCrRS3i!6>`)$(aCD)IP}&tqNLXgxTs|SW`UmN{!wJz zo;8%>h1lF~W3EmK&))!JQfR^%$>_iZP33Jsg4MZx5`$#!qT*B6#iisWwX2L)F%RSw zI29B3@=oj{de<6KIP$3~J{He93|KoB41pe}Rif2gK+EDwS7rA5`YNB<!58>JW(`36 z8r*+|lbnx%eMTvh-#I>Lk`?pZ<9O%-_iw1CPhclm6a$$k%2APaBg(zGx?W?za!r&< z09u`w=*vft%lgF^1V$+mc!?PTji_Ow*n+3Q32Lyqq<%jj-=3$62h0St-=qD_k27+x zA^3vN3ce!MrW{3j;HB|f2<7ic1`7>zMz(V*D{cd7>4NHkYGwnu?mf}CJ9Bt=B&|m0 z{?j&1(akV@fe(#T7la(bv$FYV(;{gYpPA7i2*8*QJSod=uy7oK#D##%=-nY0_=2NX zdMp)uKOA}IRy7k;Y9*e_7gb&9b*g~&rjGhH35$ZB9gY92E^IzD3gy%v@<j+F%jYGC z&Ick^(iHq{l2jx}Ic`8|e6ZwJ*oCsO7eY3}Fc~C$#rhIQF)dBeSVNiW%xhTzGKAtP zT@)Ug7QB$Mp_(Wu%0!wvo9VMdCE=Abdx`=D^kqw_at)Xvm3>~A8Le7@jwgd)NcB;z z-mU;O%iVn4vL*7ZiumNEqE=h*!{purWkPzKFKuoulIKXQ#N}nWVn}U80DOj;#4S3n zUp!x0WUdNFi|D6{HU}#lEEAT@h3p1t#upoSoIQvds-`%CFF{M*U2H~<mJFbRV2V5t zRjOM=D#n7IkO^>9Q|eY%5z7#M0TY_7gY}&9AkWCk<zzgSil24v|93n{vvNFZG7fpv zUQInKZnc19U_PKR&p!*<Jl5aka`223jIT5v)OaZBg&#Rwcrn0O#J|A3x(8Rhl>&=^ z$>HIraUgpJy{Ku>J<gDsxUVr?Wzhk;CtV92g!!i`7+kqisKEkI^MOS-9i%K#yok~m z$Z`c35VV|GIcXB=K#~uXaYdE`i#msou$`&GP(JJ4{b{tsk+vV0o@bR3z|XLoA*fV* z@y{q^&|y$ZX3F+f99s28@1U5mj5J(Halq=hY!BJ&M_4nZ#2Nt^Iz|Fy;>`@bJeFjv zW<)Q|HDmssr8}wEurkkjq{6HFUx$T=KYH|-?Ret*+z5R+V9kJB%X^N(+*Iqu4Fqe? z>m?7(lE(3^Lkdxl)(#`Qzwg}=JNHmE4Ht3E;op5c{)tp~C`Qld8%6|wh8GPN0!sE2 zt;$rPldAAI-MjBWB@bh|dg}p`s)q+8ky*VORY8A0Kf?52Vj;u)kEj$p3KxiVBONPl zfetO;maGH0#pIf3+;-_B$l9%E6n3-%Qh{`%o@hOb@0?%Ky`{AVN5(oQi`4;l_>@jh zsa|v97zvch?pYi!9ggH^v1SM5eSxzT7mos@sf~*apYW(5f*F0t(EcFC<BTo^N{$A` zRUsAJ;Iw3z*?v3P%i!HZ76m??(8F*wVD8SjZTxeh3nwZ{D`nA%qt`XagY#;wCW(h# zeHi^jTU=MNwB=%+ahBP7FHuqG8vAV3bAHT<FezQ>{02o!sdfs#?X-;_f=|@y&jxsB zO*Jt=J{z3Z6RaGy(#9$m$zeuYQekwqr=cA2eN{1_FTH&*BvfrU$RGx)V>!q|_P8>o zwdg>?vKgd=#sCu`ua{6XU^0gX!;`F?24Ni<RKuUq-lkS?Qr)G=sq&0A&jkBGH;wk3 zr{yC823}EhCteP&McELO43lt{M^}L4vjO_Mur={fQp!u*_Aco4o}KqH9MAEvW?>jH zj$2vTX_*}{EX1N`m!*b!hGh@G3=%p!CrKa53@7QSssl-6o{dhJCei}9^K?_<J@XJQ zE=7Zm3ym<Y>UCb3qWknJ)EaVj_)Z~F_$UL>5Fhpko5i0_*o21O?NC=|jEpXBM;`(d zIR}|XiMoC^y8B_K%7_*388?&+1z+HWqA82D#4NiNGO3>XOtkP~Nf{5Lg$XwPq##zg zVAF`>|BR6y9Ja*-3~^npXLlbR`1+56^yf8?$`||`9~Lo*&+>NWx2C!K{>6}pIdfom zcK3rmuOf3<%B2fU^56fdTzDTYJi%E|gKu^^Sg}oOxAhh1<F7Ui_KO^`WSf$VrRyL@ z&Y%Dmq!;9dEv{!tg&RtHv`b0JyxBRfH`%mm(R9!=Q3$I&Vb~JdTZs7_DHa~n%%&y# zWLkJ`1*Kh|oO-UiA4=PuOE$Y<v<Z{*J8a>3x4O?xPi$i7RqXic%xlLaL*48&f>#oS zz%vr_t5ecS9<0|Il{GYa7@&Sr-!HnF445b8Cua%Cn|RBmh{tq9oXTDa6)~L}*@W^F zdS%pall`#{mY~hB5IInu1_<22h8G&ET~yquhS#+{lr9z3Kv~ZZ>xmaPxvMOuxI1ii zlh$z-Aoun7>$XEDhI=>P_}vR9X%gJPB~Fh{_zcY@;Mt7cb=a8_HpKytxy{b&%qbv> zGHer6#?^cccD(u+nJ^zWyPZ?fI-6x#bmYEa$=K|^y5u&R>$@!DJvJAjbw9Te1yRun z5F}}SU7XfTm&HwfWN5X~GxN;dOp4D<ik`W|xtkoViCm`JW>+-Y_{XtsY%;}|aDYYL zaiTPC!ljT9{>lb};Hg!tOQUv5X$`g2&vk|$$B<8Fs-Jah+6FD&w*9_!Gxxo&n5rNc zO&X}iX1AM&E_JUEf#P(EEuy>4%A!%b*G6u@#m(>eLQ1S|T~WDMH;u23wW$?^98l|S z@B_gJsk}TlbRf<pYs9AZ?MjYR{?(g@M_>NxPofgqJT%m_10_8b@+U!9o;Ufn?R6I< zFG^7QCi7;#&{F7>0Mblva*>wNJi5(SgcTD+;D)_KwL~0<FJx01|1zTE1+}QDCV#oN z>EREN&CQ-+){|&zv)88~GEMV@np%eSYl>O^f46+ECob1XxznyBKQ4n#^ZxKWN*0gI zkEm3+0i4`4c^x-<@}#RpqzwtTF|aC^lmQwkRe!vrzM@(|?oRod`!`vIr>pcPO#+9e z@Q6@rfcysDeGm;prmw+=+eoy-DTfEGp9-euIz<Im9t@i}gM)=fQQ0t)HzjVI%{Yo8 zF1bV&maWW%toN>RBUM7pCY4jhH`TM>@ks1RBI=q~Mw=!dT)Z0e^$q{e&?28>=1-1c z!=txzBE8^*9?5Z%mt}%CSy?89X-HyIe8fIB`3W|uQMxr}mZr^;+m#sE)EA#mP5Yp^ zoz&0rx-{jAP-)PO&Kc=?GT-X;{+{2@l210j$!x+wG#`4@F0r*a^AOKi<!Y<u6AFz4 zRwqnx4CCBWXJ;UK|LCI4c#%+-%$U4Z>QUOsGgBh2N3A&%N@kZuf^cFk;QSj8_m~pj z={=kH$k}gqO`d3`4ZmD5?fOf}H0bgliq{4~dwQ|J*IYjSS(D4R-A%&NjM|4Pe#%W1 zhB|KFhz&WpL8r}N#{jIe6H$7GVoI<Od2k{2v#@^o_(|2{4st;=Rb!4db%iWO^R-Dv z;Gl?}H#j?Ls_JE~NbzV_DtOIIJ<B$+R#`MG?Gj`K&=!O7PT>f;IYPGE%ZZ$u;uCMj z=FCoo&`r<1=-uv{>~-a!-55wVDWTJeR9u_1WweVSny@}k1ZJ~MY}u8#fz464=uNDi zb}fM;_n9jh7R6b-RoD1YZQA@Hb_g(>7)4t!jNhjGrJj2eTZg%HBRsNuc*Dg6)3|wC zPWO!IA-s||Nc|1|qDddIiS4_Wv48XK(>aZW(&@$h_ikI8JlKdd;rX^iRA~Aw<71xs zZtYFTbmUA_Ku>M$pOtU&mJZ@a8y(lyK`cuE23coq3D)OZI$`D))-d`cpJ{O;zO2(i zhJTXftH5YXRVrI-jjgRCAJ2~LzDIPYTN2M4w6=mpFx-mnbL&JuVdS<>$ler`Tcr57 z>$JA$M$PWo{S5gy5pDGa+noZ5irAmRnMG@h4q@xGa}*YH>r@XB#kT6z5kN8Ntt}GI z!V6~XP(!41>l~BgNZC*-+pVeAXG=r0ayaZ}O+SH`Pza2IGw%8py@;^`Le$+SlsU($ ztSC2+l;}xvx2eHui;q4}f~{x}w<O(jK`HaLIJf$%+n9;go1CGk$b8xw9#a``7Krlc ztM;cYp8c*s`g@E`TbbYz4NNjDZY8j8t8$WUT^f@(7JfyKkF4%nm$Fk6wU3juYikts zlH<i8-YoDI(X)tb3AUfOa%@SU<2zLy2;WbZ(Zocz-%i}2ipyv|Zd5&$<HB<yozcA| z6K4`1bK`=ahPFOpDiSNBC|h?fN%+SxueW|{>-9st#g<Xh+9FbJ#o2Q{bK%zA4>>_R z@9b&+=Ugu?a*Vq8d4$A6;6$JY0V>GdrzeH+QnQLb_chnP2dp$1g(SjO1>Hq%(Lc3G z$i&<Axz)lQQ!R0+d@%`)A1a-7xCI3gOCkdVHC-I(H;n5%L8tLE%*#dOc}`b7IZnt) zqRLg1*)%<kebDemf+&K<CopjQ85sm({Kd2}#by&g1-91F6mqN|SDJZ+x<!TBpxT|f zEDqYwad$;~AeZ`FMV6TeQJ5=*5RE`1q?n)Q8c$iQTaJP*jjD<A|G5PG*)F5ssc`GO z;7w#^k+fVMytXj9lh*U_i$s<*UiT=zKi(o*W5J%_5ufB!u?o*g1|%LgK|=ZqvZ@p+ z8(C`3hBsnH;%@((!Y((BqNPgls8iG}T>EqD%4GuJQoIbs(pi+tIU!ePeu7;dQ0crE z56}Fd(Vv4g`@l<;7+RKrQdc%1oXoZm?k&LGpUiki(kk+lm(2jI0fU*u6v{VkJT|!1 z36|X;;xB99?3t%C)MD{GNyvy(;H4%UF%`gx!EGOJh$Z1$@AZtVJm+`Revp6{Z$^1y zJtYoac+?YSB%vyQoiuS7{72)@_3@X#`d))pK+E%9OoJH%95^!y^9~u-up~%A4<MK0 z9|62U>w5_Om9ynJWX^5-c}*ZRaF7-bt$!|_H^(c4hVHG%`}@7V?A5v=1JVR?e-wr< zWZ<Orsp+!Qhl)S}=9N}(T7DhGU=hS#zv4M3T31=5Q!n-0$HTHb@86iQnBV99+wT4U zxp3T@p%YR$IWbHM$jMa?`ncx<@w~;`z)m_B=X{GTr3&72igl0T60I)0#Dg%Q0t1z= z9vm3$mw5ABHT80Zot;}ZDi?M834V{hz6xFP#f8;50myNcE9{0hl>p23Lnvp?+dCxp zXIvO0Sd(T*di>MW&>X(?E-EH3oN1j1M0x^pT!QRNW3Ylc9yDkf?He=^Cjv3^W*3*) z0AW8?m=sK8OMjvIuKA^5?aZK!$!pNzr18~CS7E}rz}Pqr)h1e93>J2zysJc3%FP(G z1P(I@5!w#r$n(Lq?LD4bJ=ry^h0$9#7S{)}glK1@RXmCJ2}(~{o(@&u6hKC!h>E1< zLnQd`EMP*5<7!HDtmhV|6lx8jpz(tEJzv3z<f#3kC&u3JpylR>8hF5xQx(0tFJ^8n z>LZy%&AeJ}*D81?;cy`w!Mkyl51yp*bEAx8jU#>Fdu$$};;kDC>N@vJBvL;P7L3Zs zzVo&jC(R`5GIiv^ghJ#OD!EK0wV%Q*_GfO0R`~TBX$PItF?T;W4h4?=)~^;Sv~yvS zK#c0pmK^zH9=CQj@lBWV-91NZ!#h5wrNzX@ulxC^OWY2~SjYsP6}A(2{G7HS?TZH= zwNaE>ugx9nj7nyXy?|U7_RWaa{n5kG6hdyY(kxXXp@(SGg$I8b7texF7p5+MS##p7 z=q8>aHATvwSSnKbjBXP68w*RFred{2(cJz}&+k5xdr<pyW}NBsxTW$4nraT7-+f^n zy8q*cp&;+Dc5FS54=F{@Y3tpLQ5J(uPkYx=oWqB`>`(MAQ|*WGx$uGSio1E&qFKi) zE)uPGySDqGm1vxnHQc);xY40iQVb=`&AS5*E|zSFC(#J>TJLH)`oeePkeI_kY{u{E z8w(g<9Mrsp5<xN-Q+r9|H4k-36)}oxEeCiskg%S65eqm672=Vd_V%C(hFV~hQ12qS z-Vzim8Kp_mHP1?$X^qJl8mK?ZOE%X<*E1{ZUdZm;dbdKuZ9CA~rct?Uj&05lMpf0Y zxsyg0;&57?r`w5eH6jCJN&(G4yh>RJtDXtt{!LB{tQz68w>w-691jm?S^rY<Ex_>} z_9_rBhiBc!GS|@;=I$(GrDNZ=zMi!8F>1MOBoPjBOPs)I1d?De@PctC$S)D!L*Tq$ z;|@}n;T<2w)wZ60xM{;N)XUg-!`<?FX3lI_ZYPoxaRuoRbq)9OI7)R-RoxJg0-C4Z za(_Kgw3i>JXC!KyJ-pK1=UTs+4()B0@Q>xz>W6+d_mFQSy}R8#ASK8b9c&*z7&hy1 zmgE{)D#;mMrkgzj=ui4Ip2qK_+@wKDsmC#6K0{|5X%ASa>e8>Cq$6G&|AY>3*!+|M zhei7$hWiM*m3VW9=Bvlm&K2a4v<EJ;#FOp$bXW?Nv_G%?h%gtOvAQ(F3mKl!S;fgV zDpEt8N0Yss7(PeqpC}Sai)}u-^*a>7-dEYc0wsuBz;+aNX^DmB<my{x*48OuZZ=P9 zZ6{=Ao87_JvMoj|ot7%)hNhjIY>HF8Uh{Rmz2a0|5;*TihtMA3+zuuRXswX;5)U~~ zqm(n^nvFboCG)=UwmiDBf=8A3c3r$MQsauJxDt$?qS;O#oVR8+$T6-Q1*$~f8W*uq zdz<TPd|tQpLvAAv(RQ+;)-kSLg~V+rK{5)=GvOF!?ZukXj4DW6C%4OO-wL>6fvFy- zit^Oi9`xGFo;AP8-}d0-X1~J)F?qLgNIWZumi=|)37D`cepTDj!pym<Zd++%blM&e zn*<)^H$%4w%y>I#EY=EEzsSC@c<pT?G8uswmriDvq}y{2?b{=yMkEi&rFOPzY|~67 zc37{BWEplm)gs<G*>qERc0e=qz$k3TRb!jVJ0oxupHWkKbXCtE-NgL5ok)e&_RT&a z;>rji2b~FQ5O8VSq2iV!c9#Y<ZQ4&0ShYR=kH7s`WBK{r_iy>4xWfc_AT{wuY;E6v zdMrxjfdcKIIUTn19X1P&UY$bfz0_Q03EDx%>u{7K(^-JwAJxiEXJ6+EEcuW=A*C`d zOyGje0+D^ye5`h2S<NAYD3I(+^no&wILcYZ?7=_rdR91lz)CrOV4u3$2&TFEvES1| z_|~Q@3n;}^gD;1Cl;?X>u5?M$3!4Ioo?@WPACn(V>Q}tsM0wl%c$Ltrzna3+nwfLB zfbX+n;ieam6XsCE;hcCCE6aSX#9z{zJyZ?5=V{)wg5WLAS`FTC_7i-xe>1HnCQi_2 z^zjeq^a8aq#b@c5o<m<~P$wm70z%UCccm$4o)PqS-?*uj`NBxf7K_unr1j?U-)&N2 zv3$#uYiuWZism#=Y6@-s!;`_5PoGrsCE|26r6hH|#3b|rJZ!tClW(ND;Huo*jhVN^ zvF1{;uhuRXskrNfY&0iANhWw$(oX~{R5K<Ize~uAm^-k{+_6$Cq{;f7{X@Gp&5?uD zxff0(*ldnfVcz_o3hIwsbugO0jItwhuK$YeAb@NacsTwA&hD6BR!Sjb0LCfDx}Kss zh1+<l1;OXVCUI8jL<*xnDl5f@p)D|1jsl}$1V)!_f)ZzdNx|nfADS~<dJj($_*^Gn zJBlGUDT%Vb=VvHnv1-}jAWL?(ud}X(nCHrJ+Zq3Y|6LU&z{8i)uoamiBj!~n1Z#>c zY*Z?X@-#}_M$@GYVzxJ;WzOhfDJ$v@e97WVlv+9}#BhdXspA|?Pxe`JsTN{KCivx& z7v#<8M&NQ8kdrI@As-4A0%}lq2y06LtKeioPvs~kSjfp`dnM5;X*~rR)2N%8zDOD; zwa6Nwu~6Q-skua?`@Qjx@^%~JzY0s0S_;di;bOrQu()Sso}5UtqHMFGsN?AwXzs)4 zf%eHD*xYG(LZNckC(}yn-t-PHDsZH^xGaqIGyR&Lp735%q@A^V{Fydx9vapqk9-`# zWOh-)g_c9ts`<%{leE0KlIYdmm6L^F->(TTW};1e^lQsT{JnylcH+t(OmkVff?ZP) zg7WXz$J5``Y7vW`di-1rPf-Rd3^fsWDOYhd+~p{PB-hb+)$zRZ4xM<OVehD<#F?$z zSia<lKS5E_MJeQml|d<>o<9C5K53^@n`ZL2thkQW4mz6W1Fv2kWmAqS7(Luavr(io z$mDhJaDfpyj$3v9`bJ}RU(rhj#Qkk*3#)`mAz+PtrYSb`YKiX9=yZ#Qnw38@tDHv3 zkj}D%mj{cRoC!?v)zHjXG#G)k09QsOqGz7WiJCqD3<Dc4znw6a4%znv7=K=qm@Wjp z$Ed5rC;m>(hgt2M<D9zkcm<2s-Qj^6ZfEBe5qT$VH_MKpwAa;e^gELz6!SGrB8t>p z6N5l6?m$F2oJi6snyzLtRx5@1JDX*f5#I>iubM=yu=3aii}9MQFB&-hXgQ*znu3_v zm;+%994uqGd+)ZASnk-g@gNxvcaDfK!wQSrp@+{XIJ$|KeLLEK4<p-8)$Kb*8P7Q$ zPhqy`cV)lLLc@{WXs|G2;o6OIK*@rca|fakOtHniN^?0WpWy;Mx=z~uJnT;JwO4t? zV6tBj9SfBms`(x&Vca|=%}y9UN7O7c2b_<y-RbqP`#YSB<IoMB2!Pwk+tiO}>tmAM zL6!P~w?G+t9phk8cf$r}y3i?TLr1HAmh|PQIWBvlvMD~pW}=S@=N69ZL<E#ZvA&t% z`ZxpIeBO^JALJNqI1bjRTOb4SxQbyyr)^QjBhw&;&+FElW|Ygl4PnQdzx(($Dd2Z{ zcW>_A^hD^jc8<sYKK4LuSQI3C5}=2OkcuAXMS!C7U~Y9k2@}8?F*SE;;>1P(1P8~c zws-nvdH|G;vxX#tcvFo2Z<eEJS|wz0K>DO$*fCkP&4aYCW3%vD@CW-cKA?B<EY6ZP z*%#>>tsSJA@Dr8Dj-WM4Dj;oHIm)jJhH)TklYY%(HercQ3o;*Zuuwy1O^ls+Z9v$G z9S4U<2YD+N*@iQy`=1f8QXZm`SxtlSH-XgQoT{d(&-IkbTJCZT!{fqwRW=AcKs7pu zWtLCYNqZ6Bp{uwv<WPh%raP1|ZcVCi>j7*7b(}cHOz_4rW>PTZ2)We^E`P|~-JG6z z$4rW(LVBvaTrQqC%QS^@mYJY4r<kVv)%2xJ?S{!R^^a+4X5KGNvAkajZM<CyZTwrB z7oY=Nh-o0pR$d6%ogqe(8BCQk<&CSo>YBDV&`B=u>Cf6t{OPP1#ZA-L6Hk>ob6xU- zbvEg%-$#wzQ}TKyqQL?&KdP{==&kWhpY+Q*(AuF_*WDB_59+$q@e$e65_5JYwWkkS zvYpFswo9t=Fxxpl7?73D!bo=MT;X&qFL56kZ&7%*`LP;Fjg4i;(wgMU5r4R&<3g>y zmxJv889ElsGMl#CO-2nBC*3M(!#Z!EKB#|pj2L`>O+%<P%P(9h#n^1NU$R41wXpt- z;>(M>?>2jI?8pvgnP~DP>|BojBaWuc_02D&)%v|Q7rrD*?zHhs@fWf?`Q3MIZ>Vc8 z>75VWP64$eFK*4q?9V$VU61y|-Pr7qOY3Lhg+~W=_T!Bfq;W>u8EH&z5IdqZ5H?#X zQFG9KMiu0*!x5<pg%H=`A~UUThqKWB4;7fqWY(HpkTSvDr%!G*iDFaCa<|U$U~<E} zQyAg8wn1jso_?4OO7dL#{D!(Cvr~zCbZ#M^tSR)RkqL`Aw8(JJ#a;F%x-PNlvzo-I zr<`{u`XO7{m)PNT6q-@f?=ZAx@Q<c$R}(Z*8#`AW&h(UP8A13VjQGLtBs|-(smp|8 zhxPPsMG2;wCo{p4x5$n?*gEp6><D7|P&-@Ruq&;dn*$zZ%}BjrNcCpf6GrZi9ZCxE zB67TQ;z-hxL_>DH#VxN}{YRBEWb2A-ILV#`V(v`&uytILqy%`?#a~=h#-wTJS(`pP z&P#aCsA?yyxi3xWNkno3DL5J0Ag7+CLmalp-@l;U&&bNTshAZ!8UT$LbShFs>&SCI z@?END!WBm|ZbSya_>&}<07Cfj+4AM?WM=q6Z8QGGzL2@Q@21ViUmQu$V}`eO<oUMe z_s-q-kLT81NhabuCCjrR%g>4o&^S}=+<!_R<@(>eAu<}5m6`S;ySwkofzjz+fqR|! zPk>m9I(7o&GX&TabICpy$B|D5)_MF3_`$K3G4^eSkpO^Q3M*7&m%Wik$ZjW0n>U9L zaRXu*1};0_+9lDF*i&dO$#YIfJCxCoay{RT(m<&{oKcruSCA6Vt6mq2?1(O2b>lp_ z+d;_8jJLJ{P{Ep0!Pij4sg9i01G^Usi{XOmE2@aU;qmT9i;^k~_PgVs;$B>eF{9kE zox^S?VGmaCAQ#~WAve)5?sm>`eY@s2AuwP+>uV5FRDKAth6b{^<1k>aaJgT7U)gwg zbRX3tDru(cs8@1%9&&LOwap4zAAwByf}tm$(;yKpYqV`<OKh5WC!)NqH+gLWt0)hv zR8%Ki3aovDpRY27QQh@Yyys=-?OoS*JJ&r8j4|BBzqfXokFjLC-J^<+*v<Yp2OT>` z>_+NpGLQx>U*1$^4J&)f`xmbDB1RG}CWC}a#-&${@d6K%n>M?{>>`icn1G_IXSs$C zOpfu<BU^@zfj#&T7&J~=Ld2}4F^C8rtebG9R3f|75jn)1zuSGCu|$5dr3;IxZxU8b zRgoZv5Y?p3`bE`7AGE+fn;5lA3bNy1VAAVz<Bn~$AlA)LKDvop;V!300!mp48+`L{ zbdzMON?#zv$p{{|l}|hE-0CmS7FL-I|4VBZA7}@7;*Mt}4Yzj}vSd1c3fYfEayRO` zn1$@loQ>mD;M0@yI6ui2asawBdKJhk&9pXe(rLA|n~@AN9>=*QN2|6itob$Mvhb<9 zWCP3yUK@I40o;uv`<9I=eP{31QVno^4^8NO`73m%NlUxi@4Vg*i@i$;Nt4vt9hkGj zx(-)Miy{VVH$m0Z_`7xlKk8DC?ux*3!@+d#1DNG#S3n=i31|a%1Tz%}l8@)U$#!N< zA%y2n$yl(TP?cT7$*?{TW(dtm-Miw=@)JiNkHJVgVzy~#cG*Ep(!e7gJ9!r?AqJ-Q zi&MCCxk?-z9oO#Qimr+GLHB}7gs=pv=v{lS)!W_1;dmDbh?yBI#w|!jxg%ToZTyJf zVJHLnCk7Cd+aI_rsZW|BdRjm7KK!+qb#tP-7w=*aMT(LU=JAQ?xMm1~q>%^67k$&> zfq;dk&PNujW^B#E3)CPqIm6#Noz=in(G;GUqMfq;U>pePJ}h%(UQk`8S}<gyEk~wZ z-{=K*DKzKYKz1{|$tJrOHoaht406e812Qo>j(=oXWFX(YAfi#g><%+5eYUjAouMTK zX6!qjAYxNKb9dCo|EWxx$5W7#TCRx!Sws_`FPhMl_Zdk8v%v@*LQv|WUB1iJ-=w>S zH&>;{^VrPL_Pgl0!uU-sh^3{=5R`=nQ<JwHf8v4pE_}Z9E}ulnJY6~<zx06u*Q|06 zlIkul7E_vUl*r;TiJacE;C3BN5EE#Kro1P4XPbeX>dbm$e7wg7orAz6g~&CIt_gKg zLH6Nu^GW4AjZk^_gVuY;yyV{NqZ7wK)Q_$An!WnoJ3Wob``yls(Bre#dk8}mH}C0S zE&{}dye(h<!G)=Q*_T~$nsH@V7u~ep%U+7@=_WU`ycA7!NrDY3BE~z^#m&;&;MR6d zFAI~)kr>(xZlO)N#J=~;v-jw4OIQEikZ6!i3R*Hj963ahHTm#MX@KMqevdltBHDU6 zeR72o;ZOaQSEiu#7WY4-FnuBU{=#6vE-#U)UkC-fb>x_Djtzocj*txS{*M{7XI6+8 zsJ<cig43qm2IK2pXg9h@J)z(p1rS>cii)^K)GsKBro&aWAY}yXAXjLbIu`kEb}p{6 zm#-6gHwt20OC!)bd5YfGN%rPu%O;i7EFwl;;5=R!BmO!kcVFNEXZ%vC?tg8}yzNw_ z+H}tkkh~Y>mOuSfuRkP<DUbHWP398ra}K20Ty@oXM;mqb<q$-659hwGOW=CTm-$6l z0CXzQPt8Jl9nO83bybQ(U`fSIanQ!5pbMI?9IW%pv*hs!NWw7ia#+c4XV|QDwaxxS z=f6fNZY#V=18(#?_JMifJYVFz2HKA{+K{q0SlFV&vr?%<Bup*{OZa7AblU*;ykk&s zl5IDBW(^JAM5F}0Jul<Hi|$n;)V_!sFf9LLYjxs6UKreM9Tk%7hB2)m^`PWr1+}BD zna|haWY(ITJ)os@L?tJi69B`zPv<BK558z+lfgXN%YLw9+B)lG)vC7FYX%M)P8xrK z1)#-}p+`EbdPdAumsuo}ypNg;<(^j&zA)nTczjUOm&k;52;>+xKf0CQ8g_ybPLq8g zAw8{xD4g0fAzX1<x6ktQY3qeVQh3J~+$Q;%0&+-%OL#GeDNlL{EN`ttQ0|;x&EflE zFtjCS>xHEv>p);UTflQJE2Uh6^EOr$Pgal}J83mvBoR{5ZSuOrTu0;b))z~8)U?$N zcOmQ4i}8<Zsd+K}n<lCKi@T339#?aN|L&8sBT}LT<3*wIN8WF}FDG5c0DeFD^&BVR zA&{wNDwW+v?+(jCEIfk_IqdxtbW(Gu7^(|I{7&Oin>Kx4Cl9YNwMRh@4@OK!9C2#l zRFS@ZpMZ|;0jItD|0AD!+TrR*ztl~ohAM!>N9I?PXwgPj|9)7JX}vBF+uow~vSawI zSri4>^mM(9111~W<vkmGs@|(&ZN}c5`O4;hb-FBwZ2@ZGpQ=VeuG;*s3L;38pWu=d z*_?e&ZL0<HpvjJYh0g|cO7n3sDMvv#f$c@kukEjAcdnS}zwuB%(}+&5{7TT=w3@Sm zCT#9Hw_)J4=0V9gtuc!%-w#^}yr7iMIT6+Az+gyp*6G4^ajD$j?^e`E>wO)Q4KLmo z!6xDDB$tblZ_4uJDA56jUO@n47y}1Cww{D_OvO?dy6xX{!3OKs|IcqZrm`uxWqx=$ z855)lD(sTpq>rM><2-Cs^o%6kp8WVp6wrEqK(MQ5y!Wy1Qg9}<F7&GWh!Ucx^x<G| z(~FUqY0EtZ2yi}s@+7@)CJZi7ocC{PAJf+RQU~098s6p0|NIv;V;^0%zSFS}57PFX zP7le){iERUAtzdeGkEfa#aZ+_@*o=ft?zWNPZD(Z9X}M(4?(Y)@+0jZDv-G#?e}i* zinEyA@5IIK@S#YEiNDWxz^mLICY{A;>pMwtmfPI@+^&hO4@3fW9IY=7@xT7S@UE!g zLZY>-s<X_sV02snqvaWJ?l1P8n?PF_oaUKOUH(BwVwQL#e1KbvI^%=R?Lq4Up#p4& zA0&Uq2W%3kP4-XtAhBhRQ4}PQG>3r$I|0$q3h;qVR)}67aO5gJ>w_@Tif3kc0L=|C zG)lh@uB_qF1SYy7w)kG_C5nD51=Kr;%5f90{IWx4>Nw+mcKR3wLzraxe8>&^GG4)N zQ(X$|>IRpWCc8l6-^$XQCvnT)`>Fx!r7R6y=MqqsJ5HTDU#8h}NLc=mnouEfqL&Xc z(8_obWZqtNCdt<urGI<vJKvZ)&+<r<eKS|{pjLgjOX{dlbJeRXv|u#xFRhnWM34)9 zOu}<w=*!NB<kNaXY)R4_z3g0FkP2S1^TyQnGOQELDPHI$qPTa{pBhPD9!aE>;n;ME zVsyhkFXqYw6?&0ge?FDQOVbuzc^SXPm;H_%LMmipvZ4LUepbXfJ~-~bJR2O-xV(&L z?TD{Mm%*}xp1?-=;|$W|KYn>p4#_XWym3%|DXqy%8-2yF-+YaU>Gx512%vv?_ffLq zzBF}`oyWt8L9&9hUjDbAj9yt;Ti2GmjMv|5Z&QxO7&HEewY<|B|FgQ^_)jodO`_bO z+0fYB82`z@>f9Rt^AAS`o(>uRb8FW4pNnVk%m3Tb#le2EP1E>KyU{!Ci{u*rtE=%Z zvlVxGdi-w?p@($GDULrY??SW^6`QNrVoKQ`f7ZJDrw1798NYq^FXCg|Y2E#cY*z7x zBg<zdLsR;MzW$(M5yJO0b${EIh4~bDNIBXReZH`@*N2B2zxx*^e4;9}D;#g>|AX^$ zszk}yJ^Aim(!u<RSs5jg5}A7Q%g_JD$hiBLUw;16llEp}rBe8nOpR^XO=fr$Q|GO_ z|JSZ&4<R3S|6Vp(H1zH-`*$Cmw(fq0h4>-*diOJm!)%-$a-@JQOmE)(>{hIB>+YA* z1U-o8if^$=_aE7e=r-)f{lDqo{j*|3?*Gko@9tw(r;FR0rsCfvfy7zs{@-<u_K0ZU zY3H@4LC!pNl=M3H|E_0uj9esPO^U{VF#(~}?iDztiY!D}YU}<-A;B6E!r{V&KjOF> zucU<+qB*$2rv{I%DGNEqFW~$eyl&uZQq<5Qrjo%ccjd$!u5;lel;kZg^8QCBgMFO1 zi%tfw@b??ZF;#`eH~;=eOdSZ^xd<LRugKVN<g_}vk(dcZc;<B{6}d`Q*B<}t`yX+A z4?7M^h>IhB0nqXXqD^N+Fg0G-$No5pbo3MVg8N@3S&?`Dl~g99yEpA7<UsKlyQ!LG zh*_p}|F;t79H&YD7TMef&?H*Fyc9H=GY}Q?<iBMq@%htjBb15oISL^NBYOY0!q!Z< zdY8Yw`+t~fYErSo*mW8;`R%_Je#FSpD2#vmuP?i=tU3gQyYIHL+#ernoFHHR=Rb`{ z)b(ZSzyH&Jy?D&Xk?^0vad-c6VeMdnz?Kwa-)`fi|F{3~5B}jlT=>JUadpQfFFYG^ zyhuin;ll3V+wG&v%k$y4zx6Gw^|15J0}kY!vv1lF^ILwoupjw<fg$qrp$HrD+y2_~ zt%dEV%sggc38DFR`wxHr5C34{_y1_&5C5n3AN>Be|H1$KKm5LbU)vx6N*_ijL30Ne z-;RS|1Yp{->*PP|wEuC$w3E*NYHx&I|C^k!{}(?(V>^djEIj+$?KPCwdh6BN|9JYs zN8)w52j9F-EYfASUYQ3$8esU=%MKQr@Bdcs;9Czj)-nfQd$#s$`Jt));G4hywZ{pD zJoCOc=RWAN`}*=*qBnYH|0r=E*(Uv;ytn&g;g24!%Xhspd6s3xAhaERyZuK}LVitr zB3_V+<>GYs?e^Ju6^H-i5B^cRLI26`|D&&cXQ4^YT#fR6^BL`b@XbH^<{u!?S6^$r zvrI>~_)fG0i_HdyU}@JE4IrDFGkhl})3nsEjEl+V?{MlM;412ZMPww0(e3R3lp2Q^ z*;?H19yw%Ru_0)&xT4*LnL>*P{2D&&9QE%$&7LERvSTsuI2nZ7I+(W-W6ou$2O*+5 z-u*m^U$=h6kr>w{nuZffYf)f0(_(;Z$ZH23#^>0k;ytBOoZ&;7jm1MNUT3B(T0CU5 z)gj(HS_=#(R-e?L;?QV#;6vsr!h|gHBzKVX;;2zvFIsZFDIsB@w_puqZ&ONuhog=Y z8Ia%rh0%$lwWNnSE@J)su`dDQ1RU+}?0B6Dp*7Mg#o}VM%7$X9WGkI3A9K^wP{$Nv zQSd~nU$l#Pj#=>+Pwcg87(d(~UOU#`MZp2>HCZTIOmB<V!=&njJxbnkf`>W?iddC~ z+Kptp4SxS;<+JDFC*)X+*Q5(mzPY*owC-rvWl`(t*-C?QArD*ib8@Hi6HE2X-UnYp z(PI~%U1hVdPQPB`<On5d-eXp|Vyd`f?jnxFZeMTXlP5jxT)(PIM$A?9CQt7^y=|~{ zjiB-SiAcJ>Xlo03iuwG-9Qx_x>h;<0Bo)4}>!{0R{+*nCW=UykE+nOEFimz%XH*3~ zdv_mAu=`J6&A#l}$W>7Z)cr*8X|jjbdDq@fa&+W(@7m|ah^QB*v6y0`;r*YD-{gV^ zIn7S=cb^`l4&~<aaFacFltQ_^TonMU<)VCY1Cj!G%sy8Y+FseZoWp($c0ml0=!7zo zj6YL>*Hv&_zGIKoU6PkPC0wpyOHEN{PURq05>PA$Eo44|rU?hta^+c?w>U@rF^kO} zq4DQV*r@t!RWvtAsj1pl91MPjPV6H3&wS03CZ%LLShPx=m_84q{WP+Ot4=dV1BL`` zU@j0-iS<aE@I@bRsPN`dVJ(XKx@<o-(ge&a(Oyz_Lztm+Hcsq|Q%l?;p*Sb`j}$57 zhfhJih-7Cz8rgjuaGC>(ewARq$ztqB#(r3BjlqABm2s+FSLA!>$yTOVAIVNsx#_X= zM6=HeobbZ+W1s^la5LetoPriGpfIU!1MngOUq<?@gv-S<_RY}XqM$%t9vD`>K#&#J z9*c>cufj6pF5aW?ZI-tw-Wk14@NI66IZ3;MXs+(XPb>5WEDlv&Ns86*2-K|^Q<cn> zA?vJ7=M>!#UWuEG`Z7tmOK?U%0qL;Y!T61h<*3US6PX?m_qz*jG1;SGk%>Qt<V64y zw7F<#&8Q~Zh<)q(s9OC>q7^z7mrSeI$UqmfS{^8^#f$cKN7$@hWaG%ea4V4A1r*~~ z1d!zeLU|)YE=InxIdLIGoxn1)2eCh6zBigg9x$R-)Q$gw?+7Hu8R841)=-X>tjdcQ zhZ5M<uO6ZL$`k2nk$e|(q-lWSOUIL6#$fB1!5mnd4=l#?Hq3<Qn3im_i^Ld*`auNL zSff(5Y~`X$frmhSYP{>AL%Nm4A;Fs&%Oyj4^{`~Y*jS7J6>iB{kH@nOM5ar6Q*rU( zgz{C9%-O3pbyMTRujGcNZ)ks=sRj4NgFn5gHqQo7Lc=B8Me?sYWcKAP8YD3wWN|IW z5WqaMh;Hons)vS^zGU%|awP2%2kT}x1SlhyP=7ByLD>fu*@M`m0?4w9)OxK&8ATlu z{61ZMZC94bsx}YH?BY@3?WQ`vHQUMRjJ9D$s~1^3*u;pj7^7!&M7BmK&&M`Hq}-rP zny~|h<B{`gar@abO(0L!#UU^ICd!k6*>G+xURBH_5T&s9zv|u;r*)0Ov=(nDvFIfr z7$qHaBh$1E><&z;+cssuwY<K@^DP12)wlUXhn)RyKWWnmGzqJ-&D*qQwgioTdd3j> zD&!|9<E!s5a@iOb?|!)7u~`n~A2exB3&?H?MqL2tL!x95O?>~uL*46#_kY$VFIgJn z5%j3jvEG~{Lj=}H(KMRlTa@EO^~mns-yH!59Z84^o*ZRMxU=B$$i7eaA%S-!pu<%0 zG46n`qHzPQUTnQVu%7iJGJ%n$V&Fg%?kGvdMn~3}Zi83oL${4irh<I=SkF?^$Efp_ za;c}PZn|1MVs)6(cvqjqB^l5xkEo@rGX>%a4k;OAI@px+UTp4l?j%iQms}ig=scX~ z!MtTe&DBgfqCl0JtFk?4Ad|VHZI4Jf7tquEd7l8>>8Q8xh)85G=T~Q)aMD3AWqVE4 zp;k^d`&@<&1KB$oAeHYWV;s%-R4!FZ%E?K*yd!mT(T`UOxh-ZUR4PbZp};+COJMCa z1m*#uXf_y#OMVJjqYGA7+1|`j7lOK^SF<s1PI3>qOs1$XD<u=wPc4l(NkFv3KrS;q z9(9Ihm%$G49(&zz|0#6)3mZOsh_Qc_-=$*5{!E37wxGpG7tonKY!K(F(y$doo6%S3 zF#B9{<AD2t30yFg7SiMtYF2|7^V>6jcPEp{28gT!R8v`LGVn{84dB{lbm@^v>@U0f z%4c(i0aM~tH~v@sL#bD*5T1a_63z=OpK@b|lf0!Ab9sm@Qs}oIS@mN?O^D*7?m-!& z9(CzLN)M_rvrSTkfn<2l$8KSGObe_eKL8+M*?^QqzFKPbP-n<ldyxaZ?`B{ois#a^ zB;HBez@m2xawv(3kAzfxqU!QE11>$7gcF8DreXI?dYeaGG4>YcM>xZ(%$lsw&2PxD z6sw^5lS|`|9Z-kZEZ|wOfjBpC76|r`Z|#v?s`_&38&(N5%B~|1?cIG{BdKe@1*dQ1 zmJr<7dc;4(#~#Jd{V4u`Gi~>aZ>T8l?UC(uwHyYnAMc)c89l;X?GpvTc;f{A-N(Zb zyD8M%bW6=Y{-w#*i|Z9&n&e3D79luj=5Wn{-o^bFjlL=MLvlmFFk>g~-{BjQVL<xz z+&4A08(-MG`|c27)d)Q&^b?Q1`U>O&gYbwXnv6Ddo}aWH<=rP%T`714Onk+_@QDB9 z$;5T3!5g=f!i~PO_BGc&^Y%h0Q>$ug<0P190(+sW){zlax>rpPTXm6{)EV6waJ<zV z65#VlhAS0Vcc#D0JKG4jQU>mlsvj{PWn=7qdpG8oM_hm&4Wub_v_VXbPG69G3ps%v z90!C-4^GB^kst8*apY5>eUrQnK1ehm7z-PqZDmr5Zwom7ta^^J*f(Sc(nnq-wiD2j zgeN8%;UOO}^d7h6u`@NeHb{e!Cv!(_Ka)kI7e!+gbMuSSbVlte<v7vx!5%b_DGUx4 z7WX>i&yN@Q7oMZ|c?h~x!<>)ZZ$FMM#S`PMyl^m@Fc(!Lx>=5eXM-l4yKBmO0!(~- z0_gHK+1T@f@DS8c4WM{nz$+$Pi63IkHdtJ(Q$q)RnjC&`k`;c};PR70O*k<U*gV2k zKbLjQ75(QUGDaMBCr%86^M)L;(a9r#AExwT!p!*zfx?`7nH+hJ7k1=5_N*CII7w%j zS@;8^PanX!VRYxxTd5jqrw9(vOS>h^`_-wUxN?-CaMBhRo!@>OnuXtY=qB6_$guTp z$q`@hZFdt@5-Nro;qnc+EH^Sa36@G#_-MUD9d%?_m58`X9!?EWP?UtFgu8iM05dux zL*uC*8-3EP=1zQVCK<^JM_uDm@rak~e0FZ-gXq!iY5Y|O6sKbHCUE9gr$ypeCc3?a zXB^S<2>Fzxq=&e9^ZIw+jk)L%liCRmyy!`&`v`;PxL4`zA7Pst^3-S$l`C6*_%6$S zm>>Xyn;#w&BQQEhgByf{VVhnoOQ)23p|17;j~{a~yeMm)S;clVqRKW@$_g+#>9Gdt z7G}r&kky2Ubhx@g43vN#?ID=G$1*k9*<y#RORPY|hDReA6OrNg9Oo4h?}h{+JsH7O z(`yTDNV#ssq%fakQnd+_vsPh}RQHTeJ0$%j=SFQhX!D68OrzW4Y`H%U1<?$p@n}7g zXNm$MFw1U^<DV9SCV4tDIJjTZlERtn=2>Jk!dzj&mc&lcV5ycwslD`@pZ(@dzPC!x zkACyBFMss|)2@pAtH1o5ow6y#h?T7OkGKTj|7<b}JEhoifxw9DJM)O6<-XYh`P2s< zdD~bSWm|e=>#+T{UGV-AC14rb=XF`_T=;r67Ms+Um#0hq3&{f6d)$ezeamDByDiPl z;|{|1bA14bs1zuSq^l>5*2k2v^sJ8&0Bp|`79S&N+RWt46T~HPaPC2bA37dmf-g)& zJbh;`^a65F&yl0t<VN@A*nKEQF7DcKA5=;#e_o2a!T1ZzWia!V$QZ^hznzw&Ggk5p z>5iItpcpj-P$uOd@lwu>S(Bm{2trAe_}9m!SgAKd1Y@j7ReAXaB5pU;V43u}!`TV{ z@jw9w&38phQx#&c^DbEQWD3Yj587J)=f(tg8_HvAC0;0TVOnpMj==0s+nx7r9W7uH zrXH)@v&t4i!9HzfVW8E}sAY5Rw;u~0#6sb}{3c3rApJIM=N`x4&e4E%DE0BZ0pdkA z=k=wgQql7D>+G3;)nQZA-Sx($pV3lAYJ=<(2B$Fhr7EfpqYB4&q2yF^sb+?xSi5OA zxt^yL`2Y4Zm(YAXrUabq&;m_w*0YU*1D-6^2^kS}VTc_Tqj55I97+rz=?Q)7WeF-P zc=NnW%&Csiyd)!vgQ2ZQM0liKyEX`a%+l<v1*LP*X4In^N+ASp0^64Qd_z-9I+b_A z%_qeP?>-r4lgi~;#OQJ?_wjtx(bR-Tv)|c-(AqQY%BCkLzn(;EPM^@QbkmYh>cbA} zU-QmhGt8LDIPZs*QIUI1uIVl;Blu0tg4uE~#hbvv$qA8!(|Te_JWZRd2ahrKNy^4Z zzv8jUq=!{cZ7ocNq;)P%ELAbCLNA1u8F{IW)yVM*bMv6yc`R}+Y~bTA+T5c0rA*O0 zLrTRI>S*OSTnNdLvey8}e2ky;X2u`nrXyCxdoT{M8B&JkY4}D_RCx#M%t3s_g2+c( z4@sz#X=qj;_1eetC&)t%hSW$k-JC1m#EI7UVWRp~cP|HYBL;GjPIL09`d9l$OfR7~ ziPZ}kZLXT`Y@j+X*3hOVEB~w%SGnRyQiE)`PGZ<hkN6HAnk;$!LboSq;>J>C!2|G& zj`aqG>439Q5vrp~A?Bp!Xj-JlG(~NoN(#J(Mzq%h?L=sb6PY5B-E+{U417W9P;J#+ zDBdu;Qm2;6F*#{rZ1{EZw;xM+NR9NEg!jsEus{AqKpb#QFx)?FYv#H9K$Lb@LC)G% z@q7y|{zIc3&1y<n#)qvHVkgy*{lDq^^5sF=k3}o(AGN9aBNUQAD1Dt8aT*3i&<Jx{ z>|M6wkf|bElX(<uPfB@!HW811)9zfA?(pn}kS_@ULT#9xdzT<S+b$aQGp0oqDCg1d z4guL6IDZ&kJtTA{%RcUjXv(~rc>XA#y-JjmkEqzDXfYoXG&L;NH3s468RF7eam|l= z7`6i%&r3oLo+-C_i*cJ=P%hIG+$GP(pVSU0kNdcK%(`Bj5Gy{^9+P8i^011bilp_p zFI^~d%9Noo-Q=a^qnx@PClMS2SBBYOKf12R1A_$1^O(V&ivd^xO#nSWQ_i}UdZQ{6 zn&d_*BZ-(g(e=YlrDZtIN7LHYp>E9kC5xt{rQP#J*$hA97SP+*X>un-JCv}Xb9zjt zQY2#sz0U6vsIiw_>!1m@cpNiH<od^mU?i=2?J3$`Jcte;`s7P-l_qukwAx>Pytw_1 z{6dG53nL>1@lAQ%3!ZLO#vzwATh+z*FX(0<LJjH|39!g3P9^N*V_Sd4W&SZy@x1fe z=(bw}Et-b)g2_hFvG-yYI1?9Nhd&NBBwc}_?D@La5|q*=g}##GtSp41==#6}IY`Mw zN+jq!mT(xSK3QCgxNMkO?If#nZb(U9VWe<<pC1lxYCOpD&}?z=7%|JJAN5J|k4Xi^ z=7fo7hHKX8W{Z2VQu4_?CLWLugJ2Iz^A8m?6sp?5NzD4=QKF$yUta-fJs$rEg+ngz z=BBxp8oxORD>VLvEw3}?#(%AO#H{$}poHsp7+eO5xa7O<Mp$$kB&Uhae|-1-;Y?Ng zSb9?Sb&g)G$6tQ_6D;u2Z{D<)@Kz`p-KIq*08={E3`gPlI~vF(tgJ}kGuP4y<tY0? zKIp57_Lsux=9ZYpL8D%wiLoHHM~EMkjwg4i1O}OQ&@&ym)S(Nws-Tbu^x>7RFp*Qf z;X9Uk$?w!`)c`aWo8p5v#X~ua@e*f&c88IIF<#;RhrEf0QHlp29C8?t#XVnTJE-oy zHEgMCzh%eXMfPK-*v<=57G8&VK+tAKt9TvTi>DnT=OCrX{Xr-rP!FAK)i#P$xYugA zlQj4`c9+z(WU!J2<>oH*mfCE|<`+>W5c7wUTagoL30N|%Z=7^&NEs9Z9ToMC*-IAA ztC`60id*WAUN7v_UP40!37%T<KJYx;!rezcm1Ba>Dxr6&x0eh*OGT=m;f1Yy3e<nR zJePXWW-U=q3A0`@E2RPk&y1WY>*@*0m2DkD0!o<@->~yaV&g-PAkhZyUxvJ+hK*XG zsbpiHN(LeC6lReCX6Ght@KCYY5f+rq#lF6S6b{;xcz>gU2N3^ZkZEeK6Nl2)5`AL6 z;FvjbL?^JsuiBD28(M=sJekT13r@J=pcd4EnH!48&;n(u*!gLGo25ay(k>17o@=bi zJ_Gd232?gedY*+Cg?F?zH!;v^j#C}Wdcnc{52hZJK7;-ydcI)yzvh>k*EyA(gPgcz zMZoIgj$j9qsSd@QXk1h)?}}hV0|bfjrl4(G6p55TB)uhDDC)5R9%zZ;snKySg*7A* zF3EjEe+R}Clq<$R4vl^lqh4-tQHiaWC~VNRB^sC;V{)_??KhB?ssJSR?(QW)1e-9o zJ8Q0>RB&6nD1H}{tO-UkALbUPugqmZ;AaQzm1yM1HfqnJZ%nEO{DRVfQTNbu%3W#N z;zPDHI=2HYpgZuyfwyVL486G@SfwZ#mZ;efq}Gxx&xPXFrZY?9&oXYuU)-k6?>@Sr zAmQ}_{lVS$;#s}SUPgj#cGM|@%HniCswz?MXYUKT#x!L%RIBQ*M9Ea$TTwDqGmVm| z!hDoWRcz1a1a4{)N_Lo;^suE=o!IG~oBd5JO}lwlW)egQ-Op~h^-`=9nQz|kK~8(? z<U`m?Zko$Eub_|9(%&O|A<4^B;&s52mojnLOA<Y7I2o*K*F7+ymdhBT<#_rm<Fysz z4dNN}0Ig--WxZAr-J6b#Tfs6_K>Cn=#}DJ=CErevr=5f7=wa*KzLAP+Bkkkbj?7%O zTZnRiWh#(ALr12>s^blmoq-D9mAk=tyJ`Pi#)D<<N#qCcuzNH37J}G0xi<EfWA#Os zz>x!UN@pP%HlwWPK1m7#nh>z%%ti;cj-v^qp+qY=8;i?WQdbB<Z!ISWzsE65W6hQ^ zSw`?OryMgdo7*lYx_ZB^5cEa-Tb4hCCY+M;Ex(3kd<U)4aKWPxf}|2wMO+IIQ@}?7 zcEbI;n;Zhm!#uCFQOh>1il)Lh4x1#A13ez=*)r2kql||&5x!H8qRQvgp00Gcvimy6 z3Q$=ld;8NVp9PM}Lb06kpD%EZJGS(+CdG#xCngoiN7!19mrM=`po>i2T1K#zUz6`o zJCvruId8U>?|&#W`rSuottX;_IRT^Xh=fx7l?LF^aAEN*Awo|&eS%mnWHrFpibK|f zPdlR{Rp^E_9_*C_4asjgTc;B1ebQ=Hp=|YKh2jO)?n&t++NrENU8j#(Spb7oCQvem zQCO?<mLcLUiAc>cd_n6;V%S?xh_rd~<xsAXCvk9lk`$M6<&JuXK=|_Hr-l|)iBrat z9{PgQe$wykf9Pm!FO~5Vf(G8Pz;8b`hl1t)4Pur&8L;~Vlpj^Wt6nz}0sNvr{txyr z!J_91uS(wx(hzHsv<x2oC{xkE2sc#m7l{;O)In<_Xhdeiicm~I^B_dq8=LRkHN6Ru zwu^#35&ZA%9OFkHh@H`sPZ0Z8S)iZ9h?B#@beHib$Z}%Bp5R=Za-<{PgM7E&IGV3e zLdFaQ=Enh_JHGM}E1kp6JH|{>Sq0}>F)dIVaEeQHzY|?Ec*sCNB?Qa*17zck2&*em zvedPwJowL)Ek-B#jliSHm%-)KpaB}G&dYE)?gMmB4zZF33bLA03auEkYBBW{gSXP5 z8qi3!1)+mxlMpM#q-dZ9Ksi^s(H&Q(bHKLZww|(an;n(US;JEnL}PGu$X<@c<j#6# zE6sSd9+ZL~cFSi%&D}?rj`!blXUe(_x|NmQD{tQ`-^}SuPx-KS$%BKzJ(7Wn^U>{z zLAzo!Cebd4Dd~dT=u)j2Bzs&DE~}S~V*I5IT=sijjO<N?0SpfZ*Uj=Rxg3Vq)BCs& zJgg5uqTJ3TG9Xv-q(N`|#?P`dcx^1V!dUGJvSjQn$1pQ#Z=lyoVb_s8X&A0e=teHn zE&9Tgh(~$g{hLzdLF>0TKPX*Zd%I&#oqDRG&_?ombBZ@w68R_k#HE==;=)&WYv4M4 zo~}2HU0#g46ra6}oBFi_;UjTxRS{crn1GI18A!how@AW*mv|`i)#Q<&ajPm0AJfaT zddHf|AlRIYSleKR2*23|7m+l<o)f|wwA7+G-Ms5)Z~R4s4JSpgb}!nC`}-)9Quj<0 zaqcup!Iy7|PX$>gs=O7J+T!wIwpYIY;|In}1&aY&R!+s3k*^&Lv1n=JXrZ_VhYB{h zr7hD$J>|K;oS;2BR@8aH`fpNkn!{PAIN%07j*hv|!-Gin4Ry&?wrg#_r0qI8ydAZt z8@A>Ise<fYKZ;>h6<01V6U-)E8E_odXckvS2bnnhL()nCG-~S<^r3(vJ|<O-{QK4- z?2OI3U*$&}KP)0E0_c!8qz;xvJ9oGHE5rQsjZL<Bia_Du63WGuQFRi%V1CT>lm*|K zO)?yQLk+e#ZibK;>R8HKE7us$1H<*^{!evLjtkH11|YxUKyZl;8UOO8d_96tR~R+p zFHXl_-2V`f@cD_R<$q}r)!+&j25f*Z+mIiqK>LEPd6=*8t;^E8a{oo_^(&Q)j3b@9 zlCJj|=~gYucnfeZ;mya8SlMp^?|%Lv&2%3cCF`U$szA?$#ltgp3XVTt;MZb`tu|pK zxn222tl~-!@&b@Bnt_;_;c5IoA{ajz^~t-bo}{i_#S^d<sj&=q0|<pP2RcQD;?&Br zM7oD$9OrE>5-L(P7feXXHcu|El2uunv-GSQ9l4M=`i#{jj~EG75(1%L3g4RSL0^S( z4GUHh1I<-~TOW#lYD$fFSA#cpi3Z1#>Z}IGr}4~bf6G%RJAY%actnhUI=i5<JWsDq zcIU~NNh*pugGnkM&`IH8i=w(#$_LaZ&e%C$KJ~=_G<T|UWo>r4EOF_HE4&|B@cyS) z3}S@PRSJh*y6*a<TS`2wWv`#9+c-P}bQMElHqVE~N}P$Ca)TH=ro)7c#r3RVz?gT$ z6~p;{=_2qI{<m2{luW~_y?m=SOW$f2b;>iZa89d7gCpLps{{((C18_Z6w+(D9;ak9 zpf#$Hvtn9S2jV)|MA|W-;M!U$256USXox*_AiT9_(Ow<kEt+~tY;JLC(C|{(uUdjK z55jge$#Pb44#^9tF0N^geA6=S>>igx_rNk7s=eB5Cor`kt|qbOLNfE#+O}%l>F%={ z@T#z_?I$f2LoNg-5ZdG8_z%|RFsu4@U&f+U3`=qmfYBHO1djxZQ(>+0SDtm&sC(qa zCKjkw1QHhl#KqA**(mBNZf@3D6r=}(5d2j%>nxieLO#n?QkxsS-35-#i21CDN~g_k zXo6a+)T51MKiFobbKsZ1qVrtEa?2v9g(O<sZ+JmT-VRQ?xA%WaZ6GJRy-%f%T$ROX zScGr&H$Ssj)V6}F_H?qQAC3PC$EENY-!Kf<VQbC8F7FzpdayX7K%!$^3&*IIvM|iw z+TLDk%_k=$OwNiLCUB!@?Lgp)W2O9CW9*r;Hm~uOFbCIOVM$%-aVR6EY3+D)-C9dL zo1<u}|3oaF$%||9-d(lUkh6H389*4oD8=1iTF2>bRuzN2+wk~{24?D-r$Xcyfl6+f zm?l%kp<~K|;1Sn&0JE1*6|IE&NloK!FeyZ(3hm*3)+!`s&XIbJkpwCBHP+d+M6H^V zYuGp@k2PZ~PBv>^Zl>Z)sl*fzMXuvi=1Z|FsR386n6cu0!sSaPqOK=$T9AR*mp3qk zXTN`g2VF}{Z@BDPhOxD1(buB!TBD>na5Rw>nD{9s8;~MRN8Z-dK8cBN&8(mx^&KJ- z^0C~u>X05_B6>=#e<l-d)t%D7Hdu9#(~mkwVPgDBw%}K7`90*gN@<wlj>P8%rm}}b z556|pIeN|1{))%r+OVX+H8BL^&)t!_;O={kX*x4=?K(2o+O0S6HJs$5_I#>znIl0V zNr9#b6;eYc+poCYO+m6F7g6csZMN|~3c?5rM7m3naR$IAMFN5B^&GQ7#SLlj>x&n$ zOik=Y-^iKHNpoQ$=h{0wTkk%4M?KPW6ku6zFTa+#i=#)%LU7w@Srncu&OnZxpPMbI z`<)zBO=W*JJH+DUmBrba81>oEU4j%zwW=HC*V9gH4^IX9-~#CRo;J^#!iU?%HkkMn zf|c3$)B<AG17bGA89j}h9OY~w<IheYafHX#KPBTL_<3$f$xJq^(kx&9Q_N7_xW|YR z`Hk0Za!t(T+DjE${t%1(G(NqqG+ZWY;M3mOfjw#WkFvxzq~3WFOpbPXF~XnrxD>ty z8Xe|STlH}7<1Nj{&&@cZ>QT#WzpGCN*SD4E;^|0SIVN}MsQcO{PD;)81W&oc-KaCc z9g^mNF!YqvUSmdZ`0wnQ@N`l+KLiox+l9@}VU(;=0n>)tMfR!v51S1RpN{|LkV-84 z*3-N1pLF)hD)fL(RrgQrGG6TadWSg+-CoZO=oXOpvJhQ&sy_xQ5uY>QpqEtzOireC zIUNy$T>6TMsG^8EH-aJ7JJmx#xCdae;IAh_6FU-4UJS~5r*}3Q1@J$&Uaxm>F7-4S zaMJ_prjucaa0Ek80&xb>!OWqPar<y?mYjO7YBHebYf5dK3RDU(kLy9BujbfV@0>DW zH^zQG+cz$j<LxAX{G8t~_jgPf%OQp%#mH3rFf8L~SmmmY8b*l=wRC*zCi|qBBEl(p z$XV!rF0xWmFkCd)+>CbSq&}WD3!d;XAZZ=J!O^e>4Mts%7d+?OAj~M(U|3n7DG(`m zzR1ZaNzoyxHn@&l2tN58zl2<)xpOUf)o6v-?^%-tv$}`aP6JCOHOA_^*`lenJ?j5g z*S+pWmR<J&uScnGV*z6F45QKLMzV^{Vza0FTQylt7H`EStJqC`@<d4#AyyJaK;W@q zYeq3Fw;N;2RxB8j<$Nd-wt>8a{3QAP*Ex0Ro&+HGUVEQY=d#b<Yp?rCq*V>?T0b^I zc`U*fh3pimSbE!yHd%zB=~ecWW_rQu6xDgfIG?7LI8pRnwONttF!rNXPEQouDUESP z6+j!QMx`oi4&CO$X~mPZv&kf1Yb0yJNB~P;Y7`ViDBe!AIMvlQQ*4p3I=dd_X9Nf- zSkQVisRYFshT3<N^l#I|&&+TiUm!Kbp>b^LI7Q_K$)~Ek|Ig6kCUi9>a#>^$ZrX!c ztkgHN2I4>;2=A0nY!}BI<=dDwT@i{9BEYHrNlgLjF+D(&MN4(jmANg4ux#V!d2L3P z8M@<JlKJk=@bp;Zi__yw7NJlsj=SHP|83xh9}!2Z-rlvcqs_5x%qx-r7Q&z!%;iG* zr%cHGsBt%=noU0`Iod=$mf0<p8AXDTGvdym<WWQ3z6m9xAXNOmjN^#?PZ~kGOQ1=4 z_?@JuSR8vN3!+Z`i)1~Uh$a3@^<>P^64hT98|qXuwm)?WJyo9L8gHc}mr8XF<;9#n z@a#O*R6Lhdc$7^l_$HXw=Hf-q656P<Nd+(w&wcY^@~WJfHseB!U{VXHVgwju+T=Dl zJzxq_(}XM6Ex<P?!U1niaQW820#$EX&Dkv+FqSE8uNK~dD$x<<NDA3};FNXNxm*If zD>tYn!>j}%-2YLsFLUNO=Hey&jnt+CQ`0UynbZODNS`Q=a*lqeRWeD)`N=sE*d0-q zZ|fk%SO#ViM=_-juOi~bK|uoo!X*2s-ROOsfWur&CSwlE5tjd4FvLxgb3{zc?<>R) zFPijKK~6xXJ>>>slh&CW%c~KnrV}KIZPch=IrNpZ*{+c^>Z;}j6f7D95n}DDYu{tv zlBb)+ieH6lHyx1CqEcn9fRf*$_QZsOsvRT?EOO}jMLerA8+EpEqHv8h8JbX;n;}$g zs>3H<dFgG!(q5YhZg>Co+DV1x@IEK$j9R>mD_xoAear<X8+Z2E_h?@SE4(+;H^z5s zW-2<^2?=GK?Zh>Bg&&z?_SM|9K3b5e?=79A9LMq%kcVDR*VEPMXu>lsS!BCAmU*=y z&;Z3*V<p_&MD=6|n1ZkJ$g5aro3qnsmp46SQctetKE6;y^!x@=h^z?U$qY8j6BX%S zDpn8P!^j`mu>hjR=aUJsJpZCgI1u<Q=;+nZ^dDt0G2!r2Rw>mRi$r7<v9vxH4UR>l zpG;2N^46L<8xButJU4IaX>JXMb;hh?GpVP+fHw=g5u<))CFzpcebrlZ4pG7;PgrL7 zvGoQD>6`U)|7iqzs!PWF_n!vhxUfEYSQ9?Zq9PgqFo)68dIxZ;m)!iPKe;&ir$1pI z)Y<%(&(4Sw2@<b5TOWK#1!X_j`e14Gv&9vf6^`+WON>_R??w$^CNpfS#y9EH3Lsr; z>KQW4yZHsdB#I@_mJm?5pu@o1zEkM`0!{wrjGYim>Dv(}LM7L%bsWGh(VQaAnQaWR z*DKvjLh1*)tgyGB$BTo2=puFPhfLf;(7aLR^rPe2Xam?Cr|F?cP=;XL8jewA^PkNE zosKW-z0p0IB7P2~^`kB-_`EbmTjC9q#+O_2R=DO{THM@)@<hN&b)}q3EyF{#Lw;%J z4sjVLmG3s}|Ee7cfEH<dscC?ap`M5mwuYCNV`YtR=(F7IO6o}~V9To5@kB_zfC6|I z#Na4zb`zvtBYHQ^xgvDKNTbI6YuS`e`;@Zk<Cp=Qzpn##*3aX8yOrQ=xrS&c<CD&o zJ;PSK#mdX*j1KZylui(|(zA>(bJ04jp!UVAvPFLc8BS!wbgs6i<OMN%6f0Y!XyLX{ zN;FcbPL-l>V*$KTuJ0nsSIhw{?XA&mHSdn?7maJc7I7Liu#?8p6`&Ye9?zuIWnyw% zYwIO$T1?o<RhJ$x)Eeys;*<?gxBmh8rNF@MO_+aU8OAaK@=25*U6-<mcw!5qUMu_2 zmg$taV_$$|QYGvtAoAE(d9vy@h1R0v=`6v!I&`A<mQI0_SL&MINN((1JDQ=69PvpT zhCh#TS<>^Z8qM*wfR6gET{B_mW2SPASfrYwL9eK3IXrDpdKmCDym;ybKn_%b`7Ikl zqEYY=`U||uR<oUB+-u|U4snLbd!I00q9kmf{NRL9w%6%wp?+AfZ3&E}z#?x6Frqlx zU^s<(s8dk0`8F&RBDD$^QjPqK26ICU2qbvPI;z8DDWnnW%dLcEBoBc&<9oLi*Emx* zjMs;4-3mt17wNTwm)&ppW&n!U(t`%d(z2T)WVVR!T7&^g0%d~?Dszs2d4Opib)jn5 z3JHGHC0J$o?_gSZL1+;gh=XQI<YkSJ^>~|hPzS*%{h*45FybUGxj3~Gc%!l@H1@Sy z6RwDPIu77LzDf4ZOozF220SeiSlf}A<Hm?SRoD<U*&Oo7Z)TJzq|s__=}iYtWVOL= z&5~GiYsO}CHOCVgI>IqwbMbu!Z1yq@eiErdk8jPyf5~M}rN?Myv4GJ$xVL7Z0=KYT zP9sp<ntvVxMb}_3)@>s%YW&&!&qyX0g5S0ssl`?T$j+kp0iA)WD>j;)t&j%OHFcj3 z%kyGsue<f|qobiYM1jUi6`j=CiYpt0z^ksaJ!GDWOh}C|D&Tl{>LcqR-|)4zv5`Jq zs><sS$mYC^{G&;`y&Ndbt4gg>>gu%6`%U$A`zi7oS9E9>Xgcpw#ao^6Cl*N9F5*3X zBNR#=(zps|71cl<fmtzDFV93b;_KQ^3Whp$#l&KJNO?7|S#b9_ua=Lt0guI)uG*Gn zy_MG-q6z#UD@KL&nml}oilno@DL0e*AL!4fU*$@QteN|s#70;3@I?hv+;%|=P!B_K zcJ$^Y$wmZwYklKJdF7l4lvMC^9^y<uf}D0%G(qYJL{d)?LTY-&>$tK7&VXamKy^y} zeuB5XOcw)~w(6Eel163@5(G`~Wz{cmv}s3(o_cEj7C`Vj6T-p(UEu2+%5K|KwQT`? zff{BLxkkN}wmWi^?48r$!`nqj+VmAi7XS~!wzBzYGa?xnubJ7w4ZxgEeOg-GKoR<; z#ww(mM&=GcyjMMY;ftk%?T3<mZgo>XrB~FsyixU)Os5*~Zu;0QCR|a#i(|RB0yQrh zVRBkWY!Ol?SXk9a>ySCRPFeN6EuaiH^wj*I#Vy|pZF4XACR*s=7=eMy*Q_^Da%^du zrU=YbM_vmHa2gQpV!H=qE?<e*Py>|cWQh>jES^Q0GG`S2NmX%I1Jrc6CallnQlQls zknUs(ToZcKn0L!x%|^H0_p#0KosRfXrK9#)^~;3aQ;UN1QQot;G-sY;z7k2g?ihg; zap*Q&60_($eo=cFkF~B!omgGuIEdgJ%yPwTC5$|vnO(HsW%E&2T);`AAZ4DjlA~8? z!%&qUOd$tMN_`a0iqW0NWkNlx1$E~`VaT9;4ikoLi0E7pGTXTFGBRFp%G<+-f47XP zzTE^Ia;xXH@a(lU0s?_~fkrXE9i%A~>vkC%Y*!HXZQGh2H-)>hFKozLfX%btyVmGX zb^{MHIxO@hgomHTdTbk5`F6JjcJ>)Yrx&qBqqNGFqZ*x#Y;ypLpX#7$Wl*8VzE8lX zF082#u|!kIs@zaOn5s+&^3Cj<WC&H@;ZqB^BFKR)ovB9%&U7Iqw@3Fsj(j+XZAI>E zS403mLudw_67Iz^qkzefDy<Th^kdE{)Ke2jZO<bO8;goYk<uirzoxO5chOJr2;O*n znCat{0d3fS;Pgb0v8;-fd{J)=UOp-j8**lQj4Ql(_{WeDu}Y5|vm1MSFCC^Y1=38F za~aSPm|Ji{+D9rlV)c^SW?N(YHpGQ!2yBNCJ~&8#`|!leu7%Txj-!A1Z2oh?8dzg& z4hqMfd%-g(5w(a<WGg0l8xT)d=p0e99Th%|>gt^vv|XzkB$Qb_8d1U7L4JhrL39GH z^A}bra0D&@dq+Mm?*%fnRCjnCz#Ssja$~wn9)Z{HY!ld#3Wx_Xig=>49s4=IBzwzf zO^(fYMi$?hFp5v>{G8}D2TtO@?LlIDsgN!+<b6Qa7bsf}^6)^0+U&?A3XK{>m^la; z9ZaG;&K%Pq<Y?-cDx`xcoRJJ2d)AHgGVn-ZqA9aZV3KL3&ea*b&Ho1L(qrM^+pwlX z*uJi*9++Wk4M}UPn&Y;kcs<sYG<IyY^;|Kbi6p-+!hJ0yb#sfUFMG&0E5C+OiFOLU z8+Oefj8DYs+Y|J&p=v4Z?a5``!R}GJZM1UX9F`a+9qSGqF@Mz|EA!}XrAVmWP>}&l zRAt%70-iHv%4m^+glscOF^#D#ggjmx(p2qAo?M@1|1=4!Xg~vhLEfHTE=qNkCa}sj zX&#^Or#{o{x#OgKSisabMBVY416vGqh>3=YIm@lfQ*wI(3vcvW8zrqg#NAk6>(2IN zGQ4eHqGPSX5MvCtvb&QqE2*ooMcdO7Lv175Lo=%}ox{@vS*4Z}^;Fj(&(iIgRMRyA zDD-@$IDY0POk4^RofH^mT-WP7GC}wGO>j2g;^>0{BJj~xMM8Wu#%vai+L8(l)*BF4 zXO7IS?q)Al1UZLUNAbVjp56a6OGVi6&NefYOa*V?fg&l3w!|vC!`|v=J`*WCr&7wp zNMQmcO{N;TTy-;u^S?(-PmUrHx<+|*w(mbZ^!A?yI9r!IY9|Q!YAX}{EKg^Bn;g=O z5$uY3&~ohC_kVoGs>oWt|H4Mz+5Xqx7ZC5|#<$QH#NfT*5INSfgWF|Q2@l>g*{@O} z%X%V><<kMooJmy(k#T@qy12286>KU!CtZp^O;1vdJW0>qMbbgeL?B!(SxH6>U_FP6 zbxKq-JsbDwqOl|X80mU@XvgPXwRS5Z+I6G}?ePI!c-<=38H{--246*w?*!{wnQ*AR zVZ(eSVhA`hF~2&;vE;_STDXo}^*nMIRsE*kpPw~8Fvs!}S>?8o{yrX|n<hF_2|1O% z5}4$JDj|jP6LMwPuSfq_g)OKTLLvp>X(~Bxkm3bKYZnoBy1{ks7^X`{4N!LVqq^gj zylup_jVs$n#@R<=HQc(%{a$Q#yTKFJ&u_o>)f3x*2`=Cihi9j3hJLbQBzuv&UJn<D zO>@Fxt~Y$0HKmH64DkdMb2V>+B(HA_O<0dTfy;U9^h&d+WWHg`=#5@X=RdFWlaPZw z7}hy^vm@l!!Mgw`X?<T@^enc;9y>B9+3Z<b=k^lhvq#Xg7CE=a*c#hqx%EbT(&j&l zcB4lXW5KCx^2%0d-1tmEA<2BC|5b#8t<7gz-)-~o1ZKx^&89Qp_NbO^z@l)wPwbny z?yGXF3V_@sfoc_WaqH6e0um@%r({%Qx7k??>gbi3o9gQJ>)wzMOX`b=u__#E&jcIV zoH_yUFSYRoKID*)&grGO18^(>BzgvTBur9VDK#V){XyhHy(4qYK+x`yA-@Sg_1t6J z_I#AE_;F9~(QoDz?S&5UBhC8892pwp<GXo{&|n-1TyPv8({KebhHP5%Uxj~^my(31 zCxW@B86y+n&ED8N8{@R41tcc2PIHG^Tjup^l350T@{2C)u6t4}b}QVE(}0TzKunJk z&?5^ZGS#>W-Zpt>dgJ7GQ%*?>dQ7FwtcogShK5!3K|au5&aG<pPI;S$FR~3Uw&@;m zLaepzy+E75X*Po1Bw~iFU$YOnLFNXh>@a++4!Y+$w1}9|LmJ355V;LKdDCLYX}0@@ zk;bLi_}JE5K&2)xh`(9exuAX1z5E@M#IaDK&Us<F8S;s=T#}fp&x4HepmDFPGPY(B z-Z|haG!lXwIBp}fv~UxjrEM%66PxBYD9GwstW@EklDsuXzPT8dT&}puraxeJYh85P z_Aev6#6P7KS2TyVh8KA4M$X&zeD(Ls5R}asdm-CxVC};d_u3p;c{P3`*wtrZ5?+UD z*usca%Nj>9uH7|9*xg-qDJ|mW0->%AnWKh)hrt>vV*Yyc_s<HipnJ{d{A<k}bBP7! z%~wdfagJOB>0P_u;)_p3(;&lNHDCGm?9-YcNZej??M0&Y?kLetYYr^C*e5q#2<aHi zLNd7I23)+oQ~^k42O{tcrW9Tw+~7v^W+C}9&TZF6Ls)`TDtG`t(ET<ZjMS^(fq2g~ z1@Q@44h&@K2p%5FN(XD1g+*BpNtMk)j#Ck`Qjrv^W0k@Hv^RsUyC27CZUMJej?Ixl zdCx75?T_yctnoT?(rpwYJp$-pyP!alGLpsMO3)b#1nROLa_lCPV;1VUhr~0k#c1R@ zYc05-D2jLb8g8~H>qGPp>QG>WY=J^a2wv*Gw~-E8LbpjVe{{>V1hLqYj6TlH@saEF zgl-V@Tm8!>ctj7m_aIb%@BZzYyh7{z>fuLsogT|I`+O*@{_r)CMyGFntRvn2^A<aY zzl=_M)af5wludHq2Vy@P`Bwih8YLCN*vIN~)n`-M67d_~Md0Ij7R{~Lur3;8RTU*) z2LfY3XZGnBJN;uXPk-#X65A^x5$*>HL)eepvw!M4A>jI_cy7YUKJGncI-Nebs71ZJ zo+%&Wq5c^^yK_~%Ar2PxQj^suJ?Nhgk3(Aa&wU{*Sic?}-s6$p>Em?P^8ofM_htW* zn4!eAeWHR=4fG8}C&keyd-*B2m_gMnFr}_{@f8tts^D@D9fX{+I(?TRVx%wBljv>> zMOB||J_~|=q=$V`_nc6oygtdH|GJEoXq(9q5{j&+{&musF%pRA>3zLZpGChjVEi#9 zQ$Gt_n1MFLVn0rG{R&FfpPG{>6=cLm$2Rr;RA_1}_DQ04^=A<-DX)&uaH;PgJ$px= zt9@(2(HB9-d+Ivmyq^%G@rUkye7NyVjM(!=y{e0;XkKnsUn=Fs4pz?W?hC^ykdPH& z>}Kb|tzv9a$>mByb?210eVnj%JL~i-(_w>^`esR|kCp7l$a6h(VgLT8j30J}&yD{M zlZ&gA5f$%*IXqIGa`3=71-O5ES`h0roA-{ldF6f76(pm8IM?bRv&bdR&SeK_tz36( z60VqTQA<UONsRt$t&1UZpwvtVL;DA`T$JP*=5_Aiqp>f{!-dt^A*XK37M;YSTsL0L z(392&3`s;?6)?7dspntfJpkrk)EWzDxd3z^XO)(avVL3v<~8aP<zfSCN3^v=N}MxD zje>gsQ{P;jZ6?eUno1)`BefY)G|!H~)8^-vlEbB0g_^p(zSX|18=MWx)jAJ&8(x_c zEmH@NeP?EOc0wi+M`!Rx$FceG6p<No^i&_SMLy@Fu!AGO>9`0Ka<(C+N`c~$rRU=M zmaj<6>~{$2a?uD_sufE*O`nBHe=c2-OjL*y4@01Ifw8D_1nbOCP{|XboX4^3%nusr zxw=-Lda4s0ODj-<%Eo<@x)#8!MRos!CCP|Og`V=TnSeE6(2!_B!KTf}2DUqak_RGo zvL?=R>vRd)EOrux3>&4EvG!s{O#sIJcD=kQmXL4b*Gsgr!``U7V1viq4{v9=W8Ec& zT}abYDkLr{a=sCM=lb(s`^LZf&5s(e99g7Drxwf{V7QrCm}khe1|>Wad;plvKUc8= zt@pv~SHzYbK<t9sz+XGHfZ)L7wciP@-{H%f@&=+Ib1U?Y))Bher^tk~fLtGjNmOxl zJNm?P$?>5hHQ(|kzF^yaodYHd|MmJ60V^fEHV>z9`k9S~WZ5~pwPLB8cZ8aM_)i-r z<0aUl%J#r@VnDWMt>kb!6TZAf+kj4oSC?#xZKWEXa{-N#RXBa2CDw*wa)^M+TTc$n z_9>D)XDzH-K^K?yjh%_m3f*rZ21)CyF+#6i*`4Ej922>MZdp-rtn9}52M3+4)Nxru za($|WNt`rEgv7=_PY;RVJI|t{ec&wX#Q7&5z`n)5z9a?Th8+(ZuoU(U7*7)pn0Yd} z)4sz;COVijEM!}MfxcbyOViqsNf(jVfY<Hd>lLcPf^&koaT2VJqq>@G3<SNaFjm^l z9JB>qXA(lRLqd_A$t#IHcI=+C8ur4-s~c_WN-4q9*=*%U;&}p+PnMNKH5deRH{&>@ z3{n=|f4G4NEsCpYk*!|ZoYJU0gkZ)4qW8Q7<B{X8?AjwNwT8G?Igytv^N;`%UN4pJ znqf#HYyM7|TkE(P#_|=w0DKe^`M`-Nzc$M-)F{#w-6L&?j(0B1nd{Oop-A6xvSC(+ z<z3gz?4W69-E2Q_A|Dz2IUdtbtS`1w3GSzHhi6`!qvd=3MY0DH=%Oh9_#`Me%3HtM zD4))aHhvhHp@bZHXQsB2ns}+Hh<7`XZHUJm;#pLD47zt_$>x?SlOZd1+1N$mIFK;6 zs(RpTl?KJ)vC*VHk+4dY^FqIw(!PHLa72WF+oWXrX2lU&xtVUP3}u{rYh$xs#4=gf z`eoCJm7<Hdhp-fBzp+=O^(CRC>hJ6<b(m~ba-x&rk`CRu|5RXY<FnrNBbu1Ck(3Ah zh8z28E{HsA96LKP9wp&9?>x#Rr7GyT+ar5%ikIW0CVE6u`!WU>Uholzn@4udDsR|F zbRLal`XP;Itd$MiqvG5M&nh5>7V75FgmsHO8{keP0prdiLq|~fD3*vR4wI_$k#A!M zQ<(>~aDj#^i!r@ZJg<f5lT;I>sMmggQcz>kb1i%U%b)_>a@gISRKrwD9pTd>IM-9E zIY~xXlJL#TRxhK`9wB-9pLxjUyvTT#jlC=JojZ?2pkv6%8+?}}W!jWomJeoC^-#ED zM>k?=S|+EvacwmtQ%8rQwgi(`AgaOYr@MIgA_pe6jgZ>AL-qyAqoZZezqGuIN>)%? zvl=mnXx&9KSLqFNbt<tEuJ77lPm?GSy4*FBa0j_0Qs6usNuU@xsQm(}0+1uAF3)P- z0qQiw<7!^*`tqxbHY7tmjI<lBmdCSlmNRuXE}XEdnv&C}VOJh2snNNvTRc*#=B{__ zUJo^8@nh`_N9|IFSJ3;M>o<!%eU~EqGoiK4f<T*V$oHMEyE{6>CWsgv=m0?&I_snC z$u+ZdVl+I=C>aBYPK5T0y<ppJVj!h8W|grXqcaw?hg4H_>iY)?hd-SEob2zq`6<l} zh4xkS_Th9Z^yYxXYs|*Z85og_2Qstxlil@TSQ-_wKac$l++2jk`Z5gr!aG5<nwJSr z2Gb6%E+fL;jq{$;2FQJc)MA%$ZvBphdYit&EQ?jZZUl81iH#kM^_?~~YfHOnlq>yi zd}Vei9K0>1A|7tpN|X)Kt;NBnxsc~IZ#RBkq^eU=uN%?rTC+&E!*^UmcE|FYuHh){ z%(y0v2Xkb`7rA8&E+QYxz1RC<gpnR+d=FWI^3$~1$$|6K^aUyHK223Ea#kuW$s2ar zyvEpd*LTQe#30&DT+}LK=T$&#hT<KgK`#@MVL4vZD9x+_#Ab50?Dg|uY%ui&s-w(w zb|>TR$L_VB-fwqudV4Tre;9M?6meu#!)5;~3<Ze46r-wLF=5thRCjH)(KhW)@J&39 z@|$ayNS*n1+Ni2E?0#W>K{46eg=8`VQ7*%*E*WyxEZKKwPz@IzHCx){uCYrr6{lfe zWhT(D^4y4c=ET!Y=fxq>(27#njitseQFmtGEXJai^z5eYKf8_IbvG^wo!#35T*QqT zf)Tpl(ZJKvyo1GUM-(m%XxVhX7mupl`Ct9>X9mm9?|*W~6vY)<V1;U8irCqGczeP< zW`%(UaL$m@d_Y&h%4=9aJ(r$owx9ttUd3@rI<r)!e`G6z;en6KqvR!lLRzI%XzLAm z0-=4~46FuGsip`bN{#u&`v9p%l%c9Wj8FKhW#eK6l~DXpin>tWZTClhPYmH*n_mk8 zN^;e}9|wJu$$QhTSV@Z$n+BGiWT4a@?T_02Z+pU4dK<h%!-4Ddy_ze1kE-Q*9p>pR zqk3q!_5_T=8fZFP;;*7zS??9}OKh`M*Y)T!!<$jywZ&Gefg94kg=Yu1i*9^k3vQFc zufW9#dc}&**0DGSzYw9eEpmb~-)=5kqJkCp)hEsg-H(L4Fq4yAadDN5-a7o%A;lMq zxZIv2ljJ#^)7+_PbQuq~lP#~_b}|?eCUSvE>U<GN2nLwfj?UY6B)edz++2-*xA?K< zRLrl@-iU=%EU|+&ngivy(ZC@|-|$kXVN4``-55s1ox1efQFCi#$j*ibM{+i;p@Z~6 zDJYRZ%QaSwb-jN&$Ukz{;cWdh(vGaTvloO1sW5k`kLJHb*_|-UN-Jngg>Xt)=aW>Y zaaRV+0CZmT5f`vh4uA-dN<;B7xCP|QS?Y)wRkLXqr^E`NZFt@0MRSBb@6l;Ip6lRi zCFgOA5-<C8KZ7BQR7;M7W@%W19<vq)d1Zv$^ItN*s~-w}hb|>zD>Q{k%%iplYXNL* zRSb(VF-qT7^GO@PYHxVU9Px$4s;Db4B8w4GdI_l@!zGlhj%74K*_X|!Mu-9#=a*CV zF`N;OfCVwYC=>AWkgPL#(!lPHP`6ZN7i>55bk3rB1)NU1-;Uc#Mo)vtH1ejzBGRs} zrEKgHbTHjb{}hrw8_z$_({0WFHY8PgNi3Uzi{_H2;&VH5dmzIKvn`w4jTc9Nxel!d z+$VZqbES`443(>XYtd=nTU=qkJVu(6OS4!%^Ih|$TiR;@bhDSwzcj|pO+&immLG*N zS)LR>p^t;tYWVSuBG*EkbtcxUyC)b6&i<?xJZFh6_R+6x8!_|>a6XJ3e;_2ctt-$g zGD5Ww{Ppq#IJH|u^QIp?7tK?o!5Y_wNIey*xCU-I%OuHpL|#>14nH6i&pl+0N-Uh^ zzAflvKF=wPl24RIepsQCQq|q(e~nHW3`6$?nUq6EX8@1p{;C%*j+2(78fFjc(WHrV z1e$y`KH8u>j>T3Te|2jxM=uB_Q^oFWp$w}?N<m<af~ILU`0AU4hi0csG}x?+nW^Or zN~UzSCA7S{sL3V66eA78j6?%rSgT^gsD<^+omo(m2dG29#=LJ3!cvjUC#w0cYY`KM z!1oAsedxrm1bbNau360KD}z^c(YgZ$sG)WSFR;jijNLLUhSu|ufg|8)qfe~&G!ZD$ z^9mcJ_TUOE3crKmq|>xqtz@KD8tYfK%BEr8ocf}P(h4erU3C#&?fznbV~Ca#_B0gO z#6}+oqT!$#%hkts6~J;JW#eJO8xD@KFxTY|Hz0`5EI7W6iG4THfS2Lz7xMOjS;l0J zsZ)q80$!nSv(d0(HydosNVsnMN@H<if*(YY3yVYRUm-5r_5~`?t?Qt~=OK3jfA>Wm zF_5qqSjPf|g=*f1Oc*s!NHYlGr-aS2a@6Y%wuA8)xj(=<C2X|%l;_(ZPg6f4u8&T7 z04tsG+ENSGtBheqT@4wW<wB-l43&2MZ0R3I%rPAY%ci-F%!D5`E^QpI;to(E#d>F& z>yu1u>-iw8e1H?U;UrKaZUId2<2tV6qb*4pQ%sW>ye?dGm{u;=Hieb9|MJ;gBES#E z_g~z9G3J`r8Jx`jJPJW$SQsQJ3E)FWNXMAfqKc&RaBX)#4H3Xpf1&R*#Bq#JVH}i^ zZ4WpAu_aV#on#N;VB9t%09*!VYR-slDL-^V4WnkU8k-fjFpwv_HvGwfP!I5(AdAar zO)?{WtuuhCF+UNB40x*%QmHbQ6{7s6>JSciZQQSQOerkLY1Q;c%qR2^T4Q6E)*66w z4?`w>1a;uIqLOVWgS!3&1}p7rSTeh5Aa*8zDlUm?s{7KH(plSG$`CwGtVgAU@CC?5 zCsEBZ#yahOi0<&I*fXRkL>b*3%ouYfU8r?<DALLL#dKj3<51wnBqkY>F}UoK-aB<+ zB-5O|w2Wz+I770kJYcTX8p<?{GL&h-r9n*7em{O`)4OHCENo+%o~7kW(=5vu^ejsk zsS4`da6)C<(mVh;;70TV*}B$W7z#F_EMn4}1$kUU))=Pn0To~<Ci!)roZa}IE}N0v zG~+EDX-)mSFXqLrYpYH8>L(Dg3kY9NO*GlS=|>v&p6nXw^yaKI1f2odx-U)!vy#}Q zkDbVK1F@!S(tExVlnti;reUnyOg`rjz%4fQeM3u*h+Q2aW_gAH$&`!Cv&)9nWNP#* z1G}pr5cT*>(GjAy-|6Jw^pZ5Bf$X#y%DqI>aOiYYEn`^6&DE6zcwpin{c9xxZCiff zOyR|r3w|nFPIYtX&qSVH-G9Hy!Z8pT%udn7NEl4#e}$;&vU>9iA+^5VWxbbJ$-^#^ zDPFA7liz<|jze>KO7wjAZuqBxxVW__$>@<VO9p#(5CTWWL*}esh8&(9O7C}L8v!(S zXoH!-WC}5WhTt}dl}I`WKqC$EKV*zljRJ6NF_T&JuNF;vV(837)momAHs0N<FV1KT zpft1NZ8AP+FPLWvEnMd|Kx=lT|7B8?<i14u4T6Vh7fko;(q7(fD@3MY3yVIq&oIqJ zik`LNE`I6Dp7^MzZ9HeVKbR|ti50IS(~P8kK-rqfKU>&YwO~9p1~)^7^yF)qK}aIB z_~BQAoeiXSX^D2w*w-yD!F01?#@n(O8A!x76jNoujp?Ovw!@)VI)mFo24>Any`@a` zWXTF6ZpVO}g0F}e?+iH-uq57)BTsS1;@0;g&AF!U3VYZ_&QhcAEcsA&%#ygXy%-@e zt}0s6!uhOAq#Xk$WM`zcEp_fq)B0ApauX>qHrga7p(RGV?#_R5MZlk#m17G|D{zDW z1~K4*tBT-})qYsKbT9cU#%4^3On~{D1f@|0_an7M${l27ctc|||K$Ovx%=;D%;*1b zEI5x9-Wdq<J+$NB|KwzC>lI)k_EVxfo3d=JumO!h)!^YRk(BfK%XYWS%Zf^SmGtg= z;$I9$H|pnQL!m}pR5?ub@HXerE9R5~RF0Be2kLqLOYq@|kumqB!-(<!9+?%au}9~~ zDr9dMy3LaVaJi|X9ac?;|8@^ki)l}zIVJZw#qf|v1Ip}tFLDE|v+E^x*>eU)@v{1T zVqP5)$LntFCijLAnU(QQ1Y#W&I+ffA2su^BP(AhNYU9HYLiHBaMB=b^ccBjjRG1u$ z=6{WVaVpx3d`BvWy<uD)Y~TT|LJ|UQBV^ngULySVtZ#f^s)JCf0WebeA;1=zn%*6e z0eWG7d;fVw;$h8wT(_uzna(3&$?3Vt)kT=CZ^QNB$+WNNdh$9A5KgpaTQ51W3F94z z{I;ItwFRuBtgO;eA7RR|_6sC^waJX?s#E@+)8V^m*Y}36#s(N|xQB%A>`@`3%JxRb z<r}e=3^|8G86)<>cs0>S1C|+YI<tqBO6AFwb3KTegpkQ3VU{uVsL@{_V{*|ZKg=HV z$dpM{c=aOZu!Bh%J3Z`Ws2R}8j=-dG&=$g9ErWqeaAThdVM;2pM<S6TD*e6D>&zuA zl%y_{rrwELHEBg09D-C6GV7Ps8<Efk(`=m79!5xXkks*LWWgQvYSpMWQ~CHdriFV9 zBk?GuC~V-~(d>5qm$|ZFF%hB${M~Qf4!gP3UtVl{ht}|aclMBiQo!SQ+$&+YJv(<L z%lR$fAWF%-NbsT=lAbx)<8&a^<H3=ih}HU;3f`H$NX;_MvbJvW(JH^2nG7-?=eZ=Y zR96mbwhcKgr0O2_05O8x2Hw~J_hQ4|m#)%#j_+*MDt7O|3FF`W2Ht5R#qOOAUmt|Z z-Xn)3OzP}Stl8^24`EA?!vAV7PSqs&ds2cQk4Q-Oc;C6;WRdy+WINj9%m;I-jDahv zvlJ(SkLS9HbY@S%hv!NHBFqlrrm|-`nbwzqOrbT#dylVKexmg92#ky)dYgb|k1E6> zO?}L2C(mLhM8H(WIE|^(b)x8qx%MVE#7ztkMpw)tcqEWU@5#PaPj?ri<2@)Knr3wo zZUHjOmDJ^Tu_XeBpiIq1F%{~r`_yR(d(t%F)B2I;VY5ZEn**cgu`pJ{NRcyw+&=ys zujqmR8RQA{MdbA1Azy{2&r24mW^OG#3-mxVIl|^TAFHWLN>gxFig8L3!Wa<}f7s?q z!=Ssgwd$Y=ULC|=v>DDXqoG9v!M!YR?8)AhoEH?50j3l;YFb9+{BzqP9r@lBE{zOk z?>f`cYYVwNytbu)%zfo4B(|V4_hx74Kb;Bjc&=usmUE&*=FP<Ji!e0p1A5Zb$uB~T z5Rk-ZkNt9eZwy{To9pt$bK9)Y?j!hIWBx^Lh$X1Y6cm96QIn^gzj4F77dl^Pmp73! zFSZWAue>0qHM`u3S=~d$B1-d)0$EHG#ObjOccipHETC&R<*~q>-Q98tv)`B>kEx+k za7xk$U!!zRu#*lV8+JEuD&A@M%KJa=JU(G5_xKE+I8j9c*?HV#>wA2D9<BGI;VpOL zi_T++A+np5^*<DOW`ie#A!U)q4J96ZWK~n=#})2z5-N5Vd2W`WDVpx$1$n}7dJ(X{ z>1+1h2DZ5~eA#GEhGR%H*oHRkV*4IjXphNoOJ4u@+GUcZpo54$Rz#T9zWG!PAOVCQ z6UkjgVlSXi&d|dB>A$(|JSL<y6c0ZoG~E|@e`B&C+e<j>eSUy<O4j)n*(A_(24|=r z{v)OKQWLQc?VE%9EH@<_jFnn}qsSwD3Juq&3bwVQ=!khl{eqxqF<*7_P=>({a|U^0 zm4&}$F2*QT+rt;&^V+x0kSz^U@8CIvUkB-&o19HLiCXB>_mLj^CW-&y>HR+-0+$3+ zx*q<~q<Pn}O1Jf%AHaG07MFkaSoQeVm@)0y0jJ5F!iG+PzsgxR!w-zn=s*BLc=u@S z{YE&hcMO{MLjyomsr}S4G?Q5PW!Y6LR)NJ9H_b^GodPi!!m_f?FE0|vCslHksHfKz z`F05{N7vXKv~vIN5{%1+*AC#;+3+S;Dud)a2ILPp%1Jq%Z1l<TY*jj839Ac08$L}P z`L>FU-iexHlDr$gu!#nqHI6I5yUS7#?2m35u6947z|j03*{tInvTt&CeW>7M7mRuZ zu2+jpR<&{TY1RX_IGD{QM-NFVmC$6HnLu@Y|8@<fFyo74HsQ-7!8{9eLTq899Ci-0 zO2WKv=O@1sm`4Pxx^fg%)9j6j*GE9cc5hucxNn~O&apnp7sOxNe$-6D*5|bLJCjW~ zz4HVdh&NAXzgkOgvHdeTr?;Jbv7?ZT`z$7zn5qPi2yw7Ki4sp-36ySaKR}k8?}zQ( zpIpnu+1a;41pTLuO^f=Hu}X>6zzmIb#fVi+gPlm4`-y*)2%8Kp(bN&Nyz|B)9W`Th z%TUPnv_Jn@?J)cEziZ;y@85rF&$wBe^7n5pjxmS!iTwg&ihR&{A`IQow0)A0ddk)_ zq_GXu9Hnp62;4#0emQ0k9*3y^7UXC&bX@C84db21m^MTDB%-TVNZI3nM~5>yBNjNd zUFwLu<q5VNvQwRpAO3yb_I$|3kyI)7MKWGig(M88uP6SYjacbP2#`g;FCJpOL)bOi z=-ojP5qq_V8<9w`HQE}r<v|;GA=Im8C1P)myqEN^4wvo_tLptcc787oS8`f64Njv8 zNifAcHXS<zwh>p@GhX{yWGMBk<*ZI?-6tk(tU{d?N#BPIU%S7Tq+HR^f333;gf>@u z&rNQ1i~N|4g7j<4^nmXkT!|Iidv+}#8}=%3z&=TIj`5$)#|s1}d%Onrc}v*%WK_N) zohLp@(px;?w<f%8>&v6%ZL(h}g*9Nt%NYRIV$z_%HWQwXe)v2}o&VPfTU1{EpWm`Z zrATne{BYXN2mAxMb@6KgMv>hy88#!vW|1$RX!r>W(0MY!%9Rh^69l_}n{o*0%;vO^ z**=-PoJ?-V(G1gPxyA&>&Fi;!^5Lz5$rQ4Aa$8!`&J%$G?%#%5`Q6|D1zFgq)6OSD zS$AxLpA5%vJbE9>24AzB)wlpBLRc(BKN0oNyzhK6dUYCCyHEU(13$q0qQ4J+f24uS z0(2kWq7Ii1x}U_Z?r7D-w#3Ni6ZK6l4-&lMyz@z%-Ex`xzmX@g^OXP3P-#O^#OnH~ znO!cz1w>9+T^Ctrfk?GfG?f>sOaD>o+@_YW;5_#P`s7cC!mz{y;pvd_1G;}YygTeX z<sd*|_%zWno>D|WG;G*`xHx4*1MwP7F;Q4Im_f+@sgx?#&QnB35mrw_I%{57-KofG zFrE?fJ-xAMNA?$=iYVa6oo5*36G5LofKW~v@8oAgT++}H*OS-dIuN8JuIDNe?6a5x zzl(5*tm`v4y=2!_HAbz}%efO{{O9j$t)7X=FmfzzWVzzPqVrjXJw=@GuL%Y<!Wnw_ z028B(_<-Rhr?W_YuMzWizx&D8){av*l3m}f^{fP`tE;4s&@^Yg@WoO`_WsOPX){za zypJAujq!Xoe2F8iCq#!Nw9&KS%@sc28Rc%249`L<k(DBTo>?=`Z_gH*(PzhkCuKS| zpF}g#V6PV)Wn2k8$oOnMaK<ys7G8N4W5#D^L-|0;QKEHcd3Kh~u*#LW{<Dk82^q_? zFw;teER?J+_2(&QmVY)}^Eb3noo82Nh5Rhk8mr`If|xv$)GONj=4~uYzmJH6xBRpF zPZI<8nWd9hJZ_Hh5d)<2?En0H_QIyxd1b51eEoWNmpC-)m-(ku<ipN~$2U|tgu<qz zf+3*^KK}t4s|k`DFe#0#l=%-Pw&~9Nhe6Tdz~?`-d(D5yr@>GDi%pD;eVd|b{^L>P zP6xcX=Kten{;MS8&Uc^x5tOtFb)4q>%Q7&8IpMUmjy_e&!Tih4{qG;5ub1TZ{U5~4 zc-XoBgCwf>f-TFJmPXThLtcMa?g$}(n!ew51zbLdEYglN#SGZ!KR*M97{C7m%RinK zMj4E>^tZBqP8UxZ`IGPe8yU<GtkDROwD8ou-~IaU%oD*GfBn~|-Cq2q()i6!%q5Xc zmT&}9m!13nE~DAX?c@H>MUsV4@Bi}b{?qf${Vxy`KZR}Ye?f4V)agM^8tB7(+xuVK z@fYsg|4N9U6^pL<4!!j7sYFC~Aw(Yj=<NPK6iM>%N3X{BpV2y9-Q6}Ff12PC7oCSc z9Uec&p{dV@uiXuB;jXiU)_M5TvCJ4bNwAtU%>i=)K&U;g>YOOD0IsQ>htGqM4I+Te zg%dw#yBou#jeQOstl`sxL^qTLoY?Xa{ta9ga5Uj*ND<RX;gzd0at`^qaT>hx4mtVo z`RU{UA?~Ep$qVHDR^m%lqcP8a_?)T(y1V4XBkPJ_4aW}aBO8gDke6p3x9!MTBD#*5 zU_X4$`aN_xC|)i~)Pu^%AM!X|qQvxgU@!Z#1kv%GSQtF~CV`4P`)`CXncaWUZM+UN zPY|BEX@;m}IuE}UH0LBk`ddi!Km|jQ`sJa3k({aFG<W_jRf*SM2z<10@F{r_gd~0V zE!Q;*uAb$$_y3iurWO@FjJ(ru%Rm1i7bHrKMqvEUe>fezu;6hD_uubi^FKK;I01h5 X_dkwN)T?RdUw{7(KRlu2xaj;}%7G-K diff --git a/libs/pycountry/locales/it/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/it/LC_MESSAGES/iso3166-2.mo index 82b1b09415abd4eb3cf6336fa30cf97d2f9b7ff0..ce73070268f67c6092dbeaf86021f95b58c9870c 100644 GIT binary patch literal 157445 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 literal 163383 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%0D>n_dsw~5!F{r;NqO>rx_ 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 diff --git a/libs/pycountry/locales/it/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/it/LC_MESSAGES/iso639-5.mo index 77fae96590c65aa68a3be11ee6584e823c5a8123..90e46bcb881e20036eaa500ec52ee39bd197c679 100644 GIT binary patch delta 2560 zcmYk8du$X{6o)UAVkw0}UrNz3mGW$>C~YaID1C@ftRNJW_rea_ZMWOnZDYikZQ&0w zAYwNfiK2<|fktZ#(fCIjB1vN~iYUPllUg5%iqRNNjQ9xp{W=HJoBrmz=gi!5&OLKy z(=&@tS0%s9nedcjw4!TKSDJHjd^C{@!<*z>0W5|&uo`B=2ABu8z-h3<*lYei<E!u* z?hlxK-s~SCag#1BGYC)!m7o+V!E$4xaXVC^xG@Q*V;_OJ@I~{#3yZNofHUAl^QTP? z*5^UxnKNo9*%1>3SOw?6ZT7%^^FIx*#{W9Zho|6dcmXQGKTsVi$O>2vm7vbJ32H+v zP#xQA_7iXl`P~cVcoQnoAXLEfP&@nys=&)o9mtsy_-8`}t~9$Is=!T<Ki9@Z2_J?t z;Ss3k-++oU0F!cj%tQ%>jlV+q)29ZB@{RML0xg9qunEqBF{n-)f_m4lKqWY7JPY;w z*H9a}Wd6)--oGlGNjBYBWUMi6fNJF)$Qt($RG|m#{&P@)`=JsJ89%rC-y8pgDs(ar zsnAlWb@kKeKbv)1aj5kzun_Kp{JCRXl(^sQLE{;yR*ygx_&e1440a*E2X#iOAi3RU zV+&Ngz3`85&OMf7qJ_O|OAj7}df+w4E%%=JKZGju3#f!YKytdjq1I>7My)S_+F1ou zXB*7F)7SwyMy>}cUh;8sJPY;xAGaGr=068j$X8GaeuH!2c($olE`ajaLT<VBP#b85 zD)2$Oe*kLTGf?qP228q7ndne`3sw2QP^~M#(5qMmwZkUJW?dUp;9jUeeP+J|RmeL~ zI~;<1`tCFH4?}hCXQ(&|s`KaaMkln+SOFEd4yr{Pp>`C8T9|+e{3xVW*9X;!<4}oD zL9P1)^3&jkp$fhT756Ww=d$=zrjp;y&;-th3bX_&@H(iLMW6={8{dL@{w&mvN1y`# z0#(>Jg2>K-N?Zgp;Eho0s*NjQa&(7GRB0G0U<cH~9;h8Z3F(@98LILDs6eNo)?a{Z z%6$jb;>(a)+;rZb3R(!Yp-RXt*8sKNFQorU+=WAddY}q83>D~kv)_i-VZRR*cm(RF z`Vv$@MI0cp6squQ$k*kzqC1g?8j)h}K`KfGtkwJ1;VVNLK1xT+WH72w4N@@^klMH% ztw%f2-AIL88S28lsKp%mqV7ktP(7kvHy&wRk5=maFPFu*HGsPXs@>aAEz;Mp0*xKj z80y3>v<TgRijcaQh8ClFNJD366S_(UqdCB6$C7I>D$!jiWH)qpG&Uf;uPdXKiC)9l zaSuiv((4;L%EuV`UAWoo1{guN2e$Ul$wX1K3N1jpQ8ChJ3h@8+HfDFA`Dh(ljdq|4 z6h=B|8k-USV~ma^TqoLmp)mlNb;3)~eW*0>x{YuPy2)%Es->Ezj%5s{hhouCJhggK zV?kRq=C}G@EEJD)ha!H$)r8{VQ0m~ML#fUwg{kb!?vhTwJ?1Ao{9Z>i9ErvgW!~EM z&aUoAx1aFKcZCvu_{6@<{){xjre^2X<=2FQux?G1u)Y_>+>!f8Q8XSVv+srdSnQjg zqbu6{&gkxtSL?^SIzzG4x!ecl)+%4S=UcKej|8DE-%E7IybjW~N191{qBief`hWgm B`KAB> delta 2265 zcmYk7ZD`h27>AGPY;U>RYi8DJ)|$3jIcH8YwM|RSR&B0K&DIiGxghF8T0E2*B|*tk zBk3JsV5kK~SU3iOguRGg6j3VrREl5*l2TaL^*r|j-R$?j?sLxn+~+>`|D0zB+YU|7 z{9HNiorJALSEHq4Q+ge~IGzXgadAqu@Do@G_rVJIJ*<W&;N|d-;Fywpe`T-{Udi~J zU=K9jAY@)9ZNV|%P;fXukiHCl3$I}O7_5S)qW>bCNV}pmpFmTv9h&HpXs?FOdnWof zMSBR=v3~j#r-m24fer8&H1I#rOl!;XY=#Ez2=+n~AAnY3L$u$7m(l(x+Ph&L?Gb3a zBhU?<hE=SeF5+0i%JTd`12piAXm>&r?1cti4_$C0oCM#3zP}3^XMePRgzo&O;MwRe zB8Umpz>H2Kj)7)DGwgxa!l$8?cmw(khoK9M1`k8u{}meNeDs%2$R{`n+TRjf5bTCl za_t1_kDp%PVWzLe3-3b%?}09OAb2#!e+yoKCR)b!O>`P`UMD1%v=UnS0eBUB1sd-I z$keo_g8JJr5(9^zrTzt);W=o4VqUVp9(qRFAVX<IZ~z)`1N>_YHwZfKWrFzLcIfy{ zXhrr#|92T2Gd&LZOTY7AZu%P<pq#R}qbbmDJ{uaa3p#HN<g=zh==I$g{qIKqFm%Da z(0K=-l{ymb%o!X5{|n8qnuZB9Kqs_919SwJL(j@OXkwe86?qR@;!$Yg#~~rppU`;Y zDW7rbpzS6|{7h=caR-YbH!k(&2T~ujBF{ntZHfNv!JWacpn(rUD{=z5k(1DQ=b>@S z$rd-&K`YP<%f0`LaGcl;xrwO{n&BWca0Z&-HfZ1vgS(-D_Co_7g*U>}upU-X2H6Uo z*8{C+KQ!)hu$1-FtI@Fyy6_IjuW9-MI&mcU1I+CZn&?Srz;n=fMch$$Tnot|O@$^t z9~x&Fbp9&Hl=Kwz{H0Ae{G}ltmg+O;j=qNO@GvyMDd@r%pn-}QG=VB;oQ7z(!O652 zLS9Y%@CNu2G@%{A&nHrUGasRYTa#8J?HbgK+R-%R9lsP^g8WByH@X+yj_yJl=PW&# z^HRDk_&9VUtIz_p7!}NQJ%2gt<LM5yThY>-m(l~UH~b~g@79VQMJv%VbPK9SMQ9<i zv;}(@rwv)9g3ZQRQ)sw;V>G&h9k45WF%MmjEb&aF`I+uRJ;+aT5Aw`dc8Zxg(Vgi3 z=7040s0rPK9zz-L@;I~zjYUr)Z3Vgx&9Z@cvhPRy*UkOVfSk4P^w2$o{MK_&!90YX z6Tf}IZpL{8O+imsJP$-aT8{2OS_7JarrW^gB7a<_W+#`7WY3h$&32V$vS&-z@7-Ls Yt2jHadS>?R>gTg9HS6|{)@&{M53-21hyVZp diff --git a/libs/pycountry/locales/ja/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/ja/LC_MESSAGES/iso3166-2.mo index b802733ccc242a230895f88ffaf8dc7e6d805096..4d483138edb67a2c157db5562b89486b5ea7490f 100644 GIT binary patch literal 99516 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 O-=`kYPRW0S`A$Eok5thB literal 100171 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 HJgs~KVB=+L diff --git a/libs/pycountry/locales/ka/LC_MESSAGES/iso15924.mo b/libs/pycountry/locales/ka/LC_MESSAGES/iso15924.mo index a7178ff4218a0d6e260957a3d0e8c4e624acac6a..124d5a494197a8bb2c744b351b94ec8a2372e884 100644 GIT binary patch literal 6755 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 Mf=~VVhlx%2Kk9znng9R* delta 1882 zcmYk6ZD^ZS6vuD3Zflxkrp=lct(v8}&1t%{OV@7gwzj5B7`1byh#v+%uE7M8Cz!O; z;!DJS7)4O&MIBaVQHF}5cKsrXI#Cc>{3IeONK1!b6saN;#kb!{j%Am7?(hE3z4zSv z+?Qu9^?F<7`{w%R3~2~!#nPLMabUilg0#NH7_#|A`8(W>{u^$EK8h#|!UmXt+u#A! zN1%*920d_C_1%zu6>~}(GEf2(YYpaM)lWbPFaw+6GwOc@lFgeGGT}w_zpwgJxC8$( zY=kS2Y<{GW{=dR4%y0grA`^>O=z-F)S#=Z!&~ZpM`_<nIC2$(b0!LsQ9D|$Tl=>f2 zPD6=5qnw2v<~MUvfft|`z5^xT2dY0&{RJeOFDYc=@6`VTl<_}7vbm!AAJq-aDjyVp zvVgGa7_7)dyVa3Url1^uFO-1&kZkUtxEbCB<qIEzTo>~Q{I<@R$Dth2J*@5;n1_4e zqp$_O21nqBs{LN}KZ2u;&ldJU2`~mjFsr%(uS3r&--gnENx7!{3(EKwpE2EV4-|bb zlm(Qb#F>FI{(_JFm&!*tlJIM|6E^s31NSNqL+N)ynS&DONo_x`{soxAzXWB%f7Rc@ zlM&qxB~BWS!c!G(SkQ*gp={j>ycVuQxy4?bGB5^Z;)5^-$Dn-S8Mp_|K)%6TgfijB z@CNu5lzzXd-o}lV_R21;^g-!(QuTvSCOiwtW?uDzatTU+H7Mi$P=BPUw!jY9kAE1- z<$M}4w>by7D%F&b_uo&o50jrr4|a9xK<rn??J$VNRqujFFu9<T4q<Y1vgm!-jhO79 zBw65KwPp+_Vh&@nsIBt;yR<<r3?H$P^ap4LHaxXI-$Aszb1u6%inU{sZmOaB7u9O@ znRX)5*a1vlkGu$ZJ+d2K=C8hWx$T=UIm0B@i^(~LvEA6M*lpPViCwI2zvx>qIa|3G za`~=K*Q<y@xkp2)s~8y1+j`GgJL?GrCQm!%oa4p@^7lC|6}#*y*>q!U=W)k%opHw; zcP5+%9G6PgDHY4viENH)AycxK8;>;&J9%dcE12P;dw(&Xvu}A@k4i){Qp!y^W~5wj zTzDc|%(%JJ(r|K;iWzkZPANBm9?iK~LYUD>cieF^<&1sG7vEgS<?SV3tG(=d&)=Cy z_9T+sv1Iq5j-JIg{DXD%srHW4;`;WvI(t4aXs-mi7Vm88t+OvTJNEhDKKo6u(+=&p z6r5X~es*>G#cFx3TF%*cC~nV$(sm^jwO!$$zt-oa)oJNqm&0)zjdTSNxZd3uZ|5Un b`&q;ZzEBHO?M~oVSEuK#8!gzMqm%yu4_Nb8 diff --git a/libs/pycountry/locales/ka/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/ka/LC_MESSAGES/iso3166-2.mo index 2836e638996c1602835e5bbdb60a831526b19c14..76e9a5bcccfdd2fed0d2946e030b3da77d6a41ef 100644 GIT binary patch literal 111221 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 Z6X>Fn&=izUBGNe~XUhcsmKBZS{{uWRzGeUb delta 42651 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 diff --git a/libs/pycountry/locales/kab/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/kab/LC_MESSAGES/iso3166-2.mo index e62f25f527e68695f93fe9b8d471a2ff689f7fb3..3c7467b120aea039acafac8eef45247d2fb273f3 100644 GIT binary patch literal 1099 zcmZXSJ!lj`6o5xf{8{4<TG%K|VHf89OhVk4U@kurOt=_NV<)q@w|f&eGsnzqlDo#v zPO#C&bb^>d(g{`;CrZFhD?!0R%XBtYzR8Xp!3VS7ym|BH{p|aGuJ0*9Ig9Het}R>_ z-2M=LP&SeM$TspQ@}cJ=<Z;v=d;2rwNz}Kz{gvkq(%pN5>_fgo9z(wO_D`OlkpZ56 zMY{Vxk#6mI{mYU3{2S8w|3bQa_K@z~-$>{G$DjA(p|cMlPaw~G{gUTp&q2=$()nNY z`ZN+l@4xNhIXQ*P)#&nbGLU0G&SAfIy}}g8X|JF0bU8S2eRgrkWSW2`lTz}Cld8&u zMs&AVd3T4Csb&f>nNreNF0GJ2rdJ`2IhjjS(Gg^xCry=cOKO@+Qp>nbQciB8Zv)ZY zwjw5Vyhv+VM`fhm-HyN*P8PLVg%!)@8tg7;Ba{rOFzWu5^2i9Q1WV9T+Oh?chz6@> ziD7jW(x$a76Bdhxr-m0A5D6{|N+(71WGkuxhFRciJr#E*0~0LP*b=M@7luu93n8tP zDnqPPX5|ts4Tq(X!4gU^&y8huti+_;Djm{lW-aJAZP(&ip@CkDR2<{xdS)=|f>at> zX}i!=#zLd80TKFvOKAe%l1auBV0BC>q&IogPVs?%HT>^VY~?*M2l7`eZ%Oe1kBYrl zLyCH^Ft;$%>tDH03h+-^kXS^!g;iSEw8d7+g&d<RO|A{t@jLZdHrl)Aij6_D8Ho)P zG70HuBy6ylW}2sLR_QepQrX&9&3I*u=G$>eCun&rxW{gQ1f6$lIj^4%7lv2^)&nvR zoepo~bbWXN`Fz#02-{~#HNkUBrrdPhGO+gJ?Q0=9`S|j{aKY}24UQ(V%$sh$mLVUn W-RHuMmvi#twTzK)yaY~{C4T|^BNng# delta 167 zcmX@jv4<t>o)F7a1|VPpVi_RT0b*7lwgF-g2moRbKM;s-GcquQ18EK*HU??{a>4q5 z6aqNrq^A~5e#_XxYoKdjrfX!XU|?xwVmP^uNkh)5w4@}pC@rVbKg}((DAl2$D8D2> kFE=qWM=v=)ck(%=zd|N@M!G4fWn2tCsZ~{pm8nGx0LkSctN;K2 diff --git a/libs/pycountry/locales/km/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/km/LC_MESSAGES/iso3166-1.mo index cc2790dc3a758e3f827e29de9dad42cc62148983..476ae01774b70fdfd304c997ba72f034fc26f145 100644 GIT binary patch literal 36282 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 KfV)Vyss9D;4PmqZ literal 35806 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 EFKz|SIRF3v diff --git a/libs/pycountry/locales/km/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/km/LC_MESSAGES/iso3166-2.mo new file mode 100644 index 0000000000000000000000000000000000000000..0bd63b419c22941e4500fb430fc975e71c4ea240 GIT binary patch literal 372 zcmYL^u};G<5Qaf8Wn^aXzy{Y)kg8(DP-qa92&t-o1PgML!!@LK<hvmHAiN&W!ewcH z>66d)fBt=cM~A<AqJ805I1vtnGoja5&~kYtYwy`=9>XVA46_<uFp>*iD@Wn|ayS~n zMY6y)M24KKtKqh@1ZB`_#oUrkQ!)*iL5)ji{2)Y|N+(pIMgm5&-fg9#4k?)zu)uHE z$H3GuYW12;7LXS(ov4RG=d;td;weiW4Kb9_cxnuXsMVz7ur}-}(=;1p(PNbMT8!Ry z#v+uGr<D&Lw`W>?t&@C~XS>OUgY)Drct$VJZ(7M`{Nc21jPuv3TA4`5H_zogjCa2N T8y^@U^D>(AR;%&SakBRhiw<sM literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/km/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/km/LC_MESSAGES/iso4217.mo new file mode 100644 index 0000000000000000000000000000000000000000..e152336c14564548db878ceb08ca631b7271554b GIT binary patch literal 5396 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 Lh4p^oUy%O*$FGGI literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/ko/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/ko/LC_MESSAGES/iso3166-1.mo index c28914401801ffdbd9d4a8b29d28cacf503dd4b8..175b07183850d577b35aba6ac7e1a5066bd67a01 100644 GIT binary patch delta 9102 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 IKzQK)06+V?r~m)} delta 9031 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 X<pavLb~{|IY<Xr%XxT4){mTCjZP%_~ diff --git a/libs/pycountry/locales/ko/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/ko/LC_MESSAGES/iso3166-2.mo index 2fe2e1910249078be82b69b6ae492afbc5a3f4a7..c9b613abc0ccf89c7187bc8b7631f07360a489d2 100644 GIT binary patch literal 4513 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 delta 1560 zcmYk6Pi$0G6o+rIw9`M74y_c0;$Tszb;?i%D5K~CqLi43m6e3Wv-8vk<C|tW6&56e z1X$oKOdeH;X@Ufi1dL6DPz95!Q4`ac2r)54S(r2~W*QT9rwhN|^k6)BzxUm9?z`vQ zd*`(8_x#pXy1T4?!eLLKRp_re=bneN_wmAFi=AtPO|SvRVH;cldE7dSCt(af4O`%L z^M{PX#(hxvvardylFKn@Ch!KVhi@)SxRX!?--b&3F4V$v7QbZik1ak8N$6&v@_h%D z???0Rz$N%|P<j4@G3vX&8R$gyR8xWus1tNU74C&RZh)5(Y=bKBtZ^9XyZw+<?iIKK z=Abrk!sbsw6^<Z}dyiK$_1$>}D)^C2d<wO2#{93L63;?y@Rs>M!?pOoLVe#zb`@yl zr44n$+CiW;+zXW_4Zq=M&cM=A0(E3<g>iU4Tn$wyZF~x<H+DgN=Uco0wf>0tW#c;* zKL_>w6jVEXZvGdL$9><#{p*9DY+}wP{xJRnmowkM_Eo6cn1meKZ8v|XaW7<v%Nj%2 zfqxjPPT6?Y<}d30wP4C7KC_8$&Hn+a&|QnqL2c-Fn{VKLwXqJU0zFXqQWnp^W%#?H z^6WQejR#8%^qUl*79KVpgI)M#sD&3Sei^FJHP{ZnwD@h~FOZ+McIu6geg0>w8L3Z{ zcMIx6>OZ#*v99(%K)yDjPTz!j&{p(+i{t1oMkkZ0+v%m+O(dXt<({Q%u>M{EK8$)7 z{E~Z&fx1;TfYi~CqLoM|eGnzlW~Am!qkbgQ4XCjmL2FP3Z9^N7>;cqS8(AMQ9z>5L z-TESJ`5^|fZoQ&wjf0&#@?q$Y6oZlRqT4ZE@V@%c%SWTJ&S)~$*R{(#<OP8n%H@JE zAB?%7FdKNG7hP{EN4uLxS9#&9-dGTNq1!X=7mE4Ba4?d0FO2&y`y<hYmbH=Ja%XEQ znMx-Iwj?&DGn+Q|rLgAbys=_(Z@~-4a$YfC$Ru8TEeH?f6MMYE!NilJe!+j;|Kw2X zqPoTD{#5@!bY#ha<<%P(D#t&Ve`~6G<GPzadbKinvwE@|J>9l4%C-&m%uk%Do;_Nf wyy~ixH!ByfR8CAUIMbEWr>hgkE62`6FD;#k*0i6BX4`wCuK4=snfShc0Rg4FMF0Q* diff --git a/libs/pycountry/locales/ko/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/ko/LC_MESSAGES/iso3166-3.mo index 49efe1146956e0e1dba6d75ed9c82d946439c675..e36ab74d8c5eafdb39b4e543938b3f3c8034b8d5 100644 GIT binary patch delta 986 zcmYk)OGs2v7{Kw<_$sZ;XKy_rQKsX)<0~2!T7*$S6fHDbP0q!c8oe_2YEXnAh7>^$ zlS(o~YawMwql?fs(W1wyowdkCv}ooE(Xv(lZ^ppG-1|G{%$ak(^L=x#bfs+YdvW%d zqG_Hz@@!D5M)dKbeZbxL5v%bh9>T(`%=#c2j5{z7N3a<0U_MS^Db8X!zC+pPEACQi zP-SJOJE{T;`Qiv}#S<t$?8MF3v*uOY$9M#ba0bh85p(g&+WazV#z~X|3v!g&flVm$ zr?G(Zl})FfiEAh~e}!^`Z}^^Utm1aYuesg<{Dda{L7A`Gs8lVspadF0xk&%o_y%rc zd>?n>H15Z@SkC$C2OUzO{^Axa+oV(pR$&z$M%nlR$_5dX3=E;9^chO&7Ev;=jB?-# zR^V?;myCMI`XI`AXK_###^}ff*HLaZjuOCUBmwEBc}sBro2-}3<-Z~6mnK0<NhB+j zS5@-Jfl@}cQdA<HS;>wx5_pmtWNsxjCs0MUmHhYi@~m$pCmoc`$t@*tX;M?UjY`b= ze)%fT_jlV)EHn@e)#`)i?5=1i7IoZe-EM`gcqle{GiR!(zR_<6_-Hc_G#hG6bF?-0 zRBOa_`<$R*L~O^k!gW`yi?NVv)!FfGqc3h>vbtQyh&r~v%MM$aUPGX{+23GXwvEvj zxzVF%V*Q-pZ@1$;PEhyurH4*iphai8ZDvb;r~kOsOCYWt59*H05xS|a(I2)35+!*l z-?1l?$;700>t$+UDfMR98ynW%(96~F+urn&H}Ob&59d;IGdh`ASbh8;xiG7|r+2-H L`PB3Ib#wm!lij1W delta 776 zcmXxiKS*0q6vy$?sCoXaH75Pz-`FbRpQnkXw(6jC=+d!>lS3*JM9q^J(Jf96ZW7`k z*riiDDZ03b4xMZfoWwz01Z~GsIu-i;y~GPIpL_4Sx%ZxP-c@8HoV^T{=8e|M)5H^g zVAh4z0e)yZ*oeER`5)Mge^Kk7mzeeAC_3n22$!)E*D;KFe2iaF`y69~S=N3PIu<N7 ztK~%-KEycck7HPk<3&GW8)Faaa04Uw8H0FGoIk=S<1^HOzws$Hmlfs*v5NC;g3bUh zrcgKE#96ZN1)ngE5LPF;7{hVY{2KP+C)5Q`Pyw75$G7;1@gIDK!E&<>jG{8}4jVY% zCh64R3fAKqzQ8Ti#)qg4PEe8Gpf+$S3MFVkMLvQ$@GZ9B2UMxjsP)@O%55LD?i91C z;WZr{{0|A-{}z;b65zKgehI>F`WCcSP4&HRx`3irNt7M!tEK?%n-1shewK9s%B;i} zZYTMsj63-CR7MnqYDVe&3^ZfO-nYPAAa_xguZzEOV{hE}%V_-daBQe2Hk4ZpzHiT@ v6RE|yL}tcIxtZz2ygTcSB|R@WH=Rs-OACvAQ{H^eac1^*ou7f+_saVJ=Zj1p diff --git a/libs/pycountry/locales/ko/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/ko/LC_MESSAGES/iso4217.mo index 38d3a86eb211bae90209868628e0bd324f760a72..1080a48bd5290ff2480aba802444f53e4fc0ca69 100644 GIT binary patch delta 4547 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 delta 3732 zcmYk;32=;O9LMn|5|KEPAaNyPC9XIVsVgF?EmcBjg0_xI5l2Hs-A5M{w5YO<N`)d( zQ<ToCc19g-X-6^Isp%9gHO!!NjH|Ax_WRrYo9R3I%jbQb_j#Xd-`&mfynB7T=W2wl zb{tzt0?DrE+<BZ`nLix&t2tK_A7CY{7Udi-7iTs?F1d8G8&;>BgVC6eyj&4~!f-Bz zV=;2w>y~m7L&bVjM?0;&4<jib$29x}(=md(I$<Vuz^TY3_bKZB{pK<AH1cwn`J;CC zQ2mB8Xm!SSF`TGD62@U$tcpD`6$hYhT!?D78hN>L{#3!es1<*M+O$)s`_H3Rdfm#m zk<AS>R)68#RFUyr94D%XM{QAa)I{1?eRt&L@~m8dYBvRI;Y`#-R-gtfMNOm(HQ`;T z_6P0yVboiB487X2pE+T2?t)#og{psuT1iBWpmC^yl29GDHnYsWsDXx=BT)T}K}~F` z)z2~K*I@s(@<mjH;u_S<N>E$188y&0)I`2Sy>~}Y1D&+%r%(f3LgwslS$!B!uI`I9 z8)9JMNE4S;ll|8~{i%?HP!k$z7GizMvrspzLk+OQ$_Frl@=vH8JcAnG8fqbrQ2m9* z1}9zvwG#<ePWE!58(X1PkcH|X8`bd;R0pF_E1ryc3ud4OD7N}#sP}xOl}k}8-;8Rv z3pMZ;sBsS1b?<Rb;;A@|TH#&P01-TaY8Z=}U=pf>bSr0|-m>1PhcL&=1*ip#L$#lY zbm`_<{TkFxZ$%d7bvuG5ZXasEA5atc6}5s(sFmL||3*#p5vrpoM(>8PSPuuH1};MF z+;mhwi;$OF#UJg|c8t{Le=jGR@gdX=KcWUak6Pg+)P$~B`3`EL_fhS`YX|R-LrthL zejVam3v5F9uR8V+)(w7>Hbic9?W8{c*>+(Bs^e*>EibnEHK-YXV&%_K9UMi*aDSlM z-!~)K1}&%_w#Vk!5%Vz%OE42pqgOZ9;sM}6bxqCAsQMgpIO<bSg!+wGZtk$_M^O_w zgId5XOhz?Uzl~7!9WfPqAaixo64-yOWQ8@@h8lP;>c;QQv#1+x*!4(e<Dpy+)vhyY zfE+6iHH%RF7n|!*-yeSD<@VQS|8?V8O6uq;s{9Y?#wv-<@%FhS3=D*-&#`g=s{Kr4 zZf-GZqUBb9&^&><|Ezh#4D~h$c2FC2V`J0+UCn{09T|@r=q)QRMRizeeuld5i20j& z+pbsk1Sgn?>aR0$$$7J_q7XHKIjD};q8e^DzcNpt20Djof7i;<4TJYJK}|FR^$hex zJsX9n?|}uV{?{S>d)-b>no)58)$wKXF{)u)l5^~qOF@-;q6Qd(>TsOZdr=eiA<v&H zv-(5kDZ75f$`8<^&wn+hsSaDC2FNt~nIlmvosJq{rMU(5G24TB?+=?7Pz!mCY9H4q z_zX2c_1_isan8lsjPHhVq8p}KgJq}zH(7a~c@p&na}m|?Rr8@;uhKZ!PXp9I?XBDk z)jr?qCt3YM4E+9=a^j)Ec2vXTs1ANd?aWQo!}2d`r49I6Q++0?eJ|7k2BYqqWc3SC z?bf1JTyEvvcKtvT_Fp%gq(WZA5Nt*CIn^<dY$kfIpC+#n9oo5mfiwOkGuxS~P!rCv z@*J~`S%#^knR?+laGl9IGM{*ejuk=NFw7(G60L^a4*a0#Asb4bA??Yl<jK*KlXRlp zdCw~ON^!I7e3SXIR-t1yDGi(jcS5I2t^AVN5XX|KR{jXzw(}0yi;S}JQ@GO3=VEg* zlguMJ76fr#y>IW6wPYGuND9e2L`PThEO~?UAv%T-{Zp}o=oherEGPdzI#Jk4a!E7^ zBU6a}dkQ5w_yzCb`g2l&j3MKRj%B1J8KDA4IC(vA7W^sJsgGon4J6T*U$wSxV%0D& z4^ZGUvKXHuFOZSsdD4`0BVEW0qR&_si6A=oIdmDMEqRj+C;CsLJJB(iBolp|4I(=D zM7Z^Vv%rVk8~C9upyC6oT!bHzBC^HmL?#(cULg~RJ|9nxjhwtiT3bbm`65mxldN2f z1IZdvPNqA1z|$y<BP~d8l27`Q1k!`(7@$AC`q72HlIUsv<d}mY{+rdaLVR6n?(*HK zxxu$5wvGR4?8MNh(fJcb=6iC-j4do2J7Ki%T%B6JN_D@BO6%AvHI0`iEj^=Ms{d@= z<{@EiTc>sMMZ|CLeH&lyFHVT5;NP0qs)GN5r*VisHYqK{mz&(lzcD$lV$AiD-GA<0 YaBWGM=lYVeYah?^4M}O~+mKT9AD%8_9RL6T diff --git a/libs/pycountry/locales/lt/LC_MESSAGES/iso15924.mo b/libs/pycountry/locales/lt/LC_MESSAGES/iso15924.mo index b9e3ec99b5e353f73365a009f8f9213735145c66..b1faf83711e7e4abd4373e9bdd3f96bb1bd8bf6a 100644 GIT binary patch literal 10170 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 Jxth6k{vXc%F8u%i delta 3454 zcmaKteQecN8OIN{Ox6LVZ?v>!y|*v7rKP2m!P@d(pbV*NH)=PKx&DAl`)hmeW%u5; z78tj(&0wZ(;{@kFQ)65f_Qp(!nW$S*+l(x10#Q2?Wxg!Srppx6KQ<%r^SwQD&O}f8 z{e8~s^E~G{=iHv_{6%x>N^a&ULm5Y<Ql>G_iSzhSE@l~X1H1&6z&D_VuE9^kf4FwW zO~%ZnJs+w+7xHI{`OJqQsCBEL?5%^$OPMWhU?-G;ZZ}~M%%$zQb`lbsIRa&99BTeo zU?F@2Y6DL>PC+^P9V~|LKn0dTG+KWX4B_A8Q&~jET9^krT)P+M(7q4m!v|dZo38yd zWb@`_C`YeC1#}6@!HnZ?p)&U_EP@#eX4|DA{>>UH+G!V*q5V(>2A~2<I6epqXrF?M z;WMxSPD0JU3bp=2sGZJPINN`tV=h#{B~XEeV5)-3aw=u83ueGWZbA|&wTGb`o`n3F z(|ly$MJUHFIlclFz(vOycq8pAP?>xODu556HZnJx{A-{j+nAeSJ=B5@SOa^Y##4~v zGmk+zcmgVb??G+gX{Zgn4$I;Da2d=YeR8-KYJEG@x;vpVboV0i&#{<ZI<%7r)PfO+ z4f7?az#fAE_<|e11ZC*gPyzoQDzNw5_+KHLG}oaVFJKpPxCCl`5Xx^|$_+F_8Q27M zNw&ih*z4Lyp#nSwHSb%l{UlT%&%6G!P>z1&+CPPQHLtq<pF#f23?JD`y-THv$~CC7 zFXARD@>2LISO<4gX@GKkf~TOs9)U9O43xvOP?`HNR6wt|@z)^t(fksU4D*)j|2xE9 z%3P-+19Q0%;sPiG1&$?9M-hYyV5MU-R4O+@&EEl)xlX9}-Vb$j4?wN^u4|u$ntvY7 z)BAs&N(~(|kWHqqx_$@pxbnL7)qL~{Hb9N{K<&hbEHQ_nGWIBx;cr82<VmQre-0{B zKZMG}BvfD*VKM&ApQ-2vA`35aPzkl*R>w_H0quaw#66ItnTYE@4)qGY0d)lDpmsbB z703lBdp~#l4b;51VM-IOQqi;d0H*&3kVoBx7O3&{P-ngkDzzTej*mj^_+glSo{mpI zIXLac&qCQb2X$nVQ1dSok$<J|4LWoy--k+#(xHgU;7V8nHNFSR@etGwk3a=*94Z4R zU;sV~L+~}Y3jPf$b2UV-BWQ+N*RK34vJN`*9=oC1o@@J1jz?fEJOS(A1k?`SgfjF; zsP%t=3hbY5Jd?C3li5&rCJ)MfB~&2GQ&hCD6)H8`p$y*vm5IGjcj5>Pz^_AP<_wgh z7hU^hD8uJn|3%lHaqTyu0(~3G-+NGZDD?pq8C=N0SHnW6h&Mt_+yeCj(go*0mBUER zwjdqfZAhhQ7Up)i27MlFL<&@8{VdEj*pB#FNtrN}PNX14(GJvsRCM<DpgT|q^`doX z45{ove!4dM8FBRi7)M+uy>K&xn$Z!|fDWPEs4_iD<)d=9t8~FObPLi=-Hz@@QKX_& zR;6n^Lpbc}cfnm~D^hw%uJO<y>PGcQWd*twWh*)|n@%|}cOpGS-2oLHflA{nKJi^f z>prv>^`Rc5+pdeI!W}dR(Q334^&^#is3lz^J25Kvq8juW*U4*1moM`D96B)DG(or@ zeF5=PkuC|ot!O;m;$JP)J<{#2KzT?-ujsQ#&-WP8o#JAL%~2|PQX5bi;>YlR7QK+# z{~Arw-i-8GRF==eY=TQs0NIDLH)JKfLDLqF_IX405831P{zd0)G^fR$$!WD$a}L@E zbL;F6a(nIiycIW$c+qeoY|rGa$cTjFc05>UTk^B*-uyCqJb$g7%n!{U+wXf((=m1c z*hK}kwymJu{;FVA>6jOdc=13@+i*OBk!9xg@Mxgh^8+2jVf&|wCVOG=LrdcRm}fc@ z5ibh6ynb)AKX6+l7VWd&FRZrL3ZrEs*bUU|Vq}@w<@ZJJiu*}F+DARw?+tl&s;Jyv zFX}1T=S4?7leQmDqsI>?sYLuCJGo@d$>KJ<qxhk{E9)DZ>YG*unwnZ0Tk0AqSsh*? zS>GM^qKP3d8H=|DcE;k-@Q^<+oCtJ}cyWKgi+Use)Yp7E)(y@MCN;3>P&}55u}y!d zVSg+#kyA1{C-atu)miqf(zf{@=XrX<Ze2QVuPnW6FW<bymX&R=;j(Z#(>Z}&`_(|@ zyb(W)115fy>tn%cdnQ<FF9)}g=f$?Eyl~;5n`Aot157<u9<)CxZ@0TE)|QbavK=Gc zemoLOkZo^xz+(gdPWbA~*vQo5wxV)tZEU~~On=AshT~I@Cjy(}-oEJxavY9oM&dt* z?8(Zi;?9pxX?o(5r_@+gYagu&+AmifoD;Lxt4eHjC}ami_x|7W2v%>l1J!MFw@$z0 Gn|}cs;lh;w diff --git a/libs/pycountry/locales/lt/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/lt/LC_MESSAGES/iso3166-1.mo index a266cc967aa63cf82fc6deb9a4c82d94569a6ced..694745b41d9145108657f04683c2f5492c952da7 100644 GIT binary patch delta 9787 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 V@l7o79p5@NICS^}!Q;cv{0ojcf`9-3 delta 9063 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 I414eY03WB#RR910 diff --git a/libs/pycountry/locales/lt/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/lt/LC_MESSAGES/iso3166-2.mo index fc7a5feb36ba1260bccd1c9541878bb30744c40b..500b1ac0c78dfcd4d068ac7ed6a5d73eb8e12718 100644 GIT binary patch literal 75519 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 literal 75936 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 N76Xu)k*GfP{{h!UB*g## diff --git a/libs/pycountry/locales/lt/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/lt/LC_MESSAGES/iso3166-3.mo index 53abac483b3c0cfbbfd7c652c02e7add03409ddb..dacbd390578f3ee1b643215d0c8badfea406af29 100644 GIT binary patch delta 1066 zcma*lJ4{ni9LMp)t015Vil`_Y3}7qX-g{dLQd?v~WpK~|97}tJV&RhB3noIs;6QvN z4%L`wT-b<#g~7o|qlr$$O&v@e95iv!-T3|YVH`cl>F50K>zwmD-EDu?vG%#G_MxI_ z`Z4KMN)3qB{LtQFC%(fFe#KMRQd4?9jwbaa*5f+1;eBkx4LpcjcnDvieCHz`RccMu z)D{P-3tPA`g8T3y%8OIjjPqr0Vh{B?w&EtX;|mPn`||Y<sHwlBOxRSX)M1RFT)%`( z%&%Mq5iYEt?0g$#2cK}9-TuJi)PoI51@ST(xPp?*CZ54JxCeiuOw>TJ7kf}@6OZ5p zv~e0wFu!`hpaY+y>}VJF;}<-DKg)H1Jmr1|hB1V4e+nhq9Lf>gLP_#2_Tdwh314Ct z{z8pyP2|s5MH!sLQH<g>lm$G-DwL+_vYSei|B8G}5|H?%$uSidh#ar#rpv<Q7-b$# zqL{2KP8y4y;0#K!$eFWIMcRtgi;=_MMykc#$^|)RS)eqDmOqkGJ6qM?s=Kc)&A47J zwVX|z*1;=oI-AO6JwK$!os5%D<qEg!Hd-T5!x}d1n6`%FvFLzh6%v8o=IngR8@s-g zad@HN1axB7_ZPjmY0kQy?_|O^oatQ3cfxLd#$3$1b57d#%&g}cX*c7PMp1ic$cUOb z-z+>0+*{Lq+O~8uscqfguY(K4+R_Pa+j@0XSL#u1kAy<{oVIja2g{G?(WH*ZYo(`j zBB@9I?<+Q6iG<EJPIVgRodq`SyZN}DEUjM0!j_S7mUr&d57zWfRKl8by?@fmF1&tJ LNi1F1ZtVF3Qtgx! delta 902 zcmXxiKWGzC9Ki9{q)BTMt*LF(s?nEX|3pc=mqOHNY;+NHaj`n7u|~)rb9y}xp%9$} z?IIx^oCGK963L{4DA-X1-4q;j65Tqu`u$z5Ke+q6e|Nuozjv<^pT}E2Mh82JILNi1 zYivNNG{yqlh%WBK*C^wk@G$;ESw9_A>L@Pa5ZXA3_b`HwaSS^+fg33A`G9+sYN<c{ zh6)cVHNr#+ccDRfu!J$Z<a+~C^lgmeQyj+^7{)jL_<Pj!zn~=C!bwbq`r~<wl3!h> zkz-;R<;&OcCslZfN&0JSYaTZ+gI`f9GBB*vaZKV4TtZ239e3h=zyAoQ=s!n;Z*dy` zVuJi?gr{XEbGRE%;2u2h_pkc%Hf9-r=+AdiO8OC{^xsh`_zP!n3nk$c=WqZopvD@? z(LCYSnxnB!LlVD3HtzikQhEyDMU=ZFkdU3r$4SUbwnIuU$z>x6F8Mbk<mk48^Hyxy ztFq+dn5FRjU5NZsUMb}~rG)a;Qc{l2E1?`mu(uib9cX_Gb>e0rW92d?uT8FC@<*(N z_Ji=D(A`qG-e`Bjda`cczH_bNmg;u%R>i3_m#Z~<CEIY@v7xorjIoMEqi1Jzlctp_ z8lxArr3+sFbTKDW^WNMkW9ik^{yHYCGz$$2bLo?jE17eZX2mJHwo}kcRmUxt8`{bq n%bJKf>r~y%o<7rb%TC>`-n3V=TVc$0s<qz5;fY}TSv3A1gNtlw diff --git a/libs/pycountry/locales/lt/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/lt/LC_MESSAGES/iso4217.mo index 3119dd8bfdd3f1551398596244aface3bc993d71..1ac600b9da04c3a894393a96b88051b024d70c56 100644 GIT binary patch literal 10089 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 UcFl{hTjYgZg^<$EN)1u}zu=?G#sB~S literal 7034 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 T^zqMp)-zD#)>bL;LC^mKbj@$% diff --git a/libs/pycountry/locales/lt/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/lt/LC_MESSAGES/iso639-5.mo new file mode 100644 index 0000000000000000000000000000000000000000..295c093600d401eaca7525a2936238bad3b088bd GIT binary patch literal 7646 zcma)=dyHIF9mlWoUa%qxNENssk1lZc(c02(yQTYTyG(bx>}+YvLpU>YcjoNO+%vro z>TZzK_>6)P6KVJZV*Nuj4G{yz#0XTftBKKoBt|gN#0QEoN=%UWkHqiy&Y8LA+%5|@ z{q1Ld=brOBzw<l4bM6oRaM79Hbnrxwk3*h0!*L!1_nm`3cut+?IG2Dw1wR750$v3E z6Z|0P^t9VA1TTbot>zZZJs|rZ0zU-SLE8C@<~P8PLVrT*r?mbXkn{cvq}{X5Z`-*9 z<h;F_+cYON4}<J4HJ3on`&ID6;A6V|2jErEUjRP={sp`YJoke3_^UNHf%Jb|>jy#F zse#vk_k$dN0=yPn0onf_Ap5-yUJ73H0mr!*ya8nYT_ESHfb9PO$n`#~`CZ-qyynXw z*ZmsE`29!gJ?k6?Kb`d;-){gp-&T<JW<ajL3eulNknwp)w?7VY+*4XV1=7!#LE3#C z<a}>|9|O-vXZF7ye`x1st?vbC|Bz-ww;uyJ|JOCY4bsjtApLs@yb}By$atIsqs)h^ zK-wSDEP(8P7f5@NZvO&E{~popCpDkdd=X@P{|I6U&YK|pJOf5(=TiKk-Chu{oL!o? zf%xZ?G-Hr{ei5Xf-vK%96v#OJ7G&IC18L`fAm>|$$*Eti*#|Pdw}ANP9KaurtLgS* zAoJr95Fv4XtoaL&_I?MBzu$5G4&tBF2V<DZ83Fme2qNX2l5STZ?R-}AVUYfw(E9g5 zj(=YB*C74<Gsw8U30@AKhs9FA9z>I~1Eif<kmK*wdZ>8}<h)-4>DS|0e^Tqug7ov3 zT7MNx^9|(s-vT#)>k%BrXAFPn*PS5yH9*>50%`v%AoJ=`upj&(xCwks^D-nA`%h`! z4RRe#kooXA@H+6g)}PaS8H6j&U%_-=LE2e|Bp|N<Ie#BWd&3~tRRr1pUacPi;fnJB znC7c~e^T=&AnpAMWITTl((W6&{cVu;)~!#kT<1!V?{5IPKifdQKd9SlApJNBa=y=l zwErl`_<axL_#c6s?`I&E=DY&3|G&Yj!Lt!mw)cW?!5IZ<_b!ljB*=M>g0%N#kn<b| z8ILDGd@7u0LC*7Yko{f-+3$6bcK)l|&&EfH?=J>9-!&lT+X=E?0pz&DT9+Wt<x!CH z9S7<ElOV^vpx?g;;-B*d{?N_^2pZ>E53*k`$n&%Xr2R>d`*j$k-6J6L@k=1bJq2>z z&x5r068Jt4pDSk@WD3Ik<0B#L%V!S+pPJOx-JlN{g<$y(LZ14*3v5F8FlO7+U$_f3 zi6Vr4^g+&s+y>#Z15$(B4!IS=oK_I#_#sH=;kU2z!1eUms`)AKUdUbubAYA5VF;hy z5T1u~A!kB5&p3YE2^oRldU66t1;Xb>$Qh712)~g$-+W4t24n&<2)Q1z6LJfr4B@`= zVg9us!w`ORnHPKpAOgaD4I$jO8z9q=I)wYl=L*OX$QCO4*$DP`6mT=-laPJ7?Ji9h zyaRF*qzX9*@gNJ3{g4P!fXqPn^tO@a{LT1%mexC9PIVsU6?3Qa%<3Qafb;tIq~-x| zO#f!ScAt^?P<bPf6tOJ34G~lmQS~Edq#??pk<5$0YAlIB=9;Rxaa9!@N%EayVfSi@ za?Lj_ha$1<hT^EG=bD;+I{Sus(UgtFUS}kX<-9CQ(J)QLHPI4L*&Z8XX;`5*rh=+6 zdnZvGibl>~Hm(|#^hMw!TxMKGMZ=EXC>`|c<_bqeP!Yz&(Bs6?qa%s$cGos4Vo^8W z`(eos%?4Q$p)?xCM5UrEzs5vT7CB$X{G6|2e!vL0BTYY)jM`*Sv6t8BF(n#eQF$|} zv3ObtI(>>s1u0@?(pXJY@(s;ggDjP6w&yj8DU5K8g}!R|k&7t0Em^6`AaYh|yUCph zstp;{{&ei&l8F4u>Ya9neo%gwJ~JwelWGDlJZ&k7YSP~4@lf0+bJ3a*QS9#V!)7iH zX?wAO0cLdA>W6{5R%|<cPLJ(Gb+HxOn>7*DWfQsE@RQg`j@>c{ly{&S+P!zHu&E*| z^sBhOC-i+Y7xy-Cio7Z5n}=YpvXATJf_cuEROY&&D{mqRRm-<#PunNM{57*$i#n1h zdo`0WPO>@6t+)y7JSqrmy%Co}O-XzG1r=5l?mgRdAv6!`KBnQgShP;)T3a}U0p@K0 zU6suEOu?Ax*OUspLJddK@D*)UmAk5@68l=27T&lYm{U!QS|VcehMbmFKlD~#=d^4n zuPAV}Snf>YFx1w#BHHg)yKmZWR!OSqq-2M9e^c3~Yk#af1PW)+@&(OJd*qC0*<X*D znrz5c3wMYSzL`+eLunq0+Y-Nw-~`#NJF9SP%jT#eQYx}9ry_25!!A^{=-cUC^qaY> zq9}3x=48o_t;H0jvRyyzhA3j!Yr>jPg}KlbRkG&xwBN6`J?%HAO*&^yn7XaJ(S(<p zvGTbDn-f_LEz{AtB&=KK@c=)y<^er`Ego5lefw*D5MTaW%n$mj->PZ*Y3{T2-EP&x zNlTiS+8wzg8p*1;)|pT(_~qD}ta!KkVI);B<jP3hvt`pZZ*$MA-@*y;rlP8>AWqfD zn^Qw>Esk5!P=9|U8j<L$_}sNV6;}H(&?~EoA9=Aanwg4U5xzJ*GyA<+|31lCym1lx zL+-|bjhnoIo4vs;?!eZe%^PnVz|*r2Uk`5%M>T4QScOCGtZa(NEhH5mS?lfysqU(` z)xJi&6C>Ico;QbyhunQK<^kYw+R^d0rVzYJ-%-B=qkigdtG)Qh@>F^0+WQ-Ee`a^c zZNxoOlT#B}lm`0-dQf)7s588|#TFJ5`=5^cTMZ$D?Jhq2VdTfd2j+HrTeE&#(>!je zi2!kuL3PO8T9R?kOd~-GdHifeLvGMY)o6IrcDMa=cthY`>kbaM!^7^Nd);-e)(6}j z?%<$%|NU<J{eZjE9o*L2>)zrHxI^xS&aj=s?nVyNR(1@#+uoa%L0H+?yS?X-w+Gj6 z*xrqU?GU<~`v$y<e_xNoVp}Z9VEK6D)<vVF(n1@*lKGXVvldj@rdqWW71X8mIu;88 zr?6wMC6*tO#t4)swkGPP-dsLTYa3Qh_(+ysXIzG**!D1HJ#7w3i)n=~2y5xiyt<HH zP$<$$D#SO&^fE1+^Gny&v>gx@)0u<1k~S8^LfU*ESiMs}yNgMSXrpslLmN6v=u9mL z!*D?)b+Oc4UIAru)-$bk+d)dp<~kNFgGxJ;Iv_@$CJN_;m8ZQHzTSbqBz<d#bVsS& zw7~05x%?msXERmM(9C>Teo&T{AIkJXnibup7g#WN-?}nn*}U?c41{#ncy|*j>}oo$ z&us~mi$Nt>yMGHuwY+k2iF3W@F==frPMarLIU$WOx6AA9BAnSpzC`hY&rrS<H=vQ{ z=-Ce4+M#b7w8K78m8hxhElP`OY@lFOoz0A*S|wE@gVJ((3CW;ypk4N41NMYM8V4z@ zqhYp*N;>O=LON3>v1bY!*S#H3AX|#^Sw!djWfd*4FIGabhR!vp`ttE~<JxyoT0a|; zqkL9@m4XGaU|v22#o{^hr&CjQbC_kbj>R~xDZ@6a<##?4DEpYKnPoJnlBr^B$1>_- z1hLL)*=j_wZ0IPIGYw^Og=Mn#P1nfAd})m=dB?T?YoNO#T_E$bmF@G&x1>ly-s<mo z9b{c{H%s;+pV+97Gmlvv8yae098|l(a6hexqwMu=*26N$rHQVHc_Sd-6Na>Vf25Ug zW`Jez$_Z0%8q=`^HlmwWzgge(X7XazzBvbq(%42;aoHf2y-bkK78OzSX4;JO8I5<0 zwtk-rwQjYqiaB$Zw9?g1dL<d+WLkH1yW-`M)d_miNVz#wl$ncj64h^}vh?jH5zAgt rj(y|(?WlRp08^*!d{T7U?M0-m@8!n3l~r%%6^mZ$oZ<id8EN)^p>tF5 literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/nb/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/nb/LC_MESSAGES/iso3166-1.mo deleted file mode 100644 index 14669e58a52cbde0a2ddae90e11db0bd74780444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23349 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 diff --git a/libs/pycountry/locales/nb/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/nb/LC_MESSAGES/iso3166-3.mo deleted file mode 100644 index 723c2990683cbeb1777c3cb3447397dc5e41f7b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2713 zcmZ{k&u<$=6vqcB1>EwhEx##D3xXE1Nt~ci+y>e-X`51qG)`J52Q>D+*wbClSTkb> zb3{UwxPequ4xFkA!GRyQBJ}|B6)xO3z(0UEAP!vlzFj+UN;1;slNry>d+$4Mzklr6 zaaCYEi|1)P`|c3pFu40p{K5DRd<y&?<n>>`m%x8P-hc2eA;!Qrz<WRo?g7`p0{Ahw z54;LK3VsdpIX{6<f`9h8bB7QQVtxR804#$1-f?g@xYB18Jb<|c9|k`G9|5m}JHa3N z>py}L^It)Z_Ye3uxc}~aeG1%#`9*L7tbv^OXW;M9;46^Nzk;F;f}ex0fVaRWz`wz1 zaM!(g-SgmH%+G^dH-TJl3*`K+fTQ3Spag#gIiJ5ku5agkIroBmz63d+5_msY244W* z1zD#LLDuI}kn8>u<bB_Od@r}aaqu^g;}nq8^WbwJLW(osBzPX=ygvd_cGd@cF3Qga zYlKp>!F|Acd0_kc;P{*q>-88Oj?aVZ8VtT`j>|PYgop2#2W!Lw?Ie(DrWM!m3?9xK z*OuwAA4IDNG2?X5z9CPTpj<8Jnp`G_HS4-!rtO+)L{@A~t5o|Sm#EdQrr2XwWoVFG zG1?kT#7vh`>)PIHWn`tYgm*fc!WOTJlgb3Vq)aU5OiZrYc3nB|Q!IFK@&l?htWRx6 zB^sfJ=UW{%s~WaRT`}vdG1}B+S+!$%4rhrug@l)N(>ig=DN~~nS*GA@%ceRggGDkm z)V->l&$5~KUirat#kNtP%k%udHk!ORO;E?kS!&vvQ>@%T9&uWyRdOLOGKFBYUg25W zFrEd-OBQ7vuc-|I7Kp=UV(^vdG)1HZY6quMdC3~WWKEu-s?#xkSyVN>ipYKa<e`8| z2r>+=@Gy25)l?Fy4-Tk6bFH%6%GLxjRCiWXbdu<%Sg(7jVG%$pu~Ly`?Q4`GDY9)Z zZ;Ocym8FsOR@naLy;y0r$jJ*f4Y=BYSlm7r&@0h`YL0BBCU3Z?l7WQc9cq#p-Z>%{ z$+l8@(Qo(qC8Ztie>mi#vzMtBqWL(wK+dC&OHzCL-ehrVDw-@{t92nN`?`*!nReYr z%eEvNA+&sHY|N|FtI?RCqZzfXK881=8VeQ$Qq7Gi{_}0}g~hj`CF*Dn6V0kXB{?x( zJQ9r;qw!Z|ajG;i`SLhM;T)PaT1LC#d%!1Hk|$VpxnNz~=-uqfV@S(~<H}fW6IDkG zcSntV9WR=C8}n!x@k{)|8rAt@oUuu>cO#X@2D#(&3KWm7Q57L5%f6Ls;Wy=Nqg;wH zQytqlza&kyP@XT(ZKzfp9WR{B8VRX)Tc|D2`(dn=Ds7I+S_9t~h3S>$Q_+!)eO%%y zxoFNnHhj1xd8DdCVKHr^(W6t=H9bPLvZ<e*I4bjhr;R)?EsIABZ%3!mxcKZ?q>Fhi za$>ajS`<^K(08>YceMltH}JAqGSXZ0HT#+N=qi_cT9SzTx6WnCf7oW5Jk!zmzTkDZ znOMA;*;yoQJ+m`*Gh7sM6U+WGCCQMP@%drXBF7&NGn~v;&gOG#>s{k6$*gVI(jxY` z#OZ`G$MYyZGdHA`d)q9@RTiG3_HMdV*NO8+1<J8VSRXitCYR|Ey1W|0;}Z5bo@@x# zx4FFd%;x%~4@?eI)pxl5FG#@<T%Wb$!}=ZvxmX>8UF>wMicw;rO9QLJhDzp!4b?&J zEU-LOC7*OdpwyGMP1m~-)4=c&_PgwmzTKhDE!++&L_<z@!pm59U<XKGQ#3d1a!6El zHr*TN%YCyh4b<yh>o~g2?2?2`W_IvocChVxkqs|X@9c)#^=}}5anqHo+BBi{;Np_% LeLLiLS=9dk=iUhS diff --git a/libs/pycountry/locales/nb/LC_MESSAGES/iso15924.mo b/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso15924.mo similarity index 100% rename from libs/pycountry/locales/nb/LC_MESSAGES/iso15924.mo rename to libs/pycountry/locales/nb_NO/LC_MESSAGES/iso15924.mo diff --git a/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso3166-1.mo new file mode 100644 index 0000000000000000000000000000000000000000..6e66f986b98b6c225f26faa3835a1fe34c0d5c35 GIT binary patch literal 23547 zcmcJW2Y4OTnZJi(im3)uOdX1`9a}D73>Xa9vg9Jm7M5(lERd1zSQ_7}JK`3J>kvW` zLWd+Qun=GaF`W=dmQ6@#O9W|z8p5V;*ie=vBw<6zQj-7sJLk;3GqMcX|MToT&(V9% zcX}`1)vtEh@=A~Ij?Fx8A6VGI^N!lw^B&ksQqQ~LAkW(l-UzpbcRBtm+!6PK&izBU z74GNYHt^?gEPN5}3jYXqhg%%%dE3Ih;4biBsC18jW8iVlzs1Q{K&5k{b9XzgbMg{Y zejj)8^BgaOD$i9=>0a;T8=U-3=p+A{lm7_rkNf9N{w`E`_nBzZKMc||-Z4<=E`|HS z6QIHkz;W<=sPbF`w})SXs^8sE_4tPK|F+}f(6k#=d;T2m34aT>gj*b9%fF4|j&Nt> z<KZ4~B2<3!pyIW{z2WI_8vGbk{<py~@E%Cg-q)eZ_Y0_Uy$TiX4XAwIgGzU^Nw$1r zp~^Q7DxB}!lcCZ(0xG{#;eqfX_z`#)+#3D_D!pGjz6#a<{|!~%F_Ue$1E9(|1!~;Q zfNIyHoqxOID!2{uQyterr4vK-)5Vaay=x#{={@57Uv}JliVeRXR6ovz`@)l<>OTax zhG)U8;JMJG3)TMDz@6Y7Q2Blfs@%^*mG>7=@%{jn&YO<!Lxmed<7^AJgA?FxP~m4d z`5dTt$HTF3F;uxaq2iqcw}IVI@$yjRD>?T$Q2Cq>RlZB%0q}OH@;we!-(Nzd^Db1n zTTb=7nQ%v_{Eu^71SjHN0kt$#q0;{xRJ^O8%69`)eQtK{hoRDW6l#9`5Ne$M9;)5P zFle;y91ORE^P%d~4%N<GQ2B&V>ExZe3>B{Ccn%zk`+VnrIn?;N+VM`PdOrlU9zE^k zFFN<z&b?iejkh0E_*qc%tQo32r#N{5DxI^P{Bo#v*#Om^55Ys=ccIGh2dMIHHr<Y! zZJ^4#C-mV#Q0=!6D%=vN{5zoP-R-!}u>{pF>){UY9H@S{3@Y8Lo&N?%)x6uC{CTMK zUw|s-e>uJmmH#_X>HZC>zGG(C^mcbV04kqpQ01BfmEN&X{oCT?Asmmp-}!$ED!&V% z%6GZr^-$^D=G^x<_x+B;P~~~t@foOb^6yaf{*80L4ppxAp~7#?AXd6NK-FtExFg&P zD*hC>6FeMhJhnj9<20!7Ayj$SL8VuQ>hBs<xJ%*A@CvAKH^WKrD^Tt5Jk)r23o5;F zvuwV*Lxn#OYWz=yN^hx?p8%E58mMtsgqo-4LG3d)L6!f0sB(Q5D*O{r<Lm|Je#3E_ zL)|_G749%N4laUPr%#6Jr?VVC4;AhfsQkX=<j=sJalZ@||7|DV_Anc6Kd5+zLxo!c zcY$l5+MypRp9|ow@Or5FeHE&H-*@s?pyI#l+}qE#`T1}+<cC6~yBKPnImNlFQ02M+ zj)z}>yTZGjd>AVJkD=249aR0^bN;&?ZsSdaN`Ed?{C2n-44}dfLHS<>$HN<;()&78 z{@;bW!Jk6K|07hqE#_GFUXIhD!Y_ad-vzZ!uXFPApz^sIDxW){^7%I>e+KT3`$edH z-gWYwj<E6rp~m%5Q0cFPN~h1sKMwc6eU+1c1uDH^sPX$VsC3_P{yQFN%X1J^xH-_Y z4^%w@=U;}(=RBx<uZ0T#Rp`U-Ir*zl_5GW3?|qb=ud|@)eH7HZSO%4TC)B(Nox2FN zuAKvw&s|XSVi;<?Jq0Jg-$Ea5IoHmYiBRj$RH%4!;P!AC)Ov9;RK5XJxIX7!hFV|F zflBuxsP*F}sB+!w_#o80{*Lp12`b$;q4Iejs@!9bw&gv-u^DPUuYk&D6;%4CJH}A! z*C(LDT?W-IS3u=|3sgJb4ORZ{K=scPQ0?*pRJ_-q`sdG3;kG%()@LWE`c8pLZ#LWq z&U5ZHQ0eqQt!FV*{uQYDod-?1pz^)K$!~+I_dRe=_#jli&qL+&OXq$WDxKG$%J-(@ z*m<_z`@`ADr$hBy58NBpp!R_);lXeNR6gH>O78`zdcEr0Z$P#0dr;@0t&X+jm<$zu z7UZhp9R>G*r$Uvd3RT~Wp!(rDsQTUsRiCdy)#pB_@Q*<C$MaC(UxTk~M!rz(_~P+4 zzdt$t1!{hK^R0XwRJs$O()FR~AE@~;8}0)aLDeS*)h<P-dYlVYzDu0{<xugjgX)i4 zp~Btk_<-|&6e_=`pxX5(P~~{p@inM)-++q$j+1Y`z~;X#lze}vb!3v`BB*lrLZ!bR zsyv^DO8+uA5nc(^?)O8r_m7~$zXVn8KR~7bE>!$2nr;1egp%(Gm7Wh3eiBqUW<!;` z%W)0VIQ}S9JwvE|DMRJ=38?a30M#$oLXE30JO9U^(t8pf0H1>@&s&b0Ewts?9x9*l zQ0Y#9D&K)n=}mF+1yJ+74XPbZfrr9RLXGo#o%?C1dT!BT)7#E*JlqTUzEJb;NT_hj z;278iRlhY*?Yb7q|4heo;C{F-aPC{7%5yhVy&i_s;1A$O;M-8+@4!}DzT+HEf$F~@ zsPcRkZVB&z%I|Kd@%jy@c7Ft_eV>9FzrTh`_boUE?z+g9cLLlB_f)8K4uxvZxlrMn zq0(If6~7ZI{D6}W!L4zB5~@BILY3<ZsCd^vrMCep-j|`u_b<-<2vk1bg9pMVq5AK2 zsBtoOu?@d3R60`~XTw>z=Ru_#I}XB$xIYfnzZ;;^e;BGfk3p61DX989=iIMDrSle4 zIo^kg?=P|A@EEA^ej3~Yo(&cLQ&8o+(7CUJTjSmUmG7NS{#D2Opy_w#{{yIX?P;j- z^OED+PQL9@oBn=K<8PL8w>X{z)z5jT@o^SZI#)RVTcF~76Dr&jQ2G4|ZUg@e4}tGN z)#IQxTdz4#>CJ;0->cxkFo0^m^PuW~F;x1OL)H5h$FDek9jYB3g6j82o%~ri7WdDb z|4Xn5_wSs1!ZMrw!BFL#3b%!`q4GZ#D&1zNeP9VxdM7#dK!q<tmFrBX@}2{A&N$!6 zZ-i=(+nxVIQ29LumEMz%KZQ!?Md$x}=YG@ieW>z`X}8=CD*thCd$>2;4o-IR*-+t+ zg-UlJRK1o#g*yQ%|5Ksr*XK9{74JN#@RvZ9_w!Ev1*rbN0jj=VgIaIC2^H@9a1wkL zYJ9%~wLa{=+@?1TD*stf;paiEU#(F2hEAS`YPSkh{0pJd`=XQI50%c-Q1N~NHBSB$ zYMj00+}p0O`}w|5^L{o||FlEZqZcaw8dQE)JKhDA-nXGS4><R0Q1LeFu-p|Y-bAQy zbD`p$0C$EVRCxxW%6}nL_?w}^eG6(HJPG%OFFW~`C)o7%gbFtUD&J<P_E-g#ZXT*W zXG0%e4adQ6Lgn)~RJdO|`JbWUk6CHUw>MO|r@?Ws8LD4a!Cl~KQ2C$X_!+41*T7xi zJy7Wl!=2$zq0;%SlfMTQf0s^Mo<pGam!qNNtD(ZLgG%QtDF4fy{4Tf)?uVi3^DI<8 zuQ>m|K$T}~mrd^gsPKnFwd-Q2e*Y*``ZYKneiq9ACaCxiz+K^wpu)cbH7>kWR=z(} zx`#QoLd84T`42$V<6P%|6&#QIb|-(x$)AR*-*24!uTbUKd9{r{8EU@Hg(}AasCjk@ zRQ}yi{Zoa??`${~ehw<X2cYJ~Gf?B=mr&`v4YeQbe4?E%O;GdyFsS^Gg<3~eL*?HC zm2Vy@y^`}k8*1IT7^;1)gi8NjsB%5w_&hua_kX}0;1(y@bjLxZHv!6jB2+n+ICeqh zdpcA;YoX!~IGznv&P$-?{WWkW_(iC4-wk(z-*E0HpxWWbQ0e{=D&AXA?eU(IPdM4m zKOZXnW1;HP=Hy+@U4km_$DrA#pvL3HQ2Ad6mHtgo{dI?vKM0lXV{mu)EL3@3b^Md# z+feEJ6;6U%t+C~t4%H5A@Gy8X+!J2v{BMC855w?a_+#gO2P(boPqF1559Qt;s(mLx zm1mZdFLvyJD*s7P?UZ-!3!uVZ3)PQbgR1XCQ1y8fs@)!kJHqFn+UGaU{|&eq?n5!j z_pewEM7RKRF7|I?`mu8)_dct@e3xQYVZX$=-@yGArVVp3vL?wf6EJzq?Kt<6jPG+8 zwb>ZllQ73(?v@81%ZGP@v1R|<NSN1BqMtZ>5&4_gPs6C5t1*j_-Hv$z`{^>+?}Sx& z2<BJVKL@A5VT``RF=`*W+1!u+9exSZOgMe7Sa>DagZUxmdCc|r7cgxY&G)A;i!oQ= zz7n$*^Dyou7>2g@X-omrfqXVb-`6nHu<wX@9J|)N>oLz_^mQWtE8GCL!DyU?m}S_v z#axB?8SZ;93o#XpK8*`~KeF&v5Ki9=_$g=Cm?>h`;ckMPV=i)jSnJ<Muw8@v9r!!U zUCu{iQR~iMoclO<1m;r0egSsDKS1e4_4Q(o!+x`I**}}({yo;uW8TC32BR^267nx$ zj=;2IzK85AI34o{c6}c;f2j}L9y13&eV4)GF;g(}Fbgp^A>YFI+PUkj-Z5C1mR{@x z^Wol@Gcg|_Uh=(*Woz6o!LKJmc!smjfuRdO3zjjfkmWGnz)Z${9p)(P`g*Vr!DleH zU`n|4Z3mBZcCBsKVfMo4p0c--WA%2xeihU_*QfhR`nwJPs}Y<JpM;Y!11^3Q`&8_w zLVa2j7GWNfgYQHO??l4P#eO!_d8pON?}NJ{%VCbhJ`S@b_Wy!^#3bL_&hl~mI<P;D zdDO{{LdNoA*0qmfpNV~6n0(*Gax~`WnAON1fLCIY?{zH869@cf!h9Td!*9U{F)gX| zaMr(CN`5%@bMV>2$v#mJW$%I)Aip>zOI!chIi|obV)|SfH^cwN9l;eY%%2>6WS3*E z#_0PW%&FM_W?bC4;Ae2JgTHXHiSQuILzv?+$71xY#N0sGYv8Xjd5pgG$n=#l_hVWx z-@)90xdAf)qwhk(-3vbnPjhj;0AECQ3;ZVq;(HZy81Bzw&cx_D!*M1&1a~{;e9RS? zamX%&UxeGjwU|>}_z1hc^Kh@h)Ua=jxe5EBn9H#L7IPzJC(H@R&cXZ{`+1mF>|0>E zu`h?0Kz%Xxe}RL>#ap7|X2_Rd^lh*(f6qns510ih*~f6NbYcI&$;acKkLh*tWyrV0 zyzl(?b8_eOe(Wq4z}pfb+ynEEg#EIU9gO|f5pnmy-S7N=00%JZojZ-)2={F#nBh3f zaUQJTe-YdrUJm~eGZFh&puVHAPqkLhhrh&pA2S#EwQvaj2kgU)#eNXxGuS^3kHP5s zgrn?RVP7f>-~QPD3G-9y^mf92wzEG6yD-};Jm%l9?+KIdvsgZc*$uPE$v=sGI%XH# z2g3v4Am(N40X!L_?>{lOVs^%TEoKt-7cggGy!mT;`+{Ort^`GIexVy{0DHrd*bjPw zqTd<x$2g0*xKt8*<AOmoDi}*8DD_kbiB~1+tp<Kj%=rs~Qg=0ntQ2(nE5m_mcOmNW z<F$TEZ*8E0xHlwpQ30$itcOC>ADWVss@(*rmMf*8pc2U@t`AGyL9~uSF9`aA{-7+D zf=KRSZz0Hq<vy$g%EkDFg`iY5?2W4Za!2b!P*jAl)UR?b=&Py`7Q}^UFd&m+y*MiL z>aZBDuab@pKp9NHD46DV6sjfaQHkPWQ1Ck|K_w&x{>30Fh12}bs95n^C^<o@Wz#mD z0o7U%m#L$1FAhuV!`^sM&9NY^l!pRisSbt}e@VGOb9xI(!TP8GqDoZm^OqEJD&mTs zkiT7F32|Ji)xB3orQWFM;!^QawHQYJLbXCUC<HV?wa}|tVkzax)^82Uu^d$r_L_t4 zm@1cYA=duxn7m{OOL1JpQVeLX=AhP3-nMvUubJMYll=K>?U+e=+-vR&a{P%3q}8Vi zHusenZ}eGGwdS}dF8h<)Lb|2cJEf6iT!{O-m37?T9~Xzhpit>kXDp2SqoT&!NRLWi z=qCeWG{5C>i6Et--)?$1NM+R@ml!F{F@xLwo#uCu+QP6u?kUl8J(=M^DujyjsRZa> zf2Ao@DJDFH)7WjUmV)711JbMwXb3j14}1FRNm-}D4&TeD$xT`^7&B(PRIVLiJWvQH zmFscT0Bvz84AP;J)|O{y5c^$me`rQl2Sc+b8ptG>4%`({@up>AxsnOe8TUlYxN;?v zZD%R+mj%VVvM%-qrM$OrUDO>{E0I_4lEl)OK3+>e>NI*f-&Lh53q{Rq>8UbBOP*a6 zT9`jUVbDs>s0NH_is3J+Mn&q|!XQ_@TgsJKt3wO(gcT(6S}J`}Jb<J%DC9L;l5X)Q zx04)$t~>?5QXD28UTc^OHC$6Ioi1J@#Sad*JRArL^~BOCEMi#+inUSwmPdAhO$w2Y z*BSSlrOx_Q!kk@E%IewnsHYSc!?J2>%2kO58>^;5xK*MxS{He(QPHd%t)-yY6MC(s zu*lG(Ew#8fS4Ui^xdg3uQj{b>C%tQCOtQvAVcA>6@=&yY!*ZhlNX&Fy6vnJRftNJF zB6b*DQ8x|FR^ct8KskS5wWqJ9GB2y18M4MyOTGAnAw?Bz*|C|$W)Y(#EW}j?GS+_m zsf08X$yOO!<*<gu3=)f`1rZBf6=6+zFAi8W`CIM_`y(b=8|zFi?pN+h<5G@ge{mR; zl3`;ePJ7Qnt>=lXOo&2(4WqFRc#CN~zcUQ|$*Z+MuoyN+6(rgLrr=x5G5Lwen!=1N z_BL#O=Rl|l=FiV*CDZoiy0VvDM8&d8<>G3QRl4Ra>0#$#6JXU32SWa^qa+)R-w_P3 z<t`70eAfh{hO&FO**27n8%9g$3QvEgnVHd_svf0~&l&u2nX?g%2*7IJI6i1680l}* zAH}0RVAEv3WtfZ>uOrCYGYOvBO<AxhXSo!F1#d}36Qr@67(vZj$}vF8@6up^uuH>| z28HY0wqSjb?_-57dTn8`7I>)vkQ^M+qOf4j32Bi%9i$}njWH!lmc^8)zDT8HEVpr` zFHV=Do$aTmCnI9B8e)Y^#p?{JxyaXnie^j82XyjD3x-%8GLo*oATmQJ6{?FdnMsG4 z&N$M1SI{ykmZEM(rf2q>Y3apsv~4K~maHKfL2cC`=APG9EA`ga*LMKtHXX7oi2ZtM zqb$cB0m}TT3{vT3AxG5AnqwraMoF74i@MF>71GbkBDUK~SY!jDg_cE?zN#5>sWqoP z=wW*{fB)WT+0OZ=Hz@b8mbJ464Mheut;@J`EXrkBjJP6MsoWP73iZtgf%dI4sv&;$ zd0?#^5fRqn3LA2JcxJ?yXe|5F{86?AuRSj0;z9DUoK|mUbwE3-n9|U}Mn`BYv`5%m zGO|jUqhnA(YKLEYyk2X#DH$s#d%U-tNv-j=oRU^OyWyn=i58ybpb)a8C={+W9MrU0 zEoVBG0=9W<Y<Tvs!bDV@(Y-b<BnK!tIosKDjkVJwNt&BFwYeFxf{oUzuNWO<Ud379 zOv8@A`8zq0cd!-o2Y8KGFFR~0Yu*P9LoGtd#i$-GHPShE)-N8T`r8$~Bcu^KI1NVw z1C*}pbwrgO?g><2)N6$At{EOXwc50Uwy5@U=CGD(W-hqH9wU!!Nab}mwvqDetQhI* zMob4AYbDl^Hug>kv~Q<to7@#MGJ7%1h}=akBXgIyjI42?ON*0>TUMr9TShYaMJgM_ zU8*v|<PMY-+AC06mbwmQ#qLIw5$d{=73k`dktFw;tdP~vULZ1JcbUk@bg{???A;<G z%3dhaUiCA3T9}-}GqTiaJR{%eWS;SLr}MPToJX?)d%jD{>@hJTsh{$)QghJTSd<+4 zvOeYjm=@W?U`CQ0)zZS`%$1Sp)}3kk#!)I0PUohyAawxAh|OUnBT2U0w9svS8IjxO zva)1*OG{ImRaR^^t`Q=;ca0E6nX0g{v8QE&Xb;oIm65t#DJ!dQFB!4hYSOY~+sVqb z1!W}lEhZy1n@M8>N&DIDAuBQ4LRMt<ty(58vvg-d*(EtG>f~I??j9B6Ow>;8xGdV4 zpgduX7)+gEt*1}djBHDGM%twPWg&<5Y!X~!f&tzFveH64XkO1Ux#=F~9%r(ljYlUh zVA(~r(>!YRXOr#<)<y1Mo=&`r3P-shXD&`%ad*HQO2)s+9cM&cyM`a&;i;BQe^oDg zTy}7+THhUxlI7~4$l{P43@3-Y8fG$HV=tuXvaE^vyMykbY`!}9+NYm%P)XgDcBGg- z&K~JT2Cyfdk<#?WKhn>20oQ+>qgL`zr%O(9&*y}@l2<`Bj*!{*R}SA!0~4Z?Ye0pA z2uG>m+Y4cT%}Kbra*dwm&oB3I6xI!sBz$^J2XH?Z_|4T~U*H0_MU{$urCc5kMr9{m zR^`6x>{OnUl|R|NAq?Q0;=DRERPD=CyH1gXdZ||P4y9|WayAWXZuaH~WUr>FsWbWu zR_6AT%&1N~i&8TuGh29jbu+}g!nOyLHKgbZs}<ftT*;X)LEcaL!|OC|)i#+(qrZl& zj(DAAnesZdpVO$xQ)u#pW8O}ZIcFX2X{6o?R!Y@#LlFgPq@dYqPs1*VnV_BKqStta zOOCcgG*{!g+g-crZhL^UL#(sP0?vE2xmTOBbA7IN4hHA|cnDE1Ej4RdjVaY>ualia zJgR7(taXo1>fE8I!r9H7O*?CPP&R*y=9b!M)2<+5*m@Q`nV0m|-D65%&&8>gr7I|| zH*+AdO!HS2d9}&alheJXexXgjV0Oi<Jo>{DntGS&it{{SRPoV;ceK^2%dJpdyoO8l zpo!thVP`@!FAF?TC*9LkrJYDFS;E}1wJI+SMCegk`-o$g75lR6s$jGsE&UOfE>?Lb zba(O*PMzR+{|cDVdMaVYsaMS9NUy2Mvy4l_+!g6D)8+M)lR>StlIBdZ$%eEpzn!hC z<gch!3N@xqy~ZvR7f4qNs~hr?cihx6oh;1_l}X(;&0c5NASr38Y+ijX$-;JwAg#bq z@zt1_VvGnw+B$`x_sPa(^i1!Z?w!a5JhHvnTCG%h6g*Ln-ZW$<8YI+OcK2{QMtzr1 zuBO&1Lh=Be5!P>--tcEM4eD*iAYT{uRGOCLnoy-^*`4c0<@of&X3d$?G;1u?=a|ye zUha)@O$(~M<)*H9uHRRw43y{2n1Pn298AxJ91)7sc}|@{%%+~0g}<p12K@~uwlcTC zu^lU#R%*Q_o2G>fuDSl9GY>tiY35N)GmrFV9yxc`;ZtYwja?R$D@|Rz`0*&m^ZH!g zUU+IK(Hl{*k0To|0!9Crfv^-d4Tar=36JmN6|z*D-V^s9OY|Za`rfdqi&D(hXdDW8 z>n+l;`TpUX3;r=l4f<l5H#glSV(KtpTcn&RecWUlWJa<3^yMpNG_siM7rV!{FKKUS zG~cZ0Gsm+2u!K{G+5nZTglAS}3>26hNBceWV>ztMTh-OtbYvr(>bf>8HMJCJKL+(& z|H$sBGFJEPpwQGBm-@?OHDH|Od50eDTkE`{f51F{*3n~6YFfncjR~vPI?=X?fB5v7 z(`Pm1!ojg#`VBO>7TcGC(5g`L6d=zq`%oonz7nBZNtCE@ueNfdL*-r3XN-17<$UOu ztS&X5-$;|{W>h{;@I<RhdYe$D4qvVDUyAY+lV_mrU|p{K_i9uZ53(RjnP?V%uIYO3 z{~)z$x@h&~z)K!C>bg{3E&a6xW@S)br|0+3FY|gsxY2c~G*L>G+JqXlXA^4F;rn<E zL_1POhq{n`yW6Z4w5DkS>6s8lzIh+-3(&g~su5^u+`qO|B@JG&{<pf+wqRhu=~CN_ zE|o_1u+e<QtS(jQvwf(unS|1&1}Ia_=t=du*F^$}MwOid<zb>wHI;0O^KscF)ttOE zF!%<;LXJ8n`Z>?(Nz0UpRf`HY!Z53IO`P(W*D6pOryEXdvPe5>{^~K9qa)f;Ha%9| z^td#d(RvB!K>MuGHmY8<jkgQlca>VDye`ah*3YCxZ6!q8S6CYsyE(t+YmD2XiIK@) z&xtHs=7$DMjzmYgsZ#o#!yAmEboh3kanw;7zRPM#TQliUE=`msbIjN{({ju)U5e6d zvHivwZJ~Ka9aUAT7Bs5tjruq}U6L&}d7>FbRhl2v>O?`BoC+w}sZf=g8JcJz{K=Il zSI}!L+uD$31ARXQ1!`7*nv9>;;af_nQMq>bKBF~7Q$1?O`$;<L%?}Oibf+;(9Lk1z z#}T!wRyJx}kHvW-&${w-6u;!;-5%wgqSTc_s|jOfwDjDfu#w6%Z&pSrPg%U39?`iP zTGMnt$uk{^wQKmkk{Ua;$e{fUq&!VWOw_3v<!QYQMruzx>1i}HyaMNj@9XbpN~e?= zQc|LFTtu(^A1F|@aQ3k>M<`M4fX}lcpl)HtruC>znox-X)s3HYg<UD7HPy)1`#c)h z<PlE#Ql*<xmzD=mdh21t53&l=5{D06X9s<=60YKW&r`ZRr<=)I4F>zdVy`;E=Ht8P z|5`FtG*&kbWq0cjP?suNB*kWSxkBNYM`LOx-RMCwI@3)AF>2FI_(@F^ay?;5+(d}F zDkP;eO*g+)pgKM3hv-eqBlM=~?_}K7HK)lS;HF|v0@@<Xut4GzrwvJJ7i<WVRWcPb zS+mTB<5Ekse5qjUQ*l0Tw<Q;f{j1mRR!(4^4w`iLqSaDyxlgMd(~?1=WFyyanyFw; zb=oNZa$Si{uWzh09kByt_bD>xj#t;&>Fky$P1Aiws=XZU8N*WRHtZS#nZ-Dpy6=>y z4Gn5KQFNq1k;SM^r<eW^9coaejHyM(=uS~uqDS@r-kIuNrSqFsp>p0BMThEE6Z-`9 zztEs2`vDqMyNS6SVN<$O(+^G)20l=C>IPtYtg}><_u4;DbDE5k<+Y~&f3+#ifF4!H zw7SYvC$@Y;W12p|+4=B6YElNETZXer()udd!S#cSUv1+P(1-z-+<Z1VMWytk8~K^V z+q|#0CYn*Yzpfh9Am8{_z?GAqYBGJ<jv0`3&1iar*M+UMlCGm}$DHpJqgiQIEt>WF zFr}!ybGaYTrc2;{Et?T#m7*qU>N1uIn!cE&J+c?Dw2%E&Yer)9qnX=L);p^kHRY-Q zJ~R^&^^1NUnwF)mH(9a0;G|{t;*yr|_SevjntbawmP|0760*8c6E?X}WP+x2qc)Je zU!=o~yh)_}Mk+^58p+8!9Web<#f*HTvv|hWoyXHMojgZ5BqcxJO9#!UNKMfiKZMJK zv%iJgSd^$pHKX!z%rlSu;aRDEZE`2wbkvN()Z|(}tEGdvQ&&cm)|Z-?8|h1}RHvqN z#I~S*@W_bWkGI^<lG0ww><@%8qO6Y8<it;a%=VQIm)eW6;<Sd;#AZX1hLp8wM8NEv zAXr01>LQL%ky>e1Me1a37s=#cca*9gmRai3UL*9RCJp;jolK~adQuzC-t&`PBOM{5 zCN+WG#*ht^Rg>Cq`h`m-lv$qBl9Z|^Bc@?fT2hmm)9+-1IW6gkZpbKpG7;)Zpo}!p z?qr1A*qY{>SC>p3Iwj92Np0z@k~9;vE8rPzgqG9<uInAR9A%ZH)|=i<DM_uYhK>}K zUotzHwOJLZ3AL&`QblUS$vb>H_R_S9)P%~aNUdmuiqr^o_^oSojU=lYH6o5>MlCwZ za+Xnun!xF;K3&GFB2+7t9vaR2O6oRWSBIwBCee^)^r20Ek3Ljg@<HlQ{69<^y4JoF z@H1tn3~h4CP~C+`*M;I^f8dPPh{0^{oT<sNsTZoub!JnVP$iiD;lQR;p~d9p!ZU{{ zyjr|$b)eb1?Z%2x6Lb?VV2LJ&AM{H*>V`z}LSrVBn`p+KXhvxhJK1=cl1?;<rwQm3 zqK&!e?r)99wodbwfC{Fe4lVj=WoXeKRTWzC(~3~9t_P(wDK)6O8|oRPJQzk5J1E0k zd98hmBA%pH1!_*pqdeMME$Ik_sM(LD3^&7^7g5xsWz?mqrKGODODtSvHhuzY=tWbn zmPRd_o?=c<I;vKbD!bKb(@IhEz+;u7u747hs9mr!3egeo6t1lr4}O0AeVHeBe0loj zohQ+D@PmEnN=u&Jz4U4y6z$VTr5-llxQ1r}=@rV{k?QX;^(f}DQ}W#pY)5IwhPE_S zC>x94;}&zgpH_LbqPRTp@&9YN&{s>8{7O{tS9Q*(_eW&bP?a{8>tu;;XhiC^?2AA$ znG!Y>5=H*~fc&QLQ};wiAyK9wMtYj?P9aJgS$(MM$kk{?o19A2?iM3eqHd10&=>k| O9Oq2bpn+3^djAh2Ji8_U literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso3166-2.mo index 1c14d8beca6ad34990c5cadffec0fa2f3ff8103c..016ffa9d4fd52df8533e306a9cdb4aedbb533d42 100644 GIT binary patch delta 392 zcmXxgzfQtX6vy$?T0n~YQ(<P|4M=1$?o150uwm+i5)#-9Fku3Nfpn75II<X6m>4i_ zEIxrx;q3Qk+M6_=du~t9IkzwVtG@^)MKi0rW(jOy8k>=A%o7Kwydj?9Gv+Wv<-cJH z*Qoq0UOQ%=s65v*yTBqUuA+}M&n9-s=7xhZwor|_s7519;v7$LiE6lt-oIm(_yf;z zAI0BTBK|?;|Dx*Xma3mZ=Ch22cTV|MBj`9@DyjRN@aS{R&Q<<rRvER@c=0O48`PNk k2f6U*Jm!1Bpxf!+4=ac1L#G#nSMJkh=YBcKC?0#WKM9Q{2mk;8 delta 384 zcmXxfJx{`L5XbRrEv;0l_&^8V0lNbW&YC!xxC3Dn2IIiiFpzX2Kqp;D*jaRPGhtwo zSK;htSo!{Jx#XWuuesdAYd8s~y`*GjP1mf9H-)!&M*e{3*u@II;3<w!^-~P+4OPEH zAK$U%n0=z^cSmNI=zDoy$B?|?Sz=dwT=OHwJJi57YTz>-V}cr(7XRlMkuUH9S4IAX zHS#U0{s*<tFRJffkq2DOek_r7o%m6^Re6WdXx+uy|7|paQ|yGNc50>2>I&U{2(7D| cqwL%1XZP;VUyq+UgWkv5-8k9IOM^VOJ*TWA)Bpeg diff --git a/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso3166-3.mo new file mode 100644 index 0000000000000000000000000000000000000000..1346d45a9b88976202b980c420606aed138c4ff5 GIT binary patch literal 2838 zcmZ{l&2Jk;7{-UTe7QiOd>1HFglI#vj+4+TbsC^)nl`0QquA-!r5f9B?CGv&%*@)s z<qs$~PCz9Nm5_Sq0XT4}gv0?~;08jKfCJ)!DuFn1<G}Oo+OboTkv2ci?Ci|@KJ(6# z-*)f#NT5kPFY<Gr5C@st@CWTX@CERDa0L7Vd>!1iJ)NHi$Iw3yJ_ud|cY_~-8Spdk zDe!af8Sq<>*ZBq918(1uaxb_G{UhLG-~!0sT>u{e8$DhH_o06cd;+`$J`H{iJ^=pM z8~+)U=>G}wemn0M;yLgT$m5IPPSAoA;QJuw{RPPJ{|erP7Jq}h&mAQ93V0WM1I#=m z#Pi@=;0$;X<orJYp9F7!oc~uK=lu=Haoz#5;9sBw_dJ}&H4So}r5+W?>l={c`2c(r z{1ki*yalpeKY*;$?;z*@56JWW1^GNP2qFjW2RZ)>;H%)fAVLrygOlJ5kmLFZ<oLHi z9HgH#iNCyNzwx?z@o-&mPTV+l*6CS1I9l;C9?qL%!;%8WkmSKJb7QSof6kH58{rB_ zEl^(KB|O88<K&pQagL8CztViThLSexbgX?{9y76Wl~`9~i5$kP>xkKwYp79Kv=yx) z?PIx2%~m<W9J?yxI>{BItwBf3b||v0<-Jx$7K_XHrmZR7<Wq56nHV1_Q<W!7m0Y>y zIB81UlwRjSmjk8E3o8e0$dH(P8@)op`1V$NA(w5iF0YE|VKtR+q;1YFV$>%_cM zrb45#K(Vt;8|hdX43eoJ?^We|63v45%J+whwuJ;;8t4DD(d5NRf;vXdQNvc8V&(es zh?6=hlZ(?NBM3(88J@Ov<5_?-Wl_-8H8l`mk$Brg3_cPaMc8SPTCr1+ykrfbvnEeb z+370YEUAiK#m+tb<bfE65X-oKgd><?R6|Lq-d~^y&9zEmD_9egp_;RzsKZb<#CqP# zb&CzO5-UYn(7r+uf+E}U@}500p}0J{UJ6^Eyca9YCOLV|Mlp`IFBX^2In+w9s2Zc2 zsmT-0tFSMjxJV5$!!t+a64_=%`~6m*Uu@M-RI1G-bzr@mN8~)A0HMopESHpasFmTN zC1<ZtB@Py<!8vjsHJ_K-+sl*VhYtsn8BDb<4hp`etHErm=7W;W%X%C)eSU1rtH`Tt zm7uxFT2~vxmqCTa4PsJ_K^MP#i+pD3Y_Lpi&D#WXDyF=g$W2TJxg$YtO6I2W<A)CB z&@yLG;6Vwcjm&Ue^H3qi!6R~Q>Ncvzo{T&S#VJ^$GUm|R^_Ho*PPSqjZ{l-PYpEIq zB}9>zi`K1Cjj!*l4IAB?kv!VZ02eZ*YPPpXl0!39#BYe+2B{!prhIwv?ATz7yfo!Z zVWDthAm4a4mpPtPA9Cn4kz`Eo#beD#X)`S=bzDk{XI4t{!PH<L=ekNRIANe4ZhKx% zm35q1ids0tVBWfh$5zdx>t`mWW%_f*$bB<%d^&R>IEiY<U1hb-r<%w^*<5x!s8Ty4 zQZEcsFAQOeeFvO_lHTGrunTIBT6C!shM`E`wXab6VvA|=R9oY4;E;T`#XE@!2GZ6N z6J!tU-tHhcQSw(P42LX`*N-<0^8Uly3<tBBANte~yVtp15<?s|!hqc|bULKOCq2?n zED@oljyOkhm6hjRySH7WYs7IQ1LasGjQ9OUlS}l7J3Ly2GluMp+!+YgGsiUf#2kC6 z_pK3K)$_&P8-!r^swTdO#d^*NxmX>8S?rIjicw;*Lw$q9gks{Mb=5}fEU-LKCLeZi zQzB2^HeB~+mHIXrvP&k5^h^?YZsL(pAsF(<V_sHu8^(YDHtgnxy%B+`_J(ugc)4!Y zrGa|g>upE(SY#NINh}gh&c3&GEwW7}>YW~VWbXvh4>ugis*OUpL-H>jg?xI*Bzcq7 Y?(M`KA=!GhjSQw=Qr$0yj4}!GKNH(BKL7v# literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/nb/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso4217.mo similarity index 100% rename from libs/pycountry/locales/nb/LC_MESSAGES/iso4217.mo rename to libs/pycountry/locales/nb_NO/LC_MESSAGES/iso4217.mo diff --git a/libs/pycountry/locales/nb/LC_MESSAGES/iso639-3.mo b/libs/pycountry/locales/nb_NO/LC_MESSAGES/iso639-3.mo similarity index 100% rename from libs/pycountry/locales/nb/LC_MESSAGES/iso639-3.mo rename to libs/pycountry/locales/nb_NO/LC_MESSAGES/iso639-3.mo diff --git a/libs/pycountry/locales/nl/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/nl/LC_MESSAGES/iso3166-2.mo index 9f7f5c43116ee0bb09df3baac8e2020a470bb81d..474d5a3808f80798516a947a357950bf61d6bbf8 100644 GIT binary patch literal 215191 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%0D!{E4tgafy|B>Gn&Xlc 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 Xw;oV8_Z}PzlH-Vt)glArS?~V?&4%4y literal 213685 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 K+c;uLd;cE*5LmVV diff --git a/libs/pycountry/locales/oc/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/oc/LC_MESSAGES/iso3166-2.mo index 104f4788ed86bdcfc05aa551c6f69f9fa65e6dd4..e038825f9756bdfe26313d4488dad3344c26dd9b 100644 GIT binary patch delta 2706 zcmXxmduWwq9Ki8MvsqiyIW=$D^4fGuvso@@u2p8X%xspk%golAE6voI(*-Aqq%trO z|BxusKQfS_SVBxBbR|QB%!*QCf`4>lQJED)R^RX0?>wB}`8>DxxxMduwv**AlxKR1 z2kc6ucH#=+{6#74!%qkDMOvAk5>=@MFUHlFhwE`LZpIP#G7iGMScLE6C3qw}jt==H zI?lH^Af-$?+m}h-M~7bY!t>z;bi%xXl!jm-+FlZtqU|%HT#5FpK_*CbQD2WvyaF%7 zX3S&$)JldqQaieXt<hl@I?>*6KRUn%=!Bi&VRUER=!7TG3BE$dJsb5uqy5f>e_PM| zsXx7K7>Hgl7#(OdUWz5*6y%yzfrVHd<%Qug<dd4hbzvra1wEPF=tlQr#vOK&@m_YJ zJNzO#oI-c{L-<ShC-O-b__BXKtMQ%}q5a39<CUV%P9-|w9CV|#=tk=bIe#x`hz?EY z&Rfy?P3Q#Ap%-jL2iOtr#$w8QFnen-yP;_Biu&VG{u~|u6pqB6LeAeK{wo^#u}nMU zp#v5mO=$>v^d;!d%kXln#NoIIU2qe6{i-Oh4cpKY$snJ!oiA_28@Y=2sBprM&;dR{ zFF1xya2hA#ujm4X)9BHTM|V6KJ(=m~LS}_?(Q)UY{c4dR(h@w{j|DZ7aiFOz$Bxs` z0cN5*uR<5F0O^{R<4|0KPWXJdE!>HY^BTI5J>gr?zCY~fGm{RIal$TiWyjE!o<eWU z*=X;L`rnaH`iCzk7{mkMLWYK8(1lJw$E`q5Y&QCk&X00^ww?RmM8*kMp)21Iwr4w} zv<02uMRdYf(E)d%&&1xSe;4i75gv^Ct|)h-8#)p7r!D*bpCRJ{engM_96EvL>;#43 zD71Z2lq;fKjSjpJ-TBh68C~#3^kkn!H@GdzJ22xBy%`Pr&>g&kPJ94uKa39C9p!J( z1)f1C=tURyTeSa&E+}tU-}Oc40!E<yC!-4~8^-%@W(E~rFbiEkO}GHP*Nf49jp#|W zMEg2)ft#be1?~3|`hIUme>dJnC+-M8M6WwEjPrNpA5-CuPli3nCelygzv#flyb2C9 z5*=VHy5NcE4$IM#szUB!s*U;v^!nB4_3P1j+cISQA=!%l8GRi++5_loc?8|@QFNlu z!mrT<oIwZv4(->AF5nO3_0Ent17{Pt^h9Ku(C05bK=`-c^iUsZRCqJi5?4l9<`H*B z`6_HAynX%;;qGP<xl|RIIk^gam{?0paQ;QnP>rjI3gVuqb4M$Q$B1W$s|ioR<Stu@ zHlmr}4yFEtsfDN~RuGj$IdKDVKjCfmgiSZP|4C#@i8X{rY8pe7WpjOBkHTD{B<iN4 z59Zh?bK2Q-Q`ivRild3~#Px*td@_+s>pcIdguhHrN9}!hcjR+iM`lSBmf<bLwZsO( z=f^aQ@L9N*@af+~<kDg?K2JWR%Zb~F`GoVQjee095RaH4T|@ZlEF{(wQ;0eum+m0* zIPoMgEh@+1Qerdl6!9Q2k*Fb76TVTm6TTUD5vitSXM6skj->^ic^%V>Ck*%>5@E_8 delta 2777 zcmXxme@xVM9LMobblQO)aw^&new+o8d4*=8X9a|ol1l!_Pz(jV;{;AX?o1%_oZ57) zTq|<THdnKztIZl_Te_906}9EeW@}{DtbcU<8nZdgt)8#DH=pso$LH7g^XvQla`$}j zY%qCYwC6QP+DzmTH*R+B0G_{v4^mf_b5yx*9EQ)~aNLfg@C6)?dodgPFb6+FFP=4j zL=E{HYMkHE<6P1WrZeuUb-01L&@&>f4>jR9^kcr&mtq0snO3ev^=q(l6xF{2naFLk z`kkl+yo@86-|Zoz3-=>)yLVALIg;w&+$q$8zBLC>1N@4*?vnX8YKK=*6aI%I(Zh$v z^`q+ZQ2i!I=692<VX8Hhp)M%5`fALiTw^Xr#&&Dahiz8gZ0<t-T(9|-dB{A5I+=b< zYNrEaw8KlNdpd~PVFshC-HY1kc(cGPM!LEns(%P|?<=f*5o)|z)H4)Cjn|4gfgT^{ zubpnALKD1X9ePnmwcqLwq9%AB)&B@;fa7LAj;4GDQ?~|F8?yF6tG{k#twQ5_vpN4; z$@r+y5l^&+Ddu$4fU}TmT_x)1Yfw9{!*LkJT-<`%NH1!FH>~`oc>r}Hhmb$_iOyg5 z;v1{@88zXbr~$5^F1Uu8Ad^B77NQm~2X(ZIQ9E9SI+<0dg*2J#QR601{d$lgU2;2_ zFK%+~71Tg0SdBW?qXt-u+Ib6V0bNK}w;RXcKGcML=27zmYMif88#!a1v-W|sNq5mI zE~6$KM6K)^YNcLoY(Dx?x2P1=FNA8ZM7p|a)I=*$3u-Xep%&bMx^64#<aT0?-v3^! zc*i>Qp$7gKwSyC8zqOx6O>ho1;ZLXmFQT4}zpVaWR6iY)^rHIbSUDFn_5SBuLy0OV z2T=<sLmhnuYJ!ER3F^!yYwxu3Rx7`V8fPzR=Wm-Iq84xpb;4g^Qak*?DlVXo=nqu= z71YYFqbAN6n{LlW4V-J`V$=eIs0l)-g_m3V0@Q+*TDcyzfbdw(Ul+uw(1cy)7Sshh zPz%^??m^w_eW?B)pib%|YyT9rfiJCm8rAQ6)N6ho_5b4^)Vwa2^H*jVkG3w%Lap47 z+Hs*d894+u!<>&Acs1(!2<rM4)PgslcG!(Nsa?q9;9j@-_fXd#O_I?7$59i1j{1l4 z9qMcKGU{kEsMPB@3bo@gsEP8-BGdwcsDY=U`h`#ns6yWI)G6GL4-!gx{#>g*NKI+n zO4KW-RG-G(Za#twh(ari$B6k>o`7LOw@<$*w7KcTP<qHR52sDd?^aRhB#MYd=>}Jc z>xl=5#e|Y})J#N(O~l=VPC-e#+(>j2>j-YK%OI3mh!w;dB1GIv%phvDf8A#tvC=GJ zA~A{RAatZk`ehU(x>O*oB`Syjp)`figQ*`RN}P5om7A;0Id}(g7g0v|wEq%fD8<Q4 zCiFGB!787^CoDh2G&0MqP=~XLsl+pco*Si^gr0?^#BD?mF_e~&(esr0{%;`jC^3&v zx-X4;92+gqbC`N{YA`|ELp(_grD`%!B1V*2<(;^kc$R1<o+gTkDx!_xjmmO!$>`Ns z_-Z8UWI<Ku#&|puiwEYlw>O33iAXpSYi?-`%#Cb{#1n^0MjRWSw<Hp6Zf^^OBY{-! WlLups@xbiHj^;#T?C>xCV$c5|+TS7o diff --git a/libs/pycountry/locales/oc/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/oc/LC_MESSAGES/iso639-5.mo index f5e67e31d5d7481ecf782622e814a688579fd554..ceae311081d0582194ce96ad8a3725269aa7ae16 100644 GIT binary patch delta 190 zcmZ3^c7v_{o)F7a1|VPuVi_O~0b*_-?g3&D*a5^MK)e%(`GNQx5DNhDJt+MiNDBfn z10#eM0@7!JSOtiMfx@4d7#R3~G#fKSzbKFf=~o5PLJSOC3}!$ENP*|XN^M5=iA!Sz m{Sq@u6H9UwauV~>OB2&mi#Ibesxk5Vq~@h37AxdIWElV~Asib3 delta 145 zcmcb?ww$g0o)F7a1|VPqVi_Rz0b*_-t^r~YSOLT$K)e!&`GI&J5DNhDIVgP}NDBh- z2OvJn$iTn^#KJ)K1ttatJ|O)BNQ3l!2GSsX%*+f7LO@ysNCTBl>{n%En7B1|vkIds F69Dx85nliR diff --git a/libs/pycountry/locales/pa/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/pa/LC_MESSAGES/iso3166-1.mo index 0cfa8717b9fbd4d9dd560341c17f6199fffab25b..7efeea06a18c2e34893510cba4e7e5f45e3c1588 100644 GIT binary patch delta 9448 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 delta 9197 zcmY+|37pT>{>Sm}SZ0P9GiDfu8D<P)$?Ria8Z~y4WiVtLW8ZhiQhq{G5@i>~RhIOp z+X(lMQtFQ)E!S1lsH<d2k%}wjzTUs{na9Kb`*?ijdCupY?>XmtzROQ-yb-YdrvP7Z zWSLbS$Cd!ki^WD2JTJ49=jBva*7KrkdtL}u!yrsFlQE2XW2?8tK<YUdj6JbD4!}w{ z606`GEQc>(r04m(4HPu+ZY+!YtivJ8A4Lsx%Ias$e_Q?vYQo<v|Cbq9$1NxfHEtAY zo*2v5#(3uU9<YWk7)OVm{szyRidykX)C4<`&GGi2uJk>uiN{g>E@1@TL-mhH^t@24 zj+(e0>OxXc?JXqpd)XBHTZh`xo*0counf+@vN+FNgcYeji&b$WYQVQp=e><Fcm|X3 zCTaokb=^4ik(8H$KCQ491+A<A)o~nZ;%TUXXJH`DM=kJaRKK-W--H@)H)_Jun1H3~ zvAdXv>faqTUSG4I9{bNj;Ef@n6+ezaxDLzWX4J#C4YjpJ7=#~~Cs6~QHj7c?{D8Vu zrR%fp7=hdsuQ{rHkU6_P`>(`m61tafVh#KhwF5t65dMmRco+QxH*mKg0>jBCpvK8S zExapg!M#xDjX;ev-kgr=_qdNjISLD~8ZJehu+8$jP$%w3-J-*&g?(i0pI|Wcv#9ef zpcZ(=>bFr7-9s&~Ecc@p)<P}NmrX%e+#5B}R4j*&VHz$%EnuJd4kl7Riuy!cLroCe z(47~Cx{zqpLNie3H$}Z&S*V9JAK7uAH<N-sJZmrn_n@xiFzP8kikjdH)Ih~nzliGh zqj?j{Q@>;FWqA_yY=xLLQCFOf`XFWd^W6VFmKfttc-~y|dDIE7pkA}Rs0Dp&`SYlO zZdkr-vfGg=sGUs5y4V7>kOI_#r=gyiIaprr{}KxExY|1GLrwfP>WV)xzc9Z+?Z_pp zfIp#b*<I8Q1g5z52xM(uRaCw$Y60C)3(P~G3i%XtuSTH;9*?@xsi+edn#)iVtw$~F z71V&QqwZ~y<v+*D)X!P_b<{k!P~&;2&X82@zXqyeiJGW-12Y}9pyp;4hEQ*Zy7C@Y z&qpn6EUN!>)Hric7q$Sya50AC8q`C$EtUP(6&xm^jz>`|J%JkNH0mCoL-qR^wKKn? z`UR!A4@^bW4m3l(6@5|TO+_tuCaV8J)OThn`ghJ}4MnJl4x%2mPf)MrCDe~gV7eQq z25MmqQ2kR;4_CI;^UN`*^X6K86-H3sf%-HbK;0r=u@!Ej1`N({C&r>WWMW0^h!Oax z<;S8Xn1?!V4XWQxjKqVeoj8RW=L)LdJ=6tO%Jg5L&ud6Q4V_Q}47B<L)P(af3Rhwz zzJ~h19J2ZuRKF{ziSA-0jA-QYiKz3NqQ-v&weUgycJBXl3YAGbg_>XkYJlCS6OW)y z_|n?1V`b{48@mCcQ445*>faJ|eh<`n!>#_9xg6F16^vqjZ!ZOXn@?E7CDcOhpeCx& z#7&fd%4ebmZjYL1pyel9ej)1Vei5T^4{DqbEq@+$3vQ!N4HcWZ0TWSAaVylo15guA zvi1d*Uyr(iUDkdWHO}X#2`^z4{0rkTs+r3-L0xE$)kih6_kS)4O|%I0TC77&unG0r zylM3Vs4v<{)I@hsuUEz9?qQ2XJsV9i9($nPmMN$Y&rH;L3osPdHD~|zq1Z}76YsK) zZ&`=Ks1M6YtcGVW9B-f&7SO_39`#;VLbYe0#(fwyQD@Y``=A!Q5Vf%7J_?#(HR{Ao z<{PLl)?rk~Q>Yy|jhgre)D~YyEj*~DyJcah2@+7ZBn8!;jk<u&sGS&w8pk)0f_{Ey zT4EJyfR|8Tu-8x%??zqGyQl>nM?E8_EPnxYrB^W;Z=)uTXyuGXogar<SUsoDYehj< z+5;QmVAMTYg)z7j^{qdOb?`K5f;*@IE46l46oabQMeS$`>R&p|P*>W|+J_?liQtXJ zsyu(*G74JJHq@0KL@nrJ)RlgXx{?d1fv%wX-$dPl;0Im*I6M}>#HeTCR+f9HtF&<! z)BqF7XQ6KOaExSrZ#o5C(PGpUZ^l$Sgmv*6s=e|<o>w1}QEy8gYM{}m_F0yH0kwcv zQ9Jp*<<Fw}T{8n8=KiZg90l3f?1CD&0CmD-t3QKXsjo-%zl`nh9_C@YY{tM1sPjI< zSiFkrAKaGT5v++BII=DKuPa(lLMI%-1pLbC_fP{wGmC$Ls4MSc4nnn0Mos)2>fXPP zx`2<ZUW|#<FJT&nwRhuXwP*k1Nc1M5t)7ltjJE+b(RtKBzhDO}#UKA`WDZ01n~UoA zJZhnvEx!-7zz?nc2h@DGFbk{t*pKcM`d}_@M{bYz2Wp_!ot!<*(O93n4>QyswSaS| z*Y79P1b<*{jOpy!vryyZqIP<e<$X_3;2YwtM6L7`Ho+fJU#!|)T)sPM!tuz*&)bCB zsk4@^k>hrtJ8GiAR-b`d&>~F1tyVvcNnD5b8wG7$!Xxe;WuWSPQCBv~>T@uZ`V!O? ztVIU!{%-kV%U?Ci@TBT(s)0JMxz*dF7B~bW_5RPKpcO7bO}x`QfLYW(LUz*&>E;&L z8@Xt24r-vIsAuA9)LU>1!?7#(Rqcb27r>i_X}BM?pvzd3`MuvMWMWhg*U$-dVjk*Q z7>C;WUC6h^`xg1SdhxmL--rWHJ2e~i_AEtB@CIs}L#PFPZutvVzm7g_k=N68h($dE zNvIv^gu1fPR$pLlF^`}oykG|Qa{U{a+2%mhxP_?xD^cU`>&5<S0cS|)p58<~T%o;P zhxVwIk3c>3Gf@3r#$?=&QFsyce&5ANOyEAq#;Ep=sBs3N&YxiUr}Ef;B{q`KmhDBJ zAMXfiVG(`Y0LiEUv&}qI|Iw&{XP~ZV5$e;s6?OgxsPn!>_4^gIpfY{k!&}`)L5U8i zD;S9CxWMu&Py_Bj4R{Qr@jJ`^i8?>_QD+9~{ElW{)On+@AuhD~8>n%7Cn)HI?@<H& zhPtwle(s8*QCr^(8)E^g{~A=kZK#3vSp6hwC(fd-{0^pKh5l~*)~N4BPh>$pZ#9K# zB;G>}_!Y+BWz>So4sbsjF{lBDq4I^O9b1a}(iK_#48~Ib6Sa`)1Kn>z3snEMsE2S2 z*4O*L)Dn9!g@!Lt9fJqC0aCCX^{%L$SZN+IFJcn;@O(FLE7S$$V;s&xjkgXP;5(=V zT*f#bh0wt+k%Zc+Zm1J{sE)6q^2aa}Z=>3i3S4_Gsy-cc<u9V{^?qyr4t0Le5VxSF zW*_wF#6k*kBWi#nsGa!6>fuA(fJqofzAtJgW}?p9Y#ueQp%zeSm}}3%1nR?4<1a>y z^Xf46Ukx8v$4jV*!-l&PTbn~sCp?Xscn9iX{0uc<@CY|SA|_Jrh{{i}{1VhH+GXwM zEFUnE{nrU~M!F82Q4<uJn=pg=anu&xMfFb_<@)7f4)r-!KZa_*f!cwpqus)?QP0E( ztIxyw)VKI3=*mu5!;h$m!pFFL7HXh;t1m%4{X0=t_%7<LC`Rq%4b<ycd8}JVGESo2 z6ZP!8k2>!*wnbmmIR1N&LO<+?YcL$YL3O;2&9TCGcLg0#3n)NMTxj)YQ2jTd7H|l4 zi~fbW($EPm-`MPm59<9NNkJ>$iW>O1)z4!-^->evP7J|N>hn<(EVKM})WpZI3Vx5_ zco*wpD3`BsGqDMFLbcDshI;>(Q>aDaASPik>dHbUyC0dFs0nk-;iw&(iyHU<>K1;A zTHp=Tg8s7hm?>_;bkvSKgc`39W0>DtPC;AzI!59})WH9-diYc~U;?I+&qB3NMDC9F zBxc|**b)<`xp4|GllnB&dD|`j1?mfX6@8j8Xu3;OM?C{gP!ssfRj3JeVq+{u4P1GK z+p&(Q9hi>ga20BcUq(%|+uA=eucCG+q>%j&pzsM%l>$5Oy-8dro*`P0JA|E3PpclJ z0Lt-16C#?>G0s%E1<{TAXE@RF{nfxxgV;r!Al@ZD)cx1NTj#}C=SNKCOIi7!l%F7U zb*;(GCfZZ}fVfQPm_=?D@(uGJ&ry#fI#7$ma6-pnVjEGOdPg6BdQs_%tBD-SI+hYI z5);T(A^45)A9_=k5n03lVlZv>uod#V<*mb+xRF>%3@3^SJtzHXyMo!s9rPYT|Mf>u z=|a>Yo+g&lkd5<*Ig~dNI-YfS)u_)U+A42tYI>RSpZFco=f3<e)CUvo$h}C^raS^4 z4PgEX6qb<KLzEm@<aBJpkFkNj#`aTxi1I3;Cgq-lUZr&6HlgEbaylvyL6i&eQ{oTe z{$n0($8`Pgk$uNn^t6W2kYt0jqaJ1D2IfrU%jNw{d`svEB)1NqvOW*v<J1oll?WYO z9o~6tLUdML``^J%YHlXuY4SISC?brABlZz5(bkZ7gEF6b{|84uIQ%YoEA4!WUIB52 zsA#z)%Cm{5hz-O)2pzuv<Ih>*2ZGnq|Nnmeg`u4I7rsW69JyAgPTSFvBp$JH9h>YX z_0g0YV={4vc%J$>EIIgD@Yd-5_n={jWmjMq8|13x-p0D*=HqV5J!w`o`_bN#xMcO7 zrkF!aqU}cv!T*1-{|iVa5;?>w>oC^T*HFikR(Cc2IbBk~LTjr`xeVnRR{x#)0%8r( zn$WS7w$-laJ%``x{x>7}0(Q3(n_`}I+JwQ>|Avb(jhIUOhkAR=BZd&e2pvnzhLqb7 zzY>oS^(|k8a>>z$g0B^S-nY!(tkVlv$;!QPuC?cz&ywqA<>A)vW$O8qA0Xxvy{X@` zK4LjBlze&Yg|Fix-T(1as!^$p1Bk7Zb$mqpowz{66Hm}~7pD^Glp|5cX3DulcUSe^ zGDQaYSFQd9*0OS0{Eeut_iqfHf~lM&+E6Yzrcl^hQo+WwbtWDpIL-fy*yFzTuPNWM zdM)})v+{9VPkk9NotQy<Np2BwKm!F4IxZ3uh*QKgI+Yxgt&oX3iBzkX!i7W%@i~#n zIU|X$l)LZzwbWY@I@VhLG1C`Fa+FmbHy<Xqo+u&;$o0brEQ8_1HA2Tga&@t(zvljI zzpp%kawFn-Vlh#c{t3heVl#CPUB5eq!W0^G{0}jf*r5tXY4WA9Ch-_inff<aatxv# zYv<}0bw3Rgt+6Zhg~S%C|AftnPX2m-&--5rFA>d%M~Oyso=nsu`ci*|_&1>=jff>G z5?g40hFC%9NHrgDRkm+q?V#YI9St{@D(aH*T|iOGwDUnlsm;Plujtfr$BNr6zc0Gj zYHg{o^ybOw8OfPx@fm3?GSXK(n^mKFPQm#2Rt4h<#;430K5pE^!Zstv7mOa4GIZkj z75~h-8<?4ro>tylF*~<b(eG`_MHGeRo-9*zF)yb~QEvZ#gca2v^F(0L@kuiSih4{5 MFI6;YT5_5H0(Efb^#A|> diff --git a/libs/pycountry/locales/pa/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/pa/LC_MESSAGES/iso3166-3.mo index 79747ee53768c974444fecc4e3fabe882775508e..6a5967fd401b11614fd5e4c86a0099ff1d9bc8b9 100644 GIT binary patch delta 1029 zcmZY7Pe>F|9Ki9He@iXP%1SGr1>vT%<GAjIt5GWS4=KV(JB~W(%DS`cj7D`ZI%Lry zXpuU2@*uN>7D^BV9Xj;y5OfLc5JON@&^dw*ec$X7K@Z-1-k*7I-uwM#uI@|y^v9Z# zSwWH1-Kwq=qFGtQgYpXN@im6<Gakh1;{5w@)aegkInH1W-oXl-$8ETXwfG#>K5JMf z#Iz_b2^wNARx{CooA4y6g@agy69uneBmEiNf;rrdPq7T&6~<Rl(*KU?gO#O1?8GRl z@zYqz_k~TPje)DEZoY)-1|M*ZX#BuV`Y*ZO5iDLW#98dc9-PG~Tt&6+%!YhKhOmMD z-9mpEWAr~^AMPSNQNAxO(&)fB+=uT`rQ#PFSX-Ij=tRLW>}LEXw%{972mFaDf)T>i zguNKWBsSwbYWNlp;BTB(IoZFFMHt5cOrbjY3nTzRkv!@CE$V=Ksp{WQ;a7$If|Tq) z(i`ld_E%}-E`m%15mJX#g@B$S2ZVyEa!zCf(H8t;Vh{D-LUhH}!hp*2=0aQLlpjfm zmBpfOMGY4wM{Or*P9@A1+0<_jC(LBRaYOQ$HDYDVWcF6+{Q0(sW*C}rNE+?&)>v~Z zrJ~PtT<u)OOtILtGjZ8HVWwnv(wvZ8rU^$U9V_F6Q+CEmCohM`Y{#`m!k4Te-nYVb zW;8oqR@XJ=x@jk_>;F&d>5M&Y4ZDt>aBOYZ9<lPRh!Klv5j}0{*@d!1HdNjyQ?l`} zG&(B=wc}QbQwQf6$bU&j!)+`5<qt}G9{RcKzIV^h-S)jFzPIdq&wTH(pS$LJH@JH+ axD*V|sc|*Cz-&mWncO4ayPy49)&2)J(zQhZ delta 866 zcmX}qJ!n%=6u|Lo+9dYNj~J_MY`uvf{qV(?h7^-lo4UAUP&C-V<t4s`X!2gjhk{EG z5usZNadJ}-?PBTVW`{x-hdMY2Itt<<C<@}>|0JOoZhq&ymv`@d=e)0>XXDK;f&R8) zoMxV41`jATjl&*(7;i9yn<&@c;|%^m`G2HOsq?smesnQ__i+%{Fo<m&#n&k7Y~#36 zP4&GSC||!)hq)2PLl{GOFpa~Q?U}<cxr;|}9gpL4^x@my^>?VrKcH;*6HnrVw|jja zhuB};B$(qy9_8duaf2$n!UggyueF5hcn$aPGM+i8)ID59dG0exC4Qh(QxA0WG|rP( zFoQ2Kfxj@x{%VFgMesICNuOX0U!W}XvFC4GCLbMA>Kv}19Plwp<+gDO_fR(Yi?e7_ zJ_B#zSzJSD#U?i61iJ*X(LdzHJF%3W0(1uJbb2d^d<(}UU~r!OA*Gi?NJ~yI<waz$ z<o=-FisE#tbp&a%6ux^Jk#9;-l}<lLaFQuKqjhSGIl=7P+VOnzv_5&;0W)cs31cp) z%|t43Vb)B<TMvD~tiG<7OIBGgT9sVYs-_ENt5}NW-SVZujO7#>R>3xI*j72EuQr@J zR<5WQE8V~-#Y`t%D%R??Xw7X@^Y*G+E!a`VuD3$|;@FCD#dhqfRd=f?opJA4rQ!oy do6&gdkv}pp<>>H59h+X*+VO9ATe~BZ{{eFeY{mcp diff --git a/libs/pycountry/locales/pl/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/pl/LC_MESSAGES/iso3166-2.mo index 1cbaa1cd96faebbbf8c2aad441694b8a9e2e387a..bf32f44279629423a34ac36349f0cfcf038de07f 100644 GIT binary patch literal 203350 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∋Q1kf(>U~%MrN7quojyMT)$b`7{CR|$ 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 literal 188055 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�SvM7kuh8HWVsQTu# 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 diff --git a/libs/pycountry/locales/pt_BR/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/pt_BR/LC_MESSAGES/iso3166-3.mo index 10d88320c9a5fdec31d41ac953ec902e246c437f..b2e3b7be8098637ddffb18b69d2cc641ac819abf 100644 GIT binary patch delta 1063 zcmYk)OGs2v7{Kw9&(z9CX>UE!%hx!LFLDwI2}6+x6EZh(ojJ_h81EhKy)%&!vy|Gj z7}^H8s>n9(Y!PG&T?P?7pj}WxJ9lmRe|IeW;LPuwJNKURec!#$o7Y<k-<v9)C_*z% z$=Ih<w^+sxv56;f3p?=#c42*a>HauIS>MEJT*fARjJ3FeM{pHe@EyuNU+{!d1yx=V zPE;$_^T!At!by||=kNe7?z)8Ste3G7Utlx7!7BW)d;K$N*4rot)>SHX42MvzU&A`i zS1yx&F5E|{{547iU-2j1_>E^-f1<n|{DU#<*k9Uk9xt-?Q4)BClK2|d;U-FgAMreH z;{|N2QL2^m)d&-5%^V&?7p39{co-j{Z1fbRLoZR|I!Z;~P!8NdNuY+l%Y6-a1~m@i z6+DjjPzo(#foIfPCSACNeYk_N;W<vF0byu<CAohg-%2Y(z745PLXwtOa+JaARc#C@ zO!i_+#hVB_E6GXF$f>Y0$x7b2Bty5Ae0!%EdxNfp-H>ZiWrIuz=>Q)R{a!8mRn~SZ zmva4#mA9=P-EqTB*jC2&gHAnRlE$+##fOzEh5ms^tS=H9(fzUbV63~3sGYX_ATsM& z4i5*e7uVA{dx@t!$8wUcp0S)%+5~~EM@=S?HhDX5F1uOd_&MM7x?XCG9h_9oN}0&4 zu@>X{y6XkGRL=NDcZ_@1lAY<)qv;^X`tf))ns)ubBzy0g1&#|hh-N+aj!6W5)b`y- z!cCgeY#=r~92tmagWKaX(c=56OmV8Zz0J{MI(DgcE^^g4)D>oYv$UBW>W!`W)w+CQ rGVI01v#=R6CcCk|kg*fiZZ85mZ|VOXvUJi?^Oo(I9=+$*q^te{7qhE$ delta 924 zcmYMyJxmlq6u|M3uR}l-1Ox>g)Tki0vK$z5A`%OY(ZUdoABD+q%$=JoyJT)JCNyWO zow;CPYlAjosH9P2jD@i=7RJKH%2-+uJO6JF^(A}1nc2OWH*aR6Z?(7jt-EPO5eIk% zd3v@fHG&-t{19un4_}~+f5cJTMEU+;qf#gEEM_pqZoG?a_yBuw1^e(B$~<pyuToX@ zv))iGO-k+L#V~fFkMhS^?7(YV&f_rs7`yNx_Tm$4!IxX(uTj(ggtFi-?8l+z`uIs~ zXMJ^@#sn`4D49RP4^-hP9;RPmTVwbbeSD8H(QiD3-L3V7FQFtnhwWHGNvw=V@ID^J zHQbM1u#ffCCXF4~xxK#ALEKG$1ZAQ#D3!U08gHT`u#B=`4Q1!6DBnHDL--0O@jDJ+ zKj(2ACy*g^8>^!<?$AglLN=b>1?f|OG$aW&n}*y4Nlt>#|AizVi_4Mh;gP!`AxHN& zIB&&X(<<*mj#&y{zZfESD$PvFCKZt~$xb=CbO%G&xc;u;M?>vv^GcVW%lZ@9@hR=+ z@>70xJXgEd(o>x?MPoyK-a2OkXY{m72fU(J^k++pCJ4Pkyg1W#*+iv^DcS5*YZmkR zoHNTo7??<3iCt1DRczVn>2P6b-enVKqH<`GAdY6kpq!Mwa$Io*TZ~=FdXY{3&z7&{ zGG^dL_JWP9GfC|7%x4#ZMEl;9H(9G?4z?bP^o;gLPOpE?=*He#CUAC4&)KE78}ngM JFnS?Ye*nEVe9`~_ diff --git a/libs/pycountry/locales/ro/LC_MESSAGES/iso15924.mo b/libs/pycountry/locales/ro/LC_MESSAGES/iso15924.mo index a2c408a9121094fcd8dd4cb4c370157e767f1cd1..8402eea4c4ae07462e1c4c3e500533471df1caa6 100644 GIT binary patch literal 10632 zcma)=3y@_+dB=|kh?@Y4QP=lDS(t&nyR#1z1{R%}U1pb=*&TP5UGNd<dvDLZXYP4i z&SQpIiMkSuBKSlR35oH68Wat_z*q^gYl@gM#%K~XRm3$ZO{z30E5@QUrTP8)^qrYq zNh+u2yT5*&KHYu3{!ahr(Q{6HPr&sB?77&tP78uxz*~QVAFdnD4g!jTWzW~cv&i2J zUkY!Br^9c-XTg7jXTbl0PlCVn`O}|L_j5LUGUZSA`4>R7+u+L^P>+5I{7pCk)!!`C zbFPJIf1NMyLXGcwU%v#;A^$p`e<wVZ{QIE#xf`neJy7HQ1bim^3#j=&>iG+(=dFKg z5Ih^c0P4A;Q2mU<^WhYvX^_LG!JFU^yu+721o;cT!Ow5Oe}?MkF<-91s{9<d4qgED z+^taUE`=KJ7}RqoJ!hfDe=S@O3!lFgZX|z?&wms07yOtX^{YXOPlD?2EU586({l(u zo&2Tn8E_xeJm=vicpKafzXWyvPoT#6bEtk#VKT};8LIxNp3jDw--{qkgH4{}Q1d$o zb^oiN)~f|y1S_cacfuFIPeQf(8hj%B7S#RUhI)^WLXG=pQ1AUrCL@162ddq<P~*D5 za|E7A{!*y+lTiInd(J_%e+87^wxGtBK+Wg%Q1iV7@)x{|AJu;hJ|BJ&s{ijmt@95d zLkk{*8rPW&R`t(?>i<GG1h+#y_tjAS&qMW_LbZDXY`|Nf_R9nCTzCv>{6FygG1R<& z3bmd;hg!$yvsf>LSHNLtpyu;dsQ%sy^}G*4`PXNm`uUpYH=)M$9jJYJ9BN$u4t4)y zP~$(9o7L}`kWdh;hw|GYsP!3#Av93!-U#)a+o1Y;H`ILY_Vpiz^5;)Mt>44&JopW$ z=l%?8T&M65jcXlLKhN~}bD`=tL53K-7^?rhkXwVR;d5Z>^SAi?hoI*3=TPk*fqI`` z_vPP%n$N#MjsFaShT5Iw`E;n~KG)~ZgYvhFeEA5}dSBx6S3x~*KimLc3FYrcpyquu z)HrX4dd{ceDewz$2Z=92jpH$bn)pko`%Zlx_3&v>_q`m_G`I%pc?HyZ-RSuysQcdm z^}P4`{QXe#c>t>YLs0Mct5E*@U8w&473w)ZfolI4RC_I!`dtUr?kSKh5j+d3{bs23 zd9km*466N3$X{?3KNrFXD&E}=={oo_)cybD^FM%k-l;gf{Oc^Z6+R1UA5KHX7X!7Q zDqsE~sPR1D>;D?6pYQwnA3?TK@Px4Tv-ME(+u+&oyclYJJ3Oz1xJa-M>U$GGjr&bd z&;Kw~{og|Q`H!IH^DC%+PG^&gXG4vDJ(S-zJg<bh|21$sT!xzOeLjC2Y97yE^NS%= z{})1ye+yLqmwJvvt=kloe;$PL`z}=bWvKg)`1&_P#hLd*jqA^#_UAu9_50sY{hdZ5 z-TxFQ|632`U)!MG`#vatJplFITTu5$o;j4Cy%wtdTYUN3Jn!)Q090J~IMn<69Mtpw z3hMcP54DbuLaq0ILR=;|ok6Sr4N(5E4XWLwFMpNi0@S!}fO>yNeEw5V{XYP8-$PK( z{X3|3--C)zXKkqS&w*OUJ)X1hH1dZaLkeE)c?1rV{|MX+zYeudzw$im{Q7y%gYtu| z@H9B>xgTm=*FZi0Iw(I#pw?*#YCbnXjrUfleSHVi`}`=}1RsK$$A3Vzd)@_gze7;{ zj=<C54ygK_Q0u!7YP?OT@m&wuO2J#9+T9Cv|L38`b=2p-=JVf$@|S;s8t1Q|{N{|I z`n{b8wXY_i%CCcGz#E~)b2F6x-s;QmhU)Jg_$2scsCIwp^MB*{ZD0O9sPX*}YJ5M1 z@{eCa-G2@*NAq|#WNCs8@QH95YX8hajjIXuoY%oq;LY#}P?!3D7pDGh#B?dv+<@JI zU4?1P1@>l4*An((?2oYbU~j>6y&N0GZo@u{-G^ztFT-@{*}E}~aRSrT#7@OD-ao-K zUR|%pUWL6~87`K7<&uwn(C4OLx>8f0XY@`&Oz&Rn^847$nD*pO?48)9*yk}_iix^D zf!%{?O<#-YQar1$Y3u-Y3-%d|Ef9PJy9T=n8^Lt_0XF7RL2y5Og-;6|O#A2y%5WXV zK8AI%i?EksAHvSW<iC5c-^CWNdF(oDBlbD$66}4Lu4`)qcfmHc-sg4Z_#I3!;ni4# zy&oG~+7oZ}nU}%Dr%#6V>c_E{VA_X+>uo;qY1sGa7kVCo`>-88FMJBqei&SfB*w8T zeZl0Q0{)&)Z-;xa^RQX$4cJGq!S%-^6hqI(O6+z_*Btf^mtz0HVa#CnVpm{SW3R#X zV{0!<=7=x25Vo*S`n-_&^oQYTKK*WZw@+__AHZ_#z1Zbg4~wy7>~+}FFkPqD2=0WN ze0m1H5<3?=h+U688PoNL*u~fu?6)ypXVf_1cbCt-5xz<3v36{dU~Jy>Ofc5Xl8xa3 z6NO3zW2q^#I5KItJF<D!iI@A`A{?5omQE_$NQ1JBO1rk<a4?peX4LWshxVGHG;wr& zxM*@ZDAgdbDal}L(NdQN<J70Nuq2Wy;kPJEc+hl7m8KVr+q6TAV7zOhUQzW(#Zgf# zC(SG_g7GZtg|ns`n?)+JewJkOSumcPZbCjcQ5@58)$vcLx=}lra6<uA%M_Z`Sll#j zNE2PtOH2R~ewcpG+F&Be%Wg1{wQV?`<zbXk!L-|9(aNKKxmr`DEgC&udE1sYPZ-1F zRW8w6Y16QswJMgTEa<UcvW62?Y9k)W>zSh_&l+RBo@s0CCYJkol=1B4oEfUEPlQAJ z;&wREt@2hkoMTn8G-|Cb{!Z38w`DjqL$_Hv9PG4<CN&*aMDI$Ztm?<vGV4-wGp26R z_Qr6vjG<<o-1NK4!LH6S1EpcxCYeUOQqaYB%&(PrZwhv?-UYMRRd%DS&-jKW?N|TQ z9v%)RZI*Y`<Iqg6YukAhGoH!VbZ|*^H<@t@$Z@5vf!6kd$!fvqX(aNb>UE=Fw|d~` zaI`U;GU);!w_t|rnz<<H$I*Pm>sWD1cgumC<t?KuHSvixOHtVk2ksRP;g6<p-k{qq zTB&jUcdFPuyz`Y$#_qWtTg9%XO0&#WRq4^sWGX6|NU+;BbGsDmj&fc=YJxpU9}i;) z?4`so-92f$Vh`?Smi@lrt?fx`->XMDaQ~A_d3W-at4zXESBLEKMb#|ugKS<4!-$7z zM%TE<+NSmF1_NWFQ`(Y@aZU4LIgU*e$FU4?^(p_$O?aEO`c?8zn+8*cg^fU(nzn&; z_av50H=L%XYx1n<x<=iIa1q8P@7TfKo2tu-#KiGx8GD5rvjt+sRJUrICEhA~C`#LU zR<|mPO8!1pWJzfj<zyjF9`3D*9vcUbn<650GJI%idQaHjbG_L~S(aP5)tV`~m19*{ zChGfEv1Zz2SQ(}DZ#Z;iZhB>vulkd##pR7<<E|;TJ?^&sR@a0>`;UGm?F<LgQPQmV zO|8kpu|Z;-L{Yh(+0C@dh*{IiExqjNWfvc2OxG+B(}Ecjvy_VVGfWX@+8DY7Q&CC8 z)9PgXK4whWwTX5v?w4jIsZ0$O4Ya2RJ9x$t0VBFvwmtSLxvpi2XDoq^^_#IN(Q+#4 znO?;hxKFz`oT&05TC}SLYd$f-Ok{A=*$i*W+jNoXoy}y&AGqz<z2tZw`YMsqdvU*t zwrWB_y&Zg}T<%*s$TRYJ70gsIe#0=BM8Y}_jT0tt!r@>qep|Zv?=^&taMCte`wRA( z#sxT5`0)Lcov*yT@$iF9v$QeXYi_7paGzZY^}(F3tkQ-`esd3oz1Q}S9f?gCNBt<+ zd-O|1w+i-t{|$FeWx>9VJ}&!WVszBQ36-*mEvelY?jvB#5!#Hxo&x#qijSW@ob3LU z<o=5HR@d)QQ{v~YGOvo3N$H}7EnA!FCVLgb6-t_}o3XSN@sSBnD6U)1>KoN^&n2lZ zqf5_a)oKT><Up18<VpMTUYEsp;|ccV(Xt8l6{chPO-xFT$Yhqf;ch-P9WrsUoZHlr zs=|qg6NagR*{<mnjXrI=8Rr7$#IuEo`Cx{Fz_#Dw%N=%wZ7ZRePN3`%h4$-vwn!Y; zmzhuEqTxJJDTv{L|5r69kDSBEe)(0dpP-(_oWVsDXM(x<n=)sr+z^0r6U-5dh*BHF zue|@*5mLvFsA$nGD~YAyU@mI6dA*7?N*sUira>|}cBDN1;9Wi46Lr!<JcAHJI_<JM zgSjj>;ao=GS7F6YbzyRDIp({H>vi%dnDa*-PhNVGEkvsUWR4?%Y0*remXnvw)069| zDD>6o*f{(3x<eevPPpj+D;;O7{kU0fn&k)&8;c`to8f>u&P_{(1be|c9ANsK78TFc zAPNsgwj|NZ*%rqi{KT;%z5Lj{K6(7Xo0X$FiDG{F5Yg7gRi^@JhdmY0A>SJz3Jyd~ zt5<V?Z#RdQE~Bz}Qz7s`loQrXaJ6=e4hmPN_4j>(n-vkmv1XP>90Q4KtSVous8s|9 z>GWV!M9tWSbA4-D-QW=K7+;&9mvHD{otY~5%&;R5WwGUsYolN`&lYT}Z0u<_4r;4p z>1Y@g*=x33eCgKh>-O6|o31fabfR{H!)MVrkd21jvg{Y5n>XX!h1t}$+K-z!?ri49 zhGJRKD6L6Wv!sg37VBpBHTK&@hMA>}ojCYtxOHUfw#JsNjcp_0$jIoHEf<Y&t()eJ zH#owiMa&sK9}V~0q$(Pdrpd=y0f&_hFV9ujsmnI;5ss^uwWA`>vQmS&f?jwHY~scN z216fwTy!=LFCUD*o8cqvO-r`PW2~D&zg~{wgt2E0w;G%CZ1ZZbqhX${o7pq7YjxeW zY#LcNk)@m~89kwUG%W26<>r2DqV%$m4^+-cWyjSAu54Vg+D@~aw|Qfi&fM&z(eRRH zRIZzi*{yNoN=~=MXqfh0w%D=lvan9>NO$bm623GX2}i>r(j(!GH<H+}Wn?70g3|NP z59`e3tnu(LEw|8e>t*Y%X-pEiIAv;G57ko-FW$7h(YA|JP8$yY-M(ozcHQ9K{op-q z8EK4M!a{^wwvBEdsozszocuCQei<jfN_L7;f&a)x^OhrtQ(`<e99mNxqr@oNIQSl` zsob;VgNC~{kKN=E4*A2a2~)4a)FR<~uQs*%BGu#*lG?*AB>`sQdBZ;A6x(!CjBdJh za+tP~WKA#0nk$m5;GmMR*iqP&I1Bo<A`4qYSsOG5x~y62GT?Ms)9EtzWGBpMji+gF z5@Z?@9U#&U*QL0E)EP+l@#?JQ)EQ0?5<B?{x}yLZCrq+O?!>2}lK$3KM|f{ykt{1M zQ!5{u=gh-cN!pdJ9<S{{%lXEGwgdHMLn1fAkV9?@8K;L2WZW^n21PC8Ov^<j)kaRq zDb<Y-b5ZMr<eHbru13wVCQUleqn0%VZNo*P7O$T0A!SFwP~x=Rv71!5s_tr)N14=} zThNdoKwL50v@u*$%mO)yhd`nSr|js~b`ZO@@5mcD8S3dLm2y6mKh~vu>20m_n3Clr z*{>fv)H!<J1xN2g?sdG}bE94re4Q1+$Bi8+OOY)v&DY@=?(zfG*BPk3u8v9kNcAC7 zr25E7^|_jr-GH+?`N#X#BAr;tx3L{Pa+gz9gW6UV4qSL}{`bzNdoNn4bbUGbM|my( zlyLHoL@obZ!pXmGE&ot|oXeRZ@4ps+Y-8y@R)vu|DM+oHiZ^Wd2Sl60zs@54zD79M zYf&u<SH@07tpK^hosU;*7K|iezpz!C{|_VsA4U`sR!!23+5D~zp;c?>1mc3}XZ5D^ z8t8;I7!01}=qX4Ly@rD#a?;S!nY(vITn=vaGd|&_1tXEDsIXA0L{hz4C(^6aiGwFl zE}a-hL2p$ja+2qe;C6Qra+<SLt}Wqo(CZ=*)om>jQGElESkxks5-$?X8j<+Ool%&s zh{Rqk61`8aQHnjM6y?)IR{l>gn5<hzrpkg22R-DXRji9m#*1-bkMC(z7dfuk`}4Jk z9H#Y&RXj!i9m7|slY)%Bg3N0L89N2ZNF%2pePTQyO0Q9nu@q$N6r@HJ>BK}L8K_9) zwc#HUCUJ#MM=EA;GH6Ra)urz2?vk~Zlze1nL}Egv)09-M`H<n_=8-#Xkknc-skNkX zPD>_UOY$!<B681bN&Op42R!E8a%%FVK7BR4N>26%YBF(ZGVy9sawLm2R3|3&bx?}v zT<<ZT<8x$M9EbHS(f`U4Dar&znRrE+3>0NE%2^Bf>~N4uRMv}<I#t=JRb`5*l*oMe z{>~aznMzfv1vh5wIvoUJWM%4PrGAl>4n(tbjjZI<V*4ic&#Wb8iiqrGLFOc87ISuT z5>u%aiJ2iW`QKYDF%u5aI0lR9z9M`&Rtj>7OwEU_BjLT;#yYL3_n%2?Dp9M=`t;FA zv%KwIkni*4Vjf=iOlU)I4mu9VGO(4bzpbd&bQbWBl$9HJelGdxMjCLsM{s6Ner8^N z5*Z~wyH0+xSYCeik)JIW*s7pEke~BjeBu>-FF$=?4RS9(b1y%81NE8P!>CVF4t97| z^8G$c#PL#;xeOKaM?aVoI1rovpXNvJOIx;Isr9Nf_3t7eG)vyp&Q-8L{Liyk)u+XZ zKD}$8PbsSPDGBsxG0>+z@wlRtF%Ld9IwaX7<#<6{B+j^~Tu7@D6$xvdfY;-LHU9^c zR^^z1R$Vy{uBO&RGtLwX$f<(!jtd@x#M&l>caq1cTNSXYeXO}v2iw}g%7J)Axq9)6 zFY63D98gz_SGVIV`6%Rgfq0E;@v4GFiB~>m60hYzx{??O*HXe2kKubG=~_y<D(kf? z{Ykq5zJo+DebdTX!@AT!#Uf$((`GBZj;*|orP<0i)HnqzIl!*tkfIcu)Sp`yO%yC< iIg!XR?88yh4UF)?(C~JtSq?zT^t_r~s@3dr6#Ng9imL4Z literal 8284 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 YEefd~C)I$xUJZ@})qqdTYpM1B0ae--K>z>% diff --git a/libs/pycountry/locales/ro/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/ro/LC_MESSAGES/iso3166-1.mo index 29f77b15de40518318255713196581aeb74a2e62..1392dc229193543519f11b03bdf40364906f7855 100644 GIT binary patch literal 23486 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 XW~7<d-1I3cQDE{KmFy5klj-~qAJ2#+ literal 22866 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 diff --git a/libs/pycountry/locales/ro/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/ro/LC_MESSAGES/iso3166-2.mo index d406681b5b3601a57a1cd370b88da525d20839b0..d6e45254c103d3894331698c6b0faa31f312c7f7 100644 GIT binary patch literal 229998 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 literal 27706 zcmeI32YejG+5eYf;{ur8%TY|18(=_Sz)dcaB_YX`y1HB4t#o%Q@7>y#Xg0kV2*rSD z#+YD?F~vY2!9YL;41~}^4Lv6G7JC1Ge|wLNlmAQJ<PE&Zn@<+cedl@RnP+BaW@l!1 z#Ea{#KFi^{ZdJ$G0?ypfaV}WRalYO~TF05NkK?QkC&Di9Fk=dKMQ(;`!^x(f4tpY> z1lNG)7%zg|kgtHsx6t&9P5zao-)-`P#>Y(m3{*L<z;)mUmcB}P$zM09@_NBF;l@z) z*xuL=s@(mc?q{gUBcbY5WAX$jKZlz>ZE~w|8dU!2Q0;Ldl;6|gTJRj$9bOLQ_ZmyT z395a6W%{R0|1wlPUx(|#k1W0Gz9s*?U@!C=!u4Tq)9+(E0McE~aHx8WGS)(sKOX9S zj)1Cn#^fAS{UfM+M_T%ECZBBSXF~Zo&*V#?{LO>Pw-CzjV%P)TYWjPi>>jZ6$Dr=> zDX8{&)%XrnzkUj3-(|lN*Mcf{Ln!;Lpz`lz+ykoo1EKPbfU>WF8Xpr(_Myf@X!5a8 z`A#vO1y%3!q1t0El>L0Da&Lz6e<zgx`%M1`RK90TUJm8=Jt(_REd5)k{M`qYxGvQF zZVKgpC({pr%3p5sV5s_xf-0v5>i#D|<!ds1tMN#va!!Ksb0(DCEK8qb>DNH{U2N&M zLD}B}RqqF&%6r`Sf~CI!<^O#syU(EfJNuXPJ)r8ho^dPVE>PoRAe7&Iq4HNi`Ky5{ ze>_yZ4zu)>F=zTIQ2CF7>YtM>{X9#*)Z}?4Uu#@!ybY?HJ59b9svZx)4dCyf#?6~h zc3)chDhHJ09>#Tzn?TinYvYc_zQ(<b2SE870o4xGQ1@AH`iW5Ybp%v>TA=(Eq2`05 zpq~G;pxS#5l%EAqey@YFzXhsY?y&R+P5+4TY2!;!eqM*F$A_l>%=F(u)ua1?C9Vf$ zw>eb4ZJ^5A6{`H*O)iJ3*AS@sj)1Dqc#~65_C=`tM?(2K9;&=EpvKSnQ0;LAl)pt# z@?xm;JD~DC0G00vD7)vO{Jvs*)A%7&xnCHa!6myjjJ=@JH#T`IDE~V^`R`}?eW2_H zL(TIeO&$l;K8HftCrzI<7NF|Y4(0basQS)?%6B%D-wQ1LGAR42jW<B~y$#C#ZsYx? zf7tkx>0g5K_nPq?sB%Ao^79Rp|E@zy{j)Yy`sPsidPCK3H<SBY`rc6ahCub}Xehh! zQ27pls$UYy&WGx^$x!7U1y#<8P<CfQ<(mc7ua}s7HI)7J#@j6YZm4_@8=o*fYkUc+ z+}DinLizs$%HP*e<#!ocl6yhPn?TibTho_8<r`@7ASk;ElWUC=p~`E7YKLYhy8tSG z8&rL#8&5L*Oq0)r%0C;beshi2K>54L(r<%m?_Zn#VW@H*H$HFrKSGuJw(0+5^4FHW z+OSf3H>i5`g1YYwjR~mw><Z;)cVjtJ`GcX#tu{`8^3w=qpMlCB7^gzn9}8E9ry9?M zvO5>5{EMOP|0?74Q2uT+`7S8?Wu|}B_%xLN7cKn_D1RS7`TNTBs}C>bUlYpj1}1L~ z^&D>pW#1omf#oJ22sJK8LCwQs;p#90Ri7N}0wXBDM?(2I4l4b0<GIF*Eq$KxTB!Qo z0^|NQJ`8nV&q4WH4(0D%sQP?j`c*1Q={=0=L)mQs<#&771@<-lo>2Y<!LG2vIL6oj zm42|vDX8{oF}ck+9jcs@jb|AzfGTeel%Jm)uY>Y)D_j@e3w6IwL+xjm!>;gisQll- z)nJzqrE<DMrLPNhUz?bIJE(GYHT@n?b_YO}S7B_h^hRS2YJHjpmH!mDDLfl0|3avG zE{3YlQn&_u5UO7uH~D#}ecW=W`}qiN0-cei@v<r8Rm#~7s^5kftKk~Rlc36LgsP7Z z<-ZMToE;BU{wXG(36<|$*bQE6@|95b*FyQb(RdqF{=1C#LfJh8<>yf-`)8oaeaZB1 z8b5?;?=MVVeN?I3HKF`&Xxtpi-!>-iZ0u|LJ)zoX5R|{srXOoO)Y3hub_$KhK-r%L z)jqSJ%KbTv`w4bKUTpI1Q1^Eal->QXJA4?beosT$zhwG1p#1;I^xr_`>pHrmUlS_d z#>TCo?qf%&{o)=_^%!OPTB!OT3gySQ^Z@oio?@H<<!2_8-E1g7bD+w*%H->y#^Eid zzaREMegrE2b5QwThsysh)bsQ)RK9MNrSZ8Ll-<ryc72Tlp~@QsyTjoo*I4>^lMjQ+ z-vrfuS*Ui7jO|eMITrSWGhq*Sq3P$De1q|J*pu}8pz=L#@=GSa4fXtg4ppzOq3YeW zs#K4)jO#<yXHzJ<ZH>D@*$;$k!a=4V4Q1b8JQQlb-vm|PsZf57gKNT>#@SHM@l{ai zOQ4?n`;1RQ<zEiv|9z7`hq7O7Oo?kjrEd&XZUU;m`olHha47pasP;YtYTaps>Zizf zG*tVa2<7iIDEo6QeYSC~ae<}Z2-PmPntZ3pOQHNcWc;1!Uob9*dj8&qy6>-`>f58b z)Q=lO-T!t__3Q&xpMfUt2X$Y=U{6>LRgX!Q?wahI+zMqk&Eyj-eI|_W)8yGu^}gKX z1;!ho#?P%#^|>9YejQMLe+%X3IZJ=p_y$zHK7jK38B{wvHKqD@fs%Vc<=+6xelw{4 z+y<(=0mgDDyCKGrP=2c|eLPgV9B%ZX><dtS+o0+_9m?<Nra#wsk?H3`<y&C#^~PI` zcR`hVKa}4`jZZ`6dl9Ps%c08q1g;I8TJ{j27u0?40af39pz;khj)L-E1J&*mOn(TJ zeIr!;vry$1O+FGT-|<j(Gfh6<(&s?g&xfklbx{5HODOw$P5+4TIk*=3*P!OVkD%<k z98{|Rx={Hxf~rr#<ei}EF~H<~p~@W&b>CISgN);#><@;rOF{W<fohk?(vO6y_X$vT zXF=JW4^{r<roY;FJ?yut<NN}u+}G<%{@yYE3ChpsQ2q0r>DO*3)n@}Jzgrr6o4yPx z-$2t3GI_YASD8H4c!=qfa2@hxjYnJhnZ{XA<y`_bA6yC5-ZvWWfGYO^sQY=;<R_up z?|GA7gYxr^=|4948)KKTrTl9_weNaRem8;2w>4C|?g-_#zonPMt&s<t-ZgzQRKHAy z@%I%dKW9PtzX0}vm%{boBB=V`ZRz(xjq~3?)#Fj)(@^EV2<7i}sC@66{4tdOuc7j- zI<A!79ZFssDt$vJKbxDpJ(Ry)pzH>iejlj&IKcFyq3jNVDt97Oe;fwYKF!7=)c83D z%Ki-FEU0oXg|fd2D*p|}B~axrgUa^^l>O6C?esEKzK@~C!?%{+b9^b^2FA^y>b))0 z{gy%5?+)enK;uX#|FuwlCqm^*nw*EK&on5zV=es@C_m>KFNV6`c~E{9n|=vY{-q{A z1XZ6Wpvrj`>i(BQ<@><&UmCkiD3!Agl%GwY?6!u=zq6(90p)i;OCJJdUj<d~dMNut zjA=^`q3)v%%5Daf|I<u=9#s7<F<x!F8LIz(4dwS<sQiyY`Fj?s{8ymr^@gRtXZ+0c z&csswu2B86E>!tjLFL;C%5NW&_c9JL4uvXbl*zSF_T%6N@Nl>VEJE3xZRr=9JQu2* zt4+QRs{Xea?=aqLeAxITl)o3C+F?1ApEphaK2*DW3RRy~CYAj5fSM21gL?jZL*4J5 zP<{@8@-qyo9;2b!rOwh1H+{;OH5Q@#90isCB-76{{drLJxD2Y^^P%jnv-F#x%DdCj z?=wCORj=Pc&C}09)#oj!`hN!HZ;gXX`PYW3$3{@)C7{O7&ZgfJ#`g);KEo`%#?lXl z%I87Z<)P|XfT~}caRyYmry74|`U{M6pz_T(c@b2-Zh`WDm+6;5`FRv-U4I%X-)qLV zq3l0|vis7w$|0rtbc6D{4pe<NgUY`(lzneY-wmq%1C9Gb`K^GmuQ84_{lQTAQ>Je* zd9raDRJq4O`8gHJ|2a_obCK!iL;1M@s(!bcyaXzL2UNa?q4GTmW%nvnzSp7Z_a2np z$58$DHB`B49BTIuWw#krz64ai?`ZPwQ1<1<p_X0+m2ZOaFk{Nt4CSxYIMsLzl)n?9 z?&D08FSPWzQ1!gp^f#G)iOC&M`F;a+Ur(9-MU!8LYKQls>^_F7$G1@R?Q&R&J&o%c zH-_@JB~<--8~Z@{+so4TgBowcOkW38&UmA1`W6`9zv-u%Jj2pYG5HLrdYuR5=OU=` zuY{`4A}Bw%7?(ixcL$XHqsHf;{49sEe+w%AhsH0U>{mIwbU!_f>p<CU2-WUeLY2Rh zu|Jf*a+3!`*^f4TopB<R|068D+2jz)-%+MN(Rc=w-&rPK0@bcpLfJ2dx}V!kz8h*> zJ_t1rKLyn<Z$j1QJt+H6q5OUg<!7}cO6hAFH!yAimA<{P4C?*|LbdN;ldGZbYa*0= z5~{o`RDFt2`sv0~jpsnwT@2-S9#s9VgVNs&m2U}DeeX5?#`pwO`g11#0jho8GWm1k zcToPix+Sg+<!>XX^0tKXvz>7_C_j6`b>UE``yC6lPiutAKLslP(NO!@<Dtqq+0xH~ z@_WAN=a@Vn>V9v4@^d>>dG{C}we%N_Z$j1MV<>-J8%y6?dqL&j8LD3Wpz1RWsve`E z`lZg~L!j2V6x4n$f}6k-pvKFkaASA_)cr1l>c1zU{JjEI-kVV6eE{Wu^<-(BtqoQF z`X+A*m2WGkdhcLzUrXN$%HMv*p-}lp8*8D)?>Hzw2SeE>O>Q=Zrf-L8*BPdt303ZS zP<}5p&V%x^z~mc@zkn)d3Do^Bh4S~9>7O?)xAb?Q+UE;nmsH7qU8r{60;=3HsPcA) zs!zGeL*eSkqoM3-pxSdRR6P!dvQI<Rqt$q%=}&^ncb4gALFK#Lcs100+yK?jcR<zS zDbv3IRsXl(>hM#j^sk`GTh%LZEhs;mK$X`U%5GPv@&=e(4mGX@o4yvx&jhIaN!SIp zLgk+VHI9yk8sBHb_&o!5L0$}HcboApsPgWEYNy|t{EVf)Z1U@{3+eAewcjUD_xG)F zwWd;ix<TFlhEVm~#`L?HypM4hlwFObA8c~Q<RV;+^chg~IuUk-XF=8DeB&ih^|`{h z5X$~$*cILh)lT=C{&6V#=Z&vHjjQ*d>iZp3{vPR4z734qzzxy&fl40+)vndXL!t6# zq5MxZc{-H+>Bd=>J_oAYtD*Yqmr(V57|Q-RsQX+FHIKXn*MQ#`yJSl3zZR5!Jt+Il zOimbgGWN6dy<u1E_BVOB$(67h`a0vmrcW7Lpz0e!?c<M!nqSX_>c_cIeiuR2=Vqw- zEHU{W*bVtXDElX%>|Zke5q3j<7b^d!P<G#%+`})~uLtFKQ<Jxb%D02beT@U5#?K&= z2SfGGNGQMcP<{@FD$g_Kpz0Mt`8^71oSz80!_!PY4=Vp`DEm23{dX0Vzne^dJCxl$ z#$`}`e+y;zH0%yvGQJ6A{}GhmFQDq}G?(mqLh08xZf5#zpz`f(a$n<K#si?r9RZcU z);Jz2-(gVwn}R)H1U0^=!`|>LsCKvoc89+*c_~!>2cY~v0@d!%nErVv`&Xgv_Z_J6 zKQ{R*sC=unl<d}ok~e~~-x|vQj<5$TgFWHiP=1G*zS=ku#`gg=|3$DTJQ>Q*xls9L zL;0Tvd%}fK<=zUF{%fduJ_vQ+j~Smb{vOKyWhlEhq4IqIRnC`|?qo~#?ha+Q0hHb5 zQ04bFeHm1~J>V)(*NLmLUxKxS4N+bWyTAdkl5o5kUQJxrLgX&wX@Hkln)EcWvj_4G zgnNjeL3o(>8-$U>uY-F-mEU<4J0r%+@T*IG+j(6^<Pq{d1@|NUP~y6N3*WW)AK-E5 zt|OeFM6TbK;9N@{KF7sZZ{ph%u0Wa%k0-22-r2}K;2by~z5$<w?-P1pGXr@8;<`R1 z>_%8jm~FaMu+en@@&OiKfV@5O&)}YBC!5ae5bSm$jIp#fxDR0&;UM$T+tQThW`d8r zEnyDf7UbIq)x-}q`x;n>tm}Hhk;sFP-zDCca4PXD;TP~6!tI1{*!YAs3Ev^>+87>2 zI2qlY$g`l<rGw#DGT=Iia3(gB(47u%B-}|j8~rxu_8{mwkgy8+oCL0|(Pu2J0=+I? z-<*et|2~%ZJ4xbuTblkh`yBMUTAmAtCy8G``at5x5Y9wCm9UWb(}Y=;cQiZ*c{!Xw zdL^7pm_fYrItuwMgkQrGJC*QP$QigLwtdb1W#r$X*L5z`nyPDc(<y#Awm&!d2r0M* zApZh>W%_x>jnGXZej9;LR?YzgT|cw(9wolJ#m5_WMz;lF33>i#etwCp>w^-U_aL8y zoGGM#K+v3UDZB(9gNT1d(Dfy{Ztyp7Usz#foP@kNa)^8f)U_qysyN0xO}eg|jYnfQ zM0w!pge+la<o%(p1K~adt>y2be*wC1n57?ud?oT^xVPzuI(ds9LfT;DpCgwkf$LUu zx~?t3xeI<t_?9payQ?hkP~<ht_GIHPVVd+|r0Kf51ZNNUHenR$n-KaD_uzE67WQAj zd4%l<x(b9%t(@bqyNNIsS?^*Sn|=;_5m_SBt~15-6X6Jpqjs((?<s^7x@!nS(7msO zm9D!;FDI-<`s?VACR7m0kS~N<i#8?fLpTmy6}I0Hu0h@rc_ASnj3jhkR}<fausezy zO*w%)x@ytyKp2U<9efB~e^?}JM)(|g7ebQoI|85IoaeE91|ClsfX&L+ZszxoD4!xe z+S2<HKNj7+gyDq82;<Fm3v5PM9CduX$!~vjr<&Yh9Efc>@pi&u%X2>Qxx@!qSs$(B zYntU-8{JJ7Um0`B^Ee8Zu*4FyU(pqj=E0@p9ZPs3)-vvhPa|zQ;XZWD$lZxwLi{u0 zXAnBCb%_6-us@-pQwcv@$);na_|J%cvXWgqsF2q}f28S$62Ffym@-d;y2cRK)d#i_ z9wvSnX+=wq6YXbh((5h03H$_`ozbmMd_S|l2x?z3i!hV4Kf!IGt`p5>GV&3M6Rsz` zML3_3kFDq@v%eU52=Vg?8xr2c<~4Np6Luv&A6|)md#LMKLND|$5xNl?NYk}G?224Z z*p%=!;aGHULtQ>0O$d>f!WKg3^*Fla2#>)UQ#O+KQbLpEcZpv^{4~-(G@Euyt0L_* zLgzIc{WFC1Eq%*QI}G{|KMUL42){yp!qWCa)*1Ni=zf8&mhdM_%fVMI-bnh9#CL+a zHY5JDrR_=nR^lhY9ZmN!Hg$v)VLw7-`YW)>6W;}9;76ogNc<gm9&$j~ns5%fspxd= zj@)?_(Cd1YuqyGMg!M=t4qscz&O_F<2we-|rIP5J3&$b1!S75byo_!b;ZoxFKwU@S zqbuQl<fBa|{e#4363!&vMEa*Ir78UcbaUawa7QV)enaRH$C&4h-Qn{V7cMkE2{;0I zYr;h0s}knptB$Y*@#%zv2xCb<nNW>>Bf^2`_9E!&hWsSF965q(Air*DO7E>7t{Qar z5*{SJ6TASs!EguUF@!sap8`LJ>ymalaa{|Dw-Am&e=Ok-=w5{F=zdQ8TjITlze2nx z@ka@|rozoFzAbWrc+WV6XC3<;kPjyGNB3(&D`8E-zNGC1&$hgMh<9FBnC@I`I<JA~ zh9ak7J-o$il)fI}N#qIeJkmC>e9Mrhp<m5xv&OB^>q;SCWVVub)sJ1fkT#XHO2T>Q zLc(*FUnY&jw<0u?z5((&u$7=|D`QDwpNQRACQO7k5M~k{Kz}viZ0wtm7ZDyItV1}I zuo>Y2g03lqZ3v^VEhEq2@N491LK1m@IG(V`%08U<F~m<GZ9Vu7+=g(NrQb^W0_0w> zJNyRfx|sOKgpCNNV4E}hQtA)?zJR^1=LiAe733qxdj?@U;{7aLHWv{NM;<M~t^`bA zd$-xGD-KSEo-;V*=3Rb6H*^N4-IUi3BDauqv%Z%vdIe{2i(kYdo2ZDI-L}xp5O*8h zoOEtFaIwg`&5@Ul6@?a|(F@}|Ik(t`nDfGpMd)*GYsXxn&=yPWL0;KO_LFWtQSasg z^!Zc}hHfJ3CdPSLdCj-Dp^&FoP;|4(4)gpM`cnc4L6e(y3o12VEcjuZ<_r#ULFhY! zLpP<L&@BRQa^$yS7kcgOWDR{)1Gc#Nf~phd+$lb-5f*(s!bqu+$_}GK1{5-h`pnW9 zp+8xzQHb(MzvHI7GdN1NWZgVPMPZ;CM}=ZYJ92A7-BwyLn`rRD&@Todt<vTuqhuy< zhPcV4$44OLwqy#p%`5KZ%f@#s35!K9M`NZ@r8C)5TE=$~n_Zk{{iYzy|NnBLJ_@mE zS$ZSCS-#i}adU)xnvYqaIm!aMQa4VdF-pZ$V(6<+hPcHzDN4Fj&1)vv%lhpe$fv0@ zzj2Qb@zkdLrs+E|>r;I%<i`(lem<R1!G58I<`_c$u!sx4V}Uay>n2+gb^a8OiYne3 z1XL=Z(|z^gkRa(65-E=+3qm{x*&wYN1=)5tk4%qp>nTOjZoXqaN%T3*))=X^Lbtu0 zUd(1GF7$F9^$EQ~QZ2;|ru+i8N=Nwg<j^1+<r<YjE3|qAZYT2cK_M~NCksN>o$9tx zWE7^<s`ys}0WTl-HqipPI~KHbEGQ%kE(2xA(iy3AX6eELr(2Db=fX4tfw4H0p3Avm zQmPf*HxyO6V~N*>GRI8_tzI(Y#gU-VEffNxd2UGL=}al9Q1r4vLN}h2y12qIj|Mk1 z)N@0gx1l`83`1vV#+6yd_1oOmOq5eJU(C3Tk*bw(!)(BCBgTMDC&su^#?d;9wsPN6 zwZ$o!$mO3DJccPR9Y>3LvW8}|UK77TK0({aIBJZFLar61GnAR7De}?*?t&y0aC5X7 z{opgHfFQ0sq?4&|kaOEy<|JZyw}nRsCcW0uGe<n{C5wJi1q6A9PQK{pxr-od(NAcz z*wA2#nt{w=Pz+=c<vjysM4`(VBGPeFn4-O%VJ?#nzZ%eKG7xPG6K;EAk~<Z>*BE+9 z`e~S#YR8z#Z>q~|N+jd!mk~V73me;<VSZ!BLNfSGO{n}J3LCvF5oQKISxf{?i526o zq$~!B3NOWDg;lecRjy{gF^G!z4N|m)GmNRI4bM@d9=2grU5}*L&XWPd4hG)vY@#Oe zQjpQ(=AGgBBx4Hj6b;Wu>Bt!#dQ+6ZWSh+RDF)2&u-(T@y7nk!gbdd@kn##;!zm(U zsc1vh+ObG;7}GVgE^@&QA|_m?!sS8bXX%WLQ^7pP1mjdNfFM&cGkb;4!(KtR`aBR7 zK|F!OFc<LrRD?mn&#PxDq86qp{RS*1Vj-iEQ4!_cCbdHaQ*YbS8I8^ew~3r1+;&PS zdacd~F9_4z#|Q>?yDzlomo9Wh_)QT%@v4*<RnS9Q;Pba1;=fQ-_l(E}QIbdB3n_|z z91-{(bFrc3Ov{iVndf;|tWfZ{?GX_Ptb4ji#d#1TPTq*-^pj^rbW3LWV#nOPW=GV_ z=42v9^LVt@h$u_V9+;g^J}}!E>GC8oj7Rb~Xc8NVZ|X9Vq2>F|NH3eC;!s&#ap??< zY0E6#Ka#sCHPgr-n~pjb<(-kVXEGBxBdJp(7Lk{UyrRd`Dtk<*$*2^IfHNw~NDBNy z9HHSxWdomyW)u@8cLJHk8(q3)R4^4WZ1hw7(jo{nXO1TrMWNNzsy~`(t-wSx+G8Qt zsyW(c9P^uJ72!81YOWX^Ol@!0dNw+0j@q0`TrgKxx+yvtFgL_~Ug>gQG$*QDtD3Ho zxsKi~O<D-lpV1&S%eN5dN9%Z{8)OQ8lus*`WrcxEaZ}n7<6Pze1lbh4f{JZprsuc7 zPQ<D7l7$v8*Rh~TG+$&<$6AwFrOODYRD<)I)}vVIYtG`v=*vp2D^lgt1x*-4*eozU zEB!*jrzz4w<Ww@>Q9_VqR8<Cf_A!+#Z`3~sJLY#RghjWlWk;tnYSBYn8RZx`jHAk_ z47IGs^Iq9;WyoMBvUEl(E6mavPL<1S&0|Q*5v^5Al_KpzogdKficsU&B%R5r<*V3I z(6&V)<e;6ZG?=Scb{pt~0x@P%6kamv@$2!>RC(<gYFXuJyHn*iddz~*Yh5}+WiV*+ z>8Tj&apfl-##KzmE1tS4O%zpH_2c!vs+mcwIj&W}xm#5b>e;GdJ}JZ_uZpgxrK+OI z`YE`~2UU?8w<?;(#)#RJTJ!j{JTRL_)fwY5Co=@c@N9BFfT;#}iIG$+QBTG(Zkqn% zAt08aO*MvD>KNN&cx36uF)s5%T4I*Xs}i#*)*TiiVzJsMmUq)ENRTyJ(}tq>b=wq4 z$DK^Xr}u@TRum%4uFBlXEdW+GNmM-3F)vmy&&v}V&%8f5Qek0Ryv3k<8<{*%Fd@@| z&<i6$gH9|kheymz#e$?M3_^KiM-cz!+v!ilAQ4YsaZ+bIkqX!@W=Up~qaSSo#x#1m zch)tU9C$5W(4q)C5Gi=HS@*_xjBGWf&!}b_MkH05T@?w6+CHFTFeOGXXEDJbq#u~w zG2hb;8zJu%81cjkK2yKa3oSu5DHimvwUxUgLQgBw=C->nMCg!0Q66j&5pkLFxPzdT zC1MOCDa-x>2CQ6CYuyLaeCDPxMV4!djaryLRL3aP-VpHq!Z>M+D>aoKL)p$i1|4&= zY&GG6c>RL0t7?Wu=v2E+Z13?@jSb_}C(@!hqZao;u2ZUWi_BgHJsy@`&+M*Tv2neh zXke<%QMV$x91obluCqEe%11d*Ia}E(foUD{m)@u)yqXOXOR`hVw#3yNShdHiMaLCv z4~b6E5?1X^WuqA73sZe&LP;z$t)<mY(rA`Gwx5cQ@k%#Fw4QxOCNZ9YUx<??YFC9# zQxN6jo=!0A6ICw7#;xGHIXUsQf$8{#9*odqY@kW=j8yv!5_-E@4`U_!P-0<Iki}&X zQqEAOQ5GT@NMsA9ZiofmC=xskniN*dB`XrXf2oR9Q+Xm+ylDBVc`$`eO$J4}xH|Ht z1c}lFR?Rdwg$1|9o#wJ1uVFe{xzaVsB=2l_-*aj*e!!0=lN!AY*R;^!^kEIJdl{_* zHOxApY%~kigeg`zzz$cEW|f+F?y4!Us@6nqnC2m>rOBoUEybk^TbRacX=e69knIBd z_F9GkLxD*lj^<6(v53(~8c!3y6wdEd&F3&S(c)X{7FBhp*30J$ZCM5h_g+gYYHy)* zrVs6uYI!NrlTgdXAY}GomC87^8BfDBelMua_(fKhD9httn_(y?a4D0(%lp$-^hIqZ zbUn0Di&u1Nea*u>Iz-rJ0OrA3pAD*0n`IVY*2I>jIOR`)Z8?oHr#49Or1BwvSXfNN zi$ENWXF%zwHot{Va~46B!DC%eA@MHO-Z*O6oFu)(@Dz`E$|~v9MqZ=Zoy`{$AvK{V zO{mkPP}{K}S#S=*ibV~0`FN|SXvk(jYy3fxAMaXOO9Q8lJxh^aHmzyE`vpU{jtMjt zU!6X?kZ`ja=WRJY6V!Q3_e$}YC^Avji}(whAl11vI(5FsyjAD((ky6p=GpQzJ8M*X zf1%TiEh{WWyLpdY65<qQ`S_KZdIWxAIJFCMjV#JApX#_-gP@MLD$PH2L6OacQx_HE z_N`mGkjbsyWs5|yM4EhlVimW{^v%xNLnC1{PkEs;9%S+>q6M!tV*(Frn?-9~>RQSf z53|mAhRsuJNhmAzc0EsgK2e$sNl>mVj{vVEimBFsUej-&-}ZQi!FMATT|EMdg_BD+ zkmI`yiaf7V40{%=SQyP<Sx|~;TdDLab{i`qiO%t)6mBBPBBE%mm!gRkqgZBC=6r+} zTE^ugL+pr#iL!pj<?55Fj>Sw?GAX)=!HkPiY)Hr4u+il?D2aMy*Y}oAF^t+RTA{X9 z-a5S-#Zd-BTqapM7UW``&pvrYM8yu(ep}W`iNBr<*CZ?>mIWSaPpeJ6Ta0vXDx;`I zO7g<a!jLZG-2r=cne}|p@p+%AXI0gTU*F_TbLulKK}xSn^?sut@yq8VmgRb%*C@VE z)N?0UUi0eXaaiBtv$#6-L6h1cU@FHV;8P!)6e9U_OGbW!yuOsxYjws`yxgq#Y-aL` zWucU8%R(%$glRWePo0@MT^6T$-s4=RRjB)mn&S1PKFUpY+m_x)$;?8m4y?))7Zu~& zZBgE5&t2c{rFmhlZx6D0W;@8bU(9&fHm89{UDGO5bsO9yoz}qI&nB?JWrfpg1`)=Y z(8^x6!EI59-%c7BmJAJjKOx%aCbfJjr*@wWZqTNo*uc2Z3pMoFOgFd%Mm25Mz@Eox zU~*xz<$1)I3mUv>^2G-w8nc0W=X)uypot27RY9RQuO^5`w(F2@YYlV@##wh7@AP=g zdO3Z;Xb7lWyo+n#lbb%C;5cYuFW3-dJ)W8dnt`|DB5yAZ><#rjwIPU?zlNaQV{g(B zx{Z8771au%%gY2dd|mJv6%BlWVNAiOIsSar5M}8ir-6@d%p$yM@brys<hd_xj`$!& z?y>B-t(V5;a+*gEa@+U}mv_dpo%T|R`l8Fn=>%KIAml?wG26!Ex?(vRTV%!^%Mz$P zcF`Hzv53iQ950vc{PMh#LL^UMYH-H!(oksivjt)-!1<!6Pov}f(mDop-%@0GBt2%P zaXt@-x@R2KVdZqj@m+(q9>@3y^`#;0jCWgB%<hUe`Cc}KmQ7dblhSxTZ?A~5XIbHM zeEd$4PkjF*NW;pYhuIm=CoO&$k9qpd8Q&I=l6EFA9q}r}>%c^MG~Q^%5q5%7@j{RX z?I|bT#PJh26ZyQWuM^HB_CLHd3Pmr;(3-@1x5qDESGCcfq(_~19cH~r3@$1$i6=PX zEw;s(#Aj;l@$S7Wx_6EX9+=Jcw>Au#`7T#BDpf{fYIk3rU^pDUd;ft0%LeqQ^IBQd z%ElDZeyVIplrEGt1m%fLvDjKD@7uTFW(#hgl*d=ud><B`zT_-RvRD?%ik_SMUL;nC zyh4xKnzA|#H;O46#x0a52J{=yudLr5Wdrs~^xwO@fB#+karLO;wV_Pol$D(xEl;qv zYse>R2ao7Dr9QFW<dUohkuN?6Hie$orzzZ@jNGo9_R1P4znob)em3)o{W`0h3Fw<t zpQ+kn6ur38t)(U?{8@E_vQi854THYlyDd+IL60$`#ti?yvHJJv*Mkq5Y;ve^TPwFz z^rjX2wz7fB@0(zIripaW*oKO-y}!59oi%wOpX+EX21R*d??%7aqc+Q|mo3w$wnBL# z-x`aBLA&ppC`AY52My|<I3Uq4QJ&a|c)!F^M-l1WzhA$^{%CjDAyE?cqg{928O#1y z4%oNHgt8HQL}f-*TaGW?dt#41{rU_bsmkSGB-84q%7#yid%Lq|`qMLem-Qc*=-<D* z-+)rj{C%fUI*MX)`_Yf0;uEL@+Z*je^GlECFzH|YFsh!B(5#mD!DFZf?ncvBluhuI z>ln)OS4=IeRD*xuB#QZQ2p=~8tAnUGiMM+U{-$#%9dG?pj-jaGzxp{;=l6eJ&*Rrk zP6M6JqbREXkDo=k97VCl{^um>-}WSG*~RPw{=uUtW(OOIObMOmQz)BChfz9ZZ0CiI zC;zV;OOf+m^;C)}@~1tNV%zTiZAVg^OzA{wRKCDxfUK9Wqp2VNNGf7a$Enlbe<GzL z4Gx}opZR;vqj<eo`8aCXY`wAnt;bR9tpAy(QSHr)?0@_$iZf%5pIYz*IJWt}dK9H| zDV;?9m4hf=%lR0@9-xv<1s^FmVH)#yo<h+~|HDHliu-%cpjJF;I*j7{iFf!P?GP$H zgHoTf`F8%DPN4Ye#z&%m!viS3PXFIOezHTFf8Oa+Cdmh-yz|qXJq7GM;$tU$)vS+F zKXCfQ5|jAL)2H~OiSH)-Ja58&z~7@B@BDY?Po19_RT>|ZQcme3qr_^7E9MU#2)00c zl{dSU-mU&p<+HL|{waLDaXL?-*sT54W2nyh7x;UU&iZ#AMRC&f6CXwKEtkWil@6jL z{>|r58W8`R$51Q!#m=KRf%>t|p_X0Do%4<AA3KPOE6Cquuv9L)m_PR6P$oW;`fm@T zhImO|Cr>}hSrmWEm@U(R>wgZSIP%aD)=zm5#WV1qbEu#E97?A~KhZJNiqGzvzY8or zD=!a{zh50B{rO20Ct~sG(+{3PaUSu5hftiir86F1ZgI*Xl+HbWoKq;?OMcozsAU(i zN~pamg5;kcKylRbKRAElk176z&Yze*4|09}4m1D#R)BjQ%K!bq87<3Y={$-fphSE= z#o5!JA3*W<FaHbYPn<@5fBa-ik4~QAqo}`j{M32!qz;TXD}VL~jMMgI<rAoJoItt% f#Ss+eu$=u-U|9So9YQU;Fj_X-b(USIKf(Hc+yK%G diff --git a/libs/pycountry/locales/ro/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/ro/LC_MESSAGES/iso3166-3.mo index d2cd0fd61b876e33183f004772eb31b852b92214..db1382d1b91b622d083db9fde2a505e3dec04cb8 100644 GIT binary patch delta 1241 zcmYk)Pe@cj90&06@9J7<=D#v^iX#8LU0u_1l}v)f2oW<hp~LLkQKz2o$-K7~7D#!J zI@IA|5Yi#>P=rC`ty@^w&FE4cqJj<uUAlDWP~YF~QyQ54%*=alW`4il-mG|1IrphF zcafoS^!?Pc7;7T4@q@MjtKl2i0KdUTSe%o2KMtdqkH8RIfTi#*48vtu23KJPd<kiv z4{#r2b1Ww}Jz%x47!Nw(F4zz0!%?^cP6f`w1DG$s-S9Cihc940d>gF4haB@CkPa-$ zW2_3cLs}nzML3^17{st}4N~M!Aw}>J_8{7y@F3<!LFV~j;B{Do^+&J;zJ`>6-;gf! z7g8YQg^X3gLofonA!YC~tik#09tM=+HAoR{LdwL~VEzm4#5@=IBuim0<d6<Z1YU)d zfjf{6UW63T3ZxQkLMk!BPG7tR&Y`m|{2YdT(125rF0cf%AT^Fohi^67s1}_rPM4rY zWugEmT9lX7p;OJNj5wR266ws+-qet-GjtiY7oBd5KpC>lkoEKp!FEG7*`8oVQI-T_ zsww_Rj6Gk?{+?ZTAvNK+mY7kZnb)6lOeHMkdJX)vOiC>*|5o1eXspd>jTy1yJk}C# zIo8yI7CtLn&luLi#>bwc<9tX?rCg&=B(#ziKQ$?>6z|rwIFVV4n6!2>sa)+iUc}K8 z{*C<V?n%#^cH`0Lq~m%r8Mz`8*ih2r=(Kh&Nz-$q%5@CWNy^Nqt+k`WXp3qm>c7gr z?GJ`JYP-UtMxV5C<MdrdGMn)B$WbFHXZ)2=Jjdb*|8uA+U+F1fEB{aESxCzXWlQC+ z6*OL4pJ&5TD}1g}79U4orkv%%;+|HClvb9bdGEN;eB-|2{jMvvUssmoZYrrvnSLg0 zPiWJlX|RiA{=;yY-&r`<lT<bz6s8(iCa?Fl&co*kj$l1$ZY(Lm2Lwpj=`+vU%99Oj z%&`SG{V#<Pza(6drTimdFU$5Hgq!_$;kpz3|5b5FPNx!<G6k=9x9Yh*-@wN+6-A(9 MLg{7{EO?Lo1HtR;K>z>% delta 1137 zcmYk)NoZ3+7zglax+G0%H)|KQby^UTwuy<-C~47dv{ZsftqZ-#^kte(N#3jTUKDys z_2^BWalw=H;({B3peGjuJ$O*?qM&E-q#g?5!T*;$mx0M|-t6Bux!rNDz4)oMro>Qo zpl(NPt70qy8+`adxevF&2ax*Tz<#&^X?|ZdW4qu1=!X_;g=b(8o`-F)1l!>)Nc%j4 zTNx{|uayR?t6{7O1HG^jCLk>wg$?ki=K}1-w*_0^1-J#S!#eob>wgM4zTZJQ@CWRK z-L;keBn;tvb{vh}7%(8+{1O~MbT=U#^d4b_;RYOlJb+DL8ph!=q{y#9if|oL08b!Y z>@`HB>@%dy{e-lBXFW2D^VtL%6v;_Q893#ApM{(7?Rs8^bb))2HvZ`O4N~NO<eSzv zLYmhD>1hr^da6~}124l6d<2U$;W-+#@H@owm;VctdL*D+Xfj1eh5ieh%dN`$dd>0$ zXb%dc1C<V>LQnUnP!<q;Im^uuS)#;O(nccd48fG6qsZyD^k#TE)`d!GtA6;>_r>Ra zs4cZ5;?elNXd=lIL#d&?1MxlXT3uT)T`-g|`B+91(^@Sn(<tzfT)97%^*Tngd7*MK z!^-auriGa;h^&mxNs&+SSt~D0T0G)tVcI$2D9emG7>jCaG^cFGj@ed08*<UoSs62> z^KTC~>|d)2yEpvFp2+ZU@I-W4no<kL(kXsSX-9}0kH?a+g!{{%>gMBGIXKMV8HGEW zj?jjq48g_=I`6&>bh#^mD}hOEnWi$cZc}~#6dPL<TIM95!sQIPD*3CciqF`#u-Tl% zc9vG^|KY#8R%T`-KT^oJrTUAJ!@^LD%8)$lcnb?0!!PcdhL#zrWrWRJrr;CqQZUxJ zWM!nS1kJz(Y*L+;+LnCAy%ThN(L-)uXfQA-^Ok{V-E^q8d0r?z$Y<qBVIfB`{RZLP B%BBDS diff --git a/libs/pycountry/locales/ro/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/ro/LC_MESSAGES/iso4217.mo index 35791d706a9b39627acd20ac6d0e34129d7bcae9..d27a289c1f48233b70766c244049472f78cbb0ea 100644 GIT binary patch literal 9977 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 literal 7042 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 diff --git a/libs/pycountry/locales/ro/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/ro/LC_MESSAGES/iso639-5.mo new file mode 100644 index 0000000000000000000000000000000000000000..ba535226cd8128b3c64fe04a850980e4bb913004 GIT binary patch literal 10650 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 literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/mo/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/ro_MD/LC_MESSAGES/iso3166-1.mo similarity index 100% rename from libs/pycountry/locales/mo/LC_MESSAGES/iso3166-1.mo rename to libs/pycountry/locales/ro_MD/LC_MESSAGES/iso3166-1.mo diff --git a/libs/pycountry/locales/ru/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/ru/LC_MESSAGES/iso3166-2.mo index 85c53898bbf65ddea3cb7239161c5dec6b3d6aea..63fa853e176630d6c2cc84009f8b889fef5295aa 100644 GIT binary patch delta 42747 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 Lw=dny*vSL{k3||N delta 47208 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 H;SK7)pw#99 diff --git a/libs/pycountry/locales/sc/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/sc/LC_MESSAGES/iso3166-2.mo index e309952cc11f9ba7c9002536df7396e2b7e5c9ea..6f7eeeb9d0bff780c926dee920a665b1da88c1f9 100644 GIT binary patch literal 99178 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�OzX%22?k!bBlYYUwB<#~}n} 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 RzFF+Pd(S7hJ<+Mq|37bw1)~4} literal 104509 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 diff --git a/libs/pycountry/locales/sk/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/sk/LC_MESSAGES/iso3166-1.mo index be3d7bf166fada841cbfd797f77bc5358d5f0051..16f61cde94b2f333b9a9360349d502c2f101616c 100644 GIT binary patch delta 9718 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 delta 9184 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 diff --git a/libs/pycountry/locales/sk/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/sk/LC_MESSAGES/iso3166-2.mo index fff578898c6b0e430c7f1604ae9f8d2e67c7f202..6ffeb35af3814effa64af6a5e4fa939790129557 100644 GIT binary patch delta 5975 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 delta 6011 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 DeT_hz diff --git a/libs/pycountry/locales/sk/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/sk/LC_MESSAGES/iso3166-3.mo index 2b74699980590d7c218ada1731f8ca0418052e9c..cc312a861e9360f4e1192a2779cd4b028568d637 100644 GIT binary patch delta 1020 zcmYk)zfTlF6u|NE_@$ttD5$8gMpO{?_LdWj7ecVm1fw>PpmxLEa;&#^OLq6pM2m|w z#8_Am3mYSJ6c`dpDkVg%jEON~L1&?f34Z{E-*<<^Np?Rov%53zz1i8;4{hbGmfDw! zW^kR6YoAiRVvHN@Bc8@j*n>auGB(##-%p{%cmf-64qNaAHsT^4$7O88_bBUZV!Kjh zRa0B(s19uA!8JULqbMKV!-JUL^)a4fJcmbd30rXu>+#F({C6}M|3=xcsZObrIDj&L z7n|5$`E>f3c!HAoTa*lb;5OCxgJ&6Uk=`ZT!8ms9uLeGbDaHkq0G3b!U%?}|fv4~r zUchaX3bq{}5cXHs>2%^G@=VR51n?Xs!`CPat>7Vihkf`NC9oZo3ba#i2_S*8&Q+8R zM^F-+LOFt0cpg`<Om);(I^DR5HpZH&0bD@}P-zBt+5BIVf2D&<{tek&njDh^e1ePP ztt2HIN;Ozo$zGC}9J4eEd5bfsmPgK<L=@Fl^6yDz|2N6#*zSa6DHV|>XUdPH)ar8V zSFH1XG3$q(F1fnT=pOUauJ+t8>M?FQ87I)*{Ij~na(~ja6Q-Rs>_jSI_a<nKw{;kq z<AE;lapVUn<Bsd;g0b;NdpT_kg+e?pb0b;b&w5T?yIwr)=ZE>UkS*%0V~#sIpEAZg zzoc`<&~y~dgel9K_QS}@#2-16tn9@7pet+51pY%O9fg(~`exeCIMrU#9vn22R+zJf z=bzTEHBVH(F$UtcnQ=<1qYW2pZtNxHrgQ5H##AM-Xnna<&_>|Q6em5Gh;J3y*IQqp P5bA+;gHYbxd#wHf-hZEN delta 819 zcmX}qO=uHA7{>82X%lT)wP_kZ*KQTR&6<r>YbaVN2%_Hn0KvnyEOkkm$fnWWB6<+K zl@M<pf?g^pN>AdYQpA%8db8qPJb3V+NB>VYI%M`Yv%A@O-*@JH_TF&gTe_!ZXe0EU z^vpVA4q|_d3+*NDz*ngIAMg<VM!ml~Zp=|UgGsDn8t-5qKEw>RFpJMn-+7DMjcJ%4 z(ZD2njM>D4QQU|w>W`Dyk5{@*<0$hg4&ovX;}cBa>+by(w3&ZGE%*z!qSYJSKY=OM zH`f>xcrb&C{1LXP!V+4{FOb%L4A8+vByzKYMO;HIoLwIUY~g0+1>A;HxEF7rDt8}k ze1RjZZ$2{MXMS=~0Dn-Kr8Yz#vT%U8gGX=z6<C1E`~fO}$Efc-MJ@OomDp!g=@ab7 z9<-2Rn6ub8z~CGMEnGzs@0<mdo&t1QiYrNWn$E&dcg*Ymn*z}GDex_Hoeec@-M^-) zDL}2I3bD<KFN#ibrVPP$vQoyo=-M+yt5PcK`0~5h_gM2wZ)?y!p39Htj=8owR&-At z&KH_@6B+mXZLeZq@@lK?(4M&ImxG1zvB?>~G9T9GoLcF0-$k!7TlZ%D+-2XJE7}Xq pbn?x>)gYYryt18lPCD-L*W|wV&~+~eYo*n;9s0NG)8(M#nZFZ!S9AaX diff --git a/libs/pycountry/locales/sl/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/sl/LC_MESSAGES/iso3166-2.mo index 0c90f840225b3c8ee7d0bcec45aaa0d1b2e8c4ba..67e5bc37ea2572a3ee5c27c9c96a6465feb9b661 100644 GIT binary patch literal 79342 zcmZsi37nN<`1dF6TBUt6?V_?JBJB%pQjrvOX67_=n&s4)InzdzB}qbADrrG`5~9$; zv{5KqC?ZKDMInXW@9#Xn@%I0}@ALUQ^S!VAy6@+HmKpiFQn4qJIJ%TfN~#SzUz3!y zwRBQaR-Uv;Ne|9WN-6;-!*cLZ^I2F7c{wZvS3y!Fy<z=3kTgkKE$@Qz`^?-2iz6R` z^83Z|Nmvy5U(4q_6VxvS%c8FU6;~UUf%T#4wlG^k)oBaWcQ>d$dt2WR%6~9ae46DE zQ2wLMyP@(t04u<0uo|3e`|Gx^hvm_4wfvdw`=I(fX!&P&F7k0$3;qigS94BMQbpJl z%KsXuKH5X|*A1%Qeo*T)$ojD5k(S3n#Z7{m?<1C{!>Y)$U=_Fus?Js@zxScyK7y+A zh2?L}Lr{Gmg<6kOX3=K@xhzzC6{vNp4V9;v*%B(QjpZ(8FR1!AL-lhT)czW3dye(_ zQ2FnK^1l}<--A%s<1wguOQ8B(WxfUFzZJ@VhviRUZR9VZ^8RW2zfgHf&JFYxpsr6< zD19SX2{yOf9;)x_p{`SJsOxx}^_fuhM?%HtL+$JFP<1E5^WbEtzGqv%&|Cp^y<WBa z9#p+uQ2BP7`=ILlVEJcQ8TkZMeCc^Xy$hh$p|N=hRKHh4^?w7b0dI!tCkmw>3$<Pk zKwY2bp!#10WnTkTe-l(+??Ua<T~K~|%>7XIAEEmA)jS2|Uvz$;FK1STn(qac8$rdl zu)dYq#`=zCcc{93&4K1nsQ%L}$IUyT>f8%8@5xZtWrpnwq2{*&Cc~GZ=KV3$`tF13 z|97bTXKXLGAn3OSRD3<CI*p<Hn?bEZE6eSm`n~~bo_#FeYIz8he>zmY5oR1}pN@r! zpA41%QCJqvg1Y|~LB+3!n%`FQ3#fXBq2_-aD*j*VOFb9#T@lK!D%8HI3zhE@+pmUN zm$p#%Nq4Axw_DDDn*TT`zX?$Dm<rYR<F?O)sxucV|01Y<Ub6fKRR0B*KZWY&Yx5{n z{-o!5wt})y`I<nj$0bmC+dw_9y4ZfR<=dh9$%gXFgNnP$`iHE4%$x-^&*yA^(ei4` z8_lh-7=9l><^33HJ@#7O4^{UtRK4Gz`aWa1<O@MuWwQ>Hy|LvM=2cL6+C%l#&Fl-c zKW~Ssp9!_Dc~JXjJXG9N+h;(<&#}B1%6}D9-8anwbGz*yL*@AjD*gaey`$zy+lwp= z@|1$ISF~Kiay`ozL0#X=q4rfLsJyp8^%H{XC)08+ERKAac`q!6JQ<dNk68Z%)H=_G zieC)1J}<!%a6Q!hy&0;%J=Pz9s(%=2pZx(<@0>*eOPS@N;wnS!*E&#rTmtppY6*2; z_Ow0~mPF2g$~OXPe)&*!?tvxX!{&6T{Ij6?ehzBCud;my)OW_mQ2ic-s(T75uF~RQ z|JQ=DUkp{R6-<Whq1HVF)lba!(NO*q&8e^?^3&!#SPFTu<yDr~Le2jjsQGM#%KI@? zzAs=YcmT@ph~?j)@}GwCE4n1`D-RW44eC19f%3b^_RB3_Yq^u<o>1%9-|`?c)%r}B zn6LGtt-r_mNw5_0Q*D0|YW<(JemPYB)t29a>U%TPeYVr~eNgY|gHZKOL-`e18pvg# z>QpjoS>F(<-bL154Yi&fpw^)mRKDBbxo{{{o=hlv9+Z88^^?p;q57E#wQpX8y8iD$ zt?M4BJl{dZ{|wKCzd_mmftq*mWx;(@7D}#fHifzmE;Tzs#r20;m%*?!%!JAthpKmv z^^>9er$g1BZTo!dmqOKh+4i+i`8L@8uI;<b&&_?X9)1Tcms%e5Ujb^J8^JR03aI?; zp!(=)_J->77TbqF?cZTg@tN>^I0lx5Q=!&j7OW1JL*?HLm3J2`3%`JR-W`O>_ZQT> z|Aq1|wj%JaXjX?>$7HBJFR{KAEQj0{Do;-+`%O^!Z?&8WweB&f_u^ep^`^qay2GN# zv!U|Lg=OLMQ2nfe@?QtF?gdbB@0*{RU)laWRGy<y{hWYx;c3e?UkviqgUZtc%Ks9x zB~)B%sJ`2qJ)rz=f$HN9D8CHrqn1a(a_Glf|1eaZ8BlR^q2{y1_LbJZZvETVZ-vVL zAyoWl)_-gMX#KBH>-RU*Jd#!hEDlxgT&TV)L*=OrmA8rYEzDL>@ok~vIzjpMvc5m8 zfIJW?Uj)iN((-7i>voUzQ_UIH&xRGSFSdRSRNosc7eLj04{Be30#)Y_RNu#-*6lPb z4~x7M?2n4D0&;Dr_-0V|O)IGW+Cj~$E7X4K0hM=vImG&OSP^}$<@=!WJqnd)mi6<Y zuI~!l--Md?X3HNz)!%FRd#Jic&C^ixDY+`>s}hu44a%=RRJ|5Z^{<4=*UtLuq58iO zYF-1N)@87n0_C3p<u}s$F;MsA-PS*D&N3I6OQGiTGE^TMpz>|8{X?kli``KD{bKz| zDF39FgX>cgDy}M&{sO3ZHiqi!GN}2shRV~$@{LgIJIHdxjGGgn`kQLbG8dVz!t=1d z4Yf}`hU#NKR3C?->i-5+=aluOUJ2H*0+fFhsDA50_1Dz;E1=f9jpdGJ52*b8q2dNX z`3<u@3u?Y`sJ<q^ittg}=UcxND$iPTqq!9--v^dIvAhSW-*2Jbvp?B>25O!qUJc^P zL*=b()`I6C*SFjVDt|M0KD-=Of?c8V420@81a-f~pz2PveF{|m>6T|f<y!zX-^Ebt z@;cPMeaGAim463RzE8}rp!zrnwf?7|u2-?ufm{iyzuHiBFM;Z-6;$1>Q2U@Kl;0gt z`(~u=<DvSv52~-pP}gUM<#|wbmqGQn8mhl_<`(lq+dqe@^9|HG9f#__*lR&Q)uHm# zwcHr0elw^#m%+;LTBtmIU=^4O6*mTIo)e(@co3@J$84Wt`wLL{mYc6Z&2J-AU)!Pb z?}b{Qqt+LBJ;+}Ps_z<5{>`m#3)M##%e|ob=x^R`{V*uMY%>nk&t2vu*Z}!4sQA^^ zuZQYq8`QkNgt}hGpyvG#lz*``fm{x%PGzY4wJkR`TR_db6|4$7K&|(!P<d{L+Lyzi z^2ed_-3e9qKB#^47*zhJpyK93t@~1_xYwZStb>Z*2IaTY`~vE_?zjA>nY1?WD-9J_ z2`XPrv!3-ATE5isRZ#icS-#%v0~LQORNq6)Fw}L-wEa%&?}e&6+4jev=CJ^3zAK>i z$?H&g--EhtyP*7jhq~XA-U!yQBGm7R7r+|u8mK<{L&e`_hM?+ZK;;<$<u}gy2~hK! z40U}Tw|zd;{l5t6?}n?P@_c0dm*yd;{{Mi=lk{fr`)O&YKI%c~FElTM+85VA<!c9Z zeY-*R)eoxfK-<%y;-j{YhMLEC>nEF!TR+?KLdz?m`g_CjCfh%R>hE*Q`=I;|LG|++ zRDb`PCEg0^mWPU~0o89Z)O;G-elb*@R#1NJEq8<RzsdRmmhUjr%;8Y+BcQIwSeUpz zQ28E*>T9Ou`Q~D%{41gEr`1q#?^wUx@-C?OFQN9+e#^hve#&yubwPX?DF4b(d25?Z zt#1W2|F%&5buzm{)xQa9KDR;TNrTm4mi6~T#Z80qf70??sJsi!Wl;5Bg37bb@@A-c ze*|^keGZlHN2vH?Q1yR@n(rB?>sw)cP_Gu0y&+Uw3(HrU?V!G!Z-BZUy`bt1wmrpi zmKlS}GaBlCz8k9E<JLb5)&C1n`+Nn|yxz2Zo9!P$^|c#nUA~2?`;+BkP<8&YK50WB zmw>uI%2}=s6?XwtzD7{_E`gfQ)lhl5K|MEn+nx&Lp9K}459NO+)VfZw{ZXj-%z}E4 zEr43**P!xlvHg9he4j$a@3Z{?)cg-a<vD46(#BvOCCy4u_Bv)GsChKE+{$bVRi`Ud z{XS4}1I!^%ap~p=sQHb7TDQBQ><>Z3Pq#eF@^eu6mO@>>m(7h(c|L%O{{$-jE2!&# z0BS!RgYql-c3>|J)o(?pyfvZLr@rMTP<bwa%F_yJpLc{>w|-FhhC;;;gYwU@J`VLh z9%uXGw$HLW-&|s@vVE=PjZpn;v;02PJU)f0dkE_L;TPMBy%Ws8EY$i`fm+uFQ1?*_ zSQB0j)n_j#zy473Nr76ADAat$K-HT7m1hRj`p&g|vE`Sb)@QBd&9;94Rp&G7zq0-y z)IR;i_J7Ud1wlV$q3YFy`c7&DmFFs`zS=_d(be*eQ0p`Rs*k~DhV6M!^Sl!(??bjf z0oBKRsO!4Qd<SY>KZdIFBh-5TX89ykKSeeL{gi@|D?;^A4Qd^0L-pGj%H9GNgI8LA z4OHHaP<>r*eLpDwL6%dX`WS9~F4T1y3pKB)uo#>Tm2VzY-G%0hP}lc0s5}Mc4yZbx zTHXt_e&0jo{nh$2)|c8G<gW~srzTY24Pat^wqFS~|7&3}*v0nlmT$6r3sj%C!{RUu zl{eGOgUWvwRQ?BHaX1aCzbDM+p!`;uZ$Vwxtx)-PLp>kAf%;xM0hO=(mLOjhvldj} z^`P=!47LAS+uj4J-<vECgsL+HR)bO7Cs{uYD$iVV1=M=H2~}q!RA28w<^3A!x*mkZ z;a^bC{WDPWE59|6Yd~Gk3!&;>3DsvWsQ4jJaWQiORG*JRt;am5zLr3J54;W)w-c(b z@1XYo5vaOFw*~R#q2lX8_1y$&zg%l}gC&srnYTgZ3&Bz_6RK_=ED0w<&GRAaABD>M ztobsO-xk|Hu)G(RLVp0N-Vvzzov^;xyFpwzD0>yCb*~Loub$;5W;3Wdmzk}h@^^rW z?{57~P;~~vqA+58w)JsX8vXrH@zbEz=V_=s&qLK&X89E;zc-++SAq2(LG}9uRKH)F z2cZ0ag0<ms>npw&_*I3vUbUg>G_n2?>#v0Br@i$(q5A3zm3JUiT#7jys(#EI4HZA$ z_J^S29*3pjY^dkx3s7;dnQuYO=N-#iq4vT1miNGOk-vq?_cPS~{@wa>wg-KdgWBhn zq55nLbv;^GZfkahs@EGTPd})<LoG+3;_|J30BRkkS$-1gdd!8&^CDEeSD@zgCe(c2 zwthQQ{*Nv1wR`|7?-A=ySpPRv{o*@<{;ELbt8X@gTE|vUdAq?fun#N?2SfQspzhOL zsQxBH#XV;G0;v9%o2#sU4QjnNLgn8MHLp*s|I+;4JO<@=8mdmQ_XC!NimMFkz?x8b zueQCD?LEw!tRDcCZ-|)z)%QrK^_mE^zb8X|7caE^O{n}kpyst3s-L}3>vI4q{+RWD zT0R36SK@=9?s>2*a!si3vnEjM*cNI&{h{*Q26df6P<2K^)fr>?eyHcbR4D()pz1tr z`*Y?p^A)IkZ^Fd7L-~IK%fWq6d5%E!aRTZ(pMvr)_F=Fu%R%XDL-o}d>iONmatElq zH<<mQ<~zjpEU5TAsP!Fh{d8CXc{Wr(%b?=c!t!tn)OGq4s=tF!b$^Bx;29|Y3Oj>& z)P}lF4WRN}2$iQ5)OTnXsQ!mS<;j5RXB<@iN1@i^NvQY29H{$$6;z%AsCj$@<+m3q z?mMXU`VlJsZ?Gaf1+^|^b_MpTQ2kv1m8T(;e+$d4EVs9OJye~()(^Bk1eGV#_7S#^ zvV1pGUk^alf7tR<P<_sUs=E+sUN1uBTW7ulwXR#C`uqfH-+m3X?!TMGKMMS+Kz$d~ zH?M)(w|$}3_YSB&a-sJ9cvuO}fU2_y%Kue!Bb5IRb2rp_?uWXr$E`2&ageVpRDboM z^0c<x1uFkwGXm95KGc4g0?&gBq2ks+`EP>yPT2*uPCr52cfUcc#~;=weG=G9LG@J; zYTfIa4WZWiBB;14%<HW0X7+)qI}mD~!>k_#b^Y(LeG=6A&wyH==b^6OO3Uk^*5O^K zy5B(6{n7GqsQiD!^I^G91HXDu^SlVE-sMpJw6?x0RG!|p-)atl>Svhce5km)%!gnl z<fm+3YOXTZK-Jv<HIJ=O*W)wGhoJiX6RLix&w~CcnKhu|lg$gE*5y*$ueIC}Rzcqj zYTl_(aih$;%}G#ora{%633WY}+Wr#Mx~?(bhN|}-)Vh5N<-Zpy|9;Cq*?tTv{!i<Z zb_a3^DE|tuF05v`6;!^qQ29HXJ)qXBFVy;mpw=x9D$fH@eLVsdKhyfTQ1ur<&GRM8 zZ<qy8{yU)ReFT;73){c7{wFBEUv2->`ZG|^krJN=@nxX=Dnad&>QH@OXkG=iU%EnF zpMFsDh}b?3Y90@nPe9$L^PuuAhq{m7f|}26^INEOJPdWc&;26EUl-~=Z3&gPqvc*u zc?UuDlMWN>3FY?y)Ve(eRc98|{&*g0KC7YpHbJe|hfwRc8!GN=sJuTw^>YHsuhf^p z`c#DSs|uyRz;Y9){Fg%2YX>#&K2ZG)wLJzEKf&@tQ2oq=>f?EH8C3r-L-q5P`7Tu5 z&&;pQgRmO<U!d}o*c0R}2jyQKYTc5d`e_EWzHP1VY2FH}qECaWI}X->4?^va1yK1H zL*-j(`Aw*Ky<`1$%e&2QpyGeDd=#p$lTh<a+8g9M7b<^MsQp<7Y8~rC<-Z(Ohu2!} z59N0|)H<d>?ayrM?}f_uAXL3+Q1zaIx*z9Te$`wL<+lwgZYNaVyJ2nk6;%FHQ1*&n z1*`_;R~Kqs8bal{)Vvz1|MpOQ-T)QfA8Nl0g6b;^DlQ)?-*_m$`>dY=<u~2(9Lq02 z`LBfXUv0i+7TEqC)Ozl;{u}cL^B1W4zeDx=kL40y2m7TwRQ}pf_6AV?&7k&wOQ`vE zvc0$M18g5+eGb(9H3}-<6sUdqI8?sp&E-(*`KslOQ2TS6<$X|ff3W-qRA2vEF1asQ zmkLmMtC)45>NbMvx0&Uu%(hT@x<IXKZ|nP;gJ47SDNyl~p!$5=^0QFiAxoh4=L)F$ zFGJmTZ$RbUW_|$G&nHm#-5$$_psx2(s5*Z^UB6=A1obLI^_dJ+uPM~}G>6L98LCbX zDEm!N{x?I}@30((>N5wb&s?auaZvqEfLiBi=Ce?KE1>eMw)_@UznfrX_yJVC@1XpD zhVnmQ`83qLihdi!m51`L4s~DDgQ|ZyRD65$dMLj>P<;+Ghd|{IL-mmbbzSnUpJ+~o zihmR)!<kTd-hisJ(cA_#@10P2_n8OHBT#itK*j$HHJ@VpgXcsAsJKQ@d7GInq55iL z`}Nk}2<xIB0M%c<^><sI1Xb@*sJydmpAXgN5~%uXpw_Rz@+VOHYM<qwq4N9*b=`}6 z7xYsCDo-V-JoTXN(`Hcd?V<Ya1$A8pLhZ+NsQHb8dJo+Vbw57^6}JSc-fK|t8?D~~ z759btEmYngq5Aq0YF+<^+SlhC2<BY_DqpgB5ma1DsQx=b<-G|e_6O8@4uOixFk?{b zcqf$qz2+2H40$@#Iy?=P=Q-<_Sbh;I@2gPnlXd1!^E;^Z`2*^`QR4d`Pi?66sSk_6 zmQd@|8mgbJQ2q3RTK}7&>O^dh***rUzX`TK43+N*sQj~Fakw06U0#OD|29<qZLlcZ zY5gbG@3H<nsJ?!H#o-C4xKmJh&N&#YXKARq=R?)0ZZ?71hpnLEx<Os18=>ZPJJkA& zgnC{~fZ88VLapZlsOz;FmVg^9Z!vd5<^K|DeGWs-`-J5ZKLq(IK-p_qZfN;ZSPOk? z%Qr*K_YSCa&4lVRAF9qnmS;otwGwJw*1{5S162JjQ1w2y{#&SghhRx~+&m36|DuP2 zJm*9C)qq-uhHzpLz9XRWzw%>{_YJ6ZEPz_~UDkgFm4Bc0Kfuz+KU@9-mO?&l7W*lv zTMo+ae9Lv9_C*8BO>A!twLVu_-`R3^sJa8pAy9SFEsucebF}q$S^ogkJRh+<3u>MV z%q7;p1hr0Upq?+=pw|5xs5%F2KWh05RGw0Y1HTGTaus+ktPQo_nn0~%8>s8s9V+i2 zDE|;F12drN<Uy^|UDi*sJRK_U9H_X(Q1e}B`BkXr*PBq!fsdf-9D?%u1uE`1RQ^+z zi~Stv%RuF?1hvj}p!#WKxdl{wE2wq4&iY=~-wfqH*!r-U4OKr5)z4U{^|;6OM{Iu* zD*tTD3!w5Xg1SFmg6eA%RG&Mb=CK<p|F=;72Q43k`n}==RNnGO0(%vxJawV;jiH_= z&8=?(^<3y|c>q-3Ltq&ghPsX;q3TXFCqd<X7;0b7fXe?g)crcw_EpxeH8(<Cx2=}H zhN|~HRKCOJaj1HyEhqgF?5|Q#*Sii>y(^&B;Tp3ORQ;Z?9J~W+e`i6h<9$%`ng;cp znhoXmI#iy`wtoOs|4XR8_Cc-x4^VY~HBZ`p1}eVf(SQ}9{A*ZlU^auA@0FIXh05RA z`krQA>u)uOLe<SMqh>x-|94rQVm=O4XC~CV=R&Q^Qrq8xx^4w98E%DImqSqd?*vr; zrH%#pD?!<lq55qGwLUGO>a>RPZwIvwH(2fq)%ReixKzuTmSg5vnAl(DBv>B*hoRzU zL*-up%fjVQ&zrSS^*(?V;clpT9)hZO3Tpo6{2IiUgVI-n>iYty{EeXEn?dEf&i1ZQ z^X>_CpWF(SFVk{9RG!H&v9F-!F&irHJlhvR)m;HKkJaV|sCw_h^WaC84?xZT2-NlX z8>()_--5sU)Pl;_3Ti#tLgndUxxeipSOI+ms-H1Xecl5V_ptRdq2lM6OQ7n#Z2LN> zel}VD*!&V|zTZN{AB0+uqn3Y%s{1cg-Qvds`8=rn)uHCmz`WSJ0xI9NQ0vthDo<~y zxSOH!4TakOSy29C&3j>D|3JmfhKc<H6~El}*R9_I)yGcrbMqT0|3grDj$1xud+`%N z-EvU&s!)0ASl`HU3(Ku6w}a>5*A1Qz2SU}!hU#-PRGx{JAA(xf8Rjggb)RSX1#=nH zbzKD&zaDCRwm|jw3Dom*57c`7YW*pw`bB;Z*0n5Dz3OINvmsR6MNs`;0o6wrSQ&PQ zRp1co<4}E!g~~S(YJLwwUBAbn`g+#(7ohSlgX;TLSQEYj<@Xh=4G+LXzkdYlR~9NR z8S1(>g|c4_Rj(6NTra5md^l7;<7}S*<v+!I5~}a{<`Ss<t1Q1^`5mbFZ-<)CPN=+l zq4MpAiaP@3_lM=vQ2C4f8TgfjlB<~)K+U6x<yKI6+FI^r`9{mPLaonG%jss+`cY7Q zjko?j>mRm$I#m9dwl9EM|D~4KK*evgyaj4qKY;T49IF07SP341@=rP$%&!ELd>&Mt zYG$(aO`-B!V*Pbc>)91*Klg=-9|E<mVW>PKp!~+ze!ulo%o$Moat_o!dKv2azYn$E zUqj_N2$laRRQ}&>Px>pES1DKpeFe*n%w{lgADCUB@(!>(1Ztf|LggI?Rqp}or$PD8 zgsMN^_C?me1huYfY~KKtZ?o+mTEE-;3d;XGSRejmx!kE>9V$buS5qjzE6p}geRP8A zqle|2Y##`<e}_U{r!drWD;MheOoCd68L%2$2vui2RNnWX_Qgj~>;FAW+z(LoPDA+@ zIUV?yGpj(|2X&zOZD#!yP<>nrmFEWAdqdT^*>VQdx<{e%jD@N<8LF>oP~SmMLFJhZ zHJ^D<{j7lUUkl~G!Q2Yf&xe*jgSswXL*+SS`w@5n@(HLsmH!S{6DnUal>dchbEv$R zL*;7?)qf`_|K8T$0_8W<`gF@tsQ&Y<zZdFyOo7Vx98@1GY=6c2H=+92Z2fys`9HG# z3+ul#4@32J9BTdkg^EAtpMWKy>Xn7+yDF4_U8uZGt-sW~8Y;d$R9qJ*zZ<Q;1?oFy z5LCWQ+jA|Cg}Po7t$)OP0_wUy0~No_`ZuBaeg|qjwm{vNJD~RUr%?5OgzEbkl;3Hn zd`12Z>Q#iwTN|qHW>9%rLB+R&npan-xE@gb-)5#j^*tQwzR0&c2`b-os62D5e;#Vz zzhwJ*sO!DW@~2Ss_gOv!mH#*MU#R(<dnV|s3Y1*aYy?&BQmFb@LFMaUeRrt-Z-ScF zK&W-O!}c`WGtFGv$3Z=ZCs=;c_GirJ&E-)2z6#aHM(eklAHu5WcSH5}i}fd={JAoT zbuJ0jcU36;1yJ*B4AuW-P<2{E<>>--eQtzW-#cv2GDn;DL9O?rmgiVrV!j5o9}1xI zeGJvdeyBbUL)HHcs?I6vOBD(16=0%osD3Yi>hB_`xRy}s-Ntf9DF5zI`TIfn-v;HE zX8Ulc`Q}3Pb+`G5?Q<+Igvztpe9J6=%J-hR)BFsouf0&u{{v9*e^~zyR9x|M0(}{? z5<CZe4a>Em{2D;re@&sD<JUpu?*nyz+zPe65vX~Ov3(*`-G?kc29<9n)O_bct>=qS z`*tnVI<1GwzYQwiPV)<>KK4WT{Q-5ol8Od$d8qkThpKZCR9}}`Zf|>6sCnE9)kmi7 zW1;%E2dc08p{~!PmY;#Dy9lbkRZ#t{wfv6d_bh)5b${)F>iZZ}f5nOg{Z)lppW2oi zK-F&wRi_11{MAtX_Od(_s(u_Q{w}CK?t|)gs_ipvpAVI9vH3F8{N94Pep{jPe-72( zVe9{a%3r>Cpsxbu-vmm3HB=w%EO&$IqqjN0`k_#M>1GtFpHb!nSPyv$RQw9-UxVsr zBh)&41a+VP09F44RNm8;i<SuFbD{EAvRvD2XnixN=T$4H_3i~#w=dLw7zCAnxH%GP zy+%Xrt9zmHPlk${ZaxDQ_X3pva;W}Zw|#@T4Qf8SEFUzFnkS*+ij)lUl{PCv>8n}3 zz;a`#K3Z75%4`SKPdBK(dz<~CuH$W%GtH4u`A0$Rhr6NX@i^3c=Rn0Rg37xF>U(yB z?faqbx1XWb@o!iYmMK*v@psV1P<^zAitlRnf~wmes@`BIzjW)fq2?Ed%0J%rN1*Qi z8L&270F`Hh^;^wPq5A(0D$fz9_5TB^k20kLeI>IN)V^p4m9HsOUzb7k)ds3=N89^A z<-OJR5R`wq^)Yjt_4iqxX8CETKAy9@)b`cZueZDzY91dz<^LS2zwgY$)*pw;_b*hx z#m^1qQwA!oB2=DQP=1XpH-qwTWqljVoy;4|8=>NFhPuu}pyr<gm2VVOU*j!5U`~a~ zKLhGMo&^=R2x`4wvb-89em&In-eUb{=04jGSw3d@FQ~jl$^<MAm8TX|{sxvWgzEEB zsQOny&8NNX-C=d)zSd_#`NyIB@3eeBRNjZp$Dryz303zw%gdnVy$0(3Sr3)(L#X)A zpsvdvsC{)1>N$P_s$NprfTf}0Dna#I!}<nL-_6aSuE(WN_1Z!Cb+LS-c{5a=K~VR3 z3RJzg^%Kkoq57EyHLp3=FNK=lDyaNxq53R<s=LGTM^JV4Sij%$A*lHtwS3C<BISZS zCC!RZ^=m-oX#&-63)?$D)$a~fw?EYUZ-ZLbi0wI0{f>ru58nf|uVz5yectwEQ2Abg zieG2@J5cj~7b?$Z)_)B(kMGT6wx2eOmJjAr1}d(yS=;)CQ1zQz-_mSjc7|Hlo>23< z8LHkO>xV(bN1^iPTOM!ueyH`EYR-nrvji&dN~riXP}hG0)cS6R^84EM15oR77^=?i zQ0w!L<#Q?odCrCE?>wk|UK=WJbEtf+q2k*?)$L||Z>Zmg``eynd!FTS=Dp?=+oxNe z1=Y_2%Zs4qu@b88J5YZo+GhLLQ1d?swLV9o`u+#%J}Ol)cyE=3>az)yUkj*x&<1Kf zZh)FkKd5?xpz`EE<sV~CG^aqV#|+E!pyHQ6)mdfz8tdPN+RyLW{<*mis-J^U^-e&2 zC!MkVyz_#*)uH-Gw%inIoi2mwqm|jw_TEr=Z-L62W_uLsdX6(6Hs?UC>x)ozHbJfT z`<6e3n%7>ad46a4FjODEL9OGTwil@s_?L#VSA>eI0+qK8R9_9OZvmCRmF4T8`siYP zZ>YX+hMLzfsJwYl`NlxS-)%ksm47N!o~O<EwlB533Tpk{fXchY`cJI?3M&7P)*pq+ zdlIT%(enfQxlr@32-R0jsQF%Cxe1hiGwZK_%6lzTe;v&3P<i@6`QHxZmj>0}aC0<N z9}htF{}|N1nFEz?CDikA4b=D44yb%TLghPV{sC3*Z>anwDhKOa8OpB_)I2V>d<E3= zwl&oE;0;iD)2z=l$3gWo1!_I!K-F0Q6}KEJ?^dY$?L(+~`=RcWLs0Yk6Y9F3Qzg)! z5A}Sh50(EKsQ8|?4>5C~`n(HjJ*GnWJqZ=R1S<Y*sJ=di`cC)?s_q|9@kOcz@#jIw zHKEq~BB=Fh1vUT9W)G-*eWB_OhVlzT%{Lcnp5v^a0Ck<Fna@G_y$)4p162O)=11li zQ0wvyRGnX;;!fFqPPJg&OGDKwZ@IEr1IoXy*%&HM3#fWmS>G0F-d&-dr?*&toAoJB z^Nm5p-wD<C{ZM%xgR1ki<#|wki=eLaOV)3I+9z9}`rU5sg7V)DwU58C{vWew_27Dy zhN@E;D!#V$^`ZJ{ZhdR0zS=?M?Ftolqd5R7eux={iqC|K8wKS*9%|kXK<%SPq2d;p zi=pQ8qWKEcK3HS>7N~u;119DN^*;K>`Xf;FPD15B16B9D8o_n10VQ8#UJm7d4OE^E zP<eY>9sqS6)2z>f>h~_FJoiFfk10@n&$50ll;0w#`L3}3b*TIsEN`>C6RM9dtpCRP zLs0pDh3YS<W{|I(Sq*AG*MrJ?In=se3+3Mps(yc{-}ml->N^)IZXA^V!%+P{ZO(y; zTL87*%c1hW4mGch)^9O)nR}u9et@cT3?{AzRNNU@2Ntgt<ZS@u*8<Ak%4}nON2q+= z&3;gQ4~EK{4Yj}Xpq>Yh+5Q4l->*T<>usnyTcGCk0aX0w*6)LfzM<ldSw0Q5KE-MW z>sJw~P9vzit)cpE3$;%=L*?xc6*tIoI@EI@$8rp+&KRh^?lT`YXF%n92CA>+Q2wi- z?uU&~bv}Tq|0$H;9`gXyzBvLl-@l>il&BLt&&xx}^`P=LHCsaMn|8MMgo*tF6Z^;d zT&VuWLG?2QDsCoJ-GxxsX*E=TTcF+}JD~jcLHQrC{S?%CCe;n>#i8<?5B1)w57qB= zP<gsQ^>Zs!{%olA$c4H-W1;T<N1*b|gPO-mD8IE(aT}r5Z3|TX525<r4Ye+ZY(EZl z{r<MhAHWm-rJ?ekXStT;22gdHTi??9Hc<2IYI_gc`&zyYs;>}K-gGGckx>2RL**S0 zwT}1OKHYp8YF+0*#V>{WJKw8N*K51E2g>g-)O-D;Sur`-w--XKZ%e3kxB==rw?EYS z4~L4s3u>P~WIhSyzrb7pwVrFB`hC~>-B9`VL-ltODo=%afm{nJ|K(;osD64v?S~Ll z-aDb<rb7A8g!&#?2(?}tpsw3isP))x{io(vQ1RbGt^2R$pHTV!fr>k~ey~p}n{~{_ zP=1#{t#2FadqQ2On{6L#djx8I#z5`M`z%j~T8C$$_Ty@(y6Y`(gPQLysQta)_CKKJ znbaVtR|=}13Q+pmP<a~K-om^Rs(u^GJ)q+HnnR$jbC&IQn-7>%q4Ljw%JU4={kF{V zI;ehkK-K>WYCV21e=&cD%JVnWx)f^|_*H<Ct3vIQdQkJe3d+BS+0PsVRVNjyk8G&x zdAIHNL#^vns6L*A%0I{QVkrNWFtPrY*PENHf6wyAmcM}NXFse3f3jSnQIM}ZRK3b( zEvWUX54FCRLG{}iD$gxYecb^S7qNZ>R9~Z^<~hOg6mtet|8t<?o`cG_)b^JxzX|16 zVEJ7r|6Neena?eM1?6`Ds=uG0`u-bgpO<MI+|RY3u1`}azjjc5H$lx~sF?|MpXEcv zPlURUABURH3iEYX7x`_d>-`PXeQ^Tn`BA1xkhcbu+z=}7<xu;#EmR*ppz7ZawQd<u zbw)z%%W+VBJ`CkI8*054LaoP(FtHDy@~($^{%nWx`vz)#4ng_-V*Q_%&p_obbzxAi z8q~ZmgzE2VD0_FPd;=|qp!yjB)yFt<B2@pAq57F_&V!0yVXlUXTL<-A-(-0&RQz{P z{zstJ?RTg?iZl)KR)nfw$Gi~g`d$I$e}m<lq2`|nRc|Cz+-S@9Laoa~P;t{O&oviA z#jmpbI#gd9EpLO$w+kx&Ua0-~9n?A=g35mqYMw<d3g%Y>%CCXt3!(PW<<@tF%GU#` zUSFtnxee-mOtU=7oB-uF1uAYjRNu3p-ZS%{)@QBlADW+;UqQ|P092l1=1HjjlP(VG zmxjuJKGgN7X?;`cuYmHu#&Rd9eBGh??`wIm<us^1bD;9(nd8ifwoisy&uP}rH5ZyI zpz6E|RsSu^o1yN%_o4Fdv3<YohoR<i9O^or(=3QD2bHfXl)bL?&7rPSE2w<kq3)BL zp!`$KOsMtDg}TmnLp>kvvwb#H-sdd84Au7=mJ6WPWxM5F<`+<PzlG}ekmci0{->b& zNNOI)rJ(%FL+Pu)Ca?}vd>5!b`&b?f^&OH9)psUT+z6=qd9?NSL)Ci-D*vOlKV|uO zsO!B9s?KVt>$lPJPN@0rfvR@^YJCnt<vRnFzeJ0`UKYx~B9y&`<z%Qnn?m*30xGT* z)OBwIwa(qmfl%=oW)vzeAFAK+P|wc?q3X@CeIZobi<VbI&1)T$-!^j>)N}hwsQQPY z^8aNPxg_u}4b^8QvpQ7%x=?*Ig1Ro3SbweA5vtw|Fd6oR%99IKXN)-kYP~1hJ`*bc zTyr5*ofWpf4z*6}p!W9;DF1Ju^8R2Rh3e~1sJcZj4eX_%e!o2rs=pT2UuC%+RK4q= z^7gfTAXMED)OwD9iT9r6hoSb}Q<k5H%Ci#cy03-0|JFn0*$I_rAJja4f{Onas_!zF z`8@}<J{LmG?`o*$b9<=g>#b%cRK4*~@ee}fn*kL!-&_K9y;ni4%La2Z)N^+`)V#li z%6G{84Jz($sQ%BrJjh!EDo;JA^=twacd2;|RKCtoee^K<L9NRmsC5_$l_%5sk(TqJ z^4<xxe)mJo`zdoN)cUN0x*y($%CjHJ{}5E2Q&8)12CAR3R|GsCYW-`%#D1{;DyVt1 zh3fBm+xtP~8w`~{WH}dVeMUp&e*kK}Q=y(4Pgp<G`gztbhT2EVq558Ddx7QcP<`xz z%CiTm&OWH?aK!u@s$Q9v!9350npZN^`m}^vpUzPGV<6NzhN1G0hMLzzs63OP<~<E+ z-DW|p&myRKzhwCxsC?Tk@3#Dn<)5McKJ~lh^REo@)rQL76spgbQ0s8L<$+LrWkapY zD5!P43#$HoQ2jh<{amPg3!(a7Wv+#q|JzV`c0u{=hU$Ai<bM-QO64D^b*4Zzi!cy5 z1Af7RKg7707RE;r{bM$cZwZ>NhI|ymx2eZh*e6E8is*a7bI=XO{tdZKa~`qp62?)^ zC-EtT&ph;lI2RK)4t~Wsl3K4&tG*`2(GTCJu<Lk?@p|H4Cbk|vA2A-_zKWvjLhOCW zQ}KT~2>I{l0PL^fUwFLaaU*hGg8zM-Bk(Caj@f><74`A!L+)*`to??&FS%smKZE+U zY&(OWj=|`39K!b`=O2tK*{2jS?U`queG;1z`?u8j72m_yw|aicarRNw{p}_82J-PK zo|MJeA16LHlE(e7xC`;=#Q6aB3#r+U{8{+ycQ0+>hiApKV!RLEd(eM{ua42=ZO(WB z<GIwoiL+h8LQVYlGUuD{nG3&1f68%k`3L(vZ1c$XIO9ez#HnL4vW{i=f5W&P@pqB? zZFCjkada1WKge$lx*C@6M{bM1j&A5TDhKj6<lcs^1F_YeUp@~ozEA@n8E`dmy`g@m zyp-`5_*{Ed%w+rigKZmmukpOL!lLx?3iZY_x4PI5xEF=+=bxneU;}*qvc3oM<2v!( z<oQ1afAJVo;`o}}rRkvreh<1{q3u-<&LQtO?1e`a{ExcMT9j8Yu5;ErR-^j^U0wT> z!}hQ3H=}!rI#=P7$|;xo$^9^MIQ!^};TiPrayDdKg>yVPX3~E?=Q?uaqASUnL*Pnu zk71vO{DONegHHv|_d$FnQe!5%-mWzg|8B@l?Z3;uRngy#Pv5h8;*;mUgVzH8MpXY! zn18e2n4QG5rnZhK<2{^bAARvFi~U9CsqDD<`29-#*^b?fd^5R^I=DUhVyypG+Y>J= zY$4kRyZ5HHzfAt?tdq-U=-(vYX3le5Tl!?qm(iVlJmH?J;8&cQ{B!-JHP&5*yac%! zF?Bh2Q{xNH(afV9=e^X);%ta6hnTJI;a~UF&a&!FBEAwnZ@YdN-B1}gUU0pdULWaZ z(a-hxUW9Fi^&8D+$$LKbshm0<hm$-W>-^G>U_8e?NWB}Mv7D6=j>3)To+jtt)VL7c zlZ^Ax|1M{a1?WpKmwL#VoPS_1>U=BV1bnW>r<!%I5<8hwM+1B>CZ-hQuGk;utc83R z{{Q<ZiR~QpPhi(^%~?J}kU#Qz$~G3?gRUXDg2yislgjy%W6xl_iF_ro7a@MO{q9G% zi}O?Z({VGL37c`Qw9jhnX^dB(JA!?obJj<0h3zur7hvJ>CF9@l|A+Gflx490N?Z|o zoy0i^{TWUjH9eQ%ftb`0`<M9Mg**YD9L5#dcPo+kq~PBr+Y!{K&ZV#|XK&*Ee@B>j z9VKD6V3^b%jv?3g#QaE(UT5WOMXmpRv?NyFMmk>i+<#|$0q6I`wjf78*O5<4e9Dmf z62{G)?{EB;yT|XSJq%l#oH_18z7oIBoue`Nu4Q}``bCb}Le6VF9**sN_go%d9iPB7 z^lJh!@$(*HjyR?<e4l)UM;8w=h|49eG`3q*gFd#{b}qKs$Qh2?0AIp4+wyMw4&c++ z{*Cc{j5>?x?I-kaGG6XJAHnAf;%<edvFT{RnM}T;?(t#9W%2nKeu(a8?2GA1-<8j! zD?HYd6Lr$p=zg~T2sxiY|21)489$G`73VI_D#*>yKS1sg_>3XuZN@v?+j-dej858! zkB&1WFNWMa5EDPI#J4*0>x(TJ+d;G`wx4vKfo2Ws7g8sWvjhHx$N0hl`~^M#IWeg! zalOgg5*>ezO}f*4l%`(cQ3m}(=)2<kJ~;<-7SQ)A=udFIkN!H>??l`{>^h$1Y(v~& z^3TA20q1$hzrynP-HqSJ_-sJlfzK$$xll(A`Lj76#C9DlJn|Sc!H54;o79u|PK-aX z@h@{Awwctq9KMF`H1Va8ql`;Y_YdU982?WENcaRbiZedUsbe3$qtNYVJcO~1)#TE# zih9}jy~Ow-d=7IqBIhIc@t+5iI*|Kje4fLn2<!}3z+q6wCHVc~`P5_l2r<{VMp1I< zxYzOzmhU9K@EAv)4>_+y@dT`bZv)N+oOK*m=zE0tx%i|x&v~Zo8_vpE=wHb4^mG#Y z%`oJciBP}Om8ZtL^j{gikDP{Icl>nRg3oq%EoUx1Q{B(I$cs1+A}_>uF+H8bcs{x? z@#D}v4961R2VHmgkk{xF^o2(rdL3nmzXAJE`$+ebYxO}lfpa2p&*PuWIh*nI*x#_v zZ}4h-COdvS`E=-aRUPYy`7IbG6%f0C{;H$9f$=Z!W!Rq_JM42Oy2j`_qk9xx9b_FX zT<<>eKZtz}=PGpHVgH%&FPs<ALo)m4NycxYAL7_QiTMiO-_Yxr3a^0rJJB6d_~?tz z=t2R$&RG}V!Q@@y*a7&g;Jk=Bv(Qzf#(L&dcoakTgMGJ|vi-n$wR-S6Nw<pFyUvR3 z$9M)lU%^@QTnXQ`Fh-sZ=+8c$bDmBp2jSC@vxevU6!CH7!s8C~x7vRf<GA~J2bMyA z4UVsqpD87+AZ|Un5Vj4-2hi8Vz&}?@x{>n@&ONR(g7Mq<y@KCBVrHSA#W<65IODIe z>)1=qH{H)P_Yqk5cEYEH^A+m4;L{CVH8sR>5}#Vsxg2@6*P#gGJMgROyq)n&#z)6= z^o<yw!gnoaW%nW5^^7MG^8jZpY7B)n@M(_!dd8m<yAb^g_-#h7<3`TE(cg;hTy%So zzrgnn#;1roAKOsQCY;w3Tgvse!;A6z4c%JK6WDKn>xs{2d{nX6=OXKPkFkzwuot#b zmIqRY|Ll}h)BVV&2JxRFZ<4_AI&w?ft5M@c<#+sLusi45*smaOcevfYiY?E1Blhjs zq`rn)C0XC0p2t%3adPVT5#0kgUE^!Rf1XXML#-$rfxasGFY&$Fv9F+ek@I=Z$>^J4 zKTV$5ocADiBli~K8*-MwHU-@W_`c@&vH1Or?J8_7@YPWt`#Uh#KJTJmiVy!(Ch2v~ z3C!hr<YzcrFxK%SXLZK>XaA({;0ex~obO3&SIf!Az32ziM+4$NfEQ6u$D09?X1eZV z=N^F1F6*v?zu^A}IlAM2f$DJnK&~;!w_|VWxKa2mM>mJ_Typ4`%K4+m`-%D9d8;u# z`}h_8W@=QnFaInfX{q}hZFWXi9Q!>4evR*Pa$Jt>IrKlm_c>$qa=&wIf;Zv27vGNP zzjdGW&{gLA9Dg0{(7(Xhi99;~hJ%Q?nrqY=`A2N!$W`{No+l7{0KZ4DRdAk3#C(j; zEB3pXm{+jx!hVZ$EB|fwe@}DZ%(8sFYBL^bxhA%Cj3eZ`NP!%s$@wv7Q*?imy92t% z$bB67B;&5cOedx)au)VWkR!<bU4K7v3C{C5=in0~W;ElMus6YPBb<&-M+)&e8dI+n zXFb+K$J4~=n2xRiv3C-)h1ieKeZ#o|{X{qs-Rq1i;D6fnQ74Y!#OY{Fjob075QvGN z?>YZw>)s)@BK~{eXPmu>DQ=$<$iq2x9Hf?x^U3!qy0-Y-0WXD__SwYvPR@m#f045& zoX@!r`%L6{jL-AD%aHG4a(#eq3VB;I{~`F*f<L2AL9gRF;+o_8JY0@Fj&2b0tK@l< z^8~)XqtAigqVLK0J$yQnC*3)er|@_OKOGt5dkEh>$cK>M$9EO^-a<c&^IK&8Gx&eU zqv-nJI{-~j#ya+L-i+>}v+8_q+n4YpwioGXD5s7g=o&C?N^cwCYR=C&i&3{8)KQ1= zevdz4{0TXd;23l#h#$-N0NjqeoN*1tJ@L7U9=<~NGUp-A284YI&&9ruvl?^R<~|=r z|BUBWUHLispnDp>!s8G0U65-N^BQ%gVJ|$sN7sonOpb}z3Xd7iFL@U6{fIA#?m>Ls z=3I>b2y9{d-GS~0&ieR`;yj;q8Acrc893>7>b;At@VFBDVdCbvZ|N^a_ow9&*q-!U z9<{FdS@H6J$8|M6gDr-C6n25tiD^mA5#-dd8~t1OFGar@{nuyBU-lndYYBdj<JZZu zY_pN?CGLJ~XBf|iI;Jo#JSt(|jy}cpq)$Otc;u3Ak^Sf5^Ax`KA`fM}0>4e1<<Vu( z*I{%s;Ty=O+~;TLmLex1$MHSI@HujRhrT1@b%lk@O!N_t>k-$NT0aq6k=O#{dyv}` z|GIK=?1Ob+D)t(Tce~eT$WsK}rS=P<e=!lk-v-fLhOO{;4c~vUkKufi@lV*k#rTCC z-k^Se^g5!9*I_?Ijx~%QA?7)3w_$t6wOZSEDfTt!dgJpJJ?EoOLH89rPL9ioc@Vvh zqR2CXVbbmJZerfRuOs?e`0OFid$0@fz2H#Jo%mdbZx{BfjyA|2x%S2ABE%LRf1tnL zHtDV)zVP^rxC7+>(*F52v~k{z#0|&)JL``jZ^id*dU*of=V#Yp{3!W;MSrK)qX}G# z?s;tc+{3lVI{tJYuaQf~4)ia>=IB36Xt?*`p|fhFBagv;6EW{Q-)+<wh0lHHFR<<y zy65nH7r!ZI#XD_M2;aXrcXGDDXP<j0;lAr={=}6eUv>Jr1UVC*P5AFX|Fm<~fTdhB z#Q0g_d*D9@-_e{8VT+(E=k@G}?L7QGCH=G5j={fN^A>Vf#;=ES*Cu{xVZ*R2=Lf`G zi@iTK9lsOPot*p8ZFZinfhlP<zLl`Yuur$G7i?&IF>?IFc`v#hoY&iDB)Y@+9Ov9Y z{B6YFPOb~lFJL@~Q^$DN*fFnSe*)jHkQd;0%yYO0HpKP~zL&#w*k1_3ldfZ~6VR1L z_Z%@j@j2~$mm|N$IE9=8&`0po@e{g($c4wP`1PSiT@(lLxf{6=F>fIMg}xfPPtaY4 zd>rcNhQ6qLIiKQejeM7FH()QrImLb4XZ<^{2z7hlzg0;%uB6UooWro4;QSGrj%0Kb z@h#(P-UHj>z?Af_DLmvFFXOLc5`O2ABZq!;bacM+oM)Q-Zy|Rp#|*KqtbKw={{Dx3 zoY(0o#;-Ac!g-sLcPeo+;4aQNjN|wmV*EX4Is7V-D2<rSj4yDWdH77@Y)P#f@oNiT zqGz{|D196H8`1rX-xdu25PLPe80#8xWxK(@&EojA!au_KG2><KaVIh7l7AU`9XDdr z(Tnp3eE#M9-L}W^t<O2kv6rE*ZGXj7!KUMx07-4}D@&jG_+1LW#rF%wzhG~M@1@jj z=Q%6n3dWaU&$6x@Y=Ztn^3=uuJ#0zjS-`j>;}zIHM%J;A^KSBoIoo63M$F~dJ5Zx4 zwpY<tAZ9K4>#%>QTpaz->nK3~WiU+q{0N^r8Fhot;=77mrx@$Fm-7bv|3s(b4)^dG zxyC#1Q?L#CBlvx1zhrn1KKG+L`)G?U&p9emqcgGj=q|<YLRfgra-KuzYGP~eJbiH( zNc<k#3;m0uyP90jqR&NH-2RtSqg<gAydC>h_<m;HpNx-tu6wDq9s4TBjy$WzrR464 z-(%<|Fs=#H-S1WCmoZ*q|MKMgll<v$u5<OW?PuhkXZ2G!tWAzb$x)u%g-0U>8R$PE zrVZSU?JdSvGQNhhGuL|y^25%38}^kRpNsxc<m2w~Epjd6Y(b2U@6caFj#Z4yGJcY{ z-|1J!Eu1$eMm#&wJxi|A$gS`%JerZGKQUiAe_iAr*!LrUX1_7SPIADL<hT_%TXW#- zihK~i9*QUS62|jfKb5@g(7lPzzv$2LoC<4Kz^0=W_BQZo@=fJD#<>CiyEyxBZg5<` zgg5VF<n`3(&Y6zA9r0%$FQQw<sUwQ-733RWpCzyp@?P{0V}F40wVZ3owG+7+<Exm< z8O~AoOn2O2I2NCu@R_f<is(MDy#QS!{3|i1Dfo?MJPqD}elq7N{HEFWLD(Lfj!mY< zy{X*>+tc`eN_?j0Alv7h<I(GAjjbVd9)OP!^ACRC+qboSenalhnS;H6m?kj$tXfNu zPoN)U{|n$1<gBFv9G}`ZMn5|_Kcv>#$GPObm6%lWJkF_OG4e?FaS^&@&M^i35yl<R zRS8@ZKRY|;Y+@GKcLTmBkuRp^h3I-g9oG=s1^s+jiSz8Ev3*`ezX+cS#I-;-jQoFb zzQ_0$^e<p9NB(V`=P+)E-_LL%aseznKEQVz@@lvkenWgi*H{E^NB^t)eTtwkJ_q2( z_EDZs7+-InwlI|%EAdN5KMi|J`btBm<7>`a$$1yLm5!1ACB|2x`;)l2@HEs>8T}i` z)fo?gYdBx!Y|r^F`QtE;Q^#enHvUz(wjHRE6{wT8IM+^iqkWS)gktHTcv6Rya4anx z&PnbR$s6;Zl$#NWg^?oJ{K(7*jg5pD#NuPeMw2?EhBNpvG9Jp0<fBfNXIdyb6pbUL z4UcDsav}_3p;%If^jIW4oRddXBsBwVB!@FMhlt^!n34`pi{@{hziDbD2O%?($Iq<f zuJPfaF|iP3vO+0j7Sp4lTyc0joRv`IW(q06kJNA;IkT8dB11SgH<Xi>D3BFNiN>g$ zl@$roP*!$G^UTT)#|l;`c0@S0c`tg&i)4pYKyq5R`SqcAUbuOmSTsMJlS=CB(1?Qh z!q{kz8X-QC8p=uT7s`&3COeuH%F~3i<B6((warPz8Ki}>;;D&p3|XFJnoI5-NsXq2 zV#zn;W+9R?CoLluO70U2rG;~udQMt2hMW~jz9pQcDd(ie<&_zVNyrT+_l=GTWzkzs zUMOpfba|2J$hcOO6(1H#59Mkxa`HxnV<W;We9qWt!Th{%dYt8mW+zr<L?|_>!-&wP zsiYZ!(^yI+cZlcahGVgeXquw_Q{Rx2bCx!)%TBNQk*+Hb3SPmV>mJGz;;9L(u5C1* z9S}<krEFT3r9qff%q5mqusAhCdBTaE6-ysOc`Z&yRv&dlt1T8RPM4e+%E{I0$FkXc ztadCf!YpB;fw(q9ZfZ0ulH4bf8qT3+Zbpbzfw>{JGV7tW%S~wVbft*R4F=6v`AAM` zWJD+}nw&<lyijUl>*aBI@**SSQe_p)XPipncnWenHB;A)fdb;Wd9hGdgv;A0G=iO+ zmE528isVIOY`FYzBt}?1>&tRzFeVmdwZ=xWLRm>2Lm~EVX7lUAvFxzKw9xSASTUT_ zd_cilvAn!+Hk&(Ls<?JT$4~|rx??C3PVN~R8{%Rl#{EK(oV;*y2i6xw=B8Er%!=s8 z*l;WtX6p=PMuiAFD$=}TC?`D{3+156Nzd3cVeF=5i6OfL&G5L|$;r)(ri@{Jk<`qB zb;+5r&~Rz<*dJh&8X*IF5T?Y_5>z-V$`Zp&Y9%gg=Mc|>j6@r;tZ-gls5u**3(>qk z2@)YW;XFm;<YtA(FvxA*H-o1JgK$>!o~(9mYDQ?7T%_oi7fMTvGcu#GyeJnqr&)5} zaPEkBN>+pi1YVIWZd7grhPmP9J)(I$jXH+%GJ>0ssEp(;+$qWZqTJKDiQ;3Dqr;N> zWbxoq2V=r9>W4$|<Xb{nSzNS^;o+nUbEB{a#T&CzbOCrUMQA3R6&ah5vf^B6#60aQ z207uhNTwWe!aP;f2BXdMqxl-7XU4PQi9tf2o_Nf43`f&-k97>|p5kX%g?Vsi%SpF` z3dPt`LNp$Ln++*8=D$Zv$MERHVnz}Vl8%v#D1Ap_+5m}55lLLxP;xYdRmjtRVb^Mt zMGBTAbsQefispx6Y=Pz}k*p}2g-37l=JoLrTrsUgRwy+yxlfdx7mQQlv7F>l5f-*{ zC^kxaL>?oeQMOW6D4fGec0--;PLGE3gDG++Q38)J^UaE8GP5YpK6;}>G(9bpSVYR_ zM{<VC$hKe?M(K!W1kBT=iDr!rY1N}y1uJNpK{nHg=5XgkW9iZ4UZM2#NK{u#A`2en z5ud{j(I_`Fk{r#9#S_lC(X{3rQbGl93~zp0ID14^!4josJLzH8F&gK=#hW6|_AGc+ zmjO*yI5{nz+$$Q-NL-3&oCm5B$Eg&H@N{CB73KwyaL)?r=Z90#j|rvne(4xvp>p&L z?n;ljtPod!STx3p@OUMjn}kOK3rvf;VR&%opVf6NluLVhnq$q2@MgjK-whiJ@xI0| zb}UcNEZ!U)c_i~AoULmVOI#7Ers}~G3+IK>)hCZ;R$S{73vXV}W0gT9J%hzg+(6g! zf|MpFEt1PZ$GBY4tY(R?32q`OXd@%JQ#31{osvkL6K$ToX*O;cqiNbzBci$L^MCBA zSTsAaWn=N2aHM&!xE|acW85}DE1RZf@{~^OTisDS`4cP613B2!!3Ru79z}Wx0AB0z z<E4<R+m^Ra$9Q^#4}*^Jtk9^?7`lmP=kc~+VdG3DC7zzpaj(fW##1ZtsMj!>&~Qa% z;0Y1W%?Rg=k(8?$#(DH7o)GcTY_6n^1@lvLoA-$1X6p7VSdv+=g!q7|xgqU}%`?NP zTq*|3NR<&w>J&<0MME&17Yc<sg|b2^`m$h<Mn?i4ZhHMQjIc#=0wWK=2+uhltTN>D zGLv&Q@8-97oH8OyS~?#X`oKffD<0@pRz&s)zDaU(qYQJXo2bNojOulbid~a1W%59f zoEhhX5aty&r%#cDBFuY$wdoY%#hJ&>?!*O5iKfUqmK7Z(u)!qqrKZ;xgH&F3g;Y5{ zLK4&9ea$N`c}#N8u)Z)bBow?2xSex&9iYnd!%jn{8)L(26wC_pic~RulXT)XP!_Il zr*J5y=E7M#Q95x0gks5?*YRLW2)xY;ncO#$&*!6D)GLo(B9e1L$=$e5bB5<;hO-me z#P*b#XOO^#9UjWmFc#%S&E8?0%X6tym~E2ODI>(k1V452k=KL&K1k7oQ}ly}4Nu3= zn9$iTH}rh>u~Py|G$o6bX(D&>XJo|raEE&C@RMcI2Rb9_=fo2ikTIV^oid`S1+NI% z@jPBeoicP6CwIz-$5J!?r<BY`YX)zI<o?l7EMZ1GC7vf_M)P<IjY$sW^IV8#=ZxVE zns|<4<BK#mq-D>D=ZA7L{@+<dQh3|&xbGAR^MFnZCl^fM@kBr*oHHzrj=d0x@p{yA zvr~kdIW4(EJddpq%?`=`f85rcvUr5@h|S@35^VCU#P-rpKB?(CE5au&9}5hltO~zi zXoaE?ZVhpGnD1|>54B(rP3$6GG(3#CT6{Y5gD<R9J_R-ZXwE2hdQ@3cc-u2%&e_`Q z(HPgBdvg>Y4jM$qYD@85&(!h~$z!pC#e6NG%k@vaQ~JfzP~|3GADyCk(Gj81Tqmws zF0VSMZAeL;-1<I-aYe`Q)Dp#_V-gePX{U9MXARR&-T7h;9~}wMUpy8nSQOGApGSt& z2{ykmuE%93o?Lu#uowmN(;{QRE3q`54-8)Am!q^MH?q$(<UQDgZ*smW_`KtG7D({F zzQsE8ES85pSJJioox>?ogi~T+zSbG&NzCoVfZrAQnHNg#kR3{mbL%4MU8g~IB$j+V zdrF}i_uy-r&ydcn{+QrraN#@C0*}Q^bn(&6`xPwC*IYW2gj$hsW<=Y&bA(qjSB*j9 zBPdUwe*e9#0%cw_x$ui#yNyo}J<<NNb!EfoQPG)Shc`{7k>UKx8Ry3898KY|!p~TE zL{v{04Y`35)G8rzO`G?LW@SY4le@9K_!j6K9nPB_WU}KxR`Q5gB)R8szG#Q@Jd-AP z;&2m=;M-Pdv$&`UOHOq2?5s`qb2CcKW1rhVNwPzm*V{LH^Lo8DI!D<Yxp_P)7=_c- zKVL~|ifgPlKZ6{7FhG43caFwWSUtWWf=|-UdSvmtTjyB8tJ#28@EDd~-`zAHPs~hj z>E`^>7|!E~`#)dso#SbGzjuyj594OYO?*pq)8{qsVzfE>?#eHiALHgn;x81*i9b+u zj*rL+b4A&>V>Pij_s=q1HqG8NwO~a~QWsu^yu$TCpZJm7VN5L84T*1jQnBUOduQo- zM)UYpN})XT`trz$g-4xb?i)!XqjtqW?&h-${q$S%=tP))K~Ol<P6;P<A%^!~ddC0# z66%u9Qg_MVuMA0DB3WVm>3}zTQkSe`KK>(+_pZ9g=J%CQ^S;5gOX|W!${qoR@$H@l z`5xeNDtH@p;USmQB^K7}tP5{XJ_&OFPkZO`<3@I!@mkMcQM*YHQ}b|O7>W~E(x_j2 z4oS73-UQWTHCcQW%_6%+?wn0xU>v|p+l!2nETT+=EDU%N#Is@d|CQf&ZWUSVms+jX zNaG10)qPa49`|wXIo~<=>jIb1gBW9~V$~qQu5nt!<7B*iC5sf;LiWdF_XVu?vKJq# z&1BZ=Pza}mQjC4`_&F=yFlf`_<N<fQ$7la?6ksThysZE&k#5)u2CN_|513Vb(urS@ zWu=@>BPgl0dD3F8GKau`{K&`NZ6V;%=tEBTmM<qH2ofEIBY0Z^ZMLE#PDdE49TN1L z>GD5#%`NHinB#f@v>C7qZ)?EpHa%?%Y0Yd`5}`<K#i;#CCWGaF6<C6?LR1=}dU{(E zh8LD30&t4~#|`y5vpyEEjxj2vQu>~+-#YyzhV(WHkL&=3tOhK}^2Hc^MrTl_Sa_A9 z7Lx+INNJpr)elhSx9MsQ2+nSZb+;|7iBY>v7h}w!;*$k4;hJ!S*a}IpR(Sty8S&d# zOxT!+ylwQ=MdWQqN8CIz^lN4FZG$&3Z>R_H;nIkAh`6jreV?(q{AS{94}w<24Ott3 zmPnFLeBvhB_5gbZ0m=hy72O_5mU!EMUE6WAe8J_&p=7FI;B=tCXL*t=LrU>j+Fhuj z(z6$)7Li2;azrKa>p{Dtwabc;$-XRK3#YU#7BlB!DU`GtmOavyH>N4+1c^#J_y<8} zf{LUHS&yWnfc{q6_GR*CdCg0iW|*Ds<Tk^xo92t4b*go@o*gd#S7sJfA)PewAGBJG zMM~l5MDm*)OE4>wG_7r35(#0K$5OrZ7IA{0($~&-8$e5qWtVU9f&<H=R?m<XR1b9+ zp(N4XmSuez$;PKzCK?I&5BE{-7_nhj&C$-cfeD77wA%s?wrBPMhCpu55S~J+wom5Z z4z$+%>^Houj)ii}j4w3eu^^~zFgf+&j+vfwQa~Hjnw_AB6bmd}{!anafcD=B%*@_F z#csPF4JGHO9|}Dg%IH_iZ_Nfm7N{P(@w0=RkOsX&OYr(6tdSY`siK-t4@XfxQ8FE{ zXo48*1oSI2O@M5ne2DTjb9sY>98Bx9Czoe}nKW}H2lu$V#F?HfU>C%fLF)1imNb^j ztYFr>E9|4DWtSxd!-m~ujPv;fKw$Y28KY|rGj4>EV><!gsYPf9Z6=C5WE{8;?TF5a zoz_m<1BjX-v%^5*4j9xn?RPMA_^GtF9p<T%I6E<AEp9vLsN5&+_k##UbSEBkX0CoB zm~KbnY|*i90eYYZ8SUT!G$&2pMjz9d-igtp3XMVJP>&r`I{YGL5Xb>=4;9H&TGI}o zF+&){Y+=KIVTww-!+=9Dk+9&9NKxP6EtJgBjJzF$crZf?-dX;kJq#CTzhN0q7>qJj zyj=`+1~kbe=ttgeJLtw7Cz58nN6f&`+wJfVJDiHa5$4D)BPlU8AI*`r)xx!^1Fl+C zVKMW4yMxH^sfSLV(_IF(n(gzd>L1ETc*NfB5QUwN*+sNr8SP^AGYOS4OzfB~f-2If zt-&0Dx+@KM7d^$>#Xyy5uuDJn>1;A|o^W1a`g&!Kd#Kc-Df+zXhFBYx3#Cvz6^^2M zekFZ)mo7Sot?eeZ)a|mwpZ?mJn*u;~PqbL=1z3E-fL5@TYFNBlSf+9?B+QjPY27H& zb&N*}fG`|+R~-<L!WAvsWCg<G;_?yx3vUlk0h1O5b1xipqzdk7-IT^@ndPfK8R5zZ z-o1zstV;kFF$D6sld2eVYanWmo;v$2g7oaak9{`)`5mhQN2kW^&3d!Bw<n#0!`TZ1 zQ1@nM-;QYfQ6OV8H88Wvd?PU47KKXCnS;0#8Vj`JxbGDM@CRmPkuE^}RWe}(QwH^D zXfvu9v?Gn-V$e|&k)%_wi0q|#806%bgse)VTsCdT^*O(REpzUgw1IOMHLaOd!H^-D zEmG?^v*e4x5Chej)?n^)E*ffTl8oKU3}>LV6oFH5kQ8Z~^v%srLU{(pPd!Qz8W@%m z=KI7x4bV;cHFaQ)T|n;RxFF=9k6=0vG;j?l11mC__M*!RE0?0e8N8U*&=Gkc&(+TT z{Q!fN!VG<d1dR_9stCk`;aa4r`X{OfuL8PJZf<}cDIY+qhb=)Y%a>EKBh51Ai!C&~ z@*oLy1q-_lK!7|b90M1yrlKk1<Sa@7)-{u%q+^;U=&)TC^k(YZ4&ARDOOFOh_w1WR zs^Ju|==2&9lFFH(#Rwb@IYHWIk>C!z6rd(|Pc!~(%sVz&29fYo;)+5UDWV?_LaUj~ zKv=8>1BU^?bk#VBrk&Z4Bz?{xXrtg38BXyrPZ`B0<`^k55zuTs(nyL1DF!2n+^ofz zm(vlWEC*^+q2;28qa!`qRl{h*Wx{C`N4aNp<(MT<Umg!-j13EqlLZ=4C*}=fM3Nqi zn#)>Zwq74)?_2DV^Min8FKbCu4@O!UHK{A1UsQQLozo&0L{b8Eqim+HPSr92lRE?U z%=syHJS)By$70OVg!m)H;7Pw>VGV_ij=@!wOggp-<jdNvRb&zBd3Kb=iVn(4PJkHX zohU323FkyKC+QlVNHYX}jd6sF)=CVSvlmDK9_HFbBYQGCdm$WSwc_IR#q3|9^hLy- zIuc832%cjZ^Pf_~&zTM^d8AV&kk68@`~tP0coHm70+D-yV2cO@8^m+4g1E<R=616= zPD)^~h%1)=J~0Pg>Ej2$RZNc(c#d!>eh#ww1@=~`3@Rr!1E&Lj2cgLdNv<r-+GT4J zMyjg?3nld^reDc4#-S{LQh?PQv`@ltOdc;LW+CaAFCi5OVFm_S;clfsOLGaK#3500 z4pDQJZ2}4?hry?F$AASw+3|ixF-L2)QrKd3(vhkVorfdqmCTrRE`1)#T2?PDfD3VN z4oQKdrzALRbgK#SwiG6OF`ij09ttOz;3&5ajV^V8*``Rb64wJ{W$CIzOEjcCAnF6a zs-3|Gr8ARqcf>N8aXjXYk+CdR>HDFp_|h2^8&HbIrUaL)BckLGGpvMXMc*Ic&=mYs z5<+b%GdYYb-OnZ^Yc>FNUMOc^62Ask(v>}sU*5(mAy(#mON=Be5ktVCQvmc~!rNJd zqdpN$TDp<e3oGasDAxr%<gAV6EVl~U(FQ{d#5$1@Ttc+OxM&6D$Uj86lYXV;r67~R zbT`YAT#PU*;j}4fF}7TN`O0#-`Bblwsr)4zZF&TNvuSeV5X>Ak;!uIH+(<wQq#xn1 zWGU>;s3JasQ7h}D6yxloIpT$>U8R^&g(62pfySIlgcdN7=ra}<q$i118d5MsL*2;D z(o73Ytpql1?z7S?36KjV8hXT$XY!ocbKLqu2gssG>4aoz3GWc!jrb}DAh676GVLzt ze-<4=QPSTfG$+vg2%Mvh(n;kJ(J;)ea)8&AwM@U3=4;2bPD?SSu6OnVJ-AP<Z%8<4 zNFQm$pjbGE+o~?|<+Rha(w)i-XXzcJ{31Z?l8bZzE=d#ri3MHYs0ofxJV>#c)5PW< zHK?>2=c<jcb1faCfvP-}x=jWdtJIVgOGn-1zv+RXxVj(c2C6No;(e6%14S|@V_*Uq zYXU+>Mm9jHn5R#*o<XD`Qizx!6M_ejpr`7Vh`Pcf3{wduE48}d?bB&O31^cXaWGkt z-cmXCg#qA4%jFqIegiwLjCrIt24x$O%w>I8A0eyl6>&^aO`w9Vn$N6(7x78NDuJC^ zW>GXaHCz75!P!3`KHTstAJXF<NB6eQUM>S;biFdaXEaFm6!v38g-mwdAZ#BK>7!Io zRvBnX0VZX6OYmNkb_h}+HJ3>l^-z<61>6o6Wl;`ifPH3V0WC;Oa$YWpa(Mb1DY={C zr)-X7evS!1{0^@WwLyauAhlVC_l(+u6q7CMdn1Buj?cc;oE7{mMbH<XP8YFkA-zbX z4i-a@4myF?OMH;BfQ5ttby_jYh)&H|QetYPEU?apHZ`e|JP1#J&DkWvfYJ|H?guTU zOn&4nnMD7_V}=A7=@n$AD5^S1FRC~v76-ewOyCkmg;z#<W0@uzA(SuPD=Vam%j1p~ z+;WU69e$j!jDu;H<9?Um3)v`S0WpxgO|Y#H^Mx94U)q9MCWo}8fPcz#IsxOI%XOII z40|pKV|n0EdrP5c_E;8tU_>NwdNtqQ4&4tG@nthOW+?l(IassgQ!n!&$682M!%Y=* z!pi+%SI}DMrHi$ZXSEV$$}p^AObGYJa#K-G$4Q*@HL>XrJ19&_-{(Ro%JFkySmjt# z0vtjBVtE{?smCZtl0N(v*(;>8jHuOj0eWb?FQZ%!k1=}5D5Sw9Qgu5KV6{m~H!>UO z&Ke=|$d>UyaSzZC8k+Q_!N+C7qBMFYG9SvPzaN0d^t}pkNO}h{jN;f5L`kH~oY<Ub zfx=%wtd0pZ(Eq8Gk`QO7ssZ6T3bP>(##sr5`W)R2sq0i$veH6GkcK)=apUO+XbU<Z zY%7vV6{LvW2sbxPR0$7}g&e_hSaT{s>;{upLZVid|0*@Pf|kx~AYqnN!V~(Nb_3ny zvncJLpgBE6r9EtXz&T~hq4kKe4K1wxQ--j+gZv}9MldFkFwXp8N~-RNrMOK~wasWN zfu1wg_@wZp%QUHU=v%L1kq(szF$4}yJ4A9A;5+ULDRZUeAJw-Ll)5f8a;a1zL<k*M zL95acB~HGkxeHROM2jw8Z-FMX5fM&+-1x{VL=>V4ke<EJXwC+AB}M@$5F>NQisQKw zIGf&_61s^F1alnEEC;9+5uk^*a-@Y;bw}}lR>1i|ED&A=g9`WztKyw4-fZQRa>a*O z4Cxt`8K-QxGq_AOGF?F)CVxXmboHeGjWzX5r8Rj)(p9aZ+g!0JQOVp-Z@qSH*=a2c zS;jfERwY(V=~gSvbakRhx3E}aOIuaeV$<#kt>b5BarJS2%4oF6vvoEdY-l})c)GX- z*i673K`hIcC>JaQ6*K_ZV*<b|-)J$cT^`FyRhkMYaDrcAuQC;O0E%9jG1z^aUjo7? z;noD-uFPa^S5V7%JCmY1mn)^H&Sss%Y$|i9@O0W7e_Gg?cb6{^l@<Ku1kIBEp#z@U z_Nu{iKz*-@VUQoV)x&gzR|%39tWrH<_{_a(7lo`!^aa0^w67{0x+*XRov2D=lR&8| zt052@nL%4~r#cWM-pbOI*--_8ts?g)x+l`Lus;YG#h54~uR3OdHJ?m1(;KS1Nhj27 z?t4|YK#+hR@Gg8ID+<P;)=ch3bW6AnF06t&pM6U$Grc;IufA&fRFzOU_l%^+(yHh| z`schUQne_c>I`w{Rq-09wtAH)4~7s`_KiZ+djRGGuljtAq1P~+Cmu(shBZw<$$4eu zLL_C)R9Was4Lx0Xj%mNv^frJ{N|&#Y9c1`m!JAob)tFQuCOOjX9CbUz4b^aX5i8CZ zm99~fYlb5-7?2FJu@-iPF>p1CT`~tZ7g}6ncA;p`Sl5)b>lB14;RsA5wNWRCPSdr7 zImE2SPXxf}2cYf@a#Cwr(kTT*B1*3*PtJLUjfOh&k1MfO>&7VZ&sVdy7GYOtbteOO zPohW?^vxQ}Zw_6pSp(AVv0f%Rrju&=Rz@w?(m`NfO4GLiq#{gK6-u9zk)MntK5j?H zq;rNUnrMw^<g<TT>k75F-47;XAWEh=1#Xz-!mhPY+}5mJ%V{n`KInDgHf=mb+|u3( zK@EMt1CWav8lsRM%gyoBB!o)K!$81`CKu-kcGnGtPNB(`0INu!4|G$L6RL*P$0KVu zLxv1OoQ|rLx!bl3eM2$!C4MZMq@POd3?xMZky#k`(8I7GUE`w&C2IZnWKN$mi%_(g zCsGxi0k#gZ#qbjpY@?H%5jNt{aJiY_CywDEpr6t<>O8YTVF3aL$tc7)*Vq%n5609- ze7G<zmdEqa8Jwht{l_fDlXg04^os@3Bi9KNz()|Sh`UW^J+H=?mN=`;WGnb}scyBI zA{a?Vfx^*9d%>X+BonGIpDmq6v3RxFT$AYw3ny8-*K(Kw7q7f-g$%1=L8&cYwsd@j zX64ni-vGR0)tv-af+Tuhs{PQlD_rwsusA;bX5@VdjQQmZ6}zQ`PqXg)k|E0a<kjUb z<8zcsktL-;6(lV)#Og8aF^xD89}jw3m+FKUhpQH&#DYR44m%x*G?w02XWp1!r7jb5 z{i^j~Its9R^$X?=BZU+ch~>7(^k!@jWmpduoe5Hz)X-MCxQ;~_7Pe$?)P;j(pI#@p zz&<2wBUp+0^y*<7`Qd<b%}x7WDnVs<Sg6ow*84QnG%dS`6wc-%V<_m6`-B29f;gAP z+xv~lSQ=+tjv|iqMazYi(_o_>jUa_dPc76~@)ne_h_V5eMpD-W+1Jr~vDi>c<yFc` z=DFuH(vz;3=~)p7kxrRpOw&Bj!+7i><=Pv-eBDAI>k+Z=yd9sP-BVK;sdBDP_Peg) zrT366a@^Dvil+D)a;#G%iYm0D&=)ceG*e3FfQup?WkS0O11IWnf8J8ej^chejM{ji znKpH%rhLBjm~AaXUS2saQHsGm(c)NV5bDEcj69+Y>p(AZLh?1T!0Q+_de+Q|s`_j$ z>!~gf+7pn*eCX&SPQSt2X#{eyBGDSD(w(M-2W;6upJ)U}5eK^xQOh<HT%{+}xWZ_i zGtIX>_uZ}lcflh-2-b0gs4G8ap9Ib~)&p0zAeZc<E3i~6qCy(~#zp=%<2ntMaX;R} zXiCy+ERT0}Wa2BUjJw(U?U9vQ%et1kv(*x1M7UG-usw{_arSyRW<Y%0(+p$G^0U@F z&6efla#twJGv;(zTEXZGP+(lC1_qSNUVIx};6LipA1v_-woQMh#>nR{wot801lc&f zrYTi1duvzl0X)-AR=1^<4uZ*MqCJeALFgsRm+V+bzlw-3uvK?!g-|ez(*g<veI#tL zEN~4JLnjo8O{y;)$ht*9l0)f<l^WJd%C<2UgB~F-szv41(XLn+PR<s)VDbw$EJr?l zLX-k_6`pnGfiflcQX`)qD&k!YG$J?`4}^ug5!*xs9tfrf87vPa{i(k#AA;SZKP@;l zN?0r>*(HcgVAtV0XXFM9+*J`TrY_PMvJwVZ5Daa?)LivenvuS3RVJHsP8t2+5vuj- z3>5?H6S`KPjjEwgD>7qVR;l7F8#3jmV4WxS)nJlL@kTIZze!-T!-7~8%VNJ(6w4aw zZ7}xqGm@jDZh&C0f-I~N#t9E;bs1<UQKx{l%ZsRETiug6-x(gESt=2%)UaqhUXCj) zipKU$rbRbuzChEY!R-Q#2g6-4$Rw86i)RDiJ2(^&N-o0qQ33!*G7`wr;H@H}qe!&^ z2vTeSxe~3=K(S#;V7Mr&!E}g(%PFm^+8k&_ouQhfwmdX|ASD+Y-SEhTR+2LjnN9(| zK-i>?3|t=GjTROO*kGqwTfuXU?j%kzl16t1WaBkJplPY7r4UY1L4A#=-^Z)epo;in zl}9mmV`*ziH6RnC43H-Bb+R=E7>(~GpLf`BTKm{M!gdh#3f|G<2Bz_oQ0i&nQuwed z3UFOTz+_b+Y6Ocgs(XX|ssNW>BgO*Nt{&bbKGI8D)bTOtAnLNwP#IPlHgqY6KFwmh zf)dCKxfcp_hyG*HlC4QpnRG(cTX<OmgI&K7Y@oB)7kr1jIvi|dnMvTlq}3iuox~<u z0VS@uLPuONMMqrWe88fsEz!vtHsWel$cHNmyKxUQ7{_G+zihDU9e@@K3YH_rz<$Ai zqp9gyRI5yLVX){@Csmb0ZSH#wqO%#6aRD^|c_K}3qfZqUrmfF8m9jw{sPy>(O#tp% zOKeQ<5jV@k<*8GqGp30HPbiI8*I2%IHUcZ~364a8umTIc3QRE@&CGC&WP8hLWC8hH z6>F0ozE8{10Q&BxVil<9hgRalb)MiYAQ=rLvdko<^1Ue;+Grx;2|3_g?TslqczZJj zs6lk84W^m)kF(#wfohEz9|Qz}o)rKbF;db@YP7G42o!`eqcS@$42SrojWWnM@04BP z98nFd4Fs*~T_$x<H56r@YClAk19vuNcvg7=TO!zppt(#g@+<gpC5^1mWO)VrXdJWF z5uVXFLFv$M2wREzAA1cH9J~k#QAoj55fp`o05FK#MTnW8q@OIPR@Q|nks=rwb`psT z{D5I{6tW0UELf+3%gZO4AMFQ}+)7(o?Rg!YDa&WioK-$s3*~hJ5(fgY>V0}mhJNGp z8*{M|v`f<t&c0z~aX!~3uRQUZXn<HvB!r+MtCxQu&x0Zo{DgvQnsOJm1ngSg;fYOl z86k~B&W>?XH|YT^KmCdftGZGQeZUiPiu_KxcCkeOQZ-WjNGn(7)ulWMFcx&eGFm?E zTPhfsMEP(cK}I8GngQB_4u>ccApgov5{Ai-d@Pb|PjC~2#%qQ+4tYy<+iAIJGNA~c zWI&PAlrkIX>4aS(suJ2K#|(oE+%!Q!Y=&;{MU$Zf*hGT;z!A^2&-%)=U_H&@4T+ru zAjSQp4|r&gnW|P@)+8PV;Gh{kM_VIi=#UN3ShKt*>(98$HzI?@*PwL5L?y$vaB0E3 zA1e;BwJ9A;VTU46V4bEyTau)cHs$<UexsCSvl%V$tCA?Njz`3p9uiN=vFPy~aTe`P z4%58JfM)=a$QU7E04lK`(+;_XwuzqycMplZ65<}6riuB&Fi_eBG2+qMg^m8gHnNb- zJOO(>(XE^8g4O-$Wz!AGpaF3eZj5f^KSLW*poJ^qDWN~Wy|BDh7anR?Feyr{_6m~Y zjuXVh33e43+bK|ZfNJSKXyZC?b-Wy>uv2qR18NwTIs;s-_I0T#N|x7%<@*%F0LnN- zFNsr2hiWt6o7y|G#$1{jJuLUl$*hMSqFWQdqxm%<xRxVpFv?FeQ9tonvjNhPgh6F1 z1X)B8Czda4atdhXQtyctA@7Mawu$$|?eKcSdjUbP0<gaTkuZuUeiid?&R|(7H%~M& ze0dZ+mv!+EE^lk%6S@b9+2ue~3vsGX(7q;q7J%?%`HCjoXJ5#IV_!DmelQS#;}kv$ z0cxNUWDi4|9L`WiP}{Pa1Q<BBA(K;M!~*z@U4~AFV}gJ|{YSd;jhibc)e0LVVNC5a zVfYWGWe-UP?AqApwgXweWO$qwOU8y$uEoF2It=`$5oskshOU{d82d;XI)|5G@h8Mv zslxh|D58mUnvA1?ZpLV5L-Qkc{>FtWUSSYLDqCpQyoPXSMmwpLauN`}9;qlNOj#hi z7!yc7q>^ph8tnV#UO{L-qI2ZN*e9UDr-?LxxryXA@{5$9DoZt!lxc$wab!HDaqEhB zM(`mz$&qDiBx7cufs4Mk57Pz8+<t_fE!jy1X*|_j){boSLdI`iUtuSHIO8(JsTz|( z#^m$lRTw5KkJ&!^ZICnj#1A1|_klaXw@HXFkf_;bm%fe&CGA$}C=053KJIltPS`)_ z?K2rP50naKA{{eRO}ivNWkT&wgb$M{%to<}pr<S)(w8>go#-0->Zbu$)0IydvL<ZE zgw6mUr%8_oBw?s3WjpvV+lc>^VVs<x9d$WFg#Ik_0oCQd=}>{|%Y|^0l@HY^WKSiw zvU-}!gqlq*9klPOL*JzNOiQ)mqgXT3vgfv}Ssigtwq?x<={_{euX<CZyvIjnmMFWW zG}s61Z1Mj>8=nL&{N=hnBQaUkfRlt)7+MgCZiMtVfn#}MwQMLq4b3y-J>~PY=in)B zy#6XIg%S_9U=QIkM7r7nO9&EbqHThD8nJlM8WBjBB7D84F>9}R37^J;W5c>kD}Nd@ zz4ZLFk>{okdCvmb_0L#9%pGhQyxoyi0W`ZD+87lwzUHLP#(x$p+TJs47{-JggwJgM zh<UT0;f@TwXUE741%({2F8BJu;A6D$o^voCNKa~yBEHn%bQ~B53S!<If2N2#>=+9@ z;u0JPhv%)lgFqWp4g$H$@^QNd2vMq`&H(dDP#r1AX+bjTNqae9og_-wZkU0;2Ye-N zbzO8kVQo1GT|XU28lu7?-VVCq(3a5y;g|=5V5-=uwWV=j;lg%YFJ%X#xQD`XfVn5E z@&Ih$U}E_AfrKV_`2qYH2eYUxD8Yut0YU0qDSZXEeY(4Q`70Qtro^Xs%U_}YF8>*4 zFRKSAwtP#=-_gVCpjZ``uK;t~i0VV+-04?_rIKo2!3)2%d_@qdE4?HJrhWSR9^#BU zxw=331l|s@lvS46!}k}ehXe9jH%`Ao36PtF*C!9)zJa-`iU7z#&pZ9k!RarD-q|nN z+_I35>g;!eQ@7pr>~|;8>2I-=CW|?3$f>Ub9>^WfzJ@<Uz+GV<zeo?@hZ>|g_p?lo z8Ogff@-&ELChQHv7E}K8*H#JWEiqW=v)ycSc%6OSk6S&IS7naaU02ecMJqVB#M#%_ zdW=6pwF%}J5cAOGG<7H;!enYv(N`6^%A!kEhuc9CpPc+W9GUPW7*B0nvMXPMYIxzk zclIZisul_33^h~tB`al+RIW2pOcuT%+c-cOT|>u|i3J7*7E19Q;m(<`A-^>(?6wQ6 zp9;>p?<1!F{>PvF<R^vCKf?2XOfHm@4&x0*kEGCy@B7{9be!D(<P!vW65MNt5RZ)R zv4ipxepzVYaYza{D2MAJxdb2GN4099F5QpE6uw||-uFNM^s~<jpZ>J)*<bsg|M>o= zpa0dTpMU!4M<v9wF%|*V&>;7H^dj781gRN{$mjV#qZQeXwYX<JPtDIe!yp>m1IPb6 ze$Tdypc7(V2gCcm188_j|7TOJb()F1f!+~k;LimeCHE5Gl2*tX(h2XOj;wET-%kb~ zm3PaJ*Ddtfy-z=amH_$2YtF}f$25FC{bY<zHu@VM%|Tnb|Mp39tMJqHb$ap<gOokT zTCF?x{hz|j@X>juIEdgJWt@}04;)FHIO2$sd+?SdaV+n7lDIb5f?0-F@x<u@w#&oY zhG<3{k)9`t>sbucTQS8Uz21Z<j;l9#;+)q9k*yPGi0IK|EGS&bIifh%ju_RlX?;dg z1!;XKwD$oB8=9+dzOxr9y$L~_^$tSkbqsNg`gcbV2WX^0qS(|cDdO0h@BjlqhPGuC z-ix~O8iF{MMy?|0?w0&;IMN<~6lf@|>EU?SA`D&ZXhC`PIYFQ4{V%14lMRi-`x<6A z1araf4Djj3KHe(S&<F2_77p4g#c6Z60V|xeRHE}9N@Q7*ql6QtjXv&HflE2zXfE7H z?~oIYCLOcpvPT8`;$c9H5H+rK*KX;D(iT`Kh`?Z#<SJI67V}WqO;R|`H);818~ZD$ z`(d!j31_wjKmTE}!om1;J5o4W_lx&P31<`nw_$|S&_*+MjBvA*5Dtsxay~f43BmN% zdOJEeMi+L<ZQ0=T#=vGMpbA|fo3X)}ec;Yw{&V7{Y;cb2?{;)>ZaxxH&h(S&%1%TD zdP+E;Sr@X?x1@usYWn*Rv2p+jUe5&wpvwBG$$v{aIC<I(m($1Si2&I*rG!KE;=w_V z5sqkZR`Z7>NlFI?-o_%qeKAfTgJXv>CNr!{85vv=Q;>ijT8~(rHu#s4lnst^jt$P8 zrM*#Y<v7(va*pe2Y~&dZ4l*t-$Z2vES$26G`}wT1smSQyihyO#GQ_|U9o_3l;rM}( z!r5z(h4zXXAfq)aoL=d+q;N$PaAY_uDk7y6;&NHl6xe!L#)t$Bcof{87LH$k*sO3E zvP^B8PVh^me5X{xzhabd7<TL;Ir|o{?veKCWsGpAU)_iiF6IZfB!oNt$`QiFD?Yf5 zcUdvQaow>CiCTZaqYG?s5AfX6830HZ$lxBNbaSaX<!?;r?;Q~wR0<w(ehcB5Mr$BB z>53l!7o0XCqLDvB^uYv&hfMqO;HJxX;K*H|fm<tJ86lj9&mQXsB>;=~J&?eKcgO(; zHJa(aIDalsz~Rq<8u2O$IN&&OzoD?+H3eJ)<Q{nb>;>S9;F*{wAnm^c7C7)R=-9wV zb)<8Z7@#A~`-UWN$Z~~btvKLjJ@jl=EXM#xvPu3n0YHUqPf@1gU(<*p0XVmvGOO4T zE1iSUtuBMntx(U$x4Ig~{C4bTyJKeV#^;FN_7?(xnX3Wt3L8dQ@pANUPPO?!$ltUD zO_2e&=YHEwj)E>GRG#^b#dqrsiQh&<umEPQncrBSZbbZs47$Mk2FQC8-nZyH?OWrR zeShk?HhwvLVSW_^jMefw4mhA=P^K+(A@3pu94NdL!EGr}Xdg=P3z5DB100|!Y~kGO z?it`{b12^~62Sc^HJ{H%RBckgp>{e3I7S1Tvhc88B!I)s$SG81^SzO!bvf$N`rGrr zIVZ}>+Lu-?fu{g&JTR7ipDEz@3j8dvZx{pIF}R#IysF|R3~)#x{Zxq5ngMS4M=`*0 zgaHn3$EX0j?>OMJk=nbC0d95)0i6BBaaj<;!DjOBp8qW!O_`qLXxp;LAy>Ku1)L0c z_v7ms;Fy}IM7r{F{<mXLDe=Bt&;N$?cNGDg6E`~|fJ2b1_}`4I>I(Wdb;_HwzsXa@ zH-i|wG54Fa^PQeizY%O?%x|%X-<E$QPB-}TqJ0AzJVv=fLEmM+yuv1S>7u>@DR%K$ zza976IiInf0NdPk%x}C&2IuTuWPbaCRn0uw2-_U@8}GWO)eczJxZlX8v6EKqHn_fy z`;DlMi_~w%&z9d!hcf8+*)UY|?+TnDS8#j@`y0djhU9Onn;*)CT(`sBalg6QC$vR@ z8u$WGF>%TWLSARncFa{|p{cp5w1M+A=eghbhMbiQ2ty1&7SztCQh_s7$=JQh+c3YK zy+E(#UQ(cmHoz552f_TtI|M#fUWO)c#hUkx(S*-{Dn!L9I>FvdHTKi>c13sDWwdW< z#y4YqgUJ$NH%%{M;N0G|Hza*ihbi0{7e9{gD;eK*h!Qdf!Clb3@hIYx-Z|Zy9HyYD z=sUtxaTBI4d3B7K1UPDIf*tLmq0B<{@~V>wT)B+z4a;j-c&tF1OW58tS_>)L+xf1a zv3=Y%<277w_I^hFmT|r1{YY1Ey}2K~E!P|Gn@J0}+rA^RH(Ow#dfRxoTG0sJUc>YT z^P0kaZbtOhGorWNn&^!XJ9UwFQ=&HrY!w=5FzTDIyfNb2$Ha(~fR*o@<PF+zZfp(q z9h1Ca-d@S^mW?CF@rKS_!dHJsByS7oN_E56v%INQ3Ir<K#9qtb_r>z2W>9n(QTGo0 zxQ65n$$UA-TZADEKBNEn%>ZmbB+}TnAu3K*xebap0HM-NDc+=B8K>J#8Qu`5GBCyP z<_6;I1`Kcg#C8vK_*tIeExd%_4YN24?r_9zo=YUJ`RhSr{&o>0Nk0^Jw*VTZ>&V^U zfMWlW1=x|nV&ljzhHJRp^b3^g50BdI*g>_M%x)}p<zS!)TElV6hl-u!cs;S3u~!fZ zsDb)!ncdpG?<=#LChwh4yJ19q@0i`d*zv>XsNHCdY#A$~Wf1kxcINai%cK?P4{V*- zyi8#QI{m>=yQOMvM*w{JN@6#RCl(OM4E0w*%7J5bV-@;PNZmrh?THJnFwHsKoYf6@ z@Rp=*SaYztiNW5h5HjueWX4B6`yarz#PfDFubY0ll@hyUzIY-Nh%$ih>^f?<)J>I` z_m_>ba#|5!cdT$Sy6-AxH;J`utis#|8$5B`9rRlPziW3lRB;!$-H@hkU$_`dgF~$N zv@G2^^V<OLz~03n-HhtCm$O$$@HTWOSchyxv^Tsx(VKgXz{f<EfyTB{dko~3!FwZn z%U&Vp!^&EVRTXJr?QWqTSv_{4=-yDvEnZGd=)QzK2eu=EkmK|UakJfo@{Q31LLxRA z*Tj^;cePoGfys6rg4;nvT#2xHRce+H%I|}@#NKy8_{J6u_}&m4Oiyk7;Q1X!e8%;5 zz;N6c%Wq2d)(dbj8QB{^-RsESvdNGqd&~ThTTpJOwKmD#OqY<O>m8E4X?-n7Q8{ms zyl1jE=%;uoMZb`4QoZFCLCz83z>$972r-pLS?x-yH(dRjRBr^Ais=nGRs$o(7=9C~ zH<srsx!x>j&C!$~^F)<P0Ux`uz2(2)I<`0Hxg6Qs2G<+n@f~u#<-|68ZG91&h#0}6 zFmN`#ax1Dg>|V5xY;1Fi{Z|ZRGAJF_QoY&kAsA%?5d^bk%VO!->Ujy%o4#0Ewo+ZW zhR~tn-EzI@3Eu_P+p6hqK=oEds%u{m<UH`bAyLtb*vyh+dQ(eX#q_3_Y8dh_^1QJe z02p7-^rnyz7~RZ^R#;QV8_k=mtfqgE08OOEp8(Mqh1_C;;?3Uf0>fJohBv^^_dxK5 zFsNU~@5X!9?~>n5_xtYo-IB?n)|C2H{BD`5bSb-=+^Y2-GPxT>Ky^dLa2&p4YPTr% zQ)V}@7(qR0#L$gY;kKmk|Ez9P{|CzI#^%g-OzH-2wboV-9vXtrbrky(T=r<oQV^*c zg5R0hATl?o_NclUtDEB3Zba(lJ8kKMAaw(pL?wjH?JZc{kf1`t-Cr{Nev!IqDBP0M zjit_6orE0c)LiOb!|BH6Y2$QTTd!wdOB`~<8LVy08L3;Jh_MYyH|=M}Z<?ocQ}1P* zZa1QI(=bm7-N@$oDBcC1n@zS&J~zGb-4VKF!D2ULbW20n4b*X<iDO(_#pPx(?imh} zmjC=%-Kxn&S~rd9HLaUU)3>K}V|PB`9Ev02cJH3n&3)BoY|jmN-HtKKjFnB9G<-%R zZC1>JXI2$y=*&iW#p`B2$?>{jsK0w!H+b2C*R#4|NL@kdrk!4Jx`h)3;WUESUlY1f z$oSmIW^`@=oWUuxX^zc}3sz)q7H^@gP!IXjON4}2_{HT!Zn4)4dSmD&?u5rplvax3 z2AY5q3*-cmLjt80hrHvK@+B;8e8V{sH~T#bgR!{5h%8$pja2bhbZ(s8pl~DZkSC(k zygh~68bRm@2ZynA5f0f>#qI6yTfBz8t*`CpH{)+(FF65&y0fEit9HPcd0_UuP4YHf z241YGeGPpZU7ymox!AQPoAv1M*U-1+*3{+|^lj*AJXotQloH(VgQIWDK}^@vx8Xv+ z8FyO-qTCsG8$!eJDvG(y(RJmS+ZYKbCHyru9xSBYKWOu}BEN;Kr<?9j@E;Ik9r4G5 zZpPlW2laQ3y)8(|+Xy#)BKo^K<!%#m793^JG<`tSZO}BP%xzF@g;N^tu9@4!xb~qC zx0$v%zA<r|a}TV&VPbA$SYAuqroS%XnA`NQl)O#ZweRg_)NQzQE@f_eEpMBs2F*kA zet6ps%(aEv->BOpyv2b=@om}LvKy}m+_H+yi}N}Hx9s|yx}8<!oO;IC_GUb8juJ78 zLSY*ny6Ps88*0a$^SJE+4j7M{Wu(#&w2pXW1+v`T@VKp=46dyliCgLsxG{|z6CiKf zUCQD{qg~75hW?Vi!lsFf>xnI8ITE+bRee($H$7Nkz&hkU_eLacsX?~(k8cvWxsBOt z9=FG6yt^ALZcm6FrggHFlwx!_hnqDaf8^FE+$g}0J8SpCHHDkq<!&h4cJYf6_t)lc r6~amO^=hN62%Xt6uP|iQ6MA*W+--K}50Jf$A#w}$wyaaHWpDdGH-W-; literal 79740 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 G<Ngo4%qZOe diff --git a/libs/pycountry/locales/sq/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/sq/LC_MESSAGES/iso639-5.mo index 0bceb3c946a6ba2e4ebe5915733af07f208d1b39..be035d481ab56775cf8a30697ba592c6ec7126f9 100644 GIT binary patch literal 3810 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 delta 66 xcmaDP`<cn&o)F7a1|VPrVi_P-0b*t#)&XJ=umEC9prj>`2C0F8&HFg5837Xz28aLv diff --git a/libs/pycountry/locales/sr/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/sr/LC_MESSAGES/iso3166-2.mo index 2c3982044f35292a420b6ab22f97828738f7a8c4..0d8bf76293496f9f09ddb67fd479fdfaf4c8d1cd 100644 GIT binary patch literal 144341 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 literal 145300 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 J9CS3p*gux8->&^ERCJQSWi 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 Qpb{bAEd1UB{9y0@0M&-c2><{9 diff --git a/libs/pycountry/locales/sr/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/sr/LC_MESSAGES/iso639-5.mo index 5f58881eb54e2f5f364bc1b6d22c3cb4c9f0c057..a0d81f85484a93ce4982bcbf6e67b7e6ba7012f5 100644 GIT binary patch literal 6247 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 delta 1183 zcmY+@O-PhM7{Kw-blop^bw9Oqchy|Kwh*-Pkg$aXNhK5!MHgE&B*h}7q{C7vL6^jb zBKkOl5OfIAgpvZOquo4Ibcj5Z5E|5>Iz|8IeP0hfF#DUCcix%jota&2T}<Xbg^F$& zVjHE3GErbmC$1IpLww$3Obl1B4F6yRJw>(&tf1Y7I_@CqxEuy?6vH^-^xwf6+K;i) zn7n!GJoth-@Ry^v*cxCGs1tW!2zyWyIE`_<=sdrP<+L9;zCcZ2$!UK?eQyml!2*}A zmuFHcTj)rmF0>bucmj3cxZ@4f3GSgT^b|GWH>mHuLmj`4`u<-m#YBmnXa@Cpm*X)E zu)Z0f@|A5L!>zPWdF+I)U^VRrSdTBU5m&GYy<YoyJL>ZzPWuw-2i?XloWt$-8`*M` z_Sx%XF|V2SQ_0{Y>cBbF{uNAPf#0?fHNhU#1xB$Br%)4}M}2P@Yw@SkA7vY~zYTT% zqu7jBOWFS{l_zxQ1mB&3{(yZ+GN}EBQ5PCQO=t>r!soaf-=kit2nXJZJ5k>|gPQ21 z(|(9-v>`7m%JuxYZ`NdbmMIEj3@2gTYA|eq(LY0iqT8>b=ct!Yzfwb!BX?_e8c-MI zl&lM@N5!A!zaU@h$V?v<j>QVST-+J!uecfY@2Fp)p<lfb`lTBYrJ`r57f>TZ;es1C zrG=u=EW@tqqS4;LoXopw<eTew>4o!S{i()*-r>Qa@g|umxh^^PK3Q}(iOZ9flb&|D z?`e=#PgttFeKPG$%aS)zJUlYq-zRZjy&Up|<eG24eDI~7wfK{TaxPFQGl7%@gKqf| zn3C7QI_W4|m%HVcr6Y7eW<vwg8P3V8a8`CiYGgXHAS2N|vK+0GmRPNvjiqHamK1+n MWFfvwx+|*x0r`uB!vFvP diff --git a/libs/pycountry/locales/sr@latin/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/sr@latin/LC_MESSAGES/iso3166-2.mo index 8709edcdc5fff2cc92f6221b91ceec604ff31198..2531403a81bf43e4145f8e3e3c354672ea2d776b 100644 GIT binary patch literal 121630 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 literal 122426 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 diff --git a/libs/pycountry/locales/sr@latin/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/sr@latin/LC_MESSAGES/iso639-5.mo index 8ac6a0fdf5f8d2800006f5caf54316d6dbdca218..d486942836f412bce4e6484b1f61d96a195f69c0 100644 GIT binary patch literal 5040 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 delta 1212 zcmY+@Ur19?90%|-+os!e-recU(luK;r}k7*1WEJ{qCy{v$iP_JtfkwK=4uk`!BHSY z(2qc96%qu!l#ma;L=gFq(n}8!5mG@6!X841UW&foyHn7C-~HTs?z!ju&YwFUdEHuE zHSM<*%63E>qGVHQFI=m^1?A%gr2_C1G~iFz1YP#3LAVjmJ0RN~gKQUvjW7rOu%zo} zVF#Wc!B(Y;YDK^J0@?6~*6pwws32s=yP*jOArm+UTi|8={wDO{`Jr|ZGJ$3N{2ubV zHOK^QPL5YZr?}aSiY~~3_QNgkG-Shqb_TM8JCFm-LnizJ^1HW??Y}{O{~I>IU~M(g zKFIe6wI`t$<Ev5JtYX<GAv-+bs%Cxxa-b`a^)s*;-h&))0kXpt$izNC&iFg@LYrHu zZP0+5U_WI25M)1RVUZn7;)Z*8O?w}*ei5?cSK3v`MAjiYs`XT#1CRsvKz_Fea;uK& z`Vn29fgGm@Ie}RZ)_*H*p6G^ebi>b(Ghf&Bj{53A&5#L2AqN_OJWPX-?I$1(m73P? z??NW}7&5_U5DTq<ReaokoHuK~II|Ff4Y3nera&PF#h)RF=ti(`a2`G;&k{y(uesb2 z1kV$8!CHkV#82~IVN#u}Ng%MAR^iNWW~^V4`^Dd}9l_F7#kz9Fe+&1KGv;!#^dWG- zRUM)i!O|mXXS+QYOT}fu*&$z@ry4FzOeRC!qp@^qybzTKwbvzHcSxSsMaAjbC&R9t zQg%h8;_^$IJ0Z8+U9#+Ma-_3`WI|dzopRh`%CzUOyz_*f_SV~L0=d}I+*m4fF*%ir zr&K<<G?$CLydhV;Bl64Zmx0ET*o^}+Y(%7N?2?MnFTK97Go8(x&yI`uGSXy*<%nrY f!SqYnY<7%i^T~`<%ri3N4;oXM*jP57`8UEJQbUZ? diff --git a/libs/pycountry/locales/sv/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/sv/LC_MESSAGES/iso3166-2.mo index fedbcc92468fffea0f82c2825a7ed1986b176e46..f5e228709ce1c6e11741ae39f188a9f1ec405f12 100644 GIT binary patch literal 158999 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≠R!*(=-2K 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�Y@x^9M&`Xw07p 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 T<_ALV#Z-pV?4u)YUA_Mgbl#bX literal 164336 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 QlkqSTcKzY8(7)dQ1Js&zpa1{> diff --git a/libs/pycountry/locales/ta/LC_MESSAGES/iso15924.mo b/libs/pycountry/locales/ta/LC_MESSAGES/iso15924.mo new file mode 100644 index 0000000000000000000000000000000000000000..d71800501176f0d8cc5f83b58b8fb5d1178f0c0d GIT binary patch literal 15455 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 KofwJJ!T$j^$gpJq literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/ta/LC_MESSAGES/iso3166-1.mo b/libs/pycountry/locales/ta/LC_MESSAGES/iso3166-1.mo index d4d82b659097880a541ec289dd6e1f7fede49d76..0e98c7f3bddb4e49c480574d467eeff91a1b56de 100644 GIT binary patch literal 35476 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 delta 10795 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 W4{S>0BA?!r$}$O+p{C^SF8>Rf?T{n@ diff --git a/libs/pycountry/locales/ta/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/ta/LC_MESSAGES/iso3166-2.mo new file mode 100644 index 0000000000000000000000000000000000000000..c27fdce88fb69a446bf23fde52ea88cf18918bba GIT binary patch literal 372 zcmYL^u};G<5Qd9j%E-*%feo&qAXUYPq0k^I5mHqF2^Mrs4%aBPBm08rgYbGh3zwz+ zrB6QF|M~a*9UuJ;L<ho&a4H-M=R&WEpyl#f*50$zBKR+=80Iy+Qi#?&t!(rkSEKP5 zE|Vp-J}~6b*c$FS6QT54t(n`X(==ieaahyJq8s{PQt5=s*A#&XH~Xzrv7?wQ3Ru#& z?PFkuOj^BV(<S5u%%<wG(E0rAy?D-&CyWebKo=WiAGDfw>^I1^!lv0OLym&9*J5<0 zLqkwXo>tB~+MQ{|nB?<3+fOzcUL^P4F*$jD+e$vu52tN|*4?OTjUf`>zLXCz+57r$ Sd{ThS$!OLYttKnW$>1M~0B&Fa literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/ta/LC_MESSAGES/iso3166-3.mo b/libs/pycountry/locales/ta/LC_MESSAGES/iso3166-3.mo index 79004b039afa92e2ac2b16db97191c94ca66b688..257950a8c60d9b007781e5bd694a4125208377bb 100644 GIT binary patch delta 1337 zcmajdPiPcZ9Ki9Hm_M7@{L|KGYGNimNK&1hZ2o9mO%Fm+TSXK_4Or-yjPA;2XW5x3 zC=wJgmJ%%t=^-8j@z98wEsZy!QW2^MiXftbG8ds5dTybYet)yuVlVn&=JVd0nfHFb z-<!J~e|Ap2T2VEtXgXJ$Top>K7c05Z?%^7|kKOnhKf|VFrT0^4GCqK{IE^dt5^8uA zKgI=Y!8<7HJjYLzno`TEqK;aNO+46)jrb+XhX=79C(540PR7%?9OrQ*-ohGuT%Lc1 zI^(w}8^)`ZT8#rJ^Sdz4{>q`#%fu;^%mb7RUSLQy{=iYj4@qwicEyxBjVJLN{0lGQ zXkF>M-*J%f-`IuyltIQ{<39WWFW?gHWq;+xOAqd$e9%t1;s_3*Qywp1g7H(#VReI2 zpQDEpxQLQrC*_kwQaFr9@GRay3B;t#M=*_3t#lsIIe~95gI05Cfd@zdqNa0a{r{T$ zD{Hyr-;nZ4Bd+L3Rw2i$I=JM_<rqm;aS~Bw*(Pcf^efIlDG7q$6ctlcTk(&ncCL3@ zjKN3c2{~tCi<)H2k3{+lm2WCLMkkLtZq_=Uu{P*kd!4b2mCd+bw?1Nz+XXA@e_MTZ zPjA1`lQfe3dNP?B=vm)G({@^}XY4CjIX?EBLP`&VYhe(C!R;`(85U>4;K#5y9R@$i zWN}8{YUMI+I$y93PbNG+UGwSIwCCmBlxe0N*R#hHC+x$lWG9@$Q8Qm~j@e_LYi3-> z7<0z$Qm-$$aih^^dY0*5ugMJW&Q21cG2#>^+?1ZnM?-h0cZ*)?4(0UDAw9W8J7|1i z=g20C^FV1IeIU_qjN8Y3qqePL&Y#gz{<+#de;~Hbe_7kyJ{P4>41;+IJ`65~L1{`l zz81U7Hx+ej{I{`|sP}~X)4Cm1@{+GNv}&Y27Y4t`+uOBEgUp|oVn|^q67%y>sfw)4 zcs6=48wQKfvn$b%?{E9RM&ar4O>B^@Z*5lpt}B7b>SyBYy|}+VU%?x{H4JP2i*wN5 z)i~4k-W`@25Bb|-E&7HJg|gIWwiLtS*(luaBo2w-XCn5sx~}H$-${d?pjZz5a#Qy| DcY<Wk delta 1137 zcmZwFOGs2v7{Ku}<7=GpF{zoa(a~C@&WtmT)*wA35((P`S}83WZ74x!Vji|B%&5p9 zB@PooE`nNQi#wWyR%8mgh#pYXrXcPvqGb!ARsVBm3VIy4_jexm-0!>Jxf}Isb>p8) zvXg>V$5q2sW)h+i3(VYTb6Ab@sODc|6K<e-z9CD97Tk+@7{L-egI2tXWthZrypQTV zt5_w(xcHXth}>);idm?~BJ`o!*og($mvIp58AosvUdPRN2XpapW_|^ojNhRO_#G?I zk&~X^fi~icBXn9>7($i#4ZK7ZX0e}f3!ileC-EG9!sFO)5n>9TpxSpJUx)x6!|j;N zjF+*O@djSOgOsHkKVUEMg~OKK5Y2cCcQe118Jqch594MG;{fi#7dVQR!t|GoVKd`t z?82vb0Zo)sC3X=9@EKNO1?3(O(P^clHr_-&-1rw%=_!EG$ip~WHBkRTsp`<w`TlCE z^y>K3k!;~o|AuPh_`7l5f?^rfvLkt@!l!=>CI6J5O2&DTyr|_;XU5SP89Oj*Vcq=I zEI;NXOS}QMx83daJ6nAn-axar-7hC{ODpzAJ-wd8!C2x%Xe=0Z?h2j^51)#}{c<I@ z!Pz&M2*(rd5uZ2gjt56OM}}kZm?vS(dWIsSvNmtH>ZrRr6b?m$@kq48*|RS=7#eZ< zJU*YNO}@&jF)d1$twV0L_^pe&_CVL3>)Mi>x7WzC7Q16nPhHcsl&;Ovaq8L>i^i1d z$kn2Nd}yzfKP)lRlDwT?EhqEKjoy3i32P7cRcl?|lCCYQ=f7B|T{C*>vaZb;FVT$o zStDkOx6i0J+C5{Im`Rm}X-2-Z?QBv}dE%~~I<ISw^wb2)y0*ZqF!u3&m7<E`Dj@oT nsqnOk@X?|!>mM1f+y9BuW^a*ii{0D)UU2;{B_1ZFH}=M#VM-CH diff --git a/libs/pycountry/locales/ta/LC_MESSAGES/iso4217.mo b/libs/pycountry/locales/ta/LC_MESSAGES/iso4217.mo new file mode 100644 index 0000000000000000000000000000000000000000..a3a66cdb5d8fc4b21992d2477ff89b44b9f75779 GIT binary patch literal 14738 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 ID6Z}Q0pIP9w*UYD literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/ta/LC_MESSAGES/iso639-3.mo b/libs/pycountry/locales/ta/LC_MESSAGES/iso639-3.mo index ac05cb8ef99f121a529f670c2b2147335aff31ad..b12c0f0e6460479dc5eea32f08680449ced9de0f 100644 GIT binary patch delta 155653 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 Y{^L|ELEqUAXrSNG0Dr}G{w~Vv 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 B=`{cV delta 155295 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 diff --git a/libs/pycountry/locales/ta/LC_MESSAGES/iso639-5.mo b/libs/pycountry/locales/ta/LC_MESSAGES/iso639-5.mo new file mode 100644 index 0000000000000000000000000000000000000000..39ae6fcb9accd7060c5fd2e22faa3c3f0a49ec26 GIT binary patch literal 11658 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 Z>C%ew=Kri&>kZgbeS=ITmHK~${{R!c2HXGu literal 0 HcmV?d00001 diff --git a/libs/pycountry/locales/th/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/th/LC_MESSAGES/iso3166-2.mo index f04a15e196cdab164ff078447107b2d6aee0e513..b556ec94fb64d6a797f3bee6b38eef995a00a005 100644 GIT binary patch delta 30263 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 QhL#9Ov+1Ye0ab(k2f%i*6aWAK delta 30919 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 diff --git a/libs/pycountry/locales/tr/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/tr/LC_MESSAGES/iso3166-2.mo index 4f56cf185f6dc80f40d2098ee270adfb7c8f2a1b..4cf52fb943889b40c0ae8a25f9878f9ceb82c7c6 100644 GIT binary patch literal 76675 zcmZUb34qOIy!XexlRaBTl%=eNkZtU;lr6My%p5bvY@C^cK?^F0N|J1mB}=kpi597$ zl%ynSk%%Hii%6UI^F8OQ>)!Xd_nFW0+kemVU(T6vyI+^d|4bZXLZP_0s_^etadH0? ziHrMcjI?oaA1#WDD*!)+xWs)1^TQ+Naab7nl;vNc{4Q93$#UW6V}4gb<*Q`5y5%~M zvT+SyNq7q^1-n4$?}UmAn8{Fe(_ub18Wx1(p!_D9Q=s~N9Lhcu%0Aaz1j`}60E@v_ z&3B;c@3(vmmOwrOuY!L=#g$kb7grWu3l-lCs{aJ2zV9⁡yL=<#clll>bDi{4=2H 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 Jof&G({{hjCYXJZN literal 77264 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 Yf!7>5?3zOdU6XTCpn$;eS>V?E56FJztpET3 diff --git a/libs/pycountry/locales/uk/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/uk/LC_MESSAGES/iso3166-2.mo index 640d0a7e7146bf30588fc96c9d48166f0e208938..b0a01825f08428cb68059ee7fe3deed06260f6f6 100644 GIT binary patch delta 105085 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 aGGFXqrI%WsZEPpAm**J0*~>G~`+orV4j-fd delta 112088 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 diff --git a/libs/pycountry/locales/vi/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/vi/LC_MESSAGES/iso3166-2.mo index 097e9a0e17707b287985958be5151bc52632ad95..89ff1505a825a53521e1706f354d874e45facde2 100644 GIT binary patch literal 135199 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 Tzwh0G{Pw?nKNjKF)879N7t0uu literal 135733 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 L{aB1&O?&@8{z{e& diff --git a/libs/pycountry/locales/zh_CN/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/zh_CN/LC_MESSAGES/iso3166-2.mo index 192ddd0fb065a36faa87ca6c8d07cbc58d3eb94e..0f8e8ebb0d6ec91a9bc13b662c3c44e94d6ef8ef 100644 GIT binary patch literal 116542 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 literal 117078 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 diff --git a/libs/pycountry/locales/zh_TW/LC_MESSAGES/iso3166-2.mo b/libs/pycountry/locales/zh_TW/LC_MESSAGES/iso3166-2.mo index 5977793ec8e36ec9b492e4ce7c0202f0d6e0060c..331d34cbbe4e5b7b176877e9e0eb87dc6d0a4b78 100644 GIT binary patch delta 9153 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 F{||dDVd($> delta 9267 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 ZvCK^=iD%YMKDYGgbITVjn9*v{e*yaka_j&A diff --git a/libs/pycountry/tests/test_general.py b/libs/pycountry/tests/test_general.py index 7930c5e1d..7039f1d89 100644 --- a/libs/pycountry/tests/test_general.py +++ b/libs/pycountry/tests/test_general.py @@ -1,28 +1,28 @@ import gettext import os.path import re +from importlib import metadata as _importlib_metadata from unittest.mock import patch -import importlib_metadata import pytest import pycountry import pycountry.db -@pytest.fixture(autouse=True, scope="session") -def logging(): - import logging - - logging.basicConfig(level=logging.DEBUG) +@pytest.fixture +def countries(): + pycountry.countries._clear() + yield pycountry.countries + pycountry.countries._clear() -def test_country_list(): +def test_country_list(countries): assert len(pycountry.countries) == 249 assert isinstance(list(pycountry.countries)[0], pycountry.db.Data) -def test_country_fuzzy_search(): +def test_country_fuzzy_search(countries): results = pycountry.countries.search_fuzzy("England") assert len(results) == 1 assert results[0] == pycountry.countries.get(alpha_2="GB") @@ -63,13 +63,13 @@ def test_country_fuzzy_search(): assert results[0] == pycountry.countries.get(alpha_2="US") -def test_historic_country_fuzzy_search(): +def test_historic_country_fuzzy_search(countries): results = pycountry.historic_countries.search_fuzzy("burma") assert len(results) == 1 assert results[0] == pycountry.historic_countries.get(alpha_4="BUMM") -def test_germany_has_all_attributes(): +def test_germany_has_all_attributes(countries): germany = pycountry.countries.get(alpha_2="DE") assert germany.alpha_2 == "DE" assert germany.alpha_3 == "DEU" @@ -78,15 +78,17 @@ def test_germany_has_all_attributes(): assert germany.official_name == "Federal Republic of Germany" -def test_missing_common_official_use_same(): +def test_missing_common_official(countries): aruba = pycountry.countries.get(alpha_2="AW") assert aruba.alpha_2 == "AW" assert aruba.name == "Aruba" - assert aruba.official_name == "Aruba" - assert aruba.common_name == "Aruba" + with pytest.raises(AttributeError, match="official_name"): + aruba.official_name + with pytest.raises(AttributeError, match="common_name"): + aruba.common_name -def test_missing_common_official_use_different(): +def test_missing_common_official_use_different(countries): vietnam = pycountry.countries.get(alpha_2="VN") assert vietnam.alpha_2 == "VN" assert vietnam.name == "Viet Nam" @@ -94,14 +96,14 @@ def test_missing_common_official_use_different(): assert vietnam.common_name == "Vietnam" -def test_country_missing_attribute(): +def test_country_missing_attribute(countries): germany = pycountry.countries.get(alpha_2="DE") with pytest.raises(AttributeError): _ = germany.foo -def test_subdivisions_directly_accessible(): - assert len(pycountry.subdivisions) == 5127 +def test_subdivisions_directly_accessible(countries): + assert len(pycountry.subdivisions) == 5046 assert isinstance(list(pycountry.subdivisions)[0], pycountry.db.Data) de_st = pycountry.subdivisions.get(code="DE-ST") @@ -179,8 +181,7 @@ def test_locales(): german = gettext.translation( "iso3166-1", pycountry.LOCALES_DIR, languages=["de"] ) - german.install() - assert _("Germany") == "Deutschland" + assert german.gettext("Germany") == "Deutschland" def test_removed_countries(): @@ -192,7 +193,7 @@ def test_removed_countries(): assert ussr.withdrawal_date == "1992-08-30" -def test_repr(): +def test_repr(countries): assert re.match( "Country\\(alpha_2=u?'DE', " "alpha_3=u?'DEU', " @@ -204,7 +205,7 @@ def test_repr(): ) -def test_dict(): +def test_dict(countries): country = pycountry.countries.get(alpha_2="DE") exp = { "alpha_2": "DE", @@ -217,13 +218,13 @@ def test_dict(): assert dict(country) == exp -def test_dir(): +def test_dir(countries): germany = pycountry.countries.get(alpha_2="DE") for n in "alpha_2", "alpha_3", "name", "numeric", "official_name": assert n in dir(germany) -def test_get(): +def test_get(countries): c = pycountry.countries with pytest.raises(TypeError): c.get(alpha_2="DE", alpha_3="DEU") @@ -233,7 +234,7 @@ def test_get(): assert c.get(alpha_2="Foo", default=tracer) is tracer -def test_lookup(): +def test_lookup(countries): c = pycountry.countries g = c.get(alpha_2="DE") assert g == c.get(alpha_2="de") @@ -281,6 +282,10 @@ def test_subdivision_empty_list(): def test_has_version_attribute(): + try: + _importlib_metadata.distribution("pycountry") + except _importlib_metadata.PackageNotFoundError: + pytest.skip("pycountry not installed correctly, you're on your own") assert pycountry.__version__ != "n/a" assert len(pycountry.__version__) >= 5 assert "." in pycountry.__version__ @@ -290,7 +295,7 @@ def test_is_instance_of_language(): assert isinstance(pycountry.languages, pycountry.Languages) -def test_is_instance_of_country(): +def test_is_instance_of_country(countries): united_states = pycountry.countries.get(alpha_2="US") class_name = united_states.__class__.__name__ assert class_name == "Country" @@ -308,8 +313,7 @@ def test_is_instance_of_currency(): assert isinstance(pycountry.currencies, pycountry.Currencies) -def test_add_entry(): - pycountry.countries._clear() +def test_add_entry(countries): assert pycountry.countries.get(alpha_2="XK") is None pycountry.countries.add_entry( @@ -320,8 +324,7 @@ def test_add_entry(): assert isinstance(country, pycountry.countries.data_class) -def test_remove_entry(): - pycountry.countries._clear() +def test_remove_entry(countries): assert pycountry.countries.get(alpha_2="DE") is not None pycountry.countries.remove_entry(alpha_2="DE") @@ -329,7 +332,12 @@ def test_remove_entry(): assert pycountry.countries.get(alpha_2="DE") is None -def test_no_results_lookup_error(): +def test_remove_non_existent_entry(): + with pytest.raises(KeyError, match="not found"): + pycountry.countries.remove_entry(name="Not A Real Country") + + +def test_no_results_lookup_error(countries): try: import importlib_resources # type: ignore except ModuleNotFoundError: @@ -374,16 +382,16 @@ def test_subdivision_partial_match(): assert results[0].name == "Massachusetts" -def non_country_attribute_error(self): - with self.assertRaises(AttributeError): - english = pycountry.languages.get(name="English") - result = english.official_name +def test_non_country_attribute_error(): + english = pycountry.languages.get(name="English") + with pytest.raises(AttributeError): + english.official_name -def country_attribute_error(self): - with self.assertRaises(AttributeError): - canada = pycountry.countries.get(alpha_2="CA") - result = canada.maple_syrup +def test_country_attribute_error(countries): + canada = pycountry.countries.get(alpha_2="CA") + with pytest.raises(AttributeError): + canada.maple_syrup def test_with_accents(): @@ -408,7 +416,9 @@ def test_special_characters(): def test_unicode_characters(): assert pycountry.remove_accents("你好") == "你好" # Chinese characters - assert pycountry.remove_accents("こんにちは") == "こんにちは" # Japanese characters + assert ( + pycountry.remove_accents("こんにちは") == "こんにちは" + ) # Japanese characters def test_subdivision_search_fuzzy_non_existent_subdivision(): @@ -427,10 +437,10 @@ def test_subdivision_match_non(): def test_get_version_with_package_not_found(): - # Mock importlib_metadata.version to raise PackageNotFoundError + # Mock importlib.metadata.version to raise PackageNotFoundError with patch( - "importlib_metadata.version", - side_effect=importlib_metadata.PackageNotFoundError, + "importlib.metadata.version", + side_effect=_importlib_metadata.PackageNotFoundError, ): # Call get_version with a package name that doesn't exist result = pycountry.get_version("non_existent_package") @@ -449,23 +459,10 @@ def test_all_subdivisions_have_name_attribute(): assert all_have_name_attr -def test_remove_countries(): - # Test case 1: Removing an existing entry - kw1 = {"name": "United States"} - try: - pycountry.countries.remove_entry(**kw1) - except KeyError as e: - assert False, f"Unexpected KeyError for 'United States': {e}" - - # Test case 2: Removing a non-existing entry - kw2 = {"name": "Non Existent Country"} - try: - pycountry.countries.remove_entry(**kw2) - except KeyError as e: - assert "not found and cannot be removed" in str( - e - ) # Check the error message - else: - assert ( - False - ), "Expected KeyError for 'Non Existent Country', but no exception was raised" +def test_subdivisions_with_missing_parents(): + result = [ + (i.code, i.parent_code) + for i in pycountry.subdivisions + if i.parent_code and not i.parent + ] + assert result == [] diff --git a/libs/pygments-2.17.2.dist-info/RECORD b/libs/pygments-2.17.2.dist-info/RECORD deleted file mode 100644 index 892198d91..000000000 --- a/libs/pygments-2.17.2.dist-info/RECORD +++ /dev/null @@ -1,330 +0,0 @@ -../../bin/pygmentize,sha256=iP3M-_dI6wQP1Gtg8ZvtFWFDy3x82yIJIrmsdlQpEe0,238 -pygments-2.17.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pygments-2.17.2.dist-info/METADATA,sha256=SzSKqyc7mGVvDuK4xDB80dRx0GlXqOzdEvawDK8I5_I,2594 -pygments-2.17.2.dist-info/RECORD,, -pygments-2.17.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pygments-2.17.2.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 -pygments-2.17.2.dist-info/entry_points.txt,sha256=uUXw-XhMKBEX4pWcCtpuTTnPhL3h7OEE2jWi51VQsa8,53 -pygments-2.17.2.dist-info/licenses/AUTHORS,sha256=cUCMJk6AMKjudR92zZ_3Xw5mWGswskPFQYpU1G8YRDY,10281 -pygments-2.17.2.dist-info/licenses/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331 -pygments/__init__.py,sha256=hOVi3FwWurc1Cj57aJQyr1tCiZ6dVM9842eYXkFPmYk,2959 -pygments/__main__.py,sha256=xVzk7wG94kskOfLT6ORXWRPRZZ0IAavOeRCtGXn2yEM,348 -pygments/cmdline.py,sha256=5BDrKb_cOcvzp0Ps8rr4rFIO8kYb15JDlEiRKpoTwWE,23530 -pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697 -pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938 -pygments/filters/__init__.py,sha256=q8r8GfK3dO021TSHJdpwNwh6RHKbAL7ceCzohavWaN0,40338 -pygments/formatter.py,sha256=Yz01yT1NSQXTF8GvsLxJSmez7ErTVOsxm3M6GVPuH-w,4154 -pygments/formatters/__init__.py,sha256=1gAF21t8FGApDXpDpx5bqU0MrqI7xlPFnPMg2uXn0Qk,5395 -pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 -pygments/formatters/bbcode.py,sha256=7zcNcnoNj-dCyJlrHnmtq0V2o8ZGD14N5anFV4FQ5PE,3290 -pygments/formatters/groff.py,sha256=va2xlSCN-e_i0c_Dz0dg3HV9Ajt9G45PXaCi7CEsLdg,5070 -pygments/formatters/html.py,sha256=1L0qBhYhHomeqDUWQ5QCPdabhBwj5IL_boetQtrXtF4,35640 -pygments/formatters/img.py,sha256=h0_7rBECMiz5Ylu3mc84C59NqQiycsZanBPgh_jJujo,23116 -pygments/formatters/irc.py,sha256=Jkze75ztayIkhNijfnFIsqOUR-Yz5fwEQM_oeWdOnRU,4945 -pygments/formatters/latex.py,sha256=48gMb8ziYgyQVJ4Ofx8x3Ka2l0RBomgYgn5zjeQK_vM,19303 -pygments/formatters/other.py,sha256=RzJhlXeYHyLxiC5vESy41WUK0FOqJPxvMiR6Von0z5Q,5025 -pygments/formatters/pangomarkup.py,sha256=0i4H7NLsxcxzFCJU5ONDJmhlLvsSLCnaFn-FXA5SMQk,2200 -pygments/formatters/rtf.py,sha256=8xghaGMBBXq2XNj-ZWNzYAeX_GqIDMqUBiJLDCulzNI,4990 -pygments/formatters/svg.py,sha256=VxjE-iqarQXJEFRissuLbsooXUCVXWgObQ7c4ub-5zg,7299 -pygments/formatters/terminal.py,sha256=P_dr7GLyRTIKg8LEceCOr5B5eGzGQBELA3JQOMvZ8VA,4626 -pygments/formatters/terminal256.py,sha256=_xYtNUUTAie5Bh7S98nrt7XIlLUURzDykosP7tT7044,11717 -pygments/lexer.py,sha256=cu7IkXm_shKdfmXXrlLybxRZS_RRBJoabOwQZqLPUO4,35044 -pygments/lexers/__init__.py,sha256=udsJXdefyhwUUfisC3E2bjWh3cANTE0ZXeXBiKtk8Dc,12113 -pygments/lexers/_ada_builtins.py,sha256=Z5IiSpdugeKU4H-SEczWPYG6EO0e-R7lwP7thfORooU,1543 -pygments/lexers/_asy_builtins.py,sha256=qn1PmuijZ0P5Mkd1hWmH1arUt03wGWR7QNZf7ACBcCQ,27287 -pygments/lexers/_cl_builtins.py,sha256=n0Y1jei9ssrZ58Ev4GMxDTspYXU58TyAhLJzBApLttE,13994 -pygments/lexers/_cocoa_builtins.py,sha256=LvaPwfjM2r73yJwTMNu1SiDKzWWqzhJBjN_kivnYsyo,105182 -pygments/lexers/_csound_builtins.py,sha256=IY2H0Eg8iBFdmWwecXGwDC41Glrw_bWLenQCtp6DHzg,18414 -pygments/lexers/_css_builtins.py,sha256=IuSVV88A8b37-XsXGF4_6P6XF5Wv3wd3SxYOS1fOGyU,12446 -pygments/lexers/_julia_builtins.py,sha256=evrvUJjAKN8bCeBooXqAeGnWRc0qBqG_W2TMRPWq7Q4,11883 -pygments/lexers/_lasso_builtins.py,sha256=9Ld87CsxAB9UTV77I9W6s_bv4p-kc2grOnc8Ew7cy3s,134510 -pygments/lexers/_lilypond_builtins.py,sha256=rVmINQYq3iQ9-5W_jGrwW4Q9OX_zEX37I-pn5i8Ya1c,108094 -pygments/lexers/_lua_builtins.py,sha256=x8gSOJzBlwMFH9XFxwgF0-3kMn066YRQTLJyM_fl22s,8116 -pygments/lexers/_mapping.py,sha256=2CBllobKB9Dso9kbkaq_IWTvD3Z2JOqx_HsJ6tBLDXY,68026 -pygments/lexers/_mql_builtins.py,sha256=j2K4s3Ye_tYEfJEyUKxvqR3ns_ZOLHGaiPDhkGRk40k,24713 -pygments/lexers/_mysql_builtins.py,sha256=8LqPsM38R2Et1U8sg-oy09aedb-jO1DgVGmssDUw6kg,25842 -pygments/lexers/_openedge_builtins.py,sha256=ZK0Vwj0PfCtg5WpOXCvI0OUnozrNbQxY_HNB_JhAXQc,49398 -pygments/lexers/_php_builtins.py,sha256=ns_E12wFe4Ce3EP38B0DRhAnhHTrdh7WfhjnDWgnJJ4,107930 -pygments/lexers/_postgres_builtins.py,sha256=LQbzTa5ICPqTspfBk7_4JV6bkjB5lz7uuWAUNRj6W4E,13355 -pygments/lexers/_qlik_builtins.py,sha256=zc-fq_8mXsR_XVzTEXFRjGbuwdACJ3O9QrMiEGfuKxQ,12595 -pygments/lexers/_scheme_builtins.py,sha256=ZdZg6-MK7Zt2qqOSBUS5D9YzULtlJIuUxvk39r-HTNc,32564 -pygments/lexers/_scilab_builtins.py,sha256=ib-wZROxsKBi-csMVlGBFHpzDzkT0FPn2wZZN29_9Rw,52413 -pygments/lexers/_sourcemod_builtins.py,sha256=nV2ZcNTvMY7x4oQ2niSNV1XTH9bkXbcAt2-A6ODs55k,26781 -pygments/lexers/_stan_builtins.py,sha256=gl_po01tnvV_tGj31jKHqaSnybhow9ElvFjYU4vWdIs,13445 -pygments/lexers/_stata_builtins.py,sha256=hIGKIkcalQetIwOoN30uflOYgYIOlG3mJ6H6f82edro,27227 -pygments/lexers/_tsql_builtins.py,sha256=wDKfDkftAUjPQW1RPjAwsaLE6VZeTCyCy21z44Uz7Vc,15460 -pygments/lexers/_usd_builtins.py,sha256=H7AYHzkaizd4mFrMtjvI913cX9YdK4qs9JrOlIdcl7c,1658 -pygments/lexers/_vbscript_builtins.py,sha256=EhzEYIk-DBIuU0sMg_davSSL1w-o3enlT1S9uzljZfM,4225 -pygments/lexers/_vim_builtins.py,sha256=BG929NCy6g3LHhpj8R_ueUWqLbuIt0kyCJhxR1Q5SJo,57066 -pygments/lexers/actionscript.py,sha256=lVrwbX2OYnN-KMGd4j3y0z-bWHdNxDDcf8peFMo9x2E,11676 -pygments/lexers/ada.py,sha256=3PAvDXPLpvlpLCSSVl3k1RcBPm7M2LzI3ZU1MJDPqD4,5320 -pygments/lexers/agile.py,sha256=C5m07vIsCir2Amrv0QK0Ah1HbTcjBOBwMdF-x2r__6E,876 -pygments/lexers/algebra.py,sha256=1yoBL6pH_qSVrdg3gVbMJ7HuZbshKL-Kj50meG37XPk,9874 -pygments/lexers/ambient.py,sha256=u333k5mScy3cUUDQEJdxMQvOEX16aqpTd1DiJeTYzqE,2606 -pygments/lexers/amdgpu.py,sha256=f46YvzV1sD3eEfcdkRYIjkS1YTtHyVJT5T2awL48dlo,1670 -pygments/lexers/ampl.py,sha256=lfHAA0ZG4Dv38l5wTYi6InlXXXJ65FaXLjZU0tR_sWw,4177 -pygments/lexers/apdlexer.py,sha256=EbgslrWGNFYOa8a-fN-PMv4_pCv3Kbdo7TIHN_DCXAg,30766 -pygments/lexers/apl.py,sha256=f4QwKpfzMiUPRXCzmcBfN99TV2YVKyNzZ09Ey0bubYc,3405 -pygments/lexers/archetype.py,sha256=pps0tkPaK1VPJePJg0HyaGfTTwEpApgJ-qg9MJ9a6yE,11469 -pygments/lexers/arrow.py,sha256=wnI3F9Zo9HaYImF2pgksdosy3hkztFyA5GGycbtQoIM,3565 -pygments/lexers/arturo.py,sha256=wIFytTnZAkKVtHVjKK5FK2XLRie_hcv8YSs1Z2UAFlA,11417 -pygments/lexers/asc.py,sha256=Nb2PHQZW1351-vrLctIRX_70znhx8CgGk75y7b4fhEA,1658 -pygments/lexers/asm.py,sha256=2sSPg4tLOPzUTQoTAh8pL5tWbdS_KmqQSr9BTQLVRt0,41243 -pygments/lexers/asn1.py,sha256=z01NTnFPFgV0KQydmXvFArjcl-bLDf8TRjm3EQXy-kU,4263 -pygments/lexers/automation.py,sha256=Zgal7cKSlj0SaHAXx98gHjNM1tvCVIO2UykseFquNy4,19815 -pygments/lexers/bare.py,sha256=0WEBxv-FSgow1RFZzaXGFo00iwklIF5FpjJZDOOWbDo,3021 -pygments/lexers/basic.py,sha256=cxZ7oKq924j8_gDolL_IDV4CSN2vXKk6S7DIw2WlTc8,27923 -pygments/lexers/bdd.py,sha256=JsA-W_-oICZKrZS1i7NNYrRmDRVf3iuI1PufUdMkQhU,1652 -pygments/lexers/berry.py,sha256=swc0EY-bEf0wNFUhfvdkgWmP-PXV8PGvhNagqtsUqmA,3211 -pygments/lexers/bibtex.py,sha256=jzuo9lEZHPKzAAMpIeIWkNTr5I1LO-TMn1V9SdyHT1o,4723 -pygments/lexers/blueprint.py,sha256=iVyI00gQ72PIbgq2WknVxNOeCbRcIycm24AHiLE5Fg0,6189 -pygments/lexers/boa.py,sha256=bi5ZlPV61Xehq8bmSdFyqt3BN1jC03pB4t5Foa4vKPw,3915 -pygments/lexers/bqn.py,sha256=fJORpq60UhtW0N38GnmYqAskQ_O6QZtc_tw4XcZ4D5I,3338 -pygments/lexers/business.py,sha256=-QHRTWCdabWV8SIbKZ1oLH5NQ3-blSPES8jjIbEvD_I,28112 -pygments/lexers/c_cpp.py,sha256=17O7tZfnDIQqjnFEajHVcqoWf3CpP8LoWlB2x8avwGE,17946 -pygments/lexers/c_like.py,sha256=uWObWqxC4d-ZyyzEG2yajKZgpq4iINyAcqw7LMnnxZU,29206 -pygments/lexers/capnproto.py,sha256=fE3wK-3ZBzPsDaFf9EkE1dnGDRhJbcCqjyBXRm8GlD4,2175 -pygments/lexers/carbon.py,sha256=JaO3sPeH8yKZwj38tCUuirz1fSF70S0koSqu1_MH8VY,3222 -pygments/lexers/cddl.py,sha256=PZS6611__hY36NZj8n9Q__JMXNLSm_aMWLpC51axc-M,5182 -pygments/lexers/chapel.py,sha256=1oFt0h0Rh7JnF2qw1QtT0XzkUanV-Xb9Xi9B9ZcHaIA,5157 -pygments/lexers/clean.py,sha256=afJe0orU7Ux_pmmrbSNYPLrTCkY_z0MJTmhUBqPtyJU,6395 -pygments/lexers/comal.py,sha256=9IwxfxVBVMn7Uj2xo-WCr7RhLRDrDe6wjTdAi5hWT2g,3156 -pygments/lexers/compiled.py,sha256=xv8krgoDgd07QDXVPaa5uip1kl9tBprkGT1K5-DwiWE,1407 -pygments/lexers/configs.py,sha256=GMP8JUB4KQ65_dFFf5Pz5TyNXFI5f1zZsSeq9lujyZs,50077 -pygments/lexers/console.py,sha256=17k4Ngrs0EsaJg90ud6dle-I1SvjoOiYJ-xuGpLesTI,4148 -pygments/lexers/cplint.py,sha256=HrKuhRKjK-atw1FKT_zu4FJjlHOM5BppRzoxisXbpZM,1390 -pygments/lexers/crystal.py,sha256=rxxZp0E3v_r9TuWweALiZO_4IKIGIg5GCJjPq6ZwdZk,15757 -pygments/lexers/csound.py,sha256=yuzpCdZuHDmr2eaNodglDrCgX1W62xtQvjitnHlXC6s,16994 -pygments/lexers/css.py,sha256=lZKXESVwZRYTjjRkyB4cYpXk9CHcVxU_embzFRtPhhY,25322 -pygments/lexers/d.py,sha256=f1dFv2mAXqLKSJQ59m66u1Mj9us3fDskxltlrJ8EBmM,9875 -pygments/lexers/dalvik.py,sha256=0Ii9KIUWT5FkJkLKuUcHoHPhav4eEHqsWZL2_ikP1ZU,4607 -pygments/lexers/data.py,sha256=ig8DAJK5Q8hkKojQ9RjaWMsH8jiNbuzwaBaT-MYc9Vo,27032 -pygments/lexers/dax.py,sha256=od3D5zfaryI5MO93E_OA-TUpekAcjXv73l6kNit57oI,8099 -pygments/lexers/devicetree.py,sha256=4GKiuZC5bYwG_gIl30fZH8VV2zo4cqwdemQrQgWH7ZQ,4020 -pygments/lexers/diff.py,sha256=VAyAFRFmyMH865rEJ37I3TpyrpLUoEMU95durw6HLRc,5278 -pygments/lexers/dns.py,sha256=-l1X7-R3AKDif65JIvL_Tc_dJdIjaOBq38-hQf17ZWg,3781 -pygments/lexers/dotnet.py,sha256=VjJWh7vslMNIoQdPFNUlAZI0ExuLFV6EdrywYaIjqQU,37623 -pygments/lexers/dsls.py,sha256=FVNXP98f5RV-h_qiCtW-qynf3QZ-eD4NudpJY6cLiV4,36786 -pygments/lexers/dylan.py,sha256=PbrnXZc9paqmkOVJjsoAxfs5-s0MA080Vzoiu3nZum8,10319 -pygments/lexers/ecl.py,sha256=Cezl6tWf-a8hMEEUfJqYI3EPf6sSS3kRz0GiOuFIQ4Y,6372 -pygments/lexers/eiffel.py,sha256=PXeBFx3xSibTrVSDA0JqE_yskLWWynnaLp9O7FV57_4,2691 -pygments/lexers/elm.py,sha256=rKpECJmTDNmAQZu6YCX9r-TAoP3v7apL2HRcutG6zlk,3153 -pygments/lexers/elpi.py,sha256=Lid861rWNCGfv839gD8E2JEP8HkhO0gCWGWKuc0so3I,6710 -pygments/lexers/email.py,sha256=EB3YvRDEP6_B6B1wzq0vS4_zrBX52zdyXxiNI3KHgxs,4742 -pygments/lexers/erlang.py,sha256=EhFx_0D9w85DCJR9FyUprFPiaDvJps3xy-Kn4whWcjs,19170 -pygments/lexers/esoteric.py,sha256=V--w2W-Jyl4yB8A00f4GikVeZXe_5lWHE0RMnfuoLTY,10396 -pygments/lexers/ezhil.py,sha256=xu9wMEESVWCLgNitSS0IS855TSJ3Yb2KXBrxmYqHKSo,3273 -pygments/lexers/factor.py,sha256=iVSIZaT7-qAI41wP__p2XjTSyREBSyAErPLVGP4bMeU,19531 -pygments/lexers/fantom.py,sha256=0DylUHKCeBMfQK4QczavL5ugyPTV0u5H0Lk0YTv6_mU,10197 -pygments/lexers/felix.py,sha256=fJsd0mNaSwkjU32-103-9XDzzz2lj-ONPiW8JkZAqxM,9646 -pygments/lexers/fift.py,sha256=ISH11Bvz15ZsMjTMdLDsHFx2HYgpGyDUlvi1CN8MC8Q,1621 -pygments/lexers/floscript.py,sha256=UYPHl2Ygez7RfBPTU00hUMXrU10mB996vz6rFisAmTs,2668 -pygments/lexers/forth.py,sha256=PzfXkhpusFIGVwrzVsqLgljlybN92OeU0_E3rHup2m0,7194 -pygments/lexers/fortran.py,sha256=3DAkofXNVP5xci45AisWy3Ja3snhJm6lgGa3o0BnSko,10346 -pygments/lexers/foxpro.py,sha256=XmVcWgw70vh31gri3LhfrB2YQ-RhkUkBKly0xHt8VQs,26212 -pygments/lexers/freefem.py,sha256=e_YjjHZu8PzQBykLzhpY2RJHjCnLxnlmoGj-5RinP6c,26914 -pygments/lexers/func.py,sha256=h6IHCdydWKpQcamC1XAGJjaGK-UDvh9iM0ZuWQK05dQ,3622 -pygments/lexers/functional.py,sha256=IpvPKomRGDqGs_MZZjkX5niMGZO9s5X1Dk0HDyO9zWM,674 -pygments/lexers/futhark.py,sha256=NwNYLxQ1feJwtPjG54VmSmo_ZtcTqtlzr0QQppmxWUM,3732 -pygments/lexers/gcodelexer.py,sha256=H754t2DKkgJYF-mzm4uI9dqc0qE02fjlZZfXM0eg6Lc,826 -pygments/lexers/gdscript.py,sha256=DFvf9eJgJic5DUHt2lrJksSu5X6eXRfrh30t5yAVSzY,7543 -pygments/lexers/go.py,sha256=8DSgsTlGjQ1QkGw0k1FY8Hzur9B1QOWTIA642qb9RHY,3784 -pygments/lexers/grammar_notation.py,sha256=SNQNggmjYCC0yRN2m2r_33X2pa8bw0AxLJsG1G5FjdQ,7980 -pygments/lexers/graph.py,sha256=oPWnai1DbOqoS7yIKquCdzZztA6QI8j6R1JJ_gCvJEs,4109 -pygments/lexers/graphics.py,sha256=AqhzeSjpQwk1Vrj_OT5jKDJMonB90Sr01mM3q90WGVg,39026 -pygments/lexers/graphql.py,sha256=swH3nnESkgFynenBJDjzzKaSKkOGQ9rbm-kFs2-AvIM,5602 -pygments/lexers/graphviz.py,sha256=_yJaR2CW--2ljvnPdNjsVOvosPoUJw0pb3Of33nWBtk,1935 -pygments/lexers/gsql.py,sha256=7GDWo1Wvt5UmJhAC8HQND1kbdONBRE1YhdawBzgGrHA,3991 -pygments/lexers/haskell.py,sha256=RkYEh9-amHeRS0-dU5Nyz4RL4KKJz27PsWhNpf-C7NA,32898 -pygments/lexers/haxe.py,sha256=W4ILlVNk1D6USMa2Kkr00IFaoqtUIxd5cO8_xWzo23k,30976 -pygments/lexers/hdl.py,sha256=xA5YnwhgaOTzvLpE1VIP8j7l5LM2FjkpssZyMe3sPtY,22520 -pygments/lexers/hexdump.py,sha256=QLvXzWmo2_xqHMy55OTXUB15CokyQLMzHvmXuwMj6z8,3603 -pygments/lexers/html.py,sha256=IvmbMYuuHsOdkOOBv7DVZL7ouONLfd9fVtjRFICAYD0,20260 -pygments/lexers/idl.py,sha256=bhS43u_ycIVN-dxlL0rkVDW0Kunuv4nCgMiw4CrEVTk,15450 -pygments/lexers/igor.py,sha256=YFdGLAgqoSnp6wpk23bwbgj7uVSRbyqG4r3Xr7ht8xQ,31658 -pygments/lexers/inferno.py,sha256=0pRpoR7W1Kp8q_9mxY43rYw_RYef3ruJ6xV1LwYbz3A,3136 -pygments/lexers/installers.py,sha256=5_jhlzWYi_6LMEr8BnpbjgiScZ_G3Q7AH6fTG4WrPRc,13178 -pygments/lexers/int_fiction.py,sha256=CkGFrMPiZZ6aQ607E4yfZDTcYpz1pdrbd4azyx7XVX8,57119 -pygments/lexers/iolang.py,sha256=ieom-sc8xdXbHi4g5LDofvLduKZdVBSOEwXocKmQU2g,1906 -pygments/lexers/j.py,sha256=Kd0Rga_1uwU_YhfXebvGuHKpOXM2SVH0_x_CqkCJVCk,4854 -pygments/lexers/javascript.py,sha256=y4ve9s2jq4UaTr9PhkNERIlu2DpbP_l64N_r2JJOBV0,62859 -pygments/lexers/jmespath.py,sha256=3P4_YQXh4IoohDQhoh0pquyFuUHVd88g7KYmVYg3NoM,2059 -pygments/lexers/jslt.py,sha256=cvH2LIuUnkhaqhfWvkIjS7sSx2FpXSEvl3rOF47d6Y0,3701 -pygments/lexers/jsonnet.py,sha256=CiJT00Tp0lBg9j_1EW-d6_poumtHoP2TmEQVDlf3cTs,5635 -pygments/lexers/jsx.py,sha256=XFQ5J3VU1Ys-yjxRTurUH-gYdpIkf4TV87zvtsH5b-o,2234 -pygments/lexers/julia.py,sha256=F5zuRm7OSZQeV1na7lasypEDGreLAzOdfaKmH1HIxgE,11646 -pygments/lexers/jvm.py,sha256=nyRvIF12oTZRmU0qDhgOQx8AsUgoZj1zMU8tDGyOP8U,72929 -pygments/lexers/kuin.py,sha256=AVUDd6JAy1jClIYeQDPcV-O7xGfb7x7fojN7hb7ANHU,11406 -pygments/lexers/kusto.py,sha256=Jqk2xx0vVfZa5uFq5KGZgUReZ7FHhQ5HvT6BeRGzmng,3478 -pygments/lexers/ldap.py,sha256=VCA0OKkzBuvSKHOpF9SvlA8C1tfRvahu0MNhz-4LpBQ,6553 -pygments/lexers/lean.py,sha256=8Uxhngca57NnJp1JCabEVxB6SUgzQVEUEMmmlmbc8XQ,4297 -pygments/lexers/lilypond.py,sha256=_A5P7PaITP8COXG8dy9nS7CzfdKY2UOe1XLGtucuip4,9753 -pygments/lexers/lisp.py,sha256=LkuudA1P9cZRzGqV30C-5YicArLoP9UIBul0Hif41v4,144398 -pygments/lexers/macaulay2.py,sha256=aEdFzjrP7RXP5BcRA3OQic94umhvq1uGxUFMu5OC7KM,32171 -pygments/lexers/make.py,sha256=rWYMowE5zF6mYA3VrJhJ-S_n214-OtWeXdjJDKjXAok,7694 -pygments/lexers/markup.py,sha256=sQLkkKS6d40Fe43z-vFR2bvWuNTJvuJ54F-FZKkgzNo,60257 -pygments/lexers/math.py,sha256=Wl6lU1VWevtQXymt6jdDeuz9LEMiPKl1On3Zm3QXQ8M,676 -pygments/lexers/matlab.py,sha256=WplG578_mB6sHlDDfgY83SMadCcqD_sN5Jb593rSr6w,132852 -pygments/lexers/maxima.py,sha256=tLSjeDIBZKHRoMludgF7oBdz1xTAHyvIEG6BshyBXyM,2716 -pygments/lexers/meson.py,sha256=ij0CgbEULfqLMcY_BQ7PxmCwWOYLc9XZwtrALFSinEA,4337 -pygments/lexers/mime.py,sha256=-wj3pvAQzNTC8fTZk9AV4Q-LIQhMUocet-j2kqGj5gs,7538 -pygments/lexers/minecraft.py,sha256=ht5QXort_Zh978JtW8FFedZohg5vvs0QhfgtnAoTJbw,13810 -pygments/lexers/mips.py,sha256=JBfvOPp5HTGp6b0kynkjzuJOTRAdTsJJdjPWLAtu1fo,4604 -pygments/lexers/ml.py,sha256=acMqr9VqV_79-o8rrlc8PSZYYc1Qmyolo3f18Vx81ig,35315 -pygments/lexers/modeling.py,sha256=3KxuIs1-lb_FN921kCCgjq84R69ATEp6K1EQyWaxp7M,13524 -pygments/lexers/modula2.py,sha256=z-4QbG4Bgjd-0ONC9SadglqCW2QmIMl-60b_n35V-70,53073 -pygments/lexers/monte.py,sha256=pKPKOkwxcGzJLVisA-H7xJJW9JUh2SsXyDi32mF5nSQ,6290 -pygments/lexers/mosel.py,sha256=_JeaaK5Jn0r7JcuLl62u1sl6uInkrP9g4EosCf9Z-IQ,9187 -pygments/lexers/ncl.py,sha256=O6CckyU8yABKmx8xmj4q6E2isWORmvNO7Xl1JX5NwVQ,63962 -pygments/lexers/nimrod.py,sha256=O_8dxk9x3vlYFPYjpe8iqQcCrcZmNnBE_Ld1lzO7xVI,6416 -pygments/lexers/nit.py,sha256=Ghja_AX8DIg_KA-rmvgmL76kZI-lq3pARMiebYi9Nqw,2726 -pygments/lexers/nix.py,sha256=J1hm-r4NWD_LfEkCIOZqvvE1UhXBRF2zJi60OaxoS_o,4398 -pygments/lexers/oberon.py,sha256=LgYgzGPus7w1lJLUAu2cmIRQGEgQiid34QH5Upa7Uro,4169 -pygments/lexers/objective.py,sha256=VoUeZYa1aO5rU69dDpv4Ob5FOYyr3nm-eJ3m0kuti0U,22961 -pygments/lexers/ooc.py,sha256=BEj7kfOimF_Qi62R-B8bmYGy_5QIE1jS20NfrnNE9Ss,2982 -pygments/lexers/openscad.py,sha256=JF4cUk6rAsH9BlXDdkdXMSlKajpghtOm0Ny-QikoiZ0,3701 -pygments/lexers/other.py,sha256=oXVtTELCPFxwuJxN5j_iYrt0Q9Aonq-GkotncUFPpeE,1744 -pygments/lexers/parasail.py,sha256=MxO40OTg_5z_EnMyb6weQHjhtzL1WgSwfjCXc0zl82Y,2720 -pygments/lexers/parsers.py,sha256=JiQT3IMsf2f0JLbiDpupZNSsHnMUH57OoAr0D_3AvbY,25904 -pygments/lexers/pascal.py,sha256=EHZi_mh4V7LuGXtcbTQnrrfqDDXcGyVwDvJmN8XRcps,30880 -pygments/lexers/pawn.py,sha256=fNq73VwQoXeKiRFKYIKzzOClcUb2eLPJIhymlnxKZlg,8146 -pygments/lexers/perl.py,sha256=82_7saaR3qBFlSnWYyEtkir7uvXTeUZqFUhjdkdTTXs,39170 -pygments/lexers/phix.py,sha256=48JEQK_0ijjipwDl1F-ik0B_CGUMsZOvXlvXzIqHVmk,23252 -pygments/lexers/php.py,sha256=b4sVWZTMq0t2GMlaFmzYWJna9WuDQFIm-vdqXkb89xo,13040 -pygments/lexers/pointless.py,sha256=dUATlYVUZkbggQ6PUymDKhB0UKqDo-KCf0Fp_EjWsTM,1975 -pygments/lexers/pony.py,sha256=k03DAhS-_G8SZsfXZOjF5YkQaMQ28_uy68_CMaxuUC4,3244 -pygments/lexers/praat.py,sha256=rTl5GSoJ58LQxRf_Ek0A1H4iCm2IVQFxEwSvbMki7tw,12677 -pygments/lexers/procfile.py,sha256=naQZcdvxVUjT56R0U6_YpgNCgfmNE9Xjzx9uQesl-Cg,1156 -pygments/lexers/prolog.py,sha256=TzWkSYjxU-5JAFl4ng3ksANbyMIvDyXWdR5ISsBZaKs,12506 -pygments/lexers/promql.py,sha256=Qw0VXIJGRkw6ZiSzvtR0KFiWmPuyI9xxXgDl_l3cHmc,4715 -pygments/lexers/prql.py,sha256=MXk1v0Pv-zaDVWZHVf3RvDZNPjI65PF-s7a0hUUrVwU,8748 -pygments/lexers/ptx.py,sha256=ws5ghGmtTLaJ2zamWUixCbdkzbjnxdwZyI4t3mgrdSg,4502 -pygments/lexers/python.py,sha256=fp-pcvS7KQJ7_pxYbn4s0ONPFOFcWERRw4F2e-CP_A0,53400 -pygments/lexers/q.py,sha256=Vw36x6rIp2U1b8GUtUbMlcD0MVqW3unCZEMBEt-PflQ,6932 -pygments/lexers/qlik.py,sha256=gCAQCe1Tuy_cMI4n51Sb8fG50L73AgmUMEWMmZRHeJg,3665 -pygments/lexers/qvt.py,sha256=IjHyopkDochlQt_fIf7Mrxw84pIg-gj4BkDHtEiKb_U,6072 -pygments/lexers/r.py,sha256=xMSNpNN3Hm0W51-TEfvzPeOGtobM2nIjGVmIoVydlfU,6185 -pygments/lexers/rdf.py,sha256=RNIBJhBKMwpxlHzF2pnKJPUoOjbiPmoFZDajDd4mSzE,15981 -pygments/lexers/rebol.py,sha256=TMT3JlXoWvJbZwZdLuekwgv584HEP1mfsD2g9Oqj0IU,18248 -pygments/lexers/resource.py,sha256=KxxQJi9NPmghpa1mekxUFBd8eaiSB9pV_F4Eds4kK0k,2902 -pygments/lexers/ride.py,sha256=0mT89oluoz5lUT8ar6uPiSwTIBwyMc6oHYnrM5QY7Vo,5056 -pygments/lexers/rita.py,sha256=gPbMhlCyS_ekzXIKboXGEmtGZlSSUx0k6qcuWEHuM6s,1128 -pygments/lexers/rnc.py,sha256=SjXKJWNifTTWQC9NlcWNmdhkln0REEpEvaY6nVy6n4w,1973 -pygments/lexers/roboconf.py,sha256=HY0dSPJxg7knQ-cM6YotX8EoVjuQi-LeKYKeWpQyF94,1962 -pygments/lexers/robotframework.py,sha256=MJ4cnUDZWDrXCpYi-kJLqe1HpzJ24DMtNswDeuSnVCc,18449 -pygments/lexers/ruby.py,sha256=9Oext9bqwC7E4SE3fAB4Ldd9_9Tbq7D4D94RQA-8bcc,22672 -pygments/lexers/rust.py,sha256=Oq5bFgf_hcOLxiBLhzPArUFXgg3Ude_xpeKPC3g-HDI,8216 -pygments/lexers/sas.py,sha256=u0vkPLehX7UERsKIkooC4IFJdTf44L2_Qqdpx1De7wk,9400 -pygments/lexers/savi.py,sha256=3A563B-Wzp5AGZG0ruSQiPbe-c3uYGwCPUmnPJSEKOk,4645 -pygments/lexers/scdoc.py,sha256=_UKS5VZZ4eaVpxmSr6L_P8Or8gAt9mImX4HWuw1TGlo,2525 -pygments/lexers/scripting.py,sha256=EkXKzWLg-jpsV8rep2YW6fDsCDz-d3fY1qv1QVE7MI8,70014 -pygments/lexers/sgf.py,sha256=Oa3SNL31wN8rhY0gby61kbPxttvRQJTRN38CSMUiMJE,1986 -pygments/lexers/shell.py,sha256=oC115DNmEzPYPdKN5jNUz-gV44c_qVb2Y5OfGO3gQ_U,36466 -pygments/lexers/sieve.py,sha256=lLcCLdvj-AeudiG2xq2zTN16v0zSEXK5vcr1keg0TxA,2441 -pygments/lexers/slash.py,sha256=_soPrmF1ylAw7IWfRHTMMUdifwy4oNV5FpYMBQsVSyM,8482 -pygments/lexers/smalltalk.py,sha256=9UNqjCWOay3nb5BVqN2Muw-Ci63WnscW6xJcGnNWVq4,7206 -pygments/lexers/smithy.py,sha256=FMvWXKvjF_hUNqI7BmZYbVRrPg5_AnnzORHPp3skcXs,2660 -pygments/lexers/smv.py,sha256=VyWuTjtAhaZmu6oZG3Om_kU3NhorVz9ivzeu_mfRjwo,2773 -pygments/lexers/snobol.py,sha256=Wp7ViMnddy79tWJjsgSB9kIPFh_OhaM4Y2tZjWDuvMI,2732 -pygments/lexers/solidity.py,sha256=Mhmypb5WzxGdBaQpySae9NbiFJllkEezditjHajd7RA,3127 -pygments/lexers/sophia.py,sha256=0gARv0DbMi7DWUc793pd4f7IKxSeOlkjk_eez8tLihs,3330 -pygments/lexers/special.py,sha256=SDWqBKmWmKyvi8VNfPpW1V4g7ergad4RfUumDh6bNrk,3414 -pygments/lexers/spice.py,sha256=hzAwtzocM0GYjZasqsX1Uv6jYkwgkm9wIvadpkyw2tw,2735 -pygments/lexers/sql.py,sha256=IirBrDuksw3Osvexob90XCmH7HRIcaBBgDyK1ay6BuA,42107 -pygments/lexers/srcinfo.py,sha256=x_6DsZ0mKVbI_v_G5bLBQl0WyFwj3tXmOqfHIB6zve4,1693 -pygments/lexers/stata.py,sha256=-IRfLl_rpuOiKs0Vnpc6OEKuA6AXbklW6RBGc7xzGEM,6416 -pygments/lexers/supercollider.py,sha256=Ua4RbmCRYPz7PcT1uyloAbfKc9kZim7nAKr55E26scY,3698 -pygments/lexers/tal.py,sha256=fXEJmSU74ImOyCVnEIW1Qa7rWKIiDHKmDlpIW3OUp-w,2898 -pygments/lexers/tcl.py,sha256=STjHSlVeWo-Eg4tKqn_7m3_3efcmHP0WCoL1_PK5tt0,5513 -pygments/lexers/teal.py,sha256=t8eOzrIiImVuUtkBlSPl9Y4olrCAZ21SQB-T67WZasQ,3523 -pygments/lexers/templates.py,sha256=Eawt5MXOe1V2RB_vhp6097GQMjoKHPSEWHKifhdMazw,72610 -pygments/lexers/teraterm.py,sha256=71NiLefy40L6R4B-qy-ho8Uy4kAQqsi7iLxexCDS5rU,9719 -pygments/lexers/testing.py,sha256=Ue93uh36l7JKc0cUDnLmk-E221b5y7qt6xXHvaJRxt4,10767 -pygments/lexers/text.py,sha256=ntF8QwsuhsqyQdxMB6H7MYP7o8A7xSxHe0UMTZLKSK8,1029 -pygments/lexers/textedit.py,sha256=xVU-3K5-0KEkb0pJ4hJjrjpnz9hJaIuLQOxfk9nLWjM,7609 -pygments/lexers/textfmts.py,sha256=d5g8AWDK5_MXMnPhj6t7T7SOLsk6wPptRmgnAdbAnUc,15310 -pygments/lexers/theorem.py,sha256=Bfz9807spH0L4Ql0_0u0HDfT4t5Z2PPk71a9JquXllo,16659 -pygments/lexers/thingsdb.py,sha256=FwelchVBXKf3nc78UgA9SyJbHta3EMdrLnQizIxS5SE,4228 -pygments/lexers/tlb.py,sha256=sQCsK3j8zqGVI_KCuursmOr4JIs3sfpqF_wPpQpyKM0,1377 -pygments/lexers/tls.py,sha256=KfI8y7abYZzC_jRwvti_foAAUrWSmpjdQ3RGPcP8yps,1541 -pygments/lexers/tnt.py,sha256=uvdcsw5NRZjbFouXBET3-w8I7LG9hqzMXiK6s_GK2ZY,10457 -pygments/lexers/trafficscript.py,sha256=GDl_7cSFit1anVH7KNH0qVts1eHcp_GGxpzIYWZabeg,1474 -pygments/lexers/typoscript.py,sha256=nIAUIlbL5sVqpTEt34YdUGDNmu60a7itBYaaUMuzAIs,8207 -pygments/lexers/ul4.py,sha256=XOm5dWiWtWN3RQMpA5VHvl1J1jg014SK27aJnVjq1C0,8956 -pygments/lexers/unicon.py,sha256=4MDnwsgXzLlm0zaDqYr9uHFNspgCzQRNzyxClVQ-RMI,18512 -pygments/lexers/urbi.py,sha256=3CkxfMOqpSVZpOq7_4YrWcmjq4B3CF_IDGIxAsedWQ0,6037 -pygments/lexers/usd.py,sha256=7FiS_KV1Q9Cvf51fAHmMqr5QDz1OtjqTkp1S-8VyQTw,3513 -pygments/lexers/varnish.py,sha256=LYL6rhIw-ApJRT4qkxFaxG71OPbHsiFv4mtfr0m1OPY,7273 -pygments/lexers/verification.py,sha256=1C1ntqvZmrCtzHV9eDIga1LtQ4jpAlb6GnWkNucEJXQ,3885 -pygments/lexers/verifpal.py,sha256=DF0nQlrw_Xt23OOFpOC8_LRpYWXlon1S7yxj6egbtDY,2662 -pygments/lexers/vip.py,sha256=Mn8ZSUVLuGgqt1CMshXFelS3p8DBqUOyqFrZyWBGblc,5713 -pygments/lexers/vyper.py,sha256=VFiOxo9JhrPQKFtWDOjWz6HccIwjAxEH42GzSkM7LhA,5595 -pygments/lexers/web.py,sha256=lscit_NgXsHDL8sjvNvAFriPBe24cz0b2rBGFFpYlv8,894 -pygments/lexers/webassembly.py,sha256=HGFp4qMAK0ejx0omrThEtIvl_ArKOeS7b4yZkipqmIo,5699 -pygments/lexers/webidl.py,sha256=VeqO7i3Y-e0ObtLxn1sniGmL_CvOWekaP2XyUFzDlLQ,10517 -pygments/lexers/webmisc.py,sha256=veICtUXL33effcYDX8_FU1F0Q5FfZfzcC2Tyu5SYT9A,40549 -pygments/lexers/wgsl.py,sha256=Mffgj3x5tFwsKWihw2kbhSmhvGNEgQc_pJi6C3mEQxc,11920 -pygments/lexers/whiley.py,sha256=SbbftaItSgIdczzT8qOV8mH1m6dD3aM2EvRk4ila6Co,4018 -pygments/lexers/wowtoc.py,sha256=o_01SGTJ3jecVHEpkhqHdwI66XQVi8wNeajVYPbd4Bo,4021 -pygments/lexers/wren.py,sha256=I3LaIzy3aa0aDXJd9PJp-SiJtgJHktISHdQ_zQuMHLY,3239 -pygments/lexers/x10.py,sha256=p3VwQg70e8ZR2iwR2kY-yojTyD_s3xVJMLTCWrpz6Hc,1920 -pygments/lexers/xorg.py,sha256=rXKVNQiiniNoaM4VTkLFj106NLddCBo1BV45BTxT1HE,902 -pygments/lexers/yang.py,sha256=rx08okYvJgWMe6jMRkt-ysEuaTi85X5DE0Q5EHb-Ehg,4500 -pygments/lexers/yara.py,sha256=nFwPtmuAhe5qrm_PKldVnWAiFZaLeipgi5q3-r1VGwE,2428 -pygments/lexers/zig.py,sha256=B5QZGfEoNkoAG5EZxHk28MZ1n2Q1Gvx11kcvTQ6N5X8,3953 -pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986 -pygments/plugin.py,sha256=k_gtJHBriDDWiNinQ-h_qnDUm7EnPLuXaTGH3Cd5pZw,2579 -pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072 -pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092 -pygments/sphinxext.py,sha256=lGw97r5LQrBvectMNzL03wRECrjs1HRXm8K_l7T-Ink,7687 -pygments/style.py,sha256=b9L0ePngJbdJHc2GN0lZQ-OGReVS2LLJ7Cw0CtqvYkc,6408 -pygments/styles/__init__.py,sha256=_vD3kixWMGVuBQrA1Wz_rJEtkk891W0ED55i8EQBhCA,2006 -pygments/styles/_mapping.py,sha256=8nY9bcEF1Zw9Xu0bmqffqYEHHbNZvCQHit2OVlJWHyk,3251 -pygments/styles/abap.py,sha256=u-QuTC6mQKq4YJA4mktCQn2cMElWwpkoX3S7usbYOOA,749 -pygments/styles/algol.py,sha256=P3QKhfOzlVAqrU92sjhnaR7EqCOQUOw7Lk_I9epKbtY,2262 -pygments/styles/algol_nu.py,sha256=Os4S0FUDMQ905O3RrLVRYsjv7ApV6TpFrfwKnw-hZgQ,2283 -pygments/styles/arduino.py,sha256=_CvgHN31uKDQ47rvw5Eorgcxyl5KpRQhG_YEtGEIfxo,4557 -pygments/styles/autumn.py,sha256=ddeg2OP2N0Hnnf1EtTCtta_l1MEc84Jlz-q0u6DVYMk,2195 -pygments/styles/borland.py,sha256=K9ChZUYeVCV_UneC-GuwbbFuGsbuJPQmXU4M5iO9-QA,1611 -pygments/styles/bw.py,sha256=m_aaUcKZcoFKfCMxhtxzSCI_XmHeUjUw5vdZPjvZp-g,1406 -pygments/styles/colorful.py,sha256=8ycjohgVnpMiMlSxJcS4ElGPEr7YzGFpS4HTfLqZabQ,2832 -pygments/styles/default.py,sha256=fiD-OIbpCjq-SUtd3x3ubmkVN8n7aBV47fwoDrTeEkU,2588 -pygments/styles/dracula.py,sha256=5LyWUmUN5wy2MhHuyEcObpZ6aMaLpRYAPCG7_Z0MCE4,2182 -pygments/styles/emacs.py,sha256=z_apN0G3CxBJWCTuHgqLf4gnG2OQpEqPUNmM2MIcze8,2535 -pygments/styles/friendly.py,sha256=c_OakSvJVxD5vVFQFrz20aVJzVHIhW3cojQ76CImxsc,2604 -pygments/styles/friendly_grayscale.py,sha256=H6bsSnmHqa4rUAhoqPk12ngQb8-HS9LnKewwk5bSDg8,2828 -pygments/styles/fruity.py,sha256=rrQJF7-5gZ0iZDViYu4t6DrjW4GIcx6IlHh51us-JcA,1324 -pygments/styles/gh_dark.py,sha256=OMSwHFnAN9rcjwYUEL2TlS95noWjW37OaUPhyaveIiE,3590 -pygments/styles/gruvbox.py,sha256=91-MOfqqoXrYOvB3x2vYZ3kvF_nS34oqNpoqD7k4Yc4,3387 -pygments/styles/igor.py,sha256=KIrBo4BV-IAz-zBK4r0gxnbrIWSHFe_Ys6uSubeBQ4c,737 -pygments/styles/inkpot.py,sha256=Oua26UQVLXsZbSfofyz7Z8aKSiJ9hTufA3xF6HkYjGo,2404 -pygments/styles/lightbulb.py,sha256=HCZY-h-CNbZyUogI5gGQR_d4hmFmqxLxYNJ8qcZSFls,3172 -pygments/styles/lilypond.py,sha256=JC12xZ3EJB5ND8EHcTadfGmgnbayGq8lBOPZuR2vUy0,2066 -pygments/styles/lovelace.py,sha256=qt0CG-FIIVxfmZpw-pETZwFngAwMpnq_GeSAvmR25ak,3178 -pygments/styles/manni.py,sha256=BThefwUCUSUI5fmB2qtPobguGlyoNMYkWBFg7nkNyTA,2443 -pygments/styles/material.py,sha256=8irDX9ETp9BZ3IltoRLYOTLexTmaz031ei7uyvu5GNo,4201 -pygments/styles/monokai.py,sha256=gTGDMnNuK8ZHXqVcl5I3ioIFlbiwPDmRy17v-GetpVI,5184 -pygments/styles/murphy.py,sha256=JE9fBt-6MF3H6UEYtEJWK7p_t3Lz4FusSbnPynNu42M,2805 -pygments/styles/native.py,sha256=rVBWq-wBg2vAeAs_i_VNlxgWzg-ebVforTXzeBX2Jo4,2043 -pygments/styles/nord.py,sha256=O_nt2GrMK5OsQR08Ae9wURzZx5bcGysoxgmWbq8xcqc,5391 -pygments/styles/onedark.py,sha256=5RqvEWfEqF8o2w0N_8l-U-ofiYSXtHSUzktXMwAoAIo,1719 -pygments/styles/paraiso_dark.py,sha256=lDd5uQE79wvBhGmrpLS3KInpR0snFxWwDm_0O2xTmKY,5662 -pygments/styles/paraiso_light.py,sha256=P5PklTqMUL6pcoGqOqWKBl27tzPO96ESU-g6-KrdgaQ,5668 -pygments/styles/pastie.py,sha256=dUVoOajWDL7gHb2M1sKSvIpt1NFyAsESYPaRevuRVWo,2525 -pygments/styles/perldoc.py,sha256=ptWUIhA3fhY_an_Vv_Ol0iFxdoMmBmKVmC2jsJsvlak,2230 -pygments/styles/rainbow_dash.py,sha256=wjVs3914IzAV23dnOR5xLGlM4UuC1vDd6J4ioTWiJDY,2540 -pygments/styles/rrt.py,sha256=UwKeTcYEtEpOR_o14zudapplTxTyBX1DPqw2I9RUywc,964 -pygments/styles/sas.py,sha256=VnKRcJVldq2KlnEO8pI7SFOatbaE4z0i0w6_qZtOU94,1440 -pygments/styles/solarized.py,sha256=mZLB6gjn_Y-6K_0paNVJXI9lZxPa9HvkQMpBRMSY62Q,4247 -pygments/styles/staroffice.py,sha256=RM9KTvM7wRed5KW4KZ9nBeKThrDexqqLS3Zn2Oh7H6s,831 -pygments/styles/stata_dark.py,sha256=OgzjDFI0NbH4lmEc4SxcfUsQPhBgkh5Ph1sJ_4x28tM,1257 -pygments/styles/stata_light.py,sha256=ZcdDnLhzMwz31Hhzby-Y8J_UAAZ0BPPgMErHqySRA9Q,1289 -pygments/styles/tango.py,sha256=_95xGiUpuKIJVNbxfhkPMzw19vweKUPfZsAPcIBKz-k,7137 -pygments/styles/trac.py,sha256=91bi_zjoF5M4e0NrF_p77Yka2A6fSEmxUmdVs2IuRQM,1981 -pygments/styles/vim.py,sha256=7DM6buIf9yTyqvyAVGKMow9Inml3rjipaZ9R8MaimDI,2019 -pygments/styles/vs.py,sha256=wGIgZm7zHBEcU7MLmVAehH9Jw_uxVf1GWvqJsznzq1c,1130 -pygments/styles/xcode.py,sha256=-lDW8y3hEXcJceSdr9bO_TVVRIxn_hQeVfBwWRzkU_Q,1504 -pygments/styles/zenburn.py,sha256=Hgd-HGeCwaNcD-VZ-wbsEL_nv2A11uOXVqHXq-KSy3k,2203 -pygments/token.py,sha256=DXVQcLULVn05LG63bagiqJd2FH3UzheVUBmdQeXn1U8,6226 -pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223 -pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230 diff --git a/libs/pygments-2.17.2.dist-info/INSTALLER b/libs/pygments-2.18.0.dist-info/INSTALLER similarity index 100% rename from libs/pygments-2.17.2.dist-info/INSTALLER rename to libs/pygments-2.18.0.dist-info/INSTALLER diff --git a/libs/pygments-2.17.2.dist-info/METADATA b/libs/pygments-2.18.0.dist-info/METADATA similarity index 90% rename from libs/pygments-2.17.2.dist-info/METADATA rename to libs/pygments-2.18.0.dist-info/METADATA index a2327aa98..3b102e1c8 100644 --- a/libs/pygments-2.17.2.dist-info/METADATA +++ b/libs/pygments-2.18.0.dist-info/METADATA @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: Pygments -Version: 2.17.2 +Version: 2.18.0 Summary: Pygments is a syntax highlighting package written in Python. Project-URL: Homepage, https://pygments.org Project-URL: Documentation, https://pygments.org/docs @@ -22,7 +22,6 @@ Classifier: License :: OSI Approved :: BSD 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 @@ -32,9 +31,8 @@ Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Text Processing :: Filters Classifier: Topic :: Utilities -Requires-Python: >=3.7 +Requires-Python: >=3.8 Provides-Extra: plugins -Requires-Dist: importlib-metadata; (python_version < '3.8') and extra == 'plugins' Provides-Extra: windows-terminal Requires-Dist: colorama>=0.4.6; extra == 'windows-terminal' Description-Content-Type: text/x-rst @@ -55,5 +53,5 @@ are: formats that PIL supports and ANSI sequences * it is usable as a command-line tool and as a library -Copyright 2006-2023 by the Pygments team, see ``AUTHORS``. +Copyright 2006-2024 by the Pygments team, see ``AUTHORS``. Licensed under the BSD, see ``LICENSE`` for details. diff --git a/libs/pygments-2.18.0.dist-info/RECORD b/libs/pygments-2.18.0.dist-info/RECORD new file mode 100644 index 000000000..272a1e436 --- /dev/null +++ b/libs/pygments-2.18.0.dist-info/RECORD @@ -0,0 +1,336 @@ +../../bin/pygmentize,sha256=iP3M-_dI6wQP1Gtg8ZvtFWFDy3x82yIJIrmsdlQpEe0,238 +pygments-2.18.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pygments-2.18.0.dist-info/METADATA,sha256=WWViMDj3GoEuYl9sIbkmA7zv0m0H5sJTUXUSeY73bs8,2461 +pygments-2.18.0.dist-info/RECORD,, +pygments-2.18.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pygments-2.18.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +pygments-2.18.0.dist-info/entry_points.txt,sha256=uUXw-XhMKBEX4pWcCtpuTTnPhL3h7OEE2jWi51VQsa8,53 +pygments-2.18.0.dist-info/licenses/AUTHORS,sha256=REECiHykNMqFuqEk366APNvWe6irSUOqok67E3Evtzw,10500 +pygments-2.18.0.dist-info/licenses/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331 +pygments/__init__.py,sha256=d9try3r146jyYauE2BNZ8aJEYfsJlVdS9Bqv-fZZ5Pw,2959 +pygments/__main__.py,sha256=Wgnr5lhKPtecgPavxdwRzAAaZoe-fCuq6LAEBbBBXd0,348 +pygments/cmdline.py,sha256=smQpJmIeqyPQ_xZ3Z9-O5FYDxTfngGg8icWV3hIcIIk,23536 +pygments/console.py,sha256=yhP9UsLAVmWKVQf2446JJewkA7AiXeeTf4Ieg3Oi2fU,1718 +pygments/filter.py,sha256=_ADNPCskD8_GmodHi6_LoVgPU3Zh336aBCT5cOeTMs0,1910 +pygments/filters/__init__.py,sha256=IuhzMxGWWMN9tYBZuO2VD602_Ai24ONZXc1cDKtFHPk,40344 +pygments/formatter.py,sha256=oPaCNqrEy_aGBGt-7zwzm9KpYs6v5tyfCd5nua233D4,4366 +pygments/formatters/__init__.py,sha256=C8E9WC8QpfxpCQSarFf_3KTaz21xEzw5N4ETSiv15zE,5349 +pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 +pygments/formatters/bbcode.py,sha256=EG993T9F65-VaRmq39A3vbmX-x8DyQh1hN4nAzqV6xg,3296 +pygments/formatters/groff.py,sha256=kEt7COeP_Cy5lqWUTO7w31bMyx56cpKG9ZPkN4RSMy4,5082 +pygments/formatters/html.py,sha256=bUbdrazRL2ONmkHWw1m2e6DHEIzwvJUogfiL_YhQT-U,35633 +pygments/formatters/img.py,sha256=V5fZUT6SKFnLJAxen7zVJw12EyXJyyLuOsiObTaGKCQ,23263 +pygments/formatters/irc.py,sha256=z1fWHg4G4sS8OMqY2N9b4k7k8bzJaKTkxo7Me8JQZGI,4945 +pygments/formatters/latex.py,sha256=Y2Nqn6a_QDxrlRju4_SYLQywJVsGBRtsHJ8Sup1hA4A,19258 +pygments/formatters/other.py,sha256=V2hrUtWYSS_klWzx1-h03aTxTkeBS4LEiVqy9ByPlKg,4986 +pygments/formatters/pangomarkup.py,sha256=JtIpELl-WIaZeoTJhfLbR7SkXmOhAp6I66lfRTPlxOA,2206 +pygments/formatters/rtf.py,sha256=Ffx6wgAqXr8iy4DhUkRiZlNiZ5QCe39fxPFvFScCOQ0,11921 +pygments/formatters/svg.py,sha256=JCIpG3y9p83APRD0vOSGU6rdsukv9rbZr81QpMIQlMw,7138 +pygments/formatters/terminal.py,sha256=B7X3InVYlDu142nk2wUkJcDtbKMLT1PA-Tfk49UE0j8,4626 +pygments/formatters/terminal256.py,sha256=B8t9Y8WJTgO2LWBGMXcRz2VfKySHLR-ZhGNuGQnDn98,11717 +pygments/lexer.py,sha256=9WU0ZHRI3mmVGymUCTgdVYNM3RRPUo-x_ijCGD1r8ho,35109 +pygments/lexers/__init__.py,sha256=svzhbvkX4ny7I2ALRRxd1yKzfRaUaGrY2Z0wrCNnd74,12067 +pygments/lexers/_ada_builtins.py,sha256=hnh_MphEm4skkHsAGGlVSp9-IG1IvA-Kkkplc54-WPI,1543 +pygments/lexers/_asy_builtins.py,sha256=nwBhZjbOkPUFReF22JgCde_AR6oaUBr1TEwIJDgxtec,27287 +pygments/lexers/_cl_builtins.py,sha256=gwESyMaPG0eSdwgr9uNUuEMmjX43Z5Nav5z9pDGnhMA,13994 +pygments/lexers/_cocoa_builtins.py,sha256=wa8Z6xRSVHiETfxU2WOuY4O9VN9ogH8PoVw4IpnTIYA,105173 +pygments/lexers/_csound_builtins.py,sha256=vr4PKbi_2T5iSdWLfqARILPB0Z-Wc_CPGjNaHvQhySQ,18414 +pygments/lexers/_css_builtins.py,sha256=5O6M8QQQ5518sqLorWlafT_eoN6mIbkT6OogR7gAq6M,12446 +pygments/lexers/_julia_builtins.py,sha256=f_mAv1J9t-4kA85bUlf5iazlZrjBj8X39LMrg6bOBAc,11883 +pygments/lexers/_lasso_builtins.py,sha256=a7MYoYE1yAgwyl7pHFpSZazz6VQLRI5pLCV8nn1xcvk,134510 +pygments/lexers/_lilypond_builtins.py,sha256=HOmm1nxJwnJIMKJ0IcCdZeAWF1a2-g2_0_lmGbxqNmg,108094 +pygments/lexers/_lua_builtins.py,sha256=8EUwcejkeZ4CpFxSoo2DON1UwFnJhbYRpF7Q22xiQ-8,8108 +pygments/lexers/_luau_builtins.py,sha256=eX-OzjU9gT4gvoVwCttALJMZxk2repLtc7mqHY54xWs,955 +pygments/lexers/_mapping.py,sha256=nPWeLyQslZd_A4ehzIefyWxmvcaTtqSCW6RMb47m9Xs,69089 +pygments/lexers/_mql_builtins.py,sha256=_1MtbSYIUf4B1Yl9hGVm-N4jdj7lcxmx3yFoiWzO3vM,24713 +pygments/lexers/_mysql_builtins.py,sha256=A5OlN4LrN-Ig1rfsUoLAaS80B_vYTG4Fj9bwiq_qGuc,25838 +pygments/lexers/_openedge_builtins.py,sha256=fTAp0gK3PEBDg47Rrdygxql73_C-AdHg8EGJ_Ld8p0U,49398 +pygments/lexers/_php_builtins.py,sha256=MikQttLCEbHulmTMT1LzJpRhDzUvuzRl0Yh-iKYyn1M,107922 +pygments/lexers/_postgres_builtins.py,sha256=-e9B90henKpkQDqEQGkS0sIeKGlg-l5VdDPWuSw5TtY,13343 +pygments/lexers/_qlik_builtins.py,sha256=ccaWjko7s6PNJnthww0eksfBH4kkrYy1qkWSwA7wk6o,12595 +pygments/lexers/_scheme_builtins.py,sha256=uQVSWBP5oCjD6YoV37xY3Ep4ao8fIVd8oSBlqqBn0og,32564 +pygments/lexers/_scilab_builtins.py,sha256=6kTzoifN-Dmbg7nlJJD1_ar3lEq6Uq5sdWCjV0A1R9A,52411 +pygments/lexers/_sourcemod_builtins.py,sha256=GxGZ9MWhiyrNktPoc57VdwxAA6sguWyFM_v09GcW3nc,26777 +pygments/lexers/_stan_builtins.py,sha256=aICL2mRN0xyWWknCUGVSS6s0HoK_rk91OmiYXSn2dMw,13445 +pygments/lexers/_stata_builtins.py,sha256=1JS2rARgtMan7763FA_zZ7UFT7t8YsGNJo47kLt4e2E,27227 +pygments/lexers/_tsql_builtins.py,sha256=ZVzbdvOcC-kbs1lXcaTAT3-XwgMJuPbYQtAc6jxb9ZY,15460 +pygments/lexers/_usd_builtins.py,sha256=dZRmB_M4Z-aVZFPG5FU-5Su6bPZOvJmCcNxYIF80MXo,1658 +pygments/lexers/_vbscript_builtins.py,sha256=ZVJrzBsxkQKPHVkrBNmWSHaWJcKYaPa9oiCTckzrqKA,4225 +pygments/lexers/_vim_builtins.py,sha256=vN66emQdRrvXF--5n2XOP1_8OI5VO96rxXlKABI4eAA,57066 +pygments/lexers/actionscript.py,sha256=o-fGli0AVanHyaN-nYkedrYgdE49umtHCduObXtfK_s,11727 +pygments/lexers/ada.py,sha256=O0T9BR80xzRn7MAYlf3BDJsQxDIS6x14x6sjLkK4gmo,5353 +pygments/lexers/agile.py,sha256=sWWEMQnlDt99eVuZyjd5uvnuebxCJ4ad2-UXAqti1iQ,896 +pygments/lexers/algebra.py,sha256=CdDxjCBPoETdvmErRu5TG67jy0KQhCmOVsO6nYH2Ym4,9912 +pygments/lexers/ambient.py,sha256=pVJWRy2554RUhQjxwF4JFMPkWbgt-bmqXPvsMu_rWb0,2605 +pygments/lexers/amdgpu.py,sha256=_LuGGZoY9bqDYf4OaPldxEvbhKvP_xqOy3T4gAKHbdg,1723 +pygments/lexers/ampl.py,sha256=q84rYyzGP1qmriMeZVt5Cl8ohugv1tp1hNdfWBYmU50,4176 +pygments/lexers/apdlexer.py,sha256=o0mYCKG9to1Foq7VAQmYQzn7WS7Qt1YH6zSApqv32wM,30800 +pygments/lexers/apl.py,sha256=YChhnBp5WIzKP2FZGDIBpqztQDS58hPz0Wi7mXcQgpA,3404 +pygments/lexers/archetype.py,sha256=8UDdDTxLyIyNCfGnH_dU90St96Jsnl9t2XshWW7dXm4,11538 +pygments/lexers/arrow.py,sha256=MfJlUb169MPfelyrH0jXCWkHfSLTljBCrknYQyAbpUA,3564 +pygments/lexers/arturo.py,sha256=PsV5SMa5h2RHgj161xJJDJX-0ubZ2Eyzt8bxzYeOC8g,11414 +pygments/lexers/asc.py,sha256=ZiLshADiwSba6srjtwibovBVX4hqXqquYK7_AAf4Ofw,1693 +pygments/lexers/asm.py,sha256=9QSICK9VKJLfjxMkEtkkrEGzbB2q6SZd9egDMlGWW1s,41934 +pygments/lexers/asn1.py,sha256=S7psbkDQTLFZd1jDK8KaWVkyi-wHiz7AFf2b1WN7YrQ,4262 +pygments/lexers/automation.py,sha256=Lv4-0vpmwFOX6dbsQHfKG9m7yOyrI6F7km16Z3O9ZTw,19831 +pygments/lexers/bare.py,sha256=s934nvvtAeG8avdi-Q04ZVQebjpo8xbZdhMH_FNnev0,3020 +pygments/lexers/basic.py,sha256=oHx7F-C6gW7AULTU_zfA8zowbmmxcdoyniYZIiaVd6o,27989 +pygments/lexers/bdd.py,sha256=I0tooXMevZw1eND_hrdAWtJ3n3nXgUDKDM5IoYJHRUg,1641 +pygments/lexers/berry.py,sha256=sLmGllDvhPB51Pe_M9BFx10QkqDGejcVZQxCVwEUIeA,3209 +pygments/lexers/bibtex.py,sha256=13JE6k9k1TUYTKit0zND246zLQ0xyL52lvMkrYopP14,4811 +pygments/lexers/blueprint.py,sha256=FZ2WkBuqlOBu0GH0rqjnNSHG_qdAu3jGt97Oen19feA,6188 +pygments/lexers/boa.py,sha256=T_VWCvNM-wt9IjPW4FV7u8NFngpx14dr9ZN7RdOLLVQ,3921 +pygments/lexers/bqn.py,sha256=ze1whgy0AsdgoEc1yHgk_4f2LihqOHjCVPUojA4BehE,3337 +pygments/lexers/business.py,sha256=j1h6DphSHRFwPB5shVQfrPsajprPItPKjHxqzQfdZTo,28345 +pygments/lexers/c_cpp.py,sha256=8e-rRebFzZgYSd52bXFShriP8jFVlCf0L2F0vI-9Rmg,18059 +pygments/lexers/c_like.py,sha256=JCHZRIboeGb0VE-bknxnoxd8oWQhr8T0qhS2i8vTlMI,32021 +pygments/lexers/capnproto.py,sha256=MJmnE8MYtWPUEqXh2_zBgG9FgQAD-10so6ORwpqHZRo,2174 +pygments/lexers/carbon.py,sha256=oYL5HLBgNOJIkLti5kjFFdwGIbtidKflCKk2tdHKgos,3211 +pygments/lexers/cddl.py,sha256=qaeINyt59SyAbxAMZHY0zcDGgxTEFPElG6DP3aa5nZA,5076 +pygments/lexers/chapel.py,sha256=XBFfoaOiLbfUvaNvnp_iQs_qLRpg41LUmAugtg-XGug,5156 +pygments/lexers/clean.py,sha256=vUMnhYzD3uvSc7Wdyzo7PZllAGt0dzXqhthY82qhL9c,6418 +pygments/lexers/comal.py,sha256=G_d_FHFU-wJFihoMPmZMLGF_Bl__HO0i1gC9InQ9rbE,3179 +pygments/lexers/compiled.py,sha256=nufWnAfB85AiZPELv0yzijrROD2wz9SEc54e9n_dmGk,1426 +pygments/lexers/configs.py,sha256=vNh6sytziBn-1qkqDwy_OFYTKxUH4kFsJ65Hc8Yx2Oc,50534 +pygments/lexers/console.py,sha256=39fVAcHxYtO7cy2_epBq30ShxDJxhgc09jd5J7dOAzE,4180 +pygments/lexers/cplint.py,sha256=0lqEPgDIFQuO7Q189JjG5whWlAw_YcTlWG9-aA6eli8,1389 +pygments/lexers/crystal.py,sha256=5UlYigeTeFRrfhHQiSN0DxqkWo2ibnhtcCErB5bTJdg,15754 +pygments/lexers/csound.py,sha256=ZX2bs4NykljvsrI5QXgQZXGH2IyP6ztFfT1v6gq3UnQ,16998 +pygments/lexers/css.py,sha256=571dDjM2lWepEn3ybYec0I5b3h54azXF7xJO2ZNyRLA,25366 +pygments/lexers/d.py,sha256=-mKlYHZMYsUV2BhW8C43AFnh97zeKJgyej7XSQbOA_I,9920 +pygments/lexers/dalvik.py,sha256=PIEJoUcYD7lij6eCg9wZgMFhUyazyQ8oFxHrpzmQFMk,4606 +pygments/lexers/data.py,sha256=l1fmUUlwiBccMAKX06phQ1tKr27mDpzwhnytwqxTbM0,27026 +pygments/lexers/dax.py,sha256=blHXcUy-QL9X25rLQDDW5DUceThB3sSa_4mOtCT1bkE,8098 +pygments/lexers/devicetree.py,sha256=K1jqVm8B-2K8rRzMElMNYWNUaUKbCIt62dVRQVjINI0,4019 +pygments/lexers/diff.py,sha256=_dlEodnJh3Y61GgP3AvRNpbC0LD-0nuOSd7PBDaOK-I,5382 +pygments/lexers/dns.py,sha256=do6plOeMEqasazJTfGpjYYTWLqvGKsTVNAd3SldgG_8,3891 +pygments/lexers/dotnet.py,sha256=apkKKord2c6opVFhiaK-vRrQxsJRRnFfhijPLKiMYS4,37958 +pygments/lexers/dsls.py,sha256=ea7bLN68qYqwx1yeRJvfn1YJP343rawhdO9NuDMRjnM,36746 +pygments/lexers/dylan.py,sha256=kcx1IB9pqjQyy4PXpu4YeiS64I8XSkE5dJ3ulWDWzMg,10391 +pygments/lexers/ecl.py,sha256=qmFlYH19sYDOli4aTjajecw_zRlvjmzq_VUeGfcEUk8,6371 +pygments/lexers/eiffel.py,sha256=8fpkGHe6drmZvcKOJkS0jz87H61JsQc3_999IM4Mg1c,2690 +pygments/lexers/elm.py,sha256=Dvh8YtUEbcnCC15pCmMGIuZFGenLsg_rS4X97GOyJiA,3152 +pygments/lexers/elpi.py,sha256=1JMrWjlWYdle82RJSZ0rTtTOCt9kLktyVJOumeK2dMc,6535 +pygments/lexers/email.py,sha256=vR1gKbuso2-oiJG5QXYUROYjaOGw8tYD9CmdbY68lAg,4804 +pygments/lexers/erlang.py,sha256=3xVUmnbvgbQN4QM5WGvIoQMFS9jJptBCRM3MP4KxsZo,19147 +pygments/lexers/esoteric.py,sha256=N9HJNvtxh5ktL_I8t_8vFJ6Ms-atOkplnE39GGe8wNg,10500 +pygments/lexers/ezhil.py,sha256=BfutGlZYc9b9uW5Qy4BIsNKWowdikL9mWijA-D_xK1M,3272 +pygments/lexers/factor.py,sha256=yxEbxsEFcReEaajn5S7bvaacuG2me1RRY5Fb2hYDW2M,19530 +pygments/lexers/fantom.py,sha256=meOft3jMJ98kNGetDPVvzu9nvVFC08udETA18j51TQ4,10231 +pygments/lexers/felix.py,sha256=o3E1v8qe9vyQjS9YK_LVPKwraosmfqqypRpOx7J-ikI,9655 +pygments/lexers/fift.py,sha256=ZTjrY--aKiHlg24KFpKUAq-wn8ULL_8G_E7N3TPMnKg,1644 +pygments/lexers/floscript.py,sha256=LYiIZfZ2HT05T3xR00J9_q5S6nxkEw-2v5GkcuS9kfI,2667 +pygments/lexers/forth.py,sha256=xyeyN7nMFszsaKYDG2oxLuhfjrZcBVKdRIKL6htxvSQ,7193 +pygments/lexers/fortran.py,sha256=llxa3itGDZfNWcmsQO55DjmWgvfvgohnEdt1T4m3AHo,10382 +pygments/lexers/foxpro.py,sha256=KW39vSlXkigjRqx6E7s7L895l4auXk9T9iyWB3XbjY4,26295 +pygments/lexers/freefem.py,sha256=gO8XOaVcwydnhWP8t2Cgl2YeQ4C75dbGDsQs3ko3SQo,26913 +pygments/lexers/func.py,sha256=2yYrp5etRM94BT0nkxxlcC2xAJ4PBOP8mV4i6flNmJo,3700 +pygments/lexers/functional.py,sha256=RJSf7XrVmsGQRYbbHKhWlJtfI5PZ6stlH8Va8WMdpLo,693 +pygments/lexers/futhark.py,sha256=QPbnZ_MvzMTQmYMTJbdJIvW8w7hQySJCViOTDH0Pv6I,3743 +pygments/lexers/gcodelexer.py,sha256=QE3tz5_Wu0c1GsjiVU-nbLi4ZcvGvRKjTUdT3VFbErA,874 +pygments/lexers/gdscript.py,sha256=eBdkj-lmw2TVTf7cvJYsFHVzEZ0C7kyZyVHHuelJ18A,7566 +pygments/lexers/go.py,sha256=dZY74RhlgVS7sZwEiqYm21AOOZ-NqrDXUHBz5aTkdDw,3783 +pygments/lexers/grammar_notation.py,sha256=vg1BvwySit-7LB8Y_5AQkgkj0AzIGAM0mHtaq_fbuYs,8043 +pygments/lexers/graph.py,sha256=kUfbhtuS9ysgfhUdFBnT86w_JK35I-ROzOZ3IQV7sTU,4108 +pygments/lexers/graphics.py,sha256=PXcPVmfAOROL1ocKa6ft6J3HfKgZQ9HvZ2k7AcSPl70,39145 +pygments/lexers/graphql.py,sha256=um1AZrLHx9qpZ6NFVBX_kRAFbM7TQV9l13ep7dCpKcY,5601 +pygments/lexers/graphviz.py,sha256=P-Xy34waH0BYD-Ccp1XmE9832I5MzO-_mwHsRrA5n0U,1934 +pygments/lexers/gsql.py,sha256=8y3ymaD6uFx-IrFJRy0D6i9wruaUETd_ceAsugtaxIw,3990 +pygments/lexers/haskell.py,sha256=e7WpOTNyaIj7Sr8B-JjGeGbSlACLVEa6vOM-XfWMrK0,33239 +pygments/lexers/haxe.py,sha256=hHGZkJt4JWpLHMTb0s6a01yQNxfnXgTPvnP-eyNp6YE,30974 +pygments/lexers/hdl.py,sha256=Vr-kHDFjxhQSE1TW4zttZ2zZHDCuXzpNcQL3tCjjjOI,22738 +pygments/lexers/hexdump.py,sha256=5F4mjn6fgyA1CaWFoYk4Ww-pHS02a_7zpoRr70WPm8A,3653 +pygments/lexers/html.py,sha256=dPeQnP4Qf8z6TZjL642FHTMMHRwCUccGVAAD90ORzXk,20574 +pygments/lexers/idl.py,sha256=UnYt9-IWBk37Kr0YvCCtU2D5TXWSIqPSmeglq7Wd-V4,15449 +pygments/lexers/igor.py,sha256=KvamBRiJOU67TDqHGB_PixR19IR1c9Fq0oLScXFPlmw,31626 +pygments/lexers/inferno.py,sha256=kSrMfu_3AofmBZ2uCH_YFD-0a95XRjmOKk7L_hB6CIA,3135 +pygments/lexers/installers.py,sha256=IVyOtXNeV3AVFv-18TjGbMF2xPgiI-kVejAo_EszuNA,13297 +pygments/lexers/int_fiction.py,sha256=LSf2BROdA4Mz_rgpsKLICJebljE3nQsh_K0hJvfVlaQ,56544 +pygments/lexers/iolang.py,sha256=XL_JsHAZRziGN8Sk08NZmSo5irAWU27yVy7czpU9GtQ,1905 +pygments/lexers/j.py,sha256=_fomKXuUh8FANTUl-HxE_x9WYRnKJGpAiQUMeVJUolo,4853 +pygments/lexers/javascript.py,sha256=m6VcUOwTUcpdZoJNaAIXE_zHq8NZBkQVqYZMRPXI1VE,63101 +pygments/lexers/jmespath.py,sha256=GBHuBxeDVdeUN03KuvFK4UIY3e79gYT0FkiDMWKgygw,2082 +pygments/lexers/jslt.py,sha256=p_0Qba5bPcyxERl2xsmFKet7_P0R5R0ist_3GFrN2us,3700 +pygments/lexers/jsonnet.py,sha256=bqXv1lRpxoIx8X-_Y1PIwOl-jgnEPtilCUL4wT2-2xE,5636 +pygments/lexers/jsx.py,sha256=qlRxi85Fh0kPvD5Viff9_Xm-gjfmEEKm3AsVDWTgM5o,2233 +pygments/lexers/julia.py,sha256=DLaYCAF4AN8nsgRzJY-MWlHEZtDuNZ4FznIFijJatGM,11679 +pygments/lexers/jvm.py,sha256=OFw18wPlecJDJjt16N3gMQVy_xmnxjcDCXlu4_NXTYQ,72666 +pygments/lexers/kuin.py,sha256=axJ3_tqZKu40OgkUP27qsyDEkM_TeZGQcKFXlYOrtMI,11405 +pygments/lexers/kusto.py,sha256=Q-UC6DQB4vuxtVsQcMZEp56CxXpIlJXeuP-WDEV-Eww,3477 +pygments/lexers/ldap.py,sha256=_ua5KpHLgDiTCKFVZ4OJkoBUh84FXGqeDX29UELMYzg,6551 +pygments/lexers/lean.py,sha256=bk6LaVc_PsSEhspNLzRMKkG6KyFWup7nhS7Kx1XXQ34,8570 +pygments/lexers/lilypond.py,sha256=gE6Z5xs7uocSCfaDOghkowKGblZX8zIE_v9eLZ651UQ,9752 +pygments/lexers/lisp.py,sha256=79Upl-OrKzZ-8443lyPRJHagOSwDGkxywKqJwXF66FA,157668 +pygments/lexers/macaulay2.py,sha256=iRTPn040k600ZQiY4IpPL-Byt027wBBhFMWn9QjgROc,32844 +pygments/lexers/make.py,sha256=5-2Mq3muMg9Yq5yfmXNI7UH-ApYh9VePrIvKsJTpNHg,7831 +pygments/lexers/markup.py,sha256=tgFazIqyrufzmAgd3FL-4-WMbwbc8ve5P7tJGvPWnOs,65088 +pygments/lexers/math.py,sha256=lI6LVR-OqL5XB46Nu41YE00QA1WKssPp1TFzH-NoV50,695 +pygments/lexers/matlab.py,sha256=gXzVaLWkjqmwqNJgxpyNbfqy8X2yDs9QyJaGQcXBu94,132962 +pygments/lexers/maxima.py,sha256=Qfe8sTugA5UhGuRzEKjspbH-w6YVlREdAAmGyKp5HZc,2715 +pygments/lexers/meson.py,sha256=FmmaxUNRV55nxQm6oQ2sXhhZZyNSms68V7Uxj7F9TuQ,4336 +pygments/lexers/mime.py,sha256=nwyBkz2_gJ-jUmxWpcNvpGYftazfk4V9adzcPashGeg,7582 +pygments/lexers/minecraft.py,sha256=GKPEYWI6HHvpOdEh4GTphfAM4mx8dOA6VFOsA0-1aAk,13696 +pygments/lexers/mips.py,sha256=YtvYhgqSdYtfy69FK5I7EiOPC2VSKdqq5_ZgPHD1wbE,4656 +pygments/lexers/ml.py,sha256=hZvMkwBzbgWYX4ndtUI_m9xAjjGmxyqPbwJe7FcAeoY,35390 +pygments/lexers/modeling.py,sha256=EebFhvTaBw279EkIcRDvIsGIo33A8TTgtvn__Ypun7A,13683 +pygments/lexers/modula2.py,sha256=2rHAQBCVnLu0mdaq8ERDPuHwF0wNh2r5SKl_vUJMea4,53072 +pygments/lexers/mojo.py,sha256=z9CDFFnBfI9G9gHRsYOtcCtKWbXKdLgRdvoKRVAoWTA,24181 +pygments/lexers/monte.py,sha256=DTy0svJRg7P7j7EwDPN5aG7l98Bm7STANyJSwOytv5c,6289 +pygments/lexers/mosel.py,sha256=cErB67hM5hw1qZYPKuHmOfrJu8H8uDk8B378hnCyI6M,9297 +pygments/lexers/ncl.py,sha256=zyV63ZeQnoV__OY6284jW8GENuzsXgY-_d6HxDz7m0w,63999 +pygments/lexers/nimrod.py,sha256=lBDewJqj_VNdsKQJ-8qQ--_ZFNbQZETraP8u92b62xU,6413 +pygments/lexers/nit.py,sha256=M91yluzYKftVIr2HsWdianN4gPirwBLybF287xiVb-o,2725 +pygments/lexers/nix.py,sha256=oUlbwP0ktviAB6lMtrzVwrzsgw09BPN0OS5NM6IMK40,4421 +pygments/lexers/oberon.py,sha256=QmaSlH1Magq2Kn6DlzZtowxTRWVTivoWPLsVj5ywHY8,4210 +pygments/lexers/objective.py,sha256=W3ikK5MZiP2nF8gpGO0wSA5LM3TGE6Z1GHkLFQXq0aI,23240 +pygments/lexers/ooc.py,sha256=xpKo2xGSael8ymrTyXhfyL7630zBx_Gatb4fEZ9qn14,2981 +pygments/lexers/openscad.py,sha256=u-Ow27qJeR3l6N-8gSzJ4ZsvviBvCylCbMnc3pCgb_s,3700 +pygments/lexers/other.py,sha256=U4tWdbxxxa-__MU48rejsw6n-OyZHf3ikk0O7dG4jxo,1763 +pygments/lexers/parasail.py,sha256=9KkwIh9KuvGjI_cgFuzlTOTZEgyPcLnz1ikKOM48x48,2719 +pygments/lexers/parsers.py,sha256=mZAfSp6U1KwcfnjzBUojmO_G1dlYMG8KEnaWqr4d5Ko,26596 +pygments/lexers/pascal.py,sha256=k1vWSa2xiclhbHYK9bcEj6pUgBR-RT2oLTagK9zn5YA,30989 +pygments/lexers/pawn.py,sha256=eYfJfp9ibWIJL0R5CGzg94vZI0nxlRI5bkbzzWuc3vM,8253 +pygments/lexers/perl.py,sha256=uVou8njqVI4tzGM2iX6P3OPud4FipZK-Zi2uFAhcOBA,39192 +pygments/lexers/phix.py,sha256=q-P5CcxMRvOGHuFAY5wAPUFWUY9IsGNj8gC7K5g28lE,23249 +pygments/lexers/php.py,sha256=UkF4jrSzj7HsTwrkPF42xTm-kOF3jT-yvc7CzicfwMI,13061 +pygments/lexers/pointless.py,sha256=pdrIHwcAcCJGfwHxFGHoJ_KkQXwPH2OKJbnlqIEugtU,1974 +pygments/lexers/pony.py,sha256=FIrwgNLoN1shYp_JQk9TzzWy_GzWp1Fikc8niAUA8Zc,3279 +pygments/lexers/praat.py,sha256=KZP6jV2BaJXeNEtGzCvGW7EO8tbNomTGuW3vqQ0BIoA,12676 +pygments/lexers/procfile.py,sha256=hdl66BmCMFYjVkD2Do41OsKL9qoo5cOFty6u1il1f7s,1155 +pygments/lexers/prolog.py,sha256=7ThE10pBk1juL1S87a_IBucCtEirJ4SdMHWv60hLw4s,12866 +pygments/lexers/promql.py,sha256=T6Vth5trlmxvEUZFlwaNmQIMqc6gks16Xjv6VLlNiD8,4738 +pygments/lexers/prql.py,sha256=yGEiiPGYoRS_BpWarVwu7iQV3ZY301w928fk_kIVXjo,8747 +pygments/lexers/ptx.py,sha256=bvZwgSRXvlP5FhYEeIJR08tqrdJzG4iz_l-GfaYGmXU,4501 +pygments/lexers/python.py,sha256=KEHRWLVhykUPwl10uBIev1RnQ5h5qGgcjVP-mtsY1rQ,53639 +pygments/lexers/q.py,sha256=j5sI-L_KvvtNVnghW7fDVTkPUpGeS8RMVetadtZkSZQ,6936 +pygments/lexers/qlik.py,sha256=BcEHm92Js-FoekcsuGx-Wp8B379PonGqV-CLEKqd7hA,3693 +pygments/lexers/qvt.py,sha256=kAu8NJpjGktB9Z4wJAMoQbGc8LafMV1b6z-R9XEyqA4,6103 +pygments/lexers/r.py,sha256=5AFY4SAj7RmscCdU4WYuI-XTnPBgryGkPKxvTkw3UDk,6342 +pygments/lexers/rdf.py,sha256=GigtsRZmYwMjFzebvH1LV6ops_gi5OqxDCfZ_xBZ1Lc,16042 +pygments/lexers/rebol.py,sha256=gacBQsL85pcTpjJS1UUKDrlmFanRnnPJYphjQDSmYiw,18259 +pygments/lexers/resource.py,sha256=Mve3WMK62BrefqaJzwnHai23DIPvg-qdu0vQumJPhzA,2927 +pygments/lexers/ride.py,sha256=qUAqA8gIMecQj3FOemfeYOtQ_iGC_mVkawdE6oUNopc,5035 +pygments/lexers/rita.py,sha256=2fP6PGLEPZVhUOWaU00sC36r2QWnZVi07QQ2BhLY1bE,1127 +pygments/lexers/rnc.py,sha256=E-4DyG21UILNE5UPpUSl43UmbaDA9JPEnrjFlPembuA,1972 +pygments/lexers/roboconf.py,sha256=0J7CIBT5CE0A18sjOJV4M3J2tAvGs_WC2M2GTYSmshE,2074 +pygments/lexers/robotframework.py,sha256=Nh5SSW_bchdqtioQo6bt3q4ULuL4dsoYau5_Pu-ah-I,18448 +pygments/lexers/ruby.py,sha256=vTykyjbAPIG-mRBnNKNgNGeAXwsv7MB8xWOkzrhpsWg,22753 +pygments/lexers/rust.py,sha256=B_H41x0dgnatX9zRLNAVOdPiEgFpENIXFYW7Jfsv8GQ,8260 +pygments/lexers/sas.py,sha256=FDX4GAE1Pcr5vmwCSSUx5Ym7qOPzQzxXiDnqqQzwnQ8,9456 +pygments/lexers/savi.py,sha256=eUiiyyRMQTXJacqlreYj8RgjZGPSTlpiJ9Ctll9cjjA,4878 +pygments/lexers/scdoc.py,sha256=9YOBIrmKLIC30ceVtfG4Qy5HHNWfzqb9Fw1-L3poZZQ,2524 +pygments/lexers/scripting.py,sha256=3mDK3eT62VIq-cmAo3js6wDxOYemfYtGQXccbGbMh-I,81062 +pygments/lexers/sgf.py,sha256=wfWiRnyh8Z9fl6oN0SGrDDcdrXSozvmTEDqHK0AOIiw,1985 +pygments/lexers/shell.py,sha256=kpL7It9fUab8bCQSKAPJiJuzWsgA6Tv5zo6TnmRdkiU,36234 +pygments/lexers/sieve.py,sha256=ymmZ8ZubRoVtBcgOr0UW_Dg5siMpJqgpZXC6LmE7RJo,2514 +pygments/lexers/slash.py,sha256=hc5BWEaTGxyGhIwaRaQAayXbr53Q6H3ZwHTC5o5R-WY,8484 +pygments/lexers/smalltalk.py,sha256=GxnNoY4eYE2-reCp4OL0d4DHBtHsZJTymRZY31Fq1lM,7204 +pygments/lexers/smithy.py,sha256=PjLWFlb-qYnEfkTOkLkpSBxkfG6gXCXsU-Pf42FKE0g,2659 +pygments/lexers/smv.py,sha256=w-WL-lSg0NKJKTEzZH94QeHQbMQlbxoId-vUP1nAbJk,2805 +pygments/lexers/snobol.py,sha256=vEBdaH4C9F6ctEKmMuWMmK_WKyCC40yi6q4HbXUZavo,2778 +pygments/lexers/solidity.py,sha256=Bc3mELp5mXvZNgr3vRzAqjKRtC6SPNhfmsaD6RdJGyc,3163 +pygments/lexers/soong.py,sha256=YpDy1HvoABJU26xq2-y0xs8BKIZyO3635VrYKOizhQ0,2339 +pygments/lexers/sophia.py,sha256=SxKzCczr5WU19adkc-NbnPCcY5ecN5Fx97zRsFhk7Rk,3376 +pygments/lexers/special.py,sha256=6-K1Ik28Dle15Ol_b1UANMcRIX7EcTo_Fbf3Wr-zp-k,3554 +pygments/lexers/spice.py,sha256=QKbDr0PSRObjF3knMghglx8zFVp2Hjrq8zSAn6XVWlc,2790 +pygments/lexers/sql.py,sha256=ESU6S2vX1jucKfOhe1tW8hKVluFTZYTvClB1AnGI9Kk,42594 +pygments/lexers/srcinfo.py,sha256=Lv2ptfstgzOtzY2MGqCUcDadyntJrCQMTP-rOie2iuU,1746 +pygments/lexers/stata.py,sha256=sxOLP7jb6UReJCjxUHJYAbgAJV7M_LNOGywLwkPWXTE,6415 +pygments/lexers/supercollider.py,sha256=dYszvpnKfaLGdmIEnruntz9VTccLmUYwzbbLvZfOPC4,3697 +pygments/lexers/tact.py,sha256=5KVnr9VxJeh_RKmbgOwR09X-5n7Th8Yb-Zk_0XTQovo,10809 +pygments/lexers/tal.py,sha256=VF3YLB4xvQB52W4GW9ZVNkDqkyPXASlHALhOJupw2SI,2904 +pygments/lexers/tcl.py,sha256=mepJbvCnYmZR1-dKK9Cfkt9m08bwTg7fOs96k2csfGg,5512 +pygments/lexers/teal.py,sha256=gCEC8QyKyq3aQk6E8E98fwD3vJrVZs58XsGjJ6GTL_4,3522 +pygments/lexers/templates.py,sha256=ASVTvkCvKfD7Ay5eETo7vs2Izc4ISP-UBUhpds_O1Yo,75719 +pygments/lexers/teraterm.py,sha256=3gwNILGwryBxytCTzS6qVGcZBFRfOX7svC11w4EpgSY,9718 +pygments/lexers/testing.py,sha256=5pQIJ7ZNeT02-GM0krZOXo8Pc3s6IbYbS46w0KjHaKE,10810 +pygments/lexers/text.py,sha256=EF6zAFvul6KpvQMPJrRw1FIr5ALAP8aScZ9VRqutid0,1048 +pygments/lexers/textedit.py,sha256=Kf8ALySo9XQ_UY6X9quOLA782ZwHvBHL17expjthZQI,7760 +pygments/lexers/textfmts.py,sha256=0_1KYSlbmLTZmFpX5iXktRKJ8OyVO9QmAFDg__rXGUk,15524 +pygments/lexers/theorem.py,sha256=z09aU_G5UI9DpsWf6jm-XPWcuUSKwJrAsLYqLgQuS8c,17855 +pygments/lexers/thingsdb.py,sha256=cLu1oiOV0R1mR9oZWX2wD03G0s7MWhkvguZ70FPgkaM,6017 +pygments/lexers/tlb.py,sha256=meibbT7CuzX9aFdel3o9uJDM9s4BsWHrHSd8SxyUl3Y,1450 +pygments/lexers/tls.py,sha256=o6vcxSNMeQmq9jIRY5Muyt2ETwLomqWK983LnENX9vU,1540 +pygments/lexers/tnt.py,sha256=okaq1-TxloDyopXy9pu6Ts5TbkfOqqynNzTbObH8JE0,10456 +pygments/lexers/trafficscript.py,sha256=U7l9JD39m5YHtmO50vR-5pilR1QBMxO2RdqWe-wkUyY,1506 +pygments/lexers/typoscript.py,sha256=dohTsxka3AAjgRfRYSyqO4WLxa_kcscDMf8SHxPWUKY,8332 +pygments/lexers/typst.py,sha256=lou5GsSvL-FuBVyDMT8Tg8jOXl4V3RW2exEPqUbmfXE,4337 +pygments/lexers/ul4.py,sha256=DyVoCHqF9AxIDJzFuBLcBgDbkXQzqhEmtcAkc4umnXA,10499 +pygments/lexers/unicon.py,sha256=TH8FGcxImq4Ioq20cKHfTN3abwD-1YaImuf_MC1s7rk,18625 +pygments/lexers/urbi.py,sha256=KreG90URYP6Xq-Cq5yLqkntpSmksjyJLrMo2ume7dM8,6082 +pygments/lexers/usd.py,sha256=p_wZfBLvMILyTTohmkxxJPWTce89zb_TMHFZcZY5mw0,3304 +pygments/lexers/varnish.py,sha256=YfIyQPkChcQ4VzcbDvGX7FLuemL2m9vB4w8hiyRKVfE,7473 +pygments/lexers/verification.py,sha256=iZR-iWX_SWCAYZ3YqIWjhcTmQdmtiEomay18Gz8HdVw,3934 +pygments/lexers/verifpal.py,sha256=dKEqh3m32VjEF_Bn0Ies8-Q0RkTfaKfJd06a9snQqmE,2661 +pygments/lexers/vip.py,sha256=nHw6Yq4msTQaJqnDEEmnH6O4KfxCwxPEnMPfHJQr8uE,5711 +pygments/lexers/vyper.py,sha256=I6Sr2i3ObogDbhElepwGzvnIH__htWF6cys3PqbimmM,5590 +pygments/lexers/web.py,sha256=a5Da6fOZsK8ft4lj86ADqZnBFgV3jNw7oZCd_nepWXI,913 +pygments/lexers/webassembly.py,sha256=sXB1c9mVobzv5F8rEmRi4re3UgTD_iGxHR3rf0zQieY,5698 +pygments/lexers/webidl.py,sha256=9eutoEoxDJk6MEbcQIpM79EkQalU2-DDKbZQQKDYsrg,10516 +pygments/lexers/webmisc.py,sha256=3CxiToHU2w3cHqyOizoWlP0rZAsrASowZQWZIu5XC-Q,40564 +pygments/lexers/wgsl.py,sha256=PrBbAe9TxRiJXQhm7kiwLsiKFm3y0X4I66whtWGOIAs,11880 +pygments/lexers/whiley.py,sha256=iH-TV5itY3LNcr1072PapDpMX2ys2RIKthe98F3BXhg,4017 +pygments/lexers/wowtoc.py,sha256=K1-o9Ui3vr7yMUWNoipFZmQUzTrvzRkvm6Z0_S4FDk8,4076 +pygments/lexers/wren.py,sha256=TOQXYQk-Vl0XLJ4_TZcsSaBiJMqE8KKi5Xu8A-nrrmM,3229 +pygments/lexers/x10.py,sha256=lHNR_3TM82-nl5FynZByOZ-YlX_jFz3relStlHriDIk,1943 +pygments/lexers/xorg.py,sha256=UriOYGMw2YiogLg7a1pVHQ_byUE1rkYybIw252-yL-I,925 +pygments/lexers/yang.py,sha256=kzRAGm1AELRrc3NF6xN4Axc-M2DTzf90zqd0vyLIMWI,4499 +pygments/lexers/yara.py,sha256=IhbIy7H8A__Y023fNwLgXzSW5H0SI0uHyzt2cXY75AI,2427 +pygments/lexers/zig.py,sha256=nnm8oDDjYCLGB_JhWHobZ9hP1U_JIXJdyyetxyAJ2WQ,3976 +pygments/modeline.py,sha256=gtRYZBS-CKOCDXHhGZqApboHBaZwGH8gznN3O6nuxj4,1005 +pygments/plugin.py,sha256=ioeJ3QeoJ-UQhZpY9JL7vbxsTVuwwM7BCu-Jb8nN0AU,1891 +pygments/regexopt.py,sha256=Hky4EB13rIXEHQUNkwmCrYqtIlnXDehNR3MztafZ43w,3072 +pygments/scanner.py,sha256=NDy3ofK_fHRFK4hIDvxpamG871aewqcsIb6sgTi7Fhk,3092 +pygments/sphinxext.py,sha256=gQAWnR6_1SM6OwUypWg1DlXrmmF9o3ZzbxsaXDsiRVg,7898 +pygments/style.py,sha256=dCFnKszVtsMeSW20uHC4pU3yuYgVPuJggm64-2Ylmo4,6408 +pygments/styles/__init__.py,sha256=v0aGLoaoKnp4_MGp4w-cmUvMoHYHMemiz_e_IPMLpbg,2006 +pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312 +pygments/styles/abap.py,sha256=9rx_hWD_GptC9nhoXVVc3p8ysYJ9wQfcReqgzyic2OM,749 +pygments/styles/algol.py,sha256=zeOLl6K37RauOH7chM5o_MC7UyTo81kk6sEOn5Joy8o,2262 +pygments/styles/algol_nu.py,sha256=XGmfWujpWLfNJ4AL7BJX0Xyr3wp3vUEV7x7eYj4Z5y4,2283 +pygments/styles/arduino.py,sha256=7IEZ8-xN_h8FjvuJFZiuVmZKC69gD57zgWussXjPsco,4557 +pygments/styles/autumn.py,sha256=76KNB7kJfZIOqcH0nZ0y6kh8xWWQc_-agkIJFWbCdf4,2195 +pygments/styles/borland.py,sha256=Gv5bXGIKuMGr0Oi4rbOrmEhZzdwHNLA20iQcuHg9yGQ,1611 +pygments/styles/bw.py,sha256=zJUiRQGS9OIE7H82M--9A8_jiqWTUPmjf0ZfWz0eSNY,1406 +pygments/styles/coffee.py,sha256=vdWBg6Oaj6T_TvfDSX1Ex6C8jOMggi1ZukUdMErPioE,2308 +pygments/styles/colorful.py,sha256=x6Oka6AQiGm-PtzuF5AdHUUZk61ZZXhvjOjHdsuFsTE,2832 +pygments/styles/default.py,sha256=YVxaKrvLvV9PD3I_7J6OE9gIYZE0O4fRWVr2qY9YWMg,2588 +pygments/styles/dracula.py,sha256=qcgo21Tvi-_KyjXvHHWQus19kNYJbtOvDZbYDcMXBno,2182 +pygments/styles/emacs.py,sha256=FknUJ19Pkh3iRLtVwUwxDOGwvVcJ8ZWPegGbCbTLlq4,2535 +pygments/styles/friendly.py,sha256=wbmM_eI7io4ZiU7s04dbLu8MyBHi0nwkSCvA4PjhA10,2604 +pygments/styles/friendly_grayscale.py,sha256=4VH0U_dWcANmzD5YvTfNGBAHt1NMa64Gxqvh2cMB5fY,2828 +pygments/styles/fruity.py,sha256=lZKB5CspS2-7XiCS0HUR1Rw_p8bf7H5auyYXdH0RviA,1324 +pygments/styles/gh_dark.py,sha256=q4ydCJLNNemg3FrShh3OeX3LLkI_ix6ZwAzsZ_U7bIA,3590 +pygments/styles/gruvbox.py,sha256=kNlwHRuiNt6nFiV73HjEM9R7CpaYVzCyL19PWoKdVAA,3387 +pygments/styles/igor.py,sha256=pxC51nXipMCi3K2lYzuTJI3VkwPTqF7xSu5co_PiU0s,737 +pygments/styles/inkpot.py,sha256=jRs2u3nQsLhUOX3Fkl4eaNurasOtlEy3wKCMPWcPpFE,2404 +pygments/styles/lightbulb.py,sha256=RJcQHPcC3SfqOtyWOzOXGysd5iyirTkkR6cqxch9LRQ,3172 +pygments/styles/lilypond.py,sha256=faTOHQ9NCV-yWV3AxhnQ6wMvakoxQ8oBZw5BTDQOYGo,2066 +pygments/styles/lovelace.py,sha256=y-5nl4TavhUCYrTHU_ysTNQDh40dUeqiGrAQuPmF1xc,3178 +pygments/styles/manni.py,sha256=-zRQEJnjkXJpGmMMlJSOMNGho6VAsDimCvW79aqntG4,2443 +pygments/styles/material.py,sha256=28SYTw9qOuQS42Qsy8lDUNBvJzbliNH8Crq0e5N2sIc,4201 +pygments/styles/monokai.py,sha256=TvyWTqvy6oZxKNARKT7mgt2LgmNKLy2DL8Tphj6kjWk,5184 +pygments/styles/murphy.py,sha256=txf8iMJaPpynJRtnZJILTAagWhZ7Vdxn9DGcn8TE_q4,2805 +pygments/styles/native.py,sha256=0Ke0kSPZ3ARlI6ncLQzLiYGM660OpcuhNJfzHwJyVLU,2043 +pygments/styles/nord.py,sha256=Ee-EgGAEhW8Yi2CNxx2URZm2AGFADHurN9BwFIDBcd4,5391 +pygments/styles/onedark.py,sha256=SpfxQcze3C4s8R1DIxBn_YmuZC65X8UoShN8Dzuyuxs,1719 +pygments/styles/paraiso_dark.py,sha256=4IBihUb0MsjbT1CXpmIYx2kxwDZRXh4wPRgxXXzbuvM,5662 +pygments/styles/paraiso_light.py,sha256=6_LiKp3-cjlNW3q82poUZJktJQBhoUVROB0UgbgCPRs,5668 +pygments/styles/pastie.py,sha256=Y1FWBgt6FDcZxpbiaAgj2x7_4gx-d_fSSwdhSnfcFRU,2525 +pygments/styles/perldoc.py,sha256=n280hEgwbxNgHWnY5tvpwvBWoeKokUP3xYeSMnUDu0s,2230 +pygments/styles/rainbow_dash.py,sha256=FHP8Es63TK_81EkyhlDTMZbZ-IqTKG3FkACbwMdJKVc,2390 +pygments/styles/rrt.py,sha256=-PdgNtub-w6B04dL_BZxoztjMl42JdtekA_OLO-QXDw,964 +pygments/styles/sas.py,sha256=wFRC1zzCjIaUoxp7F2F4PsQlrLgi0Lhl73EBhBa6MZU,1440 +pygments/styles/solarized.py,sha256=sxXpKTLLJqbOZSaikQr9xK2YC39aMd7s1cVZk0WncnY,4247 +pygments/styles/staroffice.py,sha256=Q8lR_zkR-YTqdyNNETypBdIjCGx4lQhUitdC56DKntY,831 +pygments/styles/stata_dark.py,sha256=6HrS2rre1SjqCnhvFU_fZ0k657owP1tQO5UdY7xQk-k,1257 +pygments/styles/stata_light.py,sha256=AleMjdPmr3OqBLdBrLyYRs_Qnnr2s27zWuh88CPtYY8,1289 +pygments/styles/tango.py,sha256=N68BibRMXHmNTIt2-gH2krdqErgKmKaWiv3l5mO_yG4,7137 +pygments/styles/trac.py,sha256=FVuEbNlIthXD2ajLaWBewGTvyx9tQtmleg-7Cigwnj4,1981 +pygments/styles/vim.py,sha256=RxqkvCriR3QwCxZsSjTwFUzNBmFEcWKWbn5H9w7hwDE,2019 +pygments/styles/vs.py,sha256=cG9_3FVzYiirGa8uesnwH4q1L6ZRb9nlwy_W1SAZ19w,1130 +pygments/styles/xcode.py,sha256=4A2br07F5Q7X8dUkqu14oHLGT5zsuOiv-e0V0UYCCu4,1504 +pygments/styles/zenburn.py,sha256=EyWeyFH9wRLSHc2S4v-rgFIro_b8H9Ia-gaRE2PJgCs,2203 +pygments/token.py,sha256=qZwT7LSPy5YBY3JgDjut642CCy7JdQzAfmqD9NmT5j0,6226 +pygments/unistring.py,sha256=p5c1i-HhoIhWemy9CUsaN9o39oomYHNxXll0Xfw6tEA,63208 +pygments/util.py,sha256=2tj2nS1X9_OpcuSjf8dOET2bDVZhs8cEKd_uT6-Fgg8,10031 diff --git a/libs/pygments-2.17.2.dist-info/REQUESTED b/libs/pygments-2.18.0.dist-info/REQUESTED similarity index 100% rename from libs/pygments-2.17.2.dist-info/REQUESTED rename to libs/pygments-2.18.0.dist-info/REQUESTED diff --git a/libs/urllib3-2.2.1.dist-info/WHEEL b/libs/pygments-2.18.0.dist-info/WHEEL similarity index 67% rename from libs/urllib3-2.2.1.dist-info/WHEEL rename to libs/pygments-2.18.0.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/urllib3-2.2.1.dist-info/WHEEL +++ b/libs/pygments-2.18.0.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/pygments-2.17.2.dist-info/entry_points.txt b/libs/pygments-2.18.0.dist-info/entry_points.txt similarity index 100% rename from libs/pygments-2.17.2.dist-info/entry_points.txt rename to libs/pygments-2.18.0.dist-info/entry_points.txt diff --git a/libs/pygments-2.17.2.dist-info/licenses/AUTHORS b/libs/pygments-2.18.0.dist-info/licenses/AUTHORS similarity index 97% rename from libs/pygments-2.17.2.dist-info/licenses/AUTHORS rename to libs/pygments-2.18.0.dist-info/licenses/AUTHORS index 0e9f51271..4ec64ba1e 100644 --- a/libs/pygments-2.17.2.dist-info/licenses/AUTHORS +++ b/libs/pygments-2.18.0.dist-info/licenses/AUTHORS @@ -46,6 +46,7 @@ Other contributors, listed alphabetically, are: * chebee7i -- Python traceback lexer improvements * Hiram Chirino -- Scaml and Jade lexers * Mauricio Caceres -- SAS and Stata lexers. +* Michael Camilleri, John Gabriele, sogaiu -- Janet lexer * Ian Cooper -- VGL lexer * David Corbett -- Inform, Jasmin, JSGF, Snowball, and TADS 3 lexers * Leaf Corcoran -- MoonScript lexer @@ -115,6 +116,8 @@ Other contributors, listed alphabetically, are: MSDOS session, BC, WDiff * Brian R. Jackson -- Tea lexer * Christian Jann -- ShellSession lexer +* Jonas Camillus Jeppesen -- Line numbers and line highlighting for + RTF-formatter * Dennis Kaarsemaker -- sources.list lexer * Dmitri Kabak -- Inferno Limbo lexer * Igor Kalnitsky -- vhdl lexer @@ -195,6 +198,7 @@ Other contributors, listed alphabetically, are: * Kashif Rasul -- CUDA lexer * Nathan Reed -- HLSL lexer * Justin Reidy -- MXML lexer +* Jonathon Reinhart, Google LLC -- Soong lexer * Norman Richards -- JSON lexer * Corey Richardson -- Rust lexer updates * Fabrizio Riguzzi -- cplint leder @@ -274,6 +278,6 @@ Other contributors, listed alphabetically, are: * vanillajonathan -- PRQL lexer * Nikolay Antipov -- OpenSCAD lexer * Markus Meyer, Nextron Systems -- YARA lexer - +* Hannes Römer -- Mojo lexer Many thanks for all contributions! diff --git a/libs/pygments-2.17.2.dist-info/licenses/LICENSE b/libs/pygments-2.18.0.dist-info/licenses/LICENSE similarity index 100% rename from libs/pygments-2.17.2.dist-info/licenses/LICENSE rename to libs/pygments-2.18.0.dist-info/licenses/LICENSE diff --git a/libs/pygments/__init__.py b/libs/pygments/__init__.py index 6b77c465c..e5a669ccb 100644 --- a/libs/pygments/__init__.py +++ b/libs/pygments/__init__.py @@ -21,12 +21,12 @@ .. _Pygments master branch: https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ from io import StringIO, BytesIO -__version__ = '2.17.2' +__version__ = '2.18.0' __docformat__ = 'restructuredtext' __all__ = ['lex', 'format', 'highlight'] diff --git a/libs/pygments/__main__.py b/libs/pygments/__main__.py index 5eb2c747a..a24353174 100644 --- a/libs/pygments/__main__.py +++ b/libs/pygments/__main__.py @@ -4,7 +4,7 @@ Main entry point for ``python -m pygments``. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/cmdline.py b/libs/pygments/cmdline.py index 435231e65..df1c3b7a4 100644 --- a/libs/pygments/cmdline.py +++ b/libs/pygments/cmdline.py @@ -4,7 +4,7 @@ Command line interface. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -68,19 +68,19 @@ def _print_help(what, name): try: if what == 'lexer': cls = get_lexer_by_name(name) - print("Help on the %s lexer:" % cls.name) + print(f"Help on the {cls.name} lexer:") print(dedent(cls.__doc__)) elif what == 'formatter': cls = find_formatter_class(name) - print("Help on the %s formatter:" % cls.name) + print(f"Help on the {cls.name} formatter:") print(dedent(cls.__doc__)) elif what == 'filter': cls = find_filter_class(name) - print("Help on the %s filter:" % name) + print(f"Help on the {name} filter:") print(dedent(cls.__doc__)) return 0 except (AttributeError, ValueError): - print("%s not found!" % what, file=sys.stderr) + print(f"{what} not found!", file=sys.stderr) return 1 @@ -97,7 +97,7 @@ def _print_list(what): info.append(tup) info.sort() for i in info: - print(('* %s\n %s %s') % i) + print(('* {}\n {} {}').format(*i)) elif what == 'formatter': print() @@ -112,7 +112,7 @@ def _print_list(what): info.append(tup) info.sort() for i in info: - print(('* %s\n %s %s') % i) + print(('* {}\n {} {}').format(*i)) elif what == 'filter': print() @@ -122,7 +122,7 @@ def _print_list(what): for name in get_all_filters(): cls = find_filter_class(name) print("* " + name + ':') - print(" %s" % docstring_headline(cls)) + print(f" {docstring_headline(cls)}") elif what == 'style': print() @@ -132,7 +132,7 @@ def _print_list(what): for name in get_all_styles(): cls = get_style_by_name(name) print("* " + name + ':') - print(" %s" % docstring_headline(cls)) + print(f" {docstring_headline(cls)}") def _print_list_as_json(requested_items): @@ -185,8 +185,8 @@ def main_inner(parser, argns): return 0 if argns.V: - print('Pygments version %s, (c) 2006-2023 by Georg Brandl, Matthäus ' - 'Chajdas and contributors.' % __version__) + print(f'Pygments version {__version__}, (c) 2006-2024 by Georg Brandl, Matthäus ' + 'Chajdas and contributors.') return 0 def is_only_option(opt): @@ -659,7 +659,7 @@ def main(args=sys.argv): msg = info[-1].strip() if len(info) >= 3: # extract relevant file and position info - msg += '\n (f%s)' % info[-2].split('\n')[0].strip()[1:] + msg += '\n (f{})'.format(info[-2].split('\n')[0].strip()[1:]) print(file=sys.stderr) print('*** Error while highlighting:', file=sys.stderr) print(msg, file=sys.stderr) diff --git a/libs/pygments/console.py b/libs/pygments/console.py index deb4937f7..4c1a06219 100644 --- a/libs/pygments/console.py +++ b/libs/pygments/console.py @@ -4,7 +4,7 @@ Format colored console output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -27,12 +27,12 @@ "brightmagenta", "brightcyan", "white"] x = 30 -for d, l in zip(dark_colors, light_colors): - codes[d] = esc + "%im" % x - codes[l] = esc + "%im" % (60 + x) +for dark, light in zip(dark_colors, light_colors): + codes[dark] = esc + "%im" % x + codes[light] = esc + "%im" % (60 + x) x += 1 -del d, l, x +del dark, light, x codes["white"] = codes["bold"] diff --git a/libs/pygments/filter.py b/libs/pygments/filter.py index dafa08d15..aa6f76041 100644 --- a/libs/pygments/filter.py +++ b/libs/pygments/filter.py @@ -4,7 +4,7 @@ Module that implements the default filter. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -62,8 +62,7 @@ class FunctionFilter(Filter): def __init__(self, **options): if not hasattr(self, 'function'): - raise TypeError('%r used without bound function' % - self.__class__.__name__) + raise TypeError(f'{self.__class__.__name__!r} used without bound function') Filter.__init__(self, **options) def filter(self, lexer, stream): diff --git a/libs/pygments/filters/__init__.py b/libs/pygments/filters/__init__.py index 8bd53745c..86e8dacf3 100644 --- a/libs/pygments/filters/__init__.py +++ b/libs/pygments/filters/__init__.py @@ -5,7 +5,7 @@ Module containing filter lookup functions and default filters. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -39,7 +39,7 @@ def get_filter_by_name(filtername, **options): if cls: return cls(**options) else: - raise ClassNotFound('filter %r not found' % filtername) + raise ClassNotFound(f'filter {filtername!r} not found') def get_all_filters(): @@ -79,9 +79,9 @@ def __init__(self, **options): Filter.__init__(self, **options) tags = get_list_opt(options, 'codetags', ['XXX', 'TODO', 'FIXME', 'BUG', 'NOTE']) - self.tag_re = re.compile(r'\b(%s)\b' % '|'.join([ + self.tag_re = re.compile(r'\b({})\b'.format('|'.join([ re.escape(tag) for tag in tags if tag - ])) + ]))) def filter(self, lexer, stream): regex = self.tag_re diff --git a/libs/pygments/formatter.py b/libs/pygments/formatter.py index 87183abbb..cad3b388c 100644 --- a/libs/pygments/formatter.py +++ b/libs/pygments/formatter.py @@ -4,7 +4,7 @@ Base formatter class. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -122,3 +122,8 @@ def format(self, tokensource, outfile): # wrap the outfile in a StreamWriter outfile = codecs.lookup(self.encoding)[3](outfile) return self.format_unencoded(tokensource, outfile) + + # Allow writing Formatter[str] or Formatter[bytes]. That's equivalent to + # Formatter. This helps when using third-party type stubs from typeshed. + def __class_getitem__(cls, name): + return cls diff --git a/libs/pygments/formatters/__init__.py b/libs/pygments/formatters/__init__.py index 6e482a1b7..014de975f 100644 --- a/libs/pygments/formatters/__init__.py +++ b/libs/pygments/formatters/__init__.py @@ -4,7 +4,7 @@ Pygments formatters. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -77,7 +77,7 @@ def get_formatter_by_name(_alias, **options): """ cls = find_formatter_class(_alias) if cls is None: - raise ClassNotFound("no formatter found for name %r" % _alias) + raise ClassNotFound(f"no formatter found for name {_alias!r}") return cls(**options) @@ -103,17 +103,16 @@ def load_formatter_from_file(filename, formattername="CustomFormatter", **option exec(f.read(), custom_namespace) # Retrieve the class `formattername` from that namespace if formattername not in custom_namespace: - raise ClassNotFound('no valid %s class found in %s' % - (formattername, filename)) + raise ClassNotFound(f'no valid {formattername} class found in {filename}') formatter_class = custom_namespace[formattername] # And finally instantiate it with the options return formatter_class(**options) except OSError as err: - raise ClassNotFound('cannot read %s: %s' % (filename, err)) + raise ClassNotFound(f'cannot read {filename}: {err}') except ClassNotFound: raise except Exception as err: - raise ClassNotFound('error when loading custom formatter: %s' % err) + raise ClassNotFound(f'error when loading custom formatter: {err}') def get_formatter_for_filename(fn, **options): @@ -135,7 +134,7 @@ def get_formatter_for_filename(fn, **options): for filename in cls.filenames: if _fn_matches(fn, filename): return cls(**options) - raise ClassNotFound("no formatter found for file name %r" % fn) + raise ClassNotFound(f"no formatter found for file name {fn!r}") class _automodule(types.ModuleType): diff --git a/libs/pygments/formatters/bbcode.py b/libs/pygments/formatters/bbcode.py index 9ce4ebc5a..955408106 100644 --- a/libs/pygments/formatters/bbcode.py +++ b/libs/pygments/formatters/bbcode.py @@ -4,7 +4,7 @@ BBcode formatter. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -60,7 +60,7 @@ def _make_styles(self): for ttype, ndef in self.style: start = end = '' if ndef['color']: - start += '[color=#%s]' % ndef['color'] + start += '[color=#{}]'.format(ndef['color']) end = '[/color]' + end if ndef['bold']: start += '[b]' diff --git a/libs/pygments/formatters/groff.py b/libs/pygments/formatters/groff.py index 687fd5496..a9e071128 100644 --- a/libs/pygments/formatters/groff.py +++ b/libs/pygments/formatters/groff.py @@ -4,7 +4,7 @@ Formatter for groff output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -63,7 +63,7 @@ def _make_styles(self): for ttype, ndef in self.style: start = end = '' if ndef['color']: - start += '\\m[%s]' % ndef['color'] + start += '\\m[{}]'.format(ndef['color']) end = '\\m[]' + end if ndef['bold']: start += bold @@ -72,7 +72,7 @@ def _make_styles(self): start += italic end = regular + end if ndef['bgcolor']: - start += '\\M[%s]' % ndef['bgcolor'] + start += '\\M[{}]'.format(ndef['bgcolor']) end = '\\M[]' + end self.styles[ttype] = start, end diff --git a/libs/pygments/formatters/html.py b/libs/pygments/formatters/html.py index df2469e2a..3330c1d58 100644 --- a/libs/pygments/formatters/html.py +++ b/libs/pygments/formatters/html.py @@ -4,7 +4,7 @@ Formatter for HTML output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -62,7 +62,7 @@ def _get_ttype_class(ttype): CSSFILE_TEMPLATE = '''\ /* generated by Pygments <https://pygments.org/> -Copyright 2006-2023 by the Pygments team. +Copyright 2006-2024 by the Pygments team. Licensed under the BSD license, see LICENSE for details. */ %(styledefs)s @@ -73,7 +73,7 @@ def _get_ttype_class(ttype): "http://www.w3.org/TR/html4/strict.dtd"> <!-- generated by Pygments <https://pygments.org/> -Copyright 2006-2023 by the Pygments team. +Copyright 2006-2024 by the Pygments team. Licensed under the BSD license, see LICENSE for details. --> <html> @@ -488,7 +488,7 @@ def _create_stylesheet(self): name = self._get_css_class(ttype) style = '' if ndef['color']: - style += 'color: %s; ' % webify(ndef['color']) + style += 'color: {}; '.format(webify(ndef['color'])) if ndef['bold']: style += 'font-weight: bold; ' if ndef['italic']: @@ -496,9 +496,9 @@ def _create_stylesheet(self): if ndef['underline']: style += 'text-decoration: underline; ' if ndef['bgcolor']: - style += 'background-color: %s; ' % webify(ndef['bgcolor']) + style += 'background-color: {}; '.format(webify(ndef['bgcolor'])) if ndef['border']: - style += 'border: 1px solid %s; ' % webify(ndef['border']) + style += 'border: 1px solid {}; '.format(webify(ndef['border'])) if style: t2c[ttype] = name # save len(ttype) to enable ordering the styles by @@ -530,7 +530,7 @@ def get_token_style_defs(self, arg=None): styles.sort() lines = [ - '%s { %s } /* %s */' % (prefix(cls), style, repr(ttype)[6:]) + f'{prefix(cls)} {{ {style} }} /* {repr(ttype)[6:]} */' for (level, ttype, cls, style) in styles ] @@ -548,24 +548,24 @@ def get_background_style_defs(self, arg=None): if Text in self.ttype2class: text_style = ' ' + self.class2style[self.ttype2class[Text]][0] lines.insert( - 0, '%s{ background: %s;%s }' % ( + 0, '{}{{ background: {};{} }}'.format( prefix(''), bg_color, text_style ) ) if hl_color is not None: lines.insert( - 0, '%s { background-color: %s }' % (prefix('hll'), hl_color) + 0, '{} {{ background-color: {} }}'.format(prefix('hll'), hl_color) ) return lines def get_linenos_style_defs(self): lines = [ - 'pre { %s }' % self._pre_style, - 'td.linenos .normal { %s }' % self._linenos_style, - 'span.linenos { %s }' % self._linenos_style, - 'td.linenos .special { %s }' % self._linenos_special_style, - 'span.linenos.special { %s }' % self._linenos_special_style, + f'pre {{ {self._pre_style} }}', + f'td.linenos .normal {{ {self._linenos_style} }}', + f'span.linenos {{ {self._linenos_style} }}', + f'td.linenos .special {{ {self._linenos_special_style} }}', + f'span.linenos.special {{ {self._linenos_special_style} }}', ] return lines @@ -594,17 +594,15 @@ def _pre_style(self): @property def _linenos_style(self): - return 'color: %s; background-color: %s; padding-left: 5px; padding-right: 5px;' % ( - self.style.line_number_color, - self.style.line_number_background_color - ) + color = self.style.line_number_color + background_color = self.style.line_number_background_color + return f'color: {color}; background-color: {background_color}; padding-left: 5px; padding-right: 5px;' @property def _linenos_special_style(self): - return 'color: %s; background-color: %s; padding-left: 5px; padding-right: 5px;' % ( - self.style.line_number_special_color, - self.style.line_number_special_background_color - ) + color = self.style.line_number_special_color + background_color = self.style.line_number_special_background_color + return f'color: {color}; background-color: {background_color}; padding-left: 5px; padding-right: 5px;' def _decodeifneeded(self, value): if isinstance(value, bytes): @@ -685,9 +683,9 @@ def _wrap_tablelinenos(self, inner): if nocls: if special_line: - style = ' style="%s"' % self._linenos_special_style + style = f' style="{self._linenos_special_style}"' else: - style = ' style="%s"' % self._linenos_style + style = f' style="{self._linenos_style}"' else: if special_line: style = ' class="special"' @@ -695,7 +693,7 @@ def _wrap_tablelinenos(self, inner): style = ' class="normal"' if style: - line = '<span%s>%s</span>' % (style, line) + line = f'<span{style}>{line}</span>' lines.append(line) @@ -744,9 +742,9 @@ def _wrap_inlinelinenos(self, inner): if nocls: if special_line: - style = ' style="%s"' % self._linenos_special_style + style = f' style="{self._linenos_special_style}"' else: - style = ' style="%s"' % self._linenos_style + style = f' style="{self._linenos_style}"' else: if special_line: style = ' class="linenos special"' @@ -754,7 +752,7 @@ def _wrap_inlinelinenos(self, inner): style = ' class="linenos"' if style: - linenos = '<span%s>%s</span>' % (style, line) + linenos = f'<span{style}>{line}</span>' else: linenos = line @@ -791,13 +789,13 @@ def _wrap_div(self, inner): style = [] if (self.noclasses and not self.nobackground and self.style.background_color is not None): - style.append('background: %s' % (self.style.background_color,)) + style.append(f'background: {self.style.background_color}') if self.cssstyles: style.append(self.cssstyles) style = '; '.join(style) - yield 0, ('<div' + (self.cssclass and ' class="%s"' % self.cssclass) + - (style and (' style="%s"' % style)) + '>') + yield 0, ('<div' + (self.cssclass and f' class="{self.cssclass}"') + + (style and (f' style="{style}"')) + '>') yield from inner yield 0, '</div>\n' @@ -814,7 +812,7 @@ def _wrap_pre(self, inner): # the empty span here is to keep leading empty lines from being # ignored by HTML parsers - yield 0, ('<pre' + (style and ' style="%s"' % style) + '><span></span>') + yield 0, ('<pre' + (style and f' style="{style}"') + '><span></span>') yield from inner yield 0, '</pre>' @@ -843,18 +841,18 @@ def _format_lines(self, tokensource): try: cspan = self.span_element_openers[ttype] except KeyError: - title = ' title="%s"' % '.'.join(ttype) if self.debug_token_types else '' + title = ' title="{}"'.format('.'.join(ttype)) if self.debug_token_types else '' if nocls: css_style = self._get_css_inline_styles(ttype) if css_style: css_style = self.class2style[css_style][0] - cspan = '<span style="%s"%s>' % (css_style, title) + cspan = f'<span style="{css_style}"{title}>' else: cspan = '' else: css_class = self._get_css_classes(ttype) if css_class: - cspan = '<span class="%s"%s>' % (css_class, title) + cspan = f'<span class="{css_class}"{title}>' else: cspan = '' self.span_element_openers[ttype] = cspan @@ -927,11 +925,10 @@ def _highlight_lines(self, tokensource): if self.noclasses: style = '' if self.style.highlight_color is not None: - style = (' style="background-color: %s"' % - (self.style.highlight_color,)) - yield 1, '<span%s>%s</span>' % (style, value) + style = (f' style="background-color: {self.style.highlight_color}"') + yield 1, f'<span{style}>{value}</span>' else: - yield 1, '<span class="hll">%s</span>' % value + yield 1, f'<span class="hll">{value}</span>' else: yield 1, value diff --git a/libs/pygments/formatters/img.py b/libs/pygments/formatters/img.py index dcf09da97..d5c97d47b 100644 --- a/libs/pygments/formatters/img.py +++ b/libs/pygments/formatters/img.py @@ -4,7 +4,7 @@ Formatter for Pixmap output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os @@ -90,7 +90,7 @@ def __init__(self, font_name, font_size=14): self._create_nix() def _get_nix_font_path(self, name, style): - proc = subprocess.Popen(['fc-list', "%s:style=%s" % (name, style), 'file'], + proc = subprocess.Popen(['fc-list', f"{name}:style={style}", 'file'], stdout=subprocess.PIPE, stderr=None) stdout, _ = proc.communicate() if proc.returncode == 0: @@ -110,8 +110,7 @@ def _create_nix(self): self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size) break else: - raise FontNotFound('No usable fonts named: "%s"' % - self.font_name) + raise FontNotFound(f'No usable fonts named: "{self.font_name}"') for style in ('ITALIC', 'BOLD', 'BOLDITALIC'): for stylename in STYLES[style]: path = self._get_nix_font_path(self.font_name, stylename) @@ -142,8 +141,7 @@ def _create_mac(self): self.fonts['NORMAL'] = ImageFont.truetype(path, self.font_size) break else: - raise FontNotFound('No usable fonts named: "%s"' % - self.font_name) + raise FontNotFound(f'No usable fonts named: "{self.font_name}"') for style in ('ITALIC', 'BOLD', 'BOLDITALIC'): for stylename in STYLES[style]: path = self._get_mac_font_path(font_map, self.font_name, stylename) @@ -160,15 +158,14 @@ def _lookup_win(self, key, basename, styles, fail=False): for suffix in ('', ' (TrueType)'): for style in styles: try: - valname = '%s%s%s' % (basename, style and ' '+style, suffix) + valname = '{}{}{}'.format(basename, style and ' '+style, suffix) val, _ = _winreg.QueryValueEx(key, valname) return val except OSError: continue else: if fail: - raise FontNotFound('Font %s (%s) not found in registry' % - (basename, styles[0])) + raise FontNotFound(f'Font {basename} ({styles[0]}) not found in registry') return None def _create_win(self): @@ -633,7 +630,11 @@ def format(self, tokensource, outfile): fill=self.hl_color) for pos, value, font, text_fg, text_bg in self.drawables: if text_bg: - text_size = draw.textsize(text=value, font=font) + # see deprecations https://pillow.readthedocs.io/en/stable/releasenotes/9.2.0.html#font-size-and-offset-methods + if hasattr(draw, 'textsize'): + text_size = draw.textsize(text=value, font=font) + else: + text_size = font.getbbox(value)[2:] draw.rectangle([pos[0], pos[1], pos[0] + text_size[0], pos[1] + text_size[1]], fill=text_bg) draw.text(pos, value, font=font, fill=text_fg) im.save(outfile, self.image_format.upper()) diff --git a/libs/pygments/formatters/irc.py b/libs/pygments/formatters/irc.py index 334aeef49..a1e3979be 100644 --- a/libs/pygments/formatters/irc.py +++ b/libs/pygments/formatters/irc.py @@ -4,7 +4,7 @@ Formatter for IRC output - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/latex.py b/libs/pygments/formatters/latex.py index b130bfaf6..2f7971e8d 100644 --- a/libs/pygments/formatters/latex.py +++ b/libs/pygments/formatters/latex.py @@ -4,7 +4,7 @@ Formatter for LaTeX fancyvrb output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,21 +23,21 @@ def escape_tex(text, commandprefix): return text.replace('\\', '\x00'). \ replace('{', '\x01'). \ replace('}', '\x02'). \ - replace('\x00', r'\%sZbs{}' % commandprefix). \ - replace('\x01', r'\%sZob{}' % commandprefix). \ - replace('\x02', r'\%sZcb{}' % commandprefix). \ - replace('^', r'\%sZca{}' % commandprefix). \ - replace('_', r'\%sZus{}' % commandprefix). \ - replace('&', r'\%sZam{}' % commandprefix). \ - replace('<', r'\%sZlt{}' % commandprefix). \ - replace('>', r'\%sZgt{}' % commandprefix). \ - replace('#', r'\%sZsh{}' % commandprefix). \ - replace('%', r'\%sZpc{}' % commandprefix). \ - replace('$', r'\%sZdl{}' % commandprefix). \ - replace('-', r'\%sZhy{}' % commandprefix). \ - replace("'", r'\%sZsq{}' % commandprefix). \ - replace('"', r'\%sZdq{}' % commandprefix). \ - replace('~', r'\%sZti{}' % commandprefix) + replace('\x00', rf'\{commandprefix}Zbs{{}}'). \ + replace('\x01', rf'\{commandprefix}Zob{{}}'). \ + replace('\x02', rf'\{commandprefix}Zcb{{}}'). \ + replace('^', rf'\{commandprefix}Zca{{}}'). \ + replace('_', rf'\{commandprefix}Zus{{}}'). \ + replace('&', rf'\{commandprefix}Zam{{}}'). \ + replace('<', rf'\{commandprefix}Zlt{{}}'). \ + replace('>', rf'\{commandprefix}Zgt{{}}'). \ + replace('#', rf'\{commandprefix}Zsh{{}}'). \ + replace('%', rf'\{commandprefix}Zpc{{}}'). \ + replace('$', rf'\{commandprefix}Zdl{{}}'). \ + replace('-', rf'\{commandprefix}Zhy{{}}'). \ + replace("'", rf'\{commandprefix}Zsq{{}}'). \ + replace('"', rf'\{commandprefix}Zdq{{}}'). \ + replace('~', rf'\{commandprefix}Zti{{}}') DOC_TEMPLATE = r''' @@ -304,17 +304,14 @@ def rgbcolor(col): if ndef['mono']: cmndef += r'\let\$$@ff=\textsf' if ndef['color']: - cmndef += (r'\def\$$@tc##1{\textcolor[rgb]{%s}{##1}}' % - rgbcolor(ndef['color'])) + cmndef += (r'\def\$$@tc##1{{\textcolor[rgb]{{{}}}{{##1}}}}'.format(rgbcolor(ndef['color']))) if ndef['border']: - cmndef += (r'\def\$$@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}' - r'\fcolorbox[rgb]{%s}{%s}{\strut ##1}}}' % - (rgbcolor(ndef['border']), + cmndef += (r'\def\$$@bc##1{{{{\setlength{{\fboxsep}}{{\string -\fboxrule}}' + r'\fcolorbox[rgb]{{{}}}{{{}}}{{\strut ##1}}}}}}'.format(rgbcolor(ndef['border']), rgbcolor(ndef['bgcolor']))) elif ndef['bgcolor']: - cmndef += (r'\def\$$@bc##1{{\setlength{\fboxsep}{0pt}' - r'\colorbox[rgb]{%s}{\strut ##1}}}' % - rgbcolor(ndef['bgcolor'])) + cmndef += (r'\def\$$@bc##1{{{{\setlength{{\fboxsep}}{{0pt}}' + r'\colorbox[rgb]{{{}}}{{\strut ##1}}}}}}'.format(rgbcolor(ndef['bgcolor']))) if cmndef == '': continue cmndef = cmndef.replace('$$', cp) @@ -329,7 +326,7 @@ def get_style_defs(self, arg=''): cp = self.commandprefix styles = [] for name, definition in self.cmd2def.items(): - styles.append(r'\@namedef{%s@tok@%s}{%s}' % (cp, name, definition)) + styles.append(rf'\@namedef{{{cp}@tok@{name}}}{{{definition}}}') return STYLE_TEMPLATE % {'cp': self.commandprefix, 'styles': '\n'.join(styles)} @@ -410,10 +407,10 @@ def format_unencoded(self, tokensource, outfile): spl = value.split('\n') for line in spl[:-1]: if line: - outfile.write("\\%s{%s}{%s}" % (cp, styleval, line)) + outfile.write(f"\\{cp}{{{styleval}}}{{{line}}}") outfile.write('\n') if spl[-1]: - outfile.write("\\%s{%s}{%s}" % (cp, styleval, spl[-1])) + outfile.write(f"\\{cp}{{{styleval}}}{{{spl[-1]}}}") else: outfile.write(value) diff --git a/libs/pygments/formatters/other.py b/libs/pygments/formatters/other.py index 800476437..56e8f033c 100644 --- a/libs/pygments/formatters/other.py +++ b/libs/pygments/formatters/other.py @@ -4,7 +4,7 @@ Other formatters: NullFormatter, RawTokenFormatter. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -74,8 +74,7 @@ def __init__(self, **options): try: colorize(self.error_color, '') except KeyError: - raise ValueError("Invalid color %r specified" % - self.error_color) + raise ValueError(f"Invalid color {self.error_color!r} specified") def format(self, tokensource, outfile): try: @@ -147,7 +146,7 @@ def format(self, tokensource, outfile): outbuf = [] for ttype, value in tokensource: rawbuf.append(value) - outbuf.append('%s(%s, %r),\n' % (indentation, ttype, value)) + outbuf.append(f'{indentation}({ttype}, {value!r}),\n') before = TESTCASE_BEFORE % (''.join(rawbuf),) during = ''.join(outbuf) diff --git a/libs/pygments/formatters/pangomarkup.py b/libs/pygments/formatters/pangomarkup.py index 50872fe24..550dabb41 100644 --- a/libs/pygments/formatters/pangomarkup.py +++ b/libs/pygments/formatters/pangomarkup.py @@ -4,7 +4,7 @@ Formatter for Pango markup output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -45,7 +45,7 @@ def __init__(self, **options): start = '' end = '' if style['color']: - start += '<span fgcolor="#%s">' % style['color'] + start += '<span fgcolor="#{}">'.format(style['color']) end = '</span>' + end if style['bold']: start += '<b>' diff --git a/libs/pygments/formatters/rtf.py b/libs/pygments/formatters/rtf.py index d3a83fa60..7f8b7e4cd 100644 --- a/libs/pygments/formatters/rtf.py +++ b/libs/pygments/formatters/rtf.py @@ -4,12 +4,14 @@ A formatter that generates RTF files. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +from collections import OrderedDict from pygments.formatter import Formatter -from pygments.util import get_int_opt, surrogatepair +from pygments.style import _ansimap +from pygments.util import get_bool_opt, get_int_opt, get_list_opt, surrogatepair __all__ = ['RtfFormatter'] @@ -42,6 +44,59 @@ class RtfFormatter(Formatter): default is 24 half-points, giving a size 12 font. .. versionadded:: 2.0 + + `linenos` + Turn on line numbering (default: ``False``). + + .. versionadded:: 2.18 + + `lineno_fontsize` + Font size for line numbers. Size is specified in half points + (default: `fontsize`). + + .. versionadded:: 2.18 + + `lineno_padding` + Number of spaces between the (inline) line numbers and the + source code (default: ``2``). + + .. versionadded:: 2.18 + + `linenostart` + The line number for the first line (default: ``1``). + + .. versionadded:: 2.18 + + `linenostep` + If set to a number n > 1, only every nth line number is printed. + + .. versionadded:: 2.18 + + `lineno_color` + Color for line numbers specified as a hex triplet, e.g. ``'5e5e5e'``. + Defaults to the style's line number color if it is a hex triplet, + otherwise ansi bright black. + + .. versionadded:: 2.18 + + `hl_lines` + Specify a list of lines to be highlighted, as line numbers separated by + spaces, e.g. ``'3 7 8'``. The line numbers are relative to the input + (i.e. the first line is line 1) unless `hl_linenostart` is set. + + .. versionadded:: 2.18 + + `hl_color` + Color for highlighting the lines specified in `hl_lines`, specified as + a hex triplet (default: style's `highlight_color`). + + .. versionadded:: 2.18 + + `hl_linenostart` + If set to ``True`` line numbers in `hl_lines` are specified + relative to `linenostart` (default ``False``). + + .. versionadded:: 2.18 """ name = 'RTF' aliases = ['rtf'] @@ -62,6 +117,40 @@ def __init__(self, **options): Formatter.__init__(self, **options) self.fontface = options.get('fontface') or '' self.fontsize = get_int_opt(options, 'fontsize', 0) + self.linenos = get_bool_opt(options, 'linenos', False) + self.lineno_fontsize = get_int_opt(options, 'lineno_fontsize', + self.fontsize) + self.lineno_padding = get_int_opt(options, 'lineno_padding', 2) + self.linenostart = abs(get_int_opt(options, 'linenostart', 1)) + self.linenostep = abs(get_int_opt(options, 'linenostep', 1)) + self.hl_linenostart = get_bool_opt(options, 'hl_linenostart', False) + + self.hl_color = options.get('hl_color', '') + if not self.hl_color: + self.hl_color = self.style.highlight_color + + self.hl_lines = [] + for lineno in get_list_opt(options, 'hl_lines', []): + try: + lineno = int(lineno) + if self.hl_linenostart: + lineno = lineno - self.linenostart + 1 + self.hl_lines.append(lineno) + except ValueError: + pass + + self.lineno_color = options.get('lineno_color', '') + if not self.lineno_color: + if self.style.line_number_color == 'inherit': + # style color is the css value 'inherit' + # default to ansi bright-black + self.lineno_color = _ansimap['ansibrightblack'] + else: + # style color is assumed to be a hex triplet as other + # colors in pygments/style.py + self.lineno_color = self.style.line_number_color + + self.color_mapping = self._create_color_mapping() def _escape(self, text): return text.replace('\\', '\\\\') \ @@ -90,43 +179,145 @@ def _escape_text(self, text): # Force surrogate pairs buf.append('{\\u%d}{\\u%d}' % surrogatepair(cn)) - return ''.join(buf).replace('\n', '\\par\n') + return ''.join(buf).replace('\n', '\\par') - def format_unencoded(self, tokensource, outfile): - # rtf 1.8 header - outfile.write('{\\rtf1\\ansi\\uc0\\deff0' - '{\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0%s;}}' - '{\\colortbl;' % (self.fontface and - ' ' + self._escape(self.fontface) or - '')) - - # convert colors and save them in a mapping to access them later. - color_mapping = {} + @staticmethod + def hex_to_rtf_color(hex_color): + if hex_color[0] == "#": + hex_color = hex_color[1:] + + return '\\red%d\\green%d\\blue%d;' % ( + int(hex_color[0:2], 16), + int(hex_color[2:4], 16), + int(hex_color[4:6], 16) + ) + + def _split_tokens_on_newlines(self, tokensource): + """ + Split tokens containing newline characters into multiple token + each representing a line of the input file. Needed for numbering + lines of e.g. multiline comments. + """ + for ttype, value in tokensource: + if value == '\n': + yield (ttype, value) + elif "\n" in value: + lines = value.split("\n") + for line in lines[:-1]: + yield (ttype, line+"\n") + if lines[-1]: + yield (ttype, lines[-1]) + else: + yield (ttype, value) + + def _create_color_mapping(self): + """ + Create a mapping of style hex colors to index/offset in + the RTF color table. + """ + color_mapping = OrderedDict() offset = 1 + + if self.linenos: + color_mapping[self.lineno_color] = offset + offset += 1 + + if self.hl_lines: + color_mapping[self.hl_color] = offset + offset += 1 + for _, style in self.style: for color in style['color'], style['bgcolor'], style['border']: if color and color not in color_mapping: color_mapping[color] = offset - outfile.write('\\red%d\\green%d\\blue%d;' % ( - int(color[0:2], 16), - int(color[2:4], 16), - int(color[4:6], 16) - )) offset += 1 - outfile.write('}\\f0 ') + + return color_mapping + + @property + def _lineno_template(self): + if self.lineno_fontsize != self.fontsize: + return '{{\\fs{} \\cf{} %s{}}}'.format(self.lineno_fontsize, + self.color_mapping[self.lineno_color], + " " * self.lineno_padding) + + return '{{\\cf{} %s{}}}'.format(self.color_mapping[self.lineno_color], + " " * self.lineno_padding) + + @property + def _hl_open_str(self): + return rf'{{\highlight{self.color_mapping[self.hl_color]} ' + + @property + def _rtf_header(self): + lines = [] + # rtf 1.8 header + lines.append('{\\rtf1\\ansi\\uc0\\deff0' + '{\\fonttbl{\\f0\\fmodern\\fprq1\\fcharset0%s;}}' + % (self.fontface and ' ' + + self._escape(self.fontface) or '')) + + # color table + lines.append('{\\colortbl;') + for color, _ in self.color_mapping.items(): + lines.append(self.hex_to_rtf_color(color)) + lines.append('}') + + # font and fontsize + lines.append('\\f0\\sa0') if self.fontsize: - outfile.write('\\fs%d' % self.fontsize) + lines.append('\\fs%d' % self.fontsize) + + # ensure Libre Office Writer imports and renders consecutive + # space characters the same width, needed for line numbering. + # https://bugs.documentfoundation.org/show_bug.cgi?id=144050 + lines.append('\\dntblnsbdb') + + return lines + + def format_unencoded(self, tokensource, outfile): + for line in self._rtf_header: + outfile.write(line + "\n") + + tokensource = self._split_tokens_on_newlines(tokensource) + + # first pass of tokens to count lines, needed for line numbering + if self.linenos: + line_count = 0 + tokens = [] # for copying the token source generator + for ttype, value in tokensource: + tokens.append((ttype, value)) + if value.endswith("\n"): + line_count += 1 + + # width of line number strings (for padding with spaces) + linenos_width = len(str(line_count+self.linenostart-1)) + + tokensource = tokens # highlight stream + lineno = 1 + start_new_line = True for ttype, value in tokensource: + if start_new_line and lineno in self.hl_lines: + outfile.write(self._hl_open_str) + + if start_new_line and self.linenos: + if (lineno-self.linenostart+1)%self.linenostep == 0: + current_lineno = lineno + self.linenostart - 1 + lineno_str = str(current_lineno).rjust(linenos_width) + else: + lineno_str = "".rjust(linenos_width) + outfile.write(self._lineno_template % lineno_str) + while not self.style.styles_token(ttype) and ttype.parent: ttype = ttype.parent style = self.style.style_for_token(ttype) buf = [] if style['bgcolor']: - buf.append('\\cb%d' % color_mapping[style['bgcolor']]) + buf.append('\\cb%d' % self.color_mapping[style['bgcolor']]) if style['color']: - buf.append('\\cf%d' % color_mapping[style['color']]) + buf.append('\\cf%d' % self.color_mapping[style['color']]) if style['bold']: buf.append('\\b') if style['italic']: @@ -135,12 +326,24 @@ def format_unencoded(self, tokensource, outfile): buf.append('\\ul') if style['border']: buf.append('\\chbrdr\\chcfpat%d' % - color_mapping[style['border']]) + self.color_mapping[style['border']]) start = ''.join(buf) if start: - outfile.write('{%s ' % start) + outfile.write(f'{{{start} ') outfile.write(self._escape_text(value)) if start: outfile.write('}') + start_new_line = False + + # complete line of input + if value.endswith("\n"): + # close line highlighting + if lineno in self.hl_lines: + outfile.write('}') + # newline in RTF file after closing } + outfile.write("\n") + + start_new_line = True + lineno += 1 - outfile.write('}') + outfile.write('}\n') diff --git a/libs/pygments/formatters/svg.py b/libs/pygments/formatters/svg.py index e3cd26955..74019b696 100644 --- a/libs/pygments/formatters/svg.py +++ b/libs/pygments/formatters/svg.py @@ -4,7 +4,7 @@ Formatter for SVG output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -60,11 +60,11 @@ class SvgFormatter(Formatter): `linenostep` If set to a number n > 1, only every nth line number is printed. - + `linenowidth` Maximum width devoted to line numbers (default: ``3*ystep``, sufficient - for up to 4-digit line numbers. Increase width for longer code blocks). - + for up to 4-digit line numbers. Increase width for longer code blocks). + `xoffset` Starting offset in X direction, defaults to ``0``. @@ -97,10 +97,11 @@ def __init__(self, **options): self.fontsize = options.get('fontsize', '14px') self.xoffset = get_int_opt(options, 'xoffset', 0) fs = self.fontsize.strip() - if fs.endswith('px'): fs = fs[:-2].strip() + if fs.endswith('px'): + fs = fs[:-2].strip() try: int_fs = int(fs) - except: + except ValueError: int_fs = 20 self.yoffset = get_int_opt(options, 'yoffset', int_fs) self.ystep = get_int_opt(options, 'ystep', int_fs + 5) @@ -122,30 +123,27 @@ def format_unencoded(self, tokensource, outfile): y = self.yoffset if not self.nowrap: if self.encoding: - outfile.write('<?xml version="1.0" encoding="%s"?>\n' % - self.encoding) + outfile.write(f'<?xml version="1.0" encoding="{self.encoding}"?>\n') else: outfile.write('<?xml version="1.0"?>\n') outfile.write('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" ' '"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/' 'svg10.dtd">\n') outfile.write('<svg xmlns="http://www.w3.org/2000/svg">\n') - outfile.write('<g font-family="%s" font-size="%s">\n' % - (self.fontfamily, self.fontsize)) - - counter = self.linenostart + outfile.write(f'<g font-family="{self.fontfamily}" font-size="{self.fontsize}">\n') + + counter = self.linenostart counter_step = self.linenostep counter_style = self._get_style(Comment) line_x = x - + if self.linenos: if counter % counter_step == 0: - outfile.write('<text x="%s" y="%s" %s text-anchor="end">%s</text>' % - (x+self.linenowidth,y,counter_style,counter)) + outfile.write(f'<text x="{x+self.linenowidth}" y="{y}" {counter_style} text-anchor="end">{counter}</text>') line_x += self.linenowidth + self.ystep counter += 1 - outfile.write('<text x="%s" y="%s" xml:space="preserve">' % (line_x, y)) + outfile.write(f'<text x="{line_x}" y="{y}" xml:space="preserve">') for ttype, value in tokensource: style = self._get_style(ttype) tspan = style and '<tspan' + style + '>' or '' @@ -159,11 +157,10 @@ def format_unencoded(self, tokensource, outfile): y += self.ystep outfile.write('</text>\n') if self.linenos and counter % counter_step == 0: - outfile.write('<text x="%s" y="%s" text-anchor="end" %s>%s</text>' % - (x+self.linenowidth,y,counter_style,counter)) - + outfile.write(f'<text x="{x+self.linenowidth}" y="{y}" text-anchor="end" {counter_style}>{counter}</text>') + counter += 1 - outfile.write('<text x="%s" y="%s" ' 'xml:space="preserve">' % (line_x,y)) + outfile.write(f'<text x="{line_x}" y="{y}" ' 'xml:space="preserve">') outfile.write(tspan + parts[-1] + tspanend) outfile.write('</text>') diff --git a/libs/pygments/formatters/terminal.py b/libs/pygments/formatters/terminal.py index 636f3503d..5c3880517 100644 --- a/libs/pygments/formatters/terminal.py +++ b/libs/pygments/formatters/terminal.py @@ -4,7 +4,7 @@ Formatter for terminal output with ANSI sequences. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/terminal256.py b/libs/pygments/formatters/terminal256.py index dba5b63e2..6402d8c46 100644 --- a/libs/pygments/formatters/terminal256.py +++ b/libs/pygments/formatters/terminal256.py @@ -10,7 +10,7 @@ Formatter version 1. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexer.py b/libs/pygments/lexer.py index eb5403e79..3061964a7 100644 --- a/libs/pygments/lexer.py +++ b/libs/pygments/lexer.py @@ -4,7 +4,7 @@ Base lexer classes. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -67,10 +67,12 @@ class Lexer(metaclass=LexerMeta): :no-value: .. autoattribute:: priority - Lexers included in Pygments should have an additional attribute: + Lexers included in Pygments should have two additional attributes: .. autoattribute:: url :no-value: + .. autoattribute:: version_added + :no-value: Lexers included in Pygments may have additional attributes: @@ -130,9 +132,12 @@ class Lexer(metaclass=LexerMeta): priority = 0 #: URL of the language specification/definition. Used in the Pygments - #: documentation. + #: documentation. Set to an empty string to disable. url = None + #: Version of Pygments in which the lexer was added. + version_added = None + #: Example file name. Relative to the ``tests/examplefiles`` directory. #: This is used by the documentation generator to show an example. _example = None @@ -169,10 +174,9 @@ def __init__(self, **options): def __repr__(self): if self.options: - return '<pygments.lexers.%s with %r>' % (self.__class__.__name__, - self.options) + return f'<pygments.lexers.{self.__class__.__name__} with {self.options!r}>' else: - return '<pygments.lexers.%s>' % self.__class__.__name__ + return f'<pygments.lexers.{self.__class__.__name__}>' def add_filter(self, filter_, **options): """ @@ -506,7 +510,7 @@ def _process_regex(cls, regex, rflags, state): def _process_token(cls, token): """Preprocess the token component of a token definition.""" assert type(token) is _TokenType or callable(token), \ - 'token type must be simple type or callable, not %r' % (token,) + f'token type must be simple type or callable, not {token!r}' return token def _process_new_state(cls, new_state, unprocessed, processed): @@ -522,14 +526,14 @@ def _process_new_state(cls, new_state, unprocessed, processed): elif new_state[:5] == '#pop:': return -int(new_state[5:]) else: - assert False, 'unknown new state %r' % new_state + assert False, f'unknown new state {new_state!r}' elif isinstance(new_state, combined): # combine a new state from existing ones tmp_state = '_tmp_%d' % cls._tmpname cls._tmpname += 1 itokens = [] for istate in new_state: - assert istate != new_state, 'circular state ref %r' % istate + assert istate != new_state, f'circular state ref {istate!r}' itokens.extend(cls._process_state(unprocessed, processed, istate)) processed[tmp_state] = itokens @@ -542,12 +546,12 @@ def _process_new_state(cls, new_state, unprocessed, processed): 'unknown new state ' + istate return new_state else: - assert False, 'unknown new state def %r' % new_state + assert False, f'unknown new state def {new_state!r}' def _process_state(cls, unprocessed, processed, state): """Preprocess a single state definition.""" - assert type(state) is str, "wrong state name %r" % state - assert state[0] != '#', "invalid state name %r" % state + assert isinstance(state, str), f"wrong state name {state!r}" + assert state[0] != '#', f"invalid state name {state!r}" if state in processed: return processed[state] tokens = processed[state] = [] @@ -555,7 +559,7 @@ def _process_state(cls, unprocessed, processed, state): for tdef in unprocessed[state]: if isinstance(tdef, include): # it's a state reference - assert tdef != state, "circular state reference %r" % state + assert tdef != state, f"circular state reference {state!r}" tokens.extend(cls._process_state(unprocessed, processed, str(tdef))) continue @@ -569,13 +573,12 @@ def _process_state(cls, unprocessed, processed, state): tokens.append((re.compile('').match, None, new_state)) continue - assert type(tdef) is tuple, "wrong rule def %r" % tdef + assert type(tdef) is tuple, f"wrong rule def {tdef!r}" try: rex = cls._process_regex(tdef[0], rflags, state) except Exception as err: - raise ValueError("uncompilable regex %r in state %r of %r: %s" % - (tdef[0], state, cls, err)) from err + raise ValueError(f"uncompilable regex {tdef[0]!r} in state {state!r} of {cls!r}: {err}") from err token = cls._process_token(tdef[1]) @@ -736,7 +739,7 @@ def get_tokens_unprocessed(self, text, stack=('root',)): elif new_state == '#push': statestack.append(statestack[-1]) else: - assert False, "wrong state def: %r" % new_state + assert False, f"wrong state def: {new_state!r}" statetokens = tokendefs[statestack[-1]] break else: @@ -768,8 +771,7 @@ def __init__(self, text, pos, stack=None, end=None): self.stack = stack or ['root'] def __repr__(self): - return 'LexerContext(%r, %r, %r)' % ( - self.text, self.pos, self.stack) + return f'LexerContext({self.text!r}, {self.pos!r}, {self.stack!r})' class ExtendedRegexLexer(RegexLexer): @@ -824,7 +826,7 @@ def get_tokens_unprocessed(self, text=None, context=None): elif new_state == '#push': ctx.stack.append(ctx.stack[-1]) else: - assert False, "wrong state def: %r" % new_state + assert False, f"wrong state def: {new_state!r}" statetokens = tokendefs[ctx.stack[-1]] break else: diff --git a/libs/pygments/lexers/__init__.py b/libs/pygments/lexers/__init__.py index 5701be7b6..a2eaf71f2 100644 --- a/libs/pygments/lexers/__init__.py +++ b/libs/pygments/lexers/__init__.py @@ -4,7 +4,7 @@ Pygments lexers. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -93,7 +93,7 @@ def find_lexer_class_by_name(_alias): .. versionadded:: 2.2 """ if not _alias: - raise ClassNotFound('no lexer for alias %r found' % _alias) + raise ClassNotFound(f'no lexer for alias {_alias!r} found') # lookup builtin lexers for module_name, name, aliases, _, _ in LEXERS.values(): if _alias.lower() in aliases: @@ -104,7 +104,7 @@ def find_lexer_class_by_name(_alias): for cls in find_plugin_lexers(): if _alias.lower() in cls.aliases: return cls - raise ClassNotFound('no lexer for alias %r found' % _alias) + raise ClassNotFound(f'no lexer for alias {_alias!r} found') def get_lexer_by_name(_alias, **options): @@ -117,7 +117,7 @@ def get_lexer_by_name(_alias, **options): found. """ if not _alias: - raise ClassNotFound('no lexer for alias %r found' % _alias) + raise ClassNotFound(f'no lexer for alias {_alias!r} found') # lookup builtin lexers for module_name, name, aliases, _, _ in LEXERS.values(): @@ -129,7 +129,7 @@ def get_lexer_by_name(_alias, **options): for cls in find_plugin_lexers(): if _alias.lower() in cls.aliases: return cls(**options) - raise ClassNotFound('no lexer for alias %r found' % _alias) + raise ClassNotFound(f'no lexer for alias {_alias!r} found') def load_lexer_from_file(filename, lexername="CustomLexer", **options): @@ -154,17 +154,16 @@ def load_lexer_from_file(filename, lexername="CustomLexer", **options): exec(f.read(), custom_namespace) # Retrieve the class `lexername` from that namespace if lexername not in custom_namespace: - raise ClassNotFound('no valid %s class found in %s' % - (lexername, filename)) + raise ClassNotFound(f'no valid {lexername} class found in {filename}') lexer_class = custom_namespace[lexername] # And finally instantiate it with the options return lexer_class(**options) except OSError as err: - raise ClassNotFound('cannot read %s: %s' % (filename, err)) + raise ClassNotFound(f'cannot read {filename}: {err}') except ClassNotFound: raise except Exception as err: - raise ClassNotFound('error when loading custom lexer: %s' % err) + raise ClassNotFound(f'error when loading custom lexer: {err}') def find_lexer_class_for_filename(_fn, code=None): @@ -225,7 +224,7 @@ def get_lexer_for_filename(_fn, code=None, **options): """ res = find_lexer_class_for_filename(_fn, code) if not res: - raise ClassNotFound('no lexer for filename %r found' % _fn) + raise ClassNotFound(f'no lexer for filename {_fn!r} found') return res(**options) @@ -245,7 +244,7 @@ def get_lexer_for_mimetype(_mime, **options): for cls in find_plugin_lexers(): if _mime in cls.mimetypes: return cls(**options) - raise ClassNotFound('no lexer for mimetype %r found' % _mime) + raise ClassNotFound(f'no lexer for mimetype {_mime!r} found') def _iter_lexerclasses(plugins=True): @@ -280,7 +279,7 @@ def guess_lexer_for_filename(_fn, _text, **options): matching_lexers.add(lexer) primary[lexer] = False if not matching_lexers: - raise ClassNotFound('no lexer for filename %r found' % fn) + raise ClassNotFound(f'no lexer for filename {fn!r} found') if len(matching_lexers) == 1: return matching_lexers.pop()(**options) result = [] diff --git a/libs/pygments/lexers/_ada_builtins.py b/libs/pygments/lexers/_ada_builtins.py index 24f9b197b..6b6a7c556 100644 --- a/libs/pygments/lexers/_ada_builtins.py +++ b/libs/pygments/lexers/_ada_builtins.py @@ -4,7 +4,7 @@ Ada builtins. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_asy_builtins.py b/libs/pygments/lexers/_asy_builtins.py index c4a362ca6..be73baf2d 100644 --- a/libs/pygments/lexers/_asy_builtins.py +++ b/libs/pygments/lexers/_asy_builtins.py @@ -9,7 +9,7 @@ TODO: perl/python script in Asymptote SVN similar to asy-list.pl but only for function and variable names. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_cl_builtins.py b/libs/pygments/lexers/_cl_builtins.py index beb7b4d6f..1e02451ca 100644 --- a/libs/pygments/lexers/_cl_builtins.py +++ b/libs/pygments/lexers/_cl_builtins.py @@ -4,7 +4,7 @@ ANSI Common Lisp builtins. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_cocoa_builtins.py b/libs/pygments/lexers/_cocoa_builtins.py index 4b7dc1ad4..f45b85a28 100644 --- a/libs/pygments/lexers/_cocoa_builtins.py +++ b/libs/pygments/lexers/_cocoa_builtins.py @@ -7,7 +7,7 @@ File may be also used as standalone generator for above. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -41,7 +41,7 @@ with open(headerFilePath, encoding='utf-8') as f: content = f.read() except UnicodeDecodeError: - print("Decoding error for file: {0}".format(headerFilePath)) + print(f"Decoding error for file: {headerFilePath}") continue res = re.findall(r'(?<=@interface )\w+', content) diff --git a/libs/pygments/lexers/_csound_builtins.py b/libs/pygments/lexers/_csound_builtins.py index 5f3730684..e1ea1a015 100644 --- a/libs/pygments/lexers/_csound_builtins.py +++ b/libs/pygments/lexers/_csound_builtins.py @@ -2,7 +2,7 @@ pygments.lexers._csound_builtins ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_css_builtins.py b/libs/pygments/lexers/_css_builtins.py index fff992425..60fa564b4 100644 --- a/libs/pygments/lexers/_css_builtins.py +++ b/libs/pygments/lexers/_css_builtins.py @@ -4,7 +4,7 @@ This file is autogenerated by scripts/get_css_properties.py - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_julia_builtins.py b/libs/pygments/lexers/_julia_builtins.py index 5d3c96fb8..c73a2e0ec 100644 --- a/libs/pygments/lexers/_julia_builtins.py +++ b/libs/pygments/lexers/_julia_builtins.py @@ -4,7 +4,7 @@ Julia builtins. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_lasso_builtins.py b/libs/pygments/lexers/_lasso_builtins.py index 1fbe68193..f4d417e67 100644 --- a/libs/pygments/lexers/_lasso_builtins.py +++ b/libs/pygments/lexers/_lasso_builtins.py @@ -4,7 +4,7 @@ Built-in Lasso types, traits, methods, and members. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_lilypond_builtins.py b/libs/pygments/lexers/_lilypond_builtins.py index 013c85ca3..948c7625a 100644 --- a/libs/pygments/lexers/_lilypond_builtins.py +++ b/libs/pygments/lexers/_lilypond_builtins.py @@ -4,7 +4,7 @@ LilyPond builtins. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_lua_builtins.py b/libs/pygments/lexers/_lua_builtins.py index 8170d5e82..b46fe4f02 100644 --- a/libs/pygments/lexers/_lua_builtins.py +++ b/libs/pygments/lexers/_lua_builtins.py @@ -10,7 +10,7 @@ Run with `python -I` to regenerate. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -230,7 +230,7 @@ def get_newest_version(): return m.groups()[0] def get_lua_functions(version): - f = urlopen('http://www.lua.org/manual/%s/' % version) + f = urlopen(f'http://www.lua.org/manual/{version}/') r = re.compile(r'^<A HREF="manual.html#pdf-(?!lua|LUA)([^:]+)">\1</A>') functions = [] for line in f: @@ -258,14 +258,14 @@ def regenerate(filename, modules): with open(filename, 'w', encoding='utf-8') as fp: fp.write(header) - fp.write('MODULES = %s\n\n' % pprint.pformat(modules)) + fp.write(f'MODULES = {pprint.pformat(modules)}\n\n') fp.write(footer) def run(): version = get_newest_version() functions = set() for v in ('5.2', version): - print('> Downloading function index for Lua %s' % v) + print(f'> Downloading function index for Lua {v}') f = get_lua_functions(v) print('> %d functions found, %d new:' % (len(f), len(set(f) - functions))) @@ -275,7 +275,7 @@ def run(): modules = {} for full_function_name in functions: - print('>> %s' % full_function_name) + print(f'>> {full_function_name}') m = get_function_module(full_function_name) modules.setdefault(m, []).append(full_function_name) modules = {k: tuple(v) for k, v in modules.items()} diff --git a/libs/pygments/lexers/_luau_builtins.py b/libs/pygments/lexers/_luau_builtins.py new file mode 100644 index 000000000..3b7dd1520 --- /dev/null +++ b/libs/pygments/lexers/_luau_builtins.py @@ -0,0 +1,62 @@ +""" + pygments.lexers._luau_builtins + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Includes the builtins for Luau and Roblox. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +LUAU_BUILTINS = { + 'bit32', + 'buffer', + 'coroutine', + 'debug', + 'math', + 'os', + 'string', + 'table', + 'utf8', +} + +ROBLOX_BUILTINS = { + 'task', + + 'Axes', + 'BrickColor', + 'CatalogSearchParams', + 'CFrame', + 'Color3', + 'ColorSequence', + 'ColorSequenceKeypoint', + 'DateTime', + 'DockWidgetPluginGuiInfo', + 'Faces', + 'FloatCurveKey', + 'Font', + 'Instance', + 'NumberRange', + 'NumberSequence', + 'NumberSequenceKeypoint', + 'OverlapParams', + 'PathWaypoint', + 'PhysicalProperties', + 'Random', + 'Ray', + 'RaycastParams', + 'RaycastResult', + 'RBXScriptConnection', + 'RBXScriptSignal', + 'Rect', + 'Region3', + 'Region3int16', + 'SharedTable', + 'TweenInfo', + 'UDim', + 'UDim2', + 'Vector2', + 'Vector2int16', + 'Vector3', + 'Vector3int16', +} \ No newline at end of file diff --git a/libs/pygments/lexers/_mapping.py b/libs/pygments/lexers/_mapping.py index aaec80232..0a62565d5 100644 --- a/libs/pygments/lexers/_mapping.py +++ b/libs/pygments/lexers/_mapping.py @@ -46,7 +46,7 @@ 'BSTLexer': ('pygments.lexers.bibtex', 'BST', ('bst', 'bst-pybtex'), ('*.bst',), ()), 'BareLexer': ('pygments.lexers.bare', 'BARE', ('bare',), ('*.bare',), ()), 'BaseMakefileLexer': ('pygments.lexers.make', 'Base Makefile', ('basemake',), (), ()), - 'BashLexer': ('pygments.lexers.shell', 'Bash', ('bash', 'sh', 'ksh', 'zsh', 'shell'), ('*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', '.kshrc', 'kshrc', 'PKGBUILD'), ('application/x-sh', 'application/x-shellscript', 'text/x-shellscript')), + 'BashLexer': ('pygments.lexers.shell', 'Bash', ('bash', 'sh', 'ksh', 'zsh', 'shell', 'openrc'), ('*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', '.kshrc', 'kshrc', 'PKGBUILD'), ('application/x-sh', 'application/x-shellscript', 'text/x-shellscript')), 'BashSessionLexer': ('pygments.lexers.shell', 'Bash Session', ('console', 'shell-session'), ('*.sh-session', '*.shell-session'), ('application/x-shell-session', 'application/x-sh-session')), 'BatchLexer': ('pygments.lexers.shell', 'Batchfile', ('batch', 'bat', 'dosbatch', 'winbatch'), ('*.bat', '*.cmd'), ('application/x-dos-batch',)), 'BddLexer': ('pygments.lexers.bdd', 'Bdd', ('bdd',), ('*.feature',), ('text/x-bdd',)), @@ -128,7 +128,7 @@ 'DaxLexer': ('pygments.lexers.dax', 'Dax', ('dax',), ('*.dax',), ()), 'DebianControlLexer': ('pygments.lexers.installers', 'Debian Control file', ('debcontrol', 'control'), ('control',), ()), 'DelphiLexer': ('pygments.lexers.pascal', 'Delphi', ('delphi', 'pas', 'pascal', 'objectpascal'), ('*.pas', '*.dpr'), ('text/x-pascal',)), - 'DesktopLexer': ('pygments.lexers.configs', 'Desktop file', ('desktop',), ('*.desktop',), ()), + 'DesktopLexer': ('pygments.lexers.configs', 'Desktop file', ('desktop',), ('*.desktop',), ('application/x-desktop',)), 'DevicetreeLexer': ('pygments.lexers.devicetree', 'Devicetree', ('devicetree', 'dts'), ('*.dts', '*.dtsi'), ('text/x-c',)), 'DgLexer': ('pygments.lexers.python', 'dg', ('dg',), ('*.dg',), ('text/x-dg',)), 'DiffLexer': ('pygments.lexers.diff', 'Diff', ('diff', 'udiff'), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch')), @@ -216,8 +216,8 @@ 'HtmlSmartyLexer': ('pygments.lexers.templates', 'HTML+Smarty', ('html+smarty',), (), ('text/html+smarty',)), 'HttpLexer': ('pygments.lexers.textfmts', 'HTTP', ('http',), (), ()), 'HxmlLexer': ('pygments.lexers.haxe', 'Hxml', ('haxeml', 'hxml'), ('*.hxml',), ()), - 'HyLexer': ('pygments.lexers.lisp', 'Hy', ('hylang',), ('*.hy',), ('text/x-hy', 'application/x-hy')), - 'HybrisLexer': ('pygments.lexers.scripting', 'Hybris', ('hybris', 'hy'), ('*.hy', '*.hyb'), ('text/x-hybris', 'application/x-hybris')), + 'HyLexer': ('pygments.lexers.lisp', 'Hy', ('hylang', 'hy'), ('*.hy',), ('text/x-hy', 'application/x-hy')), + 'HybrisLexer': ('pygments.lexers.scripting', 'Hybris', ('hybris',), ('*.hyb',), ('text/x-hybris', 'application/x-hybris')), 'IDLLexer': ('pygments.lexers.idl', 'IDL', ('idl',), ('*.pro',), ('text/idl',)), 'IconLexer': ('pygments.lexers.unicon', 'Icon', ('icon',), ('*.icon', '*.ICON'), ()), 'IdrisLexer': ('pygments.lexers.haskell', 'Idris', ('idris', 'idr'), ('*.idr',), ('text/x-idris',)), @@ -234,6 +234,7 @@ 'JMESPathLexer': ('pygments.lexers.jmespath', 'JMESPath', ('jmespath', 'jp'), ('*.jp',), ()), 'JSLTLexer': ('pygments.lexers.jslt', 'JSLT', ('jslt',), ('*.jslt',), ('text/x-jslt',)), 'JagsLexer': ('pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()), + 'JanetLexer': ('pygments.lexers.lisp', 'Janet', ('janet',), ('*.janet', '*.jdn'), ('text/x-janet', 'application/x-janet')), 'JasminLexer': ('pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()), 'JavaLexer': ('pygments.lexers.jvm', 'Java', ('java',), ('*.java',), ('text/x-java',)), 'JavascriptDjangoLexer': ('pygments.lexers.templates', 'JavaScript+Django/Jinja', ('javascript+django', 'js+django', 'javascript+jinja', 'js+jinja'), ('*.js.j2', '*.js.jinja2'), ('application/x-javascript+django', 'application/x-javascript+jinja', 'text/x-javascript+django', 'text/x-javascript+jinja', 'text/javascript+django', 'text/javascript+jinja')), @@ -271,6 +272,7 @@ 'LdaprcLexer': ('pygments.lexers.ldap', 'LDAP configuration file', ('ldapconf', 'ldaprc'), ('.ldaprc', 'ldaprc', 'ldap.conf'), ('text/x-ldapconf',)), 'LdifLexer': ('pygments.lexers.ldap', 'LDIF', ('ldif',), ('*.ldif',), ('text/x-ldif',)), 'Lean3Lexer': ('pygments.lexers.lean', 'Lean', ('lean', 'lean3'), ('*.lean',), ('text/x-lean', 'text/x-lean3')), + 'Lean4Lexer': ('pygments.lexers.lean', 'Lean4', ('lean4',), ('*.lean',), ('text/x-lean4',)), 'LessCssLexer': ('pygments.lexers.css', 'LessCss', ('less',), ('*.less',), ('text/x-less-css',)), 'LighttpdConfLexer': ('pygments.lexers.configs', 'Lighttpd configuration file', ('lighttpd', 'lighty'), ('lighttpd.conf',), ('text/x-lighttpd-conf',)), 'LilyPondLexer': ('pygments.lexers.lilypond', 'LilyPond', ('lilypond',), ('*.ly',), ()), @@ -287,6 +289,7 @@ 'LogosLexer': ('pygments.lexers.objective', 'Logos', ('logos',), ('*.x', '*.xi', '*.xm', '*.xmi'), ('text/x-logos',)), 'LogtalkLexer': ('pygments.lexers.prolog', 'Logtalk', ('logtalk',), ('*.lgt', '*.logtalk'), ('text/x-logtalk',)), 'LuaLexer': ('pygments.lexers.scripting', 'Lua', ('lua',), ('*.lua', '*.wlua'), ('text/x-lua', 'application/x-lua')), + 'LuauLexer': ('pygments.lexers.scripting', 'Luau', ('luau',), ('*.luau',), ()), 'MCFunctionLexer': ('pygments.lexers.minecraft', 'MCFunction', ('mcfunction', 'mcf'), ('*.mcfunction',), ('text/mcfunction',)), 'MCSchemaLexer': ('pygments.lexers.minecraft', 'MCSchema', ('mcschema',), ('*.mcschema',), ('text/mcschema',)), 'MIMELexer': ('pygments.lexers.mime', 'MIME', ('mime',), (), ('multipart/mixed', 'multipart/related', 'multipart/alternative')), @@ -314,6 +317,7 @@ 'ModelicaLexer': ('pygments.lexers.modeling', 'Modelica', ('modelica',), ('*.mo',), ('text/x-modelica',)), 'Modula2Lexer': ('pygments.lexers.modula2', 'Modula-2', ('modula2', 'm2'), ('*.def', '*.mod'), ('text/x-modula2',)), 'MoinWikiLexer': ('pygments.lexers.markup', 'MoinMoin/Trac Wiki markup', ('trac-wiki', 'moin'), (), ('text/x-trac-wiki',)), + 'MojoLexer': ('pygments.lexers.mojo', 'Mojo', ('mojo', '🔥'), ('*.mojo', '*.🔥'), ('text/x-mojo', 'application/x-mojo')), 'MonkeyLexer': ('pygments.lexers.basic', 'Monkey', ('monkey',), ('*.monkey',), ('text/x-monkey',)), 'MonteLexer': ('pygments.lexers.monte', 'Monte', ('monte',), ('*.mt',), ()), 'MoonScriptLexer': ('pygments.lexers.scripting', 'MoonScript', ('moonscript', 'moon'), ('*.moon',), ('text/x-moonscript', 'application/x-moonscript')), @@ -362,6 +366,7 @@ 'OpaLexer': ('pygments.lexers.ml', 'Opa', ('opa',), ('*.opa',), ('text/x-opa',)), 'OpenEdgeLexer': ('pygments.lexers.business', 'OpenEdge ABL', ('openedge', 'abl', 'progress'), ('*.p', '*.cls'), ('text/x-openedge', 'application/x-openedge')), 'OpenScadLexer': ('pygments.lexers.openscad', 'OpenSCAD', ('openscad',), ('*.scad',), ('application/x-openscad',)), + 'OrgLexer': ('pygments.lexers.markup', 'Org Mode', ('org', 'orgmode', 'org-mode'), ('*.org',), ('text/org',)), 'OutputLexer': ('pygments.lexers.special', 'Text output', ('output',), (), ()), 'PacmanConfLexer': ('pygments.lexers.configs', 'PacmanConf', ('pacmanconf',), ('pacman.conf',), ()), 'PanLexer': ('pygments.lexers.dsls', 'Pan', ('pan',), ('*.pan',), ()), @@ -390,6 +395,7 @@ 'ProcfileLexer': ('pygments.lexers.procfile', 'Procfile', ('procfile',), ('Procfile',), ()), 'PrologLexer': ('pygments.lexers.prolog', 'Prolog', ('prolog',), ('*.ecl', '*.prolog', '*.pro', '*.pl'), ('text/x-prolog',)), 'PromQLLexer': ('pygments.lexers.promql', 'PromQL', ('promql',), ('*.promql',), ()), + 'PromelaLexer': ('pygments.lexers.c_like', 'Promela', ('promela',), ('*.pml', '*.prom', '*.prm', '*.promela', '*.pr', '*.pm'), ('text/x-promela',)), 'PropertiesLexer': ('pygments.lexers.configs', 'Properties', ('properties', 'jproperties'), ('*.properties',), ('text/x-java-properties',)), 'ProtoBufLexer': ('pygments.lexers.dsls', 'Protocol Buffer', ('protobuf', 'proto'), ('*.proto',), ()), 'PrqlLexer': ('pygments.lexers.prql', 'PRQL', ('prql',), ('*.prql',), ('application/prql', 'application/x-prql')), @@ -400,7 +406,7 @@ 'PyPyLogLexer': ('pygments.lexers.console', 'PyPy Log', ('pypylog', 'pypy'), ('*.pypylog',), ('application/x-pypylog',)), 'Python2Lexer': ('pygments.lexers.python', 'Python 2.x', ('python2', 'py2'), (), ('text/x-python2', 'application/x-python2')), 'Python2TracebackLexer': ('pygments.lexers.python', 'Python 2.x Traceback', ('py2tb',), ('*.py2tb',), ('text/x-python2-traceback',)), - 'PythonConsoleLexer': ('pygments.lexers.python', 'Python console session', ('pycon',), (), ('text/x-python-doctest',)), + 'PythonConsoleLexer': ('pygments.lexers.python', 'Python console session', ('pycon', 'python-console'), (), ('text/x-python-doctest',)), 'PythonLexer': ('pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), 'PythonTracebackLexer': ('pygments.lexers.python', 'Python Traceback', ('pytb', 'py3tb'), ('*.pytb', '*.py3tb'), ('text/x-python-traceback', 'text/x-python3-traceback')), 'PythonUL4Lexer': ('pygments.lexers.ul4', 'Python+UL4', ('py+ul4',), ('*.pyul4',), ()), @@ -473,6 +479,7 @@ 'SnobolLexer': ('pygments.lexers.snobol', 'Snobol', ('snobol',), ('*.snobol',), ('text/x-snobol',)), 'SnowballLexer': ('pygments.lexers.dsls', 'Snowball', ('snowball',), ('*.sbl',), ()), 'SolidityLexer': ('pygments.lexers.solidity', 'Solidity', ('solidity',), ('*.sol',), ()), + 'SoongLexer': ('pygments.lexers.soong', 'Soong', ('androidbp', 'bp', 'soong'), ('Android.bp',), ()), 'SophiaLexer': ('pygments.lexers.sophia', 'Sophia', ('sophia',), ('*.aes',), ()), 'SourcePawnLexer': ('pygments.lexers.pawn', 'SourcePawn', ('sp',), ('*.sp',), ('text/x-sourcepawn',)), 'SourcesListLexer': ('pygments.lexers.installers', 'Debian Sourcelist', ('debsources', 'sourceslist', 'sources.list'), ('sources.list',), ()), @@ -494,6 +501,7 @@ 'TAPLexer': ('pygments.lexers.testing', 'TAP', ('tap',), ('*.tap',), ()), 'TNTLexer': ('pygments.lexers.tnt', 'Typographic Number Theory', ('tnt',), ('*.tnt',), ()), 'TOMLLexer': ('pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ('application/toml',)), + 'TactLexer': ('pygments.lexers.tact', 'Tact', ('tact',), ('*.tact',), ()), 'Tads3Lexer': ('pygments.lexers.int_fiction', 'TADS 3', ('tads3',), ('*.t',), ()), 'TalLexer': ('pygments.lexers.tal', 'Tal', ('tal', 'uxntal'), ('*.tal',), ('text/x-uxntal',)), 'TasmLexer': ('pygments.lexers.asm', 'TASM', ('tasm',), ('*.asm', '*.ASM', '*.tasm'), ('text/x-tasm',)), @@ -523,6 +531,7 @@ 'TypoScriptCssDataLexer': ('pygments.lexers.typoscript', 'TypoScriptCssData', ('typoscriptcssdata',), (), ()), 'TypoScriptHtmlDataLexer': ('pygments.lexers.typoscript', 'TypoScriptHtmlData', ('typoscripthtmldata',), (), ()), 'TypoScriptLexer': ('pygments.lexers.typoscript', 'TypoScript', ('typoscript',), ('*.typoscript',), ('text/x-typoscript',)), + 'TypstLexer': ('pygments.lexers.typst', 'Typst', ('typst',), ('*.typ',), ('text/x-typst',)), 'UL4Lexer': ('pygments.lexers.ul4', 'UL4', ('ul4',), ('*.ul4',), ()), 'UcodeLexer': ('pygments.lexers.unicon', 'ucode', ('ucode',), ('*.u', '*.u1', '*.u2'), ()), 'UniconLexer': ('pygments.lexers.unicon', 'Unicon', ('unicon',), ('*.icn',), ('text/unicon',)), @@ -537,7 +546,7 @@ 'VGLLexer': ('pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()), 'ValaLexer': ('pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)), 'VbNetAspxLexer': ('pygments.lexers.dotnet', 'aspx-vb', ('aspx-vb',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()), - 'VbNetLexer': ('pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')), + 'VbNetLexer': ('pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas', 'visual-basic', 'visualbasic'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')), 'VelocityHtmlLexer': ('pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)), 'VelocityLexer': ('pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()), 'VelocityXmlLexer': ('pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)), diff --git a/libs/pygments/lexers/_mql_builtins.py b/libs/pygments/lexers/_mql_builtins.py index 3b89f1db7..ca5bfe45a 100644 --- a/libs/pygments/lexers/_mql_builtins.py +++ b/libs/pygments/lexers/_mql_builtins.py @@ -4,7 +4,7 @@ Builtins for the MqlLexer. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ types = ( diff --git a/libs/pygments/lexers/_mysql_builtins.py b/libs/pygments/lexers/_mysql_builtins.py index d25ed9c7c..95bbe1739 100644 --- a/libs/pygments/lexers/_mysql_builtins.py +++ b/libs/pygments/lexers/_mysql_builtins.py @@ -6,7 +6,7 @@ Run with `python -I` to update. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -1321,10 +1321,10 @@ def update_content(field_name, content): data = f.read() # Line to start/end inserting - re_match = re.compile(r'^%s\s*=\s*\($.*?^\s*\)$' % field_name, re.M | re.S) + re_match = re.compile(rf'^{field_name}\s*=\s*\($.*?^\s*\)$', re.M | re.S) m = re_match.search(data) if not m: - raise ValueError('Could not find an existing definition for %s' % field_name) + raise ValueError(f'Could not find an existing definition for {field_name}') new_block = format_lines(field_name, content) data = data[:m.start()] + new_block + data[m.end():] diff --git a/libs/pygments/lexers/_openedge_builtins.py b/libs/pygments/lexers/_openedge_builtins.py index 7fdfb4104..c5e9c3474 100644 --- a/libs/pygments/lexers/_openedge_builtins.py +++ b/libs/pygments/lexers/_openedge_builtins.py @@ -4,7 +4,7 @@ Builtin list for the OpenEdgeLexer. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_php_builtins.py b/libs/pygments/lexers/_php_builtins.py index 5366e7511..a1f0232a1 100644 --- a/libs/pygments/lexers/_php_builtins.py +++ b/libs/pygments/lexers/_php_builtins.py @@ -7,7 +7,7 @@ Run with `python -I` to regenerate. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -3299,7 +3299,7 @@ def get_php_references(): download = urlretrieve(PHP_MANUAL_URL) with tarfile.open(download[0]) as tar: tar.extractall() - yield from glob.glob("%s%s" % (PHP_MANUAL_DIR, PHP_REFERENCE_GLOB)) + yield from glob.glob(f"{PHP_MANUAL_DIR}{PHP_REFERENCE_GLOB}") os.remove(download[0]) def regenerate(filename, modules): @@ -3311,7 +3311,7 @@ def regenerate(filename, modules): with open(filename, 'w', encoding='utf-8') as fp: fp.write(header) - fp.write('MODULES = %s\n\n' % pprint.pformat(modules)) + fp.write(f'MODULES = {pprint.pformat(modules)}\n\n') fp.write(footer) def run(): diff --git a/libs/pygments/lexers/_postgres_builtins.py b/libs/pygments/lexers/_postgres_builtins.py index ecc2a7eef..f29235598 100644 --- a/libs/pygments/lexers/_postgres_builtins.py +++ b/libs/pygments/lexers/_postgres_builtins.py @@ -6,7 +6,7 @@ Run with `python -I` to update itself. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -683,7 +683,8 @@ def parse_datatypes(f): for t in tmp.split(']') if "(" not in t]: for t in tmp.split(','): t = t.strip() - if not t: continue + if not t: + continue dt.add(" ".join(t.split())) dt = list(dt) @@ -724,11 +725,10 @@ def update_consts(filename, constname, content): data = f.read() # Line to start/end inserting - re_match = re.compile(r'^%s\s*=\s*\($.*?^\s*\)$' % constname, re.M | re.S) + re_match = re.compile(rf'^{constname}\s*=\s*\($.*?^\s*\)$', re.M | re.S) m = re_match.search(data) if not m: - raise ValueError('Could not find existing definition for %s' % - (constname,)) + raise ValueError(f'Could not find existing definition for {constname}') new_block = format_lines(constname, content) data = data[:m.start()] + new_block + data[m.end():] diff --git a/libs/pygments/lexers/_qlik_builtins.py b/libs/pygments/lexers/_qlik_builtins.py index 697c12462..f3af5230f 100644 --- a/libs/pygments/lexers/_qlik_builtins.py +++ b/libs/pygments/lexers/_qlik_builtins.py @@ -4,7 +4,7 @@ Qlik builtins. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_scheme_builtins.py b/libs/pygments/lexers/_scheme_builtins.py index 8f2de9dba..d93b9fd3b 100644 --- a/libs/pygments/lexers/_scheme_builtins.py +++ b/libs/pygments/lexers/_scheme_builtins.py @@ -4,7 +4,7 @@ Scheme builtins. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_scilab_builtins.py b/libs/pygments/lexers/_scilab_builtins.py index f2adba858..c4992938d 100644 --- a/libs/pygments/lexers/_scilab_builtins.py +++ b/libs/pygments/lexers/_scilab_builtins.py @@ -4,7 +4,7 @@ Builtin list for the ScilabLexer. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -3060,10 +3060,10 @@ def extract_completion(var_type): s = subprocess.Popen(['scilab', '-nwni'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - output = s.communicate('''\ + output = s.communicate(f'''\ fd = mopen("/dev/stderr", "wt"); -mputl(strcat(completion("", "%s"), "||"), fd); -mclose(fd)\n''' % var_type) +mputl(strcat(completion("", "{var_type}"), "||"), fd); +mclose(fd)\n''') if '||' not in output[1]: raise Exception(output[0]) # Invalid DISPLAY causes this to be output: diff --git a/libs/pygments/lexers/_sourcemod_builtins.py b/libs/pygments/lexers/_sourcemod_builtins.py index 02d3e779d..613ce7084 100644 --- a/libs/pygments/lexers/_sourcemod_builtins.py +++ b/libs/pygments/lexers/_sourcemod_builtins.py @@ -8,7 +8,7 @@ Run with `python -I` to regenerate. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -1136,13 +1136,13 @@ def regenerate(filename, natives): def run(): version = get_version() - print('> Downloading function index for SourceMod %s' % version) + print(f'> Downloading function index for SourceMod {version}') functions = get_sm_functions() print('> %d functions found:' % len(functions)) functionlist = [] for full_function_name in functions: - print('>> %s' % full_function_name) + print(f'>> {full_function_name}') functionlist.append(full_function_name) regenerate(__file__, functionlist) diff --git a/libs/pygments/lexers/_stan_builtins.py b/libs/pygments/lexers/_stan_builtins.py index 23f7fa603..afe314370 100644 --- a/libs/pygments/lexers/_stan_builtins.py +++ b/libs/pygments/lexers/_stan_builtins.py @@ -5,7 +5,7 @@ This file contains the names of functions for Stan used by ``pygments.lexers.math.StanLexer. This is for Stan language version 2.29.0. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_stata_builtins.py b/libs/pygments/lexers/_stata_builtins.py index 16251cff2..c806f50be 100644 --- a/libs/pygments/lexers/_stata_builtins.py +++ b/libs/pygments/lexers/_stata_builtins.py @@ -4,7 +4,7 @@ Builtins for Stata - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_tsql_builtins.py b/libs/pygments/lexers/_tsql_builtins.py index 96b16bf4a..1fc792bb8 100644 --- a/libs/pygments/lexers/_tsql_builtins.py +++ b/libs/pygments/lexers/_tsql_builtins.py @@ -4,7 +4,7 @@ These are manually translated lists from https://msdn.microsoft.com. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_usd_builtins.py b/libs/pygments/lexers/_usd_builtins.py index d891ad03d..ff83574af 100644 --- a/libs/pygments/lexers/_usd_builtins.py +++ b/libs/pygments/lexers/_usd_builtins.py @@ -4,7 +4,7 @@ A collection of known USD-related keywords, attributes, and types. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_vbscript_builtins.py b/libs/pygments/lexers/_vbscript_builtins.py index e7e96e690..fba2218e2 100644 --- a/libs/pygments/lexers/_vbscript_builtins.py +++ b/libs/pygments/lexers/_vbscript_builtins.py @@ -5,7 +5,7 @@ These are manually translated lists from http://www.indusoft.com/pdf/VBScript%20Reference.pdf. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_vim_builtins.py b/libs/pygments/lexers/_vim_builtins.py index ccc8740f4..e1171ebbc 100644 --- a/libs/pygments/lexers/_vim_builtins.py +++ b/libs/pygments/lexers/_vim_builtins.py @@ -4,7 +4,7 @@ This file is autogenerated by scripts/get_vimkw.py - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/actionscript.py b/libs/pygments/lexers/actionscript.py index e0e94a52e..a23a2087e 100644 --- a/libs/pygments/lexers/actionscript.py +++ b/libs/pygments/lexers/actionscript.py @@ -4,7 +4,7 @@ Lexers for ActionScript and MXML. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,8 +20,6 @@ class ActionScriptLexer(RegexLexer): """ For ActionScript source code. - - .. versionadded:: 0.9 """ name = 'ActionScript' @@ -29,6 +27,8 @@ class ActionScriptLexer(RegexLexer): filenames = ['*.as'] mimetypes = ['application/x-actionscript', 'text/x-actionscript', 'text/actionscript'] + url = 'https://en.wikipedia.org/wiki/ActionScript' + version_added = '0.9' flags = re.DOTALL tokens = { @@ -118,8 +118,6 @@ def analyse_text(text): class ActionScript3Lexer(RegexLexer): """ For ActionScript 3 source code. - - .. versionadded:: 0.11 """ name = 'ActionScript 3' @@ -128,6 +126,7 @@ class ActionScript3Lexer(RegexLexer): filenames = ['*.as'] mimetypes = ['application/x-actionscript3', 'text/x-actionscript3', 'text/actionscript3'] + version_added = '0.11' identifier = r'[$a-zA-Z_]\w*' typeidentifier = identifier + r'(?:\.<\w+>)?' @@ -205,14 +204,13 @@ class MxmlLexer(RegexLexer): """ For MXML markup. Nested AS3 in <script> tags is highlighted by the appropriate lexer. - - .. versionadded:: 1.1 """ flags = re.MULTILINE | re.DOTALL name = 'MXML' aliases = ['mxml'] filenames = ['*.mxml'] - mimetimes = ['text/xml', 'application/xml'] + url = 'https://en.wikipedia.org/wiki/MXML' + version_added = '1.1' tokens = { 'root': [ diff --git a/libs/pygments/lexers/ada.py b/libs/pygments/lexers/ada.py index 6a5e64406..ec99c8f3a 100644 --- a/libs/pygments/lexers/ada.py +++ b/libs/pygments/lexers/ada.py @@ -4,7 +4,7 @@ Lexers for Ada family languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,14 +22,14 @@ class AdaLexer(RegexLexer): """ For Ada source code. - - .. versionadded:: 1.3 """ name = 'Ada' aliases = ['ada', 'ada95', 'ada2005'] filenames = ['*.adb', '*.ads', '*.ada'] mimetypes = ['text/x-ada'] + url = 'https://www.adaic.org' + version_added = '1.3' flags = re.MULTILINE | re.IGNORECASE diff --git a/libs/pygments/lexers/agile.py b/libs/pygments/lexers/agile.py index c0c1a457a..097beebb6 100644 --- a/libs/pygments/lexers/agile.py +++ b/libs/pygments/lexers/agile.py @@ -4,10 +4,12 @@ Just export lexer classes previously contained in this module. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +# ruff: noqa: F401 + from pygments.lexers.lisp import SchemeLexer from pygments.lexers.jvm import IokeLexer, ClojureLexer from pygments.lexers.python import PythonLexer, PythonConsoleLexer, \ diff --git a/libs/pygments/lexers/algebra.py b/libs/pygments/lexers/algebra.py index 95f17540e..98e1e66d6 100644 --- a/libs/pygments/lexers/algebra.py +++ b/libs/pygments/lexers/algebra.py @@ -4,7 +4,7 @@ Lexers for computer algebra systems. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,13 +21,12 @@ class GAPLexer(RegexLexer): """ For GAP source code. - - .. versionadded:: 2.0 """ name = 'GAP' url = 'https://www.gap-system.org' aliases = ['gap'] filenames = ['*.g', '*.gd', '*.gi', '*.gap'] + version_added = '2.0' tokens = { 'root': [ @@ -92,12 +91,12 @@ def analyse_text(text): class GAPConsoleLexer(Lexer): """ For GAP console sessions. Modeled after JuliaConsoleLexer. - - .. versionadded:: 2.14 """ name = 'GAP session' aliases = ['gap-console', 'gap-repl'] filenames = ['*.tst'] + url = 'https://www.gap-system.org' + version_added = '2.14' def get_tokens_unprocessed(self, text): gaplexer = GAPLexer(**self.options) @@ -149,8 +148,6 @@ def analyse_text(text): class MathematicaLexer(RegexLexer): """ Lexer for Mathematica source code. - - .. versionadded:: 2.0 """ name = 'Mathematica' url = 'http://www.wolfram.com/mathematica/' @@ -160,6 +157,7 @@ class MathematicaLexer(RegexLexer): 'application/vnd.wolfram.mathematica', 'application/vnd.wolfram.mathematica.package', 'application/vnd.wolfram.cdf'] + version_added = '2.0' # http://reference.wolfram.com/mathematica/guide/Syntax.html operators = ( @@ -171,7 +169,7 @@ class MathematicaLexer(RegexLexer): punctuation = (",", ";", "(", ")", "[", "]", "{", "}") def _multi_escape(entries): - return '(%s)' % ('|'.join(re.escape(entry) for entry in entries)) + return '({})'.format('|'.join(re.escape(entry) for entry in entries)) tokens = { 'root': [ @@ -198,13 +196,12 @@ class MuPADLexer(RegexLexer): """ A MuPAD lexer. Contributed by Christopher Creutzig <christopher@creutzig.de>. - - .. versionadded:: 0.8 """ name = 'MuPAD' url = 'http://www.mupad.com' aliases = ['mupad'] filenames = ['*.mu'] + version_added = '0.8' tokens = { 'root': [ @@ -270,13 +267,12 @@ class MuPADLexer(RegexLexer): class BCLexer(RegexLexer): """ A BC lexer. - - .. versionadded:: 2.1 """ name = 'BC' url = 'https://www.gnu.org/software/bc/' aliases = ['bc'] filenames = ['*.bc'] + version_added = '2.1' tokens = { 'root': [ diff --git a/libs/pygments/lexers/ambient.py b/libs/pygments/lexers/ambient.py index deba0f3b0..4441fd574 100644 --- a/libs/pygments/lexers/ambient.py +++ b/libs/pygments/lexers/ambient.py @@ -4,7 +4,7 @@ Lexers for AmbientTalk language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,13 @@ class AmbientTalkLexer(RegexLexer): """ Lexer for AmbientTalk source code. - - .. versionadded:: 2.0 """ name = 'AmbientTalk' url = 'https://code.google.com/p/ambienttalk' filenames = ['*.at'] aliases = ['ambienttalk', 'ambienttalk/2', 'at'] mimetypes = ['text/x-ambienttalk'] + version_added = '2.0' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/amdgpu.py b/libs/pygments/lexers/amdgpu.py index 860dfd442..6e4324533 100644 --- a/libs/pygments/lexers/amdgpu.py +++ b/libs/pygments/lexers/amdgpu.py @@ -4,7 +4,7 @@ Lexers for the AMDGPU ISA assembly. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,12 +19,12 @@ class AMDGPULexer(RegexLexer): """ For AMD GPU assembly. - - .. versionadded:: 2.8 """ name = 'AMDGPU' aliases = ['amdgpu'] filenames = ['*.isa'] + url = 'https://gpuopen.com/amd-isa-documentation' + version_added = '2.8' flags = re.IGNORECASE diff --git a/libs/pygments/lexers/ampl.py b/libs/pygments/lexers/ampl.py index b5abcacfc..ce3a77467 100644 --- a/libs/pygments/lexers/ampl.py +++ b/libs/pygments/lexers/ampl.py @@ -4,7 +4,7 @@ Lexers for the AMPL language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,13 +18,12 @@ class AmplLexer(RegexLexer): """ For AMPL source code. - - .. versionadded:: 2.2 """ name = 'Ampl' url = 'http://ampl.com/' aliases = ['ampl'] filenames = ['*.run'] + version_added = '2.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/apdlexer.py b/libs/pygments/lexers/apdlexer.py index a50219c3b..352288d64 100644 --- a/libs/pygments/lexers/apdlexer.py +++ b/libs/pygments/lexers/apdlexer.py @@ -4,7 +4,7 @@ Lexers for ANSYS Parametric Design Language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,12 +20,13 @@ class apdlexer(RegexLexer): """ For APDL source code. - - .. versionadded:: 2.9 """ name = 'ANSYS parametric design language' aliases = ['ansys', 'apdl'] filenames = ['*.ans'] + url = 'https://www.ansys.com' + version_added = '2.9' + flags = re.IGNORECASE # list of elements diff --git a/libs/pygments/lexers/apl.py b/libs/pygments/lexers/apl.py index 815184da1..d95aff36d 100644 --- a/libs/pygments/lexers/apl.py +++ b/libs/pygments/lexers/apl.py @@ -4,7 +4,7 @@ Lexers for APL. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,8 +18,6 @@ class APLLexer(RegexLexer): """ A simple APL lexer. - - .. versionadded:: 2.0 """ name = 'APL' url = 'https://en.m.wikipedia.org/wiki/APL_(programming_language)' @@ -28,6 +26,7 @@ class APLLexer(RegexLexer): '*.apl', '*.aplf', '*.aplo', '*.apln', '*.aplc', '*.apli', '*.dyalog', ] + version_added = '2.0' tokens = { 'root': [ diff --git a/libs/pygments/lexers/archetype.py b/libs/pygments/lexers/archetype.py index e8312d78e..b019c4f63 100644 --- a/libs/pygments/lexers/archetype.py +++ b/libs/pygments/lexers/archetype.py @@ -2,18 +2,14 @@ pygments.lexers.archetype ~~~~~~~~~~~~~~~~~~~~~~~~~ - Lexer for Archetype-related syntaxes, including: - - - ODIN syntax <https://github.com/openEHR/odin> - - ADL syntax <http://www.openehr.org/releases/trunk/architecture/am/adl2.pdf> - - cADL sub-syntax of ADL + Lexer for Archetype-related syntaxes, including ODIN, ADL and cADL. For uses of this syntax, see the openEHR archetypes <http://www.openEHR.org/ckm> Contributed by Thomas Beale <https://github.com/wolandscat>, <https://bitbucket.org/thomas_beale>. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -139,13 +135,13 @@ class AtomsLexer(RegexLexer): class OdinLexer(AtomsLexer): """ Lexer for ODIN syntax. - - .. versionadded:: 2.1 """ name = 'ODIN' aliases = ['odin'] filenames = ['*.odin'] mimetypes = ['text/odin'] + url = 'https://github.com/openEHR/odin' + version_added = '2.1' tokens = { 'path': [ @@ -188,12 +184,12 @@ class OdinLexer(AtomsLexer): class CadlLexer(AtomsLexer): """ Lexer for cADL syntax. - - .. versionadded:: 2.1 """ name = 'cADL' aliases = ['cadl'] filenames = ['*.cadl'] + url = 'https://specifications.openehr.org/releases/AM/latest/ADL2.html#_cadl_constraint_adl' + version_added = '2.1' tokens = { 'path': [ @@ -253,13 +249,13 @@ class CadlLexer(AtomsLexer): class AdlLexer(AtomsLexer): """ Lexer for ADL syntax. - - .. versionadded:: 2.1 """ name = 'ADL' aliases = ['adl'] filenames = ['*.adl', '*.adls', '*.adlf', '*.adlx'] + url = 'https://specifications.openehr.org/releases/AM/latest/ADL2.html' + version_added = '2.1' tokens = { 'whitespace': [ diff --git a/libs/pygments/lexers/arrow.py b/libs/pygments/lexers/arrow.py index 894b64d31..853247630 100644 --- a/libs/pygments/lexers/arrow.py +++ b/libs/pygments/lexers/arrow.py @@ -4,7 +4,7 @@ Lexer for Arrow. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,14 +22,13 @@ class ArrowLexer(RegexLexer): """ Lexer for Arrow - - .. versionadded:: 2.7 """ name = 'Arrow' url = 'https://pypi.org/project/py-arrow-lang/' aliases = ['arrow'] filenames = ['*.arw'] + version_added = '2.7' tokens = { 'root': [ diff --git a/libs/pygments/lexers/arturo.py b/libs/pygments/lexers/arturo.py index 72258248f..87c97378e 100644 --- a/libs/pygments/lexers/arturo.py +++ b/libs/pygments/lexers/arturo.py @@ -4,7 +4,7 @@ Lexer for the Arturo language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -24,14 +24,13 @@ class ArturoLexer(RegexLexer): See `Arturo's Github <https://github.com/arturo-lang/arturo>`_ and `Arturo's Website <https://arturo-lang.io/>`_. - - .. versionadded:: 2.14.0 """ name = 'Arturo' aliases = ['arturo', 'art'] filenames = ['*.art'] url = 'https://arturo-lang.io/' + version_added = '2.14' def __init__(self, **options): self.handle_annotateds = get_bool_opt(options, 'handle_annotateds', diff --git a/libs/pygments/lexers/asc.py b/libs/pygments/lexers/asc.py index e261f4115..971f2093e 100644 --- a/libs/pygments/lexers/asc.py +++ b/libs/pygments/lexers/asc.py @@ -4,7 +4,7 @@ Lexer for various ASCII armored files. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re @@ -19,8 +19,6 @@ class AscLexer(RegexLexer): """ Lexer for ASCII armored files, containing `-----BEGIN/END ...-----` wrapped base64 data. - - .. versionadded:: 2.10 """ name = 'ASCII armored' aliases = ['asc', 'pem'] @@ -32,6 +30,8 @@ class AscLexer(RegexLexer): ] mimetypes = ['application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature', 'application/pem-certificate-chain'] + url = 'https://www.openpgp.org' + version_added = '2.10' flags = re.MULTILINE diff --git a/libs/pygments/lexers/asm.py b/libs/pygments/lexers/asm.py index 0035c723f..a049370bd 100644 --- a/libs/pygments/lexers/asm.py +++ b/libs/pygments/lexers/asm.py @@ -4,7 +4,7 @@ Lexers for assembly languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -31,6 +31,8 @@ class GasLexer(RegexLexer): aliases = ['gas', 'asm'] filenames = ['*.s', '*.S'] mimetypes = ['text/x-gas'] + url = 'https://www.gnu.org/software/binutils' + version_added = '' #: optional Comment or Whitespace string = r'"(\\"|[^"])*"' @@ -167,6 +169,8 @@ class ObjdumpLexer(RegexLexer): aliases = ['objdump'] filenames = ['*.objdump'] mimetypes = ['text/x-objdump'] + url = 'https://www.gnu.org/software/binutils' + version_added = '' tokens = _objdump_lexer_tokens(GasLexer) @@ -179,6 +183,8 @@ class DObjdumpLexer(DelegatingLexer): aliases = ['d-objdump'] filenames = ['*.d-objdump'] mimetypes = ['text/x-d-objdump'] + url = 'https://www.gnu.org/software/binutils' + version_added = '' def __init__(self, **options): super().__init__(DLexer, ObjdumpLexer, **options) @@ -192,6 +198,8 @@ class CppObjdumpLexer(DelegatingLexer): aliases = ['cpp-objdump', 'c++-objdumb', 'cxx-objdump'] filenames = ['*.cpp-objdump', '*.c++-objdump', '*.cxx-objdump'] mimetypes = ['text/x-cpp-objdump'] + url = 'https://www.gnu.org/software/binutils' + version_added = '' def __init__(self, **options): super().__init__(CppLexer, ObjdumpLexer, **options) @@ -205,6 +213,9 @@ class CObjdumpLexer(DelegatingLexer): aliases = ['c-objdump'] filenames = ['*.c-objdump'] mimetypes = ['text/x-c-objdump'] + url = 'https://www.gnu.org/software/binutils' + version_added = '' + def __init__(self, **options): super().__init__(CLexer, ObjdumpLexer, **options) @@ -213,13 +224,13 @@ def __init__(self, **options): class HsailLexer(RegexLexer): """ For HSAIL assembly code. - - .. versionadded:: 2.2 """ name = 'HSAIL' aliases = ['hsail', 'hsa'] filenames = ['*.hsail'] mimetypes = ['text/x-hsail'] + url = 'https://en.wikipedia.org/wiki/Heterogeneous_System_Architecture#HSA_Intermediate_Layer' + version_added = '2.2' string = r'"[^"]*?"' identifier = r'[a-zA-Z_][\w.]*' @@ -354,6 +365,7 @@ class LlvmLexer(RegexLexer): aliases = ['llvm'] filenames = ['*.ll'] mimetypes = ['text/x-llvm'] + version_added = '' #: optional Comment or Whitespace string = r'"[^"]*?"' @@ -490,14 +502,13 @@ class LlvmLexer(RegexLexer): class LlvmMirBodyLexer(RegexLexer): """ For LLVM MIR examples without the YAML wrapper. - - .. versionadded:: 2.6 """ name = 'LLVM-MIR Body' url = 'https://llvm.org/docs/MIRLangRef.html' aliases = ['llvm-mir-body'] filenames = [] mimetypes = [] + version_added = '2.6' tokens = { 'root': [ @@ -635,13 +646,12 @@ class LlvmMirLexer(RegexLexer): machine specific intermediate representation. It allows LLVM's developers to see the state of the compilation process at various points, as well as test individual pieces of the compiler. - - .. versionadded:: 2.6 """ name = 'LLVM-MIR' url = 'https://llvm.org/docs/MIRLangRef.html' aliases = ['llvm-mir'] filenames = ['*.mir'] + version_added = '2.6' tokens = { 'root': [ @@ -715,6 +725,8 @@ class NasmLexer(RegexLexer): aliases = ['nasm'] filenames = ['*.asm', '*.ASM', '*.nasm'] mimetypes = ['text/x-nasm'] + url = 'https://nasm.us' + version_added = '' # Tasm uses the same file endings, but TASM is not as common as NASM, so # we prioritize NASM higher by default @@ -746,7 +758,7 @@ class NasmLexer(RegexLexer): (r'^\s*%', Comment.Preproc, 'preproc'), include('whitespace'), (identifier + ':', Name.Label), - (r'(%s)(\s+)(equ)' % identifier, + (rf'({identifier})(\s+)(equ)', bygroups(Name.Constant, Whitespace, Keyword.Declaration), 'instruction-args'), (directives, Keyword, 'instruction-args'), @@ -796,13 +808,13 @@ def analyse_text(text): class NasmObjdumpLexer(ObjdumpLexer): """ For the output of ``objdump -d -M intel``. - - .. versionadded:: 2.0 """ name = 'objdump-nasm' aliases = ['objdump-nasm'] filenames = ['*.objdump-intel'] mimetypes = ['text/x-nasm-objdump'] + url = 'https://www.gnu.org/software/binutils' + version_added = '2.0' tokens = _objdump_lexer_tokens(NasmLexer) @@ -815,6 +827,8 @@ class TasmLexer(RegexLexer): aliases = ['tasm'] filenames = ['*.asm', '*.ASM', '*.tasm'] mimetypes = ['text/x-tasm'] + url = 'https://en.wikipedia.org/wiki/Turbo_Assembler' + version_added = '' identifier = r'[@a-z$._?][\w$.?#@~]*' hexn = r'(?:0x[0-9a-f]+|$0[0-9a-f]*|[0-9]+[0-9a-f]*h)' @@ -844,7 +858,7 @@ class TasmLexer(RegexLexer): include('whitespace'), (identifier + ':', Name.Label), (directives, Keyword, 'instruction-args'), - (r'(%s)(\s+)(%s)' % (identifier, datatype), + (rf'({identifier})(\s+)({datatype})', bygroups(Name.Constant, Whitespace, Keyword.Declaration), 'instruction-args'), (declkw, Keyword.Declaration, 'instruction-args'), @@ -896,12 +910,12 @@ def analyse_text(text): class Ca65Lexer(RegexLexer): """ For ca65 assembler sources. - - .. versionadded:: 1.6 """ name = 'ca65 assembler' aliases = ['ca65'] filenames = ['*.s'] + url = 'https://cc65.github.io' + version_added = '1.6' flags = re.IGNORECASE @@ -935,14 +949,13 @@ def analyse_text(self, text): class Dasm16Lexer(RegexLexer): """ For DCPU-16 Assembly. - - .. versionadded:: 2.4 """ name = 'DASM16' url = 'http://0x10c.com/doc/dcpu-16.txt' aliases = ['dasm16'] filenames = ['*.dasm16', '*.dasm'] mimetypes = ['text/x-dasm16'] + version_added = '2.4' INSTRUCTIONS = [ 'SET', diff --git a/libs/pygments/lexers/asn1.py b/libs/pygments/lexers/asn1.py index 30632cb4d..8aa23646d 100644 --- a/libs/pygments/lexers/asn1.py +++ b/libs/pygments/lexers/asn1.py @@ -4,7 +4,7 @@ Pygments lexers for ASN.1. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -118,8 +118,6 @@ class Asn1Lexer(RegexLexer): """ Lexer for ASN.1 module definition - - .. versionadded:: 2.16 """ flags = re.MULTILINE @@ -128,6 +126,7 @@ class Asn1Lexer(RegexLexer): aliases = ['asn1'] filenames = ["*.asn1"] url = "https://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf" + version_added = '2.16' tokens = { 'root': [ diff --git a/libs/pygments/lexers/automation.py b/libs/pygments/lexers/automation.py index f0f7c5b94..e64aa9ae8 100644 --- a/libs/pygments/lexers/automation.py +++ b/libs/pygments/lexers/automation.py @@ -4,7 +4,7 @@ Lexers for automation scripting languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class AutohotkeyLexer(RegexLexer): """ For autohotkey source code. - - .. versionadded:: 1.4 """ name = 'autohotkey' url = 'http://www.autohotkey.com/' aliases = ['autohotkey', 'ahk'] filenames = ['*.ahk', '*.ahkl'] mimetypes = ['text/x-autohotkey'] + version_added = '1.4' tokens = { 'root': [ @@ -199,14 +198,13 @@ class AutoItLexer(RegexLexer): AutoIt is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting - - .. versionadded:: 1.6 """ name = 'AutoIt' url = 'http://www.autoitscript.com/site/autoit/' aliases = ['autoit'] filenames = ['*.au3'] mimetypes = ['text/x-autoit'] + version_added = '1.6' # Keywords, functions, macros from au3.keywords.properties # which can be found in AutoIt installed directory, e.g. @@ -337,15 +335,15 @@ class AutoItLexer(RegexLexer): include('garbage'), ], 'commands': [ - (r'(?i)(\s*)(%s)\b' % '|'.join(keywords), + (r'(?i)(\s*)({})\b'.format('|'.join(keywords)), bygroups(Text, Name.Builtin)), ], 'builtInFunctions': [ - (r'(?i)(%s)\b' % '|'.join(functions), + (r'(?i)({})\b'.format('|'.join(functions)), Name.Function), ], 'builtInMarcros': [ - (r'(?i)(%s)\b' % '|'.join(macros), + (r'(?i)({})\b'.format('|'.join(macros)), Name.Variable.Global), ], 'labels': [ diff --git a/libs/pygments/lexers/bare.py b/libs/pygments/lexers/bare.py index fce5ae073..9049ea846 100644 --- a/libs/pygments/lexers/bare.py +++ b/libs/pygments/lexers/bare.py @@ -4,7 +4,7 @@ Lexer for the BARE schema. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,13 +17,12 @@ class BareLexer(RegexLexer): """ For BARE schema source. - - .. versionadded:: 2.7 """ name = 'BARE' url = 'https://baremessages.org' filenames = ['*.bare'] aliases = ['bare'] + version_added = '2.7' keywords = [ 'type', diff --git a/libs/pygments/lexers/basic.py b/libs/pygments/lexers/basic.py index 8837dacba..9cfdf4622 100644 --- a/libs/pygments/lexers/basic.py +++ b/libs/pygments/lexers/basic.py @@ -4,7 +4,7 @@ Lexers for BASIC like languages (other than VB.net). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,8 +23,6 @@ class BlitzMaxLexer(RegexLexer): """ For BlitzMax source code. - - .. versionadded:: 1.4 """ name = 'BlitzMax' @@ -32,14 +30,14 @@ class BlitzMaxLexer(RegexLexer): aliases = ['blitzmax', 'bmax'] filenames = ['*.bmx'] mimetypes = ['text/x-bmx'] + version_added = '1.4' bmax_vopwords = r'\b(Shl|Shr|Sar|Mod)\b' bmax_sktypes = r'@{1,2}|[!#$%]' bmax_lktypes = r'\b(Int|Byte|Short|Float|Double|Long)\b' bmax_name = r'[a-z_]\w*' - bmax_var = (r'(%s)(?:(?:([ \t]*)(%s)|([ \t]*:[ \t]*\b(?:Shl|Shr|Sar|Mod)\b)' - r'|([ \t]*)(:)([ \t]*)(?:%s|(%s)))(?:([ \t]*)(Ptr))?)') % \ - (bmax_name, bmax_sktypes, bmax_lktypes, bmax_name) + bmax_var = (rf'({bmax_name})(?:(?:([ \t]*)({bmax_sktypes})|([ \t]*:[ \t]*\b(?:Shl|Shr|Sar|Mod)\b)' + rf'|([ \t]*)(:)([ \t]*)(?:{bmax_lktypes}|({bmax_name})))(?:([ \t]*)(Ptr))?)') bmax_func = bmax_var + r'?((?:[ \t]|\.\.\n)*)([(])' flags = re.MULTILINE | re.IGNORECASE @@ -60,16 +58,14 @@ class BlitzMaxLexer(RegexLexer): (r'\$[0-9a-f]+', Number.Hex), (r'\%[10]+', Number.Bin), # Other - (r'(?:(?:(:)?([ \t]*)(:?%s|([+\-*/&|~]))|Or|And|Not|[=<>^]))' % - (bmax_vopwords), Operator), + (rf'(?:(?:(:)?([ \t]*)(:?{bmax_vopwords}|([+\-*/&|~]))|Or|And|Not|[=<>^]))', Operator), (r'[(),.:\[\]]', Punctuation), (r'(?:#[\w \t]*)', Name.Label), (r'(?:\?[\w \t]*)', Comment.Preproc), # Identifiers - (r'\b(New)\b([ \t]?)([(]?)(%s)' % (bmax_name), + (rf'\b(New)\b([ \t]?)([(]?)({bmax_name})', bygroups(Keyword.Reserved, Whitespace, Punctuation, Name.Class)), - (r'\b(Import|Framework|Module)([ \t]+)(%s\.%s)' % - (bmax_name, bmax_name), + (rf'\b(Import|Framework|Module)([ \t]+)({bmax_name}\.{bmax_name})', bygroups(Keyword.Reserved, Whitespace, Keyword.Namespace)), (bmax_func, bygroups(Name.Function, Whitespace, Keyword.Type, Operator, Whitespace, Punctuation, Whitespace, @@ -78,7 +74,7 @@ class BlitzMaxLexer(RegexLexer): (bmax_var, bygroups(Name.Variable, Whitespace, Keyword.Type, Operator, Whitespace, Punctuation, Whitespace, Keyword.Type, Name.Class, Whitespace, Keyword.Type)), - (r'\b(Type|Extends)([ \t]+)(%s)' % (bmax_name), + (rf'\b(Type|Extends)([ \t]+)({bmax_name})', bygroups(Keyword.Reserved, Whitespace, Name.Class)), # Keywords (r'\b(Ptr)\b', Keyword.Type), @@ -102,7 +98,7 @@ class BlitzMaxLexer(RegexLexer): 'RestoreData'), prefix=r'\b', suffix=r'\b'), Keyword.Reserved), # Final resolve (for variable names and such) - (r'(%s)' % (bmax_name), Name.Variable), + (rf'({bmax_name})', Name.Variable), ], 'string': [ (r'""', String.Double), @@ -115,8 +111,6 @@ class BlitzMaxLexer(RegexLexer): class BlitzBasicLexer(RegexLexer): """ For BlitzBasic source code. - - .. versionadded:: 2.0 """ name = 'BlitzBasic' @@ -124,11 +118,11 @@ class BlitzBasicLexer(RegexLexer): aliases = ['blitzbasic', 'b3d', 'bplus'] filenames = ['*.bb', '*.decls'] mimetypes = ['text/x-bb'] + version_added = '2.0' bb_sktypes = r'@{1,2}|[#$%]' bb_name = r'[a-z]\w*' - bb_var = (r'(%s)(?:([ \t]*)(%s)|([ \t]*)([.])([ \t]*)(?:(%s)))?') % \ - (bb_name, bb_sktypes, bb_name) + bb_var = (rf'({bb_name})(?:([ \t]*)({bb_sktypes})|([ \t]*)([.])([ \t]*)(?:({bb_name})))?') flags = re.MULTILINE | re.IGNORECASE tokens = { @@ -153,21 +147,21 @@ class BlitzBasicLexer(RegexLexer): Operator), (r'([+\-*/~=<>^])', Operator), (r'[(),:\[\]\\]', Punctuation), - (r'\.([ \t]*)(%s)' % bb_name, Name.Label), + (rf'\.([ \t]*)({bb_name})', Name.Label), # Identifiers - (r'\b(New)\b([ \t]+)(%s)' % (bb_name), + (rf'\b(New)\b([ \t]+)({bb_name})', bygroups(Keyword.Reserved, Whitespace, Name.Class)), - (r'\b(Gosub|Goto)\b([ \t]+)(%s)' % (bb_name), + (rf'\b(Gosub|Goto)\b([ \t]+)({bb_name})', bygroups(Keyword.Reserved, Whitespace, Name.Label)), - (r'\b(Object)\b([ \t]*)([.])([ \t]*)(%s)\b' % (bb_name), + (rf'\b(Object)\b([ \t]*)([.])([ \t]*)({bb_name})\b', bygroups(Operator, Whitespace, Punctuation, Whitespace, Name.Class)), - (r'\b%s\b([ \t]*)(\()' % bb_var, + (rf'\b{bb_var}\b([ \t]*)(\()', bygroups(Name.Function, Whitespace, Keyword.Type, Whitespace, Punctuation, Whitespace, Name.Class, Whitespace, Punctuation)), - (r'\b(Function)\b([ \t]+)%s' % bb_var, + (rf'\b(Function)\b([ \t]+){bb_var}', bygroups(Keyword.Reserved, Whitespace, Name.Function, Whitespace, Keyword.Type, Whitespace, Punctuation, Whitespace, Name.Class)), - (r'\b(Type)([ \t]+)(%s)' % (bb_name), + (rf'\b(Type)([ \t]+)({bb_name})', bygroups(Keyword.Reserved, Whitespace, Name.Class)), # Keywords (r'\b(Pi|True|False|Null)\b', Keyword.Constant), @@ -194,17 +188,15 @@ class BlitzBasicLexer(RegexLexer): class MonkeyLexer(RegexLexer): """ - For - `Monkey <https://en.wikipedia.org/wiki/Monkey_(programming_language)>`_ - source code. - - .. versionadded:: 1.6 + For Monkey source code. """ name = 'Monkey' aliases = ['monkey'] filenames = ['*.monkey'] mimetypes = ['text/x-monkey'] + url = 'https://blitzresearch.itch.io/monkeyx' + version_added = '1.6' name_variable = r'[a-z_]\w*' name_function = r'[A-Z]\w*' @@ -238,7 +230,7 @@ class MonkeyLexer(RegexLexer): (r'\$[0-9a-fA-Z]+', Number.Hex), (r'\%[10]+', Number.Bin), # Native data types - (r'\b%s\b' % keyword_type, Keyword.Type), + (rf'\b{keyword_type}\b', Keyword.Type), # Exception handling (r'(?i)\b(?:Try|Catch|Throw)\b', Keyword.Reserved), (r'Throwable', Name.Exception), @@ -274,21 +266,21 @@ class MonkeyLexer(RegexLexer): (r'(?i)(?:Not|Mod|Shl|Shr|And|Or)', Operator.Word), (r'[(){}!#,.:]', Punctuation), # catch the rest - (r'%s\b' % name_constant, Name.Constant), - (r'%s\b' % name_function, Name.Function), - (r'%s\b' % name_variable, Name.Variable), + (rf'{name_constant}\b', Name.Constant), + (rf'{name_function}\b', Name.Function), + (rf'{name_variable}\b', Name.Variable), ], 'funcname': [ - (r'(?i)%s\b' % name_function, Name.Function), + (rf'(?i){name_function}\b', Name.Function), (r':', Punctuation, 'classname'), (r'\s+', Whitespace), (r'\(', Punctuation, 'variables'), (r'\)', Punctuation, '#pop') ], 'classname': [ - (r'%s\.' % name_module, Name.Namespace), - (r'%s\b' % keyword_type, Keyword.Type), - (r'%s\b' % name_class, Name.Class), + (rf'{name_module}\.', Name.Namespace), + (rf'{keyword_type}\b', Keyword.Type), + (rf'{name_class}\b', Name.Class), # array (of given size) (r'(\[)(\s*)(\d*)(\s*)(\])', bygroups(Punctuation, Whitespace, Number.Integer, Whitespace, Punctuation)), @@ -300,9 +292,9 @@ class MonkeyLexer(RegexLexer): default('#pop') ], 'variables': [ - (r'%s\b' % name_constant, Name.Constant), - (r'%s\b' % name_variable, Name.Variable), - (r'%s' % keyword_type_special, Keyword.Type), + (rf'{name_constant}\b', Name.Constant), + (rf'{name_variable}\b', Name.Variable), + (rf'{keyword_type_special}', Keyword.Type), (r'\s+', Whitespace), (r':', Punctuation, 'classname'), (r',', Punctuation, '#push'), @@ -325,12 +317,12 @@ class MonkeyLexer(RegexLexer): class CbmBasicV2Lexer(RegexLexer): """ For CBM BASIC V2 sources. - - .. versionadded:: 1.6 """ name = 'CBM BASIC V2' aliases = ['cbmbas'] filenames = ['*.bas'] + url = 'https://en.wikipedia.org/wiki/Commodore_BASIC' + version_added = '1.6' flags = re.IGNORECASE @@ -362,17 +354,15 @@ def analyse_text(text): class QBasicLexer(RegexLexer): """ - For - `QBasic <http://en.wikipedia.org/wiki/QBasic>`_ - source code. - - .. versionadded:: 2.0 + For QBasic source code. """ name = 'QBasic' aliases = ['qbasic', 'basic'] filenames = ['*.BAS', '*.bas'] mimetypes = ['text/basic'] + url = 'https://en.wikipedia.org/wiki/QBasic' + version_added = '2.0' declarations = ('DATA', 'LET') @@ -475,26 +465,26 @@ class QBasicLexer(RegexLexer): # can't use regular \b because of X$() # XXX: use words() here 'declarations': [ - (r'\b(%s)(?=\(|\b)' % '|'.join(map(re.escape, declarations)), + (r'\b({})(?=\(|\b)'.format('|'.join(map(re.escape, declarations))), Keyword.Declaration), ], 'functions': [ - (r'\b(%s)(?=\(|\b)' % '|'.join(map(re.escape, functions)), + (r'\b({})(?=\(|\b)'.format('|'.join(map(re.escape, functions))), Keyword.Reserved), ], 'metacommands': [ - (r'\b(%s)(?=\(|\b)' % '|'.join(map(re.escape, metacommands)), + (r'\b({})(?=\(|\b)'.format('|'.join(map(re.escape, metacommands))), Keyword.Constant), ], 'operators': [ - (r'\b(%s)(?=\(|\b)' % '|'.join(map(re.escape, operators)), Operator.Word), + (r'\b({})(?=\(|\b)'.format('|'.join(map(re.escape, operators))), Operator.Word), ], 'statements': [ - (r'\b(%s)\b' % '|'.join(map(re.escape, statements)), + (r'\b({})\b'.format('|'.join(map(re.escape, statements))), Keyword.Reserved), ], 'keywords': [ - (r'\b(%s)\b' % '|'.join(keywords), Keyword), + (r'\b({})\b'.format('|'.join(keywords)), Keyword), ], } @@ -506,12 +496,13 @@ def analyse_text(text): class VBScriptLexer(RegexLexer): """ VBScript is scripting language that is modeled on Visual Basic. - - .. versionadded:: 2.4 """ name = 'VBScript' aliases = ['vbscript'] filenames = ['*.vbs', '*.VBS'] + url = 'https://learn.microsoft.com/en-us/previous-versions/t0aew7h6(v=vs.85)' + version_added = '2.4' + flags = re.IGNORECASE tokens = { @@ -573,8 +564,6 @@ class BBCBasicLexer(RegexLexer): """ BBC Basic was supplied on the BBC Micro, and later Acorn RISC OS. It is also used by BBC Basic For Windows. - - .. versionadded:: 2.4 """ base_keywords = ['OTHERWISE', 'AND', 'DIV', 'EOR', 'MOD', 'OR', 'ERROR', 'LINE', 'OFF', 'STEP', 'SPC', 'TAB', 'ELSE', 'THEN', @@ -607,6 +596,8 @@ class BBCBasicLexer(RegexLexer): name = 'BBC Basic' aliases = ['bbcbasic'] filenames = ['*.bbc'] + url = 'https://www.bbcbasic.co.uk/bbcbasic.html' + version_added = '2.4' tokens = { 'root': [ diff --git a/libs/pygments/lexers/bdd.py b/libs/pygments/lexers/bdd.py index 8cf47f8de..01688d572 100644 --- a/libs/pygments/lexers/bdd.py +++ b/libs/pygments/lexers/bdd.py @@ -3,9 +3,8 @@ ~~~~~~~~~~~~~~~~~~~ Lexer for BDD(Behavior-driven development). - More information: https://en.wikipedia.org/wiki/Behavior-driven_development - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +18,14 @@ class BddLexer(RegexLexer): """ Lexer for BDD(Behavior-driven development), which highlights not only keywords, but also comments, punctuations, strings, numbers, and variables. - - .. versionadded:: 2.11 """ name = 'Bdd' aliases = ['bdd'] filenames = ['*.feature'] mimetypes = ['text/x-bdd'] + url = 'https://en.wikipedia.org/wiki/Behavior-driven_development' + version_added = '2.11' step_keywords = (r'Given|When|Then|Add|And|Feature|Scenario Outline|' r'Scenario|Background|Examples|But') diff --git a/libs/pygments/lexers/berry.py b/libs/pygments/lexers/berry.py index e078fa167..873b72347 100644 --- a/libs/pygments/lexers/berry.py +++ b/libs/pygments/lexers/berry.py @@ -4,7 +4,7 @@ Lexer for Berry. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,14 +17,14 @@ class BerryLexer(RegexLexer): """ - For `berry <http://github.com/berry-lang/berry>`_ source code. - - .. versionadded:: 2.12.0 + For Berry source code. """ name = 'Berry' aliases = ['berry', 'be'] filenames = ['*.be'] mimetypes = ['text/x-berry', 'application/x-berry'] + url = 'https://berry-lang.github.io' + version_added = '2.12' _name = r'\b[^\W\d]\w*' diff --git a/libs/pygments/lexers/bibtex.py b/libs/pygments/lexers/bibtex.py index 34883cd83..15e4e04fc 100644 --- a/libs/pygments/lexers/bibtex.py +++ b/libs/pygments/lexers/bibtex.py @@ -4,7 +4,7 @@ Lexers for BibTeX bibliography data and styles - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,15 +21,15 @@ class BibTeXLexer(ExtendedRegexLexer): """ A lexer for BibTeX bibliography data format. - - .. versionadded:: 2.2 """ name = 'BibTeX' aliases = ['bibtex', 'bib'] filenames = ['*.bib'] mimetypes = ["text/x-bibtex"] + version_added = '2.2' flags = re.IGNORECASE + url = 'https://texfaq.org/FAQ-BibTeXing' ALLOWED_CHARS = r'@!$&*+\-./:;<>?\[\\\]^`|~' IDENTIFIER = '[{}][{}]*'.format('a-z_' + ALLOWED_CHARS, r'\w' + ALLOWED_CHARS) @@ -116,14 +116,14 @@ def close_brace_callback(self, match, ctx): class BSTLexer(RegexLexer): """ A lexer for BibTeX bibliography styles. - - .. versionadded:: 2.2 """ name = 'BST' aliases = ['bst', 'bst-pybtex'] filenames = ['*.bst'] + version_added = '2.2' flags = re.IGNORECASE | re.MULTILINE + url = 'https://texfaq.org/FAQ-BibTeXing' tokens = { 'root': [ diff --git a/libs/pygments/lexers/blueprint.py b/libs/pygments/lexers/blueprint.py index ec5c6188e..b199c42fd 100644 --- a/libs/pygments/lexers/blueprint.py +++ b/libs/pygments/lexers/blueprint.py @@ -4,7 +4,7 @@ Lexer for the Blueprint UI markup language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -28,8 +28,6 @@ class BlueprintLexer(RegexLexer): """ For Blueprint UI markup. - - .. versionadded:: 2.16 """ name = "Blueprint" @@ -37,6 +35,7 @@ class BlueprintLexer(RegexLexer): filenames = ["*.blp"] mimetypes = ["text/x-blueprint"] url = "https://gitlab.gnome.org/jwestman/blueprint-compiler" + version_added = '2.16' flags = re.IGNORECASE tokens = { diff --git a/libs/pygments/lexers/boa.py b/libs/pygments/lexers/boa.py index f7baf3cd2..211f9fd0a 100644 --- a/libs/pygments/lexers/boa.py +++ b/libs/pygments/lexers/boa.py @@ -4,7 +4,7 @@ Lexers for the Boa language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,13 +17,13 @@ class BoaLexer(RegexLexer): """ - Lexer for the `Boa <http://boa.cs.iastate.edu/docs/>`_ language. - - .. versionadded:: 2.4 + Lexer for the Boa language. """ name = 'Boa' aliases = ['boa'] filenames = ['*.boa'] + url = 'https://boa.cs.iastate.edu/docs' + version_added = '2.4' reserved = words( ('input', 'output', 'of', 'weight', 'before', 'after', 'stop', diff --git a/libs/pygments/lexers/bqn.py b/libs/pygments/lexers/bqn.py index af84b4d04..b0794ee03 100644 --- a/libs/pygments/lexers/bqn.py +++ b/libs/pygments/lexers/bqn.py @@ -4,7 +4,7 @@ Lexer for BQN. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class BQNLexer(RegexLexer): """ A simple BQN lexer. - - .. versionadded:: 2.16 """ name = 'BQN' url = 'https://mlochbaum.github.io/BQN/index.html' aliases = ['bqn'] filenames = ['*.bqn'] mimetypes = [] + version_added = '2.16' tokens = { 'root': [ diff --git a/libs/pygments/lexers/business.py b/libs/pygments/lexers/business.py index d2f2dd3ae..3d81df54d 100644 --- a/libs/pygments/lexers/business.py +++ b/libs/pygments/lexers/business.py @@ -4,7 +4,7 @@ Lexers for "business-oriented" languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,13 +23,14 @@ class CobolLexer(RegexLexer): """ Lexer for OpenCOBOL code. - - .. versionadded:: 1.6 """ name = 'COBOL' aliases = ['cobol'] filenames = ['*.cob', '*.COB', '*.cpy', '*.CPY'] mimetypes = ['text/x-cobol'] + url = 'https://en.wikipedia.org/wiki/COBOL' + version_added = '1.6' + flags = re.IGNORECASE | re.MULTILINE # Data Types: by PICTURE and USAGE @@ -221,13 +222,14 @@ class CobolLexer(RegexLexer): class CobolFreeformatLexer(CobolLexer): """ Lexer for Free format OpenCOBOL code. - - .. versionadded:: 1.6 """ name = 'COBOLFree' aliases = ['cobolfree'] filenames = ['*.cbl', '*.CBL'] mimetypes = [] + url = 'https://opencobol.add1tocobol.com' + version_added = '1.6' + flags = re.IGNORECASE | re.MULTILINE tokens = { @@ -240,13 +242,13 @@ class CobolFreeformatLexer(CobolLexer): class ABAPLexer(RegexLexer): """ Lexer for ABAP, SAP's integrated language. - - .. versionadded:: 1.1 """ name = 'ABAP' aliases = ['abap'] filenames = ['*.abap', '*.ABAP'] mimetypes = ['text/x-abap'] + url = 'https://community.sap.com/topics/abap' + version_added = '1.1' flags = re.IGNORECASE | re.MULTILINE @@ -448,15 +450,14 @@ class ABAPLexer(RegexLexer): class OpenEdgeLexer(RegexLexer): """ - Lexer for `OpenEdge ABL (formerly Progress) - <http://web.progress.com/en/openedge/abl.html>`_ source code. - - .. versionadded:: 1.5 + Lexer for OpenEdge ABL (formerly Progress) source code. """ name = 'OpenEdge ABL' aliases = ['openedge', 'abl', 'progress'] filenames = ['*.p', '*.cls'] mimetypes = ['text/x-openedge', 'application/x-openedge'] + url = 'https://www.progress.com/openedge/features/abl' + version_added = '1.5' types = (r'(?i)(^|(?<=[^\w\-]))(CHARACTER|CHAR|CHARA|CHARAC|CHARACT|CHARACTE|' r'COM-HANDLE|DATE|DATETIME|DATETIME-TZ|' @@ -517,20 +518,20 @@ def analyse_text(text): class GoodDataCLLexer(RegexLexer): """ - Lexer for `GoodData-CL - <https://github.com/gooddata/GoodData-CL/raw/master/cli/src/main/resources/\ -com/gooddata/processor/COMMANDS.txt>`_ - script files. - - .. versionadded:: 1.4 + Lexer for GoodData-CL script files. """ name = 'GoodData-CL' aliases = ['gooddata-cl'] filenames = ['*.gdc'] mimetypes = ['text/x-gooddata-cl'] + url = 'https://github.com/gooddata/GoodData-CL' + version_added = '1.4' flags = re.IGNORECASE + + # Syntax: + # https://github.com/gooddata/GoodData-CL/raw/master/cli/src/main/resources/com/gooddata/processor/COMMANDS.txt tokens = { 'root': [ # Comments @@ -564,17 +565,15 @@ class GoodDataCLLexer(RegexLexer): class MaqlLexer(RegexLexer): """ - Lexer for `GoodData MAQL - <https://secure.gooddata.com/docs/html/advanced.metric.tutorial.html>`_ - scripts. - - .. versionadded:: 1.4 + Lexer for GoodData MAQL scripts. """ name = 'MAQL' aliases = ['maql'] filenames = ['*.maql'] mimetypes = ['text/x-gooddata-maql', 'application/x-gooddata-maql'] + url = 'https://help.gooddata.com/doc/enterprise/en/dashboards-and-insights/maql-analytical-query-language' + version_added = '1.4' flags = re.IGNORECASE tokens = { diff --git a/libs/pygments/lexers/c_cpp.py b/libs/pygments/lexers/c_cpp.py index ba6702f56..0f83b7193 100644 --- a/libs/pygments/lexers/c_cpp.py +++ b/libs/pygments/lexers/c_cpp.py @@ -4,7 +4,7 @@ Lexers for C/C++ languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -294,6 +294,8 @@ class CLexer(CFamilyLexer): aliases = ['c'] filenames = ['*.c', '*.h', '*.idc', '*.x[bp]m'] mimetypes = ['text/x-chdr', 'text/x-csrc', 'image/x-xbitmap', 'image/x-xpixmap'] + url = 'https://en.wikipedia.org/wiki/C_(programming_language)' + version_added = '' priority = 0.1 tokens = { @@ -347,6 +349,7 @@ class CppLexer(CFamilyLexer): '*.cc', '*.hh', '*.cxx', '*.hxx', '*.C', '*.H', '*.cp', '*.CPP', '*.tpp'] mimetypes = ['text/x-c++hdr', 'text/x-c++src'] + version_added = '' priority = 0.1 tokens = { diff --git a/libs/pygments/lexers/c_like.py b/libs/pygments/lexers/c_like.py index a7379c9bb..f5073c74a 100644 --- a/libs/pygments/lexers/c_like.py +++ b/libs/pygments/lexers/c_like.py @@ -4,7 +4,7 @@ Lexers for other C-like languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,19 +20,18 @@ __all__ = ['PikeLexer', 'NesCLexer', 'ClayLexer', 'ECLexer', 'ValaLexer', 'CudaLexer', 'SwigLexer', 'MqlLexer', 'ArduinoLexer', 'CharmciLexer', - 'OmgIdlLexer'] + 'OmgIdlLexer', 'PromelaLexer'] class PikeLexer(CppLexer): """ For `Pike <http://pike.lysator.liu.se/>`_ source code. - - .. versionadded:: 2.0 """ name = 'Pike' aliases = ['pike'] filenames = ['*.pike', '*.pmod'] mimetypes = ['text/x-pike'] + version_added = '2.0' tokens = { 'statements': [ @@ -68,13 +67,12 @@ class NesCLexer(CLexer): """ For `nesC <https://github.com/tinyos/nesc>`_ source code with preprocessor directives. - - .. versionadded:: 2.0 """ name = 'nesC' aliases = ['nesc'] filenames = ['*.nc'] mimetypes = ['text/x-nescsrc'] + version_added = '2.0' tokens = { 'statements': [ @@ -95,14 +93,15 @@ class NesCLexer(CLexer): class ClayLexer(RegexLexer): """ - For `Clay <http://claylabs.com/clay/>`_ source. - - .. versionadded:: 2.0 + For Clay source. """ name = 'Clay' filenames = ['*.clay'] aliases = ['clay'] mimetypes = ['text/x-clay'] + url = 'http://claylabs.com/clay' + version_added = '2.0' + tokens = { 'root': [ (r'\s+', Whitespace), @@ -147,13 +146,13 @@ class ClayLexer(RegexLexer): class ECLexer(CLexer): """ For eC source code with preprocessor directives. - - .. versionadded:: 1.5 """ name = 'eC' aliases = ['ec'] filenames = ['*.ec', '*.eh'] mimetypes = ['text/x-echdr', 'text/x-ecsrc'] + url = 'https://ec-lang.org' + version_added = '1.5' tokens = { 'statements': [ @@ -180,13 +179,13 @@ class ECLexer(CLexer): class ValaLexer(RegexLexer): """ For Vala source code with preprocessor directives. - - .. versionadded:: 1.1 """ name = 'Vala' aliases = ['vala', 'vapi'] filenames = ['*.vala', '*.vapi'] mimetypes = ['text/x-vala'] + url = 'https://vala.dev' + version_added = '1.1' tokens = { 'whitespace': [ @@ -277,15 +276,14 @@ class ValaLexer(RegexLexer): class CudaLexer(CLexer): """ - For NVIDIA `CUDA™ <http://developer.nvidia.com/category/zone/cuda-zone>`_ - source. - - .. versionadded:: 1.6 + For NVIDIA CUDA™ source. """ name = 'CUDA' filenames = ['*.cu', '*.cuh'] aliases = ['cuda', 'cu'] mimetypes = ['text/x-cuda'] + url = 'https://developer.nvidia.com/category/zone/cuda-zone' + version_added = '1.6' function_qualifiers = {'__device__', '__global__', '__host__', '__noinline__', '__forceinline__'} @@ -326,13 +324,12 @@ def get_tokens_unprocessed(self, text, stack=('root',)): class SwigLexer(CppLexer): """ For `SWIG <http://www.swig.org/>`_ source code. - - .. versionadded:: 2.0 """ name = 'SWIG' aliases = ['swig'] filenames = ['*.swg', '*.i'] mimetypes = ['text/swig'] + version_added = '2.0' priority = 0.04 # Lower than C/C++ and Objective C/C++ tokens = { @@ -393,13 +390,12 @@ class MqlLexer(CppLexer): """ For `MQL4 <http://docs.mql4.com/>`_ and `MQL5 <http://www.mql5.com/en/docs>`_ source code. - - .. versionadded:: 2.0 """ name = 'MQL' aliases = ['mql', 'mq4', 'mq5', 'mql4', 'mql5'] filenames = ['*.mq4', '*.mq5', '*.mqh'] mimetypes = ['text/x-mql'] + version_added = '2.0' tokens = { 'statements': [ @@ -420,14 +416,13 @@ class ArduinoLexer(CppLexer): This is an extension of the CppLexer, as the Arduino® Language is a superset of C++ - - .. versionadded:: 2.1 """ name = 'Arduino' aliases = ['arduino'] filenames = ['*.ino'] mimetypes = ['text/x-arduino'] + version_added = '2.1' # Language sketch main structure functions structure = {'setup', 'loop'} @@ -545,13 +540,12 @@ def get_tokens_unprocessed(self, text, stack=('root',)): class CharmciLexer(CppLexer): """ For `Charm++ <https://charm.cs.illinois.edu>`_ interface files (.ci). - - .. versionadded:: 2.4 """ name = 'Charmci' aliases = ['charmci'] filenames = ['*.ci'] + version_added = '2.4' mimetypes = [] @@ -575,8 +569,6 @@ class CharmciLexer(CppLexer): class OmgIdlLexer(CLexer): """ Lexer for Object Management Group Interface Definition Language. - - .. versionadded:: 2.9 """ name = 'OMG Interface Definition Language' @@ -584,6 +576,7 @@ class OmgIdlLexer(CLexer): aliases = ['omg-idl'] filenames = ['*.idl', '*.pidl'] mimetypes = [] + version_added = '2.9' scoped_name = r'((::)?\w+)+' @@ -664,3 +657,82 @@ class OmgIdlLexer(CLexer): include('annotation_appl'), ], } + + +class PromelaLexer(CLexer): + """ + For the Promela language used with SPIN. + """ + + name = 'Promela' + aliases = ['promela'] + filenames = ['*.pml', '*.prom', '*.prm', '*.promela', '*.pr', '*.pm'] + mimetypes = ['text/x-promela'] + url = 'https://spinroot.com/spin/whatispin.html' + version_added = '2.18' + + # Promela's language reference: + # https://spinroot.com/spin/Man/promela.html + # Promela's grammar definition: + # https://spinroot.com/spin/Man/grammar.html + + tokens = { + 'statements': [ + (r'(\[\]|<>|/\\|\\/)|(U|W|V)\b', Operator), # LTL Operators + (r'@', Punctuation), #remoterefs + (r'(\.)([a-zA-Z_]\w*)', bygroups(Operator, Name.Attribute)), + inherit + ], + 'types': [ + # Predefined (data types) + (words(( + 'bit', 'bool', 'byte', 'pid', 'short', 'int', 'unsigned'), + suffix=r'\b'), + Keyword.Type), + ], + 'keywords': [ + # ControlFlow + (words(( + 'atomic', 'break', 'd_step', 'do', 'od', 'for', 'in', 'goto', + 'if', 'fi', 'unless'), suffix=r'\b'), + Keyword), + # BasicStatements + (words(( + 'assert', 'get_priority', 'printf', 'printm', 'set_priority'), + suffix=r'\b'), + Name.Function), + # Embedded C Code + (words(( + 'c_code', 'c_decl', 'c_expr', 'c_state', 'c_track'), + suffix=r'\b'), + Keyword), + # Predefined (local/global variables) + (words(( + '_', '_last', '_nr_pr', '_pid', '_priority', 'else', 'np_', + 'STDIN'), suffix=r'\b'), + Name.Builtin), + # Predefined (functions) + (words(( + 'empty', 'enabled', 'eval', 'full', 'len', 'nempty', 'nfull', + 'pc_value'), suffix=r'\b'), + Name.Function), + # Predefined (operators) + (r'run\b', Operator.Word), + # Declarators + (words(( + 'active', 'chan', 'D_proctype', 'hidden', 'init', 'local', + 'mtype', 'never', 'notrace', 'proctype', 'show', 'trace', + 'typedef', 'xr', 'xs'), suffix=r'\b'), + Keyword.Declaration), + # Declarators (suffixes) + (words(( + 'priority', 'provided'), suffix=r'\b'), + Keyword), + # MetaTerms (declarators) + (words(( + 'inline', 'ltl', 'select'), suffix=r'\b'), + Keyword.Declaration), + # MetaTerms (keywords) + (r'skip\b', Keyword), + ], + } diff --git a/libs/pygments/lexers/capnproto.py b/libs/pygments/lexers/capnproto.py index 04237f70d..48e3c51b4 100644 --- a/libs/pygments/lexers/capnproto.py +++ b/libs/pygments/lexers/capnproto.py @@ -4,7 +4,7 @@ Lexers for the Cap'n Proto schema language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,13 +17,12 @@ class CapnProtoLexer(RegexLexer): """ For Cap'n Proto source. - - .. versionadded:: 2.2 """ name = 'Cap\'n Proto' url = 'https://capnproto.org' filenames = ['*.capnp'] aliases = ['capnp'] + version_added = '2.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/carbon.py b/libs/pygments/lexers/carbon.py index 758e8af36..c4e71d9c7 100644 --- a/libs/pygments/lexers/carbon.py +++ b/libs/pygments/lexers/carbon.py @@ -4,12 +4,12 @@ Lexers for the Carbon programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re -from pygments.lexer import RegexLexer, bygroups, words +from pygments.lexer import RegexLexer, words from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ Number, Punctuation, Whitespace @@ -19,14 +19,13 @@ class CarbonLexer(RegexLexer): """ For Carbon source. - - .. versionadded:: 2.15 """ name = 'Carbon' url = 'https://github.com/carbon-language/carbon-lang' filenames = ['*.carbon'] aliases = ['carbon'] mimetypes = ['text/x-carbon'] + version_added = '2.15' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/cddl.py b/libs/pygments/lexers/cddl.py index bd7f54aef..18e3b03e7 100644 --- a/libs/pygments/lexers/cddl.py +++ b/libs/pygments/lexers/cddl.py @@ -8,7 +8,7 @@ More information: https://datatracker.ietf.org/doc/rfc8610/ - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,14 +22,13 @@ class CddlLexer(RegexLexer): """ Lexer for CDDL definitions. - - .. versionadded:: 2.8 """ name = "CDDL" url = 'https://datatracker.ietf.org/doc/rfc8610/' aliases = ["cddl"] filenames = ["*.cddl"] mimetypes = ["text/x-cddl"] + version_added = '2.8' _prelude_types = [ "any", @@ -108,10 +107,10 @@ class CddlLexer(RegexLexer): "root": [ include("commentsandwhitespace"), # tag types - (r"#(\d\.{uint})?".format(uint=_re_uint), Keyword.Type), # type or any + (rf"#(\d\.{_re_uint})?", Keyword.Type), # type or any # occurrence ( - r"({uint})?(\*)({uint})?".format(uint=_re_uint), + rf"({_re_uint})?(\*)({_re_uint})?", bygroups(Number, Operator, Number), ), (r"\?|\+", Operator), # occurrence @@ -119,8 +118,8 @@ class CddlLexer(RegexLexer): (r"(\.\.\.|\.\.)", Operator), # rangeop (words(_controls, suffix=r"\b"), Operator.Word), # ctlops # into choice op - (r"&(?=\s*({groupname}|\())".format(groupname=_re_id), Operator), - (r"~(?=\s*{})".format(_re_id), Operator), # unwrap op + (rf"&(?=\s*({_re_id}|\())", Operator), + (rf"~(?=\s*{_re_id})", Operator), # unwrap op (r"//|/(?!/)", Operator), # double und single slash (r"=>|/==|/=|=", Operator), (r"[\[\]{}\(\),<>:]", Punctuation), @@ -131,7 +130,7 @@ class CddlLexer(RegexLexer): # Barewords as member keys (must be matched before values, types, typenames, # groupnames). # Token type is String as barewords are always interpreted as such. - (r"({bareword})(\s*)(:)".format(bareword=_re_id), + (rf"({_re_id})(\s*)(:)", bygroups(String, Whitespace, Punctuation)), # predefined types (words(_prelude_types, prefix=r"(?![\-_$@])\b", suffix=r"\b(?![\-_$@])"), @@ -144,7 +143,7 @@ class CddlLexer(RegexLexer): (r"0x[0-9a-fA-F]+(\.[0-9a-fA-F]+)?p[+-]?\d+", Number.Hex), # hexfloat (r"0x[0-9a-fA-F]+", Number.Hex), # hex # Float - (r"{int}(?=(\.\d|e[+-]?\d))(?:\.\d+)?(?:e[+-]?\d+)?".format(int=_re_int), + (rf"{_re_int}(?=(\.\d|e[+-]?\d))(?:\.\d+)?(?:e[+-]?\d+)?", Number.Float), # Int (_re_int, Number.Integer), diff --git a/libs/pygments/lexers/chapel.py b/libs/pygments/lexers/chapel.py index 9af5f0e38..8caea3506 100644 --- a/libs/pygments/lexers/chapel.py +++ b/libs/pygments/lexers/chapel.py @@ -4,7 +4,7 @@ Lexer for the Chapel language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,13 +18,12 @@ class ChapelLexer(RegexLexer): """ For Chapel source. - - .. versionadded:: 2.0 """ name = 'Chapel' url = 'https://chapel-lang.org/' filenames = ['*.chpl'] aliases = ['chapel', 'chpl'] + version_added = '2.0' # mimetypes = ['text/x-chapel'] known_types = ('bool', 'bytes', 'complex', 'imag', 'int', 'locale', diff --git a/libs/pygments/lexers/clean.py b/libs/pygments/lexers/clean.py index 73d93e0d2..119110be9 100644 --- a/libs/pygments/lexers/clean.py +++ b/libs/pygments/lexers/clean.py @@ -4,7 +4,7 @@ Lexer for the Clean language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,7 @@ class CleanLexer(ExtendedRegexLexer): url = 'http://clean.cs.ru.nl/Clean' aliases = ['clean'] filenames = ['*.icl', '*.dcl'] + version_added = '' keywords = ( 'case', 'ccall', 'class', 'code', 'code inline', 'derive', 'export', diff --git a/libs/pygments/lexers/comal.py b/libs/pygments/lexers/comal.py index 666595503..4344ba32e 100644 --- a/libs/pygments/lexers/comal.py +++ b/libs/pygments/lexers/comal.py @@ -4,7 +4,7 @@ Lexer for COMAL-80. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,7 @@ class Comal80Lexer(RegexLexer): url = 'https://en.wikipedia.org/wiki/COMAL' aliases = ['comal', 'comal80'] filenames = ['*.cml', '*.comal'] + version_added = '' flags = re.IGNORECASE # # COMAL allows for some strange characters in names which we list here so diff --git a/libs/pygments/lexers/compiled.py b/libs/pygments/lexers/compiled.py index fe27425b7..57e52df0c 100644 --- a/libs/pygments/lexers/compiled.py +++ b/libs/pygments/lexers/compiled.py @@ -4,10 +4,11 @@ Just export lexer classes previously contained in this module. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +# ruff: noqa: F401 from pygments.lexers.jvm import JavaLexer, ScalaLexer from pygments.lexers.c_cpp import CLexer, CppLexer from pygments.lexers.d import DLexer diff --git a/libs/pygments/lexers/configs.py b/libs/pygments/lexers/configs.py index 6c5e5425a..4b52873c6 100644 --- a/libs/pygments/lexers/configs.py +++ b/libs/pygments/lexers/configs.py @@ -4,7 +4,7 @@ Lexers for configuration file formats. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -36,6 +36,8 @@ class IniLexer(RegexLexer): '*.ini', '*.cfg', '*.inf', '.editorconfig', ] mimetypes = ['text/x-ini', 'text/inf'] + url = 'https://en.wikipedia.org/wiki/INI_file' + version_added = '' tokens = { 'root': [ @@ -71,14 +73,14 @@ def analyse_text(text): class DesktopLexer(RegexLexer): """ Lexer for .desktop files. - - .. versionadded:: 2.16 """ name = 'Desktop file' url = "https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html" aliases = ['desktop'] filenames = ['*.desktop'] + mimetypes = ['application/x-desktop'] + version_added = '2.16' tokens = { 'root': [ @@ -101,8 +103,6 @@ def analyse_text(text): class SystemdLexer(RegexLexer): """ Lexer for systemd unit files. - - .. versionadded:: 2.16 """ name = 'Systemd' @@ -112,6 +112,7 @@ class SystemdLexer(RegexLexer): '*.service', '*.socket', '*.device', '*.mount', '*.automount', '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope', ] + version_added = '2.16' tokens = { 'root': [ @@ -146,8 +147,6 @@ def analyse_text(text): class RegeditLexer(RegexLexer): """ Lexer for Windows Registry files produced by regedit. - - .. versionadded:: 1.6 """ name = 'reg' @@ -155,6 +154,7 @@ class RegeditLexer(RegexLexer): aliases = ['registry'] filenames = ['*.reg'] mimetypes = ['text/x-windows-registry'] + version_added = '1.6' tokens = { 'root': [ @@ -191,14 +191,14 @@ class PropertiesLexer(RegexLexer): Lexer for configuration files in Java's properties format. Note: trailing whitespace counts as part of the value as per spec - - .. versionadded:: 1.4 """ name = 'Properties' aliases = ['properties', 'jproperties'] filenames = ['*.properties'] mimetypes = ['text/x-java-properties'] + url = 'https://en.wikipedia.org/wiki/.properties' + version_added = '1.4' tokens = { 'root': [ @@ -258,29 +258,30 @@ def _rx_indent(level): if level == 1: level_repeat = '' else: - level_repeat = '{%s}' % level - return r'(?:\t| %s\t| {%s})%s.*\n' % (space_repeat, tab_width, level_repeat) + level_repeat = f'{{{level}}}' + return rf'(?:\t| {space_repeat}\t| {{{tab_width}}}){level_repeat}.*\n' class KconfigLexer(RegexLexer): """ For Linux-style Kconfig files. - - .. versionadded:: 1.6 """ name = 'Kconfig' aliases = ['kconfig', 'menuconfig', 'linux-config', 'kernel-config'] + version_added = '1.6' # Adjust this if new kconfig file names appear in your environment filenames = ['Kconfig*', '*Config.in*', 'external.in*', 'standard-modules.in'] mimetypes = ['text/x-kconfig'] + url = 'https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html' + # No re.MULTILINE, indentation-aware help text needs line-by-line handling flags = 0 def call_indent(level): # If indentation >= {level} is detected, enter state 'indent{level}' - return (_rx_indent(level), String.Doc, 'indent%s' % level) + return (_rx_indent(level), String.Doc, f'indent{level}') def do_indent(level): # Print paragraphs of indentation level >= {level} as String.Doc, @@ -342,8 +343,6 @@ def do_indent(level): class Cfengine3Lexer(RegexLexer): """ Lexer for CFEngine3 policy files. - - .. versionadded:: 1.5 """ name = 'CFEngine3' @@ -351,6 +350,7 @@ class Cfengine3Lexer(RegexLexer): aliases = ['cfengine3', 'cf3'] filenames = ['*.cf'] mimetypes = [] + version_added = '1.5' tokens = { 'root': [ @@ -405,14 +405,14 @@ class ApacheConfLexer(RegexLexer): """ Lexer for configuration files following the Apache config file format. - - .. versionadded:: 0.6 """ name = 'ApacheConf' aliases = ['apacheconf', 'aconf', 'apache'] filenames = ['.htaccess', 'apache.conf', 'apache2.conf'] mimetypes = ['text/x-apacheconf'] + url = 'https://httpd.apache.org/docs/current/configuring.html' + version_added = '0.6' flags = re.MULTILINE | re.IGNORECASE tokens = { @@ -447,8 +447,6 @@ class ApacheConfLexer(RegexLexer): class SquidConfLexer(RegexLexer): """ Lexer for squid configuration files. - - .. versionadded:: 0.9 """ name = 'SquidConf' @@ -456,6 +454,7 @@ class SquidConfLexer(RegexLexer): aliases = ['squidconf', 'squid.conf', 'squid'] filenames = ['squid.conf'] mimetypes = ['text/x-squidconf'] + version_added = '0.9' flags = re.IGNORECASE keywords = ( @@ -577,14 +576,13 @@ class SquidConfLexer(RegexLexer): class NginxConfLexer(RegexLexer): """ Lexer for Nginx configuration files. - - .. versionadded:: 0.11 """ name = 'Nginx configuration file' url = 'http://nginx.net/' aliases = ['nginx'] filenames = ['nginx.conf'] mimetypes = ['text/x-nginx-conf'] + version_added = '0.11' tokens = { 'root': [ @@ -624,14 +622,13 @@ class NginxConfLexer(RegexLexer): class LighttpdConfLexer(RegexLexer): """ Lexer for Lighttpd configuration files. - - .. versionadded:: 0.11 """ name = 'Lighttpd configuration file' url = 'http://lighttpd.net/' aliases = ['lighttpd', 'lighty'] filenames = ['lighttpd.conf'] mimetypes = ['text/x-lighttpd-conf'] + version_added = '0.11' tokens = { 'root': [ @@ -653,14 +650,13 @@ class LighttpdConfLexer(RegexLexer): class DockerLexer(RegexLexer): """ Lexer for Docker configuration files. - - .. versionadded:: 2.0 """ name = 'Docker' url = 'http://docker.io' aliases = ['docker', 'dockerfile'] filenames = ['Dockerfile', '*.docker'] mimetypes = ['text/x-dockerfile-config'] + version_added = '2.0' _keywords = (r'(?:MAINTAINER|EXPOSE|WORKDIR|USER|STOPSIGNAL)') _bash_keywords = (r'(?:RUN|CMD|ENTRYPOINT|ENV|ARG|LABEL|ADD|COPY)') @@ -672,15 +668,15 @@ class DockerLexer(RegexLexer): (r'#.*', Comment), (r'(FROM)([ \t]*)(\S*)([ \t]*)(?:(AS)([ \t]*)(\S*))?', bygroups(Keyword, Whitespace, String, Whitespace, Keyword, Whitespace, String)), - (r'(ONBUILD)(\s+)(%s)' % (_lb,), bygroups(Keyword, Whitespace, using(BashLexer))), - (r'(HEALTHCHECK)(\s+)((%s--\w+=\w+%s)*)' % (_lb, _lb), + (rf'(ONBUILD)(\s+)({_lb})', bygroups(Keyword, Whitespace, using(BashLexer))), + (rf'(HEALTHCHECK)(\s+)(({_lb}--\w+=\w+{_lb})*)', bygroups(Keyword, Whitespace, using(BashLexer))), - (r'(VOLUME|ENTRYPOINT|CMD|SHELL)(\s+)(%s)(\[.*?\])' % (_lb,), + (rf'(VOLUME|ENTRYPOINT|CMD|SHELL)(\s+)({_lb})(\[.*?\])', bygroups(Keyword, Whitespace, using(BashLexer), using(JsonLexer))), - (r'(LABEL|ENV|ARG)(\s+)((%s\w+=\w+%s)*)' % (_lb, _lb), + (rf'(LABEL|ENV|ARG)(\s+)(({_lb}\w+=\w+{_lb})*)', bygroups(Keyword, Whitespace, using(BashLexer))), - (r'(%s|VOLUME)\b(\s+)(.*)' % (_keywords), bygroups(Keyword, Whitespace, String)), - (r'(%s)(\s+)' % (_bash_keywords,), bygroups(Keyword, Whitespace)), + (rf'({_keywords}|VOLUME)\b(\s+)(.*)', bygroups(Keyword, Whitespace, String)), + (rf'({_bash_keywords})(\s+)', bygroups(Keyword, Whitespace)), (r'(.*\\\n)*.+', using(BashLexer)), ] } @@ -689,8 +685,6 @@ class DockerLexer(RegexLexer): class TerraformLexer(ExtendedRegexLexer): """ Lexer for terraformi ``.tf`` files. - - .. versionadded:: 2.1 """ name = 'Terraform' @@ -698,6 +692,7 @@ class TerraformLexer(ExtendedRegexLexer): aliases = ['terraform', 'tf', 'hcl'] filenames = ['*.tf', '*.hcl'] mimetypes = ['application/x-tf', 'application/x-terraform'] + version_added = '2.1' classes = ('backend', 'data', 'module', 'output', 'provider', 'provisioner', 'resource', 'variable') @@ -861,13 +856,13 @@ class TermcapLexer(RegexLexer): Lexer for termcap database source. This is very simple and minimal. - - .. versionadded:: 2.1 """ name = 'Termcap' aliases = ['termcap'] filenames = ['termcap', 'termcap.src'] mimetypes = [] + url = 'https://en.wikipedia.org/wiki/Termcap' + version_added = '2.1' # NOTE: # * multiline with trailing backslash @@ -908,13 +903,13 @@ class TerminfoLexer(RegexLexer): Lexer for terminfo database source. This is very simple and minimal. - - .. versionadded:: 2.1 """ name = 'Terminfo' aliases = ['terminfo'] filenames = ['terminfo', 'terminfo.src'] mimetypes = [] + url = 'https://en.wikipedia.org/wiki/Terminfo' + version_added = '2.1' # NOTE: # * multiline with leading whitespace @@ -954,8 +949,6 @@ class PkgConfigLexer(RegexLexer): """ Lexer for pkg-config (see also `manual page <http://linux.die.net/man/1/pkg-config>`_). - - .. versionadded:: 2.1 """ name = 'PkgConfig' @@ -963,6 +956,7 @@ class PkgConfigLexer(RegexLexer): aliases = ['pkgconfig'] filenames = ['*.pc'] mimetypes = [] + version_added = '2.1' tokens = { 'root': [ @@ -1023,8 +1017,6 @@ class PacmanConfLexer(RegexLexer): VerbosePkgLists These are flags to switch on. - - .. versionadded:: 2.1 """ name = 'PacmanConf' @@ -1032,6 +1024,7 @@ class PacmanConfLexer(RegexLexer): aliases = ['pacmanconf'] filenames = ['pacman.conf'] mimetypes = [] + version_added = '2.1' tokens = { 'root': [ @@ -1069,13 +1062,12 @@ class PacmanConfLexer(RegexLexer): class AugeasLexer(RegexLexer): """ Lexer for Augeas. - - .. versionadded:: 2.4 """ name = 'Augeas' url = 'http://augeas.net' aliases = ['augeas'] filenames = ['*.aug'] + version_added = '2.4' tokens = { 'root': [ @@ -1114,8 +1106,6 @@ class AugeasLexer(RegexLexer): class TOMLLexer(RegexLexer): """ Lexer for TOML, a simple language for config files. - - .. versionadded:: 2.4 """ name = 'TOML' @@ -1123,6 +1113,7 @@ class TOMLLexer(RegexLexer): filenames = ['*.toml', 'Pipfile', 'poetry.lock'] mimetypes = ['application/toml'] url = 'https://toml.io' + version_added = '2.4' # Based on the TOML spec: https://toml.io/en/v1.0.0 @@ -1284,8 +1275,6 @@ class NestedTextLexer(RegexLexer): """ Lexer for *NextedText*, a human-friendly data format. - .. versionadded:: 2.9 - .. versionchanged:: 2.16 Added support for *NextedText* v3.0. """ @@ -1294,6 +1283,7 @@ class NestedTextLexer(RegexLexer): url = 'https://nestedtext.org' aliases = ['nestedtext', 'nt'] filenames = ['*.nt'] + version_added = '2.9' tokens = { 'root': [ @@ -1366,14 +1356,13 @@ class NestedTextLexer(RegexLexer): class SingularityLexer(RegexLexer): """ Lexer for Singularity definition files. - - .. versionadded:: 2.6 """ name = 'Singularity' url = 'https://www.sylabs.io/guides/3.0/user-guide/definition_files.html' aliases = ['singularity'] filenames = ['*.def', 'Singularity'] + version_added = '2.6' flags = re.IGNORECASE | re.MULTILINE | re.DOTALL _headers = r'^(\s*)(bootstrap|from|osversion|mirrorurl|include|registry|namespace|includecmd)(:)' @@ -1415,13 +1404,13 @@ class UnixConfigLexer(RegexLexer): * ``/etc/group`` * ``/etc/passwd`` * ``/etc/shadow`` - - .. versionadded:: 2.12 """ name = 'Unix/Linux config files' aliases = ['unixconfig', 'linuxconfig'] filenames = [] + url = 'https://en.wikipedia.org/wiki/Configuration_file#Unix_and_Unix-like_operating_systems' + version_added = '2.12' tokens = { 'root': [ diff --git a/libs/pygments/lexers/console.py b/libs/pygments/lexers/console.py index ac498d58b..b9f24745e 100644 --- a/libs/pygments/lexers/console.py +++ b/libs/pygments/lexers/console.py @@ -4,7 +4,7 @@ Lexers for misc console output. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,13 +19,13 @@ class VCTreeStatusLexer(RegexLexer): """ For colorizing output of version control status commands, like "hg status" or "svn status". - - .. versionadded:: 2.0 """ name = 'VCTreeStatus' aliases = ['vctreestatus'] filenames = [] mimetypes = [] + url = "" + version_added = '2.0' tokens = { 'root': [ @@ -45,13 +45,13 @@ class VCTreeStatusLexer(RegexLexer): class PyPyLogLexer(RegexLexer): """ Lexer for PyPy log files. - - .. versionadded:: 1.5 """ name = "PyPy Log" aliases = ["pypylog", "pypy"] filenames = ["*.pypylog"] mimetypes = ['application/x-pypylog'] + url = 'pypy.org' + version_added = '1.5' tokens = { "root": [ diff --git a/libs/pygments/lexers/cplint.py b/libs/pygments/lexers/cplint.py index 8a48c013f..39b0a96e3 100644 --- a/libs/pygments/lexers/cplint.py +++ b/libs/pygments/lexers/cplint.py @@ -4,7 +4,7 @@ Lexer for the cplint language - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +19,13 @@ class CplintLexer(PrologLexer): """ Lexer for cplint files, including CP-logic, Logic Programs with Annotated Disjunctions, Distributional Clauses syntax, ProbLog, DTProbLog. - - .. versionadded:: 2.12 """ name = 'cplint' url = 'https://cplint.eu' aliases = ['cplint'] filenames = ['*.ecl', '*.prolog', '*.pro', '*.pl', '*.P', '*.lpad', '*.cpl'] mimetypes = ['text/x-cplint'] + version_added = '2.12' tokens = { 'root': [ diff --git a/libs/pygments/lexers/crystal.py b/libs/pygments/lexers/crystal.py index e4df8b1dd..6656815ab 100644 --- a/libs/pygments/lexers/crystal.py +++ b/libs/pygments/lexers/crystal.py @@ -4,7 +4,7 @@ Lexer for Crystal. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -27,8 +27,6 @@ class CrystalLexer(ExtendedRegexLexer): """ For Crystal source code. - - .. versionadded:: 2.2 """ name = 'Crystal' @@ -36,6 +34,7 @@ class CrystalLexer(ExtendedRegexLexer): aliases = ['cr', 'crystal'] filenames = ['*.cr'] mimetypes = ['text/x-crystal'] + version_added = '2.2' flags = re.DOTALL | re.MULTILINE @@ -107,7 +106,7 @@ def gen_crystalstrings_rules(): ('backtick', String.Backtick, '`'): states['simple-'+name] = [ include('string-escaped' if name == 'sym' else 'string-intp-escaped'), - (r'[^\\%s#]+' % end, ttype), + (rf'[^\\{end}#]+', ttype), (r'[\\#]', ttype), (end, ttype, '#pop'), ] diff --git a/libs/pygments/lexers/csound.py b/libs/pygments/lexers/csound.py index 64f03cff3..415fac3ef 100644 --- a/libs/pygments/lexers/csound.py +++ b/libs/pygments/lexers/csound.py @@ -4,7 +4,7 @@ Lexers for Csound languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -136,13 +136,12 @@ class CsoundLexer(RegexLexer): class CsoundScoreLexer(CsoundLexer): """ For `Csound <https://csound.com>`_ scores. - - .. versionadded:: 2.1 """ name = 'Csound Score' aliases = ['csound-score', 'csound-sco'] filenames = ['*.sco'] + version_added = '2.1' tokens = { 'root': [ @@ -202,13 +201,12 @@ class CsoundScoreLexer(CsoundLexer): class CsoundOrchestraLexer(CsoundLexer): """ For `Csound <https://csound.com>`_ orchestras. - - .. versionadded:: 2.1 """ name = 'Csound Orchestra' aliases = ['csound', 'csound-orc'] filenames = ['*.orc', '*.udo'] + version_added = '2.1' user_defined_opcodes = set() @@ -411,14 +409,14 @@ def name_callback(lexer, match): class CsoundDocumentLexer(RegexLexer): """ - For `Csound <https://csound.com>`_ documents. - - .. versionadded:: 2.1 + For Csound documents. """ name = 'Csound Document' aliases = ['csound-document', 'csound-csd'] filenames = ['*.csd'] + url = 'https://csound.com' + version_added = '2.1' # These tokens are based on those in XmlLexer in pygments/lexers/html.py. Making # CsoundDocumentLexer a subclass of XmlLexer rather than RegexLexer may seem like a diff --git a/libs/pygments/lexers/css.py b/libs/pygments/lexers/css.py index d8a961f04..fb7936b82 100644 --- a/libs/pygments/lexers/css.py +++ b/libs/pygments/lexers/css.py @@ -4,7 +4,7 @@ Lexers for CSS and related stylesheet formats. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -178,6 +178,7 @@ class CssLexer(RegexLexer): aliases = ['css'] filenames = ['*.css'] mimetypes = ['text/css'] + version_added = '' tokens = { 'root': [ @@ -445,8 +446,6 @@ def callback(lexer, match, ctx): class SassLexer(ExtendedRegexLexer): """ For Sass stylesheets. - - .. versionadded:: 1.3 """ name = 'Sass' @@ -454,6 +453,7 @@ class SassLexer(ExtendedRegexLexer): aliases = ['sass'] filenames = ['*.sass'] mimetypes = ['text/x-sass'] + version_added = '1.3' flags = re.IGNORECASE | re.MULTILINE @@ -535,6 +535,7 @@ class ScssLexer(RegexLexer): aliases = ['scss'] filenames = ['*.scss'] mimetypes = ['text/x-scss'] + version_added = '' flags = re.IGNORECASE | re.DOTALL tokens = { @@ -579,8 +580,6 @@ class ScssLexer(RegexLexer): class LessCssLexer(CssLexer): """ For LESS styleshets. - - .. versionadded:: 2.1 """ name = 'LessCss' @@ -588,6 +587,7 @@ class LessCssLexer(CssLexer): aliases = ['less'] filenames = ['*.less'] mimetypes = ['text/x-less-css'] + version_added = '2.1' tokens = { 'root': [ diff --git a/libs/pygments/lexers/d.py b/libs/pygments/lexers/d.py index db9020d48..58c53b713 100644 --- a/libs/pygments/lexers/d.py +++ b/libs/pygments/lexers/d.py @@ -4,7 +4,7 @@ Lexers for D languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class DLexer(RegexLexer): """ For D source. - - .. versionadded:: 1.2 """ name = 'D' url = 'https://dlang.org/' filenames = ['*.d', '*.di'] aliases = ['d'] mimetypes = ['text/x-dsrc'] + version_added = '1.2' tokens = { 'root': [ @@ -194,6 +193,7 @@ class CrocLexer(RegexLexer): filenames = ['*.croc'] aliases = ['croc'] mimetypes = ['text/x-crocsrc'] + version_added = '' tokens = { 'root': [ @@ -256,3 +256,4 @@ class MiniDLexer(CrocLexer): filenames = [] # don't lex .md as MiniD, reserve for Markdown aliases = ['minid'] mimetypes = ['text/x-minidsrc'] + version_added = '' diff --git a/libs/pygments/lexers/dalvik.py b/libs/pygments/lexers/dalvik.py index eb97bd511..df854f1fa 100644 --- a/libs/pygments/lexers/dalvik.py +++ b/libs/pygments/lexers/dalvik.py @@ -4,7 +4,7 @@ Pygments lexers for Dalvik VM-related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,14 +21,13 @@ class SmaliLexer(RegexLexer): """ For Smali (Android/Dalvik) assembly code. - - .. versionadded:: 1.6 """ name = 'Smali' url = 'http://code.google.com/p/smali/' aliases = ['smali'] filenames = ['*.smali'] mimetypes = ['text/smali'] + version_added = '1.6' tokens = { 'root': [ diff --git a/libs/pygments/lexers/data.py b/libs/pygments/lexers/data.py index afb5f7e59..8f384bc35 100644 --- a/libs/pygments/lexers/data.py +++ b/libs/pygments/lexers/data.py @@ -4,7 +4,7 @@ Lexers for data file format. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -31,8 +31,6 @@ class YamlLexer(ExtendedRegexLexer): """ Lexer for YAML, a human-friendly data serialization language. - - .. versionadded:: 0.11 """ name = 'YAML' @@ -40,6 +38,7 @@ class YamlLexer(ExtendedRegexLexer): aliases = ['yaml'] filenames = ['*.yaml', '*.yml'] mimetypes = ['text/x-yaml'] + version_added = '0.11' def something(token_class): """Do not produce empty tokens.""" @@ -443,8 +442,6 @@ class JsonLexer(Lexer): This allows users to highlight JSON as it is used in the wild. No validation is performed on the input JSON document. - - .. versionadded:: 1.5 """ name = 'JSON' @@ -452,6 +449,7 @@ class JsonLexer(Lexer): aliases = ['json', 'json-object'] filenames = ['*.json', '*.jsonl', '*.ndjson', 'Pipfile.lock'] mimetypes = ['application/json', 'application/json-object', 'application/x-ndjson', 'application/jsonl', 'application/json-seq'] + version_added = '1.5' # No validation of integers, floats, or constants is done. # As long as the characters are members of the following @@ -704,8 +702,6 @@ class JsonBareObjectLexer(JsonLexer): """ For JSON data structures (with missing object curly braces). - .. versionadded:: 2.2 - .. deprecated:: 2.8.0 Behaves the same as `JsonLexer` now. @@ -715,13 +711,12 @@ class JsonBareObjectLexer(JsonLexer): aliases = [] filenames = [] mimetypes = [] + version_added = '2.2' class JsonLdLexer(JsonLexer): """ For JSON-LD linked data. - - .. versionadded:: 2.0 """ name = 'JSON-LD' @@ -729,9 +724,10 @@ class JsonLdLexer(JsonLexer): aliases = ['jsonld', 'json-ld'] filenames = ['*.jsonld'] mimetypes = ['application/ld+json'] + version_added = '2.0' json_ld_keywords = { - '"@%s"' % keyword + f'"@{keyword}"' for keyword in ( 'base', 'container', diff --git a/libs/pygments/lexers/dax.py b/libs/pygments/lexers/dax.py index 39618c3bb..aec4c4f66 100644 --- a/libs/pygments/lexers/dax.py +++ b/libs/pygments/lexers/dax.py @@ -4,7 +4,7 @@ Lexer for LilyPond. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +19,13 @@ class DaxLexer(RegexLexer): """ Lexer for Power BI DAX Referenced from: https://github.com/sql-bi/SyntaxHighlighterBrushDax - - .. versionadded:: 2.15 """ name = 'Dax' aliases = ['dax'] filenames = ['*.dax'] url = 'https://learn.microsoft.com/en-us/dax/dax-function-reference' mimetypes = [] + version_added = '2.15' tokens = { 'root': [ diff --git a/libs/pygments/lexers/devicetree.py b/libs/pygments/lexers/devicetree.py index 9221464f7..903eda93d 100644 --- a/libs/pygments/lexers/devicetree.py +++ b/libs/pygments/lexers/devicetree.py @@ -4,7 +4,7 @@ Lexers for Devicetree language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,8 +18,6 @@ class DevicetreeLexer(RegexLexer): """ Lexer for Devicetree files. - - .. versionadded:: 2.7 """ name = 'Devicetree' @@ -27,6 +25,7 @@ class DevicetreeLexer(RegexLexer): aliases = ['devicetree', 'dts'] filenames = ['*.dts', '*.dtsi'] mimetypes = ['text/x-c'] + version_added = '2.7' #: optional Whitespace or /*...*/ style comment _ws = r'\s*(?:/[*][^*/]*?[*]/\s*)*' diff --git a/libs/pygments/lexers/diff.py b/libs/pygments/lexers/diff.py index 0ab85bfbf..4b260da87 100644 --- a/libs/pygments/lexers/diff.py +++ b/libs/pygments/lexers/diff.py @@ -4,7 +4,7 @@ Lexers for diff/patch formats. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,8 @@ class DiffLexer(RegexLexer): aliases = ['diff', 'udiff'] filenames = ['*.diff', '*.patch'] mimetypes = ['text/x-diff', 'text/x-patch'] + url = 'https://en.wikipedia.org/wiki/Diff' + version_added = '' tokens = { 'root': [ @@ -57,13 +59,13 @@ class DarcsPatchLexer(RegexLexer): DarcsPatchLexer is a lexer for the various versions of the darcs patch format. Examples of this format are derived by commands such as ``darcs annotate --patch`` and ``darcs send``. - - .. versionadded:: 0.10 """ name = 'Darcs Patch' aliases = ['dpatch'] filenames = ['*.dpatch', '*.darcspatch'] + url = 'https://darcs.net' + version_added = '0.10' DPATCH_KEYWORDS = ('hunk', 'addfile', 'adddir', 'rmfile', 'rmdir', 'move', 'replace') @@ -83,7 +85,7 @@ class DarcsPatchLexer(RegexLexer): (r'New patches:', Generic.Heading), (r'Context:', Generic.Heading), (r'Patch bundle hash:', Generic.Heading), - (r'(\s*)(%s)(.*)(\n)' % '|'.join(DPATCH_KEYWORDS), + (r'(\s*)({})(.*)(\n)'.format('|'.join(DPATCH_KEYWORDS)), bygroups(Whitespace, Keyword, Text, Whitespace)), (r'\+', Generic.Inserted, "insert"), (r'-', Generic.Deleted, "delete"), @@ -119,8 +121,6 @@ class WDiffLexer(RegexLexer): * It only works with normal output (without options like ``-l``). * If the target files contain "[-", "-]", "{+", or "+}", especially they are unbalanced, the lexer will get confused. - - .. versionadded:: 2.2 """ name = 'WDiff' @@ -128,6 +128,7 @@ class WDiffLexer(RegexLexer): aliases = ['wdiff'] filenames = ['*.wdiff'] mimetypes = [] + version_added = '2.2' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/dns.py b/libs/pygments/lexers/dns.py index 18cab3192..d0f98d032 100644 --- a/libs/pygments/lexers/dns.py +++ b/libs/pygments/lexers/dns.py @@ -4,7 +4,7 @@ Pygments lexers for DNS - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -31,8 +31,6 @@ class DnsZoneLexer(RegexLexer): """ Lexer for DNS zone file - - .. versionadded:: 2.16 """ flags = re.MULTILINE @@ -42,6 +40,7 @@ class DnsZoneLexer(RegexLexer): filenames = [ "*.zone" ] url = "https://datatracker.ietf.org/doc/html/rfc1035" mimetypes = ['text/dns'] + version_added = '2.16' tokens = { 'root': [ @@ -73,16 +72,16 @@ class DnsZoneLexer(RegexLexer): 'values': [ (r'\n', Whitespace, "#pop"), (r'\(', Punctuation, 'nested'), - include('simple-values'), + include('simple-value'), ], # Parsing nested values (...): 'nested': [ (r'\)', Punctuation, "#pop"), - include('simple-values'), + include('multiple-simple-values'), ], # Parsing values: - 'simple-values': [ - (r'(;.*)(\n)', bygroups(Comment.Single, Whitespace)), + 'simple-value': [ + (r'(;.*)', bygroups(Comment.Single)), (r'[ \t]+', Whitespace), (r"@\b", Operator), ('"', String, 'string'), @@ -90,6 +89,10 @@ class DnsZoneLexer(RegexLexer): (r'([0-9]+[smhdw]?)([ \t]+)', bygroups(Number.Integer, Whitespace)), (r'\S+', Literal), ], + 'multiple-simple-values': [ + include('simple-value'), + (r'[\n]+', Whitespace), + ], 'include': [ (r'([ \t]+)([^ \t\n]+)([ \t]+)([-\._a-zA-Z]+)([ \t]+)(;.*)?$', bygroups(Whitespace, Comment.PreprocFile, Whitespace, Name, Whitespace, Comment.Single), '#pop'), diff --git a/libs/pygments/lexers/dotnet.py b/libs/pygments/lexers/dotnet.py index 5c488dd97..17097c75d 100644 --- a/libs/pygments/lexers/dotnet.py +++ b/libs/pygments/lexers/dotnet.py @@ -4,7 +4,7 @@ Lexers for .net languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re @@ -50,6 +50,7 @@ class CSharpLexer(RegexLexer): aliases = ['csharp', 'c#', 'cs'] filenames = ['*.cs'] mimetypes = ['text/x-csharp'] # inferred + version_added = '' flags = re.MULTILINE | re.DOTALL @@ -164,8 +165,6 @@ class NemerleLexer(RegexLexer): ``Lo`` category has more than 40,000 characters in it! The default value is ``basic``. - - .. versionadded:: 1.5 """ name = 'Nemerle' @@ -173,6 +172,7 @@ class NemerleLexer(RegexLexer): aliases = ['nemerle'] filenames = ['*.n'] mimetypes = ['text/x-nemerle'] # inferred + version_added = '1.5' flags = re.MULTILINE | re.DOTALL @@ -333,6 +333,7 @@ class BooLexer(RegexLexer): aliases = ['boo'] filenames = ['*.boo'] mimetypes = ['text/x-boo'] + version_added = '' tokens = { 'root': [ @@ -399,9 +400,10 @@ class VbNetLexer(RegexLexer): name = 'VB.net' url = 'https://docs.microsoft.com/en-us/dotnet/visual-basic/' - aliases = ['vb.net', 'vbnet', 'lobas', 'oobas', 'sobas'] + aliases = ['vb.net', 'vbnet', 'lobas', 'oobas', 'sobas', 'visual-basic', 'visualbasic'] filenames = ['*.vb', '*.bas'] mimetypes = ['text/x-vbnet', 'text/x-vba'] # (?) + version_added = '' uni_name = '[_' + uni.combine('Ll', 'Lt', 'Lm', 'Nl') + ']' + \ '[' + uni.combine('Ll', 'Lt', 'Lm', 'Nl', 'Nd', 'Pc', @@ -510,6 +512,7 @@ class GenericAspxLexer(RegexLexer): name = 'aspx-gen' filenames = [] mimetypes = [] + url = 'https://dotnet.microsoft.com/en-us/apps/aspnet' flags = re.DOTALL @@ -535,6 +538,8 @@ class CSharpAspxLexer(DelegatingLexer): aliases = ['aspx-cs'] filenames = ['*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'] mimetypes = [] + url = 'https://dotnet.microsoft.com/en-us/apps/aspnet' + version_added = '' def __init__(self, **options): super().__init__(CSharpLexer, GenericAspxLexer, **options) @@ -555,6 +560,8 @@ class VbNetAspxLexer(DelegatingLexer): aliases = ['aspx-vb'] filenames = ['*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'] mimetypes = [] + url = 'https://dotnet.microsoft.com/en-us/apps/aspnet' + version_added = '' def __init__(self, **options): super().__init__(VbNetLexer, GenericAspxLexer, **options) @@ -570,8 +577,6 @@ def analyse_text(text): class FSharpLexer(RegexLexer): """ For the F# language (version 3.0). - - .. versionadded:: 1.5 """ name = 'F#' @@ -579,6 +584,7 @@ class FSharpLexer(RegexLexer): aliases = ['fsharp', 'f#'] filenames = ['*.fs', '*.fsi', '*.fsx'] mimetypes = ['text/x-fsharp'] + version_added = '1.5' keywords = [ 'abstract', 'as', 'assert', 'base', 'begin', 'class', 'default', @@ -649,12 +655,12 @@ class FSharpLexer(RegexLexer): bygroups(Keyword, Whitespace, Name.Class)), (r'\b(member|override)(\s+)(\w+)(\.)(\w+)', bygroups(Keyword, Whitespace, Name, Punctuation, Name.Function)), - (r'\b(%s)\b' % '|'.join(keywords), Keyword), + (r'\b({})\b'.format('|'.join(keywords)), Keyword), (r'``([^`\n\r\t]|`[^`\n\r\t])+``', Name), - (r'(%s)' % '|'.join(keyopts), Operator), - (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator), - (r'\b(%s)\b' % '|'.join(word_operators), Operator.Word), - (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type), + (r'({})'.format('|'.join(keyopts)), Operator), + (rf'({infix_syms}|{prefix_syms})?{operators}', Operator), + (r'\b({})\b'.format('|'.join(word_operators)), Operator.Word), + (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type), (r'(#)([ \t]*)(if|endif|else|line|nowarn|light|\d+)\b(.*?)(\n)', bygroups(Comment.Preproc, Whitespace, Comment.Preproc, Comment.Preproc, Whitespace)), @@ -733,21 +739,20 @@ class XppLexer(RegexLexer): """ For X++ source code. This is based loosely on the CSharpLexer - - .. versionadded:: 2.15 """ name = 'X++' url = 'https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-ref/xpp-language-reference' aliases = ['xpp', 'x++'] filenames = ['*.xpp'] + version_added = '2.15' flags = re.MULTILINE XPP_CHARS = ('@?(?:_|[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl') + '])' + '[^' + uni.allexcept('Lu', 'Ll', 'Lt', 'Lm', 'Lo', 'Nl', - 'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*'); + 'Nd', 'Pc', 'Cf', 'Mn', 'Mc') + ']*') # Temporary, see # https://github.com/thatch/regexlint/pull/49 XPP_CHARS = XPP_CHARS.replace('\x00', '\x01') diff --git a/libs/pygments/lexers/dsls.py b/libs/pygments/lexers/dsls.py index 37a5ff6c3..35dfda9a3 100644 --- a/libs/pygments/lexers/dsls.py +++ b/libs/pygments/lexers/dsls.py @@ -4,7 +4,7 @@ Lexers for various domain-specific languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,14 +23,13 @@ class ProtoBufLexer(RegexLexer): """ Lexer for Protocol Buffer definition files. - - .. versionadded:: 1.4 """ name = 'Protocol Buffer' url = 'https://developers.google.com/protocol-buffers/' aliases = ['protobuf', 'proto'] filenames = ['*.proto'] + version_added = '1.4' tokens = { 'root': [ @@ -85,14 +84,13 @@ class ProtoBufLexer(RegexLexer): class ThriftLexer(RegexLexer): """ For Thrift interface definitions. - - .. versionadded:: 2.1 """ name = 'Thrift' url = 'https://thrift.apache.org/' aliases = ['thrift'] filenames = ['*.thrift'] mimetypes = ['application/x-thrift'] + version_added = '2.1' tokens = { 'root': [ @@ -191,13 +189,12 @@ class ThriftLexer(RegexLexer): class ZeekLexer(RegexLexer): """ For Zeek scripts. - - .. versionadded:: 2.5 """ name = 'Zeek' url = 'https://www.zeek.org/' aliases = ['zeek', 'bro'] filenames = ['*.zeek', '*.bro'] + version_added = '2.5' _hex = r'[0-9a-fA-F]' _float = r'((\d*\.?\d+)|(\d+\.?\d*))([eE][-+]?\d+)?' @@ -353,13 +350,12 @@ class ZeekLexer(RegexLexer): class PuppetLexer(RegexLexer): """ For Puppet configuration DSL. - - .. versionadded:: 1.6 """ name = 'Puppet' url = 'https://puppet.com/' aliases = ['puppet'] filenames = ['*.pp'] + version_added = '1.6' tokens = { 'root': [ @@ -443,14 +439,13 @@ class RslLexer(RegexLexer): RSL is the formal specification language used in RAISE (Rigorous Approach to Industrial Software Engineering) method. - - .. versionadded:: 2.0 """ name = 'RSL' url = 'http://en.wikipedia.org/wiki/RAISE' aliases = ['rsl'] filenames = ['*.rsl'] mimetypes = ['text/rsl'] + version_added = '2.0' flags = re.MULTILINE | re.DOTALL @@ -505,13 +500,12 @@ def analyse_text(text): class MscgenLexer(RegexLexer): """ For Mscgen files. - - .. versionadded:: 1.6 """ name = 'Mscgen' url = 'http://www.mcternan.me.uk/mscgen/' aliases = ['mscgen', 'msc'] filenames = ['*.msc'] + version_added = '1.6' _var = r'(\w+|"(?:\\"|[^"])*")' @@ -555,13 +549,12 @@ class MscgenLexer(RegexLexer): class VGLLexer(RegexLexer): """ For SampleManager VGL source code. - - .. versionadded:: 1.6 """ name = 'VGL' url = 'http://www.thermoscientific.com/samplemanager' aliases = ['vgl'] filenames = ['*.rpf'] + version_added = '1.6' flags = re.MULTILINE | re.DOTALL | re.IGNORECASE @@ -589,8 +582,6 @@ class VGLLexer(RegexLexer): class AlloyLexer(RegexLexer): """ For Alloy source code. - - .. versionadded:: 2.0 """ name = 'Alloy' @@ -598,6 +589,7 @@ class AlloyLexer(RegexLexer): aliases = ['alloy'] filenames = ['*.als'] mimetypes = ['text/x-alloy'] + version_added = '2.0' flags = re.MULTILINE | re.DOTALL @@ -660,14 +652,13 @@ class PanLexer(RegexLexer): Lexer for pan source files. Based on tcsh lexer. - - .. versionadded:: 2.0 """ name = 'Pan' url = 'https://github.com/quattor/pan/' aliases = ['pan'] filenames = ['*.pan'] + version_added = '2.0' tokens = { 'root': [ @@ -727,14 +718,13 @@ class PanLexer(RegexLexer): class CrmshLexer(RegexLexer): """ Lexer for crmsh configuration files for Pacemaker clusters. - - .. versionadded:: 2.1 """ name = 'Crmsh' url = 'http://crmsh.github.io/' aliases = ['crmsh', 'pcmk'] filenames = ['*.crmsh', '*.pcmk'] mimetypes = [] + version_added = '2.1' elem = words(( 'node', 'primitive', 'group', 'clone', 'ms', 'location', @@ -773,7 +763,7 @@ class CrmshLexer(RegexLexer): (sub, Keyword), (acl, Keyword), # binary operators - (r'(?:%s:)?(%s)(?![\w#$-])' % (val_qual, bin_ops), Operator.Word), + (rf'(?:{val_qual}:)?({bin_ops})(?![\w#$-])', Operator.Word), # other operators (bin_rel, Operator.Word), (un_ops, Operator.Word), @@ -781,11 +771,11 @@ class CrmshLexer(RegexLexer): # builtin attributes (e.g. #uname) (r'#[a-z]+(?![\w#$-])', Name.Builtin), # acl_mod:blah - (r'(%s)(:)("(?:""|[^"])*"|\S+)' % acl_mod, + (rf'({acl_mod})(:)("(?:""|[^"])*"|\S+)', bygroups(Keyword, Punctuation, Name)), # rsc_id[:(role|action)] # NB: this matches all other identifiers - (r'([\w#$-]+)(?:(:)(%s))?(?![\w#$-])' % rsc_role_action, + (rf'([\w#$-]+)(?:(:)({rsc_role_action}))?(?![\w#$-])', bygroups(Name, Punctuation, Operator.Word)), # punctuation (r'(\\(?=\n)|[\[\](){}/:@])', Punctuation), @@ -797,14 +787,13 @@ class CrmshLexer(RegexLexer): class FlatlineLexer(RegexLexer): """ Lexer for Flatline expressions. - - .. versionadded:: 2.2 """ name = 'Flatline' url = 'https://github.com/bigmlcom/flatline' aliases = ['flatline'] filenames = [] mimetypes = ['text/x-flatline'] + version_added = '2.2' special_forms = ('let',) @@ -874,14 +863,13 @@ class FlatlineLexer(RegexLexer): class SnowballLexer(ExtendedRegexLexer): """ Lexer for Snowball source code. - - .. versionadded:: 2.2 """ name = 'Snowball' url = 'https://snowballstem.org/' aliases = ['snowball'] filenames = ['*.sbl'] + version_added = '2.2' _ws = r'\n\r\t ' @@ -897,8 +885,8 @@ def _string(do_string_first): def callback(lexer, match, ctx): s = match.start() text = match.group() - string = re.compile(r'([^%s]*)(.)' % re.escape(lexer._start)).match - escape = re.compile(r'([^%s]*)(.)' % re.escape(lexer._end)).match + string = re.compile(rf'([^{re.escape(lexer._start)}]*)(.)').match + escape = re.compile(rf'([^{re.escape(lexer._end)}]*)(.)').match pos = 0 do_string = do_string_first while pos < len(text): @@ -934,7 +922,7 @@ def _stringescapes(lexer, match, ctx): include('root1'), ], 'root1': [ - (r'[%s]+' % _ws, Whitespace), + (rf'[{_ws}]+', Whitespace), (r'\d+', Number.Integer), (r"'", String.Single, 'string'), (r'[()]', Punctuation), @@ -957,9 +945,9 @@ def _stringescapes(lexer, match, ctx): (words(('size', 'limit', 'cursor', 'maxint', 'minint'), suffix=r'\b'), Name.Builtin), - (r'(stringdef\b)([%s]*)([^%s]+)' % (_ws, _ws), + (rf'(stringdef\b)([{_ws}]*)([^{_ws}]+)', bygroups(Keyword.Reserved, Whitespace, String.Escape)), - (r'(stringescapes\b)([%s]*)(.)([%s]*)(.)' % (_ws, _ws), + (rf'(stringescapes\b)([{_ws}]*)(.)([{_ws}]*)(.)', _stringescapes), (r'[A-Za-z]\w*', Name), ], diff --git a/libs/pygments/lexers/dylan.py b/libs/pygments/lexers/dylan.py index f5aa73ab7..8cd0d624d 100644 --- a/libs/pygments/lexers/dylan.py +++ b/libs/pygments/lexers/dylan.py @@ -4,7 +4,7 @@ Lexers for the Dylan language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,8 +21,6 @@ class DylanLexer(RegexLexer): """ For the Dylan language. - - .. versionadded:: 0.7 """ name = 'Dylan' @@ -30,6 +28,7 @@ class DylanLexer(RegexLexer): aliases = ['dylan'] filenames = ['*.dylan', '*.dyl', '*.intr'] mimetypes = ['text/x-dylan'] + version_added = '0.7' flags = re.IGNORECASE @@ -214,15 +213,14 @@ def get_tokens_unprocessed(self, text): class DylanLidLexer(RegexLexer): """ For Dylan LID (Library Interchange Definition) files. - - .. versionadded:: 1.6 """ name = 'DylanLID' aliases = ['dylan-lid', 'lid'] filenames = ['*.lid', '*.hdp'] mimetypes = ['text/x-dylan-lid'] - + url = 'http://www.opendylan.org/' + version_added = '1.6' flags = re.IGNORECASE tokens = { @@ -245,13 +243,13 @@ class DylanConsoleLexer(Lexer): For Dylan interactive console output. This is based on a copy of the RubyConsoleLexer. - - .. versionadded:: 1.6 """ name = 'Dylan session' aliases = ['dylan-console', 'dylan-repl'] filenames = ['*.dylan-console'] mimetypes = ['text/x-dylan-console'] + url = 'http://www.opendylan.org/' + version_added = '1.6' _example = 'dylan-console/console' _prompt_re = re.compile(r'\?| ') diff --git a/libs/pygments/lexers/ecl.py b/libs/pygments/lexers/ecl.py index 7e93e0cb5..e7b4aaa7d 100644 --- a/libs/pygments/lexers/ecl.py +++ b/libs/pygments/lexers/ecl.py @@ -4,7 +4,7 @@ Lexers for the ECL language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,8 +20,6 @@ class ECLLexer(RegexLexer): """ Lexer for the declarative big-data ECL language. - - .. versionadded:: 1.5 """ name = 'ECL' @@ -29,6 +27,7 @@ class ECLLexer(RegexLexer): aliases = ['ecl'] filenames = ['*.ecl'] mimetypes = ['application/x-ecl'] + version_added = '1.5' flags = re.IGNORECASE | re.MULTILINE diff --git a/libs/pygments/lexers/eiffel.py b/libs/pygments/lexers/eiffel.py index 8a5a55950..a3adb3e62 100644 --- a/libs/pygments/lexers/eiffel.py +++ b/libs/pygments/lexers/eiffel.py @@ -4,7 +4,7 @@ Lexer for the Eiffel language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class EiffelLexer(RegexLexer): """ For Eiffel source code. - - .. versionadded:: 2.0 """ name = 'Eiffel' url = 'https://www.eiffel.com' aliases = ['eiffel'] filenames = ['*.e'] mimetypes = ['text/x-eiffel'] + version_added = '2.0' tokens = { 'root': [ diff --git a/libs/pygments/lexers/elm.py b/libs/pygments/lexers/elm.py index 0e7ac3fab..0a8939ba2 100644 --- a/libs/pygments/lexers/elm.py +++ b/libs/pygments/lexers/elm.py @@ -4,7 +4,7 @@ Lexer for the Elm programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,8 +18,6 @@ class ElmLexer(RegexLexer): """ For Elm source code. - - .. versionadded:: 2.1 """ name = 'Elm' @@ -27,6 +25,7 @@ class ElmLexer(RegexLexer): aliases = ['elm'] filenames = ['*.elm'] mimetypes = ['text/x-elm'] + version_added = '2.1' validName = r'[a-z_][a-zA-Z0-9_\']*' diff --git a/libs/pygments/lexers/elpi.py b/libs/pygments/lexers/elpi.py index 6fc8b502d..5efaffa87 100644 --- a/libs/pygments/lexers/elpi.py +++ b/libs/pygments/lexers/elpi.py @@ -4,7 +4,7 @@ Lexer for the `Elpi <http://github.com/LPCIC/elpi>`_ programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,8 +18,6 @@ class ElpiLexer(RegexLexer): """ Lexer for the Elpi programming language. - - .. versionadded:: 2.11 """ name = 'Elpi' @@ -27,19 +25,20 @@ class ElpiLexer(RegexLexer): aliases = ['elpi'] filenames = ['*.elpi'] mimetypes = ['text/x-elpi'] + version_added = '2.11' lcase_re = r"[a-z]" ucase_re = r"[A-Z]" digit_re = r"[0-9]" schar2_re = r"([+*^?/<>`'@#~=&!])" - schar_re = r"({}|-|\$|_)".format(schar2_re) - idchar_re = r"({}|{}|{}|{})".format(lcase_re,ucase_re,digit_re,schar_re) - idcharstarns_re = r"({}*(\.({}|{}){}*)*)".format(idchar_re, lcase_re, ucase_re, idchar_re) - symbchar_re = r"({}|{}|{}|{}|:)".format(lcase_re, ucase_re, digit_re, schar_re) - constant_re = r"({}{}*|{}{}|{}{}*|_{}+)".format(ucase_re, idchar_re, lcase_re, idcharstarns_re, schar2_re, symbchar_re, idchar_re) + schar_re = rf"({schar2_re}|-|\$|_)" + idchar_re = rf"({lcase_re}|{ucase_re}|{digit_re}|{schar_re})" + idcharstarns_re = rf"({idchar_re}*(\.({lcase_re}|{ucase_re}){idchar_re}*)*)" + symbchar_re = rf"({lcase_re}|{ucase_re}|{digit_re}|{schar_re}|:)" + constant_re = rf"({ucase_re}{idchar_re}*|{lcase_re}{idcharstarns_re}|{schar2_re}{symbchar_re}*|_{idchar_re}+)" symbol_re = r"(,|<=>|->|:-|;|\?-|->|&|=>|\bas\b|\buvar\b|<|=<|=|==|>=|>|\bi<|\bi=<|\bi>=|\bi>|\bis\b|\br<|\br=<|\br>=|\br>|\bs<|\bs=<|\bs>=|\bs>|@|::|\[\]|`->|`:|`:=|\^|-|\+|\bi-|\bi\+|r-|r\+|/|\*|\bdiv\b|\bi\*|\bmod\b|\br\*|~|\bi~|\br~)" - escape_re = r"\(({}|{})\)".format(constant_re,symbol_re) - const_sym_re = r"({}|{}|{})".format(constant_re,symbol_re,escape_re) + escape_re = rf"\(({constant_re}|{symbol_re})\)" + const_sym_re = rf"({constant_re}|{symbol_re}|{escape_re})" tokens = { 'root': [ @@ -54,35 +53,35 @@ class ElpiLexer(RegexLexer): 'elpi-string'), (r"(:index)(\s*\()", bygroups(Keyword.Mode, Text.Whitespace), 'elpi-indexing-expr'), - (r"\b(external pred|pred)(\s+)({})".format(const_sym_re), + (rf"\b(external pred|pred)(\s+)({const_sym_re})", bygroups(Keyword.Declaration, Text.Whitespace, Name.Function), 'elpi-pred-item'), - (r"\b(external type|type)(\s+)(({}(,\s*)?)+)".format(const_sym_re), + (rf"\b(external type|type)(\s+)(({const_sym_re}(,\s*)?)+)", bygroups(Keyword.Declaration, Text.Whitespace, Name.Function), 'elpi-type'), - (r"\b(kind)(\s+)(({}|,)+)".format(const_sym_re), + (rf"\b(kind)(\s+)(({const_sym_re}|,)+)", bygroups(Keyword.Declaration, Text.Whitespace, Name.Function), 'elpi-type'), - (r"\b(typeabbrev)(\s+)({})".format(const_sym_re), + (rf"\b(typeabbrev)(\s+)({const_sym_re})", bygroups(Keyword.Declaration, Text.Whitespace, Name.Function), 'elpi-type'), (r"\b(accumulate)(\s+)(\")", bygroups(Keyword.Declaration, Text.Whitespace, String.Double), 'elpi-string'), - (r"\b(accumulate|namespace|local)(\s+)({})".format(constant_re), + (rf"\b(accumulate|namespace|local)(\s+)({constant_re})", bygroups(Keyword.Declaration, Text.Whitespace, Text)), - (r"\b(shorten)(\s+)({}\.)".format(constant_re), + (rf"\b(shorten)(\s+)({constant_re}\.)", bygroups(Keyword.Declaration, Text.Whitespace, Text)), (r"\b(pi|sigma)(\s+)([a-zA-Z][A-Za-z0-9_ ]*)(\\)", bygroups(Keyword.Declaration, Text.Whitespace, Name.Variable, Text)), - (r"\b(constraint)(\s+)(({}(\s+)?)+)".format(const_sym_re), + (rf"\b(constraint)(\s+)(({const_sym_re}(\s+)?)+)", bygroups(Keyword.Declaration, Text.Whitespace, Name.Function), 'elpi-chr-rule-start'), - (r"(?=[A-Z_]){}".format(constant_re), Name.Variable), - (r"(?=[a-z_]){}\\".format(constant_re), Name.Variable), + (rf"(?=[A-Z_]){constant_re}", Name.Variable), + (rf"(?=[a-z_]){constant_re}\\", Name.Variable), (r"_", Name.Variable), - (r"({}|!|=>|;)".format(symbol_re), Keyword.Declaration), + (rf"({symbol_re}|!|=>|;)", Keyword.Declaration), (constant_re, Text), (r"\[|\]|\||=>", Keyword.Declaration), (r'"', String.Double, 'elpi-string'), @@ -155,7 +154,7 @@ class ElpiLexer(RegexLexer): 'elpi-quote': [ (r'\{\{', Punctuation, '#push'), (r'\}\}', Punctuation, '#pop'), - (r"(lp:)((?=[A-Z_]){})".format(constant_re), bygroups(Keyword, Name.Variable)), + (rf"(lp:)((?=[A-Z_]){constant_re})", bygroups(Keyword, Name.Variable)), (r"[^l\}]+", Text), (r"l|\}", Text), ], diff --git a/libs/pygments/lexers/email.py b/libs/pygments/lexers/email.py index 36a8a95d9..c0726e8b8 100644 --- a/libs/pygments/lexers/email.py +++ b/libs/pygments/lexers/email.py @@ -4,7 +4,7 @@ Lexer for the raw E-mail. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -119,14 +119,14 @@ class EmailLexer(DelegatingLexer): `highlight-X-header` Highlight the fields of ``X-`` user-defined email header. (default: ``False``). - - .. versionadded:: 2.5 """ name = "E-mail" aliases = ["email", "eml"] filenames = ["*.eml"] mimetypes = ["message/rfc822"] + url = "https://en.wikipedia.org/wiki/Email#Message_format" + version_added = '2.5' def __init__(self, **options): super().__init__(EmailHeaderLexer, MIMELexer, Comment, **options) diff --git a/libs/pygments/lexers/erlang.py b/libs/pygments/lexers/erlang.py index e484664a1..119018232 100644 --- a/libs/pygments/lexers/erlang.py +++ b/libs/pygments/lexers/erlang.py @@ -4,7 +4,7 @@ Lexers for Erlang. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,8 +22,6 @@ class ErlangLexer(RegexLexer): """ For the Erlang functional programming language. - - .. versionadded:: 0.9 """ name = 'Erlang' @@ -31,6 +29,7 @@ class ErlangLexer(RegexLexer): aliases = ['erlang'] filenames = ['*.erl', '*.hrl', '*.es', '*.escript'] mimetypes = ['text/x-erlang'] + version_added = '0.9' keywords = ( 'after', 'begin', 'case', 'catch', 'cond', 'end', 'fun', 'if', @@ -150,13 +149,13 @@ class ErlangLexer(RegexLexer): class ErlangShellLexer(Lexer): """ Shell sessions in erl (for Erlang code). - - .. versionadded:: 1.1 """ name = 'Erlang erl session' aliases = ['erl'] filenames = ['*.erl-sh'] mimetypes = ['text/x-erl-shellsession'] + url = 'https://www.erlang.org/' + version_added = '1.1' _prompt_re = re.compile(r'(?:\([\w@_.]+\))?\d+>(?=\s|\Z)') @@ -191,10 +190,10 @@ def get_tokens_unprocessed(self, text): def gen_elixir_string_rules(name, symbol, token): states = {} states['string_' + name] = [ - (r'[^#%s\\]+' % (symbol,), token), + (rf'[^#{symbol}\\]+', token), include('escapes'), (r'\\.', token), - (r'(%s)' % (symbol,), bygroups(token), "#pop"), + (rf'({symbol})', bygroups(token), "#pop"), include('interpol') ] return states @@ -203,32 +202,31 @@ def gen_elixir_string_rules(name, symbol, token): def gen_elixir_sigstr_rules(term, term_class, token, interpol=True): if interpol: return [ - (r'[^#%s\\]+' % (term_class,), token), + (rf'[^#{term_class}\\]+', token), include('escapes'), (r'\\.', token), - (r'%s[a-zA-Z]*' % (term,), token, '#pop'), + (rf'{term}[a-zA-Z]*', token, '#pop'), include('interpol') ] else: return [ - (r'[^%s\\]+' % (term_class,), token), + (rf'[^{term_class}\\]+', token), (r'\\.', token), - (r'%s[a-zA-Z]*' % (term,), token, '#pop'), + (rf'{term}[a-zA-Z]*', token, '#pop'), ] class ElixirLexer(RegexLexer): """ For the Elixir language. - - .. versionadded:: 1.5 """ name = 'Elixir' - url = 'http://elixir-lang.org' + url = 'https://elixir-lang.org' aliases = ['elixir', 'ex', 'exs'] filenames = ['*.ex', '*.eex', '*.exs', '*.leex'] mimetypes = ['text/x-elixir'] + version_added = '1.5' KEYWORD = ('fn', 'do', 'end', 'after', 'else', 'rescue', 'catch') KEYWORD_OPERATOR = ('not', 'and', 'or', 'when', 'in') @@ -303,9 +301,9 @@ def gen_elixir_sigil_rules(): for term, name in triquotes: states['sigils'] += [ - (r'(~[a-z])(%s)' % (term,), bygroups(token, String.Heredoc), + (rf'(~[a-z])({term})', bygroups(token, String.Heredoc), (name + '-end', name + '-intp')), - (r'(~[A-Z])(%s)' % (term,), bygroups(token, String.Heredoc), + (rf'(~[A-Z])({term})', bygroups(token, String.Heredoc), (name + '-end', name + '-no-intp')), ] @@ -337,12 +335,12 @@ def gen_elixir_sigil_rules(): op3_re = "|".join(re.escape(s) for s in OPERATORS3) op2_re = "|".join(re.escape(s) for s in OPERATORS2) op1_re = "|".join(re.escape(s) for s in OPERATORS1) - ops_re = r'(?:%s|%s|%s)' % (op3_re, op2_re, op1_re) + ops_re = rf'(?:{op3_re}|{op2_re}|{op1_re})' punctuation_re = "|".join(re.escape(s) for s in PUNCTUATION) alnum = r'\w' - name_re = r'(?:\.\.\.|[a-z_]%s*[!?]?)' % alnum - modname_re = r'[A-Z]%(alnum)s*(?:\.[A-Z]%(alnum)s*)*' % {'alnum': alnum} - complex_name_re = r'(?:%s|%s|%s)' % (name_re, modname_re, ops_re) + name_re = rf'(?:\.\.\.|[a-z_]{alnum}*[!?]?)' + modname_re = rf'[A-Z]{alnum}*(?:\.[A-Z]{alnum}*)*' + complex_name_re = rf'(?:{name_re}|{modname_re}|{ops_re})' special_atom_re = r'(?:\.\.\.|<<>>|%\{\}|%|\{\})' long_hex_char_re = r'(\\x\{)([\da-fA-F]+)(\})' @@ -375,7 +373,7 @@ def gen_elixir_sigil_rules(): (r":'", String.Symbol, 'string_single_atom'), # [keywords: ...] - (r'(%s|%s)(:)(?=\s|\n)' % (special_atom_re, complex_name_re), + (rf'({special_atom_re}|{complex_name_re})(:)(?=\s|\n)', bygroups(String.Symbol, Punctuation)), # @attributes @@ -383,7 +381,7 @@ def gen_elixir_sigil_rules(): # identifiers (name_re, Name), - (r'(%%?)(%s)' % (modname_re,), bygroups(Punctuation, Name.Class)), + (rf'(%?)({modname_re})', bygroups(Punctuation, Name.Class)), # operators and punctuation (op3_re, Operator), @@ -484,13 +482,13 @@ class ElixirConsoleLexer(Lexer): [1,2,3] iex> length [head | tail] 3 - - .. versionadded:: 1.5 """ name = 'Elixir iex session' aliases = ['iex'] mimetypes = ['text/x-elixir-shellsession'] + url = 'https://elixir-lang.org' + version_added = '1.5' _prompt_re = re.compile(r'(iex|\.{3})((?:\([\w@_.]+\))?\d+|\(\d+\))?> ') diff --git a/libs/pygments/lexers/esoteric.py b/libs/pygments/lexers/esoteric.py index ccc280541..e9fab0e46 100644 --- a/libs/pygments/lexers/esoteric.py +++ b/libs/pygments/lexers/esoteric.py @@ -4,7 +4,7 @@ Lexers for esoteric languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,7 @@ class BrainfuckLexer(RegexLexer): aliases = ['brainfuck', 'bf'] filenames = ['*.bf', '*.b'] mimetypes = ['application/x-brainfuck'] + version_added = '' tokens = { 'common': [ @@ -76,14 +77,13 @@ def analyse_text(text): class BefungeLexer(RegexLexer): """ Lexer for the esoteric Befunge language. - - .. versionadded:: 0.7 """ name = 'Befunge' url = 'http://en.wikipedia.org/wiki/Befunge' aliases = ['befunge'] filenames = ['*.befunge'] mimetypes = ['application/x-befunge'] + version_added = '0.7' tokens = { 'root': [ @@ -106,18 +106,17 @@ class BefungeLexer(RegexLexer): class CAmkESLexer(RegexLexer): """ Basic lexer for the input language for the CAmkES component platform. - - .. versionadded:: 2.1 """ name = 'CAmkES' url = 'https://sel4.systems/CAmkES/' aliases = ['camkes', 'idl4'] filenames = ['*.camkes', '*.idl4'] + version_added = '2.1' tokens = { 'root': [ # C pre-processor directive - (r'^(\s*)(#.*)(\n)', bygroups(Whitespace, Comment.Preproc, + (r'^(\s*)(#.*)(\n)', bygroups(Whitespace, Comment.Preproc, Whitespace)), # Whitespace, comments @@ -181,13 +180,12 @@ class CapDLLexer(RegexLexer): shadow type names, but these instances are currently incorrectly highlighted as types. Supporting this would need a stateful lexer that is considered unnecessarily complex for now. - - .. versionadded:: 2.2 """ name = 'CapDL' url = 'https://ssrg.nicta.com.au/publications/nictaabstracts/Kuz_KLW_10.abstract.pml' aliases = ['capdl'] filenames = ['*.cdl'] + version_added = '2.2' tokens = { 'root': [ @@ -235,12 +233,12 @@ class RedcodeLexer(RegexLexer): """ A simple Redcode lexer based on ICWS'94. Contributed by Adam Blinkinsop <blinks@acm.org>. - - .. versionadded:: 0.8 """ name = 'Redcode' aliases = ['redcode'] filenames = ['*.cw'] + url = 'https://en.wikipedia.org/wiki/Core_War' + version_added = '0.8' opcodes = ('DAT', 'MOV', 'ADD', 'SUB', 'MUL', 'DIV', 'MOD', 'JMP', 'JMZ', 'JMN', 'DJN', 'CMP', 'SLT', 'SPL', @@ -254,8 +252,8 @@ class RedcodeLexer(RegexLexer): (r';.*$', Comment.Single), # Lexemes: # Identifiers - (r'\b(%s)\b' % '|'.join(opcodes), Name.Function), - (r'\b(%s)\b' % '|'.join(modifiers), Name.Decorator), + (r'\b({})\b'.format('|'.join(opcodes)), Name.Function), + (r'\b({})\b'.format('|'.join(modifiers)), Name.Decorator), (r'[A-Za-z_]\w+', Name), # Operators (r'[-+*/%]', Operator), @@ -276,6 +274,7 @@ class AheuiLexer(RegexLexer): url = 'http://aheui.github.io/' aliases = ['aheui'] filenames = ['*.aheui'] + version_added = '' tokens = { 'root': [ diff --git a/libs/pygments/lexers/ezhil.py b/libs/pygments/lexers/ezhil.py index 49478ea00..697d90c69 100644 --- a/libs/pygments/lexers/ezhil.py +++ b/libs/pygments/lexers/ezhil.py @@ -4,7 +4,7 @@ Pygments lexers for Ezhil language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,13 @@ class EzhilLexer(RegexLexer): """ Lexer for Ezhil, a Tamil script-based programming language. - - .. versionadded:: 2.1 """ name = 'Ezhil' url = 'http://ezhillang.org' aliases = ['ezhil'] filenames = ['*.n'] mimetypes = ['text/x-ezhil'] + version_added = '2.1' # Refer to tamil.utf8.tamil_letters from open-tamil for a stricter version of this. # This much simpler version is close enough, and includes combining marks. _TALETTERS = '[a-zA-Z_]|[\u0b80-\u0bff]' diff --git a/libs/pygments/lexers/factor.py b/libs/pygments/lexers/factor.py index aa0cd2d85..297433ce4 100644 --- a/libs/pygments/lexers/factor.py +++ b/libs/pygments/lexers/factor.py @@ -4,7 +4,7 @@ Lexers for the Factor language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class FactorLexer(RegexLexer): """ Lexer for the Factor language. - - .. versionadded:: 1.4 """ name = 'Factor' url = 'http://factorcode.org' aliases = ['factor'] filenames = ['*.factor'] mimetypes = ['text/x-factor'] + version_added = '1.4' builtin_kernel = words(( '-rot', '2bi', '2bi@', '2bi*', '2curry', '2dip', '2drop', '2dup', '2keep', '2nip', diff --git a/libs/pygments/lexers/fantom.py b/libs/pygments/lexers/fantom.py index 7182d8184..a5ca59c3d 100644 --- a/libs/pygments/lexers/fantom.py +++ b/libs/pygments/lexers/fantom.py @@ -4,7 +4,7 @@ Lexer for the Fantom language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,13 +21,13 @@ class FantomLexer(RegexLexer): """ For Fantom source code. - - .. versionadded:: 1.5 """ name = 'Fantom' aliases = ['fan'] filenames = ['*.fan'] mimetypes = ['application/x-fantom'] + url = 'https://www.fantom.org' + version_added = '1.5' # often used regexes def s(str): diff --git a/libs/pygments/lexers/felix.py b/libs/pygments/lexers/felix.py index 5e34f056e..681070e87 100644 --- a/libs/pygments/lexers/felix.py +++ b/libs/pygments/lexers/felix.py @@ -4,7 +4,7 @@ Lexer for the Felix language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,8 +19,6 @@ class FelixLexer(RegexLexer): """ For Felix source code. - - .. versionadded:: 1.2 """ name = 'Felix' @@ -28,6 +26,7 @@ class FelixLexer(RegexLexer): aliases = ['felix', 'flx'] filenames = ['*.flx', '*.flxh'] mimetypes = ['text/x-felix'] + version_added = '1.2' preproc = ( 'elif', 'else', 'endif', 'if', 'ifdef', 'ifndef', @@ -128,13 +127,13 @@ class FelixLexer(RegexLexer): # IntegerLiteral # -- Binary - (r'0[Bb][01_]+%s' % decimal_suffixes, Number.Bin), + (rf'0[Bb][01_]+{decimal_suffixes}', Number.Bin), # -- Octal - (r'0[0-7_]+%s' % decimal_suffixes, Number.Oct), + (rf'0[0-7_]+{decimal_suffixes}', Number.Oct), # -- Hexadecimal - (r'0[xX][0-9a-fA-F_]+%s' % decimal_suffixes, Number.Hex), + (rf'0[xX][0-9a-fA-F_]+{decimal_suffixes}', Number.Hex), # -- Decimal - (r'(0|[1-9][0-9_]*)%s' % decimal_suffixes, Number.Integer), + (rf'(0|[1-9][0-9_]*){decimal_suffixes}', Number.Integer), # Strings ('([rR][cC]?|[cC][rR])"""', String, 'tdqs'), @@ -153,8 +152,8 @@ class FelixLexer(RegexLexer): (r'[a-zA-Z_]\w*:>', Name.Label), # Identifiers - (r'(%s)\b' % '|'.join(name_builtins), Name.Builtin), - (r'(%s)\b' % '|'.join(name_pseudo), Name.Builtin.Pseudo), + (r'({})\b'.format('|'.join(name_builtins)), Name.Builtin), + (r'({})\b'.format('|'.join(name_pseudo)), Name.Builtin.Pseudo), (r'[a-zA-Z_]\w*', Name), ], 'whitespace': [ @@ -169,7 +168,7 @@ class FelixLexer(RegexLexer): (r'#', Comment.Preproc, 'macro'), ], 'operators': [ - (r'(%s)\b' % '|'.join(operator_words), Operator.Word), + (r'({})\b'.format('|'.join(operator_words)), Operator.Word), (r'!=|==|<<|>>|\|\||&&|[-~+/*%=<>&^|.$]', Operator), ], 'comment': [ diff --git a/libs/pygments/lexers/fift.py b/libs/pygments/lexers/fift.py index 027175b14..02fdf4812 100644 --- a/libs/pygments/lexers/fift.py +++ b/libs/pygments/lexers/fift.py @@ -4,7 +4,7 @@ Lexers for fift. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,6 +23,7 @@ class FiftLexer(RegexLexer): aliases = ['fift', 'fif'] filenames = ['*.fif'] url = 'https://ton-blockchain.github.io/docs/fiftbase.pdf' + version_added = '' tokens = { 'root': [ diff --git a/libs/pygments/lexers/floscript.py b/libs/pygments/lexers/floscript.py index 6cc2971a2..864560914 100644 --- a/libs/pygments/lexers/floscript.py +++ b/libs/pygments/lexers/floscript.py @@ -4,7 +4,7 @@ Lexer for FloScript - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class FloScriptLexer(RegexLexer): """ For FloScript configuration language source code. - - .. versionadded:: 2.4 """ name = 'FloScript' url = 'https://github.com/ioflo/ioflo' aliases = ['floscript', 'flo'] filenames = ['*.flo'] + version_added = '2.4' def innerstring_rules(ttype): return [ diff --git a/libs/pygments/lexers/forth.py b/libs/pygments/lexers/forth.py index 7feeaef53..1cf707218 100644 --- a/libs/pygments/lexers/forth.py +++ b/libs/pygments/lexers/forth.py @@ -4,7 +4,7 @@ Lexer for the Forth language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,14 +21,13 @@ class ForthLexer(RegexLexer): """ Lexer for Forth files. - - .. versionadded:: 2.2 """ name = 'Forth' url = 'https://www.forth.com/forth/' aliases = ['forth'] filenames = ['*.frt', '*.fs'] mimetypes = ['application/x-forth'] + version_added = '2.2' flags = re.IGNORECASE | re.MULTILINE diff --git a/libs/pygments/lexers/fortran.py b/libs/pygments/lexers/fortran.py index cee254f74..1a2b7f950 100644 --- a/libs/pygments/lexers/fortran.py +++ b/libs/pygments/lexers/fortran.py @@ -4,7 +4,7 @@ Lexers for Fortran languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,13 @@ class FortranLexer(RegexLexer): """ Lexer for FORTRAN 90 code. - - .. versionadded:: 0.10 """ name = 'Fortran' url = 'https://fortran-lang.org/' aliases = ['fortran', 'f90'] filenames = ['*.f03', '*.f90', '*.F03', '*.F90'] mimetypes = ['text/x-fortran'] + version_added = '0.10' flags = re.IGNORECASE | re.MULTILINE # Data Types: INTEGER, REAL, COMPLEX, LOGICAL, CHARACTER and DOUBLE PRECISION @@ -173,12 +172,12 @@ class FortranLexer(RegexLexer): class FortranFixedLexer(RegexLexer): """ Lexer for fixed format Fortran. - - .. versionadded:: 2.1 """ name = 'FortranFixed' aliases = ['fortranfixed'] filenames = ['*.f', '*.F'] + url = 'https://fortran-lang.org/' + version_added = '2.1' flags = re.IGNORECASE diff --git a/libs/pygments/lexers/foxpro.py b/libs/pygments/lexers/foxpro.py index 9d8d951c5..dd6fd1821 100644 --- a/libs/pygments/lexers/foxpro.py +++ b/libs/pygments/lexers/foxpro.py @@ -4,7 +4,7 @@ Simple lexer for Microsoft Visual FoxPro source code. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,14 +22,14 @@ class FoxProLexer(RegexLexer): FoxPro syntax allows to shorten all keywords and function names to 4 characters. Shortened forms are not recognized by this lexer. - - .. versionadded:: 1.6 """ name = 'FoxPro' aliases = ['foxpro', 'vfp', 'clipper', 'xbase'] filenames = ['*.PRG', '*.prg'] + version_added = '1.6' mimetype = [] + url = 'https://learn.microsoft.com/en-us/previous-versions/visualstudio/foxpro' flags = re.IGNORECASE | re.MULTILINE diff --git a/libs/pygments/lexers/freefem.py b/libs/pygments/lexers/freefem.py index eab6cbfff..ce8e25453 100644 --- a/libs/pygments/lexers/freefem.py +++ b/libs/pygments/lexers/freefem.py @@ -4,7 +4,7 @@ Lexer for FreeFem++ language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,8 +21,6 @@ class FreeFemLexer(CppLexer): This is an extension of the CppLexer, as the FreeFem Language is a superset of C++. - - .. versionadded:: 2.4 """ name = 'Freefem' @@ -30,6 +28,7 @@ class FreeFemLexer(CppLexer): aliases = ['freefem'] filenames = ['*.edp'] mimetypes = ['text/x-freefem'] + version_added = '2.4' # Language operators operators = {'+', '-', '*', '.*', '/', './', '%', '^', '^-1', ':', '\''} diff --git a/libs/pygments/lexers/func.py b/libs/pygments/lexers/func.py index 871f04058..373056957 100644 --- a/libs/pygments/lexers/func.py +++ b/libs/pygments/lexers/func.py @@ -4,7 +4,7 @@ Lexers for FunC. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,6 +23,8 @@ class FuncLexer(RegexLexer): name = 'FunC' aliases = ['func', 'fc'] filenames = ['*.fc', '*.func'] + url = 'https://docs.ton.org/develop/func/overview' + version_added = '' # 1. Does not start from " # 2. Can start from ` and end with `, containing any character diff --git a/libs/pygments/lexers/functional.py b/libs/pygments/lexers/functional.py index 6189dd2cc..1f51ac9e0 100644 --- a/libs/pygments/lexers/functional.py +++ b/libs/pygments/lexers/functional.py @@ -4,10 +4,11 @@ Just export lexer classes previously contained in this module. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +# ruff: noqa: F401 from pygments.lexers.lisp import SchemeLexer, CommonLispLexer, RacketLexer, \ NewLispLexer, ShenLexer from pygments.lexers.haskell import HaskellLexer, LiterateHaskellLexer, \ diff --git a/libs/pygments/lexers/futhark.py b/libs/pygments/lexers/futhark.py index b0efa88af..2b5bb5901 100644 --- a/libs/pygments/lexers/futhark.py +++ b/libs/pygments/lexers/futhark.py @@ -4,7 +4,7 @@ Lexer for the Futhark language - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +19,13 @@ class FutharkLexer(RegexLexer): """ A Futhark lexer - - .. versionadded:: 2.8 """ name = 'Futhark' url = 'https://futhark-lang.org/' aliases = ['futhark'] filenames = ['*.fut'] mimetypes = ['text/x-futhark'] + version_added = '2.8' num_types = ('i8', 'i16', 'i32', 'i64', 'u8', 'u16', 'u32', 'u64', 'f32', 'f64') @@ -42,7 +41,7 @@ class FutharkLexer(RegexLexer): 'DC[1-4]', 'NAK', 'SYN', 'ETB', 'CAN', 'EM', 'SUB', 'ESC', '[FGRU]S', 'SP', 'DEL') - num_postfix = r'(%s)?' % '|'.join(num_types) + num_postfix = r'({})?'.format('|'.join(num_types)) identifier_re = '[a-zA-Z_][a-zA-Z_0-9\']*' @@ -53,12 +52,12 @@ class FutharkLexer(RegexLexer): (r'--(.*?)$', Comment.Single), (r'\s+', Whitespace), (r'\(\)', Punctuation), - (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved), - (r'\b(%s)(?!\')\b' % '|'.join(num_types + other_types), Keyword.Type), + (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved), + (r'\b({})(?!\')\b'.format('|'.join(num_types + other_types)), Keyword.Type), # Identifiers (r'#\[([a-zA-Z_\(\) ]*)\]', Comment.Preproc), - (r'[#!]?(%s\.)*%s' % (identifier_re, identifier_re), Name), + (rf'[#!]?({identifier_re}\.)*{identifier_re}', Name), (r'\\', Operator), (r'[-+/%=!><|&*^][-+/%=!><|&*^.]*', Operator), diff --git a/libs/pygments/lexers/gcodelexer.py b/libs/pygments/lexers/gcodelexer.py index c3a4a58a9..1747d416d 100644 --- a/libs/pygments/lexers/gcodelexer.py +++ b/libs/pygments/lexers/gcodelexer.py @@ -4,7 +4,7 @@ Lexers for the G Code Language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,12 +17,12 @@ class GcodeLexer(RegexLexer): """ For gcode source code. - - .. versionadded:: 2.9 """ name = 'g-code' aliases = ['gcode'] filenames = ['*.gcode'] + url = 'https://en.wikipedia.org/wiki/G-code' + version_added = '2.9' tokens = { 'root': [ diff --git a/libs/pygments/lexers/gdscript.py b/libs/pygments/lexers/gdscript.py index 0f4f6d431..a6b8ad4e1 100644 --- a/libs/pygments/lexers/gdscript.py +++ b/libs/pygments/lexers/gdscript.py @@ -7,7 +7,7 @@ Modified by Daniel J. Ramirez <djrmuv@gmail.com> based on the original python.py. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -31,6 +31,7 @@ class GDScriptLexer(RegexLexer): aliases = ["gdscript", "gd"] filenames = ["*.gd"] mimetypes = ["text/x-gdscript", "application/x-gdscript"] + version_added = '' def innerstring_rules(ttype): return [ diff --git a/libs/pygments/lexers/go.py b/libs/pygments/lexers/go.py index fe4a1846d..4d8326ad1 100644 --- a/libs/pygments/lexers/go.py +++ b/libs/pygments/lexers/go.py @@ -4,7 +4,7 @@ Lexers for the Google Go language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class GoLexer(RegexLexer): """ For Go source. - - .. versionadded:: 1.2 """ name = 'Go' url = 'https://go.dev/' filenames = ['*.go'] aliases = ['go', 'golang'] mimetypes = ['text/x-gosrc'] + version_added = '1.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/grammar_notation.py b/libs/pygments/lexers/grammar_notation.py index 792713341..cb2814376 100644 --- a/libs/pygments/lexers/grammar_notation.py +++ b/libs/pygments/lexers/grammar_notation.py @@ -4,7 +4,7 @@ Lexers for grammar notations like BNF. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -39,14 +39,14 @@ class BnfLexer(RegexLexer): Though these decision making might cause too minimal highlighting and you might be disappointed, but it is reasonable for us. - - .. versionadded:: 2.1 """ name = 'BNF' aliases = ['bnf'] filenames = ['*.bnf'] mimetypes = ['text/x-bnf'] + url = 'https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form' + version_added = '2.1' tokens = { 'root': [ @@ -68,8 +68,6 @@ class AbnfLexer(RegexLexer): Lexer for IETF 7405 ABNF. (Updates `5234 <http://www.ietf.org/rfc/rfc5234.txt>`_) grammars. - - .. versionadded:: 2.1 """ name = 'ABNF' @@ -77,6 +75,7 @@ class AbnfLexer(RegexLexer): aliases = ['abnf'] filenames = ['*.abnf'] mimetypes = ['text/x-abnf'] + version_added = '2.1' _core_rules = ( 'ALPHA', 'BIT', 'CHAR', 'CR', 'CRLF', 'CTL', 'DIGIT', @@ -133,14 +132,13 @@ class AbnfLexer(RegexLexer): class JsgfLexer(RegexLexer): """ For JSpeech Grammar Format grammars. - - .. versionadded:: 2.2 """ name = 'JSGF' url = 'https://www.w3.org/TR/jsgf/' aliases = ['jsgf'] filenames = ['*.jsgf'] mimetypes = ['application/jsgf', 'application/x-jsgf', 'text/jsgf'] + version_added = '2.2' tokens = { 'root': [ @@ -224,8 +222,6 @@ class PegLexer(RegexLexer): * A single `a-z` character immediately before a string, or multiple `a-z` characters following a string, are part of the string (e.g., `r"..."` or `"..."ilmsuxa`). - - .. versionadded:: 2.6 """ name = 'PEG' @@ -233,6 +229,7 @@ class PegLexer(RegexLexer): aliases = ['peg'] filenames = ['*.peg'] mimetypes = ['text/x-peg'] + version_added = '2.6' tokens = { 'root': [ diff --git a/libs/pygments/lexers/graph.py b/libs/pygments/lexers/graph.py index 753df361c..840d5e9e6 100644 --- a/libs/pygments/lexers/graph.py +++ b/libs/pygments/lexers/graph.py @@ -4,7 +4,7 @@ Lexers for graph query languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,13 +23,12 @@ class CypherLexer(RegexLexer): For Cypher Query Language For the Cypher version in Neo4j 3.3 - - .. versionadded:: 2.0 """ name = 'Cypher' url = 'https://neo4j.com/docs/developer-manual/3.3/cypher/' aliases = ['cypher'] filenames = ['*.cyp', '*.cypher'] + version_added = '2.0' flags = re.MULTILINE | re.IGNORECASE diff --git a/libs/pygments/lexers/graphics.py b/libs/pygments/lexers/graphics.py index 8c112f5e8..c5a144d0c 100644 --- a/libs/pygments/lexers/graphics.py +++ b/libs/pygments/lexers/graphics.py @@ -4,7 +4,7 @@ Lexers for computer graphics and plotting related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,13 +20,13 @@ class GLShaderLexer(RegexLexer): """ GLSL (OpenGL Shader) lexer. - - .. versionadded:: 1.1 """ name = 'GLSL' aliases = ['glsl'] filenames = ['*.vert', '*.frag', '*.geo'] mimetypes = ['text/x-glslsrc'] + url = 'https://www.khronos.org/api/opengl' + version_added = '1.1' tokens = { 'root': [ @@ -151,13 +151,13 @@ class GLShaderLexer(RegexLexer): class HLSLShaderLexer(RegexLexer): """ HLSL (Microsoft Direct3D Shader) lexer. - - .. versionadded:: 2.3 """ name = 'HLSL' aliases = ['hlsl'] filenames = ['*.hlsl', '*.hlsli'] mimetypes = ['text/x-hlsl'] + url = 'https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl' + version_added = '2.3' tokens = { 'root': [ @@ -305,20 +305,19 @@ class HLSLShaderLexer(RegexLexer): class PostScriptLexer(RegexLexer): """ Lexer for PostScript files. - - .. versionadded:: 1.4 """ name = 'PostScript' url = 'https://en.wikipedia.org/wiki/PostScript' aliases = ['postscript', 'postscr'] filenames = ['*.ps', '*.eps'] mimetypes = ['application/postscript'] + version_added = '1.4' delimiter = r'()<>\[\]{}/%\s' - delimiter_end = r'(?=[%s])' % delimiter + delimiter_end = rf'(?=[{delimiter}])' - valid_name_chars = r'[^%s]' % delimiter - valid_name = r"%s+%s" % (valid_name_chars, delimiter_end) + valid_name_chars = rf'[^{delimiter}]' + valid_name = rf"{valid_name_chars}+{delimiter_end}" tokens = { 'root': [ @@ -343,7 +342,7 @@ class PostScriptLexer(RegexLexer): (r'(\-|\+)?[0-9]+' + delimiter_end, Number.Integer), # References - (r'\/%s' % valid_name, Name.Variable), + (rf'\/{valid_name}', Name.Variable), # Names (valid_name, Name.Function), # Anything else is executed @@ -400,14 +399,13 @@ class PostScriptLexer(RegexLexer): class AsymptoteLexer(RegexLexer): """ For Asymptote source code. - - .. versionadded:: 1.2 """ name = 'Asymptote' url = 'http://asymptote.sf.net/' aliases = ['asymptote', 'asy'] filenames = ['*.asy'] mimetypes = ['text/x-asymptote'] + version_added = '1.2' #: optional Comment or Whitespace _ws = r'(?:\s|//.*?\n|/\*.*?\*/)+' @@ -528,8 +526,6 @@ def _shortened_many(*words): class GnuplotLexer(RegexLexer): """ For Gnuplot plotting scripts. - - .. versionadded:: 0.11 """ name = 'Gnuplot' @@ -537,6 +533,7 @@ class GnuplotLexer(RegexLexer): aliases = ['gnuplot'] filenames = ['*.plot', '*.plt'] mimetypes = ['text/x-gnuplot'] + version_added = '0.11' tokens = { 'root': [ @@ -689,14 +686,13 @@ class GnuplotLexer(RegexLexer): class PovrayLexer(RegexLexer): """ For Persistence of Vision Raytracer files. - - .. versionadded:: 0.11 """ name = 'POVRay' url = 'http://www.povray.org/' aliases = ['pov'] filenames = ['*.pov', '*.inc'] mimetypes = ['text/x-povray'] + version_added = '0.11' tokens = { 'root': [ diff --git a/libs/pygments/lexers/graphql.py b/libs/pygments/lexers/graphql.py index b17e4a6c8..2bcb383e9 100644 --- a/libs/pygments/lexers/graphql.py +++ b/libs/pygments/lexers/graphql.py @@ -8,7 +8,7 @@ More information: https://graphql.org/ - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -57,13 +57,12 @@ class GraphQLLexer(RegexLexer): """ Lexer for GraphQL syntax - - .. versionadded:: 2.16 """ name = "GraphQL" aliases = ["graphql"] filenames = ["*.graphql"] url = "https://graphql.org" + version_added = '2.16' tokens = { "ignored_tokens": [ diff --git a/libs/pygments/lexers/graphviz.py b/libs/pygments/lexers/graphviz.py index 1e4ba0243..f58e1ffaa 100644 --- a/libs/pygments/lexers/graphviz.py +++ b/libs/pygments/lexers/graphviz.py @@ -4,7 +4,7 @@ Lexer for the DOT language (graphviz). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +19,13 @@ class GraphvizLexer(RegexLexer): """ For graphviz DOT graph description language. - - .. versionadded:: 2.8 """ name = 'Graphviz' url = 'https://www.graphviz.org/doc/info/lang.html' aliases = ['graphviz', 'dot'] filenames = ['*.gv', '*.dot'] mimetypes = ['text/x-graphviz', 'text/vnd.graphviz'] + version_added = '2.8' tokens = { 'root': [ (r'\s+', Whitespace), diff --git a/libs/pygments/lexers/gsql.py b/libs/pygments/lexers/gsql.py index 222ee7029..5f55af3a2 100755 --- a/libs/pygments/lexers/gsql.py +++ b/libs/pygments/lexers/gsql.py @@ -4,7 +4,7 @@ Lexers for TigerGraph GSQL graph query language - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,14 +21,13 @@ class GSQLLexer(RegexLexer): """ For GSQL queries (version 3.x). - - .. versionadded:: 2.10 """ name = 'GSQL' url = 'https://docs.tigergraph.com/dev/gsql-ref' aliases = ['gsql'] filenames = ['*.gsql'] + version_added = '2.10' flags = re.MULTILINE | re.IGNORECASE diff --git a/libs/pygments/lexers/haskell.py b/libs/pygments/lexers/haskell.py index 2c5fa1344..4983abc8c 100644 --- a/libs/pygments/lexers/haskell.py +++ b/libs/pygments/lexers/haskell.py @@ -4,7 +4,7 @@ Lexers for Haskell and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -24,14 +24,13 @@ class HaskellLexer(RegexLexer): """ A Haskell lexer based on the lexemes defined in the Haskell 98 Report. - - .. versionadded:: 0.8 """ name = 'Haskell' url = 'https://www.haskell.org/' aliases = ['haskell', 'hs'] filenames = ['*.hs'] mimetypes = ['text/x-haskell'] + version_added = '0.8' reserved = ('case', 'class', 'data', 'default', 'deriving', 'do', 'else', 'family', 'if', 'in', 'infix[lr]?', 'instance', @@ -53,7 +52,7 @@ class HaskellLexer(RegexLexer): (r'\bimport\b', Keyword.Reserved, 'import'), (r'\bmodule\b', Keyword.Reserved, 'module'), (r'\berror\b', Name.Exception), - (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved), + (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved), (r"'[^\\]'", String.Char), # this has to come before the TH quote (r'^[_' + uni.Ll + r'][\w\']*', Name.Function), (r"'?[_" + uni.Ll + r"][\w']*", Name), @@ -157,14 +156,13 @@ class HaskellLexer(RegexLexer): class HspecLexer(HaskellLexer): """ A Haskell lexer with support for Hspec constructs. - - .. versionadded:: 2.4.0 """ name = 'Hspec' aliases = ['hspec'] filenames = ['*Spec.hs'] mimetypes = [] + version_added = '2.4' tokens = { 'root': [ @@ -181,14 +179,13 @@ class IdrisLexer(RegexLexer): A lexer for the dependently typed programming language Idris. Based on the Haskell and Agda Lexer. - - .. versionadded:: 2.0 """ name = 'Idris' url = 'https://www.idris-lang.org/' aliases = ['idris', 'idr'] filenames = ['*.idr'] mimetypes = ['text/x-idris'] + version_added = '2.0' reserved = ('case', 'class', 'data', 'default', 'using', 'do', 'else', 'if', 'in', 'infix[lr]?', 'instance', 'rewrite', 'auto', @@ -211,7 +208,7 @@ class IdrisLexer(RegexLexer): tokens = { 'root': [ # Comments - (r'^(\s*)(%%(%s))' % '|'.join(directives), + (r'^(\s*)(%({}))'.format('|'.join(directives)), bygroups(Whitespace, Keyword.Reserved)), (r'(\s*)(--(?![!#$%&*+./<=>?@^|_~:\\]).*?)$', bygroups(Whitespace, Comment.Single)), (r'(\s*)(\|{3}.*?)$', bygroups(Whitespace, Comment.Single)), @@ -220,7 +217,7 @@ class IdrisLexer(RegexLexer): (r'^(\s*)([^\s(){}]+)(\s*)(:)(\s*)', bygroups(Whitespace, Name.Function, Whitespace, Operator.Word, Whitespace)), # Identifiers - (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved), + (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved), (r'(import|module)(\s+)', bygroups(Keyword.Reserved, Whitespace), 'module'), (r"('')?[A-Z][\w\']*", Keyword.Type), (r'[a-z][\w\']*', Text), @@ -292,8 +289,6 @@ class AgdaLexer(RegexLexer): """ For the Agda dependently typed functional programming language and proof assistant. - - .. versionadded:: 2.0 """ name = 'Agda' @@ -301,6 +296,7 @@ class AgdaLexer(RegexLexer): aliases = ['agda'] filenames = ['*.agda'] mimetypes = ['text/x-agda'] + version_added = '2.0' reserved = ( 'abstract', 'codata', 'coinductive', 'constructor', 'data', 'do', @@ -325,7 +321,7 @@ class AgdaLexer(RegexLexer): (r'\{!', Comment.Directive, 'hole'), # Lexemes: # Identifiers - (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved), + (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved), (r'(import|module)(\s+)', bygroups(Keyword.Reserved, Whitespace), 'module'), (r'\b(Set|Prop)[\u2080-\u2089]*\b', Keyword.Type), @@ -365,13 +361,13 @@ class AgdaLexer(RegexLexer): class CryptolLexer(RegexLexer): """ FIXME: A Cryptol2 lexer based on the lexemes defined in the Haskell 98 Report. - - .. versionadded:: 2.0 """ name = 'Cryptol' aliases = ['cryptol', 'cry'] filenames = ['*.cry'] mimetypes = ['text/x-cryptol'] + url = 'https://www.cryptol.net' + version_added = '2.0' reserved = ('Arith', 'Bit', 'Cmp', 'False', 'Inf', 'True', 'else', 'export', 'extern', 'fin', 'if', 'import', 'inf', 'lg2', @@ -394,7 +390,7 @@ class CryptolLexer(RegexLexer): (r'\bimport\b', Keyword.Reserved, 'import'), (r'\bmodule\b', Keyword.Reserved, 'module'), (r'\berror\b', Name.Exception), - (r'\b(%s)(?!\')\b' % '|'.join(reserved), Keyword.Reserved), + (r'\b({})(?!\')\b'.format('|'.join(reserved)), Keyword.Reserved), (r'^[_a-z][\w\']*', Name.Function), (r"'?[_a-z][\w']*", Name), (r"('')?[A-Z][\w\']*", Keyword.Type), @@ -573,13 +569,13 @@ class LiterateHaskellLexer(LiterateLexer): If given, must be ``"bird"`` or ``"latex"``. If not given, the style is autodetected: if the first non-whitespace character in the source is a backslash or percent character, LaTeX is assumed, else Bird. - - .. versionadded:: 0.9 """ name = 'Literate Haskell' aliases = ['literate-haskell', 'lhaskell', 'lhs'] filenames = ['*.lhs'] mimetypes = ['text/x-literate-haskell'] + url = 'https://wiki.haskell.org/Literate_programming' + version_added = '0.9' def __init__(self, **options): hslexer = HaskellLexer(**options) @@ -596,13 +592,13 @@ class LiterateIdrisLexer(LiterateLexer): If given, must be ``"bird"`` or ``"latex"``. If not given, the style is autodetected: if the first non-whitespace character in the source is a backslash or percent character, LaTeX is assumed, else Bird. - - .. versionadded:: 2.0 """ name = 'Literate Idris' aliases = ['literate-idris', 'lidris', 'lidr'] filenames = ['*.lidr'] mimetypes = ['text/x-literate-idris'] + url = 'https://idris2.readthedocs.io/en/latest/reference/literate.html' + version_added = '2.0' def __init__(self, **options): hslexer = IdrisLexer(**options) @@ -619,13 +615,13 @@ class LiterateAgdaLexer(LiterateLexer): If given, must be ``"bird"`` or ``"latex"``. If not given, the style is autodetected: if the first non-whitespace character in the source is a backslash or percent character, LaTeX is assumed, else Bird. - - .. versionadded:: 2.0 """ name = 'Literate Agda' aliases = ['literate-agda', 'lagda'] filenames = ['*.lagda'] mimetypes = ['text/x-literate-agda'] + url = 'https://agda.readthedocs.io/en/latest/tools/literate-programming.html' + version_added = '2.0' def __init__(self, **options): agdalexer = AgdaLexer(**options) @@ -642,13 +638,13 @@ class LiterateCryptolLexer(LiterateLexer): If given, must be ``"bird"`` or ``"latex"``. If not given, the style is autodetected: if the first non-whitespace character in the source is a backslash or percent character, LaTeX is assumed, else Bird. - - .. versionadded:: 2.0 """ name = 'Literate Cryptol' aliases = ['literate-cryptol', 'lcryptol', 'lcry'] filenames = ['*.lcry'] mimetypes = ['text/x-literate-cryptol'] + url = 'https://www.cryptol.net' + version_added = '2.0' def __init__(self, **options): crylexer = CryptolLexer(**options) @@ -658,8 +654,6 @@ def __init__(self, **options): class KokaLexer(RegexLexer): """ Lexer for the Koka language. - - .. versionadded:: 1.6 """ name = 'Koka' @@ -667,6 +661,7 @@ class KokaLexer(RegexLexer): aliases = ['koka'] filenames = ['*.kk', '*.kki'] mimetypes = ['text/x-koka'] + version_added = '1.6' keywords = [ 'infix', 'infixr', 'infixl', @@ -726,7 +721,7 @@ class KokaLexer(RegexLexer): 'alias-type'), (r'(struct)(\s+)([a-z]\w*)?', bygroups(Keyword, Whitespace, tokenTypeDef), 'struct-type'), - ((r'(%s)' % '|'.join(typeStartKeywords)) + + ((r'({})'.format('|'.join(typeStartKeywords))) + r'(\s+)([a-z]\w*)?', bygroups(Keyword, Whitespace, tokenTypeDef), 'type'), @@ -748,9 +743,9 @@ class KokaLexer(RegexLexer): bygroups(Keyword, Whitespace, Keyword, Whitespace, Keyword, Whitespace, Name.Function)), # keywords - (r'(%s)' % '|'.join(typekeywords) + boundary, Keyword.Type), - (r'(%s)' % '|'.join(keywords) + boundary, Keyword), - (r'(%s)' % '|'.join(builtin) + boundary, Keyword.Pseudo), + (r'({})'.format('|'.join(typekeywords)) + boundary, Keyword.Type), + (r'({})'.format('|'.join(keywords)) + boundary, Keyword), + (r'({})'.format('|'.join(builtin)) + boundary, Keyword.Pseudo), (r'::?|:=|\->|[=.]' + sboundary, Keyword), # names @@ -811,8 +806,8 @@ class KokaLexer(RegexLexer): include('whitespace'), # keywords - (r'(%s)' % '|'.join(typekeywords) + boundary, Keyword), - (r'(?=((%s)' % '|'.join(keywords) + boundary + '))', + (r'({})'.format('|'.join(typekeywords)) + boundary, Keyword), + (r'(?=(({})'.format('|'.join(keywords)) + boundary + '))', Keyword, '#pop'), # need to match because names overlap... # kinds diff --git a/libs/pygments/lexers/haxe.py b/libs/pygments/lexers/haxe.py index 6e99b10bc..d9bf654cc 100644 --- a/libs/pygments/lexers/haxe.py +++ b/libs/pygments/lexers/haxe.py @@ -4,7 +4,7 @@ Lexers for Haxe and related stuff. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,8 +21,6 @@ class HaxeLexer(ExtendedRegexLexer): """ For Haxe source code. - - .. versionadded:: 1.3 """ name = 'Haxe' @@ -30,6 +28,7 @@ class HaxeLexer(ExtendedRegexLexer): aliases = ['haxe', 'hxsl', 'hx'] filenames = ['*.hx', '*.hxsl'] mimetypes = ['text/haxe', 'text/x-haxe', 'text/x-hx'] + version_added = '1.3' # keywords extracted from lexer.mll in the haxe compiler source keyword = (r'(?:function|class|static|var|if|else|while|do|for|' @@ -898,13 +897,12 @@ def analyse_text(text): class HxmlLexer(RegexLexer): """ Lexer for haXe build files. - - .. versionadded:: 1.6 """ name = 'Hxml' url = 'https://haxe.org/manual/compiler-usage-hxml.html' aliases = ['haxeml', 'hxml'] filenames = ['*.hxml'] + version_added = '1.6' tokens = { 'root': [ diff --git a/libs/pygments/lexers/hdl.py b/libs/pygments/lexers/hdl.py index 319ec9310..57e560f9d 100644 --- a/libs/pygments/lexers/hdl.py +++ b/libs/pygments/lexers/hdl.py @@ -4,7 +4,7 @@ Lexers for hardware descriptor languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,13 +20,13 @@ class VerilogLexer(RegexLexer): """ For verilog source code with preprocessor directives. - - .. versionadded:: 1.4 """ name = 'verilog' aliases = ['verilog', 'v'] filenames = ['*.v'] mimetypes = ['text/x-verilog'] + url = 'https://en.wikipedia.org/wiki/Verilog' + version_added = '1.4' #: optional Comment or Whitespace _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+' @@ -147,13 +147,13 @@ class SystemVerilogLexer(RegexLexer): """ Extends verilog lexer to recognise all SystemVerilog keywords from IEEE 1800-2009 standard. - - .. versionadded:: 1.5 """ name = 'systemverilog' aliases = ['systemverilog', 'sv'] filenames = ['*.sv', '*.svh'] mimetypes = ['text/x-systemverilog'] + url = 'https://en.wikipedia.org/wiki/SystemVerilog' + version_added = '1.5' #: optional Comment or Whitespace _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+' @@ -373,13 +373,13 @@ class SystemVerilogLexer(RegexLexer): class VhdlLexer(RegexLexer): """ For VHDL source code. - - .. versionadded:: 1.5 """ name = 'vhdl' aliases = ['vhdl'] filenames = ['*.vhdl', '*.vhd'] mimetypes = ['text/x-vhdl'] + url = 'https://en.wikipedia.org/wiki/VHDL' + version_added = '1.5' flags = re.MULTILINE | re.IGNORECASE tokens = { @@ -387,6 +387,7 @@ class VhdlLexer(RegexLexer): (r'\s+', Whitespace), (r'(\\)(\n)', bygroups(String.Escape, Whitespace)), # line continuation (r'--.*?$', Comment.Single), + (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline), (r"'(U|X|0|1|Z|W|L|H|-)'", String.Char), (r'[~!%^&*+=|?:<>/-]', Operator), (r"'[a-z_]\w*", Name.Attribute), diff --git a/libs/pygments/lexers/hexdump.py b/libs/pygments/lexers/hexdump.py index 9672fd4dc..28d3429ca 100644 --- a/libs/pygments/lexers/hexdump.py +++ b/libs/pygments/lexers/hexdump.py @@ -4,7 +4,7 @@ Lexers for hexadecimal dumps. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -33,11 +33,11 @@ class HexdumpLexer(RegexLexer): * ``od -t x1z FILE`` * ``xxd FILE`` * ``DEBUG.EXE FILE.COM`` and entering ``d`` to the prompt. - - .. versionadded:: 2.1 """ name = 'Hexdump' aliases = ['hexdump'] + url = 'https://en.wikipedia.org/wiki/Hex_dump' + version_added = '2.1' hd = r'[0-9A-Ha-h]' diff --git a/libs/pygments/lexers/html.py b/libs/pygments/lexers/html.py index 27fb7534c..c4217a219 100644 --- a/libs/pygments/lexers/html.py +++ b/libs/pygments/lexers/html.py @@ -4,7 +4,7 @@ Lexers for HTML, XML and related markup. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -36,6 +36,7 @@ class HtmlLexer(RegexLexer): aliases = ['html'] filenames = ['*.html', '*.htm', '*.xhtml', '*.xslt'] mimetypes = ['text/html', 'application/xhtml+xml'] + version_added = '' flags = re.IGNORECASE | re.DOTALL tokens = { @@ -106,8 +107,6 @@ def analyse_text(text): class DtdLexer(RegexLexer): """ A lexer for DTDs (Document Type Definitions). - - .. versionadded:: 1.5 """ flags = re.MULTILINE | re.DOTALL @@ -116,6 +115,8 @@ class DtdLexer(RegexLexer): aliases = ['dtd'] filenames = ['*.dtd'] mimetypes = ['application/xml-dtd'] + url = 'https://en.wikipedia.org/wiki/Document_type_definition' + version_added = '1.5' tokens = { 'root': [ @@ -204,6 +205,8 @@ class XmlLexer(RegexLexer): '*.wsdl', '*.wsf'] mimetypes = ['text/xml', 'application/xml', 'image/svg+xml', 'application/rss+xml', 'application/atom+xml'] + url = 'https://www.w3.org/XML' + version_added = '' tokens = { 'root': [ @@ -238,14 +241,14 @@ def analyse_text(text): class XsltLexer(XmlLexer): """ A lexer for XSLT. - - .. versionadded:: 0.10 """ name = 'XSLT' aliases = ['xslt'] filenames = ['*.xsl', '*.xslt', '*.xpl'] # xpl is XProc mimetypes = ['application/xsl+xml', 'application/xslt+xml'] + url = 'https://www.w3.org/TR/xslt-30' + version_added = '0.10' EXTRA_KEYWORDS = { 'apply-imports', 'apply-templates', 'attribute', @@ -275,14 +278,14 @@ def analyse_text(text): class HamlLexer(ExtendedRegexLexer): """ For Haml markup. - - .. versionadded:: 1.3 """ name = 'Haml' aliases = ['haml'] filenames = ['*.haml'] mimetypes = ['text/x-haml'] + url = 'https://haml.info' + version_added = '1.3' flags = re.IGNORECASE # Haml can include " |\n" anywhere, @@ -385,15 +388,15 @@ class HamlLexer(ExtendedRegexLexer): class ScamlLexer(ExtendedRegexLexer): """ - For `Scaml markup <http://scalate.fusesource.org/>`_. Scaml is Haml for Scala. - - .. versionadded:: 1.4 + For Scaml markup. Scaml is Haml for Scala. """ name = 'Scaml' aliases = ['scaml'] filenames = ['*.scaml'] mimetypes = ['text/x-scaml'] + url = 'https://scalate.github.io/scalate/' + version_added = '1.4' flags = re.IGNORECASE # Scaml does not yet support the " |\n" notation to @@ -500,14 +503,14 @@ class PugLexer(ExtendedRegexLexer): For Pug markup. Pug is a variant of Scaml, see: http://scalate.fusesource.org/documentation/scaml-reference.html - - .. versionadded:: 1.4 """ name = 'Pug' aliases = ['pug', 'jade'] filenames = ['*.pug', '*.jade'] mimetypes = ['text/x-pug', 'text/x-jade'] + url = 'https://pugjs.org' + version_added = '1.4' flags = re.IGNORECASE _dot = r'.' @@ -608,13 +611,13 @@ class PugLexer(ExtendedRegexLexer): class UrlEncodedLexer(RegexLexer): """ Lexer for urlencoded data - - .. versionadded:: 2.16 """ name = 'urlencoded' aliases = ['urlencoded'] mimetypes = ['application/x-www-form-urlencoded'] + url = 'https://en.wikipedia.org/wiki/Percent-encoding' + version_added = '2.16' tokens = { 'root': [ diff --git a/libs/pygments/lexers/idl.py b/libs/pygments/lexers/idl.py index c4d8b3180..fab3c1721 100644 --- a/libs/pygments/lexers/idl.py +++ b/libs/pygments/lexers/idl.py @@ -4,7 +4,7 @@ Lexers for IDL. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,13 @@ class IDLLexer(RegexLexer): """ Pygments Lexer for IDL (Interactive Data Language). - - .. versionadded:: 1.6 """ name = 'IDL' url = 'https://www.l3harrisgeospatial.com/Software-Technology/IDL' aliases = ['idl'] filenames = ['*.pro'] mimetypes = ['text/idl'] + version_added = '1.6' flags = re.IGNORECASE | re.MULTILINE diff --git a/libs/pygments/lexers/igor.py b/libs/pygments/lexers/igor.py index b25badbb1..84ec32fd2 100644 --- a/libs/pygments/lexers/igor.py +++ b/libs/pygments/lexers/igor.py @@ -4,7 +4,7 @@ Lexers for Igor Pro. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,15 +19,14 @@ class IgorLexer(RegexLexer): """ Pygments Lexer for Igor Pro procedure files (.ipf). - See http://www.wavemetrics.com/ and http://www.igorexchange.com/. - - .. versionadded:: 2.0 """ name = 'Igor' aliases = ['igor', 'igorpro'] filenames = ['*.ipf'] mimetypes = ['text/ipf'] + url = 'http://www.wavemetrics.com' + version_added = '2.0' flags = re.IGNORECASE | re.MULTILINE diff --git a/libs/pygments/lexers/inferno.py b/libs/pygments/lexers/inferno.py index ce1fe036d..3513df2af 100644 --- a/libs/pygments/lexers/inferno.py +++ b/libs/pygments/lexers/inferno.py @@ -4,7 +4,7 @@ Lexers for Inferno os and all the related stuff. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -24,14 +24,13 @@ class LimboLexer(RegexLexer): TODO: - maybe implement better var declaration highlighting - some simple syntax error highlighting - - .. versionadded:: 2.0 """ name = 'Limbo' url = 'http://www.vitanuova.com/inferno/limbo.html' aliases = ['limbo'] filenames = ['*.b'] mimetypes = ['text/limbo'] + version_added = '2.0' tokens = { 'whitespace': [ diff --git a/libs/pygments/lexers/installers.py b/libs/pygments/lexers/installers.py index dcf8bdfb9..2a9c5daa1 100644 --- a/libs/pygments/lexers/installers.py +++ b/libs/pygments/lexers/installers.py @@ -4,7 +4,7 @@ Lexers for installer/packager DSLs and formats. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,14 +21,13 @@ class NSISLexer(RegexLexer): """ For NSIS scripts. - - .. versionadded:: 1.6 """ name = 'NSIS' url = 'http://nsis.sourceforge.net/' aliases = ['nsis', 'nsi', 'nsh'] filenames = ['*.nsi', '*.nsh'] mimetypes = ['text/x-nsis'] + version_added = '1.6' flags = re.IGNORECASE @@ -147,14 +146,14 @@ class NSISLexer(RegexLexer): class RPMSpecLexer(RegexLexer): """ For RPM ``.spec`` files. - - .. versionadded:: 1.6 """ name = 'RPMSpec' aliases = ['spec'] filenames = ['*.spec'] mimetypes = ['text/x-rpm-spec'] + url = 'https://rpm-software-management.github.io/rpm/manual/spec.html' + version_added = '1.6' _directives = ('(?:package|prep|build|install|clean|check|pre[a-z]*|' 'post[a-z]*|trigger[a-z]*|files)') @@ -221,14 +220,14 @@ class RPMSpecLexer(RegexLexer): class SourcesListLexer(RegexLexer): """ Lexer that highlights debian sources.list files. - - .. versionadded:: 0.7 """ name = 'Debian Sourcelist' aliases = ['debsources', 'sourceslist', 'sources.list'] filenames = ['sources.list'] + version_added = '0.7' mimetype = ['application/x-debian-sourceslist'] + url = 'https://wiki.debian.org/SourcesList' tokens = { 'root': [ @@ -269,13 +268,12 @@ def analyse_text(text): class DebianControlLexer(RegexLexer): """ Lexer for Debian ``control`` files and ``apt-cache show <pkg>`` outputs. - - .. versionadded:: 0.9 """ name = 'Debian Control file' url = 'https://www.debian.org/doc/debian-policy/ch-controlfields.html' aliases = ['debcontrol', 'control'] filenames = ['control'] + version_added = '0.9' tokens = { 'root': [ diff --git a/libs/pygments/lexers/int_fiction.py b/libs/pygments/lexers/int_fiction.py index 4f4d55d6c..a7bc66756 100644 --- a/libs/pygments/lexers/int_fiction.py +++ b/libs/pygments/lexers/int_fiction.py @@ -4,7 +4,7 @@ Lexers for interactive fiction languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,14 +22,13 @@ class Inform6Lexer(RegexLexer): """ For Inform 6 source code. - - .. versionadded:: 2.0 """ name = 'Inform 6' url = 'http://inform-fiction.org/' aliases = ['inform6', 'i6'] filenames = ['*.inf'] + version_added = '2.0' flags = re.MULTILINE | re.DOTALL @@ -45,13 +44,13 @@ class Inform6Lexer(RegexLexer): tokens = { 'root': [ - (r'\A(!%%[^%s]*[%s])+' % (_newline, _newline), Comment.Preproc, + (rf'\A(!%[^{_newline}]*[{_newline}])+', Comment.Preproc, 'directive'), default('directive') ], '_whitespace': [ (r'\s+', Text), - (r'![^%s]*' % _newline, Comment.Single) + (rf'![^{_newline}]*', Comment.Single) ], 'default': [ include('_whitespace'), @@ -65,20 +64,20 @@ class Inform6Lexer(RegexLexer): '_expression': [ include('_whitespace'), (r'(?=sp\b)', Text, '#pop'), - (r'(?=[%s%s$0-9#a-zA-Z_])' % (_dquote, _squote), Text, + (rf'(?=[{_dquote}{_squote}$0-9#a-zA-Z_])', Text, ('#pop', 'value')), - (r'\+\+|[%s]{1,2}(?!>)|~~?' % _dash, Operator), - (r'(?=[()\[%s,?@{:;])' % _dash, Text, '#pop') + (rf'\+\+|[{_dash}]{{1,2}}(?!>)|~~?', Operator), + (rf'(?=[()\[{_dash},?@{{:;])', Text, '#pop') ], 'expression': [ include('_whitespace'), (r'\(', Punctuation, ('expression', '_expression')), (r'\)', Punctuation, '#pop'), (r'\[', Punctuation, ('#pop', 'statements', 'locals')), - (r'>(?=(\s+|(![^%s]*))*[>;])' % _newline, Punctuation), - (r'\+\+|[%s]{2}(?!>)' % _dash, Operator), + (rf'>(?=(\s+|(![^{_newline}]*))*[>;])', Punctuation), + (rf'\+\+|[{_dash}]{{2}}(?!>)', Operator), (r',', Punctuation, '_expression'), - (r'&&?|\|\|?|[=~><]?=|[%s]{1,2}>?|\.\.?[&#]?|::|[<>+*/%%]' % _dash, + (rf'&&?|\|\|?|[=~><]?=|[{_dash}]{{1,2}}>?|\.\.?[&#]?|::|[<>+*/%]', Operator, '_expression'), (r'(has|hasnt|in|notin|ofclass|or|provides)\b', Operator.Word, '_expression'), @@ -90,7 +89,7 @@ class Inform6Lexer(RegexLexer): '_assembly-expression': [ (r'\(', Punctuation, ('#push', '_expression')), (r'[\[\]]', Punctuation), - (r'[%s]>' % _dash, Punctuation, '_expression'), + (rf'[{_dash}]>', Punctuation, '_expression'), (r'sp\b', Keyword.Pseudo), (r';', Punctuation, '#pop:3'), include('expression') @@ -117,25 +116,25 @@ class Inform6Lexer(RegexLexer): 'value': [ include('_whitespace'), # Strings - (r'[%s][^@][%s]' % (_squote, _squote), String.Char, '#pop'), - (r'([%s])(@\{[0-9a-fA-F]*\})([%s])' % (_squote, _squote), + (rf'[{_squote}][^@][{_squote}]', String.Char, '#pop'), + (rf'([{_squote}])(@\{{[0-9a-fA-F]*\}})([{_squote}])', bygroups(String.Char, String.Escape, String.Char), '#pop'), - (r'([%s])(@.{2})([%s])' % (_squote, _squote), + (rf'([{_squote}])(@.{{2}})([{_squote}])', bygroups(String.Char, String.Escape, String.Char), '#pop'), - (r'[%s]' % _squote, String.Single, ('#pop', 'dictionary-word')), - (r'[%s]' % _dquote, String.Double, ('#pop', 'string')), + (rf'[{_squote}]', String.Single, ('#pop', 'dictionary-word')), + (rf'[{_dquote}]', String.Double, ('#pop', 'string')), # Numbers - (r'\$[<>]?[+%s][0-9]*\.?[0-9]*([eE][+%s]?[0-9]+)?' % (_dash, _dash), + (rf'\$[<>]?[+{_dash}][0-9]*\.?[0-9]*([eE][+{_dash}]?[0-9]+)?', Number.Float, '#pop'), (r'\$[0-9a-fA-F]+', Number.Hex, '#pop'), (r'\$\$[01]+', Number.Bin, '#pop'), (r'[0-9]+', Number.Integer, '#pop'), # Values prefixed by hashes - (r'(##|#a\$)(%s)' % _name, bygroups(Operator, Name), '#pop'), - (r'(#g\$)(%s)' % _name, + (rf'(##|#a\$)({_name})', bygroups(Operator, Name), '#pop'), + (rf'(#g\$)({_name})', bygroups(Operator, Name.Variable.Global), '#pop'), (r'#[nw]\$', Operator, ('#pop', 'obsolete-dictionary-word')), - (r'(#r\$)(%s)' % _name, bygroups(Operator, Name.Function), '#pop'), + (rf'(#r\$)({_name})', bygroups(Operator, Name.Function), '#pop'), (r'#', Name.Builtin, ('#pop', 'system-constant')), # System functions (words(( @@ -182,32 +181,31 @@ class Inform6Lexer(RegexLexer): ], # Strings 'dictionary-word': [ - (r'[~^]+', String.Escape), - (r'[^~^\\@({%s]+' % _squote, String.Single), - (r'[({]', String.Single), + (rf'[~^]+|//[^{_squote}]*', String.Escape), + (rf'[^~^/\\@({{{_squote}]+', String.Single), + (r'[/({]', String.Single), (r'@\{[0-9a-fA-F]*\}', String.Escape), (r'@.{2}', String.Escape), - (r'[%s]' % _squote, String.Single, '#pop') + (rf'[{_squote}]', String.Single, '#pop') ], 'string': [ (r'[~^]+', String.Escape), - (r'[^~^\\@({%s]+' % _dquote, String.Double), + (rf'[^~^\\@({{{_dquote}]+', String.Double), (r'[({]', String.Double), (r'\\', String.Escape), - (r'@(\\\s*[%s]\s*)*@((\\\s*[%s]\s*)*[0-9])*' % - (_newline, _newline), String.Escape), - (r'@(\\\s*[%s]\s*)*[({]((\\\s*[%s]\s*)*[0-9a-zA-Z_])*' - r'(\\\s*[%s]\s*)*[)}]' % (_newline, _newline, _newline), + (rf'@(\\\s*[{_newline}]\s*)*@((\\\s*[{_newline}]\s*)*[0-9])*', String.Escape), + (rf'@(\\\s*[{_newline}]\s*)*[({{]((\\\s*[{_newline}]\s*)*[0-9a-zA-Z_])*' + rf'(\\\s*[{_newline}]\s*)*[)}}]', String.Escape), - (r'@(\\\s*[%s]\s*)*.(\\\s*[%s]\s*)*.' % (_newline, _newline), + (rf'@(\\\s*[{_newline}]\s*)*.(\\\s*[{_newline}]\s*)*.', String.Escape), - (r'[%s]' % _dquote, String.Double, '#pop') + (rf'[{_dquote}]', String.Double, '#pop') ], 'plain-string': [ - (r'[^~^\\({\[\]%s]+' % _dquote, String.Double), + (rf'[^~^\\({{\[\]{_dquote}]+', String.Double), (r'[~^({\[\]]', String.Double), (r'\\', String.Escape), - (r'[%s]' % _dquote, String.Double, '#pop') + (rf'[{_dquote}]', String.Double, '#pop') ], # Names '_constant': [ @@ -326,7 +324,7 @@ class Inform6Lexer(RegexLexer): default('#pop') ], '_object-head': [ - (r'[%s]>' % _dash, Punctuation), + (rf'[{_dash}]>', Punctuation), (r'(class|has|private|with)\b', Keyword.Declaration, '#pop'), include('_global') ], @@ -356,7 +354,7 @@ class Inform6Lexer(RegexLexer): include('_whitespace'), (r';', Punctuation, '#pop'), (r'[/*]', Punctuation), - (r'[%s]>' % _dash, Punctuation, 'value'), + (rf'[{_dash}]>', Punctuation, 'value'), (r'(noun|scope)\b', Keyword, '=routine'), default('_directive-keyword') ], @@ -376,12 +374,12 @@ class Inform6Lexer(RegexLexer): # Include, Link, Message 'diagnostic': [ include('_whitespace'), - (r'[%s]' % _dquote, String.Double, ('#pop', 'message-string')), + (rf'[{_dquote}]', String.Double, ('#pop', 'message-string')), default(('#pop', 'before-plain-string?', 'directive-keyword?')) ], 'before-plain-string?': [ include('_whitespace'), - (r'[%s]' % _dquote, String.Double, ('#pop', 'plain-string')), + (rf'[{_dquote}]', String.Double, ('#pop', 'plain-string')), default('#pop') ], 'message-string': [ @@ -400,7 +398,7 @@ class Inform6Lexer(RegexLexer): 'terminating', 'time', 'topic', 'warning', 'with'), suffix=r'\b'), Keyword, '#pop'), (r'static\b', Keyword), - (r'[%s]{1,2}>|[+=]' % _dash, Punctuation, '#pop') + (rf'[{_dash}]{{1,2}}>|[+=]', Punctuation, '#pop') ], '_directive-keyword': [ include('_directive-keyword!'), @@ -413,7 +411,7 @@ class Inform6Lexer(RegexLexer): 'property-keyword*': [ include('_whitespace'), (words(('additive', 'individual', 'long'), - suffix=r'\b(?=(\s*|(![^%s]*[%s]))*[_a-zA-Z])' % (_newline, _newline)), + suffix=rf'\b(?=(\s*|(![^{_newline}]*[{_newline}]))*[_a-zA-Z])'), Keyword), default('#pop') ], @@ -445,7 +443,7 @@ class Inform6Lexer(RegexLexer): (r'(jump|save|restore)\b', Keyword, ('default', 'label?')), (r'objectloop\b', Keyword, ('_keyword-expression', 'variable?', '(?')), - (r'print(_ret)?\b|(?=[%s])' % _dquote, Keyword, 'print-list'), + (rf'print(_ret)?\b|(?=[{_dquote}])', Keyword, 'print-list'), (r'\.', Name.Label, 'label?'), (r'@', Keyword, 'opcode'), (r'#(?![agrnw]\$|#)', Punctuation, 'directive'), @@ -459,9 +457,9 @@ class Inform6Lexer(RegexLexer): (r'(bold|fixed|from|near|off|on|reverse|roman|to|underline)\b', Keyword, '#pop'), (r'(a|A|an|address|char|name|number|object|property|string|the|' - r'The)\b(?=(\s+|(![^%s]*))*\))' % _newline, Keyword.Pseudo, + rf'The)\b(?=(\s+|(![^{_newline}]*))*\))', Keyword.Pseudo, '#pop'), - (r'%s(?=(\s+|(![^%s]*))*\))' % (_name, _newline), Name.Function, + (rf'{_name}(?=(\s+|(![^{_newline}]*))*\))', Name.Function, '#pop'), default('#pop') ], @@ -490,7 +488,8 @@ class Inform6Lexer(RegexLexer): # Assembly 'opcode': [ include('_whitespace'), - (r'[%s]' % _dquote, String.Double, ('operands', 'plain-string')), + (rf'[{_dquote}]', String.Double, ('operands', 'plain-string')), + (rf'[{_dash}]{{1,2}}>', Punctuation, 'operands'), (_name, Keyword, 'operands') ], 'operands': [ @@ -543,21 +542,20 @@ def analyse_text(text): class Inform7Lexer(RegexLexer): """ For Inform 7 source code. - - .. versionadded:: 2.0 """ name = 'Inform 7' url = 'http://inform7.com/' aliases = ['inform7', 'i7'] filenames = ['*.ni', '*.i7x'] + version_added = '2.0' flags = re.MULTILINE | re.DOTALL _dash = Inform6Lexer._dash _dquote = Inform6Lexer._dquote _newline = Inform6Lexer._newline - _start = r'\A|(?<=[%s])' % _newline + _start = rf'\A|(?<=[{_newline}])' # There are three variants of Inform 7, differing in how to # interpret at signs and braces in I6T. In top-level inclusions, at @@ -571,47 +569,46 @@ class Inform7Lexer(RegexLexer): tokens[level] = { '+i6-root': list(Inform6Lexer.tokens['root']), '+i6t-root': [ # For Inform6TemplateLexer - (r'[^%s]*' % Inform6Lexer._newline, Comment.Preproc, + (rf'[^{Inform6Lexer._newline}]*', Comment.Preproc, ('directive', '+p')) ], 'root': [ (r'(\|?\s)+', Text), (r'\[', Comment.Multiline, '+comment'), - (r'[%s]' % _dquote, Generic.Heading, + (rf'[{_dquote}]', Generic.Heading, ('+main', '+titling', '+titling-string')), default(('+main', '+heading?')) ], '+titling-string': [ - (r'[^%s]+' % _dquote, Generic.Heading), - (r'[%s]' % _dquote, Generic.Heading, '#pop') + (rf'[^{_dquote}]+', Generic.Heading), + (rf'[{_dquote}]', Generic.Heading, '#pop') ], '+titling': [ (r'\[', Comment.Multiline, '+comment'), - (r'[^%s.;:|%s]+' % (_dquote, _newline), Generic.Heading), - (r'[%s]' % _dquote, Generic.Heading, '+titling-string'), - (r'[%s]{2}|(?<=[\s%s])\|[\s%s]' % (_newline, _dquote, _dquote), + (rf'[^{_dquote}.;:|{_newline}]+', Generic.Heading), + (rf'[{_dquote}]', Generic.Heading, '+titling-string'), + (rf'[{_newline}]{{2}}|(?<=[\s{_dquote}])\|[\s{_dquote}]', Text, ('#pop', '+heading?')), - (r'[.;:]|(?<=[\s%s])\|' % _dquote, Text, '#pop'), - (r'[|%s]' % _newline, Generic.Heading) + (rf'[.;:]|(?<=[\s{_dquote}])\|', Text, '#pop'), + (rf'[|{_newline}]', Generic.Heading) ], '+main': [ - (r'(?i)[^%s:a\[(|%s]+' % (_dquote, _newline), Text), - (r'[%s]' % _dquote, String.Double, '+text'), + (rf'(?i)[^{_dquote}:a\[(|{_newline}]+', Text), + (rf'[{_dquote}]', String.Double, '+text'), (r':', Text, '+phrase-definition'), (r'(?i)\bas\b', Text, '+use-option'), (r'\[', Comment.Multiline, '+comment'), - (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash), + (rf'(\([{_dash}])(.*?)([{_dash}]\))', bygroups(Punctuation, using(this, state=('+i6-root', 'directive'), i6t='+i6t-not-inline'), Punctuation)), - (r'(%s|(?<=[\s;:.%s]))\|\s|[%s]{2,}' % - (_start, _dquote, _newline), Text, '+heading?'), - (r'(?i)[a(|%s]' % _newline, Text) + (rf'({_start}|(?<=[\s;:.{_dquote}]))\|\s|[{_newline}]{{2,}}', Text, '+heading?'), + (rf'(?i)[a(|{_newline}]', Text) ], '+phrase-definition': [ (r'\s+', Text), (r'\[', Comment.Multiline, '+comment'), - (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash), + (rf'(\([{_dash}])(.*?)([{_dash}]\))', bygroups(Punctuation, using(this, state=('+i6-root', 'directive', 'default', 'statements'), @@ -621,7 +618,7 @@ class Inform7Lexer(RegexLexer): '+use-option': [ (r'\s+', Text), (r'\[', Comment.Multiline, '+comment'), - (r'(\([%s])(.*?)([%s]\))' % (_dash, _dash), + (rf'(\([{_dash}])(.*?)([{_dash}]\))', bygroups(Punctuation, using(this, state=('+i6-root', 'directive'), i6t='+i6t-use-option'), Punctuation), '#pop'), @@ -633,16 +630,16 @@ class Inform7Lexer(RegexLexer): (r'\]', Comment.Multiline, '#pop') ], '+text': [ - (r'[^\[%s]+' % _dquote, String.Double), + (rf'[^\[{_dquote}]+', String.Double), (r'\[.*?\]', String.Interpol), - (r'[%s]' % _dquote, String.Double, '#pop') + (rf'[{_dquote}]', String.Double, '#pop') ], '+heading?': [ (r'(\|?\s)+', Text), (r'\[', Comment.Multiline, '+comment'), - (r'[%s]{4}\s+' % _dash, Text, '+documentation-heading'), - (r'[%s]{1,3}' % _dash, Text), - (r'(?i)(volume|book|part|chapter|section)\b[^%s]*' % _newline, + (rf'[{_dash}]{{4}}\s+', Text, '+documentation-heading'), + (rf'[{_dash}]{{1,3}}', Text), + (rf'(?i)(volume|book|part|chapter|section)\b[^{_newline}]*', Generic.Heading, '#pop'), default('#pop') ], @@ -655,25 +652,24 @@ class Inform7Lexer(RegexLexer): '+documentation-heading2': [ (r'\s+', Text), (r'\[', Comment.Multiline, '+comment'), - (r'[%s]{4}\s' % _dash, Text, '+documentation'), + (rf'[{_dash}]{{4}}\s', Text, '+documentation'), default('#pop:2') ], '+documentation': [ - (r'(?i)(%s)\s*(chapter|example)\s*:[^%s]*' % - (_start, _newline), Generic.Heading), - (r'(?i)(%s)\s*section\s*:[^%s]*' % (_start, _newline), + (rf'(?i)({_start})\s*(chapter|example)\s*:[^{_newline}]*', Generic.Heading), + (rf'(?i)({_start})\s*section\s*:[^{_newline}]*', Generic.Subheading), - (r'((%s)\t.*?[%s])+' % (_start, _newline), + (rf'(({_start})\t.*?[{_newline}])+', using(this, state='+main')), - (r'[^%s\[]+|[%s\[]' % (_newline, _newline), Text), + (rf'[^{_newline}\[]+|[{_newline}\[]', Text), (r'\[', Comment.Multiline, '+comment'), ], '+i6t-not-inline': [ - (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline), + (rf'({_start})@c( .*?)?([{_newline}]|\Z)', Comment.Preproc), - (r'(%s)@([%s]+|Purpose:)[^%s]*' % (_start, _dash, _newline), + (rf'({_start})@([{_dash}]+|Purpose:)[^{_newline}]*', Comment.Preproc), - (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline), + (rf'({_start})@p( .*?)?([{_newline}]|\Z)', Generic.Heading, '+p') ], '+i6t-use-option': [ @@ -686,12 +682,12 @@ class Inform7Lexer(RegexLexer): Punctuation)) ], '+i6t': [ - (r'(\{[%s])(![^}]*)(\}?)' % _dash, + (rf'(\{{[{_dash}])(![^}}]*)(\}}?)', bygroups(Punctuation, Comment.Single, Punctuation)), - (r'(\{[%s])(lines)(:)([^}]*)(\}?)' % _dash, + (rf'(\{{[{_dash}])(lines)(:)([^}}]*)(\}}?)', bygroups(Punctuation, Keyword, Punctuation, Text, Punctuation), '+lines'), - (r'(\{[%s])([^:}]*)(:?)([^}]*)(\}?)' % _dash, + (rf'(\{{[{_dash}])([^:}}]*)(:?)([^}}]*)(\}}?)', bygroups(Punctuation, Keyword, Punctuation, Text, Punctuation)), (r'(\(\+)(.*?)(\+\)|\Z)', @@ -700,25 +696,25 @@ class Inform7Lexer(RegexLexer): ], '+p': [ (r'[^@]+', Comment.Preproc), - (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline), + (rf'({_start})@c( .*?)?([{_newline}]|\Z)', Comment.Preproc, '#pop'), - (r'(%s)@([%s]|Purpose:)' % (_start, _dash), Comment.Preproc), - (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline), + (rf'({_start})@([{_dash}]|Purpose:)', Comment.Preproc), + (rf'({_start})@p( .*?)?([{_newline}]|\Z)', Generic.Heading), (r'@', Comment.Preproc) ], '+lines': [ - (r'(%s)@c( .*?)?([%s]|\Z)' % (_start, _newline), + (rf'({_start})@c( .*?)?([{_newline}]|\Z)', Comment.Preproc), - (r'(%s)@([%s]|Purpose:)[^%s]*' % (_start, _dash, _newline), + (rf'({_start})@([{_dash}]|Purpose:)[^{_newline}]*', Comment.Preproc), - (r'(%s)@p( .*?)?([%s]|\Z)' % (_start, _newline), + (rf'({_start})@p( .*?)?([{_newline}]|\Z)', Generic.Heading, '+p'), - (r'(%s)@\w*[ %s]' % (_start, _newline), Keyword), - (r'![^%s]*' % _newline, Comment.Single), - (r'(\{)([%s]endlines)(\})' % _dash, + (rf'({_start})@\w*[ {_newline}]', Keyword), + (rf'![^{_newline}]*', Comment.Single), + (rf'(\{{)([{_dash}]endlines)(\}})', bygroups(Punctuation, Keyword, Punctuation), '#pop'), - (r'[^@!{]+?([%s]|\Z)|.' % _newline, Text) + (rf'[^@!{{]+?([{_newline}]|\Z)|.', Text) ] } # Inform 7 can include snippets of Inform 6 template language, @@ -747,13 +743,12 @@ def __init__(self, **options): class Inform6TemplateLexer(Inform7Lexer): """ For Inform 6 template code. - - .. versionadded:: 2.0 """ name = 'Inform 6 template' aliases = ['i6t'] filenames = ['*.i6t'] + version_added = '2.0' def get_tokens_unprocessed(self, text, stack=('+i6t-root',)): return Inform7Lexer.get_tokens_unprocessed(self, text, stack) @@ -767,6 +762,8 @@ class Tads3Lexer(RegexLexer): name = 'TADS 3' aliases = ['tads3'] filenames = ['*.t'] + url = 'https://www.tads.org' + version_added = '' flags = re.DOTALL | re.MULTILINE @@ -778,55 +775,50 @@ class Tads3Lexer(RegexLexer): _no_quote = r'(?=\s|\\?>)' _operator = (r'(?:&&|\|\||\+\+|--|\?\?|::|[.,@\[\]~]|' r'(?:[=+\-*/%!&|^]|<<?|>>?>?)=?)') - _ws = r'(?:\\|\s|%s|%s)' % (_comment_single, _comment_multiline) - _ws_pp = r'(?:\\\n|[^\S\n]|%s|%s)' % (_comment_single, _comment_multiline) + _ws = rf'(?:\\|\s|{_comment_single}|{_comment_multiline})' + _ws_pp = rf'(?:\\\n|[^\S\n]|{_comment_single}|{_comment_multiline})' def _make_string_state(triple, double, verbatim=None, _escape=_escape): if verbatim: - verbatim = ''.join(['(?:%s|%s)' % (re.escape(c.lower()), - re.escape(c.upper())) + verbatim = ''.join([f'(?:{re.escape(c.lower())}|{re.escape(c.upper())})' for c in verbatim]) char = r'"' if double else r"'" token = String.Double if double else String.Single - escaped_quotes = r'+|%s(?!%s{2})' % (char, char) if triple else r'' - prefix = '%s%s' % ('t' if triple else '', 'd' if double else 's') - tag_state_name = '%sqt' % prefix + escaped_quotes = rf'+|{char}(?!{char}{{2}})' if triple else r'' + prefix = '{}{}'.format('t' if triple else '', 'd' if double else 's') + tag_state_name = f'{prefix}qt' state = [] if triple: state += [ - (r'%s{3,}' % char, token, '#pop'), - (r'\\%s+' % char, String.Escape), + (rf'{char}{{3,}}', token, '#pop'), + (rf'\\{char}+', String.Escape), (char, token) ] else: state.append((char, token, '#pop')) state += [ include('s/verbatim'), - (r'[^\\<&{}%s]+' % char, token) + (rf'[^\\<&{{}}{char}]+', token) ] if verbatim: # This regex can't use `(?i)` because escape sequences are # case-sensitive. `<\XMP>` works; `<\xmp>` doesn't. - state.append((r'\\?<(/|\\\\|(?!%s)\\)%s(?=[\s=>])' % - (_escape, verbatim), - Name.Tag, ('#pop', '%sqs' % prefix, tag_state_name))) + state.append((rf'\\?<(/|\\\\|(?!{_escape})\\){verbatim}(?=[\s=>])', + Name.Tag, ('#pop', f'{prefix}qs', tag_state_name))) else: state += [ - (r'\\?<!([^><\\%s]|<(?!<)|\\%s%s|%s|\\.)*>?' % - (char, char, escaped_quotes, _escape), Comment.Multiline), + (rf'\\?<!([^><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*>?', Comment.Multiline), (r'(?i)\\?<listing(?=[\s=>]|\\>)', Name.Tag, - ('#pop', '%sqs/listing' % prefix, tag_state_name)), + ('#pop', f'{prefix}qs/listing', tag_state_name)), (r'(?i)\\?<xmp(?=[\s=>]|\\>)', Name.Tag, - ('#pop', '%sqs/xmp' % prefix, tag_state_name)), - (r'\\?<([^\s=><\\%s]|<(?!<)|\\%s%s|%s|\\.)*' % - (char, char, escaped_quotes, _escape), Name.Tag, + ('#pop', f'{prefix}qs/xmp', tag_state_name)), + (rf'\\?<([^\s=><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*', Name.Tag, tag_state_name), include('s/entity') ] state += [ include('s/escape'), - (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' % - (char, char, escaped_quotes, _escape), String.Interpol), + (rf'\{{([^}}<\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol), (r'[\\&{}<]', token) ] return state @@ -834,22 +826,20 @@ def _make_string_state(triple, double, verbatim=None, _escape=_escape): def _make_tag_state(triple, double, _escape=_escape): char = r'"' if double else r"'" quantifier = r'{3,}' if triple else r'' - state_name = '%s%sqt' % ('t' if triple else '', 'd' if double else 's') + state_name = '{}{}qt'.format('t' if triple else '', 'd' if double else 's') token = String.Double if double else String.Single - escaped_quotes = r'+|%s(?!%s{2})' % (char, char) if triple else r'' + escaped_quotes = rf'+|{char}(?!{char}{{2}})' if triple else r'' return [ - (r'%s%s' % (char, quantifier), token, '#pop:2'), + (rf'{char}{quantifier}', token, '#pop:2'), (r'(\s|\\\n)+', Text), (r'(=)(\\?")', bygroups(Punctuation, String.Double), - 'dqs/%s' % state_name), + f'dqs/{state_name}'), (r"(=)(\\?')", bygroups(Punctuation, String.Single), - 'sqs/%s' % state_name), - (r'=', Punctuation, 'uqs/%s' % state_name), + f'sqs/{state_name}'), + (r'=', Punctuation, f'uqs/{state_name}'), (r'\\?>', Name.Tag, '#pop'), - (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' % - (char, char, escaped_quotes, _escape), String.Interpol), - (r'([^\s=><\\%s]|<(?!<)|\\%s%s|%s|\\.)+' % - (char, char, escaped_quotes, _escape), Name.Attribute), + (rf'\{{([^}}<\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol), + (rf'([^\s=><\\{char}]|<(?!<)|\\{char}{escaped_quotes}|{_escape}|\\.)+', Name.Attribute), include('s/escape'), include('s/verbatim'), include('s/entity'), @@ -863,16 +853,15 @@ def _make_attribute_value_state(terminator, host_triple, host_double, host_char = r'"' if host_double else r"'" host_quantifier = r'{3,}' if host_triple else r'' host_token = String.Double if host_double else String.Single - escaped_quotes = (r'+|%s(?!%s{2})' % (host_char, host_char) + escaped_quotes = (rf'+|{host_char}(?!{host_char}{{2}})' if host_triple else r'') return [ - (r'%s%s' % (host_char, host_quantifier), host_token, '#pop:3'), - (r'%s%s' % (r'' if token is String.Other else r'\\?', terminator), + (rf'{host_char}{host_quantifier}', host_token, '#pop:3'), + (r'{}{}'.format(r'' if token is String.Other else r'\\?', terminator), token, '#pop'), include('s/verbatim'), include('s/entity'), - (r'\{([^}<\\%s]|<(?!<)|\\%s%s|%s|\\.)*\}' % - (host_char, host_char, escaped_quotes, _escape), String.Interpol), + (rf'\{{([^}}<\\{host_char}]|<(?!<)|\\{host_char}{escaped_quotes}|{_escape}|\\.)*\}}', String.Interpol), (r'([^\s"\'<%s{}\\&])+' % (r'>' if token is String.Other else r''), token), include('s/escape'), @@ -888,7 +877,7 @@ def _make_attribute_value_state(terminator, host_triple, host_double, r'delegated|do|else|for|foreach|finally|goto|if|inherited|' r'invokee|local|nil|new|operator|replaced|return|self|switch|' r'targetobj|targetprop|throw|true|try|while)\b)', Text, 'block'), - (r'(%s)(%s*)(\()' % (_name, _ws), + (rf'({_name})({_ws}*)(\()', bygroups(Name.Function, using(this, state='whitespace'), Punctuation), ('block?/root', 'more/parameters', 'main/parameters')), @@ -911,24 +900,24 @@ def _make_attribute_value_state(terminator, host_triple, host_double, (r'\{', Punctuation, '#push'), (r'\}', Punctuation, '#pop'), (r':', Punctuation, ('classes', 'class')), - (r'(%s?)(%s*)(\()' % (_name, _ws), + (rf'({_name}?)({_ws}*)(\()', bygroups(Name.Function, using(this, state='whitespace'), Punctuation), ('block?', 'more/parameters', 'main/parameters')), - (r'(%s)(%s*)(\{)' % (_name, _ws), + (rf'({_name})({_ws}*)(\{{)', bygroups(Name.Function, using(this, state='whitespace'), Punctuation), 'block'), - (r'(%s)(%s*)(:)' % (_name, _ws), + (rf'({_name})({_ws}*)(:)', bygroups(Name.Variable, using(this, state='whitespace'), Punctuation), ('object-body/no-braces', 'classes', 'class')), include('whitespace'), - (r'->|%s' % _operator, Punctuation, 'main'), + (rf'->|{_operator}', Punctuation, 'main'), default('main/object-body') ], 'main/object-body': [ include('main/basic'), - (r'(%s)(%s*)(=?)' % (_name, _ws), + (rf'({_name})({_ws}*)(=?)', bygroups(Name.Variable, using(this, state='whitespace'), Punctuation), ('#pop', 'more', 'main')), default('#pop:2') @@ -951,7 +940,7 @@ def _make_attribute_value_state(terminator, host_triple, host_double, (r'\{', Punctuation, '#push'), (r'\}', Punctuation, '#pop'), (r'default\b', Keyword.Reserved), - (r'(%s)(%s*)(:)' % (_name, _ws), + (rf'({_name})({_ws}*)(:)', bygroups(Name.Label, using(this, state='whitespace'), Punctuation)), include('whitespace') @@ -986,23 +975,23 @@ def _make_attribute_value_state(terminator, host_triple, host_double, (r'R"', String.Regex, ('#pop', 'dqr')), (r"R'", String.Regex, ('#pop', 'sqr')), # Two-token keywords - (r'(extern)(%s+)(object\b)' % _ws, + (rf'(extern)({_ws}+)(object\b)', bygroups(Keyword.Reserved, using(this, state='whitespace'), Keyword.Reserved)), - (r'(function|method)(%s*)(\()' % _ws, + (rf'(function|method)({_ws}*)(\()', bygroups(Keyword.Reserved, using(this, state='whitespace'), Punctuation), ('#pop', 'block?', 'more/parameters', 'main/parameters')), - (r'(modify)(%s+)(grammar\b)' % _ws, + (rf'(modify)({_ws}+)(grammar\b)', bygroups(Keyword.Reserved, using(this, state='whitespace'), Keyword.Reserved), ('#pop', 'object-body/no-braces', ':', 'grammar')), - (r'(new)(%s+(?=(?:function|method)\b))' % _ws, + (rf'(new)({_ws}+(?=(?:function|method)\b))', bygroups(Keyword.Reserved, using(this, state='whitespace'))), - (r'(object)(%s+)(template\b)' % _ws, + (rf'(object)({_ws}+)(template\b)', bygroups(Keyword.Reserved, using(this, state='whitespace'), Keyword.Reserved), ('#pop', 'template')), - (r'(string)(%s+)(template\b)' % _ws, + (rf'(string)({_ws}+)(template\b)', bygroups(Keyword, using(this, state='whitespace'), Keyword.Reserved), ('#pop', 'function-name')), # Keywords @@ -1039,7 +1028,7 @@ def _make_attribute_value_state(terminator, host_triple, host_double, (r'self\b', Name.Builtin.Pseudo, '#pop'), (r'template\b', Keyword.Reserved, ('#pop', 'template')), # Operators - (r'(__objref|defined)(%s*)(\()' % _ws, + (rf'(__objref|defined)({_ws}*)(\()', bygroups(Operator.Word, using(this, state='whitespace'), Operator), ('#pop', 'more/__objref', 'main')), (r'delegated\b', Operator.Word), @@ -1065,7 +1054,7 @@ def _make_attribute_value_state(terminator, host_triple, host_double, include('whitespace'), (_operator, Operator, 'main'), (r'\?', Operator, ('main', 'more/conditional', 'main')), - (r'(is|not)(%s+)(in\b)' % _ws, + (rf'(is|not)({_ws}+)(in\b)', bygroups(Operator.Word, using(this, state='whitespace'), Operator.Word)), (r'[^\s!"%-_a-z{-~]+', Error) # Averts an infinite loop @@ -1112,9 +1101,9 @@ def _make_attribute_value_state(terminator, host_triple, host_double, ], # Parameter list 'main/parameters': [ - (r'(%s)(%s*)(?=:)' % (_name, _ws), + (rf'({_name})({_ws}*)(?=:)', bygroups(Name.Variable, using(this, state='whitespace')), '#pop'), - (r'(%s)(%s+)(%s)' % (_name, _ws, _name), + (rf'({_name})({_ws}+)({_name})', bygroups(Name.Class, using(this, state='whitespace'), Name.Variable), '#pop'), (r'\[+', Punctuation), @@ -1123,7 +1112,7 @@ def _make_attribute_value_state(terminator, host_triple, host_double, default('#pop') ], 'more/parameters': [ - (r'(:)(%s*(?=[?=,:)]))' % _ws, + (rf'(:)({_ws}*(?=[?=,:)]))', bygroups(Punctuation, using(this, state='whitespace'))), (r'[?\]]+', Punctuation), (r'[:)]', Punctuation, ('#pop', 'multimethod?')), @@ -1181,10 +1170,10 @@ def _make_attribute_value_state(terminator, host_triple, host_double, 'grammar-rules': [ include('string'), include('whitespace'), - (r'(\[)(%s*)(badness)' % _ws, + (rf'(\[)({_ws}*)(badness)', bygroups(Punctuation, using(this, state='whitespace'), Keyword), 'main'), - (r'->|%s|[()]' % _operator, Punctuation), + (rf'->|{_operator}|[()]', Punctuation), (_name, Name.Constant), default('#pop:2') ], @@ -1193,7 +1182,7 @@ def _make_attribute_value_state(terminator, host_triple, host_double, ], 'function-name': [ (r'(<<([^>]|>>>|>(?!>))*>>)+', String.Interpol), - (r'(?=%s?%s*[({])' % (_name, _ws), Text, '#pop'), + (rf'(?={_name}?{_ws}*[({{])', Text, '#pop'), (_name, Name.Function, '#pop'), include('whitespace') ], @@ -1219,7 +1208,7 @@ def _make_attribute_value_state(terminator, host_triple, host_double, include('string'), (r'inherited\b', Keyword.Reserved), include('whitespace'), - (r'->|\?|%s' % _operator, Punctuation), + (rf'->|\?|{_operator}', Punctuation), (_name, Name.Variable) ], @@ -1259,11 +1248,11 @@ def _make_attribute_value_state(terminator, host_triple, host_double, # Whitespace and comments 'whitespace': [ - (r'^%s*#(%s|[^\n]|(?<=\\)\n)*\n?' % (_ws_pp, _comment_multiline), + (rf'^{_ws_pp}*#({_comment_multiline}|[^\n]|(?<=\\)\n)*\n?', Comment.Preproc), (_comment_single, Comment.Single), (_comment_multiline, Comment.Multiline), - (r'\\+\n+%s*#?|\n+|([^\S\n]|\\)+' % _ws_pp, Text) + (rf'\\+\n+{_ws_pp}*#?|\n+|([^\S\n]|\\)+', Text) ], # Strings @@ -1274,15 +1263,15 @@ def _make_attribute_value_state(terminator, host_triple, host_double, (r"'", String.Single, 'sqs') ], 's/escape': [ - (r'\{\{|\}\}|%s' % _escape, String.Escape) + (rf'\{{\{{|\}}\}}|{_escape}', String.Escape) ], 's/verbatim': [ (r'<<\s*(as\s+decreasingly\s+likely\s+outcomes|cycling|else|end|' r'first\s+time|one\s+of|only|or|otherwise|' r'(sticky|(then\s+)?(purely\s+)?at)\s+random|stopping|' r'(then\s+)?(half\s+)?shuffled|\|\|)\s*>>', String.Interpol), - (r'<<(%%(_(%s|\\?.)|[\-+ ,#]|\[\d*\]?)*\d*\.?\d*(%s|\\?.)|' - r'\s*((else|otherwise)\s+)?(if|unless)\b)?' % (_escape, _escape), + (rf'<<(%(_({_escape}|\\?.)|[\-+ ,#]|\[\d*\]?)*\d*\.?\d*({_escape}|\\?.)|' + r'\s*((else|otherwise)\s+)?(if|unless)\b)?', String.Interpol, ('block/embed', 'more/embed', 'main')) ], 's/entity': [ @@ -1345,23 +1334,22 @@ def _make_attribute_value_state(terminator, host_triple, host_double, } def get_tokens_unprocessed(self, text, **kwargs): - pp = r'^%s*#%s*' % (self._ws_pp, self._ws_pp) + pp = rf'^{self._ws_pp}*#{self._ws_pp}*' if_false_level = 0 for index, token, value in ( RegexLexer.get_tokens_unprocessed(self, text, **kwargs)): if if_false_level == 0: # Not in a false #if if (token is Comment.Preproc and - re.match(r'%sif%s+(0|nil)%s*$\n?' % - (pp, self._ws_pp, self._ws_pp), value)): + re.match(rf'{pp}if{self._ws_pp}+(0|nil){self._ws_pp}*$\n?', value)): if_false_level = 1 else: # In a false #if if token is Comment.Preproc: if (if_false_level == 1 and - re.match(r'%sel(if|se)\b' % pp, value)): + re.match(rf'{pp}el(if|se)\b', value)): if_false_level = 0 - elif re.match(r'%sif' % pp, value): + elif re.match(rf'{pp}if', value): if_false_level += 1 - elif re.match(r'%sendif\b' % pp, value): + elif re.match(rf'{pp}endif\b', value): if_false_level -= 1 else: token = Comment diff --git a/libs/pygments/lexers/iolang.py b/libs/pygments/lexers/iolang.py index 268fbde61..119ce6b21 100644 --- a/libs/pygments/lexers/iolang.py +++ b/libs/pygments/lexers/iolang.py @@ -4,7 +4,7 @@ Lexers for the Io language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class IoLexer(RegexLexer): """ For Io (a small, prototype-based programming language) source. - - .. versionadded:: 0.10 """ name = 'Io' url = 'http://iolanguage.com/' filenames = ['*.io'] aliases = ['io'] mimetypes = ['text/x-iosrc'] + version_added = '0.10' tokens = { 'root': [ (r'\n', Whitespace), diff --git a/libs/pygments/lexers/j.py b/libs/pygments/lexers/j.py index e99363cb0..959e8ca50 100644 --- a/libs/pygments/lexers/j.py +++ b/libs/pygments/lexers/j.py @@ -4,7 +4,7 @@ Lexer for the J programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,8 +18,6 @@ class JLexer(RegexLexer): """ For J source code. - - .. versionadded:: 2.1 """ name = 'J' @@ -27,6 +25,7 @@ class JLexer(RegexLexer): aliases = ['j'] filenames = ['*.ijs'] mimetypes = ['text/x-j'] + version_added = '2.1' validName = r'\b[a-zA-Z]\w*' diff --git a/libs/pygments/lexers/javascript.py b/libs/pygments/lexers/javascript.py index bc5e2e43c..ea7bd10ca 100644 --- a/libs/pygments/lexers/javascript.py +++ b/libs/pygments/lexers/javascript.py @@ -4,7 +4,7 @@ Lexers for JavaScript and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -41,6 +41,7 @@ class JavascriptLexer(RegexLexer): filenames = ['*.js', '*.jsm', '*.mjs', '*.cjs'] mimetypes = ['application/javascript', 'application/x-javascript', 'text/x-javascript', 'text/javascript'] + version_added = '' flags = re.DOTALL | re.MULTILINE @@ -137,8 +138,6 @@ class JavascriptLexer(RegexLexer): class TypeScriptLexer(JavascriptLexer): """ For TypeScript source code. - - .. versionadded:: 1.6 """ name = 'TypeScript' @@ -146,6 +145,7 @@ class TypeScriptLexer(JavascriptLexer): aliases = ['typescript', 'ts'] filenames = ['*.ts'] mimetypes = ['application/x-typescript', 'text/x-typescript'] + version_added = '1.6' # Higher priority than the TypoScriptLexer, as TypeScript is far more # common these days @@ -175,8 +175,6 @@ class TypeScriptLexer(JavascriptLexer): class KalLexer(RegexLexer): """ For Kal source code. - - .. versionadded:: 2.0 """ name = 'Kal' @@ -184,6 +182,7 @@ class KalLexer(RegexLexer): aliases = ['kal'] filenames = ['*.kal'] mimetypes = ['text/kal', 'application/kal'] + version_added = '2.0' flags = re.DOTALL tokens = { @@ -309,8 +308,6 @@ class KalLexer(RegexLexer): class LiveScriptLexer(RegexLexer): """ For LiveScript source code. - - .. versionadded:: 1.6 """ name = 'LiveScript' @@ -318,6 +315,7 @@ class LiveScriptLexer(RegexLexer): aliases = ['livescript', 'live-script'] filenames = ['*.ls'] mimetypes = ['text/livescript'] + version_added = '1.6' flags = re.DOTALL tokens = { @@ -422,8 +420,6 @@ class LiveScriptLexer(RegexLexer): class DartLexer(RegexLexer): """ For Dart source code. - - .. versionadded:: 1.5 """ name = 'Dart' @@ -431,6 +427,7 @@ class DartLexer(RegexLexer): aliases = ['dart'] filenames = ['*.dart'] mimetypes = ['text/x-dart'] + version_added = '1.5' flags = re.MULTILINE | re.DOTALL @@ -537,15 +534,16 @@ class LassoLexer(RegexLexer): `requiredelimiters` If given and ``True``, only highlight code between delimiters as Lasso (default: ``False``). - - .. versionadded:: 1.6 """ name = 'Lasso' aliases = ['lasso', 'lassoscript'] filenames = ['*.lasso', '*.lasso[89]'] + version_added = '1.6' alias_filenames = ['*.incl', '*.inc', '*.las'] mimetypes = ['text/x-lasso'] + url = 'https://www.lassosoft.com' + flags = re.IGNORECASE | re.DOTALL | re.MULTILINE tokens = { @@ -790,14 +788,14 @@ def analyse_text(text): class ObjectiveJLexer(RegexLexer): """ For Objective-J source code with preprocessor directives. - - .. versionadded:: 1.3 """ name = 'Objective-J' aliases = ['objective-j', 'objectivej', 'obj-j', 'objj'] filenames = ['*.j'] mimetypes = ['text/x-objective-j'] + url = 'https://www.cappuccino.dev/learn/objective-j.html' + version_added = '1.3' #: optional Comment or Whitespace _ws = r'(?:\s|//[^\n]*\n|/[*](?:[^*]|[*][^/])*[*]/)*' @@ -1013,8 +1011,6 @@ def analyse_text(text): class CoffeeScriptLexer(RegexLexer): """ For CoffeeScript source code. - - .. versionadded:: 1.3 """ name = 'CoffeeScript' @@ -1022,6 +1018,7 @@ class CoffeeScriptLexer(RegexLexer): aliases = ['coffeescript', 'coffee-script', 'coffee'] filenames = ['*.coffee'] mimetypes = ['text/coffeescript'] + version_added = '1.3' _operator_re = ( r'\+\+|~|&&|\band\b|\bor\b|\bis\b|\bisnt\b|\bnot\b|\?|:|' @@ -1127,14 +1124,13 @@ class CoffeeScriptLexer(RegexLexer): class MaskLexer(RegexLexer): """ For Mask markup. - - .. versionadded:: 2.0 """ name = 'Mask' url = 'https://github.com/atmajs/MaskJS' aliases = ['mask'] filenames = ['*.mask'] mimetypes = ['text/x-mask'] + version_added = '2.0' flags = re.MULTILINE | re.IGNORECASE | re.DOTALL tokens = { @@ -1255,6 +1251,8 @@ class EarlGreyLexer(RegexLexer): aliases = ['earl-grey', 'earlgrey', 'eg'] filenames = ['*.eg'] mimetypes = ['text/x-earl-grey'] + url = 'https://github.com/breuleux/earl-grey' + version_added = '' tokens = { 'root': [ @@ -1461,8 +1459,6 @@ class EarlGreyLexer(RegexLexer): class JuttleLexer(RegexLexer): """ For Juttle source code. - - .. versionadded:: 2.2 """ name = 'Juttle' @@ -1471,6 +1467,7 @@ class JuttleLexer(RegexLexer): filenames = ['*.juttle'] mimetypes = ['application/juttle', 'application/x-juttle', 'text/x-juttle', 'text/juttle'] + version_added = '2.2' flags = re.DOTALL | re.MULTILINE @@ -1548,6 +1545,8 @@ class NodeConsoleLexer(Lexer): name = 'Node.js REPL console session' aliases = ['nodejsrepl', ] mimetypes = ['text/x-nodejsrepl', ] + url = 'https://nodejs.org' + version_added = '' def get_tokens_unprocessed(self, text): jslexer = JavascriptLexer(**self.options) diff --git a/libs/pygments/lexers/jmespath.py b/libs/pygments/lexers/jmespath.py index 74aa57274..e7bfc3e45 100644 --- a/libs/pygments/lexers/jmespath.py +++ b/libs/pygments/lexers/jmespath.py @@ -4,7 +4,7 @@ Lexers for the JMESPath language - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,6 +23,7 @@ class JMESPathLexer(RegexLexer): url = 'https://jmespath.org' filenames = ['*.jp'] aliases = ['jmespath', 'jp'] + version_added = '' tokens = { 'string': [ diff --git a/libs/pygments/lexers/jslt.py b/libs/pygments/lexers/jslt.py index 0d79f8b18..297c3c6b5 100644 --- a/libs/pygments/lexers/jslt.py +++ b/libs/pygments/lexers/jslt.py @@ -4,7 +4,7 @@ Lexers for the JSLT language - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,14 +22,13 @@ class JSLTLexer(RegexLexer): """ For JSLT source. - - .. versionadded:: 2.10 """ name = 'JSLT' url = 'https://github.com/schibsted/jslt' filenames = ['*.jslt'] aliases = ['jslt'] mimetypes = ['text/x-jslt'] + version_added = '2.10' tokens = { 'root': [ diff --git a/libs/pygments/lexers/jsonnet.py b/libs/pygments/lexers/jsonnet.py index 3905f8871..aeaf53dc8 100644 --- a/libs/pygments/lexers/jsonnet.py +++ b/libs/pygments/lexers/jsonnet.py @@ -4,7 +4,7 @@ Lexer for Jsonnet data templating language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,7 +20,7 @@ def string_rules(quote_mark): return [ - (r"[^{}\\]".format(quote_mark), String), + (rf"[^{quote_mark}\\]", String), (r"\\.", String.Escape), (quote_mark, String, '#pop'), ] @@ -28,7 +28,7 @@ def string_rules(quote_mark): def quoted_field_name(quote_mark): return [ - (r'([^{quote}\\]|\\.)*{quote}'.format(quote=quote_mark), + (rf'([^{quote_mark}\\]|\\.)*{quote_mark}', Name.Variable, 'field_separator') ] @@ -40,6 +40,7 @@ class JsonnetLexer(RegexLexer): aliases = ['jsonnet'] filenames = ['*.jsonnet', '*.libsonnet'] url = "https://jsonnet.org" + version_added = '' tokens = { # Not used by itself '_comments': [ diff --git a/libs/pygments/lexers/jsx.py b/libs/pygments/lexers/jsx.py index 90cecc027..b2eece6f6 100644 --- a/libs/pygments/lexers/jsx.py +++ b/libs/pygments/lexers/jsx.py @@ -4,7 +4,7 @@ Lexers for JSX (React). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,8 +20,6 @@ class JsxLexer(JavascriptLexer): """For JavaScript Syntax Extension (JSX). - - .. versionadded:: 2.17 """ name = "JSX" @@ -29,6 +27,7 @@ class JsxLexer(JavascriptLexer): filenames = ["*.jsx", "*.react"] mimetypes = ["text/jsx", "text/typescript-jsx"] url = "https://facebook.github.io/jsx/" + version_added = '2.17' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/julia.py b/libs/pygments/lexers/julia.py index 9975ca0f8..faacaa55c 100644 --- a/libs/pygments/lexers/julia.py +++ b/libs/pygments/lexers/julia.py @@ -4,7 +4,7 @@ Lexers for the Julia language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -27,8 +27,6 @@ class JuliaLexer(RegexLexer): """ For Julia source code. - - .. versionadded:: 1.6 """ name = 'Julia' @@ -36,6 +34,7 @@ class JuliaLexer(RegexLexer): aliases = ['julia', 'jl'] filenames = ['*.jl'] mimetypes = ['text/x-julia', 'application/x-julia'] + version_added = '1.6' tokens = { 'root': [ @@ -247,11 +246,11 @@ def analyse_text(text): class JuliaConsoleLexer(Lexer): """ For Julia console sessions. Modeled after MatlabSessionLexer. - - .. versionadded:: 1.6 """ name = 'Julia console' aliases = ['jlcon', 'julia-repl'] + url = 'https://julialang.org/' + version_added = '1.6' def get_tokens_unprocessed(self, text): jllexer = JuliaLexer(**self.options) diff --git a/libs/pygments/lexers/jvm.py b/libs/pygments/lexers/jvm.py index 9b4f8d65f..d631c5c36 100644 --- a/libs/pygments/lexers/jvm.py +++ b/libs/pygments/lexers/jvm.py @@ -4,7 +4,7 @@ Pygments lexers for JVM languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -33,6 +33,7 @@ class JavaLexer(RegexLexer): aliases = ['java'] filenames = ['*.java'] mimetypes = ['text/x-java'] + version_added = '' flags = re.MULTILINE | re.DOTALL @@ -118,8 +119,6 @@ class JavaLexer(RegexLexer): class AspectJLexer(JavaLexer): """ For AspectJ source code. - - .. versionadded:: 1.6 """ name = 'AspectJ' @@ -127,6 +126,7 @@ class AspectJLexer(JavaLexer): aliases = ['aspectj'] filenames = ['*.aj'] mimetypes = ['text/x-aspectj'] + version_added = '1.6' aj_keywords = { 'aspect', 'pointcut', 'privileged', 'call', 'execution', @@ -165,21 +165,22 @@ class ScalaLexer(RegexLexer): aliases = ['scala'] filenames = ['*.scala'] mimetypes = ['text/x-scala'] + version_added = '' flags = re.MULTILINE | re.DOTALL opchar = '[!#%&*\\-\\/:?@^' + uni.combine('Sm', 'So') + ']' letter = '[_\\$' + uni.combine('Ll', 'Lu', 'Lo', 'Nl', 'Lt') + ']' upperLetter = '[' + uni.combine('Lu', 'Lt') + ']' - letterOrDigit = '(?:%s|[0-9])' % letter - letterOrDigitNoDollarSign = '(?:%s|[0-9])' % letter.replace('\\$', '') - alphaId = '%s+' % letter - simpleInterpolatedVariable = '%s%s*' % (letter, letterOrDigitNoDollarSign) - idrest = '%s%s*(?:(?<=_)%s+)?' % (letter, letterOrDigit, opchar) - idUpper = '%s%s*(?:(?<=_)%s+)?' % (upperLetter, letterOrDigit, opchar) - plainid = '(?:%s|%s+)' % (idrest, opchar) + letterOrDigit = f'(?:{letter}|[0-9])' + letterOrDigitNoDollarSign = '(?:{}|[0-9])'.format(letter.replace('\\$', '')) + alphaId = f'{letter}+' + simpleInterpolatedVariable = f'{letter}{letterOrDigitNoDollarSign}*' + idrest = f'{letter}{letterOrDigit}*(?:(?<=_){opchar}+)?' + idUpper = f'{upperLetter}{letterOrDigit}*(?:(?<=_){opchar}+)?' + plainid = f'(?:{idrest}|{opchar}+)' backQuotedId = r'`[^`]+`' - anyId = r'(?:%s|%s)' % (plainid, backQuotedId) + anyId = rf'(?:{plainid}|{backQuotedId})' notStartOfComment = r'(?!//|/\*)' endOfLineMaybeWithComment = r'(?=\s*(//|$))' @@ -256,7 +257,7 @@ class ScalaLexer(RegexLexer): r'(def|val|var|given|type|class|trait|object|enum)\b)', Keyword), ], 'annotations': [ - (r'@%s' % idrest, Name.Decorator), + (rf'@{idrest}', Name.Decorator), ], 'using': [ # using is a soft keyword, can only be used in the first position of @@ -264,29 +265,26 @@ class ScalaLexer(RegexLexer): (r'(\()(\s*)(using)(\s)', bygroups(Punctuation, Whitespace, Keyword, Whitespace)), ], 'declarations': [ - (r'\b(def)\b(\s*)%s(%s)?' % (notStartOfComment, anyId), + (rf'\b(def)\b(\s*){notStartOfComment}({anyId})?', bygroups(Keyword, Whitespace, Name.Function)), - (r'\b(trait)\b(\s*)%s(%s)?' % (notStartOfComment, anyId), + (rf'\b(trait)\b(\s*){notStartOfComment}({anyId})?', bygroups(Keyword, Whitespace, Name.Class)), - (r'\b(?:(case)(\s+))?(class|object|enum)\b(\s*)%s(%s)?' % - (notStartOfComment, anyId), + (rf'\b(?:(case)(\s+))?(class|object|enum)\b(\s*){notStartOfComment}({anyId})?', bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Class)), - (r'(?<!\.)\b(type)\b(\s*)%s(%s)?' % (notStartOfComment, anyId), + (rf'(?<!\.)\b(type)\b(\s*){notStartOfComment}({anyId})?', bygroups(Keyword, Whitespace, Name.Class)), (r'\b(val|var)\b', Keyword.Declaration), - (r'\b(package)(\s+)(object)\b(\s*)%s(%s)?' % - (notStartOfComment, anyId), + (rf'\b(package)(\s+)(object)\b(\s*){notStartOfComment}({anyId})?', bygroups(Keyword, Whitespace, Keyword, Whitespace, Name.Namespace)), (r'\b(package)(\s+)', bygroups(Keyword, Whitespace), 'package'), - (r'\b(given)\b(\s*)(%s)' % idUpper, + (rf'\b(given)\b(\s*)({idUpper})', bygroups(Keyword, Whitespace, Name.Class)), - (r'\b(given)\b(\s*)(%s)?' % anyId, + (rf'\b(given)\b(\s*)({anyId})?', bygroups(Keyword, Whitespace, Name)), ], 'inheritance': [ (r'\b(extends|with|derives)\b(\s*)' - r'(%s|%s|(?=\([^\)]+=>)|(?=%s)|(?="))?' % - (idUpper, backQuotedId, plainid), + rf'({idUpper}|{backQuotedId}|(?=\([^\)]+=>)|(?={plainid})|(?="))?', bygroups(Keyword, Whitespace, Name.Class)), ], 'extension': [ @@ -296,10 +294,9 @@ class ScalaLexer(RegexLexer): # end is a soft keyword, should only be highlighted in certain cases (r'\b(end)(\s+)(if|while|for|match|new|extension|val|var)\b', bygroups(Keyword, Whitespace, Keyword)), - (r'\b(end)(\s+)(%s)%s' % (idUpper, endOfLineMaybeWithComment), + (rf'\b(end)(\s+)({idUpper}){endOfLineMaybeWithComment}', bygroups(Keyword, Whitespace, Name.Class)), - (r'\b(end)(\s+)(%s|%s)?%s' % - (backQuotedId, plainid, endOfLineMaybeWithComment), + (rf'\b(end)(\s+)({backQuotedId}|{plainid})?{endOfLineMaybeWithComment}', bygroups(Keyword, Whitespace, Name.Namespace)), ], 'punctuation': [ @@ -310,10 +307,10 @@ class ScalaLexer(RegexLexer): (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword), ], 'operators': [ - (r'(%s{2,})(\s+)' % opchar, bygroups(Operator, Whitespace)), + (rf'({opchar}{{2,}})(\s+)', bygroups(Operator, Whitespace)), (r'/(?![/*])', Operator), (words(operators), Operator), - (r'(?<!%s)(!|&&|\|\|)(?!%s)' % (opchar, opchar), Operator), + (rf'(?<!{opchar})(!|&&|\|\|)(?!{opchar})', Operator), ], 'constants': [ (r'\b(this|super)\b', Name.Builtin.Pseudo), @@ -336,7 +333,7 @@ class ScalaLexer(RegexLexer): (r'raw"(\\\\|\\"|[^"])*"', String), ], 'symbols': [ - (r"('%s)(?!')" % plainid, String.Symbol), + (rf"('{plainid})(?!')", String.Symbol), ], 'singleton-type': [ (r'(\.)(type)\b', bygroups(Punctuation, Keyword)), @@ -344,7 +341,7 @@ class ScalaLexer(RegexLexer): 'inline': [ # inline is a soft modifier, only highlighted if followed by if, # match or parameters. - (r'\b(inline)(?=\s+(%s|%s)\s*:)' % (plainid, backQuotedId), + (rf'\b(inline)(?=\s+({plainid}|{backQuotedId})\s*:)', Keyword), (r'\b(inline)\b(?=(?:.(?!\b(?:val|def|given)\b))*\b(if|match)\b)', Keyword), @@ -427,7 +424,7 @@ class ScalaLexer(RegexLexer): # Helpers 'qualified-name': [ (idUpper, Name.Class), - (r'(%s)(\.)' % anyId, bygroups(Name.Namespace, Punctuation)), + (rf'({anyId})(\.)', bygroups(Name.Namespace, Punctuation)), (r'\.', Punctuation), (anyId, Name), (r'[^\S\n]+', Whitespace), @@ -435,7 +432,7 @@ class ScalaLexer(RegexLexer): 'interpolated-string-common': [ (r'[^"$\\]+', String), (r'\$\$', String.Escape), - (r'(\$)(%s)' % simpleInterpolatedVariable, + (rf'(\$)({simpleInterpolatedVariable})', bygroups(String.Interpol, Name)), (r'\$\{', String.Interpol, 'interpolated-string-brace'), (r'\\.', String), @@ -446,14 +443,14 @@ class ScalaLexer(RegexLexer): class GosuLexer(RegexLexer): """ For Gosu source code. - - .. versionadded:: 1.5 """ name = 'Gosu' aliases = ['gosu'] filenames = ['*.gs', '*.gsx', '*.gsp', '*.vark'] mimetypes = ['text/x-gosu'] + url = 'https://gosu-lang.github.io' + version_added = '1.5' flags = re.MULTILINE | re.DOTALL @@ -525,14 +522,14 @@ class GosuLexer(RegexLexer): class GosuTemplateLexer(Lexer): """ For Gosu templates. - - .. versionadded:: 1.5 """ name = 'Gosu Template' aliases = ['gst'] filenames = ['*.gst'] mimetypes = ['text/x-gosu-template'] + url = 'https://gosu-lang.github.io' + version_added = '1.5' def get_tokens_unprocessed(self, text): lexer = GosuLexer() @@ -543,8 +540,6 @@ def get_tokens_unprocessed(self, text): class GroovyLexer(RegexLexer): """ For Groovy source code. - - .. versionadded:: 1.5 """ name = 'Groovy' @@ -552,6 +547,7 @@ class GroovyLexer(RegexLexer): aliases = ['groovy'] filenames = ['*.groovy','*.gradle'] mimetypes = ['text/x-groovy'] + version_added = '1.5' flags = re.MULTILINE | re.DOTALL @@ -622,14 +618,13 @@ class IokeLexer(RegexLexer): """ For Ioke (a strongly typed, dynamic, prototype based programming language) source. - - .. versionadded:: 1.4 """ name = 'Ioke' url = 'https://ioke.org/' filenames = ['*.ik'] aliases = ['ioke', 'ik'] mimetypes = ['text/x-iokesrc'] + version_added = '1.4' tokens = { 'interpolatableText': [ (r'(\\b|\\e|\\t|\\n|\\f|\\r|\\"|\\\\|\\#|\\\Z|\\u[0-9a-fA-F]{1,4}' @@ -813,14 +808,13 @@ class IokeLexer(RegexLexer): class ClojureLexer(RegexLexer): """ Lexer for Clojure source code. - - .. versionadded:: 0.11 """ name = 'Clojure' url = 'http://clojure.org/' aliases = ['clojure', 'clj'] filenames = ['*.clj', '*.cljc'] mimetypes = ['text/x-clojure', 'application/x-clojure'] + version_added = '0.11' special_forms = ( '.', 'def', 'do', 'fn', 'if', 'let', 'new', 'quote', 'var', 'loop' @@ -954,14 +948,13 @@ class ClojureLexer(RegexLexer): class ClojureScriptLexer(ClojureLexer): """ Lexer for ClojureScript source code. - - .. versionadded:: 2.0 """ name = 'ClojureScript' url = 'http://clojure.org/clojurescript' aliases = ['clojurescript', 'cljs'] filenames = ['*.cljs'] mimetypes = ['text/x-clojurescript', 'application/x-clojurescript'] + version_added = '2.0' class TeaLangLexer(RegexLexer): @@ -1014,8 +1007,6 @@ class TeaLangLexer(RegexLexer): class CeylonLexer(RegexLexer): """ For Ceylon source code. - - .. versionadded:: 1.6 """ name = 'Ceylon' @@ -1023,6 +1014,7 @@ class CeylonLexer(RegexLexer): aliases = ['ceylon'] filenames = ['*.ceylon'] mimetypes = ['text/x-ceylon'] + version_added = '1.6' flags = re.MULTILINE | re.DOTALL @@ -1094,8 +1086,6 @@ class CeylonLexer(RegexLexer): class KotlinLexer(RegexLexer): """ For Kotlin source code. - - .. versionadded:: 1.5 """ name = 'Kotlin' @@ -1103,6 +1093,7 @@ class KotlinLexer(RegexLexer): aliases = ['kotlin'] filenames = ['*.kt', '*.kts'] mimetypes = ['text/x-kotlin'] + version_added = '1.5' flags = re.MULTILINE | re.DOTALL @@ -1250,8 +1241,6 @@ class KotlinLexer(RegexLexer): class XtendLexer(RegexLexer): """ For Xtend source code. - - .. versionadded:: 1.6 """ name = 'Xtend' @@ -1259,6 +1248,7 @@ class XtendLexer(RegexLexer): aliases = ['xtend'] filenames = ['*.xtend'] mimetypes = ['text/x-xtend'] + version_added = '1.6' flags = re.MULTILINE | re.DOTALL @@ -1279,7 +1269,7 @@ class XtendLexer(RegexLexer): Keyword), (r'(def|abstract|const|enum|extends|final|implements|native|private|' r'protected|public|static|strictfp|super|synchronized|throws|' - r'transient|volatile)\b', Keyword.Declaration), + r'transient|volatile|val|var)\b', Keyword.Declaration), (r'(boolean|byte|char|double|float|int|long|short|void)\b', Keyword.Type), (r'(package)(\s+)', bygroups(Keyword.Namespace, Whitespace)), @@ -1316,8 +1306,6 @@ class XtendLexer(RegexLexer): class PigLexer(RegexLexer): """ For Pig Latin source code. - - .. versionadded:: 2.0 """ name = 'Pig' @@ -1325,6 +1313,7 @@ class PigLexer(RegexLexer): aliases = ['pig'] filenames = ['*.pig'] mimetypes = ['text/x-pig'] + version_added = '2.0' flags = re.MULTILINE | re.IGNORECASE @@ -1384,14 +1373,13 @@ class PigLexer(RegexLexer): class GoloLexer(RegexLexer): """ For Golo source code. - - .. versionadded:: 2.0 """ name = 'Golo' url = 'http://golo-lang.org/' filenames = ['*.golo'] aliases = ['golo'] + version_added = '2.0' tokens = { 'root': [ @@ -1498,21 +1486,20 @@ class GoloLexer(RegexLexer): class JasminLexer(RegexLexer): """ For Jasmin assembly code. - - .. versionadded:: 2.0 """ name = 'Jasmin' url = 'http://jasmin.sourceforge.net/' aliases = ['jasmin', 'jasminxt'] filenames = ['*.j'] + version_added = '2.0' _whitespace = r' \n\t\r' - _ws = r'(?:[%s]+)' % _whitespace - _separator = r'%s:=' % _whitespace - _break = r'(?=[%s]|$)' % _separator - _name = r'[^%s]+' % _separator - _unqualified_name = r'(?:[^%s.;\[/]+)' % _separator + _ws = rf'(?:[{_whitespace}]+)' + _separator = rf'{_whitespace}:=' + _break = rf'(?=[{_separator}]|$)' + _name = rf'[^{_separator}]+' + _unqualified_name = rf'(?:[^{_separator}.;\[/]+)' tokens = { 'default': [ @@ -1523,36 +1510,36 @@ class JasminLexer(RegexLexer): (r':', Punctuation, 'label'), (_ws, Whitespace), (r';.*', Comment.Single), - (r'(\$[-+])?0x-?[\da-fA-F]+%s' % _break, Number.Hex), - (r'(\$[-+]|\+)?-?\d+%s' % _break, Number.Integer), + (rf'(\$[-+])?0x-?[\da-fA-F]+{_break}', Number.Hex), + (rf'(\$[-+]|\+)?-?\d+{_break}', Number.Integer), (r'-?(\d+\.\d*|\.\d+)([eE][-+]?\d+)?[fFdD]?' - r'[\x00-\x08\x0b\x0c\x0e-\x1f]*%s' % _break, Number.Float), - (r'\$%s' % _name, Name.Variable), + rf'[\x00-\x08\x0b\x0c\x0e-\x1f]*{_break}', Number.Float), + (rf'\${_name}', Name.Variable), # Directives - (r'\.annotation%s' % _break, Keyword.Reserved, 'annotation'), + (rf'\.annotation{_break}', Keyword.Reserved, 'annotation'), (r'(\.attribute|\.bytecode|\.debug|\.deprecated|\.enclosing|' r'\.interface|\.line|\.signature|\.source|\.stack|\.var|abstract|' r'annotation|bridge|class|default|enum|field|final|fpstrict|' r'interface|native|private|protected|public|signature|static|' - r'synchronized|synthetic|transient|varargs|volatile)%s' % _break, + rf'synchronized|synthetic|transient|varargs|volatile){_break}', Keyword.Reserved), - (r'\.catch%s' % _break, Keyword.Reserved, 'caught-exception'), + (rf'\.catch{_break}', Keyword.Reserved, 'caught-exception'), (r'(\.class|\.implements|\.inner|\.super|inner|invisible|' - r'invisibleparam|outer|visible|visibleparam)%s' % _break, + rf'invisibleparam|outer|visible|visibleparam){_break}', Keyword.Reserved, 'class/convert-dots'), - (r'\.field%s' % _break, Keyword.Reserved, + (rf'\.field{_break}', Keyword.Reserved, ('descriptor/convert-dots', 'field')), - (r'(\.end|\.limit|use)%s' % _break, Keyword.Reserved, + (rf'(\.end|\.limit|use){_break}', Keyword.Reserved, 'no-verification'), - (r'\.method%s' % _break, Keyword.Reserved, 'method'), - (r'\.set%s' % _break, Keyword.Reserved, 'var'), - (r'\.throws%s' % _break, Keyword.Reserved, 'exception'), - (r'(from|offset|to|using)%s' % _break, Keyword.Reserved, 'label'), - (r'is%s' % _break, Keyword.Reserved, + (rf'\.method{_break}', Keyword.Reserved, 'method'), + (rf'\.set{_break}', Keyword.Reserved, 'var'), + (rf'\.throws{_break}', Keyword.Reserved, 'exception'), + (rf'(from|offset|to|using){_break}', Keyword.Reserved, 'label'), + (rf'is{_break}', Keyword.Reserved, ('descriptor/convert-dots', 'var')), - (r'(locals|stack)%s' % _break, Keyword.Reserved, 'verification'), - (r'method%s' % _break, Keyword.Reserved, 'enclosing-method'), + (rf'(locals|stack){_break}', Keyword.Reserved, 'verification'), + (rf'method{_break}', Keyword.Reserved, 'enclosing-method'), # Instructions (words(( @@ -1578,14 +1565,14 @@ class JasminLexer(RegexLexer): 'lstore_1', 'lstore_2', 'lstore_3', 'lstore_w', 'lsub', 'lushr', 'lxor', 'monitorenter', 'monitorexit', 'nop', 'pop', 'pop2', 'ret', 'ret_w', 'return', 'saload', 'sastore', 'sipush', 'swap'), suffix=_break), Keyword.Reserved), - (r'(anewarray|checkcast|instanceof|ldc|ldc_w|new)%s' % _break, + (rf'(anewarray|checkcast|instanceof|ldc|ldc_w|new){_break}', Keyword.Reserved, 'class/no-dots'), (r'invoke(dynamic|interface|nonvirtual|special|' - r'static|virtual)%s' % _break, Keyword.Reserved, + rf'static|virtual){_break}', Keyword.Reserved, 'invocation'), - (r'(getfield|putfield)%s' % _break, Keyword.Reserved, + (rf'(getfield|putfield){_break}', Keyword.Reserved, ('descriptor/no-dots', 'field')), - (r'(getstatic|putstatic)%s' % _break, Keyword.Reserved, + (rf'(getstatic|putstatic){_break}', Keyword.Reserved, ('descriptor/no-dots', 'static')), (words(( 'goto', 'goto_w', 'if_acmpeq', 'if_acmpne', 'if_icmpeq', @@ -1593,9 +1580,9 @@ class JasminLexer(RegexLexer): 'ifeq', 'ifge', 'ifgt', 'ifle', 'iflt', 'ifne', 'ifnonnull', 'ifnull', 'jsr', 'jsr_w'), suffix=_break), Keyword.Reserved, 'label'), - (r'(multianewarray|newarray)%s' % _break, Keyword.Reserved, + (rf'(multianewarray|newarray){_break}', Keyword.Reserved, 'descriptor/convert-dots'), - (r'tableswitch%s' % _break, Keyword.Reserved, 'table') + (rf'tableswitch{_break}', Keyword.Reserved, 'table') ], 'quote': [ (r"'", String.Single, '#pop'), @@ -1612,25 +1599,25 @@ class JasminLexer(RegexLexer): (r'\n+', Whitespace), (r"'", String.Single, 'quote'), include('default'), - (r'(%s)([ \t\r]*)(:)' % _name, + (rf'({_name})([ \t\r]*)(:)', bygroups(Name.Label, Whitespace, Punctuation)), (_name, String.Other) ], 'annotation': [ (r'\n', Whitespace, ('#pop', 'annotation-body')), - (r'default%s' % _break, Keyword.Reserved, + (rf'default{_break}', Keyword.Reserved, ('#pop', 'annotation-default')), include('default') ], 'annotation-body': [ (r'\n+', Whitespace), - (r'\.end%s' % _break, Keyword.Reserved, '#pop'), + (rf'\.end{_break}', Keyword.Reserved, '#pop'), include('default'), (_name, String.Other, ('annotation-items', 'descriptor/no-dots')) ], 'annotation-default': [ (r'\n+', Whitespace), - (r'\.end%s' % _break, Keyword.Reserved, '#pop'), + (rf'\.end{_break}', Keyword.Reserved, '#pop'), include('default'), default(('annotation-items', 'descriptor/no-dots')) ], @@ -1640,42 +1627,42 @@ class JasminLexer(RegexLexer): (_name, String.Other) ], 'caught-exception': [ - (r'all%s' % _break, Keyword, '#pop'), + (rf'all{_break}', Keyword, '#pop'), include('exception') ], 'class/convert-dots': [ include('default'), - (r'(L)((?:%s[/.])*)(%s)(;)' % (_unqualified_name, _name), + (rf'(L)((?:{_unqualified_name}[/.])*)({_name})(;)', bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation), '#pop'), - (r'((?:%s[/.])*)(%s)' % (_unqualified_name, _name), + (rf'((?:{_unqualified_name}[/.])*)({_name})', bygroups(Name.Namespace, Name.Class), '#pop') ], 'class/no-dots': [ include('default'), (r'\[+', Punctuation, ('#pop', 'descriptor/no-dots')), - (r'(L)((?:%s/)*)(%s)(;)' % (_unqualified_name, _name), + (rf'(L)((?:{_unqualified_name}/)*)({_name})(;)', bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation), '#pop'), - (r'((?:%s/)*)(%s)' % (_unqualified_name, _name), + (rf'((?:{_unqualified_name}/)*)({_name})', bygroups(Name.Namespace, Name.Class), '#pop') ], 'descriptor/convert-dots': [ include('default'), (r'\[+', Punctuation), - (r'(L)((?:%s[/.])*)(%s?)(;)' % (_unqualified_name, _name), + (rf'(L)((?:{_unqualified_name}[/.])*)({_name}?)(;)', bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation), '#pop'), - (r'[^%s\[)L]+' % _separator, Keyword.Type, '#pop'), + (rf'[^{_separator}\[)L]+', Keyword.Type, '#pop'), default('#pop') ], 'descriptor/no-dots': [ include('default'), (r'\[+', Punctuation), - (r'(L)((?:%s/)*)(%s)(;)' % (_unqualified_name, _name), + (rf'(L)((?:{_unqualified_name}/)*)({_name})(;)', bygroups(Keyword.Type, Name.Namespace, Name.Class, Punctuation), '#pop'), - (r'[^%s\[)L]+' % _separator, Keyword.Type, '#pop'), + (rf'[^{_separator}\[)L]+', Keyword.Type, '#pop'), default('#pop') ], 'descriptors/convert-dots': [ @@ -1684,26 +1671,24 @@ class JasminLexer(RegexLexer): ], 'enclosing-method': [ (_ws, Whitespace), - (r'(?=[^%s]*\()' % _separator, Text, ('#pop', 'invocation')), + (rf'(?=[^{_separator}]*\()', Text, ('#pop', 'invocation')), default(('#pop', 'class/convert-dots')) ], 'exception': [ include('default'), - (r'((?:%s[/.])*)(%s)' % (_unqualified_name, _name), + (rf'((?:{_unqualified_name}[/.])*)({_name})', bygroups(Name.Namespace, Name.Exception), '#pop') ], 'field': [ - (r'static%s' % _break, Keyword.Reserved, ('#pop', 'static')), + (rf'static{_break}', Keyword.Reserved, ('#pop', 'static')), include('default'), - (r'((?:%s[/.](?=[^%s]*[/.]))*)(%s[/.])?(%s)' % - (_unqualified_name, _separator, _unqualified_name, _name), + (rf'((?:{_unqualified_name}[/.](?=[^{_separator}]*[/.]))*)({_unqualified_name}[/.])?({_name})', bygroups(Name.Namespace, Name.Class, Name.Variable.Instance), '#pop') ], 'invocation': [ include('default'), - (r'((?:%s[/.](?=[^%s(]*[/.]))*)(%s[/.])?(%s)(\()' % - (_unqualified_name, _separator, _unqualified_name, _name), + (rf'((?:{_unqualified_name}[/.](?=[^{_separator}(]*[/.]))*)({_unqualified_name}[/.])?({_name})(\()', bygroups(Name.Namespace, Name.Class, Name.Function, Punctuation), ('#pop', 'descriptor/convert-dots', 'descriptors/convert-dots', 'descriptor/convert-dots')) @@ -1714,23 +1699,22 @@ class JasminLexer(RegexLexer): ], 'method': [ include('default'), - (r'(%s)(\()' % _name, bygroups(Name.Function, Punctuation), + (rf'({_name})(\()', bygroups(Name.Function, Punctuation), ('#pop', 'descriptor/convert-dots', 'descriptors/convert-dots', 'descriptor/convert-dots')) ], 'no-verification': [ - (r'(locals|method|stack)%s' % _break, Keyword.Reserved, '#pop'), + (rf'(locals|method|stack){_break}', Keyword.Reserved, '#pop'), include('default') ], 'static': [ include('default'), - (r'((?:%s[/.](?=[^%s]*[/.]))*)(%s[/.])?(%s)' % - (_unqualified_name, _separator, _unqualified_name, _name), + (rf'((?:{_unqualified_name}[/.](?=[^{_separator}]*[/.]))*)({_unqualified_name}[/.])?({_name})', bygroups(Name.Namespace, Name.Class, Name.Variable.Class), '#pop') ], 'table': [ (r'\n+', Whitespace), - (r'default%s' % _break, Keyword.Reserved, '#pop'), + (rf'default{_break}', Keyword.Reserved, '#pop'), include('default'), (_name, Name.Label) ], @@ -1740,10 +1724,9 @@ class JasminLexer(RegexLexer): ], 'verification': [ include('default'), - (r'(Double|Float|Integer|Long|Null|Top|UninitializedThis)%s' % - _break, Keyword, '#pop'), - (r'Object%s' % _break, Keyword, ('#pop', 'class/no-dots')), - (r'Uninitialized%s' % _break, Keyword, ('#pop', 'label')) + (rf'(Double|Float|Integer|Long|Null|Top|UninitializedThis){_break}', Keyword, '#pop'), + (rf'Object{_break}', Keyword, ('#pop', 'class/no-dots')), + (rf'Uninitialized{_break}', Keyword, ('#pop', 'label')) ] } @@ -1763,8 +1746,6 @@ def analyse_text(text): class SarlLexer(RegexLexer): """ For SARL source code. - - .. versionadded:: 2.4 """ name = 'SARL' @@ -1772,6 +1753,7 @@ class SarlLexer(RegexLexer): aliases = ['sarl'] filenames = ['*.sarl'] mimetypes = ['text/x-sarl'] + version_added = '2.4' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/kuin.py b/libs/pygments/lexers/kuin.py index aeb9cad2d..228a4b3c9 100644 --- a/libs/pygments/lexers/kuin.py +++ b/libs/pygments/lexers/kuin.py @@ -4,7 +4,7 @@ Lexers for the Kuin language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,13 +18,12 @@ class KuinLexer(RegexLexer): """ For Kuin source code. - - .. versionadded:: 2.9 """ name = 'Kuin' url = 'https://github.com/kuina/Kuin' aliases = ['kuin'] filenames = ['*.kn'] + version_added = '2.9' tokens = { 'root': [ diff --git a/libs/pygments/lexers/kusto.py b/libs/pygments/lexers/kusto.py index 9f30fd675..7b146861c 100644 --- a/libs/pygments/lexers/kusto.py +++ b/libs/pygments/lexers/kusto.py @@ -4,7 +4,7 @@ Lexers for Kusto Query Language (KQL). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -43,14 +43,13 @@ class KustoLexer(RegexLexer): """For Kusto Query Language source code. - - .. versionadded:: 2.17 """ name = "Kusto" aliases = ["kql", "kusto"] filenames = ["*.kql", "*.kusto", ".csl"] url = "https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query" + version_added = '2.17' tokens = { "root": [ diff --git a/libs/pygments/lexers/ldap.py b/libs/pygments/lexers/ldap.py index a669f7900..17d14b017 100644 --- a/libs/pygments/lexers/ldap.py +++ b/libs/pygments/lexers/ldap.py @@ -4,7 +4,7 @@ Pygments lexers for LDAP. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,8 +22,6 @@ class LdifLexer(RegexLexer): """ Lexer for LDIF - - .. versionadded:: 2.17 """ name = 'LDIF' @@ -31,6 +29,7 @@ class LdifLexer(RegexLexer): filenames = ['*.ldif'] mimetypes = ["text/x-ldif"] url = "https://datatracker.ietf.org/doc/html/rfc2849" + version_added = '2.17' tokens = { 'root': [ @@ -106,8 +105,6 @@ class LdifLexer(RegexLexer): class LdaprcLexer(RegexLexer): """ Lexer for OpenLDAP configuration files. - - .. versionadded:: 2.17 """ name = 'LDAP configuration file' @@ -115,6 +112,7 @@ class LdaprcLexer(RegexLexer): filenames = ['.ldaprc', 'ldaprc', 'ldap.conf'] mimetypes = ["text/x-ldapconf"] url = 'https://www.openldap.org/software//man.cgi?query=ldap.conf&sektion=5&apropos=0&manpath=OpenLDAP+2.4-Release' + version_added = '2.17' _sasl_keywords = r'SASL_(?:MECH|REALM|AUTHCID|AUTHZID|CBINDING)' _tls_keywords = r'TLS_(?:CACERT|CACERTDIR|CERT|ECNAME|KEY|CIPHER_SUITE|PROTOCOL_MIN|RANDFILE|CRLFILE)' diff --git a/libs/pygments/lexers/lean.py b/libs/pygments/lexers/lean.py index d16cd73c5..b44d2a042 100644 --- a/libs/pygments/lexers/lean.py +++ b/libs/pygments/lexers/lean.py @@ -4,32 +4,38 @@ Lexers for the Lean theorem prover. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ + import re -from pygments.lexer import RegexLexer, default, words, include -from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ - Number, Punctuation, Generic, Whitespace +from pygments.lexer import RegexLexer, words, include +from pygments.token import Comment, Operator, Keyword, Name, String, \ + Number, Generic, Whitespace -__all__ = ['Lean3Lexer'] +__all__ = ['Lean3Lexer', 'Lean4Lexer'] class Lean3Lexer(RegexLexer): """ For the Lean 3 theorem prover. - - .. versionadded:: 2.0 """ name = 'Lean' url = 'https://leanprover-community.github.io/lean3' aliases = ['lean', 'lean3'] filenames = ['*.lean'] mimetypes = ['text/x-lean', 'text/x-lean3'] + version_added = '2.0' + + # from https://github.com/leanprover/vscode-lean/blob/1589ca3a65e394b3789409707febbd2d166c9344/syntaxes/lean.json#L186C20-L186C217 + _name_segment = ( + "(?![λΠΣ])[_a-zA-Zα-ωΑ-Ωϊ-ϻἀ-῾℀-⅏𝒜-𝖟]" + "(?:(?![λΠΣ])[_a-zA-Zα-ωΑ-Ωϊ-ϻἀ-῾℀-⅏𝒜-𝖟0-9'ⁿ-₉ₐ-ₜᵢ-ᵪ])*") + _name = _name_segment + r"(\." + _name_segment + r")*" tokens = { 'expression': [ - (r'\s+', Text), + (r'\s+', Whitespace), (r'/--', String.Doc, 'docstring'), (r'/-', Comment, 'comment'), (r'--.*?$', Comment.Single), @@ -43,9 +49,8 @@ class Lean3Lexer(RegexLexer): (words(( '(', ')', ':', '{', '}', '[', ']', '⟨', '⟩', '‹', '›', '⦃', '⦄', ':=', ',', )), Operator), - (r'[A-Za-z_\u03b1-\u03ba\u03bc-\u03fb\u1f00-\u1ffe\u2100-\u214f]' - r'[.A-Za-z_\'\u03b1-\u03ba\u03bc-\u03fb\u1f00-\u1ffe\u2070-\u2079' - r'\u207f-\u2089\u2090-\u209c\u2100-\u214f0-9]*', Name), + (_name, Name), + (r'``?' + _name, String.Symbol), (r'0x[A-Za-z0-9]+', Number.Integer), (r'0b[01]+', Number.Integer), (r'\d+', Number.Integer), @@ -102,13 +107,13 @@ class Lean3Lexer(RegexLexer): include('expression'), ], 'comment': [ - (r'[^/-]', Comment.Multiline), + (r'[^/-]+', Comment.Multiline), (r'/-', Comment.Multiline, '#push'), (r'-/', Comment.Multiline, '#pop'), (r'[/-]', Comment.Multiline) ], 'docstring': [ - (r'[^/-]', String.Doc), + (r'[^/-]+', String.Doc), (r'-/', String.Doc, '#pop'), (r'[/-]', String.Doc) ], @@ -119,4 +124,118 @@ class Lean3Lexer(RegexLexer): ], } + def analyse_text(text): + if re.search(r'^import [a-z]', text, re.MULTILINE): + return 0.1 + + LeanLexer = Lean3Lexer + + +class Lean4Lexer(RegexLexer): + """ + For the Lean 4 theorem prover. + """ + + name = 'Lean4' + url = 'https://github.com/leanprover/lean4' + aliases = ['lean4'] + filenames = ['*.lean'] + mimetypes = ['text/x-lean4'] + version_added = '2.18' + + # same as Lean3Lexer, with `!` and `?` allowed + _name_segment = ( + "(?![λΠΣ])[_a-zA-Zα-ωΑ-Ωϊ-ϻἀ-῾℀-⅏𝒜-𝖟]" + "(?:(?![λΠΣ])[_a-zA-Zα-ωΑ-Ωϊ-ϻἀ-῾℀-⅏𝒜-𝖟0-9'ⁿ-₉ₐ-ₜᵢ-ᵪ!?])*") + _name = _name_segment + r"(\." + _name_segment + r")*" + + keywords1 = ( + 'import', 'unif_hint', + 'renaming', 'inline', 'hiding', 'lemma', 'variable', + 'theorem', 'axiom', 'inductive', 'structure', 'universe', 'alias', + '#help', 'precedence', 'postfix', 'prefix', + 'infix', 'infixl', 'infixr', 'notation', '#eval', + '#check', '#reduce', '#exit', 'end', 'private', 'using', 'namespace', + 'instance', 'section', 'protected', + 'export', 'set_option', 'extends', 'open', 'example', + '#print', 'opaque', + 'def', 'macro', 'elab', 'syntax', 'macro_rules', '#reduce', 'where', + 'abbrev', 'noncomputable', 'class', 'attribute', '#synth', 'mutual', + 'scoped', 'local', + ) + + keywords2 = ( + 'forall', 'fun', 'obtain', 'from', 'have', 'show', 'assume', + 'let', 'if', 'else', 'then', 'by', 'in', 'with', + 'calc', 'match', 'nomatch', 'do', 'at', + ) + + keywords3 = ( + # Sorts + 'Type', 'Prop', 'Sort', + ) + + operators = ( + '!=', '#', '&', '&&', '*', '+', '-', '/', '@', '!', + '-.', '->', '.', '..', '...', '::', ':>', ';', ';;', '<', + '<-', '=', '==', '>', '_', '|', '||', '~', '=>', '<=', '>=', + '/\\', '\\/', '∀', 'Π', 'λ', '↔', '∧', '∨', '≠', '≤', '≥', + '¬', '⁻¹', '⬝', '▸', '→', '∃', '≈', '×', '⌞', + '⌟', '≡', '⟨', '⟩', "↦", + ) + + punctuation = ('(', ')', ':', '{', '}', '[', ']', '⦃', '⦄', + ':=', ',') + + tokens = { + 'expression': [ + (r'\s+', Whitespace), + (r'/--', String.Doc, 'docstring'), + (r'/-', Comment, 'comment'), + (r'--.*$', Comment.Single), + (words(keywords3, prefix=r'\b', suffix=r'\b'), Keyword.Type), + (words(('sorry', 'admit'), prefix=r'\b', suffix=r'\b'), Generic.Error), + (words(operators), Name.Builtin.Pseudo), + (words(punctuation), Operator), + (_name_segment, Name), + (r'``?' + _name, String.Symbol), + (r'(?<=\.)\d+', Number), + (r'(\d+\.\d*)([eE][+-]?[0-9]+)?', Number.Float), + (r'\d+', Number.Integer), + (r'"', String.Double, 'string'), + (r'[~?][a-z][\w\']*:', Name.Variable), + (r'\S', Name.Builtin.Pseudo), + ], + 'root': [ + (words(keywords1, prefix=r'\b', suffix=r'\b'), Keyword.Namespace), + (words(keywords2, prefix=r'\b', suffix=r'\b'), Keyword), + (r'@\[', Keyword.Declaration, 'attribute'), + include('expression') + ], + 'attribute': [ + (r'\]', Keyword.Declaration, '#pop'), + include('expression'), + ], + 'comment': [ + # Multiline Comments + (r'[^/-]+', Comment.Multiline), + (r'/-', Comment.Multiline, '#push'), + (r'-/', Comment.Multiline, '#pop'), + (r'[/-]', Comment.Multiline) + ], + 'docstring': [ + (r'[^/-]+', String.Doc), + (r'-/', String.Doc, '#pop'), + (r'[/-]', String.Doc) + ], + 'string': [ + (r'[^\\"]+', String.Double), + (r'\\[n"\\\n]', String.Escape), + ('"', String.Double, '#pop'), + ], + } + + def analyse_text(text): + if re.search(r'^import [A-Z]', text, re.MULTILINE): + return 0.1 diff --git a/libs/pygments/lexers/lilypond.py b/libs/pygments/lexers/lilypond.py index 6b4ed20d9..d42906ccc 100644 --- a/libs/pygments/lexers/lilypond.py +++ b/libs/pygments/lexers/lilypond.py @@ -4,7 +4,7 @@ Lexer for LilyPond. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -51,14 +51,13 @@ class LilyPondLexer(SchemeLexer): .. important:: This lexer is meant to be used in conjunction with the ``lilypond`` style. - - .. versionadded:: 2.11 """ name = 'LilyPond' url = 'https://lilypond.org' aliases = ['lilypond'] filenames = ['*.ly'] mimetypes = [] + version_added = '2.11' flags = re.DOTALL | re.MULTILINE diff --git a/libs/pygments/lexers/lisp.py b/libs/pygments/lexers/lisp.py index 966b6063a..e6cc5875f 100644 --- a/libs/pygments/lexers/lisp.py +++ b/libs/pygments/lexers/lisp.py @@ -4,7 +4,7 @@ Lexers for Lispy languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,7 +20,7 @@ __all__ = ['SchemeLexer', 'CommonLispLexer', 'HyLexer', 'RacketLexer', 'NewLispLexer', 'EmacsLispLexer', 'ShenLexer', 'CPSALexer', - 'XtlangLexer', 'FennelLexer'] + 'XtlangLexer', 'FennelLexer', 'JanetLexer'] class SchemeLexer(RegexLexer): @@ -31,14 +31,13 @@ class SchemeLexer(RegexLexer): at http://paste.lisp.org/ to cover as much syntax as possible. It supports the full Scheme syntax as defined in R5RS. - - .. versionadded:: 0.6 """ name = 'Scheme' url = 'http://www.scheme-reports.org/' aliases = ['scheme', 'scm'] filenames = ['*.scm', '*.ss'] mimetypes = ['text/x-scheme', 'application/x-scheme'] + version_added = '0.6' flags = re.DOTALL | re.MULTILINE @@ -296,14 +295,13 @@ def decimal_cb(self, match): class CommonLispLexer(RegexLexer): """ A Common Lisp lexer. - - .. versionadded:: 0.9 """ name = 'Common Lisp' url = 'https://lisp-lang.org/' aliases = ['common-lisp', 'cl', 'lisp'] filenames = ['*.cl', '*.lisp'] mimetypes = ['text/x-common-lisp'] + version_added = '0.9' flags = re.IGNORECASE | re.MULTILINE @@ -316,7 +314,7 @@ class CommonLispLexer(RegexLexer): # symbol token, reverse-engineered from hyperspec # Take a deep breath... - symbol = r'(\|[^|]+\||(?:%s)(?:%s)*)' % (nonmacro, constituent) + symbol = rf'(\|[^|]+\||(?:{nonmacro})(?:{constituent})*)' def __init__(self, **options): from pygments.lexers._cl_builtins import BUILTIN_FUNCTIONS, \ @@ -485,14 +483,13 @@ def analyse_text(text): class HyLexer(RegexLexer): """ Lexer for Hy source code. - - .. versionadded:: 2.0 """ name = 'Hy' url = 'http://hylang.org/' - aliases = ['hylang'] + aliases = ['hylang', 'hy'] filenames = ['*.hy'] mimetypes = ['text/x-hy', 'application/x-hy'] + version_added = '2.0' special_forms = ( 'cond', 'for', '->', '->>', 'car', @@ -522,7 +519,7 @@ class HyLexer(RegexLexer): # valid names for identifiers # well, names can only not consist fully of numbers # but this should be good enough for now - valid_name = r'(?!#)[\w!$%*+<=>?/.#:-]+' + valid_name = r"[^ \t\n\r\f\v()[\]{};\"'`~]+" def _multi_escape(entries): return words(entries, suffix=' ') @@ -534,8 +531,7 @@ def _multi_escape(entries): (r';.*$', Comment.Single), # whitespaces - usually not relevant - (r',+', Text), - (r'\s+', Whitespace), + (r'[ \t\n\r\f\v]+', Whitespace), # numbers (r'-?\d+\.\d+', Number.Float), @@ -601,8 +597,6 @@ class RacketLexer(RegexLexer): """ Lexer for Racket source code (formerly known as PLT Scheme). - - .. versionadded:: 1.6 """ name = 'Racket' @@ -610,6 +604,7 @@ class RacketLexer(RegexLexer): aliases = ['racket', 'rkt'] filenames = ['*.rkt', '*.rktd', '*.rktl'] mimetypes = ['text/x-racket', 'application/x-racket'] + version_added = '1.6' # Generated by example.rkt _keywords = ( @@ -1391,19 +1386,17 @@ class RacketLexer(RegexLexer): _opening_parenthesis = r'[([{]' _closing_parenthesis = r'[)\]}]' _delimiters = r'()[\]{}",\'`;\s' - _symbol = r'(?:\|[^|]*\||\\[\w\W]|[^|\\%s]+)+' % _delimiters + _symbol = rf'(?:\|[^|]*\||\\[\w\W]|[^|\\{_delimiters}]+)+' _exact_decimal_prefix = r'(?:#e)?(?:#d)?(?:#e)?' _exponent = r'(?:[defls][-+]?\d+)' _inexact_simple_no_hashes = r'(?:\d+(?:/\d+|\.\d*)?|\.\d+)' - _inexact_simple = (r'(?:%s|(?:\d+#+(?:\.#*|/\d+#*)?|\.\d+#+|' - r'\d+(?:\.\d*#+|/\d+#+)))' % _inexact_simple_no_hashes) - _inexact_normal_no_hashes = r'(?:%s%s?)' % (_inexact_simple_no_hashes, - _exponent) - _inexact_normal = r'(?:%s%s?)' % (_inexact_simple, _exponent) + _inexact_simple = (rf'(?:{_inexact_simple_no_hashes}|(?:\d+#+(?:\.#*|/\d+#*)?|\.\d+#+|' + r'\d+(?:\.\d*#+|/\d+#+)))') + _inexact_normal_no_hashes = rf'(?:{_inexact_simple_no_hashes}{_exponent}?)' + _inexact_normal = rf'(?:{_inexact_simple}{_exponent}?)' _inexact_special = r'(?:(?:inf|nan)\.[0f])' - _inexact_real = r'(?:[-+]?%s|[-+]%s)' % (_inexact_normal, - _inexact_special) - _inexact_unsigned = r'(?:%s|%s)' % (_inexact_normal, _inexact_special) + _inexact_real = rf'(?:[-+]?{_inexact_normal}|[-+]{_inexact_special})' + _inexact_unsigned = rf'(?:{_inexact_normal}|{_inexact_special})' tokens = { 'root': [ @@ -1423,36 +1416,29 @@ class RacketLexer(RegexLexer): # onto Pygments token types; some judgment calls here. # #d or no prefix - (r'(?i)%s[-+]?\d+(?=[%s])' % (_exact_decimal_prefix, _delimiters), + (rf'(?i){_exact_decimal_prefix}[-+]?\d+(?=[{_delimiters}])', Number.Integer, '#pop'), - (r'(?i)%s[-+]?(\d+(\.\d*)?|\.\d+)([deflst][-+]?\d+)?(?=[%s])' % - (_exact_decimal_prefix, _delimiters), Number.Float, '#pop'), - (r'(?i)%s[-+]?(%s([-+]%s?i)?|[-+]%s?i)(?=[%s])' % - (_exact_decimal_prefix, _inexact_normal_no_hashes, - _inexact_normal_no_hashes, _inexact_normal_no_hashes, - _delimiters), Number, '#pop'), + (rf'(?i){_exact_decimal_prefix}[-+]?(\d+(\.\d*)?|\.\d+)([deflst][-+]?\d+)?(?=[{_delimiters}])', Number.Float, '#pop'), + (rf'(?i){_exact_decimal_prefix}[-+]?({_inexact_normal_no_hashes}([-+]{_inexact_normal_no_hashes}?i)?|[-+]{_inexact_normal_no_hashes}?i)(?=[{_delimiters}])', Number, '#pop'), # Inexact without explicit #i - (r'(?i)(#d)?(%s([-+]%s?i)?|[-+]%s?i|%s@%s)(?=[%s])' % - (_inexact_real, _inexact_unsigned, _inexact_unsigned, - _inexact_real, _inexact_real, _delimiters), Number.Float, + (rf'(?i)(#d)?({_inexact_real}([-+]{_inexact_unsigned}?i)?|[-+]{_inexact_unsigned}?i|{_inexact_real}@{_inexact_real})(?=[{_delimiters}])', Number.Float, '#pop'), # The remaining extflonums - (r'(?i)(([-+]?%st[-+]?\d+)|[-+](inf|nan)\.t)(?=[%s])' % - (_inexact_simple, _delimiters), Number.Float, '#pop'), + (rf'(?i)(([-+]?{_inexact_simple}t[-+]?\d+)|[-+](inf|nan)\.t)(?=[{_delimiters}])', Number.Float, '#pop'), # #b - (r'(?iu)(#[ei])?#b%s' % _symbol, Number.Bin, '#pop'), + (rf'(?iu)(#[ei])?#b{_symbol}', Number.Bin, '#pop'), # #o - (r'(?iu)(#[ei])?#o%s' % _symbol, Number.Oct, '#pop'), + (rf'(?iu)(#[ei])?#o{_symbol}', Number.Oct, '#pop'), # #x - (r'(?iu)(#[ei])?#x%s' % _symbol, Number.Hex, '#pop'), + (rf'(?iu)(#[ei])?#x{_symbol}', Number.Hex, '#pop'), # #i is always inexact, i.e. float - (r'(?iu)(#d)?#i%s' % _symbol, Number.Float, '#pop'), + (rf'(?iu)(#d)?#i{_symbol}', Number.Float, '#pop'), # Strings and characters (r'#?"', String.Double, ('#pop', 'string')), @@ -1465,7 +1451,7 @@ class RacketLexer(RegexLexer): (r'#(true|false|[tTfF])', Name.Constant, '#pop'), # Keyword argument names (e.g. #:keyword) - (r'#:%s' % _symbol, Keyword.Declaration, '#pop'), + (rf'#:{_symbol}', Keyword.Declaration, '#pop'), # Reader extensions (r'(#lang |#!)(\S+)', @@ -1473,8 +1459,8 @@ class RacketLexer(RegexLexer): (r'#reader', Keyword.Namespace, 'quoted-datum'), # Other syntax - (r"(?i)\.(?=[%s])|#c[is]|#['`]|#,@?" % _delimiters, Operator), - (r"'|#[s&]|#hash(eqv?)?|#\d*(?=%s)" % _opening_parenthesis, + (rf"(?i)\.(?=[{_delimiters}])|#c[is]|#['`]|#,@?", Operator), + (rf"'|#[s&]|#hash(eqv?)?|#\d*(?={_opening_parenthesis})", Operator, ('#pop', 'quoted-datum')) ], 'datum*': [ @@ -1488,15 +1474,15 @@ class RacketLexer(RegexLexer): ], 'unquoted-datum': [ include('datum'), - (r'quote(?=[%s])' % _delimiters, Keyword, + (rf'quote(?=[{_delimiters}])', Keyword, ('#pop', 'quoted-datum')), (r'`', Operator, ('#pop', 'quasiquoted-datum')), - (r'quasiquote(?=[%s])' % _delimiters, Keyword, + (rf'quasiquote(?=[{_delimiters}])', Keyword, ('#pop', 'quasiquoted-datum')), (_opening_parenthesis, Punctuation, ('#pop', 'unquoted-list')), - (words(_keywords, suffix='(?=[%s])' % _delimiters), + (words(_keywords, suffix=f'(?=[{_delimiters}])'), Keyword, '#pop'), - (words(_builtins, suffix='(?=[%s])' % _delimiters), + (words(_builtins, suffix=f'(?=[{_delimiters}])'), Name.Builtin, '#pop'), (_symbol, Name, '#pop'), include('datum*') @@ -1508,7 +1494,7 @@ class RacketLexer(RegexLexer): 'quasiquoted-datum': [ include('datum'), (r',@?', Operator, ('#pop', 'unquoted-datum')), - (r'unquote(-splicing)?(?=[%s])' % _delimiters, Keyword, + (rf'unquote(-splicing)?(?=[{_delimiters}])', Keyword, ('#pop', 'unquoted-datum')), (_opening_parenthesis, Punctuation, ('#pop', 'quasiquoted-list')), include('datum*') @@ -1543,8 +1529,6 @@ class RacketLexer(RegexLexer): class NewLispLexer(RegexLexer): """ For newLISP source code (version 10.3.0). - - .. versionadded:: 1.5 """ name = 'NewLisp' @@ -1552,6 +1536,7 @@ class NewLispLexer(RegexLexer): aliases = ['newlisp'] filenames = ['*.lsp', '*.nl', '*.kif'] mimetypes = ['text/x-newlisp', 'application/x-newlisp'] + version_added = '1.5' flags = re.IGNORECASE | re.MULTILINE @@ -1676,13 +1661,13 @@ class EmacsLispLexer(RegexLexer): """ An ELisp lexer, parsing a stream and outputting the tokens needed to highlight elisp code. - - .. versionadded:: 2.1 """ name = 'EmacsLisp' aliases = ['emacs-lisp', 'elisp', 'emacs'] filenames = ['*.el'] mimetypes = ['text/x-elisp', 'application/x-elisp'] + url = 'https://www.gnu.org/software/emacs' + version_added = '2.1' flags = re.MULTILINE @@ -1695,7 +1680,7 @@ class EmacsLispLexer(RegexLexer): # symbol token, reverse-engineered from hyperspec # Take a deep breath... - symbol = r'((?:%s)(?:%s)*)' % (nonmacro, constituent) + symbol = rf'((?:{nonmacro})(?:{constituent})*)' macros = { 'atomic-change-group', 'case', 'block', 'cl-block', 'cl-callf', 'cl-callf2', @@ -2308,7 +2293,7 @@ def get_tokens_unprocessed(self, text): ], 'string': [ (r'[^"\\`]+', String), - (r'`%s\'' % symbol, String.Symbol), + (rf'`{symbol}\'', String.Symbol), (r'`', String), (r'\\.', String), (r'\\\n', String), @@ -2320,14 +2305,13 @@ def get_tokens_unprocessed(self, text): class ShenLexer(RegexLexer): """ Lexer for Shen source code. - - .. versionadded:: 2.1 """ name = 'Shen' url = 'http://shenlanguage.org/' aliases = ['shen'] filenames = ['*.shen'] mimetypes = ['text/x-shen', 'application/x-shen'] + version_added = '2.1' DECLARATIONS = ( 'datatype', 'define', 'defmacro', 'defprolog', 'defcc', @@ -2375,9 +2359,9 @@ class ShenLexer(RegexLexer): MAPPINGS.update((s, Keyword) for s in SPECIAL_FORMS) valid_symbol_chars = r'[\w!$%*+,<=>?/.\'@&#:-]' - valid_name = '%s+' % valid_symbol_chars - symbol_name = r'[a-z!$%%*+,<=>?/.\'@&#_-]%s*' % valid_symbol_chars - variable = r'[A-Z]%s*' % valid_symbol_chars + valid_name = f'{valid_symbol_chars}+' + symbol_name = rf'[a-z!$%*+,<=>?/.\'@&#_-]{valid_symbol_chars}*' + variable = rf'[A-Z]{valid_symbol_chars}*' tokens = { 'string': [ @@ -2485,13 +2469,13 @@ def _process_signature(self, tokens): class CPSALexer(RegexLexer): """ A CPSA lexer based on the CPSA language as of version 2.2.12 - - .. versionadded:: 2.1 """ name = 'CPSA' aliases = ['cpsa'] filenames = ['*.cpsa'] mimetypes = [] + url = 'https://web.cs.wpi.edu/~guttman/cs564/cpsauser.html' + version_added = '2.1' # list of known keywords and builtins taken form vim 6.4 scheme.vim # syntax file. @@ -2566,14 +2550,13 @@ class XtlangLexer(RegexLexer): This is a mixture of Scheme and xtlang, really. Keyword lists are taken from the Extempore Emacs mode (https://github.com/extemporelang/extempore-emacs-mode) - - .. versionadded:: 2.2 """ name = 'xtlang' url = 'http://extempore.moso.com.au' aliases = ['extempore'] filenames = ['*.xtm'] mimetypes = [] + version_added = '2.2' common_keywords = ( 'lambda', 'define', 'if', 'else', 'cond', 'and', @@ -2769,13 +2752,12 @@ class FennelLexer(RegexLexer): Fennel compiles to Lua, so all the Lua builtins are recognized as well as the special forms that are particular to the Fennel compiler. - - .. versionadded:: 2.3 """ name = 'Fennel' url = 'https://fennel-lang.org' aliases = ['fennel', 'fnl'] filenames = ['*.fnl'] + version_added = '2.3' # this list is current as of Fennel version 0.10.0. special_forms = ( @@ -2846,3 +2828,319 @@ class FennelLexer(RegexLexer): (r'#', Punctuation), ] } + + +class JanetLexer(RegexLexer): + """A lexer for the Janet programming language. + """ + name = 'Janet' + url = 'https://janet-lang.org/' + aliases = ['janet'] + filenames = ['*.janet', '*.jdn'] + mimetypes = ['text/x-janet', 'application/x-janet'] + version_added = '2.18' + + # XXX: gets too slow + #flags = re.MULTILINE | re.VERBOSE + + special_forms = ( + 'break', 'def', 'do', 'fn', 'if', 'quote', 'quasiquote', 'splice', + 'set', 'unquote', 'upscope', 'var', 'while' + ) + + builtin_macros = ( + '%=', '*=', '++', '+=', '--', '-=', '->', '->>', '-?>', + '-?>>', '/=', 'and', 'as->', 'as-macro', 'as?->', + 'assert', 'case', 'catseq', 'chr', 'comment', 'compif', + 'comptime', 'compwhen', 'cond', 'coro', 'def-', + 'default', 'defdyn', 'defer', 'defmacro', 'defmacro-', + 'defn', 'defn-', 'delay', 'doc', 'each', 'eachk', + 'eachp', 'edefer', 'ev/do-thread', 'ev/gather', + 'ev/spawn', 'ev/spawn-thread', 'ev/with-deadline', + 'ffi/defbind', 'fiber-fn', 'for', 'forever', 'forv', + 'generate', 'if-let', 'if-not', 'if-with', 'import', + 'juxt', 'label', 'let', 'loop', 'match', 'or', 'prompt', + 'protect', 'repeat', 'seq', 'short-fn', 'tabseq', + 'toggle', 'tracev', 'try', 'unless', 'use', 'var-', + 'varfn', 'when', 'when-let', 'when-with', 'with', + 'with-dyns', 'with-syms', 'with-vars', + # obsolete builtin macros + 'eachy' + ) + + builtin_functions = ( + '%', '*', '+', '-', '/', '<', '<=', '=', '>', '>=', + 'abstract?', 'accumulate', 'accumulate2', 'all', + 'all-bindings', 'all-dynamics', 'any?', 'apply', + 'array', 'array/clear', 'array/concat', 'array/ensure', + 'array/fill', 'array/insert', 'array/new', + 'array/new-filled', 'array/peek', 'array/pop', + 'array/push', 'array/remove', 'array/slice', + 'array/trim', 'array/weak', 'array?', 'asm', + 'bad-compile', 'bad-parse', 'band', 'blshift', 'bnot', + 'boolean?', 'bor', 'brshift', 'brushift', 'buffer', + 'buffer/bit', 'buffer/bit-clear', 'buffer/bit-set', + 'buffer/bit-toggle', 'buffer/blit', 'buffer/clear', + 'buffer/fill', 'buffer/format', 'buffer/from-bytes', + 'buffer/new', 'buffer/new-filled', 'buffer/popn', + 'buffer/push', 'buffer/push-at', 'buffer/push-byte', + 'buffer/push-string', 'buffer/push-word', + 'buffer/slice', 'buffer/trim', 'buffer?', 'bxor', + 'bytes?', 'cancel', 'cfunction?', 'cli-main', 'cmp', + 'comp', 'compare', 'compare<', 'compare<=', 'compare=', + 'compare>', 'compare>=', 'compile', 'complement', + 'count', 'curenv', 'debug', 'debug/arg-stack', + 'debug/break', 'debug/fbreak', 'debug/lineage', + 'debug/stack', 'debug/stacktrace', 'debug/step', + 'debug/unbreak', 'debug/unfbreak', 'debugger', + 'debugger-on-status', 'dec', 'deep-not=', 'deep=', + 'defglobal', 'describe', 'dictionary?', 'disasm', + 'distinct', 'div', 'doc*', 'doc-format', 'doc-of', + 'dofile', 'drop', 'drop-until', 'drop-while', 'dyn', + 'eflush', 'empty?', 'env-lookup', 'eprin', 'eprinf', + 'eprint', 'eprintf', 'error', 'errorf', + 'ev/acquire-lock', 'ev/acquire-rlock', + 'ev/acquire-wlock', 'ev/all-tasks', 'ev/call', + 'ev/cancel', 'ev/capacity', 'ev/chan', 'ev/chan-close', + 'ev/chunk', 'ev/close', 'ev/count', 'ev/deadline', + 'ev/full', 'ev/give', 'ev/give-supervisor', 'ev/go', + 'ev/lock', 'ev/read', 'ev/release-lock', + 'ev/release-rlock', 'ev/release-wlock', 'ev/rselect', + 'ev/rwlock', 'ev/select', 'ev/sleep', 'ev/take', + 'ev/thread', 'ev/thread-chan', 'ev/write', 'eval', + 'eval-string', 'even?', 'every?', 'extreme', 'false?', + 'ffi/align', 'ffi/call', 'ffi/calling-conventions', + 'ffi/close', 'ffi/context', 'ffi/free', 'ffi/jitfn', + 'ffi/lookup', 'ffi/malloc', 'ffi/native', + 'ffi/pointer-buffer', 'ffi/pointer-cfunction', + 'ffi/read', 'ffi/signature', 'ffi/size', 'ffi/struct', + 'ffi/trampoline', 'ffi/write', 'fiber/can-resume?', + 'fiber/current', 'fiber/getenv', 'fiber/last-value', + 'fiber/maxstack', 'fiber/new', 'fiber/root', + 'fiber/setenv', 'fiber/setmaxstack', 'fiber/status', + 'fiber?', 'file/close', 'file/flush', 'file/lines', + 'file/open', 'file/read', 'file/seek', 'file/tell', + 'file/temp', 'file/write', 'filter', 'find', + 'find-index', 'first', 'flatten', 'flatten-into', + 'flush', 'flycheck', 'freeze', 'frequencies', + 'from-pairs', 'function?', 'gccollect', 'gcinterval', + 'gcsetinterval', 'gensym', 'get', 'get-in', 'getline', + 'getproto', 'group-by', 'has-key?', 'has-value?', + 'hash', 'idempotent?', 'identity', 'import*', 'in', + 'inc', 'index-of', 'indexed?', 'int/s64', + 'int/to-bytes', 'int/to-number', 'int/u64', 'int?', + 'interleave', 'interpose', 'invert', 'juxt*', 'keep', + 'keep-syntax', 'keep-syntax!', 'keys', 'keyword', + 'keyword/slice', 'keyword?', 'kvs', 'last', 'length', + 'lengthable?', 'load-image', 'macex', 'macex1', + 'maclintf', 'make-env', 'make-image', 'map', 'mapcat', + 'marshal', 'math/abs', 'math/acos', 'math/acosh', + 'math/asin', 'math/asinh', 'math/atan', 'math/atan2', + 'math/atanh', 'math/cbrt', 'math/ceil', 'math/cos', + 'math/cosh', 'math/erf', 'math/erfc', 'math/exp', + 'math/exp2', 'math/expm1', 'math/floor', 'math/gamma', + 'math/gcd', 'math/hypot', 'math/lcm', 'math/log', + 'math/log-gamma', 'math/log10', 'math/log1p', + 'math/log2', 'math/next', 'math/pow', 'math/random', + 'math/rng', 'math/rng-buffer', 'math/rng-int', + 'math/rng-uniform', 'math/round', 'math/seedrandom', + 'math/sin', 'math/sinh', 'math/sqrt', 'math/tan', + 'math/tanh', 'math/trunc', 'max', 'max-of', 'mean', + 'memcmp', 'merge', 'merge-into', 'merge-module', 'min', + 'min-of', 'mod', 'module/add-paths', + 'module/expand-path', 'module/find', 'module/value', + 'nan?', 'nat?', 'native', 'neg?', 'net/accept', + 'net/accept-loop', 'net/address', 'net/address-unpack', + 'net/chunk', 'net/close', 'net/connect', 'net/flush', + 'net/listen', 'net/localname', 'net/peername', + 'net/read', 'net/recv-from', 'net/send-to', + 'net/server', 'net/setsockopt', 'net/shutdown', + 'net/write', 'next', 'nil?', 'not', 'not=', 'number?', + 'odd?', 'one?', 'os/arch', 'os/cd', 'os/chmod', + 'os/clock', 'os/compiler', 'os/cpu-count', + 'os/cryptorand', 'os/cwd', 'os/date', 'os/dir', + 'os/environ', 'os/execute', 'os/exit', 'os/getenv', + 'os/isatty', 'os/link', 'os/lstat', 'os/mkdir', + 'os/mktime', 'os/open', 'os/perm-int', 'os/perm-string', + 'os/pipe', 'os/posix-exec', 'os/posix-fork', + 'os/proc-close', 'os/proc-kill', 'os/proc-wait', + 'os/readlink', 'os/realpath', 'os/rename', 'os/rm', + 'os/rmdir', 'os/setenv', 'os/shell', 'os/sigaction', + 'os/sleep', 'os/spawn', 'os/stat', 'os/strftime', + 'os/symlink', 'os/time', 'os/touch', 'os/umask', + 'os/which', 'pairs', 'parse', 'parse-all', + 'parser/byte', 'parser/clone', 'parser/consume', + 'parser/eof', 'parser/error', 'parser/flush', + 'parser/has-more', 'parser/insert', 'parser/new', + 'parser/produce', 'parser/state', 'parser/status', + 'parser/where', 'partial', 'partition', 'partition-by', + 'peg/compile', 'peg/find', 'peg/find-all', 'peg/match', + 'peg/replace', 'peg/replace-all', 'pos?', 'postwalk', + 'pp', 'prewalk', 'prin', 'prinf', 'print', 'printf', + 'product', 'propagate', 'put', 'put-in', 'quit', + 'range', 'reduce', 'reduce2', 'repl', 'require', + 'resume', 'return', 'reverse', 'reverse!', + 'run-context', 'sandbox', 'scan-number', 'setdyn', + 'signal', 'slice', 'slurp', 'some', 'sort', 'sort-by', + 'sorted', 'sorted-by', 'spit', 'string', + 'string/ascii-lower', 'string/ascii-upper', + 'string/bytes', 'string/check-set', 'string/find', + 'string/find-all', 'string/format', 'string/from-bytes', + 'string/has-prefix?', 'string/has-suffix?', + 'string/join', 'string/repeat', 'string/replace', + 'string/replace-all', 'string/reverse', 'string/slice', + 'string/split', 'string/trim', 'string/triml', + 'string/trimr', 'string?', 'struct', 'struct/getproto', + 'struct/proto-flatten', 'struct/to-table', + 'struct/with-proto', 'struct?', 'sum', 'symbol', + 'symbol/slice', 'symbol?', 'table', 'table/clear', + 'table/clone', 'table/getproto', 'table/new', + 'table/proto-flatten', 'table/rawget', 'table/setproto', + 'table/to-struct', 'table/weak', 'table/weak-keys', + 'table/weak-values', 'table?', 'take', 'take-until', + 'take-while', 'thaw', 'trace', 'true?', 'truthy?', + 'tuple', 'tuple/brackets', 'tuple/setmap', + 'tuple/slice', 'tuple/sourcemap', 'tuple/type', + 'tuple?', 'type', 'unmarshal', 'untrace', 'update', + 'update-in', 'values', 'varglobal', 'walk', + 'warn-compile', 'xprin', 'xprinf', 'xprint', 'xprintf', + 'yield', 'zero?', 'zipcoll', + # obsolete builtin functions + 'tarray/buffer', 'tarray/copy-bytes', 'tarray/length', + 'tarray/new', 'tarray/properties', 'tarray/slice', + 'tarray/swap-bytes', 'thread/close', 'thread/current', + 'thread/exit', 'thread/new', 'thread/receive', + 'thread/send' + ) + + builtin_variables = ( + 'debugger-env', 'default-peg-grammar', 'janet/build', + 'janet/config-bits', 'janet/version', 'load-image-dict', + 'make-image-dict', 'math/-inf', 'math/e', 'math/inf', + 'math/int-max', 'math/int-min', 'math/int32-max', + 'math/int32-min', 'math/nan', 'math/pi', 'module/cache', + 'module/loaders', 'module/loading', 'module/paths', + 'root-env', 'stderr', 'stdin', 'stdout' + ) + + constants = ( + 'false', 'nil', 'true' + ) + + # XXX: this form not usable to pass to `suffix=` + #_token_end = r''' + # (?= # followed by one of: + # \s # whitespace + # | \# # comment + # | [)\]] # end delimiters + # | $ # end of file + # ) + #''' + + # ...so, express it like this + _token_end = r'(?=\s|#|[)\]]|$)' + + _first_char = r'[a-zA-Z!$%&*+\-./<=>?@^_]' + _rest_char = rf'([0-9:]|{_first_char})' + + valid_name = rf'{_first_char}({_rest_char})*' + + _radix_unit = r'[0-9a-zA-Z][0-9a-zA-Z_]*' + + # exponent marker, optional sign, one or more alphanumeric + _radix_exp = r'&[+-]?[0-9a-zA-Z]+' + + # 2af3__bee_ + _hex_unit = r'[0-9a-fA-F][0-9a-fA-F_]*' + + # 12_000__ + _dec_unit = r'[0-9][0-9_]*' + + # E-23 + # lower or uppercase e, optional sign, one or more digits + _dec_exp = r'[eE][+-]?[0-9]+' + + tokens = { + 'root': [ + (r'#.*$', Comment.Single), + + (r'\s+', Whitespace), + + # radix number + (rf'''(?x) + [+-]? [0-9]{{1,2}} r {_radix_unit} \. ({_radix_unit})? + ({_radix_exp})? + ''', + Number), + + (rf'''(?x) + [+-]? [0-9]{{1,2}} r (\.)? {_radix_unit} + ({_radix_exp})? + ''', + Number), + + # hex number + (rf'(?x) [+-]? 0x {_hex_unit} \. ({_hex_unit})?', + Number.Hex), + + (rf'(?x) [+-]? 0x (\.)? {_hex_unit}', + Number.Hex), + + # decimal number + (rf'(?x) [+-]? {_dec_unit} \. ({_dec_unit})? ({_dec_exp})?', + Number.Float), + + (rf'(?x) [+-]? (\.)? {_dec_unit} ({_dec_exp})?', + Number.Float), + + # strings and buffers + (r'@?"', String, 'string'), + + # long-strings and long-buffers + # + # non-empty content enclosed by a pair of n-backticks + # with optional leading @ + (r'@?(`+)(.|\n)+?\1', String), + + # things that hang out on front + # + # ' ~ , ; | + (r"['~,;|]", Operator), + + # collection delimiters + # + # @( ( ) + # @[ [ ] + # @{ { } + (r'@?[(\[{]|[)\]}]', Punctuation), + + # constants + (words(constants, suffix=_token_end), Keyword.Constants), + + # keywords + (rf'(:({_rest_char})+|:)', Name.Constant), + + # symbols + (words(builtin_variables, suffix=_token_end), + Name.Variable.Global), + + (words(special_forms, prefix=r'(?<=\()', suffix=_token_end), + Keyword.Reserved), + + (words(builtin_macros, prefix=r'(?<=\()', suffix=_token_end), + Name.Builtin), + + (words(builtin_functions, prefix=r'(?<=\()', suffix=_token_end), + Name.Function), + + # other symbols + (valid_name, Name.Variable), + ], + 'string': [ + (r'\\(u[0-9a-fA-F]{4}|U[0-9a-fA-F]{6})', String.Escape), + (r'\\x[0-9a-fA-F]{2}', String.Escape), + (r'\\.', String.Escape), + (r'"', String, '#pop'), + (r'[^\\"]+', String), + ] + } diff --git a/libs/pygments/lexers/macaulay2.py b/libs/pygments/lexers/macaulay2.py index a624890d8..6ea03ae23 100644 --- a/libs/pygments/lexers/macaulay2.py +++ b/libs/pygments/lexers/macaulay2.py @@ -4,7 +4,7 @@ Lexer for Macaulay2. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -13,7 +13,7 @@ __all__ = ['Macaulay2Lexer'] -# Auto-generated for Macaulay2-1.22. Do not modify this file manually. +# Auto-generated for Macaulay2-1.23. Do not modify this file manually. M2KEYWORDS = ( "and", @@ -60,6 +60,7 @@ "AngleBarList", "Array", "AssociativeExpression", + "AtomicInt", "Bag", "BasicList", "BettiTally", @@ -222,6 +223,7 @@ "Sequence", "Set", "SheafExpression", + "SheafMap", "SheafOfRings", "SMALL", "SPAN", @@ -334,6 +336,7 @@ "borel", "cacheValue", "cancelTask", + "canonicalBundle", "capture", "ceiling", "centerString", @@ -369,6 +372,7 @@ "commonest", "commonRing", "comodule", + "compareExchange", "complement", "complete", "components", @@ -459,6 +463,7 @@ "even", "EXAMPLE", "examples", + "exchange", "exec", "exp", "expectedReesIdeal", @@ -624,6 +629,7 @@ "isInputFile", "isIsomorphic", "isIsomorphism", + "isLiftable", "isLinearType", "isListener", "isLLL", @@ -638,6 +644,7 @@ "isPrimary", "isPrime", "isPrimitive", + "isProjective", "isPseudoprime", "isQuotientModule", "isQuotientOf", @@ -846,7 +853,9 @@ "prune", "pseudocode", "pseudoRemainder", + "pullback", "pushForward", + "pushout", "QQParser", "QRDecomposition", "quotient", @@ -857,6 +866,7 @@ "randomKRationalPoint", "randomMutableMatrix", "rank", + "rays", "read", "readDirectory", "readlink", @@ -939,6 +949,7 @@ "setupEmacs", "sheaf", "sheafHom", + "sheafMap", "show", "showHtml", "showTex", @@ -968,6 +979,7 @@ "standardPairs", "stashValue", "status", + "store", "style", "sub", "sublists", @@ -1075,10 +1087,12 @@ ) M2CONSTANTS = ( + "A1BrouwerDegrees", "AbstractToricVarieties", "Acknowledgement", "AdditionalPaths", "AdjointIdeal", + "AdjunctionForSurfaces", "AfterEval", "AfterNoPrint", "AfterPrint", @@ -1097,6 +1111,7 @@ "AuxiliaryFiles", "backtrace", "Bareiss", + "Base", "BaseFunction", "baseRings", "BaseRow", @@ -1279,6 +1294,7 @@ "globalAssignmentHooks", "GlobalHookStore", "GlobalReleaseHook", + "GlobalSectionLimit", "Gorenstein", "GradedLieAlgebras", "GraphicalModels", @@ -1389,6 +1405,7 @@ "MapleInterface", "Markov", "MatchingFields", + "MatrixSchubert", "Matroids", "maxAllowableThreads", "maxExponent", @@ -1449,6 +1466,8 @@ "NumericalLinearAlgebra", "NumericalSchubertCalculus", "NumericSolutions", + "numTBBThreads", + "OIGroebnerBases", "OldPolyhedra", "OldToricVectorBundles", "OnlineLookup", @@ -1471,6 +1490,8 @@ "PackageTemplate", "PairLimit", "PairsRemaining", + "ParallelF4", + "ParallelizeByDegree", "Parametrization", "Parsing", "path", @@ -1480,6 +1501,7 @@ "PhylogeneticTrees", "pi", "PieriMaps", + "PlaneCurveLinearSeries", "PlaneCurveSingularities", "Points", "Polyhedra", @@ -1515,9 +1537,12 @@ "pruningMap", "PseudomonomialPrimaryDecomposition", "Pullback", + "pullbackMaps", "PushForward", + "pushoutMaps", "Python", "QthPower", + "QuadraticIdealExamplesByRoos", "Quasidegrees", "QuaternaryQuartics", "QuillenSuslin", @@ -1568,6 +1593,7 @@ "Reverse", "RevLex", "Right", + "RInterface", "rootPath", "rootURI", "RunDirectory", @@ -1575,6 +1601,7 @@ "RunExternalM2", "SagbiGbDetection", "Saturation", + "SaturationMap", "Schubert2", "SchurComplexes", "SchurFunctors", @@ -1647,6 +1674,7 @@ "TangentCone", "TateOnProducts", "TensorComplexes", + "TerraciniLoci", "Test", "testExample", "TestIdeals", @@ -1664,6 +1692,7 @@ "ToricTopology", "ToricVectorBundles", "Torsion", + "TorsionFree", "TotalPairs", "Tree", "TriangularSets", @@ -1690,9 +1719,11 @@ "UseHilbertFunction", "UserMode", "UseSyzygies", + "Valuations", "Variable", "VariableBaseName", "Variables", + "Varieties", "Vasconcelos", "VectorFields", "VectorGraphics", @@ -1709,6 +1740,7 @@ "WebApp", "Weights", "WeylAlgebra", + "WeylAlgebras", "WeylGroups", "WhitneyStratifications", "Wrap", @@ -1722,6 +1754,7 @@ class Macaulay2Lexer(RegexLexer): url = 'https://macaulay2.com/' aliases = ['macaulay2'] filenames = ['*.m2'] + version_added = '2.12' tokens = { 'root': [ diff --git a/libs/pygments/lexers/make.py b/libs/pygments/lexers/make.py index 0f54ab693..463e46e75 100644 --- a/libs/pygments/lexers/make.py +++ b/libs/pygments/lexers/make.py @@ -4,7 +4,7 @@ Lexers for Makefiles and similar. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -31,6 +31,8 @@ class MakefileLexer(Lexer): aliases = ['make', 'makefile', 'mf', 'bsdmake'] filenames = ['*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile'] mimetypes = ['text/x-makefile'] + url = 'https://en.wikipedia.org/wiki/Make_(software)' + version_added = '' r_special = re.compile( r'^(?:' @@ -67,14 +69,14 @@ def analyse_text(text): class BaseMakefileLexer(RegexLexer): """ Lexer for simple Makefiles (no preprocessing). - - .. versionadded:: 0.10 """ name = 'Base Makefile' aliases = ['basemake'] filenames = [] mimetypes = [] + url = 'https://en.wikipedia.org/wiki/Make_(software)' + version_added = '0.10' tokens = { 'root': [ @@ -129,14 +131,13 @@ class BaseMakefileLexer(RegexLexer): class CMakeLexer(RegexLexer): """ Lexer for CMake files. - - .. versionadded:: 1.2 """ name = 'CMake' url = 'https://cmake.org/documentation/' aliases = ['cmake'] filenames = ['*.cmake', 'CMakeLists.txt'] mimetypes = ['text/x-cmake'] + version_added = '1.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/markup.py b/libs/pygments/lexers/markup.py index bb4c7cecf..5d5ff2c9f 100644 --- a/libs/pygments/lexers/markup.py +++ b/libs/pygments/lexers/markup.py @@ -4,7 +4,7 @@ Lexers for non-HTML markup languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,25 +19,26 @@ from pygments.lexer import RegexLexer, DelegatingLexer, include, bygroups, \ using, this, do_insertions, default, words from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ - Number, Punctuation, Generic, Other, Whitespace + Number, Punctuation, Generic, Other, Whitespace, Literal from pygments.util import get_bool_opt, ClassNotFound __all__ = ['BBCodeLexer', 'MoinWikiLexer', 'RstLexer', 'TexLexer', 'GroffLexer', 'MozPreprocHashLexer', 'MozPreprocPercentLexer', 'MozPreprocXulLexer', 'MozPreprocJavascriptLexer', - 'MozPreprocCssLexer', 'MarkdownLexer', 'TiddlyWiki5Lexer', 'WikitextLexer'] + 'MozPreprocCssLexer', 'MarkdownLexer', 'OrgLexer', 'TiddlyWiki5Lexer', + 'WikitextLexer'] class BBCodeLexer(RegexLexer): """ A lexer that highlights BBCode(-like) syntax. - - .. versionadded:: 0.6 """ name = 'BBCode' aliases = ['bbcode'] mimetypes = ['text/x-bbcode'] + url = 'https://www.bbcode.org/' + version_added = '0.6' tokens = { 'root': [ @@ -64,14 +65,15 @@ class BBCodeLexer(RegexLexer): class MoinWikiLexer(RegexLexer): """ For MoinMoin (and Trac) Wiki markup. - - .. versionadded:: 0.7 """ name = 'MoinMoin/Trac Wiki markup' aliases = ['trac-wiki', 'moin'] filenames = [] mimetypes = ['text/x-trac-wiki'] + url = 'https://moinmo.in' + version_added = '0.7' + flags = re.MULTILINE | re.IGNORECASE tokens = { @@ -110,8 +112,6 @@ class RstLexer(RegexLexer): """ For reStructuredText markup. - .. versionadded:: 0.7 - Additional options accepted: `handlecodeblocks` @@ -127,6 +127,7 @@ class RstLexer(RegexLexer): aliases = ['restructuredtext', 'rst', 'rest'] filenames = ['*.rst', '*.rest'] mimetypes = ["text/x-rst", "text/prs.fallenstein.rst"] + version_added = '0.7' flags = re.MULTILINE def _handle_sourcecode(self, match): @@ -172,9 +173,7 @@ def _handle_sourcecode(self, match): # from docutils.parsers.rst.states closers = '\'")]}>\u2019\u201d\xbb!?' unicode_delimiters = '\u2010\u2011\u2012\u2013\u2014\u00a0' - end_string_suffix = (r'((?=$)|(?=[-/:.,; \n\x00%s%s]))' - % (re.escape(unicode_delimiters), - re.escape(closers))) + end_string_suffix = (rf'((?=$)|(?=[-/:.,; \n\x00{re.escape(unicode_delimiters)}{re.escape(closers)}]))') tokens = { 'root': [ @@ -222,7 +221,7 @@ def _handle_sourcecode(self, match): bygroups(Punctuation, Text, Name.Tag, Text, Operator.Word, Punctuation, Text, using(this, state='inline'))), # Comments - (r'^ *\.\..*(\n( +.*\n|\n)+)?', Comment.Preproc), + (r'^ *\.\..*(\n( +.*\n|\n)+)?', Comment), # Field list marker (r'^( *)(:(?:\\\\|\\:|[^:\n])+:(?=\s))([ \t]*)', bygroups(Text, Name.Class, Text)), @@ -283,6 +282,8 @@ class TexLexer(RegexLexer): aliases = ['tex', 'latex'] filenames = ['*.tex', '*.aux', '*.toc'] mimetypes = ['text/x-tex', 'text/x-latex'] + url = 'https://tug.org' + version_added = '' tokens = { 'general': [ @@ -295,13 +296,13 @@ class TexLexer(RegexLexer): (r'\\\(', String, 'inlinemath'), (r'\$\$', String.Backtick, 'displaymath'), (r'\$', String, 'inlinemath'), - (r'\\([a-zA-Z]+|.)', Keyword, 'command'), + (r'\\([a-zA-Z@_:]+|\S?)', Keyword, 'command'), (r'\\$', Keyword), include('general'), (r'[^\\$%&_^{}]+', Text), ], 'math': [ - (r'\\([a-zA-Z]+|.)', Name.Variable), + (r'\\([a-zA-Z]+|\S?)', Name.Variable), include('general'), (r'[0-9]+', Number), (r'[-=!+*/()\[\]]', Operator), @@ -336,14 +337,14 @@ class GroffLexer(RegexLexer): """ Lexer for the (g)roff typesetting language, supporting groff extensions. Mainly useful for highlighting manpage sources. - - .. versionadded:: 0.6 """ name = 'Groff' aliases = ['groff', 'nroff', 'man'] filenames = ['*.[1-9]', '*.man', '*.1p', '*.3pm'] mimetypes = ['application/x-troff', 'text/troff'] + url = 'https://www.gnu.org/software/groff' + version_added = '0.6' tokens = { 'root': [ @@ -393,13 +394,13 @@ class MozPreprocHashLexer(RegexLexer): Lexer for Mozilla Preprocessor files (with '#' as the marker). Other data is left untouched. - - .. versionadded:: 2.0 """ name = 'mozhashpreproc' aliases = [name] filenames = [] mimetypes = [] + url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html' + version_added = '2.0' tokens = { 'root': [ @@ -434,13 +435,13 @@ class MozPreprocPercentLexer(MozPreprocHashLexer): Lexer for Mozilla Preprocessor files (with '%' as the marker). Other data is left untouched. - - .. versionadded:: 2.0 """ name = 'mozpercentpreproc' aliases = [name] filenames = [] mimetypes = [] + url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html' + version_added = '2.0' tokens = { 'root': [ @@ -454,13 +455,13 @@ class MozPreprocXulLexer(DelegatingLexer): """ Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the `XmlLexer`. - - .. versionadded:: 2.0 """ name = "XUL+mozpreproc" aliases = ['xul+mozpreproc'] filenames = ['*.xul.in'] mimetypes = [] + url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html' + version_added = '2.0' def __init__(self, **options): super().__init__(XmlLexer, MozPreprocHashLexer, **options) @@ -470,13 +471,13 @@ class MozPreprocJavascriptLexer(DelegatingLexer): """ Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the `JavascriptLexer`. - - .. versionadded:: 2.0 """ name = "Javascript+mozpreproc" aliases = ['javascript+mozpreproc'] filenames = ['*.js.in'] mimetypes = [] + url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html' + version_added = '2.0' def __init__(self, **options): super().__init__(JavascriptLexer, MozPreprocHashLexer, **options) @@ -486,13 +487,13 @@ class MozPreprocCssLexer(DelegatingLexer): """ Subclass of the `MozPreprocHashLexer` that highlights unlexed data with the `CssLexer`. - - .. versionadded:: 2.0 """ name = "CSS+mozpreproc" aliases = ['css+mozpreproc'] filenames = ['*.css.in'] mimetypes = [] + url = 'https://firefox-source-docs.mozilla.org/build/buildsystem/preprocessor.html' + version_added = '2.0' def __init__(self, **options): super().__init__(CssLexer, MozPreprocPercentLexer, **options) @@ -501,14 +502,13 @@ def __init__(self, **options): class MarkdownLexer(RegexLexer): """ For Markdown markup. - - .. versionadded:: 2.2 """ name = 'Markdown' url = 'https://daringfireball.net/projects/markdown/' aliases = ['markdown', 'md'] filenames = ['*.md', '*.markdown'] mimetypes = ["text/x-markdown"] + version_added = '2.2' flags = re.MULTILINE def _handle_codeblock(self, match): @@ -618,18 +618,125 @@ def __init__(self, **options): self.handlecodeblocks = get_bool_opt(options, 'handlecodeblocks', True) RegexLexer.__init__(self, **options) +class OrgLexer(RegexLexer): + """ + For Org Mode markup. + """ + name = 'Org Mode' + url = 'https://orgmode.org' + aliases = ['org', 'orgmode', 'org-mode'] + filenames = ['*.org'] + mimetypes = ["text/org"] + version_added = '2.18' + + def _inline(start, end): + return rf'(?<!\w){start}(.|\n(?!\n))+?{end}(?!\w)' + + tokens = { + 'root': [ + (r'^# .*', Comment.Single), + + # Headings + (r'^(\* )(COMMENT)( .*)', + bygroups(Generic.Heading, Comment.Preproc, Generic.Heading)), + (r'^(\*\*+ )(COMMENT)( .*)', + bygroups(Generic.Subheading, Comment.Preproc, Generic.Subheading)), + (r'^(\* )(DONE)( .*)', + bygroups(Generic.Heading, Generic.Deleted, Generic.Heading)), + (r'^(\*\*+ )(DONE)( .*)', + bygroups(Generic.Subheading, Generic.Deleted, Generic.Subheading)), + (r'^(\* )(TODO)( .*)', + bygroups(Generic.Heading, Generic.Error, Generic.Heading)), + (r'^(\*\*+ )(TODO)( .*)', + bygroups(Generic.Subheading, Generic.Error, Generic.Subheading)), + + (r'^(\* .+?)( :[a-zA-Z0-9_@:]+:)?$', bygroups(Generic.Heading, Generic.Emph)), + (r'^(\*\*+ .+?)( :[a-zA-Z0-9_@:]+:)?$', bygroups(Generic.Subheading, Generic.Emph)), + + # Unordered lists items, including TODO items and description items + (r'^(?:( *)([+-] )|( +)(\* ))(\[[ X-]\])?(.+ ::)?', + bygroups(Whitespace, Keyword, Whitespace, Keyword, Generic.Prompt, Name.Label)), + + # Ordered list items + (r'^( *)([0-9]+[.)])( \[@[0-9]+\])?', bygroups(Whitespace, Keyword, Generic.Emph)), + + # Dynamic blocks + (r'(?i)^( *#\+begin: *)((?:.|\n)*?)(^ *#\+end: *$)', + bygroups(Operator.Word, using(this), Operator.Word)), + + # Comment blocks + (r'(?i)^( *#\+begin_comment *\n)((?:.|\n)*?)(^ *#\+end_comment *$)', + bygroups(Operator.Word, Comment.Multiline, Operator.Word)), + + # Source code blocks + # TODO: language-dependent syntax highlighting (see Markdown lexer) + (r'(?i)^( *#\+begin_src .*)((?:.|\n)*?)(^ *#\+end_src *$)', + bygroups(Operator.Word, Text, Operator.Word)), + + # Other blocks + (r'(?i)^( *#\+begin_\w+)( *\n)((?:.|\n)*?)(^ *#\+end_\w+)( *$)', + bygroups(Operator.Word, Whitespace, Text, Operator.Word, Whitespace)), + + # Keywords + (r'^(#\+\w+:)(.*)$', bygroups(Name.Namespace, Text)), + + # Properties and drawers + (r'(?i)^( *:\w+: *\n)((?:.|\n)*?)(^ *:end: *$)', + bygroups(Name.Decorator, Comment.Special, Name.Decorator)), + + # Line break operator + (r'\\\\$', Operator), + + # Deadline, Scheduled, CLOSED + (r'(?i)^( *(?:DEADLINE|SCHEDULED): )(<.+?> *)$', + bygroups(Generic.Error, Literal.Date)), + (r'(?i)^( *CLOSED: )(\[.+?\] *)$', + bygroups(Generic.Deleted, Literal.Date)), + + # Bold + (_inline(r'\*', r'\*+'), Generic.Strong), + # Italic + (_inline(r'/', r'/'), Generic.Emph), + # Verbatim + (_inline(r'=', r'='), String), # TODO token + # Code + (_inline(r'~', r'~'), String), + # Strikethrough + (_inline(r'\+', r'\+'), Generic.Deleted), + # Underline + (_inline(r'_', r'_+'), Generic.EmphStrong), + + # Dates + (r'<.+?>', Literal.Date), + # Macros + (r'\{\{\{.+?\}\}\}', Comment.Preproc), + # Footnotes + (r'(?<!\[)\[fn:.+?\]', Name.Tag), + # Links + (r'(?s)(\[\[)(.*?)(\]\[)(.*?)(\]\])', + bygroups(Punctuation, Name.Attribute, Punctuation, Name.Tag, Punctuation)), + (r'(?s)(\[\[)(.+?)(\]\])', bygroups(Punctuation, Name.Attribute, Punctuation)), + (r'(<<)(.+?)(>>)', bygroups(Punctuation, Name.Attribute, Punctuation)), + + # Tables + (r'^( *)(\|[ -].*?[ -]\|)$', bygroups(Whitespace, String)), + + # Any other text + (r'[^#*+\-0-9:\\/=~_<{\[|\n]+', Text), + (r'[#*+\-0-9:\\/=~_<{\[|\n]', Text), + ], + } class TiddlyWiki5Lexer(RegexLexer): """ For TiddlyWiki5 markup. - - .. versionadded:: 2.7 """ name = 'tiddler' url = 'https://tiddlywiki.com/#TiddlerFiles' aliases = ['tid'] filenames = ['*.tid'] mimetypes = ["text/vnd.tiddlywiki"] + version_added = '2.7' flags = re.MULTILINE def _handle_codeblock(self, match): @@ -786,19 +893,18 @@ class WikitextLexer(RegexLexer): installations, so we only highlight common syntaxes (built-in or from popular extensions), and also assume templates produce no unbalanced syntaxes. - - .. versionadded:: 2.15 """ name = 'Wikitext' url = 'https://www.mediawiki.org/wiki/Wikitext' aliases = ['wikitext', 'mediawiki'] filenames = [] mimetypes = ['text/x-wiki'] + version_added = '2.15' flags = re.MULTILINE def nowiki_tag_rules(tag_name): return [ - (r'(?i)(</)({})(\s*)(>)'.format(tag_name), bygroups(Punctuation, + (rf'(?i)(</)({tag_name})(\s*)(>)', bygroups(Punctuation, Name.Tag, Whitespace, Punctuation), '#pop'), include('entity'), include('text'), @@ -806,15 +912,15 @@ def nowiki_tag_rules(tag_name): def plaintext_tag_rules(tag_name): return [ - (r'(?si)(.*?)(</)({})(\s*)(>)'.format(tag_name), bygroups(Text, + (rf'(?si)(.*?)(</)({tag_name})(\s*)(>)', bygroups(Text, Punctuation, Name.Tag, Whitespace, Punctuation), '#pop'), ] - def delegate_tag_rules(tag_name, lexer): + def delegate_tag_rules(tag_name, lexer, **lexer_kwargs): return [ - (r'(?i)(</)({})(\s*)(>)'.format(tag_name), bygroups(Punctuation, + (rf'(?i)(</)({tag_name})(\s*)(>)', bygroups(Punctuation, Name.Tag, Whitespace, Punctuation), '#pop'), - (r'(?si).+?(?=</{}\s*>)'.format(tag_name), using(lexer)), + (rf'(?si).+?(?=</{tag_name}\s*>)', using(lexer, **lexer_kwargs)), ] def text_rules(token): @@ -946,8 +1052,6 @@ def handle_score(self, match, ctx): 'sh-latn', 'sh-cyrl', # KuConverter.php 'ku', 'ku-arab', 'ku-latn', - # KkConverter.php - 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn', # IuConverter.php 'iu', 'ike-cans', 'ike-latn', # GanConverter.php @@ -1020,7 +1124,7 @@ def handle_score(self, match, ctx): (r'(?i)\b(?:{}){}{}*'.format('|'.join(protocols), link_address, link_char_class), Name.Label), # Magic links - (r'\b(?:RFC|PMID){}+[0-9]+\b'.format(nbsp_char), + (rf'\b(?:RFC|PMID){nbsp_char}+[0-9]+\b', Name.Function.Magic), (r"""(?x) \bISBN {nbsp_char} @@ -1035,7 +1139,7 @@ def handle_score(self, match, ctx): 'redirect-inner': [ (r'(\]\])(\s*?\n)', bygroups(Punctuation, Whitespace), '#pop'), (r'(\#)([^#]*?)', bygroups(Punctuation, Name.Label)), - (r'(?i)[{}]+'.format(title_char), Name.Tag), + (rf'(?i)[{title_char}]+', Name.Tag), ], 'list': [ # Description lists @@ -1062,9 +1166,9 @@ def handle_score(self, match, ctx): r"""(?xi) (\[\[) (File|Image) (:) - ((?: [%s] | \{{2,3}[^{}]*?\}{2,3} | <!--[\s\S]*?--> )*) - (?: (\#) ([%s]*?) )? - """ % (title_char, f'{title_char}#'), + ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | <!--[\s\S]*?--> )*) + (?: (\#) ([{}]*?) )? + """.format(title_char, f'{title_char}#'), bygroups(Punctuation, Name.Namespace, Punctuation, using(this, state=['wikilink-name']), Punctuation, Name.Label), 'medialink-inner' @@ -1072,24 +1176,24 @@ def handle_score(self, match, ctx): # Wikilinks ( r"""(?xi) - (\[\[)(?!%s) # Should not contain URLs - (?: ([%s]*) (:))? - ((?: [%s] | \{{2,3}[^{}]*?\}{2,3} | <!--[\s\S]*?--> )*?) - (?: (\#) ([%s]*?) )? + (\[\[)(?!{}) # Should not contain URLs + (?: ([{}]*) (:))? + ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | <!--[\s\S]*?--> )*?) + (?: (\#) ([{}]*?) )? (\]\]) - """ % ('|'.join(protocols), title_char.replace('/', ''), + """.format('|'.join(protocols), title_char.replace('/', ''), title_char, f'{title_char}#'), bygroups(Punctuation, Name.Namespace, Punctuation, using(this, state=['wikilink-name']), Punctuation, Name.Label, Punctuation) ), ( r"""(?xi) - (\[\[)(?!%s) - (?: ([%s]*) (:))? - ((?: [%s] | \{{2,3}[^{}]*?\}{2,3} | <!--[\s\S]*?--> )*?) - (?: (\#) ([%s]*?) )? + (\[\[)(?!{}) + (?: ([{}]*) (:))? + ((?: [{}] | \{{{{2,3}}[^{{}}]*?\}}{{2,3}} | <!--[\s\S]*?--> )*?) + (?: (\#) ([{}]*?) )? (\|) - """ % ('|'.join(protocols), title_char.replace('/', ''), + """.format('|'.join(protocols), title_char.replace('/', ''), title_char, f'{title_char}#'), bygroups(Punctuation, Name.Namespace, Punctuation, using(this, state=['wikilink-name']), Punctuation, Name.Label, Punctuation), @@ -1192,7 +1296,7 @@ def handle_score(self, match, ctx): r"""(?xi) (-\{{) # Use {{ to escape format() ([^|]) (\|) - (?: + (?: (?: ([^;]*?) (=>))? (\s* (?:{variants}) \s*) (:) )? @@ -1322,9 +1426,9 @@ def handle_score(self, match, ctx): 'parameter-inner', ), # Magic variables - (r'(?i)(\{\{)(\s*)(%s)(\s*)(\}\})' % '|'.join(magic_vars_i), + (r'(?i)(\{{\{{)(\s*)({})(\s*)(\}}\}})'.format('|'.join(magic_vars_i)), bygroups(Punctuation, Whitespace, Name.Function, Whitespace, Punctuation)), - (r'(\{\{)(\s*)(%s)(\s*)(\}\})' % '|'.join(magic_vars), + (r'(\{{\{{)(\s*)({})(\s*)(\}}\}})'.format('|'.join(magic_vars)), bygroups(Punctuation, Whitespace, Name.Function, Whitespace, Punctuation)), # Parser functions & templates (r'\{\{', Punctuation, 'template-begin-space'), @@ -1350,17 +1454,17 @@ def handle_score(self, match, ctx): (r'\s+', Whitespace), # Parser functions ( - r'(?i)(\#[%s]*?|%s)(:)' % (title_char, + r'(?i)(\#[{}]*?|{})(:)'.format(title_char, '|'.join(parser_functions_i)), bygroups(Name.Function, Punctuation), ('#pop', 'template-inner') ), ( - r'(%s)(:)' % ('|'.join(parser_functions)), + r'({})(:)'.format('|'.join(parser_functions)), bygroups(Name.Function, Punctuation), ('#pop', 'template-inner') ), # Templates ( - r'(?i)([%s]*?)(:)' % title_char, + rf'(?i)([{title_char}]*?)(:)', bygroups(Name.Namespace, Punctuation), ('#pop', 'template-name') ), default(('#pop', 'template-name'),), @@ -1539,9 +1643,9 @@ def handle_score(self, match, ctx): 'tag-gallery': plaintext_tag_rules('gallery'), 'tag-graph': plaintext_tag_rules('graph'), 'tag-rss': plaintext_tag_rules('rss'), - 'tag-math': delegate_tag_rules('math', TexLexer), - 'tag-chem': delegate_tag_rules('chem', TexLexer), - 'tag-ce': delegate_tag_rules('ce', TexLexer), + 'tag-math': delegate_tag_rules('math', TexLexer, state='math'), + 'tag-chem': delegate_tag_rules('chem', TexLexer, state='math'), + 'tag-ce': delegate_tag_rules('ce', TexLexer, state='math'), 'tag-templatedata': delegate_tag_rules('templatedata', JsonLexer), 'text-italic': text_rules(Generic.Emph), 'text-bold': text_rules(Generic.Strong), diff --git a/libs/pygments/lexers/math.py b/libs/pygments/lexers/math.py index 530f8539c..66fd898ba 100644 --- a/libs/pygments/lexers/math.py +++ b/libs/pygments/lexers/math.py @@ -4,10 +4,11 @@ Just export lexers that were contained in this module. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +# ruff: noqa: F401 from pygments.lexers.python import NumPyLexer from pygments.lexers.matlab import MatlabLexer, MatlabSessionLexer, \ OctaveLexer, ScilabLexer diff --git a/libs/pygments/lexers/matlab.py b/libs/pygments/lexers/matlab.py index 753a6efcf..7005a3f28 100644 --- a/libs/pygments/lexers/matlab.py +++ b/libs/pygments/lexers/matlab.py @@ -4,7 +4,7 @@ Lexers for Matlab and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,13 +23,13 @@ class MatlabLexer(RegexLexer): """ For Matlab source code. - - .. versionadded:: 0.10 """ name = 'Matlab' aliases = ['matlab'] filenames = ['*.m'] mimetypes = ['text/matlab'] + url = 'https://www.mathworks.com/products/matlab.html' + version_added = '0.10' _operators = r'-|==|~=|<=|>=|<|>|&&|&|~|\|\|?|\.\*|\*|\+|\.\^|\.\\|\./|/|\\' @@ -41,8 +41,8 @@ class MatlabLexer(RegexLexer): # numbers (must come before punctuation to handle `.5`; cannot use # `\b` due to e.g. `5. + .5`). The negative lookahead on operators # avoids including the dot in `1./x` (the dot is part of `./`). - (r'(?<!\w)((\d+\.\d+)|(\d*\.\d+)|(\d+\.(?!%s)))' - r'([eEf][+-]?\d+)?(?!\w)' % _operators, Number.Float), + (rf'(?<!\w)((\d+\.\d+)|(\d*\.\d+)|(\d+\.(?!{_operators})))' + r'([eEf][+-]?\d+)?(?!\w)', Number.Float), (r'\b\d+[eEf][+-]?[0-9]+\b', Number.Float), (r'\b\d+\b', Number.Integer), @@ -2665,7 +2665,7 @@ class MatlabLexer(RegexLexer): # `cd ./ foo`.). Here, the regex checks that the first word in the # line is not followed by <spaces> and then # (equal | open-parenthesis | <operator><space> | <space>). - (r'(?:^|(?<=;))(\s*)(\w+)(\s+)(?!=|\(|%s\s|\s)' % _operators, + (rf'(?:^|(?<=;))(\s*)(\w+)(\s+)(?!=|\(|{_operators}\s|\s)', bygroups(Whitespace, Name, Whitespace), 'commandargs'), include('expressions') @@ -2742,11 +2742,11 @@ class MatlabSessionLexer(Lexer): """ For Matlab sessions. Modeled after PythonConsoleLexer. Contributed by Ken Schutte <kschutte@csail.mit.edu>. - - .. versionadded:: 0.10 """ name = 'Matlab session' aliases = ['matlabsession'] + url = 'https://www.mathworks.com/products/matlab.html' + version_added = '0.10' def get_tokens_unprocessed(self, text): mlexer = MatlabLexer(**self.options) @@ -2811,14 +2811,13 @@ def get_tokens_unprocessed(self, text): class OctaveLexer(RegexLexer): """ For GNU Octave source code. - - .. versionadded:: 1.5 """ name = 'Octave' url = 'https://www.gnu.org/software/octave/index' aliases = ['octave'] filenames = ['*.m'] mimetypes = ['text/octave'] + version_added = '1.5' # These lists are generated automatically. # Run the following in bash shell: @@ -3229,14 +3228,13 @@ def analyse_text(text): class ScilabLexer(RegexLexer): """ For Scilab source code. - - .. versionadded:: 1.5 """ name = 'Scilab' url = 'https://www.scilab.org/' aliases = ['scilab'] filenames = ['*.sci', '*.sce', '*.tst'] mimetypes = ['text/scilab'] + version_added = '1.5' tokens = { 'root': [ diff --git a/libs/pygments/lexers/maxima.py b/libs/pygments/lexers/maxima.py index 4c6dc7962..305b7552f 100644 --- a/libs/pygments/lexers/maxima.py +++ b/libs/pygments/lexers/maxima.py @@ -6,7 +6,7 @@ Derived from pygments/lexers/algebra.py. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,13 +22,12 @@ class MaximaLexer(RegexLexer): """ A Maxima lexer. Derived from pygments.lexers.MuPADLexer. - - .. versionadded:: 2.11 """ name = 'Maxima' url = 'http://maxima.sourceforge.net' aliases = ['maxima', 'macsyma'] filenames = ['*.mac', '*.max'] + version_added = '2.11' keywords = ('if', 'then', 'else', 'elseif', 'do', 'while', 'repeat', 'until', diff --git a/libs/pygments/lexers/meson.py b/libs/pygments/lexers/meson.py index f74f7191a..8127b1691 100644 --- a/libs/pygments/lexers/meson.py +++ b/libs/pygments/lexers/meson.py @@ -4,7 +4,7 @@ Pygments lexer for the Meson build system - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,8 +22,6 @@ class MesonLexer(RegexLexer): https://mesonbuild.com/Syntax.html#grammar for version 0.58. Some of those definitions are improperly transcribed, so the Meson++ implementation was also checked: https://github.com/dcbaker/meson-plus-plus. - - .. versionadded:: 2.10 """ # TODO String interpolation @VARNAME@ inner matches @@ -34,6 +32,7 @@ class MesonLexer(RegexLexer): aliases = ['meson', 'meson.build'] filenames = ['meson.build', 'meson_options.txt'] mimetypes = ['text/x-meson'] + version_added = '2.10' tokens = { 'root': [ diff --git a/libs/pygments/lexers/mime.py b/libs/pygments/lexers/mime.py index 8bf16f74f..4b309dd00 100644 --- a/libs/pygments/lexers/mime.py +++ b/libs/pygments/lexers/mime.py @@ -4,7 +4,7 @@ Lexer for Multipurpose Internet Mail Extensions (MIME) data. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -46,8 +46,6 @@ class MIMELexer(RegexLexer): `Content-Transfer-Encoding` Treat the data as a specific encoding. Or this lexer would try to parse from header by default. (default: None) - - .. versionadded:: 2.5 """ name = "MIME" @@ -55,6 +53,8 @@ class MIMELexer(RegexLexer): mimetypes = ["multipart/mixed", "multipart/related", "multipart/alternative"] + url = 'https://en.wikipedia.org/wiki/MIME' + version_added = '2.5' def __init__(self, **options): super().__init__(**options) @@ -95,7 +95,7 @@ def get_body_tokens(self, match): return # find boundary - bdry_pattern = r"^--%s(--)?\n" % re.escape(self.boundary) + bdry_pattern = rf"^--{re.escape(self.boundary)}(--)?\n" bdry_matcher = re.compile(bdry_pattern, re.MULTILINE) # some data has prefix text before first boundary diff --git a/libs/pygments/lexers/minecraft.py b/libs/pygments/lexers/minecraft.py index 11faa0009..99de0d5be 100644 --- a/libs/pygments/lexers/minecraft.py +++ b/libs/pygments/lexers/minecraft.py @@ -3,19 +3,19 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~ Lexers for Minecraft related languages. - + SNBT. A data communication format used in Minecraft. wiki: https://minecraft.wiki/w/NBT_format - + MCFunction. The Function file for Minecraft Data packs and Add-ons. official: https://learn.microsoft.com/en-us/minecraft/creator/documents/functionsintroduction wiki: https://minecraft.wiki/w/Function - + MCSchema. A kind of data Schema for Minecraft Add-on Development. official: https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/ community example: https://www.mcbe-dev.net/addons/data-driven/manifest.html - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -28,8 +28,6 @@ class SNBTLexer(RegexLexer): """Lexer for stringified NBT, a data format used in Minecraft - - .. versionadded:: 2.12.0 """ name = "SNBT" @@ -37,6 +35,7 @@ class SNBTLexer(RegexLexer): aliases = ["snbt"] filenames = ["*.snbt"] mimetypes = ["text/snbt"] + version_added = '2.12' tokens = { "root": [ @@ -102,8 +101,6 @@ class SNBTLexer(RegexLexer): class MCFunctionLexer(RegexLexer): """Lexer for the mcfunction scripting language used in Minecraft Modelled somewhat after the `GitHub mcfunction grammar <https://github.com/Arcensoth/language-mcfunction>`_. - - .. versionadded:: 2.12.0 """ name = "MCFunction" @@ -111,6 +108,7 @@ class MCFunctionLexer(RegexLexer): aliases = ["mcfunction", "mcf"] filenames = ["*.mcfunction"] mimetypes = ["text/mcfunction"] + version_added = '2.12' # Used to denotate the start of a block comment, borrowed from Github's mcfunction _block_comment_prefix = "[>!]" @@ -218,26 +216,26 @@ class MCFunctionLexer(RegexLexer): "selectors": [ (r"@[a-z]", Name.Variable), ], - + ## Generic Property Container # There are several, differing instances where the language accepts # specific contained keys or contained key, value pairings. - # + # # Property Maps: # - Starts with either `[` or `{` # - Key separated by `:` or `=` # - Deliminated by `,` - # + # # Property Lists: # - Starts with `[` # - Deliminated by `,` - # + # # For simplicity, these patterns match a generic, nestable structure # which follow a key, value pattern. For normal lists, there's only keys. # This allow some "illegal" structures, but we'll accept those for # sake of simplicity - # + # # Examples: # - `[facing=up, powered=true]` (blockstate) # - `[name="hello world", nbt={key: 1b}]` (selector + nbt) @@ -298,7 +296,7 @@ class MCFunctionLexer(RegexLexer): ], "property.delimiter": [ include("whitespace"), - + (r"[:=]!?", Punctuation, "property.value"), (r",", Punctuation), @@ -321,15 +319,14 @@ class MCFunctionLexer(RegexLexer): class MCSchemaLexer(RegexLexer): """Lexer for Minecraft Add-ons data Schemas, an interface structure standard used in Minecraft - - .. versionadded:: 2.14.0 """ - + name = 'MCSchema' url = 'https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/' aliases = ['mcschema'] filenames = ['*.mcschema'] mimetypes = ['text/mcschema'] + version_added = '2.14' tokens = { 'commentsandwhitespace': [ @@ -360,35 +357,35 @@ class MCSchemaLexer(RegexLexer): 'root': [ (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'), include('commentsandwhitespace'), - + # keywords for optional word and field types (r'(?<=: )opt', Operator.Word), (r'(?<=\s)[\w-]*(?=(\s+"|\n))', Keyword.Declaration), - + # numeric literals (r'0[bB][01]+', Number.Bin), (r'0[oO]?[0-7]+', Number.Oct), (r'0[xX][0-9a-fA-F]+', Number.Hex), (r'\d+', Number.Integer), (r'(\.\d+|\d+\.\d*|\d+)([eE][-+]?\d+)?', Number.Float), - + # possible punctuations (r'\.\.\.|=>', Punctuation), (r'\+\+|--|~|\?\?=?|\?|:|\\(?=\n)|' r'(<<|>>>?|==?|!=?|(?:\*\*|\|\||&&|[-<>+*%&|^/]))=?', Operator, 'slashstartsregex'), (r'[{(\[;,]', Punctuation, 'slashstartsregex'), (r'[})\].]', Punctuation), - + # strings (r"'", String.Single, 'singlestring'), (r'"', String.Double, 'doublestring'), - + # title line (r'[\w-]*?(?=:\{?\n)', String.Symbol), # title line with a version code, formatted # `major.minor.patch-prerelease+buildmeta` (r'([\w-]*?)(:)(\d+)(?:(\.)(\d+)(?:(\.)(\d+)(?:(\-)((?:[^\W_]|-)*(?:\.(?:[^\W_]|-)*)*))?(?:(\+)((?:[^\W_]|-)+(?:\.(?:[^\W_]|-)+)*))?)?)?(?=:\{?\n)', bygroups(String.Symbol, Operator, Number.Integer, Operator, Number.Integer, Operator, Number.Integer, Operator, String, Operator, String)), - + (r'.*\n', Text), ] } diff --git a/libs/pygments/lexers/mips.py b/libs/pygments/lexers/mips.py index 257605d7e..8f249e18a 100644 --- a/libs/pygments/lexers/mips.py +++ b/libs/pygments/lexers/mips.py @@ -4,7 +4,7 @@ Lexers for MIPS assembly. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -24,10 +24,12 @@ class MIPSLexer(RegexLexer): name = 'MIPS' aliases = ['mips'] + version_added = '' # TODO: add '*.s' and '*.asm', which will require designing an analyse_text # method for this lexer and refactoring those from Gas and Nasm in order to # have relatively reliable detection filenames = ['*.mips', '*.MIPS'] + url = 'https://mips.com' keywords = [ # Arithmetic insturctions diff --git a/libs/pygments/lexers/ml.py b/libs/pygments/lexers/ml.py index 3dfa6d934..ff50c6f0c 100644 --- a/libs/pygments/lexers/ml.py +++ b/libs/pygments/lexers/ml.py @@ -4,7 +4,7 @@ Lexers for ML family languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,14 @@ class SMLLexer(RegexLexer): """ For the Standard ML language. - - .. versionadded:: 1.5 """ name = 'Standard ML' aliases = ['sml'] filenames = ['*.sml', '*.sig', '*.fun'] mimetypes = ['text/x-standardml', 'application/x-standardml'] + url = 'https://en.wikipedia.org/wiki/Standard_ML' + version_added = '1.5' alphanumid_reserved = { # Core @@ -121,7 +121,7 @@ def id_callback(self, match): 'core': [ # Punctuation that doesn't overlap symbolic identifiers - (r'(%s)' % '|'.join(re.escape(z) for z in nonid_reserved), + (r'({})'.format('|'.join(re.escape(z) for z in nonid_reserved)), Punctuation), # Special constants: strings, floats, numbers in decimal and hex @@ -137,8 +137,8 @@ def id_callback(self, match): # Labels (r'#\s*[1-9][0-9]*', Name.Label), - (r'#\s*(%s)' % alphanumid_re, Name.Label), - (r'#\s+(%s)' % symbolicid_re, Name.Label), + (rf'#\s*({alphanumid_re})', Name.Label), + (rf'#\s+({symbolicid_re})', Name.Label), # Some reserved words trigger a special, local lexer state change (r'\b(datatype|abstype)\b(?!\')', Keyword.Reserved, 'dname'), (r'\b(exception)\b(?!\')', Keyword.Reserved, 'ename'), @@ -148,14 +148,14 @@ def id_callback(self, match): # Regular identifiers, long and otherwise (r'\'[\w\']*', Name.Decorator), - (r'(%s)(\.)' % alphanumid_re, long_id_callback, "dotted"), - (r'(%s)' % alphanumid_re, id_callback), - (r'(%s)' % symbolicid_re, id_callback), + (rf'({alphanumid_re})(\.)', long_id_callback, "dotted"), + (rf'({alphanumid_re})', id_callback), + (rf'({symbolicid_re})', id_callback), ], 'dotted': [ - (r'(%s)(\.)' % alphanumid_re, long_id_callback), - (r'(%s)' % alphanumid_re, end_id_callback, "#pop"), - (r'(%s)' % symbolicid_re, end_id_callback, "#pop"), + (rf'({alphanumid_re})(\.)', long_id_callback), + (rf'({alphanumid_re})', end_id_callback, "#pop"), + (rf'({symbolicid_re})', end_id_callback, "#pop"), (r'\s+', Error), (r'\S+', Error), ], @@ -208,7 +208,7 @@ def id_callback(self, match): 'string': stringy(String.Double), 'breakout': [ - (r'(?=\b(%s)\b(?!\'))' % '|'.join(alphanumid_reserved), Text, '#pop'), + (r'(?=\b({})\b(?!\'))'.format('|'.join(alphanumid_reserved)), Text, '#pop'), ], # Dealing with what comes after module system keywords @@ -216,7 +216,7 @@ def id_callback(self, match): include('whitespace'), include('breakout'), - (r'(%s)' % alphanumid_re, Name.Namespace), + (rf'({alphanumid_re})', Name.Namespace), default('#pop'), ], @@ -226,8 +226,8 @@ def id_callback(self, match): (r'\'[\w\']*', Name.Decorator), (r'\(', Punctuation, 'tyvarseq'), - (r'(%s)' % alphanumid_re, Name.Function, '#pop'), - (r'(%s)' % symbolicid_re, Name.Function, '#pop'), + (rf'({alphanumid_re})', Name.Function, '#pop'), + (rf'({symbolicid_re})', Name.Function, '#pop'), # Ignore interesting function declarations like "fun (x + y) = ..." default('#pop'), @@ -239,12 +239,12 @@ def id_callback(self, match): (r'\'[\w\']*', Name.Decorator), (r'\(', Punctuation, 'tyvarseq'), - (r'(%s)(\s*)(=(?!%s))' % (alphanumid_re, symbolicid_re), + (rf'({alphanumid_re})(\s*)(=(?!{symbolicid_re}))', bygroups(Name.Variable, Text, Punctuation), '#pop'), - (r'(%s)(\s*)(=(?!%s))' % (symbolicid_re, symbolicid_re), + (rf'({symbolicid_re})(\s*)(=(?!{symbolicid_re}))', bygroups(Name.Variable, Text, Punctuation), '#pop'), - (r'(%s)' % alphanumid_re, Name.Variable, '#pop'), - (r'(%s)' % symbolicid_re, Name.Variable, '#pop'), + (rf'({alphanumid_re})', Name.Variable, '#pop'), + (rf'({symbolicid_re})', Name.Variable, '#pop'), # Ignore interesting patterns like 'val (x, y)' default('#pop'), @@ -257,10 +257,10 @@ def id_callback(self, match): (r'\'[\w\']*', Name.Decorator), (r'\(', Punctuation, 'tyvarseq'), - (r'=(?!%s)' % symbolicid_re, Punctuation, ('#pop', 'typbind')), + (rf'=(?!{symbolicid_re})', Punctuation, ('#pop', 'typbind')), - (r'(%s)' % alphanumid_re, Keyword.Type), - (r'(%s)' % symbolicid_re, Keyword.Type), + (rf'({alphanumid_re})', Keyword.Type), + (rf'({symbolicid_re})', Keyword.Type), (r'\S+', Error, '#pop'), ], @@ -284,11 +284,11 @@ def id_callback(self, match): (r'\(', Punctuation, 'tyvarseq'), (r'(=)(\s*)(datatype)', bygroups(Punctuation, Text, Keyword.Reserved), '#pop'), - (r'=(?!%s)' % symbolicid_re, Punctuation, + (rf'=(?!{symbolicid_re})', Punctuation, ('#pop', 'datbind', 'datcon')), - (r'(%s)' % alphanumid_re, Keyword.Type), - (r'(%s)' % symbolicid_re, Keyword.Type), + (rf'({alphanumid_re})', Keyword.Type), + (rf'({symbolicid_re})', Keyword.Type), (r'\S+', Error, '#pop'), ], @@ -300,9 +300,9 @@ def id_callback(self, match): (r'\b(withtype)\b(?!\')', Keyword.Reserved, ('#pop', 'tname')), (r'\b(of)\b(?!\')', Keyword.Reserved), - (r'(\|)(\s*)(%s)' % alphanumid_re, + (rf'(\|)(\s*)({alphanumid_re})', bygroups(Punctuation, Text, Name.Class)), - (r'(\|)(\s+)(%s)' % symbolicid_re, + (rf'(\|)(\s+)({symbolicid_re})', bygroups(Punctuation, Text, Name.Class)), include('breakout'), @@ -314,20 +314,20 @@ def id_callback(self, match): 'ename': [ include('whitespace'), - (r'(and\b)(\s+)(%s)' % alphanumid_re, + (rf'(and\b)(\s+)({alphanumid_re})', bygroups(Keyword.Reserved, Text, Name.Class)), - (r'(and\b)(\s*)(%s)' % symbolicid_re, + (rf'(and\b)(\s*)({symbolicid_re})', bygroups(Keyword.Reserved, Text, Name.Class)), (r'\b(of)\b(?!\')', Keyword.Reserved), - (r'(%s)|(%s)' % (alphanumid_re, symbolicid_re), Name.Class), + (rf'({alphanumid_re})|({symbolicid_re})', Name.Class), default('#pop'), ], 'datcon': [ include('whitespace'), - (r'(%s)' % alphanumid_re, Name.Class, '#pop'), - (r'(%s)' % symbolicid_re, Name.Class, '#pop'), + (rf'({alphanumid_re})', Name.Class, '#pop'), + (rf'({symbolicid_re})', Name.Class, '#pop'), (r'\S+', Error, '#pop'), ], @@ -355,8 +355,6 @@ def id_callback(self, match): class OcamlLexer(RegexLexer): """ For the OCaml language. - - .. versionadded:: 0.7 """ name = 'OCaml' @@ -364,6 +362,7 @@ class OcamlLexer(RegexLexer): aliases = ['ocaml'] filenames = ['*.ml', '*.mli', '*.mll', '*.mly'] mimetypes = ['text/x-ocaml'] + version_added = '0.7' keywords = ( 'and', 'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done', @@ -399,11 +398,11 @@ class OcamlLexer(RegexLexer): (r'\b([A-Z][\w\']*)(?=\s*\.)', Name.Namespace, 'dotted'), (r'\b([A-Z][\w\']*)', Name.Class), (r'\(\*(?![)])', Comment, 'comment'), - (r'\b(%s)\b' % '|'.join(keywords), Keyword), - (r'(%s)' % '|'.join(keyopts[::-1]), Operator), - (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator), - (r'\b(%s)\b' % '|'.join(word_operators), Operator.Word), - (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type), + (r'\b({})\b'.format('|'.join(keywords)), Keyword), + (r'({})'.format('|'.join(keyopts[::-1])), Operator), + (rf'({infix_syms}|{prefix_syms})?{operators}', Operator), + (r'\b({})\b'.format('|'.join(word_operators)), Operator.Word), + (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type), (r"[^\W\d][\w']*", Name), @@ -448,14 +447,14 @@ class OcamlLexer(RegexLexer): class OpaLexer(RegexLexer): """ Lexer for the Opa language. - - .. versionadded:: 1.5 """ name = 'Opa' aliases = ['opa'] filenames = ['*.opa'] mimetypes = ['text/x-opa'] + url = 'http://opalang.org' + version_added = '1.5' # most of these aren't strictly keywords # but if you color only real keywords, you might just @@ -557,8 +556,8 @@ class OpaLexer(RegexLexer): # way to syntactic distinguish binding constructions # unfortunately, this colors the equal in {x=2} too (r'=(?!'+op_re+r')', Keyword), - (r'(%s)+' % op_re, Operator), - (r'(%s)+' % punc_re, Operator), + (rf'({op_re})+', Operator), + (rf'({punc_re})+', Operator), # coercions (r':', Operator, 'type'), @@ -771,8 +770,6 @@ class OpaLexer(RegexLexer): class ReasonLexer(RegexLexer): """ For the ReasonML language. - - .. versionadded:: 2.6 """ name = 'ReasonML' @@ -780,6 +777,7 @@ class ReasonLexer(RegexLexer): aliases = ['reasonml', 'reason'] filenames = ['*.re', '*.rei'] mimetypes = ['text/x-reasonml'] + version_added = '2.6' keywords = ( 'as', 'assert', 'begin', 'class', 'constraint', 'do', 'done', 'downto', @@ -815,11 +813,11 @@ class ReasonLexer(RegexLexer): (r'\b([A-Z][\w\']*)', Name.Class), (r'//.*?\n', Comment.Single), (r'\/\*(?!/)', Comment.Multiline, 'comment'), - (r'\b(%s)\b' % '|'.join(keywords), Keyword), - (r'(%s)' % '|'.join(keyopts[::-1]), Operator.Word), - (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator), - (r'\b(%s)\b' % '|'.join(word_operators), Operator.Word), - (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type), + (r'\b({})\b'.format('|'.join(keywords)), Keyword), + (r'({})'.format('|'.join(keyopts[::-1])), Operator.Word), + (rf'({infix_syms}|{prefix_syms})?{operators}', Operator), + (r'\b({})\b'.format('|'.join(word_operators)), Operator.Word), + (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type), (r"[^\W\d][\w']*", Name), @@ -864,7 +862,6 @@ class ReasonLexer(RegexLexer): class FStarLexer(RegexLexer): """ For the F* language. - .. versionadded:: 2.7 """ name = 'FStar' @@ -872,6 +869,7 @@ class FStarLexer(RegexLexer): aliases = ['fstar'] filenames = ['*.fst', '*.fsti'] mimetypes = ['text/x-fstar'] + version_added = '2.7' keywords = ( 'abstract', 'attributes', 'noeq', 'unopteq', 'and' @@ -912,12 +910,12 @@ class FStarLexer(RegexLexer): (r'\b([A-Z][\w\']*)', Name.Class), (r'\(\*(?![)])', Comment, 'comment'), (r'\/\/.+$', Comment), - (r'\b(%s)\b' % '|'.join(keywords), Keyword), - (r'\b(%s)\b' % '|'.join(assume_keywords), Name.Exception), - (r'\b(%s)\b' % '|'.join(decl_keywords), Keyword.Declaration), - (r'(%s)' % '|'.join(keyopts[::-1]), Operator), - (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator), - (r'\b(%s)\b' % '|'.join(primitives), Keyword.Type), + (r'\b({})\b'.format('|'.join(keywords)), Keyword), + (r'\b({})\b'.format('|'.join(assume_keywords)), Name.Exception), + (r'\b({})\b'.format('|'.join(decl_keywords)), Keyword.Declaration), + (r'({})'.format('|'.join(keyopts[::-1])), Operator), + (rf'({infix_syms}|{prefix_syms})?{operators}', Operator), + (r'\b({})\b'.format('|'.join(primitives)), Keyword.Type), (r"[^\W\d][\w']*", Name), diff --git a/libs/pygments/lexers/modeling.py b/libs/pygments/lexers/modeling.py index e24768072..b5393e748 100644 --- a/libs/pygments/lexers/modeling.py +++ b/libs/pygments/lexers/modeling.py @@ -4,7 +4,7 @@ Lexers for modeling languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,14 +23,13 @@ class ModelicaLexer(RegexLexer): """ For Modelica source code. - - .. versionadded:: 1.1 """ name = 'Modelica' url = 'http://www.modelica.org/' aliases = ['modelica'] filenames = ['*.mo'] mimetypes = ['text/x-modelica'] + version_added = '1.1' flags = re.DOTALL | re.MULTILINE @@ -100,13 +99,13 @@ class BugsLexer(RegexLexer): """ Pygments Lexer for OpenBugs and WinBugs models. - - .. versionadded:: 1.6 """ name = 'BUGS' aliases = ['bugs', 'winbugs', 'openbugs'] filenames = ['*.bug'] + url = 'https://www.mrc-bsu.cam.ac.uk/software/bugs/openbugs' + version_added = '1.6' _FUNCTIONS = ( # Scalar functions @@ -166,8 +165,7 @@ class BugsLexer(RegexLexer): # Reserved Words (r'(for|in)(?![\w.])', Keyword.Reserved), # Built-in Functions - (r'(%s)(?=\s*\()' - % r'|'.join(_FUNCTIONS + _DISTRIBUTIONS), + (r'({})(?=\s*\()'.format(r'|'.join(_FUNCTIONS + _DISTRIBUTIONS)), Name.Builtin), # Regular variable names (r'[A-Za-z][\w.]*', Name), @@ -195,13 +193,13 @@ def analyse_text(text): class JagsLexer(RegexLexer): """ Pygments Lexer for JAGS. - - .. versionadded:: 1.6 """ name = 'JAGS' aliases = ['jags'] filenames = ['*.jag', '*.bug'] + url = 'https://mcmc-jags.sourceforge.io' + version_added = '1.6' # JAGS _FUNCTIONS = ( @@ -215,7 +213,7 @@ class JagsLexer(RegexLexer): # Truncation/Censoring (should I include) 'T', 'I') # Distributions with density, probability and quartile functions - _DISTRIBUTIONS = tuple('[dpq]%s' % x for x in + _DISTRIBUTIONS = tuple(f'[dpq]{x}' for x in ('bern', 'beta', 'dchiqsqr', 'ddexp', 'dexp', 'df', 'gamma', 'gen.gamma', 'logis', 'lnorm', 'negbin', 'nchisqr', 'norm', 'par', 'pois', 'weib')) @@ -251,9 +249,9 @@ class JagsLexer(RegexLexer): (r'(for|in)(?![\w.])', Keyword.Reserved), # Builtins # Need to use lookahead because . is a valid char - (r'(%s)(?=\s*\()' % r'|'.join(_FUNCTIONS + (r'({})(?=\s*\()'.format(r'|'.join(_FUNCTIONS + _DISTRIBUTIONS - + _OTHER_DISTRIBUTIONS), + + _OTHER_DISTRIBUTIONS)), Name.Builtin), # Names include('names'), @@ -286,13 +284,13 @@ class StanLexer(RegexLexer): The Stan modeling language is specified in the *Stan Modeling Language User's Guide and Reference Manual, v2.17.0*, `pdf <https://github.com/stan-dev/stan/releases/download/v2.17.0/stan-reference-2.17.0.pdf>`__. - - .. versionadded:: 1.6 """ name = 'Stan' aliases = ['stan'] filenames = ['*.stan'] + url = 'https://mc-stan.org' + version_added = '1.6' tokens = { 'whitespace': [ @@ -310,19 +308,18 @@ class StanLexer(RegexLexer): # block start include('whitespace'), # Block start - (r'(%s)(\s*)(\{)' % - r'|'.join(('functions', 'data', r'transformed\s+?data', + (r'({})(\s*)(\{{)'.format(r'|'.join(('functions', 'data', r'transformed\s+?data', 'parameters', r'transformed\s+parameters', - 'model', r'generated\s+quantities')), + 'model', r'generated\s+quantities'))), bygroups(Keyword.Namespace, Text, Punctuation)), # target keyword (r'target\s*\+=', Keyword), # Reserved Words - (r'(%s)\b' % r'|'.join(_stan_builtins.KEYWORDS), Keyword), + (r'({})\b'.format(r'|'.join(_stan_builtins.KEYWORDS)), Keyword), # Truncation (r'T(?=\s*\[)', Keyword), # Data types - (r'(%s)\b' % r'|'.join(_stan_builtins.TYPES), Keyword.Type), + (r'({})\b'.format(r'|'.join(_stan_builtins.TYPES)), Keyword.Type), # < should be punctuation, but elsewhere I can't tell if it is in # a range constraint (r'(<)(\s*)(upper|lower|offset|multiplier)(\s*)(=)', @@ -332,12 +329,12 @@ class StanLexer(RegexLexer): # Punctuation (r"[;,\[\]()]", Punctuation), # Builtin - (r'(%s)(?=\s*\()' % '|'.join(_stan_builtins.FUNCTIONS), Name.Builtin), - (r'(~)(\s*)(%s)(?=\s*\()' % '|'.join(_stan_builtins.DISTRIBUTIONS), + (r'({})(?=\s*\()'.format('|'.join(_stan_builtins.FUNCTIONS)), Name.Builtin), + (r'(~)(\s*)({})(?=\s*\()'.format('|'.join(_stan_builtins.DISTRIBUTIONS)), bygroups(Operator, Whitespace, Name.Builtin)), # Special names ending in __, like lp__ (r'[A-Za-z]\w*__\b', Name.Builtin.Pseudo), - (r'(%s)\b' % r'|'.join(_stan_builtins.RESERVED), Keyword.Reserved), + (r'({})\b'.format(r'|'.join(_stan_builtins.RESERVED)), Keyword.Reserved), # user-defined functions (r'[A-Za-z]\w*(?=\s*\()]', Name.Function), # Imaginary Literals diff --git a/libs/pygments/lexers/modula2.py b/libs/pygments/lexers/modula2.py index 8bd4765aa..8f5a72a35 100644 --- a/libs/pygments/lexers/modula2.py +++ b/libs/pygments/lexers/modula2.py @@ -4,7 +4,7 @@ Multi-Dialect Lexer for Modula-2. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -153,8 +153,6 @@ class Modula2Lexer(RegexLexer): ``$ pygmentize -O full,dialect=m2r10,treat_stdlib_adts_as_builtins=Off ...`` Render standard library ADTs as ordinary library types. - .. versionadded:: 1.3 - .. versionchanged:: 2.1 Added multi-dialect support. """ @@ -163,6 +161,7 @@ class Modula2Lexer(RegexLexer): aliases = ['modula2', 'm2'] filenames = ['*.def', '*.mod'] mimetypes = ['text/x-modula2'] + version_added = '1.3' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/mojo.py b/libs/pygments/lexers/mojo.py new file mode 100644 index 000000000..0191dce0a --- /dev/null +++ b/libs/pygments/lexers/mojo.py @@ -0,0 +1,704 @@ +""" + pygments.lexers.mojo + ~~~~~~~~~~~~~~~~~~~~ + + Lexers for Mojo and related languages. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import keyword + +from pygments import unistring as uni +from pygments.lexer import ( + RegexLexer, + bygroups, + combined, + default, + include, + this, + using, + words, +) +from pygments.token import ( + Comment, + # Error, + Keyword, + Name, + Number, + Operator, + Punctuation, + String, + Text, + Whitespace, +) +from pygments.util import shebang_matches + +__all__ = ["MojoLexer"] + + +class MojoLexer(RegexLexer): + """ + For Mojo source code (version 24.2.1). + """ + + name = "Mojo" + url = "https://docs.modular.com/mojo/" + aliases = ["mojo", "🔥"] + filenames = [ + "*.mojo", + "*.🔥", + ] + mimetypes = [ + "text/x-mojo", + "application/x-mojo", + ] + version_added = "2.18" + + uni_name = f"[{uni.xid_start}][{uni.xid_continue}]*" + + def innerstring_rules(ttype): + return [ + # the old style '%s' % (...) string formatting (still valid in Py3) + ( + r"%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?" + "[hlL]?[E-GXc-giorsaux%]", + String.Interpol, + ), + # the new style '{}'.format(...) string formatting + ( + r"\{" + r"((\w+)((\.\w+)|(\[[^\]]+\]))*)?" # field name + r"(\![sra])?" # conversion + r"(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?" + r"\}", + String.Interpol, + ), + # backslashes, quotes and formatting signs must be parsed one at a time + (r'[^\\\'"%{\n]+', ttype), + (r'[\'"\\]', ttype), + # unhandled string formatting sign + (r"%|(\{{1,2})", ttype), + # newlines are an error (use "nl" state) + ] + + def fstring_rules(ttype): + return [ + # Assuming that a '}' is the closing brace after format specifier. + # Sadly, this means that we won't detect syntax error. But it's + # more important to parse correct syntax correctly, than to + # highlight invalid syntax. + (r"\}", String.Interpol), + (r"\{", String.Interpol, "expr-inside-fstring"), + # backslashes, quotes and formatting signs must be parsed one at a time + (r'[^\\\'"{}\n]+', ttype), + (r'[\'"\\]', ttype), + # newlines are an error (use "nl" state) + ] + + tokens = { + "root": [ + (r"\s+", Whitespace), + ( + r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")', + bygroups(Whitespace, String.Affix, String.Doc), + ), + ( + r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')", + bygroups(Whitespace, String.Affix, String.Doc), + ), + (r"\A#!.+$", Comment.Hashbang), + (r"#.*$", Comment.Single), + (r"\\\n", Whitespace), + (r"\\", Whitespace), + include("keywords"), + include("soft-keywords"), + # In the original PR, all the below here used ((?:\s|\\\s)+) to + # designate whitespace, but I can't find any example of this being + # needed in the example file, so we're replacing it with `\s+`. + ( + r"(alias)(\s+)", + bygroups(Keyword, Whitespace), + "varname", # TODO varname the right fit? + ), + (r"(var)(\s+)", bygroups(Keyword, Whitespace), "varname"), + (r"(def)(\s+)", bygroups(Keyword, Whitespace), "funcname"), + (r"(fn)(\s+)", bygroups(Keyword, Whitespace), "funcname"), + ( + r"(class)(\s+)", + bygroups(Keyword, Whitespace), + "classname", + ), # not implemented yet + (r"(struct)(\s+)", bygroups(Keyword, Whitespace), "structname"), + (r"(trait)(\s+)", bygroups(Keyword, Whitespace), "structname"), + (r"(from)(\s+)", bygroups(Keyword.Namespace, Whitespace), "fromimport"), + (r"(import)(\s+)", bygroups(Keyword.Namespace, Whitespace), "import"), + include("expr"), + ], + "expr": [ + # raw f-strings + ( + '(?i)(rf|fr)(""")', + bygroups(String.Affix, String.Double), + combined("rfstringescape", "tdqf"), + ), + ( + "(?i)(rf|fr)(''')", + bygroups(String.Affix, String.Single), + combined("rfstringescape", "tsqf"), + ), + ( + '(?i)(rf|fr)(")', + bygroups(String.Affix, String.Double), + combined("rfstringescape", "dqf"), + ), + ( + "(?i)(rf|fr)(')", + bygroups(String.Affix, String.Single), + combined("rfstringescape", "sqf"), + ), + # non-raw f-strings + ( + '([fF])(""")', + bygroups(String.Affix, String.Double), + combined("fstringescape", "tdqf"), + ), + ( + "([fF])(''')", + bygroups(String.Affix, String.Single), + combined("fstringescape", "tsqf"), + ), + ( + '([fF])(")', + bygroups(String.Affix, String.Double), + combined("fstringescape", "dqf"), + ), + ( + "([fF])(')", + bygroups(String.Affix, String.Single), + combined("fstringescape", "sqf"), + ), + # raw bytes and strings + ('(?i)(rb|br|r)(""")', bygroups(String.Affix, String.Double), "tdqs"), + ("(?i)(rb|br|r)(''')", bygroups(String.Affix, String.Single), "tsqs"), + ('(?i)(rb|br|r)(")', bygroups(String.Affix, String.Double), "dqs"), + ("(?i)(rb|br|r)(')", bygroups(String.Affix, String.Single), "sqs"), + # non-raw strings + ( + '([uU]?)(""")', + bygroups(String.Affix, String.Double), + combined("stringescape", "tdqs"), + ), + ( + "([uU]?)(''')", + bygroups(String.Affix, String.Single), + combined("stringescape", "tsqs"), + ), + ( + '([uU]?)(")', + bygroups(String.Affix, String.Double), + combined("stringescape", "dqs"), + ), + ( + "([uU]?)(')", + bygroups(String.Affix, String.Single), + combined("stringescape", "sqs"), + ), + # non-raw bytes + ( + '([bB])(""")', + bygroups(String.Affix, String.Double), + combined("bytesescape", "tdqs"), + ), + ( + "([bB])(''')", + bygroups(String.Affix, String.Single), + combined("bytesescape", "tsqs"), + ), + ( + '([bB])(")', + bygroups(String.Affix, String.Double), + combined("bytesescape", "dqs"), + ), + ( + "([bB])(')", + bygroups(String.Affix, String.Single), + combined("bytesescape", "sqs"), + ), + (r"[^\S\n]+", Text), + include("numbers"), + (r"!=|==|<<|>>|:=|[-~+/*%=<>&^|.]", Operator), + (r"([]{}:\(\),;[])+", Punctuation), + (r"(in|is|and|or|not)\b", Operator.Word), + include("expr-keywords"), + include("builtins"), + include("magicfuncs"), + include("magicvars"), + include("name"), + ], + "expr-inside-fstring": [ + (r"[{([]", Punctuation, "expr-inside-fstring-inner"), + # without format specifier + ( + r"(=\s*)?" # debug (https://bugs.python.org/issue36817) + r"(\![sraf])?" # conversion + r"\}", + String.Interpol, + "#pop", + ), + # with format specifier + # we'll catch the remaining '}' in the outer scope + ( + r"(=\s*)?" # debug (https://bugs.python.org/issue36817) + r"(\![sraf])?" # conversion + r":", + String.Interpol, + "#pop", + ), + (r"\s+", Whitespace), # allow new lines + include("expr"), + ], + "expr-inside-fstring-inner": [ + (r"[{([]", Punctuation, "expr-inside-fstring-inner"), + (r"[])}]", Punctuation, "#pop"), + (r"\s+", Whitespace), # allow new lines + include("expr"), + ], + "expr-keywords": [ + # Based on https://docs.python.org/3/reference/expressions.html + ( + words( + ( + "async for", # TODO https://docs.modular.com/mojo/roadmap#no-async-for-or-async-with + "async with", # TODO https://docs.modular.com/mojo/roadmap#no-async-for-or-async-with + "await", + "else", + "for", + "if", + "lambda", + "yield", + "yield from", + ), + suffix=r"\b", + ), + Keyword, + ), + (words(("True", "False", "None"), suffix=r"\b"), Keyword.Constant), + ], + "keywords": [ + ( + words( + ( + "assert", + "async", + "await", + "borrowed", + "break", + "continue", + "del", + "elif", + "else", + "except", + "finally", + "for", + "global", + "if", + "lambda", + "pass", + "raise", + "nonlocal", + "return", + "try", + "while", + "yield", + "yield from", + "as", + "with", + ), + suffix=r"\b", + ), + Keyword, + ), + (words(("True", "False", "None"), suffix=r"\b"), Keyword.Constant), + ], + "soft-keywords": [ + # `match`, `case` and `_` soft keywords + ( + r"(^[ \t]*)" # at beginning of line + possible indentation + r"(match|case)\b" # a possible keyword + r"(?![ \t]*(?:" # not followed by... + r"[:,;=^&|@~)\]}]|(?:" + # characters and keywords that mean this isn't + # pattern matching (but None/True/False is ok) + r"|".join(k for k in keyword.kwlist if k[0].islower()) + + r")\b))", + bygroups(Whitespace, Keyword), + "soft-keywords-inner", + ), + ], + "soft-keywords-inner": [ + # optional `_` keyword + (r"(\s+)([^\n_]*)(_\b)", bygroups(Whitespace, using(this), Keyword)), + default("#pop"), + ], + "builtins": [ + ( + words( + ( + "__import__", + "abs", + "aiter", + "all", + "any", + "bin", + "bool", + "bytearray", + "breakpoint", + "bytes", + "callable", + "chr", + "classmethod", + "compile", + "complex", + "delattr", + "dict", + "dir", + "divmod", + "enumerate", + "eval", + "filter", + "float", + "format", + "frozenset", + "getattr", + "globals", + "hasattr", + "hash", + "hex", + "id", + "input", + "int", + "isinstance", + "issubclass", + "iter", + "len", + "list", + "locals", + "map", + "max", + "memoryview", + "min", + "next", + "object", + "oct", + "open", + "ord", + "pow", + "print", + "property", + "range", + "repr", + "reversed", + "round", + "set", + "setattr", + "slice", + "sorted", + "staticmethod", + "str", + "sum", + "super", + "tuple", + "type", + "vars", + "zip", + # Mojo builtin types: https://docs.modular.com/mojo/stdlib/builtin/ + "AnyType", + "Coroutine", + "DType", + "Error", + "Int", + "List", + "ListLiteral", + "Scalar", + "Int8", + "UInt8", + "Int16", + "UInt16", + "Int32", + "UInt32", + "Int64", + "UInt64", + "BFloat16", + "Float16", + "Float32", + "Float64", + "SIMD", + "String", + "Tensor", + "Tuple", + "Movable", + "Copyable", + "CollectionElement", + ), + prefix=r"(?<!\.)", + suffix=r"\b", + ), + Name.Builtin, + ), + (r"(?<!\.)(self|Ellipsis|NotImplemented|cls)\b", Name.Builtin.Pseudo), + ( + words( + ("Error",), + prefix=r"(?<!\.)", + suffix=r"\b", + ), + Name.Exception, + ), + ], + "magicfuncs": [ + ( + words( + ( + "__abs__", + "__add__", + "__aenter__", + "__aexit__", + "__aiter__", + "__and__", + "__anext__", + "__await__", + "__bool__", + "__bytes__", + "__call__", + "__complex__", + "__contains__", + "__del__", + "__delattr__", + "__delete__", + "__delitem__", + "__dir__", + "__divmod__", + "__enter__", + "__eq__", + "__exit__", + "__float__", + "__floordiv__", + "__format__", + "__ge__", + "__get__", + "__getattr__", + "__getattribute__", + "__getitem__", + "__gt__", + "__hash__", + "__iadd__", + "__iand__", + "__ifloordiv__", + "__ilshift__", + "__imatmul__", + "__imod__", + "__imul__", + "__index__", + "__init__", + "__instancecheck__", + "__int__", + "__invert__", + "__ior__", + "__ipow__", + "__irshift__", + "__isub__", + "__iter__", + "__itruediv__", + "__ixor__", + "__le__", + "__len__", + "__length_hint__", + "__lshift__", + "__lt__", + "__matmul__", + "__missing__", + "__mod__", + "__mul__", + "__ne__", + "__neg__", + "__new__", + "__next__", + "__or__", + "__pos__", + "__pow__", + "__prepare__", + "__radd__", + "__rand__", + "__rdivmod__", + "__repr__", + "__reversed__", + "__rfloordiv__", + "__rlshift__", + "__rmatmul__", + "__rmod__", + "__rmul__", + "__ror__", + "__round__", + "__rpow__", + "__rrshift__", + "__rshift__", + "__rsub__", + "__rtruediv__", + "__rxor__", + "__set__", + "__setattr__", + "__setitem__", + "__str__", + "__sub__", + "__subclasscheck__", + "__truediv__", + "__xor__", + ), + suffix=r"\b", + ), + Name.Function.Magic, + ), + ], + "magicvars": [ + ( + words( + ( + "__annotations__", + "__bases__", + "__class__", + "__closure__", + "__code__", + "__defaults__", + "__dict__", + "__doc__", + "__file__", + "__func__", + "__globals__", + "__kwdefaults__", + "__module__", + "__mro__", + "__name__", + "__objclass__", + "__qualname__", + "__self__", + "__slots__", + "__weakref__", + ), + suffix=r"\b", + ), + Name.Variable.Magic, + ), + ], + "numbers": [ + ( + r"(\d(?:_?\d)*\.(?:\d(?:_?\d)*)?|(?:\d(?:_?\d)*)?\.\d(?:_?\d)*)" + r"([eE][+-]?\d(?:_?\d)*)?", + Number.Float, + ), + (r"\d(?:_?\d)*[eE][+-]?\d(?:_?\d)*j?", Number.Float), + (r"0[oO](?:_?[0-7])+", Number.Oct), + (r"0[bB](?:_?[01])+", Number.Bin), + (r"0[xX](?:_?[a-fA-F0-9])+", Number.Hex), + (r"\d(?:_?\d)*", Number.Integer), + ], + "name": [ + (r"@" + uni_name, Name.Decorator), + (r"@", Operator), # new matrix multiplication operator + (uni_name, Name), + ], + "varname": [ + (uni_name, Name.Variable, "#pop"), + ], + "funcname": [ + include("magicfuncs"), + (uni_name, Name.Function, "#pop"), + default("#pop"), + ], + "classname": [ + (uni_name, Name.Class, "#pop"), + ], + "structname": [ + (uni_name, Name.Struct, "#pop"), + ], + "import": [ + (r"(\s+)(as)(\s+)", bygroups(Whitespace, Keyword, Whitespace)), + (r"\.", Name.Namespace), + (uni_name, Name.Namespace), + (r"(\s*)(,)(\s*)", bygroups(Whitespace, Operator, Whitespace)), + default("#pop"), # all else: go back + ], + "fromimport": [ + (r"(\s+)(import)\b", bygroups(Whitespace, Keyword.Namespace), "#pop"), + (r"\.", Name.Namespace), + # if None occurs here, it's "raise x from None", since None can + # never be a module name + (r"None\b", Keyword.Constant, "#pop"), + (uni_name, Name.Namespace), + default("#pop"), + ], + "rfstringescape": [ + (r"\{\{", String.Escape), + (r"\}\}", String.Escape), + ], + "fstringescape": [ + include("rfstringescape"), + include("stringescape"), + ], + "bytesescape": [ + (r'\\([\\abfnrtv"\']|\n|x[a-fA-F0-9]{2}|[0-7]{1,3})', String.Escape) + ], + "stringescape": [ + (r"\\(N\{.*?\}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})", String.Escape), + include("bytesescape"), + ], + "fstrings-single": fstring_rules(String.Single), + "fstrings-double": fstring_rules(String.Double), + "strings-single": innerstring_rules(String.Single), + "strings-double": innerstring_rules(String.Double), + "dqf": [ + (r'"', String.Double, "#pop"), + (r'\\\\|\\"|\\\n', String.Escape), # included here for raw strings + include("fstrings-double"), + ], + "sqf": [ + (r"'", String.Single, "#pop"), + (r"\\\\|\\'|\\\n", String.Escape), # included here for raw strings + include("fstrings-single"), + ], + "dqs": [ + (r'"', String.Double, "#pop"), + (r'\\\\|\\"|\\\n', String.Escape), # included here for raw strings + include("strings-double"), + ], + "sqs": [ + (r"'", String.Single, "#pop"), + (r"\\\\|\\'|\\\n", String.Escape), # included here for raw strings + include("strings-single"), + ], + "tdqf": [ + (r'"""', String.Double, "#pop"), + include("fstrings-double"), + (r"\n", String.Double), + ], + "tsqf": [ + (r"'''", String.Single, "#pop"), + include("fstrings-single"), + (r"\n", String.Single), + ], + "tdqs": [ + (r'"""', String.Double, "#pop"), + include("strings-double"), + (r"\n", String.Double), + ], + "tsqs": [ + (r"'''", String.Single, "#pop"), + include("strings-single"), + (r"\n", String.Single), + ], + } + + def analyse_text(text): + return ( + shebang_matches(text, r"mojo?") or "import " in text[:1000] + ) # TODO supported? diff --git a/libs/pygments/lexers/monte.py b/libs/pygments/lexers/monte.py index 18f5a036c..74a2d036c 100644 --- a/libs/pygments/lexers/monte.py +++ b/libs/pygments/lexers/monte.py @@ -4,7 +4,7 @@ Lexer for the Monte programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -78,13 +78,12 @@ class MonteLexer(RegexLexer): """ Lexer for the Monte programming language. - - .. versionadded:: 2.2 """ name = 'Monte' url = 'https://monte.readthedocs.io/' aliases = ['monte'] filenames = ['*.mt'] + version_added = '2.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/mosel.py b/libs/pygments/lexers/mosel.py index f3c86cc57..0032c8f59 100644 --- a/libs/pygments/lexers/mosel.py +++ b/libs/pygments/lexers/mosel.py @@ -5,7 +5,7 @@ Lexers for the mosel language. http://www.fico.com/en/products/fico-xpress-optimization - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -391,12 +391,12 @@ class MoselLexer(RegexLexer): """ For the Mosel optimization language. - - .. versionadded:: 2.6 """ name = 'Mosel' aliases = ['mosel'] filenames = ['*.mos'] + url = 'https://www.fico.com/fico-xpress-optimization/docs/latest/mosel/mosel_lang/dhtml/moselreflang.html' + version_added = '2.6' tokens = { 'root': [ diff --git a/libs/pygments/lexers/ncl.py b/libs/pygments/lexers/ncl.py index b1ec1454b..499ef9411 100644 --- a/libs/pygments/lexers/ncl.py +++ b/libs/pygments/lexers/ncl.py @@ -4,7 +4,7 @@ Lexers for NCAR Command Language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,13 +20,14 @@ class NCLLexer(RegexLexer): """ Lexer for NCL code. - - .. versionadded:: 2.2 """ name = 'NCL' aliases = ['ncl'] filenames = ['*.ncl'] mimetypes = ['text/ncl'] + url = 'https://www.ncl.ucar.edu' + version_added = '2.2' + flags = re.MULTILINE tokens = { diff --git a/libs/pygments/lexers/nimrod.py b/libs/pygments/lexers/nimrod.py index 11f5b936d..b8be9797b 100644 --- a/libs/pygments/lexers/nimrod.py +++ b/libs/pygments/lexers/nimrod.py @@ -4,7 +4,7 @@ Lexer for the Nim language (formerly known as Nimrod). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,8 +20,6 @@ class NimrodLexer(RegexLexer): """ For Nim source code. - - .. versionadded:: 1.5 """ name = 'Nimrod' @@ -29,6 +27,7 @@ class NimrodLexer(RegexLexer): aliases = ['nimrod', 'nim'] filenames = ['*.nim', '*.nimrod'] mimetypes = ['text/x-nim'] + version_added = '1.5' flags = re.MULTILINE | re.IGNORECASE @@ -97,15 +96,15 @@ def underscorize(words): ("'", String.Char, 'chars'), # Keywords - (r'(%s)\b' % underscorize(opWords), Operator.Word), + (rf'({underscorize(opWords)})\b', Operator.Word), (r'(proc|func|method|macro|template)(\s)(?![(\[\]])', bygroups(Keyword, Text.Whitespace), 'funcname'), - (r'(%s)\b' % underscorize(keywords), Keyword), - (r'(%s)\b' % underscorize(['from', 'import', 'include', 'export']), + (rf'({underscorize(keywords)})\b', Keyword), + (r'({})\b'.format(underscorize(['from', 'import', 'include', 'export'])), Keyword.Namespace), (r'(v_?a_?r)\b', Keyword.Declaration), - (r'(%s)\b' % underscorize(types), Name.Builtin), - (r'(%s)\b' % underscorize(keywordsPseudo), Keyword.Pseudo), + (rf'({underscorize(types)})\b', Name.Builtin), + (rf'({underscorize(keywordsPseudo)})\b', Keyword.Pseudo), # Identifiers (r'\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*', Name), diff --git a/libs/pygments/lexers/nit.py b/libs/pygments/lexers/nit.py index b4e85f304..51b0a2147 100644 --- a/libs/pygments/lexers/nit.py +++ b/libs/pygments/lexers/nit.py @@ -4,7 +4,7 @@ Lexer for the Nit language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class NitLexer(RegexLexer): """ For nit source. - - .. versionadded:: 2.0 """ name = 'Nit' url = 'http://nitlanguage.org' aliases = ['nit'] filenames = ['*.nit'] + version_added = '2.0' tokens = { 'root': [ (r'#.*?$', Comment.Single), diff --git a/libs/pygments/lexers/nix.py b/libs/pygments/lexers/nix.py index 7ab59bb8c..f763835b5 100644 --- a/libs/pygments/lexers/nix.py +++ b/libs/pygments/lexers/nix.py @@ -4,7 +4,7 @@ Lexers for the NixOS Nix language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,8 +20,6 @@ class NixLexer(RegexLexer): """ For the Nix language. - - .. versionadded:: 2.0 """ name = 'Nix' @@ -29,6 +27,7 @@ class NixLexer(RegexLexer): aliases = ['nixos', 'nix'] filenames = ['*.nix'] mimetypes = ['text/x-nix'] + version_added = '2.0' keywords = ['rec', 'with', 'let', 'in', 'inherit', 'assert', 'if', 'else', 'then', '...'] @@ -51,10 +50,10 @@ class NixLexer(RegexLexer): (r'\s+', Text), # keywords - ('(%s)' % '|'.join(re.escape(entry) + '\\b' for entry in keywords), Keyword), + ('({})'.format('|'.join(re.escape(entry) + '\\b' for entry in keywords)), Keyword), # highlight the builtins - ('(%s)' % '|'.join(re.escape(entry) + '\\b' for entry in builtins), + ('({})'.format('|'.join(re.escape(entry) + '\\b' for entry in builtins)), Name.Builtin), (r'\b(true|false|null)\b', Name.Constant), @@ -71,7 +70,7 @@ class NixLexer(RegexLexer): (r'\<[\w.+-]+(\/[\w.+-]+)*\>', Literal), # operators - ('(%s)' % '|'.join(re.escape(entry) for entry in operators), + ('({})'.format('|'.join(re.escape(entry) for entry in operators)), Operator), # word operators @@ -80,7 +79,7 @@ class NixLexer(RegexLexer): (r'\{', Punctuation, 'block'), # punctuations - ('(%s)' % '|'.join(re.escape(entry) for entry in punctuations), Punctuation), + ('({})'.format('|'.join(re.escape(entry) for entry in punctuations)), Punctuation), # strings (r'"', String.Double, 'doublequote'), diff --git a/libs/pygments/lexers/oberon.py b/libs/pygments/lexers/oberon.py index 3aaa76330..8edf34b8e 100644 --- a/libs/pygments/lexers/oberon.py +++ b/libs/pygments/lexers/oberon.py @@ -4,7 +4,7 @@ Lexers for Oberon family languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,13 +20,13 @@ class ComponentPascalLexer(RegexLexer): """ For Component Pascal source code. - - .. versionadded:: 2.1 """ name = 'Component Pascal' aliases = ['componentpascal', 'cp'] filenames = ['*.cp', '*.cps'] mimetypes = ['text/x-component-pascal'] + url = 'https://blackboxframework.org' + version_added = '2.1' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/objective.py b/libs/pygments/lexers/objective.py index 2e4332adf..a5ee98d2c 100644 --- a/libs/pygments/lexers/objective.py +++ b/libs/pygments/lexers/objective.py @@ -4,7 +4,7 @@ Lexers for Objective-C family languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -201,6 +201,7 @@ class ObjectiveCLexer(objective(CLexer)): aliases = ['objective-c', 'objectivec', 'obj-c', 'objc'] filenames = ['*.m', '*.h'] mimetypes = ['text/x-objective-c'] + version_added = '' priority = 0.05 # Lower than C @@ -213,20 +214,20 @@ class ObjectiveCppLexer(objective(CppLexer)): aliases = ['objective-c++', 'objectivec++', 'obj-c++', 'objc++'] filenames = ['*.mm', '*.hh'] mimetypes = ['text/x-objective-c++'] + version_added = '' priority = 0.05 # Lower than C++ class LogosLexer(ObjectiveCppLexer): """ For Logos + Objective-C source code with preprocessor directives. - - .. versionadded:: 1.6 """ name = 'Logos' aliases = ['logos'] filenames = ['*.x', '*.xi', '*.xm', '*.xmi'] mimetypes = ['text/x-logos'] + version_added = '1.6' priority = 0.25 tokens = { @@ -283,14 +284,13 @@ def analyse_text(text): class SwiftLexer(RegexLexer): """ For Swift source. - - .. versionadded:: 2.0 """ name = 'Swift' url = 'https://www.swift.org/' filenames = ['*.swift'] aliases = ['swift'] mimetypes = ['text/x-swift'] + version_added = '2.0' tokens = { 'root': [ @@ -403,6 +403,7 @@ class SwiftLexer(RegexLexer): r'\.[0-9_]*|[eE][+\-]?[0-9_]+)', Number.Float), (r'[0-9][0-9_]*', Number.Integer), # String Literal + (r'"""', String, 'string-multi'), (r'"', String, 'string'), # Operators and Punctuation @@ -477,8 +478,15 @@ class SwiftLexer(RegexLexer): include('root') ], 'string': [ - (r'\\\(', String.Interpol, 'string-intp'), (r'"', String, '#pop'), + include("string-common"), + ], + 'string-multi': [ + (r'"""', String, '#pop'), + include("string-common"), + ], + 'string-common': [ + (r'\\\(', String.Interpol, 'string-intp'), (r"""\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}""" r"""|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}""", String.Escape), (r'[^\\"]+', String), diff --git a/libs/pygments/lexers/ooc.py b/libs/pygments/lexers/ooc.py index c4600eaee..881a57aff 100644 --- a/libs/pygments/lexers/ooc.py +++ b/libs/pygments/lexers/ooc.py @@ -4,7 +4,7 @@ Lexers for the Ooc language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class OocLexer(RegexLexer): """ For Ooc source code - - .. versionadded:: 1.2 """ name = 'Ooc' url = 'http://ooc-lang.org/' aliases = ['ooc'] filenames = ['*.ooc'] mimetypes = ['text/x-ooc'] + version_added = '1.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/openscad.py b/libs/pygments/lexers/openscad.py index de8fdaf61..97fb92a03 100644 --- a/libs/pygments/lexers/openscad.py +++ b/libs/pygments/lexers/openscad.py @@ -4,7 +4,7 @@ Lexers for the OpenSCAD languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -16,14 +16,13 @@ class OpenScadLexer(RegexLexer): """For openSCAD code. - - .. versionadded:: 2.16 """ name = "OpenSCAD" url = "https://openscad.org/" aliases = ["openscad"] filenames = ["*.scad"] mimetypes = ["application/x-openscad"] + version_added = '2.16' tokens = { "root": [ diff --git a/libs/pygments/lexers/other.py b/libs/pygments/lexers/other.py index f2c07d7ed..838104c50 100644 --- a/libs/pygments/lexers/other.py +++ b/libs/pygments/lexers/other.py @@ -4,10 +4,11 @@ Just export lexer classes previously contained in this module. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +# ruff: noqa: F401 from pygments.lexers.sql import SqlLexer, MySqlLexer, SqliteConsoleLexer from pygments.lexers.shell import BashLexer, BashSessionLexer, BatchLexer, \ TcshLexer diff --git a/libs/pygments/lexers/parasail.py b/libs/pygments/lexers/parasail.py index 5a7238ec7..c525ff0b7 100644 --- a/libs/pygments/lexers/parasail.py +++ b/libs/pygments/lexers/parasail.py @@ -4,7 +4,7 @@ Lexer for ParaSail. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,8 +20,6 @@ class ParaSailLexer(RegexLexer): """ For ParaSail source code. - - .. versionadded:: 2.1 """ name = 'ParaSail' @@ -29,6 +27,7 @@ class ParaSailLexer(RegexLexer): aliases = ['parasail'] filenames = ['*.psi', '*.psl'] mimetypes = ['text/x-parasail'] + version_added = '2.1' flags = re.MULTILINE diff --git a/libs/pygments/lexers/parsers.py b/libs/pygments/lexers/parsers.py index 0415ac6a7..2e0ae0cca 100644 --- a/libs/pygments/lexers/parsers.py +++ b/libs/pygments/lexers/parsers.py @@ -4,7 +4,7 @@ Lexers for parser generators. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -38,14 +38,13 @@ class RagelLexer(RegexLexer): :class:`RagelEmbeddedLexer` instead (or one of the language-specific subclasses). - .. versionadded:: 1.1 - """ name = 'Ragel' url = 'http://www.colm.net/open-source/ragel/' aliases = ['ragel'] filenames = [] + version_added = '1.1' tokens = { 'whitespace': [ @@ -133,13 +132,13 @@ class RagelEmbeddedLexer(RegexLexer): This will only highlight Ragel statements. If you want host language highlighting then call the language-specific Ragel lexer. - - .. versionadded:: 1.1 """ name = 'Embedded Ragel' aliases = ['ragel-em'] filenames = ['*.rl'] + url = 'http://www.colm.net/open-source/ragel/' + version_added = '1.1' tokens = { 'root': [ @@ -213,13 +212,13 @@ def analyse_text(text): class RagelRubyLexer(DelegatingLexer): """ A lexer for Ragel in a Ruby host file. - - .. versionadded:: 1.1 """ name = 'Ragel in Ruby Host' aliases = ['ragel-ruby', 'ragel-rb'] filenames = ['*.rl'] + url = 'http://www.colm.net/open-source/ragel/' + version_added = '1.1' def __init__(self, **options): super().__init__(RubyLexer, RagelEmbeddedLexer, **options) @@ -231,13 +230,13 @@ def analyse_text(text): class RagelCLexer(DelegatingLexer): """ A lexer for Ragel in a C host file. - - .. versionadded:: 1.1 """ name = 'Ragel in C Host' aliases = ['ragel-c'] filenames = ['*.rl'] + url = 'http://www.colm.net/open-source/ragel/' + version_added = '1.1' def __init__(self, **options): super().__init__(CLexer, RagelEmbeddedLexer, **options) @@ -249,13 +248,13 @@ def analyse_text(text): class RagelDLexer(DelegatingLexer): """ A lexer for Ragel in a D host file. - - .. versionadded:: 1.1 """ name = 'Ragel in D Host' aliases = ['ragel-d'] filenames = ['*.rl'] + url = 'http://www.colm.net/open-source/ragel/' + version_added = '1.1' def __init__(self, **options): super().__init__(DLexer, RagelEmbeddedLexer, **options) @@ -267,13 +266,13 @@ def analyse_text(text): class RagelCppLexer(DelegatingLexer): """ A lexer for Ragel in a C++ host file. - - .. versionadded:: 1.1 """ name = 'Ragel in CPP Host' aliases = ['ragel-cpp'] filenames = ['*.rl'] + url = 'http://www.colm.net/open-source/ragel/' + version_added = '1.1' def __init__(self, **options): super().__init__(CppLexer, RagelEmbeddedLexer, **options) @@ -285,13 +284,13 @@ def analyse_text(text): class RagelObjectiveCLexer(DelegatingLexer): """ A lexer for Ragel in an Objective C host file. - - .. versionadded:: 1.1 """ name = 'Ragel in Objective C Host' aliases = ['ragel-objc'] filenames = ['*.rl'] + url = 'http://www.colm.net/open-source/ragel/' + version_added = '1.1' def __init__(self, **options): super().__init__(ObjectiveCLexer, RagelEmbeddedLexer, **options) @@ -303,13 +302,13 @@ def analyse_text(text): class RagelJavaLexer(DelegatingLexer): """ A lexer for Ragel in a Java host file. - - .. versionadded:: 1.1 """ name = 'Ragel in Java Host' aliases = ['ragel-java'] filenames = ['*.rl'] + url = 'http://www.colm.net/open-source/ragel/' + version_added = '1.1' def __init__(self, **options): super().__init__(JavaLexer, RagelEmbeddedLexer, **options) @@ -320,18 +319,16 @@ def analyse_text(text): class AntlrLexer(RegexLexer): """ - Generic `ANTLR`_ Lexer. + Generic ANTLR Lexer. Should not be called directly, instead use DelegatingLexer for your target language. - - .. versionadded:: 1.1 - - .. _ANTLR: http://www.antlr.org/ """ name = 'ANTLR' aliases = ['antlr'] filenames = [] + url = 'https://www.antlr.org' + version_added = '1.1' _id = r'[A-Za-z]\w*' _TOKEN_REF = r'[A-Z]\w*' @@ -516,13 +513,13 @@ def analyse_text(text): class AntlrCppLexer(DelegatingLexer): """ ANTLR with C++ Target - - .. versionadded:: 1.1 """ name = 'ANTLR With CPP Target' aliases = ['antlr-cpp'] filenames = ['*.G', '*.g'] + url = 'https://www.antlr.org' + version_added = '1.1' def __init__(self, **options): super().__init__(CppLexer, AntlrLexer, **options) @@ -535,13 +532,13 @@ def analyse_text(text): class AntlrObjectiveCLexer(DelegatingLexer): """ ANTLR with Objective-C Target - - .. versionadded:: 1.1 """ name = 'ANTLR With ObjectiveC Target' aliases = ['antlr-objc'] filenames = ['*.G', '*.g'] + url = 'https://www.antlr.org' + version_added = '1.1' def __init__(self, **options): super().__init__(ObjectiveCLexer, AntlrLexer, **options) @@ -554,13 +551,13 @@ def analyse_text(text): class AntlrCSharpLexer(DelegatingLexer): """ ANTLR with C# Target - - .. versionadded:: 1.1 """ name = 'ANTLR With C# Target' aliases = ['antlr-csharp', 'antlr-c#'] filenames = ['*.G', '*.g'] + url = 'https://www.antlr.org' + version_added = '1.1' def __init__(self, **options): super().__init__(CSharpLexer, AntlrLexer, **options) @@ -573,13 +570,13 @@ def analyse_text(text): class AntlrPythonLexer(DelegatingLexer): """ ANTLR with Python Target - - .. versionadded:: 1.1 """ name = 'ANTLR With Python Target' aliases = ['antlr-python'] filenames = ['*.G', '*.g'] + url = 'https://www.antlr.org' + version_added = '1.1' def __init__(self, **options): super().__init__(PythonLexer, AntlrLexer, **options) @@ -592,13 +589,13 @@ def analyse_text(text): class AntlrJavaLexer(DelegatingLexer): """ ANTLR with Java Target - - .. versionadded:: 1. """ name = 'ANTLR With Java Target' aliases = ['antlr-java'] filenames = ['*.G', '*.g'] + url = 'https://www.antlr.org' + version_added = '1.1' def __init__(self, **options): super().__init__(JavaLexer, AntlrLexer, **options) @@ -611,13 +608,13 @@ def analyse_text(text): class AntlrRubyLexer(DelegatingLexer): """ ANTLR with Ruby Target - - .. versionadded:: 1.1 """ name = 'ANTLR With Ruby Target' aliases = ['antlr-ruby', 'antlr-rb'] filenames = ['*.G', '*.g'] + url = 'https://www.antlr.org' + version_added = '1.1' def __init__(self, **options): super().__init__(RubyLexer, AntlrLexer, **options) @@ -630,13 +627,13 @@ def analyse_text(text): class AntlrPerlLexer(DelegatingLexer): """ ANTLR with Perl Target - - .. versionadded:: 1.1 """ name = 'ANTLR With Perl Target' aliases = ['antlr-perl'] filenames = ['*.G', '*.g'] + url = 'https://www.antlr.org' + version_added = '1.1' def __init__(self, **options): super().__init__(PerlLexer, AntlrLexer, **options) @@ -649,13 +646,13 @@ def analyse_text(text): class AntlrActionScriptLexer(DelegatingLexer): """ ANTLR with ActionScript Target - - .. versionadded:: 1.1 """ name = 'ANTLR With ActionScript Target' aliases = ['antlr-actionscript', 'antlr-as'] filenames = ['*.G', '*.g'] + url = 'https://www.antlr.org' + version_added = '1.1' def __init__(self, **options): from pygments.lexers.actionscript import ActionScriptLexer @@ -737,14 +734,14 @@ class TreetopBaseLexer(RegexLexer): class TreetopLexer(DelegatingLexer): """ - A lexer for `Treetop <http://treetop.rubyforge.org/>`_ grammars. - - .. versionadded:: 1.6 + A lexer for Treetop grammars. """ name = 'Treetop' aliases = ['treetop'] filenames = ['*.treetop', '*.tt'] + url = 'https://cjheath.github.io/treetop' + version_added = '1.6' def __init__(self, **options): super().__init__(RubyLexer, TreetopBaseLexer, **options) @@ -753,16 +750,16 @@ def __init__(self, **options): class EbnfLexer(RegexLexer): """ Lexer for `ISO/IEC 14977 EBNF - <http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form>`_ + <https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form>`_ grammars. - - .. versionadded:: 2.0 """ name = 'EBNF' aliases = ['ebnf'] filenames = ['*.ebnf'] mimetypes = ['text/x-ebnf'] + url = 'https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form' + version_added = '2.0' tokens = { 'root': [ diff --git a/libs/pygments/lexers/pascal.py b/libs/pygments/lexers/pascal.py index 34df19215..bb5e1e75e 100644 --- a/libs/pygments/lexers/pascal.py +++ b/libs/pygments/lexers/pascal.py @@ -4,7 +4,7 @@ Lexers for Pascal family languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -12,12 +12,12 @@ from pygments.lexer import Lexer from pygments.util import get_bool_opt, get_list_opt -from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ +from pygments.token import Comment, Operator, Keyword, Name, String, \ Number, Punctuation, Error, Whitespace from pygments.scanner import Scanner # compatibility import -from pygments.lexers.modula2 import Modula2Lexer +from pygments.lexers.modula2 import Modula2Lexer # noqa: F401 __all__ = ['DelphiLexer', 'PortugolLexer'] @@ -29,6 +29,7 @@ class PortugolLexer(Lexer): filenames = ['*.alg', '*.portugol'] mimetypes = [] url = "https://www.apoioinformatica.inf.br/produtos/visualg/linguagem" + version_added = '' def __init__(self, **options): Lexer.__init__(self, **options) @@ -60,6 +61,8 @@ class DelphiLexer(Lexer): aliases = ['delphi', 'pas', 'pascal', 'objectpascal'] filenames = ['*.pas', '*.dpr'] mimetypes = ['text/x-pascal'] + url = 'https://www.embarcadero.com/products/delphi' + version_added = '' TURBO_PASCAL_KEYWORDS = ( 'absolute', 'and', 'array', 'asm', 'begin', 'break', 'case', diff --git a/libs/pygments/lexers/pawn.py b/libs/pygments/lexers/pawn.py index 36b48fcbf..484e8dcb9 100644 --- a/libs/pygments/lexers/pawn.py +++ b/libs/pygments/lexers/pawn.py @@ -4,7 +4,7 @@ Lexers for the Pawn languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,13 +19,13 @@ class SourcePawnLexer(RegexLexer): """ For SourcePawn source code with preprocessor directives. - - .. versionadded:: 1.6 """ name = 'SourcePawn' aliases = ['sp'] filenames = ['*.sp'] mimetypes = ['text/x-sourcepawn'] + url = 'https://github.com/alliedmodders/sourcepawn' + version_added = '1.6' #: optional Comment or Whitespace _ws = r'(?:\s|//.*?\n|/\*.*?\*/)+' @@ -129,14 +129,14 @@ def get_tokens_unprocessed(self, text): class PawnLexer(RegexLexer): """ For Pawn source code. - - .. versionadded:: 2.0 """ name = 'Pawn' aliases = ['pawn'] filenames = ['*.p', '*.pwn', '*.inc'] mimetypes = ['text/x-pawn'] + url = 'https://www.compuphase.com/pawn/pawn.htm' + version_added = '2.0' #: optional Comment or Whitespace _ws = r'(?:\s|//.*?\n|/[*][\w\W]*?[*]/)+' diff --git a/libs/pygments/lexers/perl.py b/libs/pygments/lexers/perl.py index 88c6486a6..3ec19445c 100644 --- a/libs/pygments/lexers/perl.py +++ b/libs/pygments/lexers/perl.py @@ -4,7 +4,7 @@ Lexers for Perl, Raku and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -29,6 +29,7 @@ class PerlLexer(RegexLexer): aliases = ['perl', 'pl'] filenames = ['*.pl', '*.pm', '*.t', '*.perl'] mimetypes = ['text/x-perl', 'application/x-perl'] + version_added = '' flags = re.DOTALL | re.MULTILINE # TODO: give this to a perl guy who knows how to parse perl... @@ -225,8 +226,6 @@ def analyse_text(text): class Perl6Lexer(ExtendedRegexLexer): """ For Raku (a.k.a. Perl 6) source code. - - .. versionadded:: 2.0 """ name = 'Perl6' @@ -236,6 +235,7 @@ class Perl6Lexer(ExtendedRegexLexer): '*.6pm', '*.p6m', '*.pm6', '*.t', '*.raku', '*.rakumod', '*.rakutest', '*.rakudoc'] mimetypes = ['text/x-perl6', 'application/x-perl6'] + version_added = '2.0' flags = re.MULTILINE | re.DOTALL PERL6_IDENTIFIER_RANGE = r"['\w:-]" diff --git a/libs/pygments/lexers/phix.py b/libs/pygments/lexers/phix.py index fb08b1dc7..29082e05c 100644 --- a/libs/pygments/lexers/phix.py +++ b/libs/pygments/lexers/phix.py @@ -4,7 +4,7 @@ Lexers for Phix. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,8 +21,6 @@ class PhixLexer(RegexLexer): """ Pygments Lexer for Phix files (.exw). See http://phix.x10.mx - - .. versionadded:: 2.14.0 """ name = 'Phix' @@ -30,6 +28,7 @@ class PhixLexer(RegexLexer): aliases = ['phix'] filenames = ['*.exw'] mimetypes = ['text/x-phix'] + version_added = '2.14' flags = re.MULTILINE # nb: **NOT** re.DOTALL! (totally spanners comment handling) diff --git a/libs/pygments/lexers/php.py b/libs/pygments/lexers/php.py index a0a0021aa..4f00c6f48 100644 --- a/libs/pygments/lexers/php.py +++ b/libs/pygments/lexers/php.py @@ -4,7 +4,7 @@ Lexers for PHP and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -25,14 +25,13 @@ class ZephirLexer(RegexLexer): Zephir is a compiled high level language aimed to the creation of C-extensions for PHP. - - .. versionadded:: 2.0 """ name = 'Zephir' url = 'http://zephir-lang.com/' aliases = ['zephir'] filenames = ['*.zep'] + version_added = '2.0' zephir_keywords = ['fetch', 'echo', 'isset', 'empty'] zephir_type = ['bit', 'bits', 'string'] @@ -97,12 +96,11 @@ class PsyshConsoleLexer(Lexer): => Closure($name): string {#2371 …3} >>> $greeting('World') => "Hello, World" - - .. versionadded:: 2.7 """ name = 'PsySH console session for PHP' url = 'https://psysh.org/' aliases = ['psysh'] + version_added = '2.7' def __init__(self, **options): options['startinline'] = True @@ -172,6 +170,7 @@ class PhpLexer(RegexLexer): aliases = ['php', 'php3', 'php4', 'php5'] filenames = ['*.php', '*.php[345]', '*.inc'] mimetypes = ['text/x-php'] + version_added = '' # Note that a backslash is included, PHP uses a backslash as a namespace # separator. diff --git a/libs/pygments/lexers/pointless.py b/libs/pygments/lexers/pointless.py index eb73b2a79..4e330e3da 100644 --- a/libs/pygments/lexers/pointless.py +++ b/libs/pygments/lexers/pointless.py @@ -4,7 +4,7 @@ Lexers for Pointless. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class PointlessLexer(RegexLexer): """ For Pointless source code. - - .. versionadded:: 2.7 """ name = 'Pointless' url = 'https://ptls.dev' aliases = ['pointless'] filenames = ['*.ptls'] + version_added = '2.7' ops = words([ "+", "-", "*", "/", "**", "%", "+=", "-=", "*=", diff --git a/libs/pygments/lexers/pony.py b/libs/pygments/lexers/pony.py index 03adc5fd0..f7fc769db 100644 --- a/libs/pygments/lexers/pony.py +++ b/libs/pygments/lexers/pony.py @@ -4,7 +4,7 @@ Lexers for Pony and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,13 +18,13 @@ class PonyLexer(RegexLexer): """ For Pony source code. - - .. versionadded:: 2.4 """ name = 'Pony' aliases = ['pony'] filenames = ['*.pony'] + url = 'https://www.ponylang.io' + version_added = '2.4' _caps = r'(iso|trn|ref|val|box|tag)' diff --git a/libs/pygments/lexers/praat.py b/libs/pygments/lexers/praat.py index c8533a65c..e10cac489 100644 --- a/libs/pygments/lexers/praat.py +++ b/libs/pygments/lexers/praat.py @@ -4,7 +4,7 @@ Lexer for Praat - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class PraatLexer(RegexLexer): """ For Praat scripts. - - .. versionadded:: 2.1 """ name = 'Praat' url = 'http://www.praat.org' aliases = ['praat'] filenames = ['*.praat', '*.proc', '*.psc'] + version_added = '2.1' keywords = ( 'if', 'then', 'else', 'elsif', 'elif', 'endif', 'fi', 'for', 'from', 'to', diff --git a/libs/pygments/lexers/procfile.py b/libs/pygments/lexers/procfile.py index 4f9b59c35..3b42b3164 100644 --- a/libs/pygments/lexers/procfile.py +++ b/libs/pygments/lexers/procfile.py @@ -4,7 +4,7 @@ Lexer for Procfile file format. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,13 +20,12 @@ class ProcfileLexer(RegexLexer): The format is used to run processes on Heroku or is used by Foreman or Honcho tools. - - .. versionadded:: 2.10 """ name = 'Procfile' url = 'https://devcenter.heroku.com/articles/procfile#procfile-format' aliases = ['procfile'] filenames = ['Procfile'] + version_added = '2.10' tokens = { 'root': [ diff --git a/libs/pygments/lexers/prolog.py b/libs/pygments/lexers/prolog.py index 37c1e9c7e..7578889d1 100644 --- a/libs/pygments/lexers/prolog.py +++ b/libs/pygments/lexers/prolog.py @@ -4,7 +4,7 @@ Lexers for Prolog and Prolog-like languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -25,6 +25,8 @@ class PrologLexer(RegexLexer): aliases = ['prolog'] filenames = ['*.ecl', '*.prolog', '*.pro', '*.pl'] mimetypes = ['text/x-prolog'] + url = 'https://en.wikipedia.org/wiki/Prolog' + version_added = '' tokens = { 'root': [ @@ -89,8 +91,6 @@ def analyse_text(text): class LogtalkLexer(RegexLexer): """ For Logtalk source code. - - .. versionadded:: 0.10 """ name = 'Logtalk' @@ -98,6 +98,7 @@ class LogtalkLexer(RegexLexer): aliases = ['logtalk'] filenames = ['*.lgt', '*.logtalk'] mimetypes = ['text/x-logtalk'] + version_added = '0.10' tokens = { 'root': [ @@ -148,7 +149,7 @@ class LogtalkLexer(RegexLexer): # Control constructs (r'(ca(ll|tch)|throw)(?=[(])', Keyword), (r'(fa(il|lse)|true|(instantiation|system)_error)\b', Keyword), - (r'(type|domain|existence|permission|representation|evaluation|resource|syntax)_error(?=[(])', Keyword), + (r'(uninstantiation|type|domain|existence|permission|representation|evaluation|resource|syntax)_error(?=[(])', Keyword), # All solutions (r'((bag|set)of|f(ind|or)all)(?=[(])', Keyword), # Multi-threading predicates @@ -229,13 +230,13 @@ class LogtalkLexer(RegexLexer): (r'[?@]', Operator), # Existential quantifier (r'\^', Operator), - # Strings - (r'"(\\\\|\\[^\\]|[^"\\])*"', String), # Punctuation (r'[()\[\],.|]', Text), # Atoms (r"[a-z][a-zA-Z0-9_]*", Text), (r"'", String, 'quoted_atom'), + # Double-quoted terms + (r'"', String, 'double_quoted_term'), ], 'quoted_atom': [ @@ -246,6 +247,14 @@ class LogtalkLexer(RegexLexer): (r'\\', String), ], + 'double_quoted_term': [ + (r'""', String), + (r'"', String, '#pop'), + (r'\\([\\abfnrtv"\']|(x[a-fA-F0-9]+|[0-7]+)\\)', String.Escape), + (r'[^\\"\n]+', String), + (r'\\', String), + ], + 'directive': [ # Conditional compilation directives (r'(el)?if(?=[(])', Keyword, 'root'), @@ -279,8 +288,8 @@ class LogtalkLexer(RegexLexer): # Atoms (r"[a-z][a-zA-Z0-9_]*", Text), (r"'", String, 'quoted_atom'), - # Strings - (r'"(\\\\|\\[^\\]|[^"\\])*"', String), + # Double-quoted terms + (r'"', String, 'double_quoted_term'), # End of entity-opening directive (r'([)]\.)', Text, 'root'), # Scope operator diff --git a/libs/pygments/lexers/promql.py b/libs/pygments/lexers/promql.py index b6d2d666a..7996c3d07 100644 --- a/libs/pygments/lexers/promql.py +++ b/libs/pygments/lexers/promql.py @@ -4,7 +4,7 @@ Lexer for Prometheus Query Language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -29,6 +29,7 @@ class PromQLLexer(RegexLexer): url = 'https://prometheus.io/docs/prometheus/latest/querying/basics/' aliases = ["promql"] filenames = ["*.promql"] + version_added = '' base_keywords = ( words( diff --git a/libs/pygments/lexers/prql.py b/libs/pygments/lexers/prql.py index 4c2f12ef3..1f22eb29d 100644 --- a/libs/pygments/lexers/prql.py +++ b/libs/pygments/lexers/prql.py @@ -4,7 +4,7 @@ Lexer for the PRQL query language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,8 +19,6 @@ class PrqlLexer(RegexLexer): """ For PRQL source code. - .. versionadded:: 2.17 - grammar: https://github.com/PRQL/prql/tree/main/grammars """ @@ -29,6 +27,7 @@ class PrqlLexer(RegexLexer): aliases = ['prql'] filenames = ['*.prql'] mimetypes = ['application/prql', 'application/x-prql'] + version_added = '2.17' builtinTypes = words(( "bool", diff --git a/libs/pygments/lexers/ptx.py b/libs/pygments/lexers/ptx.py index 218d69465..405e7f7e2 100644 --- a/libs/pygments/lexers/ptx.py +++ b/libs/pygments/lexers/ptx.py @@ -4,7 +4,7 @@ Lexer for other PTX language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +19,13 @@ class PtxLexer(RegexLexer): """ For NVIDIA `PTX <https://docs.nvidia.com/cuda/parallel-thread-execution/>`_ source. - - .. versionadded:: 2.16 """ name = 'PTX' url = "https://docs.nvidia.com/cuda/parallel-thread-execution/" filenames = ['*.ptx'] aliases = ['ptx'] mimetypes = ['text/x-ptx'] + version_added = '2.16' #: optional Comment or Whitespace string = r'"[^"]*?"' diff --git a/libs/pygments/lexers/python.py b/libs/pygments/lexers/python.py index cdb88ab43..287305c75 100644 --- a/libs/pygments/lexers/python.py +++ b/libs/pygments/lexers/python.py @@ -4,15 +4,14 @@ Lexers for Python and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import re import keyword -from pygments.lexer import DelegatingLexer, Lexer, RegexLexer, include, \ - bygroups, using, default, words, combined, do_insertions, this, line_re +from pygments.lexer import DelegatingLexer, RegexLexer, include, \ + bygroups, using, default, words, combined, this from pygments.util import get_bool_opt, shebang_matches from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ Number, Punctuation, Generic, Other, Error, Whitespace @@ -27,8 +26,6 @@ class PythonLexer(RegexLexer): """ For Python source code (version 3.x). - .. versionadded:: 0.10 - .. versionchanged:: 2.5 This is now the default ``PythonLexer``. It is still available as the alias ``Python3Lexer``. @@ -61,8 +58,9 @@ class PythonLexer(RegexLexer): ] mimetypes = ['text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3'] + version_added = '0.10' - uni_name = "[%s][%s]*" % (uni.xid_start, uni.xid_continue) + uni_name = f"[{uni.xid_start}][{uni.xid_continue}]*" def innerstring_rules(ttype): return [ @@ -224,7 +222,8 @@ def fstring_rules(ttype): r'(match|case)\b' # a possible keyword r'(?![ \t]*(?:' # not followed by... r'[:,;=^&|@~)\]}]|(?:' + # characters and keywords that mean this isn't - r'|'.join(keyword.kwlist) + r')\b))', # pattern matching + # pattern matching (but None/True/False is ok) + r'|'.join(k for k in keyword.kwlist if k[0].islower()) + r')\b))', bygroups(Text, Keyword), 'soft-keywords-inner'), ], 'soft-keywords-inner': [ @@ -429,6 +428,7 @@ class Python2Lexer(RegexLexer): aliases = ['python2', 'py2'] filenames = [] # now taken over by PythonLexer (3.x) mimetypes = ['text/x-python2', 'application/x-python2'] + version_added = '' def innerstring_rules(ttype): return [ @@ -637,7 +637,7 @@ def analyse_text(text): class _PythonConsoleLexerBase(RegexLexer): name = 'Python console session' - aliases = ['pycon'] + aliases = ['pycon', 'python-console'] mimetypes = ['text/x-python-doctest'] """Auxiliary lexer for `PythonConsoleLexer`. @@ -696,8 +696,10 @@ class PythonConsoleLexer(DelegatingLexer): """ name = 'Python console session' - aliases = ['pycon'] + aliases = ['pycon', 'python-console'] mimetypes = ['text/x-python-doctest'] + url = 'https://python.org' + version_added = '' def __init__(self, **options): python3 = get_bool_opt(options, 'python3', True) @@ -721,8 +723,6 @@ class PythonTracebackLexer(RegexLexer): """ For Python 3.x tracebacks, with support for chained exceptions. - .. versionadded:: 1.0 - .. versionchanged:: 2.5 This is now the default ``PythonTracebackLexer``. It is still available as the alias ``Python3TracebackLexer``. @@ -732,6 +732,8 @@ class PythonTracebackLexer(RegexLexer): aliases = ['pytb', 'py3tb'] filenames = ['*.pytb', '*.py3tb'] mimetypes = ['text/x-python-traceback', 'text/x-python3-traceback'] + url = 'https://python.org' + version_added = '1.0' tokens = { 'root': [ @@ -778,8 +780,6 @@ class Python2TracebackLexer(RegexLexer): """ For Python tracebacks. - .. versionadded:: 0.7 - .. versionchanged:: 2.5 This class has been renamed from ``PythonTracebackLexer``. ``PythonTracebackLexer`` now refers to the Python 3 variant. @@ -789,6 +789,8 @@ class Python2TracebackLexer(RegexLexer): aliases = ['py2tb'] filenames = ['*.py2tb'] mimetypes = ['text/x-python2-traceback'] + url = 'https://python.org' + version_added = '0.7' tokens = { 'root': [ @@ -825,8 +827,6 @@ class Python2TracebackLexer(RegexLexer): class CythonLexer(RegexLexer): """ For Pyrex and Cython source code. - - .. versionadded:: 1.1 """ name = 'Cython' @@ -834,6 +834,7 @@ class CythonLexer(RegexLexer): aliases = ['cython', 'pyx', 'pyrex'] filenames = ['*.pyx', '*.pxd', '*.pxi'] mimetypes = ['text/x-cython', 'application/x-cython'] + version_added = '1.1' tokens = { 'root': [ @@ -1007,13 +1008,13 @@ class DgLexer(RegexLexer): Lexer for dg, a functional and object-oriented programming language running on the CPython 3 VM. - - .. versionadded:: 1.6 """ name = 'dg' aliases = ['dg'] filenames = ['*.dg'] mimetypes = ['text/x-dg'] + url = 'http://pyos.github.io/dg' + version_added = '1.6' tokens = { 'root': [ @@ -1104,13 +1105,12 @@ class DgLexer(RegexLexer): class NumPyLexer(PythonLexer): """ A Python lexer recognizing Numerical Python builtins. - - .. versionadded:: 0.10 """ name = 'NumPy' url = 'https://numpy.org/' aliases = ['numpy'] + version_added = '0.10' # override the mimetypes to not inherit them from python mimetypes = [] diff --git a/libs/pygments/lexers/q.py b/libs/pygments/lexers/q.py index e5c159137..6ab121c88 100644 --- a/libs/pygments/lexers/q.py +++ b/libs/pygments/lexers/q.py @@ -4,7 +4,7 @@ Lexer for the Q programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,14 +17,14 @@ class KLexer(RegexLexer): """ - For `K <https://code.kx.com/>`_ source code. - - .. versionadded:: 2.12 + For K source code. """ name = "K" aliases = ["k"] filenames = ["*.k"] + url = "https://code.kx.com" + version_added = '2.12' tokens = { "whitespace": [ @@ -152,13 +152,12 @@ class KLexer(RegexLexer): class QLexer(KLexer): """ For `Q <https://code.kx.com/>`_ source code. - - .. versionadded:: 2.12 """ name = "Q" aliases = ["q"] filenames = ["*.q"] + version_added = '2.12' tokens = { "root": [ diff --git a/libs/pygments/lexers/qlik.py b/libs/pygments/lexers/qlik.py index b265b6016..b9b8721a2 100644 --- a/libs/pygments/lexers/qlik.py +++ b/libs/pygments/lexers/qlik.py @@ -4,7 +4,7 @@ Lexer for the qlik scripting language - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,13 +22,13 @@ class QlikLexer(RegexLexer): """ Lexer for qlik code, including .qvs files - - .. versionadded:: 2.12 """ name = "Qlik" aliases = ["qlik", "qlikview", "qliksense", "qlikscript"] filenames = ["*.qvs", "*.qvw"] + url = "https://qlik.com" + version_added = '2.12' flags = re.IGNORECASE diff --git a/libs/pygments/lexers/qvt.py b/libs/pygments/lexers/qvt.py index dc329f7ca..c3012100c 100644 --- a/libs/pygments/lexers/qvt.py +++ b/libs/pygments/lexers/qvt.py @@ -4,7 +4,7 @@ Lexer for QVT Operational language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,11 +18,11 @@ class QVToLexer(RegexLexer): """ - For the `QVT Operational Mapping language <http://www.omg.org/spec/QVT/1.1/>`_. + For the QVT Operational Mapping language. Reference for implementing this: «Meta Object Facility (MOF) 2.0 Query/View/Transformation Specification», Version 1.1 - January 2011 - (http://www.omg.org/spec/QVT/1.1/), see §8.4, «Concrete Syntax» in + (https://www.omg.org/spec/QVT/1.1/), see §8.4, «Concrete Syntax» in particular. Notable tokens assignments: @@ -41,6 +41,8 @@ class QVToLexer(RegexLexer): name = 'QVTO' aliases = ['qvto', 'qvt'] filenames = ['*.qvto'] + url = 'https://www.omg.org/spec/QVT/1.1' + version_added = '' tokens = { 'root': [ diff --git a/libs/pygments/lexers/r.py b/libs/pygments/lexers/r.py index ed62fa2e3..8d7e4a8df 100644 --- a/libs/pygments/lexers/r.py +++ b/libs/pygments/lexers/r.py @@ -4,7 +4,7 @@ Lexers for the R/S languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -28,6 +28,8 @@ class RConsoleLexer(Lexer): name = 'RConsole' aliases = ['rconsole', 'rout'] filenames = ['*.Rout'] + url = 'https://www.r-project.org' + version_added = '' def get_tokens_unprocessed(self, text): slexer = SLexer(**self.options) @@ -67,8 +69,6 @@ def get_tokens_unprocessed(self, text): class SLexer(RegexLexer): """ For S, S-plus, and R source code. - - .. versionadded:: 0.10 """ name = 'S' @@ -76,6 +76,8 @@ class SLexer(RegexLexer): filenames = ['*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron'] mimetypes = ['text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r', 'text/x-R', 'text/x-r-history', 'text/x-r-profile'] + url = 'https://www.r-project.org' + version_added = '0.10' valid_name = r'`[^`\\]*(?:\\.[^`\\]*)*`|(?:[a-zA-Z]|\.[A-Za-z_.])[\w.]*|\.' tokens = { @@ -126,7 +128,7 @@ class SLexer(RegexLexer): ], 'root': [ # calls: - (r'(%s)\s*(?=\()' % valid_name, Name.Function), + (rf'({valid_name})\s*(?=\()', Name.Function), include('statements'), # blocks: (r'\{|\}', Punctuation), @@ -159,13 +161,13 @@ class RdLexer(RegexLexer): than the macros. A description of Rd syntax is found in `Writing R Extensions <http://cran.r-project.org/doc/manuals/R-exts.html>`_ and `Parsing Rd files <http://developer.r-project.org/parseRd.pdf>`_. - - .. versionadded:: 1.6 """ name = 'Rd' aliases = ['rd'] filenames = ['*.Rd'] mimetypes = ['text/x-r-doc'] + url = 'http://cran.r-project.org/doc/manuals/R-exts.html' + version_added = '1.6' # To account for verbatim / LaTeX-like / and R-like areas # would require parsing. diff --git a/libs/pygments/lexers/rdf.py b/libs/pygments/lexers/rdf.py index c4fb998c4..1a0571be7 100644 --- a/libs/pygments/lexers/rdf.py +++ b/libs/pygments/lexers/rdf.py @@ -4,7 +4,7 @@ Lexers for semantic web and RDF query languages and markup. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +19,14 @@ class SparqlLexer(RegexLexer): """ - Lexer for `SPARQL <https://www.w3.org/TR/sparql11-query/>`_ query language. - - .. versionadded:: 2.0 + Lexer for SPARQL query language. """ name = 'SPARQL' aliases = ['sparql'] filenames = ['*.rq', '*.sparql'] mimetypes = ['application/sparql-query'] + url = 'https://www.w3.org/TR/sparql11-query' + version_added = '2.0' # character group definitions :: @@ -177,14 +177,14 @@ class SparqlLexer(RegexLexer): class TurtleLexer(RegexLexer): """ - Lexer for `Turtle <http://www.w3.org/TR/turtle/>`_ data language. - - .. versionadded:: 2.1 + Lexer for Turtle data language. """ name = 'Turtle' aliases = ['turtle'] filenames = ['*.ttl'] mimetypes = ['text/turtle', 'application/x-turtle'] + url = 'https://www.w3.org/TR/turtle' + version_added = '2.1' # character group definitions :: PN_CHARS_BASE_GRP = ('a-zA-Z' @@ -243,10 +243,10 @@ class TurtleLexer(RegexLexer): (r'\s+', Text), # Base / prefix - (r'(@base|BASE)(\s+)%(IRIREF)s(\s*)(\.?)' % patterns, + (r'(@base|BASE)(\s+){IRIREF}(\s*)(\.?)'.format(**patterns), bygroups(Keyword, Whitespace, Name.Variable, Whitespace, Punctuation)), - (r'(@prefix|PREFIX)(\s+)%(PNAME_NS)s(\s+)%(IRIREF)s(\s*)(\.?)' % patterns, + (r'(@prefix|PREFIX)(\s+){PNAME_NS}(\s+){IRIREF}(\s*)(\.?)'.format(**patterns), bygroups(Keyword, Whitespace, Name.Namespace, Whitespace, Name.Variable, Whitespace, Punctuation)), @@ -254,7 +254,7 @@ class TurtleLexer(RegexLexer): (r'(?<=\s)a(?=\s)', Keyword.Type), # IRIREF - (r'%(IRIREF)s' % patterns, Name.Variable), + (r'{IRIREF}'.format(**patterns), Name.Variable), # PrefixedName (r'(' + PN_PREFIX + r')?(\:)(' + PN_LOCAL + r')?', @@ -305,7 +305,7 @@ class TurtleLexer(RegexLexer): (r'(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)', bygroups(Operator, Generic.Emph), '#pop:2'), - (r'(\^\^)%(IRIREF)s' % patterns, bygroups(Operator, Generic.Emph), '#pop:2'), + (r'(\^\^){IRIREF}'.format(**patterns), bygroups(Operator, Generic.Emph), '#pop:2'), default('#pop:2'), @@ -316,18 +316,20 @@ class TurtleLexer(RegexLexer): # but each has a recognizable and distinct syntax. def analyse_text(text): for t in ('@base ', 'BASE ', '@prefix ', 'PREFIX '): - if re.search(r'^\s*%s' % t, text): + if re.search(rf'^\s*{t}', text): return 0.80 class ShExCLexer(RegexLexer): """ - Lexer for `ShExC <https://shex.io/shex-semantics/#shexc>`_ shape expressions language syntax. + Lexer for ShExC shape expressions language syntax. """ name = 'ShExC' aliases = ['shexc', 'shex'] filenames = ['*.shex'] mimetypes = ['text/shex'] + url = 'https://shex.io/shex-semantics/#shexc' + version_added = '' # character group definitions :: diff --git a/libs/pygments/lexers/rebol.py b/libs/pygments/lexers/rebol.py index 6170f0c36..94656f4f2 100644 --- a/libs/pygments/lexers/rebol.py +++ b/libs/pygments/lexers/rebol.py @@ -4,7 +4,7 @@ Lexers for the REBOL and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +19,14 @@ class RebolLexer(RegexLexer): """ - A `REBOL <http://www.rebol.com/>`_ lexer. - - .. versionadded:: 1.1 + A REBOL lexer. """ name = 'REBOL' aliases = ['rebol'] filenames = ['*.r', '*.r3', '*.reb'] mimetypes = ['text/x-rebol'] + url = 'http://www.rebol.com' + version_added = '1.1' flags = re.IGNORECASE | re.MULTILINE @@ -240,14 +240,14 @@ def analyse_text(text): class RedLexer(RegexLexer): """ - A `Red-language <http://www.red-lang.org/>`_ lexer. - - .. versionadded:: 2.0 + A Red-language lexer. """ name = 'Red' aliases = ['red', 'red/system'] filenames = ['*.red', '*.reds'] mimetypes = ['text/x-red', 'text/x-red-system'] + url = 'https://www.red-lang.org' + version_added = '2.0' flags = re.IGNORECASE | re.MULTILINE diff --git a/libs/pygments/lexers/resource.py b/libs/pygments/lexers/resource.py index 2583ba874..f2e965cd1 100644 --- a/libs/pygments/lexers/resource.py +++ b/libs/pygments/lexers/resource.py @@ -4,7 +4,7 @@ Lexer for resource definition files. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class ResourceLexer(RegexLexer): - """Lexer for `ICU Resource bundles - <http://userguide.icu-project.org/locale/resources>`_. - - .. versionadded:: 2.0 + """Lexer for ICU Resource bundles. """ name = 'ResourceBundle' aliases = ['resourcebundle', 'resource'] filenames = [] + url = 'https://unicode-org.github.io/icu/userguide/locale/resources.html' + version_added = '2.0' _types = (':table', ':array', ':string', ':bin', ':import', ':intvector', ':int', ':alias') @@ -37,7 +36,7 @@ class ResourceLexer(RegexLexer): (r'"', String, 'string'), (r'-?\d+', Number.Integer), (r'[,{}]', Operator), - (r'([^\s{:]+)(\s*)(%s?)' % '|'.join(_types), + (r'([^\s{{:]+)(\s*)({}?)'.format('|'.join(_types)), bygroups(Name, Text, Keyword)), (r'\s+', Text), (words(_types), Keyword), diff --git a/libs/pygments/lexers/ride.py b/libs/pygments/lexers/ride.py index 077fcc786..1c3ba928b 100644 --- a/libs/pygments/lexers/ride.py +++ b/libs/pygments/lexers/ride.py @@ -4,7 +4,7 @@ Lexer for the Ride programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,16 +17,15 @@ class RideLexer(RegexLexer): """ - For `Ride <https://docs.wavesplatform.com/en/ride/about-ride.html>`_ - source code. - - .. versionadded:: 2.6 + For Ride source code. """ name = 'Ride' aliases = ['ride'] filenames = ['*.ride'] mimetypes = ['text/x-ride'] + url = 'https://docs.waves.tech/en/ride' + version_added = '2.6' validName = r'[a-zA-Z_][a-zA-Z0-9_\']*' diff --git a/libs/pygments/lexers/rita.py b/libs/pygments/lexers/rita.py index 9aa856977..53da9be26 100644 --- a/libs/pygments/lexers/rita.py +++ b/libs/pygments/lexers/rita.py @@ -4,7 +4,7 @@ Lexers for RITA language - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class RitaLexer(RegexLexer): """ Lexer for RITA. - - .. versionadded:: 2.11 """ name = 'Rita' url = 'https://github.com/zaibacu/rita-dsl' filenames = ['*.rita'] aliases = ['rita'] mimetypes = ['text/rita'] + version_added = '2.11' tokens = { 'root': [ diff --git a/libs/pygments/lexers/rnc.py b/libs/pygments/lexers/rnc.py index d71717538..af157d63b 100644 --- a/libs/pygments/lexers/rnc.py +++ b/libs/pygments/lexers/rnc.py @@ -4,7 +4,7 @@ Lexer for Relax-NG Compact syntax - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class RNCCompactLexer(RegexLexer): """ For RelaxNG-compact syntax. - - .. versionadded:: 2.2 """ name = 'Relax-NG Compact' url = 'http://relaxng.org' aliases = ['rng-compact', 'rnc'] filenames = ['*.rnc'] + version_added = '2.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/roboconf.py b/libs/pygments/lexers/roboconf.py index 5d7d76e0b..7e0b10544 100644 --- a/libs/pygments/lexers/roboconf.py +++ b/libs/pygments/lexers/roboconf.py @@ -4,7 +4,7 @@ Lexers for Roboconf DSL. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,12 +17,12 @@ class RoboconfGraphLexer(RegexLexer): """ Lexer for Roboconf graph files. - - .. versionadded:: 2.1 """ name = 'Roboconf Graph' aliases = ['roboconf-graph'] filenames = ['*.graph'] + url = 'https://roboconf.github.io/en/user-guide/graph-definition.html' + version_added = '2.1' flags = re.IGNORECASE | re.MULTILINE tokens = { @@ -52,12 +52,12 @@ class RoboconfGraphLexer(RegexLexer): class RoboconfInstancesLexer(RegexLexer): """ Lexer for Roboconf instances files. - - .. versionadded:: 2.1 """ name = 'Roboconf Instances' aliases = ['roboconf-instances'] filenames = ['*.instances'] + url = 'https://roboconf.github.io' + version_added = '2.1' flags = re.IGNORECASE | re.MULTILINE tokens = { diff --git a/libs/pygments/lexers/robotframework.py b/libs/pygments/lexers/robotframework.py index 3b676cce2..544944194 100644 --- a/libs/pygments/lexers/robotframework.py +++ b/libs/pygments/lexers/robotframework.py @@ -4,7 +4,7 @@ Lexer for Robot Framework. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -57,14 +57,13 @@ class RobotFrameworkLexer(Lexer): For Robot Framework test data. Supports both space and pipe separated plain text formats. - - .. versionadded:: 1.6 """ name = 'RobotFramework' url = 'http://robotframework.org' aliases = ['robotframework'] filenames = ['*.robot', '*.resource'] mimetypes = ['text/x-robotframework'] + version_added = '1.6' def __init__(self, **options): options['tabsize'] = 2 diff --git a/libs/pygments/lexers/ruby.py b/libs/pygments/lexers/ruby.py index 466d6e752..134ff779f 100644 --- a/libs/pygments/lexers/ruby.py +++ b/libs/pygments/lexers/ruby.py @@ -4,7 +4,7 @@ Lexers for Ruby and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -36,6 +36,7 @@ class RubyLexer(ExtendedRegexLexer): filenames = ['*.rb', '*.rbw', 'Rakefile', '*.rake', '*.gemspec', '*.rbx', '*.duby', 'Gemfile', 'Vagrantfile'] mimetypes = ['text/x-ruby', 'application/x-ruby'] + version_added = '' flags = re.DOTALL | re.MULTILINE @@ -124,7 +125,7 @@ def intp_string_callback(self, match, ctx): ('backtick', String.Backtick, '`'): states['simple-'+name] = [ include('string-intp-escaped'), - (r'[^\\%s#]+' % end, ttype), + (rf'[^\\{end}#]+', ttype), (r'[\\#]', ttype), (end, ttype, '#pop'), ] @@ -399,6 +400,8 @@ class RubyConsoleLexer(Lexer): name = 'Ruby irb session' aliases = ['rbcon', 'irb'] mimetypes = ['text/x-ruby-shellsession'] + url = 'https://www.ruby-lang.org' + version_added = '' _example = 'rbcon/console' _prompt_re = re.compile(r'irb\([a-zA-Z_]\w*\):\d{3}:\d+[>*"\'] ' @@ -436,14 +439,13 @@ class FancyLexer(RegexLexer): Fancy is a self-hosted, pure object-oriented, dynamic, class-based, concurrent general-purpose programming language running on Rubinius, the Ruby VM. - - .. versionadded:: 1.5 """ name = 'Fancy' url = 'https://github.com/bakkdoor/fancy' filenames = ['*.fy', '*.fancypack'] aliases = ['fancy', 'fy'] mimetypes = ['text/x-fancysrc'] + version_added = '1.5' tokens = { # copied from PerlLexer: diff --git a/libs/pygments/lexers/rust.py b/libs/pygments/lexers/rust.py index db68bb346..04e15c8c7 100644 --- a/libs/pygments/lexers/rust.py +++ b/libs/pygments/lexers/rust.py @@ -4,7 +4,7 @@ Lexers for the Rust language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class RustLexer(RegexLexer): """ Lexer for the Rust programming language (version 1.47). - - .. versionadded:: 1.6 """ name = 'Rust' url = 'https://www.rust-lang.org/' filenames = ['*.rs', '*.rs.in'] aliases = ['rust', 'rs'] mimetypes = ['text/rust', 'text/x-rust'] + version_added = '1.6' keyword_types = (words(( 'u8', 'u16', 'u32', 'u64', 'u128', 'i8', 'i16', 'i32', 'i64', 'i128', @@ -99,16 +98,16 @@ class RustLexer(RegexLexer): (r'let\b', Keyword.Declaration), (r'fn\b', Keyword, 'funcname'), (r'(struct|enum|type|union)\b', Keyword, 'typename'), - (r'(default)(\s+)(type|fn)\b', bygroups(Keyword, Text, Keyword)), + (r'(default)(\s+)(type|fn)\b', bygroups(Keyword, Whitespace, Keyword)), keyword_types, (r'[sS]elf\b', Name.Builtin.Pseudo), # Prelude (taken from Rust's src/libstd/prelude.rs) builtin_funcs_types, builtin_macros, # Path separators, so types don't catch them. - (r'::\b', Text), + (r'::\b', Punctuation), # Types in positions. - (r'(?::|->)', Text, 'typename'), + (r'(?::|->)', Punctuation, 'typename'), # Labels (r'(break|continue)(\b\s*)(\'[A-Za-z_]\w*)?', bygroups(Keyword, Text.Whitespace, Name.Label)), @@ -157,7 +156,7 @@ class RustLexer(RegexLexer): # Misc # Lone hashes: not used in Rust syntax, but allowed in macro # arguments, most famously for quote::quote!() - (r'#', Text), + (r'#', Punctuation), ], 'comment': [ (r'[^*/]+', Comment.Multiline), @@ -172,17 +171,17 @@ class RustLexer(RegexLexer): (r'[*/]', String.Doc), ], 'modname': [ - (r'\s+', Text), + (r'\s+', Whitespace), (r'[a-zA-Z_]\w*', Name.Namespace, '#pop'), default('#pop'), ], 'funcname': [ - (r'\s+', Text), + (r'\s+', Whitespace), (r'[a-zA-Z_]\w*', Name.Function, '#pop'), default('#pop'), ], 'typename': [ - (r'\s+', Text), + (r'\s+', Whitespace), (r'&', Keyword.Pseudo), (r"'", Operator, 'lifetime'), builtin_funcs_types, diff --git a/libs/pygments/lexers/sas.py b/libs/pygments/lexers/sas.py index c34066b02..c3039090e 100644 --- a/libs/pygments/lexers/sas.py +++ b/libs/pygments/lexers/sas.py @@ -4,7 +4,7 @@ Lexer for SAS. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,8 +19,6 @@ class SASLexer(RegexLexer): """ For SAS files. - - .. versionadded:: 2.2 """ # Syntax from syntax/sas.vim by James Kidd <james.kidd@covance.com> @@ -28,6 +26,8 @@ class SASLexer(RegexLexer): aliases = ['sas'] filenames = ['*.SAS', '*.sas'] mimetypes = ['text/x-sas', 'text/sas', 'application/x-sas'] + url = 'https://en.wikipedia.org/wiki/SAS_(software)' + version_added = '2.2' flags = re.IGNORECASE | re.MULTILINE builtins_macros = ( diff --git a/libs/pygments/lexers/savi.py b/libs/pygments/lexers/savi.py index 48927f3ab..f65818f37 100644 --- a/libs/pygments/lexers/savi.py +++ b/libs/pygments/lexers/savi.py @@ -4,7 +4,7 @@ Lexer for Savi. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -30,141 +30,142 @@ # (rouge, vscode, etc) so that all of the lexers can be kept cleanly in sync. class SaviLexer(RegexLexer): - """ - For Savi source code. + """ + For Savi source code. - .. versionadded: 2.10 - """ + .. versionadded: 2.10 + """ - name = 'Savi' - url = 'https://github.com/savi-lang/savi' - aliases = ['savi'] - filenames = ['*.savi'] + name = 'Savi' + url = 'https://github.com/savi-lang/savi' + aliases = ['savi'] + filenames = ['*.savi'] + version_added = '' - tokens = { - "root": [ - # Line Comment - (r'//.*?$', Comment.Single), + tokens = { + "root": [ + # Line Comment + (r'//.*?$', Comment.Single), - # Doc Comment - (r'::.*?$', Comment.Single), + # Doc Comment + (r'::.*?$', Comment.Single), - # Capability Operator - (r'(\')(\w+)(?=[^\'])', bygroups(Operator, Name)), + # Capability Operator + (r'(\')(\w+)(?=[^\'])', bygroups(Operator, Name)), - # Double-Quote String - (r'\w?"', String.Double, "string.double"), + # Double-Quote String + (r'\w?"', String.Double, "string.double"), - # Single-Char String - (r"'", String.Char, "string.char"), + # Single-Char String + (r"'", String.Char, "string.char"), - # Type Name - (r'(_?[A-Z]\w*)', Name.Class), + # Type Name + (r'(_?[A-Z]\w*)', Name.Class), + + # Nested Type Name + (r'(\.)(\s*)(_?[A-Z]\w*)', bygroups(Punctuation, Whitespace, Name.Class)), - # Nested Type Name - (r'(\.)(\s*)(_?[A-Z]\w*)', bygroups(Punctuation, Whitespace, Name.Class)), - - # Declare - (r'^([ \t]*)(:\w+)', - bygroups(Whitespace, Name.Tag), - "decl"), - - # Error-Raising Calls/Names - (r'((\w+|\+|\-|\*)\!)', Generic.Deleted), - - # Numeric Values - (r'\b\d([\d_]*(\.[\d_]+)?)\b', Number), - - # Hex Numeric Values - (r'\b0x([0-9a-fA-F_]+)\b', Number.Hex), - - # Binary Numeric Values - (r'\b0b([01_]+)\b', Number.Bin), - - # Function Call (with braces) - (r'\w+(?=\()', Name.Function), - - # Function Call (with receiver) - (r'(\.)(\s*)(\w+)', bygroups(Punctuation, Whitespace, Name.Function)), - - # Function Call (with self receiver) - (r'(@)(\w+)', bygroups(Punctuation, Name.Function)), - - # Parenthesis - (r'\(', Punctuation, "root"), - (r'\)', Punctuation, "#pop"), - - # Brace - (r'\{', Punctuation, "root"), - (r'\}', Punctuation, "#pop"), - - # Bracket - (r'\[', Punctuation, "root"), - (r'(\])(\!)', bygroups(Punctuation, Generic.Deleted), "#pop"), - (r'\]', Punctuation, "#pop"), - - # Punctuation - (r'[,;:\.@]', Punctuation), - - # Piping Operators - (r'(\|\>)', Operator), - - # Branching Operators - (r'(\&\&|\|\||\?\?|\&\?|\|\?|\.\?)', Operator), - - # Comparison Operators - (r'(\<\=\>|\=\~|\=\=|\<\=|\>\=|\<|\>)', Operator), - - # Arithmetic Operators - (r'(\+|\-|\/|\*|\%)', Operator), - - # Assignment Operators - (r'(\=)', Operator), - - # Other Operators - (r'(\!|\<\<|\<|\&|\|)', Operator), - - # Identifiers - (r'\b\w+\b', Name), - - # Whitespace - (r'[ \t\r]+\n*|\n+', Whitespace), - ], - - # Declare (nested rules) - "decl": [ - (r'\b[a-z_]\w*\b(?!\!)', Keyword.Declaration), - (r':', Punctuation, "#pop"), - (r'\n', Whitespace, "#pop"), - include("root"), - ], - - # Double-Quote String (nested rules) - "string.double": [ - (r'\\\(', String.Interpol, "string.interpolation"), - (r'\\u[0-9a-fA-F]{4}', String.Escape), - (r'\\x[0-9a-fA-F]{2}', String.Escape), - (r'\\[bfnrt\\\']', String.Escape), - (r'\\"', String.Escape), - (r'"', String.Double, "#pop"), - (r'[^\\"]+', String.Double), - (r'.', Error), - ], - - # Single-Char String (nested rules) - "string.char": [ - (r'\\u[0-9a-fA-F]{4}', String.Escape), - (r'\\x[0-9a-fA-F]{2}', String.Escape), - (r'\\[bfnrt\\\']', String.Escape), - (r"\\'", String.Escape), - (r"'", String.Char, "#pop"), - (r"[^\\']+", String.Char), - (r'.', Error), - ], - - # Interpolation inside String (nested rules) - "string.interpolation": [ - (r"\)", String.Interpol, "#pop"), - include("root"), - ] - } + # Declare + (r'^([ \t]*)(:\w+)', + bygroups(Whitespace, Name.Tag), + "decl"), + + # Error-Raising Calls/Names + (r'((\w+|\+|\-|\*)\!)', Generic.Deleted), + + # Numeric Values + (r'\b\d([\d_]*(\.[\d_]+)?)\b', Number), + + # Hex Numeric Values + (r'\b0x([0-9a-fA-F_]+)\b', Number.Hex), + + # Binary Numeric Values + (r'\b0b([01_]+)\b', Number.Bin), + + # Function Call (with braces) + (r'\w+(?=\()', Name.Function), + + # Function Call (with receiver) + (r'(\.)(\s*)(\w+)', bygroups(Punctuation, Whitespace, Name.Function)), + + # Function Call (with self receiver) + (r'(@)(\w+)', bygroups(Punctuation, Name.Function)), + + # Parenthesis + (r'\(', Punctuation, "root"), + (r'\)', Punctuation, "#pop"), + + # Brace + (r'\{', Punctuation, "root"), + (r'\}', Punctuation, "#pop"), + + # Bracket + (r'\[', Punctuation, "root"), + (r'(\])(\!)', bygroups(Punctuation, Generic.Deleted), "#pop"), + (r'\]', Punctuation, "#pop"), + + # Punctuation + (r'[,;:\.@]', Punctuation), + + # Piping Operators + (r'(\|\>)', Operator), + + # Branching Operators + (r'(\&\&|\|\||\?\?|\&\?|\|\?|\.\?)', Operator), + + # Comparison Operators + (r'(\<\=\>|\=\~|\=\=|\<\=|\>\=|\<|\>)', Operator), + + # Arithmetic Operators + (r'(\+|\-|\/|\*|\%)', Operator), + + # Assignment Operators + (r'(\=)', Operator), + + # Other Operators + (r'(\!|\<\<|\<|\&|\|)', Operator), + + # Identifiers + (r'\b\w+\b', Name), + + # Whitespace + (r'[ \t\r]+\n*|\n+', Whitespace), + ], + + # Declare (nested rules) + "decl": [ + (r'\b[a-z_]\w*\b(?!\!)', Keyword.Declaration), + (r':', Punctuation, "#pop"), + (r'\n', Whitespace, "#pop"), + include("root"), + ], + + # Double-Quote String (nested rules) + "string.double": [ + (r'\\\(', String.Interpol, "string.interpolation"), + (r'\\u[0-9a-fA-F]{4}', String.Escape), + (r'\\x[0-9a-fA-F]{2}', String.Escape), + (r'\\[bfnrt\\\']', String.Escape), + (r'\\"', String.Escape), + (r'"', String.Double, "#pop"), + (r'[^\\"]+', String.Double), + (r'.', Error), + ], + + # Single-Char String (nested rules) + "string.char": [ + (r'\\u[0-9a-fA-F]{4}', String.Escape), + (r'\\x[0-9a-fA-F]{2}', String.Escape), + (r'\\[bfnrt\\\']', String.Escape), + (r"\\'", String.Escape), + (r"'", String.Char, "#pop"), + (r"[^\\']+", String.Char), + (r'.', Error), + ], + + # Interpolation inside String (nested rules) + "string.interpolation": [ + (r"\)", String.Interpol, "#pop"), + include("root"), + ] + } diff --git a/libs/pygments/lexers/scdoc.py b/libs/pygments/lexers/scdoc.py index 90478acf6..fecdd9c92 100644 --- a/libs/pygments/lexers/scdoc.py +++ b/libs/pygments/lexers/scdoc.py @@ -4,7 +4,7 @@ Lexer for scdoc, a simple man page generator. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,13 +19,12 @@ class ScdocLexer(RegexLexer): """ `scdoc` is a simple man page generator for POSIX systems written in C99. - - .. versionadded:: 2.5 """ name = 'scdoc' url = 'https://git.sr.ht/~sircmpwn/scdoc' aliases = ['scdoc', 'scd'] filenames = ['*.scd', '*.scdoc'] + version_added = '2.5' flags = re.MULTILINE tokens = { diff --git a/libs/pygments/lexers/scripting.py b/libs/pygments/lexers/scripting.py index eab7ec95c..d38387e07 100644 --- a/libs/pygments/lexers/scripting.py +++ b/libs/pygments/lexers/scripting.py @@ -4,7 +4,7 @@ Lexer for scripting and embedded languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -16,7 +16,7 @@ Number, Punctuation, Error, Whitespace, Other from pygments.util import get_bool_opt, get_list_opt -__all__ = ['LuaLexer', 'MoonScriptLexer', 'ChaiscriptLexer', 'LSLLexer', +__all__ = ['LuaLexer', 'LuauLexer', 'MoonScriptLexer', 'ChaiscriptLexer', 'LSLLexer', 'AppleScriptLexer', 'RexxLexer', 'MOOCodeLexer', 'HybrisLexer', 'EasytrieveLexer', 'JclLexer', 'MiniScriptLexer'] @@ -49,11 +49,12 @@ class LuaLexer(RegexLexer): aliases = ['lua'] filenames = ['*.lua', '*.wlua'] mimetypes = ['text/x-lua', 'application/x-lua'] + version_added = '' _comment_multiline = r'(?:--\[(?P<level>=*)\[[\w\W]*?\](?P=level)\])' _comment_single = r'(?:--.*$)' _space = r'(?:\s+)' - _s = r'(?:%s|%s|%s)' % (_comment_multiline, _comment_single, _space) + _s = rf'(?:{_comment_multiline}|{_comment_single}|{_space})' _name = r'(?:[^\W\d]\w*)' tokens = { @@ -101,7 +102,7 @@ class LuaLexer(RegexLexer): 'funcname': [ include('ws'), (r'[.:]', Punctuation), - (r'%s(?=%s*[.:])' % (_name, _s), Name.Class), + (rf'{_name}(?={_s}*[.:])', Name.Class), (_name, Name.Function, '#pop'), # inline function (r'\(', Punctuation, '#pop'), @@ -162,11 +163,324 @@ def get_tokens_unprocessed(self, text): continue yield index, token, value +def _luau_make_expression(should_pop, _s): + temp_list = [ + (r'0[xX][\da-fA-F_]*', Number.Hex, '#pop'), + (r'0[bB][\d_]*', Number.Bin, '#pop'), + (r'\.?\d[\d_]*(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?', Number.Float, '#pop'), + + (words(( + 'true', 'false', 'nil' + ), suffix=r'\b'), Keyword.Constant, '#pop'), + + (r'\[(=*)\[[.\n]*?\]\1\]', String, '#pop'), + + (r'(\.)([a-zA-Z_]\w*)(?=%s*[({"\'])', bygroups(Punctuation, Name.Function), '#pop'), + (r'(\.)([a-zA-Z_]\w*)', bygroups(Punctuation, Name.Variable), '#pop'), + + (rf'[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*(?={_s}*[({{"\'])', Name.Other, '#pop'), + (r'[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*', Name, '#pop'), + ] + if should_pop: + return temp_list + return [entry[:2] for entry in temp_list] + +def _luau_make_expression_special(should_pop): + temp_list = [ + (r'\{', Punctuation, ('#pop', 'closing_brace_base', 'expression')), + (r'\(', Punctuation, ('#pop', 'closing_parenthesis_base', 'expression')), + + (r'::?', Punctuation, ('#pop', 'type_end', 'type_start')), + + (r"'", String.Single, ('#pop', 'string_single')), + (r'"', String.Double, ('#pop', 'string_double')), + (r'`', String.Backtick, ('#pop', 'string_interpolated')), + ] + if should_pop: + return temp_list + return [(entry[0], entry[1], entry[2][1:]) for entry in temp_list] + +class LuauLexer(RegexLexer): + """ + For Luau source code. + + Additional options accepted: + + `include_luau_builtins` + If given and ``True``, automatically highlight Luau builtins + (default: ``True``). + `include_roblox_builtins` + If given and ``True``, automatically highlight Roblox-specific builtins + (default: ``False``). + `additional_builtins` + If given, must be a list of additional builtins to highlight. + `disabled_builtins` + If given, must be a list of builtins that will not be highlighted. + """ + + name = 'Luau' + url = 'https://luau-lang.org/' + aliases = ['luau'] + filenames = ['*.luau'] + version_added = '2.18' + + _comment_multiline = r'(?:--\[(?P<level>=*)\[[\w\W]*?\](?P=level)\])' + _comment_single = r'(?:--.*$)' + _s = r'(?:{}|{}|{})'.format(_comment_multiline, _comment_single, r'\s+') + + tokens = { + 'root': [ + (r'#!.*', Comment.Hashbang, 'base'), + default('base'), + ], + + 'ws': [ + (_comment_multiline, Comment.Multiline), + (_comment_single, Comment.Single), + (r'\s+', Whitespace), + ], + + 'base': [ + include('ws'), + + *_luau_make_expression_special(False), + (r'\.\.\.', Punctuation), + + (rf'type\b(?={_s}+[a-zA-Z_])', Keyword.Reserved, 'type_declaration'), + (rf'export\b(?={_s}+[a-zA-Z_])', Keyword.Reserved), + + (r'(?:\.\.|//|[+\-*\/%^<>=])=?', Operator, 'expression'), + (r'~=', Operator, 'expression'), + + (words(( + 'and', 'or', 'not' + ), suffix=r'\b'), Operator.Word, 'expression'), + + (words(( + 'elseif', 'for', 'if', 'in', 'repeat', 'return', 'until', + 'while'), suffix=r'\b'), Keyword.Reserved, 'expression'), + (r'local\b', Keyword.Declaration, 'expression'), + + (r'function\b', Keyword.Reserved, ('expression', 'func_name')), + + (r'[\])};]+', Punctuation), + + include('expression_static'), + *_luau_make_expression(False, _s), + + (r'[\[.,]', Punctuation, 'expression'), + ], + 'expression_static': [ + (words(( + 'break', 'continue', 'do', 'else', 'elseif', 'end', 'for', + 'if', 'in', 'repeat', 'return', 'then', 'until', 'while'), + suffix=r'\b'), Keyword.Reserved), + ], + 'expression': [ + include('ws'), + + (r'if\b', Keyword.Reserved, ('ternary', 'expression')), + + (r'local\b', Keyword.Declaration), + *_luau_make_expression_special(True), + (r'\.\.\.', Punctuation, '#pop'), + + (r'function\b', Keyword.Reserved, 'func_name'), + + include('expression_static'), + *_luau_make_expression(True, _s), + + default('#pop'), + ], + 'ternary': [ + include('ws'), + + (r'else\b', Keyword.Reserved, '#pop'), + (words(( + 'then', 'elseif', + ), suffix=r'\b'), Operator.Reserved, 'expression'), + + default('#pop'), + ], + + 'closing_brace_pop': [ + (r'\}', Punctuation, '#pop'), + ], + 'closing_parenthesis_pop': [ + (r'\)', Punctuation, '#pop'), + ], + 'closing_gt_pop': [ + (r'>', Punctuation, '#pop'), + ], + + 'closing_parenthesis_base': [ + include('closing_parenthesis_pop'), + include('base'), + ], + 'closing_parenthesis_type': [ + include('closing_parenthesis_pop'), + include('type'), + ], + 'closing_brace_base': [ + include('closing_brace_pop'), + include('base'), + ], + 'closing_brace_type': [ + include('closing_brace_pop'), + include('type'), + ], + 'closing_gt_type': [ + include('closing_gt_pop'), + include('type'), + ], + + 'string_escape': [ + (r'\\z\s*', String.Escape), + (r'\\(?:[abfnrtvz\\"\'`\{\n])|[\r\n]{1,2}|x[\da-fA-F]{2}|\d{1,3}|' + r'u\{\}[\da-fA-F]*\}', String.Escape), + ], + 'string_single': [ + include('string_escape'), + + (r"'", String.Single, "#pop"), + (r"[^\\']+", String.Single), + ], + 'string_double': [ + include('string_escape'), + + (r'"', String.Double, "#pop"), + (r'[^\\"]+', String.Double), + ], + 'string_interpolated': [ + include('string_escape'), + + (r'\{', Punctuation, ('closing_brace_base', 'expression')), + + (r'`', String.Backtick, "#pop"), + (r'[^\\`\{]+', String.Backtick), + ], + + 'func_name': [ + include('ws'), + + (r'[.:]', Punctuation), + (rf'[a-zA-Z_]\w*(?={_s}*[.:])', Name.Class), + (r'[a-zA-Z_]\w*', Name.Function), + + (r'<', Punctuation, 'closing_gt_type'), + + (r'\(', Punctuation, '#pop'), + ], + + 'type': [ + include('ws'), + + (r'\(', Punctuation, 'closing_parenthesis_type'), + (r'\{', Punctuation, 'closing_brace_type'), + (r'<', Punctuation, 'closing_gt_type'), + + (r"'", String.Single, 'string_single'), + (r'"', String.Double, 'string_double'), + + (r'[|&\.,\[\]:=]+', Punctuation), + (r'->', Punctuation), + + (r'typeof\(', Name.Builtin, ('closing_parenthesis_base', + 'expression')), + (r'[a-zA-Z_]\w*', Name.Class), + ], + 'type_start': [ + include('ws'), + + (r'\(', Punctuation, ('#pop', 'closing_parenthesis_type')), + (r'\{', Punctuation, ('#pop', 'closing_brace_type')), + (r'<', Punctuation, ('#pop', 'closing_gt_type')), + + (r"'", String.Single, ('#pop', 'string_single')), + (r'"', String.Double, ('#pop', 'string_double')), + + (r'typeof\(', Name.Builtin, ('#pop', 'closing_parenthesis_base', + 'expression')), + (r'[a-zA-Z_]\w*', Name.Class, '#pop'), + ], + 'type_end': [ + include('ws'), + + (r'[|&\.]', Punctuation, 'type_start'), + (r'->', Punctuation, 'type_start'), + + (r'<', Punctuation, 'closing_gt_type'), + + default('#pop'), + ], + 'type_declaration': [ + include('ws'), + + (r'[a-zA-Z_]\w*', Name.Class), + (r'<', Punctuation, 'closing_gt_type'), + + (r'=', Punctuation, ('#pop', 'type_end', 'type_start')), + ], + } + + def __init__(self, **options): + self.include_luau_builtins = get_bool_opt( + options, 'include_luau_builtins', True) + self.include_roblox_builtins = get_bool_opt( + options, 'include_roblox_builtins', False) + self.additional_builtins = get_list_opt(options, 'additional_builtins', []) + self.disabled_builtins = get_list_opt(options, 'disabled_builtins', []) + + self._builtins = set(self.additional_builtins) + if self.include_luau_builtins: + from pygments.lexers._luau_builtins import LUAU_BUILTINS + self._builtins.update(LUAU_BUILTINS) + if self.include_roblox_builtins: + from pygments.lexers._luau_builtins import ROBLOX_BUILTINS + self._builtins.update(ROBLOX_BUILTINS) + if self.additional_builtins: + self._builtins.update(self.additional_builtins) + self._builtins.difference_update(self.disabled_builtins) + + RegexLexer.__init__(self, **options) + + def get_tokens_unprocessed(self, text): + for index, token, value in \ + RegexLexer.get_tokens_unprocessed(self, text): + if token is Name or token is Name.Other: + split_value = value.split('.') + complete_value = [] + new_index = index + for position in range(len(split_value), 0, -1): + potential_string = '.'.join(split_value[:position]) + if potential_string in self._builtins: + yield index, Name.Builtin, potential_string + new_index += len(potential_string) + + if complete_value: + yield new_index, Punctuation, '.' + new_index += 1 + break + complete_value.insert(0, split_value[position - 1]) + + for position, substring in enumerate(complete_value): + if position + 1 == len(complete_value): + if token is Name: + yield new_index, Name.Variable, substring + continue + yield new_index, Name.Function, substring + continue + yield new_index, Name.Variable, substring + new_index += len(substring) + yield new_index, Punctuation, '.' + new_index += 1 + + continue + yield index, token, value + class MoonScriptLexer(LuaLexer): """ For MoonScript source code. - - .. versionadded:: 1.5 """ name = 'MoonScript' @@ -174,6 +488,7 @@ class MoonScriptLexer(LuaLexer): aliases = ['moonscript', 'moon'] filenames = ['*.moon'] mimetypes = ['text/x-moonscript', 'application/x-moonscript'] + version_added = '1.5' tokens = { 'root': [ @@ -234,8 +549,6 @@ def get_tokens_unprocessed(self, text): class ChaiscriptLexer(RegexLexer): """ For ChaiScript source code. - - .. versionadded:: 2.0 """ name = 'ChaiScript' @@ -243,6 +556,7 @@ class ChaiscriptLexer(RegexLexer): aliases = ['chaiscript', 'chai'] filenames = ['*.chai'] mimetypes = ['text/x-chaiscript', 'application/x-chaiscript'] + version_added = '2.0' flags = re.DOTALL | re.MULTILINE @@ -301,14 +615,14 @@ class ChaiscriptLexer(RegexLexer): class LSLLexer(RegexLexer): """ For Second Life's Linden Scripting Language source code. - - .. versionadded:: 2.0 """ name = 'LSL' aliases = ['lsl'] filenames = ['*.lsl'] mimetypes = ['text/x-lsl'] + url = 'https://wiki.secondlife.com/wiki/Linden_Scripting_Language' + version_added = '2.0' flags = re.MULTILINE @@ -389,14 +703,13 @@ class AppleScriptLexer(RegexLexer): <http://developer.apple.com/documentation/AppleScript/ Reference/StudioReference>`_. Contributed by Andreas Amann <aamann@mac.com>. - - .. versionadded:: 1.0 """ name = 'AppleScript' url = 'https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html' aliases = ['applescript'] filenames = ['*.applescript'] + version_added = '1.0' flags = re.MULTILINE | re.DOTALL @@ -672,26 +985,26 @@ class AppleScriptLexer(RegexLexer): r'numeric strings|punctuation|white space)', bygroups(Keyword, Name.Builtin)), (r'(-|\*|\+|&|≠|>=?|<=?|=|≥|≤|/|÷|\^)', Operator), - (r"\b(%s)\b" % '|'.join(Operators), Operator.Word), + (r"\b({})\b".format('|'.join(Operators)), Operator.Word), (r'^(\s*(?:on|end)\s+)' - r'(%s)' % '|'.join(StudioEvents[::-1]), + r'({})'.format('|'.join(StudioEvents[::-1])), bygroups(Keyword, Name.Function)), (r'^(\s*)(in|on|script|to)(\s+)', bygroups(Text, Keyword, Text)), - (r'\b(as )(%s)\b' % '|'.join(Classes), + (r'\b(as )({})\b'.format('|'.join(Classes)), bygroups(Keyword, Name.Class)), - (r'\b(%s)\b' % '|'.join(Literals), Name.Constant), - (r'\b(%s)\b' % '|'.join(Commands), Name.Builtin), - (r'\b(%s)\b' % '|'.join(Control), Keyword), - (r'\b(%s)\b' % '|'.join(Declarations), Keyword), - (r'\b(%s)\b' % '|'.join(Reserved), Name.Builtin), - (r'\b(%s)s?\b' % '|'.join(BuiltIn), Name.Builtin), - (r'\b(%s)\b' % '|'.join(HandlerParams), Name.Builtin), - (r'\b(%s)\b' % '|'.join(StudioProperties), Name.Attribute), - (r'\b(%s)s?\b' % '|'.join(StudioClasses), Name.Builtin), - (r'\b(%s)\b' % '|'.join(StudioCommands), Name.Builtin), - (r'\b(%s)\b' % '|'.join(References), Name.Builtin), + (r'\b({})\b'.format('|'.join(Literals)), Name.Constant), + (r'\b({})\b'.format('|'.join(Commands)), Name.Builtin), + (r'\b({})\b'.format('|'.join(Control)), Keyword), + (r'\b({})\b'.format('|'.join(Declarations)), Keyword), + (r'\b({})\b'.format('|'.join(Reserved)), Name.Builtin), + (r'\b({})s?\b'.format('|'.join(BuiltIn)), Name.Builtin), + (r'\b({})\b'.format('|'.join(HandlerParams)), Name.Builtin), + (r'\b({})\b'.format('|'.join(StudioProperties)), Name.Attribute), + (r'\b({})s?\b'.format('|'.join(StudioClasses)), Name.Builtin), + (r'\b({})\b'.format('|'.join(StudioCommands)), Name.Builtin), + (r'\b({})\b'.format('|'.join(References)), Name.Builtin), (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double), - (r'\b(%s)\b' % Identifiers, Name.Variable), + (rf'\b({Identifiers})\b', Name.Variable), (r'[-+]?(\d+\.\d*|\d*\.\d+)(E[-+][0-9]+)?', Number.Float), (r'[-+]?\d+', Number.Integer), ], @@ -710,14 +1023,13 @@ class RexxLexer(RegexLexer): a wide range of different platforms with its roots found on mainframe systems. It is popular for I/O- and data based tasks and can act as glue language to bind different applications together. - - .. versionadded:: 2.0 """ name = 'Rexx' url = 'http://www.rexxinfo.org/' aliases = ['rexx', 'arexx'] filenames = ['*.rexx', '*.rex', '*.rx', '*.arexx'] mimetypes = ['text/x-rexx'] + version_added = '2.0' flags = re.IGNORECASE tokens = { @@ -781,7 +1093,8 @@ class RexxLexer(RegexLexer): ] } - _c = lambda s: re.compile(s, re.MULTILINE) + def _c(s): + return re.compile(s, re.MULTILINE) _ADDRESS_COMMAND_PATTERN = _c(r'^\s*address\s+command\b') _ADDRESS_PATTERN = _c(r'^\s*address\s+') _DO_WHILE_PATTERN = _c(r'^\s*do\s+while\b') @@ -821,14 +1134,13 @@ def analyse_text(text): class MOOCodeLexer(RegexLexer): """ For MOOCode (the MOO scripting language). - - .. versionadded:: 0.9 """ name = 'MOOCode' url = 'http://www.moo.mud.org/' filenames = ['*.moo'] aliases = ['moocode', 'moo'] mimetypes = ['text/x-moocode'] + version_added = '0.9' tokens = { 'root': [ @@ -864,14 +1176,14 @@ class MOOCodeLexer(RegexLexer): class HybrisLexer(RegexLexer): """ For Hybris source code. - - .. versionadded:: 1.4 """ name = 'Hybris' - aliases = ['hybris', 'hy'] - filenames = ['*.hy', '*.hyb'] + aliases = ['hybris'] + filenames = ['*.hyb'] mimetypes = ['text/x-hybris', 'application/x-hybris'] + url = 'https://github.com/evilsocket/hybris' + version_added = '1.4' flags = re.MULTILINE | re.DOTALL @@ -962,13 +1274,13 @@ class EasytrieveLexer(RegexLexer): converting sequential data. Furthermore it can layout data for reports. It is mainly used on mainframe platforms and can access several of the mainframe's native file formats. It is somewhat comparable to awk. - - .. versionadded:: 2.1 """ name = 'Easytrieve' aliases = ['easytrieve'] filenames = ['*.ezt', '*.mac'] mimetypes = ['text/x-easytrieve'] + url = 'https://www.broadcom.com/products/mainframe/application-development/easytrieve-report-generator' + version_added = '2.1' flags = 0 # Note: We cannot use r'\b' at the start and end of keywords because @@ -1154,13 +1466,14 @@ class JclLexer(RegexLexer): is a scripting language used on mainframe platforms to instruct the system on how to run a batch job or start a subsystem. It is somewhat comparable to MS DOS batch and Unix shell scripts. - - .. versionadded:: 2.1 """ name = 'JCL' aliases = ['jcl'] filenames = ['*.jcl'] mimetypes = ['text/x-jcl'] + url = 'https://en.wikipedia.org/wiki/Job_Control_Language' + version_added = '2.1' + flags = re.IGNORECASE tokens = { @@ -1234,8 +1547,6 @@ def analyse_text(text): class MiniScriptLexer(RegexLexer): """ For MiniScript source code. - - .. versionadded:: 2.6 """ name = 'MiniScript' @@ -1243,6 +1554,7 @@ class MiniScriptLexer(RegexLexer): aliases = ['miniscript', 'ms'] filenames = ['*.ms'] mimetypes = ['text/x-minicript', 'application/x-miniscript'] + version_added = '2.6' tokens = { 'root': [ diff --git a/libs/pygments/lexers/sgf.py b/libs/pygments/lexers/sgf.py index 0fad263e0..21861e4a2 100644 --- a/libs/pygments/lexers/sgf.py +++ b/libs/pygments/lexers/sgf.py @@ -4,7 +4,7 @@ Lexer for Smart Game Format (sgf) file format. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,13 +20,12 @@ class SmartGameFormatLexer(RegexLexer): The format is used to store game records of board games for two players (mainly Go game). - - .. versionadded:: 2.4 """ name = 'SmartGameFormat' url = 'https://www.red-bean.com/sgf/' aliases = ['sgf'] filenames = ['*.sgf'] + version_added = '2.4' tokens = { 'root': [ diff --git a/libs/pygments/lexers/shell.py b/libs/pygments/lexers/shell.py index eabf4ec94..cfab8591c 100644 --- a/libs/pygments/lexers/shell.py +++ b/libs/pygments/lexers/shell.py @@ -4,7 +4,7 @@ Lexers for various shells. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -25,18 +25,18 @@ class BashLexer(RegexLexer): """ Lexer for (ba|k|z|)sh shell scripts. - - .. versionadded:: 0.6 """ name = 'Bash' - aliases = ['bash', 'sh', 'ksh', 'zsh', 'shell'] + aliases = ['bash', 'sh', 'ksh', 'zsh', 'shell', 'openrc'] filenames = ['*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', '.kshrc', 'kshrc', 'PKGBUILD'] mimetypes = ['application/x-sh', 'application/x-shellscript', 'text/x-shellscript'] + url = 'https://en.wikipedia.org/wiki/Unix_shell' + version_added = '0.6' tokens = { 'root': [ @@ -129,14 +129,13 @@ def analyse_text(text): class SlurmBashLexer(BashLexer): """ Lexer for (ba|k|z|)sh Slurm scripts. - - .. versionadded:: 2.4 """ name = 'Slurm' aliases = ['slurm', 'sbatch'] filenames = ['*.sl'] mimetypes = [] + version_added = '2.4' EXTRA_KEYWORDS = {'srun'} def get_tokens_unprocessed(self, text): @@ -225,14 +224,14 @@ class BashSessionLexer(ShellSessionBaseLexer): """ Lexer for Bash shell sessions, i.e. command lines, including a prompt, interspersed with output. - - .. versionadded:: 1.1 """ name = 'Bash Session' aliases = ['console', 'shell-session'] filenames = ['*.sh-session', '*.shell-session'] mimetypes = ['application/x-shell-session', 'application/x-sh-session'] + url = 'https://en.wikipedia.org/wiki/Unix_shell' + version_added = '1.1' _innerLexerCls = BashLexer _ps1rgx = re.compile( @@ -244,13 +243,13 @@ class BashSessionLexer(ShellSessionBaseLexer): class BatchLexer(RegexLexer): """ Lexer for the DOS/Windows Batch file format. - - .. versionadded:: 0.7 """ name = 'Batchfile' aliases = ['batch', 'bat', 'dosbatch', 'winbatch'] filenames = ['*.bat', '*.cmd'] mimetypes = ['application/x-dos-batch'] + url = 'https://en.wikipedia.org/wiki/Batch_file' + version_added = '0.7' flags = re.MULTILINE | re.IGNORECASE @@ -258,28 +257,25 @@ class BatchLexer(RegexLexer): _punct = r'&<>|' _ws = r'\t\v\f\r ,;=\xa0' _nlws = r'\s\x1a\xa0,;=' - _space = r'(?:(?:(?:\^[%s])?[%s])+)' % (_nl, _ws) - _keyword_terminator = (r'(?=(?:\^[%s]?)?[%s+./:[\\\]]|[%s%s(])' % - (_nl, _ws, _nl, _punct)) - _token_terminator = r'(?=\^?[%s]|[%s%s])' % (_ws, _punct, _nl) - _start_label = r'((?:(?<=^[^:])|^[^:]?)[%s]*)(:)' % _ws - _label = r'(?:(?:[^%s%s+:^]|\^[%s]?[\w\W])*)' % (_nlws, _punct, _nl) - _label_compound = r'(?:(?:[^%s%s+:^)]|\^[%s]?[^)])*)' % (_nlws, _punct, _nl) - _number = r'(?:-?(?:0[0-7]+|0x[\da-f]+|\d+)%s)' % _token_terminator + _space = rf'(?:(?:(?:\^[{_nl}])?[{_ws}])+)' + _keyword_terminator = (rf'(?=(?:\^[{_nl}]?)?[{_ws}+./:[\\\]]|[{_nl}{_punct}(])') + _token_terminator = rf'(?=\^?[{_ws}]|[{_punct}{_nl}])' + _start_label = rf'((?:(?<=^[^:])|^[^:]?)[{_ws}]*)(:)' + _label = rf'(?:(?:[^{_nlws}{_punct}+:^]|\^[{_nl}]?[\w\W])*)' + _label_compound = rf'(?:(?:[^{_nlws}{_punct}+:^)]|\^[{_nl}]?[^)])*)' + _number = rf'(?:-?(?:0[0-7]+|0x[\da-f]+|\d+){_token_terminator})' _opword = r'(?:equ|geq|gtr|leq|lss|neq)' - _string = r'(?:"[^%s"]*(?:"|(?=[%s])))' % (_nl, _nl) - _variable = (r'(?:(?:%%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|' - r'[^%%:%s]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%%%s^]|' - r'\^[^%%%s])[^=%s]*=(?:[^%%%s^]|\^[^%%%s])*)?)?%%))|' - r'(?:\^?![^!:%s]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:' - r'[^!%s^]|\^[^!%s])[^=%s]*=(?:[^!%s^]|\^[^!%s])*)?)?\^?!))' % - (_nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl, _nl)) - _core_token = r'(?:(?:(?:\^[%s]?)?[^"%s%s])+)' % (_nl, _nlws, _punct) - _core_token_compound = r'(?:(?:(?:\^[%s]?)?[^"%s%s)])+)' % (_nl, _nlws, _punct) - _token = r'(?:[%s]+|%s)' % (_punct, _core_token) - _token_compound = r'(?:[%s]+|%s)' % (_punct, _core_token_compound) - _stoken = (r'(?:[%s]+|(?:%s|%s|%s)+)' % - (_punct, _string, _variable, _core_token)) + _string = rf'(?:"[^{_nl}"]*(?:"|(?=[{_nl}])))' + _variable = (r'(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|' + rf'[^%:{_nl}]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%{_nl}^]|' + rf'\^[^%{_nl}])[^={_nl}]*=(?:[^%{_nl}^]|\^[^%{_nl}])*)?)?%))|' + rf'(?:\^?![^!:{_nl}]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:' + rf'[^!{_nl}^]|\^[^!{_nl}])[^={_nl}]*=(?:[^!{_nl}^]|\^[^!{_nl}])*)?)?\^?!))') + _core_token = rf'(?:(?:(?:\^[{_nl}]?)?[^"{_nlws}{_punct}])+)' + _core_token_compound = rf'(?:(?:(?:\^[{_nl}]?)?[^"{_nlws}{_punct})])+)' + _token = rf'(?:[{_punct}]+|{_core_token})' + _token_compound = rf'(?:[{_punct}]+|{_core_token_compound})' + _stoken = (rf'(?:[{_punct}]+|(?:{_string}|{_variable}|{_core_token})+)') def _make_begin_state(compound, _core_token=_core_token, _core_token_compound=_core_token_compound, @@ -288,81 +284,71 @@ def _make_begin_state(compound, _core_token=_core_token, _space=_space, _start_label=_start_label, _stoken=_stoken, _token_terminator=_token_terminator, _variable=_variable, _ws=_ws): - rest = '(?:%s|%s|[^"%%%s%s%s])*' % (_string, _variable, _nl, _punct, + rest = '(?:{}|{}|[^"%{}{}{}])*'.format(_string, _variable, _nl, _punct, ')' if compound else '') - rest_of_line = r'(?:(?:[^%s^]|\^[%s]?[\w\W])*)' % (_nl, _nl) - rest_of_line_compound = r'(?:(?:[^%s^)]|\^[%s]?[^)])*)' % (_nl, _nl) - set_space = r'((?:(?:\^[%s]?)?[^\S\n])*)' % _nl + rest_of_line = rf'(?:(?:[^{_nl}^]|\^[{_nl}]?[\w\W])*)' + rest_of_line_compound = rf'(?:(?:[^{_nl}^)]|\^[{_nl}]?[^)])*)' + set_space = rf'((?:(?:\^[{_nl}]?)?[^\S\n])*)' suffix = '' if compound: - _keyword_terminator = r'(?:(?=\))|%s)' % _keyword_terminator - _token_terminator = r'(?:(?=\))|%s)' % _token_terminator + _keyword_terminator = rf'(?:(?=\))|{_keyword_terminator})' + _token_terminator = rf'(?:(?=\))|{_token_terminator})' suffix = '/compound' return [ ((r'\)', Punctuation, '#pop') if compound else - (r'\)((?=\()|%s)%s' % (_token_terminator, rest_of_line), + (rf'\)((?=\()|{_token_terminator}){rest_of_line}', Comment.Single)), - (r'(?=%s)' % _start_label, Text, 'follow%s' % suffix), + (rf'(?={_start_label})', Text, f'follow{suffix}'), (_space, using(this, state='text')), - include('redirect%s' % suffix), - (r'[%s]+' % _nl, Text), + include(f'redirect{suffix}'), + (rf'[{_nl}]+', Text), (r'\(', Punctuation, 'root/compound'), (r'@+', Punctuation), - (r'((?:for|if|rem)(?:(?=(?:\^[%s]?)?/)|(?:(?!\^)|' - r'(?<=m))(?:(?=\()|%s)))(%s?%s?(?:\^[%s]?)?/(?:\^[%s]?)?\?)' % - (_nl, _token_terminator, _space, - _core_token_compound if compound else _core_token, _nl, _nl), + (rf'((?:for|if|rem)(?:(?=(?:\^[{_nl}]?)?/)|(?:(?!\^)|' + rf'(?<=m))(?:(?=\()|{_token_terminator})))({_space}?{_core_token_compound if compound else _core_token}?(?:\^[{_nl}]?)?/(?:\^[{_nl}]?)?\?)', bygroups(Keyword, using(this, state='text')), - 'follow%s' % suffix), - (r'(goto%s)(%s(?:\^[%s]?)?/(?:\^[%s]?)?\?%s)' % - (_keyword_terminator, rest, _nl, _nl, rest), + f'follow{suffix}'), + (rf'(goto{_keyword_terminator})({rest}(?:\^[{_nl}]?)?/(?:\^[{_nl}]?)?\?{rest})', bygroups(Keyword, using(this, state='text')), - 'follow%s' % suffix), + f'follow{suffix}'), (words(('assoc', 'break', 'cd', 'chdir', 'cls', 'color', 'copy', 'date', 'del', 'dir', 'dpath', 'echo', 'endlocal', 'erase', 'exit', 'ftype', 'keys', 'md', 'mkdir', 'mklink', 'move', 'path', 'pause', 'popd', 'prompt', 'pushd', 'rd', 'ren', 'rename', 'rmdir', 'setlocal', 'shift', 'start', 'time', 'title', 'type', 'ver', 'verify', 'vol'), - suffix=_keyword_terminator), Keyword, 'follow%s' % suffix), - (r'(call)(%s?)(:)' % _space, + suffix=_keyword_terminator), Keyword, f'follow{suffix}'), + (rf'(call)({_space}?)(:)', bygroups(Keyword, using(this, state='text'), Punctuation), - 'call%s' % suffix), - (r'call%s' % _keyword_terminator, Keyword), - (r'(for%s(?!\^))(%s)(/f%s)' % - (_token_terminator, _space, _token_terminator), + f'call{suffix}'), + (rf'call{_keyword_terminator}', Keyword), + (rf'(for{_token_terminator}(?!\^))({_space})(/f{_token_terminator})', bygroups(Keyword, using(this, state='text'), Keyword), ('for/f', 'for')), - (r'(for%s(?!\^))(%s)(/l%s)' % - (_token_terminator, _space, _token_terminator), + (rf'(for{_token_terminator}(?!\^))({_space})(/l{_token_terminator})', bygroups(Keyword, using(this, state='text'), Keyword), ('for/l', 'for')), - (r'for%s(?!\^)' % _token_terminator, Keyword, ('for2', 'for')), - (r'(goto%s)(%s?)(:?)' % (_keyword_terminator, _space), + (rf'for{_token_terminator}(?!\^)', Keyword, ('for2', 'for')), + (rf'(goto{_keyword_terminator})({_space}?)(:?)', bygroups(Keyword, using(this, state='text'), Punctuation), - 'label%s' % suffix), - (r'(if(?:(?=\()|%s)(?!\^))(%s?)((?:/i%s)?)(%s?)((?:not%s)?)(%s?)' % - (_token_terminator, _space, _token_terminator, _space, - _token_terminator, _space), + f'label{suffix}'), + (rf'(if(?:(?=\()|{_token_terminator})(?!\^))({_space}?)((?:/i{_token_terminator})?)({_space}?)((?:not{_token_terminator})?)({_space}?)', bygroups(Keyword, using(this, state='text'), Keyword, using(this, state='text'), Keyword, using(this, state='text')), ('(?', 'if')), - (r'rem(((?=\()|%s)%s?%s?.*|%s%s)' % - (_token_terminator, _space, _stoken, _keyword_terminator, - rest_of_line_compound if compound else rest_of_line), - Comment.Single, 'follow%s' % suffix), - (r'(set%s)%s(/a)' % (_keyword_terminator, set_space), + (rf'rem(((?=\()|{_token_terminator}){_space}?{_stoken}?.*|{_keyword_terminator}{rest_of_line_compound if compound else rest_of_line})', + Comment.Single, f'follow{suffix}'), + (rf'(set{_keyword_terminator}){set_space}(/a)', bygroups(Keyword, using(this, state='text'), Keyword), - 'arithmetic%s' % suffix), - (r'(set%s)%s((?:/p)?)%s((?:(?:(?:\^[%s]?)?[^"%s%s^=%s]|' - r'\^[%s]?[^"=])+)?)((?:(?:\^[%s]?)?=)?)' % - (_keyword_terminator, set_space, set_space, _nl, _nl, _punct, + f'arithmetic{suffix}'), + (r'(set{}){}((?:/p)?){}((?:(?:(?:\^[{}]?)?[^"{}{}^={}]|' + r'\^[{}]?[^"=])+)?)((?:(?:\^[{}]?)?=)?)'.format(_keyword_terminator, set_space, set_space, _nl, _nl, _punct, ')' if compound else '', _nl, _nl), bygroups(Keyword, using(this, state='text'), Keyword, using(this, state='text'), using(this, state='variable'), Punctuation), - 'follow%s' % suffix), - default('follow%s' % suffix) + f'follow{suffix}'), + default(f'follow{suffix}') ] def _make_follow_state(compound, _label=_label, @@ -375,11 +361,10 @@ def _make_follow_state(compound, _label=_label, if compound: state.append((r'(?=\))', Text, '#pop')) state += [ - (r'%s([%s]*)(%s)(.*)' % - (_start_label, _ws, _label_compound if compound else _label), + (rf'{_start_label}([{_ws}]*)({_label_compound if compound else _label})(.*)', bygroups(Text, Punctuation, Text, Name.Label, Comment.Single)), - include('redirect%s' % suffix), - (r'(?=[%s])' % _nl, Text, '#pop'), + include(f'redirect{suffix}'), + (rf'(?=[{_nl}])', Text, '#pop'), (r'\|\|?|&&?', Punctuation, '#pop'), include('text') ] @@ -397,9 +382,8 @@ def _make_arithmetic_state(compound, _nl=_nl, _punct=_punct, (r'0x[\da-f]+', Number.Hex), (r'\d+', Number.Integer), (r'[(),]+', Punctuation), - (r'([%s]|%%|\^\^)+' % op, Operator), - (r'(%s|%s|(\^[%s]?)?[^()%s%%\^"%s%s]|\^[%s]?%s)+' % - (_string, _variable, _nl, op, _nlws, _punct, _nlws, + (rf'([{op}]|%|\^\^)+', Operator), + (r'({}|{}|(\^[{}]?)?[^(){}%\^"{}{}]|\^[{}]?{})+'.format(_string, _variable, _nl, op, _nlws, _punct, _nlws, r'[^)]' if compound else r'[\w\W]'), using(this, state='variable')), (r'(?=[\x00|&])', Text, '#pop'), @@ -422,8 +406,7 @@ def _make_label_state(compound, _label=_label, state = [] if compound: state.append((r'(?=\))', Text, '#pop')) - state.append((r'(%s?)((?:%s|%s|\^[%s]?%s|[^"%%^%s%s%s])*)' % - (_label_compound if compound else _label, _string, + state.append((r'({}?)((?:{}|{}|\^[{}]?{}|[^"%^{}{}{}])*)'.format(_label_compound if compound else _label, _string, _variable, _nl, r'[^)]' if compound else r'[\w\W]', _nl, _punct, r')' if compound else ''), bygroups(Name.Label, Comment.Single), '#pop')) @@ -434,14 +417,11 @@ def _make_redirect_state(compound, _nl=_nl, _punct=_punct, _stoken=_stoken, _string=_string, _space=_space, _variable=_variable, _nlws=_nlws): - stoken_compound = (r'(?:[%s]+|(?:%s|%s|%s)+)' % - (_punct, _string, _variable, _core_token_compound)) + stoken_compound = (rf'(?:[{_punct}]+|(?:{_string}|{_variable}|{_core_token_compound})+)') return [ - (r'((?:(?<=[%s])\d)?)(>>?&|<&)([%s]*)(\d)' % - (_nlws, _nlws), + (rf'((?:(?<=[{_nlws}])\d)?)(>>?&|<&)([{_nlws}]*)(\d)', bygroups(Number.Integer, Punctuation, Text, Number.Integer)), - (r'((?:(?<=[%s])(?<!\^[%s])\d)?)(>>?|<)(%s?%s)' % - (_nlws, _nl, _space, stoken_compound if compound else _stoken), + (rf'((?:(?<=[{_nlws}])(?<!\^[{_nl}])\d)?)(>>?|<)({_space}?{stoken_compound if compound else _stoken})', bygroups(Number.Integer, Punctuation, using(this, state='text'))) ] @@ -460,13 +440,13 @@ def _make_redirect_state(compound, 'redirect/compound': _make_redirect_state(True), 'variable-or-escape': [ (_variable, Name.Variable), - (r'%%%%|\^[%s]?(\^!|[\w\W])' % _nl, String.Escape) + (rf'%%|\^[{_nl}]?(\^!|[\w\W])', String.Escape) ], 'string': [ (r'"', String.Double, '#pop'), (_variable, Name.Variable), (r'\^!|%%', String.Escape), - (r'[^"%%^%s]+|[%%^]' % _nl, String.Double), + (rf'[^"%^{_nl}]+|[%^]', String.Double), default('#pop') ], 'sqstring': [ @@ -480,34 +460,34 @@ def _make_redirect_state(compound, 'text': [ (r'"', String.Double, 'string'), include('variable-or-escape'), - (r'[^"%%^%s%s\d)]+|.' % (_nlws, _punct), Text) + (rf'[^"%^{_nlws}{_punct}\d)]+|.', Text) ], 'variable': [ (r'"', String.Double, 'string'), include('variable-or-escape'), - (r'[^"%%^%s]+|.' % _nl, Name.Variable) + (rf'[^"%^{_nl}]+|.', Name.Variable) ], 'for': [ - (r'(%s)(in)(%s)(\()' % (_space, _space), + (rf'({_space})(in)({_space})(\()', bygroups(using(this, state='text'), Keyword, using(this, state='text'), Punctuation), '#pop'), include('follow') ], 'for2': [ (r'\)', Punctuation), - (r'(%s)(do%s)' % (_space, _token_terminator), + (rf'({_space})(do{_token_terminator})', bygroups(using(this, state='text'), Keyword), '#pop'), - (r'[%s]+' % _nl, Text), + (rf'[{_nl}]+', Text), include('follow') ], 'for/f': [ - (r'(")((?:%s|[^"])*?")([%s]*)(\))' % (_variable, _nlws), + (rf'(")((?:{_variable}|[^"])*?")([{_nlws}]*)(\))', bygroups(String.Double, using(this, state='string'), Text, Punctuation)), (r'"', String.Double, ('#pop', 'for2', 'string')), - (r"('(?:%%%%|%s|[\w\W])*?')([%s]*)(\))" % (_variable, _nlws), + (rf"('(?:%%|{_variable}|[\w\W])*?')([{_nlws}]*)(\))", bygroups(using(this, state='sqstring'), Text, Punctuation)), - (r'(`(?:%%%%|%s|[\w\W])*?`)([%s]*)(\))' % (_variable, _nlws), + (rf'(`(?:%%|{_variable}|[\w\W])*?`)([{_nlws}]*)(\))', bygroups(using(this, state='bqstring'), Text, Punctuation)), include('for2') ], @@ -516,25 +496,24 @@ def _make_redirect_state(compound, include('for2') ], 'if': [ - (r'((?:cmdextversion|errorlevel)%s)(%s)(\d+)' % - (_token_terminator, _space), + (rf'((?:cmdextversion|errorlevel){_token_terminator})({_space})(\d+)', bygroups(Keyword, using(this, state='text'), Number.Integer), '#pop'), - (r'(defined%s)(%s)(%s)' % (_token_terminator, _space, _stoken), + (rf'(defined{_token_terminator})({_space})({_stoken})', bygroups(Keyword, using(this, state='text'), using(this, state='variable')), '#pop'), - (r'(exist%s)(%s%s)' % (_token_terminator, _space, _stoken), + (rf'(exist{_token_terminator})({_space}{_stoken})', bygroups(Keyword, using(this, state='text')), '#pop'), - (r'(%s%s)(%s)(%s%s)' % (_number, _space, _opword, _space, _number), + (rf'({_number}{_space})({_opword})({_space}{_number})', bygroups(using(this, state='arithmetic'), Operator.Word, using(this, state='arithmetic')), '#pop'), (_stoken, using(this, state='text'), ('#pop', 'if2')), ], 'if2': [ - (r'(%s?)(==)(%s?%s)' % (_space, _space, _stoken), + (rf'({_space}?)(==)({_space}?{_stoken})', bygroups(using(this, state='text'), Operator, using(this, state='text')), '#pop'), - (r'(%s)(%s)(%s%s)' % (_space, _opword, _space, _stoken), + (rf'({_space})({_opword})({_space}{_stoken})', bygroups(using(this, state='text'), Operator.Word, using(this, state='text')), '#pop') ], @@ -545,7 +524,7 @@ def _make_redirect_state(compound, ], 'else?': [ (_space, using(this, state='text')), - (r'else%s' % _token_terminator, Keyword, '#pop'), + (rf'else{_token_terminator}', Keyword, '#pop'), default('#pop') ] } @@ -555,14 +534,14 @@ class MSDOSSessionLexer(ShellSessionBaseLexer): """ Lexer for MS DOS shell sessions, i.e. command lines, including a prompt, interspersed with output. - - .. versionadded:: 2.1 """ name = 'MSDOS Session' aliases = ['doscon'] filenames = [] mimetypes = [] + url = 'https://en.wikipedia.org/wiki/MS-DOS' + version_added = '2.1' _innerLexerCls = BatchLexer _ps1rgx = re.compile(r'^([^>]*>)(.*\n?)') @@ -572,14 +551,14 @@ class MSDOSSessionLexer(ShellSessionBaseLexer): class TcshLexer(RegexLexer): """ Lexer for tcsh scripts. - - .. versionadded:: 0.10 """ name = 'Tcsh' aliases = ['tcsh', 'csh'] filenames = ['*.tcsh', '*.csh'] mimetypes = ['application/x-csh'] + url = 'https://www.tcsh.org' + version_added = '0.10' tokens = { 'root': [ @@ -641,14 +620,14 @@ class TcshSessionLexer(ShellSessionBaseLexer): """ Lexer for Tcsh sessions, i.e. command lines, including a prompt, interspersed with output. - - .. versionadded:: 2.1 """ name = 'Tcsh Session' aliases = ['tcshcon'] filenames = [] mimetypes = [] + url = 'https://www.tcsh.org' + version_added = '2.1' _innerLexerCls = TcshLexer _ps1rgx = re.compile(r'^([^>]+>)(.*\n?)') @@ -658,13 +637,13 @@ class TcshSessionLexer(ShellSessionBaseLexer): class PowerShellLexer(RegexLexer): """ For Windows PowerShell code. - - .. versionadded:: 1.5 """ name = 'PowerShell' aliases = ['powershell', 'pwsh', 'posh', 'ps1', 'psm1'] filenames = ['*.ps1', '*.psm1'] mimetypes = ['text/x-powershell'] + url = 'https://learn.microsoft.com/en-us/powershell' + version_added = '1.5' flags = re.DOTALL | re.IGNORECASE | re.MULTILINE @@ -721,7 +700,7 @@ class PowerShellLexer(RegexLexer): # of '$(...)' blocks in strings (r'\(', Punctuation, 'child'), (r'\s+', Text), - (r'^(\s*#[#\s]*)(\.(?:%s))([^\n]*$)' % '|'.join(commenthelp), + (r'^(\s*#[#\s]*)(\.(?:{}))([^\n]*$)'.format('|'.join(commenthelp)), bygroups(Comment, String.Doc, Comment)), (r'#[^\n]*?$', Comment), (r'(<|<)#', Comment.Multiline, 'multline'), @@ -733,10 +712,10 @@ class PowerShellLexer(RegexLexer): (r"'([^']|'')*'", String.Single), (r'(\$|@@|@)((global|script|private|env):)?\w+', Name.Variable), - (r'(%s)\b' % '|'.join(keywords), Keyword), - (r'-(%s)\b' % '|'.join(operators), Operator), - (r'(%s)-[a-z_]\w*\b' % '|'.join(verbs), Name.Builtin), - (r'(%s)\s' % '|'.join(aliases_), Name.Builtin), + (r'({})\b'.format('|'.join(keywords)), Keyword), + (r'-({})\b'.format('|'.join(operators)), Operator), + (r'({})-[a-z_]\w*\b'.format('|'.join(verbs)), Name.Builtin), + (r'({})\s'.format('|'.join(aliases_)), Name.Builtin), (r'\[[a-z_\[][\w. `,\[\]]*\]', Name.Constant), # .net [type]s (r'-[a-z_]\w*', Name), (r'\w+', Name), @@ -749,7 +728,7 @@ class PowerShellLexer(RegexLexer): 'multline': [ (r'[^#&.]+', Comment.Multiline), (r'#(>|>)', Comment.Multiline, '#pop'), - (r'\.(%s)' % '|'.join(commenthelp), String.Doc), + (r'\.({})'.format('|'.join(commenthelp)), String.Doc), (r'[#&.]', Comment.Multiline), ], 'string': [ @@ -773,14 +752,14 @@ class PowerShellSessionLexer(ShellSessionBaseLexer): """ Lexer for PowerShell sessions, i.e. command lines, including a prompt, interspersed with output. - - .. versionadded:: 2.1 """ name = 'PowerShell Session' aliases = ['pwsh-session', 'ps1con'] filenames = [] mimetypes = [] + url = 'https://learn.microsoft.com/en-us/powershell' + version_added = '2.1' _innerLexerCls = PowerShellLexer _bare_continuation = True @@ -791,14 +770,14 @@ class PowerShellSessionLexer(ShellSessionBaseLexer): class FishShellLexer(RegexLexer): """ Lexer for Fish shell scripts. - - .. versionadded:: 2.1 """ name = 'Fish' aliases = ['fish', 'fishshell'] filenames = ['*.fish', '*.load'] mimetypes = ['application/x-fish'] + url = 'https://fishshell.com' + version_added = '2.1' tokens = { 'root': [ @@ -862,15 +841,14 @@ class FishShellLexer(RegexLexer): class ExeclineLexer(RegexLexer): """ - Lexer for Laurent Bercot's execline language - (https://skarnet.org/software/execline). - - .. versionadded:: 2.7 + Lexer for Laurent Bercot's execline language. """ name = 'execline' aliases = ['execline'] filenames = ['*.exec'] + url = 'https://skarnet.org/software/execline' + version_added = '2.7' tokens = { 'root': [ diff --git a/libs/pygments/lexers/sieve.py b/libs/pygments/lexers/sieve.py index 8287b07e5..19d9d549d 100644 --- a/libs/pygments/lexers/sieve.py +++ b/libs/pygments/lexers/sieve.py @@ -13,7 +13,7 @@ https://tools.ietf.org/html/rfc5429 https://tools.ietf.org/html/rfc8580 - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -27,12 +27,12 @@ class SieveLexer(RegexLexer): """ Lexer for sieve format. - - .. versionadded:: 2.6 """ name = 'Sieve' filenames = ['*.siv', '*.sieve'] aliases = ['sieve'] + url = 'https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language)' + version_added = '2.6' tokens = { 'root': [ diff --git a/libs/pygments/lexers/slash.py b/libs/pygments/lexers/slash.py index cce47ce87..5ff20592e 100644 --- a/libs/pygments/lexers/slash.py +++ b/libs/pygments/lexers/slash.py @@ -2,10 +2,9 @@ pygments.lexers.slash ~~~~~~~~~~~~~~~~~~~~~ - Lexer for the `Slash <https://github.com/arturadib/Slash-A>`_ programming - language. + Lexer for the Slash programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -171,13 +170,13 @@ def right_angle_bracket(lexer, match, ctx): class SlashLexer(DelegatingLexer): """ Lexer for the Slash programming language. - - .. versionadded:: 2.4 """ name = 'Slash' aliases = ['slash'] filenames = ['*.sla'] + url = 'https://github.com/arturadib/Slash-A' + version_added = '2.4' def __init__(self, **options): from pygments.lexers.web import HtmlLexer diff --git a/libs/pygments/lexers/smalltalk.py b/libs/pygments/lexers/smalltalk.py index 58d870e54..df46aa2b9 100644 --- a/libs/pygments/lexers/smalltalk.py +++ b/libs/pygments/lexers/smalltalk.py @@ -4,7 +4,7 @@ Lexers for Smalltalk and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,13 @@ class SmalltalkLexer(RegexLexer): For Smalltalk syntax. Contributed by Stefan Matthias Aust. Rewritten by Nils Winter. - - .. versionadded:: 0.10 """ name = 'Smalltalk' url = 'http://www.smalltalk.org/' filenames = ['*.st'] aliases = ['smalltalk', 'squeak', 'st'] mimetypes = ['text/x-smalltalk'] + version_added = '0.10' tokens = { 'root': [ @@ -140,14 +139,13 @@ class SmalltalkLexer(RegexLexer): class NewspeakLexer(RegexLexer): """ For Newspeak syntax. - - .. versionadded:: 1.1 """ name = 'Newspeak' url = 'http://newspeaklanguage.org/' filenames = ['*.ns2'] aliases = ['newspeak', ] mimetypes = ['text/x-newspeak'] + version_added = '1.1' tokens = { 'root': [ diff --git a/libs/pygments/lexers/smithy.py b/libs/pygments/lexers/smithy.py index 3f48bfa45..3835258ab 100644 --- a/libs/pygments/lexers/smithy.py +++ b/libs/pygments/lexers/smithy.py @@ -4,7 +4,7 @@ Lexers for the Smithy IDL. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,13 +18,12 @@ class SmithyLexer(RegexLexer): """ For Smithy IDL - - .. versionadded:: 2.10 """ name = 'Smithy' url = 'https://awslabs.github.io/smithy/' filenames = ['*.smithy'] aliases = ['smithy'] + version_added = '2.10' unquoted = r'[A-Za-z0-9_\.#$-]+' identifier = r"[A-Za-z0-9_\.#$-]+" diff --git a/libs/pygments/lexers/smv.py b/libs/pygments/lexers/smv.py index 2584086e2..5bccf22d3 100644 --- a/libs/pygments/lexers/smv.py +++ b/libs/pygments/lexers/smv.py @@ -4,7 +4,7 @@ Lexers for the SMV languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,14 @@ class NuSMVLexer(RegexLexer): """ Lexer for the NuSMV language. - - .. versionadded:: 2.2 """ name = 'NuSMV' aliases = ['nusmv'] filenames = ['*.smv'] mimetypes = [] + url = 'https://nusmv.fbk.eu' + version_added = '2.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/snobol.py b/libs/pygments/lexers/snobol.py index 28087de24..c8c1d03d2 100644 --- a/libs/pygments/lexers/snobol.py +++ b/libs/pygments/lexers/snobol.py @@ -4,7 +4,7 @@ Lexers for the SNOBOL language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,14 +21,14 @@ class SnobolLexer(RegexLexer): Recognizes the common ASCII equivalents of the original SNOBOL4 operators. Does not require spaces around binary operators. - - .. versionadded:: 1.5 """ name = "Snobol" aliases = ["snobol"] filenames = ['*.snobol'] mimetypes = ['text/x-snobol'] + url = 'https://www.regressive.org/snobol4' + version_added = '1.5' tokens = { # root state, start of line diff --git a/libs/pygments/lexers/solidity.py b/libs/pygments/lexers/solidity.py index f1654e46f..b3ad9241d 100644 --- a/libs/pygments/lexers/solidity.py +++ b/libs/pygments/lexers/solidity.py @@ -4,7 +4,7 @@ Lexers for Solidity. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,14 @@ class SolidityLexer(RegexLexer): """ For Solidity source code. - - .. versionadded:: 2.5 """ name = 'Solidity' aliases = ['solidity'] filenames = ['*.sol'] mimetypes = [] + url = 'https://soliditylang.org' + version_added = '2.5' datatype = ( r'\b(address|bool|(?:(?:bytes|hash|int|string|uint)(?:8|16|24|32|40|48|56|64' diff --git a/libs/pygments/lexers/soong.py b/libs/pygments/lexers/soong.py new file mode 100644 index 000000000..b47d87fb3 --- /dev/null +++ b/libs/pygments/lexers/soong.py @@ -0,0 +1,78 @@ +""" + pygments.lexers.soong + ~~~~~~~~~~~~~~~~~~~~~ + + Lexers for Soong (Android.bp Blueprint) files. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, bygroups, include +from pygments.token import Comment, Name, Number, Operator, Punctuation, \ + String, Whitespace + +__all__ = ['SoongLexer'] + +class SoongLexer(RegexLexer): + name = 'Soong' + version_added = '2.18' + url = 'https://source.android.com/docs/setup/reference/androidbp' + aliases = ['androidbp', 'bp', 'soong'] + filenames = ['Android.bp'] + + tokens = { + 'root': [ + # A variable assignment + (r'(\w*)(\s*)(\+?=)(\s*)', + bygroups(Name.Variable, Whitespace, Operator, Whitespace), + 'assign-rhs'), + + # A top-level module + (r'(\w*)(\s*)(\{)', + bygroups(Name.Function, Whitespace, Punctuation), + 'in-rule'), + + # Everything else + include('comments'), + (r'\s+', Whitespace), # newlines okay + ], + 'assign-rhs': [ + include('expr'), + (r'\n', Whitespace, '#pop'), + ], + 'in-list': [ + include('expr'), + include('comments'), + (r'\s+', Whitespace), # newlines okay in a list + (r',', Punctuation), + (r'\]', Punctuation, '#pop'), + ], + 'in-map': [ + # A map key + (r'(\w+)(:)(\s*)', bygroups(Name, Punctuation, Whitespace)), + + include('expr'), + include('comments'), + (r'\s+', Whitespace), # newlines okay in a map + (r',', Punctuation), + (r'\}', Punctuation, '#pop'), + ], + 'in-rule': [ + # Just re-use map syntax + include('in-map'), + ], + 'comments': [ + (r'//.*', Comment.Single), + (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline), + ], + 'expr': [ + (r'(true|false)\b', Name.Builtin), + (r'0x[0-9a-fA-F]+', Number.Hex), + (r'\d+', Number.Integer), + (r'".*?"', String), + (r'\{', Punctuation, 'in-map'), + (r'\[', Punctuation, 'in-list'), + (r'\w+', Name), + ], + } diff --git a/libs/pygments/lexers/sophia.py b/libs/pygments/lexers/sophia.py index fc4928c31..89dbee79e 100644 --- a/libs/pygments/lexers/sophia.py +++ b/libs/pygments/lexers/sophia.py @@ -6,7 +6,7 @@ Derived from pygments/lexers/reason.py. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,14 +19,14 @@ class SophiaLexer(RegexLexer): """ A Sophia lexer. - - .. versionadded:: 2.11 """ name = 'Sophia' aliases = ['sophia'] filenames = ['*.aes'] mimetypes = [] + url = 'https://docs.aeternity.com/aesophia' + version_added = '2.11' keywords = ( 'contract', 'include', 'let', 'switch', 'type', 'record', 'datatype', @@ -100,4 +100,3 @@ class SophiaLexer(RegexLexer): default('#pop'), ], } - diff --git a/libs/pygments/lexers/special.py b/libs/pygments/lexers/special.py index 45565ac0f..22ad1e6ce 100644 --- a/libs/pygments/lexers/special.py +++ b/libs/pygments/lexers/special.py @@ -4,7 +4,7 @@ Special lexers. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,9 @@ class TextLexer(Lexer): aliases = ['text'] filenames = ['*.txt'] mimetypes = ['text/plain'] + url = "" + version_added = '' + priority = 0.01 def get_tokens_unprocessed(self, text): @@ -38,11 +41,11 @@ def analyse_text(text): class OutputLexer(Lexer): """ Simple lexer that highlights everything as ``Token.Generic.Output``. - - .. versionadded:: 2.10 """ name = 'Text output' aliases = ['output'] + url = "" + version_added = '2.10' def get_tokens_unprocessed(self, text): yield 0, Generic.Output, text @@ -65,6 +68,8 @@ class RawTokenLexer(Lexer): aliases = [] filenames = [] mimetypes = ['application/x-pygments-tokens'] + url = 'https://pygments.org/docs/formatters/#RawTokenFormatter' + version_added = '' def __init__(self, **options): self.compress = get_choice_opt(options, 'compress', diff --git a/libs/pygments/lexers/spice.py b/libs/pygments/lexers/spice.py index 5c2d8f296..ec7cd9785 100644 --- a/libs/pygments/lexers/spice.py +++ b/libs/pygments/lexers/spice.py @@ -4,7 +4,7 @@ Lexers for the Spice programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class SpiceLexer(RegexLexer): """ For Spice source. - - .. versionadded:: 2.11 """ name = 'Spice' url = 'https://www.spicelang.com' filenames = ['*.spice'] aliases = ['spice', 'spicelang'] mimetypes = ['text/x-spice'] + version_added = '2.11' tokens = { 'root': [ @@ -39,12 +38,13 @@ class SpiceLexer(RegexLexer): # keywords (r'(import|as)\b', Keyword.Namespace), (r'(f|p|type|struct|interface|enum|alias|operator)\b', Keyword.Declaration), - (words(('if', 'else', 'for', 'foreach', 'do', 'while', 'break', - 'continue', 'return', 'assert', 'unsafe', 'ext'), suffix=r'\b'), Keyword), - (words(('const', 'signed', 'unsigned', 'inline', 'public', 'heap'), + (words(('if', 'else', 'switch', 'case', 'default', 'for', 'foreach', 'do', + 'while', 'break', 'continue', 'fallthrough', 'return', 'assert', + 'unsafe', 'ext'), suffix=r'\b'), Keyword), + (words(('const', 'signed', 'unsigned', 'inline', 'public', 'heap', 'compose'), suffix=r'\b'), Keyword.Pseudo), - (words(('new', 'switch', 'case', 'yield', 'stash', 'pick', 'sync', - 'class'), suffix=r'\b'), Keyword.Reserved), + (words(('new', 'yield', 'stash', 'pick', 'sync', 'class'), suffix=r'\b'), + Keyword.Reserved), (r'(true|false|nil)\b', Keyword.Constant), (words(('double', 'int', 'short', 'long', 'byte', 'char', 'string', 'bool', 'dyn'), suffix=r'\b'), Keyword.Type), diff --git a/libs/pygments/lexers/sql.py b/libs/pygments/lexers/sql.py index 2880841c3..31b45fbb7 100644 --- a/libs/pygments/lexers/sql.py +++ b/libs/pygments/lexers/sql.py @@ -36,7 +36,7 @@ The ``tests/examplefiles`` contains a few test files with data to be parsed by these lexers. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -154,13 +154,13 @@ def _get_lexer(self, lang): class PostgresLexer(PostgresBase, RegexLexer): """ Lexer for the PostgreSQL dialect of SQL. - - .. versionadded:: 1.5 """ name = 'PostgreSQL SQL dialect' aliases = ['postgresql', 'postgres'] mimetypes = ['text/x-postgresql'] + url = 'https://www.postgresql.org' + version_added = '1.5' flags = re.IGNORECASE tokens = { @@ -210,15 +210,16 @@ class PostgresLexer(PostgresBase, RegexLexer): class PlPgsqlLexer(PostgresBase, RegexLexer): """ Handle the extra syntax in Pl/pgSQL language. - - .. versionadded:: 1.5 """ name = 'PL/pgSQL' aliases = ['plpgsql'] mimetypes = ['text/x-plpgsql'] + url = 'https://www.postgresql.org/docs/current/plpgsql.html' + version_added = '1.5' flags = re.IGNORECASE - tokens = {k: l[:] for (k, l) in PostgresLexer.tokens.items()} + # FIXME: use inheritance + tokens = {name: state[:] for (name, state) in PostgresLexer.tokens.items()} # extend the keywords list for i, pattern in enumerate(tokens['root']): @@ -252,7 +253,7 @@ class PsqlRegexLexer(PostgresBase, RegexLexer): aliases = [] # not public flags = re.IGNORECASE - tokens = {k: l[:] for (k, l) in PostgresLexer.tokens.items()} + tokens = {name: state[:] for (name, state) in PostgresLexer.tokens.items()} tokens['root'].append( (r'\\[^\s]+', Keyword.Pseudo, 'psql-command')) @@ -302,13 +303,13 @@ def __next__(self): class PostgresConsoleLexer(Lexer): """ Lexer for psql sessions. - - .. versionadded:: 1.5 """ name = 'PostgreSQL console (psql)' aliases = ['psql', 'postgresql-console', 'postgres-console'] mimetypes = ['text/x-postgresql-psql'] + url = 'https://www.postgresql.org' + version_added = '1.5' def get_tokens_unprocessed(self, data): sql = PsqlRegexLexer(**self.options) @@ -374,14 +375,14 @@ def get_tokens_unprocessed(self, data): class PostgresExplainLexer(RegexLexer): """ Handle PostgreSQL EXPLAIN output - - .. versionadded:: 2.15 """ name = 'PostgreSQL EXPLAIN dialect' aliases = ['postgres-explain'] filenames = ['*.explain'] mimetypes = ['text/x-postgresql-explain'] + url = 'https://www.postgresql.org/docs/current/using-explain.html' + version_added = '2.15' tokens = { 'root': [ @@ -459,8 +460,8 @@ class PostgresExplainLexer(RegexLexer): # strings (r"'(''|[^'])*'", String.Single), # numbers - (r'\d+\.\d+', Number.Float), - (r'(\d+)', Number.Integer), + (r'-?\d+\.\d+', Number.Float), + (r'(-?\d+)', Number.Integer), # boolean (r'(true|false)', Name.Constant), @@ -567,6 +568,8 @@ class SqlLexer(RegexLexer): aliases = ['sql'] filenames = ['*.sql'] mimetypes = ['text/x-sql'] + url = 'https://en.wikipedia.org/wiki/SQL' + version_added = '' flags = re.IGNORECASE tokens = { @@ -701,6 +704,8 @@ class TransactSqlLexer(RegexLexer): aliases = ['tsql', 't-sql'] filenames = ['*.sql'] mimetypes = ['text/x-tsql'] + url = 'https://www.tsql.info' + version_added = '' flags = re.IGNORECASE @@ -785,6 +790,8 @@ class MySqlLexer(RegexLexer): name = 'MySQL' aliases = ['mysql'] mimetypes = ['text/x-mysql'] + url = 'https://www.mysql.com' + version_added = '' flags = re.IGNORECASE tokens = { @@ -959,14 +966,14 @@ def analyse_text(text): class SqliteConsoleLexer(Lexer): """ Lexer for example sessions using sqlite3. - - .. versionadded:: 0.11 """ name = 'sqlite3con' aliases = ['sqlite3'] filenames = ['*.sqlite3-console'] mimetypes = ['text/x-sqlite3-console'] + url = 'https://www.sqlite.org' + version_added = '0.11' def get_tokens_unprocessed(self, data): sql = SqlLexer(**self.options) @@ -1000,14 +1007,13 @@ def get_tokens_unprocessed(self, data): class RqlLexer(RegexLexer): """ Lexer for Relation Query Language. - - .. versionadded:: 2.0 """ name = 'RQL' url = 'http://www.logilab.org/project/rql' aliases = ['rql'] filenames = ['*.rql'] mimetypes = ['text/x-rql'] + version_added = '2.0' flags = re.IGNORECASE tokens = { diff --git a/libs/pygments/lexers/srcinfo.py b/libs/pygments/lexers/srcinfo.py index c4da88b10..abba0c3dc 100644 --- a/libs/pygments/lexers/srcinfo.py +++ b/libs/pygments/lexers/srcinfo.py @@ -7,7 +7,7 @@ The description of the format can be found in the wiki: https://wiki.archlinux.org/title/.SRCINFO - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -34,13 +34,13 @@ class SrcinfoLexer(RegexLexer): """Lexer for .SRCINFO files used by Arch Linux Packages. - - .. versionadded:: 2.11 """ name = 'Srcinfo' aliases = ['srcinfo'] filenames = ['.SRCINFO'] + url = 'https://wiki.archlinux.org/title/.SRCINFO' + version_added = '2.11' tokens = { 'root': [ diff --git a/libs/pygments/lexers/stata.py b/libs/pygments/lexers/stata.py index 917c99985..5fca5b743 100644 --- a/libs/pygments/lexers/stata.py +++ b/libs/pygments/lexers/stata.py @@ -4,7 +4,7 @@ Lexer for Stata - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,8 +21,6 @@ class StataLexer(RegexLexer): """ For Stata do files. - - .. versionadded:: 2.2 """ # Syntax based on # - http://fmwww.bc.edu/RePEc/bocode/s/synlightlist.ado @@ -31,6 +29,7 @@ class StataLexer(RegexLexer): name = 'Stata' url = 'http://www.stata.com/' + version_added = '2.2' aliases = ['stata', 'do'] filenames = ['*.do', '*.ado'] mimetypes = ['text/x-stata', 'text/stata', 'application/x-stata'] diff --git a/libs/pygments/lexers/supercollider.py b/libs/pygments/lexers/supercollider.py index ea7a17676..b4a719cfd 100644 --- a/libs/pygments/lexers/supercollider.py +++ b/libs/pygments/lexers/supercollider.py @@ -4,7 +4,7 @@ Lexer for SuperCollider - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,8 +20,6 @@ class SuperColliderLexer(RegexLexer): """ For SuperCollider source code. - - .. versionadded:: 2.1 """ name = 'SuperCollider' @@ -29,6 +27,7 @@ class SuperColliderLexer(RegexLexer): aliases = ['supercollider', 'sc'] filenames = ['*.sc', '*.scd'] mimetypes = ['application/supercollider', 'text/supercollider'] + version_added = '2.1' flags = re.DOTALL | re.MULTILINE tokens = { diff --git a/libs/pygments/lexers/tact.py b/libs/pygments/lexers/tact.py new file mode 100644 index 000000000..8ede906f2 --- /dev/null +++ b/libs/pygments/lexers/tact.py @@ -0,0 +1,303 @@ +""" + pygments.lexers.tact + ~~~~~~~~~~~~~~~~~~~~ + + Lexers for Tact. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, include, bygroups, words +from pygments.token import Comment, Operator, Keyword, Name, String, \ + Number, Whitespace, Punctuation + +__all__ = ['TactLexer'] + + +class TactLexer(RegexLexer): + """For Tact source code.""" + + name = 'Tact' + aliases = ['tact'] + filenames = ['*.tact'] + url = "https://tact-lang.org" + version_added = '2.18' + + tokens = { + 'root': [ + (r'\s+', Whitespace), + (r'[.;(),\[\]{}]', Punctuation), + (r'\?|!!', Operator), + include('comments'), + include('import-in'), + include('struct-in'), + include('contract-or-trait-in'), + include('annotation-in'), + include('fun-declaration-in'), + include('const-declaration-in'), + include('statements'), + ], + 'import-in': [ + (r'((?<=\.\.\.)|(?<![.$]))\b(import)\b(\s*)', bygroups(Punctuation, Keyword, Whitespace), 'import'), + ], + 'import': [ + (r';', Punctuation, '#pop'), + include('comments'), + include('string-in'), + (r'\s+', Whitespace), + ], + 'struct-in': [ + (r'((?<=\.\.\.)|(?<![.$]))\b(struct|message)\b', bygroups(Punctuation, Keyword), 'struct'), + ], + 'struct': [ + include('comments'), + include('struct-header'), + include('struct-body-in'), + (r'\s+', Whitespace), + ], + 'struct-header': [ + include('comments'), + (r'\b\w+', Name.Class), + (r'(\()((?:\b0[xX])[0-9a-fA-F][0-9a-fA-F_]*\b)(\))', bygroups(Punctuation, Number.Hex, Punctuation)), + (r'(\()((?:\b[0-9]+\b))(\))', bygroups(Punctuation, Number.Integer, Punctuation)), + ], + 'struct-body-in': [ + (r'\{', Punctuation, 'struct-body'), + ], + 'struct-body': [ + (r'\}', Punctuation, '#pop:2'), + include('comments'), + include('field-declaration-in'), + ], + 'contract-or-trait-in': [ + (r'((?<=\.\.\.)|(?<![.$]))\b(contract|trait)\b', Keyword, 'contract-or-trait'), + ], + 'contract-or-trait': [ + include('comments'), + (r'with', Keyword), + (r'\b\w+', Name.Class), + include('contract-or-trait-body-in'), + (r'\s+', Whitespace), + (r',', Punctuation), + ], + 'contract-or-trait-body-in': [ + (r'\{', Punctuation, 'contract-or-trait-body'), + ], + 'contract-or-trait-body': [ + (r'\}', Punctuation, '#pop:2'), + include('comments'), + include('init-declaration-in'), + include('receive-declaration-in'), + include('bounce-declaration-in'), + include('fun-declaration-in'), + include('const-declaration-in'), + include('field-declaration-in'), + (r'\s+', Whitespace), + ], + 'field-declaration-in': [ + (r'\b\w+', Name.Property, 'field-declaration'), + ], + 'field-declaration': [ + (r';', Punctuation, '#pop'), + include('comments'), + include('type-annotation-in'), + include('variable-init-in'), + ], + 'const-declaration-in': [ + (r'(?=\b(?:(?:get|native|extends|mutates|virtual|override|inline|abstract)\s*)*const\b)', Keyword, 'const-declaration'), + ], + 'const-declaration': [ + (r'(;)', Punctuation, '#pop'), + (r'const', Keyword), + (words(('get', 'native', 'extends', 'mutates', 'virtual', 'override', 'inline', 'abstract'), suffix=r'\b'), Keyword), + (r'\b\w+\b', Name.Constant), + include('comments'), + include('type-annotation-in'), + include('variable-init-in'), + (r'\s+', Whitespace), + ], + 'init-declaration-in': [ + (r'(init)', Keyword, 'init-declaration') + ], + 'init-declaration': [ + (r'(?<=\})', Punctuation, '#pop'), + include('comments'), + include('fun-arguments-in'), + include('block-declaration-in'), + (r'\s+', Whitespace), + ], + 'receive-declaration-in': [ + (r'(receive|exernal)', Keyword, 'receive-declaration') + ], + 'receive-declaration': [ + (r'(?<=\})', Punctuation, '#pop'), + include('comments'), + include('fun-arguments-in'), + include('block-declaration-in'), + ], + 'bounce-declaration-in': [ + (r'(bounced)', Keyword, 'bounce-declaration') + ], + 'bounce-declaration': [ + (r'(?<=\})', Punctuation, '#pop'), + include('comments'), + include('fun-arguments-in'), + include('block-declaration-in'), + ], + 'fun-declaration-in': [ + (r'(?=\b(?:(?:get|native|extends|mutates|virtual|override|inline|abstract)\s*)*fun\b)', Keyword, 'fun-declaration') + ], + 'fun-declaration': [ + (r'(?<=\}|\;)', Punctuation, '#pop'), + (r'fun', Keyword), + (r'\b(get|native|extends|mutates|virtual|override|inline|abstract)\b', Keyword), + (r'\b[\w]+', Name.Function), + include('fun-declaration-body'), + (r'[,;]', Punctuation), + ], + 'fun-declaration-body': [ + include('comments'), + include('fun-arguments-in'), + include('type-annotation-in'), + include('block-declaration-in'), + (r'\s+', Whitespace), + ], + 'fun-arguments-in': [ + (r'\(', Punctuation, 'fun-arguments'), + ], + 'fun-arguments': [ + (r'\)', Punctuation, '#pop'), + include('comments'), + include('string-in'), + include('type-annotation-in'), + (r'(self)|(\b[\w]+\b)', bygroups(Name.Variable.Instance, Name.Variable)), + (r',', Punctuation), + (r'\s+', Whitespace), + ], + 'block-declaration-in': [ + (r'\{', Punctuation, 'block-declaration') + ], + 'block-declaration': [ + (r'\}', Punctuation, '#pop'), + include('statements'), + ], + 'statements': [ + include('comments'), + include('block-declaration-in'), + include('expressions'), + ], + 'annotation-in': [ + (r'(@)(\w+)(\()', bygroups(Keyword.Pseudo, Keyword, Punctuation), 'annotation') + ], + 'annotation': [ + (r'\)', Punctuation, '#pop'), + include('annotation-argument'), + (r'\s+', Whitespace), + ], + 'annotation-argument': [ + (r'\w+', Name.Function.Magic), + ], + 'expressions': [ + include('comments'), + include('type-annotation-in'), + include('keywords'), + include('numeric'), + include('string-in'), + include('variable'), + include('function-call'), + include('struct-init-in'), + ], + 'struct-init-in': [ + (r'(\b\w+)(\s*)(\{)', bygroups(Name.Class, Whitespace, Punctuation), 'struct-init') + ], + 'struct-init': [ + (r'(\})', Punctuation, '#pop'), + include('comments'), + include('struct-property-in'), + (r'\s+', Whitespace), + (r',', Punctuation), + ], + 'struct-property-in': [ + (r'(\b[\w]+)(\s*)(:)', bygroups(Name.Property, Whitespace, Punctuation), 'struct-property') + ], + 'struct-property': [ + (r'(?=\}|\,)', Punctuation, '#pop'), + include('comments'), + include('expressions'), + (r'\s+', Whitespace), + ], + 'variable-init-in': [ + (r'(=)', Operator, 'variable-init') + ], + 'variable-init': [ + (r'(?=\}|\{|\,|\;)',Punctuation, '#pop'), + include('comments'), + include('expressions'), + (r'\s+', Whitespace), + ], + 'type-annotation-in': [ + (r'(:)(\s+)', bygroups(Punctuation, Whitespace), 'type-annotation') + ], + 'type-annotation': [ + (r'(?=\{|\;|\=|\,|\))', Punctuation, '#pop'), + include('comments'), + include('type-as-in'), + include('type-generic-in'), + (r'\?', Operator), + (r'\b\w+', Keyword.Type), + (r'\s+', Whitespace), + ], + 'type-generic-in': [ + (r'<', Punctuation, 'type-generic'), + ], + 'type-generic': [ + (r'>', Punctuation, '#pop'), + include('comments'), + include('type-as-in'), + (r'\b\w+', Keyword.Type), + (r'\s+', Whitespace), + (r',', Punctuation), + ], + 'type-as-in': [ + (r'\b(as)(\s+)', bygroups(Keyword, Whitespace), 'type-as'), + ], + 'type-as': [ + (r'(?=\{|\;|\=|\,|\)|\>)', Punctuation, '#pop'), + include('comments'), + (r'\b\w+', Keyword.Type), + (r'\s+', Whitespace), + ], + 'keywords': [ + (words(('if', 'else', 'while', 'do', 'until', 'repeat', 'return', 'extends', 'mutates', 'virtual', 'override', 'inline', 'native', 'let', 'const', 'fun', 'self', 'is', 'initOf', 'map', 'bounced', 'get', 'as'), prefix=r'\b', suffix=r'\b'), Keyword), + (r'(<=>|>=|<=|!=|==|\^>>|~>>|>>|<<|\/%|\^%|~%|\^\/|~\/|\+=|-=|\*=|\/=|~\/=|\^\/=|%=|\^%=|<<=|>>=|~>>=|\^>>=|&=|\|=|\^=|\^|=|~|\/|%|-|\*|\+|>|<|&|\||:|\?)', Operator), + (words(('true', 'false'), prefix=r'\b', suffix=r'\b'), Keyword.Constant), + ], + 'string-in': [ + (r'"', String, 'string'), + ], + 'string': [ + (r'"', String, '#pop'), + (r'\\.', String.Escape), + (r'[^\\"]+', String.Double), + ], + 'numeric': [ + (r'(?:\b0[xX])[0-9a-fA-F][0-9a-fA-F_]*\b', Number.Hex), + (r'(?:\b[0-9]+\b)', Number.Integer), + ], + 'comments': [ + (r'//.*', Comment.Single), + (r'/\*', Comment.Multiline, 'comments-multiline'), + ], + 'comments-multiline': [ + (r'\*/', Comment.Multiline, '#pop'), + (r'[^*]+', Comment.Multiline), + (r'[*]', Comment.Multiline), + ], + 'variable': [ + (r'\b\w+\b(?!\s*\()(?!\s*\{)', Name.Variable) + ], + 'function-call': [ + (r'\b\w+\b(?=\s*\()(?!\s*\{)', Name.Function) + ], + } diff --git a/libs/pygments/lexers/tal.py b/libs/pygments/lexers/tal.py index 170b781a9..86249b85d 100644 --- a/libs/pygments/lexers/tal.py +++ b/libs/pygments/lexers/tal.py @@ -6,7 +6,7 @@ .. versionadded:: 2.12 - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,15 +19,15 @@ class TalLexer(RegexLexer): """ - For `Uxntal <https://wiki.xxiivv.com/site/uxntal.html>`_ source code. - - .. versionadded:: 2.12 + For Uxntal source code. """ name = 'Tal' aliases = ['tal', 'uxntal'] filenames = ['*.tal'] mimetypes = ['text/x-uxntal'] + url = 'https://wiki.xxiivv.com/site/uxntal.html' + version_added = '2.12' instructions = [ 'BRK', 'LIT', 'INC', 'POP', 'DUP', 'NIP', 'SWP', 'OVR', 'ROT', diff --git a/libs/pygments/lexers/tcl.py b/libs/pygments/lexers/tcl.py index f444223aa..436438c17 100644 --- a/libs/pygments/lexers/tcl.py +++ b/libs/pygments/lexers/tcl.py @@ -4,7 +4,7 @@ Lexers for Tcl and related languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,8 +19,6 @@ class TclLexer(RegexLexer): """ For Tcl source code. - - .. versionadded:: 0.10 """ keyword_cmds_re = words(( @@ -48,6 +46,7 @@ class TclLexer(RegexLexer): aliases = ['tcl'] filenames = ['*.tcl', '*.rvt'] mimetypes = ['text/x-tcl', 'text/x-script.tcl', 'application/x-tcl'] + version_added = '0.10' def _gen_command_rules(keyword_cmds_re, builtin_cmds_re, context=""): return [ diff --git a/libs/pygments/lexers/teal.py b/libs/pygments/lexers/teal.py index e488e0931..1862fba24 100644 --- a/libs/pygments/lexers/teal.py +++ b/libs/pygments/lexers/teal.py @@ -4,7 +4,7 @@ Lexer for TEAL. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,13 +21,12 @@ class TealLexer(RegexLexer): For more information about the grammar, see: https://github.com/algorand/go-algorand/blob/master/data/transactions/logic/assembler.go - - .. versionadded:: 2.9 """ name = 'teal' url = 'https://developer.algorand.org/docs/reference/teal/specification/' aliases = ['teal'] filenames = ['*.teal'] + version_added = '2.9' keywords = words({ 'Sender', 'Fee', 'FirstValid', 'FirstValidTime', 'LastValid', 'Note', diff --git a/libs/pygments/lexers/templates.py b/libs/pygments/lexers/templates.py index 5f46a47a8..4084fbd50 100644 --- a/libs/pygments/lexers/templates.py +++ b/libs/pygments/lexers/templates.py @@ -4,7 +4,7 @@ Lexers for various template engines' markup. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -62,6 +62,7 @@ class ErbLexer(Lexer): url = 'https://github.com/ruby/erb' aliases = ['erb'] mimetypes = ['application/x-ruby-templating'] + version_added = '' _block_re = re.compile(r'(<%%|%%>|<%=|<%#|<%-|<%|-%>|%>|^%[^%].*?$)', re.M) @@ -156,6 +157,7 @@ class SmartyLexer(RegexLexer): aliases = ['smarty'] filenames = ['*.tpl'] mimetypes = ['application/x-smarty'] + version_added = '' flags = re.MULTILINE | re.DOTALL @@ -212,6 +214,7 @@ class VelocityLexer(RegexLexer): url = 'https://velocity.apache.org/' aliases = ['velocity'] filenames = ['*.vm', '*.fhtml'] + version_added = '' flags = re.MULTILINE | re.DOTALL @@ -292,8 +295,10 @@ class VelocityHtmlLexer(DelegatingLexer): name = 'HTML+Velocity' aliases = ['html+velocity'] + version_added = '' alias_filenames = ['*.html', '*.fhtml'] mimetypes = ['text/html+velocity'] + url = 'https://velocity.apache.org/' def __init__(self, **options): super().__init__(HtmlLexer, VelocityLexer, **options) @@ -308,8 +313,10 @@ class VelocityXmlLexer(DelegatingLexer): name = 'XML+Velocity' aliases = ['xml+velocity'] + version_added = '' alias_filenames = ['*.xml', '*.vm'] mimetypes = ['application/xml+velocity'] + url = 'https://velocity.apache.org/' def __init__(self, **options): super().__init__(XmlLexer, VelocityLexer, **options) @@ -323,8 +330,8 @@ def analyse_text(text): class DjangoLexer(RegexLexer): """ - Generic `django <http://www.djangoproject.com/documentation/templates/>`_ - and `jinja <https://jinja.pocoo.org/jinja/>`_ template lexer. + Generic `Django <https://www.djangoproject.com/documentation/templates/>`_ + and `Jinja <https://jinja.palletsprojects.com>`_ template lexer. It just highlights django/jinja code between the preprocessor directives, other data is left untouched by the lexer. @@ -333,6 +340,8 @@ class DjangoLexer(RegexLexer): name = 'Django/Jinja' aliases = ['django', 'jinja'] mimetypes = ['application/x-django-templating', 'application/x-jinja'] + url = 'https://www.djangoproject.com/documentation/templates' + version_added = '' flags = re.M | re.S @@ -408,8 +417,6 @@ class MyghtyLexer(RegexLexer): """ Generic myghty templates lexer. Code that isn't Myghty markup is yielded as `Token.Other`. - - .. versionadded:: 0.6 """ name = 'Myghty' @@ -417,6 +424,7 @@ class MyghtyLexer(RegexLexer): aliases = ['myghty'] filenames = ['*.myt', 'autodelegate'] mimetypes = ['application/x-myghty'] + version_added = '0.6' tokens = { 'root': [ @@ -455,13 +463,13 @@ class MyghtyHtmlLexer(DelegatingLexer): """ Subclass of the `MyghtyLexer` that highlights unlexed data with the `HtmlLexer`. - - .. versionadded:: 0.6 """ name = 'HTML+Myghty' aliases = ['html+myghty'] mimetypes = ['text/html+myghty'] + url = 'http://www.myghty.org/' + version_added = '0.6' def __init__(self, **options): super().__init__(HtmlLexer, MyghtyLexer, **options) @@ -471,13 +479,13 @@ class MyghtyXmlLexer(DelegatingLexer): """ Subclass of the `MyghtyLexer` that highlights unlexed data with the `XmlLexer`. - - .. versionadded:: 0.6 """ name = 'XML+Myghty' aliases = ['xml+myghty'] mimetypes = ['application/xml+myghty'] + url = 'http://www.myghty.org/' + version_added = '0.6' def __init__(self, **options): super().__init__(XmlLexer, MyghtyLexer, **options) @@ -487,8 +495,6 @@ class MyghtyJavascriptLexer(DelegatingLexer): """ Subclass of the `MyghtyLexer` that highlights unlexed data with the `JavascriptLexer`. - - .. versionadded:: 0.6 """ name = 'JavaScript+Myghty' @@ -496,6 +502,8 @@ class MyghtyJavascriptLexer(DelegatingLexer): mimetypes = ['application/x-javascript+myghty', 'text/x-javascript+myghty', 'text/javascript+mygthy'] + url = 'http://www.myghty.org/' + version_added = '0.6' def __init__(self, **options): super().__init__(JavascriptLexer, MyghtyLexer, **options) @@ -505,13 +513,13 @@ class MyghtyCssLexer(DelegatingLexer): """ Subclass of the `MyghtyLexer` that highlights unlexed data with the `CssLexer`. - - .. versionadded:: 0.6 """ name = 'CSS+Myghty' aliases = ['css+myghty'] mimetypes = ['text/css+myghty'] + url = 'http://www.myghty.org/' + version_added = '0.6' def __init__(self, **options): super().__init__(CssLexer, MyghtyLexer, **options) @@ -521,14 +529,13 @@ class MasonLexer(RegexLexer): """ Generic mason templates lexer. Stolen from Myghty lexer. Code that isn't Mason markup is HTML. - - .. versionadded:: 1.4 """ name = 'Mason' url = 'http://www.masonhq.com/' aliases = ['mason'] filenames = ['*.m', '*.mhtml', '*.mc', '*.mi', 'autohandler', 'dhandler'] mimetypes = ['application/x-mason'] + version_added = '1.4' tokens = { 'root': [ @@ -576,8 +583,6 @@ class MakoLexer(RegexLexer): """ Generic mako templates lexer. Code that isn't Mako markup is yielded as `Token.Other`. - - .. versionadded:: 0.7 """ name = 'Mako' @@ -585,6 +590,7 @@ class MakoLexer(RegexLexer): aliases = ['mako'] filenames = ['*.mao'] mimetypes = ['application/x-mako'] + version_added = '0.7' tokens = { 'root': [ @@ -643,13 +649,13 @@ class MakoHtmlLexer(DelegatingLexer): """ Subclass of the `MakoLexer` that highlights unlexed data with the `HtmlLexer`. - - .. versionadded:: 0.7 """ name = 'HTML+Mako' aliases = ['html+mako'] mimetypes = ['text/html+mako'] + url = 'http://www.makotemplates.org/' + version_added = '0.7' def __init__(self, **options): super().__init__(HtmlLexer, MakoLexer, **options) @@ -659,13 +665,13 @@ class MakoXmlLexer(DelegatingLexer): """ Subclass of the `MakoLexer` that highlights unlexed data with the `XmlLexer`. - - .. versionadded:: 0.7 """ name = 'XML+Mako' aliases = ['xml+mako'] mimetypes = ['application/xml+mako'] + url = 'http://www.makotemplates.org/' + version_added = '0.7' def __init__(self, **options): super().__init__(XmlLexer, MakoLexer, **options) @@ -675,8 +681,6 @@ class MakoJavascriptLexer(DelegatingLexer): """ Subclass of the `MakoLexer` that highlights unlexed data with the `JavascriptLexer`. - - .. versionadded:: 0.7 """ name = 'JavaScript+Mako' @@ -684,6 +688,8 @@ class MakoJavascriptLexer(DelegatingLexer): mimetypes = ['application/x-javascript+mako', 'text/x-javascript+mako', 'text/javascript+mako'] + url = 'http://www.makotemplates.org/' + version_added = '0.7' def __init__(self, **options): super().__init__(JavascriptLexer, MakoLexer, **options) @@ -693,13 +699,13 @@ class MakoCssLexer(DelegatingLexer): """ Subclass of the `MakoLexer` that highlights unlexed data with the `CssLexer`. - - .. versionadded:: 0.7 """ name = 'CSS+Mako' aliases = ['css+mako'] mimetypes = ['text/css+mako'] + url = 'http://www.makotemplates.org/' + version_added = '0.7' def __init__(self, **options): super().__init__(CssLexer, MakoLexer, **options) @@ -734,6 +740,7 @@ class CheetahLexer(RegexLexer): aliases = ['cheetah', 'spitfire'] filenames = ['*.tmpl', '*.spt'] mimetypes = ['application/x-cheetah', 'application/x-spitfire'] + version_added = '' tokens = { 'root': [ @@ -773,6 +780,8 @@ class CheetahHtmlLexer(DelegatingLexer): name = 'HTML+Cheetah' aliases = ['html+cheetah', 'html+spitfire', 'htmlcheetah'] mimetypes = ['text/html+cheetah', 'text/html+spitfire'] + url = 'http://www.cheetahtemplate.org/' + version_added = '' def __init__(self, **options): super().__init__(HtmlLexer, CheetahLexer, **options) @@ -787,6 +796,8 @@ class CheetahXmlLexer(DelegatingLexer): name = 'XML+Cheetah' aliases = ['xml+cheetah', 'xml+spitfire'] mimetypes = ['application/xml+cheetah', 'application/xml+spitfire'] + url = 'http://www.cheetahtemplate.org/' + version_added = '' def __init__(self, **options): super().__init__(XmlLexer, CheetahLexer, **options) @@ -807,6 +818,8 @@ class CheetahJavascriptLexer(DelegatingLexer): 'application/x-javascript+spitfire', 'text/x-javascript+spitfire', 'text/javascript+spitfire'] + url = 'http://www.cheetahtemplate.org/' + version_added = '' def __init__(self, **options): super().__init__(JavascriptLexer, CheetahLexer, **options) @@ -818,9 +831,10 @@ class GenshiTextLexer(RegexLexer): """ name = 'Genshi Text' - url = 'http://genshi.edgewall.org/' + url = 'https://genshi.edgewall.org/' aliases = ['genshitext'] mimetypes = ['application/x-genshi-text', 'text/x-genshi'] + version_added = '' tokens = { 'root': [ @@ -913,14 +927,16 @@ class GenshiMarkupLexer(RegexLexer): class HtmlGenshiLexer(DelegatingLexer): """ - A lexer that highlights `genshi <http://genshi.edgewall.org/>`_ and + A lexer that highlights `genshi <https://genshi.edgewall.org/>`_ and `kid <http://kid-templating.org/>`_ kid HTML templates. """ name = 'HTML+Genshi' aliases = ['html+genshi', 'html+kid'] + version_added = '' alias_filenames = ['*.html', '*.htm', '*.xhtml'] mimetypes = ['text/html+genshi'] + url = 'https://genshi.edgewall.org/' def __init__(self, **options): super().__init__(HtmlLexer, GenshiMarkupLexer, **options) @@ -936,15 +952,17 @@ def analyse_text(text): class GenshiLexer(DelegatingLexer): """ - A lexer that highlights `genshi <http://genshi.edgewall.org/>`_ and + A lexer that highlights `genshi <https://genshi.edgewall.org/>`_ and `kid <http://kid-templating.org/>`_ kid XML templates. """ name = 'Genshi' aliases = ['genshi', 'kid', 'xml+genshi', 'xml+kid'] filenames = ['*.kid'] + version_added = '' alias_filenames = ['*.xml'] mimetypes = ['application/x-genshi', 'application/x-kid'] + url = 'https://genshi.edgewall.org/' def __init__(self, **options): super().__init__(XmlLexer, GenshiMarkupLexer, **options) @@ -966,10 +984,12 @@ class JavascriptGenshiLexer(DelegatingLexer): name = 'JavaScript+Genshi Text' aliases = ['js+genshitext', 'js+genshi', 'javascript+genshitext', 'javascript+genshi'] + version_added = '' alias_filenames = ['*.js'] mimetypes = ['application/x-javascript+genshi', 'text/x-javascript+genshi', 'text/javascript+genshi'] + url = 'https://genshi.edgewall.org' def __init__(self, **options): super().__init__(JavascriptLexer, GenshiTextLexer, **options) @@ -985,8 +1005,10 @@ class CssGenshiLexer(DelegatingLexer): name = 'CSS+Genshi Text' aliases = ['css+genshitext', 'css+genshi'] + version_added = '' alias_filenames = ['*.css'] mimetypes = ['text/css+genshi'] + url = 'https://genshi.edgewall.org' def __init__(self, **options): super().__init__(CssLexer, GenshiTextLexer, **options) @@ -1006,8 +1028,11 @@ class RhtmlLexer(DelegatingLexer): name = 'RHTML' aliases = ['rhtml', 'html+erb', 'html+ruby'] filenames = ['*.rhtml'] + version_added = '' alias_filenames = ['*.html', '*.htm', '*.xhtml'] mimetypes = ['text/html+ruby'] + url = 'https://github.com/ruby/erb' + def __init__(self, **options): super().__init__(HtmlLexer, ErbLexer, **options) @@ -1028,8 +1053,10 @@ class XmlErbLexer(DelegatingLexer): name = 'XML+Ruby' aliases = ['xml+ruby', 'xml+erb'] + version_added = '' alias_filenames = ['*.xml'] mimetypes = ['application/xml+ruby'] + url = 'https://github.com/ruby/erb' def __init__(self, **options): super().__init__(XmlLexer, ErbLexer, **options) @@ -1048,8 +1075,10 @@ class CssErbLexer(DelegatingLexer): name = 'CSS+Ruby' aliases = ['css+ruby', 'css+erb'] + version_added = '' alias_filenames = ['*.css'] mimetypes = ['text/css+ruby'] + url = 'https://github.com/ruby/erb' def __init__(self, **options): super().__init__(CssLexer, ErbLexer, **options) @@ -1066,10 +1095,12 @@ class JavascriptErbLexer(DelegatingLexer): name = 'JavaScript+Ruby' aliases = ['javascript+ruby', 'js+ruby', 'javascript+erb', 'js+erb'] + version_added = '' alias_filenames = ['*.js'] mimetypes = ['application/x-javascript+ruby', 'text/x-javascript+ruby', 'text/javascript+ruby'] + url = 'https://github.com/ruby/erb' def __init__(self, **options): super().__init__(JavascriptLexer, ErbLexer, **options) @@ -1088,11 +1119,14 @@ class HtmlPhpLexer(DelegatingLexer): name = 'HTML+PHP' aliases = ['html+php'] filenames = ['*.phtml'] + version_added = '' alias_filenames = ['*.php', '*.html', '*.htm', '*.xhtml', '*.php[345]'] mimetypes = ['application/x-php', 'application/x-httpd-php', 'application/x-httpd-php3', 'application/x-httpd-php4', 'application/x-httpd-php5'] + url = 'https://www.php.net' + def __init__(self, **options): super().__init__(HtmlLexer, PhpLexer, **options) @@ -1111,8 +1145,10 @@ class XmlPhpLexer(DelegatingLexer): name = 'XML+PHP' aliases = ['xml+php'] + version_added = '' alias_filenames = ['*.xml', '*.php', '*.php[345]'] mimetypes = ['application/xml+php'] + url = 'https://www.php.net' def __init__(self, **options): super().__init__(XmlLexer, PhpLexer, **options) @@ -1131,8 +1167,10 @@ class CssPhpLexer(DelegatingLexer): name = 'CSS+PHP' aliases = ['css+php'] + version_added = '' alias_filenames = ['*.css'] mimetypes = ['text/css+php'] + url = 'https://www.php.net' def __init__(self, **options): super().__init__(CssLexer, PhpLexer, **options) @@ -1149,10 +1187,12 @@ class JavascriptPhpLexer(DelegatingLexer): name = 'JavaScript+PHP' aliases = ['javascript+php', 'js+php'] + version_added = '' alias_filenames = ['*.js'] mimetypes = ['application/x-javascript+php', 'text/x-javascript+php', 'text/javascript+php'] + url = 'https://www.php.net' def __init__(self, **options): super().__init__(JavascriptLexer, PhpLexer, **options) @@ -1171,8 +1211,10 @@ class HtmlSmartyLexer(DelegatingLexer): name = 'HTML+Smarty' aliases = ['html+smarty'] + version_added = '' alias_filenames = ['*.html', '*.htm', '*.xhtml', '*.tpl'] mimetypes = ['text/html+smarty'] + url = 'https://www.smarty.net/' def __init__(self, **options): super().__init__(HtmlLexer, SmartyLexer, **options) @@ -1192,8 +1234,10 @@ class XmlSmartyLexer(DelegatingLexer): name = 'XML+Smarty' aliases = ['xml+smarty'] + version_added = '' alias_filenames = ['*.xml', '*.tpl'] mimetypes = ['application/xml+smarty'] + url = 'https://www.smarty.net/' def __init__(self, **options): super().__init__(XmlLexer, SmartyLexer, **options) @@ -1213,8 +1257,10 @@ class CssSmartyLexer(DelegatingLexer): name = 'CSS+Smarty' aliases = ['css+smarty'] + version_added = '' alias_filenames = ['*.css', '*.tpl'] mimetypes = ['text/css+smarty'] + url = 'https://www.smarty.net/' def __init__(self, **options): super().__init__(CssLexer, SmartyLexer, **options) @@ -1231,10 +1277,12 @@ class JavascriptSmartyLexer(DelegatingLexer): name = 'JavaScript+Smarty' aliases = ['javascript+smarty', 'js+smarty'] + version_added = '' alias_filenames = ['*.js', '*.tpl'] mimetypes = ['application/x-javascript+smarty', 'text/x-javascript+smarty', 'text/javascript+smarty'] + url = 'https://www.smarty.net/' def __init__(self, **options): super().__init__(JavascriptLexer, SmartyLexer, **options) @@ -1254,8 +1302,10 @@ class HtmlDjangoLexer(DelegatingLexer): name = 'HTML+Django/Jinja' aliases = ['html+django', 'html+jinja', 'htmldjango'] filenames = ['*.html.j2', '*.htm.j2', '*.xhtml.j2', '*.html.jinja2', '*.htm.jinja2', '*.xhtml.jinja2'] + version_added = '' alias_filenames = ['*.html', '*.htm', '*.xhtml'] mimetypes = ['text/html+django', 'text/html+jinja'] + url = 'https://www.djangoproject.com/documentation/templates' def __init__(self, **options): super().__init__(HtmlLexer, DjangoLexer, **options) @@ -1276,8 +1326,10 @@ class XmlDjangoLexer(DelegatingLexer): name = 'XML+Django/Jinja' aliases = ['xml+django', 'xml+jinja'] filenames = ['*.xml.j2', '*.xml.jinja2'] + version_added = '' alias_filenames = ['*.xml'] mimetypes = ['application/xml+django', 'application/xml+jinja'] + url = 'https://www.djangoproject.com/documentation/templates' def __init__(self, **options): super().__init__(XmlLexer, DjangoLexer, **options) @@ -1298,8 +1350,10 @@ class CssDjangoLexer(DelegatingLexer): name = 'CSS+Django/Jinja' aliases = ['css+django', 'css+jinja'] filenames = ['*.css.j2', '*.css.jinja2'] + version_added = '' alias_filenames = ['*.css'] mimetypes = ['text/css+django', 'text/css+jinja'] + url = 'https://www.djangoproject.com/documentation/templates' def __init__(self, **options): super().__init__(CssLexer, DjangoLexer, **options) @@ -1318,6 +1372,7 @@ class JavascriptDjangoLexer(DelegatingLexer): aliases = ['javascript+django', 'js+django', 'javascript+jinja', 'js+jinja'] filenames = ['*.js.j2', '*.js.jinja2'] + version_added = '' alias_filenames = ['*.js'] mimetypes = ['application/x-javascript+django', 'application/x-javascript+jinja', @@ -1325,6 +1380,7 @@ class JavascriptDjangoLexer(DelegatingLexer): 'text/x-javascript+jinja', 'text/javascript+django', 'text/javascript+jinja'] + url = 'https://www.djangoproject.com/documentation/templates' def __init__(self, **options): super().__init__(JavascriptLexer, DjangoLexer, **options) @@ -1361,13 +1417,13 @@ class JspRootLexer(RegexLexer): class JspLexer(DelegatingLexer): """ Lexer for Java Server Pages. - - .. versionadded:: 0.7 """ name = 'Java Server Page' aliases = ['jsp'] filenames = ['*.jsp'] mimetypes = ['application/x-jsp'] + url = 'https://projects.eclipse.org/projects/ee4j.jsp' + version_added = '0.7' def __init__(self, **options): super().__init__(XmlLexer, JspRootLexer, **options) @@ -1384,13 +1440,13 @@ def analyse_text(text): class EvoqueLexer(RegexLexer): """ For files using the Evoque templating system. - - .. versionadded:: 1.1 """ name = 'Evoque' aliases = ['evoque'] filenames = ['*.evoque'] mimetypes = ['application/x-evoque'] + url = 'https://gizmojo.org/templating' + version_added = '1.1' flags = re.DOTALL @@ -1442,13 +1498,13 @@ class EvoqueHtmlLexer(DelegatingLexer): """ Subclass of the `EvoqueLexer` that highlights unlexed data with the `HtmlLexer`. - - .. versionadded:: 1.1 """ name = 'HTML+Evoque' aliases = ['html+evoque'] filenames = ['*.html'] mimetypes = ['text/html+evoque'] + url = 'https://gizmojo.org/templating' + version_added = '1.1' def __init__(self, **options): super().__init__(HtmlLexer, EvoqueLexer, **options) @@ -1461,13 +1517,13 @@ class EvoqueXmlLexer(DelegatingLexer): """ Subclass of the `EvoqueLexer` that highlights unlexed data with the `XmlLexer`. - - .. versionadded:: 1.1 """ name = 'XML+Evoque' aliases = ['xml+evoque'] filenames = ['*.xml'] mimetypes = ['application/xml+evoque'] + url = 'https://gizmojo.org/templating' + version_added = '1.1' def __init__(self, **options): super().__init__(XmlLexer, EvoqueLexer, **options) @@ -1484,6 +1540,9 @@ class ColdfusionLexer(RegexLexer): aliases = ['cfs'] filenames = [] mimetypes = [] + url = 'https://www.adobe.com/products/coldfusion-family.html' + version_added = '' + flags = re.IGNORECASE tokens = { @@ -1532,6 +1591,7 @@ class ColdfusionMarkupLexer(RegexLexer): aliases = ['cf'] filenames = [] mimetypes = [] + url = 'https://www.adobe.com/products/coldfusion-family.html' tokens = { 'root': [ @@ -1578,6 +1638,8 @@ class ColdfusionHtmlLexer(DelegatingLexer): aliases = ['cfm'] filenames = ['*.cfm', '*.cfml'] mimetypes = ['application/x-coldfusion'] + url = 'https://www.adobe.com/products/coldfusion-family.html' + version_added = '' def __init__(self, **options): super().__init__(HtmlLexer, ColdfusionMarkupLexer, **options) @@ -1586,13 +1648,13 @@ def __init__(self, **options): class ColdfusionCFCLexer(DelegatingLexer): """ Coldfusion markup/script components - - .. versionadded:: 2.0 """ name = 'Coldfusion CFC' aliases = ['cfc'] filenames = ['*.cfc'] mimetypes = [] + url = 'https://www.adobe.com/products/coldfusion-family.html' + version_added = '2.0' def __init__(self, **options): super().__init__(ColdfusionHtmlLexer, ColdfusionLexer, **options) @@ -1601,13 +1663,13 @@ def __init__(self, **options): class SspLexer(DelegatingLexer): """ Lexer for Scalate Server Pages. - - .. versionadded:: 1.4 """ name = 'Scalate Server Page' aliases = ['ssp'] filenames = ['*.ssp'] mimetypes = ['application/x-ssp'] + url = 'https://scalate.github.io/scalate/' + version_added = '1.4' def __init__(self, **options): super().__init__(XmlLexer, JspRootLexer, **options) @@ -1647,14 +1709,14 @@ class TeaTemplateRootLexer(RegexLexer): class TeaTemplateLexer(DelegatingLexer): """ - Lexer for `Tea Templates <http://teatrove.org/>`_. - - .. versionadded:: 1.5 + Lexer for Tea Templates. """ name = 'Tea' aliases = ['tea'] filenames = ['*.tea'] mimetypes = ['text/x-tea'] + url = 'https://github.com/teatrove/teatrove' + version_added = '1.5' def __init__(self, **options): super().__init__(XmlLexer, TeaTemplateRootLexer, **options) @@ -1674,17 +1736,17 @@ class LassoHtmlLexer(DelegatingLexer): `HtmlLexer`. Nested JavaScript and CSS is also highlighted. - - .. versionadded:: 1.6 """ name = 'HTML+Lasso' aliases = ['html+lasso'] + version_added = '1.6' alias_filenames = ['*.html', '*.htm', '*.xhtml', '*.lasso', '*.lasso[89]', '*.incl', '*.inc', '*.las'] mimetypes = ['text/html+lasso', 'application/x-httpd-lasso', 'application/x-httpd-lasso[89]'] + url = 'https://www.lassosoft.com' def __init__(self, **options): super().__init__(HtmlLexer, LassoLexer, **options) @@ -1700,15 +1762,15 @@ class LassoXmlLexer(DelegatingLexer): """ Subclass of the `LassoLexer` which highlights unhandled data with the `XmlLexer`. - - .. versionadded:: 1.6 """ name = 'XML+Lasso' aliases = ['xml+lasso'] + version_added = '1.6' alias_filenames = ['*.xml', '*.lasso', '*.lasso[89]', '*.incl', '*.inc', '*.las'] mimetypes = ['application/xml+lasso'] + url = 'https://www.lassosoft.com' def __init__(self, **options): super().__init__(XmlLexer, LassoLexer, **options) @@ -1724,14 +1786,14 @@ class LassoCssLexer(DelegatingLexer): """ Subclass of the `LassoLexer` which highlights unhandled data with the `CssLexer`. - - .. versionadded:: 1.6 """ name = 'CSS+Lasso' aliases = ['css+lasso'] + version_added = '1.6' alias_filenames = ['*.css'] mimetypes = ['text/css+lasso'] + url = 'https://www.lassosoft.com' def __init__(self, **options): options['requiredelimiters'] = True @@ -1750,16 +1812,16 @@ class LassoJavascriptLexer(DelegatingLexer): """ Subclass of the `LassoLexer` which highlights unhandled data with the `JavascriptLexer`. - - .. versionadded:: 1.6 """ name = 'JavaScript+Lasso' aliases = ['javascript+lasso', 'js+lasso'] + version_added = '1.6' alias_filenames = ['*.js'] mimetypes = ['application/x-javascript+lasso', 'text/x-javascript+lasso', 'text/javascript+lasso'] + url = 'https://www.lassosoft.com' def __init__(self, **options): options['requiredelimiters'] = True @@ -1776,13 +1838,12 @@ class HandlebarsLexer(RegexLexer): Highlights only the Handlebars template tags (stuff between `{{` and `}}`). Everything else is left for a delegating lexer. - - .. versionadded:: 2.0 """ name = "Handlebars" url = 'https://handlebarsjs.com/' aliases = ['handlebars'] + version_added = '2.0' tokens = { 'root': [ @@ -1851,14 +1912,14 @@ class HandlebarsHtmlLexer(DelegatingLexer): """ Subclass of the `HandlebarsLexer` that highlights unlexed data with the `HtmlLexer`. - - .. versionadded:: 2.0 """ name = "HTML+Handlebars" aliases = ["html+handlebars"] filenames = ['*.handlebars', '*.hbs'] mimetypes = ['text/html+handlebars', 'text/x-handlebars-template'] + url = 'https://handlebarsjs.com/' + version_added = '2.0' def __init__(self, **options): super().__init__(HtmlLexer, HandlebarsLexer, **options) @@ -1870,14 +1931,14 @@ class YamlJinjaLexer(DelegatingLexer): `YamlLexer`. Commonly used in Saltstack salt states. - - .. versionadded:: 2.0 """ name = 'YAML+Jinja' aliases = ['yaml+jinja', 'salt', 'sls'] filenames = ['*.sls', '*.yaml.j2', '*.yml.j2', '*.yaml.jinja2', '*.yml.jinja2'] mimetypes = ['text/x-yaml+jinja', 'text/x-sls'] + url = 'https://jinja.palletsprojects.com' + version_added = '2.0' def __init__(self, **options): super().__init__(YamlLexer, DjangoLexer, **options) @@ -1886,13 +1947,12 @@ def __init__(self, **options): class LiquidLexer(RegexLexer): """ Lexer for Liquid templates. - - .. versionadded:: 2.0 """ name = 'liquid' url = 'https://www.rubydoc.info/github/Shopify/liquid' aliases = ['liquid'] filenames = ['*.liquid'] + version_added = '2.0' tokens = { 'root': [ @@ -2095,13 +2155,13 @@ class TwigLexer(RegexLexer): It just highlights Twig code between the preprocessor directives, other data is left untouched by the lexer. - - .. versionadded:: 2.0 """ name = 'Twig' aliases = ['twig'] mimetypes = ['application/x-twig'] + url = 'https://twig.symfony.com' + version_added = '2.0' flags = re.M | re.S @@ -2130,7 +2190,7 @@ class TwigLexer(RegexLexer): Other, Comment.Preproc, Text, Keyword, Text, Comment.Preproc)), # filter blocks - (r'(\{%%)(-?\s*)(filter)(\s+)(%s)' % _ident_inner, + (rf'(\{{%)(-?\s*)(filter)(\s+)({_ident_inner})', bygroups(Comment.Preproc, Text, Keyword, Text, Name.Function), 'tag'), (r'(\{%)(-?\s*)([a-zA-Z_]\w*)', @@ -2138,9 +2198,9 @@ class TwigLexer(RegexLexer): (r'\{', Other), ], 'varnames': [ - (r'(\|)(\s*)(%s)' % _ident_inner, + (rf'(\|)(\s*)({_ident_inner})', bygroups(Operator, Text, Name.Function)), - (r'(is)(\s+)(not)?(\s*)(%s)' % _ident_inner, + (rf'(is)(\s+)(not)?(\s*)({_ident_inner})', bygroups(Keyword, Text, Keyword, Text, Name.Function)), (r'(?i)(true|false|none|null)\b', Keyword.Pseudo), (r'(in|not|and|b-and|or|b-or|b-xor|is' @@ -2176,14 +2236,14 @@ class TwigHtmlLexer(DelegatingLexer): """ Subclass of the `TwigLexer` that highlights unlexed data with the `HtmlLexer`. - - .. versionadded:: 2.0 """ name = "HTML+Twig" aliases = ["html+twig"] filenames = ['*.twig'] mimetypes = ['text/html+twig'] + url = 'https://twig.symfony.com' + version_added = '2.0' def __init__(self, **options): super().__init__(HtmlLexer, TwigLexer, **options) @@ -2196,13 +2256,12 @@ class Angular2Lexer(RegexLexer): Highlights only the Angular template tags (stuff between `{{` and `}}` and special attributes: '(event)=', '[property]=', '[(twoWayBinding)]='). Everything else is left for a delegating lexer. - - .. versionadded:: 2.1 """ name = "Angular2" url = 'https://angular.io/guide/template-syntax' aliases = ['ng2'] + version_added = '2.1' tokens = { 'root': [ @@ -2256,13 +2315,13 @@ class Angular2HtmlLexer(DelegatingLexer): """ Subclass of the `Angular2Lexer` that highlights unlexed data with the `HtmlLexer`. - - .. versionadded:: 2.0 """ name = "HTML + Angular2" aliases = ["html+ng2"] filenames = ['*.ng2'] + url = 'https://angular.io/guide/template-syntax' + version_added = '2.0' def __init__(self, **options): super().__init__(HtmlLexer, Angular2Lexer, **options) @@ -2271,13 +2330,13 @@ def __init__(self, **options): class SqlJinjaLexer(DelegatingLexer): """ Templated SQL lexer. - - .. versionadded:: 2.13 """ name = 'SQL+Jinja' aliases = ['sql+jinja'] filenames = ['*.sql', '*.sql.j2', '*.sql.jinja2'] + url = 'https://jinja.palletsprojects.com' + version_added = '2.13' def __init__(self, **options): super().__init__(SqlLexer, DjangoLexer, **options) diff --git a/libs/pygments/lexers/teraterm.py b/libs/pygments/lexers/teraterm.py index 2c0d3b27a..9a88337bf 100644 --- a/libs/pygments/lexers/teraterm.py +++ b/libs/pygments/lexers/teraterm.py @@ -4,7 +4,7 @@ Lexer for Tera Term macro files. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,13 @@ class TeraTermLexer(RegexLexer): """ For Tera Term macro source code. - - .. versionadded:: 2.4 """ name = 'Tera Term macro' url = 'https://ttssh2.osdn.jp/' aliases = ['teratermmacro', 'teraterm', 'ttl'] filenames = ['*.ttl'] mimetypes = ['text/x-teratermmacro'] + version_added = '2.4' tokens = { 'root': [ diff --git a/libs/pygments/lexers/testing.py b/libs/pygments/lexers/testing.py index dec3a15d0..7df7fa780 100644 --- a/libs/pygments/lexers/testing.py +++ b/libs/pygments/lexers/testing.py @@ -4,7 +4,7 @@ Lexers for testing languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,13 +17,13 @@ class GherkinLexer(RegexLexer): """ For Gherkin syntax. - - .. versionadded:: 1.2 """ name = 'Gherkin' aliases = ['gherkin', 'cucumber'] filenames = ['*.feature'] mimetypes = ['text/x-gherkin'] + url = 'https://cucumber.io/docs/gherkin' + version_added = '1.2' feature_keywords = '^(기능|機能|功能|フィーチャ|خاصية|תכונה|Функціонал|Функционалност|Функционал|Фича|Особина|Могућност|Özellik|Właściwość|Tính năng|Trajto|Savybė|Požiadavka|Požadavek|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Fīča|Funzionalità|Funktionalität|Funkcionalnost|Funkcionalitāte|Funcționalitate|Functionaliteit|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Feature|Egenskap|Egenskab|Crikey|Característica|Arwedd)(:)(.*)$' feature_element_keywords = '^(\\s*)(시나리오 개요|시나리오|배경|背景|場景大綱|場景|场景大纲|场景|劇本大綱|劇本|剧本大纲|剧本|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|シナリオ|سيناريو مخطط|سيناريو|الخلفية|תרחיש|תבנית תרחיש|רקע|Тарих|Сценарій|Сценарио|Сценарий структураси|Сценарий|Структура сценарію|Структура сценарија|Структура сценария|Скица|Рамка на сценарий|Пример|Предыстория|Предистория|Позадина|Передумова|Основа|Концепт|Контекст|Założenia|Wharrimean is|Tình huống|The thing of it is|Tausta|Taust|Tapausaihio|Tapaus|Szenariogrundriss|Szenario|Szablon scenariusza|Stsenaarium|Struktura scenarija|Skica|Skenario konsep|Skenario|Situācija|Senaryo taslağı|Senaryo|Scénář|Scénario|Schema dello scenario|Scenārijs pēc parauga|Scenārijs|Scenár|Scenaro|Scenariusz|Scenariul de şablon|Scenariul de sablon|Scenariu|Scenario Outline|Scenario Amlinellol|Scenario|Scenarijus|Scenarijaus šablonas|Scenarij|Scenarie|Rerefons|Raamstsenaarium|Primer|Pozadí|Pozadina|Pozadie|Plan du scénario|Plan du Scénario|Osnova scénáře|Osnova|Náčrt Scénáře|Náčrt Scenáru|Mate|MISHUN SRSLY|MISHUN|Kịch bản|Konturo de la scenaro|Kontext|Konteksts|Kontekstas|Kontekst|Koncept|Khung tình huống|Khung kịch bản|Háttér|Grundlage|Geçmiş|Forgatókönyv vázlat|Forgatókönyv|Fono|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l\'escenari|Escenario|Escenari|Dis is what went down|Dasar|Contexto|Contexte|Contesto|Condiţii|Conditii|Cenário|Cenario|Cefndir|Bối cảnh|Blokes|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|All y\'all|Achtergrond|Abstrakt Scenario|Abstract Scenario)(:)(.*)$' @@ -136,13 +136,12 @@ def analyse_text(self, text): class TAPLexer(RegexLexer): """ For Test Anything Protocol (TAP) output. - - .. versionadded:: 2.1 """ name = 'TAP' url = 'https://testanything.org/' aliases = ['tap'] filenames = ['*.tap'] + version_added = '2.1' tokens = { 'root': [ diff --git a/libs/pygments/lexers/text.py b/libs/pygments/lexers/text.py index e35b0b5f0..17e2056b7 100644 --- a/libs/pygments/lexers/text.py +++ b/libs/pygments/lexers/text.py @@ -4,10 +4,11 @@ Lexers for non-source code file types. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +# ruff: noqa: F401 from pygments.lexers.configs import ApacheConfLexer, NginxConfLexer, \ SquidConfLexer, LighttpdConfLexer, IniLexer, RegeditLexer, PropertiesLexer, \ UnixConfigLexer diff --git a/libs/pygments/lexers/textedit.py b/libs/pygments/lexers/textedit.py index 09defdbe2..0e1f2b2be 100644 --- a/libs/pygments/lexers/textedit.py +++ b/libs/pygments/lexers/textedit.py @@ -4,7 +4,7 @@ Lexers for languages related to text processing. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -22,14 +22,14 @@ class AwkLexer(RegexLexer): """ For Awk scripts. - - .. versionadded:: 1.5 """ name = 'Awk' aliases = ['awk', 'gawk', 'mawk', 'nawk'] filenames = ['*.awk'] mimetypes = ['application/x-awk'] + url = 'https://en.wikipedia.org/wiki/AWK' + version_added = '1.5' tokens = { 'commentsandwhitespace': [ @@ -49,7 +49,7 @@ class AwkLexer(RegexLexer): 'root': [ (r'^(?=\s|/)', Text, 'slashstartsregex'), include('commentsandwhitespace'), - (r'\+\+|--|\|\||&&|in\b|\$|!?~|' + (r'\+\+|--|\|\||&&|in\b|\$|!?~|\?|:|' r'(\*\*|[-<>+*%\^/!=|])=?', Operator, 'slashstartsregex'), (r'[{(\[;,]', Punctuation, 'slashstartsregex'), (r'[})\].]', Punctuation), @@ -81,6 +81,8 @@ class SedLexer(RegexLexer): aliases = ['sed', 'gsed', 'ssed'] filenames = ['*.sed', '*.[gs]sed'] mimetypes = ['text/x-sed'] + url = 'https://en.wikipedia.org/wiki/Sed' + version_added = '' flags = re.MULTILINE # Match the contents within delimiters such as /<contents>/ @@ -111,14 +113,15 @@ class SedLexer(RegexLexer): class VimLexer(RegexLexer): """ Lexer for VimL script files. - - .. versionadded:: 0.8 """ name = 'VimL' aliases = ['vim'] filenames = ['*.vim', '.vimrc', '.exrc', '.gvimrc', '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc'] mimetypes = ['text/x-vim'] + url = 'https://www.vim.org' + version_added = '0.8' + flags = re.MULTILINE _python = r'py(?:t(?:h(?:o(?:n)?)?)?)?' diff --git a/libs/pygments/lexers/textfmts.py b/libs/pygments/lexers/textfmts.py index c7cfb6d04..f2a9253f9 100644 --- a/libs/pygments/lexers/textfmts.py +++ b/libs/pygments/lexers/textfmts.py @@ -4,7 +4,7 @@ Lexers for various text formats. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -29,6 +29,8 @@ class IrcLogsLexer(RegexLexer): aliases = ['irc'] filenames = ['*.weechatlog'] mimetypes = ['text/x-irclog'] + url = 'https://en.wikipedia.org/wiki/Internet_Relay_Chat' + version_added = '' flags = re.VERBOSE | re.MULTILINE timestamp = r""" @@ -86,13 +88,13 @@ class IrcLogsLexer(RegexLexer): class GettextLexer(RegexLexer): """ Lexer for Gettext catalog files. - - .. versionadded:: 0.9 """ name = 'Gettext Catalog' aliases = ['pot', 'po'] filenames = ['*.pot', '*.po'] mimetypes = ['application/x-gettext', 'text/x-gettext', 'text/gettext'] + url = 'https://www.gnu.org/software/gettext' + version_added = '0.9' tokens = { 'root': [ @@ -114,12 +116,12 @@ class GettextLexer(RegexLexer): class HttpLexer(RegexLexer): """ Lexer for HTTP sessions. - - .. versionadded:: 1.5 """ name = 'HTTP' aliases = ['http'] + url = 'https://httpwg.org/specs' + version_added = '1.5' flags = re.DOTALL @@ -206,13 +208,12 @@ def analyse_text(text): class TodotxtLexer(RegexLexer): """ Lexer for Todo.txt todo list format. - - .. versionadded:: 2.0 """ name = 'Todotxt' url = 'http://todotxt.com/' aliases = ['todotxt'] + version_added = '2.0' # *.todotxt is not a standard extension for Todo.txt files; including it # makes testing easier, and also makes autodetecting file type easier. filenames = ['todo.txt', '*.todotxt'] @@ -308,8 +309,6 @@ class NotmuchLexer(RegexLexer): """ For Notmuch email text format. - .. versionadded:: 2.5 - Additional options accepted: `body_lexer` @@ -320,6 +319,7 @@ class NotmuchLexer(RegexLexer): name = 'Notmuch' url = 'https://notmuchmail.org/' aliases = ['notmuch'] + version_added = '2.5' def _highlight_code(self, match): code = match.group(1) @@ -390,12 +390,12 @@ def __init__(self, **options): class KernelLogLexer(RegexLexer): """ For Linux Kernel log ("dmesg") output. - - .. versionadded:: 2.6 """ name = 'Kernel log' aliases = ['kmsg', 'dmesg'] filenames = ['*.kmsg', '*.dmesg'] + url = 'https://fr.wikipedia.org/wiki/Dmesg' + version_added = '2.6' tokens = { 'root': [ diff --git a/libs/pygments/lexers/theorem.py b/libs/pygments/lexers/theorem.py index abf09ae17..79f0606c0 100644 --- a/libs/pygments/lexers/theorem.py +++ b/libs/pygments/lexers/theorem.py @@ -6,16 +6,15 @@ See also :mod:`pygments.lexers.lean` - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ -import re - -from pygments.lexer import RegexLexer, default, words, include +from pygments.lexer import RegexLexer, bygroups, default, words from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ Number, Punctuation, Generic, Whitespace -from pygments.lexers.lean import LeanLexer +# compatibility import +from pygments.lexers.lean import LeanLexer # noqa: F401 __all__ = ['CoqLexer', 'IsabelleLexer'] @@ -23,8 +22,6 @@ class CoqLexer(RegexLexer): """ For the Coq theorem prover. - - .. versionadded:: 1.5 """ name = 'Coq' @@ -32,17 +29,18 @@ class CoqLexer(RegexLexer): aliases = ['coq'] filenames = ['*.v'] mimetypes = ['text/x-coq'] + version_added = '1.5' flags = 0 # no re.MULTILINE keywords1 = ( # Vernacular commands - 'Section', 'Module', 'End', 'Require', 'Import', 'Export', 'Variable', + 'Section', 'Module', 'End', 'Require', 'Import', 'Export', 'Include', 'Variable', 'Variables', 'Parameter', 'Parameters', 'Axiom', 'Axioms', 'Hypothesis', 'Hypotheses', 'Notation', 'Local', 'Tactic', 'Reserved', 'Scope', - 'Open', 'Close', 'Bind', 'Delimit', 'Definition', 'Example', 'Let', - 'Ltac', 'Fixpoint', 'CoFixpoint', 'Morphism', 'Relation', 'Implicit', - 'Arguments', 'Types', 'Unset', 'Contextual', 'Strict', 'Prenex', + 'Open', 'Close', 'Bind', 'Declare', 'Delimit', 'Definition', 'Example', 'Let', + 'Ltac', 'Ltac2', 'Fixpoint', 'CoFixpoint', 'Morphism', 'Relation', 'Implicit', + 'Arguments', 'Types', 'Contextual', 'Strict', 'Prenex', 'Implicits', 'Inductive', 'CoInductive', 'Record', 'Structure', 'Variant', 'Canonical', 'Coercion', 'Theorem', 'Lemma', 'Fact', 'Remark', 'Corollary', 'Proposition', 'Property', 'Goal', @@ -51,7 +49,8 @@ class CoqLexer(RegexLexer): 'Show', 'Print', 'Printing', 'All', 'Graph', 'Projections', 'inside', 'outside', 'Check', 'Global', 'Instance', 'Class', 'Existing', 'Universe', 'Polymorphic', 'Monomorphic', 'Context', 'Scheme', 'From', - 'Undo', 'Fail', 'Function', + 'Undo', 'Fail', 'Function', 'Program', 'Elpi', 'Extract', 'Opaque', + 'Transparent', 'Unshelve', 'Next Obligation', ) keywords2 = ( # Gallina @@ -99,7 +98,7 @@ class CoqLexer(RegexLexer): '!=', '#', '&', '&&', r'\(', r'\)', r'\*', r'\+', ',', '-', r'-\.', '->', r'\.', r'\.\.', ':', '::', ':=', ':>', ';', ';;', '<', '<-', '<->', '=', '>', '>]', r'>\}', r'\?', r'\?\?', r'\[', r'\[<', r'\[>', - r'\[\|', ']', '_', '`', r'\{', r'\{<', r'\|', r'\|]', r'\}', '~', '=>', + r'\[\|', ']', '_', '`', r'\{', r'\{<', r'lp:\{\{', r'\|', r'\|]', r'\}', '~', '=>', r'/\\', r'\\/', r'\{\|', r'\|\}', # 'Π', 'Σ', # Not defined in the standard library 'λ', '¬', '∧', '∨', '∀', '∃', '→', '↔', '≠', '≤', '≥', @@ -115,8 +114,10 @@ class CoqLexer(RegexLexer): (r'\(\*', Comment, 'comment'), (r'\b(?:[^\W\d][\w\']*\.)+[^\W\d][\w\']*\b', Name), (r'\bEquations\b\??', Keyword.Namespace), + (r'\b(Elpi)(\s+)(Program|Query|Accumulate|Command|Typecheck|Db|Export|Tactic)?\b', bygroups(Keyword.Namespace,Text,Keyword.Namespace)), # Very weak heuristic to distinguish the Set vernacular from the Set sort - (r'\bSet(?=[ \t]+[A-Z][a-z][^\n]*?\.)', Keyword.Namespace), + (r'\bUnset\b|\bSet(?=[ \t]+[A-Z][a-z][^\n]*?\.)', Keyword.Namespace, 'set-options'), + (r'\b(?:String|Number)\s+Notation', Keyword.Namespace, 'sn-notation'), (words(keywords1, prefix=r'\b', suffix=r'\b'), Keyword.Namespace), (words(keywords2, prefix=r'\b', suffix=r'\b'), Keyword), (words(keywords3, prefix=r'\b', suffix=r'\b'), Keyword.Type), @@ -125,8 +126,8 @@ class CoqLexer(RegexLexer): (words(keywords6, prefix=r'\b', suffix=r'\b'), Keyword.Reserved), # (r'\b([A-Z][\w\']*)(\.)', Name.Namespace, 'dotted'), (r'\b([A-Z][\w\']*)', Name), - (r'(%s)' % '|'.join(keyopts[::-1]), Operator), - (r'(%s|%s)?%s' % (infix_syms, prefix_syms, operators), Operator), + (r'({})'.format('|'.join(keyopts[::-1])), Operator), + (rf'({infix_syms}|{prefix_syms})?{operators}', Operator), (r"[^\W\d][\w']*", Name), @@ -146,8 +147,27 @@ class CoqLexer(RegexLexer): (r'[~?][a-z][\w\']*:', Name), (r'\S', Name.Builtin.Pseudo), ], + 'set-options': [ + (r'\s+', Text), + (r'[A-Z]\w*', Keyword.Namespace), + (r'"', String.Double, 'string'), + (r'\d+', Number.Integer), + (r'\.', Punctuation, '#pop'), + ], + 'sn-notation': [ + (r'\s+', Text), + # Extra keywords to highlight only in this scope + (r'\b(?:via|mapping|abstract|warning|after)\b', Keyword), + (r'=>|[()\[\]:,]', Operator), + (r'\b[^\W\d][\w\']*(?:\.[^\W\d][\w\']*)*\b', Name), + (r'\d[\d_]*', Number.Integer), + (r'0[xX][\da-fA-F][\da-fA-F_]*', Number.Hex), + (r'\(\*', Comment, 'comment'), + (r'\.', Punctuation, '#pop'), + ], 'comment': [ - (r'[^(*)]+', Comment), + # Consume comments like ***** as one token + (r'([^(*)]+|\*+(?!\)))+', Comment), (r'\(\*', Comment, '#push'), (r'\*\)', Comment, '#pop'), (r'[(*)]', Comment), @@ -175,8 +195,6 @@ def analyse_text(text): class IsabelleLexer(RegexLexer): """ For the Isabelle proof assistant. - - .. versionadded:: 2.0 """ name = 'Isabelle' @@ -184,6 +202,7 @@ class IsabelleLexer(RegexLexer): aliases = ['isabelle'] filenames = ['*.thy'] mimetypes = ['text/x-isabelle'] + version_added = '2.0' keyword_minor = ( 'and', 'assumes', 'attach', 'avoids', 'binder', 'checking', diff --git a/libs/pygments/lexers/thingsdb.py b/libs/pygments/lexers/thingsdb.py index 13230f8b3..733665308 100644 --- a/libs/pygments/lexers/thingsdb.py +++ b/libs/pygments/lexers/thingsdb.py @@ -4,7 +4,7 @@ Lexers for the ThingsDB language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,12 +18,12 @@ class ThingsDBLexer(RegexLexer): """ Lexer for the ThingsDB programming language. - - .. versionadded:: 2.9 """ name = 'ThingsDB' aliases = ['ti', 'thingsdb'] filenames = ['*.ti'] + url = 'https://www.thingsdb.net' + version_added = '2.9' tokens = { 'root': [ @@ -39,21 +39,24 @@ class ThingsDBLexer(RegexLexer): (r'([-+]?0x[0-9a-fA-F]+)', Number.Hex), (r'[-+]?[0-9]+', Number.Integer), (r'[-+]?((inf|nan)([^0-9A-Za-z_]|$)|[0-9]*\.[0-9]+(e[+-][0-9]+)?)', - Number.Float), + Number.Float), # strings (r'(?:"(?:[^"]*)")+', String.Double), (r"(?:'(?:[^']*)')+", String.Single), + (r"(?:`(?:[^`]*)`)+", String.Backtick), # literals (r'(true|false|nil)\b', Keyword.Constant), + # name constants + (r'(FULL|USER|GRANT|CHANGE|JOIN|RUN|QUERY|' + r'DEBUG|INFO|WARNING|ERROR|CRITICAL|' + r'NO_IDS|INT_MIN|INT_MAX)\b', Name.Constant), + # regular expressions (r'(/[^/\\]*(?:\\.[^/\\]*)*/i?)', String.Regex), - # thing id's - (r'#[0-9]+', Comment.Preproc), - # name, assignments and functions include('names'), @@ -62,26 +65,47 @@ class ThingsDBLexer(RegexLexer): ], 'names': [ (r'(\.)' - r'(add|call|contains|del|endswith|extend|filter|find|findindex|' - r'get|has|id|indexof|keys|len|lower|map|pop|push|remove|set|sort|' - r'splice|startswith|test|unwrap|upper|values|wrap)' + r'(first|last|then|else|load|at|again_in|again_at|err|cancel|' + r'closure|set_closure|args|set_args|owner|set_owner|equals|copy|' + r'dup|assign|week|weekday|yday|zone|len|call|doc|emit|extract|' + r'choice|code|format|msg|each|every|extend|extend_unique|filter|' + r'find|flat|find_index|has|index_of|count|sum|is_unique|unique|' + r'join|map|map_id|map_wrap|map_type|vmap|move|pop|push|fill|' + r'remove|replace|restrict|restriction|shift|sort|splice|to|add|' + r'one|clear|contains|ends_with|name|lower|replace|reverse|' + r'starts_with|split|test|trim|trim_left|trim_right|upper|del|ren|' + r'to_type|to_thing|get|id|keys|reduce|set|some|value|values|wrap|' + r'unshift|unwrap|search)' r'(\()', bygroups(Name.Function, Name.Function, Punctuation), 'arguments'), - (r'(array|assert|assert_err|auth_err|backup_info|backups_info|' - r'bad_data_err|bool|closure|collection_info|collections_info|' - r'counters|deep|del_backup|del_collection|del_expired|del_node|' - r'del_procedure|del_token|del_type|del_user|err|float|' - r'forbidden_err|grant|int|isarray|isascii|isbool|isbytes|iserr|' - r'isfloat|isinf|isint|islist|isnan|isnil|israw|isset|isstr|' - r'isthing|istuple|isutf8|lookup_err|max_quota_err|mod_type|new|' - r'new_backup|new_collection|new_node|new_procedure|new_token|' - r'new_type|new_user|node_err|node_info|nodes_info|now|' - r'num_arguments_err|operation_err|overflow_err|procedure_doc|' - r'procedure_info|procedures_info|raise|refs|rename_collection|' - r'rename_user|reset_counters|return|revoke|run|set_log_level|set|' - r'set_quota|set_type|shutdown|str|syntax_err|thing|try|type|' - r'type_err|type_count|type_info|types_info|user_info|users_info|' - r'value_err|wse|zero_div_err)' + (r'(alt_raise|assert|base64_encode|base64_decode|bool|bytes|' + r'closure|datetime|deep|future|is_future|del_enum|del_type|room|' + r'is_room|task|tasks|is_task|is_email|is_url|is_tel|is_time_zone|' + r'timeit|enum|enum_info|enum_map|enums_info|err|regex|is_regex|' + r'change_id|float|has_enum|has_type|int|is_array|is_ascii|' + r'is_float|is_bool|is_bytes|is_closure|is_datetime|is_enum|' + r'is_err|is_mpdata|is_inf|is_int|is_list|is_nan|is_nil|is_raw|' + r'is_set|is_str|is_thing|is_timeval|is_tuple|is_utf8|json_dump|' + r'json_load|list|log|import|export|root|mod_enum|mod_type|new|' + r'new_type|now|raise|rand|range|randint|randstr|refs|rename_enum|' + r'set|set_enum|set_type|str|thing|timeval|try|type|type_assert|' + r'type_count|type_info|types_info|nse|wse|backup_info|' + r'backups_info|backups_ok|counters|del_backup|has_backup|' + r'new_backup|node_info|nodes_info|reset_counters|restart_module|' + r'set_log_level|shutdown|has_module|del_module|module_info|' + r'modules_info|new_module|deploy_module|rename_module|' + r'refresh_module|set_module_conf|set_module_scope|' + r'collections_info|del_collection|del_expired|del_node|del_token|' + r'del_user|grant|has_collection|has_node|has_token|has_user|' + r'new_collection|new_node|new_token|new_user|rename_collection|' + r'rename_user|restore|revoke|set_password|set_time_zone|' + r'set_default_deep|time_zones_info|user_info|users_info|' + r'del_procedure|has_procedure|new_procedure|mod_procedure|' + r'procedure_doc|procedure_info|procedures_info|rename_procedure|' + r'run|assert_err|auth_err|bad_data_err|cancelled_err|' + r'rename_type|forbidden_err|lookup_err|max_quota_err|node_err|' + r'num_arguments_err|operation_err|overflow_err|syntax_err|' + r'collection_info|type_err|value_err|zero_div_err)' r'(\()', bygroups(Name.Function, Punctuation), 'arguments'), @@ -90,7 +114,7 @@ class ThingsDBLexer(RegexLexer): bygroups(Name.Attribute, Text, Operator)), (r'\.[A-Za-z_][0-9A-Za-z_]*', Name.Attribute), (r'([A-Za-z_][0-9A-Za-z_]*)(\s*)(=)', - bygroups(Name.Variable, Text, Operator)), + bygroups(Name.Variable, Text, Operator)), (r'[A-Za-z_][0-9A-Za-z_]*', Name.Variable), ], 'whitespace': [ diff --git a/libs/pygments/lexers/tlb.py b/libs/pygments/lexers/tlb.py index ac629dc84..45d0743f1 100644 --- a/libs/pygments/lexers/tlb.py +++ b/libs/pygments/lexers/tlb.py @@ -4,7 +4,7 @@ Lexers for TL-b. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -23,6 +23,8 @@ class TlbLexer(RegexLexer): name = 'Tl-b' aliases = ['tlb'] filenames = ['*.tlb'] + url = 'https://docs.ton.org/#/overviews/TL-B' + version_added = '' tokens = { 'root': [ diff --git a/libs/pygments/lexers/tls.py b/libs/pygments/lexers/tls.py index 34f8d4f26..f7027bb02 100644 --- a/libs/pygments/lexers/tls.py +++ b/libs/pygments/lexers/tls.py @@ -4,7 +4,7 @@ Lexers for the TLS presentation language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re @@ -19,14 +19,13 @@ class TlsLexer(RegexLexer): """ The TLS presentation language, described in RFC 8446. - - .. versionadded:: 2.16 """ name = 'TLS Presentation Language' url = 'https://www.rfc-editor.org/rfc/rfc8446#section-3' filenames = [] aliases = ['tls'] mimetypes = [] + version_added = '2.16' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/tnt.py b/libs/pygments/lexers/tnt.py index 2251373c5..bb444fdf8 100644 --- a/libs/pygments/lexers/tnt.py +++ b/libs/pygments/lexers/tnt.py @@ -4,7 +4,7 @@ Lexer for Typographic Number Theory. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,14 +21,13 @@ class TNTLexer(Lexer): """ Lexer for Typographic Number Theory, as described in the book Gödel, Escher, Bach, by Douglas R. Hofstadter - - .. versionadded:: 2.7 """ name = 'Typographic Number Theory' url = 'https://github.com/Kenny2github/language-tnt' aliases = ['tnt'] filenames = ['*.tnt'] + version_added = '2.7' cur = [] diff --git a/libs/pygments/lexers/trafficscript.py b/libs/pygments/lexers/trafficscript.py index b48124be6..9480ddc02 100644 --- a/libs/pygments/lexers/trafficscript.py +++ b/libs/pygments/lexers/trafficscript.py @@ -4,7 +4,7 @@ Lexer for RiverBed's TrafficScript (RTS) language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,12 +17,12 @@ class RtsLexer(RegexLexer): """ For Riverbed Stingray Traffic Manager - - .. versionadded:: 2.1 """ name = 'TrafficScript' aliases = ['trafficscript', 'rts'] filenames = ['*.rts'] + url = 'https://riverbed.com' + version_added = '2.1' tokens = { 'root' : [ diff --git a/libs/pygments/lexers/typoscript.py b/libs/pygments/lexers/typoscript.py index dff6e5ed8..0f3977252 100644 --- a/libs/pygments/lexers/typoscript.py +++ b/libs/pygments/lexers/typoscript.py @@ -13,7 +13,7 @@ `TypoScriptHtmlDataLexer` Lexer that highlights markers, constants and registers within html tags. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -29,12 +29,12 @@ class TypoScriptCssDataLexer(RegexLexer): """ Lexer that highlights markers, constants and registers within css blocks. - - .. versionadded:: 2.2 """ name = 'TypoScriptCssData' aliases = ['typoscriptcssdata'] + url = 'http://docs.typo3.org/typo3cms/TyposcriptReference/' + version_added = '2.2' tokens = { 'root': [ @@ -64,12 +64,12 @@ class TypoScriptCssDataLexer(RegexLexer): class TypoScriptHtmlDataLexer(RegexLexer): """ Lexer that highlights markers, constants and registers within html tags. - - .. versionadded:: 2.2 """ name = 'TypoScriptHtmlData' aliases = ['typoscripthtmldata'] + url = 'http://docs.typo3.org/typo3cms/TyposcriptReference/' + version_added = '2.2' tokens = { 'root': [ @@ -99,8 +99,6 @@ class TypoScriptHtmlDataLexer(RegexLexer): class TypoScriptLexer(RegexLexer): """ Lexer for TypoScript code. - - .. versionadded:: 2.2 """ name = 'TypoScript' @@ -108,6 +106,7 @@ class TypoScriptLexer(RegexLexer): aliases = ['typoscript'] filenames = ['*.typoscript'] mimetypes = ['text/x-typoscript'] + version_added = '2.2' flags = re.DOTALL | re.MULTILINE diff --git a/libs/pygments/lexers/typst.py b/libs/pygments/lexers/typst.py new file mode 100644 index 000000000..5daa6766f --- /dev/null +++ b/libs/pygments/lexers/typst.py @@ -0,0 +1,104 @@ +""" + pygments.lexers.typst + ~~~~~~~~~~~~~~~~~~~~~ + + Lexers for Typst language. + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, words, bygroups, include +from pygments.token import Comment, Keyword, Name, String, Punctuation, \ + Whitespace, Generic, Operator, Number, Text + +__all__ = ['TypstLexer'] + + +class TypstLexer(RegexLexer): + """ + For Typst code. + """ + + name = 'Typst' + aliases = ['typst'] + filenames = ['*.typ'] + mimetypes = ['text/x-typst'] + url = 'https://typst.app' + version_added = '2.18' + + tokens = { + 'root': [ + include('markup'), + ], + 'common': [ + (r'[ \t]+', Whitespace), + (r'((?!=[*_$`\-+0-9/<@\\#\[]|https?://).)+', Text), + ], + 'markup': [ + include('comment'), + (r'^\s*=+.*$', Generic.Heading), + (r'[*][^*]*[*]', Generic.Strong), + (r'_[^_]*_', Generic.Emph), + (r'\$', Punctuation, 'maths'), + (r'`[^`]*`', String.Backtick), # inline code + (r'^\s*-', Punctuation), # unnumbered list + (r'^\s*\+', Punctuation), # numbered list + (r'^\s*[0-9.]+', Punctuation), # numbered list variant + (r'^(\s*/\s+)([^:]+)(:)', bygroups(Punctuation, Name.Variable, Punctuation)), # definitions + (r'<[a-zA-Z_][a-zA-Z0-9_-]*>', Name.Label), # label + (r'@[a-zA-Z_][a-zA-Z0-9_-]*', Name.Label), # reference + (r'\\#', Text), # escaped + (words(('#let', '#set', '#show'), suffix=r'\b'), Keyword.Declaration, 'inline_code'), + (r'(#[a-zA-Z_][a-zA-Z0-9_]*)(\[)', bygroups(Name.Function, Punctuation), 'markup'), + (r'(#[a-zA-Z_][a-zA-Z0-9_]*)(\()', bygroups(Name.Function, Punctuation), 'inline_code'), + (r'#[a-zA-Z_][a-zA-Z0-9_]*', Name.Variable), + (r'```(?:.|\n)*?```', String.Backtick), # code block + (r'https?://[0-9a-zA-Z~/%#&=\',;.+?]*', Generic.Emph), # links + (words((r'---', r'\\', r'~', r'--', r'...'), suffix=r'\b'), Punctuation), # special chars shorthand + (r'\\\[', Punctuation), # escaped + (r'\\\]', Punctuation), # escaped + (r'\[', Punctuation, '#push'), + (r'\]', Punctuation, '#pop'), + include('common'), + ], + 'maths': [ + include('comment'), + (words(('_', '^', '+', '-', '/', '*', '->', '<-', '!=', '=='), + suffix=r'\b'), Operator), + (words((r'\\', '$='), suffix=r'\b'), Operator), # maths markup operators + (r'\\\$', Punctuation), # escaped + (r'\$', Punctuation, '#pop'), # end of math mode + include('code'), + ], + 'comment': [ + (r'//.*$', Comment.Single), + (r'/[*](.|\n)*?[*]/', Comment.Multiline), + ], + 'code': [ + include('comment'), + (r'\[', Punctuation, 'markup'), + (r'\(|\{', Punctuation, 'code'), + (r'\)|\}', Punctuation, '#pop'), + (r'"[^"]*"', String.Double), + (r'[=,]', Operator), + (words(('and', 'or', 'not'), suffix=r'\b'), Operator.Word), + (r'=>|<=|==|!=|>|<|-=|\+=|\*=|/=|\+|-|\\|\*', Operator), # comparisons + (r'([a-zA-Z_][a-zA-Z0-9_]*)(:)', bygroups(Name.Variable, Punctuation), '#push'), + (r'([a-zA-Z_][a-zA-Z0-9_]*)(\()', bygroups(Name.Function, Punctuation), '#push'), + (words(('as', 'break', 'export', 'continue', 'else', 'for', 'if', + 'import', 'in', 'include', 'return', 'while'), suffix=r'\b'), + Keyword.Reserved), + (words(('auto', 'none', 'true', 'false'), suffix=r'\b'), Keyword.Constant), + (r'([0-9.]+)(mm|pt|cm|in|em|fr|%)', bygroups(Number, Keyword.Reserved)), + (words(('let', 'set', 'show'), suffix=r'\b'), Keyword.Declaration), + # FIXME: make this work + ## (r'(import|include)( *)(")([^"])(")', + ## bygroups(Keyword.Reserved, Text, Punctuation, String.Double, Punctuation)), + include('common'), + ], + 'inline_code': [ + (r';$', Punctuation, '#pop'), + include('code'), + ], + } diff --git a/libs/pygments/lexers/ul4.py b/libs/pygments/lexers/ul4.py index a40c20f67..467d3381c 100644 --- a/libs/pygments/lexers/ul4.py +++ b/libs/pygments/lexers/ul4.py @@ -4,9 +4,7 @@ Lexer for the UL4 templating language. - More information: https://python.livinglogic.de/UL4.html - - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -25,8 +23,6 @@ class UL4Lexer(RegexLexer): """ Generic lexer for UL4. - - .. versionadded:: 2.12 """ flags = re.MULTILINE | re.DOTALL @@ -34,6 +30,8 @@ class UL4Lexer(RegexLexer): name = 'UL4' aliases = ['ul4'] filenames = ['*.ul4'] + url = 'https://python.livinglogic.de/UL4.html' + version_added = '2.12' tokens = { "root": [ @@ -52,12 +50,26 @@ class UL4Lexer(RegexLexer): Text.Whitespace, Name.Function), "ul4", # Switch to "expression" mode ), + ( + # Comment: + # ``<?note?>...<?end note?>`` + r"<\?\s*note\s*\?>", + Comment, + "note", # Switch to "note" mode + ), ( # Comment: # ``<?note foobar?>`` r"<\?\s*note\s.*?\?>", Comment, ), + ( + # Template documentation: + # ``<?doc?>...<?end doc?>`` + r"<\?\s*doc\s*\?>", + String.Doc, + "doc", + ), ( # Template documentation: # ``<?doc foobar?>`` @@ -113,6 +125,26 @@ class UL4Lexer(RegexLexer): (r"[^<]+", Comment), (r".", Comment), ], + # Note mode ignores everything upto the matching ``<?end note?>`` tag + "note": [ + # Nested ``<?note?>`` tag + (r"<\?\s*note\s*\?>", Comment, "#push"), + # ``<?end note?>`` tag + (r"<\?\s*end\s+note\s*\?>", Comment, "#pop"), + # Everything else + (r"[^<]+", Comment), + (r".", Comment), + ], + # Doc mode ignores everything upto the matching ``<?end doc?>`` tag + "doc": [ + # Nested ``<?doc?>`` tag + (r"<\?\s*doc\s*\?>", String.Doc, "#push"), + # ``<?end doc?>`` tag + (r"<\?\s*end\s+doc\s*\?>", String.Doc, "#pop"), + # Everything else + (r"[^<]+", String.Doc), + (r".", String.Doc), + ], # UL4 expressions "ul4": [ # End the tag @@ -210,6 +242,8 @@ class HTMLUL4Lexer(DelegatingLexer): name = 'HTML+UL4' aliases = ['html+ul4'] filenames = ['*.htmlul4'] + url = 'https://python.livinglogic.de/UL4.html' + version_added = '' def __init__(self, **options): super().__init__(HtmlLexer, UL4Lexer, **options) @@ -223,6 +257,8 @@ class XMLUL4Lexer(DelegatingLexer): name = 'XML+UL4' aliases = ['xml+ul4'] filenames = ['*.xmlul4'] + url = 'https://python.livinglogic.de/UL4.html' + version_added = '' def __init__(self, **options): super().__init__(XmlLexer, UL4Lexer, **options) @@ -236,6 +272,8 @@ class CSSUL4Lexer(DelegatingLexer): name = 'CSS+UL4' aliases = ['css+ul4'] filenames = ['*.cssul4'] + url = 'https://python.livinglogic.de/UL4.html' + version_added = '' def __init__(self, **options): super().__init__(CssLexer, UL4Lexer, **options) @@ -249,6 +287,8 @@ class JavascriptUL4Lexer(DelegatingLexer): name = 'Javascript+UL4' aliases = ['js+ul4'] filenames = ['*.jsul4'] + url = 'https://python.livinglogic.de/UL4.html' + version_added = '' def __init__(self, **options): super().__init__(JavascriptLexer, UL4Lexer, **options) @@ -262,6 +302,8 @@ class PythonUL4Lexer(DelegatingLexer): name = 'Python+UL4' aliases = ['py+ul4'] filenames = ['*.pyul4'] + url = 'https://python.livinglogic.de/UL4.html' + version_added = '' def __init__(self, **options): super().__init__(PythonLexer, UL4Lexer, **options) diff --git a/libs/pygments/lexers/unicon.py b/libs/pygments/lexers/unicon.py index 9cd6790a4..dcf129d49 100644 --- a/libs/pygments/lexers/unicon.py +++ b/libs/pygments/lexers/unicon.py @@ -4,7 +4,7 @@ Lexers for the Icon and Unicon languages, including ucode VM. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,14 @@ class UniconLexer(RegexLexer): """ For Unicon source code. - - .. versionadded:: 2.4 """ name = 'Unicon' aliases = ['unicon'] filenames = ['*.icn'] mimetypes = ['text/unicon'] + url = 'https://www.unicon.org' + version_added = '2.4' flags = re.MULTILINE @@ -166,13 +166,14 @@ class UniconLexer(RegexLexer): class IconLexer(RegexLexer): """ Lexer for Icon. - - .. versionadded:: 1.6 """ name = 'Icon' aliases = ['icon'] filenames = ['*.icon', '*.ICON'] mimetypes = [] + url = 'https://www2.cs.arizona.edu/icon' + version_added = '1.6' + flags = re.MULTILINE tokens = { @@ -306,13 +307,14 @@ class IconLexer(RegexLexer): class UcodeLexer(RegexLexer): """ Lexer for Icon ucode files. - - .. versionadded:: 2.4 """ name = 'ucode' aliases = ['ucode'] filenames = ['*.u', '*.u1', '*.u2'] mimetypes = [] + url = 'http://www.unicon.org' + version_added = '2.4' + flags = re.MULTILINE tokens = { diff --git a/libs/pygments/lexers/urbi.py b/libs/pygments/lexers/urbi.py index 3857ff20d..3a81385c5 100644 --- a/libs/pygments/lexers/urbi.py +++ b/libs/pygments/lexers/urbi.py @@ -4,7 +4,7 @@ Lexers for UrbiScript language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,14 +20,14 @@ class UrbiscriptLexer(ExtendedRegexLexer): """ For UrbiScript source code. - - .. versionadded:: 1.5 """ name = 'UrbiScript' aliases = ['urbiscript'] filenames = ['*.u'] mimetypes = ['application/x-urbiscript'] + url = 'https://github.com/urbiforge/urbi' + version_added = '1.5' flags = re.DOTALL diff --git a/libs/pygments/lexers/usd.py b/libs/pygments/lexers/usd.py index 79a2ad943..083125961 100644 --- a/libs/pygments/lexers/usd.py +++ b/libs/pygments/lexers/usd.py @@ -4,7 +4,7 @@ The module that parses Pixar's Universal Scene Description file format. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -30,34 +30,29 @@ def _keywords(words, type_): class UsdLexer(RegexLexer): """ A lexer that parses Pixar's Universal Scene Description file format. - - .. versionadded:: 2.6 """ name = "USD" url = 'https://graphics.pixar.com/usd/release/index.html' aliases = ["usd", "usda"] filenames = ["*.usd", "*.usda"] + version_added = '2.6' tokens = { "root": [ - (r"(custom){_WHITESPACE}(uniform)(\s+){}(\s+){}(\s*)(=)".format( - _TYPE, _BASE_ATTRIBUTE, _WHITESPACE=_WHITESPACE), + (rf"(custom){_WHITESPACE}(uniform)(\s+){_TYPE}(\s+){_BASE_ATTRIBUTE}(\s*)(=)", bygroups(Keyword.Token, Whitespace, Keyword.Token, Whitespace, Keyword.Type, Whitespace, Name.Attribute, Text, Name.Keyword.Tokens, Whitespace, Operator)), - (r"(custom){_WHITESPACE}{}(\s+){}(\s*)(=)".format( - _TYPE, _BASE_ATTRIBUTE, _WHITESPACE=_WHITESPACE), + (rf"(custom){_WHITESPACE}{_TYPE}(\s+){_BASE_ATTRIBUTE}(\s*)(=)", bygroups(Keyword.Token, Whitespace, Keyword.Type, Whitespace, Name.Attribute, Text, Name.Keyword.Tokens, Whitespace, Operator)), - (r"(uniform){_WHITESPACE}{}(\s+){}(\s*)(=)".format( - _TYPE, _BASE_ATTRIBUTE, _WHITESPACE=_WHITESPACE), + (rf"(uniform){_WHITESPACE}{_TYPE}(\s+){_BASE_ATTRIBUTE}(\s*)(=)", bygroups(Keyword.Token, Whitespace, Keyword.Type, Whitespace, Name.Attribute, Text, Name.Keyword.Tokens, Whitespace, Operator)), - (r"{}{_WHITESPACE}{}(\s*)(=)".format( - _TYPE, _BASE_ATTRIBUTE, _WHITESPACE=_WHITESPACE), + (rf"{_TYPE}{_WHITESPACE}{_BASE_ATTRIBUTE}(\s*)(=)", bygroups(Keyword.Type, Whitespace, Name.Attribute, Text, Name.Keyword.Tokens, Whitespace, Operator)), ] + diff --git a/libs/pygments/lexers/varnish.py b/libs/pygments/lexers/varnish.py index 3c22792a8..db17d8006 100644 --- a/libs/pygments/lexers/varnish.py +++ b/libs/pygments/lexers/varnish.py @@ -4,7 +4,7 @@ Lexers for Varnish configuration - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,13 +19,13 @@ class VCLLexer(RegexLexer): """ For Varnish Configuration Language (VCL). - - .. versionadded:: 2.2 """ name = 'VCL' aliases = ['vcl'] filenames = ['*.vcl'] mimetypes = ['text/x-vclsrc'] + url = 'https://www.varnish-software.com/developers/tutorials/varnish-configuration-language-vcl' + version_added = '2.2' def analyse_text(text): # If the very first line is 'vcl 4.0;' it's pretty much guaranteed @@ -160,13 +160,13 @@ def analyse_text(text): class VCLSnippetLexer(VCLLexer): """ For Varnish Configuration Language snippets. - - .. versionadded:: 2.2 """ name = 'VCLSnippets' aliases = ['vclsnippets', 'vclsnippet'] mimetypes = ['text/x-vclsnippet'] filenames = [] + url = 'https://www.varnish-software.com/developers/tutorials/varnish-configuration-language-vcl' + version_added = '2.2' def analyse_text(text): # override method inherited from VCLLexer diff --git a/libs/pygments/lexers/verification.py b/libs/pygments/lexers/verification.py index 41d45d406..2d396b0e6 100644 --- a/libs/pygments/lexers/verification.py +++ b/libs/pygments/lexers/verification.py @@ -4,7 +4,7 @@ Lexer for Intermediate Verification Languages (IVLs). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,13 +18,12 @@ class BoogieLexer(RegexLexer): """ For Boogie source code. - - .. versionadded:: 2.1 """ name = 'Boogie' url = 'https://boogie-docs.readthedocs.io/en/latest/' aliases = ['boogie'] filenames = ['*.bpl'] + version_added = '2.1' tokens = { 'root': [ @@ -66,12 +65,12 @@ class BoogieLexer(RegexLexer): class SilverLexer(RegexLexer): """ For Silver source code. - - .. versionadded:: 2.2 """ name = 'Silver' aliases = ['silver'] filenames = ['*.sil', '*.vpr'] + url = 'https://github.com/viperproject/silver' + version_added = '2.2' tokens = { 'root': [ diff --git a/libs/pygments/lexers/verifpal.py b/libs/pygments/lexers/verifpal.py index 6953dd7b7..dad5cb545 100644 --- a/libs/pygments/lexers/verifpal.py +++ b/libs/pygments/lexers/verifpal.py @@ -4,7 +4,7 @@ Lexers for Verifpal languages. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,8 +18,6 @@ class VerifpalLexer(RegexLexer): """ For Verifpal code. - - .. versionadded:: 2.16 """ name = 'Verifpal' @@ -27,6 +25,7 @@ class VerifpalLexer(RegexLexer): filenames = ['*.vp'] mimetypes = ['text/x-verifpal'] url = 'https://verifpal.com' + version_added = '2.16' tokens = { 'root': [ diff --git a/libs/pygments/lexers/vip.py b/libs/pygments/lexers/vip.py index 1b25d5cab..cabb678b3 100644 --- a/libs/pygments/lexers/vip.py +++ b/libs/pygments/lexers/vip.py @@ -4,7 +4,7 @@ Lexers for Visual Prolog & Grammar files. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -85,13 +85,12 @@ class VisualPrologBaseLexer(RegexLexer): class VisualPrologLexer(VisualPrologBaseLexer): """Lexer for VisualProlog - - .. versionadded:: 2.17 """ name = 'Visual Prolog' url = 'https://www.visual-prolog.com/' aliases = ['visualprolog'] filenames = ['*.pro', '*.cl', '*.i', '*.pack', '*.ph'] + version_added = '2.17' majorkw = ('goal', 'namespace', 'interface', 'class', 'implement', 'where', 'open', 'inherits', 'supports', 'resolve', 'delegate', 'monitor', 'constants', 'domains', 'predicates', 'constructors', 'properties', 'clauses', 'facts') @@ -121,14 +120,13 @@ def analyse_text(text): class VisualPrologGrammarLexer(VisualPrologBaseLexer): """Lexer for VisualProlog grammar - - .. versionadded:: 2.17 """ name = 'Visual Prolog Grammar' url = 'https://www.visual-prolog.com/' aliases = ['visualprologgrammar'] filenames = ['*.vipgrm'] + version_added = '2.17' majorkw = ('open', 'namespace', 'grammar', 'nonterminals', 'startsymbols', 'terminals', 'rules', 'precedence') diff --git a/libs/pygments/lexers/vyper.py b/libs/pygments/lexers/vyper.py index ff9d0b044..415502890 100644 --- a/libs/pygments/lexers/vyper.py +++ b/libs/pygments/lexers/vyper.py @@ -4,7 +4,7 @@ Lexer for the Vyper Smart Contract language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,13 +17,12 @@ class VyperLexer(RegexLexer): """For the Vyper smart contract language. - - .. versionadded:: 2.17 """ name = 'Vyper' aliases = ['vyper'] filenames = ['*.vy'] url = "https://vyper.readthedocs.io" + version_added = '2.17' tokens = { 'root': [ diff --git a/libs/pygments/lexers/web.py b/libs/pygments/lexers/web.py index 9e5265316..1c052abef 100644 --- a/libs/pygments/lexers/web.py +++ b/libs/pygments/lexers/web.py @@ -4,10 +4,11 @@ Just export previously exported lexers. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +# ruff: noqa: F401 from pygments.lexers.html import HtmlLexer, DtdLexer, XmlLexer, XsltLexer, \ HamlLexer, ScamlLexer, JadeLexer from pygments.lexers.css import CssLexer, SassLexer, ScssLexer diff --git a/libs/pygments/lexers/webassembly.py b/libs/pygments/lexers/webassembly.py index f674eadc5..db3ce5e3f 100644 --- a/libs/pygments/lexers/webassembly.py +++ b/libs/pygments/lexers/webassembly.py @@ -8,7 +8,7 @@ and https://webassembly.github.io/spec/core/text/. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -63,14 +63,13 @@ class WatLexer(RegexLexer): """Lexer for the WebAssembly text format. - - .. versionadded:: 2.9 """ name = 'WebAssembly' url = 'https://webassembly.org/' aliases = ['wast', 'wat'] filenames = ['*.wat', '*.wast'] + version_added = '2.9' tokens = { 'root': [ diff --git a/libs/pygments/lexers/webidl.py b/libs/pygments/lexers/webidl.py index 5fcbe69c0..22a4d61dc 100644 --- a/libs/pygments/lexers/webidl.py +++ b/libs/pygments/lexers/webidl.py @@ -4,7 +4,7 @@ Lexers for Web IDL, including some extensions. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -39,14 +39,13 @@ class WebIDLLexer(RegexLexer): """ For Web IDL. - - .. versionadded:: 2.6 """ name = 'Web IDL' url = 'https://www.w3.org/wiki/Web_IDL' aliases = ['webidl'] filenames = ['*.webidl'] + version_added = '2.6' tokens = { 'common': [ diff --git a/libs/pygments/lexers/webmisc.py b/libs/pygments/lexers/webmisc.py index 787a8a6ec..815c7a313 100644 --- a/libs/pygments/lexers/webmisc.py +++ b/libs/pygments/lexers/webmisc.py @@ -4,7 +4,7 @@ Lexers for misc. web stuff. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,8 +26,6 @@ class DuelLexer(RegexLexer): """ Lexer for Duel Views Engine (formerly JBST) markup with JavaScript code blocks. - - .. versionadded:: 1.4 """ name = 'Duel' @@ -35,6 +33,7 @@ class DuelLexer(RegexLexer): aliases = ['duel', 'jbst', 'jsonml+bst'] filenames = ['*.duel', '*.jbst'] mimetypes = ['text/x-duel', 'text/x-jbst'] + version_added = '1.4' flags = re.DOTALL @@ -59,14 +58,13 @@ class XQueryLexer(ExtendedRegexLexer): """ An XQuery lexer, parsing a stream and outputting the tokens needed to highlight xquery code. - - .. versionadded:: 1.4 """ name = 'XQuery' url = 'https://www.w3.org/XML/Query/' aliases = ['xquery', 'xqy', 'xq', 'xql', 'xqm'] filenames = ['*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm'] mimetypes = ['text/xquery', 'application/xquery'] + version_added = '1.4' xquery_parse_state = [] @@ -82,13 +80,13 @@ class XQueryLexer(ExtendedRegexLexer): # ncnamechar = ncnamestartchar + (r"|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|" # r"[\u203F-\u2040]") ncnamechar = r"(?:" + ncnamestartchar + r"|-|\.|[0-9])" - ncname = "(?:%s+%s*)" % (ncnamestartchar, ncnamechar) + ncname = f"(?:{ncnamestartchar}+{ncnamechar}*)" pitarget_namestartchar = r"(?:[A-KN-WYZ]|_|:|[a-kn-wyz])" pitarget_namechar = r"(?:" + pitarget_namestartchar + r"|-|\.|[0-9])" - pitarget = "%s+%s*" % (pitarget_namestartchar, pitarget_namechar) - prefixedname = "%s:%s" % (ncname, ncname) + pitarget = f"{pitarget_namestartchar}+{pitarget_namechar}*" + prefixedname = f"{ncname}:{ncname}" unprefixedname = ncname - qname = "(?:%s|%s)" % (prefixedname, unprefixedname) + qname = f"(?:{prefixedname}|{unprefixedname})" entityref = r'(?:&(?:lt|gt|amp|quot|apos|nbsp);)' charref = r'(?:&#[0-9]+;|&#x[0-9a-fA-F]+;)' @@ -813,8 +811,6 @@ def pushstate_operator_attribute_callback(lexer, match, ctx): class QmlLexer(RegexLexer): """ For QML files. - - .. versionadded:: 1.6 """ # QML is based on javascript, so much of this is taken from the @@ -825,6 +821,7 @@ class QmlLexer(RegexLexer): aliases = ['qml', 'qbs'] filenames = ['*.qml', '*.qbs'] mimetypes = ['application/x-qml', 'application/x-qt.qbs+qml'] + version_added = '1.6' # pasted from JavascriptLexer, with some additions flags = re.DOTALL | re.MULTILINE @@ -891,8 +888,6 @@ class CirruLexer(RegexLexer): * using ``$`` as folding operator * using ``,`` as unfolding operator * using indentations for nested blocks - - .. versionadded:: 2.0 """ name = 'Cirru' @@ -900,6 +895,7 @@ class CirruLexer(RegexLexer): aliases = ['cirru'] filenames = ['*.cirru'] mimetypes = ['text/x-cirru'] + version_added = '2.0' flags = re.MULTILINE tokens = { @@ -940,14 +936,14 @@ class CirruLexer(RegexLexer): class SlimLexer(ExtendedRegexLexer): """ For Slim markup. - - .. versionadded:: 2.0 """ name = 'Slim' aliases = ['slim'] filenames = ['*.slim'] mimetypes = ['text/x-slim'] + url = 'https://slim-template.github.io' + version_added = '2.0' flags = re.IGNORECASE _dot = r'(?: \|\n(?=.* \|)|.)' diff --git a/libs/pygments/lexers/wgsl.py b/libs/pygments/lexers/wgsl.py index f23342155..145e0c0b3 100644 --- a/libs/pygments/lexers/wgsl.py +++ b/libs/pygments/lexers/wgsl.py @@ -4,11 +4,11 @@ Lexer for the WebGPU Shading Language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ -from pygments.lexer import RegexLexer, include, bygroups, words, default +from pygments.lexer import RegexLexer, include, words, default from pygments.token import Comment, Operator, Keyword, Name, \ Number, Punctuation, Whitespace from pygments import unistring as uni @@ -27,20 +27,19 @@ LineEndRE = '[' + "".join(LineEndCodePoints) + ']' # https://www.w3.org/TR/WGSL/#syntax-ident_pattern_token -ident_pattern_token = '([{}][{}]+)|[{}]'.format(uni.xid_start,uni.xid_continue,uni.xid_start) +ident_pattern_token = f'([{uni.xid_start}][{uni.xid_continue}]+)|[{uni.xid_start}]' class WgslLexer(RegexLexer): """ Lexer for the WebGPU Shading Language. - - .. versionadded:: 2.15 """ name = 'WebGPU Shading Language' url = 'https://www.w3.org/TR/WGSL/' aliases = ['wgsl'] filenames = ['*.wgsl'] mimetypes = ['text/wgsl'] + version_added = '2.15' # https://www.w3.org/TR/WGSL/#var-and-value keyword_decl = (words('var let const override'.split(),suffix=r'\b'), Keyword.Declaration) @@ -323,8 +322,8 @@ class WgslLexer(RegexLexer): 'comments': [ # Line ending comments # Match up CR/LF pair first. - (r'//{}*{}{}'.format(NotLineEndRE,CR,LF), Comment.Single), - (r'//{}*{}'.format(NotLineEndRE,LineEndRE), Comment.Single), + (rf'//{NotLineEndRE}*{CR}{LF}', Comment.Single), + (rf'//{NotLineEndRE}*{LineEndRE}', Comment.Single), (r'/\*', Comment.Multiline, 'block_comment'), ], 'attribute': [ diff --git a/libs/pygments/lexers/whiley.py b/libs/pygments/lexers/whiley.py index bf707d25c..d6e2ea27c 100644 --- a/libs/pygments/lexers/whiley.py +++ b/libs/pygments/lexers/whiley.py @@ -4,7 +4,7 @@ Lexers for the Whiley language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,14 +18,13 @@ class WhileyLexer(RegexLexer): """ Lexer for the Whiley programming language. - - .. versionadded:: 2.2 """ name = 'Whiley' url = 'http://whiley.org/' filenames = ['*.whiley'] aliases = ['whiley'] mimetypes = ['text/x-whiley'] + version_added = '2.2' # See the language specification: # http://whiley.org/download/WhileyLanguageSpec.pdf diff --git a/libs/pygments/lexers/wowtoc.py b/libs/pygments/lexers/wowtoc.py index 6b96e65bd..60abb83ef 100644 --- a/libs/pygments/lexers/wowtoc.py +++ b/libs/pygments/lexers/wowtoc.py @@ -6,7 +6,7 @@ TOC files describe game addons. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -46,13 +46,13 @@ def _create_tag_line_token(inner_pattern, inner_token, ignore_case=False): class WoWTocLexer(RegexLexer): """ Lexer for World of Warcraft TOC files. - - .. versionadded:: 2.14 """ name = "World of Warcraft TOC" aliases = ["wowtoc"] filenames = ["*.toc"] + url = 'https://wowpedia.fandom.com/wiki/TOC_format' + version_added = '2.14' tokens = { "root": [ diff --git a/libs/pygments/lexers/wren.py b/libs/pygments/lexers/wren.py index ed4ddc7ad..4dc521874 100644 --- a/libs/pygments/lexers/wren.py +++ b/libs/pygments/lexers/wren.py @@ -4,7 +4,7 @@ Lexer for Wren. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -12,20 +12,19 @@ from pygments.lexer import include, RegexLexer, words from pygments.token import Whitespace, Punctuation, Keyword, Name, Comment, \ - Operator, Number, String, Error + Operator, Number, String __all__ = ['WrenLexer'] class WrenLexer(RegexLexer): """ For Wren source code, version 0.4.0. - - .. versionadded:: 2.14.0 """ name = 'Wren' url = 'https://wren.io' aliases = ['wren'] filenames = ['*.wren'] + version_added = '2.14' flags = re.MULTILINE | re.DOTALL diff --git a/libs/pygments/lexers/x10.py b/libs/pygments/lexers/x10.py index c125b530d..638808aa5 100644 --- a/libs/pygments/lexers/x10.py +++ b/libs/pygments/lexers/x10.py @@ -4,7 +4,7 @@ Lexers for the X10 programming language. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,8 +17,6 @@ class X10Lexer(RegexLexer): """ For the X10 language. - - .. versionadded:: 2.2 """ name = 'X10' @@ -26,6 +24,7 @@ class X10Lexer(RegexLexer): aliases = ['x10', 'xten'] filenames = ['*.x10'] mimetypes = ['text/x-x10'] + version_added = '2.2' keywords = ( 'as', 'assert', 'async', 'at', 'athome', 'ateach', 'atomic', @@ -56,10 +55,10 @@ class X10Lexer(RegexLexer): (r'[^\S\n]+', Text), (r'//.*?\n', Comment.Single), (r'/\*(.|\n)*?\*/', Comment.Multiline), - (r'\b(%s)\b' % '|'.join(keywords), Keyword), - (r'\b(%s)\b' % '|'.join(types), Keyword.Type), - (r'\b(%s)\b' % '|'.join(values), Keyword.Constant), - (r'\b(%s)\b' % '|'.join(modifiers), Keyword.Declaration), + (r'\b({})\b'.format('|'.join(keywords)), Keyword), + (r'\b({})\b'.format('|'.join(types)), Keyword.Type), + (r'\b({})\b'.format('|'.join(values)), Keyword.Constant), + (r'\b({})\b'.format('|'.join(modifiers)), Keyword.Declaration), (r'"(\\\\|\\[^\\]|[^"\\])*"', String), (r"'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'", String.Char), (r'.', Text) diff --git a/libs/pygments/lexers/xorg.py b/libs/pygments/lexers/xorg.py index 67878c3f6..a57bd130f 100644 --- a/libs/pygments/lexers/xorg.py +++ b/libs/pygments/lexers/xorg.py @@ -4,7 +4,7 @@ Lexers for Xorg configs. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,6 +21,7 @@ class XorgLexer(RegexLexer): aliases = ['xorg.conf'] filenames = ['xorg.conf'] mimetypes = [] + version_added = '' tokens = { 'root': [ diff --git a/libs/pygments/lexers/yang.py b/libs/pygments/lexers/yang.py index 866c01d27..624ebf5ad 100644 --- a/libs/pygments/lexers/yang.py +++ b/libs/pygments/lexers/yang.py @@ -4,7 +4,7 @@ Lexer for the YANG 1.1 modeling language. See :rfc:`7950`. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -17,14 +17,13 @@ class YangLexer(RegexLexer): """ Lexer for YANG, based on RFC7950. - - .. versionadded:: 2.7 """ name = 'YANG' url = 'https://tools.ietf.org/html/rfc7950/' aliases = ['yang'] filenames = ['*.yang'] mimetypes = ['application/yang'] + version_added = '2.7' #Keywords from RFC7950 ; oriented at BNF style TOP_STMTS_KEYWORDS = ("module", "submodule") diff --git a/libs/pygments/lexers/yara.py b/libs/pygments/lexers/yara.py index 1a84e4a78..f0445d88f 100644 --- a/libs/pygments/lexers/yara.py +++ b/libs/pygments/lexers/yara.py @@ -4,7 +4,7 @@ Lexers for YARA. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -18,8 +18,6 @@ class YaraLexer(RegexLexer): """ For YARA rules - - .. versionadded:: 2.16 """ name = 'YARA' @@ -27,6 +25,7 @@ class YaraLexer(RegexLexer): aliases = ['yara', 'yar'] filenames = ['*.yar'] mimetypes = ['text/x-yara'] + version_added = '2.16' tokens = { 'root': [ diff --git a/libs/pygments/lexers/zig.py b/libs/pygments/lexers/zig.py index fad3b79d9..86b4adc9c 100644 --- a/libs/pygments/lexers/zig.py +++ b/libs/pygments/lexers/zig.py @@ -4,7 +4,7 @@ Lexers for Zig. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,7 @@ class ZigLexer(RegexLexer): aliases = ['zig'] filenames = ['*.zig'] mimetypes = ['text/zig'] + version_added = '' type_keywords = ( words(('bool', 'f16', 'f32', 'f64', 'f128', 'void', 'noreturn', 'type', diff --git a/libs/pygments/modeline.py b/libs/pygments/modeline.py index 7b6f6a324..e4d9fe167 100644 --- a/libs/pygments/modeline.py +++ b/libs/pygments/modeline.py @@ -4,7 +4,7 @@ A simple modeline parser (based on pymodeline). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -19,7 +19,7 @@ ''', re.VERBOSE) -def get_filetype_from_line(l): +def get_filetype_from_line(l): # noqa: E741 m = modeline_re.search(l) if m: return m.group(1) @@ -30,8 +30,8 @@ def get_filetype_from_buffer(buf, max_lines=5): Scan the buffer for modelines and return filetype if one is found. """ lines = buf.splitlines() - for l in lines[-1:-max_lines-1:-1]: - ret = get_filetype_from_line(l) + for line in lines[-1:-max_lines-1:-1]: + ret = get_filetype_from_line(line) if ret: return ret for i in range(max_lines, -1, -1): diff --git a/libs/pygments/plugin.py b/libs/pygments/plugin.py index 0de47bace..2e462f2c2 100644 --- a/libs/pygments/plugin.py +++ b/libs/pygments/plugin.py @@ -2,12 +2,7 @@ pygments.plugin ~~~~~~~~~~~~~~~ - Pygments plugin interface. By default, this tries to use - ``importlib.metadata``, which is in the Python standard - library since Python 3.8, or its ``importlib_metadata`` - backport for earlier versions of Python. It falls back on - ``pkg_resources`` if not found. Finally, if ``pkg_resources`` - is not found either, no plugins are loaded at all. + Pygments plugin interface. lexer plugins:: @@ -34,9 +29,10 @@ yourfilter = yourfilter:YourFilter - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +from importlib.metadata import entry_points LEXER_ENTRY_POINT = 'pygments.lexers' FORMATTER_ENTRY_POINT = 'pygments.formatters' @@ -45,18 +41,6 @@ def iter_entry_points(group_name): - try: - from importlib.metadata import entry_points - except ImportError: - try: - from importlib_metadata import entry_points - except ImportError: - try: - from pkg_resources import iter_entry_points - except (ImportError, OSError): - return [] - else: - return iter_entry_points(group_name) groups = entry_points() if hasattr(groups, 'select'): # New interface in Python 3.10 and newer versions of the diff --git a/libs/pygments/regexopt.py b/libs/pygments/regexopt.py index 45223eccc..c44eedbf2 100644 --- a/libs/pygments/regexopt.py +++ b/libs/pygments/regexopt.py @@ -5,7 +5,7 @@ An algorithm that generates optimized regexes for matching long lists of literal strings. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/scanner.py b/libs/pygments/scanner.py index 32a2f3032..112da3491 100644 --- a/libs/pygments/scanner.py +++ b/libs/pygments/scanner.py @@ -11,7 +11,7 @@ Have a look at the `DelphiLexer` to get an idea of how to use this scanner. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re diff --git a/libs/pygments/sphinxext.py b/libs/pygments/sphinxext.py index f935688f1..a742897c0 100644 --- a/libs/pygments/sphinxext.py +++ b/libs/pygments/sphinxext.py @@ -5,7 +5,7 @@ Sphinx extension to generate automatic documentation of lexers, formatters and filters. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -33,6 +33,8 @@ %s + %s + ''' FMTERDOC = ''' @@ -119,11 +121,11 @@ def format_link(name, url): def write_row(*columns): """Format a table row""" out = [] - for l, c in zip(column_lengths, columns): - if c: - out.append(c.ljust(l)) + for length, col in zip(column_lengths, columns): + if col: + out.append(col.ljust(length)) else: - out.append(' '*l) + out.append(' '*length) return ' '.join(out) @@ -160,7 +162,7 @@ def document_lexers(self): self.filenames.add(mod.__file__) cls = getattr(mod, classname) if not cls.__doc__: - print("Warning: %s does not have a docstring." % classname) + print(f"Warning: {classname} does not have a docstring.") docstring = cls.__doc__ if isinstance(docstring, bytes): docstring = docstring.decode('utf8') @@ -182,12 +184,18 @@ def document_lexers(self): for line in content.splitlines(): docstring += f' {line}\n' + if cls.version_added: + version_line = f'.. versionadded:: {cls.version_added}' + else: + version_line = '' + modules.setdefault(module, []).append(( classname, ', '.join(data[2]) or 'None', ', '.join(data[3]).replace('*', '\\*').replace('_', '\\') or 'None', ', '.join(data[4]) or 'None', - docstring)) + docstring, + version_line)) if module not in moduledocstrings: moddoc = mod.__doc__ if isinstance(moddoc, bytes): @@ -196,7 +204,7 @@ def document_lexers(self): for module, lexers in sorted(modules.items(), key=lambda x: x[0]): if moduledocstrings[module] is None: - raise Exception("Missing docstring for %s" % (module,)) + raise Exception(f"Missing docstring for {module}") heading = moduledocstrings[module].splitlines()[4].strip().rstrip('.') out.append(MODULEDOC % (module, heading, '-'*len(heading))) for data in lexers: diff --git a/libs/pygments/style.py b/libs/pygments/style.py index 96eb92c2b..449522c5a 100644 --- a/libs/pygments/style.py +++ b/libs/pygments/style.py @@ -4,7 +4,7 @@ Basic style object. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -76,7 +76,7 @@ def colorformat(text): return '' elif text.startswith('var') or text.startswith('calc'): return text - assert False, "wrong color format %r" % text + assert False, f"wrong color format {text!r}" _styles = obj._styles = {} diff --git a/libs/pygments/styles/__init__.py b/libs/pygments/styles/__init__.py index 75ac30bb9..d80f2a399 100644 --- a/libs/pygments/styles/__init__.py +++ b/libs/pygments/styles/__init__.py @@ -4,7 +4,7 @@ Contains built-in styles. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -44,13 +44,13 @@ def get_style_by_name(name): try: mod = __import__(mod, None, None, [cls]) except ImportError: - raise ClassNotFound("Could not find style module %r" % mod + + raise ClassNotFound(f"Could not find style module {mod!r}" + (builtin and ", though it should be builtin") + ".") try: return getattr(mod, cls) except AttributeError: - raise ClassNotFound("Could not find style class %r in style module." % cls) + raise ClassNotFound(f"Could not find style class {cls!r} in style module.") def get_all_styles(): diff --git a/libs/pygments/styles/_mapping.py b/libs/pygments/styles/_mapping.py index 04c7ddfbb..49a7fae92 100644 --- a/libs/pygments/styles/_mapping.py +++ b/libs/pygments/styles/_mapping.py @@ -9,6 +9,7 @@ 'AutumnStyle': ('pygments.styles.autumn', 'autumn', ()), 'BlackWhiteStyle': ('pygments.styles.bw', 'bw', ()), 'BorlandStyle': ('pygments.styles.borland', 'borland', ()), + 'CoffeeStyle': ('pygments.styles.coffee', 'coffee', ()), 'ColorfulStyle': ('pygments.styles.colorful', 'colorful', ()), 'DefaultStyle': ('pygments.styles.default', 'default', ()), 'DraculaStyle': ('pygments.styles.dracula', 'dracula', ()), diff --git a/libs/pygments/styles/abap.py b/libs/pygments/styles/abap.py index ab322df9c..9438cf6e3 100644 --- a/libs/pygments/styles/abap.py +++ b/libs/pygments/styles/abap.py @@ -4,7 +4,7 @@ ABAP workbench like style. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/algol.py b/libs/pygments/styles/algol.py index 83319e0ab..e54e4b125 100644 --- a/libs/pygments/styles/algol.py +++ b/libs/pygments/styles/algol.py @@ -25,7 +25,7 @@ [1] `Revised Report on the Algorithmic Language Algol-60 <http://www.masswerk.at/algol60/report.htm>` - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/algol_nu.py b/libs/pygments/styles/algol_nu.py index de1434dc8..d786a842f 100644 --- a/libs/pygments/styles/algol_nu.py +++ b/libs/pygments/styles/algol_nu.py @@ -25,7 +25,7 @@ [1] `Revised Report on the Algorithmic Language Algol-60 <http://www.masswerk.at/algol60/report.htm>` - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/arduino.py b/libs/pygments/styles/arduino.py index 8655b0371..3aa6d1241 100644 --- a/libs/pygments/styles/arduino.py +++ b/libs/pygments/styles/arduino.py @@ -4,7 +4,7 @@ Arduino® Syntax highlighting style. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/autumn.py b/libs/pygments/styles/autumn.py index ccbb5fe77..5ba15a78b 100644 --- a/libs/pygments/styles/autumn.py +++ b/libs/pygments/styles/autumn.py @@ -4,7 +4,7 @@ A colorful style, inspired by the terminal highlighting style. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/borland.py b/libs/pygments/styles/borland.py index 82c00ae13..6bcc6fb37 100644 --- a/libs/pygments/styles/borland.py +++ b/libs/pygments/styles/borland.py @@ -4,7 +4,7 @@ Style similar to the style used in the Borland IDEs. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/bw.py b/libs/pygments/styles/bw.py index 3ba00925f..aadcf5dfd 100644 --- a/libs/pygments/styles/bw.py +++ b/libs/pygments/styles/bw.py @@ -4,7 +4,7 @@ Simple black/white only style. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/coffee.py b/libs/pygments/styles/coffee.py new file mode 100644 index 000000000..bb4055c53 --- /dev/null +++ b/libs/pygments/styles/coffee.py @@ -0,0 +1,80 @@ +""" + pygments.styles.coffee + ~~~~~~~~~~~~~~~~~~~~~~ + + A warm and cozy theme based off gruvbox + + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.style import Style +from pygments.token import (Comment, Error, Generic, Keyword, Literal, Name, + Number, Operator, Punctuation, String, Token) + +__all__ = ["CoffeeStyle"] + + +class CoffeeStyle(Style): + """ + A warm and cozy theme based off gruvbox + """ + + name = "coffee" + + background_color = "#262220" + highlight_color = "#ddd0c0" + + line_number_color = "#4e4e4e" + line_number_special_color = "#8f9494" + + styles = { + Comment: "#70757A", + Comment.Hashbang: "#8f9f9f", + Comment.Preproc: "#fdd0c0", + Comment.PreprocFile: "#c9b98f", + Comment.Special: "#af5f5f", + Error: "#af5f5f", + Generic.Deleted: "#bb6868", + Generic.Emph: "italic", + Generic.Error: "#af5f5f", + Generic.Inserted: "#849155", + Generic.Output: "#ddd0c0", + Generic.Strong: "bold", + Generic.Traceback: "#af5f5f", + Keyword: "#919191", + Keyword.Constant: "#875f5f", + Keyword.Declaration: "#875f5f", + Keyword.Namespace: "#875f5f", + Keyword.Reserved: "#b46276", + Keyword.Type: "#af875f", + Literal: "#af875f", + Name: "#ddd0c0", + Name.Attribute: "#ddd0c0", + Name.Builtin: "#ddd0c0", + Name.Builtin.Pseudo: "#87afaf", + Name.Class: "#875f5f", + Name.Constant: "#af8787", + Name.Decorator: "#fdd0c0", + Name.Entity: "#ddd0c0", + Name.Exception: "#877575", + Name.Function: "#fdd0c0", + Name.Function.Magic: "#fdd0c0", + Name.Other: "#ddd0c0", + Name.Property: "#dfaf87", + Name.Tag: "#87afaf", + Name.Variable: "#ddd0c0", + Number: "#87afaf", + Operator: "#878787", + Operator.Word: "#878787", + Punctuation: "#ddd0c0", + String: "#c9b98f", + String.Affix: "#dfaf87", + String.Doc: "#878787", + String.Escape: "#af5f5f", + String.Interpol: "#af5f5f", + String.Other: "#fdd0c0", + String.Regex: "#af5f5f", + String.Symbol: "#af5f5f", + Token: "#ddd0c0", + } diff --git a/libs/pygments/styles/colorful.py b/libs/pygments/styles/colorful.py index 661a9e446..a9656bdf0 100644 --- a/libs/pygments/styles/colorful.py +++ b/libs/pygments/styles/colorful.py @@ -4,7 +4,7 @@ A colorful style, inspired by CodeRay. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/default.py b/libs/pygments/styles/default.py index f4e5b7b26..a46d8e1e3 100644 --- a/libs/pygments/styles/default.py +++ b/libs/pygments/styles/default.py @@ -4,7 +4,7 @@ The default highlighting style. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/dracula.py b/libs/pygments/styles/dracula.py index d7043c007..71ecff267 100644 --- a/libs/pygments/styles/dracula.py +++ b/libs/pygments/styles/dracula.py @@ -7,7 +7,7 @@ Based on the Dracula Theme for pygments by Chris Bracco. See https://github.com/dracula/pygments/tree/fee9ed5613d1086bc01b9d0a5a0e9867a009f571 - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/emacs.py b/libs/pygments/styles/emacs.py index fad91a134..6d67492a8 100644 --- a/libs/pygments/styles/emacs.py +++ b/libs/pygments/styles/emacs.py @@ -4,7 +4,7 @@ A highlighting style for Pygments, inspired by Emacs. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/friendly.py b/libs/pygments/styles/friendly.py index 8de4fcc1e..ba5759b61 100644 --- a/libs/pygments/styles/friendly.py +++ b/libs/pygments/styles/friendly.py @@ -4,7 +4,7 @@ A modern style based on the VIM pyte theme. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/friendly_grayscale.py b/libs/pygments/styles/friendly_grayscale.py index e7d3ed47e..c2acdeb2c 100644 --- a/libs/pygments/styles/friendly_grayscale.py +++ b/libs/pygments/styles/friendly_grayscale.py @@ -7,7 +7,7 @@ using the luminosity value calculated by http://www.workwithcolor.com/color-converter-01.htm - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/fruity.py b/libs/pygments/styles/fruity.py index b23257d19..5d9b67b65 100644 --- a/libs/pygments/styles/fruity.py +++ b/libs/pygments/styles/fruity.py @@ -4,7 +4,7 @@ pygments version of my "fruity" vim theme. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/gh_dark.py b/libs/pygments/styles/gh_dark.py index 95f8e803d..4bed6d2c7 100644 --- a/libs/pygments/styles/gh_dark.py +++ b/libs/pygments/styles/gh_dark.py @@ -5,7 +5,7 @@ Github's Dark-Colorscheme based theme for Pygments Colors extracted from https://github.com/primer/primitives - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/gruvbox.py b/libs/pygments/styles/gruvbox.py index c05f3140b..97bd511e3 100644 --- a/libs/pygments/styles/gruvbox.py +++ b/libs/pygments/styles/gruvbox.py @@ -5,7 +5,7 @@ pygments version of the "gruvbox" vim theme. https://github.com/morhetz/gruvbox - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/igor.py b/libs/pygments/styles/igor.py index 797e3675c..48f76e04e 100644 --- a/libs/pygments/styles/igor.py +++ b/libs/pygments/styles/igor.py @@ -4,7 +4,7 @@ Igor Pro default style. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/inkpot.py b/libs/pygments/styles/inkpot.py index 817d97f09..b6f93014f 100644 --- a/libs/pygments/styles/inkpot.py +++ b/libs/pygments/styles/inkpot.py @@ -4,7 +4,7 @@ A highlighting style for Pygments, inspired by the Inkpot theme for VIM. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/lightbulb.py b/libs/pygments/styles/lightbulb.py index 25c4b1559..4e5658a9f 100644 --- a/libs/pygments/styles/lightbulb.py +++ b/libs/pygments/styles/lightbulb.py @@ -4,7 +4,7 @@ A minimal dark theme based on the Lightbulb theme for VSCode. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/lilypond.py b/libs/pygments/styles/lilypond.py index 1218ec9d3..5e46f3dc6 100644 --- a/libs/pygments/styles/lilypond.py +++ b/libs/pygments/styles/lilypond.py @@ -4,7 +4,7 @@ LilyPond-specific style. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/lovelace.py b/libs/pygments/styles/lovelace.py index 279ff0793..1fdb14905 100644 --- a/libs/pygments/styles/lovelace.py +++ b/libs/pygments/styles/lovelace.py @@ -8,7 +8,7 @@ A desaturated, somewhat subdued style created for the Lovelace interactive learning environment. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/manni.py b/libs/pygments/styles/manni.py index 1eb0e6986..f39810b68 100644 --- a/libs/pygments/styles/manni.py +++ b/libs/pygments/styles/manni.py @@ -7,7 +7,7 @@ This is a port of the style used in the `php port`_ of pygments by Manni. The style is called 'default' there. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/material.py b/libs/pygments/styles/material.py index db0952d20..720b403b0 100644 --- a/libs/pygments/styles/material.py +++ b/libs/pygments/styles/material.py @@ -6,7 +6,7 @@ https://github.com/material-theme/vsc-material-theme - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/monokai.py b/libs/pygments/styles/monokai.py index 2ae51bcdf..fb6b1ebf8 100644 --- a/libs/pygments/styles/monokai.py +++ b/libs/pygments/styles/monokai.py @@ -6,7 +6,7 @@ http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/ - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/murphy.py b/libs/pygments/styles/murphy.py index 0c5cc6df6..0d9128ce9 100644 --- a/libs/pygments/styles/murphy.py +++ b/libs/pygments/styles/murphy.py @@ -4,7 +4,7 @@ Murphy's style from CodeRay. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/native.py b/libs/pygments/styles/native.py index 11f83db4b..d76360c5d 100644 --- a/libs/pygments/styles/native.py +++ b/libs/pygments/styles/native.py @@ -4,7 +4,7 @@ pygments version of my "native" vim theme. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -56,15 +56,15 @@ class NativeStyle(Style): Generic.Heading: 'bold #ffffff', Generic.Subheading: 'underline #ffffff', - Generic.Deleted: '#d22323', + Generic.Deleted: '#ff3a3a', Generic.Inserted: '#589819', - Generic.Error: '#d22323', + Generic.Error: '#ff3a3a', Generic.Emph: 'italic', Generic.Strong: 'bold', Generic.EmphStrong: 'bold italic', Generic.Prompt: '#aaaaaa', Generic.Output: '#cccccc', - Generic.Traceback: '#d22323', + Generic.Traceback: '#ff3a3a', Error: 'bg:#e3d2d2 #a61717' } diff --git a/libs/pygments/styles/nord.py b/libs/pygments/styles/nord.py index e5cff2452..c208335d3 100644 --- a/libs/pygments/styles/nord.py +++ b/libs/pygments/styles/nord.py @@ -5,7 +5,7 @@ pygments version of the "nord" theme by Arctic Ice Studio https://www.nordtheme.com/ - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/onedark.py b/libs/pygments/styles/onedark.py index b145ce91e..335135485 100644 --- a/libs/pygments/styles/onedark.py +++ b/libs/pygments/styles/onedark.py @@ -7,7 +7,7 @@ Inspired by one-dark-ui for the code editor Atom (https://atom.io/themes/one-dark-ui). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/paraiso_dark.py b/libs/pygments/styles/paraiso_dark.py index 8cc231f31..88968bff8 100644 --- a/libs/pygments/styles/paraiso_dark.py +++ b/libs/pygments/styles/paraiso_dark.py @@ -8,7 +8,7 @@ Created with Base16 Builder by Chris Kempson (https://github.com/chriskempson/base16-builder). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/paraiso_light.py b/libs/pygments/styles/paraiso_light.py index ac76badbf..35e2c2d13 100644 --- a/libs/pygments/styles/paraiso_light.py +++ b/libs/pygments/styles/paraiso_light.py @@ -8,7 +8,7 @@ Created with Base16 Builder by Chris Kempson (https://github.com/chriskempson/base16-builder). - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/pastie.py b/libs/pygments/styles/pastie.py index 2892660bf..844f539ef 100644 --- a/libs/pygments/styles/pastie.py +++ b/libs/pygments/styles/pastie.py @@ -6,7 +6,7 @@ .. _pastie: http://pastie.caboo.se/ - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/perldoc.py b/libs/pygments/styles/perldoc.py index 071821bb1..3fe361713 100644 --- a/libs/pygments/styles/perldoc.py +++ b/libs/pygments/styles/perldoc.py @@ -6,7 +6,7 @@ .. _perldoc: http://perldoc.perl.org/ - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/rainbow_dash.py b/libs/pygments/styles/rainbow_dash.py index 82bfed548..aa9e445bc 100644 --- a/libs/pygments/styles/rainbow_dash.py +++ b/libs/pygments/styles/rainbow_dash.py @@ -6,7 +6,7 @@ .. _theme: http://sanssecours.github.io/Rainbow-Dash.tmbundle - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -46,48 +46,48 @@ class RainbowDashStyle(Style): background_color = WHITE styles = { - Comment: 'italic {}'.format(BLUE_LIGHT), + Comment: f'italic {BLUE_LIGHT}', Comment.Preproc: 'noitalic', Comment.Special: 'bold', - Error: 'bg:{} {}'.format(RED, WHITE), + Error: f'bg:{RED} {WHITE}', - Generic.Deleted: 'border:{} bg:{}'.format(RED_DARK, RED_LIGHT), + Generic.Deleted: f'border:{RED_DARK} bg:{RED_LIGHT}', Generic.Emph: 'italic', Generic.Error: RED_BRIGHT, - Generic.Heading: 'bold {}'.format(BLUE), - Generic.Inserted: 'border:{} bg:{}'.format(GREEN_NEON, GREEN_LIGHT), + Generic.Heading: f'bold {BLUE}', + Generic.Inserted: f'border:{GREEN_NEON} bg:{GREEN_LIGHT}', Generic.Output: GREY, - Generic.Prompt: 'bold {}'.format(BLUE), + Generic.Prompt: f'bold {BLUE}', Generic.Strong: 'bold', Generic.EmphStrong: 'bold italic', - Generic.Subheading: 'bold {}'.format(BLUE), + Generic.Subheading: f'bold {BLUE}', Generic.Traceback: RED_DARK, - Keyword: 'bold {}'.format(BLUE), + Keyword: f'bold {BLUE}', Keyword.Pseudo: 'nobold', Keyword.Type: PURPLE, - Name.Attribute: 'italic {}'.format(BLUE), - Name.Builtin: 'bold {}'.format(PURPLE), + Name.Attribute: f'italic {BLUE}', + Name.Builtin: f'bold {PURPLE}', Name.Class: 'underline', Name.Constant: TURQUOISE, - Name.Decorator: 'bold {}'.format(ORANGE), - Name.Entity: 'bold {}'.format(PURPLE), - Name.Exception: 'bold {}'.format(PURPLE), - Name.Function: 'bold {}'.format(ORANGE), - Name.Tag: 'bold {}'.format(BLUE), + Name.Decorator: f'bold {ORANGE}', + Name.Entity: f'bold {PURPLE}', + Name.Exception: f'bold {PURPLE}', + Name.Function: f'bold {ORANGE}', + Name.Tag: f'bold {BLUE}', - Number: 'bold {}'.format(PURPLE), + Number: f'bold {PURPLE}', Operator: BLUE, Operator.Word: 'bold', String: GREEN, String.Doc: 'italic', - String.Escape: 'bold {}'.format(RED_DARK), + String.Escape: f'bold {RED_DARK}', String.Other: TURQUOISE, - String.Symbol: 'bold {}'.format(RED_DARK), + String.Symbol: f'bold {RED_DARK}', Text: GREY_DARK, diff --git a/libs/pygments/styles/rrt.py b/libs/pygments/styles/rrt.py index 3376d581d..4aa23304f 100644 --- a/libs/pygments/styles/rrt.py +++ b/libs/pygments/styles/rrt.py @@ -4,7 +4,7 @@ pygments "rrt" theme, based on Zap and Emacs defaults. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/sas.py b/libs/pygments/styles/sas.py index 4d19b224c..faee0ec10 100644 --- a/libs/pygments/styles/sas.py +++ b/libs/pygments/styles/sas.py @@ -6,7 +6,7 @@ meant to be a complete style. It's merely meant to mimic SAS' program editor syntax highlighting. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/solarized.py b/libs/pygments/styles/solarized.py index 6a1f81240..214a491c7 100644 --- a/libs/pygments/styles/solarized.py +++ b/libs/pygments/styles/solarized.py @@ -7,7 +7,7 @@ A Pygments style for the Solarized themes (licensed under MIT). See: https://github.com/altercation/solarized - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/staroffice.py b/libs/pygments/styles/staroffice.py index b2cfba9fb..dfe2dc0f4 100644 --- a/libs/pygments/styles/staroffice.py +++ b/libs/pygments/styles/staroffice.py @@ -4,7 +4,7 @@ Style similar to StarOffice style, also in OpenOffice and LibreOffice. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/stata_dark.py b/libs/pygments/styles/stata_dark.py index c2d0f1924..f6b9decbf 100644 --- a/libs/pygments/styles/stata_dark.py +++ b/libs/pygments/styles/stata_dark.py @@ -6,7 +6,7 @@ meant to be a complete style, just for Stata's file formats. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/stata_light.py b/libs/pygments/styles/stata_light.py index 5e034568c..a5bd1fe31 100644 --- a/libs/pygments/styles/stata_light.py +++ b/libs/pygments/styles/stata_light.py @@ -5,7 +5,7 @@ Light Style inspired by Stata's do-file editor. Note this is not meant to be a complete style, just for Stata's file formats. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/tango.py b/libs/pygments/styles/tango.py index 787a69785..fcbab7b37 100644 --- a/libs/pygments/styles/tango.py +++ b/libs/pygments/styles/tango.py @@ -32,7 +32,7 @@ have been chosen to have the same style. Similarly, keywords (Keyword.*), and Operator.Word (and, or, in) have been assigned the same style. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/trac.py b/libs/pygments/styles/trac.py index 5f5c319ab..44dc8cc2d 100644 --- a/libs/pygments/styles/trac.py +++ b/libs/pygments/styles/trac.py @@ -4,7 +4,7 @@ Port of the default trac highlighter design. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/vim.py b/libs/pygments/styles/vim.py index 1a0828fb0..98eda4f20 100644 --- a/libs/pygments/styles/vim.py +++ b/libs/pygments/styles/vim.py @@ -4,7 +4,7 @@ A highlighting style for Pygments, inspired by vim. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/vs.py b/libs/pygments/styles/vs.py index b3b98c05d..acfd77fcc 100644 --- a/libs/pygments/styles/vs.py +++ b/libs/pygments/styles/vs.py @@ -4,7 +4,7 @@ Simple style with MS Visual Studio colors. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/xcode.py b/libs/pygments/styles/xcode.py index 87b1323ab..acf2293f9 100644 --- a/libs/pygments/styles/xcode.py +++ b/libs/pygments/styles/xcode.py @@ -4,7 +4,7 @@ Style similar to the `Xcode` default theme. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/zenburn.py b/libs/pygments/styles/zenburn.py index 6751c08d7..e10ccd923 100644 --- a/libs/pygments/styles/zenburn.py +++ b/libs/pygments/styles/zenburn.py @@ -7,7 +7,7 @@ See: https://kippura.org/zenburnpage/ https://github.com/jnurmine/Zenburn - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/token.py b/libs/pygments/token.py index bdf2e8e2e..f78018a7a 100644 --- a/libs/pygments/token.py +++ b/libs/pygments/token.py @@ -4,7 +4,7 @@ Basic token types and the standard tokens. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/unistring.py b/libs/pygments/unistring.py index 39f6baeed..e2c3523e4 100644 --- a/libs/pygments/unistring.py +++ b/libs/pygments/unistring.py @@ -7,7 +7,7 @@ Inspired by chartypes_create.py from the MoinMoin project. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -104,7 +104,7 @@ def _handle_runs(char_list): # pragma: no cover if a == b: yield a else: - yield '%s-%s' % (a, b) + yield f'{a}-{b}' if __name__ == '__main__': # pragma: no cover @@ -141,13 +141,13 @@ def _handle_runs(char_list): # pragma: no cover for cat in sorted(categories): val = ''.join(_handle_runs(categories[cat])) - fp.write('%s = %a\n\n' % (cat, val)) + fp.write(f'{cat} = {val!a}\n\n') cats = sorted(categories) cats.remove('xid_start') cats.remove('xid_continue') - fp.write('cats = %r\n\n' % cats) + fp.write(f'cats = {cats!r}\n\n') - fp.write('# Generated from unidata %s\n\n' % (unicodedata.unidata_version,)) + fp.write(f'# Generated from unidata {unicodedata.unidata_version}\n\n') fp.write(footer) diff --git a/libs/pygments/util.py b/libs/pygments/util.py index 941fdb9ec..83cf10492 100644 --- a/libs/pygments/util.py +++ b/libs/pygments/util.py @@ -4,7 +4,7 @@ Utility functions. - :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -46,8 +46,7 @@ def get_choice_opt(options, optname, allowed, default=None, normcase=False): if normcase: string = string.lower() if string not in allowed: - raise OptionError('Value for option %s must be one of %s' % - (optname, ', '.join(map(str, allowed)))) + raise OptionError('Value for option {} must be one of {}'.format(optname, ', '.join(map(str, allowed)))) return string @@ -69,17 +68,15 @@ def get_bool_opt(options, optname, default=None): elif isinstance(string, int): return bool(string) elif not isinstance(string, str): - raise OptionError('Invalid type %r for option %s; use ' - '1/0, yes/no, true/false, on/off' % ( - string, optname)) + raise OptionError(f'Invalid type {string!r} for option {optname}; use ' + '1/0, yes/no, true/false, on/off') elif string.lower() in ('1', 'yes', 'true', 'on'): return True elif string.lower() in ('0', 'no', 'false', 'off'): return False else: - raise OptionError('Invalid value %r for option %s; use ' - '1/0, yes/no, true/false, on/off' % ( - string, optname)) + raise OptionError(f'Invalid value {string!r} for option {optname}; use ' + '1/0, yes/no, true/false, on/off') def get_int_opt(options, optname, default=None): @@ -88,13 +85,11 @@ def get_int_opt(options, optname, default=None): try: return int(string) except TypeError: - raise OptionError('Invalid type %r for option %s; you ' - 'must give an integer value' % ( - string, optname)) + raise OptionError(f'Invalid type {string!r} for option {optname}; you ' + 'must give an integer value') except ValueError: - raise OptionError('Invalid value %r for option %s; you ' - 'must give an integer value' % ( - string, optname)) + raise OptionError(f'Invalid value {string!r} for option {optname}; you ' + 'must give an integer value') def get_list_opt(options, optname, default=None): """ @@ -108,9 +103,8 @@ def get_list_opt(options, optname, default=None): elif isinstance(val, (list, tuple)): return list(val) else: - raise OptionError('Invalid type %r for option %s; you ' - 'must give a list value' % ( - val, optname)) + raise OptionError(f'Invalid type {val!r} for option {optname}; you ' + 'must give a list value') def docstring_headline(obj): @@ -181,7 +175,7 @@ def shebang_matches(text, regex): if x and not x.startswith('-')][-1] except IndexError: return False - regex = re.compile(r'^%s(\.(exe|cmd|bat|bin))?$' % regex, re.IGNORECASE) + regex = re.compile(rf'^{regex}(\.(exe|cmd|bat|bin))?$', re.IGNORECASE) if regex.search(found) is not None: return True return False diff --git a/libs/pyparsing-3.1.1.dist-info/RECORD b/libs/pyparsing-3.1.1.dist-info/RECORD deleted file mode 100644 index 4c012c3ed..000000000 --- a/libs/pyparsing-3.1.1.dist-info/RECORD +++ /dev/null @@ -1,18 +0,0 @@ -pyparsing-3.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pyparsing-3.1.1.dist-info/LICENSE,sha256=ENUSChaAWAT_2otojCIL-06POXQbVzIGBNRVowngGXI,1023 -pyparsing-3.1.1.dist-info/METADATA,sha256=E8_EMvvNkZCq0__T31WduJ0R086qI7adBDU58_308Z0,5090 -pyparsing-3.1.1.dist-info/RECORD,, -pyparsing-3.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pyparsing-3.1.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -pyparsing/__init__.py,sha256=AbjlceFXuVPySz7tdBjyUyVMWyW-0nRNP9AeeY3ASu4,9148 -pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567 -pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387 -pyparsing/core.py,sha256=SL7dkYDhhJliWU3vHWPWZIGVRMfbja0hfm--woDdOHg,226596 -pyparsing/diagram/__init__.py,sha256=TUqky0L642MJU8r6zTWW8oAr-s-8jOWLyiWgJev04Yo,24198 -pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523 -pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646 -pyparsing/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692 -pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488 -pyparsing/unicode.py,sha256=bXy63t4uevWZH0JKJtd6XFIKgsCOfIlxvcDCRw-MkN8,10634 -pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670 diff --git a/libs/pyparsing-3.1.1.dist-info/INSTALLER b/libs/pyparsing-3.1.4.dist-info/INSTALLER similarity index 100% rename from libs/pyparsing-3.1.1.dist-info/INSTALLER rename to libs/pyparsing-3.1.4.dist-info/INSTALLER diff --git a/libs/pyparsing-3.1.1.dist-info/LICENSE b/libs/pyparsing-3.1.4.dist-info/LICENSE similarity index 100% rename from libs/pyparsing-3.1.1.dist-info/LICENSE rename to libs/pyparsing-3.1.4.dist-info/LICENSE diff --git a/libs/pyparsing-3.1.1.dist-info/METADATA b/libs/pyparsing-3.1.4.dist-info/METADATA similarity index 98% rename from libs/pyparsing-3.1.1.dist-info/METADATA rename to libs/pyparsing-3.1.4.dist-info/METADATA index dbad8472c..1aa7a1fc0 100644 --- a/libs/pyparsing-3.1.1.dist-info/METADATA +++ b/libs/pyparsing-3.1.4.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyparsing -Version: 3.1.1 +Version: 3.1.4 Summary: pyparsing module - Classes and methods to define and execute parsing grammars Author-email: Paul McGuire <ptmcg.gm+pyparsing@gmail.com> Requires-Python: >=3.6.8 @@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy diff --git a/libs/pyparsing-3.1.4.dist-info/RECORD b/libs/pyparsing-3.1.4.dist-info/RECORD new file mode 100644 index 000000000..708912e52 --- /dev/null +++ b/libs/pyparsing-3.1.4.dist-info/RECORD @@ -0,0 +1,18 @@ +pyparsing-3.1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyparsing-3.1.4.dist-info/LICENSE,sha256=ENUSChaAWAT_2otojCIL-06POXQbVzIGBNRVowngGXI,1023 +pyparsing-3.1.4.dist-info/METADATA,sha256=uVefJ30sVI7P9x_7YDcCdJL1BKvWQzqcmcVUr8Cb1cM,5141 +pyparsing-3.1.4.dist-info/RECORD,, +pyparsing-3.1.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyparsing-3.1.4.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +pyparsing/__init__.py,sha256=vv5sda_9o4skaj2ckqhi1wcwlEEP35r32FJYwdGPQQo,9139 +pyparsing/actions.py,sha256=-Iiu_AfZwvwhAk6h0yJ0BZP-fGfHh47N-h6DmztRcbY,6582 +pyparsing/common.py,sha256=Ny4ppPSevJeeilDDyoQULI2DW_ZPvJrLpTYcVwh9qzg,13662 +pyparsing/core.py,sha256=p5XQ97ycjZZq9Qo75SC9D55CFWB_Ouy-JMEVW56L_RQ,228623 +pyparsing/diagram/__init__.py,sha256=gv0zxQD43U1n6gJMjHH5vbFRBVoWhy-5X4cHGNGjQFg,25117 +pyparsing/exceptions.py,sha256=KvFm0qqjwSlVtrQGbvAxFEVDFbHv0MOd13hnbsyxFOw,9532 +pyparsing/helpers.py,sha256=E01uXtvDCxd5uizCW2ImM2iW3m1KiTPPODjO3LMNr6E,38900 +pyparsing/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyparsing/results.py,sha256=vL1iIttPN86-0DoF5F91_dT4YF7Eec2mpV6cc2T8JgE,25692 +pyparsing/testing.py,sha256=76XAx8JRLD8lLfYbrZN4QwOphlYX16R8oyO3_qgyEYA,13802 +pyparsing/unicode.py,sha256=vszIZDsaNiov4q1o7wr4lyqUM1pK9zvjTyrj9VWt7XY,10597 +pyparsing/util.py,sha256=Ki6NBjCuvQlj8Lh5KEtXddKEYP7khFTkL_F5yKxV_Tg,8440 diff --git a/libs/pyparsing-3.1.1.dist-info/REQUESTED b/libs/pyparsing-3.1.4.dist-info/REQUESTED similarity index 100% rename from libs/pyparsing-3.1.1.dist-info/REQUESTED rename to libs/pyparsing-3.1.4.dist-info/REQUESTED diff --git a/libs/werkzeug-3.0.1.dist-info/WHEEL b/libs/pyparsing-3.1.4.dist-info/WHEEL similarity index 100% rename from libs/werkzeug-3.0.1.dist-info/WHEEL rename to libs/pyparsing-3.1.4.dist-info/WHEEL diff --git a/libs/pyparsing/__init__.py b/libs/pyparsing/__init__.py index 3dbc3cf83..a440cfbef 100644 --- a/libs/pyparsing/__init__.py +++ b/libs/pyparsing/__init__.py @@ -120,8 +120,8 @@ def __repr__(self): return f"{__name__}.{type(self).__name__}({', '.join('{}={!r}'.format(*nv) for nv in zip(self._fields, self))})" -__version_info__ = version_info(3, 1, 1, "final", 1) -__version_time__ = "29 Jul 2023 22:27 UTC" +__version_info__ = version_info(3, 1, 4, "final", 1) +__version_time__ = "25 Aug 2024 14:40 UTC" __version__ = __version_info__.__version__ __versionTime__ = __version_time__ __author__ = "Paul McGuire <ptmcg.gm+pyparsing@gmail.com>" @@ -143,7 +143,7 @@ def __repr__(self): _builtin_exprs as common_builtin_exprs, ) -# define backward compat synonyms +# Compatibility synonyms if "pyparsing_unicode" not in globals(): pyparsing_unicode = unicode # type: ignore[misc] if "pyparsing_common" not in globals(): diff --git a/libs/pyparsing/actions.py b/libs/pyparsing/actions.py index ca6e4c6af..1d2dce99e 100644 --- a/libs/pyparsing/actions.py +++ b/libs/pyparsing/actions.py @@ -111,7 +111,6 @@ def with_attribute(*args, **attr_dict): <div type="graph">1,3 2,3 1,1</div> <div>this has no type</div> </div> - ''' div,div_end = make_html_tags("div") @@ -197,21 +196,11 @@ def with_class(classname, namespace=""): return with_attribute(**{classattr: classname}) -# pre-PEP8 compatibility symbols +# Compatibility synonyms # fmt: off -@replaced_by_pep8(replace_with) -def replaceWith(): ... - -@replaced_by_pep8(remove_quotes) -def removeQuotes(): ... - -@replaced_by_pep8(with_attribute) -def withAttribute(): ... - -@replaced_by_pep8(with_class) -def withClass(): ... - -@replaced_by_pep8(match_only_at_col) -def matchOnlyAtCol(): ... - +replaceWith = replaced_by_pep8("replaceWith", replace_with) +removeQuotes = replaced_by_pep8("removeQuotes", remove_quotes) +withAttribute = replaced_by_pep8("withAttribute", with_attribute) +withClass = replaced_by_pep8("withClass", with_class) +matchOnlyAtCol = replaced_by_pep8("matchOnlyAtCol", match_only_at_col) # fmt: on diff --git a/libs/pyparsing/common.py b/libs/pyparsing/common.py index 7a666b276..649aad009 100644 --- a/libs/pyparsing/common.py +++ b/libs/pyparsing/common.py @@ -206,7 +206,7 @@ class pyparsing_common: scientific notation and returns a float""" # streamlining this expression makes the docs nicer-looking - number = (sci_real | real | signed_integer).setName("number").streamline() + number = (sci_real | real | signed_integer).set_name("number").streamline() """any numeric expression, returns the corresponding Python type""" fnumber = ( @@ -216,6 +216,13 @@ class pyparsing_common: ) """any int or real number, returned as float""" + ieee_float = ( + Regex(r"(?i)[+-]?((\d+\.?\d*(e[+-]?\d+)?)|nan|inf(inity)?)") + .set_name("ieee_float") + .set_parse_action(convert_to_float) + ) + """any floating-point literal (int, real number, infinity, or NaN), returned as float""" + identifier = Word(identchars, identbodychars).set_name("identifier") """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" @@ -411,20 +418,15 @@ def strip_html_tags(s: str, l: int, tokens: ParseResults): # fmt: on # pre-PEP8 compatibility names - convertToInteger = convert_to_integer - """Deprecated - use :class:`convert_to_integer`""" - convertToFloat = convert_to_float - """Deprecated - use :class:`convert_to_float`""" - convertToDate = convert_to_date - """Deprecated - use :class:`convert_to_date`""" - convertToDatetime = convert_to_datetime - """Deprecated - use :class:`convert_to_datetime`""" - stripHTMLTags = strip_html_tags - """Deprecated - use :class:`strip_html_tags`""" - upcaseTokens = upcase_tokens - """Deprecated - use :class:`upcase_tokens`""" - downcaseTokens = downcase_tokens - """Deprecated - use :class:`downcase_tokens`""" + # fmt: off + convertToInteger = staticmethod(replaced_by_pep8("convertToInteger", convert_to_integer)) + convertToFloat = staticmethod(replaced_by_pep8("convertToFloat", convert_to_float)) + convertToDate = staticmethod(replaced_by_pep8("convertToDate", convert_to_date)) + convertToDatetime = staticmethod(replaced_by_pep8("convertToDatetime", convert_to_datetime)) + stripHTMLTags = staticmethod(replaced_by_pep8("stripHTMLTags", strip_html_tags)) + upcaseTokens = staticmethod(replaced_by_pep8("upcaseTokens", upcase_tokens)) + downcaseTokens = staticmethod(replaced_by_pep8("downcaseTokens", downcase_tokens)) + # fmt: on _builtin_exprs = [ diff --git a/libs/pyparsing/core.py b/libs/pyparsing/core.py index 73514ed09..cbe73c987 100644 --- a/libs/pyparsing/core.py +++ b/libs/pyparsing/core.py @@ -53,6 +53,11 @@ _MAX_INT = sys.maxsize str_type: Tuple[type, ...] = (str, bytes) +if sys.version_info >= (3, 7): + _RePattern = re.Pattern +else: + _RePattern = typing.Pattern + # # Copyright (c) 2003-2022 Paul T. McGuire # @@ -218,19 +223,11 @@ def _should_enable_warnings( # build list of single arg builtins, that can be used as parse actions +# fmt: off _single_arg_builtins = { - sum, - len, - sorted, - reversed, - list, - tuple, - set, - any, - all, - min, - max, + sum, len, sorted, reversed, list, tuple, set, any, all, min, max } +# fmt: on _generatorType = types.GeneratorType ParseImplReturnType = Tuple[int, Any] @@ -255,13 +252,13 @@ def _should_enable_warnings( DebugExceptionAction = Callable[[str, int, "ParserElement", Exception, bool], None] -alphas = string.ascii_uppercase + string.ascii_lowercase -identchars = pyparsing_unicode.Latin1.identchars -identbodychars = pyparsing_unicode.Latin1.identbodychars -nums = "0123456789" -hexnums = nums + "ABCDEFabcdef" -alphanums = alphas + nums -printables = "".join([c for c in string.printable if c not in string.whitespace]) +alphas: str = string.ascii_uppercase + string.ascii_lowercase +identchars: str = pyparsing_unicode.Latin1.identchars +identbodychars: str = pyparsing_unicode.Latin1.identbodychars +nums: str = "0123456789" +hexnums: str = nums + "ABCDEFabcdef" +alphanums: str = alphas + nums +printables: str = "".join([c for c in string.printable if c not in string.whitespace]) _trim_arity_call_line: traceback.StackSummary = None # type: ignore[assignment] @@ -280,7 +277,7 @@ def _trim_arity(func, max_limit=3): # user's parse action 'func', so that we don't incur call penalty at parse time # fmt: off - LINE_DIFF = 7 + LINE_DIFF = 9 # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! _trim_arity_call_line = (_trim_arity_call_line or traceback.extract_stack(limit=2)[-1]) @@ -288,6 +285,8 @@ def _trim_arity(func, max_limit=3): def wrapper(*args): nonlocal found_arity, limit + if found_arity: + return func(*args[limit:]) while 1: try: ret = func(*args[limit:]) @@ -476,7 +475,7 @@ def __init__(self, savelist: bool = False): self.streamlined = False # optimize exception handling for subclasses that don't advance parse index self.mayIndexError = True - self.errmsg = "" + self.errmsg: Union[str, None] = "" # mark results names as modal (report only last) or cumulative (list all) self.modalResults = True # custom debug actions @@ -571,6 +570,7 @@ def set_results_name( Example:: + integer = Word(nums) date_str = (integer.set_results_name("year") + '/' + integer.set_results_name("month") + '/' + integer.set_results_name("day")) @@ -581,15 +581,15 @@ def set_results_name( listAllMatches = listAllMatches or list_all_matches return self._setResultsName(name, listAllMatches) - def _setResultsName(self, name, listAllMatches=False): + def _setResultsName(self, name, list_all_matches=False) -> "ParserElement": if name is None: return self newself = self.copy() if name.endswith("*"): name = name[:-1] - listAllMatches = True + list_all_matches = True newself.resultsName = name - newself.modalResults = not listAllMatches + newself.modalResults = not list_all_matches return newself def set_break(self, break_flag: bool = True) -> "ParserElement": @@ -601,21 +601,20 @@ def set_break(self, break_flag: bool = True) -> "ParserElement": if break_flag: _parseMethod = self._parse - def breaker(instring, loc, doActions=True, callPreParse=True): + def breaker(instring, loc, do_actions=True, callPreParse=True): import pdb # this call to pdb.set_trace() is intentional, not a checkin error pdb.set_trace() - return _parseMethod(instring, loc, doActions, callPreParse) + return _parseMethod(instring, loc, do_actions, callPreParse) breaker._originalParseMethod = _parseMethod # type: ignore [attr-defined] self._parse = breaker # type: ignore [assignment] - else: - if hasattr(self._parse, "_originalParseMethod"): - self._parse = self._parse._originalParseMethod # type: ignore [attr-defined, assignment] + elif hasattr(self._parse, "_originalParseMethod"): + self._parse = self._parse._originalParseMethod # type: ignore [attr-defined, assignment] return self - def set_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement": + def set_parse_action(self, *fns: ParseAction, **kwargs: Any) -> "ParserElement": """ Define one or more actions to perform when successfully matching parse element definition. @@ -691,17 +690,19 @@ def is_valid_date(instring, loc, toks): ''') """ if list(fns) == [None]: - self.parseAction = [] - else: - if not all(callable(fn) for fn in fns): - raise TypeError("parse actions must be callable") - self.parseAction = [_trim_arity(fn) for fn in fns] - self.callDuringTry = kwargs.get( - "call_during_try", kwargs.get("callDuringTry", False) - ) + self.parseAction.clear() + return self + + if not all(callable(fn) for fn in fns): + raise TypeError("parse actions must be callable") + self.parseAction[:] = [_trim_arity(fn) for fn in fns] + self.callDuringTry = kwargs.get( + "call_during_try", kwargs.get("callDuringTry", False) + ) + return self - def add_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement": + def add_parse_action(self, *fns: ParseAction, **kwargs: Any) -> "ParserElement": """ Add one or more parse actions to expression's list of parse actions. See :class:`set_parse_action`. @@ -713,7 +714,7 @@ def add_parse_action(self, *fns: ParseAction, **kwargs) -> "ParserElement": ) return self - def add_condition(self, *fns: ParseCondition, **kwargs) -> "ParserElement": + def add_condition(self, *fns: ParseCondition, **kwargs: Any) -> "ParserElement": """Add a boolean predicate function to expression's list of parse actions. See :class:`set_parse_action` for function call signatures. Unlike ``set_parse_action``, functions passed to ``add_condition`` need to return boolean success/fail of the condition. @@ -799,7 +800,7 @@ def preParse(self, instring: str, loc: int) -> int: return loc - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: return loc, [] def postParse(self, instring, loc, tokenlist): @@ -807,10 +808,10 @@ def postParse(self, instring, loc, tokenlist): # @profile def _parseNoCache( - self, instring, loc, doActions=True, callPreParse=True + self, instring, loc, do_actions=True, callPreParse=True ) -> Tuple[int, ParseResults]: TRY, MATCH, FAIL = 0, 1, 2 - debugging = self.debug # and doActions) + debugging = self.debug # and do_actions) len_instring = len(instring) if debugging or self.failAction: @@ -825,11 +826,11 @@ def _parseNoCache( self.debugActions.debug_try(instring, tokens_start, self, False) if self.mayIndexError or pre_loc >= len_instring: try: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) + loc, tokens = self.parseImpl(instring, pre_loc, do_actions) except IndexError: raise ParseException(instring, len_instring, self.errmsg, self) else: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) + loc, tokens = self.parseImpl(instring, pre_loc, do_actions) except Exception as err: # print("Exception raised:", err) if self.debugActions.debug_fail: @@ -847,18 +848,18 @@ def _parseNoCache( tokens_start = pre_loc if self.mayIndexError or pre_loc >= len_instring: try: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) + loc, tokens = self.parseImpl(instring, pre_loc, do_actions) except IndexError: raise ParseException(instring, len_instring, self.errmsg, self) else: - loc, tokens = self.parseImpl(instring, pre_loc, doActions) + loc, tokens = self.parseImpl(instring, pre_loc, do_actions) tokens = self.postParse(instring, loc, tokens) ret_tokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) - if self.parseAction and (doActions or self.callDuringTry): + if self.parseAction and (do_actions or self.callDuringTry): if debugging: try: for fn in self.parseAction: @@ -917,7 +918,7 @@ def try_parse( do_actions: bool = False, ) -> int: try: - return self._parse(instring, loc, doActions=do_actions)[0] + return self._parse(instring, loc, do_actions=do_actions)[0] except ParseFatalException: if raise_fatal: raise @@ -944,11 +945,9 @@ class to help type checking not_in_cache: bool - def get(self, *args): - ... + def get(self, *args): ... - def set(self, *args): - ... + def set(self, *args): ... # argument cache for optimizing repeated calls when backtracking through recursive expressions packrat_cache = ( @@ -960,18 +959,18 @@ def set(self, *args): # this method gets repeatedly called during backtracking with the same arguments - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression def _parseCache( - self, instring, loc, doActions=True, callPreParse=True + self, instring, loc, do_actions=True, callPreParse=True ) -> Tuple[int, ParseResults]: HIT, MISS = 0, 1 TRY, MATCH, FAIL = 0, 1, 2 - lookup = (self, instring, loc, callPreParse, doActions) + lookup = (self, instring, loc, callPreParse, do_actions) with ParserElement.packrat_cache_lock: cache = ParserElement.packrat_cache value = cache.get(lookup) if value is cache.not_in_cache: ParserElement.packrat_cache_stats[MISS] += 1 try: - value = self._parseNoCache(instring, loc, doActions, callPreParse) + value = self._parseNoCache(instring, loc, do_actions, callPreParse) except ParseBaseException as pe: # cache a copy of the exception, without the traceback cache.set(lookup, pe.__class__(*pe.args)) @@ -1080,7 +1079,7 @@ def enable_left_recursion( elif cache_size_limit > 0: ParserElement.recursion_memos = _LRUMemo(capacity=cache_size_limit) # type: ignore[assignment] else: - raise NotImplementedError("Memo size of %s" % cache_size_limit) + raise NotImplementedError(f"Memo size of {cache_size_limit}") ParserElement._left_recursion_enabled = True @staticmethod @@ -1121,13 +1120,16 @@ def enable_packrat( ParserElement.disable_memoization() elif ParserElement._left_recursion_enabled: raise RuntimeError("Packrat and Bounded Recursion are not compatible") - if not ParserElement._packratEnabled: - ParserElement._packratEnabled = True - if cache_size_limit is None: - ParserElement.packrat_cache = _UnboundedCache() - else: - ParserElement.packrat_cache = _FifoCache(cache_size_limit) # type: ignore[assignment] - ParserElement._parse = ParserElement._parseCache + + if ParserElement._packratEnabled: + return + + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = _UnboundedCache() + else: + ParserElement.packrat_cache = _FifoCache(cache_size_limit) # type: ignore[assignment] + ParserElement._parse = ParserElement._parseCache def parse_string( self, instring: str, parse_all: bool = False, *, parseAll: bool = False @@ -1187,7 +1189,7 @@ def parse_string( loc, tokens = self._parse(instring, 0) if parseAll: loc = self.preParse(instring, loc) - se = Empty() + StringEnd() + se = Empty() + StringEnd().set_debug(False) se._parse(instring, loc) except ParseBaseException as exc: if ParserElement.verbose_stacktrace: @@ -1285,9 +1287,9 @@ def scan_string( except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) + + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc.with_traceback(None) def transform_string(self, instring: str, *, debug: bool = False) -> str: """ @@ -1317,23 +1319,27 @@ def transform_string(self, instring: str, *, debug: bool = False) -> str: try: for t, s, e in self.scan_string(instring, debug=debug): out.append(instring[lastE:s]) - if t: - if isinstance(t, ParseResults): - out += t.as_list() - elif isinstance(t, Iterable) and not isinstance(t, str_type): - out.extend(t) - else: - out.append(t) lastE = e + + if not t: + continue + + if isinstance(t, ParseResults): + out += t.as_list() + elif isinstance(t, Iterable) and not isinstance(t, str_type): + out.extend(t) + else: + out.append(t) + out.append(instring[lastE:]) out = [o for o in out if o] return "".join([str(s) for s in _flatten(out)]) except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) + + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc.with_traceback(None) def search_string( self, @@ -1371,9 +1377,9 @@ def search_string( except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) + + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc.with_traceback(None) def split( self, @@ -1502,9 +1508,12 @@ def __mul__(self, other) -> "ParserElement": elif isinstance(other, tuple) and other[:1] == (Ellipsis,): other = ((0,) + other[1:] + (None,))[:2] + if not isinstance(other, (int, tuple)): + return NotImplemented + if isinstance(other, int): minElements, optElements = other, 0 - elif isinstance(other, tuple): + else: other = tuple(o if o is not Ellipsis else None for o in other) other = (other + (None, None))[:2] if other[0] is None: @@ -1521,8 +1530,6 @@ def __mul__(self, other) -> "ParserElement": optElements -= minElements else: return NotImplemented - else: - return NotImplemented if minElements < 0: raise ValueError("cannot multiply ParserElement by negative value") @@ -1711,8 +1718,8 @@ def __call__(self, name: typing.Optional[str] = None) -> "ParserElement": """ if name is not None: return self._setResultsName(name) - else: - return self.copy() + + return self.copy() def suppress(self) -> "ParserElement": """ @@ -1770,7 +1777,7 @@ def ignore(self, other: "ParserElement") -> "ParserElement": Example:: - patt = Word(alphas)[1, ...] + patt = Word(alphas)[...] patt.parse_string('ablaj /* comment */ lskjd') # -> ['ablaj'] @@ -1778,8 +1785,6 @@ def ignore(self, other: "ParserElement") -> "ParserElement": patt.parse_string('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] """ - import typing - if isinstance(other, str_type): other = Suppress(other) @@ -1881,19 +1886,29 @@ def _generateDefaultName(self) -> str: Child classes must define this method, which defines how the ``default_name`` is set. """ - def set_name(self, name: str) -> "ParserElement": + def set_name(self, name: typing.Optional[str]) -> "ParserElement": """ - Define name for this expression, makes debugging and exception messages clearer. + Define name for this expression, makes debugging and exception messages clearer. If + `__diag__.enable_debug_on_named_expressions` is set to True, setting a name will also + enable debug for this expression. + + If `name` is None, clears any custom name for this expression, and clears the + debug flag is it was enabled via `__diag__.enable_debug_on_named_expressions`. Example:: - Word(nums).parse_string("ABC") # -> Exception: Expected W:(0-9) (at char 0), (line:1, col:1) - Word(nums).set_name("integer").parse_string("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + integer = Word(nums) + integer.parse_string("ABC") # -> Exception: Expected W:(0-9) (at char 0), (line:1, col:1) + + integer.set_name("integer") + integer.parse_string("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) """ self.customName = name - self.errmsg = "Expected " + self.name + self.errmsg = f"Expected {str(self)}" + if __diag__.enable_debug_on_named_expressions: - self.set_debug() + self.set_debug(name is not None) + return self @property @@ -1901,6 +1916,10 @@ def name(self) -> str: # This will use a user-defined name if available, but otherwise defaults back to the auto-generated name return self.customName if self.customName is not None else self.default_name + @name.setter + def name(self, new_name) -> None: + self.set_name(new_name) + def __str__(self) -> str: return self.name @@ -1957,9 +1976,9 @@ def parse_file( except ParseBaseException as exc: if ParserElement.verbose_stacktrace: raise - else: - # catch and re-raise exception from here, clears out pyparsing internal stack trace - raise exc.with_traceback(None) + + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc.with_traceback(None) def __eq__(self, other): if self is other: @@ -2005,7 +2024,9 @@ def run_tests( full_dump: bool = True, print_results: bool = True, failure_tests: bool = False, - post_parse: typing.Optional[Callable[[str, ParseResults], str]] = None, + post_parse: typing.Optional[ + Callable[[str, ParseResults], typing.Optional[str]] + ] = None, file: typing.Optional[TextIO] = None, with_line_numbers: bool = False, *, @@ -2013,7 +2034,9 @@ def run_tests( fullDump: bool = True, printResults: bool = True, failureTests: bool = False, - postParse: typing.Optional[Callable[[str, ParseResults], str]] = None, + postParse: typing.Optional[ + Callable[[str, ParseResults], typing.Optional[str]] + ] = None, ) -> Tuple[bool, List[Tuple[str, Union[ParseResults, Exception]]]]: """ Execute the parse expression on a series of test strings, showing each @@ -2137,6 +2160,7 @@ def run_tests( success = True NL = Literal(r"\n").add_parse_action(replace_with("\n")).ignore(quoted_string) BOM = "\ufeff" + nlstr = "\n" for t in tests: if comment_specified and comment.matches(t, False) or comments and not t: comments.append( @@ -2146,18 +2170,18 @@ def run_tests( if not t: continue out = [ - "\n" + "\n".join(comments) if comments else "", + f"{nlstr}{nlstr.join(comments) if comments else ''}", pyparsing_test.with_line_numbers(t) if with_line_numbers else t, ] - comments = [] + comments.clear() try: # convert newline marks to actual newlines, and strip leading BOM if present t = NL.transform_string(t.lstrip(BOM)) result = self.parse_string(t, parse_all=parseAll) except ParseBaseException as pe: - fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + fatal = "(FATAL) " if isinstance(pe, ParseFatalException) else "" out.append(pe.explain()) - out.append("FAIL: " + str(pe)) + out.append(f"FAIL: {fatal}{pe}") if ParserElement.verbose_stacktrace: out.extend(traceback.format_tb(pe.__traceback__)) success = success and failureTests @@ -2244,93 +2268,46 @@ def create_diagram( show_groups=show_groups, diagram_kwargs=kwargs, ) - if isinstance(output_html, (str, Path)): - with open(output_html, "w", encoding="utf-8") as diag_file: - diag_file.write(railroad_to_html(railroad, embed=embed, **kwargs)) - else: + if not isinstance(output_html, (str, Path)): # we were passed a file-like object, just write to it output_html.write(railroad_to_html(railroad, embed=embed, **kwargs)) + return + + with open(output_html, "w", encoding="utf-8") as diag_file: + diag_file.write(railroad_to_html(railroad, embed=embed, **kwargs)) # Compatibility synonyms # fmt: off - @staticmethod - @replaced_by_pep8(inline_literals_using) - def inlineLiteralsUsing(): ... - - @staticmethod - @replaced_by_pep8(set_default_whitespace_chars) - def setDefaultWhitespaceChars(): ... - - @replaced_by_pep8(set_results_name) - def setResultsName(self): ... - - @replaced_by_pep8(set_break) - def setBreak(self): ... - - @replaced_by_pep8(set_parse_action) - def setParseAction(self): ... - - @replaced_by_pep8(add_parse_action) - def addParseAction(self): ... - - @replaced_by_pep8(add_condition) - def addCondition(self): ... - - @replaced_by_pep8(set_fail_action) - def setFailAction(self): ... - - @replaced_by_pep8(try_parse) - def tryParse(self): ... - - @staticmethod - @replaced_by_pep8(enable_left_recursion) - def enableLeftRecursion(): ... - - @staticmethod - @replaced_by_pep8(enable_packrat) - def enablePackrat(): ... - - @replaced_by_pep8(parse_string) - def parseString(self): ... - - @replaced_by_pep8(scan_string) - def scanString(self): ... - - @replaced_by_pep8(transform_string) - def transformString(self): ... - - @replaced_by_pep8(search_string) - def searchString(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... - - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(set_whitespace_chars) - def setWhitespaceChars(self): ... - - @replaced_by_pep8(parse_with_tabs) - def parseWithTabs(self): ... - - @replaced_by_pep8(set_debug_actions) - def setDebugActions(self): ... - - @replaced_by_pep8(set_debug) - def setDebug(self): ... - - @replaced_by_pep8(set_name) - def setName(self): ... - - @replaced_by_pep8(parse_file) - def parseFile(self): ... - - @replaced_by_pep8(run_tests) - def runTests(self): ... - - canParseNext = can_parse_next - resetCache = reset_cache + inlineLiteralsUsing = staticmethod(replaced_by_pep8("inlineLiteralsUsing", inline_literals_using)) + setDefaultWhitespaceChars = staticmethod(replaced_by_pep8( + "setDefaultWhitespaceChars", set_default_whitespace_chars + )) + disableMemoization = staticmethod(replaced_by_pep8("disableMemoization", disable_memoization)) + enableLeftRecursion = staticmethod(replaced_by_pep8("enableLeftRecursion", enable_left_recursion)) + enablePackrat = staticmethod(replaced_by_pep8("enablePackrat", enable_packrat)) + resetCache = staticmethod(replaced_by_pep8("resetCache", reset_cache)) + + setResultsName = replaced_by_pep8("setResultsName", set_results_name) + setBreak = replaced_by_pep8("setBreak", set_break) + setParseAction = replaced_by_pep8("setParseAction", set_parse_action) + addParseAction = replaced_by_pep8("addParseAction", add_parse_action) + addCondition = replaced_by_pep8("addCondition", add_condition) + setFailAction = replaced_by_pep8("setFailAction", set_fail_action) + tryParse = replaced_by_pep8("tryParse", try_parse) + parseString = replaced_by_pep8("parseString", parse_string) + scanString = replaced_by_pep8("scanString", scan_string) + transformString = replaced_by_pep8("transformString", transform_string) + searchString = replaced_by_pep8("searchString", search_string) + ignoreWhitespace = replaced_by_pep8("ignoreWhitespace", ignore_whitespace) + leaveWhitespace = replaced_by_pep8("leaveWhitespace", leave_whitespace) + setWhitespaceChars = replaced_by_pep8("setWhitespaceChars", set_whitespace_chars) + parseWithTabs = replaced_by_pep8("parseWithTabs", parse_with_tabs) + setDebugActions = replaced_by_pep8("setDebugActions", set_debug_actions) + setDebug = replaced_by_pep8("setDebug", set_debug) + setName = replaced_by_pep8("setName", set_name) + parseFile = replaced_by_pep8("parseFile", parse_file) + runTests = replaced_by_pep8("runTests", run_tests) + canParseNext = replaced_by_pep8("canParseNext", can_parse_next) defaultName = default_name # fmt: on @@ -2358,7 +2335,7 @@ def must_skip(t): def show_skip(t): if t._skipped.as_list()[-1:] == [""]: t.pop("_skipped") - t["_skipped"] = "missing <" + repr(self.anchor) + ">" + t["_skipped"] = f"missing <{self.anchor!r}>" return ( self.anchor + skipper().add_parse_action(must_skip) @@ -2370,7 +2347,7 @@ def show_skip(t): def __repr__(self): return self.defaultName - def parseImpl(self, *args): + def parseImpl(self, *args) -> ParseImplReturnType: raise Exception( "use of `...` expression without following SkipTo target expression" ) @@ -2399,7 +2376,7 @@ def __init__(self): self.mayIndexError = False self.errmsg = "Unmatchable token" - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: raise ParseException(instring, loc, self.errmsg, self) @@ -2409,9 +2386,9 @@ class Literal(Token): Example:: - Literal('blah').parse_string('blah') # -> ['blah'] - Literal('blah').parse_string('blahfooblah') # -> ['blah'] - Literal('blah').parse_string('bla') # -> Exception: Expected "blah" + Literal('abc').parse_string('abc') # -> ['abc'] + Literal('abc').parse_string('abcdef') # -> ['abc'] + Literal('abc').parse_string('ab') # -> Exception: Expected "abc" For case-insensitive matching, use :class:`CaselessLiteral`. @@ -2441,14 +2418,14 @@ def __init__(self, match_string: str = "", *, matchString: str = ""): self.match = match_string self.matchLen = len(match_string) self.firstMatchChar = match_string[:1] - self.errmsg = "Expected " + self.name + self.errmsg = f"Expected {self.name}" self.mayReturnEmpty = False self.mayIndexError = False def _generateDefaultName(self) -> str: return repr(self.match) - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if instring[loc] == self.firstMatchChar and instring.startswith( self.match, loc ): @@ -2469,12 +2446,12 @@ def __init__(self, match_string="", *, matchString=""): def _generateDefaultName(self) -> str: return "Empty" - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: return loc, [] class _SingleCharLiteral(Literal): - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if instring[loc] == self.firstMatchChar: return loc + 1, self.match raise ParseException(instring, loc, self.errmsg, self) @@ -2544,7 +2521,7 @@ def __init__( def _generateDefaultName(self) -> str: return repr(self.match) - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: errmsg = self.errmsg errloc = loc if self.caseless: @@ -2555,40 +2532,37 @@ def parseImpl(self, instring, loc, doActions=True): or instring[loc + self.matchLen].upper() not in self.identChars ): return loc + self.matchLen, self.match - else: - # followed by keyword char - errmsg += ", was immediately followed by keyword character" - errloc = loc + self.matchLen - else: - # preceded by keyword char - errmsg += ", keyword was immediately preceded by keyword character" - errloc = loc - 1 - # else no match just raise plain exception - else: - if ( - instring[loc] == self.firstMatchChar - and self.matchLen == 1 - or instring.startswith(self.match, loc) - ): - if loc == 0 or instring[loc - 1] not in self.identChars: - if ( - loc >= len(instring) - self.matchLen - or instring[loc + self.matchLen] not in self.identChars - ): - return loc + self.matchLen, self.match - else: - # followed by keyword char - errmsg += ( - ", keyword was immediately followed by keyword character" - ) - errloc = loc + self.matchLen + # followed by keyword char + errmsg += ", was immediately followed by keyword character" + errloc = loc + self.matchLen else: # preceded by keyword char errmsg += ", keyword was immediately preceded by keyword character" errloc = loc - 1 # else no match just raise plain exception + elif ( + instring[loc] == self.firstMatchChar + and self.matchLen == 1 + or instring.startswith(self.match, loc) + ): + if loc == 0 or instring[loc - 1] not in self.identChars: + if ( + loc >= len(instring) - self.matchLen + or instring[loc + self.matchLen] not in self.identChars + ): + return loc + self.matchLen, self.match + + # followed by keyword char + errmsg += ", keyword was immediately followed by keyword character" + errloc = loc + self.matchLen + else: + # preceded by keyword char + errmsg += ", keyword was immediately preceded by keyword character" + errloc = loc - 1 + # else no match just raise plain exception + raise ParseException(instring, errloc, errmsg, self) @staticmethod @@ -2598,7 +2572,10 @@ def set_default_keyword_chars(chars) -> None: """ Keyword.DEFAULT_KEYWORD_CHARS = chars - setDefaultKeywordChars = set_default_keyword_chars + # Compatibility synonyms + setDefaultKeywordChars = staticmethod( + replaced_by_pep8("setDefaultKeywordChars", set_default_keyword_chars) + ) class CaselessLiteral(Literal): @@ -2620,9 +2597,9 @@ def __init__(self, match_string: str = "", *, matchString: str = ""): super().__init__(match_string.upper()) # Preserve the defining literal. self.returnString = match_string - self.errmsg = "Expected " + self.name + self.errmsg = f"Expected {self.name}" - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if instring[loc : loc + self.matchLen].upper() == self.match: return loc + self.matchLen, self.returnString raise ParseException(instring, loc, self.errmsg, self) @@ -2708,7 +2685,7 @@ def __init__( def _generateDefaultName(self) -> str: return f"{type(self).__name__}:{self.match_string!r}" - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: start = loc instrlen = len(instring) maxloc = start + len(self.match_string) @@ -2795,7 +2772,7 @@ class Word(Token): integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) # a word with a leading capital, and zero or more lowercase - capital_word = Word(alphas.upper(), alphas.lower()) + capitalized_word = Word(alphas.upper(), alphas.lower()) # hostnames are alphanumeric, with leading alpha, and '-' hostname = Word(alphas, alphanums + '-') @@ -2872,7 +2849,7 @@ def __init__( self.maxLen = exact self.minLen = exact - self.errmsg = "Expected " + self.name + self.errmsg = f"Expected {self.name}" self.mayIndexError = False self.asKeyword = asKeyword if self.asKeyword: @@ -2929,10 +2906,11 @@ def _generateDefaultName(self) -> str: def charsAsStr(s): max_repr_len = 16 s = _collapse_string_to_ranges(s, re_escape=False) + if len(s) > max_repr_len: return s[: max_repr_len - 3] + "..." - else: - return s + + return s if self.initChars != self.bodyChars: base = f"W:({charsAsStr(self.initChars)}, {charsAsStr(self.bodyChars)})" @@ -2952,39 +2930,36 @@ def charsAsStr(s): return base + f"{{{self.minLen},{self.maxLen}}}" return base - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if instring[loc] not in self.initChars: raise ParseException(instring, loc, self.errmsg, self) start = loc loc += 1 instrlen = len(instring) - bodychars = self.bodyChars + body_chars: set[str] = self.bodyChars maxloc = start + self.maxLen maxloc = min(maxloc, instrlen) - while loc < maxloc and instring[loc] in bodychars: + while loc < maxloc and instring[loc] in body_chars: loc += 1 - throwException = False + throw_exception = False if loc - start < self.minLen: - throwException = True - elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: - throwException = True - elif self.asKeyword: - if ( - start > 0 - and instring[start - 1] in bodychars - or loc < instrlen - and instring[loc] in bodychars - ): - throwException = True + throw_exception = True + elif self.maxSpecified and loc < instrlen and instring[loc] in body_chars: + throw_exception = True + elif self.asKeyword and ( + (start > 0 and instring[start - 1] in body_chars) + or (loc < instrlen and instring[loc] in body_chars) + ): + throw_exception = True - if throwException: + if throw_exception: raise ParseException(instring, loc, self.errmsg, self) return loc, instring[start:loc] - def parseImpl_regex(self, instring, loc, doActions=True): + def parseImpl_regex(self, instring, loc, do_actions=True) -> ParseImplReturnType: result = self.re_match(instring, loc) if not result: raise ParseException(instring, loc, self.errmsg, self) @@ -3077,7 +3052,7 @@ def __init__( "Regex may only be constructed with a string or a compiled RE object" ) - self.errmsg = "Expected " + self.name + self.errmsg = f"Expected {self.name}" self.mayIndexError = False self.asGroupList = asGroupList self.asMatch = asMatch @@ -3087,27 +3062,28 @@ def __init__( self.parseImpl = self.parseImplAsMatch # type: ignore [assignment] @cached_property - def re(self): + def re(self) -> _RePattern: if self._re: return self._re - else: - try: - return re.compile(self.pattern, self.flags) - except re.error: - raise ValueError(f"invalid pattern ({self.pattern!r}) passed to Regex") + + try: + return re.compile(self.pattern, self.flags) + except re.error: + raise ValueError(f"invalid pattern ({self.pattern!r}) passed to Regex") @cached_property - def re_match(self): + def re_match(self) -> Callable[[str], Any]: return self.re.match @cached_property - def mayReturnEmpty(self): + def mayReturnEmpty(self) -> bool: return self.re_match("") is not None def _generateDefaultName(self) -> str: - return "Re:({})".format(repr(self.pattern).replace("\\\\", "\\")) + unescaped = self.pattern.replace("\\\\", "\\") + return f"Re:({unescaped!r})" - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: result = self.re_match(instring, loc) if not result: raise ParseException(instring, loc, self.errmsg, self) @@ -3115,12 +3091,13 @@ def parseImpl(self, instring, loc, doActions=True): loc = result.end() ret = ParseResults(result.group()) d = result.groupdict() - if d: - for k, v in d.items(): - ret[k] = v + + for k, v in d.items(): + ret[k] = v + return loc, ret - def parseImplAsGroupList(self, instring, loc, doActions=True): + def parseImplAsGroupList(self, instring, loc, do_actions=True): result = self.re_match(instring, loc) if not result: raise ParseException(instring, loc, self.errmsg, self) @@ -3129,7 +3106,7 @@ def parseImplAsGroupList(self, instring, loc, doActions=True): ret = result.groups() return loc, ret - def parseImplAsMatch(self, instring, loc, doActions=True): + def parseImplAsMatch(self, instring, loc, do_actions=True): result = self.re_match(instring, loc) if not result: raise ParseException(instring, loc, self.errmsg, self) @@ -3209,6 +3186,7 @@ class QuotedString(Token): [['This is the "quote"']] [['This is the quote with "embedded" quotes']] """ + ws_map = dict(((r"\t", "\t"), (r"\n", "\n"), (r"\f", "\f"), (r"\r", "\r"))) def __init__( @@ -3265,7 +3243,7 @@ def __init__( # fmt: off # build up re pattern for the content between the quote delimiters - inner_pattern = [] + inner_pattern: List[str] = [] if esc_quote: inner_pattern.append(rf"(?:{re.escape(esc_quote)})") @@ -3287,12 +3265,12 @@ def __init__( self.re_flags |= re.MULTILINE | re.DOTALL inner_pattern.append( rf"(?:[^{_escape_regex_range_chars(self.end_quote_char[0])}" - rf"{(_escape_regex_range_chars(esc_char) if self.has_esc_char else '')}])" + rf"{(_escape_regex_range_chars(self.esc_char) if self.has_esc_char else '')}])" ) else: inner_pattern.append( rf"(?:[^{_escape_regex_range_chars(self.end_quote_char[0])}\n\r" - rf"{(_escape_regex_range_chars(esc_char) if self.has_esc_char else '')}])" + rf"{(_escape_regex_range_chars(self.esc_char) if self.has_esc_char else '')}])" ) self.pattern = "".join( @@ -3328,7 +3306,7 @@ def __init__( except re.error: raise ValueError(f"invalid pattern {self.pattern!r} passed to Regex") - self.errmsg = "Expected " + self.name + self.errmsg = f"Expected {self.name}" self.mayIndexError = False self.mayReturnEmpty = True @@ -3340,7 +3318,7 @@ def _generateDefaultName(self) -> str: return f"quoted string, starting with {self.quote_char} ending with {self.end_quote_char}" - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: # check first character of opening quote to see if that is a match # before doing the more complicated regex match result = ( @@ -3428,8 +3406,8 @@ def __init__( if min < 1: raise ValueError( - "cannot specify a minimum length < 1; use " - "Opt(CharsNotIn()) if zero-length char group is permitted" + "cannot specify a minimum length < 1; use" + " Opt(CharsNotIn()) if zero-length char group is permitted" ) self.minLen = min @@ -3443,7 +3421,7 @@ def __init__( self.maxLen = exact self.minLen = exact - self.errmsg = "Expected " + self.name + self.errmsg = f"Expected {self.name}" self.mayReturnEmpty = self.minLen == 0 self.mayIndexError = False @@ -3454,7 +3432,7 @@ def _generateDefaultName(self) -> str: else: return f"!W:({self.notChars})" - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: notchars = self.notCharsSet if instring[loc] in notchars: raise ParseException(instring, loc, self.errmsg, self) @@ -3516,7 +3494,7 @@ def __init__(self, ws: str = " \t\r\n", min: int = 1, max: int = 0, exact: int = ) # self.leave_whitespace() self.mayReturnEmpty = True - self.errmsg = "Expected " + self.name + self.errmsg = f"Expected {self.name}" self.minLen = min @@ -3532,7 +3510,7 @@ def __init__(self, ws: str = " \t\r\n", min: int = 1, max: int = 0, exact: int = def _generateDefaultName(self) -> str: return "".join(White.whiteStrs[c] for c in self.matchWhite) - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if instring[loc] not in self.matchWhite: raise ParseException(instring, loc, self.errmsg, self) start = loc @@ -3565,19 +3543,22 @@ def __init__(self, colno: int): self.col = colno def preParse(self, instring: str, loc: int) -> int: - if col(loc, instring) != self.col: - instrlen = len(instring) - if self.ignoreExprs: - loc = self._skipIgnorables(instring, loc) - while ( - loc < instrlen - and instring[loc].isspace() - and col(loc, instring) != self.col - ): - loc += 1 + if col(loc, instring) == self.col: + return loc + + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables(instring, loc) + while ( + loc < instrlen + and instring[loc].isspace() + and col(loc, instring) != self.col + ): + loc += 1 + return loc - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: thiscol = col(loc, instring) if thiscol > self.col: raise ParseException(instring, loc, "Text not in expected column", self) @@ -3615,19 +3596,21 @@ def __init__(self): self.orig_whiteChars = set() | self.whiteChars self.whiteChars.discard("\n") self.skipper = Empty().set_whitespace_chars(self.whiteChars) - self.errmsg = "Expected start of line" + self.set_name("start of line") def preParse(self, instring: str, loc: int) -> int: if loc == 0: return loc - else: - ret = self.skipper.preParse(instring, loc) - if "\n" in self.orig_whiteChars: - while instring[ret : ret + 1] == "\n": - ret = self.skipper.preParse(instring, ret + 1) - return ret - def parseImpl(self, instring, loc, doActions=True): + ret = self.skipper.preParse(instring, loc) + + if "\n" in self.orig_whiteChars: + while instring[ret : ret + 1] == "\n": + ret = self.skipper.preParse(instring, ret + 1) + + return ret + + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if col(loc, instring) == 1: return loc, [] raise ParseException(instring, loc, self.errmsg, self) @@ -3642,9 +3625,9 @@ def __init__(self): super().__init__() self.whiteChars.discard("\n") self.set_whitespace_chars(self.whiteChars, copy_defaults=False) - self.errmsg = "Expected end of line" + self.set_name("end of line") - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if loc < len(instring): if instring[loc] == "\n": return loc + 1, "\n" @@ -3663,13 +3646,13 @@ class StringStart(PositionToken): def __init__(self): super().__init__() - self.errmsg = "Expected start of text" + self.set_name("start of text") + + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: + # see if entire string up to here is just whitespace and ignoreables + if loc != 0 and loc != self.preParse(instring, 0): + raise ParseException(instring, loc, self.errmsg, self) - def parseImpl(self, instring, loc, doActions=True): - if loc != 0: - # see if entire string up to here is just whitespace and ignoreables - if loc != self.preParse(instring, 0): - raise ParseException(instring, loc, self.errmsg, self) return loc, [] @@ -3680,17 +3663,17 @@ class StringEnd(PositionToken): def __init__(self): super().__init__() - self.errmsg = "Expected end of text" + self.set_name("end of text") - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if loc < len(instring): raise ParseException(instring, loc, self.errmsg, self) - elif loc == len(instring): + if loc == len(instring): return loc + 1, [] - elif loc > len(instring): + if loc > len(instring): return loc, [] - else: - raise ParseException(instring, loc, self.errmsg, self) + + raise ParseException(instring, loc, self.errmsg, self) class WordStart(PositionToken): @@ -3707,9 +3690,9 @@ def __init__(self, word_chars: str = printables, *, wordChars: str = printables) wordChars = word_chars if wordChars == printables else wordChars super().__init__() self.wordChars = set(wordChars) - self.errmsg = "Not at the start of a word" + self.set_name("start of a word") - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if loc != 0: if ( instring[loc - 1] in self.wordChars @@ -3733,9 +3716,9 @@ def __init__(self, word_chars: str = printables, *, wordChars: str = printables) super().__init__() self.wordChars = set(wordChars) self.skipWhitespace = False - self.errmsg = "Not at the end of a word" + self.set_name("end of a word") - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: instrlen = len(instring) if instrlen > 0 and loc < instrlen: if ( @@ -3746,6 +3729,47 @@ def parseImpl(self, instring, loc, doActions=True): return loc, [] +class Tag(Token): + """ + A meta-element for inserting a named result into the parsed + tokens that may be checked later in a parse action or while + processing the parsed results. Accepts an optional tag value, + defaulting to `True`. + + Example:: + + end_punc = "." | ("!" + Tag("enthusiastic"))) + greeting = "Hello," + Word(alphas) + end_punc + + result = greeting.parse_string("Hello, World.") + print(result.dump()) + + result = greeting.parse_string("Hello, World!") + print(result.dump()) + + prints:: + + ['Hello,', 'World', '.'] + + ['Hello,', 'World', '!'] + - enthusiastic: True + """ + def __init__(self, tag_name: str, value: Any = True): + super().__init__() + self.mayReturnEmpty = True + self.mayIndexError = False + self.leave_whitespace() + self.tag_name = tag_name + self.tag_value = value + self.add_parse_action(self._add_tag) + + def _add_tag(self, tokens: ParseResults): + tokens[self.tag_name] = self.tag_value + + def _generateDefaultName(self) -> str: + return f"{type(self).__name__}:{self.tag_name}={self.tag_value!r}" + + class ParseExpression(ParserElement): """Abstract subclass of ParserElement, for combining and post-processing parsed tokens. @@ -3823,7 +3847,7 @@ def ignore(self, other) -> ParserElement: return self def _generateDefaultName(self) -> str: - return f"{self.__class__.__name__}:({str(self.exprs)})" + return f"{type(self).__name__}:({self.exprs})" def streamline(self) -> ParserElement: if self.streamlined: @@ -3862,7 +3886,7 @@ def streamline(self) -> ParserElement: self.mayReturnEmpty |= other.mayReturnEmpty self.mayIndexError |= other.mayIndexError - self.errmsg = "Expected " + str(self) + self.errmsg = f"Expected {self}" return self @@ -3883,39 +3907,37 @@ def copy(self) -> ParserElement: ret.exprs = [e.copy() for e in self.exprs] return ret - def _setResultsName(self, name, listAllMatches=False): - if ( + def _setResultsName(self, name, list_all_matches=False) -> ParserElement: + if not ( __diag__.warn_ungrouped_named_tokens_in_collection and Diagnostics.warn_ungrouped_named_tokens_in_collection not in self.suppress_warnings_ ): - for e in self.exprs: - if ( - isinstance(e, ParserElement) - and e.resultsName - and Diagnostics.warn_ungrouped_named_tokens_in_collection + return super()._setResultsName(name, list_all_matches) + + for e in self.exprs: + if ( + isinstance(e, ParserElement) + and e.resultsName + and ( + Diagnostics.warn_ungrouped_named_tokens_in_collection not in e.suppress_warnings_ - ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "collides with {!r} on contained expression".format( - "warn_ungrouped_named_tokens_in_collection", - name, - type(self).__name__, - e.resultsName, - ), - stacklevel=3, - ) + ) + ): + warning = ( + "warn_ungrouped_named_tokens_in_collection:" + f" setting results name {name!r} on {type(self).__name__} expression" + f" collides with {e.resultsName!r} on contained expression" + ) + warnings.warn(warning, stacklevel=3) + break - return super()._setResultsName(name, listAllMatches) + return super()._setResultsName(name, list_all_matches) # Compatibility synonyms # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... + leaveWhitespace = replaced_by_pep8("leaveWhitespace", leave_whitespace) + ignoreWhitespace = replaced_by_pep8("ignoreWhitespace", ignore_whitespace) # fmt: on @@ -3950,20 +3972,20 @@ def __init__( ): exprs: List[ParserElement] = list(exprs_arg) if exprs and Ellipsis in exprs: - tmp = [] + tmp: List[ParserElement] = [] for i, expr in enumerate(exprs): - if expr is Ellipsis: - if i < len(exprs) - 1: - skipto_arg: ParserElement = typing.cast( - ParseExpression, (Empty() + exprs[i + 1]) - ).exprs[-1] - tmp.append(SkipTo(skipto_arg)("_skipped*")) - else: - raise Exception( - "cannot construct And with sequence ending in ..." - ) - else: + if expr is not Ellipsis: tmp.append(expr) + continue + + if i < len(exprs) - 1: + skipto_arg: ParserElement = typing.cast( + ParseExpression, (Empty() + exprs[i + 1]) + ).exprs[-1] + tmp.append(SkipTo(skipto_arg)("_skipped*")) + continue + + raise Exception("cannot construct And with sequence ending in ...") exprs[:] = tmp super().__init__(exprs, savelist) if self.exprs: @@ -3982,25 +4004,24 @@ def __init__( def streamline(self) -> ParserElement: # collapse any _PendingSkip's - if self.exprs: - if any( - isinstance(e, ParseExpression) - and e.exprs - and isinstance(e.exprs[-1], _PendingSkip) - for e in self.exprs[:-1] - ): - deleted_expr_marker = NoMatch() - for i, e in enumerate(self.exprs[:-1]): - if e is deleted_expr_marker: - continue - if ( - isinstance(e, ParseExpression) - and e.exprs - and isinstance(e.exprs[-1], _PendingSkip) - ): - e.exprs[-1] = e.exprs[-1] + self.exprs[i + 1] - self.exprs[i + 1] = deleted_expr_marker - self.exprs = [e for e in self.exprs if e is not deleted_expr_marker] + if self.exprs and any( + isinstance(e, ParseExpression) + and e.exprs + and isinstance(e.exprs[-1], _PendingSkip) + for e in self.exprs[:-1] + ): + deleted_expr_marker = NoMatch() + for i, e in enumerate(self.exprs[:-1]): + if e is deleted_expr_marker: + continue + if ( + isinstance(e, ParseExpression) + and e.exprs + and isinstance(e.exprs[-1], _PendingSkip) + ): + e.exprs[-1] = e.exprs[-1] + self.exprs[i + 1] + self.exprs[i + 1] = deleted_expr_marker + self.exprs = [e for e in self.exprs if e is not deleted_expr_marker] super().streamline() @@ -4031,11 +4052,11 @@ def streamline(self) -> ParserElement: self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) return self - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True): # pass False as callPreParse arg to _parse for first element, since we already # pre-parsed the string as part of our And pre-parsing loc, resultlist = self.exprs[0]._parse( - instring, loc, doActions, callPreParse=False + instring, loc, do_actions, callPreParse=False ) errorStop = False for e in self.exprs[1:]: @@ -4045,7 +4066,7 @@ def parseImpl(self, instring, loc, doActions=True): continue if errorStop: try: - loc, exprtokens = e._parse(instring, loc, doActions) + loc, exprtokens = e._parse(instring, loc, do_actions) except ParseSyntaxException: raise except ParseBaseException as pe: @@ -4056,7 +4077,7 @@ def parseImpl(self, instring, loc, doActions=True): instring, len(instring), self.errmsg, self ) else: - loc, exprtokens = e._parse(instring, loc, doActions) + loc, exprtokens = e._parse(instring, loc, do_actions) resultlist += exprtokens return loc, resultlist @@ -4079,7 +4100,7 @@ def _generateDefaultName(self) -> str: # strip off redundant inner {}'s while len(inner) > 1 and inner[0 :: len(inner) - 1] == "{}": inner = inner[1:-1] - return "{" + inner + "}" + return f"{{{inner}}}" class Or(ParseExpression): @@ -4120,11 +4141,11 @@ def streamline(self) -> ParserElement: self.saveAsList = False return self - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: maxExcLoc = -1 maxException = None - matches = [] - fatals = [] + matches: List[Tuple[int, ParserElement]] = [] + fatals: List[ParseFatalException] = [] if all(e.callPreparse for e in self.exprs): loc = self.preParse(instring, loc) for e in self.exprs: @@ -4157,11 +4178,11 @@ def parseImpl(self, instring, loc, doActions=True): # might change whether or how much they match of the input. matches.sort(key=itemgetter(0), reverse=True) - if not doActions: + if not do_actions: # no further conditions or parse actions to change the selection of # alternative, so the first match will be the best match best_expr = matches[0][1] - return best_expr._parse(instring, loc, doActions) + return best_expr._parse(instring, loc, do_actions) longest = -1, None for loc1, expr1 in matches: @@ -4170,7 +4191,7 @@ def parseImpl(self, instring, loc, doActions=True): return longest try: - loc2, toks = expr1._parse(instring, loc, doActions) + loc2, toks = expr1._parse(instring, loc, do_actions) except ParseException as err: err.__traceback__ = None if err.loc > maxExcLoc: @@ -4200,10 +4221,8 @@ def parseImpl(self, instring, loc, doActions=True): if maxExcLoc == loc: maxException.msg = self.errmsg raise maxException - else: - raise ParseException( - instring, loc, "no defined alternatives to match", self - ) + + raise ParseException(instring, loc, "no defined alternatives to match", self) def __ixor__(self, other): if isinstance(other, str_type): @@ -4213,9 +4232,9 @@ def __ixor__(self, other): return self.append(other) # Or([self, other]) def _generateDefaultName(self) -> str: - return "{" + " ^ ".join(str(e) for e in self.exprs) + "}" + return f"{{{' ^ '.join(str(e) for e in self.exprs)}}}" - def _setResultsName(self, name, listAllMatches=False): + def _setResultsName(self, name, list_all_matches=False) -> ParserElement: if ( __diag__.warn_multiple_tokens_in_named_alternation and Diagnostics.warn_multiple_tokens_in_named_alternation @@ -4227,19 +4246,16 @@ def _setResultsName(self, name, listAllMatches=False): not in e.suppress_warnings_ for e in self.exprs ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "will return a list of all parsed tokens in an And alternative, " - "in prior versions only the first token was returned; enclose " - "contained argument in Group".format( - "warn_multiple_tokens_in_named_alternation", - name, - type(self).__name__, - ), - stacklevel=3, + warning = ( + "warn_multiple_tokens_in_named_alternation:" + f" setting results name {name!r} on {type(self).__name__} expression" + " will return a list of all parsed tokens in an And alternative," + " in prior versions only the first token was returned; enclose" + " contained argument in Group" ) + warnings.warn(warning, stacklevel=3) - return super()._setResultsName(name, listAllMatches) + return super()._setResultsName(name, list_all_matches) class MatchFirst(ParseExpression): @@ -4284,17 +4300,13 @@ def streamline(self) -> ParserElement: self.mayReturnEmpty = True return self - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: maxExcLoc = -1 maxException = None for e in self.exprs: try: - return e._parse( - instring, - loc, - doActions, - ) + return e._parse(instring, loc, do_actions) except ParseFatalException as pfe: pfe.__traceback__ = None pfe.parser_element = e @@ -4316,10 +4328,8 @@ def parseImpl(self, instring, loc, doActions=True): if maxExcLoc == loc: maxException.msg = self.errmsg raise maxException - else: - raise ParseException( - instring, loc, "no defined alternatives to match", self - ) + + raise ParseException(instring, loc, "no defined alternatives to match", self) def __ior__(self, other): if isinstance(other, str_type): @@ -4329,9 +4339,9 @@ def __ior__(self, other): return self.append(other) # MatchFirst([self, other]) def _generateDefaultName(self) -> str: - return "{" + " | ".join(str(e) for e in self.exprs) + "}" + return f"{{{' | '.join(str(e) for e in self.exprs)}}}" - def _setResultsName(self, name, listAllMatches=False): + def _setResultsName(self, name, list_all_matches=False) -> ParserElement: if ( __diag__.warn_multiple_tokens_in_named_alternation and Diagnostics.warn_multiple_tokens_in_named_alternation @@ -4343,19 +4353,16 @@ def _setResultsName(self, name, listAllMatches=False): not in e.suppress_warnings_ for e in self.exprs ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "will return a list of all parsed tokens in an And alternative, " - "in prior versions only the first token was returned; enclose " - "contained argument in Group".format( - "warn_multiple_tokens_in_named_alternation", - name, - type(self).__name__, - ), - stacklevel=3, + warning = ( + "warn_multiple_tokens_in_named_alternation:" + f" setting results name {name!r} on {type(self).__name__} expression" + " will return a list of all parsed tokens in an And alternative," + " in prior versions only the first token was returned; enclose" + " contained argument in Group" ) + warnings.warn(warning, stacklevel=3) - return super()._setResultsName(name, listAllMatches) + return super()._setResultsName(name, list_all_matches) class Each(ParseExpression): @@ -4441,7 +4448,7 @@ def streamline(self) -> ParserElement: self.mayReturnEmpty = True return self - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if self.initExprGroups: self.opt1map = dict( (id(e.expr), e) for e in self.exprs if isinstance(e, Opt) @@ -4473,11 +4480,11 @@ def parseImpl(self, instring, loc, doActions=True): tmpReqd = self.required[:] tmpOpt = self.optionals[:] multis = self.multioptionals[:] - matchOrder = [] + matchOrder: List[ParserElement] = [] keepMatching = True - failed = [] - fatals = [] + failed: List[ParserElement] = [] + fatals: List[ParseFatalException] = [] while keepMatching: tmpExprs = tmpReqd + tmpOpt + multis failed.clear() @@ -4523,13 +4530,13 @@ def parseImpl(self, instring, loc, doActions=True): total_results = ParseResults([]) for e in matchOrder: - loc, results = e._parse(instring, loc, doActions) + loc, results = e._parse(instring, loc, do_actions) total_results += results return loc, total_results def _generateDefaultName(self) -> str: - return "{" + " & ".join(str(e) for e in self.exprs) + "}" + return f"{{{' & '.join(str(e) for e in self.exprs)}}}" class ParseElementEnhance(ParserElement): @@ -4563,17 +4570,20 @@ def __init__(self, expr: Union[ParserElement, str], savelist: bool = False): def recurse(self) -> List[ParserElement]: return [self.expr] if self.expr is not None else [] - def parseImpl(self, instring, loc, doActions=True): - if self.expr is not None: - try: - return self.expr._parse(instring, loc, doActions, callPreParse=False) - except ParseBaseException as pbe: - if not isinstance(self, Forward) or self.customName is not None: - pbe.msg = self.errmsg - raise - else: + def parseImpl(self, instring, loc, do_actions=True): + if self.expr is None: raise ParseException(instring, loc, "No expression defined", self) + try: + return self.expr._parse(instring, loc, do_actions, callPreParse=False) + except ParseSyntaxException: + raise + except ParseBaseException as pbe: + if not isinstance(self, Forward) or self.customName is not None: + if self.errmsg: + pbe.msg = self.errmsg + raise + def leave_whitespace(self, recursive: bool = True) -> ParserElement: super().leave_whitespace(recursive) @@ -4593,15 +4603,11 @@ def ignore_whitespace(self, recursive: bool = True) -> ParserElement: return self def ignore(self, other) -> ParserElement: - if isinstance(other, Suppress): - if other not in self.ignoreExprs: - super().ignore(other) - if self.expr is not None: - self.expr.ignore(self.ignoreExprs[-1]) - else: + if not isinstance(other, Suppress) or other not in self.ignoreExprs: super().ignore(other) if self.expr is not None: self.expr.ignore(self.ignoreExprs[-1]) + return self def streamline(self) -> ParserElement: @@ -4631,15 +4637,12 @@ def validate(self, validateTrace=None) -> None: self._checkRecursion([]) def _generateDefaultName(self) -> str: - return f"{self.__class__.__name__}:({str(self.expr)})" + return f"{type(self).__name__}:({self.expr})" # Compatibility synonyms # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... + leaveWhitespace = replaced_by_pep8("leaveWhitespace", leave_whitespace) + ignoreWhitespace = replaced_by_pep8("ignoreWhitespace", ignore_whitespace) # fmt: on @@ -4671,14 +4674,14 @@ def __init__( self._grouped = grouped self.parent_anchor = 1 - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: # advance parse position to non-whitespace by using an Empty() # this should be the column to be used for all subsequent indented lines anchor_loc = Empty().preParse(instring, loc) # see if self.expr matches at the current location - if not it will raise an exception # and no further work is necessary - self.expr.try_parse(instring, anchor_loc, do_actions=doActions) + self.expr.try_parse(instring, anchor_loc, do_actions=do_actions) indent_col = col(anchor_loc, instring) peer_detect_expr = self._Indent(indent_col) @@ -4703,7 +4706,7 @@ def parseImpl(self, instring, loc, doActions=True): else: wrapper = lambda expr: expr return (wrapper(block) + Optional(trailing_undent)).parseImpl( - instring, anchor_loc, doActions + instring, anchor_loc, do_actions ) @@ -4722,10 +4725,10 @@ def __init__(self, expr: Union[ParserElement, str]): super().__init__(expr) self.callPreparse = False - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if loc != 0: raise ParseException(instring, loc, "not found at string start") - return super().parseImpl(instring, loc, doActions) + return super().parseImpl(instring, loc, do_actions) class AtLineStart(ParseElementEnhance): @@ -4755,10 +4758,10 @@ def __init__(self, expr: Union[ParserElement, str]): super().__init__(expr) self.callPreparse = False - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if col(loc, instring) != 1: raise ParseException(instring, loc, "not found at line start") - return super().parseImpl(instring, loc, doActions) + return super().parseImpl(instring, loc, do_actions) class FollowedBy(ParseElementEnhance): @@ -4788,10 +4791,10 @@ def __init__(self, expr: Union[ParserElement, str]): super().__init__(expr) self.mayReturnEmpty = True - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: # by using self._expr.parse and deleting the contents of the returned ParseResults list # we keep any named results that were defined in the FollowedBy expression - _, ret = self.expr._parse(instring, loc, doActions=doActions) + _, ret = self.expr._parse(instring, loc, do_actions=do_actions) del ret[:] return loc, ret @@ -4849,33 +4852,34 @@ def __init__( retreat = 0 self.exact = True self.retreat = retreat - self.errmsg = "not preceded by " + str(expr) + self.errmsg = f"not preceded by {expr}" self.skipWhitespace = False self.parseAction.append(lambda s, l, t: t.__delitem__(slice(None, None))) - def parseImpl(self, instring, loc=0, doActions=True): + def parseImpl(self, instring, loc=0, do_actions=True) -> ParseImplReturnType: if self.exact: if loc < self.retreat: raise ParseException(instring, loc, self.errmsg) start = loc - self.retreat _, ret = self.expr._parse(instring, start) - else: - # retreat specified a maximum lookbehind window, iterate - test_expr = self.expr + StringEnd() - instring_slice = instring[max(0, loc - self.retreat) : loc] - last_expr = ParseException(instring, loc, self.errmsg) - for offset in range(1, min(loc, self.retreat + 1) + 1): - try: - # print('trying', offset, instring_slice, repr(instring_slice[loc - offset:])) - _, ret = test_expr._parse( - instring_slice, len(instring_slice) - offset - ) - except ParseBaseException as pbe: - last_expr = pbe - else: - break + return loc, ret + + # retreat specified a maximum lookbehind window, iterate + test_expr = self.expr + StringEnd() + instring_slice = instring[max(0, loc - self.retreat) : loc] + last_expr = ParseException(instring, loc, self.errmsg) + + for offset in range(1, min(loc, self.retreat + 1) + 1): + try: + # print('trying', offset, instring_slice, repr(instring_slice[loc - offset:])) + _, ret = test_expr._parse(instring_slice, len(instring_slice) - offset) + except ParseBaseException as pbe: + last_expr = pbe else: - raise last_expr + break + else: + raise last_expr + return loc, ret @@ -4907,9 +4911,9 @@ class Located(ParseElementEnhance): """ - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: start = loc - loc, tokens = self.expr._parse(instring, start, doActions, callPreParse=False) + loc, tokens = self.expr._parse(instring, start, do_actions, callPreParse=False) ret_tokens = ParseResults([start, tokens, loc]) ret_tokens["locn_start"] = start ret_tokens["value"] = tokens @@ -4953,15 +4957,15 @@ def __init__(self, expr: Union[ParserElement, str]): self.skipWhitespace = False self.mayReturnEmpty = True - self.errmsg = "Found unwanted token, " + str(self.expr) + self.errmsg = f"Found unwanted token, {self.expr}" - def parseImpl(self, instring, loc, doActions=True): - if self.expr.can_parse_next(instring, loc, do_actions=doActions): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: + if self.expr.can_parse_next(instring, loc, do_actions=do_actions): raise ParseException(instring, loc, self.errmsg, self) return loc, [] def _generateDefaultName(self) -> str: - return "~{" + str(self.expr) + "}" + return f"~{{{self.expr}}}" class _MultipleMatch(ParseElementEnhance): @@ -4986,7 +4990,7 @@ def stopOn(self, ender) -> ParserElement: self.not_ender = ~ender if ender is not None else None return self - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: self_expr_parse = self.expr._parse self_skip_ignorables = self._skipIgnorables check_ender = self.not_ender is not None @@ -4997,7 +5001,7 @@ def parseImpl(self, instring, loc, doActions=True): # if so, fail) if check_ender: try_not_ender(instring, loc) - loc, tokens = self_expr_parse(instring, loc, doActions) + loc, tokens = self_expr_parse(instring, loc, do_actions) try: hasIgnoreExprs = not not self.ignoreExprs while 1: @@ -5007,14 +5011,14 @@ def parseImpl(self, instring, loc, doActions=True): preloc = self_skip_ignorables(instring, loc) else: preloc = loc - loc, tmptokens = self_expr_parse(instring, preloc, doActions) + loc, tmptokens = self_expr_parse(instring, preloc, do_actions) tokens += tmptokens except (ParseException, IndexError): pass return loc, tokens - def _setResultsName(self, name, listAllMatches=False): + def _setResultsName(self, name, list_all_matches=False) -> ParserElement: if ( __diag__.warn_ungrouped_named_tokens_in_collection and Diagnostics.warn_ungrouped_named_tokens_in_collection @@ -5024,21 +5028,20 @@ def _setResultsName(self, name, listAllMatches=False): if ( isinstance(e, ParserElement) and e.resultsName - and Diagnostics.warn_ungrouped_named_tokens_in_collection - not in e.suppress_warnings_ + and ( + Diagnostics.warn_ungrouped_named_tokens_in_collection + not in e.suppress_warnings_ + ) ): - warnings.warn( - "{}: setting results name {!r} on {} expression " - "collides with {!r} on contained expression".format( - "warn_ungrouped_named_tokens_in_collection", - name, - type(self).__name__, - e.resultsName, - ), - stacklevel=3, + warning = ( + "warn_ungrouped_named_tokens_in_collection:" + f" setting results name {name!r} on {type(self).__name__} expression" + f" collides with {e.resultsName!r} on contained expression" ) + warnings.warn(warning, stacklevel=3) + break - return super()._setResultsName(name, listAllMatches) + return super()._setResultsName(name, list_all_matches) class OneOrMore(_MultipleMatch): @@ -5070,7 +5073,7 @@ class OneOrMore(_MultipleMatch): """ def _generateDefaultName(self) -> str: - return "{" + str(self.expr) + "}..." + return f"{{{self.expr}}}..." class ZeroOrMore(_MultipleMatch): @@ -5097,14 +5100,14 @@ def __init__( super().__init__(expr, stopOn=stopOn or stop_on) self.mayReturnEmpty = True - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: try: - return super().parseImpl(instring, loc, doActions) + return super().parseImpl(instring, loc, do_actions) except (ParseException, IndexError): return loc, ParseResults([], name=self.resultsName) def _generateDefaultName(self) -> str: - return "[" + str(self.expr) + "]..." + return f"[{self.expr}]..." class DelimitedList(ParseElementEnhance): @@ -5139,12 +5142,11 @@ def __init__( expr = ParserElement._literalStringClass(expr) expr = typing.cast(ParserElement, expr) - if min is not None: - if min < 1: - raise ValueError("min must be greater than 0") - if max is not None: - if min is not None and max < min: - raise ValueError("max must be greater than, or equal to min") + if min is not None and min < 1: + raise ValueError("min must be greater than 0") + + if max is not None and min is not None and max < min: + raise ValueError("max must be greater than, or equal to min") self.content = expr self.raw_delim = str(delim) @@ -5169,7 +5171,8 @@ def __init__( super().__init__(delim_list_expr, savelist=True) def _generateDefaultName(self) -> str: - return "{0} [{1} {0}]...".format(self.content.streamline(), self.raw_delim) + content_expr = self.content.streamline() + return f"{content_expr} [{self.raw_delim} {content_expr}]..." class _NullToken: @@ -5230,10 +5233,10 @@ def __init__( self.defaultValue = default self.mayReturnEmpty = True - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: self_expr = self.expr try: - loc, tokens = self_expr._parse(instring, loc, doActions, callPreParse=False) + loc, tokens = self_expr._parse(instring, loc, do_actions, callPreParse=False) except (ParseException, IndexError): default_value = self.defaultValue if default_value is not self.__optionalNotMatched: @@ -5251,7 +5254,7 @@ def _generateDefaultName(self) -> str: # strip off redundant inner {}'s while len(inner) > 1 and inner[0 :: len(inner) - 1] == "{}": inner = inner[1:-1] - return "[" + inner + "]" + return f"[{inner}]" Optional = Opt @@ -5339,7 +5342,7 @@ def __init__( self.failOn = self._literalStringClass(failOn) else: self.failOn = failOn - self.errmsg = "No match found for " + str(self.expr) + self.errmsg = f"No match found for {self.expr}" self.ignorer = Empty().leave_whitespace() self._update_ignorer() @@ -5355,7 +5358,7 @@ def ignore(self, expr): super().ignore(expr) self._update_ignorer() - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True): startloc = loc instrlen = len(instring) self_expr_parse = self.expr._parse @@ -5385,7 +5388,7 @@ def parseImpl(self, instring, loc, doActions=True): prev_tmploc = tmploc try: - self_expr_parse(instring, tmploc, doActions=False, callPreParse=False) + self_expr_parse(instring, tmploc, do_actions=False, callPreParse=False) except (ParseException, IndexError): # no match, advance loc in string tmploc += 1 @@ -5403,7 +5406,7 @@ def parseImpl(self, instring, loc, doActions=True): skipresult = ParseResults(skiptext) if self.includeMatch: - loc, mat = self_expr_parse(instring, loc, doActions, callPreParse=False) + loc, mat = self_expr_parse(instring, loc, do_actions, callPreParse=False) skipresult += mat return loc, skipresult @@ -5500,7 +5503,7 @@ def __del__(self): lineno=self.caller_frame.lineno, ) - def parseImpl(self, instring, loc, doActions=True): + def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType: if ( self.expr is None and __diag__.warn_on_parse_using_empty_Forward @@ -5526,7 +5529,7 @@ def parseImpl(self, instring, loc, doActions=True): stacklevel=stacklevel, ) if not ParserElement._left_recursion_enabled: - return super().parseImpl(instring, loc, doActions) + return super().parseImpl(instring, loc, do_actions) # ## Bounded Recursion algorithm ## # Recursion only needs to be processed at ``Forward`` elements, since they are # the only ones that can actually refer to themselves. The general idea is @@ -5544,13 +5547,13 @@ def parseImpl(self, instring, loc, doActions=True): # # There is a complication since we not only *parse* but also *transform* via # actions: We do not want to run the actions too often while expanding. Thus, - # we expand using `doActions=False` and only run `doActions=True` if the next + # we expand using `do_actions=False` and only run `do_actions=True` if the next # recursion level is acceptable. with ParserElement.recursion_lock: memo = ParserElement.recursion_memos try: # we are parsing at a specific recursion expansion - use it as-is - prev_loc, prev_result = memo[loc, self, doActions] + prev_loc, prev_result = memo[loc, self, do_actions] if isinstance(prev_result, Exception): raise prev_result return prev_loc, prev_result.copy() @@ -5558,14 +5561,14 @@ def parseImpl(self, instring, loc, doActions=True): act_key = (loc, self, True) peek_key = (loc, self, False) # we are searching for the best recursion expansion - keep on improving - # both `doActions` cases must be tracked separately here! + # both `do_actions` cases must be tracked separately here! prev_loc, prev_peek = memo[peek_key] = ( loc - 1, ParseException( instring, loc, "Forward recursion without base case", self ), ) - if doActions: + if do_actions: memo[act_key] = memo[peek_key] while True: try: @@ -5577,8 +5580,8 @@ def parseImpl(self, instring, loc, doActions=True): new_loc, new_peek = prev_loc, prev_peek # the match did not get better: we are done if new_loc <= prev_loc: - if doActions: - # replace the match for doActions=False as well, + if do_actions: + # replace the match for do_actions=False as well, # in case the action did backtrack prev_loc, prev_result = memo[peek_key] = memo[act_key] del memo[peek_key], memo[act_key] @@ -5586,14 +5589,13 @@ def parseImpl(self, instring, loc, doActions=True): del memo[peek_key] return prev_loc, prev_peek.copy() # the match did get better: see if we can improve further - else: - if doActions: - try: - memo[act_key] = super().parseImpl(instring, loc, True) - except ParseException as e: - memo[peek_key] = memo[act_key] = (new_loc, e) - raise - prev_loc, prev_peek = memo[peek_key] = new_loc, new_peek + if do_actions: + try: + memo[act_key] = super().parseImpl(instring, loc, True) + except ParseException as e: + memo[peek_key] = memo[act_key] = (new_loc, e) + raise + prev_loc, prev_peek = memo[peek_key] = new_loc, new_peek def leave_whitespace(self, recursive: bool = True) -> ParserElement: self.skipWhitespace = False @@ -5637,7 +5639,7 @@ def _generateDefaultName(self) -> str: else: retString = "None" finally: - return self.__class__.__name__ + ": " + retString + return f"{type(self).__name__}: {retString}" def copy(self) -> ParserElement: if self.expr is not None: @@ -5647,30 +5649,27 @@ def copy(self) -> ParserElement: ret <<= self return ret - def _setResultsName(self, name, list_all_matches=False): + def _setResultsName(self, name, list_all_matches=False) -> ParserElement: + # fmt: off if ( __diag__.warn_name_set_on_empty_Forward - and Diagnostics.warn_name_set_on_empty_Forward - not in self.suppress_warnings_ + and Diagnostics.warn_name_set_on_empty_Forward not in self.suppress_warnings_ + and self.expr is None ): - if self.expr is None: - warnings.warn( - "{}: setting results name {!r} on {} expression " - "that has no contained expression".format( - "warn_name_set_on_empty_Forward", name, type(self).__name__ - ), - stacklevel=3, - ) + warning = ( + "warn_name_set_on_empty_Forward:" + f" setting results name {name!r} on {type(self).__name__} expression" + " that has no contained expression" + ) + warnings.warn(warning, stacklevel=3) + # fmt: on return super()._setResultsName(name, list_all_matches) # Compatibility synonyms # fmt: off - @replaced_by_pep8(leave_whitespace) - def leaveWhitespace(self): ... - - @replaced_by_pep8(ignore_whitespace) - def ignoreWhitespace(self): ... + leaveWhitespace = replaced_by_pep8("leaveWhitespace", leave_whitespace) + ignoreWhitespace = replaced_by_pep8("ignoreWhitespace", ignore_whitespace) # fmt: on @@ -5774,8 +5773,8 @@ def postParse(self, instring, loc, tokenlist): if isinstance(tokenlist, ParseResults) else list(tokenlist) ) - else: - return [tokenlist] + + return [tokenlist] class Dict(TokenConverter): @@ -5861,8 +5860,8 @@ def postParse(self, instring, loc, tokenlist): if self._asPythonDict: return [tokenlist.as_dict()] if self.resultsName else tokenlist.as_dict() - else: - return [tokenlist] if self.resultsName else tokenlist + + return [tokenlist] if self.resultsName else tokenlist class Suppress(TokenConverter): @@ -5904,14 +5903,14 @@ def __init__(self, expr: Union[ParserElement, str], savelist: bool = False): def __add__(self, other) -> "ParserElement": if isinstance(self.expr, _PendingSkip): return Suppress(SkipTo(other)) + other - else: - return super().__add__(other) + + return super().__add__(other) def __sub__(self, other) -> "ParserElement": if isinstance(self.expr, _PendingSkip): return Suppress(SkipTo(other)) - other - else: - return super().__sub__(other) + + return super().__sub__(other) def postParse(self, instring, loc, tokenlist): return [] @@ -5951,12 +5950,14 @@ def z(*paArgs): thisFunc = f.__name__ s, l, t = paArgs[-3:] if len(paArgs) > 3: - thisFunc = paArgs[0].__class__.__name__ + "." + thisFunc + thisFunc = f"{type(paArgs[0]).__name__}.{thisFunc}" sys.stderr.write(f">>entering {thisFunc}(line: {line(l, s)!r}, {l}, {t!r})\n") try: ret = f(*paArgs) except Exception as exc: - sys.stderr.write(f"<<leaving {thisFunc} (exception: {exc})\n") + sys.stderr.write( + f"<<leaving {thisFunc} (exception: {type(exc).__name__}: {exc})\n" + ) raise sys.stderr.write(f"<<leaving {thisFunc} (ret: {ret!r})\n") return ret @@ -6019,8 +6020,8 @@ def srange(s: str) -> str: - any combination of the above (``'aeiouy'``, ``'a-zA-Z0-9_$'``, etc.) """ - _expanded = ( - lambda p: p + _expanded = lambda p: ( + p if not isinstance(p, ParseResults) else "".join(chr(c) for c in range(ord(p[0]), ord(p[1]) + 1)) ) @@ -6134,7 +6135,7 @@ def autoname_elements() -> None: v for v in vars().values() if isinstance(v, ParserElement) ] -# backward compatibility names +# Compatibility synonyms # fmt: off sglQuotedString = sgl_quoted_string dblQuotedString = dbl_quoted_string @@ -6144,16 +6145,8 @@ def autoname_elements() -> None: lineEnd = line_end stringStart = string_start stringEnd = string_end - -@replaced_by_pep8(null_debug_action) -def nullDebugAction(): ... - -@replaced_by_pep8(trace_parse_action) -def traceParseAction(): ... - -@replaced_by_pep8(condition_as_parse_action) -def conditionAsParseAction(): ... - -@replaced_by_pep8(token_map) -def tokenMap(): ... +nullDebugAction = replaced_by_pep8("nullDebugAction", null_debug_action) +traceParseAction = replaced_by_pep8("traceParseAction", trace_parse_action) +conditionAsParseAction = replaced_by_pep8("conditionAsParseAction", condition_as_parse_action) +tokenMap = replaced_by_pep8("tokenMap", token_map) # fmt: on diff --git a/libs/pyparsing/diagram/__init__.py b/libs/pyparsing/diagram/__init__.py index 267f34474..3275adafb 100644 --- a/libs/pyparsing/diagram/__init__.py +++ b/libs/pyparsing/diagram/__init__.py @@ -36,6 +36,7 @@ </head> <body> {% endif %} +<meta charset="UTF-8"/> {{ body | safe }} {% for diagram in diagrams %} <div class="railroad-group"> @@ -89,7 +90,7 @@ class AnnotatedItem(railroad.Group): """ def __init__(self, label: str, item): - super().__init__(item=item, label="[{}]".format(label) if label else label) + super().__init__(item=item, label=f"[{label}]") class EditablePartial(Generic[T]): @@ -145,7 +146,7 @@ def railroad_to_html(diagrams: List[NamedDiagram], embed=False, **kwargs) -> str continue io = StringIO() try: - css = kwargs.get('css') + css = kwargs.get("css") diagram.diagram.writeStandalone(io.write, css=css) except AttributeError: diagram.diagram.writeSvg(io.write) @@ -425,9 +426,11 @@ def _inner( element_results_name = element.resultsName if element_results_name: # add "*" to indicate if this is a "list all results" name - element_results_name += "" if element.modalResults else "*" + modal_tag = "" if element.modalResults else "*" ret = EditablePartial.from_call( - railroad.Group, item=ret, label=element_results_name + railroad.Group, + item=ret, + label=f"{repr(element_results_name)}{modal_tag}", ) return ret @@ -473,7 +476,7 @@ def _to_diagram_element( :param show_groups: bool flag indicating whether to show groups using bounding box """ exprs = element.recurse() - name = name_hint or element.customName or element.__class__.__name__ + name = name_hint or element.customName or type(element).__name__ # Python's id() is used to provide a unique identifier for elements el_id = id(element) @@ -534,7 +537,7 @@ def _to_diagram_element( # (all will have the same name, and resultsName) if not exprs: return None - if len(set((e.name, e.resultsName) for e in exprs)) == 1: + if len(set((e.name, e.resultsName) for e in exprs)) == 1 and len(exprs) > 2: ret = EditablePartial.from_call( railroad.OneOrMore, item="", repeat=str(len(exprs)) ) @@ -563,7 +566,7 @@ def _to_diagram_element( if show_groups: ret = EditablePartial.from_call(AnnotatedItem, label="", item="") else: - ret = EditablePartial.from_call(railroad.Group, label="", item="") + ret = EditablePartial.from_call(railroad.Sequence, items=[]) elif isinstance(element, pyparsing.TokenConverter): label = type(element).__name__.lower() if label == "tokenconverter": @@ -573,8 +576,36 @@ def _to_diagram_element( elif isinstance(element, pyparsing.Opt): ret = EditablePartial.from_call(railroad.Optional, item="") elif isinstance(element, pyparsing.OneOrMore): - ret = EditablePartial.from_call(railroad.OneOrMore, item="") + if element.not_ender is not None: + args = [ + parent, + lookup, + vertical, + index, + name_hint, + show_results_names, + show_groups, + ] + return _to_diagram_element( + (~element.not_ender.expr + element.expr)[1, ...].set_name(element.name), + *args, + ) + ret = EditablePartial.from_call(railroad.OneOrMore, item=None) elif isinstance(element, pyparsing.ZeroOrMore): + if element.not_ender is not None: + args = [ + parent, + lookup, + vertical, + index, + name_hint, + show_results_names, + show_groups, + ] + return _to_diagram_element( + (~element.not_ender.expr + element.expr)[...].set_name(element.name), + *args, + ) ret = EditablePartial.from_call(railroad.ZeroOrMore, item="") elif isinstance(element, pyparsing.Group): ret = EditablePartial.from_call( diff --git a/libs/pyparsing/exceptions.py b/libs/pyparsing/exceptions.py index 12219f124..8db34f195 100644 --- a/libs/pyparsing/exceptions.py +++ b/libs/pyparsing/exceptions.py @@ -14,11 +14,13 @@ from .unicode import pyparsing_unicode as ppu -class ExceptionWordUnicode(ppu.Latin1, ppu.LatinA, ppu.LatinB, ppu.Greek, ppu.Cyrillic): +class _ExceptionWordUnicodeSet( + ppu.Latin1, ppu.LatinA, ppu.LatinB, ppu.Greek, ppu.Cyrillic +): pass -_extract_alphanums = _collapse_string_to_ranges(ExceptionWordUnicode.alphanums) +_extract_alphanums = _collapse_string_to_ranges(_ExceptionWordUnicodeSet.alphanums) _exception_word_extractor = re.compile("([" + _extract_alphanums + "]{1,16})|.") @@ -83,44 +85,42 @@ def explain_exception(exc, depth=16): ret = [] if isinstance(exc, ParseBaseException): ret.append(exc.line) - ret.append(" " * (exc.column - 1) + "^") + ret.append(f"{' ' * (exc.column - 1)}^") ret.append(f"{type(exc).__name__}: {exc}") - if depth > 0: - callers = inspect.getinnerframes(exc.__traceback__, context=depth) - seen = set() - for i, ff in enumerate(callers[-depth:]): - frm = ff[0] - - f_self = frm.f_locals.get("self", None) - if isinstance(f_self, ParserElement): - if not frm.f_code.co_name.startswith( - ("parseImpl", "_parseNoCache") - ): - continue - if id(f_self) in seen: - continue - seen.add(id(f_self)) - - self_type = type(f_self) - ret.append( - f"{self_type.__module__}.{self_type.__name__} - {f_self}" - ) - - elif f_self is not None: - self_type = type(f_self) - ret.append(f"{self_type.__module__}.{self_type.__name__}") + if depth <= 0: + return "\n".join(ret) - else: - code = frm.f_code - if code.co_name in ("wrapper", "<module>"): - continue + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for ff in callers[-depth:]: + frm = ff[0] + + f_self = frm.f_locals.get("self", None) + if isinstance(f_self, ParserElement): + if not frm.f_code.co_name.startswith(("parseImpl", "_parseNoCache")): + continue + if id(f_self) in seen: + continue + seen.add(id(f_self)) + + self_type = type(f_self) + ret.append(f"{self_type.__module__}.{self_type.__name__} - {f_self}") + + elif f_self is not None: + self_type = type(f_self) + ret.append(f"{self_type.__module__}.{self_type.__name__}") + + else: + code = frm.f_code + if code.co_name in ("wrapper", "<module>"): + continue - ret.append(code.co_name) + ret.append(code.co_name) - depth -= 1 - if not depth: - break + depth -= 1 + if not depth: + break return "\n".join(ret) @@ -220,8 +220,10 @@ def explain(self, depth=16) -> str: Example:: + # an expression to parse 3 integers expr = pp.Word(pp.nums) * 3 try: + # a failing parse - the third integer is prefixed with "A" expr.parse_string("123 456 A789") except pp.ParseException as pe: print(pe.explain(depth=0)) @@ -243,9 +245,9 @@ def explain(self, depth=16) -> str: """ return self.explain_exception(self, depth) + # Compatibility synonyms # fmt: off - @replaced_by_pep8(mark_input_line) - def markInputline(self): ... + markInputline = replaced_by_pep8("markInputline", mark_input_line) # fmt: on @@ -255,16 +257,16 @@ class ParseException(ParseBaseException): Example:: + integer = Word(nums).set_name("integer") try: - Word(nums).set_name("integer").parse_string("ABC") + integer.parse_string("ABC") except ParseException as pe: print(pe) - print("column: {}".format(pe.column)) + print(f"column: {pe.column}") prints:: - Expected integer (at char 0), (line:1, col:1) - column: 1 + Expected integer (at char 0), (line:1, col:1) column: 1 """ diff --git a/libs/pyparsing/helpers.py b/libs/pyparsing/helpers.py index 018f0d6ac..d5d14a08d 100644 --- a/libs/pyparsing/helpers.py +++ b/libs/pyparsing/helpers.py @@ -74,7 +74,7 @@ def count_field_parse_action(s, l, t): intExpr = intExpr.copy() intExpr.set_name("arrayLen") intExpr.add_parse_action(count_field_parse_action, call_during_try=True) - return (intExpr + array_expr).set_name("(len) " + str(expr) + "...") + return (intExpr + array_expr).set_name(f"(len) {expr}...") def match_previous_literal(expr: ParserElement) -> ParserElement: @@ -95,15 +95,17 @@ def match_previous_literal(expr: ParserElement) -> ParserElement: rep = Forward() def copy_token_to_repeater(s, l, t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.as_list()) - rep << And(Literal(tt) for tt in tflat) - else: + if not t: rep << Empty() + return + + if len(t) == 1: + rep << t[0] + return + + # flatten t tokens + tflat = _flatten(t.as_list()) + rep << And(Literal(tt) for tt in tflat) expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) rep.set_name("(prev) " + str(expr)) @@ -230,7 +232,7 @@ def one_of( if isequal(other, cur): del symbols[i + j + 1] break - elif masks(cur, other): + if masks(cur, other): del symbols[i + j + 1] symbols.insert(i, other) break @@ -534,7 +536,9 @@ def nested_expr( ) else: ret <<= Group(Suppress(opener) + ZeroOrMore(ret | content) + Suppress(closer)) - ret.set_name("nested %s%s expression" % (opener, closer)) + ret.set_name(f"nested {opener}{closer} expression") + # don't override error message from content expressions + ret.errmsg = None return ret @@ -580,7 +584,7 @@ def _makeTags(tagStr, xml, suppress_LT=Suppress("<"), suppress_GT=Suppress(">")) ) closeTag = Combine(Literal("</") + tagStr + ">", adjacent=False) - openTag.set_name("<%s>" % resname) + openTag.set_name(f"<{resname}>") # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels openTag.add_parse_action( lambda t: t.__setitem__( @@ -589,7 +593,7 @@ def _makeTags(tagStr, xml, suppress_LT=Suppress("<"), suppress_GT=Suppress(">")) ) closeTag = closeTag( "end" + "".join(resname.replace(":", " ").title().split()) - ).set_name("</%s>" % resname) + ).set_name(f"</{resname}>") openTag.tag = resname closeTag.tag = resname openTag.tag_body = SkipTo(closeTag()) @@ -777,17 +781,20 @@ def parseImpl(self, instring, loc, doActions=True): rpar = Suppress(rpar) # if lpar and rpar are not suppressed, wrap in group - if not (isinstance(rpar, Suppress) and isinstance(rpar, Suppress)): - lastExpr = base_expr | Group(lpar + ret + rpar) + if not (isinstance(lpar, Suppress) and isinstance(rpar, Suppress)): + lastExpr = base_expr | Group(lpar + ret + rpar).set_name( + f"nested_{base_expr.name}" + ) else: - lastExpr = base_expr | (lpar + ret + rpar) + lastExpr = base_expr | (lpar + ret + rpar).set_name(f"nested_{base_expr.name}") + root_expr = lastExpr arity: int rightLeftAssoc: opAssoc pa: typing.Optional[ParseAction] opExpr1: ParserElement opExpr2: ParserElement - for i, operDef in enumerate(op_list): + for operDef in op_list: opExpr, arity, rightLeftAssoc, pa = (operDef + (None,))[:4] # type: ignore[assignment] if isinstance(opExpr, str_type): opExpr = ParserElement._literalStringClass(opExpr) @@ -851,6 +858,7 @@ def parseImpl(self, instring, loc, doActions=True): thisExpr <<= (matchExpr | lastExpr).setName(term_name) lastExpr = thisExpr ret <<= lastExpr + root_expr.set_name("base_expr") return ret @@ -1045,7 +1053,7 @@ def delimited_list( ) -# pre-PEP8 compatible names +# Compatibility synonyms # fmt: off opAssoc = OpAssoc anyOpenTag = any_open_tag @@ -1058,43 +1066,17 @@ def delimited_list( cppStyleComment = cpp_style_comment javaStyleComment = java_style_comment pythonStyleComment = python_style_comment - -@replaced_by_pep8(DelimitedList) -def delimitedList(): ... - -@replaced_by_pep8(DelimitedList) -def delimited_list(): ... - -@replaced_by_pep8(counted_array) -def countedArray(): ... - -@replaced_by_pep8(match_previous_literal) -def matchPreviousLiteral(): ... - -@replaced_by_pep8(match_previous_expr) -def matchPreviousExpr(): ... - -@replaced_by_pep8(one_of) -def oneOf(): ... - -@replaced_by_pep8(dict_of) -def dictOf(): ... - -@replaced_by_pep8(original_text_for) -def originalTextFor(): ... - -@replaced_by_pep8(nested_expr) -def nestedExpr(): ... - -@replaced_by_pep8(make_html_tags) -def makeHTMLTags(): ... - -@replaced_by_pep8(make_xml_tags) -def makeXMLTags(): ... - -@replaced_by_pep8(replace_html_entity) -def replaceHTMLEntity(): ... - -@replaced_by_pep8(infix_notation) -def infixNotation(): ... +delimitedList = replaced_by_pep8("delimitedList", DelimitedList) +delimited_list = replaced_by_pep8("delimited_list", DelimitedList) +countedArray = replaced_by_pep8("countedArray", counted_array) +matchPreviousLiteral = replaced_by_pep8("matchPreviousLiteral", match_previous_literal) +matchPreviousExpr = replaced_by_pep8("matchPreviousExpr", match_previous_expr) +oneOf = replaced_by_pep8("oneOf", one_of) +dictOf = replaced_by_pep8("dictOf", dict_of) +originalTextFor = replaced_by_pep8("originalTextFor", original_text_for) +nestedExpr = replaced_by_pep8("nestedExpr", nested_expr) +makeHTMLTags = replaced_by_pep8("makeHTMLTags", make_html_tags) +makeXMLTags = replaced_by_pep8("makeXMLTags", make_xml_tags) +replaceHTMLEntity = replaced_by_pep8("replaceHTMLEntity", replace_html_entity) +infixNotation = replaced_by_pep8("infixNotation", infix_notation) # fmt: on diff --git a/libs/pyparsing/results.py b/libs/pyparsing/results.py index 031304976..3bb7c948e 100644 --- a/libs/pyparsing/results.py +++ b/libs/pyparsing/results.py @@ -4,12 +4,14 @@ Mapping, MutableSequence, Iterator, - Sequence, - Container, + Iterable, ) import pprint from typing import Tuple, Any, Dict, Set, List +from .util import replaced_by_pep8 + + str_type: Tuple[type, ...] = (str, bytes) _generator_type = type((_ for _ in ())) @@ -173,42 +175,48 @@ def __init__( ): self._tokdict: Dict[str, _ParseResultsWithOffset] self._modal = modal - if name is not None and name != "": - if isinstance(name, int): - name = str(name) - if not modal: - self._all_names = {name} - self._name = name - if toklist not in self._null_values: - if isinstance(toklist, (str_type, type)): - toklist = [toklist] - if asList: - if isinstance(toklist, ParseResults): - self[name] = _ParseResultsWithOffset( - ParseResults(toklist._toklist), 0 - ) - else: - self[name] = _ParseResultsWithOffset( - ParseResults(toklist[0]), 0 - ) - self[name]._name = name - else: - try: - self[name] = toklist[0] - except (KeyError, TypeError, IndexError): - if toklist is not self: - self[name] = toklist - else: - self._name = name + + if name is None or name == "": + return + + if isinstance(name, int): + name = str(name) + + if not modal: + self._all_names = {name} + + self._name = name + + if toklist in self._null_values: + return + + if isinstance(toklist, (str_type, type)): + toklist = [toklist] + + if asList: + if isinstance(toklist, ParseResults): + self[name] = _ParseResultsWithOffset(ParseResults(toklist._toklist), 0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]), 0) + self[name]._name = name + return + + try: + self[name] = toklist[0] + except (KeyError, TypeError, IndexError): + if toklist is not self: + self[name] = toklist + else: + self._name = name def __getitem__(self, i): if isinstance(i, (int, slice)): return self._toklist[i] - else: - if i not in self._all_names: - return self._tokdict[i][-1][0] - else: - return ParseResults([v[0] for v in self._tokdict[i]]) + + if i not in self._all_names: + return self._tokdict[i][-1][0] + + return ParseResults([v[0] for v in self._tokdict[i]]) def __setitem__(self, k, v, isinstance=isinstance): if isinstance(v, _ParseResultsWithOffset): @@ -226,27 +234,28 @@ def __setitem__(self, k, v, isinstance=isinstance): sub._parent = self def __delitem__(self, i): - if isinstance(i, (int, slice)): - mylen = len(self._toklist) - del self._toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i + 1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name, occurrences in self._tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset( - value, position - (position > j) - ) - else: + if not isinstance(i, (int, slice)): del self._tokdict[i] + return + + mylen = len(self._toklist) + del self._toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i + 1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for occurrences in self._tokdict.values(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset( + value, position - (position > j) + ) def __contains__(self, k) -> bool: return k in self._tokdict @@ -376,7 +385,7 @@ def insert_locn(locn, tokens): """ self._toklist.insert(index, ins_string) # fixup indices in token dictionary - for name, occurrences in self._tokdict.items(): + for occurrences in self._tokdict.values(): for k, (value, position) in enumerate(occurrences): occurrences[k] = _ParseResultsWithOffset( value, position + (position > index) @@ -566,20 +575,20 @@ def deepcopy(self) -> "ParseResults": # replace values with copies if they are of known mutable types for i, obj in enumerate(self._toklist): if isinstance(obj, ParseResults): - self._toklist[i] = obj.deepcopy() + ret._toklist[i] = obj.deepcopy() elif isinstance(obj, (str, bytes)): pass elif isinstance(obj, MutableMapping): - self._toklist[i] = dest = type(obj)() + ret._toklist[i] = dest = type(obj)() for k, v in obj.items(): dest[k] = v.deepcopy() if isinstance(v, ParseResults) else v - elif isinstance(obj, Container): - self._toklist[i] = type(obj)( + elif isinstance(obj, Iterable): + ret._toklist[i] = type(obj)( v.deepcopy() if isinstance(v, ParseResults) else v for v in obj ) return ret - def get_name(self): + def get_name(self) -> str: r""" Returns the results name for this token expression. Useful when several different expressions might match at a particular location. @@ -652,58 +661,52 @@ def dump(self, indent="", full=True, include_list=True, _depth=0) -> str: NL = "\n" out.append(indent + str(self.as_list()) if include_list else "") - if full: - if self.haskeys(): - items = sorted((str(k), v) for k, v in self.items()) - for k, v in items: - if out: - out.append(NL) - out.append(f"{indent}{(' ' * _depth)}- {k}: ") - if isinstance(v, ParseResults): - if v: - out.append( - v.dump( - indent=indent, - full=full, - include_list=include_list, - _depth=_depth + 1, - ) - ) - else: - out.append(str(v)) - else: - out.append(repr(v)) - if any(isinstance(vv, ParseResults) for vv in self): - v = self - for i, vv in enumerate(v): - if isinstance(vv, ParseResults): - out.append( - "\n{}{}[{}]:\n{}{}{}".format( - indent, - (" " * (_depth)), - i, - indent, - (" " * (_depth + 1)), - vv.dump( - indent=indent, - full=full, - include_list=include_list, - _depth=_depth + 1, - ), - ) - ) - else: - out.append( - "\n%s%s[%d]:\n%s%s%s" - % ( - indent, - (" " * (_depth)), - i, - indent, - (" " * (_depth + 1)), - str(vv), - ) - ) + if not full: + return "".join(out) + + if self.haskeys(): + items = sorted((str(k), v) for k, v in self.items()) + for k, v in items: + if out: + out.append(NL) + out.append(f"{indent}{(' ' * _depth)}- {k}: ") + if not isinstance(v, ParseResults): + out.append(repr(v)) + continue + + if not v: + out.append(str(v)) + continue + + out.append( + v.dump( + indent=indent, + full=full, + include_list=include_list, + _depth=_depth + 1, + ) + ) + if not any(isinstance(vv, ParseResults) for vv in self): + return "".join(out) + + v = self + incr = " " + nl = "\n" + for i, vv in enumerate(v): + if isinstance(vv, ParseResults): + vv_dump = vv.dump( + indent=indent, + full=full, + include_list=include_list, + _depth=_depth + 1, + ) + out.append( + f"{nl}{indent}{incr * _depth}[{i}]:{nl}{indent}{incr * (_depth + 1)}{vv_dump}" + ) + else: + out.append( + f"{nl}{indent}{incr * _depth}[{i}]:{nl}{indent}{incr * (_depth + 1)}{vv}" + ) return "".join(out) diff --git a/libs/pyparsing/testing.py b/libs/pyparsing/testing.py index 6a254c1c5..5654d47d6 100644 --- a/libs/pyparsing/testing.py +++ b/libs/pyparsing/testing.py @@ -1,8 +1,10 @@ # testing.py from contextlib import contextmanager +import re import typing + from .core import ( ParserElement, ParseException, @@ -49,23 +51,23 @@ def save(self): self._save_context["default_whitespace"] = ParserElement.DEFAULT_WHITE_CHARS self._save_context["default_keyword_chars"] = Keyword.DEFAULT_KEYWORD_CHARS - self._save_context[ - "literal_string_class" - ] = ParserElement._literalStringClass + self._save_context["literal_string_class"] = ( + ParserElement._literalStringClass + ) self._save_context["verbose_stacktrace"] = ParserElement.verbose_stacktrace self._save_context["packrat_enabled"] = ParserElement._packratEnabled if ParserElement._packratEnabled: - self._save_context[ - "packrat_cache_size" - ] = ParserElement.packrat_cache.size + self._save_context["packrat_cache_size"] = ( + ParserElement.packrat_cache.size + ) else: self._save_context["packrat_cache_size"] = None self._save_context["packrat_parse"] = ParserElement._parse - self._save_context[ - "recursion_enabled" - ] = ParserElement._left_recursion_enabled + self._save_context["recursion_enabled"] = ( + ParserElement._left_recursion_enabled + ) self._save_context["__diag__"] = { name: getattr(__diag__, name) for name in __diag__._all_names @@ -180,49 +182,52 @@ def assertRunTestResults( """ run_test_success, run_test_results = run_tests_report - if expected_parse_results is not None: - merged = [ - (*rpt, expected) - for rpt, expected in zip(run_test_results, expected_parse_results) - ] - for test_string, result, expected in merged: - # expected should be a tuple containing a list and/or a dict or an exception, - # and optional failure message string - # an empty tuple will skip any result validation - fail_msg = next( - (exp for exp in expected if isinstance(exp, str)), None + if expected_parse_results is None: + self.assertTrue( + run_test_success, msg=msg if msg is not None else "failed runTests" + ) + return + + merged = [ + (*rpt, expected) + for rpt, expected in zip(run_test_results, expected_parse_results) + ] + for test_string, result, expected in merged: + # expected should be a tuple containing a list and/or a dict or an exception, + # and optional failure message string + # an empty tuple will skip any result validation + fail_msg = next((exp for exp in expected if isinstance(exp, str)), None) + expected_exception = next( + ( + exp + for exp in expected + if isinstance(exp, type) and issubclass(exp, Exception) + ), + None, + ) + if expected_exception is not None: + with self.assertRaises( + expected_exception=expected_exception, msg=fail_msg or msg + ): + if isinstance(result, Exception): + raise result + else: + expected_list = next( + (exp for exp in expected if isinstance(exp, list)), None ) - expected_exception = next( - ( - exp - for exp in expected - if isinstance(exp, type) and issubclass(exp, Exception) - ), - None, + expected_dict = next( + (exp for exp in expected if isinstance(exp, dict)), None ) - if expected_exception is not None: - with self.assertRaises( - expected_exception=expected_exception, msg=fail_msg or msg - ): - if isinstance(result, Exception): - raise result - else: - expected_list = next( - (exp for exp in expected if isinstance(exp, list)), None + if (expected_list, expected_dict) != (None, None): + self.assertParseResultsEquals( + result, + expected_list=expected_list, + expected_dict=expected_dict, + msg=fail_msg or msg, ) - expected_dict = next( - (exp for exp in expected if isinstance(exp, dict)), None - ) - if (expected_list, expected_dict) != (None, None): - self.assertParseResultsEquals( - result, - expected_list=expected_list, - expected_dict=expected_dict, - msg=fail_msg or msg, - ) - else: - # warning here maybe? - print(f"no validation for {test_string!r}") + else: + # warning here maybe? + print(f"no validation for {test_string!r}") # do this last, in case some specific test results can be reported instead self.assertTrue( @@ -230,9 +235,18 @@ def assertRunTestResults( ) @contextmanager - def assertRaisesParseException(self, exc_type=ParseException, msg=None): - with self.assertRaises(exc_type, msg=msg): - yield + def assertRaisesParseException( + self, exc_type=ParseException, expected_msg=None, msg=None + ): + if expected_msg is not None: + if isinstance(expected_msg, str): + expected_msg = re.escape(expected_msg) + with self.assertRaisesRegex(exc_type, expected_msg, msg=msg) as ctx: + yield ctx + + else: + with self.assertRaises(exc_type, msg=msg) as ctx: + yield ctx @staticmethod def with_line_numbers( diff --git a/libs/pyparsing/unicode.py b/libs/pyparsing/unicode.py index b0a87b235..0e3e06572 100644 --- a/libs/pyparsing/unicode.py +++ b/libs/pyparsing/unicode.py @@ -53,65 +53,60 @@ class CJK(Chinese, Japanese, Korean): _ranges: UnicodeRangeList = [] @_lazyclassproperty - def _chars_for_ranges(cls): - ret = [] + def _chars_for_ranges(cls) -> List[str]: + ret: List[int] = [] for cc in cls.__mro__: if cc is unicode_set: break for rr in getattr(cc, "_ranges", ()): ret.extend(range(rr[0], rr[-1] + 1)) - return [chr(c) for c in sorted(set(ret))] + return sorted(chr(c) for c in set(ret)) @_lazyclassproperty - def printables(cls): + def printables(cls) -> str: """all non-whitespace characters in this range""" return "".join(filterfalse(str.isspace, cls._chars_for_ranges)) @_lazyclassproperty - def alphas(cls): + def alphas(cls) -> str: """all alphabetic characters in this range""" return "".join(filter(str.isalpha, cls._chars_for_ranges)) @_lazyclassproperty - def nums(cls): + def nums(cls) -> str: """all numeric digit characters in this range""" return "".join(filter(str.isdigit, cls._chars_for_ranges)) @_lazyclassproperty - def alphanums(cls): + def alphanums(cls) -> str: """all alphanumeric characters in this range""" return cls.alphas + cls.nums @_lazyclassproperty - def identchars(cls): + def identchars(cls) -> str: """all characters in this range that are valid identifier characters, plus underscore '_'""" return "".join( sorted( - set( - "".join(filter(str.isidentifier, cls._chars_for_ranges)) - + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµº" - + "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" - + "_" + set(filter(str.isidentifier, cls._chars_for_ranges)) + | set( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµº" + "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" + "_" ) ) ) @_lazyclassproperty - def identbodychars(cls): + def identbodychars(cls) -> str: """ all characters in this range that are valid identifier body characters, plus the digits 0-9, and · (Unicode MIDDLE DOT) """ + identifier_chars = set( + c for c in cls._chars_for_ranges if ("_" + c).isidentifier() + ) return "".join( - sorted( - set( - cls.identchars - + "0123456789·" - + "".join( - [c for c in cls._chars_for_ranges if ("_" + c).isidentifier()] - ) - ) - ) + sorted(identifier_chars | set(cls.identchars) | set("0123456789·")) ) @_lazyclassproperty diff --git a/libs/pyparsing/util.py b/libs/pyparsing/util.py index d8d3f414c..94837fea0 100644 --- a/libs/pyparsing/util.py +++ b/libs/pyparsing/util.py @@ -237,7 +237,7 @@ def _flatten(ll: list) -> list: return ret -def _make_synonym_function(compat_name: str, fn: C) -> C: +def replaced_by_pep8(compat_name: str, fn: C) -> C: # In a future version, uncomment the code in the internal _inner() functions # to begin emitting DeprecationWarnings. @@ -246,12 +246,12 @@ def _make_synonym_function(compat_name: str, fn: C) -> C: # (Presence of 'self' arg in signature is used by explain_exception() methods, so we take # some extra steps to add it if present in decorated function.) - if "self" == list(inspect.signature(fn).parameters)[0]: + if ["self"] == list(inspect.signature(fn).parameters)[:1]: @wraps(fn) def _inner(self, *args, **kwargs): # warnings.warn( - # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 + # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=2 # ) return fn(self, *args, **kwargs) @@ -260,7 +260,7 @@ def _inner(self, *args, **kwargs): @wraps(fn) def _inner(*args, **kwargs): # warnings.warn( - # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 + # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=2 # ) return fn(*args, **kwargs) @@ -275,10 +275,3 @@ def _inner(*args, **kwargs): _inner.__kwdefaults__ = None _inner.__qualname__ = fn.__qualname__ return cast(C, _inner) - - -def replaced_by_pep8(fn: C) -> Callable[[Callable], C]: - """ - Decorator for pre-PEP8 compatibility synonyms, to link them to the new function. - """ - return lambda other: _make_synonym_function(other.__name__, fn) diff --git a/libs/pyrsistent-0.20.0.dist-info/RECORD b/libs/pyrsistent-0.20.0.dist-info/RECORD index e48f6169d..5b552511b 100644 --- a/libs/pyrsistent-0.20.0.dist-info/RECORD +++ b/libs/pyrsistent-0.20.0.dist-info/RECORD @@ -1,11 +1,11 @@ _pyrsistent_version.py,sha256=pJLteH9r0aOnAwnvPatmr2QSz7lO2BDXON0AKkXx0Pg,23 -pvectorc.cpython-38-darwin.so,sha256=3fWvIYLZg4EPc5WlLoCWUTd6hXnS6jAnqsvpgByxFeY,75992 +pvectorc.cpython-38-darwin.so,sha256=FWL6D05ITy7RG0cjmkA2_RlpMG8YeAXGGR9zoIv6YUI,39120 pyrsistent-0.20.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 pyrsistent-0.20.0.dist-info/LICENSE.mit,sha256=P9PT0auccz7kU_vzu7qoRUQNDYwg17WgOdLkai7X_AE,1060 pyrsistent-0.20.0.dist-info/METADATA,sha256=BD5uJL-kVFQZvWmtbNyerN9qb7C6StTolg1MaHH1D3M,27803 pyrsistent-0.20.0.dist-info/RECORD,, pyrsistent-0.20.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pyrsistent-0.20.0.dist-info/WHEEL,sha256=UkJU7GAEhyIKVwGX1j1L5OGjUFT--MirwyCseqfCpZU,109 +pyrsistent-0.20.0.dist-info/WHEEL,sha256=8MbRJsGMYV6Ym1_SoG8YuJPvArpN2Z2wVWusEpp3feg,108 pyrsistent-0.20.0.dist-info/top_level.txt,sha256=4RgY60Kwp0PJK6JLt04o336V4SZXK5QLBlfX0jZTNlw,40 pyrsistent/__init__.py,sha256=1cONLCDzbyDoZ_deek8Ei_iqOLI4oNseRPLF3zvmEoA,1479 pyrsistent/__init__.pyi,sha256=xrlyeqwkRQHxsSXZEoIR_PliQBSrMiEy8TpuyRpe3mY,7188 diff --git a/libs/pyrsistent-0.20.0.dist-info/WHEEL b/libs/pyrsistent-0.20.0.dist-info/WHEEL index 844cf17ca..be75fa70d 100644 --- a/libs/pyrsistent-0.20.0.dist-info/WHEEL +++ b/libs/pyrsistent-0.20.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: false Tag: cp38-cp38-macosx_12_0_x86_64 diff --git a/libs/pysubs2-1.7.2.dist-info/RECORD b/libs/pysubs2-1.7.2.dist-info/RECORD deleted file mode 100644 index d0730aa1f..000000000 --- a/libs/pysubs2-1.7.2.dist-info/RECORD +++ /dev/null @@ -1,47 +0,0 @@ -../../bin/pysubs2,sha256=qbyZPJ0JMXc2Ii34KZgXKNvu1v8En-GFSWQFwhstugg,249 -pysubs2-1.7.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pysubs2-1.7.2.dist-info/LICENSE.txt,sha256=WYgskvBrUBBDxuKH9JSV1u22g-UBTwHjeuJLlPp6lWU,1063 -pysubs2-1.7.2.dist-info/METADATA,sha256=2Fm6UaI7kElE-smr83cNBIfWRXt0vfso1Kyx5sChjB0,3183 -pysubs2-1.7.2.dist-info/RECORD,, -pysubs2-1.7.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pysubs2-1.7.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 -pysubs2-1.7.2.dist-info/entry_points.txt,sha256=mznmeaia9Ec19KsaIM8D4tt6V0HnOUlPhSg5nXiAfAE,49 -pysubs2-1.7.2.dist-info/top_level.txt,sha256=i_V6JX-AWjMX15-Dzyc0RlrInU7Zun9PYfdB9brM95E,8 -pysubs2/__init__.py,sha256=L71MMMS6zcAiGWdddhnc4COZmKLYX__igP0Tr5q-y3Q,783 -pysubs2/__main__.py,sha256=3iAK73rLxjLJqFMYD-jn3PDJvHZ8rIOW_NgsmBkRGhA,134 -pysubs2/__pycache__/__init__.cpython-311.pyc,, -pysubs2/__pycache__/__main__.cpython-311.pyc,, -pysubs2/__pycache__/cli.cpython-311.pyc,, -pysubs2/__pycache__/common.cpython-311.pyc,, -pysubs2/__pycache__/exceptions.cpython-311.pyc,, -pysubs2/__pycache__/ssaevent.cpython-311.pyc,, -pysubs2/__pycache__/ssafile.cpython-311.pyc,, -pysubs2/__pycache__/ssastyle.cpython-311.pyc,, -pysubs2/__pycache__/time.cpython-311.pyc,, -pysubs2/cli.py,sha256=lFVZsLChtnnaRov2lNEHlecTJaoNNvTLMQmZe0-4oGE,11916 -pysubs2/common.py,sha256=33XyqTSPqUNMedlnVkx-7GWFwvX0Fpce1G_ZHHtwQuI,1503 -pysubs2/exceptions.py,sha256=5XMoOvloP4QPPkEPour6YalxomcK-RkJA9eb_ecIbH0,2318 -pysubs2/formats/__init__.py,sha256=KZy9IibVmK-WwCHAYYplJELmYEnQu9BBRz5HEvyZ5U4,2515 -pysubs2/formats/__pycache__/__init__.cpython-311.pyc,, -pysubs2/formats/__pycache__/base.cpython-311.pyc,, -pysubs2/formats/__pycache__/jsonformat.cpython-311.pyc,, -pysubs2/formats/__pycache__/microdvd.cpython-311.pyc,, -pysubs2/formats/__pycache__/mpl2.cpython-311.pyc,, -pysubs2/formats/__pycache__/subrip.cpython-311.pyc,, -pysubs2/formats/__pycache__/substation.cpython-311.pyc,, -pysubs2/formats/__pycache__/tmp.cpython-311.pyc,, -pysubs2/formats/__pycache__/webvtt.cpython-311.pyc,, -pysubs2/formats/__pycache__/whisper.cpython-311.pyc,, -pysubs2/formats/base.py,sha256=zzt4L3KIC6VrUNfzwjDHSF5HV7swrdo65dop90vfy70,2959 -pysubs2/formats/jsonformat.py,sha256=TWk_qOI0-GaV_Jzs2S5JOe7uWu7t1jllO9NYOnZgRcE,2101 -pysubs2/formats/microdvd.py,sha256=hfshagBIMMPz3WgqpttYGugtAj_6CheAiTkvTTrn3NE,5970 -pysubs2/formats/mpl2.py,sha256=vpyL5j7gxxkGvWvI8JXwFlHaEyCBHYTn_mtgk4zqNFw,1970 -pysubs2/formats/subrip.py,sha256=VsEhj6aX_NZdUbecxjKk-5Ri7GcUdGh8dfzZVTsAZSM,7484 -pysubs2/formats/substation.py,sha256=UFaZ3sZoCa3bizKvn_5Ugtqy6crO1FqldxS5OI7ozcQ,16795 -pysubs2/formats/tmp.py,sha256=FKktjpgv07rf6EZ1Og0rkNpcj59Z6kL6dL-V0QLSKQw,4100 -pysubs2/formats/webvtt.py,sha256=Ycur_E5ztjazW2akyUXTsbNUdLs4S-knq93hwompCac,1788 -pysubs2/formats/whisper.py,sha256=JHGY8nhiVso_iyVZOP72lLbC7GM-gX_FFc1BdzCGdo0,1607 -pysubs2/ssaevent.py,sha256=VR0Pso779Pw5bs-Q-VpIz8Zs-A6p2a2pptQtsFVjRnM,6291 -pysubs2/ssafile.py,sha256=smMZIFk5h8n3uUuzgrcSmzdNsVU7oB3kguKQtUAdQGU,23833 -pysubs2/ssastyle.py,sha256=hlNowFmuiiwOzWTtQxKUakTwcE7Q5KxlQtl64Q6ScMU,4031 -pysubs2/time.py,sha256=Onk1vs9xXKiuwYK0RorZVU29p2FCEARapnfP_yYczTQ,4739 diff --git a/libs/pysubs2-1.7.2.dist-info/WHEEL b/libs/pysubs2-1.7.2.dist-info/WHEEL deleted file mode 100644 index bab98d675..000000000 --- a/libs/pysubs2-1.7.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.43.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/pysubs2-1.7.2.dist-info/INSTALLER b/libs/pysubs2-1.7.3.dist-info/INSTALLER similarity index 100% rename from libs/pysubs2-1.7.2.dist-info/INSTALLER rename to libs/pysubs2-1.7.3.dist-info/INSTALLER diff --git a/libs/pysubs2-1.7.2.dist-info/LICENSE.txt b/libs/pysubs2-1.7.3.dist-info/LICENSE.txt similarity index 100% rename from libs/pysubs2-1.7.2.dist-info/LICENSE.txt rename to libs/pysubs2-1.7.3.dist-info/LICENSE.txt diff --git a/libs/pysubs2-1.7.2.dist-info/METADATA b/libs/pysubs2-1.7.3.dist-info/METADATA similarity index 99% rename from libs/pysubs2-1.7.2.dist-info/METADATA rename to libs/pysubs2-1.7.3.dist-info/METADATA index e1fef61e8..5326ba040 100644 --- a/libs/pysubs2-1.7.2.dist-info/METADATA +++ b/libs/pysubs2-1.7.3.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pysubs2 -Version: 1.7.2 +Version: 1.7.3 Summary: A library for editing subtitle files Home-page: https://github.com/tkarabela/pysubs2 Author: Tomas Karabela diff --git a/libs/pysubs2-1.7.3.dist-info/RECORD b/libs/pysubs2-1.7.3.dist-info/RECORD new file mode 100644 index 000000000..470e86d28 --- /dev/null +++ b/libs/pysubs2-1.7.3.dist-info/RECORD @@ -0,0 +1,28 @@ +../../bin/pysubs2,sha256=1ipjtihceH0M9ljChd41YMd3co9-Mn5sngcbA3Kgupk,241 +pysubs2-1.7.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pysubs2-1.7.3.dist-info/LICENSE.txt,sha256=WYgskvBrUBBDxuKH9JSV1u22g-UBTwHjeuJLlPp6lWU,1063 +pysubs2-1.7.3.dist-info/METADATA,sha256=EG6RW41p_JlOJDC9p9clWaHINxR6uKDBcBh-9Va9Qno,3183 +pysubs2-1.7.3.dist-info/RECORD,, +pysubs2-1.7.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pysubs2-1.7.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +pysubs2-1.7.3.dist-info/entry_points.txt,sha256=mznmeaia9Ec19KsaIM8D4tt6V0HnOUlPhSg5nXiAfAE,49 +pysubs2-1.7.3.dist-info/top_level.txt,sha256=i_V6JX-AWjMX15-Dzyc0RlrInU7Zun9PYfdB9brM95E,8 +pysubs2/__init__.py,sha256=L71MMMS6zcAiGWdddhnc4COZmKLYX__igP0Tr5q-y3Q,783 +pysubs2/__main__.py,sha256=3iAK73rLxjLJqFMYD-jn3PDJvHZ8rIOW_NgsmBkRGhA,134 +pysubs2/cli.py,sha256=lFVZsLChtnnaRov2lNEHlecTJaoNNvTLMQmZe0-4oGE,11916 +pysubs2/common.py,sha256=QfZOuv5p3B_l62D_2qMOTY59nUPB1JVjJaBeKN3oi08,1503 +pysubs2/exceptions.py,sha256=yOXsGhlD1IvSF74Bd5psD36SKA5vT0e_BlhzgqSlMXs,2574 +pysubs2/formats/__init__.py,sha256=KZy9IibVmK-WwCHAYYplJELmYEnQu9BBRz5HEvyZ5U4,2515 +pysubs2/formats/base.py,sha256=zzt4L3KIC6VrUNfzwjDHSF5HV7swrdo65dop90vfy70,2959 +pysubs2/formats/jsonformat.py,sha256=whCZeJi7xbXRLqFNWQ83SzkAli2XlqYnVfs8soNOA0g,2283 +pysubs2/formats/microdvd.py,sha256=hfshagBIMMPz3WgqpttYGugtAj_6CheAiTkvTTrn3NE,5970 +pysubs2/formats/mpl2.py,sha256=vpyL5j7gxxkGvWvI8JXwFlHaEyCBHYTn_mtgk4zqNFw,1970 +pysubs2/formats/subrip.py,sha256=VsEhj6aX_NZdUbecxjKk-5Ri7GcUdGh8dfzZVTsAZSM,7484 +pysubs2/formats/substation.py,sha256=UFaZ3sZoCa3bizKvn_5Ugtqy6crO1FqldxS5OI7ozcQ,16795 +pysubs2/formats/tmp.py,sha256=FKktjpgv07rf6EZ1Og0rkNpcj59Z6kL6dL-V0QLSKQw,4100 +pysubs2/formats/webvtt.py,sha256=Ycur_E5ztjazW2akyUXTsbNUdLs4S-knq93hwompCac,1788 +pysubs2/formats/whisper.py,sha256=JHGY8nhiVso_iyVZOP72lLbC7GM-gX_FFc1BdzCGdo0,1607 +pysubs2/ssaevent.py,sha256=VR0Pso779Pw5bs-Q-VpIz8Zs-A6p2a2pptQtsFVjRnM,6291 +pysubs2/ssafile.py,sha256=smMZIFk5h8n3uUuzgrcSmzdNsVU7oB3kguKQtUAdQGU,23833 +pysubs2/ssastyle.py,sha256=hlNowFmuiiwOzWTtQxKUakTwcE7Q5KxlQtl64Q6ScMU,4031 +pysubs2/time.py,sha256=Onk1vs9xXKiuwYK0RorZVU29p2FCEARapnfP_yYczTQ,4739 diff --git a/libs/pysubs2-1.7.2.dist-info/REQUESTED b/libs/pysubs2-1.7.3.dist-info/REQUESTED similarity index 100% rename from libs/pysubs2-1.7.2.dist-info/REQUESTED rename to libs/pysubs2-1.7.3.dist-info/REQUESTED diff --git a/libs/pysubs2-1.7.3.dist-info/WHEEL b/libs/pysubs2-1.7.3.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/pysubs2-1.7.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/pysubs2-1.7.2.dist-info/entry_points.txt b/libs/pysubs2-1.7.3.dist-info/entry_points.txt similarity index 100% rename from libs/pysubs2-1.7.2.dist-info/entry_points.txt rename to libs/pysubs2-1.7.3.dist-info/entry_points.txt diff --git a/libs/pysubs2-1.7.2.dist-info/top_level.txt b/libs/pysubs2-1.7.3.dist-info/top_level.txt similarity index 100% rename from libs/pysubs2-1.7.2.dist-info/top_level.txt rename to libs/pysubs2-1.7.3.dist-info/top_level.txt diff --git a/libs/pysubs2/common.py b/libs/pysubs2/common.py index 9ac8f13e8..f2c27f5de 100644 --- a/libs/pysubs2/common.py +++ b/libs/pysubs2/common.py @@ -58,7 +58,7 @@ def to_ssa_alignment(self) -> int: #: Version of the pysubs2 library. -VERSION = "1.7.2" +VERSION = "1.7.3" IntOrFloat = Union[int, float] diff --git a/libs/pysubs2/exceptions.py b/libs/pysubs2/exceptions.py index acf8112fb..eb08c3280 100644 --- a/libs/pysubs2/exceptions.py +++ b/libs/pysubs2/exceptions.py @@ -1,5 +1,4 @@ -from typing import List - +from typing import List, Any __all__ = [ "Pysubs2Error", @@ -35,6 +34,9 @@ def __init__(self, ext: str) -> None: msg = f"File extension {ext!r} does not match any supported subtitle format" super().__init__(msg) + def __reduce__(self) -> Any: + return self.__class__, (self.ext,) + class UnknownFormatIdentifierError(Pysubs2Error): """ @@ -52,6 +54,9 @@ def __init__(self, format_: str) -> None: msg = f"Format identifier {format_!r} does not match any supported subtitle format" super().__init__(msg) + def __reduce__(self) -> Any: + return self.__class__, (self.format_,) + class FormatAutodetectionError(Pysubs2Error): """ @@ -74,3 +79,6 @@ def __init__(self, content: str, formats: List[str]) -> None: else: msg = f"Multiple suitable formats ({formats!r})" super().__init__(msg) + + def __reduce__(self) -> Any: + return self.__class__, (self.content, self.formats) diff --git a/libs/pysubs2/formats/jsonformat.py b/libs/pysubs2/formats/jsonformat.py index 2f9acc5f1..9927d1f25 100644 --- a/libs/pysubs2/formats/jsonformat.py +++ b/libs/pysubs2/formats/jsonformat.py @@ -9,11 +9,12 @@ from ..ssafile import SSAFile -# We're using Color dataclass +# Custom JSONEncoder is needed since our `Color` is a dataclass # https://stackoverflow.com/questions/51286748/make-the-python-json-encoder-support-pythons-new-dataclasses class EnhancedJSONEncoder(json.JSONEncoder): def default(self, o: Any) -> Any: - if dataclasses.is_dataclass(o): + if not isinstance(o, type) and dataclasses.is_dataclass(o): + # MyPy 1.11.0 thinks `o` is `type[DataclassInstance]` instead of `DataclassInstance` without the isinstance return dataclasses.asdict(o) return super().default(o) diff --git a/libs/python_dateutil-2.8.2.dist-info/RECORD b/libs/python_dateutil-2.8.2.dist-info/RECORD deleted file mode 100644 index 557239e99..000000000 --- a/libs/python_dateutil-2.8.2.dist-info/RECORD +++ /dev/null @@ -1,27 +0,0 @@ -dateutil/__init__.py,sha256=lXElASqwYGwqlrSWSeX19JwF5Be9tNecDa9ebk-0gmk,222 -dateutil/_common.py,sha256=77w0yytkrxlYbSn--lDVPUMabUXRR9I3lBv_vQRUqUY,932 -dateutil/_version.py,sha256=DhYpbRoCd3nAZrV5KU75U2jhfoV0Ux9VW_qFy9TY7S8,411 -dateutil/easter.py,sha256=dyBi-lKvimH1u_k6p7Z0JJK72QhqVtVBsqByvpEPKvc,2678 -dateutil/parser/__init__.py,sha256=wWk6GFuxTpjoggCGtgkceJoti4pVjl4_fHQXpNOaSYg,1766 -dateutil/parser/_parser.py,sha256=7klDdyicksQB_Xgl-3UAmBwzCYor1AIZqklIcT6dH_8,58796 -dateutil/parser/isoparser.py,sha256=EtLY7w22HWx-XJpTWxJD3XNs6LBHRCps77tCdLnYad8,13247 -dateutil/relativedelta.py,sha256=GjVxqpAVWnG67rdbf7pkoIlJvQqmju9NSfGCcqblc7U,24904 -dateutil/rrule.py,sha256=b6GVV4MpZDbBhJ5qitQKRyx8-_OKyeAbk57or2A8AYU,66556 -dateutil/tz/__init__.py,sha256=F-Mz13v6jYseklQf9Te9J6nzcLDmq47gORa61K35_FA,444 -dateutil/tz/_common.py,sha256=cgzDTANsOXvEc86cYF77EsliuSab8Puwpsl5-bX3_S4,12977 -dateutil/tz/_factories.py,sha256=unb6XQNXrPMveksTCU-Ag8jmVZs4SojoPUcAHpWnrvU,2569 -dateutil/tz/tz.py,sha256=JotVjDcF16hzoouQ0kZW-5mCYu7Xj67NI-VQgnWapKE,62857 -dateutil/tz/win.py,sha256=xJszWgSwE1xPx_HJj4ZkepyukC_hNy016WMcXhbRaB8,12935 -dateutil/tzwin.py,sha256=7Ar4vdQCnnM0mKR3MUjbIKsZrBVfHgdwsJZc_mGYRew,59 -dateutil/utils.py,sha256=dKCchEw8eObi0loGTx91unBxm_7UGlU3v_FjFMdqwYM,1965 -dateutil/zoneinfo/__init__.py,sha256=KYg0pthCMjcp5MXSEiBJn3nMjZeNZav7rlJw5-tz1S4,5889 -dateutil/zoneinfo/dateutil-zoneinfo.tar.gz,sha256=AkcdBx3XkEZwMSpS_TmOEfrEFHLvgxPNDVIwGVxTVaI,174394 -dateutil/zoneinfo/rebuild.py,sha256=MiqYzCIHvNbMH-LdRYLv-4T0EIA7hDKt5GLR0IRTLdI,2392 -python_dateutil-2.8.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_dateutil-2.8.2.dist-info/LICENSE,sha256=ugD1Gg2SgjtaHN4n2LW50jIeZ-2NqbwWPv-W1eF-V34,2889 -python_dateutil-2.8.2.dist-info/METADATA,sha256=RQAxn6HOo6niL6LcTlO6YbksoUNuE1OwNqagkI1t2d8,8196 -python_dateutil-2.8.2.dist-info/RECORD,, -python_dateutil-2.8.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -python_dateutil-2.8.2.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110 -python_dateutil-2.8.2.dist-info/top_level.txt,sha256=4tjdWkhRZvF7LA_BYe_L9gB2w_p2a-z5y6ArjaRkot8,9 -python_dateutil-2.8.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 diff --git a/libs/python_dateutil-2.8.2.dist-info/INSTALLER b/libs/python_dateutil-2.9.0.dist-info/INSTALLER similarity index 100% rename from libs/python_dateutil-2.8.2.dist-info/INSTALLER rename to libs/python_dateutil-2.9.0.dist-info/INSTALLER diff --git a/libs/python_dateutil-2.8.2.dist-info/LICENSE b/libs/python_dateutil-2.9.0.dist-info/LICENSE similarity index 100% rename from libs/python_dateutil-2.8.2.dist-info/LICENSE rename to libs/python_dateutil-2.9.0.dist-info/LICENSE diff --git a/libs/python_dateutil-2.8.2.dist-info/METADATA b/libs/python_dateutil-2.9.0.dist-info/METADATA similarity index 97% rename from libs/python_dateutil-2.8.2.dist-info/METADATA rename to libs/python_dateutil-2.9.0.dist-info/METADATA index 4f47cb6c2..257a43e4f 100644 --- a/libs/python_dateutil-2.8.2.dist-info/METADATA +++ b/libs/python_dateutil-2.9.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-dateutil -Version: 2.8.2 +Version: 2.9.0 Summary: Extensions to the standard Python datetime module Home-page: https://github.com/dateutil/dateutil Author: Gustavo Niemeyer @@ -25,11 +25,14 @@ Classifier: Programming Language :: Python :: 3.6 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 :: 3.12 Classifier: Topic :: Software Development :: Libraries Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,>=2.7 Description-Content-Type: text/x-rst License-File: LICENSE -Requires-Dist: six >=1.5 +Requires-Dist: six>=1.5 dateutil - powerful extensions to datetime ========================================== @@ -180,7 +183,7 @@ keys can be found below: =========== ============================ Releases Signing key fingerprint =========== ============================ -2.4.1-2.8.2 `6B49 ACBA DCF6 BD1C A206 67AB CD54 FCE3 D964 BEFB`_ +2.4.1-2.8.2 `6B49 ACBA DCF6 BD1C A206 67AB CD54 FCE3 D964 BEFB`_ =========== ============================ New releases *may* have signed tags, but binary and source distributions diff --git a/libs/python_dateutil-2.9.0.dist-info/RECORD b/libs/python_dateutil-2.9.0.dist-info/RECORD new file mode 100644 index 000000000..f1b18f863 --- /dev/null +++ b/libs/python_dateutil-2.9.0.dist-info/RECORD @@ -0,0 +1,27 @@ +dateutil/__init__.py,sha256=Mqam67WO9IkTmUFyI66vS6IoSXTp9G388DadH2LCMLY,620 +dateutil/_common.py,sha256=77w0yytkrxlYbSn--lDVPUMabUXRR9I3lBv_vQRUqUY,932 +dateutil/_version.py,sha256=Vb5T-8FcBzgHCb1RYqez20zYqm5tplcF41kZi7B8cik,411 +dateutil/easter.py,sha256=dyBi-lKvimH1u_k6p7Z0JJK72QhqVtVBsqByvpEPKvc,2678 +dateutil/parser/__init__.py,sha256=wWk6GFuxTpjoggCGtgkceJoti4pVjl4_fHQXpNOaSYg,1766 +dateutil/parser/_parser.py,sha256=7klDdyicksQB_Xgl-3UAmBwzCYor1AIZqklIcT6dH_8,58796 +dateutil/parser/isoparser.py,sha256=8Fy999bnCd1frSdOYuOraWfJTtd5W7qQ51NwNuH_hXM,13233 +dateutil/relativedelta.py,sha256=IY_mglMjoZbYfrvloTY2ce02aiVjPIkiZfqgNTZRfuA,24903 +dateutil/rrule.py,sha256=KJzKlaCd1jEbu4A38ZltslaoAUh9nSbdbOFdjp70Kew,66557 +dateutil/tz/__init__.py,sha256=F-Mz13v6jYseklQf9Te9J6nzcLDmq47gORa61K35_FA,444 +dateutil/tz/_common.py,sha256=cgzDTANsOXvEc86cYF77EsliuSab8Puwpsl5-bX3_S4,12977 +dateutil/tz/_factories.py,sha256=unb6XQNXrPMveksTCU-Ag8jmVZs4SojoPUcAHpWnrvU,2569 +dateutil/tz/tz.py,sha256=EUnEdMfeThXiY6l4sh9yBabZ63_POzy01zSsh9thn1o,62855 +dateutil/tz/win.py,sha256=xJszWgSwE1xPx_HJj4ZkepyukC_hNy016WMcXhbRaB8,12935 +dateutil/tzwin.py,sha256=7Ar4vdQCnnM0mKR3MUjbIKsZrBVfHgdwsJZc_mGYRew,59 +dateutil/utils.py,sha256=dKCchEw8eObi0loGTx91unBxm_7UGlU3v_FjFMdqwYM,1965 +dateutil/zoneinfo/__init__.py,sha256=KYg0pthCMjcp5MXSEiBJn3nMjZeNZav7rlJw5-tz1S4,5889 +dateutil/zoneinfo/dateutil-zoneinfo.tar.gz,sha256=Y25Djz4f3ZwC5TcTaM4UJMhWRNZSciMe0zOF9XsDv4I,156385 +dateutil/zoneinfo/rebuild.py,sha256=MiqYzCIHvNbMH-LdRYLv-4T0EIA7hDKt5GLR0IRTLdI,2392 +python_dateutil-2.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_dateutil-2.9.0.dist-info/LICENSE,sha256=ugD1Gg2SgjtaHN4n2LW50jIeZ-2NqbwWPv-W1eF-V34,2889 +python_dateutil-2.9.0.dist-info/METADATA,sha256=mqpKrcibJzQ1A2vpWNFAr3xf6yTqamcHRjkaU43Gnw4,8347 +python_dateutil-2.9.0.dist-info/RECORD,, +python_dateutil-2.9.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +python_dateutil-2.9.0.dist-info/WHEEL,sha256=TJ49d73sNs10F0aze1W_bTW2P_X7-F4YXOlBqoqA-jY,109 +python_dateutil-2.9.0.dist-info/top_level.txt,sha256=4tjdWkhRZvF7LA_BYe_L9gB2w_p2a-z5y6ArjaRkot8,9 +python_dateutil-2.9.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 diff --git a/libs/python_dateutil-2.8.2.dist-info/REQUESTED b/libs/python_dateutil-2.9.0.dist-info/REQUESTED similarity index 100% rename from libs/python_dateutil-2.8.2.dist-info/REQUESTED rename to libs/python_dateutil-2.9.0.dist-info/REQUESTED diff --git a/libs/python_dateutil-2.8.2.dist-info/WHEEL b/libs/python_dateutil-2.9.0.dist-info/WHEEL similarity index 70% rename from libs/python_dateutil-2.8.2.dist-info/WHEEL rename to libs/python_dateutil-2.9.0.dist-info/WHEEL index 4724c4573..17c0299e4 100644 --- a/libs/python_dateutil-2.8.2.dist-info/WHEEL +++ b/libs/python_dateutil-2.9.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/libs/python_dateutil-2.8.2.dist-info/top_level.txt b/libs/python_dateutil-2.9.0.dist-info/top_level.txt similarity index 100% rename from libs/python_dateutil-2.8.2.dist-info/top_level.txt rename to libs/python_dateutil-2.9.0.dist-info/top_level.txt diff --git a/libs/python_dateutil-2.8.2.dist-info/zip-safe b/libs/python_dateutil-2.9.0.dist-info/zip-safe similarity index 100% rename from libs/python_dateutil-2.8.2.dist-info/zip-safe rename to libs/python_dateutil-2.9.0.dist-info/zip-safe diff --git a/libs/python_engineio-4.9.0.dist-info/INSTALLER b/libs/python_engineio-4.10.1.dist-info/INSTALLER similarity index 100% rename from libs/python_engineio-4.9.0.dist-info/INSTALLER rename to libs/python_engineio-4.10.1.dist-info/INSTALLER diff --git a/libs/python_engineio-4.9.0.dist-info/LICENSE b/libs/python_engineio-4.10.1.dist-info/LICENSE similarity index 100% rename from libs/python_engineio-4.9.0.dist-info/LICENSE rename to libs/python_engineio-4.10.1.dist-info/LICENSE diff --git a/libs/python_engineio-4.9.0.dist-info/METADATA b/libs/python_engineio-4.10.1.dist-info/METADATA similarity index 99% rename from libs/python_engineio-4.9.0.dist-info/METADATA rename to libs/python_engineio-4.10.1.dist-info/METADATA index 02b1caf75..e2b8bcdda 100644 --- a/libs/python_engineio-4.9.0.dist-info/METADATA +++ b/libs/python_engineio-4.10.1.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-engineio -Version: 4.9.0 +Version: 4.10.1 Summary: Engine.IO server and client for Python Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> Project-URL: Homepage, https://github.com/miguelgrinberg/python-engineio diff --git a/libs/python_engineio-4.9.0.dist-info/RECORD b/libs/python_engineio-4.10.1.dist-info/RECORD similarity index 59% rename from libs/python_engineio-4.9.0.dist-info/RECORD rename to libs/python_engineio-4.10.1.dist-info/RECORD index b0df9865e..b228532cf 100644 --- a/libs/python_engineio-4.9.0.dist-info/RECORD +++ b/libs/python_engineio-4.10.1.dist-info/RECORD @@ -1,33 +1,33 @@ engineio/__init__.py,sha256=0R2PY1EXu3sicP7mkA0_QxEVGRlFlgvsxfhByqREE1A,481 -engineio/async_client.py,sha256=QyHBWpLZxfBc4lK_eodkPM0xzsfVYpt7mzNaA9uG3cg,27932 +engineio/async_client.py,sha256=jC7T6r_ya9LV46q4OdIQ041-3uLlRr6aUt__YmHNPEM,27950 engineio/async_drivers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 engineio/async_drivers/_websocket_wsgi.py,sha256=FGoRBGOUsEtlfklYNylR0o3oLOGmXIR8QzaCsGLgr3I,949 engineio/async_drivers/aiohttp.py,sha256=zJdujjO6dSL_oKDDr4xfO4ID_Vd8faEp1AOIW4ogKME,3768 -engineio/async_drivers/asgi.py,sha256=AVEXVP4KLu0etH2kTiuJgVTUkstdNHh0srQSxXx3sBM,10354 -engineio/async_drivers/eventlet.py,sha256=IG6oLaWH663dw5CEnO-SRz6IsJb6lO55kRCYTdmqZE0,1755 +engineio/async_drivers/asgi.py,sha256=mvCErNpYw1T7XE_1Ixb0YQN0YqJkKMpWqNV5_tZQYMg,11011 +engineio/async_drivers/eventlet.py,sha256=_ZgPg0HTx_yhSm5iBcd3ez01yMg3KRFmb2ycKD8o8pY,1775 engineio/async_drivers/gevent.py,sha256=hnJHeWdDQE2jfoLCP5DnwVPzsQlcTLJUMA5EVf1UL-k,2962 engineio/async_drivers/gevent_uwsgi.py,sha256=cnjCsnDHTa6rKgwDKD6rLvIw1Yun-g4c1QbujOC_bMY,5962 engineio/async_drivers/sanic.py,sha256=SY0HIp5DUHF7B55tJCBB_8qDjrRTD_FyNQ2cIwRIGR8,4538 engineio/async_drivers/threading.py,sha256=ywmG59d4H6OHZjKarBN97-9BHEsRxFEz9YN-E9QAu_I,463 engineio/async_drivers/tornado.py,sha256=9bB7FvY47Snx_h4rsNwRk5wIINf2ju7hXWTAqF3intA,5909 -engineio/async_server.py,sha256=gO7Tq1i4c3rSnN2zQdRrbVZIrPCI9ynjFqsqyIVLP80,25061 +engineio/async_server.py,sha256=Z1mpQxbu--hAQCY78BStsTlyP3_XUJ9zm0R51ziPOHI,25792 engineio/async_socket.py,sha256=P8OZW1N5y7jr2hW1qLLK2y_Clt7aHdv2ucYW69mbU4Q,10305 engineio/base_client.py,sha256=Q_w0Stvy89wPHwWk7411dRxpGjxNPypm4xy_4XMPZ9M,4872 engineio/base_server.py,sha256=Em2RRpbohulKjmYTWHnf_lALKvTT_jHr442Rr2g_BEQ,14013 engineio/base_socket.py,sha256=Bw6TWv1pnlXcDdqT59C5CyTaBi7l-_mkykIUuZLjz-g,400 -engineio/client.py,sha256=xz1KVYlxjynGUUn6hR_rga1sByYcVdYb5taMVsfXJkk,26291 +engineio/client.py,sha256=m_eLSes3b-mE5MYajELquSktkAWceCNGZOtUU78as50,26285 engineio/exceptions.py,sha256=FyuMb5qhX9CUYP3fEoe1m-faU96ApdQTSbblaaoo8LA,292 engineio/json.py,sha256=SG5FTojqd1ix6u0dKXJsZVqqdYioZLO4S2GPL7BKl3U,405 engineio/middleware.py,sha256=BF_qHAIZZnIbfiP256SD1CX3kzNWbSuto1cpih8oIFg,3766 engineio/packet.py,sha256=ETMeLgdpZghXK9fth93IZO8pIft6Sg3d1QGpyTx4xBE,3189 engineio/payload.py,sha256=2iLIFgIweTWkLok_UZ5zCgELmRSGyUUI5eeYcEerFSs,1547 -engineio/server.py,sha256=UegXydKobZaR1O0MxS_MENKNF7PBjpP_kPI0-OpI5EQ,21558 +engineio/server.py,sha256=Ub21Jf-9mxSPPYmWJMnzuGZRz6fRQc6rdtqcBKHHd-M,21980 engineio/socket.py,sha256=dasec3jXoV2eR1jmIrhEIfHzyUuuv8FwvxLB3DpyjeY,9996 engineio/static_files.py,sha256=pwez9LQFaSQXMbtI0vLyD6UDiokQ4rNfmRYgVLKOthc,2064 -python_engineio-4.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_engineio-4.9.0.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 -python_engineio-4.9.0.dist-info/METADATA,sha256=Qb43yDoGFRx78nu3tWw4hLWtPAt3bU-44hLJV-4P8DA,2244 -python_engineio-4.9.0.dist-info/RECORD,, -python_engineio-4.9.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -python_engineio-4.9.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -python_engineio-4.9.0.dist-info/top_level.txt,sha256=u8PmNisCZLwRYcWrNLe9wutQ2tt4zNi8IH362c-HWuA,9 +python_engineio-4.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_engineio-4.10.1.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 +python_engineio-4.10.1.dist-info/METADATA,sha256=DgLfc2h42WxGM1yarou6HGfgGUW1Bf89yglgjPb01qQ,2245 +python_engineio-4.10.1.dist-info/RECORD,, +python_engineio-4.10.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +python_engineio-4.10.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +python_engineio-4.10.1.dist-info/top_level.txt,sha256=u8PmNisCZLwRYcWrNLe9wutQ2tt4zNi8IH362c-HWuA,9 diff --git a/libs/python_engineio-4.9.0.dist-info/REQUESTED b/libs/python_engineio-4.10.1.dist-info/REQUESTED similarity index 100% rename from libs/python_engineio-4.9.0.dist-info/REQUESTED rename to libs/python_engineio-4.10.1.dist-info/REQUESTED diff --git a/libs/python_engineio-4.10.1.dist-info/WHEEL b/libs/python_engineio-4.10.1.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/python_engineio-4.10.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/python_engineio-4.9.0.dist-info/top_level.txt b/libs/python_engineio-4.10.1.dist-info/top_level.txt similarity index 100% rename from libs/python_engineio-4.9.0.dist-info/top_level.txt rename to libs/python_engineio-4.10.1.dist-info/top_level.txt diff --git a/libs/python_engineio-4.9.0.dist-info/WHEEL b/libs/python_engineio-4.9.0.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/python_engineio-4.9.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/python_socketio-5.11.1.dist-info/WHEEL b/libs/python_socketio-5.11.1.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/python_socketio-5.11.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/python_socketio-5.11.1.dist-info/INSTALLER b/libs/python_socketio-5.11.4.dist-info/INSTALLER similarity index 100% rename from libs/python_socketio-5.11.1.dist-info/INSTALLER rename to libs/python_socketio-5.11.4.dist-info/INSTALLER diff --git a/libs/python_socketio-5.11.1.dist-info/LICENSE b/libs/python_socketio-5.11.4.dist-info/LICENSE similarity index 100% rename from libs/python_socketio-5.11.1.dist-info/LICENSE rename to libs/python_socketio-5.11.4.dist-info/LICENSE diff --git a/libs/python_socketio-5.11.1.dist-info/METADATA b/libs/python_socketio-5.11.4.dist-info/METADATA similarity index 99% rename from libs/python_socketio-5.11.1.dist-info/METADATA rename to libs/python_socketio-5.11.4.dist-info/METADATA index caf38eb8f..7437d2bab 100644 --- a/libs/python_socketio-5.11.1.dist-info/METADATA +++ b/libs/python_socketio-5.11.4.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-socketio -Version: 5.11.1 +Version: 5.11.4 Summary: Socket.IO server and client for Python Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> Project-URL: Homepage, https://github.com/miguelgrinberg/python-socketio diff --git a/libs/python_socketio-5.11.1.dist-info/RECORD b/libs/python_socketio-5.11.4.dist-info/RECORD similarity index 51% rename from libs/python_socketio-5.11.1.dist-info/RECORD rename to libs/python_socketio-5.11.4.dist-info/RECORD index fa41e4f44..e2a2fbd5e 100644 --- a/libs/python_socketio-5.11.1.dist-info/RECORD +++ b/libs/python_socketio-5.11.4.dist-info/RECORD @@ -1,38 +1,38 @@ -python_socketio-5.11.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_socketio-5.11.1.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 -python_socketio-5.11.1.dist-info/METADATA,sha256=zz6nQ2YfgdvUuUN2eSS4b1YXhniYjjVvTjvVr87fSwQ,3213 -python_socketio-5.11.1.dist-info/RECORD,, -python_socketio-5.11.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -python_socketio-5.11.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -python_socketio-5.11.1.dist-info/top_level.txt,sha256=xWd-HVUanhys_VzQQTRTRZBX8W448ayFytYf1Zffivs,9 +python_socketio-5.11.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_socketio-5.11.4.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 +python_socketio-5.11.4.dist-info/METADATA,sha256=W0GWlV0MDN9PmQa-puWag4I4gCgRKRhvFK4g20hzpak,3213 +python_socketio-5.11.4.dist-info/RECORD,, +python_socketio-5.11.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +python_socketio-5.11.4.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +python_socketio-5.11.4.dist-info/top_level.txt,sha256=xWd-HVUanhys_VzQQTRTRZBX8W448ayFytYf1Zffivs,9 socketio/__init__.py,sha256=DXxtwPIqHFIqV4BGTgJ86OvCXD6Mth3PxBYhFoJ1_7g,1269 socketio/admin.py,sha256=9B601337UMTh2NIFzVrlFyImmSEtegJoXYFDlEwGmYk,16473 -socketio/asgi.py,sha256=Ti38pUt9TMUDZfc_l9DI3ZN9l50XoOK0gjSsz1m_-2I,1807 +socketio/asgi.py,sha256=NaJtYhOswVVcwHU0zcMM5H5TrSzXq9K-CAYaeSNTZRY,2192 socketio/async_admin.py,sha256=Swn4s154pc7QTWCWNEbSM2psAmhEuvgobIn1Vf7Y0y8,16850 socketio/async_aiopika_manager.py,sha256=DaBUjGRYaNIsOsk2xNjWylUsz2egmTAFFUiQkV6mNmk,5193 -socketio/async_client.py,sha256=8Gyj2pj72cW7disjodpvJZj_sXbv8_j634aVAirOnxg,25925 -socketio/async_manager.py,sha256=JiKiI01wOKsX6_v4VJpgBvlxYFDnCA3vpA_lGDuA0YI,4468 -socketio/async_namespace.py,sha256=fuIuIQDUL-lXyD9lm70W2QZr1wA_UMkOb-hQzE5P6u4,10616 -socketio/async_pubsub_manager.py,sha256=kN1G7dM4smVqk9OK85mZJ0eqG-5D8JBkvBW8fIQ70Io,11106 +socketio/async_client.py,sha256=6MSlSIfIS8-bULGKgnjETfqLc3s4UsZsnTRo2H07zxM,26968 +socketio/async_manager.py,sha256=dSD2XVtWYwKHDWxAXSu4Xgqw6dXyy9P_6C8rwlguybM,4503 +socketio/async_namespace.py,sha256=JwAfxtiEYe3srnHeKq384FV1Jc3V_Zty8C_94YmSJUU,10632 +socketio/async_pubsub_manager.py,sha256=Dzt34zwWgxqGsB_61_hegSlTSZucciHX6aJrEPSuKos,11141 socketio/async_redis_manager.py,sha256=UZXKunvbSk8neRVhGqigQF5S0WwLYTKV0BKondnV_yY,4299 -socketio/async_server.py,sha256=j3VOrCcAgq4HCyiCSf4VL4uRGXRe9QkhHSg-qploMgQ,35307 +socketio/async_server.py,sha256=HBp6yT8NPTSOWMw_Nd5G7OQMXtFSjOsJvutI1MkyxaA,35506 socketio/async_simple_client.py,sha256=Dj2h0iRR1qZ4BhOV6gpzvDM0K5XO4f-vdxmISiREzhQ,8908 socketio/base_client.py,sha256=bW2zRm7pjAGlB37iV62363zOl1er3z8I4EroCgeA6PQ,11576 socketio/base_manager.py,sha256=DJLH6IbJpaJ38jCrmIaUQVj8WUKZDYtfzjKIbQslLjw,5768 socketio/base_namespace.py,sha256=PpBylO78iyOJ6st5IHQeeXTvD7XzUim5MNDzdKjISxU,978 -socketio/base_server.py,sha256=kg4mFAXMD87PUVMN5FqS3Riy_qg0vmS-j5oxrLBVD5o,10548 -socketio/client.py,sha256=e-YWn63vxJ0Ium9y_-E1YrllVNn31K8Yth6fvTPNXFI,24622 +socketio/base_server.py,sha256=GS62Am34sQr43v5YDTujE8zt00oyP3XjLy9dtSGOAB0,10584 +socketio/client.py,sha256=s5tU1gsxjEhQyTUk0F2e600IEALp3PcCx8vIK9k-y0Q,25471 socketio/exceptions.py,sha256=c8yKss_oJl-fkL52X_AagyJecL-9Mxlgb5xDRqSz5tA,975 socketio/kafka_manager.py,sha256=OCUBlntnqAOlqZn7YxxM0E4rt6VLd_b-wJWrVWKRR-A,2419 socketio/kombu_manager.py,sha256=qFzWOUlsIznNx2IYKMvA6GKrDcG0zle5_G9duanJ3Po,5747 -socketio/manager.py,sha256=wief9dt2R_OpNKDcFr4HAppCDQfc_WTqwQQ6ViCZi4k,3826 +socketio/manager.py,sha256=RPYPcVBFAjN-fEtLfcsPlk6SOW_SBATvw0Tkq_PkGZw,3861 socketio/middleware.py,sha256=P8wOgSzy3YKOcRVI-r3KNKsEejBz_f5p2wdV8ZqW12E,1591 socketio/msgpack_packet.py,sha256=0K_XXM-OF3SdqOaLN_O5B4a1xHE6N_UhhiaRhQdseNw,514 -socketio/namespace.py,sha256=jkCi7n-bmAXYRdM-dFwKuLSmXqNc7YGF7SUzHGZzaKw,8870 -socketio/packet.py,sha256=aVlNp2MV4QR1VfVoMN9zhIbxSTQONduDFgxVv4AzZcI,7065 -socketio/pubsub_manager.py,sha256=ht9dXinzUtiLldxwttih5hoMhQwIw7sBJMtVBpkcbVA,10407 +socketio/namespace.py,sha256=wMRAxxyq-4WWa7LEhQXHZn4Q4lSw5NM6G24WA-UZL5k,8886 +socketio/packet.py,sha256=j5zm_kcoIZQnWd9m2hQiF34p0nweGecQvMxr90W8Hrs,7077 +socketio/pubsub_manager.py,sha256=JCB9aaEBbEw8Or6XaosoSpO-f6p5iF_BnNJOCul7ps4,10442 socketio/redis_manager.py,sha256=KExT3uzACK42g9OuHKvzI7YpfpGGLFMOwsWhgnPkx0Q,4442 -socketio/server.py,sha256=T5uU0nThuspxU1UXd153QmxT_IWUxCkPww9xMdzdCdA,34092 +socketio/server.py,sha256=nOao7YVlRHyUeEei6xGCIMONI2VMEAixU5mGqSfc4M0,34291 socketio/simple_client.py,sha256=tZiX2sAPY66OJTIJPk-PIGQjmnmUxu3RnpgJ0nc1-y8,8326 socketio/tornado.py,sha256=R82JCqz-E1ibZAQX708h7FX3sguCHQ1OLYpnMag-LY8,295 socketio/zmq_manager.py,sha256=JsRooJoH0dwOE0QsmDwePmwzsIN0VudsFWweCzScvMs,3545 diff --git a/libs/python_socketio-5.11.1.dist-info/REQUESTED b/libs/python_socketio-5.11.4.dist-info/REQUESTED similarity index 100% rename from libs/python_socketio-5.11.1.dist-info/REQUESTED rename to libs/python_socketio-5.11.4.dist-info/REQUESTED diff --git a/libs/python_socketio-5.11.4.dist-info/WHEEL b/libs/python_socketio-5.11.4.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/python_socketio-5.11.4.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/python_socketio-5.11.1.dist-info/top_level.txt b/libs/python_socketio-5.11.4.dist-info/top_level.txt similarity index 100% rename from libs/python_socketio-5.11.1.dist-info/top_level.txt rename to libs/python_socketio-5.11.4.dist-info/top_level.txt diff --git a/libs/pytz-2024.1.dist-info/INSTALLER b/libs/pytz-2024.2.dist-info/INSTALLER similarity index 100% rename from libs/pytz-2024.1.dist-info/INSTALLER rename to libs/pytz-2024.2.dist-info/INSTALLER diff --git a/libs/pytz-2024.1.dist-info/LICENSE.txt b/libs/pytz-2024.2.dist-info/LICENSE.txt similarity index 100% rename from libs/pytz-2024.1.dist-info/LICENSE.txt rename to libs/pytz-2024.2.dist-info/LICENSE.txt diff --git a/libs/pytz-2024.1.dist-info/METADATA b/libs/pytz-2024.2.dist-info/METADATA similarity index 99% rename from libs/pytz-2024.1.dist-info/METADATA rename to libs/pytz-2024.2.dist-info/METADATA index afe3703bf..6feaf3bac 100644 --- a/libs/pytz-2024.1.dist-info/METADATA +++ b/libs/pytz-2024.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pytz -Version: 2024.1 +Version: 2024.2 Summary: World timezone definitions, modern and historical Home-page: http://pythonhosted.org/pytz Download-URL: https://pypi.org/project/pytz/ @@ -35,6 +35,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Software Development :: Libraries :: Python Modules License-File: LICENSE.txt diff --git a/libs/pytz-2024.1.dist-info/RECORD b/libs/pytz-2024.2.dist-info/RECORD similarity index 91% rename from libs/pytz-2024.1.dist-info/RECORD rename to libs/pytz-2024.2.dist-info/RECORD index b6c14db40..1b6af9703 100644 --- a/libs/pytz-2024.1.dist-info/RECORD +++ b/libs/pytz-2024.2.dist-info/RECORD @@ -1,12 +1,12 @@ -pytz-2024.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pytz-2024.1.dist-info/LICENSE.txt,sha256=vosaN-vibFkqkPbA6zMQOn84POL010mMCvmlJpkKB7g,1088 -pytz-2024.1.dist-info/METADATA,sha256=XUwgTrg17abcCW5F68HMvNpFzYjEPtfKzO56iLiQoZ0,22323 -pytz-2024.1.dist-info/RECORD,, -pytz-2024.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pytz-2024.1.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -pytz-2024.1.dist-info/top_level.txt,sha256=6xRYlt934v1yHb1JIrXgHyGxn3cqACvd-yE8ski_kcc,5 -pytz-2024.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -pytz/__init__.py,sha256=RZJJJ1W2RyP9fllsMNO4w-yjJRpIazWJ9fvj5telYig,35101 +pytz-2024.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pytz-2024.2.dist-info/LICENSE.txt,sha256=vosaN-vibFkqkPbA6zMQOn84POL010mMCvmlJpkKB7g,1088 +pytz-2024.2.dist-info/METADATA,sha256=0MczTzNzn-1TdBkiC7eBOXgnJoYTp753J0pr8dqye-w,22374 +pytz-2024.2.dist-info/RECORD,, +pytz-2024.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pytz-2024.2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +pytz-2024.2.dist-info/top_level.txt,sha256=6xRYlt934v1yHb1JIrXgHyGxn3cqACvd-yE8ski_kcc,5 +pytz-2024.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pytz/__init__.py,sha256=EJ_Ql_evs0r3_1M46Nda56UMV_DjXf3IKRYvF71E0XM,35081 pytz/exceptions.py,sha256=434ZcuLlpLQY9mWoGq7zJMV1TyiYvVgpKBU1qZkbDjM,1571 pytz/lazy.py,sha256=toeR5uDWKBj6ezsUZ4elNP6CEMtK7CO2jS9A30nsFbo,5404 pytz/reference.py,sha256=zUtCki7JFEmrzrjNsfMD7YL0lWDxynKc1Ubo4iXSs74,3778 @@ -22,9 +22,9 @@ pytz/zoneinfo/Africa/Bamako,sha256=0u-sTl8j2IyV1ywdtCgHFw9S9D3ZiiBa9akqkbny2Zc,1 pytz/zoneinfo/Africa/Bangui,sha256=z_6wKCzL1_ug5JP_hneh5abdUZeIUELkN_ladz-ESEY,235 pytz/zoneinfo/Africa/Banjul,sha256=0u-sTl8j2IyV1ywdtCgHFw9S9D3ZiiBa9akqkbny2Zc,148 pytz/zoneinfo/Africa/Bissau,sha256=IjuxDP6EZiDHFvl_bHS6NN7sdRxLKXllooBC829poak,194 -pytz/zoneinfo/Africa/Blantyre,sha256=k_GelVHViGiuWCB1LSyTpIYSTDZEY9yclInQRY-LxoI,149 +pytz/zoneinfo/Africa/Blantyre,sha256=RE7TpxBBS8a_Q-sn5ZHaSdO-PbFTRJpqDJRz9-Of28s,149 pytz/zoneinfo/Africa/Brazzaville,sha256=z_6wKCzL1_ug5JP_hneh5abdUZeIUELkN_ladz-ESEY,235 -pytz/zoneinfo/Africa/Bujumbura,sha256=k_GelVHViGiuWCB1LSyTpIYSTDZEY9yclInQRY-LxoI,149 +pytz/zoneinfo/Africa/Bujumbura,sha256=RE7TpxBBS8a_Q-sn5ZHaSdO-PbFTRJpqDJRz9-Of28s,149 pytz/zoneinfo/Africa/Cairo,sha256=Lft-GCLQhaSJm9VqUmsEFoHIS1Vhfa7pFJn9GZCpifs,2399 pytz/zoneinfo/Africa/Casablanca,sha256=4RqVbw_F3ZucopIC2ivAJ8WDwj5wRODAB67tBpdXcgA,2429 pytz/zoneinfo/Africa/Ceuta,sha256=Cw-2_nFDGbN8WqIsVpcauyZooWX8j3Kmx2PnC0fHut8,2052 @@ -35,22 +35,22 @@ pytz/zoneinfo/Africa/Djibouti,sha256=yJsuJTqJJqbOz37_NOS_zbf-JNr_IthHGMMN7sDqSWg pytz/zoneinfo/Africa/Douala,sha256=z_6wKCzL1_ug5JP_hneh5abdUZeIUELkN_ladz-ESEY,235 pytz/zoneinfo/Africa/El_Aaiun,sha256=UWCCqQLJxd8qsTYw82kz9W1suwW5TRgnZw31sDWDz20,2295 pytz/zoneinfo/Africa/Freetown,sha256=0u-sTl8j2IyV1ywdtCgHFw9S9D3ZiiBa9akqkbny2Zc,148 -pytz/zoneinfo/Africa/Gaborone,sha256=k_GelVHViGiuWCB1LSyTpIYSTDZEY9yclInQRY-LxoI,149 -pytz/zoneinfo/Africa/Harare,sha256=k_GelVHViGiuWCB1LSyTpIYSTDZEY9yclInQRY-LxoI,149 +pytz/zoneinfo/Africa/Gaborone,sha256=RE7TpxBBS8a_Q-sn5ZHaSdO-PbFTRJpqDJRz9-Of28s,149 +pytz/zoneinfo/Africa/Harare,sha256=RE7TpxBBS8a_Q-sn5ZHaSdO-PbFTRJpqDJRz9-Of28s,149 pytz/zoneinfo/Africa/Johannesburg,sha256=bBvMdSZo53WFowiuhUO9C8zY6BOGViboCb-U8_49l34,246 pytz/zoneinfo/Africa/Juba,sha256=UVnIqEPJwHLTMC-r5qZQHNv9opoYVsKdq-ta_5XUw_Q,679 pytz/zoneinfo/Africa/Kampala,sha256=yJsuJTqJJqbOz37_NOS_zbf-JNr_IthHGMMN7sDqSWg,265 pytz/zoneinfo/Africa/Khartoum,sha256=MYWDoJ3AcCItZdApoeOgtWWDDxquwTon5v5TOGP70-o,679 -pytz/zoneinfo/Africa/Kigali,sha256=k_GelVHViGiuWCB1LSyTpIYSTDZEY9yclInQRY-LxoI,149 +pytz/zoneinfo/Africa/Kigali,sha256=RE7TpxBBS8a_Q-sn5ZHaSdO-PbFTRJpqDJRz9-Of28s,149 pytz/zoneinfo/Africa/Kinshasa,sha256=z_6wKCzL1_ug5JP_hneh5abdUZeIUELkN_ladz-ESEY,235 pytz/zoneinfo/Africa/Lagos,sha256=z_6wKCzL1_ug5JP_hneh5abdUZeIUELkN_ladz-ESEY,235 pytz/zoneinfo/Africa/Libreville,sha256=z_6wKCzL1_ug5JP_hneh5abdUZeIUELkN_ladz-ESEY,235 pytz/zoneinfo/Africa/Lome,sha256=0u-sTl8j2IyV1ywdtCgHFw9S9D3ZiiBa9akqkbny2Zc,148 pytz/zoneinfo/Africa/Luanda,sha256=z_6wKCzL1_ug5JP_hneh5abdUZeIUELkN_ladz-ESEY,235 -pytz/zoneinfo/Africa/Lubumbashi,sha256=k_GelVHViGiuWCB1LSyTpIYSTDZEY9yclInQRY-LxoI,149 -pytz/zoneinfo/Africa/Lusaka,sha256=k_GelVHViGiuWCB1LSyTpIYSTDZEY9yclInQRY-LxoI,149 +pytz/zoneinfo/Africa/Lubumbashi,sha256=RE7TpxBBS8a_Q-sn5ZHaSdO-PbFTRJpqDJRz9-Of28s,149 +pytz/zoneinfo/Africa/Lusaka,sha256=RE7TpxBBS8a_Q-sn5ZHaSdO-PbFTRJpqDJRz9-Of28s,149 pytz/zoneinfo/Africa/Malabo,sha256=z_6wKCzL1_ug5JP_hneh5abdUZeIUELkN_ladz-ESEY,235 -pytz/zoneinfo/Africa/Maputo,sha256=k_GelVHViGiuWCB1LSyTpIYSTDZEY9yclInQRY-LxoI,149 +pytz/zoneinfo/Africa/Maputo,sha256=RE7TpxBBS8a_Q-sn5ZHaSdO-PbFTRJpqDJRz9-Of28s,149 pytz/zoneinfo/Africa/Maseru,sha256=bBvMdSZo53WFowiuhUO9C8zY6BOGViboCb-U8_49l34,246 pytz/zoneinfo/Africa/Mbabane,sha256=bBvMdSZo53WFowiuhUO9C8zY6BOGViboCb-U8_49l34,246 pytz/zoneinfo/Africa/Mogadishu,sha256=yJsuJTqJJqbOz37_NOS_zbf-JNr_IthHGMMN7sDqSWg,265 @@ -89,7 +89,7 @@ pytz/zoneinfo/America/Asuncion,sha256=V8wwkUoNqyj0C-fUSADpU7HU8H3Qkr3jNPJ4SLsGUI pytz/zoneinfo/America/Atikokan,sha256=kayA_pdpMcSQ0FjIzotdcf-m1JYfbKE-qcFT8LC8zqA,182 pytz/zoneinfo/America/Atka,sha256=IB1DhwJQAKbhPJ9jHLf8zW5Dad7HIkBS-dhv64E1OlM,2356 pytz/zoneinfo/America/Bahia,sha256=qi7dA6FofDhLxVMmd2L8bK3HeaQnc9X-jiijwyfhs3g,1010 -pytz/zoneinfo/America/Bahia_Banderas,sha256=L6iHYbA1Us1pljllFLEIAHW4ZaZhFKoG2Zr8TT5aY38,1152 +pytz/zoneinfo/America/Bahia_Banderas,sha256=MvrXGJ5LzaHOeguJqxszxjxMhVafGVbk-ojXEc7_YEI,1100 pytz/zoneinfo/America/Barbados,sha256=ima-Qrrhazu4Qfvu2Z0-e6E-GTiYknuJBu6c2yVG9LE,436 pytz/zoneinfo/America/Belem,sha256=aZMUgtFDdHNISpqyQRYbmS2IBD-BAS3CaJnhu6onLCY,562 pytz/zoneinfo/America/Belize,sha256=pkfLY2KfPchbeJa1pWcXmWAwp4ZlRvxWLVezXnrbkws,1614 @@ -100,14 +100,14 @@ pytz/zoneinfo/America/Boise,sha256=7HQsNPJiUheQgFz5kVLvTnf5xhXAYaeANqDskxKz2Vs,2 pytz/zoneinfo/America/Buenos_Aires,sha256=JmU8lBwmy29gR6OmeytvFdMRx6ObJKnYNHmLyMmXX2M,1062 pytz/zoneinfo/America/Cambridge_Bay,sha256=_4xRlX3WdVpEcqoT6myD7NeTCXnn9OYk_iH006bwULo,2254 pytz/zoneinfo/America/Campo_Grande,sha256=gINiXg5i2e6Rh2Nbo2bFqhPAJL4F4cAqGnBankXTDXw,1430 -pytz/zoneinfo/America/Cancun,sha256=lI4ZtiBtxKqNHvU47vRSwc5-GDl8JOdC2A6oc9s8iIo,834 +pytz/zoneinfo/America/Cancun,sha256=EdV0Nw2WjM7VnjFHoq5jsSbLuuE7eP1OE74utEyWJG4,864 pytz/zoneinfo/America/Caracas,sha256=mUNMFdDzZLav_ePA1ocBdmqVBierkeEszTIFpNCm5J0,250 pytz/zoneinfo/America/Catamarca,sha256=uMCJXXGYmNESHVvj5RYBZ0McrOdE14hwm17l25MgRW0,1062 pytz/zoneinfo/America/Cayenne,sha256=4k7Iv1woX4atqePKrcvMQD2Vk9Tmma7rW_AW_R62pCc,184 pytz/zoneinfo/America/Cayman,sha256=kayA_pdpMcSQ0FjIzotdcf-m1JYfbKE-qcFT8LC8zqA,182 pytz/zoneinfo/America/Chicago,sha256=_roybr6I6sIAF6cYdIxGxoRpoef153Fty48dQ6bm9oY,3592 -pytz/zoneinfo/America/Chihuahua,sha256=ZAlPSsUfT3VGp1VdibnHIf-QsdEIqHuzX15wu2P2YQk,1102 -pytz/zoneinfo/America/Ciudad_Juarez,sha256=OQstyPrMxx3nNEbzgDhq_W0mK49-ApNMK7_6p-6dJ64,1538 +pytz/zoneinfo/America/Chihuahua,sha256=3Ngzbedg8AzAqxsbQSG0jVRx-LxYlw1i3kx-Yzl-2Ic,1102 +pytz/zoneinfo/America/Ciudad_Juarez,sha256=ir4b27DiFrhL0H4fZQ92nEa-BBoPfLWIz3phU373dgE,1538 pytz/zoneinfo/America/Coral_Harbour,sha256=kayA_pdpMcSQ0FjIzotdcf-m1JYfbKE-qcFT8LC8zqA,182 pytz/zoneinfo/America/Cordoba,sha256=uniNihhMHnr4XK4WpwiPUnrAT0YPmvzqB6f0hRLtXvY,1062 pytz/zoneinfo/America/Costa_Rica,sha256=74rYa6lrgIkyls9PkHo8SCYl9oOqiuG5S7MWdnJelP4,316 @@ -123,7 +123,7 @@ pytz/zoneinfo/America/Dominica,sha256=hJHlV_-AGoMGUWuMpZRv9fLmghrzFHfrR9fRkcxaZJ pytz/zoneinfo/America/Edmonton,sha256=-TkIfc3QlvaCf0p8COZ43Y1HRBAl-nARUi-JdXeK1vE,2332 pytz/zoneinfo/America/Eirunepe,sha256=j5eExkjFaqtC-D8XK0rGzoF9yEgbSlTbPqVG9WKhEa8,642 pytz/zoneinfo/America/El_Salvador,sha256=gvGN8Lkj-sGm2_rs8OUjAMf1oMtKp2Xes6UfWT0WqgU,224 -pytz/zoneinfo/America/Ensenada,sha256=57-Q9LSTNuTidz-lOTwDysmlCoeFUXSecvVVqNWburQ,2374 +pytz/zoneinfo/America/Ensenada,sha256=SluV7xzZm24LgMXSUVt1cD1AlE7y_bdE65HhDIdXLcs,2458 pytz/zoneinfo/America/Fort_Nelson,sha256=erfODr3DrSpz65kAdO7Ts2dGbZxvddEP6gx4BX3y2J0,2240 pytz/zoneinfo/America/Fort_Wayne,sha256=kNKy9Kj9ICsiYYfCCbAggzMA7exf-GpGPMxoXocHUyw,1682 pytz/zoneinfo/America/Fortaleza,sha256=rjiSB0q1cBuMDOM9orW_uwe5UOLBwTlfjFotwOYe1mU,702 @@ -138,7 +138,7 @@ pytz/zoneinfo/America/Guayaquil,sha256=j2UuIo-4RgSOlTNfu77mhZ92waNTeKFSvmoVemJoo pytz/zoneinfo/America/Guyana,sha256=R0bOvCRDC8SRIexmhsduPdHbbRPwI2GviD9otExiUrk,248 pytz/zoneinfo/America/Halifax,sha256=TZpmc5PwWoLfTfQoQ_b3U17BE2iVKSeNkR0Ho8mbTn8,3424 pytz/zoneinfo/America/Havana,sha256=HUQeAuKBsEkI5SLZjqynXICOUVOajkKzKH5r-Ov5Odc,2416 -pytz/zoneinfo/America/Hermosillo,sha256=WnlVBpVBG8ONnz0wpxteXmuvSzOGwSlAisvDd1GtKYA,456 +pytz/zoneinfo/America/Hermosillo,sha256=ixYKestLmS7gWobk9Kq6FtLZo1yqbWActrFUKluzctw,388 pytz/zoneinfo/America/Indiana/Indianapolis,sha256=kNKy9Kj9ICsiYYfCCbAggzMA7exf-GpGPMxoXocHUyw,1682 pytz/zoneinfo/America/Indiana/Knox,sha256=CsvZ5BKw2qVav3x_F8CU9taJdDk7jX41Cfsqms6jXV8,2444 pytz/zoneinfo/America/Indiana/Marengo,sha256=f3tQ-lgMSUA7nvn64pXhKtJL7mWzGajoCega5MEJSbI,1738 @@ -168,15 +168,15 @@ pytz/zoneinfo/America/Manaus,sha256=F6RLOOeOi9lymZiQmQ9pR8tFpPZ6EguNdPfOc6BhXDE, pytz/zoneinfo/America/Marigot,sha256=hJHlV_-AGoMGUWuMpZRv9fLmghrzFHfrR9fRkcxaZJc,246 pytz/zoneinfo/America/Martinique,sha256=fMs80kOU2YFvC0f9y2eje97JeAtTYBamXrnlTunNLzQ,232 pytz/zoneinfo/America/Matamoros,sha256=fq-PqdmZrQ98UsFmHA9ivjBZv5GEBRTOuLQ5Cu5ajW8,1418 -pytz/zoneinfo/America/Mazatlan,sha256=RQQVwlEVHRp2X-c_0hJ46y54abTlqUuLkyrUUicyc5g,1128 +pytz/zoneinfo/America/Mazatlan,sha256=BWH2NqVPA1PsyELPN_2BF8KllrsmQkqg1eujsQvnnx8,1060 pytz/zoneinfo/America/Mendoza,sha256=xcOVtvRyVYFAU90y2QYwpyQhpMLyAp7-Fxvku4kgl0c,1062 pytz/zoneinfo/America/Menominee,sha256=Arv9WLbfhNcpRsUjHDU757BEdwlp08Gt30AixG3gZ04,2274 -pytz/zoneinfo/America/Merida,sha256=ORJCGiO2mXG-kk5ZZGro1MNuKqRnJx6HJlvoezTMM90,1004 +pytz/zoneinfo/America/Merida,sha256=SVNEHCazjomftnuPVBayFI-E-IQ0WmluHfTpHP0h3d0,1004 pytz/zoneinfo/America/Metlakatla,sha256=twmieGTVY2V-U8nFxqvx7asYv8GVjeWdLtrOI7UApVI,1423 -pytz/zoneinfo/America/Mexico_City,sha256=A5MlfDUZ4O1-jMTRt0WPem7qqcW0Nrslls1hlc8C4-Q,1222 +pytz/zoneinfo/America/Mexico_City,sha256=Uog2-FMWz2o12jR6sK9vemJamLeo6OEFMQR3s0xTxkc,1222 pytz/zoneinfo/America/Miquelon,sha256=l5txBJYe9HTRZlILcbSL_HNDYrjUb0ouecNy7QEkg9c,1652 pytz/zoneinfo/America/Moncton,sha256=Wmv-bk9aKKcWWzOpc1UFu67HOfwaIk2Wmh3LgqGctys,3154 -pytz/zoneinfo/America/Monterrey,sha256=vKBLVjG0bNVDI07M4WwOVv2KbrYJVNTLmc19iM2CvTU,980 +pytz/zoneinfo/America/Monterrey,sha256=YixTESJubf6ZBUXy6g32hAM2gR4GXXPqOU4tv0L3kG0,1114 pytz/zoneinfo/America/Montevideo,sha256=dQEBE4mjZPtyRjKXK6Z-bMHJdFqpwhIzxDH4x04rKYk,1496 pytz/zoneinfo/America/Montreal,sha256=pYehoWB0Ofe6woPhgV8r26-5ZJpFPRjgbC5E5pltiI8,3494 pytz/zoneinfo/America/Montserrat,sha256=hJHlV_-AGoMGUWuMpZRv9fLmghrzFHfrR9fRkcxaZJc,246 @@ -189,7 +189,7 @@ pytz/zoneinfo/America/North_Dakota/Beulah,sha256=qtgbqNu8M3AkHF2n-_oSps1pYT4Sxgc pytz/zoneinfo/America/North_Dakota/Center,sha256=9ZWbK9YKkquULyBUFS3Lr_idxbt7V7y4W4EO0Kn20sw,2396 pytz/zoneinfo/America/North_Dakota/New_Salem,sha256=DH_bsQfuUnK2obdb06KgisO4XLqht12BXdrgUsZZveg,2396 pytz/zoneinfo/America/Nuuk,sha256=KGXrMN-YkYpVCgLdpcfwMFQ77EsRAGsjUCG3yAUvVfw,1889 -pytz/zoneinfo/America/Ojinaga,sha256=9catgEQ2SD7qfuvTMxs15Cdd9SKaUy-svEzPBFw2Q3Q,1524 +pytz/zoneinfo/America/Ojinaga,sha256=b38Q_7VdkCZzaVwb7OXuddihJAzUKPTTqXcmpBm1ntE,1524 pytz/zoneinfo/America/Panama,sha256=kayA_pdpMcSQ0FjIzotdcf-m1JYfbKE-qcFT8LC8zqA,182 pytz/zoneinfo/America/Pangnirtung,sha256=feOnxAN0N0r-M1qlkrA4JMyawoc0tqae0iiBCPDAs4k,2202 pytz/zoneinfo/America/Paramaribo,sha256=Z7UZvNlgd-qEUHjEPYXIkLNTgjMcCzk9EfUUEmUyd7M,248 @@ -207,7 +207,7 @@ pytz/zoneinfo/America/Regina,sha256=yjqT08pHbICYe83H8JmtaDBvCFqRv7Tfze3Y8xuXukw, pytz/zoneinfo/America/Resolute,sha256=CnMU2dBI-63vt8-J0Q1Ropx-8b9pRCLjhvrycMIedGg,2066 pytz/zoneinfo/America/Rio_Branco,sha256=0gpJUl46hQbp0P6Xj1S0NArIWeAryuuDXjsldvB5GHE,614 pytz/zoneinfo/America/Rosario,sha256=uniNihhMHnr4XK4WpwiPUnrAT0YPmvzqB6f0hRLtXvY,1062 -pytz/zoneinfo/America/Santa_Isabel,sha256=57-Q9LSTNuTidz-lOTwDysmlCoeFUXSecvVVqNWburQ,2374 +pytz/zoneinfo/America/Santa_Isabel,sha256=SluV7xzZm24LgMXSUVt1cD1AlE7y_bdE65HhDIdXLcs,2458 pytz/zoneinfo/America/Santarem,sha256=VmZP9S5pPucFxyqAOV908EmWXQZvgCgWLmlJJTUl0LE,588 pytz/zoneinfo/America/Santiago,sha256=0CDw13dCMUsoquMupoJgupkzAUNhDK6E0lVxURA7osA,2515 pytz/zoneinfo/America/Santo_Domingo,sha256=DKtaEj8fQ92ybITTWU4Bm160S9pzJmUVbjaWRnenxU4,458 @@ -225,7 +225,7 @@ pytz/zoneinfo/America/Swift_Current,sha256=RRKOF7vZC8VvYxD8PP4J1_hUPayKBP7Lu80av pytz/zoneinfo/America/Tegucigalpa,sha256=EzOz7ntTlreMq69JZ2CcAb8Ps98V9bUMN480tpPIyw4,252 pytz/zoneinfo/America/Thule,sha256=8xuPRaZU8RgO5ECqFYHYmnHioc81sBOailkVu8Y02i8,1502 pytz/zoneinfo/America/Thunder_Bay,sha256=pYehoWB0Ofe6woPhgV8r26-5ZJpFPRjgbC5E5pltiI8,3494 -pytz/zoneinfo/America/Tijuana,sha256=57-Q9LSTNuTidz-lOTwDysmlCoeFUXSecvVVqNWburQ,2374 +pytz/zoneinfo/America/Tijuana,sha256=SluV7xzZm24LgMXSUVt1cD1AlE7y_bdE65HhDIdXLcs,2458 pytz/zoneinfo/America/Toronto,sha256=pYehoWB0Ofe6woPhgV8r26-5ZJpFPRjgbC5E5pltiI8,3494 pytz/zoneinfo/America/Tortola,sha256=hJHlV_-AGoMGUWuMpZRv9fLmghrzFHfrR9fRkcxaZJc,246 pytz/zoneinfo/America/Vancouver,sha256=sknKH0jSPWam-DHfM35qXs8Nam7d5TFlkUI9Sgxryyg,2892 @@ -266,14 +266,14 @@ pytz/zoneinfo/Asia/Bishkek,sha256=IOoUyjABILCkXu1rjCIqSwAufRYFklc5YAC4jdhVw6Q,96 pytz/zoneinfo/Asia/Brunei,sha256=D5qtyWJ_SM8bTQeJJIYhqqojxlVKbrFC1EYMDU9GzXQ,469 pytz/zoneinfo/Asia/Calcutta,sha256=6Qw0EDbLcgMgDik8s7UTJn4QSjmllPNeGVJU5rwKF88,285 pytz/zoneinfo/Asia/Chita,sha256=LbSlS23swFkANUScg8zkNR0imANWNfOIaYd39HbLdIQ,1207 -pytz/zoneinfo/Asia/Choibalsan,sha256=atm7FmPwZGsftLM7vS1LltjcdaDC-DSg1cIdP2MF17I,935 +pytz/zoneinfo/Asia/Choibalsan,sha256=qUkXRsTc_u7B90JxULSu7yzKbGtGfKcfEFIasGPC2ec,877 pytz/zoneinfo/Asia/Chongqing,sha256=ZP_C5DqUQ1oEPAQNHTr36S0DGtx453N68YYbqk7u8-Y,561 pytz/zoneinfo/Asia/Chungking,sha256=ZP_C5DqUQ1oEPAQNHTr36S0DGtx453N68YYbqk7u8-Y,561 pytz/zoneinfo/Asia/Colombo,sha256=w52L7bgT4m5hcgRuevIPY83xytfkBmkLhnKMwp16KsY,358 pytz/zoneinfo/Asia/Dacca,sha256=-xulJ2KVhvKp6rlZLMydpw7oXVirk-riEH-181xPE54,323 pytz/zoneinfo/Asia/Damascus,sha256=EthGheaHWmy5IrLCc9NmM3jvASQFHt8TsBF07I1tgbg,1873 pytz/zoneinfo/Asia/Dhaka,sha256=-xulJ2KVhvKp6rlZLMydpw7oXVirk-riEH-181xPE54,323 -pytz/zoneinfo/Asia/Dili,sha256=0mUs0Utk-uW9deZV3cBUTpfWMgFvl0DyN29JuKvKMyw,213 +pytz/zoneinfo/Asia/Dili,sha256=2A9uFmwSwoFA5o2ek1LA0ucohPnM42ghWvD9D5TdnJk,257 pytz/zoneinfo/Asia/Dubai,sha256=pmdhPhaJRwKwONvxiZNGeFSICjlWzyY9JlFHv-H9upY,151 pytz/zoneinfo/Asia/Dushanbe,sha256=koYnnYWuFsBXd1vJfZsGdpwnbFHEwvkGBmSrrx3KIss,577 pytz/zoneinfo/Asia/Famagusta,sha256=CFrcygd8ude5x6OEtfM_Dw0KYHoxpPPzq46KoHVxjjc,2028 @@ -346,14 +346,14 @@ pytz/zoneinfo/Asia/Yakutsk,sha256=PPNrRGgg9jefOUM-6M8XqaIm-ElfmRZSWAtSGKLzNXQ,11 pytz/zoneinfo/Asia/Yangon,sha256=_YHASq4Z5YcUILIdhEzg27CGLzarUHPDHs1Dj0QgNGM,254 pytz/zoneinfo/Asia/Yekaterinburg,sha256=4NyEW6Xjr4UsWPh63HIPI4G6GT_tVG1Xkgc2xbwGjzA,1229 pytz/zoneinfo/Asia/Yerevan,sha256=FM0pUA4NbTWBb_CsJ5KCLVrLoNmad7njBKqFrJBDoxE,1137 -pytz/zoneinfo/Atlantic/Azores,sha256=NyNrE2YIwL9yVddpECcYWwci5JzrfjxiIXP7RP0MrL8,3498 +pytz/zoneinfo/Atlantic/Azores,sha256=66hDxaK8xFnktLMrpNxkD4r1gGkhS-PEpleuwzuGRA0,3442 pytz/zoneinfo/Atlantic/Bermuda,sha256=LNGKfMsnYvwImjTyzXrLhMOHHDu7qI67RbYNKvvI15I,2396 pytz/zoneinfo/Atlantic/Canary,sha256=ymK9ufqphvNjDK3hzikN4GfkcR3QeCBiPKyVc6FjlbA,1897 pytz/zoneinfo/Atlantic/Cape_Verde,sha256=o92pLdLFX_b9vUiq3rNpca4tupIO3dx9rNrnPcA8474,256 pytz/zoneinfo/Atlantic/Faeroe,sha256=NibdZPZtapnYR_myIZnMdTaSKGsOBGgujj0_T2NvAzs,1815 pytz/zoneinfo/Atlantic/Faroe,sha256=NibdZPZtapnYR_myIZnMdTaSKGsOBGgujj0_T2NvAzs,1815 pytz/zoneinfo/Atlantic/Jan_Mayen,sha256=XuR19xoPwaMvrrhJ-MOcbnqmbW1B7HQrl7OnQ2s7BwE,2298 -pytz/zoneinfo/Atlantic/Madeira,sha256=21Zcy0xRqDN3oY8jmjjO-LI7aC3G9mcS9ytaYg0g7ik,3503 +pytz/zoneinfo/Atlantic/Madeira,sha256=lYY85MC5-GUKExm353ixwtZDxasYavTTWELvv5RXLxE,3377 pytz/zoneinfo/Atlantic/Reykjavik,sha256=0u-sTl8j2IyV1ywdtCgHFw9S9D3ZiiBa9akqkbny2Zc,148 pytz/zoneinfo/Atlantic/South_Georgia,sha256=I9SAcPPumy6Xf9P7dg2aE16oxwDIqyKFqinJTC-XsgM,150 pytz/zoneinfo/Atlantic/St_Helena,sha256=0u-sTl8j2IyV1ywdtCgHFw9S9D3ZiiBa9akqkbny2Zc,148 @@ -385,8 +385,8 @@ pytz/zoneinfo/Brazil/Acre,sha256=0gpJUl46hQbp0P6Xj1S0NArIWeAryuuDXjsldvB5GHE,614 pytz/zoneinfo/Brazil/DeNoronha,sha256=feeRAijQqKylZgqe84nKhsFLycT5zIBm7mLIvdyGw4w,702 pytz/zoneinfo/Brazil/East,sha256=BMBnRO4_4HjvO4t3njjrMGZr-ZPmegkvyvL8KPY6ZM4,1430 pytz/zoneinfo/Brazil/West,sha256=F6RLOOeOi9lymZiQmQ9pR8tFpPZ6EguNdPfOc6BhXDE,590 -pytz/zoneinfo/CET,sha256=o4omkrM_IsITxooUo8krM921XfBdvRs9JhwGXGd-Ypg,2094 -pytz/zoneinfo/CST6CDT,sha256=WGbtZ1FwjRX6Jeo_TCXKsfeDs4V9uhXGJfcnLJhk3s0,2310 +pytz/zoneinfo/CET,sha256=gS9Vrrbozend9HhuFetCVrIegs9fXSjaG60X2UVwysA,2933 +pytz/zoneinfo/CST6CDT,sha256=_roybr6I6sIAF6cYdIxGxoRpoef153Fty48dQ6bm9oY,3592 pytz/zoneinfo/Canada/Atlantic,sha256=TZpmc5PwWoLfTfQoQ_b3U17BE2iVKSeNkR0Ho8mbTn8,3424 pytz/zoneinfo/Canada/Central,sha256=7P-_YQrneFcon7QKSTOnkiGjEppFDn3Z48MJ1qq8VBw,2868 pytz/zoneinfo/Canada/Eastern,sha256=pYehoWB0Ofe6woPhgV8r26-5ZJpFPRjgbC5E5pltiI8,3494 @@ -398,9 +398,9 @@ pytz/zoneinfo/Canada/Yukon,sha256=TrR6PCnYG-mSClBMohqlP8qnYhXMUsydI-L-quXFxyM,16 pytz/zoneinfo/Chile/Continental,sha256=0CDw13dCMUsoquMupoJgupkzAUNhDK6E0lVxURA7osA,2515 pytz/zoneinfo/Chile/EasterIsland,sha256=QbubBs_xQlvKweAnurhyHjIK4ji77Gh4G-usXul6XVM,2219 pytz/zoneinfo/Cuba,sha256=HUQeAuKBsEkI5SLZjqynXICOUVOajkKzKH5r-Ov5Odc,2416 -pytz/zoneinfo/EET,sha256=gGVsW5-qnI7ty8vqVK1ADWhunrvAT8kUC79GUf-_7G8,1908 -pytz/zoneinfo/EST,sha256=uKE_VPKfxGyYEsyqV_DdE2MW55vs_qUioOdIn5Goobc,114 -pytz/zoneinfo/EST5EDT,sha256=fwzEMT1jgnY2dDjd0EqDl26_7LC-oF48Bd4ng5311H0,2310 +pytz/zoneinfo/EET,sha256=XDY-FBUddRyQHN8GxQLZ4awjuOlWlzlUdjv7OdXFNzA,2262 +pytz/zoneinfo/EST,sha256=kayA_pdpMcSQ0FjIzotdcf-m1JYfbKE-qcFT8LC8zqA,182 +pytz/zoneinfo/EST5EDT,sha256=6e0H177gx2qdRC0JHvHwFmj-58TyYBTAqGixn-bBipU,3552 pytz/zoneinfo/Egypt,sha256=Lft-GCLQhaSJm9VqUmsEFoHIS1Vhfa7pFJn9GZCpifs,2399 pytz/zoneinfo/Eire,sha256=QOjSocO1cihNo59vQkWxvIFPRSxE9apz0KARVx1czEM,3492 pytz/zoneinfo/Etc/GMT,sha256=bZ83iIPAefhsA4elVHqSxEmGnYBuB94QCEqwTwJJAY0,114 @@ -463,7 +463,7 @@ pytz/zoneinfo/Europe/Kaliningrad,sha256=s7GXSe1YvMcs7AiUhHNTA6I4nAOQn_Kmz_ZqJYO- pytz/zoneinfo/Europe/Kiev,sha256=-wrpG9jPuIKFP1NgBVvnxsMRf9L_h5z3J6Q3jj1AwNM,2120 pytz/zoneinfo/Europe/Kirov,sha256=P7T2Zf5Eo6o4L4Dbg_BfiFjUgTj0dQXlrwY-QZ1eBVk,1185 pytz/zoneinfo/Europe/Kyiv,sha256=-wrpG9jPuIKFP1NgBVvnxsMRf9L_h5z3J6Q3jj1AwNM,2120 -pytz/zoneinfo/Europe/Lisbon,sha256=mpUpxGexMhbOBImDLSQs5-GAk7pm7tg4qYW044Kkle0,3497 +pytz/zoneinfo/Europe/Lisbon,sha256=krB8skaJImv5NDCNHxvTPDBqpNphDFLNW84lB3lgUCw,3527 pytz/zoneinfo/Europe/Ljubljana,sha256=OpWtsGFWBE_S-mYoQcAmjCta9HwbGQANnSmVY9OHCTo,1920 pytz/zoneinfo/Europe/London,sha256=yFSVBw3KQmh99qHD7ngKJ8vLgvGER1Dqb2QoM6RNKbQ,3664 pytz/zoneinfo/Europe/Luxembourg,sha256=gS9Vrrbozend9HhuFetCVrIegs9fXSjaG60X2UVwysA,2933 @@ -510,7 +510,7 @@ pytz/zoneinfo/GMT+0,sha256=bZ83iIPAefhsA4elVHqSxEmGnYBuB94QCEqwTwJJAY0,114 pytz/zoneinfo/GMT-0,sha256=bZ83iIPAefhsA4elVHqSxEmGnYBuB94QCEqwTwJJAY0,114 pytz/zoneinfo/GMT0,sha256=bZ83iIPAefhsA4elVHqSxEmGnYBuB94QCEqwTwJJAY0,114 pytz/zoneinfo/Greenwich,sha256=bZ83iIPAefhsA4elVHqSxEmGnYBuB94QCEqwTwJJAY0,114 -pytz/zoneinfo/HST,sha256=1YkCncvgL9Z5CmUo4Vk8VbQmgA7ZAQ0PtE37j1yOli8,115 +pytz/zoneinfo/HST,sha256=fwPRv1Jk56sCOi75uZfd_Iy2k2aSQHx3B2K5xUlSPzM,329 pytz/zoneinfo/Hongkong,sha256=al_O4kPlq5JpgkLYjEaZzrcgiiLul9NC0R5B69JVWhc,1233 pytz/zoneinfo/Iceland,sha256=0u-sTl8j2IyV1ywdtCgHFw9S9D3ZiiBa9akqkbny2Zc,148 pytz/zoneinfo/Indian/Antananarivo,sha256=yJsuJTqJJqbOz37_NOS_zbf-JNr_IthHGMMN7sDqSWg,265 @@ -530,17 +530,17 @@ pytz/zoneinfo/Jamaica,sha256=wlagieUPRf5-beie-h7QsONbNzjGsm8vMs8uf28pw28,482 pytz/zoneinfo/Japan,sha256=oCueZgRNxcNcX3ZGdif9y6Su4cyVhga4XHdwlcrYLOs,309 pytz/zoneinfo/Kwajalein,sha256=TmZ_0f-ySQ-saBAlRXV0f49Itwne51VBXn6rWcrWqHQ,302 pytz/zoneinfo/Libya,sha256=W1dptGD70T7ppGoo0fczFQeDiIp0nultLNPV66MwB2c,625 -pytz/zoneinfo/MET,sha256=i3CKSuP4N_PAj7o-Cbk8zPEdFs0CWWBCAfg2JXDx5V8,2094 -pytz/zoneinfo/MST,sha256=6IQwvtT12Bz1pTiqFuoVxNY-4ViS7ZrYHo5nPWwzKPw,114 -pytz/zoneinfo/MST7MDT,sha256=910Ek32FKoSyZWY_H19VHaVvqb-JsvnWTOOHvhrKsE0,2310 -pytz/zoneinfo/Mexico/BajaNorte,sha256=57-Q9LSTNuTidz-lOTwDysmlCoeFUXSecvVVqNWburQ,2374 -pytz/zoneinfo/Mexico/BajaSur,sha256=RQQVwlEVHRp2X-c_0hJ46y54abTlqUuLkyrUUicyc5g,1128 -pytz/zoneinfo/Mexico/General,sha256=A5MlfDUZ4O1-jMTRt0WPem7qqcW0Nrslls1hlc8C4-Q,1222 +pytz/zoneinfo/MET,sha256=gS9Vrrbozend9HhuFetCVrIegs9fXSjaG60X2UVwysA,2933 +pytz/zoneinfo/MST,sha256=illz0sYuLL8lIPK0Tkou6dL0Vck_D0W_3rRTOvFYRmQ,360 +pytz/zoneinfo/MST7MDT,sha256=MugZwApDs8NI9TnXANQlUE8guNBowWQY0m-ptpPndck,2460 +pytz/zoneinfo/Mexico/BajaNorte,sha256=SluV7xzZm24LgMXSUVt1cD1AlE7y_bdE65HhDIdXLcs,2458 +pytz/zoneinfo/Mexico/BajaSur,sha256=BWH2NqVPA1PsyELPN_2BF8KllrsmQkqg1eujsQvnnx8,1060 +pytz/zoneinfo/Mexico/General,sha256=Uog2-FMWz2o12jR6sK9vemJamLeo6OEFMQR3s0xTxkc,1222 pytz/zoneinfo/NZ,sha256=gADjoyPo_QISQU6UJrAgcHp3HDaMoOFRdH-d23uBSyc,2437 pytz/zoneinfo/NZ-CHAT,sha256=xhexVc5lfJ_qAv2d3HrII6lfRSxKZYBAjY2zpYkCGE8,2054 pytz/zoneinfo/Navajo,sha256=MugZwApDs8NI9TnXANQlUE8guNBowWQY0m-ptpPndck,2460 pytz/zoneinfo/PRC,sha256=ZP_C5DqUQ1oEPAQNHTr36S0DGtx453N68YYbqk7u8-Y,561 -pytz/zoneinfo/PST8PDT,sha256=Q7TCLkE69a6g7mPoPAkqhg-0dStyiAC0jVlM72KG_R8,2310 +pytz/zoneinfo/PST8PDT,sha256=aJd7ua1tGG_vxser02AQpm4wAI3LLTdgh6QcSYYecmg,2852 pytz/zoneinfo/Pacific/Apia,sha256=M3QKsp75Q7H1X3aeE_9ZqQli9aEkNCCQctZQ5sEKu00,598 pytz/zoneinfo/Pacific/Auckland,sha256=gADjoyPo_QISQU6UJrAgcHp3HDaMoOFRdH-d23uBSyc,2437 pytz/zoneinfo/Pacific/Bougainville,sha256=hWE86eXnNx-vABbp7-YSIqWyecHPMIWLftVloAoPhL8,254 @@ -586,7 +586,7 @@ pytz/zoneinfo/Pacific/Wake,sha256=UyaKimsR8LjgL8Z2g65I0HTvr3tMZuA2wUeBB6_Zp9c,15 pytz/zoneinfo/Pacific/Wallis,sha256=UyaKimsR8LjgL8Z2g65I0HTvr3tMZuA2wUeBB6_Zp9c,152 pytz/zoneinfo/Pacific/Yap,sha256=nB36HBWZTdh3TlP0DLFNz1KRQ0aHIfHbp7LC4Urp9fA,172 pytz/zoneinfo/Poland,sha256=TiLDPbeVF0ckgLVEkaSeDaKZ8wctdJDOl_HE_Wd5rKs,2654 -pytz/zoneinfo/Portugal,sha256=mpUpxGexMhbOBImDLSQs5-GAk7pm7tg4qYW044Kkle0,3497 +pytz/zoneinfo/Portugal,sha256=krB8skaJImv5NDCNHxvTPDBqpNphDFLNW84lB3lgUCw,3527 pytz/zoneinfo/ROC,sha256=DMmQwOpPql25ue3Nf8vAKKT4em06D1Z9rHbLIitxixk,761 pytz/zoneinfo/ROK,sha256=LI9LsV3XcJC0l-KoQf8zI-y7rk-du57erS-N2Ptdi7Q,617 pytz/zoneinfo/Singapore,sha256=XmeVImeqcJ8hJzm7TjAti1nWJAxawOqq7jIzDnHX2hI,401 @@ -607,11 +607,11 @@ pytz/zoneinfo/US/Samoa,sha256=fCYrYphYY6rUfxOw712y5cyRe104AC3pouqD3bCINFg,175 pytz/zoneinfo/UTC,sha256=i4WEZ5GrLIpUY8g6W-PAQ-JXDXRIQ01BOYlp7Ufj5vI,114 pytz/zoneinfo/Universal,sha256=i4WEZ5GrLIpUY8g6W-PAQ-JXDXRIQ01BOYlp7Ufj5vI,114 pytz/zoneinfo/W-SU,sha256=KmkofRcj6T8Ph28PJChm8JVp13uRvef6TZ0GuPzUiDw,1535 -pytz/zoneinfo/WET,sha256=Sc0l03EfVs_aIi17I4KyZJFkwiAHat5BgpjuuFDhgQ0,1905 +pytz/zoneinfo/WET,sha256=krB8skaJImv5NDCNHxvTPDBqpNphDFLNW84lB3lgUCw,3527 pytz/zoneinfo/Zulu,sha256=i4WEZ5GrLIpUY8g6W-PAQ-JXDXRIQ01BOYlp7Ufj5vI,114 pytz/zoneinfo/iso3166.tab,sha256=oBpdFY8x1GrY5vjMKgbGQYEGgqk5fUYDIPaNVCG2XnE,4791 -pytz/zoneinfo/leapseconds,sha256=fjC39Eu3wB6I4g7x_VL7HzvDVbiKbLUjfQAEgo7442I,3257 -pytz/zoneinfo/tzdata.zi,sha256=8PWtzwDNZfLJU8Wa6Ktci7tg9V5mpvh26Vb0P8jBU0w,109390 -pytz/zoneinfo/zone.tab,sha256=qSLfeCWE3tsCDIIQbr71DMkmCUXTIUEgNZgfN-60d-Y,18846 -pytz/zoneinfo/zone1970.tab,sha256=FJErvL9wggoFluO2WceYn8ZQ-nA9A073Lub1x2Pzg40,17582 -pytz/zoneinfo/zonenow.tab,sha256=YoPd7huhHsKlJliOO-eMIBE5-bHBKpbfjkSJQFAto6I,8311 +pytz/zoneinfo/leapseconds,sha256=X1FVahN0_N2AY6gOUBNWW9MsP297cqFQTHJypTr0rgI,3253 +pytz/zoneinfo/tzdata.zi,sha256=qceqNWVumOYNg29-ij_5AO-b5F81DstN72fXE-u711g,107024 +pytz/zoneinfo/zone.tab,sha256=a2hE16NtKUnPJzM2krm5rKu1vxtP98nUhGHO3sE6DbM,18775 +pytz/zoneinfo/zone1970.tab,sha256=3ANHICItrC0iU1vSQAMKZXN1a68sozBiy9AHi9ZGooE,17510 +pytz/zoneinfo/zonenow.tab,sha256=vEbqGYEEhc_CL-FnoeZ5q3CsPTu8sETOnicuJxFJRqY,8101 diff --git a/libs/pytz-2024.1.dist-info/REQUESTED b/libs/pytz-2024.2.dist-info/REQUESTED similarity index 100% rename from libs/pytz-2024.1.dist-info/REQUESTED rename to libs/pytz-2024.2.dist-info/REQUESTED diff --git a/libs/charset_normalizer-3.3.2.dist-info/WHEEL b/libs/pytz-2024.2.dist-info/WHEEL similarity index 100% rename from libs/charset_normalizer-3.3.2.dist-info/WHEEL rename to libs/pytz-2024.2.dist-info/WHEEL diff --git a/libs/pytz-2024.1.dist-info/top_level.txt b/libs/pytz-2024.2.dist-info/top_level.txt similarity index 100% rename from libs/pytz-2024.1.dist-info/top_level.txt rename to libs/pytz-2024.2.dist-info/top_level.txt diff --git a/libs/pytz-2024.1.dist-info/zip-safe b/libs/pytz-2024.2.dist-info/zip-safe similarity index 100% rename from libs/pytz-2024.1.dist-info/zip-safe rename to libs/pytz-2024.2.dist-info/zip-safe diff --git a/libs/pytz/__init__.py b/libs/pytz/__init__.py index 2355f8b44..96409e2d0 100644 --- a/libs/pytz/__init__.py +++ b/libs/pytz/__init__.py @@ -22,8 +22,8 @@ # The IANA (nee Olson) database is updated several times a year. -OLSON_VERSION = '2024a' -VERSION = '2024.1' # pip compatible version number. +OLSON_VERSION = '2024b' +VERSION = '2024.2' # pip compatible version number. __version__ = VERSION OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling @@ -1340,7 +1340,6 @@ def _test(): 'Asia/Bishkek', 'Asia/Brunei', 'Asia/Chita', - 'Asia/Choibalsan', 'Asia/Colombo', 'Asia/Damascus', 'Asia/Dhaka', diff --git a/libs/pytz/zoneinfo/Africa/Blantyre b/libs/pytz/zoneinfo/Africa/Blantyre index 52753c0f87bbfa457ada89d400908a3d6537ac0e..65f043f1d1833d26b5fe42a460f84b35d1dcba63 100644 GIT binary patch delta 32 ecmbQrIF)gN4ri~^)iOo~2Dz?@rVdD)I&lD@?Fp>_ delta 32 ecmbQrIF)gN4ri0w(Jzb)401gaO&yRpb>aZ7J_>&T diff --git a/libs/pytz/zoneinfo/Africa/Bujumbura b/libs/pytz/zoneinfo/Africa/Bujumbura index 52753c0f87bbfa457ada89d400908a3d6537ac0e..65f043f1d1833d26b5fe42a460f84b35d1dcba63 100644 GIT binary patch delta 32 ecmbQrIF)gN4ri~^)iOo~2Dz?@rVdD)I&lD@?Fp>_ delta 32 ecmbQrIF)gN4ri0w(Jzb)401gaO&yRpb>aZ7J_>&T diff --git a/libs/pytz/zoneinfo/Africa/Gaborone b/libs/pytz/zoneinfo/Africa/Gaborone index 52753c0f87bbfa457ada89d400908a3d6537ac0e..65f043f1d1833d26b5fe42a460f84b35d1dcba63 100644 GIT binary patch delta 32 ecmbQrIF)gN4ri~^)iOo~2Dz?@rVdD)I&lD@?Fp>_ delta 32 ecmbQrIF)gN4ri0w(Jzb)401gaO&yRpb>aZ7J_>&T diff --git a/libs/pytz/zoneinfo/Africa/Harare b/libs/pytz/zoneinfo/Africa/Harare index 52753c0f87bbfa457ada89d400908a3d6537ac0e..65f043f1d1833d26b5fe42a460f84b35d1dcba63 100644 GIT binary patch delta 32 ecmbQrIF)gN4ri~^)iOo~2Dz?@rVdD)I&lD@?Fp>_ delta 32 ecmbQrIF)gN4ri0w(Jzb)401gaO&yRpb>aZ7J_>&T diff --git a/libs/pytz/zoneinfo/Africa/Kigali b/libs/pytz/zoneinfo/Africa/Kigali index 52753c0f87bbfa457ada89d400908a3d6537ac0e..65f043f1d1833d26b5fe42a460f84b35d1dcba63 100644 GIT binary patch delta 32 ecmbQrIF)gN4ri~^)iOo~2Dz?@rVdD)I&lD@?Fp>_ delta 32 ecmbQrIF)gN4ri0w(Jzb)401gaO&yRpb>aZ7J_>&T diff --git a/libs/pytz/zoneinfo/Africa/Lubumbashi b/libs/pytz/zoneinfo/Africa/Lubumbashi index 52753c0f87bbfa457ada89d400908a3d6537ac0e..65f043f1d1833d26b5fe42a460f84b35d1dcba63 100644 GIT binary patch delta 32 ecmbQrIF)gN4ri~^)iOo~2Dz?@rVdD)I&lD@?Fp>_ delta 32 ecmbQrIF)gN4ri0w(Jzb)401gaO&yRpb>aZ7J_>&T diff --git a/libs/pytz/zoneinfo/Africa/Lusaka b/libs/pytz/zoneinfo/Africa/Lusaka index 52753c0f87bbfa457ada89d400908a3d6537ac0e..65f043f1d1833d26b5fe42a460f84b35d1dcba63 100644 GIT binary patch delta 32 ecmbQrIF)gN4ri~^)iOo~2Dz?@rVdD)I&lD@?Fp>_ delta 32 ecmbQrIF)gN4ri0w(Jzb)401gaO&yRpb>aZ7J_>&T diff --git a/libs/pytz/zoneinfo/Africa/Maputo b/libs/pytz/zoneinfo/Africa/Maputo index 52753c0f87bbfa457ada89d400908a3d6537ac0e..65f043f1d1833d26b5fe42a460f84b35d1dcba63 100644 GIT binary patch delta 32 ecmbQrIF)gN4ri~^)iOo~2Dz?@rVdD)I&lD@?Fp>_ delta 32 ecmbQrIF)gN4ri0w(Jzb)401gaO&yRpb>aZ7J_>&T diff --git a/libs/pytz/zoneinfo/America/Bahia_Banderas b/libs/pytz/zoneinfo/America/Bahia_Banderas index ae4a8a754617b8b918daffb6a45a067df2fd2fe6..3a493e3d5a93f08201c41cb25616015963254589 100644 GIT binary patch delta 280 zcmZqRJi{?T+>o7tfdPa;z!r!>Y>}ngUKFhVs9mrvEi7TXqiw+s9<ziUf7?EsepQ$- zG2s5>Pt0PISlA?4nQ*|#iY$sOJ2x;2OrFRnCgkiA!oa`?vH(U+5ckDu?|&cw*$tvW q_Je4U8$dM39UvOy7BCHT4~Pc2X|plYc1F@%C4uQGF6ZD7GcEvc+)=Io delta 374 zcmX@Z(ZD%D+>(QVfdPa;z#fP}Y>B1YUKFhVl=om;T3Et%=SvAYc+3)Z{B8Si`c+}V zjfq=6FfbG}O!T;K&dS1!2eL8YfRkew6}kEw7zF<R-?@QNWO5^;m_$Hu2!pdr2m=En z$R$7kr6-8TVs+wwAOJZNM1!0PqCw6D(I6*-XppnPG|=fF8svNs4e<iVl7fcKyiD5} Rspt_oTpr<a4h}Kn0sv2zWo7^X diff --git a/libs/pytz/zoneinfo/America/Cancun b/libs/pytz/zoneinfo/America/Cancun index e7acbff18a2469c79f4ce77064adeb189d60bf10..0f7771e851b0e4242bcc65a9b838b8a1675541fb 100644 GIT binary patch delta 407 zcmX@a_JD1IxFH7v0|N+yfHn|=*dj}}-AWMadd478e&&K<dKrUJF-L*1djx|?(5r%p zE)(mSSeRLunOK1Y0m$_K|GE_n4FCVHUckWe|NqVn3>+Ymkq0Jn`~af>OavtB;~T=@ z92~;n3dGJXKpKb{7(tE$0w^6akx|SStGoXL0m$tj#US^C0LTv@8srZU0Qm((gZu*m VAU|zh#;C|Rz`o*Q1^U^P3ji|ZWQYI& delta 385 zcmaFBc8G0)xGp;b0|N+yfEEyg*dj}}-AWK^yP9B_p8mn8=vRWVyXOa!pgRc@Jto#O zGl3v03n9q-|Npub3=IGOuU^2w^8f$w1B@L1|L@$uzylN6xq(ptBI4s4!r&Yn!r<xx z#6a2^NHZ{kTm+*+qB7Hr!2F3^yslW?{2vHF?gps>xgA7<+z+BbegM%Re}HI^UpDV% QRAj6k5Z`bCJ!#4X0AcZ9e*gdg diff --git a/libs/pytz/zoneinfo/America/Chihuahua b/libs/pytz/zoneinfo/America/Chihuahua index e0910396704ffda1d7f39e70a369249aeb4b0353..667a2191145170e34271bb2200b93a2eec41d2ba 100644 GIT binary patch delta 47 ucmX@dagJkxA@@h^f^BJG3ELfQ3pU!UWE2MS{{sO?3`B#(H~(M^V*&sm=@=yd delta 47 ucmX@dagJkxA@`@e2iwxZ61F>EO4w+#l2I7Q{|^KpF%S(B-~59yj0pf=(Hffo diff --git a/libs/pytz/zoneinfo/America/Ciudad_Juarez b/libs/pytz/zoneinfo/America/Ciudad_Juarez index eb1e53961c1ebe1e147dd42248753ad30817a349..29af5982ac1c04357634570f15454d6f7fc30e04 100644 GIT binary patch delta 47 tcmZqTY2uk+$o)~fU|U*P!gfd7f{ivdOu|6^e;@#ffoPEU=5D5PW&rvh7T*8> delta 47 tcmZqTY2uk+$o(nr!M3!pgze6k5;oe{FbM<s|A7D`2BJaYo4c9HnE^Q#8C3uP diff --git a/libs/pytz/zoneinfo/America/Ensenada b/libs/pytz/zoneinfo/America/Ensenada index 63dfdf48a68d02240737ecd6af081e02eb0b6317..0fe73912cacab6c8aabef4f4264d1710825888e7 100644 GIT binary patch delta 180 zcmX>mG)s7bvhQpL1_llwmRP#&MZwBS|AO@&EgQC_r4($J7GT)H_36XuSG^6Fl)n^Q zn!E19b?Hck8xyyDxXr-MaQi^<hdcK+FSxsM&4hdVrY^YO**9Th#9pS!2^?&buW>|7 z&Sh3+oIQCWvn(^v#K{|(b(w)COn%5Lq65<Y9|%B3fM}30AR1&8hz1!4qCrM({>c24 I1!`si0In-yJOBUy delta 115 zcmbOwd`xJ9vguR?1_llwmRP#&MZwBS|AO_OYCddBODWhcEx@pY>(htRuX-CUDSs)r zG;>$Mb?Hck8xyyD*jTWaX|fh)#N=*fWyYzK*E7p919eS4&#Ws9RP`SSKq^5rNcCoW KmZvO0<plu35;v*< diff --git a/libs/pytz/zoneinfo/America/Hermosillo b/libs/pytz/zoneinfo/America/Hermosillo index 86bd1a20a3fca3908723ffbe0201d3b162474066..441fe3f2dd133fd081247131d860bac327107499 100644 GIT binary patch delta 187 zcmX@X+`>FT+>n)lfdPa;fES2CY=NcQUKFhVs9mrvEi7TXqiw+s9<ziUf7?EsepQ$- zF+hG|p^CVVZwP~La0r7l5c|4>FfcHJOkkXNK*|)Wk^g}JWGsjV84aRA#)D{(6_fcH WB_^9Qngh*Nz+pDfd@i7s=3D@&tvSm8 literal 456 zcmWHE%1kq2zyRz(5fBCeejo<1MV4-RQLz3~-h*vvVF}xvFD2~YF-zF-x9!8}SA_{T zCT{t_z);X&nBF2_R4mqD?4BlI67-|NRNX_s%;;7FBNGcV3lj?~kOaa1|EK?8VEF%k z?gR!Pd-Vba4iL%60~6_QU=V<?eSAY0e1k(6oPpTaC4?aWNHZ{k+y$dTNbtgcAOLv- zM1#BnqCwsP(I78@XppzSG|+1x8st3?4e=t#-hu`Y3Gyn426-1mgS-r)LEZ+@Ag_aH M8hf7$7&_)$0Qr5DMgRZ+ diff --git a/libs/pytz/zoneinfo/America/Mazatlan b/libs/pytz/zoneinfo/America/Mazatlan index 06fa22749d0a3157b5a693f0797086f78e1201c5..386616a59cdb2a21f1f24a6c72526bce0360cd24 100644 GIT binary patch delta 199 zcmaFCv4mrSxFIV80|N+yfGrS%*aAzpy(n1!QM+JUT3Et%N85rOJZ1?y{<eKM{i-lw zV!-{$kC;s+r!p#t`}l@1_y&hCI0Lb-O9%r4Bgh!W$r~7@OtBjL9|%B(gJ_TiAR1%| ehz40S`9Gt?W_70Rj4&${a99Dfh6`x3ITrwuP(SDZ delta 235 zcmZ3&@q%N5xFtIS0|N+yfISd{*dj}}y(n1!Deu9yw6KKj&X*E)@R%j+_}lj3^sB;z z8xyyDU|=X{nCNkzk#+J$X4A>hj0$Z3|MxdA2u%LREG85X9KyiB2r>^wO%ON5YR!Kj w09gg1LDqq2kd+`BWbNdKj1mGM4#ZB7fdvhle==@o#A>qyrp;Ww!6D{c0Ki95D*ylh diff --git a/libs/pytz/zoneinfo/America/Merida b/libs/pytz/zoneinfo/America/Merida index 17654cb59991e52537f87d9d9a2b56396f9c5c7e..c4b9b4e8801cd9447d3bbb6ebff71e26df669c3c 100644 GIT binary patch delta 35 lcmaFE{)T;mA$!*|1__m01sg4z7`cIL5CHKvA7xZ$0s!a83$y?L delta 35 mcmaFE{)T;mA$!}^1PLGSfQ=SSjNCvr0}z1tn~yT8GXVhP3=2E} diff --git a/libs/pytz/zoneinfo/America/Mexico_City b/libs/pytz/zoneinfo/America/Mexico_City index 68176daa4976b015fb79026f3053e74e4a7457ab..ad70cf3e08498845aaafc38e4eccca7461c8d337 100644 GIT binary patch delta 47 ucmX@cd5m*{A@@h^f^BJG3ELfQ3pUzZWfTVT{{sO?3`B#(H>)r$VgdjlQWv}c delta 47 ucmX@cd5m*{A@`@e2iwxZ61F>EO4w*~l~EYT{|^KpF%S(B->ky4hzS5+IvO$n diff --git a/libs/pytz/zoneinfo/America/Monterrey b/libs/pytz/zoneinfo/America/Monterrey index 5eb723c80949d0cf2a99603ea6aba4688ade6b21..2d7993a0d71720493175bd05b2b0b7409d67407a 100644 GIT binary patch delta 414 zcmcb@ev4y*xGp;b0|N+yfE^Hn*dj}}-AY*hQM+JUT3Et%N85rOJZ1?y{<eLXXz-|> zg_(tkl}z~m|H3Z}4FCVnoxs5I|NrU*3>+Ymkq0KSa|5FQMBK+WguypBguxkzeO-Vw z5Hm0W-Np&TAew<;g19SI$NvWckOx3C$P*wM<Pi`J@(hRuc?e7cJ+*ly;~~a@_7*?f LTU<adn{fdE%}jMy delta 278 zcmcb`afN+?xFib$0|N+yfF%%v*gQ+O-Ab6~@+g^^i7fd4|H3Z}4FCVHUckWe|NqVn zj2sZQk8cQrb1)FQgfK8L0xbgK3F5L?o$wzBK+f3A#dL@<lPqU2F_YpDE}+ZIxB&4< BGx-1j diff --git a/libs/pytz/zoneinfo/America/Ojinaga b/libs/pytz/zoneinfo/America/Ojinaga index f97946d1e269bf9c83fd4a02591b7ef04e8eb6a8..45118a4f4b73e55879aaa81a8536e7214538f0e8 100644 GIT binary patch delta 47 tcmeyu{e^piA@@h^f^BJG3ELfQ3pU!AGYJFv|A7D`2BJaYo7<T3m;oXm7p?#R delta 47 ucmeyu{e^piA@`@e2iwxZ61F>EO4w*)&Lj-v{|5q)7>EXmZ*F7CV+H_W2O1;* diff --git a/libs/pytz/zoneinfo/America/Santa_Isabel b/libs/pytz/zoneinfo/America/Santa_Isabel index 63dfdf48a68d02240737ecd6af081e02eb0b6317..0fe73912cacab6c8aabef4f4264d1710825888e7 100644 GIT binary patch delta 180 zcmX>mG)s7bvhQpL1_llwmRP#&MZwBS|AO@&EgQC_r4($J7GT)H_36XuSG^6Fl)n^Q zn!E19b?Hck8xyyDxXr-MaQi^<hdcK+FSxsM&4hdVrY^YO**9Th#9pS!2^?&buW>|7 z&Sh3+oIQCWvn(^v#K{|(b(w)COn%5Lq65<Y9|%B3fM}30AR1&8hz1!4qCrM({>c24 I1!`si0In-yJOBUy delta 115 zcmbOwd`xJ9vguR?1_llwmRP#&MZwBS|AO_OYCddBODWhcEx@pY>(htRuX-CUDSs)r zG;>$Mb?Hck8xyyD*jTWaX|fh)#N=*fWyYzK*E7p919eS4&#Ws9RP`SSKq^5rNcCoW KmZvO0<plu35;v*< diff --git a/libs/pytz/zoneinfo/America/Tijuana b/libs/pytz/zoneinfo/America/Tijuana index 63dfdf48a68d02240737ecd6af081e02eb0b6317..0fe73912cacab6c8aabef4f4264d1710825888e7 100644 GIT binary patch delta 180 zcmX>mG)s7bvhQpL1_llwmRP#&MZwBS|AO@&EgQC_r4($J7GT)H_36XuSG^6Fl)n^Q zn!E19b?Hck8xyyDxXr-MaQi^<hdcK+FSxsM&4hdVrY^YO**9Th#9pS!2^?&buW>|7 z&Sh3+oIQCWvn(^v#K{|(b(w)COn%5Lq65<Y9|%B3fM}30AR1&8hz1!4qCrM({>c24 I1!`si0In-yJOBUy delta 115 zcmbOwd`xJ9vguR?1_llwmRP#&MZwBS|AO_OYCddBODWhcEx@pY>(htRuX-CUDSs)r zG;>$Mb?Hck8xyyD*jTWaX|fh)#N=*fWyYzK*E7p919eS4&#Ws9RP`SSKq^5rNcCoW KmZvO0<plu35;v*< diff --git a/libs/pytz/zoneinfo/Asia/Choibalsan b/libs/pytz/zoneinfo/Asia/Choibalsan index c5f4bb0b3858f7078b35cb7a63021d7dc0262605..2aa5cc4b84d369b03684c30cdb66b7abf087f467 100644 GIT binary patch literal 877 zcmcK2yDvjw9Eb6@R3a`>5(%oUOI@oJb#LoFX$MjyE(2*KV(<=~5P1hNA!jgDV>m-M zHiE%uFxXrMF)~=>B-kXJr+<LN;FXil(8Tb4e$kobr8e>F<7cb+*|u-r!UefcTFL9R zDt-Ji%5Eace(96t$1TcnSR|c0h03-5AuCqiRpso1tQxyl)qNMz?KxL9_N1)MJy3Pl zGo$X~Ow>OojE1{}XuMi8Jf~}-DK%$!_vb|OR>)|HhlDRyVYJTAsJ2K@wg&^s?{&!z zhf{UtTV(I+iQad5tOZg>dT@VF3vKP{{c))c#8&me=!7;jGOiE%{o07TT_1If+a`;X z`c&3}oci3*r(cGpB{SoXe?r9kY_up@VpFqZ3n7)r3rC{D<LffN9`oxK(Lb#DZ9W#| z|FSBwEV3@LFtReTG_p3bII=pjJhDDg0I7hKKx!aGkSb}-GCb-ag?Lm#O7W<L6ys41 zDaWH8QV^+#ltgMGMUkpVS)?vf7^#euMrtF)k?Kf!q&{*1$Q2-$fLudb^CIwnuOcU4 K-bTpVo$~|H*}FLa literal 935 zcmc)Iy-yQi0LSsCa6|)5C<YU-mN$9R(sz)T@}^hAV9Qhsk&rx)hQ!q28Q3Iv12GXh z+|bFW=}-a^M@B{y8Q63p4mSXX1ug++c)t7rMknub`CQuJlIQ!&K7X+k7k|7G`rjM+ zX?*kjS8sjYPrK=4&uTt6b?)p>DF1GUy!)kH1wI(ErC6<6UmeS~!jWp9+mjtnzo~o4 zZP^+8th)R~*<JTe^%z@D&&8(Od${i0|MAv+@b#q=+$p$ym1!qb%DCaRs1sR^xY7JA zCpMo}@k~S}#=@#U)F1}}KK0OhE=Nu_?BvcTYqavw9xGYa_}XiGVtLV;%rDrFvMK9v z%Cyb?ZY$N<Wj_g+V(M($eRlhOIajlwa=%x~Ge@TKR2kKOe^=G$TZqCe2eqh#A%wET zO(9lo;T57-_V{@B=y!fkXR;y~9n{Z|euhOb78TilIOt1#aoBu~14j-WIe6sokpM^p zBm@!z34%mH!XR;wKu9Dc6cP&wcCC(vghS#X0g;GENF*i_6p4z2MdBiXk;q7BBsLNp yiH?Lv;v)k<Mt}?f83Qs1WE99SkZ~Xb;bJ7nP>``)s|SPsWi+*;dP3u&q1r1)fy&_k diff --git a/libs/pytz/zoneinfo/Asia/Dili b/libs/pytz/zoneinfo/Asia/Dili index c1af113af0a87e5c96033c83f199161062073bf0..4614e4fc4353a7094ba5173a0bd09158ef49d9a9 100644 GIT binary patch literal 257 zcmWHE%1kq2zyPd35fBCe79a+(c_uxRV>mt2=mYmFg96LLGZ`3}n3)(DO80;i6*Pd< z)lFdFKxX^+hA?OwSOBpl0|O&S9f$}a!Os6c0J0ZEgX{*G0kR)NQ{o0L8=#x)bS=36 D@gXX2 literal 213 zcmWHE%1kq2zzbM_vdlotGwGSck<&AcK5)M>D6l*{lYx<mk%@t!bPq^(K?4I&UEKr* s4j<nT25kciAhu)(A;I+jKmf7<M1yPrnF_KAL=$HlmkrQPJ6%gI0JM@Pw*UYD diff --git a/libs/pytz/zoneinfo/Atlantic/Azores b/libs/pytz/zoneinfo/Atlantic/Azores index 10232ab38ec595b889167a3f0f037a940ef2ac98..dd2c235bf9c4cc3c2ec4c2725a7cd5deac128fea 100644 GIT binary patch delta 1093 zcmds#O-K}B7{}k)k5O~Ro<lk7=We^LYr1_%k(Y!hJSj=I5K-a5@KSV$j*D9nh~(kf zrkmPMWtYJU+Kzr<bda#i5@@Gjv86*{Nst%c-v6ZOA?VVn_u-k}^FD`RnE%hM`&P?V zYPS#qjkBa0bHh#bxcAX@M!SZ2bff5uja$z6LXIB{c13b-ft<cU=i!LXk52iW$Jg%i zM65mXq-T~~y^`HhI(ucn=l_x|e9o*Fd*>|wB3o-S94bENnu5c%ud-Y>HBI%C&!}N6 zM~x#);q)zvT)j^FF7{KjJ4LY*owPrBoZ|HfYBEBU2%hG|_ha0=66XW&s=4KL8Mk&+ zMOt6};AD87k`tf!;QjY}=*}BHd}E4_Tz<-JmzMJvd}lPX%;(=OyUhrjdLS71-D;Dt zPa1(txxQHyyLOgQx%2jKXDLgoLP)vNECP158ER2KUT7p`@q;j={JJX2w>H1#D$@2~ zBWmn!GaBzriF2JPZ=r1;@2=h>)Jip5d;gfSeKgo~-g2Zm2p2@aAVLNaG>EW41P&r} z5W#~8AA|rNOKJN>@U5~Se_LPHGT6Zdd>MT3sGI=d1qe4l_yNKZ5T1Z=1%xjkoB`nt z2zNmE1HvItd34qrAQKi43WQW1l~^F;0wEX($v}waQOO2ExO{)bg6}^zEBbe{>>)Gu E6C5lIwEzGB delta 1090 zcmdtgKWGzC0LSsWw3p_RJ3Vb<+BB^%O`9~;LGaJyqSUEE5wi$_AnMX03LS;(;36&c z)f>|`Pp!*UMW|yzK{}L*OK=beg`h&AV6_EZyx#W;oz%_6JMKO&nL>WwZ&|-nW-7L( zX*^sX!iRJFc=)>a*;mz}JF@z#p=M@HIlEGmbMBO^`E^HKx*_jR#^r-kTk_%c2{~UV zJCBB6IDR}O{mq5xk!vx1Xu7`c+SRhNXCmwDy?sVHV<+UkD<!$VQdF&jrffTwQ0c-? zb)a=kWt!fr%=g!-y|MbNqyAK7U)5CS(yGWkUJ_k1Pek|RoH%&vt`MW+B7gCw=s9~? z6i%KOy@v-yU+%alT18PZ&Z*MYY1RMfs4BnhRRhauLmhhlLoW8muIhT++eqcTBUaLG zX*Qa7A1`l}UBhfi{Pj+ztbcU}!58nPmG2IM#z)Nx|9DMzf?(sTme_gojn?L+?4DdD zI_q2-&(25Qx-K*6-%jcE8N~~x48n^Akrk08ku{M;kyVjpk#&)Uk(DDi7rc4nO*r-9 zSp1#t@<SLL866oO86OD%i2w-!i2(@$i2?~DGK>QW1c?L*1;bce!GU6sYLIe}dXR#U uijb0!nvkN9s*tjfx+25EkjjwKa9}x^jt)_AUFJ&cKPax_kHvYzc3~R@ehRbz diff --git a/libs/pytz/zoneinfo/Atlantic/Madeira b/libs/pytz/zoneinfo/Atlantic/Madeira index 7ddcd883fedcb493b7ab527483c7d4a6d4fc5055..6725a0ffc1f7cfc6cad54361ca91500e087e2b64 100644 GIT binary patch delta 588 zcmc(bze_?<6vxl|<u82UkZ77ENKl0E92*)UjG&?*p|PzckoG7pH8dFXo_ADB`>{x% z;?NQ_L_<r9B(w!WPJt1D1!ebZlz&3!aLxzLy~8=5Qm_&*BeQiP(nW=sXz8b{nVH*U znXh{@n{%4ETZ<iTPkN4uH<Vx9Fbk<RJDz$oPm){gG&1HnTdYt~`((vt(pq1Wl}D@g zJo?^<mwoOJ^1YUszfoWVwKNM{@3P=!i3ZQ}6v|pOw7)}Dx15u7yR7t*mz81NrfTY6 ziOC4RQfw}V%i;V<9#&IvqCSu0>2zLN<Q9t)^>-)!-`<<dFC=J2)VN_#)QAbjXeFKy zwai<p*G`i7D@kTVs&hk&PK&cUB5*p0^Fb&8p#g*n5IR680ilKGHLu)E@(b-wIH~U0 s9;79_!3=hVoi2qT5SBog0$~e;F$An3U=Go>*LF-O|87qvi67|UZ*DNObN~PV delta 719 zcmchUPbfq|9LHzuTNdxF!Sm;NyV%x2%E>_v4w6!ogDu&Ml3bLNn`DX;4zuRCZ|(Yb z*+g>1MGg*J<e=0Z6iSLXh*<NTgSa^QP4oNApTjht?{3|WE26zQLWrein5(vY<B4S7 zG*5nB2+w=xsgnd>ndLm4JtmovQNFtP%GbJX`TFDx--x<ob6}Tb{U1F0l1faB7tqec z`9r^zbV+d0BxUpMoJ}?J@-c^3#A-!l_dB=S-b7XOUQ}0Ji5lOjsChmVwbut3=R70o zjuOJ%KVYG)Z5H;@tbR$by*rwsv``9PL^89)Dl+`W_mtFZP^YEAl0fl~A*nGenPJPg z(bSU9KRptYkRYQ>cUygv5a)MSx3<ig)sev%8S07YOR9@ds&_<#QW2#&>GQY7m7TmQ z7y@AlgeefVKo|pI4TL!m_COc}VNvrXB^Uf>O66X>@RH8raR^00Dhgsj$OR!7gk%t+ xLC6Ln9E5Zb;x(0g5CMP)0Yng>3d3PoAQ2F$fI6AEK!@-Dk_r8lj4ZbrzW_J3(gXki diff --git a/libs/pytz/zoneinfo/CET b/libs/pytz/zoneinfo/CET index 122e934210cabf0b29a2dd7d11eb8220ed1cad43..40d7124e5346af056c75e2f7012a51d94e8154b7 100644 GIT binary patch delta 1334 zcmbu;O-NKh0KoBizFl2Es8^JdMNEkZQ6{1gU9!xBxs{NV6j=~N5XIslDyX$nNtd+^ z5<ECrw%LcJrmfkReYrtdsaSLg3Nkv>6a?M2`M+fetb^#x&i>~;X5VFhuhaRJ9m-jf zDTH7#qGqwrZZKcX>nj^tvho8>Me~BK!@rBv?sk3t_&}hoaIU^^)UPj=p3v=ed4Ws$ zr8-j3qAxGAbVu4T-SMp?aAjhbzWTOWUmIGhuRo9I&PblVp*9C@p7iRj#{IfG;8#8M z-Rf3#q3W&NF8hicb-VbGiq8J2qVZ3v|NEG_Gk#hQy!#>V#y-}{d(lyOzqL_4XzrB{ zTNcW}!{_9qeW&E(+9UGGnw9G5svYv#>OnbFJFbS_r>oe81@gs2mGiPACp6qv?z}ov z;=Dds7kX2l?Tl<H3yn6FIb&6MU3<P-!4z+b?Xf++)U+v2&L?Ji#!P2$x(^V-lWYDb zhDV55j_?VwNLpEw_tu=`nZ(JzXZ#y$#I}Np8d2`9E#|7ie3@Zc=3|EYOZVCe<&>I7 z3l^i_EcUr^Gq(19_)HIci3y4wil6Wbd$|jU8z7=UqF|zcqM)L{qTr$cqadR|b8E0s zz){dq;8F0I1mg(g1_~(>DH<svDJm&4DLN@aDM~3)-5RYFu@towxzy-2-5ZZ1m>Vdj zNTz6}h^DBf$foF~2&X8gNOx<rQ^bdN+WAY3a;}k1(M}OhjryLm_J|!!u~Ti2*W*o3 z^G$hjJ~1;gXE=k?en8T_(Qn+FVcZ-22BVSfOx|1blV=hqlV^%W7W~)o3jFU4_~#W6 JR@m_^{sVNL<_!P< delta 507 zcmew=woYJzxDNvmuz(04=m266n{zggc*5+fw?53dxo*PTC0i%V+c{yv{FdnxPH+}Z zIP=_F;Ot8A3Fj6$3!I;1B5<KeRp4Tgn7}1Jht0~2uNdnYn3x9=YQrpNVBiyAU}a#C zQD6l62||KIoLz%M7@S>0fP#|^SR`eEG-e3=2LeziOs-?mVF7u2G9R0&5YVe236OU| RG|0=LY?qjal$XP~<p9<8L%IL} diff --git a/libs/pytz/zoneinfo/CST6CDT b/libs/pytz/zoneinfo/CST6CDT index ca67929fbeb05083c63e8319dd9ebf65b3d75e4d..c6981a06b1d9c26f447518efe265a6454726eae7 100644 GIT binary patch literal 3592 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 delta 527 zcmeB>X%m_tZotaGzyQJ^FcpYFY=L>pbQ<RG`dP4`jjv(htlI^rJN`9XQvOnKDUoyY zVn$1*dPW9D1}0`8F)+{%yS4xSuU^2w^8f$N4U7z6k^@ZgK*XJ0LKvKbfjAt9142L^ sW`qzE#6__N!{iWF6=9Iy{{sQY|6m#z2G$&fECU?|UepVN$!~aN05(rj<p2Nx diff --git a/libs/pytz/zoneinfo/EET b/libs/pytz/zoneinfo/EET index cbdb71ddd38be8f4a23e57bdb4b86e52195e9f89..9f3a0678d766881389e129c93def7fffd74f14f1 100644 GIT binary patch delta 877 zcmeyucTI4Dcs&;b0|N+yKo<~$*isEZVs?XK!_JzQ4|X0~f8pe(<Oin&Rs@`R?k#Y3 zmCuKBizFVLpPX56UwB@^{q0-<oNwY1xFx<MaGzbrz_WKg1Mia12ELxy2L2ZF27#<U z0)i>kAB2KdeGqnQN)RzV6d<bndV-knoeAR18^iW9)-y9PGqJL;vH)o|b}$5qFmrIy z2i7C3VPFum0s0+8vM?}c88C7%Fvut{@G>y)2`~tP*o>m6;s`Z9z99^bK<w%o3?f1p zoWU5#fdEDzfHD~v8AGBn(~Kb8iQGKcqv1agl-SR30nwo70MVc*0n@-}0nwnS0nwo7 z0nwl+0@0vo0@0wT0@0x80@0u-1Jl5016dD>ItGR?1_n_4fdoKt2m+vZ1OZT7f@n~D yf@n~jf@n~@f@o0Of@o0uf@n}2gJ@7ZZ&qfW$UGvWmkXExbd5ksL1%IzyD$JO3AnES delta 487 zcmca6_=RtRxG4(*0|N+yKot;!*qppek|*$WO9}9|xK0o#F`FQmqCP<=L}G%luZw_) z@vjLRdrmUeGcXPiWMGg{U|>~dV9+vP1iBVNf`nXMgF_fxT|*ccp<se|C|3Ugbuoba y2%<s$1koVBf@qL`K{UwEAR6Rv5DoG>hz9w8vkA*Y=7A0XMVQxd2EgQP90~xH_a)r` diff --git a/libs/pytz/zoneinfo/EST b/libs/pytz/zoneinfo/EST index 21ebc00b3fc096035b9810519d778d04a3562a44..9964b9a33452f4b636f43703b7cdec4891cbda5f 100644 GIT binary patch literal 182 zcmWHE%1kq2zzdjwvdlot(*Pv8za+k3WcvSqYXJiTkd$Cx`Tu|C1_llv-w+08Aa)H7 ZVF)3?%>O`;*{&u4qKPq^3uu8U7XX0%EG7T| literal 114 lcmWHE%1kq2AP5+NDp>yi-?@Q-!8JI9A%rYlTtKa+TmXY14MYF{ diff --git a/libs/pytz/zoneinfo/EST5EDT b/libs/pytz/zoneinfo/EST5EDT index 9bce5007d4dbb871974a69cb0f68151c1ee22556..a8b9ab1992257d721ad627b14f535c3d4b020888 100644 GIT binary patch literal 3552 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 KM8-r$`~MBRGsCk0 delta 503 zcmaDL-6k|a+<=vVfdPa;U@8!U*aGvG$ra4s^*Uie8$-duS!WYYcYG+gr2M7eQo`@e ziy1AM>KPdr8JL)X#K1rk?AHGOzjFfv%m4q!4=^%-Ne(c{0}-G6fkhPLJ4S{H;$Q}b xw<kNWs!Tq@Cb3zEBZp<k`cW3_M=sak5K~u|5FKA*JtI8>9bZF3JwrVME&!7BM*si- diff --git a/libs/pytz/zoneinfo/Europe/Lisbon b/libs/pytz/zoneinfo/Europe/Lisbon index 55f01930ba92ff6852ae4745e78adb5f96c5b057..616de167b8a1c534c1c526e7bbff82f7d5da94f2 100644 GIT binary patch delta 775 zcmd6kKS%;m9LL}Nu{6%qw9dN9z#(vPh!R>N$SI-*ms*U78lt+PxgOb+5T|d{O3j8W zC=!~4h6ZVI$f=<rgoGdxS}LKs@6jMNw)A_v`@DO%9G}mTQdBfKWF>@PWA62hvqJSp z{9%VC#+TK^N0BCzb-H^UQTNvUWIuONONHlXI{K()MyvE-WmV036>>P4spU-1YOWfN zEiLfEO|1Mh^;QX_q+=hkCKS>dm56OCsM*(sG{=0u))sPW&WSO*Yv5gL_ukPCXNk(f zC6!;!sJoJ;o#i;~x{6Sxa7wyQQluvtBYBC>au$yNUd$o(u~{j=3Cu3K7R^l!%hF=3 zhMUH(e>t<LILLD%D~Q8R&KO;nJ{&P#G}-Y>D)XCs({=i(4?Kc!3Bo4`ry#t7a0|jO z2*)5igK%xI8fNFFk}f>I*>uY_<4)JkX3U<Apoaf~a1hc#hzB7bL;w&GK!gAh!=N4n hL=+HVK*RwN2!lu%gu?XZU(F-JKdNQ>QHyO`Jzrpb$t(Z> delta 707 zcmc)HF-Sr|9LMo{@AXW>SI?}}Ug;n~xHLpL6ht%@w7AsLP_#sKM7syI33hg)mSzTJ z(IPZu4Gq#zi<8h01Pz7sAg6-rey*)S|Ksj^<MFwQbz*T}%uNWv#yrZ6yT#<O`<!Iy z=~bHks<2F^PWNuN=ze^IW{VegZXrew5-&7AS)+$*>$DJd+efo`yQsg>Vk4PaSyq*y zRJA_iK8+9~ZISkbn{;ePnYlU0JWB!A8S``R)F<m2{@~r=SKi}&;6Ck+``)j(|EZh{ zRCB!dCdIAGve|cbZuV!gX310wim<f-QPalMR#jd@^G;WDwK@KL3Enay7L8GZC~_o- z9EAu|w>-bh#JC=rtJ7~eU_wEKf(r#13N{pUDELqiqF_Wp*=!>zuJwEAS=w>b6hWQA zc$DEWutedB!W4xo3R@JuD2!1!H!H1Cc%v{!;f}%{g+GcvK!YX2HKG0cM;sfWA9E7P A6951J diff --git a/libs/pytz/zoneinfo/HST b/libs/pytz/zoneinfo/HST index cccd45eb8cb2f56b6a1b75e2d7b9530cb5abf2e1..c7cd060159bd22fc5e6f10ac5a2089afb2c19c6a 100644 GIT binary patch literal 329 zcmWHE%1kq2zyNGO5fBCeb|40^MH+y_ZdPZH-HL?~r#o#=TvGm0a4FH#;%aZP2O|?B zGYcc@|Nl8m3=BXrf`R4#|Edf|4lv0BCI$ZgFHT@!@$n5|@CXKC7a$G?;(!pK!3+$H uP%?xBC;bP4k_QF*Ks3l{U>fK=5Dju7hz2<mOaq+?qN(g$E}&lw4Y&a7X=UL6 literal 115 mcmWHE%1kq2AP5+NDp>yiFHT@!@CXiJ2q8-s7f`FA0T%#a4Gc{H diff --git a/libs/pytz/zoneinfo/MET b/libs/pytz/zoneinfo/MET index 4a826bb185531c34eb37959037c68fbf08c23f71..40d7124e5346af056c75e2f7012a51d94e8154b7 100644 GIT binary patch delta 1360 zcmbu;O-NKh0KoBizFj|7saKSeb(j(nLf182h%Q;?!PF9xk|GO&2%=a#L<O~WD(SLj zkl?||GP4g$O<S`s`_iDSR4lp#1sNS`3W9Fi{C8Ob>mWL_v;X%Vv+uIM>2iLhhccF@ z3L#jGuvuKE*PE~A4Q2H$Y1x5B-=bja=x?9e-LB6c9}Kj47wQW~EA&PG3Ef_s6}Xh` z*Bv=6`tnLkcP1Uvo!^QASEhF9t8c6Hwc&O8`tuIm)sdxdsLg?!C*8WcVZZJPRH)v% z9(AkAtNO~e%YL7uZm&9|!t;NsaO9I3_&%ZTOrDm5?|#U;BOhzzz3{la-`b!aH22Ae zElcIl;dAoQzEkpX%@O%zZN7TCdWU?rW=Ia#Ose7cDQaZn68U1P+<DoV5gKhPabBG% za$X;-4ZW#Lcg8jqhsGO=or&_S?mb_vV1hfrcG<4v#H1Nd_Qz(5XRb3i+ZPDo$~6BI z!zIK#M<ffeOj>EvudM~~J+YmC_f%9?i)}fj)uJT2wwSw8^JRu*nU5LKUq<h(P=?>U zTCf-cW^tVvF=K20htKrDmk~j+L-Es;XXi!%@c={=NEA#IP!v=YSQK0oU=(B&Xwe#M z6mS%D6nGSTCcy{-d4NKSM2bd=NQz2|Oo~p5P>NED)M$-Xidc$Tid<^+n(mE65X=J< zQzTO~Q$$l#Q)E+gQ-o8LQ=~_0v{S@4?X<I380Fj}ouZv0o*MPNXYDaNm|!Q`F1O2_ zl9W8-$^O{%q|R{$XZ?b>d!ygDH^aC$`VB@S+nIiCEspPr?TqiK5^3;X&k^|F3Hav- da3DP9pyU;lm_w3VS?Kk9eYuqdKAK<X`2!&H>q`It delta 516 zcmew=woYJzxDNvmuz(04=m266n{zggc*5+fw?53dxo*PTC0i%V+c{yv{FdnxPH+}Z zIP=_F;Ot8A3Fj6$3!I;1B5<KeRp4Tgn7}1Jht0~2uNdnYn3x9=YQrpNVBiyAU}a#C zQD6l62||KId|iV>7<^qrfP#|^SR`eEG-e3=2LeziOs-?mVF7u2G9R0&5YVe236OU| eG|0=LY?qh^+RG*+c$txr3+Q)UL*K~>+@b(d<wb}9 diff --git a/libs/pytz/zoneinfo/MST b/libs/pytz/zoneinfo/MST index c93a58eee8b32f672fd3a96ca3e6ada5b0a0e168..ab37e845566aa95659b7b85be0051d0c67a7e53a 100644 GIT binary patch literal 360 zcmWHE%1kq2zyPd35fBCeZXgD+1sZ_Fyk%As=I>^2SkNXjVd1Qo4W~PKCY%?)FLS>C z>6#0TQZm1OlnVTQ5y8O1$i&FR41|nK|Nl>W$H4Ia|LO&dEdT${oxs2WX7fPUKE5Fg zzAiu<48-9fKr0v+7{Npc2~PVD1aT}p8$dM3i69!}Ob`unDu@O-7es@c45C5K2Gc;N WgJ_WRK{Ut<Aeu_v-~#&0oC^SE_l4#F literal 114 lcmWHE%1kq2AP5+NDp>yipF4qp!8bUBA%rYlTtKbnTmW*V4CVj; diff --git a/libs/pytz/zoneinfo/MST7MDT b/libs/pytz/zoneinfo/MST7MDT index 4506a6e150dfd73884811c8c0f5a0e21dc76a756..abb2b974a47eb3e5c8b4f5d4370baf4898b239ab 100644 GIT binary patch delta 656 zcmZn@nj<_xJcNybfdPa;U>*>I*dh%e&N8bB^LMj1ENGLNuyEGPhDE9WCM<4YV_4$) zV8W9AWeul0c_v&^{!(x$QG(&Se%XW{8dDg4@<&Yg#Zk7=-IA%EnUM(sSy-VAm;hbq zWCE7{|37yM1H=FSs~0e`0NE25IAA1Dga<4x;Nu&@;Ohd!!9W}i!~r3|fMH++LNGZ& zTo!Ba{Re_L7M=~0E16ZKLE#1x0EHch28AD(?q4=}2D7X*DC|IdQ22ppP#A(}U^s5x Pz+A{O5(0AaI}Ql|#Yu{v delta 534 zcmbOu+$J<Z+<=vVfdPa;U@8!U*aGvGSxuO~o4sK{o6LlTvtBlw?&O(pN%>2`r9_F1 z*_KT8j0}tnOw2%HV4xp%YybbBJAr}a|Nqqs7#YAM2bko6i2J&PF!%-oaX1hMgn<0Z z2q7kji((Ch$-9_UCjVoW*lfm<!!po*PNS}$xqv}o4h#|<Ut>KZJp&zILqk17Jp(QP Duq{Wd diff --git a/libs/pytz/zoneinfo/Mexico/BajaNorte b/libs/pytz/zoneinfo/Mexico/BajaNorte index 63dfdf48a68d02240737ecd6af081e02eb0b6317..0fe73912cacab6c8aabef4f4264d1710825888e7 100644 GIT binary patch delta 180 zcmX>mG)s7bvhQpL1_llwmRP#&MZwBS|AO@&EgQC_r4($J7GT)H_36XuSG^6Fl)n^Q zn!E19b?Hck8xyyDxXr-MaQi^<hdcK+FSxsM&4hdVrY^YO**9Th#9pS!2^?&buW>|7 z&Sh3+oIQCWvn(^v#K{|(b(w)COn%5Lq65<Y9|%B3fM}30AR1&8hz1!4qCrM({>c24 I1!`si0In-yJOBUy delta 115 zcmbOwd`xJ9vguR?1_llwmRP#&MZwBS|AO_OYCddBODWhcEx@pY>(htRuX-CUDSs)r zG;>$Mb?Hck8xyyD*jTWaX|fh)#N=*fWyYzK*E7p919eS4&#Ws9RP`SSKq^5rNcCoW KmZvO0<plu35;v*< diff --git a/libs/pytz/zoneinfo/Mexico/BajaSur b/libs/pytz/zoneinfo/Mexico/BajaSur index 06fa22749d0a3157b5a693f0797086f78e1201c5..386616a59cdb2a21f1f24a6c72526bce0360cd24 100644 GIT binary patch delta 199 zcmaFCv4mrSxFIV80|N+yfGrS%*aAzpy(n1!QM+JUT3Et%N85rOJZ1?y{<eKM{i-lw zV!-{$kC;s+r!p#t`}l@1_y&hCI0Lb-O9%r4Bgh!W$r~7@OtBjL9|%B(gJ_TiAR1%| ehz40S`9Gt?W_70Rj4&${a99Dfh6`x3ITrwuP(SDZ delta 235 zcmZ3&@q%N5xFtIS0|N+yfISd{*dj}}y(n1!Deu9yw6KKj&X*E)@R%j+_}lj3^sB;z z8xyyDU|=X{nCNkzk#+J$X4A>hj0$Z3|MxdA2u%LREG85X9KyiB2r>^wO%ON5YR!Kj w09gg1LDqq2kd+`BWbNdKj1mGM4#ZB7fdvhle==@o#A>qyrp;Ww!6D{c0Ki95D*ylh diff --git a/libs/pytz/zoneinfo/Mexico/General b/libs/pytz/zoneinfo/Mexico/General index 68176daa4976b015fb79026f3053e74e4a7457ab..ad70cf3e08498845aaafc38e4eccca7461c8d337 100644 GIT binary patch delta 47 ucmX@cd5m*{A@@h^f^BJG3ELfQ3pUzZWfTVT{{sO?3`B#(H>)r$VgdjlQWv}c delta 47 ucmX@cd5m*{A@`@e2iwxZ61F>EO4w*~l~EYT{|^KpF%S(B->ky4hzS5+IvO$n diff --git a/libs/pytz/zoneinfo/PST8PDT b/libs/pytz/zoneinfo/PST8PDT index 99d246baa35cb9c6f56d50adbec163452e2a47fa..610e7af5fc13d9784de30d272c7c39d7938873a0 100644 GIT binary patch delta 1027 zcmd^-Jxo(k7(nl9AKJmlO(Rx~T@jKJ2VF==SV$WGV$~)(m@;?LCWM5=*8w#y_G@6( z!JolIqm>O4Q$xaRIv5eCf>N6TrBtxMz~!EHbz^YgzI@-gxyu{Qc@TVYTtX)gDWw?B zq#f?Z(spGdr@b$`L$|-C-^jP!DVfcSo-4kT`B$%{`0=59fAm;>JWa|%@~$l2yCgp^ zT$f*o9$D%>FQw>3{X2L~m(N6WxqePp4j<K(LWf>1)$~fPp;xC1x|*HQYj3MkOMTGm zna@)9KFOau?`31~xoln?m%sh@wKUES%U0Jjz1@CGb^@chXs^#}b9|1^@7ncWK5rkt zH747slrc}lagE8ORiJr4(%icBa`{SJ#Rlx$uyfN+EN*Qm<v6V^q3}PQ8G91$sr=Z8 zzpp8d2joEnLL@>&LS#aOLZm{(LgYdOLnK2)Lu5mQL!?`H2J<{%A5uV*wgN~AkQyLG wK&pV00jUF02&587DUezq#Xwt)W!M<X;emP}1wmWU#5;e=J?I&YRRbsX0J{ryp8x;= delta 486 zcmZ1?)+RJTT$Gi8fdPa;U@8!U*a8y`WH#QhV5(<iU}Ruo1`-1U{jgj6|9^i21Iz#a zb0;t|fJqK8$paA&a0y`u2nOPCAPxut`HK-k;PUNcHx`@Ci&%45hM9jS^KeT50LU#f A#sB~S diff --git a/libs/pytz/zoneinfo/Portugal b/libs/pytz/zoneinfo/Portugal index 55f01930ba92ff6852ae4745e78adb5f96c5b057..616de167b8a1c534c1c526e7bbff82f7d5da94f2 100644 GIT binary patch delta 775 zcmd6kKS%;m9LL}Nu{6%qw9dN9z#(vPh!R>N$SI-*ms*U78lt+PxgOb+5T|d{O3j8W zC=!~4h6ZVI$f=<rgoGdxS}LKs@6jMNw)A_v`@DO%9G}mTQdBfKWF>@PWA62hvqJSp z{9%VC#+TK^N0BCzb-H^UQTNvUWIuONONHlXI{K()MyvE-WmV036>>P4spU-1YOWfN zEiLfEO|1Mh^;QX_q+=hkCKS>dm56OCsM*(sG{=0u))sPW&WSO*Yv5gL_ukPCXNk(f zC6!;!sJoJ;o#i;~x{6Sxa7wyQQluvtBYBC>au$yNUd$o(u~{j=3Cu3K7R^l!%hF=3 zhMUH(e>t<LILLD%D~Q8R&KO;nJ{&P#G}-Y>D)XCs({=i(4?Kc!3Bo4`ry#t7a0|jO z2*)5igK%xI8fNFFk}f>I*>uY_<4)JkX3U<Apoaf~a1hc#hzB7bL;w&GK!gAh!=N4n hL=+HVK*RwN2!lu%gu?XZU(F-JKdNQ>QHyO`Jzrpb$t(Z> delta 707 zcmc)HF-Sr|9LMo{@AXW>SI?}}Ug;n~xHLpL6ht%@w7AsLP_#sKM7syI33hg)mSzTJ z(IPZu4Gq#zi<8h01Pz7sAg6-rey*)S|Ksj^<MFwQbz*T}%uNWv#yrZ6yT#<O`<!Iy z=~bHks<2F^PWNuN=ze^IW{VegZXrew5-&7AS)+$*>$DJd+efo`yQsg>Vk4PaSyq*y zRJA_iK8+9~ZISkbn{;ePnYlU0JWB!A8S``R)F<m2{@~r=SKi}&;6Ck+``)j(|EZh{ zRCB!dCdIAGve|cbZuV!gX310wim<f-QPalMR#jd@^G;WDwK@KL3Enay7L8GZC~_o- z9EAu|w>-bh#JC=rtJ7~eU_wEKf(r#13N{pUDELqiqF_Wp*=!>zuJwEAS=w>b6hWQA zc$DEWutedB!W4xo3R@JuD2!1!H!H1Cc%v{!;f}%{g+GcvK!YX2HKG0cM;sfWA9E7P A6951J diff --git a/libs/pytz/zoneinfo/WET b/libs/pytz/zoneinfo/WET index c27390b5b638399057d5f5c6d09ef8c81d5f01c1..616de167b8a1c534c1c526e7bbff82f7d5da94f2 100644 GIT binary patch literal 3527 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 R#`V3u8hC~@@a9#iKLP8OCO-fG delta 534 zcmX>u{gH2ixGW0;0|N+yKot;!*qppek|*$WO9@QAz$m5mdV-knoeAR1XD5h%-Zw$w z@%jmpmlsTsIy`ZL^q#!}GHcce$j+HBuvvg<0b@NQ!$3ih`x)d}85sBk7=bJZ31qN_ zy9S3agu8|?FfuYu=4X{r#p+{_Zji4*G}z}I9A;jx!Ca8<LBgOA0Mo!w0MVe30MVe( f0MVcj0nwmP0nwn40ny;l;ox*&9`vEJoL2z=mjpV| diff --git a/libs/pytz/zoneinfo/leapseconds b/libs/pytz/zoneinfo/leapseconds index ce150bfe0..6c715cb20 100644 --- a/libs/pytz/zoneinfo/leapseconds +++ b/libs/pytz/zoneinfo/leapseconds @@ -69,11 +69,11 @@ Leap 2016 Dec 31 23:59:60 + S # Any additional leap seconds will come after this. # This Expires line is commented out for now, # so that pre-2020a zic implementations do not reject this file. -#Expires 2024 Dec 28 00:00:00 +#Expires 2025 Jun 28 00:00:00 # POSIX timestamps for the data in this file: -#updated 1704708379 (2024-01-08 10:06:19 UTC) -#expires 1735344000 (2024-12-28 00:00:00 UTC) +#updated 1720104763 (2024-07-04 14:52:43 UTC) +#expires 1751068800 (2025-06-28 00:00:00 UTC) # Updated through IERS Bulletin C (https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat) -# File expires on 28 December 2024 +# File expires on 28 June 2025 diff --git a/libs/pytz/zoneinfo/tzdata.zi b/libs/pytz/zoneinfo/tzdata.zi index b5a03be78..b89326a7a 100644 --- a/libs/pytz/zoneinfo/tzdata.zi +++ b/libs/pytz/zoneinfo/tzdata.zi @@ -1324,14 +1324,10 @@ R O 1961 1964 - May lastSu 1s 1 S R O 1962 1964 - S lastSu 1s 0 - R p 1916 o - Jun 17 23 1 S R p 1916 o - N 1 1 0 - -R p 1917 o - F 28 23s 1 S -R p 1917 1921 - O 14 23s 0 - -R p 1918 o - Mar 1 23s 1 S -R p 1919 o - F 28 23s 1 S -R p 1920 o - F 29 23s 1 S -R p 1921 o - F 28 23s 1 S +R p 1917 1921 - Mar 1 0 1 S +R p 1917 1921 - O 14 24 0 - R p 1924 o - Ap 16 23s 1 S -R p 1924 o - O 14 23s 0 - +R p 1924 o - O 4 23s 0 - R p 1926 o - Ap 17 23s 1 S R p 1926 1929 - O Sa>=1 23s 0 - R p 1927 o - Ap 9 23s 1 S @@ -1349,8 +1345,9 @@ R p 1938 o - Mar 26 23s 1 S R p 1939 o - Ap 15 23s 1 S R p 1939 o - N 18 23s 0 - R p 1940 o - F 24 23s 1 S -R p 1940 1941 - O 5 23s 0 - +R p 1940 o - O 7 23s 0 - R p 1941 o - Ap 5 23s 1 S +R p 1941 o - O 5 23s 0 - R p 1942 1945 - Mar Sa>=8 23s 1 S R p 1942 o - Ap 25 22s 2 M R p 1942 o - Au 15 22s 1 S @@ -1360,16 +1357,16 @@ R p 1943 1945 - Au Sa>=25 22s 1 S R p 1944 1945 - Ap Sa>=21 22s 2 M R p 1946 o - Ap Sa>=1 23s 1 S R p 1946 o - O Sa>=1 23s 0 - -R p 1947 1965 - Ap Su>=1 2s 1 S +R p 1947 1966 - Ap Su>=1 2s 1 S R p 1947 1965 - O Su>=1 2s 0 - -R p 1977 o - Mar 27 0s 1 S -R p 1977 o - S 25 0s 0 - -R p 1978 1979 - Ap Su>=1 0s 1 S -R p 1978 o - O 1 0s 0 - -R p 1979 1982 - S lastSu 1s 0 - -R p 1980 o - Mar lastSu 0s 1 S -R p 1981 1982 - Mar lastSu 1s 1 S -R p 1983 o - Mar lastSu 2s 1 S +R p 1976 o - S lastSu 1 0 - +R p 1977 o - Mar lastSu 0s 1 S +R p 1977 o - S lastSu 0s 0 - +R p 1978 1980 - Ap Su>=1 1s 1 S +R p 1978 o - O 1 1s 0 - +R p 1979 1980 - S lastSu 1s 0 - +R p 1981 1986 - Mar lastSu 0s 1 S +R p 1981 1985 - S lastSu 0s 0 - R z 1932 o - May 21 0s 1 S R z 1932 1939 - O Su>=1 0s 0 - R z 1933 1939 - Ap Su>=2 0s 1 S @@ -1728,7 +1725,7 @@ R Y 1972 2006 - O lastSu 2 0 S R Y 1987 2006 - Ap Su>=1 2 1 D R Yu 1965 o - Ap lastSu 0 2 DD R Yu 1965 o - O lastSu 2 0 S -R m 1931 o - May 1 23 1 D +R m 1931 o - April 30 0 1 D R m 1931 o - O 1 0 0 S R m 1939 o - F 5 0 1 D R m 1939 o - Jun 25 0 0 S @@ -2096,15 +2093,15 @@ Z Africa/Algiers 0:12:12 - LMT 1891 Mar 16 0 d WE%sT 1981 May 1 - CET Z Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u --1 - -01 1975 +-1 - %z 1975 0 - GMT Z Africa/Cairo 2:5:9 - LMT 1900 O 2 K EE%sT Z Africa/Casablanca -0:30:20 - LMT 1913 O 26 -0 M +00/+01 1984 Mar 16 -1 - +01 1986 -0 M +00/+01 2018 O 28 3 -1 M +01/+00 +0 M %z 1984 Mar 16 +1 - %z 1986 +0 M %z 2018 O 28 3 +1 M %z Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u 0 - WET 1918 May 6 23 0 1 WEST 1918 O 7 23 @@ -2115,9 +2112,9 @@ Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u 1 - CET 1986 1 E CE%sT Z Africa/El_Aaiun -0:52:48 - LMT 1934 --1 - -01 1976 Ap 14 -0 M +00/+01 2018 O 28 3 -1 M +01/+00 +-1 - %z 1976 Ap 14 +0 M %z 2018 O 28 3 +1 M %z Z Africa/Johannesburg 1:52 - LMT 1892 F 8 1:30 - SAST 1903 Mar 2 SA SAST @@ -2132,19 +2129,19 @@ Z Africa/Khartoum 2:10:8 - LMT 1931 Z Africa/Lagos 0:13:35 - LMT 1905 Jul 0 - GMT 1908 Jul 0:13:35 - LMT 1914 -0:30 - +0030 1919 S +0:30 - %z 1919 S 1 - WAT -Z Africa/Maputo 2:10:20 - LMT 1903 Mar +Z Africa/Maputo 2:10:18 - LMT 1909 2 - CAT Z Africa/Monrovia -0:43:8 - LMT 1882 -0:43:8 - MMT 1919 Mar -0:44:30 - MMT 1972 Ja 7 0 - GMT Z Africa/Nairobi 2:27:16 - LMT 1908 May -2:30 - +0230 1928 Jun 30 24 +2:30 - %z 1928 Jun 30 24 3 - EAT 1930 Ja 4 24 -2:30 - +0230 1936 D 31 24 -2:45 - +0245 1942 Jul 31 24 +2:30 - %z 1936 D 31 24 +2:45 - %z 1942 Jul 31 24 3 - EAT Z Africa/Ndjamena 1:0:12 - LMT 1912 1 - WAT 1979 O 14 @@ -2168,7 +2165,7 @@ Z Africa/Tunis 0:40:44 - LMT 1881 May 12 0:9:21 - PMT 1911 Mar 11 1 n CE%sT Z Africa/Windhoek 1:8:24 - LMT 1892 F 8 -1:30 - +0130 1903 Mar +1:30 - %z 1903 Mar 2 - SAST 1942 S 20 2 2 1 SAST 1943 Mar 21 2 2 - SAST 1990 Mar 21 @@ -2191,167 +2188,166 @@ Z America/Anchorage 14:0:24 - LMT 1867 O 19 14:31:37 -9 u Y%sT 1983 N 30 -9 u AK%sT Z America/Araguaina -3:12:48 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1995 S 14 --3 B -03/-02 2003 S 24 --3 - -03 2012 O 21 --3 B -03/-02 2013 S --3 - -03 +-3 B %z 1990 S 17 +-3 - %z 1995 S 14 +-3 B %z 2003 S 24 +-3 - %z 2012 O 21 +-3 B %z 2013 S +-3 - %z Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z Z America/Argentina/Catamarca -4:23:8 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/Cordoba -4:16:48 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z Z America/Argentina/Jujuy -4:21:12 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 Mar 4 --4 - -04 1990 O 28 --4 1 -03 1991 Mar 17 --4 - -04 1991 O 6 --3 1 -02 1992 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 Mar 4 +-4 - %z 1990 O 28 +-4 1 %z 1991 Mar 17 +-4 - %z 1991 O 6 +-3 1 %z 1992 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/La_Rioja -4:27:24 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar --4 - -04 1991 May 7 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar +-4 - %z 1991 May 7 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/Mendoza -4:35:16 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 Mar 4 --4 - -04 1990 O 15 --4 1 -03 1991 Mar --4 - -04 1991 O 15 --4 1 -03 1992 Mar --4 - -04 1992 O 18 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 23 --4 - -04 2004 S 26 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 Mar 4 +-4 - %z 1990 O 15 +-4 1 %z 1991 Mar +-4 - %z 1991 O 15 +-4 1 %z 1992 Mar +-4 - %z 1992 O 18 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 23 +-4 - %z 2004 S 26 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/Salta -4:21:40 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/San_Juan -4:34:4 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar --4 - -04 1991 May 7 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 31 --4 - -04 2004 Jul 25 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar +-4 - %z 1991 May 7 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 31 +-4 - %z 2004 Jul 25 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/San_Luis -4:25:24 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 --3 1 -02 1990 Mar 14 --4 - -04 1990 O 15 --4 1 -03 1991 Mar --4 - -04 1991 Jun --3 - -03 1999 O 3 --4 1 -03 2000 Mar 3 --3 - -03 2004 May 31 --4 - -04 2004 Jul 25 --3 A -03/-02 2008 Ja 21 --4 Sa -04/-03 2009 O 11 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 +-3 1 %z 1990 Mar 14 +-4 - %z 1990 O 15 +-4 1 %z 1991 Mar +-4 - %z 1991 Jun +-3 - %z 1999 O 3 +-4 1 %z 2000 Mar 3 +-3 - %z 2004 May 31 +-4 - %z 2004 Jul 25 +-3 A %z 2008 Ja 21 +-4 Sa %z 2009 O 11 +-3 - %z Z America/Argentina/Tucuman -4:20:52 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 13 --3 A -03/-02 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 13 +-3 A %z Z America/Argentina/Ushuaia -4:33:12 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 30 --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 30 +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z Z America/Asuncion -3:50:40 - LMT 1890 -3:50:40 - AMT 1931 O 10 --4 - -04 1972 O --3 - -03 1974 Ap --4 y -04/-03 +-4 - %z 1972 O +-3 - %z 1974 Ap +-4 y %z Z America/Bahia -2:34:4 - LMT 1914 --3 B -03/-02 2003 S 24 --3 - -03 2011 O 16 --3 B -03/-02 2012 O 21 --3 - -03 +-3 B %z 2003 S 24 +-3 - %z 2011 O 16 +-3 B %z 2012 O 21 +-3 - %z Z America/Bahia_Banderas -7:1 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 +-7 - MST 1970 -7 m M%sT 2010 Ap 4 2 -6 m C%sT Z America/Barbados -3:58:29 - LMT 1911 Au 28 @@ -2359,18 +2355,18 @@ Z America/Barbados -3:58:29 - LMT 1911 Au 28 -4 BB AST/-0330 1945 -4 BB A%sT Z America/Belem -3:13:56 - LMT 1914 --3 B -03/-02 1988 S 12 --3 - -03 +-3 B %z 1988 S 12 +-3 - %z Z America/Belize -5:52:48 - LMT 1912 Ap -6 BZ %s Z America/Boa_Vista -4:2:40 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 1999 S 30 --4 B -04/-03 2000 O 15 --4 - -04 +-4 B %z 1988 S 12 +-4 - %z 1999 S 30 +-4 B %z 2000 O 15 +-4 - %z Z America/Bogota -4:56:16 - LMT 1884 Mar 13 -4:56:16 - BMT 1914 N 23 --5 CO -05/-04 +-5 CO %z Z America/Boise -7:44:49 - LMT 1883 N 18 20u -8 u P%sT 1923 May 13 2 -7 u M%sT 1974 @@ -2383,21 +2379,23 @@ Z America/Cambridge_Bay 0 - -00 1920 -6 - CST 2001 Ap 1 3 -7 C M%sT Z America/Campo_Grande -3:38:28 - LMT 1914 --4 B -04/-03 +-4 B %z Z America/Cancun -5:47:4 - LMT 1922 Ja 1 6u --6 - CST 1981 D 23 +-6 - CST 1981 D 26 2 +-5 - EST 1983 Ja 4 +-6 m C%sT 1997 O 26 2 -5 m E%sT 1998 Au 2 2 -6 m C%sT 2015 F 1 2 -5 - EST Z America/Caracas -4:27:44 - LMT 1890 -4:27:40 - CMT 1912 F 12 --4:30 - -0430 1965 --4 - -04 2007 D 9 3 --4:30 - -0430 2016 May 1 2:30 --4 - -04 +-4:30 - %z 1965 +-4 - %z 2007 D 9 3 +-4:30 - %z 2016 May 1 2:30 +-4 - %z Z America/Cayenne -3:29:20 - LMT 1911 Jul --4 - -04 1967 O --3 - -03 +-4 - %z 1967 O +-3 - %z Z America/Chicago -5:50:36 - LMT 1883 N 18 18u -6 u C%sT 1920 -6 Ch C%sT 1936 Mar 1 2 @@ -2407,7 +2405,7 @@ Z America/Chicago -5:50:36 - LMT 1883 N 18 18u -6 Ch C%sT 1967 -6 u C%sT Z America/Chihuahua -7:4:20 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1996 @@ -2416,7 +2414,7 @@ Z America/Chihuahua -7:4:20 - LMT 1922 Ja 1 7u -7 m M%sT 2022 O 30 2 -6 - CST Z America/Ciudad_Juarez -7:5:56 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1996 @@ -2430,12 +2428,12 @@ Z America/Costa_Rica -5:36:13 - LMT 1890 -5:36:13 - SJMT 1921 Ja 15 -6 CR C%sT Z America/Cuiaba -3:44:20 - LMT 1914 --4 B -04/-03 2003 S 24 --4 - -04 2004 O --4 B -04/-03 +-4 B %z 2003 S 24 +-4 - %z 2004 O +-4 B %z Z America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28 --3 - -03 1980 Ap 6 2 --3 E -03/-02 1996 +-3 - %z 1980 Ap 6 2 +-3 E %z 1996 0 - GMT Z America/Dawson -9:17:40 - LMT 1900 Au 20 -9 Y Y%sT 1965 @@ -2467,12 +2465,12 @@ Z America/Edmonton -7:33:52 - LMT 1906 S -7 Ed M%sT 1987 -7 C M%sT Z America/Eirunepe -4:39:28 - LMT 1914 --5 B -05/-04 1988 S 12 --5 - -05 1993 S 28 --5 B -05/-04 1994 S 22 --5 - -05 2008 Jun 24 --4 - -04 2013 N 10 --5 - -05 +-5 B %z 1988 S 12 +-5 - %z 1993 S 28 +-5 B %z 1994 S 22 +-5 - %z 2008 Jun 24 +-4 - %z 2013 N 10 +-5 - %z Z America/El_Salvador -5:56:48 - LMT 1921 -6 SV C%sT Z America/Fort_Nelson -8:10:47 - LMT 1884 @@ -2482,12 +2480,12 @@ Z America/Fort_Nelson -8:10:47 - LMT 1884 -8 C P%sT 2015 Mar 8 2 -7 - MST Z America/Fortaleza -2:34 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 22 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 +-3 B %z 1990 S 17 +-3 - %z 1999 S 30 +-3 B %z 2000 O 22 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z Z America/Glace_Bay -3:59:48 - LMT 1902 Jun 15 -4 C A%sT 1953 -4 H A%sT 1954 @@ -2514,12 +2512,12 @@ Z America/Guatemala -6:2:4 - LMT 1918 O 5 -6 GT C%sT Z America/Guayaquil -5:19:20 - LMT 1890 -5:14 - QMT 1931 --5 EC -05/-04 +-5 EC %z Z America/Guyana -3:52:39 - LMT 1911 Au --4 - -04 1915 Mar --3:45 - -0345 1975 Au --3 - -03 1992 Mar 29 1 --4 - -04 +-4 - %z 1915 Mar +-3:45 - %z 1975 Au +-3 - %z 1992 Mar 29 1 +-4 - %z Z America/Halifax -4:14:24 - LMT 1902 Jun 15 -4 H A%sT 1918 -4 C A%sT 1919 @@ -2531,12 +2529,11 @@ Z America/Havana -5:29:28 - LMT 1890 -5:29:36 - HMT 1925 Jul 19 12 -5 Q C%sT Z America/Hermosillo -7:23:52 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 +-7 - MST 1996 -7 m M%sT 1999 -7 - MST Z America/Indiana/Indianapolis -5:44:38 - LMT 1883 N 18 18u @@ -2644,23 +2641,23 @@ Z America/Kentucky/Monticello -5:39:24 - LMT 1883 N 18 18u Z America/La_Paz -4:32:36 - LMT 1890 -4:32:36 - CMT 1931 O 15 -4:32:36 1 BST 1932 Mar 21 --4 - -04 +-4 - %z Z America/Lima -5:8:12 - LMT 1890 -5:8:36 - LMT 1908 Jul 28 --5 PE -05/-04 +-5 PE %z Z America/Los_Angeles -7:52:58 - LMT 1883 N 18 20u -8 u P%sT 1946 -8 CA P%sT 1967 -8 u P%sT Z America/Maceio -2:22:52 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1995 O 13 --3 B -03/-02 1996 S 4 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 22 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 +-3 B %z 1990 S 17 +-3 - %z 1995 O 13 +-3 B %z 1996 S 4 +-3 - %z 1999 S 30 +-3 B %z 2000 O 22 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z Z America/Managua -5:45:8 - LMT 1890 -5:45:12 - MMT 1934 Jun 23 -6 - CST 1973 May @@ -2671,10 +2668,10 @@ Z America/Managua -5:45:8 - LMT 1890 -5 - EST 1997 -6 NI C%sT Z America/Manaus -4:0:4 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 1993 S 28 --4 B -04/-03 1994 S 22 --4 - -04 +-4 B %z 1988 S 12 +-4 - %z 1993 S 28 +-4 B %z 1994 S 22 +-4 - %z Z America/Martinique -4:4:20 - LMT 1890 -4:4:20 - FFMT 1911 May -4 - AST 1980 Ap 6 @@ -2686,12 +2683,11 @@ Z America/Matamoros -6:30 - LMT 1922 Ja 1 6u -6 m C%sT 2010 -6 u C%sT Z America/Mazatlan -7:5:40 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 +-7 - MST 1970 -7 m M%sT Z America/Menominee -5:50:27 - LMT 1885 S 18 12 -6 u C%sT 1946 @@ -2699,8 +2695,8 @@ Z America/Menominee -5:50:27 - LMT 1885 S 18 12 -5 - EST 1973 Ap 29 2 -6 u C%sT Z America/Merida -5:58:28 - LMT 1922 Ja 1 6u --6 - CST 1981 D 23 --5 - EST 1982 D 2 +-6 - CST 1981 D 26 2 +-5 - EST 1982 N 2 2 -6 m C%sT Z America/Metlakatla 15:13:42 - LMT 1867 O 19 15:44:55 -8:46:18 - LMT 1900 Au 20 12 @@ -2713,7 +2709,7 @@ Z America/Metlakatla 15:13:42 - LMT 1867 O 19 15:44:55 -8 - PST 2019 Ja 20 2 -9 u AK%sT Z America/Mexico_City -6:36:36 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 m C%sT 2001 S 30 2 @@ -2721,8 +2717,8 @@ Z America/Mexico_City -6:36:36 - LMT 1922 Ja 1 7u -6 m C%sT Z America/Miquelon -3:44:40 - LMT 1911 Jun 15 -4 - AST 1980 May --3 - -03 1987 --3 C -03/-02 +-3 - %z 1987 +-3 C %z Z America/Moncton -4:19:8 - LMT 1883 D 9 -5 - EST 1902 Jun 15 -4 C A%sT 1933 @@ -2733,20 +2729,23 @@ Z America/Moncton -4:19:8 - LMT 1883 D 9 -4 o A%sT 2007 -4 C A%sT Z America/Monterrey -6:41:16 - LMT 1922 Ja 1 6u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap -6 - CST 1988 -6 u C%sT 1989 -6 m C%sT Z America/Montevideo -3:44:51 - LMT 1908 Jun 10 -3:44:51 - MMT 1920 May --4 - -04 1923 O --3:30 U -0330/-03 1942 D 14 --3 U -03/-0230 1960 --3 U -03/-02 1968 --3 U -03/-0230 1970 --3 U -03/-02 1974 --3 U -03/-0130 1974 Mar 10 --3 U -03/-0230 1974 D 22 --3 U -03/-02 +-4 - %z 1923 O +-3:30 U %z 1942 D 14 +-3 U %z 1960 +-3 U %z 1968 +-3 U %z 1970 +-3 U %z 1974 +-3 U %z 1974 Mar 10 +-3 U %z 1974 D 22 +-3 U %z Z America/New_York -4:56:2 - LMT 1883 N 18 17u -5 u E%sT 1920 -5 NY E%sT 1942 @@ -2763,12 +2762,12 @@ Z America/Nome 12:58:22 - LMT 1867 O 19 13:29:35 -9 u Y%sT 1983 N 30 -9 u AK%sT Z America/Noronha -2:9:40 - LMT 1914 --2 B -02/-01 1990 S 17 --2 - -02 1999 S 30 --2 B -02/-01 2000 O 15 --2 - -02 2001 S 13 --2 B -02/-01 2002 O --2 - -02 +-2 B %z 1990 S 17 +-2 - %z 1999 S 30 +-2 B %z 2000 O 15 +-2 - %z 2001 S 13 +-2 B %z 2002 O +-2 - %z Z America/North_Dakota/Beulah -6:47:7 - LMT 1883 N 18 19u -7 u M%sT 2010 N 7 2 -6 u C%sT @@ -2779,12 +2778,12 @@ Z America/North_Dakota/New_Salem -6:45:39 - LMT 1883 N 18 19u -7 u M%sT 2003 O 26 2 -6 u C%sT Z America/Nuuk -3:26:56 - LMT 1916 Jul 28 --3 - -03 1980 Ap 6 2 --3 E -03/-02 2023 Mar 26 1u --2 - -02 2023 O 29 1u --2 E -02/-01 +-3 - %z 1980 Ap 6 2 +-3 E %z 2023 Mar 26 1u +-2 - %z 2023 O 29 1u +-2 E %z Z America/Ojinaga -6:57:40 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1996 @@ -2800,8 +2799,8 @@ Z America/Panama -5:18:8 - LMT 1890 Z America/Paramaribo -3:40:40 - LMT 1911 -3:40:52 - PMT 1935 -3:40:36 - PMT 1945 O --3:30 - -0330 1984 O --3 - -03 +-3:30 - %z 1984 O +-3 - %z Z America/Phoenix -7:28:18 - LMT 1883 N 18 19u -7 u M%sT 1944 Ja 1 0:1 -7 - MST 1944 Ap 1 0:1 @@ -2813,37 +2812,37 @@ Z America/Port-au-Prince -4:49:20 - LMT 1890 -4:49 - PPMT 1917 Ja 24 12 -5 HT E%sT Z America/Porto_Velho -4:15:36 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 +-4 B %z 1988 S 12 +-4 - %z Z America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12 -4 - AST 1942 May 3 -4 u A%sT 1946 -4 - AST Z America/Punta_Arenas -4:43:40 - LMT 1890 -4:42:45 - SMT 1910 Ja 10 --5 - -05 1916 Jul +-5 - %z 1916 Jul -4:42:45 - SMT 1918 S 10 --4 - -04 1919 Jul +-4 - %z 1919 Jul -4:42:45 - SMT 1927 S --5 x -05/-04 1932 S --4 - -04 1942 Jun --5 - -05 1942 Au --4 - -04 1946 Au 28 24 --5 1 -04 1947 Mar 31 24 --5 - -05 1947 May 21 23 --4 x -04/-03 2016 D 4 --3 - -03 +-5 x %z 1932 S +-4 - %z 1942 Jun +-5 - %z 1942 Au +-4 - %z 1946 Au 28 24 +-5 1 %z 1947 Mar 31 24 +-5 - %z 1947 May 21 23 +-4 x %z 2016 D 4 +-3 - %z Z America/Rankin_Inlet 0 - -00 1957 -6 Y C%sT 2000 O 29 2 -5 - EST 2001 Ap 1 3 -6 C C%sT Z America/Recife -2:19:36 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 15 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 +-3 B %z 1990 S 17 +-3 - %z 1999 S 30 +-3 B %z 2000 O 15 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z Z America/Regina -6:58:36 - LMT 1905 S -7 r M%sT 1960 Ap lastSu 2 -6 - CST @@ -2854,28 +2853,28 @@ Z America/Resolute 0 - -00 1947 Au 31 -5 - EST 2007 Mar 11 3 -6 C C%sT Z America/Rio_Branco -4:31:12 - LMT 1914 --5 B -05/-04 1988 S 12 --5 - -05 2008 Jun 24 --4 - -04 2013 N 10 --5 - -05 +-5 B %z 1988 S 12 +-5 - %z 2008 Jun 24 +-4 - %z 2013 N 10 +-5 - %z Z America/Santarem -3:38:48 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 2008 Jun 24 --3 - -03 +-4 B %z 1988 S 12 +-4 - %z 2008 Jun 24 +-3 - %z Z America/Santiago -4:42:45 - LMT 1890 -4:42:45 - SMT 1910 Ja 10 --5 - -05 1916 Jul +-5 - %z 1916 Jul -4:42:45 - SMT 1918 S 10 --4 - -04 1919 Jul +-4 - %z 1919 Jul -4:42:45 - SMT 1927 S --5 x -05/-04 1932 S --4 - -04 1942 Jun --5 - -05 1942 Au --4 - -04 1946 Jul 14 24 --4 1 -03 1946 Au 28 24 --5 1 -04 1947 Mar 31 24 --5 - -05 1947 May 21 23 --4 x -04/-03 +-5 x %z 1932 S +-4 - %z 1942 Jun +-5 - %z 1942 Au +-4 - %z 1946 Jul 14 24 +-4 1 %z 1946 Au 28 24 +-5 1 %z 1947 Mar 31 24 +-5 - %z 1947 May 21 23 +-4 x %z Z America/Santo_Domingo -4:39:36 - LMT 1890 -4:40 - SDMT 1933 Ap 1 12 -5 DO %s 1974 O 27 @@ -2883,14 +2882,14 @@ Z America/Santo_Domingo -4:39:36 - LMT 1890 -5 u E%sT 2000 D 3 1 -4 - AST Z America/Sao_Paulo -3:6:28 - LMT 1914 --3 B -03/-02 1963 O 23 --3 1 -02 1964 --3 B -03/-02 +-3 B %z 1963 O 23 +-3 1 %z 1964 +-3 B %z Z America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 --2 - -02 1980 Ap 6 2 --2 c -02/-01 1981 Mar 29 --1 E -01/+00 2024 Mar 31 --2 E -02/-01 +-2 - %z 1980 Ap 6 2 +-2 c %z 1981 Mar 29 +-1 E %z 2024 Mar 31 +-2 E %z Z America/Sitka 14:58:47 - LMT 1867 O 19 15:30 -9:1:13 - LMT 1900 Au 20 12 -8 - PST 1942 @@ -2918,15 +2917,21 @@ Z America/Thule -4:35:8 - LMT 1916 Jul 28 -4 Th A%sT Z America/Tijuana -7:48:4 - LMT 1922 Ja 1 7u -7 - MST 1924 --8 - PST 1927 Jun 10 23 +-8 - PST 1927 Jun 10 -7 - MST 1930 N 15 -8 - PST 1931 Ap -8 1 PDT 1931 S 30 -8 - PST 1942 Ap 24 -8 1 PWT 1945 Au 14 23u --8 1 PPT 1945 N 12 +-8 1 PPT 1945 N 15 -8 - PST 1948 Ap 5 -8 1 PDT 1949 Ja 14 +-8 - PST 1950 May +-8 1 PDT 1950 S 24 +-8 - PST 1951 Ap 29 2 +-8 1 PDT 1951 S 30 2 +-8 - PST 1952 Ap 27 2 +-8 1 PDT 1952 S 28 2 -8 - PST 1954 -8 CA P%sT 1961 -8 - PST 1976 @@ -2961,31 +2966,31 @@ Z America/Yakutat 14:41:5 - LMT 1867 O 19 15:12:18 -9 u Y%sT 1983 N 30 -9 u AK%sT Z Antarctica/Casey 0 - -00 1969 -8 - +08 2009 O 18 2 -11 - +11 2010 Mar 5 2 -8 - +08 2011 O 28 2 -11 - +11 2012 F 21 17u -8 - +08 2016 O 22 -11 - +11 2018 Mar 11 4 -8 - +08 2018 O 7 4 -11 - +11 2019 Mar 17 3 -8 - +08 2019 O 4 3 -11 - +11 2020 Mar 8 3 -8 - +08 2020 O 4 0:1 -11 - +11 2021 Mar 14 -8 - +08 2021 O 3 0:1 -11 - +11 2022 Mar 13 -8 - +08 2022 O 2 0:1 -11 - +11 2023 Mar 9 3 -8 - +08 +8 - %z 2009 O 18 2 +11 - %z 2010 Mar 5 2 +8 - %z 2011 O 28 2 +11 - %z 2012 F 21 17u +8 - %z 2016 O 22 +11 - %z 2018 Mar 11 4 +8 - %z 2018 O 7 4 +11 - %z 2019 Mar 17 3 +8 - %z 2019 O 4 3 +11 - %z 2020 Mar 8 3 +8 - %z 2020 O 4 0:1 +11 - %z 2021 Mar 14 +8 - %z 2021 O 3 0:1 +11 - %z 2022 Mar 13 +8 - %z 2022 O 2 0:1 +11 - %z 2023 Mar 9 3 +8 - %z Z Antarctica/Davis 0 - -00 1957 Ja 13 -7 - +07 1964 N +7 - %z 1964 N 0 - -00 1969 F -7 - +07 2009 O 18 2 -5 - +05 2010 Mar 10 20u -7 - +07 2011 O 28 2 -5 - +05 2012 F 21 20u -7 - +07 +7 - %z 2009 O 18 2 +5 - %z 2010 Mar 10 20u +7 - %z 2011 O 28 2 +5 - %z 2012 F 21 20u +7 - %z Z Antarctica/Macquarie 0 - -00 1899 N 10 - AEST 1916 O 1 2 10 1 AEDT 1917 F @@ -2996,151 +3001,146 @@ Z Antarctica/Macquarie 0 - -00 1899 N 10 1 AEDT 2011 10 AT AE%sT Z Antarctica/Mawson 0 - -00 1954 F 13 -6 - +06 2009 O 18 2 -5 - +05 +6 - %z 2009 O 18 2 +5 - %z Z Antarctica/Palmer 0 - -00 1965 --4 A -04/-03 1969 O 5 --3 A -03/-02 1982 May --4 x -04/-03 2016 D 4 --3 - -03 +-4 A %z 1969 O 5 +-3 A %z 1982 May +-4 x %z 2016 D 4 +-3 - %z Z Antarctica/Rothera 0 - -00 1976 D --3 - -03 +-3 - %z Z Antarctica/Troll 0 - -00 2005 F 12 0 Tr %s Z Antarctica/Vostok 0 - -00 1957 D 16 -7 - +07 1994 F +7 - %z 1994 F 0 - -00 1994 N -7 - +07 2023 D 18 2 -5 - +05 +7 - %z 2023 D 18 2 +5 - %z Z Asia/Almaty 5:7:48 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 2004 O 31 2s -6 - +06 2024 Mar -5 - +05 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1992 Ja 19 2s +6 R %z 2004 O 31 2s +6 - %z 2024 Mar +5 - %z Z Asia/Amman 2:23:44 - LMT 1931 2 J EE%sT 2022 O 28 0s -3 - +03 +3 - %z Z Asia/Anadyr 11:49:56 - LMT 1924 May 2 -12 - +12 1930 Jun 21 -13 R +13/+14 1982 Ap 1 0s -12 R +12/+13 1991 Mar 31 2s -11 R +11/+12 1992 Ja 19 2s -12 R +12/+13 2010 Mar 28 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 +12 - %z 1930 Jun 21 +13 R %z 1982 Ap 1 0s +12 R %z 1991 Mar 31 2s +11 R %z 1992 Ja 19 2s +12 R %z 2010 Mar 28 2s +11 R %z 2011 Mar 27 2s +12 - %z Z Asia/Aqtau 3:21:4 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1994 S 25 2s -4 R +04/+05 2004 O 31 2s -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 1994 S 25 2s +4 R %z 2004 O 31 2s +5 - %z Z Asia/Aqtobe 3:48:40 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2004 O 31 2s -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2004 O 31 2s +5 - %z Z Asia/Ashgabat 3:53:32 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 R +05/+06 1991 Mar 31 2 -4 R +04/+05 1992 Ja 19 2 -5 - +05 +4 - %z 1930 Jun 21 +5 R %z 1991 Mar 31 2 +4 R %z 1992 Ja 19 2 +5 - %z Z Asia/Atyrau 3:27:44 - LMT 1924 May 2 -3 - +03 1930 Jun 21 -5 - +05 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1999 Mar 28 2s -4 R +04/+05 2004 O 31 2s -5 - +05 +3 - %z 1930 Jun 21 +5 - %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 1999 Mar 28 2s +4 R %z 2004 O 31 2s +5 - %z Z Asia/Baghdad 2:57:40 - LMT 1890 2:57:36 - BMT 1918 -3 - +03 1982 May -3 IQ +03/+04 +3 - %z 1982 May +3 IQ %z Z Asia/Baku 3:19:24 - LMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1992 S lastSu 2s -4 - +04 1996 -4 E +04/+05 1997 -4 AZ +04/+05 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1992 S lastSu 2s +4 - %z 1996 +4 E %z 1997 +4 AZ %z Z Asia/Bangkok 6:42:4 - LMT 1880 6:42:4 - BMT 1920 Ap -7 - +07 +7 - %z Z Asia/Barnaul 5:35 - LMT 1919 D 10 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 1995 May 28 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 Mar 27 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 1995 May 28 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 Mar 27 2s +7 - %z Z Asia/Beirut 2:22 - LMT 1880 2 l EE%sT Z Asia/Bishkek 4:58:24 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1991 Au 31 2 -5 KG +05/+06 2005 Au 12 -6 - +06 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1991 Au 31 2 +5 KG %z 2005 Au 12 +6 - %z Z Asia/Chita 7:33:52 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2011 Mar 27 2s -10 - +10 2014 O 26 2s -8 - +08 2016 Mar 27 2 -9 - +09 -Z Asia/Choibalsan 7:38 - LMT 1905 Au -7 - +07 1978 -8 - +08 1983 Ap -9 X +09/+10 2008 Mar 31 -8 X +08/+09 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2011 Mar 27 2s +10 - %z 2014 O 26 2s +8 - %z 2016 Mar 27 2 +9 - %z Z Asia/Colombo 5:19:24 - LMT 1880 5:19:32 - MMT 1906 -5:30 - +0530 1942 Ja 5 -5:30 0:30 +06 1942 S -5:30 1 +0630 1945 O 16 2 -5:30 - +0530 1996 May 25 -6:30 - +0630 1996 O 26 0:30 -6 - +06 2006 Ap 15 0:30 -5:30 - +0530 +5:30 - %z 1942 Ja 5 +5:30 0:30 %z 1942 S +5:30 1 %z 1945 O 16 2 +5:30 - %z 1996 May 25 +6:30 - %z 1996 O 26 0:30 +6 - %z 2006 Ap 15 0:30 +5:30 - %z Z Asia/Damascus 2:25:12 - LMT 1920 2 S EE%sT 2022 O 28 -3 - +03 +3 - %z Z Asia/Dhaka 6:1:40 - LMT 1890 5:53:20 - HMT 1941 O -6:30 - +0630 1942 May 15 -5:30 - +0530 1942 S -6:30 - +0630 1951 S 30 -6 - +06 2009 -6 BD +06/+07 -Z Asia/Dili 8:22:20 - LMT 1912 -8 - +08 1942 F 21 23 -9 - +09 1976 May 3 -8 - +08 2000 S 17 -9 - +09 +6:30 - %z 1942 May 15 +5:30 - %z 1942 S +6:30 - %z 1951 S 30 +6 - %z 2009 +6 BD %z +Z Asia/Dili 8:22:20 - LMT 1911 D 31 16u +8 - %z 1942 F 21 23 +9 - %z 1976 May 3 +8 - %z 2000 S 17 +9 - %z Z Asia/Dubai 3:41:12 - LMT 1920 -4 - +04 +4 - %z Z Asia/Dushanbe 4:35:12 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 1 +06 1991 S 9 2s -5 - +05 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 1 %z 1991 S 9 2s +5 - %z Z Asia/Famagusta 2:15:48 - LMT 1921 N 14 2 CY EE%sT 1998 S 2 E EE%sT 2016 S 8 -3 - +03 2017 O 29 1u +3 - %z 2017 O 29 1u 2 E EE%sT Z Asia/Gaza 2:17:52 - LMT 1900 O 2 Z EET/EEST 1948 May 15 @@ -3162,14 +3162,14 @@ Z Asia/Hebron 2:20:23 - LMT 1900 O 2 P EE%sT Z Asia/Ho_Chi_Minh 7:6:30 - LMT 1906 Jul 7:6:30 - PLMT 1911 May -7 - +07 1942 D 31 23 -8 - +08 1945 Mar 14 23 -9 - +09 1945 S 1 24 -7 - +07 1947 Ap -8 - +08 1955 Jul 1 1 -7 - +07 1959 D 31 23 -8 - +08 1975 Jun 13 -7 - +07 +7 - %z 1942 D 31 23 +8 - %z 1945 Mar 14 23 +9 - %z 1945 S 1 24 +7 - %z 1947 Ap +8 - %z 1955 Jul 1 1 +7 - %z 1959 D 31 23 +8 - %z 1975 Jun 13 +7 - %z Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 29 17u 8 - HKT 1941 Jun 15 3 8 1 HKST 1941 O 1 4 @@ -3177,96 +3177,96 @@ Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 29 17u 9 - JST 1945 N 18 2 8 HK HK%sT Z Asia/Hovd 6:6:36 - LMT 1905 Au -6 - +06 1978 -7 X +07/+08 +6 - %z 1978 +7 X %z Z Asia/Irkutsk 6:57:5 - LMT 1880 6:57:5 - IMT 1920 Ja 25 -7 - +07 1930 Jun 21 -8 R +08/+09 1991 Mar 31 2s -7 R +07/+08 1992 Ja 19 2s -8 R +08/+09 2011 Mar 27 2s -9 - +09 2014 O 26 2s -8 - +08 +7 - %z 1930 Jun 21 +8 R %z 1991 Mar 31 2s +7 R %z 1992 Ja 19 2s +8 R %z 2011 Mar 27 2s +9 - %z 2014 O 26 2s +8 - %z Z Asia/Jakarta 7:7:12 - LMT 1867 Au 10 7:7:12 - BMT 1923 D 31 16:40u -7:20 - +0720 1932 N -7:30 - +0730 1942 Mar 23 -9 - +09 1945 S 23 -7:30 - +0730 1948 May -8 - +08 1950 May -7:30 - +0730 1964 +7:20 - %z 1932 N +7:30 - %z 1942 Mar 23 +9 - %z 1945 S 23 +7:30 - %z 1948 May +8 - %z 1950 May +7:30 - %z 1964 7 - WIB Z Asia/Jayapura 9:22:48 - LMT 1932 N -9 - +09 1944 S -9:30 - +0930 1964 +9 - %z 1944 S +9:30 - %z 1964 9 - WIT Z Asia/Jerusalem 2:20:54 - LMT 1880 2:20:40 - JMT 1918 2 Z I%sT Z Asia/Kabul 4:36:48 - LMT 1890 -4 - +04 1945 -4:30 - +0430 +4 - %z 1945 +4:30 - %z Z Asia/Kamchatka 10:34:36 - LMT 1922 N 10 -11 - +11 1930 Jun 21 -12 R +12/+13 1991 Mar 31 2s -11 R +11/+12 1992 Ja 19 2s -12 R +12/+13 2010 Mar 28 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 +11 - %z 1930 Jun 21 +12 R %z 1991 Mar 31 2s +11 R %z 1992 Ja 19 2s +12 R %z 2010 Mar 28 2s +11 R %z 2011 Mar 27 2s +12 - %z Z Asia/Karachi 4:28:12 - LMT 1907 -5:30 - +0530 1942 S -5:30 1 +0630 1945 O 15 -5:30 - +0530 1951 S 30 -5 - +05 1971 Mar 26 +5:30 - %z 1942 S +5:30 1 %z 1945 O 15 +5:30 - %z 1951 S 30 +5 - %z 1971 Mar 26 5 PK PK%sT Z Asia/Kathmandu 5:41:16 - LMT 1920 -5:30 - +0530 1986 -5:45 - +0545 +5:30 - %z 1986 +5:45 - %z Z Asia/Khandyga 9:2:13 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2004 -10 R +10/+11 2011 Mar 27 2s -11 - +11 2011 S 13 0s -10 - +10 2014 O 26 2s -9 - +09 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2004 +10 R %z 2011 Mar 27 2s +11 - %z 2011 S 13 0s +10 - %z 2014 O 26 2s +9 - %z Z Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 5:53:20 - HMT 1870 5:21:10 - MMT 1906 5:30 - IST 1941 O -5:30 1 +0630 1942 May 15 +5:30 1 %z 1942 May 15 5:30 - IST 1942 S -5:30 1 +0630 1945 O 15 +5:30 1 %z 1945 O 15 5:30 - IST Z Asia/Krasnoyarsk 6:11:26 - LMT 1920 Ja 6 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2011 Mar 27 2s -8 - +08 2014 O 26 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2011 Mar 27 2s +8 - %z 2014 O 26 2s +7 - %z Z Asia/Kuching 7:21:20 - LMT 1926 Mar -7:30 - +0730 1933 -8 NB +08/+0820 1942 F 16 -9 - +09 1945 S 12 -8 - +08 +7:30 - %z 1933 +8 NB %z 1942 F 16 +9 - %z 1945 S 12 +8 - %z Z Asia/Macau 7:34:10 - LMT 1904 O 30 8 - CST 1941 D 21 23 -9 _ +09/+10 1945 S 30 24 +9 _ %z 1945 S 30 24 8 _ C%sT Z Asia/Magadan 10:3:12 - LMT 1924 May 2 -10 - +10 1930 Jun 21 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2014 O 26 2s -10 - +10 2016 Ap 24 2s -11 - +11 +10 - %z 1930 Jun 21 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2014 O 26 2s +10 - %z 2016 Ap 24 2s +11 - %z Z Asia/Makassar 7:57:36 - LMT 1920 7:57:36 - MMT 1932 N -8 - +08 1942 F 9 -9 - +09 1945 S 23 +8 - %z 1942 F 9 +9 - %z 1945 S 23 8 - WITA Z Asia/Manila -15:56 - LMT 1844 D 31 8:4 - LMT 1899 May 11 @@ -3277,45 +3277,45 @@ Z Asia/Nicosia 2:13:28 - LMT 1921 N 14 2 CY EE%sT 1998 S 2 E EE%sT Z Asia/Novokuznetsk 5:48:48 - LMT 1924 May -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2010 Mar 28 2s -6 R +06/+07 2011 Mar 27 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2010 Mar 28 2s +6 R %z 2011 Mar 27 2s +7 - %z Z Asia/Novosibirsk 5:31:40 - LMT 1919 D 14 6 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 1993 May 23 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 Jul 24 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 1993 May 23 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 Jul 24 2s +7 - %z Z Asia/Omsk 4:53:30 - LMT 1919 N 14 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1992 Ja 19 2s +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z Z Asia/Oral 3:25:24 - LMT 1924 May 2 -3 - +03 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1989 Mar 26 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1992 Mar 29 2s -4 R +04/+05 2004 O 31 2s -5 - +05 +3 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1989 Mar 26 2s +4 R %z 1992 Ja 19 2s +5 R %z 1992 Mar 29 2s +4 R %z 2004 O 31 2s +5 - %z Z Asia/Pontianak 7:17:20 - LMT 1908 May 7:17:20 - PMT 1932 N -7:30 - +0730 1942 Ja 29 -9 - +09 1945 S 23 -7:30 - +0730 1948 May -8 - +08 1950 May -7:30 - +0730 1964 +7:30 - %z 1942 Ja 29 +9 - %z 1945 S 23 +7:30 - %z 1948 May +8 - %z 1950 May +7:30 - %z 1964 8 - WITA 1988 7 - WIB Z Asia/Pyongyang 8:23 - LMT 1908 Ap @@ -3325,48 +3325,48 @@ Z Asia/Pyongyang 8:23 - LMT 1908 Ap 8:30 - KST 2018 May 4 23:30 9 - KST Z Asia/Qatar 3:26:8 - LMT 1920 -4 - +04 1972 Jun -3 - +03 +4 - %z 1972 Jun +3 - %z Z Asia/Qostanay 4:14:28 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2004 O 31 2s -6 - +06 2024 Mar -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2004 O 31 2s +6 - %z 2024 Mar +5 - %z Z Asia/Qyzylorda 4:21:52 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1991 S 29 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 1992 Mar 29 2s -5 R +05/+06 2004 O 31 2s -6 - +06 2018 D 21 -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1991 S 29 2s +5 R %z 1992 Ja 19 2s +6 R %z 1992 Mar 29 2s +5 R %z 2004 O 31 2s +6 - %z 2018 D 21 +5 - %z Z Asia/Riyadh 3:6:52 - LMT 1947 Mar 14 -3 - +03 +3 - %z Z Asia/Sakhalin 9:30:48 - LMT 1905 Au 23 -9 - +09 1945 Au 25 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 1997 Mar lastSu 2s -10 R +10/+11 2011 Mar 27 2s -11 - +11 2014 O 26 2s -10 - +10 2016 Mar 27 2s -11 - +11 +9 - %z 1945 Au 25 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 1997 Mar lastSu 2s +10 R %z 2011 Mar 27 2s +11 - %z 2014 O 26 2s +10 - %z 2016 Mar 27 2s +11 - %z Z Asia/Samarkand 4:27:53 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1992 -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1992 +5 - %z Z Asia/Seoul 8:27:52 - LMT 1908 Ap 8:30 - KST 1912 9 - JST 1945 S 8 @@ -3378,161 +3378,147 @@ Z Asia/Shanghai 8:5:43 - LMT 1901 8 CN C%sT Z Asia/Singapore 6:55:25 - LMT 1901 6:55:25 - SMT 1905 Jun -7 - +07 1933 -7 0:20 +0720 1936 -7:20 - +0720 1941 S -7:30 - +0730 1942 F 16 -9 - +09 1945 S 12 -7:30 - +0730 1981 D 31 16u -8 - +08 +7 - %z 1933 +7 0:20 %z 1936 +7:20 - %z 1941 S +7:30 - %z 1942 F 16 +9 - %z 1945 S 12 +7:30 - %z 1981 D 31 16u +8 - %z Z Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2 -10 - +10 1930 Jun 21 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2014 O 26 2s -11 - +11 +10 - %z 1930 Jun 21 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2014 O 26 2s +11 - %z Z Asia/Taipei 8:6 - LMT 1896 8 - CST 1937 O 9 - JST 1945 S 21 1 8 f C%sT Z Asia/Tashkent 4:37:11 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2 -5 R +05/+06 1992 -5 - +05 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2 +5 R %z 1992 +5 - %z Z Asia/Tbilisi 2:59:11 - LMT 1880 2:59:11 - TBMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1992 -3 e +03/+04 1994 S lastSu -4 e +04/+05 1996 O lastSu -4 1 +05 1997 Mar lastSu -4 e +04/+05 2004 Jun 27 -3 R +03/+04 2005 Mar lastSu 2 -4 - +04 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1992 +3 e %z 1994 S lastSu +4 e %z 1996 O lastSu +4 1 %z 1997 Mar lastSu +4 e %z 2004 Jun 27 +3 R %z 2005 Mar lastSu 2 +4 - %z Z Asia/Tehran 3:25:44 - LMT 1916 3:25:44 - TMT 1935 Jun 13 -3:30 i +0330/+0430 1977 O 20 24 -4 i +04/+05 1979 -3:30 i +0330/+0430 +3:30 i %z 1977 O 20 24 +4 i %z 1979 +3:30 i %z Z Asia/Thimphu 5:58:36 - LMT 1947 Au 15 -5:30 - +0530 1987 O -6 - +06 +5:30 - %z 1987 O +6 - %z Z Asia/Tokyo 9:18:59 - LMT 1887 D 31 15u 9 JP J%sT Z Asia/Tomsk 5:39:51 - LMT 1919 D 22 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2002 May 1 3 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 May 29 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2002 May 1 3 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 May 29 2s +7 - %z Z Asia/Ulaanbaatar 7:7:32 - LMT 1905 Au -7 - +07 1978 -8 X +08/+09 +7 - %z 1978 +8 X %z Z Asia/Urumqi 5:50:20 - LMT 1928 -6 - +06 +6 - %z Z Asia/Ust-Nera 9:32:54 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1981 Ap -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2011 S 13 0s -11 - +11 2014 O 26 2s -10 - +10 +8 - %z 1930 Jun 21 +9 R %z 1981 Ap +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2011 S 13 0s +11 - %z 2014 O 26 2s +10 - %z Z Asia/Vladivostok 8:47:31 - LMT 1922 N 15 -9 - +09 1930 Jun 21 -10 R +10/+11 1991 Mar 31 2s -9 R +09/+10 1992 Ja 19 2s -10 R +10/+11 2011 Mar 27 2s -11 - +11 2014 O 26 2s -10 - +10 +9 - %z 1930 Jun 21 +10 R %z 1991 Mar 31 2s +9 R %z 1992 Ja 19 2s +10 R %z 2011 Mar 27 2s +11 - %z 2014 O 26 2s +10 - %z Z Asia/Yakutsk 8:38:58 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2011 Mar 27 2s -10 - +10 2014 O 26 2s -9 - +09 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2011 Mar 27 2s +10 - %z 2014 O 26 2s +9 - %z Z Asia/Yangon 6:24:47 - LMT 1880 6:24:47 - RMT 1920 -6:30 - +0630 1942 May -9 - +09 1945 May 3 -6:30 - +0630 +6:30 - %z 1942 May +9 - %z 1945 May 3 +6:30 - %z Z Asia/Yekaterinburg 4:2:33 - LMT 1916 Jul 3 3:45:5 - PMT 1919 Jul 15 4 -4 - +04 1930 Jun 21 -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2011 Mar 27 2s -6 - +06 2014 O 26 2s -5 - +05 +4 - %z 1930 Jun 21 +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2011 Mar 27 2s +6 - %z 2014 O 26 2s +5 - %z Z Asia/Yerevan 2:58 - LMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1995 S 24 2s -4 - +04 1997 -4 R +04/+05 2011 -4 AM +04/+05 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1995 S 24 2s +4 - %z 1997 +4 R %z 2011 +4 AM %z Z Atlantic/Azores -1:42:40 - LMT 1884 -1:54:32 - HMT 1912 Ja 1 2u --2 p -02/-01 1942 Ap 25 22s --2 p +00 1942 Au 15 22s --2 p -02/-01 1943 Ap 17 22s --2 p +00 1943 Au 28 22s --2 p -02/-01 1944 Ap 22 22s --2 p +00 1944 Au 26 22s --2 p -02/-01 1945 Ap 21 22s --2 p +00 1945 Au 25 22s --2 p -02/-01 1966 Ap 3 2 --1 p -01/+00 1983 S 25 1s --1 W- -01/+00 1992 S 27 1s -0 E WE%sT 1993 Mar 28 1u --1 E -01/+00 +-2 p %z 1966 O 2 2s +-1 - %z 1982 Mar 28 0s +-1 p %z 1986 +-1 E %z 1992 D 27 1s +0 E WE%sT 1993 Jun 17 1u +-1 E %z Z Atlantic/Bermuda -4:19:18 - LMT 1890 -4:19:18 Be BMT/BST 1930 Ja 1 2 -4 Be A%sT 1974 Ap 28 2 -4 C A%sT 1976 -4 u A%sT Z Atlantic/Canary -1:1:36 - LMT 1922 Mar --1 - -01 1946 S 30 1 +-1 - %z 1946 S 30 1 0 - WET 1980 Ap 6 0s 0 1 WEST 1980 S 28 1u 0 E WE%sT Z Atlantic/Cape_Verde -1:34:4 - LMT 1912 Ja 1 2u --2 - -02 1942 S --2 1 -01 1945 O 15 --2 - -02 1975 N 25 2 --1 - -01 +-2 - %z 1942 S +-2 1 %z 1945 O 15 +-2 - %z 1975 N 25 2 +-1 - %z Z Atlantic/Faroe -0:27:4 - LMT 1908 Ja 11 0 - WET 1981 0 E WE%sT Z Atlantic/Madeira -1:7:36 - LMT 1884 -1:7:36 - FMT 1912 Ja 1 1u --1 p -01/+00 1942 Ap 25 22s --1 p +01 1942 Au 15 22s --1 p -01/+00 1943 Ap 17 22s --1 p +01 1943 Au 28 22s --1 p -01/+00 1944 Ap 22 22s --1 p +01 1944 Au 26 22s --1 p -01/+00 1945 Ap 21 22s --1 p +01 1945 Au 25 22s --1 p -01/+00 1966 Ap 3 2 -0 p WE%sT 1983 S 25 1s +-1 p %z 1966 O 2 2s +0 - WET 1982 Ap 4 +0 p WE%sT 1986 Jul 31 0 E WE%sT Z Atlantic/South_Georgia -2:26:8 - LMT 1890 --2 - -02 +-2 - %z Z Atlantic/Stanley -3:51:24 - LMT 1890 -3:51:24 - SMT 1912 Mar 12 --4 FK -04/-03 1983 May --3 FK -03/-02 1985 S 15 --4 FK -04/-03 2010 S 5 2 --3 - -03 +-4 FK %z 1983 May +-3 FK %z 1985 S 15 +-4 FK %z 2010 S 5 2 +-3 - %z Z Australia/Adelaide 9:14:20 - LMT 1895 F 9 - ACST 1899 May 9:30 AU AC%sT 1971 @@ -3550,8 +3536,8 @@ Z Australia/Darwin 8:43:20 - LMT 1895 F 9 - ACST 1899 May 9:30 AU AC%sT Z Australia/Eucla 8:35:28 - LMT 1895 D -8:45 AU +0845/+0945 1943 Jul -8:45 AW +0845/+0945 +8:45 AU %z 1943 Jul +8:45 AW %z Z Australia/Hobart 9:49:16 - LMT 1895 S 10 AT AE%sT 1919 O 24 10 AU AE%sT 1967 @@ -3562,8 +3548,8 @@ Z Australia/Lindeman 9:55:56 - LMT 1895 10 Ho AE%sT Z Australia/Lord_Howe 10:36:20 - LMT 1895 F 10 - AEST 1981 Mar -10:30 LH +1030/+1130 1985 Jul -10:30 LH +1030/+11 +10:30 LH %z 1985 Jul +10:30 LH %z Z Australia/Melbourne 9:39:52 - LMT 1895 F 10 AU AE%sT 1971 10 AV AE%sT @@ -3573,52 +3559,47 @@ Z Australia/Perth 7:43:24 - LMT 1895 D Z Australia/Sydney 10:4:52 - LMT 1895 F 10 AU AE%sT 1971 10 AN AE%sT -Z CET 1 c CE%sT -Z CST6CDT -6 u C%sT -Z EET 2 E EE%sT -Z EST -5 - EST -Z EST5EDT -5 u E%sT Z Etc/GMT 0 - GMT -Z Etc/GMT+1 -1 - -01 -Z Etc/GMT+10 -10 - -10 -Z Etc/GMT+11 -11 - -11 -Z Etc/GMT+12 -12 - -12 -Z Etc/GMT+2 -2 - -02 -Z Etc/GMT+3 -3 - -03 -Z Etc/GMT+4 -4 - -04 -Z Etc/GMT+5 -5 - -05 -Z Etc/GMT+6 -6 - -06 -Z Etc/GMT+7 -7 - -07 -Z Etc/GMT+8 -8 - -08 -Z Etc/GMT+9 -9 - -09 -Z Etc/GMT-1 1 - +01 -Z Etc/GMT-10 10 - +10 -Z Etc/GMT-11 11 - +11 -Z Etc/GMT-12 12 - +12 -Z Etc/GMT-13 13 - +13 -Z Etc/GMT-14 14 - +14 -Z Etc/GMT-2 2 - +02 -Z Etc/GMT-3 3 - +03 -Z Etc/GMT-4 4 - +04 -Z Etc/GMT-5 5 - +05 -Z Etc/GMT-6 6 - +06 -Z Etc/GMT-7 7 - +07 -Z Etc/GMT-8 8 - +08 -Z Etc/GMT-9 9 - +09 +Z Etc/GMT+1 -1 - %z +Z Etc/GMT+10 -10 - %z +Z Etc/GMT+11 -11 - %z +Z Etc/GMT+12 -12 - %z +Z Etc/GMT+2 -2 - %z +Z Etc/GMT+3 -3 - %z +Z Etc/GMT+4 -4 - %z +Z Etc/GMT+5 -5 - %z +Z Etc/GMT+6 -6 - %z +Z Etc/GMT+7 -7 - %z +Z Etc/GMT+8 -8 - %z +Z Etc/GMT+9 -9 - %z +Z Etc/GMT-1 1 - %z +Z Etc/GMT-10 10 - %z +Z Etc/GMT-11 11 - %z +Z Etc/GMT-12 12 - %z +Z Etc/GMT-13 13 - %z +Z Etc/GMT-14 14 - %z +Z Etc/GMT-2 2 - %z +Z Etc/GMT-3 3 - %z +Z Etc/GMT-4 4 - %z +Z Etc/GMT-5 5 - %z +Z Etc/GMT-6 6 - %z +Z Etc/GMT-7 7 - %z +Z Etc/GMT-8 8 - %z +Z Etc/GMT-9 9 - %z Z Etc/UTC 0 - UTC Z Europe/Andorra 0:6:4 - LMT 1901 0 - WET 1946 S 30 1 - CET 1985 Mar 31 2 1 E CE%sT Z Europe/Astrakhan 3:12:12 - LMT 1924 May -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 Mar 27 2s -4 - +04 +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +4 - %z 1992 Mar 29 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 Mar 27 2s +4 - %z Z Europe/Athens 1:34:52 - LMT 1895 S 14 1:34:52 - AMT 1916 Jul 28 0:1 2 g EE%sT 1941 Ap 30 @@ -3691,7 +3672,7 @@ Z Europe/Helsinki 1:39:49 - LMT 1878 May 31 Z Europe/Istanbul 1:55:52 - LMT 1880 1:56:56 - IMT 1910 O 2 T EE%sT 1978 Jun 29 -3 T +03/+04 1984 N 1 2 +3 T %z 1984 N 1 2 2 T EE%sT 2007 2 E EE%sT 2011 Mar 27 1u 2 - EET 2011 Mar 28 1u @@ -3700,19 +3681,19 @@ Z Europe/Istanbul 1:55:52 - LMT 1880 2 E EE%sT 2015 O 25 1u 2 1 EEST 2015 N 8 1u 2 E EE%sT 2016 S 7 -3 - +03 +3 - %z Z Europe/Kaliningrad 1:22 - LMT 1893 Ap 1 c CE%sT 1945 Ap 10 2 O EE%sT 1946 Ap 7 3 R MSK/MSD 1989 Mar 26 2s 2 R EE%sT 2011 Mar 27 2s -3 - +03 2014 O 26 2s +3 - %z 2014 O 26 2s 2 - EET Z Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s 3 R MSK/MSD 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s +4 - %z 1992 Mar 29 2s 3 R MSK/MSD 2011 Mar 27 2s 4 - MSK 2014 O 26 2s 3 - MSK @@ -3727,10 +3708,10 @@ Z Europe/Kyiv 2:2:4 - LMT 1880 2 E EE%sT Z Europe/Lisbon -0:36:45 - LMT 1884 -0:36:45 - LMT 1912 Ja 1 0u -0 p WE%sT 1966 Ap 3 2 +0 p WE%sT 1966 O 2 2s 1 - CET 1976 S 26 1 -0 p WE%sT 1983 S 25 1s -0 W- WE%sT 1992 S 27 1s +0 p WE%sT 1986 +0 E WE%sT 1992 S 27 1u 1 E CE%sT 1996 Mar 31 1u 0 E WE%sT Z Europe/London -0:1:15 - LMT 1847 D @@ -3754,7 +3735,7 @@ Z Europe/Minsk 1:50:16 - LMT 1880 3 R MSK/MSD 1990 3 - MSK 1991 Mar 31 2s 2 R EE%sT 2011 Mar 27 2s -3 - +03 +3 - %z Z Europe/Moscow 2:30:17 - LMT 1880 2:30:17 - MMT 1916 Jul 3 2:31:19 R %s 1919 Jul 1 0u @@ -3802,24 +3783,24 @@ Z Europe/Rome 0:49:56 - LMT 1866 D 12 1 I CE%sT 1980 1 E CE%sT Z Europe/Samara 3:20:20 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 - +04 1935 Ja 27 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -2 R +02/+03 1991 S 29 2s -3 - +03 1991 O 20 3 -4 R +04/+05 2010 Mar 28 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 +3 - %z 1930 Jun 21 +4 - %z 1935 Ja 27 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +2 R %z 1991 S 29 2s +3 - %z 1991 O 20 3 +4 R %z 2010 Mar 28 2s +3 R %z 2011 Mar 27 2s +4 - %z Z Europe/Saratov 3:4:18 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1988 Mar 27 2s -3 R +03/+04 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 D 4 2s -4 - +04 +3 - %z 1930 Jun 21 +4 R %z 1988 Mar 27 2s +3 R %z 1991 Mar 31 2s +4 - %z 1992 Mar 29 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 D 4 2s +4 - %z Z Europe/Simferopol 2:16:24 - LMT 1880 2:16 - SMT 1924 May 2 2 - EET 1930 Jun 21 @@ -3863,14 +3844,14 @@ Z Europe/Tirane 1:19:20 - LMT 1914 1 q CE%sT 1984 Jul 1 E CE%sT Z Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -2 R +02/+03 1992 Ja 19 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 Mar 27 2s -4 - +04 +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +2 R %z 1992 Ja 19 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 Mar 27 2s +4 - %z Z Europe/Vienna 1:5:21 - LMT 1893 Ap 1 c CE%sT 1920 1 a CE%sT 1940 Ap 1 2s @@ -3895,15 +3876,15 @@ Z Europe/Vilnius 1:41:16 - LMT 1880 2 - EET 2003 2 E EE%sT Z Europe/Volgograd 2:57:40 - LMT 1920 Ja 3 -3 - +03 1930 Jun 21 -4 - +04 1961 N 11 -4 R +04/+05 1988 Mar 27 2s +3 - %z 1930 Jun 21 +4 - %z 1961 N 11 +4 R %z 1988 Mar 27 2s 3 R MSK/MSD 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s +4 - %z 1992 Mar 29 2s 3 R MSK/MSD 2011 Mar 27 2s 4 - MSK 2014 O 26 2s 3 - MSK 2018 O 28 2s -4 - +04 2020 D 27 2s +4 - %z 2020 D 27 2s 3 - MSK Z Europe/Warsaw 1:24 - LMT 1880 1:24 - WMT 1915 Au 5 @@ -3919,58 +3900,53 @@ Z Europe/Zurich 0:34:8 - LMT 1853 Jul 16 1 CH CE%sT 1981 1 E CE%sT Z Factory 0 - -00 -Z HST -10 - HST Z Indian/Chagos 4:49:40 - LMT 1907 -5 - +05 1996 -6 - +06 +5 - %z 1996 +6 - %z Z Indian/Maldives 4:54 - LMT 1880 4:54 - MMT 1960 -5 - +05 +5 - %z Z Indian/Mauritius 3:50 - LMT 1907 -4 MU +04/+05 -Z MET 1 c ME%sT -Z MST -7 - MST -Z MST7MDT -7 u M%sT -Z PST8PDT -8 u P%sT +4 MU %z Z Pacific/Apia 12:33:4 - LMT 1892 Jul 5 -11:26:56 - LMT 1911 --11:30 - -1130 1950 --11 WS -11/-10 2011 D 29 24 -13 WS +13/+14 +-11:30 - %z 1950 +-11 WS %z 2011 D 29 24 +13 WS %z Z Pacific/Auckland 11:39:4 - LMT 1868 N 2 11:30 NZ NZ%sT 1946 12 NZ NZ%sT Z Pacific/Bougainville 10:22:16 - LMT 1880 9:48:32 - PMMT 1895 -10 - +10 1942 Jul -9 - +09 1945 Au 21 -10 - +10 2014 D 28 2 -11 - +11 +10 - %z 1942 Jul +9 - %z 1945 Au 21 +10 - %z 2014 D 28 2 +11 - %z Z Pacific/Chatham 12:13:48 - LMT 1868 N 2 -12:15 - +1215 1946 -12:45 k +1245/+1345 +12:15 - %z 1946 +12:45 k %z Z Pacific/Easter -7:17:28 - LMT 1890 -7:17:28 - EMT 1932 S --7 x -07/-06 1982 Mar 14 3u --6 x -06/-05 +-7 x %z 1982 Mar 14 3u +-6 x %z Z Pacific/Efate 11:13:16 - LMT 1912 Ja 13 -11 VU +11/+12 +11 VU %z Z Pacific/Fakaofo -11:24:56 - LMT 1901 --11 - -11 2011 D 30 -13 - +13 +-11 - %z 2011 D 30 +13 - %z Z Pacific/Fiji 11:55:44 - LMT 1915 O 26 -12 FJ +12/+13 +12 FJ %z Z Pacific/Galapagos -5:58:24 - LMT 1931 --5 - -05 1986 --6 EC -06/-05 +-5 - %z 1986 +-6 EC %z Z Pacific/Gambier -8:59:48 - LMT 1912 O --9 - -09 +-9 - %z Z Pacific/Guadalcanal 10:39:48 - LMT 1912 O -11 - +11 +11 - %z Z Pacific/Guam -14:21 - LMT 1844 D 31 9:39 - LMT 1901 10 - GST 1941 D 10 -9 - +09 1944 Jul 31 +9 - %z 1944 Jul 31 10 Gu G%sT 2000 D 23 10 - ChST Z Pacific/Honolulu -10:31:26 - LMT 1896 Ja 13 12 @@ -3979,74 +3955,73 @@ Z Pacific/Honolulu -10:31:26 - LMT 1896 Ja 13 12 -10:30 u H%sT 1947 Jun 8 2 -10 - HST Z Pacific/Kanton 0 - -00 1937 Au 31 --12 - -12 1979 O --11 - -11 1994 D 31 -13 - +13 +-12 - %z 1979 O +-11 - %z 1994 D 31 +13 - %z Z Pacific/Kiritimati -10:29:20 - LMT 1901 --10:40 - -1040 1979 O --10 - -10 1994 D 31 -14 - +14 +-10:40 - %z 1979 O +-10 - %z 1994 D 31 +14 - %z Z Pacific/Kosrae -13:8:4 - LMT 1844 D 31 10:51:56 - LMT 1901 -11 - +11 1914 O -9 - +09 1919 F -11 - +11 1937 -10 - +10 1941 Ap -9 - +09 1945 Au -11 - +11 1969 O -12 - +12 1999 -11 - +11 +11 - %z 1914 O +9 - %z 1919 F +11 - %z 1937 +10 - %z 1941 Ap +9 - %z 1945 Au +11 - %z 1969 O +12 - %z 1999 +11 - %z Z Pacific/Kwajalein 11:9:20 - LMT 1901 -11 - +11 1937 -10 - +10 1941 Ap -9 - +09 1944 F 6 -11 - +11 1969 O --12 - -12 1993 Au 20 24 -12 - +12 +11 - %z 1937 +10 - %z 1941 Ap +9 - %z 1944 F 6 +11 - %z 1969 O +-12 - %z 1993 Au 20 24 +12 - %z Z Pacific/Marquesas -9:18 - LMT 1912 O --9:30 - -0930 +-9:30 - %z Z Pacific/Nauru 11:7:40 - LMT 1921 Ja 15 -11:30 - +1130 1942 Au 29 -9 - +09 1945 S 8 -11:30 - +1130 1979 F 10 2 -12 - +12 +11:30 - %z 1942 Au 29 +9 - %z 1945 S 8 +11:30 - %z 1979 F 10 2 +12 - %z Z Pacific/Niue -11:19:40 - LMT 1952 O 16 --11:20 - -1120 1964 Jul --11 - -11 +-11:20 - %z 1964 Jul +-11 - %z Z Pacific/Norfolk 11:11:52 - LMT 1901 -11:12 - +1112 1951 -11:30 - +1130 1974 O 27 2s -11:30 1 +1230 1975 Mar 2 2s -11:30 - +1130 2015 O 4 2s -11 - +11 2019 Jul -11 AN +11/+12 +11:12 - %z 1951 +11:30 - %z 1974 O 27 2s +11:30 1 %z 1975 Mar 2 2s +11:30 - %z 2015 O 4 2s +11 - %z 2019 Jul +11 AN %z Z Pacific/Noumea 11:5:48 - LMT 1912 Ja 13 -11 NC +11/+12 +11 NC %z Z Pacific/Pago_Pago 12:37:12 - LMT 1892 Jul 5 -11:22:48 - LMT 1911 -11 - SST Z Pacific/Palau -15:2:4 - LMT 1844 D 31 8:57:56 - LMT 1901 -9 - +09 +9 - %z Z Pacific/Pitcairn -8:40:20 - LMT 1901 --8:30 - -0830 1998 Ap 27 --8 - -08 +-8:30 - %z 1998 Ap 27 +-8 - %z Z Pacific/Port_Moresby 9:48:40 - LMT 1880 9:48:32 - PMMT 1895 -10 - +10 +10 - %z Z Pacific/Rarotonga 13:20:56 - LMT 1899 D 26 -10:39:4 - LMT 1952 O 16 --10:30 - -1030 1978 N 12 --10 CK -10/-0930 +-10:30 - %z 1978 N 12 +-10 CK %z Z Pacific/Tahiti -9:58:16 - LMT 1912 O --10 - -10 +-10 - %z Z Pacific/Tarawa 11:32:4 - LMT 1901 -12 - +12 +12 - %z Z Pacific/Tongatapu 12:19:12 - LMT 1945 S 10 -12:20 - +1220 1961 -13 - +13 1999 -13 TO +13/+14 -Z WET 0 E WE%sT +12:20 - %z 1961 +13 - %z 1999 +13 TO %z L Etc/GMT GMT L Australia/Sydney Australia/ACT L Australia/Lord_Howe Australia/LHI @@ -4062,6 +4037,8 @@ L America/Rio_Branco Brazil/Acre L America/Noronha Brazil/DeNoronha L America/Sao_Paulo Brazil/East L America/Manaus Brazil/West +L Europe/Brussels CET +L America/Chicago CST6CDT L America/Halifax Canada/Atlantic L America/Winnipeg Canada/Central L America/Toronto Canada/Eastern @@ -4073,6 +4050,9 @@ L America/Whitehorse Canada/Yukon L America/Santiago Chile/Continental L Pacific/Easter Chile/EasterIsland L America/Havana Cuba +L Europe/Athens EET +L America/Panama EST +L America/New_York EST5EDT L Africa/Cairo Egypt L Europe/Dublin Eire L Etc/GMT Etc/GMT+0 @@ -4096,6 +4076,9 @@ L America/Jamaica Jamaica L Asia/Tokyo Japan L Pacific/Kwajalein Kwajalein L Africa/Tripoli Libya +L Europe/Brussels MET +L America/Phoenix MST +L America/Denver MST7MDT L America/Tijuana Mexico/BajaNorte L America/Mazatlan Mexico/BajaSur L America/Mexico_City Mexico/General @@ -4259,6 +4242,7 @@ L America/Denver America/Shiprock L America/Toronto America/Thunder_Bay L America/Edmonton America/Yellowknife L Pacific/Auckland Antarctica/South_Pole +L Asia/Ulaanbaatar Asia/Choibalsan L Asia/Shanghai Asia/Chongqing L Asia/Shanghai Asia/Harbin L Asia/Urumqi Asia/Kashgar @@ -4273,6 +4257,7 @@ L Europe/Kyiv Europe/Zaporozhye L Pacific/Kanton Pacific/Enderbury L Pacific/Honolulu Pacific/Johnston L Pacific/Port_Moresby Pacific/Yap +L Europe/Lisbon WET L Africa/Nairobi Africa/Asmera L America/Nuuk America/Godthab L Asia/Ashgabat Asia/Ashkhabad @@ -4290,5 +4275,7 @@ L Asia/Ulaanbaatar Asia/Ulan_Bator L Atlantic/Faroe Atlantic/Faeroe L Europe/Kyiv Europe/Kiev L Asia/Nicosia Europe/Nicosia +L Pacific/Honolulu HST +L America/Los_Angeles PST8PDT L Pacific/Guadalcanal Pacific/Ponape L Pacific/Port_Moresby Pacific/Truk diff --git a/libs/pytz/zoneinfo/zone.tab b/libs/pytz/zoneinfo/zone.tab index 3fa9306af..bfc0b5933 100644 --- a/libs/pytz/zoneinfo/zone.tab +++ b/libs/pytz/zoneinfo/zone.tab @@ -264,8 +264,7 @@ MK +4159+02126 Europe/Skopje ML +1239-00800 Africa/Bamako MM +1647+09610 Asia/Yangon MN +4755+10653 Asia/Ulaanbaatar most of Mongolia -MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan -MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar +MN +4801+09139 Asia/Hovd Bayan-Olgii, Hovd, Uvs MO +221150+1133230 Asia/Macau MP +1512+14545 Pacific/Saipan MQ +1436-06105 America/Martinique diff --git a/libs/pytz/zoneinfo/zone1970.tab b/libs/pytz/zoneinfo/zone1970.tab index abd948975..7726f39a0 100644 --- a/libs/pytz/zoneinfo/zone1970.tab +++ b/libs/pytz/zoneinfo/zone1970.tab @@ -209,8 +209,7 @@ MD +4700+02850 Europe/Chisinau MH +0905+16720 Pacific/Kwajalein Kwajalein MM,CC +1647+09610 Asia/Yangon MN +4755+10653 Asia/Ulaanbaatar most of Mongolia -MN +4801+09139 Asia/Hovd Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan -MN +4804+11430 Asia/Choibalsan Dornod, Sükhbaatar +MN +4801+09139 Asia/Hovd Bayan-Ölgii, Hovd, Uvs MO +221150+1133230 Asia/Macau MQ +1436-06105 America/Martinique MT +3554+01431 Europe/Malta diff --git a/libs/pytz/zoneinfo/zonenow.tab b/libs/pytz/zoneinfo/zonenow.tab index b6f291095..01f536b3b 100644 --- a/libs/pytz/zoneinfo/zonenow.tab +++ b/libs/pytz/zoneinfo/zonenow.tab @@ -5,7 +5,7 @@ # From Paul Eggert (2023-12-18): # This file contains a table where each row stands for a timezone # where civil timestamps are predicted to agree from now on. -# This file is like zone1970.tab (see zone1970.tab's coments), +# This file is like zone1970.tab (see zone1970.tab's comments), # but with the following changes: # # 1. Each timezone corresponds to a set of clocks that are planned @@ -123,8 +123,6 @@ XX +1455-02331 Atlantic/Cape_Verde Cape Verde # # -01/+00 (EU DST) XX +3744-02540 Atlantic/Azores Azores -# -01/+00 (EU DST) until 2024-03-31; then -02/-01 (EU DST) -XX +7029-02158 America/Scoresbysund Ittoqqortoormiit # # +00 - GMT XX +0519-00402 Africa/Abidjan far western Africa; Iceland ("GMT") @@ -199,7 +197,7 @@ XX +2518+05518 Asia/Dubai Russia; Caucasus; Persian Gulf; Seychelles; Réunion XX +3431+06912 Asia/Kabul Afghanistan # # +05 -XX +4120+06918 Asia/Tashkent Russia; west Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives +XX +4120+06918 Asia/Tashkent Russia; Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives # # +05 - PKT XX +2452+06703 Asia/Karachi Pakistan ("PKT") @@ -215,8 +213,6 @@ XX +2743+08519 Asia/Kathmandu Nepal # # +06 XX +2343+09025 Asia/Dhaka Russia; Kyrgyzstan; Bhutan; Bangladesh; Chagos -# +06 until 2024-03-01; then +05 -XX +4315+07657 Asia/Almaty Kazakhstan (except western areas) # # +06:30 XX +1647+09610 Asia/Yangon Myanmar; Cocos diff --git a/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/METADATA b/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/METADATA index a3719b2cf..44b15072d 100644 --- a/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/METADATA +++ b/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/METADATA @@ -23,9 +23,9 @@ Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7 Description-Content-Type: text/x-rst License-File: LICENSE License-File: licenses/LICENSE_APACHE -Requires-Dist: python-dateutil ; python_version < "3.6" -Requires-Dist: tzdata ; python_version >= "3.6" -Requires-Dist: backports.zoneinfo ; python_version >= "3.6" and python_version < "3.9" +Requires-Dist: python-dateutil; python_version < "3.6" +Requires-Dist: tzdata; python_version >= "3.6" +Requires-Dist: backports.zoneinfo; python_version >= "3.6" and python_version < "3.9" pytz_deprecation_shim: Shims to help you safely remove pytz =========================================================== diff --git a/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/RECORD b/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/RECORD index fe8c6024c..4226a0b95 100644 --- a/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/RECORD +++ b/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/RECORD @@ -1,10 +1,10 @@ pytz_deprecation_shim-0.1.0.post0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 pytz_deprecation_shim-0.1.0.post0.dist-info/LICENSE,sha256=M-jlAC01EtP8wigrmV5rrZ0zR4G5xawxhD9ASQDh87Q,592 pytz_deprecation_shim-0.1.0.post0.dist-info/LICENSE_APACHE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357 -pytz_deprecation_shim-0.1.0.post0.dist-info/METADATA,sha256=B8NEXuh5DgPzNX8Bu-JNnYNSpuhY5Gr7D38grL8y4J0,5276 +pytz_deprecation_shim-0.1.0.post0.dist-info/METADATA,sha256=6Z9HQ-89frAFF6J6bcFZogwUopD8czmLC2HvQP7hzLQ,5273 pytz_deprecation_shim-0.1.0.post0.dist-info/RECORD,, pytz_deprecation_shim-0.1.0.post0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pytz_deprecation_shim-0.1.0.post0.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110 +pytz_deprecation_shim-0.1.0.post0.dist-info/WHEEL,sha256=TJ49d73sNs10F0aze1W_bTW2P_X7-F4YXOlBqoqA-jY,109 pytz_deprecation_shim-0.1.0.post0.dist-info/top_level.txt,sha256=6ESQF0d-npliZwsMMpdb8EE1u7BsAxGitGpjeOtDsRw,22 pytz_deprecation_shim/__init__.py,sha256=5cgVf7HUNzdgp2ffphH2L7CX5_DljRRg6u0DGeK21A0,616 pytz_deprecation_shim/_common.py,sha256=X2_8SIVirs1hl5tUpTPiHq_ZSpueW2TxZPj-VxKOhqE,275 diff --git a/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/WHEEL b/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/WHEEL index 4724c4573..17c0299e4 100644 --- a/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/WHEEL +++ b/libs/pytz_deprecation_shim-0.1.0.post0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/libs/rarfile-4.1.dist-info/RECORD b/libs/rarfile-4.1.dist-info/RECORD deleted file mode 100644 index 1bd88b331..000000000 --- a/libs/rarfile-4.1.dist-info/RECORD +++ /dev/null @@ -1,8 +0,0 @@ -rarfile-4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -rarfile-4.1.dist-info/LICENSE,sha256=1Wmi7X4Ns9qhEQ0upTMBywxLKFU9t7llVRwSIckG7T4,756 -rarfile-4.1.dist-info/METADATA,sha256=yFZeUonLAK3TAfLdB3XSuJ57IjjEhMo5vrg0Ym7AyGo,4357 -rarfile-4.1.dist-info/RECORD,, -rarfile-4.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rarfile-4.1.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -rarfile-4.1.dist-info/top_level.txt,sha256=xJJpMMlbN1jihTp6tmMSBdb4mrmIcEOp1rsb-9oPxkQ,8 -rarfile.py,sha256=yWfYjFyaR0UgCbPLVdByb_bde1VtH4CGopMLivyqUjw,104442 diff --git a/libs/rarfile-4.1.dist-info/WHEEL b/libs/rarfile-4.1.dist-info/WHEEL deleted file mode 100644 index ba48cbcf9..000000000 --- a/libs/rarfile-4.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.3) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/rarfile-4.1.dist-info/INSTALLER b/libs/rarfile-4.2.dist-info/INSTALLER similarity index 100% rename from libs/rarfile-4.1.dist-info/INSTALLER rename to libs/rarfile-4.2.dist-info/INSTALLER diff --git a/libs/rarfile-4.1.dist-info/LICENSE b/libs/rarfile-4.2.dist-info/LICENSE similarity index 92% rename from libs/rarfile-4.1.dist-info/LICENSE rename to libs/rarfile-4.2.dist-info/LICENSE index 1aec5bcdd..b7d9d1daa 100644 --- a/libs/rarfile-4.1.dist-info/LICENSE +++ b/libs/rarfile-4.2.dist-info/LICENSE @@ -1,5 +1,5 @@ -Copyright (c) 2005-2020 Marko Kreen <markokr@gmail.com> +Copyright (c) 2005-2024 Marko Kreen <markokr@gmail.com> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/libs/rarfile-4.1.dist-info/METADATA b/libs/rarfile-4.2.dist-info/METADATA similarity index 95% rename from libs/rarfile-4.1.dist-info/METADATA rename to libs/rarfile-4.2.dist-info/METADATA index 0b395034d..e451a1b44 100644 --- a/libs/rarfile-4.1.dist-info/METADATA +++ b/libs/rarfile-4.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: rarfile -Version: 4.1 +Version: 4.2 Summary: RAR archive reader for Python Home-page: https://github.com/markokr/rarfile Author: Marko Kreen @@ -68,9 +68,9 @@ Backends: | | | * Does not support password-protected archives. | | | | * Does not support RARVM-based compression filters. | +-------------+----------------------+-----------------------------------------------------+ -| unrar-free_ | Not supported | * Unusable: Does not support output to stdout. | +| unrar-free_ | Supported | * Supports output to stdout (v0.2.0). | | | | * Based on libarchive so similar format support | -| | | as ``bsdtar``. | +| | | as ``bsdtar`` but supports multi-volume (v0.3.0). | +-------------+----------------------+-----------------------------------------------------+ .. _p7zip: https://sourceforge.net/projects/p7zip/ diff --git a/libs/rarfile-4.2.dist-info/RECORD b/libs/rarfile-4.2.dist-info/RECORD new file mode 100644 index 000000000..7c7576f4e --- /dev/null +++ b/libs/rarfile-4.2.dist-info/RECORD @@ -0,0 +1,8 @@ +rarfile-4.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +rarfile-4.2.dist-info/LICENSE,sha256=NRNQFngFwpTHs-FwCBzhJlRFxG--s-mZ4TthbJDGSiA,756 +rarfile-4.2.dist-info/METADATA,sha256=_8vzlJg760ySTzNxrFoKL6ee1yqr7g8ee8r-ZzLuqvQ,4357 +rarfile-4.2.dist-info/RECORD,, +rarfile-4.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rarfile-4.2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +rarfile-4.2.dist-info/top_level.txt,sha256=xJJpMMlbN1jihTp6tmMSBdb4mrmIcEOp1rsb-9oPxkQ,8 +rarfile.py,sha256=Q9TFyOhHUkyWpJbvFb4p6efYKZCb5HwAiH7XfSJ3zDk,105004 diff --git a/libs/rarfile-4.1.dist-info/REQUESTED b/libs/rarfile-4.2.dist-info/REQUESTED similarity index 100% rename from libs/rarfile-4.1.dist-info/REQUESTED rename to libs/rarfile-4.2.dist-info/REQUESTED diff --git a/libs/enzyme-0.4.1.dist-info/WHEEL b/libs/rarfile-4.2.dist-info/WHEEL similarity index 100% rename from libs/enzyme-0.4.1.dist-info/WHEEL rename to libs/rarfile-4.2.dist-info/WHEEL diff --git a/libs/rarfile-4.1.dist-info/top_level.txt b/libs/rarfile-4.2.dist-info/top_level.txt similarity index 100% rename from libs/rarfile-4.1.dist-info/top_level.txt rename to libs/rarfile-4.2.dist-info/top_level.txt diff --git a/libs/rarfile.py b/libs/rarfile.py index 0399d7922..d27337f25 100644 --- a/libs/rarfile.py +++ b/libs/rarfile.py @@ -1,6 +1,6 @@ # rarfile.py # -# Copyright (c) 2005-2020 Marko Kreen <markokr@gmail.com> +# Copyright (c) 2005-2024 Marko Kreen <markokr@gmail.com> # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -92,7 +92,7 @@ def __init__(self, key, iv): self.decrypt = ciph.decryptor().update -__version__ = "4.1" +__version__ = "4.2" # export only interesting items __all__ = ["get_rar_version", "is_rarfile", "is_rarfile_sfx", "RarInfo", "RarFile", "RarExtFile"] @@ -671,6 +671,8 @@ class RarFile: part_only If True, read only single file and allow it to be middle-part of multi-volume archive. + + .. versionadded:: 4.0 """ #: File name, if available. Unicode string or None. @@ -737,6 +739,13 @@ def needs_password(self): """ return self._file_parser.needs_password() + def is_solid(self): + """Returns True if archive uses solid compression. + + .. versionadded:: 4.2 + """ + return self._file_parser.is_solid() + def namelist(self): """Return list of filenames in archive. """ @@ -765,6 +774,8 @@ def getinfo_orig(self, name): RAR5: if name is hard-linked or copied file, returns original entry with original filename. + + .. versionadded:: 4.1 """ return self._file_parser.getinfo_orig(name) @@ -1026,6 +1037,14 @@ def __init__(self, rarfile, password, crc_check, charset, strict, self._sfx_offset = sfx_offset self._part_only = part_only + def is_solid(self): + """Returns True if archive uses solid compression. + """ + if self._main: + if self._main.flags & RAR_MAIN_SOLID: + return True + return False + def has_header_encryption(self): """Returns True if headers are encrypted """ @@ -1163,7 +1182,9 @@ def _parse_real(self): if not self._password: break elif h.type == RAR_BLOCK_ENDARC: - more_vols = (h.flags & RAR_ENDARC_NEXT_VOLUME) > 0 + # use flag, but also allow RAR 2.x logic below to trigger + if h.flags & RAR_ENDARC_NEXT_VOLUME: + more_vols = True endarc = True if raise_need_first_vol and (h.flags & RAR_ENDARC_VOLNR) > 0: raise NeedFirstVolume( @@ -2337,8 +2358,8 @@ def seek(self, offset, whence=0): """Seek in data. On uncompressed files, the seeking works by actual - seeks so it's fast. On compresses files its slow - - forward seeking happends by reading ahead, + seeks so it's fast. On compressed files its slow + - forward seeking happens by reading ahead, backwards by re-opening and decompressing from the start. """ @@ -3110,7 +3131,7 @@ def rar3_decompress(vers, meth, data, declen=0, flags=0, crc=0, pwd=None, salt=N def sanitize_filename(fname, pathsep, is_win32): - """Simulate unrar sanitization. + """Make filename safe for write access. """ if is_win32: if len(fname) > 1 and fname[1] == ":": @@ -3182,12 +3203,12 @@ def parse_dos_time(stamp): class nsdatetime(datetime): """Datetime that carries nanoseconds. - Arithmetic not supported, will lose nanoseconds. + Arithmetic operations will lose nanoseconds. .. versionadded:: 4.0 """ __slots__ = ("nanosecond",) - nanosecond: int #: Number of nanoseconds, 0 <= nanosecond < 999999999 + nanosecond: int #: Number of nanoseconds, 0 <= nanosecond <= 999999999 def __new__(cls, year, month=None, day=None, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0, nanosecond=0): @@ -3389,7 +3410,7 @@ def add_password_arg(self, cmdline, pwd): UNRAR_CONFIG = { "open_cmd": ("UNRAR_TOOL", "p", "-inul"), - "check_cmd": ("UNRAR_TOOL", "-inul"), + "check_cmd": ("UNRAR_TOOL", "-inul", "-?"), "password": "-p", "no_password": ("-p-",), # map return code to exception class, codes from rar.txt diff --git a/libs/referencing-0.23.0.dist-info/METADATA b/libs/referencing-0.23.0.dist-info/METADATA index c6424b82e..03f462a50 100644 --- a/libs/referencing-0.23.0.dist-info/METADATA +++ b/libs/referencing-0.23.0.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: referencing Version: 0.23.0 Summary: JSON Referencing + Python diff --git a/libs/referencing-0.23.0.dist-info/RECORD b/libs/referencing-0.23.0.dist-info/RECORD index 052d4950e..2b61f1e51 100644 --- a/libs/referencing-0.23.0.dist-info/RECORD +++ b/libs/referencing-0.23.0.dist-info/RECORD @@ -1,8 +1,8 @@ referencing-0.23.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -referencing-0.23.0.dist-info/METADATA,sha256=eRAc_V0qvXvRIgLT25JFG4irAVC_mScpnQznqV8ZNUY,2735 +referencing-0.23.0.dist-info/METADATA,sha256=9pct8JdeHVEza9Sz12mDeRztH81t077NMhBHDY85qo0,2735 referencing-0.23.0.dist-info/RECORD,, referencing-0.23.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -referencing-0.23.0.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 +referencing-0.23.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 referencing-0.23.0.dist-info/licenses/COPYING,sha256=QtzWNJX4e063x3V6-jebtVpT-Ur9el9lfZrfVyNuUVw,1057 referencing/__init__.py,sha256=QQIDdzthSSd3_viHR6Z-5QOTiJnvLd0pBajsmq0Q_Co,206 referencing/_attrs.py,sha256=zISC-LjZxW4Q4da8qzSlwNfLnCUkHdWJn-FMphm1x7w,744 diff --git a/libs/referencing-0.23.0.dist-info/WHEEL b/libs/referencing-0.23.0.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/referencing-0.23.0.dist-info/WHEEL +++ b/libs/referencing-0.23.0.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/requests-2.31.0.dist-info/RECORD b/libs/requests-2.31.0.dist-info/RECORD deleted file mode 100644 index 98dcd813a..000000000 --- a/libs/requests-2.31.0.dist-info/RECORD +++ /dev/null @@ -1,25 +0,0 @@ -requests-2.31.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -requests-2.31.0.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142 -requests-2.31.0.dist-info/METADATA,sha256=Blp34Iss87pzeIEHb0Xz-jAfOzxpT-NinG6LjXNZSXk,4602 -requests-2.31.0.dist-info/RECORD,, -requests-2.31.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -requests-2.31.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -requests-2.31.0.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 -requests/__init__.py,sha256=LvmKhjIz8mHaKXthC2Mv5ykZ1d92voyf3oJpd-VuAig,4963 -requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435 -requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 -requests/adapters.py,sha256=v_FmjU5KZ76k-YttShZYB5RprIzhhL8Y3zgW9p4eBQ8,19553 -requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449 -requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 -requests/certs.py,sha256=Z9Sb410Anv6jUFTyss0jFFhU6xst8ctELqfy8Ev23gw,429 -requests/compat.py,sha256=yxntVOSEHGMrn7FNr_32EEam1ZNAdPRdSE13_yaHzTk,1451 -requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 -requests/exceptions.py,sha256=DhveFBclVjTRxhRduVpO-GbMYMID2gmjdLfNEqNpI_U,3811 -requests/help.py,sha256=gPX5d_H7Xd88aDABejhqGgl9B1VFRTt5BmiYvL3PzIQ,3875 -requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 -requests/models.py,sha256=-DlKi0or8gFAM6VzutobXvvBW_2wrJuOF5NfndTIddA,35223 -requests/packages.py,sha256=DXgv-FJIczZITmv0vEBAhWj4W-5CGCIN_ksvgR17Dvs,957 -requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373 -requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 -requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 -requests/utils.py,sha256=6sx2X3cIVA8BgWOg8odxFy-_lbWDFETU8HI4fU4Rmqw,33448 diff --git a/libs/requests-2.31.0.dist-info/WHEEL b/libs/requests-2.31.0.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/requests-2.31.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/requests-2.31.0.dist-info/INSTALLER b/libs/requests-2.32.3.dist-info/INSTALLER similarity index 100% rename from libs/requests-2.31.0.dist-info/INSTALLER rename to libs/requests-2.32.3.dist-info/INSTALLER diff --git a/libs/requests-2.31.0.dist-info/LICENSE b/libs/requests-2.32.3.dist-info/LICENSE similarity index 100% rename from libs/requests-2.31.0.dist-info/LICENSE rename to libs/requests-2.32.3.dist-info/LICENSE diff --git a/libs/requests-2.31.0.dist-info/METADATA b/libs/requests-2.32.3.dist-info/METADATA similarity index 89% rename from libs/requests-2.31.0.dist-info/METADATA rename to libs/requests-2.32.3.dist-info/METADATA index 5ee9c18af..293a3f0e4 100644 --- a/libs/requests-2.31.0.dist-info/METADATA +++ b/libs/requests-2.32.3.dist-info/METADATA @@ -1,11 +1,11 @@ Metadata-Version: 2.1 Name: requests -Version: 2.31.0 +Version: 2.32.3 Summary: Python HTTP for Humans. Home-page: https://requests.readthedocs.io Author: Kenneth Reitz Author-email: me@kennethreitz.org -License: Apache 2.0 +License: Apache-2.0 Project-URL: Documentation, https://requests.readthedocs.io Project-URL: Source, https://github.com/psf/requests Classifier: Development Status :: 5 - Production/Stable @@ -16,28 +16,28 @@ Classifier: Natural Language :: English 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 :: 3.12 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Software Development :: Libraries -Requires-Python: >=3.7 +Requires-Python: >=3.8 Description-Content-Type: text/markdown License-File: LICENSE -Requires-Dist: charset-normalizer <4,>=2 -Requires-Dist: idna <4,>=2.5 -Requires-Dist: urllib3 <3,>=1.21.1 -Requires-Dist: certifi >=2017.4.17 +Requires-Dist: charset-normalizer<4,>=2 +Requires-Dist: idna<4,>=2.5 +Requires-Dist: urllib3<3,>=1.21.1 +Requires-Dist: certifi>=2017.4.17 Provides-Extra: security Provides-Extra: socks -Requires-Dist: PySocks !=1.5.7,>=1.5.6 ; extra == 'socks' +Requires-Dist: PySocks!=1.5.7,>=1.5.6; extra == "socks" Provides-Extra: use_chardet_on_py3 -Requires-Dist: chardet <6,>=3.0.2 ; extra == 'use_chardet_on_py3' +Requires-Dist: chardet<6,>=3.0.2; extra == "use-chardet-on-py3" # Requests @@ -62,7 +62,7 @@ Requests allows you to send HTTP/1.1 requests extremely easily. There’s no nee Requests is one of the most downloaded Python packages today, pulling in around `30M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `1,000,000+` repositories. You may certainly put your trust in this code. -[![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests) +[![Downloads](https://static.pepy.tech/badge/requests/month)](https://pepy.tech/project/requests) [![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests) [![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors) @@ -74,7 +74,7 @@ Requests is available on PyPI: $ python -m pip install requests ``` -Requests officially supports Python 3.7+. +Requests officially supports Python 3.8+. ## Supported Features & Best–Practices diff --git a/libs/requests-2.32.3.dist-info/RECORD b/libs/requests-2.32.3.dist-info/RECORD new file mode 100644 index 000000000..2a3d60976 --- /dev/null +++ b/libs/requests-2.32.3.dist-info/RECORD @@ -0,0 +1,25 @@ +requests-2.32.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +requests-2.32.3.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142 +requests-2.32.3.dist-info/METADATA,sha256=erVZI6IJDUPBA9nG4HZlVYb33b2BDkuDE6BEn3dMgvY,4602 +requests-2.32.3.dist-info/RECORD,, +requests-2.32.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +requests-2.32.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +requests-2.32.3.dist-info/top_level.txt,sha256=fMSVmHfb5rbGOo6xv-O_tUX6j-WyixssE-SnwcDRxNQ,9 +requests/__init__.py,sha256=4xaAERmPDIBPsa2PsjpU9r06yooK-2mZKHTZAhWRWts,5072 +requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435 +requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 +requests/adapters.py,sha256=KIcecscqam6reOCXRl4DwP4jX8Jcl8sd57ft17KR2cQ,27451 +requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449 +requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186 +requests/certs.py,sha256=Z9Sb410Anv6jUFTyss0jFFhU6xst8ctELqfy8Ev23gw,429 +requests/compat.py,sha256=C5w_DPLSurXPgcdWU78fora0APmbYkX2G89QvH5xzPA,1817 +requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590 +requests/exceptions.py,sha256=jJPS1UWATs86ShVUaLorTiJb1SaGuoNEWgICJep-VkY,4260 +requests/help.py,sha256=gPX5d_H7Xd88aDABejhqGgl9B1VFRTt5BmiYvL3PzIQ,3875 +requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 +requests/models.py,sha256=k42roXzC8u_OagAPQi9U4MkfO7i4r2FdaqvMqstPehc,35418 +requests/packages.py,sha256=_g0gZ681UyAlKHRjH6kanbaoxx2eAb6qzcXiODyTIoc,904 +requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495 +requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322 +requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 +requests/utils.py,sha256=HiQC6Nq_Da3ktaMiFzQkh-dCk3iQHHKEsYS5kDc-8Cw,33619 diff --git a/libs/requests-2.31.0.dist-info/REQUESTED b/libs/requests-2.32.3.dist-info/REQUESTED similarity index 100% rename from libs/requests-2.31.0.dist-info/REQUESTED rename to libs/requests-2.32.3.dist-info/REQUESTED diff --git a/libs/requests-2.32.3.dist-info/WHEEL b/libs/requests-2.32.3.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/requests-2.32.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/requests-2.31.0.dist-info/top_level.txt b/libs/requests-2.32.3.dist-info/top_level.txt similarity index 100% rename from libs/requests-2.31.0.dist-info/top_level.txt rename to libs/requests-2.32.3.dist-info/top_level.txt diff --git a/libs/requests/__init__.py b/libs/requests/__init__.py index 300a16c57..051cda134 100644 --- a/libs/requests/__init__.py +++ b/libs/requests/__init__.py @@ -83,7 +83,11 @@ def check_compatibility(urllib3_version, chardet_version, charset_normalizer_ver # charset_normalizer >= 2.0.0 < 4.0.0 assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) else: - raise Exception("You need either charset_normalizer or chardet installed") + warnings.warn( + "Unable to find acceptable character detection dependency " + "(chardet or charset_normalizer).", + RequestsDependencyWarning, + ) def _check_cryptography(cryptography_version): diff --git a/libs/requests/__version__.py b/libs/requests/__version__.py index 5063c3f8e..2c105aca7 100644 --- a/libs/requests/__version__.py +++ b/libs/requests/__version__.py @@ -5,10 +5,10 @@ __title__ = "requests" __description__ = "Python HTTP for Humans." __url__ = "https://requests.readthedocs.io" -__version__ = "2.31.0" -__build__ = 0x023100 +__version__ = "2.32.3" +__build__ = 0x023203 __author__ = "Kenneth Reitz" __author_email__ = "me@kennethreitz.org" -__license__ = "Apache 2.0" +__license__ = "Apache-2.0" __copyright__ = "Copyright Kenneth Reitz" __cake__ = "\u2728 \U0001f370 \u2728" diff --git a/libs/requests/adapters.py b/libs/requests/adapters.py index 78e3bb6ec..9a58b1602 100644 --- a/libs/requests/adapters.py +++ b/libs/requests/adapters.py @@ -8,6 +8,8 @@ import os.path import socket # noqa: F401 +import typing +import warnings from urllib3.exceptions import ClosedPoolError, ConnectTimeoutError from urllib3.exceptions import HTTPError as _HTTPError @@ -25,6 +27,7 @@ from urllib3.util import Timeout as TimeoutSauce from urllib3.util import parse_url from urllib3.util.retry import Retry +from urllib3.util.ssl_ import create_urllib3_context from .auth import _basic_auth_str from .compat import basestring, urlparse @@ -61,12 +64,76 @@ def SOCKSProxyManager(*args, **kwargs): raise InvalidSchema("Missing dependencies for SOCKS support.") +if typing.TYPE_CHECKING: + from .models import PreparedRequest + + DEFAULT_POOLBLOCK = False DEFAULT_POOLSIZE = 10 DEFAULT_RETRIES = 0 DEFAULT_POOL_TIMEOUT = None +try: + import ssl # noqa: F401 + + _preloaded_ssl_context = create_urllib3_context() + _preloaded_ssl_context.load_verify_locations( + extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + ) +except ImportError: + # Bypass default SSLContext creation when Python + # interpreter isn't built with the ssl module. + _preloaded_ssl_context = None + + +def _urllib3_request_context( + request: "PreparedRequest", + verify: "bool | str | None", + client_cert: "typing.Tuple[str, str] | str | None", + poolmanager: "PoolManager", +) -> "(typing.Dict[str, typing.Any], typing.Dict[str, typing.Any])": + host_params = {} + pool_kwargs = {} + parsed_request_url = urlparse(request.url) + scheme = parsed_request_url.scheme.lower() + port = parsed_request_url.port + + # Determine if we have and should use our default SSLContext + # to optimize performance on standard requests. + poolmanager_kwargs = getattr(poolmanager, "connection_pool_kw", {}) + has_poolmanager_ssl_context = poolmanager_kwargs.get("ssl_context") + should_use_default_ssl_context = ( + _preloaded_ssl_context is not None and not has_poolmanager_ssl_context + ) + + cert_reqs = "CERT_REQUIRED" + if verify is False: + cert_reqs = "CERT_NONE" + elif verify is True and should_use_default_ssl_context: + pool_kwargs["ssl_context"] = _preloaded_ssl_context + elif isinstance(verify, str): + if not os.path.isdir(verify): + pool_kwargs["ca_certs"] = verify + else: + pool_kwargs["ca_cert_dir"] = verify + pool_kwargs["cert_reqs"] = cert_reqs + if client_cert is not None: + if isinstance(client_cert, tuple) and len(client_cert) == 2: + pool_kwargs["cert_file"] = client_cert[0] + pool_kwargs["key_file"] = client_cert[1] + else: + # According to our docs, we allow users to specify just the client + # cert path + pool_kwargs["cert_file"] = client_cert + host_params = { + "scheme": scheme, + "host": parsed_request_url.hostname, + "port": port, + } + return host_params, pool_kwargs + + class BaseAdapter: """The Base Transport Adapter""" @@ -247,28 +314,26 @@ def cert_verify(self, conn, url, verify, cert): :param cert: The SSL certificate to verify. """ if url.lower().startswith("https") and verify: + conn.cert_reqs = "CERT_REQUIRED" - cert_loc = None - - # Allow self-specified cert location. + # Only load the CA certificates if 'verify' is a string indicating the CA bundle to use. + # Otherwise, if verify is a boolean, we don't load anything since + # the connection will be using a context with the default certificates already loaded, + # and this avoids a call to the slow load_verify_locations() if verify is not True: + # `verify` must be a str with a path then cert_loc = verify - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + if not os.path.exists(cert_loc): + raise OSError( + f"Could not find a suitable TLS CA certificate bundle, " + f"invalid path: {cert_loc}" + ) - if not cert_loc or not os.path.exists(cert_loc): - raise OSError( - f"Could not find a suitable TLS CA certificate bundle, " - f"invalid path: {cert_loc}" - ) - - conn.cert_reqs = "CERT_REQUIRED" - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc else: conn.cert_reqs = "CERT_NONE" conn.ca_certs = None @@ -328,8 +393,110 @@ def build_response(self, req, resp): return response + def build_connection_pool_key_attributes(self, request, verify, cert=None): + """Build the PoolKey attributes used by urllib3 to return a connection. + + This looks at the PreparedRequest, the user-specified verify value, + and the value of the cert parameter to determine what PoolKey values + to use to select a connection from a given urllib3 Connection Pool. + + The SSL related pool key arguments are not consistently set. As of + this writing, use the following to determine what keys may be in that + dictionary: + + * If ``verify`` is ``True``, ``"ssl_context"`` will be set and will be the + default Requests SSL Context + * If ``verify`` is ``False``, ``"ssl_context"`` will not be set but + ``"cert_reqs"`` will be set + * If ``verify`` is a string, (i.e., it is a user-specified trust bundle) + ``"ca_certs"`` will be set if the string is not a directory recognized + by :py:func:`os.path.isdir`, otherwise ``"ca_certs_dir"`` will be + set. + * If ``"cert"`` is specified, ``"cert_file"`` will always be set. If + ``"cert"`` is a tuple with a second item, ``"key_file"`` will also + be present + + To override these settings, one may subclass this class, call this + method and use the above logic to change parameters as desired. For + example, if one wishes to use a custom :py:class:`ssl.SSLContext` one + must both set ``"ssl_context"`` and based on what else they require, + alter the other keys to ensure the desired behaviour. + + :param request: + The PreparedReqest being sent over the connection. + :type request: + :class:`~requests.models.PreparedRequest` + :param verify: + Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use. + :param cert: + (optional) Any user-provided SSL certificate for client + authentication (a.k.a., mTLS). This may be a string (i.e., just + the path to a file which holds both certificate and key) or a + tuple of length 2 with the certificate file path and key file + path. + :returns: + A tuple of two dictionaries. The first is the "host parameters" + portion of the Pool Key including scheme, hostname, and port. The + second is a dictionary of SSLContext related parameters. + """ + return _urllib3_request_context(request, verify, cert, self.poolmanager) + + def get_connection_with_tls_context(self, request, verify, proxies=None, cert=None): + """Returns a urllib3 connection for the given request and TLS settings. + This should not be called from user code, and is only exposed for use + when subclassing the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: + The :class:`PreparedRequest <PreparedRequest>` object to be sent + over the connection. + :param verify: + Either a boolean, in which case it controls whether we verify the + server's TLS certificate, or a string, in which case it must be a + path to a CA bundle to use. + :param proxies: + (optional) The proxies dictionary to apply to the request. + :param cert: + (optional) Any user-provided SSL certificate to be used for client + authentication (a.k.a., mTLS). + :rtype: + urllib3.ConnectionPool + """ + proxy = select_proxy(request.url, proxies) + try: + host_params, pool_kwargs = self.build_connection_pool_key_attributes( + request, + verify, + cert, + ) + except ValueError as e: + raise InvalidURL(e, request=request) + if proxy: + proxy = prepend_scheme_if_needed(proxy, "http") + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL( + "Please check proxy URL. It is malformed " + "and could be missing the host." + ) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_host( + **host_params, pool_kwargs=pool_kwargs + ) + else: + # Only scheme should be lower case + conn = self.poolmanager.connection_from_host( + **host_params, pool_kwargs=pool_kwargs + ) + + return conn + def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be + """DEPRECATED: Users should move to `get_connection_with_tls_context` + for all subclasses of HTTPAdapter using Requests>=2.32.2. + + Returns a urllib3 connection for the given URL. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. @@ -337,6 +504,15 @@ def get_connection(self, url, proxies=None): :param proxies: (optional) A Requests-style dictionary of proxies used on this request. :rtype: urllib3.ConnectionPool """ + warnings.warn( + ( + "`get_connection` has been deprecated in favor of " + "`get_connection_with_tls_context`. Custom HTTPAdapter subclasses " + "will need to migrate for Requests>=2.32.2. Please see " + "https://github.com/psf/requests/pull/6710 for more details." + ), + DeprecationWarning, + ) proxy = select_proxy(url, proxies) if proxy: @@ -391,6 +567,9 @@ def request_url(self, request, proxies): using_socks_proxy = proxy_scheme.startswith("socks") url = request.path_url + if url.startswith("//"): # Don't confuse urllib3 + url = f"/{url.lstrip('/')}" + if is_proxied_http_request and not using_socks_proxy: url = urldefragauth(request.url) @@ -451,7 +630,9 @@ def send( """ try: - conn = self.get_connection(request.url, proxies) + conn = self.get_connection_with_tls_context( + request, verify, proxies=proxies, cert=cert + ) except LocationValueError as e: raise InvalidURL(e, request=request) diff --git a/libs/requests/api.py b/libs/requests/api.py index cd0b3eeac..596074455 100644 --- a/libs/requests/api.py +++ b/libs/requests/api.py @@ -25,7 +25,7 @@ def request(method, url, **kwargs): :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` - or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers to add for the file. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. diff --git a/libs/requests/auth.py b/libs/requests/auth.py index 9733686dd..4a7ce6dc1 100644 --- a/libs/requests/auth.py +++ b/libs/requests/auth.py @@ -258,7 +258,6 @@ def handle_401(self, r, **kwargs): s_auth = r.headers.get("www-authenticate", "") if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: - self._thread_local.num_401_calls += 1 pat = re.compile(r"digest ", flags=re.IGNORECASE) self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) diff --git a/libs/requests/compat.py b/libs/requests/compat.py index 6776163c9..095de1b6c 100644 --- a/libs/requests/compat.py +++ b/libs/requests/compat.py @@ -7,13 +7,28 @@ compatibility until the next major version. """ -try: - import chardet -except ImportError: - import charset_normalizer as chardet - +import importlib import sys +# ------------------- +# Character Detection +# ------------------- + + +def _resolve_char_detection(): + """Find supported character detection libraries.""" + chardet = None + for lib in ("chardet", "charset_normalizer"): + if chardet is None: + try: + chardet = importlib.import_module(lib) + except ImportError: + pass + return chardet + + +chardet = _resolve_char_detection() + # ------- # Pythons # ------- diff --git a/libs/requests/cookies.py b/libs/requests/cookies.py index bf54ab237..f69d0cda9 100644 --- a/libs/requests/cookies.py +++ b/libs/requests/cookies.py @@ -2,7 +2,7 @@ requests.cookies ~~~~~~~~~~~~~~~~ -Compatibility code to be able to use `cookielib.CookieJar` with requests. +Compatibility code to be able to use `http.cookiejar.CookieJar` with requests. requests.utils imports from here, so be careful with imports. """ @@ -23,7 +23,7 @@ class MockRequest: """Wraps a `requests.Request` to mimic a `urllib2.Request`. - The code in `cookielib.CookieJar` expects this interface in order to correctly + The code in `http.cookiejar.CookieJar` expects this interface in order to correctly manage cookie policies, i.e., determine whether a cookie can be set, given the domains of the request and the cookie. @@ -76,7 +76,7 @@ def get_header(self, name, default=None): return self._r.headers.get(name, self._new_headers.get(name, default)) def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" + """cookiejar has no legitimate use for this method; add it back if you find one.""" raise NotImplementedError( "Cookie headers should be added with add_unredirected_header()" ) @@ -104,11 +104,11 @@ class MockResponse: """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. + the way `http.cookiejar` expects to see them. """ def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. + """Make a MockResponse for `cookiejar` to read. :param headers: a httplib.HTTPMessage or analogous carrying the headers """ @@ -124,7 +124,7 @@ def getheaders(self, name): def extract_cookies_to_jar(jar, request, response): """Extract the cookies from the response into a CookieJar. - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param jar: http.cookiejar.CookieJar (not necessarily a RequestsCookieJar) :param request: our own requests.Request object :param response: urllib3.HTTPResponse object """ @@ -174,7 +174,7 @@ class CookieConflictError(RuntimeError): class RequestsCookieJar(cookielib.CookieJar, MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict + """Compatibility class; is a http.cookiejar.CookieJar, but exposes a dict interface. This is the CookieJar we create by default for requests and sessions that @@ -341,7 +341,7 @@ def __setitem__(self, name, value): self.set(name, value) def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + """Deletes a cookie given a name. Wraps ``http.cookiejar.CookieJar``'s ``remove_cookie_by_name()``. """ remove_cookie_by_name(self, name) diff --git a/libs/requests/exceptions.py b/libs/requests/exceptions.py index e1cedf883..83986b489 100644 --- a/libs/requests/exceptions.py +++ b/libs/requests/exceptions.py @@ -41,6 +41,16 @@ def __init__(self, *args, **kwargs): CompatJSONDecodeError.__init__(self, *args) InvalidJSONError.__init__(self, *self.args, **kwargs) + def __reduce__(self): + """ + The __reduce__ method called when pickling the object must + be the one from the JSONDecodeError (be it json/simplejson) + as it expects all the arguments for instantiation, not just + one like the IOError, and the MRO would by default call the + __reduce__ method from the IOError due to the inheritance order. + """ + return CompatJSONDecodeError.__reduce__(self) + class HTTPError(RequestException): """An HTTP error occurred.""" diff --git a/libs/requests/models.py b/libs/requests/models.py index 617a4134e..8f56ca7d2 100644 --- a/libs/requests/models.py +++ b/libs/requests/models.py @@ -170,7 +170,7 @@ def _encode_files(files, data): ) ) - for (k, v) in files: + for k, v in files: # support for explicit filename ft = None fh = None @@ -268,7 +268,6 @@ def __init__( hooks=None, json=None, ): - # Default empty dicts for dict params. data = [] if data is None else data files = [] if files is None else files @@ -277,7 +276,7 @@ def __init__( hooks = {} if hooks is None else hooks self.hooks = default_hooks() - for (k, v) in list(hooks.items()): + for k, v in list(hooks.items()): self.register_hook(event=k, hook=v) self.method = method @@ -790,7 +789,12 @@ def next(self): @property def apparent_encoding(self): """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" - return chardet.detect(self.content)["encoding"] + if chardet is not None: + return chardet.detect(self.content)["encoding"] + else: + # If no character detection library is available, we'll fall back + # to a standard Python utf-8 str. + return "utf-8" def iter_content(self, chunk_size=1, decode_unicode=False): """Iterates over the response data. When stream=True is set on the @@ -865,7 +869,6 @@ def iter_lines( for chunk in self.iter_content( chunk_size=chunk_size, decode_unicode=decode_unicode ): - if pending is not None: chunk = pending + chunk diff --git a/libs/requests/packages.py b/libs/requests/packages.py index 77c45c9e9..5ab3d8e25 100644 --- a/libs/requests/packages.py +++ b/libs/requests/packages.py @@ -1,13 +1,6 @@ import sys -try: - import chardet -except ImportError: - import warnings - - import charset_normalizer as chardet - - warnings.filterwarnings("ignore", "Trying to detect", module="charset_normalizer") +from .compat import chardet # This code exists for backwards compatibility reasons. # I don't like it either. Just look the other way. :) @@ -20,9 +13,11 @@ if mod == package or mod.startswith(f"{package}."): sys.modules[f"requests.packages.{mod}"] = sys.modules[mod] -target = chardet.__name__ -for mod in list(sys.modules): - if mod == target or mod.startswith(f"{target}."): - target = target.replace(target, "chardet") - sys.modules[f"requests.packages.{target}"] = sys.modules[mod] -# Kinda cool, though, right? +if chardet is not None: + target = chardet.__name__ + for mod in list(sys.modules): + if mod == target or mod.startswith(f"{target}."): + imported_mod = sys.modules[mod] + sys.modules[f"requests.packages.{mod}"] = imported_mod + mod = mod.replace(target, "chardet") + sys.modules[f"requests.packages.{mod}"] = imported_mod diff --git a/libs/requests/sessions.py b/libs/requests/sessions.py index dbcf2a7b0..b387bc36d 100644 --- a/libs/requests/sessions.py +++ b/libs/requests/sessions.py @@ -262,7 +262,6 @@ def resolve_redirects( if yield_requests: yield req else: - resp = self.send( req, stream=stream, @@ -326,7 +325,7 @@ def rebuild_proxies(self, prepared_request, proxies): # urllib3 handles proxy authorization for us in the standard adapter. # Avoid appending this to TLS tunneled requests where it may be leaked. - if not scheme.startswith('https') and username and password: + if not scheme.startswith("https") and username and password: headers["Proxy-Authorization"] = _basic_auth_str(username, password) return new_proxies @@ -389,7 +388,6 @@ class Session(SessionRedirectMixin): ] def __init__(self): - #: A case-insensitive dictionary of headers to be sent on each #: :class:`Request <Request>` sent from this #: :class:`Session <Session>`. @@ -545,6 +543,8 @@ def request( :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol or protocol and hostname to the URL of the proxy. + :param hooks: (optional) Dictionary mapping hook name to one event or + list of events, event must be callable. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) Either a boolean, in which case it controls whether we verify @@ -711,7 +711,6 @@ def send(self, request, **kwargs): # Persist cookies if r.history: - # If the hooks create history then we want those cookies too for resp in r.history: extract_cookies_to_jar(self.cookies, resp.request, resp.raw) @@ -759,7 +758,7 @@ def merge_environment_settings(self, url, proxies, stream, verify, cert): # Set environment's proxies. no_proxy = proxies.get("no_proxy") if proxies is not None else None env_proxies = get_environ_proxies(url, no_proxy=no_proxy) - for (k, v) in env_proxies.items(): + for k, v in env_proxies.items(): proxies.setdefault(k, v) # Look for requests environment configuration @@ -785,8 +784,7 @@ def get_adapter(self, url): :rtype: requests.adapters.BaseAdapter """ - for (prefix, adapter) in self.adapters.items(): - + for prefix, adapter in self.adapters.items(): if url.lower().startswith(prefix.lower()): return adapter diff --git a/libs/requests/status_codes.py b/libs/requests/status_codes.py index 4bd072be9..c7945a2f0 100644 --- a/libs/requests/status_codes.py +++ b/libs/requests/status_codes.py @@ -24,7 +24,7 @@ # Informational. 100: ("continue",), 101: ("switching_protocols",), - 102: ("processing",), + 102: ("processing", "early-hints"), 103: ("checkpoint",), 122: ("uri_too_long", "request_uri_too_long"), 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), @@ -65,8 +65,8 @@ 410: ("gone",), 411: ("length_required",), 412: ("precondition_failed", "precondition"), - 413: ("request_entity_too_large",), - 414: ("request_uri_too_large",), + 413: ("request_entity_too_large", "content_too_large"), + 414: ("request_uri_too_large", "uri_too_long"), 415: ("unsupported_media_type", "unsupported_media", "media_type"), 416: ( "requested_range_not_satisfiable", @@ -76,10 +76,10 @@ 417: ("expectation_failed",), 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), 421: ("misdirected_request",), - 422: ("unprocessable_entity", "unprocessable"), + 422: ("unprocessable_entity", "unprocessable", "unprocessable_content"), 423: ("locked",), 424: ("failed_dependency", "dependency"), - 425: ("unordered_collection", "unordered"), + 425: ("unordered_collection", "unordered", "too_early"), 426: ("upgrade_required", "upgrade"), 428: ("precondition_required", "precondition"), 429: ("too_many_requests", "too_many"), diff --git a/libs/requests/utils.py b/libs/requests/utils.py index a367417f8..ae6c42f6c 100644 --- a/libs/requests/utils.py +++ b/libs/requests/utils.py @@ -97,6 +97,8 @@ def proxy_bypass_registry(host): # '<local>' string by the localhost entry and the corresponding # canonical entry. proxyOverride = proxyOverride.split(";") + # filter out empty strings to avoid re.match return true in the following code. + proxyOverride = filter(None, proxyOverride) # now check if we match one of the registry values. for test in proxyOverride: if test == "<local>": @@ -134,6 +136,9 @@ def super_len(o): total_length = None current_position = 0 + if isinstance(o, str): + o = o.encode("utf-8") + if hasattr(o, "__len__"): total_length = len(o) @@ -466,11 +471,7 @@ def dict_from_cookiejar(cj): :rtype: dict """ - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - + cookie_dict = {cookie.name: cookie.value for cookie in cj} return cookie_dict @@ -767,6 +768,7 @@ def should_bypass_proxies(url, no_proxy): :rtype: bool """ + # Prioritize lowercase environment variables over uppercase # to keep a consistent behaviour with other http projects (curl, wget). def get_proxy(key): @@ -862,7 +864,7 @@ def select_proxy(url, proxies): def resolve_proxies(request, proxies, trust_env=True): """This method takes proxy information from a request and configuration input to resolve a mapping of target proxies. This will consider settings - such a NO_PROXY to strip proxy configurations. + such as NO_PROXY to strip proxy configurations. :param request: Request or PreparedRequest :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs @@ -1054,7 +1056,7 @@ def _validate_header_part(header, header_part, header_validator_index): if not validator.match(header_part): header_kind = "name" if header_validator_index == 0 else "value" raise InvalidHeader( - f"Invalid leading whitespace, reserved character(s), or return" + f"Invalid leading whitespace, reserved character(s), or return " f"character(s) in header {header_kind}: {header_part!r}" ) diff --git a/libs/requests_oauthlib-1.3.1.dist-info/RECORD b/libs/requests_oauthlib-1.3.1.dist-info/RECORD deleted file mode 100644 index 64a17ca01..000000000 --- a/libs/requests_oauthlib-1.3.1.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -requests_oauthlib-1.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -requests_oauthlib-1.3.1.dist-info/LICENSE,sha256=rgGEavrYqCkf5qCJZvMBWvmo_2ddhLmB-Xk8Ei94dug,745 -requests_oauthlib-1.3.1.dist-info/METADATA,sha256=HEn-XkRrhgfyryr2M4eTQd8Z8v-8z5Xoins6DWW3Ij4,10079 -requests_oauthlib-1.3.1.dist-info/RECORD,, -requests_oauthlib-1.3.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -requests_oauthlib-1.3.1.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 -requests_oauthlib-1.3.1.dist-info/top_level.txt,sha256=vx1R42DWBO64h6iu8Gco0F01TVTPWXSRWBaV1GwVRTQ,18 -requests_oauthlib/__init__.py,sha256=j3FXxxzppgvMvHj2v9csJtfEXt5QWeUODk6TmKTtopE,529 -requests_oauthlib/compliance_fixes/__init__.py,sha256=M0zZXYmddhdiVVtazEC23tmPYP4MDaeBabKh9FiAyGc,398 -requests_oauthlib/compliance_fixes/douban.py,sha256=Ilfc1jTjCD66rPFrPf97g2D8Gb-MjoNuXqSGmaBVAn0,472 -requests_oauthlib/compliance_fixes/ebay.py,sha256=bLaGRBG4Pkoac2V4gme1-3pbRYcxvfAGyPID7K6xIZ8,890 -requests_oauthlib/compliance_fixes/facebook.py,sha256=V6_2BQnyBKcwTWDRqDTbJQcJj4Rd_XMTAlDgGiFTQf4,1119 -requests_oauthlib/compliance_fixes/fitbit.py,sha256=rgA4MrYKHqeNOfCGL0pdG3kgum6rzh1QMvgIHL_EOAE,905 -requests_oauthlib/compliance_fixes/instagram.py,sha256=LO55o9VrmeegJOCzz2-QqMlneXS6YY_33ulA_-cG1pI,948 -requests_oauthlib/compliance_fixes/mailchimp.py,sha256=nTdyttxiTxdAzbC72XZb1_uV4ebVOUvQDpDbAmBTqvQ,757 -requests_oauthlib/compliance_fixes/plentymarkets.py,sha256=HnROrco-Z9EvGEjHw3fn-7UxxC8G2GKB8Yjda3es7Yw,796 -requests_oauthlib/compliance_fixes/slack.py,sha256=YDz9DQ3ukNgbyy1X4JIPAhTKKMwMf8R8THxnzhm79zE,1453 -requests_oauthlib/compliance_fixes/weibo.py,sha256=yMvmc2xGWsaxZZNT3XYdJhDuxXJ99N6rO0n3d2cP9MA,444 -requests_oauthlib/oauth1_auth.py,sha256=yq-3SxMvPa1Ux-dm_a2mC32TDKdGGT2XJJuu3d4QtRo,3737 -requests_oauthlib/oauth1_session.py,sha256=JPThdYoaDbc-I6aH7-UZKvFZ6B1ySvBlUkMqa6TcLpE,17055 -requests_oauthlib/oauth2_auth.py,sha256=uYT7ueHDG9TYR73yIFCX8TbquOz44p21lQYPCVw4gn8,1548 -requests_oauthlib/oauth2_session.py,sha256=lIuu5PbiVYfSrEiJ38H4QWh0maKEqwVUc3sU6hXXXmE,21992 diff --git a/libs/requests_oauthlib-1.3.1.dist-info/INSTALLER b/libs/requests_oauthlib-2.0.0.dist-info/INSTALLER similarity index 100% rename from libs/requests_oauthlib-1.3.1.dist-info/INSTALLER rename to libs/requests_oauthlib-2.0.0.dist-info/INSTALLER diff --git a/libs/requests_oauthlib-1.3.1.dist-info/LICENSE b/libs/requests_oauthlib-2.0.0.dist-info/LICENSE similarity index 100% rename from libs/requests_oauthlib-1.3.1.dist-info/LICENSE rename to libs/requests_oauthlib-2.0.0.dist-info/LICENSE diff --git a/libs/requests_oauthlib-1.3.1.dist-info/METADATA b/libs/requests_oauthlib-2.0.0.dist-info/METADATA similarity index 88% rename from libs/requests_oauthlib-1.3.1.dist-info/METADATA rename to libs/requests_oauthlib-2.0.0.dist-info/METADATA index 89639d5d1..0a62eb5b6 100644 --- a/libs/requests_oauthlib-1.3.1.dist-info/METADATA +++ b/libs/requests_oauthlib-2.0.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: requests-oauthlib -Version: 1.3.1 +Version: 2.0.0 Summary: OAuthlib authentication support for Requests. Home-page: https://github.com/requests/requests-oauthlib Author: Kenneth Reitz @@ -11,8 +11,6 @@ Classifier: Intended Audience :: Developers Classifier: Natural Language :: English Classifier: License :: OSI Approved :: BSD License 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.4 Classifier: Programming Language :: Python :: 3.5 @@ -20,9 +18,12 @@ Classifier: Programming Language :: Python :: 3.6 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 :: 3.12 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Requires-Python: >=3.4 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: oauthlib >=3.0.0 @@ -33,7 +34,7 @@ Requires-Dist: oauthlib[signedtoken] >=3.0.0 ; extra == 'rsa' Requests-OAuthlib |build-status| |coverage-status| |docs| ========================================================= -This project provides first-class OAuth library support for `Requests <http://python-requests.org>`_. +This project provides first-class OAuth library support for `Requests <https://requests.readthedocs.io>`_. The OAuth 1 workflow -------------------- @@ -78,7 +79,7 @@ To install requests and requests_oauthlib you can use pip: .. code-block:: bash - $ pip install requests requests_oauthlib + pip install requests requests-oauthlib .. |build-status| image:: https://github.com/requests/requests-oauthlib/actions/workflows/run-tests.yml/badge.svg :target: https://github.com/requests/requests-oauthlib/actions @@ -93,10 +94,37 @@ To install requests and requests_oauthlib you can use pip: History ------- +v2.0.0 (22 March 2024) +++++++++++++++++++++++++ + +Full set of changes are in [github](https://github.com/requests/requests-oauthlib/milestone/4?closed=1). + +Additions & changes: + +- ``OAuth2Session`` now correctly uses the ``self.verify`` value if ``verify`` + is not overridden in ``fetch_token`` and ``refresh_token``. Fixes `#404 + <https://github.com/requests/requests-oauthlib/issues/404>`_. +- ``OAuth2Session`` constructor now uses its ``client.scope`` when a ``client`` + is provided and ``scope`` is not overridden. Fixes `#408 + <https://github.com/requests/requests-oauthlib/issues/408>`_ +- Add ``refresh_token_request`` and ``access_token_request`` compliance hooks +- Add PKCE support and Auth0 example +- Add support for Python 3.8-3.12 +- Remove support of Python 2.x, <3.7 +- Migrated to Github Action +- Updated dependencies +- Cleanup some docs and examples + +v1.4.0 (27 Feb 2024) +++++++++++++++++++++++++ + +- Version 2.0.0 published initially as 1.4.0, it was yanked eventually. + v1.3.1 (21 January 2022) ++++++++++++++++++++++++ - Add initial support for OAuth Mutual TLS (draft-ietf-oauth-mtls) +- Removed outdated LinkedIn Compliance Fixes - Add eBay compliance fix - Add Spotify OAuth 2 Tutorial - Add support for python 3.8, 3.9 diff --git a/libs/requests_oauthlib-2.0.0.dist-info/RECORD b/libs/requests_oauthlib-2.0.0.dist-info/RECORD new file mode 100644 index 000000000..746562d4d --- /dev/null +++ b/libs/requests_oauthlib-2.0.0.dist-info/RECORD @@ -0,0 +1,22 @@ +requests_oauthlib-2.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +requests_oauthlib-2.0.0.dist-info/LICENSE,sha256=rgGEavrYqCkf5qCJZvMBWvmo_2ddhLmB-Xk8Ei94dug,745 +requests_oauthlib-2.0.0.dist-info/METADATA,sha256=fYXqOcFm2fIyb4nO6QYzHSyA7S3epNMe_AIABrR_yso,11133 +requests_oauthlib-2.0.0.dist-info/RECORD,, +requests_oauthlib-2.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +requests_oauthlib-2.0.0.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 +requests_oauthlib-2.0.0.dist-info/top_level.txt,sha256=vx1R42DWBO64h6iu8Gco0F01TVTPWXSRWBaV1GwVRTQ,18 +requests_oauthlib/__init__.py,sha256=chvYiICdcieGrRc_e5WtFxaXq6T_esmicL_BLWDend4,548 +requests_oauthlib/compliance_fixes/__init__.py,sha256=e0qXlL1FTbe7kxTLFmTYN9ipFNZks-sgGiYqhryBobw,377 +requests_oauthlib/compliance_fixes/douban.py,sha256=9RTafRu0nWyiAn9r8502CEY6yvozcanXV2pwnKPUJNw,413 +requests_oauthlib/compliance_fixes/ebay.py,sha256=NRUxIMKVMP0QULur9REutsyZIqIP_AwOANjlji9ZgAE,832 +requests_oauthlib/compliance_fixes/facebook.py,sha256=rybiH839YwzyY13SiGA676iHCBTh3mqFdam5tqx041I,995 +requests_oauthlib/compliance_fixes/fitbit.py,sha256=cI4PPpTnXJpZw1SY-N8ocshV2pVvep679d_pRIJPImg,846 +requests_oauthlib/compliance_fixes/instagram.py,sha256=YEvXWKmhM6yY4k378V2mNll4VKyOJkZBH0fRvU6fDM0,875 +requests_oauthlib/compliance_fixes/mailchimp.py,sha256=SVFQlnbuXZCLeKv6Ymhg9eSBScHCXV93PXLHWhUPAN0,679 +requests_oauthlib/compliance_fixes/plentymarkets.py,sha256=s7lrTZhINakiKjlbOISTeHTSXsNkcG8wfKcEVlQUMos,737 +requests_oauthlib/compliance_fixes/slack.py,sha256=4ZQg1ny0vU-hf8NJjKwgZEggH2OB7N3aJ9Gt2v7cVc4,1380 +requests_oauthlib/compliance_fixes/weibo.py,sha256=TL8uu4XMD_Mh9tXIKMNA8TT1gOIraBipTKoXkSpR2sM,385 +requests_oauthlib/oauth1_auth.py,sha256=F3XfhVODV80nnCEPDHueU1gmqxhhjGTmnDEYGtRYwJc,3604 +requests_oauthlib/oauth1_session.py,sha256=A6j7CgQ8n2Ir4An-8U0J9lyUNeY8H5Wff5I5PWHzlHc,16942 +requests_oauthlib/oauth2_auth.py,sha256=MXs8vIbBOhXj9NLiw_-J24k56L_XRJ0tFH_EMpshYUk,1508 +requests_oauthlib/oauth2_session.py,sha256=K4XtdpNTiU6Dq8JvEsj8aUpMdavWSCZAuTOc_xhZcBw,23932 diff --git a/libs/requests_oauthlib-1.3.1.dist-info/REQUESTED b/libs/requests_oauthlib-2.0.0.dist-info/REQUESTED similarity index 100% rename from libs/requests_oauthlib-1.3.1.dist-info/REQUESTED rename to libs/requests_oauthlib-2.0.0.dist-info/REQUESTED diff --git a/libs/requests_oauthlib-1.3.1.dist-info/WHEEL b/libs/requests_oauthlib-2.0.0.dist-info/WHEEL similarity index 100% rename from libs/requests_oauthlib-1.3.1.dist-info/WHEEL rename to libs/requests_oauthlib-2.0.0.dist-info/WHEEL diff --git a/libs/requests_oauthlib-1.3.1.dist-info/top_level.txt b/libs/requests_oauthlib-2.0.0.dist-info/top_level.txt similarity index 100% rename from libs/requests_oauthlib-1.3.1.dist-info/top_level.txt rename to libs/requests_oauthlib-2.0.0.dist-info/top_level.txt diff --git a/libs/requests_oauthlib/__init__.py b/libs/requests_oauthlib/__init__.py index 0d3e49f99..865d72fb7 100644 --- a/libs/requests_oauthlib/__init__.py +++ b/libs/requests_oauthlib/__init__.py @@ -1,3 +1,4 @@ +# ruff: noqa: F401 import logging from .oauth1_auth import OAuth1 @@ -5,7 +6,7 @@ from .oauth2_auth import OAuth2 from .oauth2_session import OAuth2Session, TokenUpdated -__version__ = "1.3.1" +__version__ = "2.0.0" import requests diff --git a/libs/requests_oauthlib/compliance_fixes/__init__.py b/libs/requests_oauthlib/compliance_fixes/__init__.py index 0e8e3ac84..8815ea0b8 100644 --- a/libs/requests_oauthlib/compliance_fixes/__init__.py +++ b/libs/requests_oauthlib/compliance_fixes/__init__.py @@ -1,5 +1,4 @@ -from __future__ import absolute_import - +# ruff: noqa: F401 from .facebook import facebook_compliance_fix from .fitbit import fitbit_compliance_fix from .slack import slack_compliance_fix diff --git a/libs/requests_oauthlib/compliance_fixes/douban.py b/libs/requests_oauthlib/compliance_fixes/douban.py index ecc57b081..c8b99c721 100644 --- a/libs/requests_oauthlib/compliance_fixes/douban.py +++ b/libs/requests_oauthlib/compliance_fixes/douban.py @@ -1,14 +1,12 @@ import json -from oauthlib.common import to_unicode - def douban_compliance_fix(session): def fix_token_type(r): token = json.loads(r.text) token.setdefault("token_type", "Bearer") fixed_token = json.dumps(token) - r._content = to_unicode(fixed_token).encode("utf-8") + r._content = fixed_token.encode() return r session._client_default_token_placement = "query" diff --git a/libs/requests_oauthlib/compliance_fixes/ebay.py b/libs/requests_oauthlib/compliance_fixes/ebay.py index 4aa423b3f..ef33f3910 100644 --- a/libs/requests_oauthlib/compliance_fixes/ebay.py +++ b/libs/requests_oauthlib/compliance_fixes/ebay.py @@ -1,5 +1,4 @@ import json -from oauthlib.common import to_unicode def ebay_compliance_fix(session): @@ -13,7 +12,7 @@ def _compliance_fix(response): if token.get("token_type") in ["Application Access Token", "User Access Token"]: token["token_type"] = "Bearer" fixed_token = json.dumps(token) - response._content = to_unicode(fixed_token).encode("utf-8") + response._content = fixed_token.encode() return response diff --git a/libs/requests_oauthlib/compliance_fixes/facebook.py b/libs/requests_oauthlib/compliance_fixes/facebook.py index 90e792127..f44558a83 100644 --- a/libs/requests_oauthlib/compliance_fixes/facebook.py +++ b/libs/requests_oauthlib/compliance_fixes/facebook.py @@ -1,11 +1,5 @@ from json import dumps - -try: - from urlparse import parse_qsl -except ImportError: - from urllib.parse import parse_qsl - -from oauthlib.common import to_unicode +from urllib.parse import parse_qsl def facebook_compliance_fix(session): @@ -26,7 +20,7 @@ def _compliance_fix(r): if expires is not None: token["expires_in"] = expires token["token_type"] = "Bearer" - r._content = to_unicode(dumps(token)).encode("UTF-8") + r._content = dumps(token).encode() return r session.register_compliance_hook("access_token_response", _compliance_fix) diff --git a/libs/requests_oauthlib/compliance_fixes/fitbit.py b/libs/requests_oauthlib/compliance_fixes/fitbit.py index 7e6270240..aacc68bfb 100644 --- a/libs/requests_oauthlib/compliance_fixes/fitbit.py +++ b/libs/requests_oauthlib/compliance_fixes/fitbit.py @@ -8,8 +8,6 @@ from json import loads, dumps -from oauthlib.common import to_unicode - def fitbit_compliance_fix(session): def _missing_error(r): @@ -17,7 +15,7 @@ def _missing_error(r): if "errors" in token: # Set the error to the first one we have token["error"] = token["errors"][0]["errorType"] - r._content = to_unicode(dumps(token)).encode("UTF-8") + r._content = dumps(token).encode() return r session.register_compliance_hook("access_token_response", _missing_error) diff --git a/libs/requests_oauthlib/compliance_fixes/instagram.py b/libs/requests_oauthlib/compliance_fixes/instagram.py index 4e07fe08b..7d5a2ad44 100644 --- a/libs/requests_oauthlib/compliance_fixes/instagram.py +++ b/libs/requests_oauthlib/compliance_fixes/instagram.py @@ -1,7 +1,4 @@ -try: - from urlparse import urlparse, parse_qs -except ImportError: - from urllib.parse import urlparse, parse_qs +from urllib.parse import urlparse, parse_qs from oauthlib.common import add_params_to_uri diff --git a/libs/requests_oauthlib/compliance_fixes/mailchimp.py b/libs/requests_oauthlib/compliance_fixes/mailchimp.py index c69ce9fda..0d602659c 100644 --- a/libs/requests_oauthlib/compliance_fixes/mailchimp.py +++ b/libs/requests_oauthlib/compliance_fixes/mailchimp.py @@ -1,21 +1,19 @@ import json -from oauthlib.common import to_unicode - def mailchimp_compliance_fix(session): def _null_scope(r): token = json.loads(r.text) if "scope" in token and token["scope"] is None: token.pop("scope") - r._content = to_unicode(json.dumps(token)).encode("utf-8") + r._content = json.dumps(token).encode() return r def _non_zero_expiration(r): token = json.loads(r.text) if "expires_in" in token and token["expires_in"] == 0: token["expires_in"] = 3600 - r._content = to_unicode(json.dumps(token)).encode("utf-8") + r._content = json.dumps(token).encode() return r session.register_compliance_hook("access_token_response", _null_scope) diff --git a/libs/requests_oauthlib/compliance_fixes/plentymarkets.py b/libs/requests_oauthlib/compliance_fixes/plentymarkets.py index 9f605f058..859f0566a 100644 --- a/libs/requests_oauthlib/compliance_fixes/plentymarkets.py +++ b/libs/requests_oauthlib/compliance_fixes/plentymarkets.py @@ -1,8 +1,6 @@ from json import dumps, loads import re -from oauthlib.common import to_unicode - def plentymarkets_compliance_fix(session): def _to_snake_case(n): @@ -22,7 +20,7 @@ def _compliance_fix(r): for k, v in token.items(): fixed_token[_to_snake_case(k)] = v - r._content = to_unicode(dumps(fixed_token)).encode("UTF-8") + r._content = dumps(fixed_token).encode() return r session.register_compliance_hook("access_token_response", _compliance_fix) diff --git a/libs/requests_oauthlib/compliance_fixes/slack.py b/libs/requests_oauthlib/compliance_fixes/slack.py index 3f574b03a..9095a470c 100644 --- a/libs/requests_oauthlib/compliance_fixes/slack.py +++ b/libs/requests_oauthlib/compliance_fixes/slack.py @@ -1,7 +1,4 @@ -try: - from urlparse import urlparse, parse_qs -except ImportError: - from urllib.parse import urlparse, parse_qs +from urllib.parse import urlparse, parse_qs from oauthlib.common import add_params_to_uri diff --git a/libs/requests_oauthlib/compliance_fixes/weibo.py b/libs/requests_oauthlib/compliance_fixes/weibo.py index 6733abeb1..f1623fd6d 100644 --- a/libs/requests_oauthlib/compliance_fixes/weibo.py +++ b/libs/requests_oauthlib/compliance_fixes/weibo.py @@ -1,13 +1,11 @@ from json import loads, dumps -from oauthlib.common import to_unicode - def weibo_compliance_fix(session): def _missing_token_type(r): token = loads(r.text) token["token_type"] = "Bearer" - r._content = to_unicode(dumps(token)).encode("UTF-8") + r._content = dumps(token).encode() return r session._client.default_token_placement = "query" diff --git a/libs/requests_oauthlib/oauth1_auth.py b/libs/requests_oauthlib/oauth1_auth.py index cfbbd5902..f8c0bd6e7 100644 --- a/libs/requests_oauthlib/oauth1_auth.py +++ b/libs/requests_oauthlib/oauth1_auth.py @@ -1,20 +1,15 @@ # -*- coding: utf-8 -*- -from __future__ import unicode_literals - import logging from oauthlib.common import extract_params from oauthlib.oauth1 import Client, SIGNATURE_HMAC, SIGNATURE_TYPE_AUTH_HEADER from oauthlib.oauth1 import SIGNATURE_TYPE_BODY -from requests.compat import is_py3 from requests.utils import to_native_string from requests.auth import AuthBase CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded" CONTENT_TYPE_MULTI_PART = "multipart/form-data" -if is_py3: - unicode = str log = logging.getLogger(__name__) @@ -83,7 +78,7 @@ def __call__(self, r): or self.client.signature_type == SIGNATURE_TYPE_BODY ): content_type = CONTENT_TYPE_FORM_URLENCODED - if not isinstance(content_type, unicode): + if not isinstance(content_type, str): content_type = content_type.decode("utf-8") is_form_encoded = CONTENT_TYPE_FORM_URLENCODED in content_type @@ -96,17 +91,17 @@ def __call__(self, r): if is_form_encoded: r.headers["Content-Type"] = CONTENT_TYPE_FORM_URLENCODED r.url, headers, r.body = self.client.sign( - unicode(r.url), unicode(r.method), r.body or "", r.headers + str(r.url), str(r.method), r.body or "", r.headers ) elif self.force_include_body: # To allow custom clients to work on non form encoded bodies. r.url, headers, r.body = self.client.sign( - unicode(r.url), unicode(r.method), r.body or "", r.headers + str(r.url), str(r.method), r.body or "", r.headers ) else: # Omit body data in the signing of non form-encoded requests r.url, headers, _ = self.client.sign( - unicode(r.url), unicode(r.method), None, r.headers + str(r.url), str(r.method), None, r.headers ) r.prepare_headers(headers) diff --git a/libs/requests_oauthlib/oauth1_session.py b/libs/requests_oauthlib/oauth1_session.py index 88f2853ca..7625c8084 100644 --- a/libs/requests_oauthlib/oauth1_session.py +++ b/libs/requests_oauthlib/oauth1_session.py @@ -1,9 +1,4 @@ -from __future__ import unicode_literals - -try: - from urlparse import urlparse -except ImportError: - from urllib.parse import urlparse +from urllib.parse import urlparse import logging @@ -85,7 +80,7 @@ class OAuth1Session(requests.Session): 'https://api.twitter.com/oauth/authorize?oauth_token=sdf0o9823sjdfsdf&oauth_callback=https%3A%2F%2F127.0.0.1%2Fcallback' >>> >>> # Third step. Fetch the access token - >>> redirect_response = raw_input('Paste the full redirect URL here.') + >>> redirect_response = input('Paste the full redirect URL here.') >>> oauth_session.parse_authorization_response(redirect_response) { 'oauth_token: 'kjerht2309u', @@ -258,7 +253,7 @@ def authorization_url(self, url, request_token=None, **kwargs): return add_params_to_uri(url, kwargs.items()) def fetch_request_token(self, url, realm=None, **request_kwargs): - r"""Fetch a request token. + """Fetch a request token. This is the first step in the OAuth 1 workflow. A request token is obtained by making a signed post request to url. The token is then @@ -267,7 +262,7 @@ def fetch_request_token(self, url, realm=None, **request_kwargs): :param url: The request token endpoint URL. :param realm: A list of realms to request access to. - :param \*\*request_kwargs: Optional arguments passed to ''post'' + :param request_kwargs: Optional arguments passed to ''post'' function in ''requests.Session'' :returns: The response in dict format. diff --git a/libs/requests_oauthlib/oauth2_auth.py b/libs/requests_oauthlib/oauth2_auth.py index b880f72f5..f19f52ac9 100644 --- a/libs/requests_oauthlib/oauth2_auth.py +++ b/libs/requests_oauthlib/oauth2_auth.py @@ -1,4 +1,3 @@ -from __future__ import unicode_literals from oauthlib.oauth2 import WebApplicationClient, InsecureTransportError from oauthlib.oauth2 import is_secure_transport from requests.auth import AuthBase diff --git a/libs/requests_oauthlib/oauth2_session.py b/libs/requests_oauthlib/oauth2_session.py index db4468089..93cc4d7bb 100644 --- a/libs/requests_oauthlib/oauth2_session.py +++ b/libs/requests_oauthlib/oauth2_session.py @@ -1,5 +1,3 @@ -from __future__ import unicode_literals - import logging from oauthlib.common import generate_token, urldecode @@ -46,6 +44,7 @@ def __init__( token=None, state=None, token_updater=None, + pkce=None, **kwargs ): """Construct a new OAuth 2 client session. @@ -72,18 +71,23 @@ def __init__( set a TokenUpdated warning will be raised when a token has been refreshed. This warning will carry the token in its token argument. + :param pkce: Set "S256" or "plain" to enable PKCE. Default is disabled. :param kwargs: Arguments to pass to the Session constructor. """ super(OAuth2Session, self).__init__(**kwargs) self._client = client or WebApplicationClient(client_id, token=token) self.token = token or {} - self.scope = scope + self._scope = scope self.redirect_uri = redirect_uri self.state = state or generate_token self._state = state self.auto_refresh_url = auto_refresh_url self.auto_refresh_kwargs = auto_refresh_kwargs or {} self.token_updater = token_updater + self._pkce = pkce + + if self._pkce not in ["S256", "plain", None]: + raise AttributeError("Wrong value for {}(.., pkce={})".format(self.__class__, self._pkce)) # Ensure that requests doesn't do any automatic auth. See #278. # The default behavior can be re-enabled by setting auth to None. @@ -95,8 +99,24 @@ def __init__( "access_token_response": set(), "refresh_token_response": set(), "protected_request": set(), + "refresh_token_request": set(), + "access_token_request": set(), } + @property + def scope(self): + """By default the scope from the client is used, except if overridden""" + if self._scope is not None: + return self._scope + elif self._client is not None: + return self._client.scope + else: + return None + + @scope.setter + def scope(self, scope): + self._scope = scope + def new_state(self): """Generates a state string to be used in authorizations.""" try: @@ -161,6 +181,13 @@ def authorization_url(self, url, state=None, **kwargs): :return: authorization_url, state """ state = state or self.new_state() + if self._pkce: + self._code_verifier = self._client.create_code_verifier(43) + kwargs["code_challenge_method"] = self._pkce + kwargs["code_challenge"] = self._client.create_code_challenge( + code_verifier=self._code_verifier, + code_challenge_method=self._pkce + ) return ( self._client.prepare_request_uri( url, @@ -185,7 +212,7 @@ def fetch_token( force_querystring=False, timeout=None, headers=None, - verify=True, + verify=None, proxies=None, include_client_id=None, client_secret=None, @@ -252,6 +279,13 @@ def fetch_token( "Please supply either code or " "authorization_response parameters." ) + if self._pkce: + if self._code_verifier is None: + raise ValueError( + "Code verifier is not found, authorization URL must be generated before" + ) + kwargs["code_verifier"] = self._code_verifier + # Earlier versions of this library build an HTTPBasicAuth header out of # `username` and `password`. The RFC states, however these attributes # must be in the request body and not the header. @@ -325,7 +359,7 @@ def fetch_token( headers = headers or { "Accept": "application/json", - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", + "Content-Type": "application/x-www-form-urlencoded", } self.token = {} request_kwargs = {} @@ -338,6 +372,12 @@ def fetch_token( else: raise ValueError("The method kwarg must be POST or GET.") + for hook in self.compliance_hook["access_token_request"]: + log.debug("Invoking access_token_request hook %s.", hook) + token_url, headers, request_kwargs = hook( + token_url, headers, request_kwargs + ) + r = self.request( method=method, url=token_url, @@ -388,7 +428,7 @@ def refresh_token( auth=None, timeout=None, headers=None, - verify=True, + verify=None, proxies=None, **kwargs ): @@ -426,9 +466,13 @@ def refresh_token( if headers is None: headers = { "Accept": "application/json", - "Content-Type": ("application/x-www-form-urlencoded;charset=UTF-8"), + "Content-Type": ("application/x-www-form-urlencoded"), } + for hook in self.compliance_hook["refresh_token_request"]: + log.debug("Invoking refresh_token_request hook %s.", hook) + token_url, headers, body = hook(token_url, headers, body) + r = self.post( token_url, data=dict(urldecode(body)), @@ -450,7 +494,7 @@ def refresh_token( r = hook(r) self.token = self._client.parse_request_body_response(r.text, scope=self.scope) - if not "refresh_token" in self.token: + if "refresh_token" not in self.token: log.debug("No new refresh token given. Re-using old.") self.token["refresh_token"] = refresh_token return self.token @@ -464,6 +508,7 @@ def request( withhold_token=False, client_id=None, client_secret=None, + files=None, **kwargs ): """Intercept all requests and add the OAuth 2 token if present.""" @@ -519,7 +564,7 @@ def request( log.debug("Supplying headers %s and data %s", headers, data) log.debug("Passing through key word arguments %s.", kwargs) return super(OAuth2Session, self).request( - method, url, headers=headers, data=data, **kwargs + method, url, headers=headers, data=data, files=files, **kwargs ) def register_compliance_hook(self, hook_type, hook): @@ -529,6 +574,8 @@ def register_compliance_hook(self, hook_type, hook): access_token_response invoked before token parsing. refresh_token_response invoked before refresh token parsing. protected_request invoked before making a request. + access_token_request invoked before making a token fetch request. + refresh_token_request invoked before making a refresh request. If you find a new hook is needed please send a GitHub PR request or open an issue. diff --git a/libs/rich-13.7.0.dist-info/WHEEL b/libs/rich-13.7.0.dist-info/WHEEL deleted file mode 100644 index d73ccaae8..000000000 --- a/libs/rich-13.7.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/libs/rich-13.7.0.dist-info/INSTALLER b/libs/rich-13.9.3.dist-info/INSTALLER similarity index 100% rename from libs/rich-13.7.0.dist-info/INSTALLER rename to libs/rich-13.9.3.dist-info/INSTALLER diff --git a/libs/rich-13.7.0.dist-info/LICENSE b/libs/rich-13.9.3.dist-info/LICENSE similarity index 100% rename from libs/rich-13.7.0.dist-info/LICENSE rename to libs/rich-13.9.3.dist-info/LICENSE diff --git a/libs/rich-13.7.0.dist-info/METADATA b/libs/rich-13.9.3.dist-info/METADATA similarity index 96% rename from libs/rich-13.7.0.dist-info/METADATA rename to libs/rich-13.9.3.dist-info/METADATA index f0b31e8e7..75dd54c56 100644 --- a/libs/rich-13.7.0.dist-info/METADATA +++ b/libs/rich-13.9.3.dist-info/METADATA @@ -1,12 +1,12 @@ Metadata-Version: 2.1 Name: rich -Version: 13.7.0 +Version: 13.9.3 Summary: Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal Home-page: https://github.com/Textualize/rich License: MIT Author: Will McGugan Author-email: willmcgugan@gmail.com -Requires-Python: >=3.7.0 +Requires-Python: >=3.8.0 Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Console Classifier: Framework :: IPython @@ -16,18 +16,18 @@ Classifier: Operating System :: MacOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: POSIX :: Linux 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 :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Typing :: Typed Provides-Extra: jupyter Requires-Dist: ipywidgets (>=7.5.1,<9) ; extra == "jupyter" Requires-Dist: markdown-it-py (>=2.2.0) Requires-Dist: pygments (>=2.13.0,<3.0.0) -Requires-Dist: typing-extensions (>=4.0.0,<5.0) ; python_version < "3.9" +Requires-Dist: typing-extensions (>=4.0.0,<5.0) ; python_version < "3.11" Project-URL: Documentation, https://rich.readthedocs.io/en/latest/ Description-Content-Type: text/markdown @@ -72,7 +72,7 @@ See what [people are saying about Rich](https://www.willmcgugan.com/blog/pages/p ## Compatibility -Rich works with Linux, OSX, and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.7 or later. +Rich works with Linux, macOS and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.8 or later. Rich works with [Jupyter notebooks](https://jupyter.org/) with no additional configuration required. @@ -471,11 +471,3 @@ See also Rich's sister project, [Textual](https://github.com/Textualize/textual) ![Textual screenshot](https://raw.githubusercontent.com/Textualize/textual/main/imgs/textual.png) -# Projects using Rich - -For some examples of projects using Rich, see the [Rich Gallery](https://www.textualize.io/rich/gallery) on [Textualize.io](https://www.textualize.io). - -Would you like to add your own project to the gallery? You can! Follow [these instructions](https://www.textualize.io/gallery-instructions). - -<!-- This is a test, no need to translate --> - diff --git a/libs/rich-13.7.0.dist-info/RECORD b/libs/rich-13.9.3.dist-info/RECORD similarity index 58% rename from libs/rich-13.7.0.dist-info/RECORD rename to libs/rich-13.9.3.dist-info/RECORD index ab5a6ef0d..1ffba4e7f 100644 --- a/libs/rich-13.7.0.dist-info/RECORD +++ b/libs/rich-13.9.3.dist-info/RECORD @@ -1,68 +1,68 @@ -rich-13.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -rich-13.7.0.dist-info/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056 -rich-13.7.0.dist-info/METADATA,sha256=F0xbgoukazzhEII4cfbUSAvzl6ndkKOba3OiNPElxaw,18636 -rich-13.7.0.dist-info/RECORD,, -rich-13.7.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rich-13.7.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 +rich-13.9.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +rich-13.9.3.dist-info/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056 +rich-13.9.3.dist-info/METADATA,sha256=EM8v3jLN43BfZK9latyDj32APbI6geXOQ_XQdPjigVQ,18274 +rich-13.9.3.dist-info/RECORD,, +rich-13.9.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rich-13.9.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 rich/__init__.py,sha256=lh2WcoIOJp5M5_lbAsSUMGv8oiJeumROazHH_AYMS8I,6066 rich/__main__.py,sha256=Wvh53rmOMyWeUeyqUHpn1PXsHlBc4TVcQnqrw46nf9Y,8333 -rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 +rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209 rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128 rich/_extension.py,sha256=G66PkbH_QdTJh6jD-J228O76CmAnr2hLQv72CgPPuzE,241 rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 -rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 +rich/_inspect.py,sha256=QM05lEFnFoTaFqpnbx-zBEI6k8oIKrD3cvjEOQNhKig,9655 rich/_log_render.py,sha256=xBKCxqiO4FZk8eG56f8crFdrmJxFrJsQE3V3F-fFekc,3213 rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 -rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 +rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394 rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 rich/_ratio.py,sha256=d2k38QnkJKhkHAqqSseqMQ-ZuvgbwnocRKhMQq84EdI,5459 rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 -rich/_win32_console.py,sha256=-NtealsQXQ558e-zpJtkwh8x_dqC-SjlAGA872dGE6U,22784 +rich/_win32_console.py,sha256=o2QN_IRx10biGP3Ap1neaqX8FBGlUKSmWM6Kw4OSg-U,22719 rich/_windows.py,sha256=is3WpbHMj8WaTHYB11hc6lP2t4hlvt4TViTlHSmjsi0,1901 rich/_windows_renderer.py,sha256=d799xOnxLbCCCzGu9-U7YLmIQkxtxQIBFQQ6iu4veSc,2759 rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404 rich/abc.py,sha256=dALMOGfKVNeAbvqq66IpTQxQUerxD7AE4FKwqd0eQKk,878 -rich/align.py,sha256=WNIpPPjG1HiLD2fUh5d11SHK5oXItu6UuwBk9t4CfZM,10320 -rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 +rich/align.py,sha256=gxlfgvi4ah8ERmg8RpGFtWY1Z4WBuWm-6qSIUSFx4bQ,10421 +rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921 rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263 rich/box.py,sha256=46rA0eBKLBcqNhCXmEKS4pN1dz36F0Vzi52hyVT-tyc,10783 -rich/cells.py,sha256=aMmGK4BjXhgE6_JF1ZEGmW3O7mKkE8g84vUnj4Et4To,4780 -rich/color.py,sha256=bCRATVdRe5IClJ6Hl62de2PKQ_U4i2MZ4ugjUEg7Tao,18223 +rich/cells.py,sha256=FqSod9dfvytgh9bds4iK7gz2KomzhDkvVRmuVF_m0Bk,4800 +rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211 rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 -rich/console.py,sha256=-grwb9o1UzI2wwNsuOJaLNdS_iJWrLVR6bDzq4vpSI4,99101 +rich/console.py,sha256=zgSwvRDPiDXh6wQ_kbnNSxff-s7uuljVmaTeoYPyh6E,100084 rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502 rich/control.py,sha256=Ix-rO8ZhSB2q1Biazr4l72ZyAw27H9or7ElipWVVo0M,6606 -rich/default_styles.py,sha256=iBE04bD6RJCVhlpUkeCnEnulmydZzKqVAxHM-GpoXBI,8046 +rich/default_styles.py,sha256=gY-aX6rUxxlxdOOt5CqxnltpFDQqqqdHuXwAy2OD1o8,8123 rich/diagnose.py,sha256=ZopD2EpWVtmmKptgbXT-sOMkAJ7DGrMSUXUiaU2GZ78,924 rich/emoji.py,sha256=1jTRHFwvQxY1ciul22MdEZcWc7brfjKT8FG6ZjXj5dM,2465 rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 -rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 -rich/highlighter.py,sha256=6ZAjUcNhBRajBCo9umFUclyi2xL0-55JL7S0vYGUJu4,9585 +rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484 +rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586 rich/json.py,sha256=omC2WHTgURxEosna1ftoSJCne2EX7MDuQtCdswS3qsk,5019 rich/jupyter.py,sha256=G9pOJmR4ESIFYSd4MKGqmHqCtstx0oRWpyeTgv54-Xc,3228 rich/layout.py,sha256=WR8PCSroYnteIT3zawxQ3k3ad1sQO5wGG1SZOoeBuBM,13944 -rich/live.py,sha256=vUcnJV2LMSK3sQNaILbm0-_B8BpAeiHfcQMAMLfpRe0,14271 +rich/live.py,sha256=DhzAPEnjTxQuq9_0Y2xh2MUwQcP_aGPkenLfKETslwM,14270 rich/live_render.py,sha256=QaiB8dtGikCdssoXpkEmmiH55fxT-9bzLkBO9pbBvrU,3654 -rich/logging.py,sha256=XEKUteCZhN7j0pmIngTOCBSY2GvuT4_4-F20-ibPrEk,11891 -rich/markdown.py,sha256=o4-JIwL2By88PPctt-HCC9-NZu33kX7Aj7ndE_bNKVE,26167 +rich/logging.py,sha256=aqZpsmIEE45-wbnZqWnEaNSdQ89cbGcaL26-ZV0poj0,12446 +rich/markdown.py,sha256=eDi7dMN7RQD5u21tuqCOSpNWGZdKmyGtKmaZNt257rA,25969 rich/markup.py,sha256=btpr271BLhiCR1jNglRnv2BpIzVcNefYwSMeW9teDbc,8427 rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 -rich/padding.py,sha256=8I1dQNQQK1iCjHtGBDEn78kRp3p27GYzl5UR3qB7e2E,4958 +rich/padding.py,sha256=h8XnIivLrNtlxI3vQPKHXh4hAwjOJqZx0slM0z3g1_M,4896 rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 rich/palette.py,sha256=Ar6ZUrYHiFt6-Rr2k-k9F8V7hxgJYHNdqjk2vVXsLgc,3288 -rich/panel.py,sha256=2Fd1V7e1kHxlPFIusoHY5T7-Cs0RpkrihgVG9ZVqJ4g,10705 -rich/pretty.py,sha256=2cT5KmcYVtbG3DS0Dd_va1xR5X4FU0WKjzFV7Q4IuJY,35812 -rich/progress.py,sha256=mc_7z0943s10GHDPHE7UIvb1SWY4scG4L6yk8dq0tVc,59703 -rich/progress_bar.py,sha256=L4jw8E6Qb_x-jhOrLVhkuMaPmiAhFIl8jHQbWFrKuR8,8164 -rich/prompt.py,sha256=C8Xkk7sYrHsai7ZajABFQT5xHRSHFl-sCu6MZFMhn8s,11292 +rich/panel.py,sha256=fFRHcviXvWhk3V3zx5Zwmsb_RL9KJ3esD-sU0NYEVyw,11235 +rich/pretty.py,sha256=eQs437AksYaCB2qO_d-z6e0DF_t5F1KfXfa1Hi-Ya0E,36355 +rich/progress.py,sha256=tLmBGHrAfxIQxfB2kq1IpNXTVFNuvl9bXd_QkLQUN8Q,60333 +rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162 +rich/prompt.py,sha256=k0CUIW-3I55jGk8U3O1WiEhdF6yXa2EiWeRqRhuJXWA,12435 rich/protocol.py,sha256=Wt-2HZd67OYiopUkCTOz7lM38vyo5r3HEQZ9TOPDl5Q,1367 rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 @@ -70,16 +70,16 @@ rich/repr.py,sha256=HIsurPLZK9Gray75l3_vQx7S27AzTpAj4ChXSfe1Fes,4419 rich/rule.py,sha256=umO21Wjw0FcYAeTB3UumNLCsDWhejzxnjlf2VwiXiDI,4590 rich/scope.py,sha256=lf6Qet_e4JOY34lwhYSAG-NBXYKBcYu6t_igv_JoGog,2831 rich/screen.py,sha256=rL_j2wX-4SeuIOI2oOlc418QP9EAvD59GInUmEAE6jQ,1579 -rich/segment.py,sha256=7dLrBSS3jBRjMO3IzBDQrKvqYfRCrx9WUDh2MMbuhjk,24210 -rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 +rich/segment.py,sha256=7gOdwSPrzu0a2gRmxBDtu3u2S8iG5s9l7wlB58dKMy0,24707 +rich/spinner.py,sha256=PT5qgXPG3ZpqRj7n3EZQ6NW56mx3ldZqZCU7gEMyZk4,4364 rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424 -rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 +rich/style.py,sha256=aSoUNbVgfP1PAnduAqgbbl4AMQy668qs2S1FEwr3Oqs,27067 rich/styled.py,sha256=wljVsVTXbABMMZvkzkO43ZEk_-irzEtvUiQ-sNnikQ8,1234 -rich/syntax.py,sha256=_9CGepyxl9Mu4vO2F_4RFEcPZYJNmaudkbl93CvGzRQ,35367 -rich/table.py,sha256=WtzTleWTo5kQkcibaGqYhbKQxyzoe9WtpO_8K5IpuyA,39644 +rich/syntax.py,sha256=NY1DRIqXBkFExudqxm5K3BJXFCttN63AF_3IZAvtLMg,35655 +rich/table.py,sha256=RX26U8oHV0s1U-gl6WqylfesmOT2qt7VVtMtC18-Pk0,40067 rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 -rich/text.py,sha256=sFFbpIkmtDMCuz5ilIqYaJQ2308ynXzutYUMQOaCgUk,47309 -rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 +rich/text.py,sha256=v-vCOG8gS_D5QDhOhU19478-yEJGAXKVi8iYCCk7O_M,47540 +rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771 rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 -rich/traceback.py,sha256=OTrtdHYPMCkHWcObufF9QtyCRvmNL_U1CXKKITp4hrE,29529 -rich/tree.py,sha256=ednhj4b1jHNadeEzADPVuemvgVClpjQuJR6v5htirI8,9107 +rich/traceback.py,sha256=hCLOig4Uwtc7f0FqseEkFZ8YUwzvGOli8BOG517mipg,31725 +rich/tree.py,sha256=QoOwg424FkdwGfR8K0tZ6Q7qtzWNAUP_m4sFaYuG6nw,9391 diff --git a/libs/rich-13.7.0.dist-info/REQUESTED b/libs/rich-13.9.3.dist-info/REQUESTED similarity index 100% rename from libs/rich-13.7.0.dist-info/REQUESTED rename to libs/rich-13.9.3.dist-info/REQUESTED diff --git a/libs/rich-13.9.3.dist-info/WHEEL b/libs/rich-13.9.3.dist-info/WHEEL new file mode 100644 index 000000000..8b9b3a1bf --- /dev/null +++ b/libs/rich-13.9.3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: poetry-core 1.9.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/libs/rich/_cell_widths.py b/libs/rich/_cell_widths.py index 36286df37..608ae3a75 100644 --- a/libs/rich/_cell_widths.py +++ b/libs/rich/_cell_widths.py @@ -4,6 +4,7 @@ (0, 0, 0), (1, 31, -1), (127, 159, -1), + (173, 173, 0), (768, 879, 0), (1155, 1161, 0), (1425, 1469, 0), @@ -11,13 +12,16 @@ (1473, 1474, 0), (1476, 1477, 0), (1479, 1479, 0), + (1536, 1541, 0), (1552, 1562, 0), + (1564, 1564, 0), (1611, 1631, 0), (1648, 1648, 0), - (1750, 1756, 0), + (1750, 1757, 0), (1759, 1764, 0), (1767, 1768, 0), (1770, 1773, 0), + (1807, 1807, 0), (1809, 1809, 0), (1840, 1866, 0), (1958, 1968, 0), @@ -28,149 +32,137 @@ (2085, 2087, 0), (2089, 2093, 0), (2137, 2139, 0), - (2259, 2273, 0), - (2275, 2306, 0), - (2362, 2362, 0), - (2364, 2364, 0), - (2369, 2376, 0), - (2381, 2381, 0), + (2192, 2193, 0), + (2200, 2207, 0), + (2250, 2307, 0), + (2362, 2364, 0), + (2366, 2383, 0), (2385, 2391, 0), (2402, 2403, 0), - (2433, 2433, 0), + (2433, 2435, 0), (2492, 2492, 0), - (2497, 2500, 0), - (2509, 2509, 0), + (2494, 2500, 0), + (2503, 2504, 0), + (2507, 2509, 0), + (2519, 2519, 0), (2530, 2531, 0), (2558, 2558, 0), - (2561, 2562, 0), + (2561, 2563, 0), (2620, 2620, 0), - (2625, 2626, 0), + (2622, 2626, 0), (2631, 2632, 0), (2635, 2637, 0), (2641, 2641, 0), (2672, 2673, 0), (2677, 2677, 0), - (2689, 2690, 0), + (2689, 2691, 0), (2748, 2748, 0), - (2753, 2757, 0), - (2759, 2760, 0), - (2765, 2765, 0), + (2750, 2757, 0), + (2759, 2761, 0), + (2763, 2765, 0), (2786, 2787, 0), (2810, 2815, 0), - (2817, 2817, 0), + (2817, 2819, 0), (2876, 2876, 0), - (2879, 2879, 0), - (2881, 2884, 0), - (2893, 2893, 0), - (2901, 2902, 0), + (2878, 2884, 0), + (2887, 2888, 0), + (2891, 2893, 0), + (2901, 2903, 0), (2914, 2915, 0), (2946, 2946, 0), - (3008, 3008, 0), - (3021, 3021, 0), - (3072, 3072, 0), - (3076, 3076, 0), - (3134, 3136, 0), + (3006, 3010, 0), + (3014, 3016, 0), + (3018, 3021, 0), + (3031, 3031, 0), + (3072, 3076, 0), + (3132, 3132, 0), + (3134, 3140, 0), (3142, 3144, 0), (3146, 3149, 0), (3157, 3158, 0), (3170, 3171, 0), - (3201, 3201, 0), + (3201, 3203, 0), (3260, 3260, 0), - (3263, 3263, 0), - (3270, 3270, 0), - (3276, 3277, 0), + (3262, 3268, 0), + (3270, 3272, 0), + (3274, 3277, 0), + (3285, 3286, 0), (3298, 3299, 0), - (3328, 3329, 0), + (3315, 3315, 0), + (3328, 3331, 0), (3387, 3388, 0), - (3393, 3396, 0), - (3405, 3405, 0), + (3390, 3396, 0), + (3398, 3400, 0), + (3402, 3405, 0), + (3415, 3415, 0), (3426, 3427, 0), - (3457, 3457, 0), + (3457, 3459, 0), (3530, 3530, 0), - (3538, 3540, 0), + (3535, 3540, 0), (3542, 3542, 0), + (3544, 3551, 0), + (3570, 3571, 0), (3633, 3633, 0), (3636, 3642, 0), (3655, 3662, 0), (3761, 3761, 0), (3764, 3772, 0), - (3784, 3789, 0), + (3784, 3790, 0), (3864, 3865, 0), (3893, 3893, 0), (3895, 3895, 0), (3897, 3897, 0), - (3953, 3966, 0), - (3968, 3972, 0), + (3902, 3903, 0), + (3953, 3972, 0), (3974, 3975, 0), (3981, 3991, 0), (3993, 4028, 0), (4038, 4038, 0), - (4141, 4144, 0), - (4146, 4151, 0), - (4153, 4154, 0), - (4157, 4158, 0), - (4184, 4185, 0), + (4139, 4158, 0), + (4182, 4185, 0), (4190, 4192, 0), + (4194, 4196, 0), + (4199, 4205, 0), (4209, 4212, 0), - (4226, 4226, 0), - (4229, 4230, 0), - (4237, 4237, 0), - (4253, 4253, 0), + (4226, 4237, 0), + (4239, 4239, 0), + (4250, 4253, 0), (4352, 4447, 2), + (4448, 4607, 0), (4957, 4959, 0), - (5906, 5908, 0), + (5906, 5909, 0), (5938, 5940, 0), (5970, 5971, 0), (6002, 6003, 0), - (6068, 6069, 0), - (6071, 6077, 0), - (6086, 6086, 0), - (6089, 6099, 0), + (6068, 6099, 0), (6109, 6109, 0), - (6155, 6157, 0), + (6155, 6159, 0), (6277, 6278, 0), (6313, 6313, 0), - (6432, 6434, 0), - (6439, 6440, 0), - (6450, 6450, 0), - (6457, 6459, 0), - (6679, 6680, 0), - (6683, 6683, 0), - (6742, 6742, 0), - (6744, 6750, 0), - (6752, 6752, 0), - (6754, 6754, 0), - (6757, 6764, 0), - (6771, 6780, 0), + (6432, 6443, 0), + (6448, 6459, 0), + (6679, 6683, 0), + (6741, 6750, 0), + (6752, 6780, 0), (6783, 6783, 0), - (6832, 6848, 0), - (6912, 6915, 0), - (6964, 6964, 0), - (6966, 6970, 0), - (6972, 6972, 0), - (6978, 6978, 0), + (6832, 6862, 0), + (6912, 6916, 0), + (6964, 6980, 0), (7019, 7027, 0), - (7040, 7041, 0), - (7074, 7077, 0), - (7080, 7081, 0), - (7083, 7085, 0), - (7142, 7142, 0), - (7144, 7145, 0), - (7149, 7149, 0), - (7151, 7153, 0), - (7212, 7219, 0), - (7222, 7223, 0), + (7040, 7042, 0), + (7073, 7085, 0), + (7142, 7155, 0), + (7204, 7223, 0), (7376, 7378, 0), - (7380, 7392, 0), - (7394, 7400, 0), + (7380, 7400, 0), (7405, 7405, 0), (7412, 7412, 0), - (7416, 7417, 0), - (7616, 7673, 0), - (7675, 7679, 0), + (7415, 7417, 0), + (7616, 7679, 0), (8203, 8207, 0), (8232, 8238, 0), - (8288, 8291, 0), + (8288, 8292, 0), + (8294, 8303, 0), (8400, 8432, 0), (8986, 8987, 2), (9001, 9002, 2), @@ -212,17 +204,16 @@ (11904, 11929, 2), (11931, 12019, 2), (12032, 12245, 2), - (12272, 12283, 2), - (12288, 12329, 2), - (12330, 12333, 0), - (12334, 12350, 2), + (12272, 12329, 2), + (12330, 12335, 0), + (12336, 12350, 2), (12353, 12438, 2), (12441, 12442, 0), (12443, 12543, 2), (12549, 12591, 2), (12593, 12686, 2), (12688, 12771, 2), - (12784, 12830, 2), + (12783, 12830, 2), (12832, 12871, 2), (12880, 19903, 2), (19968, 42124, 2), @@ -234,36 +225,33 @@ (43010, 43010, 0), (43014, 43014, 0), (43019, 43019, 0), - (43045, 43046, 0), + (43043, 43047, 0), (43052, 43052, 0), - (43204, 43205, 0), + (43136, 43137, 0), + (43188, 43205, 0), (43232, 43249, 0), (43263, 43263, 0), (43302, 43309, 0), - (43335, 43345, 0), + (43335, 43347, 0), (43360, 43388, 2), - (43392, 43394, 0), - (43443, 43443, 0), - (43446, 43449, 0), - (43452, 43453, 0), + (43392, 43395, 0), + (43443, 43456, 0), (43493, 43493, 0), - (43561, 43566, 0), - (43569, 43570, 0), - (43573, 43574, 0), + (43561, 43574, 0), (43587, 43587, 0), - (43596, 43596, 0), - (43644, 43644, 0), + (43596, 43597, 0), + (43643, 43645, 0), (43696, 43696, 0), (43698, 43700, 0), (43703, 43704, 0), (43710, 43711, 0), (43713, 43713, 0), - (43756, 43757, 0), - (43766, 43766, 0), - (44005, 44005, 0), - (44008, 44008, 0), - (44013, 44013, 0), + (43755, 43759, 0), + (43765, 43766, 0), + (44003, 44010, 0), + (44012, 44013, 0), (44032, 55203, 2), + (55216, 55295, 0), (63744, 64255, 2), (64286, 64286, 0), (65024, 65039, 0), @@ -272,8 +260,10 @@ (65072, 65106, 2), (65108, 65126, 2), (65128, 65131, 2), + (65279, 65279, 0), (65281, 65376, 2), (65504, 65510, 2), + (65529, 65531, 0), (66045, 66045, 0), (66272, 66272, 0), (66422, 66426, 0), @@ -285,102 +275,108 @@ (68325, 68326, 0), (68900, 68903, 0), (69291, 69292, 0), + (69373, 69375, 0), (69446, 69456, 0), - (69633, 69633, 0), + (69506, 69509, 0), + (69632, 69634, 0), (69688, 69702, 0), - (69759, 69761, 0), - (69811, 69814, 0), - (69817, 69818, 0), + (69744, 69744, 0), + (69747, 69748, 0), + (69759, 69762, 0), + (69808, 69818, 0), + (69821, 69821, 0), + (69826, 69826, 0), + (69837, 69837, 0), (69888, 69890, 0), - (69927, 69931, 0), - (69933, 69940, 0), + (69927, 69940, 0), + (69957, 69958, 0), (70003, 70003, 0), - (70016, 70017, 0), - (70070, 70078, 0), + (70016, 70018, 0), + (70067, 70080, 0), (70089, 70092, 0), - (70095, 70095, 0), - (70191, 70193, 0), - (70196, 70196, 0), - (70198, 70199, 0), + (70094, 70095, 0), + (70188, 70199, 0), (70206, 70206, 0), - (70367, 70367, 0), - (70371, 70378, 0), - (70400, 70401, 0), + (70209, 70209, 0), + (70367, 70378, 0), + (70400, 70403, 0), (70459, 70460, 0), - (70464, 70464, 0), + (70462, 70468, 0), + (70471, 70472, 0), + (70475, 70477, 0), + (70487, 70487, 0), + (70498, 70499, 0), (70502, 70508, 0), (70512, 70516, 0), - (70712, 70719, 0), - (70722, 70724, 0), - (70726, 70726, 0), + (70709, 70726, 0), (70750, 70750, 0), - (70835, 70840, 0), - (70842, 70842, 0), - (70847, 70848, 0), - (70850, 70851, 0), - (71090, 71093, 0), - (71100, 71101, 0), - (71103, 71104, 0), + (70832, 70851, 0), + (71087, 71093, 0), + (71096, 71104, 0), (71132, 71133, 0), - (71219, 71226, 0), - (71229, 71229, 0), - (71231, 71232, 0), - (71339, 71339, 0), - (71341, 71341, 0), - (71344, 71349, 0), - (71351, 71351, 0), - (71453, 71455, 0), - (71458, 71461, 0), - (71463, 71467, 0), - (71727, 71735, 0), - (71737, 71738, 0), - (71995, 71996, 0), - (71998, 71998, 0), - (72003, 72003, 0), - (72148, 72151, 0), - (72154, 72155, 0), - (72160, 72160, 0), + (71216, 71232, 0), + (71339, 71351, 0), + (71453, 71467, 0), + (71724, 71738, 0), + (71984, 71989, 0), + (71991, 71992, 0), + (71995, 71998, 0), + (72000, 72000, 0), + (72002, 72003, 0), + (72145, 72151, 0), + (72154, 72160, 0), + (72164, 72164, 0), (72193, 72202, 0), - (72243, 72248, 0), + (72243, 72249, 0), (72251, 72254, 0), (72263, 72263, 0), - (72273, 72278, 0), - (72281, 72283, 0), - (72330, 72342, 0), - (72344, 72345, 0), - (72752, 72758, 0), - (72760, 72765, 0), - (72767, 72767, 0), + (72273, 72283, 0), + (72330, 72345, 0), + (72751, 72758, 0), + (72760, 72767, 0), (72850, 72871, 0), - (72874, 72880, 0), - (72882, 72883, 0), - (72885, 72886, 0), + (72873, 72886, 0), (73009, 73014, 0), (73018, 73018, 0), (73020, 73021, 0), (73023, 73029, 0), (73031, 73031, 0), + (73098, 73102, 0), (73104, 73105, 0), - (73109, 73109, 0), - (73111, 73111, 0), - (73459, 73460, 0), + (73107, 73111, 0), + (73459, 73462, 0), + (73472, 73473, 0), + (73475, 73475, 0), + (73524, 73530, 0), + (73534, 73538, 0), + (78896, 78912, 0), + (78919, 78933, 0), (92912, 92916, 0), (92976, 92982, 0), (94031, 94031, 0), + (94033, 94087, 0), (94095, 94098, 0), (94176, 94179, 2), (94180, 94180, 0), - (94192, 94193, 2), + (94192, 94193, 0), (94208, 100343, 2), (100352, 101589, 2), (101632, 101640, 2), - (110592, 110878, 2), + (110576, 110579, 2), + (110581, 110587, 2), + (110589, 110590, 2), + (110592, 110882, 2), + (110898, 110898, 2), (110928, 110930, 2), + (110933, 110933, 2), (110948, 110951, 2), (110960, 111355, 2), (113821, 113822, 0), - (119143, 119145, 0), - (119163, 119170, 0), + (113824, 113827, 0), + (118528, 118573, 0), + (118576, 118598, 0), + (119141, 119145, 0), + (119149, 119170, 0), (119173, 119179, 0), (119210, 119213, 0), (119362, 119364, 0), @@ -395,8 +391,11 @@ (122907, 122913, 0), (122915, 122916, 0), (122918, 122922, 0), + (123023, 123023, 0), (123184, 123190, 0), + (123566, 123566, 0), (123628, 123631, 0), + (124140, 124143, 0), (125136, 125142, 0), (125252, 125258, 0), (126980, 126980, 2), @@ -416,7 +415,9 @@ (127951, 127955, 2), (127968, 127984, 2), (127988, 127988, 2), - (127992, 128062, 2), + (127992, 127994, 2), + (127995, 127999, 0), + (128000, 128062, 2), (128064, 128064, 2), (128066, 128252, 2), (128255, 128317, 2), @@ -430,22 +431,24 @@ (128716, 128716, 2), (128720, 128722, 2), (128725, 128727, 2), + (128732, 128735, 2), (128747, 128748, 2), (128756, 128764, 2), (128992, 129003, 2), + (129008, 129008, 2), (129292, 129338, 2), (129340, 129349, 2), - (129351, 129400, 2), - (129402, 129483, 2), - (129485, 129535, 2), - (129648, 129652, 2), - (129656, 129658, 2), - (129664, 129670, 2), - (129680, 129704, 2), - (129712, 129718, 2), - (129728, 129730, 2), - (129744, 129750, 2), + (129351, 129535, 2), + (129648, 129660, 2), + (129664, 129672, 2), + (129680, 129725, 2), + (129727, 129733, 2), + (129742, 129755, 2), + (129760, 129768, 2), + (129776, 129784, 2), (131072, 196605, 2), (196608, 262141, 2), + (917505, 917505, 0), + (917536, 917631, 0), (917760, 917999, 0), ] diff --git a/libs/rich/_inspect.py b/libs/rich/_inspect.py index 30446ceb3..e87698d1f 100644 --- a/libs/rich/_inspect.py +++ b/libs/rich/_inspect.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - import inspect from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union diff --git a/libs/rich/_null_file.py b/libs/rich/_null_file.py index b659673ef..6ae05d3e2 100644 --- a/libs/rich/_null_file.py +++ b/libs/rich/_null_file.py @@ -46,7 +46,7 @@ def __iter__(self) -> Iterator[str]: return iter([""]) def __enter__(self) -> IO[str]: - pass + return self def __exit__( self, diff --git a/libs/rich/_win32_console.py b/libs/rich/_win32_console.py index e969d8164..371ec09fa 100644 --- a/libs/rich/_win32_console.py +++ b/libs/rich/_win32_console.py @@ -2,6 +2,7 @@ The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions """ + import ctypes import sys from typing import Any @@ -380,7 +381,7 @@ def cursor_position(self) -> WindowsCoordinates: WindowsCoordinates: The current cursor position. """ coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition - return WindowsCoordinates(row=cast(int, coord.Y), col=cast(int, coord.X)) + return WindowsCoordinates(row=coord.Y, col=coord.X) @property def screen_size(self) -> WindowsCoordinates: @@ -390,9 +391,7 @@ def screen_size(self) -> WindowsCoordinates: WindowsCoordinates: The width and height of the screen as WindowsCoordinates. """ screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize - return WindowsCoordinates( - row=cast(int, screen_size.Y), col=cast(int, screen_size.X) - ) + return WindowsCoordinates(row=screen_size.Y, col=screen_size.X) def write_text(self, text: str) -> None: """Write text directly to the terminal without any modification of styles diff --git a/libs/rich/align.py b/libs/rich/align.py index e230a66b4..fac50b1e3 100644 --- a/libs/rich/align.py +++ b/libs/rich/align.py @@ -240,6 +240,7 @@ class VerticalCenter(JupyterMixin): Args: renderable (RenderableType): A renderable object. + style (StyleType, optional): An optional style to apply to the background. Defaults to None. """ def __init__( diff --git a/libs/rich/ansi.py b/libs/rich/ansi.py index 66365e653..7de86ce50 100644 --- a/libs/rich/ansi.py +++ b/libs/rich/ansi.py @@ -9,6 +9,7 @@ re_ansi = re.compile( r""" +(?:\x1b[0-?])| (?:\x1b\](.*?)\x1b\\)| (?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) """, diff --git a/libs/rich/cells.py b/libs/rich/cells.py index f85f928f7..17793eb5e 100644 --- a/libs/rich/cells.py +++ b/libs/rich/cells.py @@ -7,7 +7,9 @@ from ._cell_widths import CELL_WIDTHS # Regex to match sequence of the most common character ranges -_is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match +_is_single_cell_widths = re.compile( + "^[\u0020-\u007e\u00a0-\u02ff\u0370-\u0482\u2500-\u25FF]*$" +).match @lru_cache(4096) diff --git a/libs/rich/color.py b/libs/rich/color.py index 4270a278d..e2c23a6a9 100644 --- a/libs/rich/color.py +++ b/libs/rich/color.py @@ -1,5 +1,5 @@ -import platform import re +import sys from colorsys import rgb_to_hls from enum import IntEnum from functools import lru_cache @@ -15,7 +15,7 @@ from .text import Text -WINDOWS = platform.system() == "Windows" +WINDOWS = sys.platform == "win32" class ColorSystem(IntEnum): diff --git a/libs/rich/console.py b/libs/rich/console.py index 1232cd5ce..3ec9a8aab 100644 --- a/libs/rich/console.py +++ b/libs/rich/console.py @@ -1,6 +1,5 @@ import inspect import os -import platform import sys import threading import zlib @@ -76,7 +75,7 @@ JUPYTER_DEFAULT_COLUMNS = 115 JUPYTER_DEFAULT_LINES = 100 -WINDOWS = platform.system() == "Windows" +WINDOWS = sys.platform == "win32" HighlighterType = Callable[[Union[str, "Text"]], "Text"] JustifyMethod = Literal["default", "left", "center", "right", "full"] @@ -90,15 +89,15 @@ class NoChange: NO_CHANGE = NoChange() try: - _STDIN_FILENO = sys.__stdin__.fileno() + _STDIN_FILENO = sys.__stdin__.fileno() # type: ignore[union-attr] except Exception: _STDIN_FILENO = 0 try: - _STDOUT_FILENO = sys.__stdout__.fileno() + _STDOUT_FILENO = sys.__stdout__.fileno() # type: ignore[union-attr] except Exception: _STDOUT_FILENO = 1 try: - _STDERR_FILENO = sys.__stderr__.fileno() + _STDERR_FILENO = sys.__stderr__.fileno() # type: ignore[union-attr] except Exception: _STDERR_FILENO = 2 @@ -1006,19 +1005,14 @@ def size(self) -> ConsoleDimensions: width: Optional[int] = None height: Optional[int] = None - if WINDOWS: # pragma: no cover + streams = _STD_STREAMS_OUTPUT if WINDOWS else _STD_STREAMS + for file_descriptor in streams: try: - width, height = os.get_terminal_size() + width, height = os.get_terminal_size(file_descriptor) except (AttributeError, ValueError, OSError): # Probably not a terminal pass - else: - for file_descriptor in _STD_STREAMS: - try: - width, height = os.get_terminal_size(file_descriptor) - except (AttributeError, ValueError, OSError): - pass - else: - break + else: + break columns = self._environ.get("COLUMNS") if columns is not None and columns.isdigit(): @@ -1309,7 +1303,7 @@ def render( renderable = rich_cast(renderable) if hasattr(renderable, "__rich_console__") and not isclass(renderable): - render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] + render_iterable = renderable.__rich_console__(self, _options) elif isinstance(renderable, str): text_renderable = self.render_str( renderable, highlight=_options.highlight, markup=_options.markup @@ -1386,9 +1380,14 @@ def render_lines( extra_lines = render_options.height - len(lines) if extra_lines > 0: pad_line = [ - [Segment(" " * render_options.max_width, style), Segment("\n")] - if new_lines - else [Segment(" " * render_options.max_width, style)] + ( + [ + Segment(" " * render_options.max_width, style), + Segment("\n"), + ] + if new_lines + else [Segment(" " * render_options.max_width, style)] + ) ] lines.extend(pad_line * extra_lines) @@ -1437,9 +1436,11 @@ def render_str( rich_text.overflow = overflow else: rich_text = Text( - _emoji_replace(text, default_variant=self._emoji_variant) - if emoji_enabled - else text, + ( + _emoji_replace(text, default_variant=self._emoji_variant) + if emoji_enabled + else text + ), justify=justify, overflow=overflow, style=style, @@ -1536,7 +1537,11 @@ def check_text() -> None: if isinstance(renderable, str): append_text( self.render_str( - renderable, emoji=emoji, markup=markup, highlighter=_highlighter + renderable, + emoji=emoji, + markup=markup, + highlight=highlight, + highlighter=_highlighter, ) ) elif isinstance(renderable, Text): @@ -1986,6 +1991,20 @@ def log( ): buffer_extend(line) + def on_broken_pipe(self) -> None: + """This function is called when a `BrokenPipeError` is raised. + + This can occur when piping Textual output in Linux and macOS. + The default implementation is to exit the app, but you could implement + this method in a subclass to change the behavior. + + See https://docs.python.org/3/library/signal.html#note-on-sigpipe for details. + """ + self.quiet = True + devnull = os.open(os.devnull, os.O_WRONLY) + os.dup2(devnull, sys.stdout.fileno()) + raise SystemExit(1) + def _check_buffer(self) -> None: """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) Rendering is supported on Windows, Unix and Jupyter environments. For @@ -1995,8 +2014,17 @@ def _check_buffer(self) -> None: if self.quiet: del self._buffer[:] return + + try: + self._write_buffer() + except BrokenPipeError: + self.on_broken_pipe() + + def _write_buffer(self) -> None: + """Write the buffer to the output file.""" + with self._lock: - if self.record: + if self.record and not self._buffer_index: with self._record_buffer_lock: self._record_buffer.extend(self._buffer[:]) @@ -2166,7 +2194,7 @@ def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> N """ text = self.export_text(clear=clear, styles=styles) - with open(path, "wt", encoding="utf-8") as write_file: + with open(path, "w", encoding="utf-8") as write_file: write_file.write(text) def export_html( @@ -2272,7 +2300,7 @@ def save_html( code_format=code_format, inline_styles=inline_styles, ) - with open(path, "wt", encoding="utf-8") as write_file: + with open(path, "w", encoding="utf-8") as write_file: write_file.write(html) def export_svg( @@ -2561,7 +2589,7 @@ def save_svg( font_aspect_ratio=font_aspect_ratio, unique_id=unique_id, ) - with open(path, "wt", encoding="utf-8") as write_file: + with open(path, "w", encoding="utf-8") as write_file: write_file.write(svg) diff --git a/libs/rich/default_styles.py b/libs/rich/default_styles.py index ad72fff58..28e8f6f94 100644 --- a/libs/rich/default_styles.py +++ b/libs/rich/default_styles.py @@ -54,7 +54,7 @@ "logging.level.notset": Style(dim=True), "logging.level.debug": Style(color="green"), "logging.level.info": Style(color="blue"), - "logging.level.warning": Style(color="red"), + "logging.level.warning": Style(color="yellow"), "logging.level.error": Style(color="red", bold=True), "logging.level.critical": Style(color="red", bold=True, reverse=True), "log.level": Style.null(), @@ -120,6 +120,7 @@ "traceback.exc_type": Style(color="bright_red", bold=True), "traceback.exc_value": Style.null(), "traceback.offset": Style(color="bright_red", bold=True), + "traceback.error_range": Style(underline=True, bold=True, dim=False), "bar.back": Style(color="grey23"), "bar.complete": Style(color="rgb(249,38,114)"), "bar.finished": Style(color="rgb(114,156,31)"), diff --git a/libs/rich/filesize.py b/libs/rich/filesize.py index 99f118e20..83bc9118d 100644 --- a/libs/rich/filesize.py +++ b/libs/rich/filesize.py @@ -1,4 +1,3 @@ -# coding: utf-8 """Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 The functions declared in this module should cover the different @@ -27,7 +26,7 @@ def _to_str( if size == 1: return "1 byte" elif size < base: - return "{:,} bytes".format(size) + return f"{size:,} bytes" for i, suffix in enumerate(suffixes, 2): # noqa: B007 unit = base**i diff --git a/libs/rich/highlighter.py b/libs/rich/highlighter.py index 27714b25b..e4c462e2b 100644 --- a/libs/rich/highlighter.py +++ b/libs/rich/highlighter.py @@ -98,7 +98,7 @@ class ReprHighlighter(RegexHighlighter): r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[-+]?\d+?)?\b|0x[0-9a-fA-F]*)", r"(?P<path>\B(/[-\w._+]+)*\/)(?P<filename>[-\w._+]*)?", r"(?<![\\\w])(?P<str>b?'''.*?(?<!\\)'''|b?'.*?(?<!\\)'|b?\"\"\".*?(?<!\\)\"\"\"|b?\".*?(?<!\\)\")", - r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#~]*)", + r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#~@]*)", ), ] diff --git a/libs/rich/live.py b/libs/rich/live.py index f0529a781..8738cf09f 100644 --- a/libs/rich/live.py +++ b/libs/rich/live.py @@ -37,7 +37,7 @@ class Live(JupyterMixin, RenderHook): Args: renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing. - console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. + console (Console, optional): Optional Console instance. Defaults to an internal Console instance writing to stdout. screen (bool, optional): Enable alternate screen mode. Defaults to False. auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4. diff --git a/libs/rich/logging.py b/libs/rich/logging.py index 96859934e..b2624cd54 100644 --- a/libs/rich/logging.py +++ b/libs/rich/logging.py @@ -36,11 +36,13 @@ class RichHandler(Handler): markup (bool, optional): Enable console markup in log messages. Defaults to False. rich_tracebacks (bool, optional): Enable rich tracebacks with syntax highlighting and formatting. Defaults to False. tracebacks_width (Optional[int], optional): Number of characters used to render tracebacks, or None for full width. Defaults to None. + tracebacks_code_width (int, optional): Number of code characters used to render tracebacks, or None for full width. Defaults to 88. tracebacks_extra_lines (int, optional): Additional lines of code to render tracebacks, or None for full width. Defaults to None. tracebacks_theme (str, optional): Override pygments theme used in traceback. tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to True. tracebacks_show_locals (bool, optional): Enable display of locals in tracebacks. Defaults to False. tracebacks_suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + tracebacks_max_frames (int, optional): Optional maximum number of frames returned by traceback. locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. Defaults to 10. locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. @@ -74,11 +76,13 @@ def __init__( markup: bool = False, rich_tracebacks: bool = False, tracebacks_width: Optional[int] = None, + tracebacks_code_width: int = 88, tracebacks_extra_lines: int = 3, tracebacks_theme: Optional[str] = None, tracebacks_word_wrap: bool = True, tracebacks_show_locals: bool = False, tracebacks_suppress: Iterable[Union[str, ModuleType]] = (), + tracebacks_max_frames: int = 100, locals_max_length: int = 10, locals_max_string: int = 80, log_time_format: Union[str, FormatTimeCallable] = "[%x %X]", @@ -104,6 +108,8 @@ def __init__( self.tracebacks_word_wrap = tracebacks_word_wrap self.tracebacks_show_locals = tracebacks_show_locals self.tracebacks_suppress = tracebacks_suppress + self.tracebacks_max_frames = tracebacks_max_frames + self.tracebacks_code_width = tracebacks_code_width self.locals_max_length = locals_max_length self.locals_max_string = locals_max_string self.keywords = keywords @@ -140,6 +146,7 @@ def emit(self, record: LogRecord) -> None: exc_value, exc_traceback, width=self.tracebacks_width, + code_width=self.tracebacks_code_width, extra_lines=self.tracebacks_extra_lines, theme=self.tracebacks_theme, word_wrap=self.tracebacks_word_wrap, @@ -147,6 +154,7 @@ def emit(self, record: LogRecord) -> None: locals_max_length=self.locals_max_length, locals_max_string=self.locals_max_string, suppress=self.tracebacks_suppress, + max_frames=self.tracebacks_max_frames, ) message = record.getMessage() if self.formatter: diff --git a/libs/rich/markdown.py b/libs/rich/markdown.py index 9b5ceacd4..26c58d155 100644 --- a/libs/rich/markdown.py +++ b/libs/rich/markdown.py @@ -1,7 +1,7 @@ from __future__ import annotations import sys -from typing import ClassVar, Dict, Iterable, List, Optional, Type, Union +from typing import ClassVar, Iterable from markdown_it import MarkdownIt from markdown_it.token import Token @@ -31,7 +31,7 @@ class MarkdownElement: new_line: ClassVar[bool] = True @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": + def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: """Factory to create markdown element, Args: @@ -43,30 +43,28 @@ def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": """ return cls() - def on_enter(self, context: "MarkdownContext") -> None: + def on_enter(self, context: MarkdownContext) -> None: """Called when the node is entered. Args: context (MarkdownContext): The markdown context. """ - def on_text(self, context: "MarkdownContext", text: TextType) -> None: + def on_text(self, context: MarkdownContext, text: TextType) -> None: """Called when text is parsed. Args: context (MarkdownContext): The markdown context. """ - def on_leave(self, context: "MarkdownContext") -> None: + def on_leave(self, context: MarkdownContext) -> None: """Called when the parser leaves the element. Args: context (MarkdownContext): [description] """ - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: + def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool: """Called when a child element is closed. This method allows a parent element to take over rendering of its children. @@ -81,8 +79,8 @@ def on_child_close( return True def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": + self, console: Console, options: ConsoleOptions + ) -> RenderResult: return () @@ -100,14 +98,14 @@ class TextElement(MarkdownElement): style_name = "none" - def on_enter(self, context: "MarkdownContext") -> None: + def on_enter(self, context: MarkdownContext) -> None: self.style = context.enter_style(self.style_name) self.text = Text(justify="left") - def on_text(self, context: "MarkdownContext", text: TextType) -> None: + def on_text(self, context: MarkdownContext, text: TextType) -> None: self.text.append(text, context.current_style if isinstance(text, str) else None) - def on_leave(self, context: "MarkdownContext") -> None: + def on_leave(self, context: MarkdownContext) -> None: context.leave_style() @@ -118,7 +116,7 @@ class Paragraph(TextElement): justify: JustifyMethod @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "Paragraph": + def create(cls, markdown: Markdown, token: Token) -> Paragraph: return cls(justify=markdown.justify or "left") def __init__(self, justify: JustifyMethod) -> None: @@ -135,10 +133,10 @@ class Heading(TextElement): """A heading.""" @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "Heading": + def create(cls, markdown: Markdown, token: Token) -> Heading: return cls(token.tag) - def on_enter(self, context: "MarkdownContext") -> None: + def on_enter(self, context: MarkdownContext) -> None: self.text = Text() context.enter_style(self.style_name) @@ -172,7 +170,7 @@ class CodeBlock(TextElement): style_name = "markdown.code_block" @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "CodeBlock": + def create(cls, markdown: Markdown, token: Token) -> CodeBlock: node_info = token.info or "" lexer_name = node_info.partition(" ")[0] return cls(lexer_name or "text", markdown.code_theme) @@ -199,9 +197,7 @@ class BlockQuote(TextElement): def __init__(self) -> None: self.elements: Renderables = Renderables() - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: + def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool: self.elements.append(child) return False @@ -238,9 +234,7 @@ def __init__(self) -> None: self.header: TableHeaderElement | None = None self.body: TableBodyElement | None = None - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: + def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool: if isinstance(child, TableHeaderElement): self.header = child elif isinstance(child, TableBodyElement): @@ -272,9 +266,7 @@ class TableHeaderElement(MarkdownElement): def __init__(self) -> None: self.row: TableRowElement | None = None - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: + def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool: assert isinstance(child, TableRowElement) self.row = child return False @@ -286,9 +278,7 @@ class TableBodyElement(MarkdownElement): def __init__(self) -> None: self.rows: list[TableRowElement] = [] - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: + def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool: assert isinstance(child, TableRowElement) self.rows.append(child) return False @@ -298,11 +288,9 @@ class TableRowElement(MarkdownElement): """MarkdownElement corresponding to `tr_open` and `tr_close`.""" def __init__(self) -> None: - self.cells: List[TableDataElement] = [] + self.cells: list[TableDataElement] = [] - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: + def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool: assert isinstance(child, TableDataElement) self.cells.append(child) return False @@ -313,7 +301,7 @@ class TableDataElement(MarkdownElement): and `th_open` and `th_close`.""" @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": + def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: style = str(token.attrs.get("style")) or "" justify: JustifyMethod @@ -333,7 +321,7 @@ def __init__(self, justify: JustifyMethod) -> None: self.content: Text = Text("", justify=justify) self.justify = justify - def on_text(self, context: "MarkdownContext", text: TextType) -> None: + def on_text(self, context: MarkdownContext, text: TextType) -> None: text = Text(text) if isinstance(text, str) else text text.stylize(context.current_style) self.content.append_text(text) @@ -343,17 +331,15 @@ class ListElement(MarkdownElement): """A list element.""" @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "ListElement": + def create(cls, markdown: Markdown, token: Token) -> ListElement: return cls(token.type, int(token.attrs.get("start", 1))) def __init__(self, list_type: str, list_start: int | None) -> None: - self.items: List[ListItem] = [] + self.items: list[ListItem] = [] self.list_type = list_type self.list_start = list_start - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: + def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool: assert isinstance(child, ListItem) self.items.append(child) return False @@ -381,9 +367,7 @@ class ListItem(TextElement): def __init__(self) -> None: self.elements: Renderables = Renderables() - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: + def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool: self.elements.append(child) return False @@ -419,7 +403,7 @@ def render_number( class Link(TextElement): @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": + def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: url = token.attrs.get("href", "#") return cls(token.content, str(url)) @@ -434,7 +418,7 @@ class ImageItem(TextElement): new_line = False @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": + def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: """Factory to create markdown element, Args: @@ -449,10 +433,10 @@ def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": def __init__(self, destination: str, hyperlinks: bool) -> None: self.destination = destination self.hyperlinks = hyperlinks - self.link: Optional[str] = None + self.link: str | None = None super().__init__() - def on_enter(self, context: "MarkdownContext") -> None: + def on_enter(self, context: MarkdownContext) -> None: self.link = context.current_style.link self.text = Text(justify="left") super().on_enter(context) @@ -476,7 +460,7 @@ def __init__( console: Console, options: ConsoleOptions, style: Style, - inline_code_lexer: Optional[str] = None, + inline_code_lexer: str | None = None, inline_code_theme: str = "monokai", ) -> None: self.console = console @@ -484,7 +468,7 @@ def __init__( self.style_stack: StyleStack = StyleStack(style) self.stack: Stack[MarkdownElement] = Stack() - self._syntax: Optional[Syntax] = None + self._syntax: Syntax | None = None if inline_code_lexer is not None: self._syntax = Syntax("", inline_code_lexer, theme=inline_code_theme) @@ -504,7 +488,7 @@ def on_text(self, text: str, node_type: str) -> None: else: self.stack.top.on_text(self, text) - def enter_style(self, style_name: Union[str, Style]) -> Style: + def enter_style(self, style_name: str | Style) -> Style: """Enter a style context.""" style = self.console.get_style(style_name, default="none") self.style_stack.push(style) @@ -521,7 +505,7 @@ class Markdown(JupyterMixin): Args: markup (str): A string containing markdown. - code_theme (str, optional): Pygments theme for code blocks. Defaults to "monokai". + code_theme (str, optional): Pygments theme for code blocks. Defaults to "monokai". See https://pygments.org/styles/ for code themes. justify (JustifyMethod, optional): Justify value for paragraphs. Defaults to None. style (Union[str, Style], optional): Optional style to apply to markdown. hyperlinks (bool, optional): Enable hyperlinks. Defaults to ``True``. @@ -531,7 +515,7 @@ class Markdown(JupyterMixin): highlighting, or None for no highlighting. Defaults to None. """ - elements: ClassVar[Dict[str, Type[MarkdownElement]]] = { + elements: ClassVar[dict[str, type[MarkdownElement]]] = { "paragraph_open": Paragraph, "heading_open": Heading, "fence": CodeBlock, @@ -556,17 +540,17 @@ def __init__( self, markup: str, code_theme: str = "monokai", - justify: Optional[JustifyMethod] = None, - style: Union[str, Style] = "none", + justify: JustifyMethod | None = None, + style: str | Style = "none", hyperlinks: bool = True, - inline_code_lexer: Optional[str] = None, - inline_code_theme: Optional[str] = None, + inline_code_lexer: str | None = None, + inline_code_theme: str | None = None, ) -> None: parser = MarkdownIt().enable("strikethrough").enable("table") self.markup = markup self.parsed = parser.parse(markup) self.code_theme = code_theme - self.justify: Optional[JustifyMethod] = justify + self.justify: JustifyMethod | None = justify self.style = style self.hyperlinks = hyperlinks self.inline_code_lexer = inline_code_lexer @@ -693,7 +677,7 @@ def __rich_console__( and context.stack.top.on_child_close(context, element) ) if should_render: - if new_line: + if new_line and node_type != "inline": yield _new_line_segment yield from console.render(element, context.options) @@ -772,7 +756,7 @@ def __rich_console__( if args.path == "-": markdown_body = sys.stdin.read() else: - with open(args.path, "rt", encoding="utf-8") as markdown_file: + with open(args.path, encoding="utf-8") as markdown_file: markdown_body = markdown_file.read() markdown = Markdown( diff --git a/libs/rich/padding.py b/libs/rich/padding.py index 1d1f4a553..d1aa01bee 100644 --- a/libs/rich/padding.py +++ b/libs/rich/padding.py @@ -1,4 +1,4 @@ -from typing import cast, List, Optional, Tuple, TYPE_CHECKING, Union +from typing import TYPE_CHECKING, List, Optional, Tuple, Union if TYPE_CHECKING: from .console import ( @@ -7,11 +7,11 @@ RenderableType, RenderResult, ) + from .jupyter import JupyterMixin from .measure import Measurement -from .style import Style from .segment import Segment - +from .style import Style PaddingDimensions = Union[int, Tuple[int], Tuple[int, int], Tuple[int, int, int, int]] @@ -66,10 +66,10 @@ def unpack(pad: "PaddingDimensions") -> Tuple[int, int, int, int]: _pad = pad[0] return (_pad, _pad, _pad, _pad) if len(pad) == 2: - pad_top, pad_right = cast(Tuple[int, int], pad) + pad_top, pad_right = pad return (pad_top, pad_right, pad_top, pad_right) if len(pad) == 4: - top, right, bottom, left = cast(Tuple[int, int, int, int], pad) + top, right, bottom, left = pad return (top, right, bottom, left) raise ValueError(f"1, 2 or 4 integers required for padding; {len(pad)} given") diff --git a/libs/rich/panel.py b/libs/rich/panel.py index 95f4c84cf..8cfa6f4a2 100644 --- a/libs/rich/panel.py +++ b/libs/rich/panel.py @@ -22,11 +22,13 @@ class Panel(JupyterMixin): Args: renderable (RenderableType): A console renderable object. - box (Box, optional): A Box instance that defines the look of the border (see :ref:`appendix_box`. - Defaults to box.ROUNDED. + box (Box, optional): A Box instance that defines the look of the border (see :ref:`appendix_box`. Defaults to box.ROUNDED. + title (Optional[TextType], optional): Optional title displayed in panel header. Defaults to None. + title_align (AlignMethod, optional): Alignment of title. Defaults to "center". + subtitle (Optional[TextType], optional): Optional subtitle displayed in panel footer. Defaults to None. + subtitle_align (AlignMethod, optional): Alignment of subtitle. Defaults to "center". safe_box (bool, optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. - expand (bool, optional): If True the panel will stretch to fill the console - width, otherwise it will be sized to fit the contents. Defaults to True. + expand (bool, optional): If True the panel will stretch to fill the console width, otherwise it will be sized to fit the contents. Defaults to True. style (str, optional): The style of the panel (border and contents). Defaults to "none". border_style (str, optional): The style of the border. Defaults to "none". width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect. @@ -144,7 +146,8 @@ def __rich_console__( Padding(self.renderable, _padding) if any(_padding) else self.renderable ) style = console.get_style(self.style) - border_style = style + console.get_style(self.border_style) + partial_border_style = console.get_style(self.border_style) + border_style = style + partial_border_style width = ( options.max_width if self.width is None @@ -172,6 +175,9 @@ def align_text( text = text.copy() text.truncate(width) excess_space = width - cell_len(text.plain) + if text.style: + text.stylize(console.get_style(text.style)) + if excess_space: if align == "left": return Text.assemble( @@ -200,7 +206,7 @@ def align_text( title_text = self._title if title_text is not None: - title_text.stylize_before(border_style) + title_text.stylize_before(partial_border_style) child_width = ( width - 2 @@ -249,7 +255,7 @@ def align_text( subtitle_text = self._subtitle if subtitle_text is not None: - subtitle_text.stylize_before(border_style) + subtitle_text.stylize_before(partial_border_style) if subtitle_text is None or width <= 4: yield Segment(box.get_bottom([width - 2]), border_style) diff --git a/libs/rich/pretty.py b/libs/rich/pretty.py index 5c48cfd9f..5c725c0c5 100644 --- a/libs/rich/pretty.py +++ b/libs/rich/pretty.py @@ -3,6 +3,7 @@ import dataclasses import inspect import os +import reprlib import sys from array import array from collections import Counter, UserDict, UserList, defaultdict, deque @@ -15,6 +16,7 @@ Any, Callable, DefaultDict, + Deque, Dict, Iterable, List, @@ -77,7 +79,10 @@ def _is_dataclass_repr(obj: object) -> bool: # Digging in to a lot of internals here # Catching all exceptions in case something is missing on a non CPython implementation try: - return obj.__repr__.__code__.co_filename == dataclasses.__file__ + return obj.__repr__.__code__.co_filename in ( + dataclasses.__file__, + reprlib.__file__, + ) except Exception: # pragma: no coverage return False @@ -130,17 +135,19 @@ def _ipy_display_hook( if _safe_isinstance(value, ConsoleRenderable): console.line() console.print( - value - if _safe_isinstance(value, RichRenderable) - else Pretty( - value, - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, - margin=12, + ( + value + if _safe_isinstance(value, RichRenderable) + else Pretty( + value, + overflow=overflow, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + max_depth=max_depth, + expand_all=expand_all, + margin=12, + ) ), crop=crop, new_line_start=True, @@ -196,16 +203,18 @@ def display_hook(value: Any) -> None: assert console is not None builtins._ = None # type: ignore[attr-defined] console.print( - value - if _safe_isinstance(value, RichRenderable) - else Pretty( - value, - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, + ( + value + if _safe_isinstance(value, RichRenderable) + else Pretty( + value, + overflow=overflow, + indent_guides=indent_guides, + max_length=max_length, + max_string=max_string, + max_depth=max_depth, + expand_all=expand_all, + ) ), crop=crop, ) @@ -353,6 +362,16 @@ def _get_braces_for_defaultdict(_object: DefaultDict[Any, Any]) -> Tuple[str, st ) +def _get_braces_for_deque(_object: Deque[Any]) -> Tuple[str, str, str]: + if _object.maxlen is None: + return ("deque([", "])", "deque()") + return ( + "deque([", + f"], maxlen={_object.maxlen})", + f"deque(maxlen={_object.maxlen})", + ) + + def _get_braces_for_array(_object: "array[Any]") -> Tuple[str, str, str]: return (f"array({_object.typecode!r}, [", "])", f"array({_object.typecode!r})") @@ -362,7 +381,7 @@ def _get_braces_for_array(_object: "array[Any]") -> Tuple[str, str, str]: array: _get_braces_for_array, defaultdict: _get_braces_for_defaultdict, Counter: lambda _object: ("Counter({", "})", "Counter()"), - deque: lambda _object: ("deque([", "])", "deque()"), + deque: _get_braces_for_deque, dict: lambda _object: ("{", "}", "{}"), UserDict: lambda _object: ("{", "}", "{}"), frozenset: lambda _object: ("frozenset({", "})", "frozenset()"), @@ -762,7 +781,9 @@ def iter_attrs() -> ( ) for last, field in loop_last( - field for field in fields(obj) if field.repr + field + for field in fields(obj) + if field.repr and hasattr(obj, field.name) ): child_node = _traverse(getattr(obj, field.name), depth=depth + 1) child_node.key_repr = field.name @@ -846,7 +867,7 @@ def iter_attrs() -> ( pop_visited(obj_id) else: node = Node(value_repr=to_repr(obj), last=root) - node.is_tuple = _safe_isinstance(obj, tuple) + node.is_tuple = type(obj) == tuple node.is_namedtuple = _is_namedtuple(obj) return node diff --git a/libs/rich/progress.py b/libs/rich/progress.py index 8810aeac4..1e92eb6b1 100644 --- a/libs/rich/progress.py +++ b/libs/rich/progress.py @@ -39,6 +39,11 @@ else: from typing_extensions import Literal # pragma: no cover +if sys.version_info >= (3, 11): + from typing import Self +else: + from typing_extensions import Self # pragma: no cover + from . import filesize, get_console from .console import Console, Group, JustifyMethod, RenderableType from .highlighter import Highlighter @@ -70,7 +75,7 @@ def __init__(self, progress: "Progress", task_id: "TaskID", update_period: float self.done = Event() self.completed = 0 - super().__init__() + super().__init__(daemon=True) def run(self) -> None: task_id = self.task_id @@ -78,7 +83,7 @@ def run(self) -> None: update_period = self.update_period last_completed = 0 wait = self.done.wait - while not wait(update_period): + while not wait(update_period) and self.progress.live.is_started: completed = self.completed if last_completed != completed: advance(task_id, completed - last_completed) @@ -104,6 +109,7 @@ def track( sequence: Union[Sequence[ProgressType], Iterable[ProgressType]], description: str = "Working...", total: Optional[float] = None, + completed: int = 0, auto_refresh: bool = True, console: Optional[Console] = None, transient: bool = False, @@ -123,6 +129,7 @@ def track( sequence (Iterable[ProgressType]): A sequence (must support "len") you wish to iterate over. description (str, optional): Description of task show next to progress bar. Defaults to "Working". total: (float, optional): Total number of steps. Default is len(sequence). + completed (int, optional): Number of steps completed so far. Defaults to 0. auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. transient: (bool, optional): Clear the progress on exit. Defaults to False. console (Console, optional): Console to write to. Default creates internal Console instance. @@ -166,7 +173,11 @@ def track( with progress: yield from progress.track( - sequence, total=total, description=description, update_period=update_period + sequence, + total=total, + completed=completed, + description=description, + update_period=update_period, ) @@ -269,6 +280,9 @@ def tell(self) -> int: def write(self, s: Any) -> int: raise UnsupportedOperation("write") + def writelines(self, lines: Iterable[Any]) -> None: + raise UnsupportedOperation("writelines") + class _ReadContext(ContextManager[_I], Generic[_I]): """A utility class to handle a context for both a reader and a progress.""" @@ -1050,7 +1064,7 @@ class Progress(JupyterMixin): """Renders an auto-updating progress bar(s). Args: - console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. + console (Console, optional): Optional Console instance. Defaults to an internal Console instance writing to stdout. auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`. refresh_per_second (Optional[float], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None. speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30. @@ -1161,10 +1175,10 @@ def start(self) -> None: def stop(self) -> None: """Stop the progress display.""" self.live.stop() - if not self.console.is_interactive: + if not self.console.is_interactive and not self.console.is_jupyter: self.console.print() - def __enter__(self) -> "Progress": + def __enter__(self) -> Self: self.start() return self @@ -1180,6 +1194,7 @@ def track( self, sequence: Union[Iterable[ProgressType], Sequence[ProgressType]], total: Optional[float] = None, + completed: int = 0, task_id: Optional[TaskID] = None, description: str = "Working...", update_period: float = 0.1, @@ -1189,6 +1204,7 @@ def track( Args: sequence (Sequence[ProgressType]): A sequence of values you want to iterate over and track progress. total: (float, optional): Total number of steps. Default is len(sequence). + completed (int, optional): Number of steps completed so far. Defaults to 0. task_id: (TaskID): Task to track. Default is new task. description: (str, optional): Description of task, if new task is created. update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. @@ -1200,9 +1216,9 @@ def track( total = float(length_hint(sequence)) or None if task_id is None: - task_id = self.add_task(description, total=total) + task_id = self.add_task(description, total=total, completed=completed) else: - self.update(task_id, total=total) + self.update(task_id, total=total, completed=completed) if self.live.auto_refresh: with _TrackThread(self, task_id, update_period) as track_thread: @@ -1326,7 +1342,7 @@ def open( # normalize the mode (always rb, rt) _mode = "".join(sorted(mode, reverse=False)) if _mode not in ("br", "rt", "r"): - raise ValueError("invalid mode {!r}".format(mode)) + raise ValueError(f"invalid mode {mode!r}") # patch buffering to provide the same behaviour as the builtin `open` line_buffering = buffering == 1 diff --git a/libs/rich/progress_bar.py b/libs/rich/progress_bar.py index a2bf32614..41794f767 100644 --- a/libs/rich/progress_bar.py +++ b/libs/rich/progress_bar.py @@ -108,7 +108,7 @@ def _get_pulse_segments( for index in range(PULSE_SIZE): position = index / PULSE_SIZE - fade = 0.5 + cos((position * pi * 2)) / 2.0 + fade = 0.5 + cos(position * pi * 2) / 2.0 color = blend_rgb(fore_color, back_color, cross_fade=fade) append(_Segment(bar, _Style(color=from_triplet(color)))) return segments diff --git a/libs/rich/prompt.py b/libs/rich/prompt.py index 972082b72..c7cf25bae 100644 --- a/libs/rich/prompt.py +++ b/libs/rich/prompt.py @@ -36,6 +36,7 @@ class PromptBase(Generic[PromptType]): console (Console, optional): A Console instance or None to use global console. Defaults to None. password (bool, optional): Enable password input. Defaults to False. choices (List[str], optional): A list of valid choices. Defaults to None. + case_sensitive (bool, optional): Matching of choices should be case-sensitive. Defaults to True. show_default (bool, optional): Show default in prompt. Defaults to True. show_choices (bool, optional): Show choices in prompt. Defaults to True. """ @@ -57,6 +58,7 @@ def __init__( console: Optional[Console] = None, password: bool = False, choices: Optional[List[str]] = None, + case_sensitive: bool = True, show_default: bool = True, show_choices: bool = True, ) -> None: @@ -69,6 +71,7 @@ def __init__( self.password = password if choices is not None: self.choices = choices + self.case_sensitive = case_sensitive self.show_default = show_default self.show_choices = show_choices @@ -81,6 +84,7 @@ def ask( console: Optional[Console] = None, password: bool = False, choices: Optional[List[str]] = None, + case_sensitive: bool = True, show_default: bool = True, show_choices: bool = True, default: DefaultType, @@ -97,6 +101,7 @@ def ask( console: Optional[Console] = None, password: bool = False, choices: Optional[List[str]] = None, + case_sensitive: bool = True, show_default: bool = True, show_choices: bool = True, stream: Optional[TextIO] = None, @@ -111,6 +116,7 @@ def ask( console: Optional[Console] = None, password: bool = False, choices: Optional[List[str]] = None, + case_sensitive: bool = True, show_default: bool = True, show_choices: bool = True, default: Any = ..., @@ -126,6 +132,7 @@ def ask( console (Console, optional): A Console instance or None to use global console. Defaults to None. password (bool, optional): Enable password input. Defaults to False. choices (List[str], optional): A list of valid choices. Defaults to None. + case_sensitive (bool, optional): Matching of choices should be case-sensitive. Defaults to True. show_default (bool, optional): Show default in prompt. Defaults to True. show_choices (bool, optional): Show choices in prompt. Defaults to True. stream (TextIO, optional): Optional text file open for reading to get input. Defaults to None. @@ -135,6 +142,7 @@ def ask( console=console, password=password, choices=choices, + case_sensitive=case_sensitive, show_default=show_default, show_choices=show_choices, ) @@ -212,7 +220,9 @@ def check_choice(self, value: str) -> bool: bool: True if choice was valid, otherwise False. """ assert self.choices is not None - return value.strip() in self.choices + if self.case_sensitive: + return value.strip() in self.choices + return value.strip().lower() in [choice.lower() for choice in self.choices] def process_response(self, value: str) -> PromptType: """Process response from user, convert to prompt type. @@ -232,9 +242,17 @@ def process_response(self, value: str) -> PromptType: except ValueError: raise InvalidResponse(self.validate_error_message) - if self.choices is not None and not self.check_choice(value): - raise InvalidResponse(self.illegal_choice_message) - + if self.choices is not None: + if not self.check_choice(value): + raise InvalidResponse(self.illegal_choice_message) + + if not self.case_sensitive: + # return the original choice, not the lower case version + return_value = self.response_type( + self.choices[ + [choice.lower() for choice in self.choices].index(value.lower()) + ] + ) return return_value def on_validate_error(self, value: str, error: InvalidResponse) -> None: @@ -371,5 +389,12 @@ def process_response(self, value: str) -> bool: fruit = Prompt.ask("Enter a fruit", choices=["apple", "orange", "pear"]) print(f"fruit={fruit!r}") + doggie = Prompt.ask( + "What's the best Dog? (Case INSENSITIVE)", + choices=["Border Terrier", "Collie", "Labradoodle"], + case_sensitive=False, + ) + print(f"doggie={doggie!r}") + else: print("[b]OK :loudly_crying_face:") diff --git a/libs/rich/segment.py b/libs/rich/segment.py index 603d5097f..edcb52dd3 100644 --- a/libs/rich/segment.py +++ b/libs/rich/segment.py @@ -109,41 +109,51 @@ def is_control(self) -> bool: @classmethod @lru_cache(1024 * 16) def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]: + """Split a segment in to two at a given cell position. + + Note that splitting a double-width character, may result in that character turning + into two spaces. + + Args: + segment (Segment): A segment to split. + cut (int): A cell position to cut on. + + Returns: + A tuple of two segments. + """ text, style, control = segment _Segment = Segment - cell_length = segment.cell_length if cut >= cell_length: return segment, _Segment("", style, control) cell_size = get_character_cell_size - pos = int((cut / cell_length) * (len(text) - 1)) + pos = int((cut / cell_length) * len(text)) - before = text[:pos] - cell_pos = cell_len(before) - if cell_pos == cut: - return ( - _Segment(before, style, control), - _Segment(text[pos:], style, control), - ) - while pos < len(text): - char = text[pos] - pos += 1 - cell_pos += cell_size(char) + while True: before = text[:pos] - if cell_pos == cut: + cell_pos = cell_len(before) + out_by = cell_pos - cut + if not out_by: return ( _Segment(before, style, control), _Segment(text[pos:], style, control), ) - if cell_pos > cut: + if out_by == -1 and cell_size(text[pos]) == 2: + return ( + _Segment(text[:pos] + " ", style, control), + _Segment(" " + text[pos + 1 :], style, control), + ) + if out_by == +1 and cell_size(text[pos - 1]) == 2: return ( - _Segment(before[: pos - 1] + " ", style, control), + _Segment(text[: pos - 1] + " ", style, control), _Segment(" " + text[pos:], style, control), ) - - raise AssertionError("Will never reach here") + if cell_pos < cut: + pos += 1 + else: + pos -= 1 def split_cells(self, cut: int) -> Tuple["Segment", "Segment"]: """Split segment in to two segments at the specified column. @@ -151,10 +161,14 @@ def split_cells(self, cut: int) -> Tuple["Segment", "Segment"]: If the cut point falls in the middle of a 2-cell wide character then it is replaced by two spaces, to preserve the display width of the parent segment. + Args: + cut (int): Offset within the segment to cut. + Returns: Tuple[Segment, Segment]: Two segments. """ text, style, control = self + assert cut >= 0 if _is_single_cell_widths(text): # Fast path with all 1 cell characters @@ -604,7 +618,7 @@ def divide( while True: cut = next(iter_cuts, -1) if cut == -1: - return [] + return if cut != 0: break yield [] diff --git a/libs/rich/spinner.py b/libs/rich/spinner.py index 91ea630e1..70570b6b0 100644 --- a/libs/rich/spinner.py +++ b/libs/rich/spinner.py @@ -38,6 +38,7 @@ def __init__( self.text: "Union[RenderableType, Text]" = ( Text.from_markup(text) if isinstance(text, str) else text ) + self.name = name self.frames = cast(List[str], spinner["frames"])[:] self.interval = cast(float, spinner["interval"]) self.start_time: Optional[float] = None diff --git a/libs/rich/style.py b/libs/rich/style.py index 313c88949..262fd6eca 100644 --- a/libs/rich/style.py +++ b/libs/rich/style.py @@ -663,7 +663,7 @@ def clear_meta_and_links(self) -> "Style": style._set_attributes = self._set_attributes style._link = None style._link_id = "" - style._hash = self._hash + style._hash = None style._null = False style._meta = None return style diff --git a/libs/rich/syntax.py b/libs/rich/syntax.py index 618e0459f..cff8fd235 100644 --- a/libs/rich/syntax.py +++ b/libs/rich/syntax.py @@ -1,5 +1,4 @@ import os.path -import platform import re import sys import textwrap @@ -52,7 +51,7 @@ TokenType = Tuple[str, ...] -WINDOWS = platform.system() == "Windows" +WINDOWS = sys.platform == "win32" DEFAULT_THEME = "monokai" # The following styles are based on https://github.com/pygments/pygments/blob/master/pygments/formatters/terminal.py @@ -222,6 +221,7 @@ class _SyntaxHighlightRange(NamedTuple): style: StyleType start: SyntaxPosition end: SyntaxPosition + style_before: bool = False class Syntax(JupyterMixin): @@ -535,7 +535,11 @@ def tokens_to_spans() -> Iterable[Tuple[str, Optional[Style]]]: return text def stylize_range( - self, style: StyleType, start: SyntaxPosition, end: SyntaxPosition + self, + style: StyleType, + start: SyntaxPosition, + end: SyntaxPosition, + style_before: bool = False, ) -> None: """ Adds a custom style on a part of the code, that will be applied to the syntax display when it's rendered. @@ -545,8 +549,11 @@ def stylize_range( style (StyleType): The style to apply. start (Tuple[int, int]): The start of the range, in the form `[line number, column index]`. end (Tuple[int, int]): The end of the range, in the form `[line number, column index]`. + style_before (bool): Apply the style before any existing styles. """ - self._stylized_ranges.append(_SyntaxHighlightRange(style, start, end)) + self._stylized_ranges.append( + _SyntaxHighlightRange(style, start, end, style_before) + ) def _get_line_numbers_color(self, blend: float = 0.3) -> Color: background_style = self._theme.get_background_style() + self.background_style @@ -620,9 +627,7 @@ def __rich_console__( ) -> RenderResult: segments = Segments(self._get_syntax(console, options)) if self.padding: - yield Padding( - segments, style=self._theme.get_background_style(), pad=self.padding - ) + yield Padding(segments, style=self._get_base_style(), pad=self.padding) else: yield segments @@ -788,7 +793,10 @@ def _apply_stylized_ranges(self, text: Text) -> None: newlines_offsets, stylized_range.end ) if start is not None and end is not None: - text.stylize(stylized_range.style, start, end) + if stylized_range.style_before: + text.stylize_before(stylized_range.style, start, end) + else: + text.stylize(stylized_range.style, start, end) def _process_code(self, code: str) -> Tuple[bool, str]: """ diff --git a/libs/rich/table.py b/libs/rich/table.py index 5fc5ace0b..7b1fa9e4b 100644 --- a/libs/rich/table.py +++ b/libs/rich/table.py @@ -54,7 +54,7 @@ class Column: show_footer (bool, optional): Show a footer row. Defaults to False. show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. show_lines (bool, optional): Draw lines between every row. Defaults to False. - leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. + leading (int, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. style (Union[str, Style], optional): Default style for the table. Defaults to "none". row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". @@ -106,6 +106,9 @@ class Column: no_wrap: bool = False """bool: Prevent wrapping of text within the column. Defaults to ``False``.""" + highlight: bool = False + """bool: Apply highlighter to column. Defaults to ``False``.""" + _index: int = 0 """Index of column.""" @@ -167,7 +170,7 @@ class Table(JupyterMixin): show_footer (bool, optional): Show a footer row. Defaults to False. show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. show_lines (bool, optional): Draw lines between every row. Defaults to False. - leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. + leading (int, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. style (Union[str, Style], optional): Default style for the table. Defaults to "none". row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". @@ -365,6 +368,7 @@ def add_column( footer: "RenderableType" = "", *, header_style: Optional[StyleType] = None, + highlight: Optional[bool] = None, footer_style: Optional[StyleType] = None, style: Optional[StyleType] = None, justify: "JustifyMethod" = "left", @@ -384,6 +388,7 @@ def add_column( footer (RenderableType, optional): Text or renderable for the footer. Defaults to "". header_style (Union[str, Style], optional): Style for the header, or None for default. Defaults to None. + highlight (bool, optional): Whether to highlight the text. The default of None uses the value of the table (self) object. footer_style (Union[str, Style], optional): Style for the footer, or None for default. Defaults to None. style (Union[str, Style], optional): Style for the column cells, or None for default. Defaults to None. justify (JustifyMethod, optional): Alignment for cells. Defaults to "left". @@ -401,6 +406,7 @@ def add_column( header=header, footer=footer, header_style=header_style or "", + highlight=highlight if highlight is not None else self.highlight, footer_style=footer_style or "", style=style or "", justify=justify, @@ -445,7 +451,7 @@ def add_cell(column: Column, renderable: "RenderableType") -> None: ] for index, renderable in enumerate(cell_renderables): if index == len(columns): - column = Column(_index=index) + column = Column(_index=index, highlight=self.highlight) for _ in self.rows: add_cell(column, Text("")) self.columns.append(column) @@ -775,16 +781,16 @@ def _render( _Segment(_box.head_right, border_style), _Segment(_box.head_vertical, border_style), ), - ( - _Segment(_box.foot_left, border_style), - _Segment(_box.foot_right, border_style), - _Segment(_box.foot_vertical, border_style), - ), ( _Segment(_box.mid_left, border_style), _Segment(_box.mid_right, border_style), _Segment(_box.mid_vertical, border_style), ), + ( + _Segment(_box.foot_left, border_style), + _Segment(_box.foot_right, border_style), + _Segment(_box.foot_vertical, border_style), + ), ] if show_edge: yield _Segment(_box.get_top(widths), border_style) @@ -818,6 +824,7 @@ def _render( no_wrap=column.no_wrap, overflow=column.overflow, height=None, + highlight=column.highlight, ) lines = console.render_lines( cell.renderable, diff --git a/libs/rich/text.py b/libs/rich/text.py index 7091e4291..b57d77c27 100644 --- a/libs/rich/text.py +++ b/libs/rich/text.py @@ -11,6 +11,7 @@ List, NamedTuple, Optional, + Pattern, Tuple, Union, ) @@ -38,7 +39,7 @@ _re_whitespace = re.compile(r"\s+$") TextType = Union[str, "Text"] -"""A plain string or a [Text][rich.text.Text] instance.""" +"""A plain string or a :class:`Text` instance.""" GetStyleCallable = Callable[[str], Optional[StyleType]] @@ -173,7 +174,7 @@ def __str__(self) -> str: return self.plain def __repr__(self) -> str: - return f"<text {self.plain!r} {self._spans!r}>" + return f"<text {self.plain!r} {self._spans!r} {self.style!r}>" def __add__(self, other: Any) -> "Text": if isinstance(other, (str, Text)): @@ -591,7 +592,7 @@ def extend_style(self, spaces: int) -> None: def highlight_regex( self, - re_highlight: str, + re_highlight: Union[Pattern[str], str], style: Optional[Union[GetStyleCallable, StyleType]] = None, *, style_prefix: str = "", @@ -600,7 +601,7 @@ def highlight_regex( translated to styles. Args: - re_highlight (str): A regular expression. + re_highlight (Union[re.Pattern, str]): A regular expression object or string. style (Union[GetStyleCallable, StyleType]): Optional style to apply to whole match, or a callable which accepts the matched text and returns a style. Defaults to None. style_prefix (str, optional): Optional prefix to add to style group names. @@ -612,7 +613,9 @@ def highlight_regex( append_span = self._spans.append _Span = Span plain = self.plain - for match in re.finditer(re_highlight, plain): + if isinstance(re_highlight, str): + re_highlight = re.compile(re_highlight) + for match in re_highlight.finditer(plain): get_span = match.span if style: start, end = get_span() @@ -998,7 +1001,7 @@ def append( self._text.append(text.plain) self._spans.extend( _Span(start + text_length, end + text_length, style) - for start, end, style in text._spans + for start, end, style in text._spans.copy() ) self._length += len(text) return self @@ -1020,7 +1023,7 @@ def append_text(self, text: "Text") -> "Text": self._text.append(text.plain) self._spans.extend( _Span(start + text_length, end + text_length, style) - for start, end, style in text._spans + for start, end, style in text._spans.copy() ) self._length += len(text) return self @@ -1041,6 +1044,7 @@ def append_tokens( _Span = Span offset = len(self) for content, style in tokens: + content = strip_control_codes(content) append_text(content) if style: append_span(_Span(offset, offset + len(content), style)) diff --git a/libs/rich/theme.py b/libs/rich/theme.py index 471dfb2f9..227f1d863 100644 --- a/libs/rich/theme.py +++ b/libs/rich/theme.py @@ -1,5 +1,5 @@ import configparser -from typing import Dict, List, IO, Mapping, Optional +from typing import IO, Dict, List, Mapping, Optional from .default_styles import DEFAULT_STYLES from .style import Style, StyleType @@ -69,7 +69,7 @@ def read( Returns: Theme: A new theme instance. """ - with open(path, "rt", encoding=encoding) as config_file: + with open(path, encoding=encoding) as config_file: return cls.from_file(config_file, source=path, inherit=inherit) diff --git a/libs/rich/traceback.py b/libs/rich/traceback.py index 821c7501a..3bf5baa7b 100644 --- a/libs/rich/traceback.py +++ b/libs/rich/traceback.py @@ -1,10 +1,9 @@ -from __future__ import absolute_import - +import inspect import linecache import os -import platform import sys from dataclasses import dataclass, field +from itertools import islice from traceback import walk_tb from types import ModuleType, TracebackType from typing import ( @@ -39,7 +38,7 @@ from .text import Text from .theme import Theme -WINDOWS = platform.system() == "Windows" +WINDOWS = sys.platform == "win32" LOCALS_MAX_LENGTH = 10 LOCALS_MAX_STRING = 80 @@ -49,6 +48,7 @@ def install( *, console: Optional[Console] = None, width: Optional[int] = 100, + code_width: Optional[int] = 88, extra_lines: int = 3, theme: Optional[str] = None, word_wrap: bool = False, @@ -69,6 +69,7 @@ def install( Args: console (Optional[Console], optional): Console to write exception to. Default uses internal Console instance. width (Optional[int], optional): Width (in characters) of traceback. Defaults to 100. + code_width (Optional[int], optional): Code width (in characters) of traceback. Defaults to 88. extra_lines (int, optional): Extra lines of code. Defaults to 3. theme (Optional[str], optional): Pygments theme to use in traceback. Defaults to ``None`` which will pick a theme appropriate for the platform. @@ -105,6 +106,7 @@ def excepthook( value, traceback, width=width, + code_width=code_width, extra_lines=extra_lines, theme=theme, word_wrap=word_wrap, @@ -179,6 +181,7 @@ class Frame: name: str line: str = "" locals: Optional[Dict[str, pretty.Node]] = None + last_instruction: Optional[Tuple[Tuple[int, int], Tuple[int, int]]] = None @dataclass @@ -215,6 +218,7 @@ class Traceback: trace (Trace, optional): A `Trace` object produced from `extract`. Defaults to None, which uses the last exception. width (Optional[int], optional): Number of characters used to traceback. Defaults to 100. + code_width (Optional[int], optional): Number of code characters used to traceback. Defaults to 88. extra_lines (int, optional): Additional lines of code to render. Defaults to 3. theme (str, optional): Override pygments theme used in traceback. word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. @@ -243,6 +247,7 @@ def __init__( trace: Optional[Trace] = None, *, width: Optional[int] = 100, + code_width: Optional[int] = 88, extra_lines: int = 3, theme: Optional[str] = None, word_wrap: bool = False, @@ -266,6 +271,7 @@ def __init__( ) self.trace = trace self.width = width + self.code_width = code_width self.extra_lines = extra_lines self.theme = Syntax.get_theme(theme or "ansi_dark") self.word_wrap = word_wrap @@ -297,6 +303,7 @@ def from_exception( traceback: Optional[TracebackType], *, width: Optional[int] = 100, + code_width: Optional[int] = 88, extra_lines: int = 3, theme: Optional[str] = None, word_wrap: bool = False, @@ -316,6 +323,7 @@ def from_exception( exc_value (BaseException): Exception value. traceback (TracebackType): Python Traceback object. width (Optional[int], optional): Number of characters used to traceback. Defaults to 100. + code_width (Optional[int], optional): Number of code characters used to traceback. Defaults to 88. extra_lines (int, optional): Additional lines of code to render. Defaults to 3. theme (str, optional): Override pygments theme used in traceback. word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. @@ -346,6 +354,7 @@ def from_exception( return cls( rich_traceback, width=width, + code_width=code_width, extra_lines=extra_lines, theme=theme, word_wrap=word_wrap, @@ -436,6 +445,35 @@ def get_locals( for frame_summary, line_no in walk_tb(traceback): filename = frame_summary.f_code.co_filename + + last_instruction: Optional[Tuple[Tuple[int, int], Tuple[int, int]]] + last_instruction = None + if sys.version_info >= (3, 11): + instruction_index = frame_summary.f_lasti // 2 + instruction_position = next( + islice( + frame_summary.f_code.co_positions(), + instruction_index, + instruction_index + 1, + ) + ) + ( + start_line, + end_line, + start_column, + end_column, + ) = instruction_position + if ( + start_line is not None + and end_line is not None + and start_column is not None + and end_column is not None + ): + last_instruction = ( + (start_line, start_column), + (end_line, end_column), + ) + if filename and not filename.startswith("<"): if not os.path.isabs(filename): filename = os.path.join(_IMPORT_CWD, filename) @@ -446,16 +484,20 @@ def get_locals( filename=filename or "?", lineno=line_no, name=frame_summary.f_code.co_name, - locals={ - key: pretty.traverse( - value, - max_length=locals_max_length, - max_string=locals_max_string, - ) - for key, value in get_locals(frame_summary.f_locals.items()) - } - if show_locals - else None, + locals=( + { + key: pretty.traverse( + value, + max_length=locals_max_length, + max_string=locals_max_string, + ) + for key, value in get_locals(frame_summary.f_locals.items()) + if not (inspect.isfunction(value) or inspect.isclass(value)) + } + if show_locals + else None + ), + last_instruction=last_instruction, ) append(frame) if frame_summary.f_locals.get("_rich_traceback_guard", False): @@ -695,7 +737,7 @@ def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: ), highlight_lines={frame.lineno}, word_wrap=self.word_wrap, - code_width=88, + code_width=self.code_width, indent_guides=self.indent_guides, dedent=False, ) @@ -705,6 +747,14 @@ def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: (f"\n{error}", "traceback.error"), ) else: + if frame.last_instruction is not None: + start, end = frame.last_instruction + syntax.stylize_range( + style="traceback.error_range", + start=start, + end=end, + style_before=True, + ) yield ( Columns( [ @@ -719,12 +769,12 @@ def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: if __name__ == "__main__": # pragma: no cover - from .console import Console - - console = Console() + install(show_locals=True) import sys - def bar(a: Any) -> None: # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑 + def bar( + a: Any, + ) -> None: # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑 one = 1 print(one / a) @@ -742,12 +792,6 @@ def foo(a: Any) -> None: bar(a) def error() -> None: - try: - try: - foo(0) - except: - slfkjsldkfj # type: ignore[name-defined] - except: - console.print_exception(show_locals=True) + foo(0) error() diff --git a/libs/rich/tree.py b/libs/rich/tree.py index 8c5e71819..9a87d60de 100644 --- a/libs/rich/tree.py +++ b/libs/rich/tree.py @@ -8,18 +8,32 @@ from .style import Style, StyleStack, StyleType from .styled import Styled +GuideType = Tuple[str, str, str, str] + class Tree(JupyterMixin): """A renderable for a tree structure. + Attributes: + ASCII_GUIDES (GuideType): Guide lines used when Console.ascii_only is True. + TREE_GUIDES (List[GuideType, GuideType, GuideType]): Default guide lines. + Args: label (RenderableType): The renderable or str for the tree label. style (StyleType, optional): Style of this tree. Defaults to "tree". guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". expanded (bool, optional): Also display children. Defaults to True. highlight (bool, optional): Highlight renderable (if str). Defaults to False. + hide_root (bool, optional): Hide the root node. Defaults to False. """ + ASCII_GUIDES = (" ", "| ", "+-- ", "`-- ") + TREE_GUIDES = [ + (" ", "│ ", "├── ", "└── "), + (" ", "┃ ", "┣━━ ", "┗━━ "), + (" ", "║ ", "╠══ ", "╚══ "), + ] + def __init__( self, label: RenderableType, @@ -82,21 +96,15 @@ def __rich_console__( guide_style = get_style(self.guide_style, default="") or null_style SPACE, CONTINUE, FORK, END = range(4) - ASCII_GUIDES = (" ", "| ", "+-- ", "`-- ") - TREE_GUIDES = [ - (" ", "│ ", "├── ", "└── "), - (" ", "┃ ", "┣━━ ", "┗━━ "), - (" ", "║ ", "╠══ ", "╚══ "), - ] _Segment = Segment def make_guide(index: int, style: Style) -> Segment: """Make a Segment for a level of the guide lines.""" if options.ascii_only: - line = ASCII_GUIDES[index] + line = self.ASCII_GUIDES[index] else: guide = 1 if style.bold else (2 if style.underline2 else 0) - line = TREE_GUIDES[0 if options.legacy_windows else guide][index] + line = self.TREE_GUIDES[0 if options.legacy_windows else guide][index] return _Segment(line, style) levels: List[Segment] = [make_guide(CONTINUE, guide_style)] diff --git a/libs/semver-3.0.2.dist-info/RECORD b/libs/semver-3.0.2.dist-info/RECORD index 42db19ab7..aee2f2403 100644 --- a/libs/semver-3.0.2.dist-info/RECORD +++ b/libs/semver-3.0.2.dist-info/RECORD @@ -4,7 +4,7 @@ semver-3.0.2.dist-info/LICENSE.txt,sha256=zaSQwy5h04hNwXeR_IB48qPlZPupjdGLTcZOsn semver-3.0.2.dist-info/METADATA,sha256=mcINoKlUpEir1fb86rJzEwNHfZTEYBzEOoiBkLu6GxI,4953 semver-3.0.2.dist-info/RECORD,, semver-3.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -semver-3.0.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +semver-3.0.2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 semver-3.0.2.dist-info/entry_points.txt,sha256=QsWAwfEwq2bdJmY8lmGFjnvA1gi8_tHqQRZTyxr9CIg,45 semver-3.0.2.dist-info/top_level.txt,sha256=oFJ1J3NJzsV1x-L91Xz4FBlYpVqO-Cr4UEfj-hGvqq0,7 semver/__about__.py,sha256=maY3JUysLDPr3cy-8Yie3wjfK4wvV2m2E1snDWFTN84,815 diff --git a/libs/semver-3.0.2.dist-info/WHEEL b/libs/semver-3.0.2.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/semver-3.0.2.dist-info/WHEEL +++ b/libs/semver-3.0.2.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/simple_websocket-1.0.0.dist-info/RECORD b/libs/simple_websocket-1.0.0.dist-info/RECORD deleted file mode 100644 index b7f54dce8..000000000 --- a/libs/simple_websocket-1.0.0.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -simple_websocket-1.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -simple_websocket-1.0.0.dist-info/LICENSE,sha256=S4q63MXj3SnHGQW4SVKUVpnwp7pB5q-Z6rpG-qvpW7c,1072 -simple_websocket-1.0.0.dist-info/METADATA,sha256=wZQcZ5j94bd65Fp_YWYA06_iNQ3Obd0-R63s496nLmo,1347 -simple_websocket-1.0.0.dist-info/RECORD,, -simple_websocket-1.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -simple_websocket-1.0.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -simple_websocket-1.0.0.dist-info/top_level.txt,sha256=gslMtkYd2H3exn9JQxdAgsKBCESZDyTxmukAF9Iz5aA,17 -simple_websocket/__init__.py,sha256=EKakMkVO9vg5WlXjHEJiTwI2emAqs9q22ZxJz9vJ4co,167 -simple_websocket/aiows.py,sha256=CHIBIAN2cz004S4tPeTLAcQuT9iBgw6-hA0QD_JZD1A,20978 -simple_websocket/asgi.py,sha256=ic2tmrUI-u9vjMNzjqIORc8g7pAsGwFd9YJIjppHHVU,1823 -simple_websocket/errors.py,sha256=5tIEemK-0w5A-6Qyp6imPmn3KI5EjND3R5pRWAiKWF8,583 -simple_websocket/ws.py,sha256=24fXv4pGxAeDEazZr06l7hmzUGcyiBv6TvMPa260JNo,22301 diff --git a/libs/simple_websocket-1.0.0.dist-info/WHEEL b/libs/simple_websocket-1.0.0.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/simple_websocket-1.0.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/simple_websocket-1.0.0.dist-info/INSTALLER b/libs/simple_websocket-1.1.0.dist-info/INSTALLER similarity index 100% rename from libs/simple_websocket-1.0.0.dist-info/INSTALLER rename to libs/simple_websocket-1.1.0.dist-info/INSTALLER diff --git a/libs/simple_websocket-1.0.0.dist-info/LICENSE b/libs/simple_websocket-1.1.0.dist-info/LICENSE similarity index 100% rename from libs/simple_websocket-1.0.0.dist-info/LICENSE rename to libs/simple_websocket-1.1.0.dist-info/LICENSE diff --git a/libs/simple_websocket-1.0.0.dist-info/METADATA b/libs/simple_websocket-1.1.0.dist-info/METADATA similarity index 78% rename from libs/simple_websocket-1.0.0.dist-info/METADATA rename to libs/simple_websocket-1.1.0.dist-info/METADATA index f93782fa8..dfdb05e72 100644 --- a/libs/simple_websocket-1.0.0.dist-info/METADATA +++ b/libs/simple_websocket-1.1.0.dist-info/METADATA @@ -1,10 +1,9 @@ Metadata-Version: 2.1 Name: simple-websocket -Version: 1.0.0 +Version: 1.1.0 Summary: Simple WebSocket server and client for Python -Home-page: https://github.com/miguelgrinberg/simple-websocket -Author: Miguel Grinberg -Author-email: miguel.grinberg@gmail.com +Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> +Project-URL: Homepage, https://github.com/miguelgrinberg/simple-websocket Project-URL: Bug Tracker, https://github.com/miguelgrinberg/simple-websocket/issues Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers @@ -15,6 +14,11 @@ Requires-Python: >=3.6 Description-Content-Type: text/markdown License-File: LICENSE Requires-Dist: wsproto +Provides-Extra: dev +Requires-Dist: tox ; extra == 'dev' +Requires-Dist: flake8 ; extra == 'dev' +Requires-Dist: pytest ; extra == 'dev' +Requires-Dist: pytest-cov ; extra == 'dev' Provides-Extra: docs Requires-Dist: sphinx ; extra == 'docs' diff --git a/libs/simple_websocket-1.1.0.dist-info/RECORD b/libs/simple_websocket-1.1.0.dist-info/RECORD new file mode 100644 index 000000000..3c240b283 --- /dev/null +++ b/libs/simple_websocket-1.1.0.dist-info/RECORD @@ -0,0 +1,12 @@ +simple_websocket-1.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +simple_websocket-1.1.0.dist-info/LICENSE,sha256=S4q63MXj3SnHGQW4SVKUVpnwp7pB5q-Z6rpG-qvpW7c,1072 +simple_websocket-1.1.0.dist-info/METADATA,sha256=jIZUFRCbg8Ae1BNwEipAlSMvuPJ05_bXpptlk2DHiNQ,1530 +simple_websocket-1.1.0.dist-info/RECORD,, +simple_websocket-1.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +simple_websocket-1.1.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +simple_websocket-1.1.0.dist-info/top_level.txt,sha256=gslMtkYd2H3exn9JQxdAgsKBCESZDyTxmukAF9Iz5aA,17 +simple_websocket/__init__.py,sha256=EKakMkVO9vg5WlXjHEJiTwI2emAqs9q22ZxJz9vJ4co,167 +simple_websocket/aiows.py,sha256=CHIBIAN2cz004S4tPeTLAcQuT9iBgw6-hA0QD_JZD1A,20978 +simple_websocket/asgi.py,sha256=ic2tmrUI-u9vjMNzjqIORc8g7pAsGwFd9YJIjppHHVU,1823 +simple_websocket/errors.py,sha256=BtR8B4OI-FL2O_VSIi9cmLMobHqcJ2FhvQnRtvvMlSo,652 +simple_websocket/ws.py,sha256=Nj7DSMnUhOXGYI9j5wvJMpm5X_c7iNDg0H7EpJQPb9o,22789 diff --git a/libs/simple_websocket-1.0.0.dist-info/REQUESTED b/libs/simple_websocket-1.1.0.dist-info/REQUESTED similarity index 100% rename from libs/simple_websocket-1.0.0.dist-info/REQUESTED rename to libs/simple_websocket-1.1.0.dist-info/REQUESTED diff --git a/libs/simple_websocket-1.1.0.dist-info/WHEEL b/libs/simple_websocket-1.1.0.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/simple_websocket-1.1.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/simple_websocket-1.0.0.dist-info/top_level.txt b/libs/simple_websocket-1.1.0.dist-info/top_level.txt similarity index 100% rename from libs/simple_websocket-1.0.0.dist-info/top_level.txt rename to libs/simple_websocket-1.1.0.dist-info/top_level.txt diff --git a/libs/simple_websocket/errors.py b/libs/simple_websocket/errors.py index 535b9d661..3a2a70b2d 100644 --- a/libs/simple_websocket/errors.py +++ b/libs/simple_websocket/errors.py @@ -1,14 +1,18 @@ from wsproto.frame_protocol import CloseReason -class ConnectionError(RuntimeError): # pragma: no cover +class SimpleWebsocketError(RuntimeError): + pass + + +class ConnectionError(SimpleWebsocketError): """Connection error exception class.""" - def __init__(self, status_code=None): + def __init__(self, status_code=None): # pragma: no cover self.status_code = status_code super().__init__(f'Connection error: {status_code}') -class ConnectionClosed(RuntimeError): +class ConnectionClosed(SimpleWebsocketError): """Connection closed exception class.""" def __init__(self, reason=CloseReason.NO_STATUS_RCVD, message=None): self.reason = reason diff --git a/libs/simple_websocket/ws.py b/libs/simple_websocket/ws.py index 627f53d3c..33519e7e0 100644 --- a/libs/simple_websocket/ws.py +++ b/libs/simple_websocket/ws.py @@ -132,7 +132,10 @@ def _thread(self): if self.ping_interval: next_ping = time() + self.ping_interval sel = self.selector_class() - sel.register(self.sock, selectors.EVENT_READ, True) + try: + sel.register(self.sock, selectors.EVENT_READ, True) + except ValueError: # pragma: no cover + self.connected = False while self.connected: try: @@ -143,6 +146,7 @@ def _thread(self): if not self.pong_received: self.close(reason=CloseReason.POLICY_VIOLATION, message='Ping/Pong timeout') + self.event.set() break self.pong_received = False self.sock.send(self.ws.send(Ping())) @@ -153,7 +157,8 @@ def _thread(self): raise OSError() self.ws.receive_data(in_data) self.connected = self._handle_events() - except (OSError, ConnectionResetError): # pragma: no cover + except (OSError, ConnectionResetError, + LocalProtocolError): # pragma: no cover self.connected = False self.event.set() break @@ -392,13 +397,18 @@ def __init__(self, url, subprotocols=None, headers=None, elif isinstance(headers, list): self.extra_headeers = headers - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + connection_args = socket.getaddrinfo(self.host, self.port, + type=socket.SOCK_STREAM) + if len(connection_args) == 0: # pragma: no cover + raise ConnectionError() + sock = socket.socket(connection_args[0][0], connection_args[0][1], + connection_args[0][2]) if is_secure: # pragma: no cover if ssl_context is None: ssl_context = ssl.create_default_context( purpose=ssl.Purpose.SERVER_AUTH) sock = ssl_context.wrap_socket(sock, server_hostname=self.host) - sock.connect((self.host, self.port)) + sock.connect(connection_args[0][4]) super().__init__(sock, connection_type=ConnectionType.CLIENT, receive_bytes=receive_bytes, ping_interval=ping_interval, diff --git a/libs/socketio/asgi.py b/libs/socketio/asgi.py index 2394ee1e2..23b094d8c 100644 --- a/libs/socketio/asgi.py +++ b/libs/socketio/asgi.py @@ -15,7 +15,12 @@ class ASGIApp(engineio.ASGIApp): # pragma: no cover :param other_asgi_app: A separate ASGI app that receives all other traffic. :param socketio_path: The endpoint where the Socket.IO application should be installed. The default value is appropriate for - most cases. + most cases. With a value of ``None``, all incoming + traffic is directed to the Socket.IO server, with the + assumption that routing, if necessary, is handled by + a different layer. When this option is set to + ``None``, ``static_files`` and ``other_asgi_app`` are + ignored. :param on_startup: function to be called on application startup; can be coroutine :param on_shutdown: function to be called on application shutdown; can be @@ -27,7 +32,7 @@ class ASGIApp(engineio.ASGIApp): # pragma: no cover import uvicorn sio = socketio.AsyncServer() - app = engineio.ASGIApp(sio, static_files={ + app = socketio.ASGIApp(sio, static_files={ '/': 'index.html', '/static': './public', }) diff --git a/libs/socketio/async_client.py b/libs/socketio/async_client.py index 9184d029e..5fd8daafd 100644 --- a/libs/socketio/async_client.py +++ b/libs/socketio/async_client.py @@ -53,11 +53,14 @@ class AsyncClient(base_client.BaseClient): :param http_session: an initialized ``aiohttp.ClientSession`` object to be used when sending requests to the server. Use it if you need to add special client options such as proxy - servers, SSL certificates, etc. + servers, SSL certificates, custom CA bundle, etc. :param ssl_verify: ``True`` to verify SSL certificates, or ``False`` to skip SSL certificate verification, allowing connections to servers with self signed certificates. The default is ``True``. + :param websocket_extra_options: Dictionary containing additional keyword + arguments passed to + ``websocket.create_connection()``. :param engineio_logger: To enable Engine.IO logging set to ``True`` or pass a logger object to use. To disable logging set to ``False``. The default is ``False``. Note that @@ -128,6 +131,8 @@ async def connect(self, url, headers={}, auth=None, transports=None, if namespaces is None: namespaces = list(set(self.handlers.keys()).union( set(self.namespace_handlers.keys()))) + if '*' in namespaces: + namespaces.remove('*') if len(namespaces) == 0: namespaces = ['/'] elif isinstance(namespaces, str): @@ -318,6 +323,21 @@ async def disconnect(self): namespace=n)) await self.eio.disconnect(abort=True) + async def shutdown(self): + """Stop the client. + + If the client is connected to a server, it is disconnected. If the + client is attempting to reconnect to server, the reconnection attempts + are stopped. If the client is not connected to a server and is not + attempting to reconnect, then this function does nothing. + """ + if self.connected: + await self.disconnect() + elif self._reconnect_task: # pragma: no branch + self._reconnect_abort.set() + print(self._reconnect_task) + await self._reconnect_task + def start_background_task(self, target, *args, **kwargs): """Start a background task using the appropriate async model. @@ -467,15 +487,20 @@ async def _handle_reconnect(self): self.logger.info( 'Connection failed, new attempt in {:.02f} seconds'.format( delay)) + abort = False try: await asyncio.wait_for(self._reconnect_abort.wait(), delay) + abort = True + except asyncio.TimeoutError: + pass + except asyncio.CancelledError: # pragma: no cover + abort = True + if abort: self.logger.info('Reconnect task aborted') for n in self.connection_namespaces: await self._trigger_event('__disconnect_final', namespace=n) break - except (asyncio.TimeoutError, asyncio.CancelledError): - pass attempt_count += 1 try: await self.connect(self.connection_url, diff --git a/libs/socketio/async_manager.py b/libs/socketio/async_manager.py index dcf79cf85..47e7a79fc 100644 --- a/libs/socketio/async_manager.py +++ b/libs/socketio/async_manager.py @@ -11,12 +11,13 @@ async def can_disconnect(self, sid, namespace): return self.is_connected(sid, namespace) async def emit(self, event, data, namespace, room=None, skip_sid=None, - callback=None, **kwargs): + callback=None, to=None, **kwargs): """Emit a message to a single client, a room, or all the clients connected to the namespace. Note: this method is a coroutine. """ + room = to or room if namespace not in self.rooms: return if isinstance(data, tuple): diff --git a/libs/socketio/async_namespace.py b/libs/socketio/async_namespace.py index 0a2e0515c..89442aeb1 100644 --- a/libs/socketio/async_namespace.py +++ b/libs/socketio/async_namespace.py @@ -29,7 +29,7 @@ async def trigger_event(self, event, *args): Note: this method is a coroutine. """ - handler_name = 'on_' + event + handler_name = 'on_' + (event or '') if hasattr(self, handler_name): handler = getattr(self, handler_name) if asyncio.iscoroutinefunction(handler) is True: @@ -194,7 +194,7 @@ async def trigger_event(self, event, *args): Note: this method is a coroutine. """ - handler_name = 'on_' + event + handler_name = 'on_' + (event or '') if hasattr(self, handler_name): handler = getattr(self, handler_name) if asyncio.iscoroutinefunction(handler) is True: diff --git a/libs/socketio/async_pubsub_manager.py b/libs/socketio/async_pubsub_manager.py index 3e11f1eaa..72946eb22 100644 --- a/libs/socketio/async_pubsub_manager.py +++ b/libs/socketio/async_pubsub_manager.py @@ -38,7 +38,7 @@ def initialize(self): self._get_logger().info(self.name + ' backend initialized.') async def emit(self, event, data, namespace=None, room=None, skip_sid=None, - callback=None, **kwargs): + callback=None, to=None, **kwargs): """Emit a message to a single client, a room, or all the clients connected to the namespace. @@ -49,6 +49,7 @@ async def emit(self, event, data, namespace=None, room=None, skip_sid=None, Note: this method is a coroutine. """ + room = to or room if kwargs.get('ignore_queue'): return await super().emit( event, data, namespace=namespace, room=room, skip_sid=skip_sid, diff --git a/libs/socketio/async_server.py b/libs/socketio/async_server.py index 91a14d066..1e523ff17 100644 --- a/libs/socketio/async_server.py +++ b/libs/socketio/async_server.py @@ -102,6 +102,9 @@ class AsyncServer(base_server.BaseServer): inactive clients are closed. Set to ``False`` to disable the monitoring task (not recommended). The default is ``True``. + :param transports: The list of allowed transports. Valid transports + are ``'polling'`` and ``'websocket'``. Defaults to + ``['polling', 'websocket']``. :param engineio_logger: To enable Engine.IO logging set to ``True`` or pass a logger object to use. To disable logging set to ``False``. The default is ``False``. Note that diff --git a/libs/socketio/base_server.py b/libs/socketio/base_server.py index c3b8591eb..d5a353bcb 100644 --- a/libs/socketio/base_server.py +++ b/libs/socketio/base_server.py @@ -226,7 +226,7 @@ def _get_event_handler(self, event, namespace, args): '*' in self.handlers[namespace]: handler = self.handlers[namespace]['*'] args = (event, *args) - elif '*' in self.handlers: + if handler is None and '*' in self.handlers: if event in self.handlers['*']: handler = self.handlers['*'][event] args = (namespace, *args) @@ -245,7 +245,7 @@ def _get_namespace_handler(self, namespace, args): handler = None if namespace in self.namespace_handlers: handler = self.namespace_handlers[namespace] - elif '*' in self.namespace_handlers: + if handler is None and '*' in self.namespace_handlers: handler = self.namespace_handlers['*'] args = (namespace, *args) return handler, args diff --git a/libs/socketio/client.py b/libs/socketio/client.py index 905bb1e28..d7af40708 100644 --- a/libs/socketio/client.py +++ b/libs/socketio/client.py @@ -56,11 +56,14 @@ class Client(base_client.BaseClient): :param http_session: an initialized ``requests.Session`` object to be used when sending requests to the server. Use it if you need to add special client options such as proxy - servers, SSL certificates, etc. + servers, SSL certificates, custom CA bundle, etc. :param ssl_verify: ``True`` to verify SSL certificates, or ``False`` to skip SSL certificate verification, allowing connections to servers with self signed certificates. The default is ``True``. + :param websocket_extra_options: Dictionary containing additional keyword + arguments passed to + ``websocket.create_connection()``. :param engineio_logger: To enable Engine.IO logging set to ``True`` or pass a logger object to use. To disable logging set to ``False``. The default is ``False``. Note that @@ -126,6 +129,8 @@ def connect(self, url, headers={}, auth=None, transports=None, if namespaces is None: namespaces = list(set(self.handlers.keys()).union( set(self.namespace_handlers.keys()))) + if '*' in namespaces: + namespaces.remove('*') if len(namespaces) == 0: namespaces = ['/'] elif isinstance(namespaces, str): @@ -298,6 +303,20 @@ def disconnect(self): packet.DISCONNECT, namespace=n)) self.eio.disconnect(abort=True) + def shutdown(self): + """Stop the client. + + If the client is connected to a server, it is disconnected. If the + client is attempting to reconnect to server, the reconnection attempts + are stopped. If the client is not connected to a server and is not + attempting to reconnect, then this function does nothing. + """ + if self.connected: + self.disconnect() + elif self._reconnect_task: # pragma: no branch + self._reconnect_abort.set() + self._reconnect_task.join() + def start_background_task(self, target, *args, **kwargs): """Start a background task using the appropriate async model. diff --git a/libs/socketio/manager.py b/libs/socketio/manager.py index 813c4af9e..3ebf67688 100644 --- a/libs/socketio/manager.py +++ b/libs/socketio/manager.py @@ -20,9 +20,10 @@ def can_disconnect(self, sid, namespace): return self.is_connected(sid, namespace) def emit(self, event, data, namespace, room=None, skip_sid=None, - callback=None, **kwargs): + callback=None, to=None, **kwargs): """Emit a message to a single client, a room, or all the clients connected to the namespace.""" + room = to or room if namespace not in self.rooms: return if isinstance(data, tuple): diff --git a/libs/socketio/namespace.py b/libs/socketio/namespace.py index ab4f69f80..3bf4f95b0 100644 --- a/libs/socketio/namespace.py +++ b/libs/socketio/namespace.py @@ -21,7 +21,7 @@ def trigger_event(self, event, *args): method can be overridden if special dispatching rules are needed, or if having a single method that catches all events is desired. """ - handler_name = 'on_' + event + handler_name = 'on_' + (event or '') if hasattr(self, handler_name): return getattr(self, handler_name)(*args) @@ -152,7 +152,7 @@ def trigger_event(self, event, *args): method can be overridden if special dispatching rules are needed, or if having a single method that catches all events is desired. """ - handler_name = 'on_' + event + handler_name = 'on_' + (event or '') if hasattr(self, handler_name): return getattr(self, handler_name)(*args) diff --git a/libs/socketio/packet.py b/libs/socketio/packet.py index 183076948..ec1b364cc 100644 --- a/libs/socketio/packet.py +++ b/libs/socketio/packet.py @@ -185,6 +185,6 @@ def _to_dict(self): 'data': self.data, 'nsp': self.namespace, } - if self.id: + if self.id is not None: d['id'] = self.id return d diff --git a/libs/socketio/pubsub_manager.py b/libs/socketio/pubsub_manager.py index 5ca7619c2..3270b4cb8 100644 --- a/libs/socketio/pubsub_manager.py +++ b/libs/socketio/pubsub_manager.py @@ -37,7 +37,7 @@ def initialize(self): self._get_logger().info(self.name + ' backend initialized.') def emit(self, event, data, namespace=None, room=None, skip_sid=None, - callback=None, **kwargs): + callback=None, to=None, **kwargs): """Emit a message to a single client, a room, or all the clients connected to the namespace. @@ -46,6 +46,7 @@ def emit(self, event, data, namespace=None, room=None, skip_sid=None, The parameters are the same as in :meth:`.Server.emit`. """ + room = to or room if kwargs.get('ignore_queue'): return super().emit( event, data, namespace=namespace, room=room, skip_sid=skip_sid, diff --git a/libs/socketio/server.py b/libs/socketio/server.py index c8bcaa334..a40dcd906 100644 --- a/libs/socketio/server.py +++ b/libs/socketio/server.py @@ -106,6 +106,9 @@ class Server(base_server.BaseServer): inactive clients are closed. Set to ``False`` to disable the monitoring task (not recommended). The default is ``True``. + :param transports: The list of allowed transports. Valid transports + are ``'polling'`` and ``'websocket'``. Defaults to + ``['polling', 'websocket']``. :param engineio_logger: To enable Engine.IO logging set to ``True`` or pass a logger object to use. To disable logging set to ``False``. The default is ``False``. Note that diff --git a/libs/soupsieve-2.3.2.post1.dist-info/METADATA b/libs/soupsieve-2.3.2.post1.dist-info/METADATA index a41417282..0c2e17067 100644 --- a/libs/soupsieve-2.3.2.post1.dist-info/METADATA +++ b/libs/soupsieve-2.3.2.post1.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: soupsieve Version: 2.3.2.post1 Summary: A modern CSS selector implementation for Beautiful Soup. diff --git a/libs/soupsieve-2.3.2.post1.dist-info/RECORD b/libs/soupsieve-2.3.2.post1.dist-info/RECORD index fe5941fc8..2b13b9330 100644 --- a/libs/soupsieve-2.3.2.post1.dist-info/RECORD +++ b/libs/soupsieve-2.3.2.post1.dist-info/RECORD @@ -1,8 +1,8 @@ soupsieve-2.3.2.post1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -soupsieve-2.3.2.post1.dist-info/METADATA,sha256=Z3OtmokeTrXhMB768n4ksU3i6okVF44a84FAyenO_jc,5700 +soupsieve-2.3.2.post1.dist-info/METADATA,sha256=VEZjsG1NqmGWu5L_aYIJMB9ytDcWWTi_f0QlaJ40AR4,5700 soupsieve-2.3.2.post1.dist-info/RECORD,, soupsieve-2.3.2.post1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -soupsieve-2.3.2.post1.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 +soupsieve-2.3.2.post1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 soupsieve-2.3.2.post1.dist-info/licenses/LICENSE.md,sha256=vGYjTK3T9ueq9xYPrxZfP4af_IoRtrDWxEouKoMxTdA,1096 soupsieve/__init__.py,sha256=_7J_eiqFvRzoGHZ9AW63f23OmTYLy9YsBQ53XsDbPgE,4717 soupsieve/__meta__.py,sha256=l4sqBM7pDLTSCbaqZ8p_7FQn6RB5DcFRBeJKpAh5epQ,6817 diff --git a/libs/soupsieve-2.3.2.post1.dist-info/WHEEL b/libs/soupsieve-2.3.2.post1.dist-info/WHEEL index 5998f3aab..cdd68a497 100644 --- a/libs/soupsieve-2.3.2.post1.dist-info/WHEEL +++ b/libs/soupsieve-2.3.2.post1.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: hatchling 1.25.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/sqlalchemy/__init__.py b/libs/sqlalchemy/__init__.py index 7090a744c..f94278fe9 100644 --- a/libs/sqlalchemy/__init__.py +++ b/libs/sqlalchemy/__init__.py @@ -269,7 +269,7 @@ from .types import VARBINARY as VARBINARY from .types import VARCHAR as VARCHAR -__version__ = "2.0.27" +__version__ = "2.0.36" def __go(lcls: Any) -> None: diff --git a/libs/sqlalchemy/connectors/asyncio.py b/libs/sqlalchemy/connectors/asyncio.py index 0b44f23a0..9b19bef78 100644 --- a/libs/sqlalchemy/connectors/asyncio.py +++ b/libs/sqlalchemy/connectors/asyncio.py @@ -11,7 +11,6 @@ from __future__ import annotations import collections -import itertools from ..engine import AdaptedConnection from ..util.concurrency import asyncio @@ -37,7 +36,8 @@ def __init__(self, adapt_connection): cursor = self._connection.cursor() self._cursor = self._aenter_cursor(cursor) - self._rows = collections.deque() + if not self.server_side: + self._rows = collections.deque() def _aenter_cursor(self, cursor): return self.await_(cursor.__aenter__()) @@ -114,11 +114,8 @@ def fetchone(self): def fetchmany(self, size=None): if size is None: size = self.arraysize - - rr = iter(self._rows) - retval = list(itertools.islice(rr, 0, size)) - self._rows = collections.deque(rr) - return retval + rr = self._rows + return [rr.popleft() for _ in range(min(size, len(rr)))] def fetchall(self): retval = list(self._rows) @@ -153,6 +150,14 @@ def fetchmany(self, size=None): def fetchall(self): return self.await_(self._cursor.fetchall()) + def __iter__(self): + iterator = self._cursor.__aiter__() + while True: + try: + yield self.await_(iterator.__anext__()) + except StopAsyncIteration: + break + class AsyncAdapt_dbapi_connection(AdaptedConnection): _cursor_cls = AsyncAdapt_dbapi_cursor diff --git a/libs/sqlalchemy/cyextension/.gitignore b/libs/sqlalchemy/cyextension/.gitignore deleted file mode 100644 index dfc107eaf..000000000 --- a/libs/sqlalchemy/cyextension/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# cython complied files -*.c -*.o -# cython annotated output -*.html \ No newline at end of file diff --git a/libs/sqlalchemy/cyextension/collections.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/collections.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..a881184757b2c509a2747b41a00ac8e8f244c506 GIT binary patch literal 233760 zcmeEvd2|$2_J0Rx4M^yqf^k8jY(Yg6HJTWrX(U)Ji9`^M3lc>zE<l8Ci6R(HS}ALy z5jULC5gixY5f!7Lghdi?1_B}?xCC6Nwow)pA|n0$eBOOk-O1>j-@m_e%sFtEdhc`Z zyKkwtb@$r+KO8*N<4Nl1@pzK)F9rXaydF;&lz&I#Uq%OyXYANZ3QI3hs<!`?;bG#R zmI2}6zeDu1v15bdD}(Wb?eXRxA<t@31&?y4cybC=iQ?F?Q-h&vr@E^4cxUz%oJ&|R z{5i5nD67Vc`$xR7<>POz7(WGx+T+a{Ab3x(Q229Xk?{Y2`8RHAaLNsnuGb0L<MkaR zc-j3Wfg?M3^3;*&&$!8xrp5!<9<OYa<T$pA<e}UqesL(pjU5}BH0_2-*Nwel(uB#- zw8y(+jNnyjM<}=VDG`$GWRAia>c7N4_WThSjgr>lw2xGsx}D7G;lCvOW0J9Bub&(* zCFMWH%V7ro0Z&)45?P=3D^C8SU$c-_a1tI==+b0rT|3$F%ZcIGu{U2ccIs^tubq7J z*oxqkKgFwXG5{~pFZ40b+X?2!j=k=h;5BhYd;cne;$PKql7_Ma9nTf#*ghssoIJ_V zw8z_3CwPe%iS_A(GoJt2sqx<R2l0DQa+h^>a<uKQ?eSO-2L6p5TNJoxc;V21v<{DF zuH%Kyq2=`5f=g{8)`=cZm8vqNE5L(-r#pBu5&~WRYzI$jH;<=sK?hGc@)A7_|H|I# z;Q5S=V?akw`i&mXVPH$}kAEjZ&wotY7c{Y+RDy*6cAe1CbAF;j`q{Cdv=e&vF?;ZN zgKvCgK*}jkzWidw>CmO)pJeHZAazr`a=B}-PAB0R+r9IL6rLRXBNqMXaGf6`PLk)e z(9|iX-F(Bf{5R^hslo9RPaSgVb+<u6BK-BoKjO5Y+*L3(P|Ga$Uw?l^;I9b$6@kAZ z@K*%>iojnH_$vZ`Mc}Up{1t(}BJlrT1V$U?w?=LLhh-f+V<Kz2ckoP5f2aC-*Qmnq zx&Jc%rT)?WOGcFh%!Bsa!#j8kt1{ItMry-KIq4dZ>R)5QbR&0Z@D#)HW)|^5j!~Qa z+|eC8_PW##p2%rfHX5e)ci1tiTVuYO<EgNE?YIMq@Rne*5$hP~N?mQXoz}rqWbU(H zp@DFNuVxPxpaHYdFdOZ2sWX=cV!lvvkr}hUp*P_zzM3^iW0+sr-JMMHb*9?vl^X9V z=TTqvXa!6yP>*7Uxy=6D*TLgAKMcgW_9gUo+XQrB_y^yt352fAeo({oaA5W$LIIO7 zGvY9hw1*ku!1NZFD>Td+ghiFE*@YPvhq<Ud%x|!&yxD~0Fxg+j-0Q$RuV7XhdETnw z9X!Ddr0FGiMdlv+U^kYoF%at(>{%F&`OLXU9{C&oE6j>P8~UCRe^eR4)4TB?dJF2Z z=t6jD<=D;0A8rU<Z7&5A`SD;ZhKHx=hi}S5zx^y9rp465!}Y^Q<zZj@UOpTm4}S>= z>}~S!Q2RzOQJ)bzER@VzOo1a=TMToPQN1GhO8-^<G5)LlW5+D7Yug^{%X@k}_IC`y zz!jzN=s9H+4WY0Z(gU}v5C;buxvjpMB*x$Jz9*&;o(V^xb)Esk^>8W{X*iE9DE|s( ziXCb<;Q?CgD2PS1gWek4!LtYeQe{;IU}C6-{9B39n@QPFpJM{(O>bYK)aIA*vB!D* zl>0b^kFES4ZzJikkEAwx2ouMU7*MlVHTD9u0^h>S+Dn_WR#olq?7Nqp@;$oY^v?p{ z!o9U!&DyRPRWEHe#;x})JTtX+W^-&=K~=2Fl&$6}W9inkf~te32Cs|^LdL9y$fk4Q zWTST`jPlRF`27)V1$!fd<-tVv!3X+5A3X3cUZSNQkdzOE^@TqLhB0oBZ{gs~p|uw@ zXYKV@wRWC1$k)4y=<qLAd*;I0GpALrgjdG6{YaR@gh<w9N{hMISo&S6k+d8B0_;9y zVXF3U?s)Y7gqN)GLg&^_NixRmZRcCR>SZ0;;HbC_PNi3|Wv*XIyUnJ4a3_|J?fs6y zn*-+Rz|!y2mPS&C`WAj>RPRVGs?9&VC#$Z<`#so7Qm#G+oiuB&QTt>?Bo_Oi38g`6 zewUkb{(2sVWHtCl`A7OMv+u`Phqj%r0-1#Y=u7+c!=&a*2CM4GirK{}NMw5LX^Cxb zENiJY|3p}XsjR*B@-8aXYNS$)Fdzw%+yqw$%o|REGbF)n7>n(zuy+X)Pdd-u&x34v ze;=kWdrknU&A)Rzh~?cS$^evhU&%Mo$yX=&dPtIPGnvo()pUiDOvy?y)w7gi)U%X_ z*aOUzBbC&nm^kJmj2fevtE5Uwjo~T~Zm)u!1s0rVLSwj&Y|_f`Y|td+IYJQTK!kLU zAk3xI7@h~hjZm=j!D@thvOstbln9^Qs;o9ZgfvPJnkY4fn?ZUA!X~g9p@l3Ewt*7i zDM7FyLdp_^U6dNbtsut>g6De|A(<=?x_}a4ydb1Pgya*1G)j%(bdYpG$N;N-$RrDd z(?N-FvLNI@g!Ds>DpLWa#;^gxO<k}hU^PN1Ss+{iN`&1Zm8T3Mq(y>IPN^|m0dlw? zRD#tARb+v1Hz*O_5rkO~Aw4b#b(9*zb3nQa!d$Q#VIEl^yaY;w8G<k$BBW`8P*15b z+yHWvAT)v12+d@HupX2M=L^Cnh>%7LLJOtFunnT?Vi#DA&`K5v`$37&Sr9x?g>Z%- zBvWb(r-B?QKBR%w2<c>ja3UxX*5Z)GFdxZ)2&uauWKwDj=YXg~jK**QSdCzi1;T}( zM0i9HN+3eodA7nUrPLTM14$Pj%E4-c3bH_$0!oA{1)&lmr2hy)6(w{h5Z$Wlz-oj! zWP$K^P$HZl2y-DqdRY+WQ9^eD(REP|RwFc!1;R2=B5a?k{BD8>$rOZUN{!)7Ai7Pq zfYk^#Ss;85N`zMhVHZS5mkB~ErN*#lM=ZwEUa-kvH9{&`ARG=#gsFm%1`$%WAf!`j z3}=9xAPAXYH9`(qAe;kAgj_)=fC#CNAQ+U;oj@`Kp%kn}C?gAmYe9(+o1)@S4iQp! zL8zeA7_J1-J*x_=Mwmqw2={>!;X^^Fg9vHoSqg6srN;1F5FLkkU^T*gvOrh>N(4&~ z>LEh<k03NqY794l6iX?Z!D@s}WPz}m6nQQdgcgX9wg`evsWH3@q(l%}nH+x@t35vm zLI+ahIZ6<cAwr4>LMo-ka2kjn?bDfD5HiTZhm$~AiZ5<aCC`KiX@MZ*P(pVC;VB|m z1FS|UAq#|&phWnWAe2IcbekZQQECjAgZKoY0<1=;BnyPwL5XmKAXGtwG)xd?QNr5^ zM3-U?SdB23ED)XnCBkWfFb^W6?t(C%Qe(Itq?h>609GS3kp;qPP$K+Nq2kaC5z@|V zC2gYA7;XX42sT)au!}4Z_J9&$ks!1}g!CUl@cgI{l0kZl52;`^LK;~h90N*(y96N} zBBYlDA%jw5I1@xiG6$?iC?E@jA)rLKKoAUwkZu!%5=xEXQV{*VC<Chz%E<!ZMo=Q8 z2tox!NS6shB_+%sK=cSR3#>+{BMXGtphWn1vh*d0kopP2TuPWffMB7a<_};sLOod^ zya!5z#|5DQBBYLj&_oII2M}Eso4{&>7P3It21<mnf?z|0wDnBo(Jo4uKY-}o?b+!f zB$EX~7f>Sf6NFTVkd_ES8YRphK=cTc0ap8vNfrpFgAyS+Nm<Q-2<b^dD4>My1j2)4 zuq9wMLMd4wTmediHw2*!BBbepP)-T+2aw)^PzhEeRFMV3-JnF6CJ3`2LMj!6I!c&7 zfan%A7pz8@M-~V#ff6BK5avUKG(ZsQDPjHqqT|p6RwFc%1;TnzB6JjlO%Ne@1)+r! z<_{q0$Om>8SdGw176|)6iLh#-ilk?kLiqX&B_&hB`~hTuAf$oS2<c>ja3UxX9uR~K zh>+F^LMA25A3$`!C;+Pw46;DD5R?d`1)&5Yq}K(ZloI9-AUY1^U^PMoSs+XSCBm_S zPze#zoq|wB3G)XKJ+H0<s}bgq1;XD!iLmu%Rr0wIAq50s9wp2lK)N6w*m|%Up@A$A zmVpxC1wm+n2&uauG*iO-0fY-#uq|LUf(<swgZTqh$TLw8c0q)+?sVl*D<!<0cDo44 zU^PN2SRx!w74n=R2x$-@Jtzq2lrVn)(LQ7{IsWk0%K=M-bEra|UvE-Y3m`(eSP%?K z=uRLSp_Iu5p^Plza4jg~utX5bAwudd2o;nte*n=4RbVy3EV4kj50nUDL8yZW$uF&X z4kgSVKzN-8>^!g<VLn+PEC40Ka6zbt2<d?=Ri*|?m_LB<J{#C(uo__#Ss-i%B|>*W zXn_dnN<pwGp*w--QLYuNM)2$rgbtuY`1D3)H5nqLQv@NE66Oyex<#df)d(46;loLw zM0ipVG9f}5AT26~66Oyex?dPzH9`qlAdCbh!Z<-Fg$SvKAe2$U`~d{_ei(-euo|I~ zED&x7CBi^KsDcP-YNjgFEJ~O^fao~P0jm+_k_EyuphVbtgUT}xBBZ-cQqp`%=uRNo zhX$}3p@}RIR)Z4ZZ9!;;2&seku!$176NqjPHdu|Yi!2cKfD&Q4Ahbe+wBj`7gXbrO zkPM<{L8)LhLK;~h90N)OzaXSTgtSFkbp|EOA3*fGI|r;rC?E@jA)rJ!R1ge^kcNv7 zC6q9K0O2K6uw`I1LOEF=+z3j9|CB4gD<DFONE|9DVg3N3TlFlk8ljFX5N3lC;UPho z0}+x(N->ubx)X?=k<JIJ5$eeT;XP0yTrLO=5FyPzRe97z3Ec@q_wG$#H9`wnAZ!CA zLT^E^Awn9Fp%8Xa!u$b5`{4Q6MMx$Kgf5^&`1X30Clw;3RPiB=66Oyex<zGx)jnjB z1;Xi|M0i;cav(w)B9Sbhg!u!AZVx43H9{#_AY1`Tgj)om3?ihH1)-c0x)X@*o0VWS zLKRsc+zm>Evjt%mL`WrrRGI21Vg3NZoj9;_!D@tgU^!O5L>2P<jy*2Jd}KaENT*4Q zs;7kc1BgawVsiXpv~MO0AJ&7?hvkB>2_mEorzpG@N|--@=-S)`RwJ~M1;Tz%BA9~U z`9&c-EC|VzFn<8iKBR%w2<c>ja3UxXMhHR%L`YW%LMA1=oj`br6l?)ljbMOf94@2^ zd3p#!2}DS}1)-D@x)X?g`<F90{t$->vhZOFD1F$%y+iYnN{EmmCo8Fn66Oye+#3a3 z2Ua7@0ZSkLP8ISzEeLZVLJCTooJR@s2M`^HdL|bi8py(jWuWxodO>J{2&r6rXr_eu z1Bf0UTEJ=qn=BB%2PMKFLD&Tm(iwu#N(u9ay>8D+2CETL$pYbUP$K+voho@6L`eH( ztWKwd`2&dV7nxu+LJnCVoC8XPcLkvUBBY?SYJ(Ey4<NdCmx9#@Wn_VHEhrK06ohh! zkVZ;vR#3wH0YtZlDzF-17Fi(N2TFuOL8yZWDNhjQP(pVC(UF`7RwK+O3xoxrL^w<k z>LEfJBnS<ZFn<8iyK2o~HNqycK-dgQgmvSjFF}MfrH_(qN|--@;I=MXR4Z7G;Mpe# z9YBfjm>?uWgml|Lg^)@K^9K-T{s2}ZWPoLxJc%mg86yap5FzcB_K-sf-3i3me_(R_ zp<k4cMJYyt(uY2RPzn)Jy&#lP!u$b5w}%R_8ljRb5N-!0LgZTIcNIiPcL~BQO6X1? zdaRxURwK+M3xsDtiSW80%!3GNy1XyuQ^NcKM3<rgtVU=e3xw66L<k8&Gek&31Yr}U z#&8RWj-(A%BkUpzggu}{$P<KCh>*Gnf~Qp>B!g&#RInN$jVut30VP6`Af!Wtw0?k! zN(Lp&A3*dRCI_rWC?E@jA)rKP<Po;{hyf8teXG)W{QPPOBp{T6oQ!;6%fM=ca<V|U zkrW8Ef=~ew(n#^4k`m?*AUcw>m>hp-4|QaLFdLLUj1q)75Fy<M9}M%6xs)(}0MQ8Z z!D@thvOstbln6%)LIXrdpY~S>O_cC<0@35-Ca@Zzg)9)ZffC^>oCv|H4H43lg0PDc zx)X?QQJ!C2gk-Wn=mJWF=L8`YBBW~sA&nB|4<NcWGr(#eGRXqrbWkGPBnUYWAq^CS z0!o-afasZ630RF#N)`xLfD$1~5XvAz+R;yyshkqtP9S=es|2eNs>lN2ZqOvdtepjF z)TRtl)mU3c2@?kp-IV5n)mi6}Mb?)<VLWBUSemPy4-wK#WxTeY5+)8HdK;+;tVU=C z%b{gGRmgLnAZ&sNX`~>uP{PCkL|5Z3CdVI|QY%^bupg8@ln8=nzd}e8gk(yXIDqI< zq=D54>12U$A}A4h3PJ`%NOoUUrc6qhIDqIWSOHj#V2}mEg`h<E{A!h_1R|t*K`5n! zegvYoaLU1IgbK1im;y?KX9S@VBBZb&R8hjj0YtxQ>cDD*Ib?zGcTggf3&LE8kV*t$ z9wkg1K=kCL9;`-aAPa<LphP%T5Sk!DIz|whDPiIOq6g^~uo}T83xw}MiSRQ%=VX|* zyC6b3S2gF_R!W#S{1%Jxa~@!m!D@t5vOqW-lnCz$LK;L!pG$3~Q^Ldn<QPH71gjBp z$O7RUP$E<bLIFfbWBVwN3`%${f#|v@1*;Lt$O7S7P$CQygmQ?GwjHYwDkx#%0HWhi z1y&=>A`683K#9;*5b7X8x>X`MhY}_ZAi71(1FI3{lLf*8P$I0qN?EOk2x;DlN@}2l zi35m!?Kgwf2%E?PVKXQZ<_JOyL`a6j!KQ?X1Bf0NTES`r&jCT`07`_b1tA$Cr2c}C zN(mDO5IsnzgVhKbWZ}a}phV~^2$>Ke?K(k~B8L(t4j|eG1FS|UAq#|&phWooN|mP+ zBBV0$p^OqH4j_7ftN^PKD#-%jc2FYB7lbN^kj^_s;mx9i*Aj?Em;+WL%q0tiXF!Q? zt02sS2q{ZSF`p794j_7jX#lGcn#clSH7F4V3qmtQNPE+j51S}8hFd^%zp%k-gk4}c zPVS)!c{&I}D?~_Z1;O*XLP!SD<3lP~jgUqbJ{$u|ADXUER?{I8Pg+z4B}^PZ^i(tl ztVSpx3xpw{M7UoN42Y1*(iC0^B}^PZ`XC?JGO!w<oGcJ-1SP^Hf=~ewQco#GB_&K8 zK=dnj7Fdl?M-~XPL5XmTAk2XXX>)Jo!(2+3IDqK)#eA?Dp`I)d-UB5<%jGIh14Kx_ z9HpctN|-o+=<#6_SdGv^76{u&k>`0qupvUqky7lUgtrrjK4kXb+L%U2CJTfvp!DHp zK}hArGW0AdMH(ec96<UbAJ`1A8X=P`5Kadr!s&vL0};}hf>1yS69*7}@DXeYSdCCh z76?~>5}~zJmAnihq^9GQR89#K2N2!6E5T}nDzZSh8<Yqi2*NCgkiPG!5b7vl{s5wD zb1qnoFpn${UIHaTjUdd22x)`(P)`Z-2M~?W1Xd$7lLf+hP$FC?2%8{6dP3sRLJ9K+ z5dGHM1y&=pk_EzkP$HxX0&YGLAs{{^Q^NcKM2}HvU^PNISs<JUN`#G<sgh?vgmiB& zC1p~=`~gJw%>u9*!5|BS3qgtSgdmhagfvnRN-3c`f#^7tgVhKXWPvaR6qC4cB`EG7 zO;+v~RvC?jv&8YjI>}Ku2gwWnp5(i%!8fpQKK{)`q6R)Jvfi)2eVt-ll&q<yT>CaJ z7DfBj8L>6?$ZwNy@AFVxw!*bl+)3@ZJ;_sSog1iLnSmU^(E)2_OTfC-_WKqN`_<oN zSZi>VziQ@wPta$7f~1l)^kMX)fOY9E02<--!R}eB?7zn!&WpZg|0^y&9(`(wef=vP z?T+6iVLIWx|5DuMTpSsJ7R_siJ#i?v<d#orI@w>tH9Wr+&()IyxSX-%wd(tl?N##R zI_JqYKFN>%(#3vVo{V&!H1Wyf3zi;cKO#>GoF}jG$!AN0-R$Y|<W%R$!+27i|6>Vu zwSp(&Vq=es;eeGr^AeIClR@lsxXz1>_h2xvfBh!O<6oGheEb=CdAqkZyY~@nD2;Y5 zp5jsHc;x*En0V9)k9gnrEIcC0At<taUT=J{0ECkXxeYfsC}cq>Hh0?Bo+<Jgz}vr^ zEy8hlxP<p7?H9y`ujWf-{zKevYoe)`Ctww)8D<hn@xn+N{n5TYM+f>taW#Nj61*e4 z(;m<Iu(Iz*PI~uGC*iveX#NodwX$y}!7by8uf_j=;^jgZU(IB=gzL<{nrW_YhdI98 z$!7?S<^3C6QNE4PzI7Z$lLzgOP%;(9pqO-TMz3ZSS=pmh8Ftzo9oNQ58Bn~+5z4hJ zLc_IBwux&eh(mI}x&|om;@+w-du)eoT<EK#3zjzvFhy3%X4Z9WexEaNb9b-(4b0(s z<c#i6qE>27a022z3F!i6cn&IoS7ojI-4_upd$uaj_x45Fjkk1!B+v&K6067W%H@=v zV)-59gynLvyz2B0o)0)K#OrG_mRkXnb^C8+q&^vS4_p6K_4U2IZL1V{d>dPJ%2xj4 z$YR^5FJ!M3A1A2FR4De8Tpjp_wGlMjN#|(YLrRD1)=onitT4TWZQM9Yxv}5AQoHdR zj(ptu>mptpK`*XVUi26srB7p(THbeyRq3Z77KnQkr(hp&-euq5w1^?%1l(VPq=w~` zzJ(QL?zg{bk<$Mo(d<LYRQ?mlVMkFF2>M**bjs7{(=a<k%(DH#?8C0vJ!k2%|LQi{ z%i5Ujtj$i;W&??4j}x=~Xf`NjZxgd8iP?{eRB0b(W3A24cg;?B%+7bswjgP|w9n`u z@BK<jyBkXlH^|Q^Q~9qUhy6Qh0j1rqoKAU@*(~oRVz!@{{Vvl9awo^^^{&|)+L(P) zm-bF=_Q6E6r;6FLY4#p5dy|+QEM~tLu1dQQWk+craLv|c>mVQRn%#q>@zOqlps{X~ zwb_x0X5Ue!@*9xD_KDdY%ITC3>8<6RAZ9NRvpKHWo{rg1*iqDgG`)@4|G;~ieeg>O z@*Z4GaD!YRW&<=k2bGT?j~25RiP@bOs?u&k*-_f9r#V4>>P%hQzqw{RwK4l8U}*Lj zZFY8|*;UF^{(6AhCn(;#5<I&9W2$9IH-6bE+NG|Ixhj>@Ti(+VUHF9*tt8RLc(E~w zHr_|bQM7H!!<4DaW_gdq6AV#aDO!KGXe-XpMN4tb4s2uA(q_-oW_RHj)Q#wm%2fWo z0L%^(v*X0<0ak?NeG*S#_EE$a5nX$#6VYPF><V^1RgnvjG~RwXX|qkAOKD$BG&@bq zR?+NQgdC+^tej2>i`o8SR*h4&`IWBOji>9<PIt}bwK4kxyk|vTtj*RXn)Qg;&NN#p zX2*-!ZesRzLzT83zN54!xMs&XW>0s`u0YawX@Au1XY&>*?RAM}O=T*7HgecoQ41*T zYs%@A$C%CX=7`yVm|Z={39_A~OB-S5Q$a3nWA<J)3Y2!7HhWy6*~7)`u{3+5m>nx- z)5Yx43sh-0qwFZ{RM+e+j@h}c*^NjVFKwMRyJNGIb_Eu8Zj<_lGL`=<a@aqi7Esz` zG5aFx#`0b$X4N=Vn}3{Zc7LWW?Padnv2DyguIo0W%|4uHwy&5SM6-8@*^5=IQcf4M z9}iQdJ%F;Kv>%@01i9KV+s!p=BWb*}C&7CL`QT?#+Tn?2Usa~^7b1u46|*lXr&AU& zNS601F<UEUC%I<3I%YrQFre!8mNsVl=pf&#&2~sMdzP3zk7n;j<s-;>Vs@yQ{kBk* z_INRSlxy~p({zxhxn}nxX}q)tbZJwy*>|xW=GN^JWh%c3IqajvY$xS(%72*6@=g-7 zuOs9La>L0^kdJrFp6Z&l+L+CT_YCsmn<U5;iDnHkdpXU{MdhQkEFWf$mx|eaLse-D z#Ow{O*%waLrTvy2Lk0QBHfGnb=fUiW+U$Ttv+I<p{A~cY2a4Hq#q3wiW_hc`>^g)T zr9Ip=o9UQ+!ZrIOlE#C)os9x!U;b1|`z6+~Zji4Kvp3P~0@MOZyHn*(DHpSy#q70W zcF{>rkl!7oOFPOn+rN$3avkI|wb@4!&3>&+<^Oy>%;t&NOfkEg*(~pDJi)8rCxjfO zz0Nf|#4+2&HTyb}#!Gt_g2vLmzfnqClxX&5F*}21SD+S9+TAL5%I#wISTS28W>Z|V zADyC0yObS6)oo52vmJDhhiS7N6V3jjOywU!v&CZeZZX?Y%sx9rm9~eNT{zGQ@+FSh zO4saCB#oE$Azj+FpGaxn!#;^yw=>1;1IS@-L@l7SXNcLq(Ob(qNX$OZp{q83tZViQ z9386l&uOmN3)`4|SeLd`o4qB`?4e>djb_J+*%c~x3O{EBvkU#Iv}cRiWY_Ej$Lv~m z3>D;$ku+Y~LE7xr4N}^SM6-3uRQ}V*VcVz$l=cUeJLR7YlI1;5%r+t9DD4{=PLOw= zq)R*5HG5SXv-cxtY*IIBvtQxhzzy=zV)i7Oy+zE<6te@wY*T?M?d4+j3fF9<W7g-I z{T4~%rR}ZF{`9ew_R&PM&nQ#*Zz6}iAGLte9wlbys}AeESj>KpkfF34U9(A!+1J@Z zRgfpOF`K5%-l5GFCz?H3%nqj6YB4)c<xa^JvzyOTrJXKjUm4&8`M!ZV$Rk{{`;atV z+85at5oE76+bPlPTgp`ahsa@f6|<L%*=6+B@{SX;UB&EZ*X$9F*_~`Es<c&Y%s!(_ zd;fX~@<N>Tx^<f`W-p@IM^O0)^7krt%5X8e<6KqRCsES~^1=R2X`jf@rG3CP+qsR| zJZ<(UZFXX!*_Fyv{-*%9j~BDYirEbelI0DF*;B>r3$EFIj@i>(v$K&j9^@wwGzNL@ zIw@`6M6)BrY#GhIfLcIl?@+l@#)#R2`Kq)_I8fK-m$+tM8=y<OmUX6rd~6%DgS6R! z+UyqWNxMPbq)g>U0B&cB*%UGR9U3%Bd#{)+5wpMcbAo)fV|KD@_E{v2m-Zs&M`;%{ zOKE2(n!QHMPNCU%Q41*TKUMCO$znED%x*<Zp|sDqW*hqJ()wJpgW8xKpv~rKvw=jj z-z!u3zYT`jA!7CcY00e&lI49IPw?WKB4&rfEcT^}9GeSRVT^G8El7t&;YemSm)UF9 zN*TK(8k->o`ip_b#6XT1I9d#J5d+bFx=`h=fmAUNVatPoiQ2%YIGJ(l?l>5*FTfM^ zwm9F-yCF|GH%2>`rSq<myuL7Zzq#}HIT}P{4+Q_>^&`~hhocq##alEx-oJP?*hSp= zjF$Qr{{|sif(=;z;$375{fmDm&G#=(F5&j+@6pr!i;n}l2vq|woo%cT%;1X5^S@)q z8(ZBeuK!oz0b<#U?&864qdGqgyvO%&gTHETl0SK6C>@nQ5pT4i=6B}iA~Rw)v)Nhs zk#i)^+4xZUXW;o~;QJj0*oOi%nr>I(yB!dgP*3b+ZRpH+@Vg~A_p?KIl+^%Z|3b#3 zqZ=@{e5MOibT;yen|<N;0cYH`f?pGm@GSz|xqTUJ3f}v|CO+=T2>u<4C2DK<Z(`3E zz6+21iw7VKDD#2?NuEU*4Lp$}akAiFoW<x+R@=DY?{Ih$`3(R07oW!`{IrkyY6a}^ zhF9_7V)bx1ANEar_zE9Br5=tFQy0(_(?p(7>M~JhQk_Y4Sg9AG%J{kc8YNAXM29g^ zJ`<He&Bx=_<J;x&j^FTj2p{{E`d(3gLiGhypQO}l03A6+v1`empx9=zJr(<~<a?6& zphermF`s|&)1tnI>Px8JqSUX6dNS3QQ@ui|e<t2a#V(Q*#Y}MnQ#_;8O`<-F>YJ#x zl)3}dXrz(*l(d&HcPjQ1Nq-2_-^%n?D)r$|tCq}6qm}9?N99&hU+5!8sfWi1%#!_p zVF!pDsnpv<J&)>{RR4~{XaC|;MExMus)2l`)TcoW@Psz94Eo61>fuhwGlqG>gj%4~ zgP~SUhmO7imF+`g^e;Xj$xmhS$C$iYB@aLy?d4zG`C`>XeSG{+KE6&pzKCdSM?||? zsY)D`TkJv5N7B{9o&wYKD`1`{OfRLrT8zIzbtctED0Lr6{dcP8Q@s-xC;W?VlGN2y zt9JOUQlBcRAETPREV5LoD<$=4s#UXmN2$+|)HhI_%G3`jby!jlpjx$7Q>ibI)Tvaj zVe0WpJzG-$+6uL5qgN{RC6am@)f<@lY^8omQh!9XYPy4z`Wi|77S*3Jb!Vl1MN&UW zwQA8Z-0ATzo+PR7q52D^-lEj+O6ti}tJb|vsi#ZoQmVgY>Q|L|rKI*#ts4EmlzNt= zK8fm9roL0DKbF)-P_3GLNU0x@)CcxK?L)vL7b|s(r2dv_)r2ol>SrYN8mjv<bswev zK~ld%wQ8kDEA{J=dM?#jO#KUPp7|H=m((WJs*y&Oda<OQLUkTfH!Ag^qP~)9)n?yU z>Q$m1N_Bv#A6M!lMLmdW)ifVa>W!lAN%bhEzDcQ15Or)X)bkmtYn1wHQQK5s!_@go zeTt|LKpn|Znq8t<!h|<5;gL$6BkGT-P9-d_J>u0V>IbQw!PMWiQe7zO+o@Kq@^hu` zGE()`aa7;S)V#;(Up!J$7g4QR<!eymwUbB1-;mC~_$cIz+^15HmDI=cp=y=9WQx=| zR3I@@pUBi#snj=1>RrF!p=y;QC3P33W<mUmPi5*;RqER$^)jYbt+KDA{+tTI&Sh$k zN_~%{ewYtctK5s5yzu0;c<Mr?UJtc@@k5e&0w1bY$qU6uJvyFx1XDk&QqPstIee&E z<=>V1RZ*WnwQ7FVO8uUwyHKs#+09DbDC(bnhFUeK(Mr8R)SpwWTF$vjy;am7QmvZE z0Hyv>)UQ#k8bqp6|0e3ks8%)qD=wX54uvA1P*qf`D&7V)6qBity6nMHekAH@swJ@L zRKF$ao2i!CIfd#cMLjy6`fRH25%sxo_4!m!7WILjT<l`1OQFU$e7WDJ!|ziXRe~?# zs>bOlCSy0_V9l^DNH(mhIy4M?FAcs>YNrQZLlpiQa@P8H>8PF6sAsCIa$Go=n8R$n zh6%`kKLUA4f&88TvSXzNNdhK7G6kfwfNaC*(|>s~UV$8f^o}PlI3QgF<R^Zsg4OG0 z0eSL|K++XR*94Gj9gtK3SqKnLEAib^W0tEK`5AZ+YbF~`!Sv4#UWO=qwOl5q$6{hS zDh6InOn>+UoVhux!G3|y8@)w9<6mSO{!?g-nnvqHwEjeUFagc$qCMrJT`p*cIA{+$ zXz$0-e#7L<-gGI@&QCyl=b+=;#V*=mg4S@B_!bQ)$2iDq$9^GHEumVMAv@;ZEauHF z)FCcZ1D`i~XK1K;lqjZSXKxcX@HJ7KU42N*wT`MYqzG>r*^3=j9#wf%z38YWQZ*GS zU+<wFkJDbWuS5l_={n+k@(MU$dgq;is^?{cv4<nhR`#ZZB*~Jb)=4s0l1!v*^%$l| z%4Hx+IwAzX{FL@h?{!Xw!z9BglA)JmI3yv%^O7OY$*{S*a$>k@h&^_oAueI40ey$0 zJlaV)A1RBh9-VP+Rb=(rkCPQixfgAmSqky3QSu#9BX8^#%f11KvFszz$M9WJqe}Rn zf26&&0sdC6D1px<4)A5-LIqZ9PN+O$`#E~WP@O4BUd6#A;;=Bm%Z;p6)2qe>rtBhK zj)Qyf@{<4QW#3qK9uQ;M69Jg$WnSFN1&#}EV2nd;9gYGyUS1)#eNK}5kpvOij`I-M z-UK2k86kAcHWA8<WycW7SoUsskZ5}e^5_Vi>i}nq?MKxx(c>uOa4PB3rK<S6-=G3@ zn7DAAxG<V7sOtQqO3IIAAE#WH)Xs&$aTk_5zzcjVzV|Q%+~WXFBmM-q<i;Vf><ucc zJ&8NgKQfm6GXo5+#BTY(E#71Y`%;CS{SK0&c8!GEZDmE6-uGE>*6t}ti3o>b9udBk zUNErug0cT@gBQfIKT*Yd0RJaOcud>{`lWzB#-1!{_e^o&ZREfj{WZ28-O(nACwWeW zXOID&{Du<)c(MaTQqmJ<N$d?HV%aYPDwgeS=gG(KyTO>^00)#O-e(kWkB12S$2C}T z<0Y}|-%ua1>{o#<fwpwWOYCWJ?BgBmAFvmTN*pHGXA|2EUz-M6a^vN(>;Ve<Vi$XW zi+yYydo?4*s(DahXYWCBRANU(Qhrv=#XAOMNhelRgWZpf%k=JNh?(zl<U=4A;8XyC z{1-^vCuUKBJQR$7<c&AQvX4Q&SoUH7CRXWvi`_u_9f$a%KB&@b#G#jv164X4l2fJs zU^_6qJpWgoti`Gro@9t8N4N3Bty1mDt+DJXK*h38Z|8|8?#U7d_*MYJlTVckJ<`RK z6F{*2H=C89L(@eZ+DVTYnsddW$FP@=(98n)^U%zUWsg92h-E*G{}V$q8FMy0o}A@4 z^euJ^;LtE}=mF$FXzD=V(8a28q@1YS>+umJeuv-^?Bt>Lq>+7z(AZ<74WuK2!yJce zfr|)!hwXSc{3%Gh?GhlNQ<STBc=i!66U+VqRuX+)^q%YUeGYb(^4WWz!tODh*lycx z(@sjtxvGn0H^IwTHsdQ^&w(i!gRY9hpW(o-$6h8vqCPW=eQ*}rO8JE$*8{*rR;=m0 zmN8@HJdF$}>wfHtqpVSoxIgV$OF0*gvFvx0LrLw*x)!enT|cim*oETE^U8}JJJ}NT zOL;qM)AWABDx(+t;Ujnv6fefpi$5MM{3FY`AdO|e0nk|XbYLb%JP`LH)A3>nww5tk zq$%tko&UUqCFS!K^wkJgEIXahYScfAO;L^d-`Bf^{LFEkzoCPOFGX?;7<&{+IZU;6 z?_fCT^opNZTc-C{27^V;Kt2@tE^K5Y@KZqIfp;4MYXAdAQY<?cz_DzOD~aX3Jnm45 z<Iq|(Q8<(-4y|L|>!{x%F3faXcn&Gy!oj}Eg`FUO8uc4fW7&r&7gSslra~Lvabxm{ z16-tB@II%2dp!E*z$N8etH-jhM6F=_M{kgjKg4pXkWY)lyMF(G(Tn51z@PoU;JLVu zWp`CIdXWo%rVF1Ihacd0f4{(Q@58Y4*aY$?VJRu+Za^$MUwOY1|BLsZz?^vh?m{;> z&8!br{Amh4yAIx<!9>^|b^WYkZJOTikX@zpA|*VyS~=2d1RZh53T8<hhq%*#_p|bZ z{U@=NoDuh8q~pblho~5KkV5`+Vj_0icW61cC1Tkv2y-mEi(AMR9nBJZ!`p5le{)>F zP{AvIP{_B~x^*FUFyf}Svy(C%DN)GV-~sx<jdVn%{DZkrxmw9(Uj#I~xA1>rAuo!1 zF~h-L;Z=p~rLcQ+`*ZA)a_)~{9-<1_kI<^?k8=yT^DVcK{T=x60{_7Ys-e6N@+YpB zl=oNgN2=;s2_pjE$%U_r!>?t-U_&`X;KvGl$^U}q#!M{xLlv0oUHIp8WtG@jarjCH z{soLO=tUlZ-<|$Hyypf_Ec;xvl~{JN3qQ<-U;m~XoD&>)L*SnVE~<C-|AOa6Q7n5q zswbBHB8*6Iw(D9bv8Tr2SHq?XP6R_EydNU)XZ$btQ3}3Q!C&aY&vN09jKfcL;O`Uo zuX`)+H-P+U)pFws^A!aj#sA{{Ko|b)1#WPTbKp-F_!@x^{V#ZKfW@*GsM!C_g<q{} zp~Sv44$t~m!TC3O5Q5WB;Cucr_!$a*oPr<Z!r$b=?|Z}bev$(}QQ%h|uY&UqNPJuZ zTzp(ADd&b<Ec<g*Pb_;4TABpsSzQYy_MABUQ4V}JfxlkhOaB)<xA$V%VFf?gg)emB zbK~$0D3S`!>&S!PBn$kny%N1|^WrVxdv_^NW7#LWk;!$jznJev=4J<*O%2$u02Gb> zNn-!;U{=Bx>e~u?t?T!<+DeIiR~$Rd!QO|+;=P`X<a}?S%$VBk0l{qdV?|OJ=Oq|5 zxIn34yD+^k0#g;c9%}g1UAfk)14!1E_*##d5?&`P`Rf3SW%J{viNox6gip`&?m;L3 z9lQo5e(yL{;+H}G1XM+Hl*0T1|4TzS%q{T)aon>sZfE_4^kbGU!iH2Vy374OdhDUr zdhca2(>sTx*1Ow4bWE@Mf|6SA$HhvzS)TPMQPKpF-bqpUGT<s4e=y4ORAzXBry5pC z8Z-l_QG1J{|HJcc`y#leJaE1sUwt_~j7>yK#WDK?0NQWhTuLPhH&lLFWaY0q79YH+ zUXqRm;Rzidu<oq`gWcWkKo50;nPe~lQ`EKj?;#Le{@bC~U>!kyC}6G(SWEOrXii2K z=52<j@Kk<SfFIP^XOBYr<_`?ax&{HlhVm#_wHIC~AHOOV-M(X3&}=Dhk1VF>faZla z%&e0oMK9{Au9jR!QCI5?u-%y6XGm(jZ(ge+c&13+2}(LuqzfvPlp)d$w=3yHkq)~{ zNymv)dykTOiZph%l2S#w<q;)y5$XJ=mDEY3(a$RBAX|Q|ciP)ZY8A;uyM~{8l$1YR z)ouPID6-wVR0=c<Tbihl0_gszLaHLVLZ*R<S4aSWszSbbMOBEe<{<V|+f>S<=tHcO zF0Zz&ln>BeRHghIIZ!DpkA^oVTp`}@<G|2e3mq!uBSm^V%M=q)x2%*$B}E-|(W@la z-PG0Q4`zci^Jnl;0d}#O{Cbt#djpZG>velGtXb0DQl7S@cqwzh7^bLe^Jn`MQXY}^ zV%wQWy##3hboez0jpYj;qSOxF#engtkA-9O85+loe1&6b*)Pu8QkDN8!siKH2cIkP z$tt^Af*8DtA2^)w2tHZv<#5f9BnBrLv1I-ZMWY>N+po>vu@N~g);W&jgENtXN%4~v z$sr##S0HKBYd`&RlE)n-@E!i&LPp;z+D^iIE8~ELRS)*nKft4K!);H=ShCvP-{$YF z@V8d>25>Fq4CaTST>R<@s%OPf7}ZSvU`dg=8^fc$6wlEH++WW47*$_n?!thG-_20N z0`7oBe{g;;qV4Zz80Js-NteV^7Faqi*364h;CdICtpeo!0EgWjQIN->tti(i->Guh z^IuX;rRH@O>`4e53oP;7SMxYW8pLR|({g7)L9easEorRwM*A`65nBm=RRu2KM-i$V zb+uA|$fOGa4;OgvCfJj|*AhIQziZN;AJ+{BFjz!S;SHZv^pwBmvW>syvPenYLb!Rf z&wdSpN`0&vZoD(q=Nef%%TYVH8X@O5+h4?qFh3owE=zO^{WH2ualpJk`cj+vQooOb z{hYL7b8V4X*c33=1k6v&(1w6{0G%tpCtI}>j?+;6s7|YJgITRQMdSGyC>~-qF4Zuv zOfwqKFQ;4_-W%)~h#gX7PEF^hl)Imw6NnWe*-ZwLlrRZsg`!qrlVP4;ijP$CVis~8 zT4YWyYpkx~Q~Vi?)eJiSkf)N=*S&g<ka<d5je$%3)jxo);_oxGZ)$bxp)-%mzZ+sO zBmZtZ44zconjE?agWjHp(B21Bw{{GsSGRTw<w12CRY!uk=V361f%%<G2OOoD=V$VF zT^bQl`Bj&+g!@=%NAmed)<8cj4D2W8A)WJMFdoD$YfH4z*SkQS|49Ep+vQEOlh8@< zb1iHucLSWmVayji6rl^99!=rJuBB)$6#Lj-qFVV?N21ADqwqo6FYQb5kWKwa)rZ>k z9Q)u4>S<^&a*b5E+MSGk@-@b?KKc~GK2|l%mB0%vw3kWVU?29s7ieQJJC=Gn$37Fk zmtjAp;lDrtjsTJj5U*m#2zjIlUWX)+323GE95^r8ec{n;<cpkmsQ#Ph%>_d6T8y)$ zY+m72!92sdI29i*pLulFUd+gj#`C(O+@ZVEf`g6NN+WkqXg6N}U6}2VF_DL#rvrDU zj)~l-xRl5?D9mO2bowU4n(ZNK?&{D^m`gRRX&LB>V<Htu+x|S+{k<skhaAKF$Zu}& zoBIOh@Ae^5LwFSpHOFr-%rOl`=EQnmjfs|p5brx26~oWmPlPSMFLhWcKa^i=O)5w0 z_xrjJD-ARbQ$538$f`t4ui#LDan-sY4P{w~X+vlxj(^_<qkb0ZUqsI9H6CU0)yx;6 zLJ7}PK$EOMgz>HkKLk1QApS!akL=(>D}MqVva;_))!WO?fC?5z$lzq>=zNc;Rb{VZ z0UD`OeD(;YKYSqZmt!W70cQeMr@n?&fHvptu6+w%$6EB-lb>VY^Y?dGwvJHEtjAkh z(F=Y+a5>;uGfRuD31tE6>T+L3;anAoVslbC+rJlAC4+s6!`}oCQA1&0{+iY)=sQEL z@f$(|Si%N)8trAj3xaf^P0`OeAie|<X+s;Bu+aS7zwe7e-}yTV!#@NEp*>ohqoKGb zSSb}?%{8$#zFFH57ITlWbX%vPxi_aK`)VJ6B47<GH8|v1!^%MCDmUBJ7bhPzezu_6 z`~e@sFut@EFDk<d)ekj)#cS*(wmDQoO&ZprI>MEXZZF0k!<x}xm@BQ(8|+>G(&K;E zzRm^M?e-QVRu^C~W}crFi*}o!#^<5t8h`GuGtc&$yZi%NhnmZle&2g&(z12?llB*l zTNYT_(rK7A)RXKt*A?d4cdnapZ0+qyesg!Uai~?0oV7k{FVqFTCsrnHH237L_SO3M z!Wg$2zpBI#Bq#gAzpKgI;AD)rSOoP=<@<RbKADd%bodR9vI!uJU5A?EZf0d%kJ@%` z&GuI%+`>vc3{#2f6*-BcqWM)@O=O>HDTsp#+ctaqGb#{#lhw2!xbcQ^QMrK^Lcm1L zSf~+mSXsclTD6x{UadV0z0!V>Xy#{ZI!CJaWH&SmKB$ui970lzSZB_J*4opdMBDJy z>|-rj-kbQ|W`(^8+3HmU(flm7s`643!P(ZyZ+@<t$Q`!;Wk}ZgXjiEZ^Vi%@XXcn| z25$75Kl_*N=<QGX*}v|9KWRf?+|T$as7_WeGkK`FeQ55FcYZvhm%sLszDefVXp>cu zT$uGu)+*?IPb?jpwAF9^+n@XSjKc%t{vEH3nsIO@uU8``Nug7#mlqi0ej+9(4UCoY z_iXxadS6Bwv)7aO-|F=M{`Z@k3J12#oQN!hG}jvYJ~hle{=E%J!Q%qvE;bdT_EOBZ z*9B1dLwu>7l85-Zck&oX``Ckm=NRTjWh`lB!u=WyVlBSZi+1_CcQdM&9mE)hsoBaF z45W8{6Fn4`m{%3RL~ANC2Pemto4pQVx)6C8vs_g#>euL0Te4;}vCns59eQn>&C8lG zR}GnOb56|r%&&k^w`Va7PWpn4jopM_ImTZ97V<=*5SDl_R@omtt)dd_hlo55qmABs z@qYn&b)z=~4za?0?Q(d4na82@Ro##^tij4x`tiM822Azn04Ch(=L6f`FH-M=OGa^~ zS)0EL?@0T{xng!Wdk1DL)`T=T_ra;KW)B8hQEeqB;>Et92heBuH5YTWqbI2Gz94yT z)yqg+6}lWVhF1U?y_r{?v6^Gsd~6E?lVcwXGi;)qJKD(*IQKga4FSqoRZOeE`TKaY zfRA<ZRhVsY-cb;}B47>en;ys;mLBR-Y<@@O$<abso5&f1<$XwOz$!i%fdOpMQxfW6 zclPDuFa>8<Rugc>eK4%@r4E>HI1HQuIl5VE)<<_F&d;%zVE$%5!x&Xh&+za|X1=mR z6hXIeEL0-{?j}WUftC?(bDzsF_v8I+AlMo3HLGDvqzI*x{^!pBSsxn%=02Fh%QKT> zRR4fAA~jImn1<Psyboar!8gp+S*x7V#9AyhXRU7Wa@u!kz`86Ir>mU2#_UJwB#>sJ zmLTKv7BjV`f<Buoi%d+$ciXq}J;`5jbbf2G7pvFY<QTz9XDVKmFuotj9c|=1WD8W! zOvS7GT8_gSa({6=*pYu=-w2b%1##@9biwj&`-}uLg;9u1c3;dyvbLb!I{p(CQG?*r zpbT=q$eq8S9zK?37$!z)^z4Q?qd&G0?I%1Kg$`JErn5sPsQZaJr=7Z+s0-Suxq}7} zqn)}%)FtiIt3+MePQ5_XW$o1e5Oqa6HOq-@9M1gtq>EFc&?IQ*{+G5CTCNM)rX5mj zU0<2iz<0;le(QlMBnYpXc}ii{578sF9Eg2rj9Zu05Xk*x#u3A<!8?fXy<;tiAJA*_ z%Z~c@0-g4$`hXMl6lXz%@g~^Iu%@RI>qKbNVOV`wq=&tk71_=H7(}NCeF;WY1Oak% zQUy@p02IUl9v6Vw0>BgsK-CQaj6?ucHS|DMVHgK{*rft+u>dfI0#MaOfYL;OGRK3m zxCciGK&k*Rg#u7DNB~*salU6*i<}C~z{-xi1CwSqKZ!_mw^xD0(}ggHUo;nqXg3vk z$n%deC7zlb;~DYD^N-_unq4J$w+Wt3r|{~TM&ps^AMwhHtf`e;y<TXk1!%ZoW+o=G z(XMrYSfeqnDUiE%#<6G<2bp;Xt!%fC0lcJ+Zf16l)qnd3ilA4k`aY%%srHU1Fq(^z z&_AMIyZzUIQE$Y9d~8W-Vc0rmdE4>PeII>lVDPerq*k~1Vog};PV=L;8|H6C){tb( zQ2V0K8sj?MZ6r0vS~wdz3e$pObA|oR<CsaCP+=H&0!5YypY!&)<r5ibYO}AvoXK8~ z#90l_7`9x}Vn}r~e!)IMV_)fFhlX-IhTYIuWWpkHAboJsoe@uWoJxleT!cyj)-=3H z_a$OmUVDQ$WSx(7TPg;>mS^dboeYSGY}0yIv`;e(X`*QuH(zT1<PyofdJb~;!7yC+ zEoQ)7!3@GbKmL(-{@nn+{rkxsU$H(k0_Iw5l&FoU18U>MDo8cV!Um&uaI&#<dq+D1 zUNX`(58=&+1+bd!jz`sCXsM1J;=4PdYG8NKzzBYZINf*mXOIK6mtp46Y%H}q7_kO( zY4z5QM)m%#Q#)ZM8ZxR|4rHyD_aRo9LqFkKv*?pltgAY0#D7H_!9ty`)S1u>-3T6f z@X!}1eTmY8haNoiWlCS6^x&bdz??7DsBSnAdQ5GlwH#m-o)xG)b0cPfsEQ*$Nu~Em z-(w2s&5BK^1I{_Se5qZ}fzfj@YwUWiQQe4NR{k~gZBcG(5U<gt#=dn$Nx$ONXjE_O z80@VkT<-fnU<E%!l+MJ4V1p6kYQ6f`j#F~o{t>W>_`EB2@{2x94wywNlgXu$OC^^^ zE)70+3gkA1@GH7A8te~I)v5}P;akl7u*e)=H=?%hL3~}F8Yzt0(0rqIbiGkq%nVI- z&7+)61@9;_L-UGE%uvlSa~7eXsTc%`%^!=biA{RE$MU4!u#9A*&*N$nir)wZkXX`i zbLhEfeud4$%}#@{otJ3C?hAZORFbjL@&VSchBanR5hlXL<}XE7Xr8a;PS}DYbwws; zXZWmP4Da!TZ{vCm1%eZJfBi7CA7%^P-S`-><$>HUf(XUn&p9sbwC_gRsEtl#&w*9h z5jEJs^iLAo|G`!;2e)sSCWtf?Ftm6p);R+~3#K6UDoH0F7o3TH5xGS=NBjPP`Iv!O z@tEbl-tK+p3-CH=;KZLtUFuf4nzx}tSEg|gJ<6W+7_6D+GhJv?{PMcxy#;PWS0=n) z4eaV-KMc#&?9p@)Q(mhQbDaw0)f)<(Fl$_H-wQ}G?dF$wH(M7J{Fy&F_AbN#o-jq| zOV<<WZyc48AER`(VGYyM_*A@f=mbE`X$9EnM^Ulz)O+wr@WS0uM_7+;2E5uzZ)I4g zJgm>cqMLQR{vdvTV$Xm*qrJTc;eMjM7uP!W=F?t>|FWmzfq6#z`mv{BKNNxBqtLhU zK(w##|B6RCw(e9suzNNwr@eo>(T)=R>+JeB82&}OBSd@GI4+N*%Ol{295OVjx1x0c z_le#1g$%{Sph`b4qswR@-ZPyC3GIjFy;r6m?Tc(wFJU+K1bbj|ZjZ%Y4i;618<v`( zL^lBNYq%Eu$PEVV;j}}&bh8`jHmd4qBQJXqc+6AWHqr^N=HO5Oba2b|A1t}#BqcbT zi!ZbwH7hDI-=uepo4ZzCj9TOR;%a=J!}4zYj}xD(fnlG9>=K{P>5nSkTp;{+m9{P4 zop>YZ@-ew8U&sGZzU?%t%eMu5V)@dY@}21VR_T`S;Rl`a(GJQ-(x!Z$ql)9@+xu^) ze90`|2xM<xKAFa~uRnW59bIe)b~a2k3yik7Rpp*{j4H|6@-7@uWjPLY<zrcnh}Ttm z@HDnxb2r+FvSU8rn2UGola$BKXoh<;uFqRB|F!=CN5tpN?fZ+KzX4q4pO}TcMQ_aC z_Nv3{<Pg>f-YE(XYiD(=VN@^eV3^5~`;oB7%C3z$ANGDq3hb-l6D(U*Gb+F&DwF%a z2QdKR47|wP%Col7NUPo>&a!m^8V-+JFjI362C(kMYlksBAD^TV>)i13ae<tT4CoEo z?_gK-IcKi6+@A0NA9~k)go)J<yc)6^qTB4J>0caWRkWTjeD{5?+bcc?`<Qxv!t9xN zpJMTBsUC{2!nKTaNOKvXSP~kIGp@dfR^g5#5^A~6fcB65hZAYIdU}E0fA|H?RWGUn zil-7MpkLVs=q+e7C<cq;$^WQzm$uoY_&2rk)=Ic9f$ax1>%-aeo$3|V8DWck45+J| z6|t+i5E}Jzay2>5(%aQw_u|eB_IOuwBs7_AG(3rlAB;NZC!<QLmZ;UgFKjVNe6xzV ztd-S#fEc2B^SpQNM>{{A=M1aB_+xb~cqmEOX+jy%0=!d`R;$2Bi6d9y#-#lyYBQcL zc#Mt)_D4QPY~oKs-yw=R<7~#z^5(&myzNr4<gsgN`AXLL_505057j$TtCv*4C68~G zwC02M!>UG>`%(*dmePzP2&~P<@jL~miKSRul{3A+`hzOckeBWD7*1rC_kwu{m2P{v zjZoI~(jsd*FsAY-qM0B#wN!f}dRKBJlCe*Cc@B3J7lGiq1&@Qzscu_mUl^zo?hS2K zGpEGIk#2Zo-}N`xg9jGf`6q<vT@w=8k5rRtIb0j3(SNQzxj&%R>|C82T8q{Bd-nsO zoBbw;PN5dps#zV5q$N&Lul<0eNk>UDP|{3^Ryq=8szfXuO&!T{9?i~uBnwnZ3tjAs zLGU27-7Py^s$fIx2Z##CPMSS{8M?E0y~H9Dg)p6+UdhxfR;5m@id9N2i&g4i^sv81 zgFvx92SGljP{k^90LmPIet4|v=_CNCTIc+>mugCCQ5~5B4ErGgV#*K}Def(Tg!g~q z`Yj`&x3r65fN)3Rzapy)jbwa7kyTNK6+v^6RauTzL6Zt=0UBX}a)+BqL*(0f`>$ka zG6T6k`@&o|Fp`(yd?~pox5XDe6{`>&3KsAz98F8^9c@7a!O|jn4(lZTy(BBBMs8?y z!UfRa4R9q)V62ax4t|92ZmUgIn}>J@Y`1IJ?r<;?vu_7Seb7c9#ZYD6h1reT#MHo- zBY~W4XCy2SxQ*=WR^y-(uKV}a^yTJtfv@Ivh<t70)3)=Vc@h7rd^Llh-FuHtk`5tY z{jF~)lZIFMYR*&R!o{gP*u5T0JX}`D4gQ*jFIow9EvmgB$;icmr!n-sZ(#$5q>+*S zL{q!voqS<@?hOW=6JlQtjTn|6U=6<e4`3aScU|sv>(Vep#g-Yl&7s{9ez8ebgF^Gw zaBXeW;smM|OT*gHP4>oFtSJsGl_-UG;tEx9M((~~iv9e3YNx#h;~~<tIl35RF&%Kw z1if}|k<c)vp;EB{k7JC-U^X%X{~<OW0HEfBVYnIES(MlB(dE4IQ^X{bFtjpmoq~8_ z50irAA$`^=6l6`BuSVTDi!C*Bn?gTit-=u<KSvwku+IAJ0{^*<GXO9FYX){Zi^~F5 zVYy)z))$-OON-4=S+O}obsRZ5!_5wR5=w@RX)fmDCuEmHi89r*=jpL<7**z180Rlx z49w-~`%nyev(#6kKEP|;u_mnuuNS{Q(Fktcd#|ec;HIM7?U<IJki}Mws{dkhYcU4I ztYXVZEyjN9!osZe!*lOwMk%jHvOsKEaqha%57B=XTP9-`$o&=NCjd5)qDJngp_<6K z5HX!mO{q@RzDhbD?Phl<qP~qKvD}e-28Mg?GlS@JY1lonusOpux-}X{zB6z#J)^AH z3Y7=U!qR|==$WHcv~&p0N0V>cC9{-fudimC^0}KY%&*PCC>Z%SD5jJ3OHsQIH$=|C zNmh|H=#6FUc&e-W!bjtXDbf}HwHuGreJPAZ*1c6I6t|1s0IhDt$tc^b{WsJzrfx>< z`RQ_~f-!k`CM)nr!wRI~6eEon9Xc8@OcO7L{D2CMIXp*Sz;k8-&WTZM6!uJ3I<IaE zH*@sONoS|o!i^VHR&RCcuUF|9Aq$)r725p(IMw#97KSQc%?O0NC@=e6hM|TNL3FIX z5M&zA4=WjaMpzvuMVE4H^Wpi=4eGgFsvpcth!1*W=+Jt!2dwXKq{+#Q)7S<(jqMDB zd!7lyP_X;nyQLi_XYIx95agC_hLyoa$f`YqSyjUms5bLawVrFm912r~iZa70MQ^IW z6@ij6!!%UeaNeF+>Tz7g+jF0N%)RREc?1Xw723{w4C-9mE2}p1E7HhM_xzVVv|U8u z3KY{<gBzT<rShqBrQ`v3*nEx;tlKa^#Ab$!*jmizIsd!R8oD&i$lc}lJ&aD-jAl19 zxhXWFxYkH2%55w*n?hei{Q$(38Os3+8isWXfcDNj1;5^aUAu(x8@ZRX8H*1(WAT{f zY7ph}a|!z<F>StNcN%#;R(_ybJO)|T(64NkxR9$lCcEX%=m+Q)Pa{$AZH_MgiDTf| zGl}-O9x$wn;N7a3{j(bCjNCg`VtC*#HFpGamxg}eqr))HTiy{sj2@+Sc%1Vu4EvZ~ z=B^G#4QuE|j7$bbrn}e>s)Aojt0@R>Hn0_0R3rfjnENrj1kWhOWus!elin}P+7fRM z!*hpzmKID8#FiK5ZVv5^K2>a~n?!-!Wx*~;j^RAFA!O>-8K2+zFByg1VGQZs^>EU# zFnAVja;NF<a&R+$Mt{dEqeOKYT*1{7=_F1RFiBtcBm2+iEP0-{6C+$xFT(ZjQ(&R+ zE*Ytw@RfnN`y+c`tg(>k@SYo8&xUye-kI24tmmLIhsm5D2{A)WnAS9N?YFmzog>+& z?mwc(V|mhvKM>-p;U^UFwrqM2DCq35tX1k37$=P*Bj4~LN0jgEGk(K3E4RZgw7;x| z8`YJi@X`y5I3|u}<DfaO-*fOh;4A!@em#vu(Zj$o`wEVw?s%jk!ec?iZ#J?petCtP zeBp!23EmFPbm!vg^8ohNyOE3zuSODC2N#(YY6ljJ)PRY@aClEs5v*unO3j6OupIYA zd&3J^4MnDL@WP9AIK0C{UzjHVoIjldMdT_O%_i_8pK1#)k2C$(tJG)~xrk4(jC>3~ ztSYhah0lR566K4*O7W>|S=d|P!MWLp`#Gy@{=%60N;bY_`fDHiVQv=Lfm}$ay!aY? zBm^w`0~8e6$U11^?TxJsbJ?GGNujZD6Jo%6Zc((hu*EQOeXBM*?RB-gTU1-vTvS`U zNo_u<52f=Z-(a6{r`q;D2KRILdfbH9WD6n_FgMu`tDrT?_A%y%>SBOizm17pnu;It zbN5%;&9AX_{WIJuvL<7zKCE6#dEToQp$UhZ*bl1TPX<9#`4R*><*cK(?~>PDxB)G+ zK6oxJZ%8wJ2`M{-`V?7nQ<0ie?h|pZI!yrf;32l^n<KA+;dPq^^tz^KXAH2QP+;~B zz<qWO;Q4a9rO3)eTMOR6Tx#beRBu?9V&=ThK7dMPnmkN<*n(o+d^McpqMGC;9_j_V z^$npL*gB3QqIEv|?QIBa=$Z&Sjy-B7TM@>>G0oDqs%A8yr0*!4Z}2sPuuBm9l1{R! z`n~=b?iJ!@flq$FWQFo#i?8NAWYGrFU?4a|&05X0=n?aiB0bPBT)&FUJRAv(Wf|^4 zZtBDQ9U|J%2pcf~g+3_CothS^#{v=S1$ApAnT>ZOEn-HD9i(Uvg7~3OZmYY=Ku6W# z8r>#z!o-DwDvIjNjM_!qJHpMeExzzD*v{G#DWVIw)_j#}WIpq7w&+n%2CUKOrru{T zhDx6rgf$oTd931kw8=g*FiOm}uRtIjKz_4J^wos+hW*#-9qDQ%=N*Tl$#83<12n@^ z3}1zt3=;>ws=Y%|g_|7qwP4suaic|*`wI94H~Q%Od4+bUt4wav)eGD%L;|&b=l<%Y zY4#S!r3OreZoGs3F(y3Rh`&G7{xI&ttNYa@0rOKip$#lX!TEP*;Dimq>8zGO^?@W` zcnkf_^UipOBYYvoTnrlxHn4M>d^Ooht}8|SG1>FgyhO&D!dJQP{-=>M3zh8kBQJuZ zc7!nS7wu0A<YL{`ip0g7w(n#v9AoDm#MZ?m-6FawgE*<6!4Zx@%w-_Q4fav8GC1>0 zWo*MjPG{ofjoTZJw94KPX43Zbdj{tvc*hu4r;cnZ$EsHdPP(>XeWO<F&f!$7MfGrw z$4O`hNbIZmhpM*^{ngu(7_!g_*k&A#SKr;+Sp%~B<eqLt4$zB%2RK=(LPjh_yQ0dI za7c)gLJOydTEMKjp+g{dMd(Wo!(9`TDer!?7qA%Yna+2K4x~rA%3XuY(e-diMBO^Z zh1vM6<LJ3s3ttno<BhzOS#P61W1gLIFBnPXtKrX~C8Wf3W_apee`+U80{DcBvglxB z9`0nmFd_3Jf1DZb_vv^Nu+IALK;ebsX}2GT3+lKky|*AWJ#+}>DQVG;c<*2{B-y@d zI_^3c>9M7zk&X`nErDr&o^K`&g!3Q8>c~z;Z@^ObG7KN;!VHHrdw|Zg3Yq-Yp|vGz z%#}+IcF11^%e9?u^%XD6T{@$)?Lo4Y1$|N3Td=>JaHq=7yiGNMU?;@*J9O2iw;-#x zZ~=`D#N+5UXpD*N(d~bjkGUTfDYELTV3aj|yIpsCVp;nA1W<oo*S@MSt7ZW=4-TO) zlcg|O>-{lYtXyuF>U>h1PJREZJef%6l;?!R@;G?TL?%*z0@%YV<Aq#@LVo?GQ^+gn z%uqZ=A=|E3obd&tAUc(|OvME)sj%6daW<m7>N6b}fH?0otPv%grcXfoN0w}5CABDb zn=h<hPUg48=7C~XAFjROqabVS4rn28+0P-9n;s{jT-cHWN-WrJ=gfykh2g!$=D}if zd$GBrG8H`-7x8dW5fdI0H{4YFwPU;7c~Z?Jb}!5Ota602J$(Bu=2kGt*<PD_#g_Lw zbVjN9MOZJ|r%l7uEEkCrH>+?NW3I2}CTJ5jtgd1r6YGz*i$!0}Ks?Y3MqkZw5a2Pk zJ;v;b#W)9v6j?wE^QMTikhc7M*`M+?JTZ&s1<No5-N_+HfAJjV0dNx6s}Xoyjd4C= zQIGoL9wA4v4lskM)?5zXH8~LQvu}Ju8rU~b6I5U5c*+f|^CJO*nUUNmw7u-c?sOTu zHuF#^!NWLj4ll$r?5N&{TuOc(GU9C~McrtJXG3S_AcdNx2XQxfZ)7IZSt&QZ!9ui~ zq<)K<ii}~V^N>j`q!E-L>lMpsdl<qL*?`B0tybL<LY*unB#SzSQGl0RJE+2kJL2VM z|Cmg5A)HSRb>?$>1FF)#0C|xubmyP6uh)@C?_9`D;rKlcta!%b-wf1QsL6PbqZ<CI zbYv&tD<37YKJ{yqktbD|VRt`FI<A#N8R3sKIySz9B4Iy*^IOh1aMffVn(XfR3>dpx zi`om#^B%R8Z*N%~{kHO6zKPMvvOR1o(mXKNL*uy&IelRtYTjuckKal+_!%2t%@NRZ ziy6lrdPR6WrtiL*%T%*Td8q|xoE2Q4<oHYaSD4eYf|;kOm-K1OC-1-b`&rGOIUhKb z`P;ppuhwh8L*Pm9Vyyo*q3d(G!V1Ji6l{96!b~KJ|2X{}-HH8*AG-5}sq=rp$qj<D z0j6d3*5a%A1yAgQtXwPm<FB}Pw9md0cex!%?r}s^Q(^gew^Xe)73v<;fz6-Cvj<L9 z3m_FEj#adO9&{0|4fIPEGwy_!YzE$weO}Wq*%QGyFWD63q?<Atz|MobWPgG=7J0Az zy=pTovuxC#4*&V)$knYwR%kL?@2Se>{fZ{klC{MbJ`6U7szEGGFPkJdIy+)CKb}1J zNn{HPdK1c{+kyH4+DH;mobx_)n&%EPha-0=MK_=^k;{UxjY{i`2{=esT!T3tVBkYP z+cSB&7<)8-^8Ud56rb5VfVp>GkKbNJyfV0_h|852EzOV7U_YP|2j$+;U}OMJ#d0)S zhATtZ@oR*(*jIS4*t)qd*Lu#GKtX6Ahm5MAFFq89pJZ*}d*fWB@kHv$&|>1`{pl6Q z!lztXwV4)1&b>vgV|lNgM+yaO!FeeLpnNq?DO?QBiJO5bvIkV)3$s<x8L(<8YI#l9 z((&-X-d2I8bRrSW;%0h-9b&a|bxRW*P@Ma%ujX{5(aY5q_`{}uDpdL?-AUakl(hs} zq&$e#jDHHs*ez>S<Zh_&>DrSaOFf5DB5cff9Y=3aAAZCOlb>Ec8PL){r1`yx9Pmmu z2yt;T*)5q4=zA|afm@4(8z<Eb_Lq}k_ENrv_S)Z}e7uE+#&I56INt8|p-`!k>{Tf_ z^Xh9K14B3!DK~O|3-&Z(9Ssxvpa_TF7pLcpjyfjgM}LwN4vjdxwb4Wlpct4Ba0-bV zblBo6ZjKb7rDKOX$Pc9|#c5Fd$^0$hjQd@N$=x{%W^wT<Ct71Mmf*Ae&Rc`$k0nTq zp!$Ln(Sd_g@HsAg+S&3JV(EnTYeyzA7(C#ZYO7aO=oWhwb%;)Xt~V|3F)C@Mk^7U{ zs2&axy9PzMKZPdRK_<1lYnepfY}5C9yRzCaWZcg&E{6Eh@*~k2q#h`?u^n>|)8y#! z?g8~C){N!->_rlOl=NY&Fzu1BfhEo}T&OwQ-hK8~bN8<R$6PG=9{X+lx-T2xjTk1f z8Y27+VZQQrOq6!XWwwsdXHc0-vl`HE9%*2fv+*qYk+WV@`>$L~<DQ!G6X7XrmDf;< zzDCe8kNs>v18b%9*$i*_8v0(z@z;>rvX#Z@%pB}i<EJcMK*o0Udy#d?GOSNmV=;^T z#blla6Nohw<*p2Eb=HendcDX!NemCQAzNNXaA1lG7k@9I6*ERUQN1Fa+tk?=pQ(6W ztP*fa*&3Rn9!9?ViSba2wEuon{Q81^Q?!C{-W2=-*MxTpmSZFIo8ofy#2ZD~WXx|3 zb;a%;ort`Kd6Auh&gZVjo%P7568l}%_SnQ;pdqxWTAY9L44el6|6)nl&p##8_KXz= zp+6|C)BCG}H#r9(*Y?Acs^FFS05&)h*NjRr05Nc<;Vum}3s(8=SHsVGtoLyC+ME_V zOP!Xk!~XWo?$-RiU^?uFc48APFZ<i)QRNS#y@U>n2JA;Ls|H*_z&abdM`ea}rT&2H zp@GH=Qehv~aAa-pm1(g3qs?)fO<knu;U0|0H4^DC>?WI#3=czJV|C{&<hjonS%L>P zU50%tx~l#9j;FN-hbAoXa5~iHIJ#2^8)fk@WjJB#En!M?4vBm`B%1tPELP9Knx_~z z8+!Fdc0Da%@5K|}Z<YO=B5Nkj3}U|fvEo8g;qGfz16#PeJ}b%%F30&rEuY8mS(3)k z4=MvTlet5Q<H7r$OTsBm@awdqTr2~wgPyZJ-P3(FYhc#zo~AcIYFEN4U(H?6I`v%{ zu<l`fV^m<3W2>qJRla`a0OzQ^6-Vt$+aI+rMbg6~+kum{%C``bFT5E-AhrS@lF2>b z3txd&9^r19+IV`CjLfj!z`^UDP$arYEeiPK+3FB`<_aEQ2YG<a&m^lOV|9QX?a8Vh zb%Sa_PerH6VRG;h!@6V*wgGQXmKv%Ge&<xp7e%>y@Tq0%0~QM(m10c~#E~;1-!Sw4 zXnXSjtH<~MztSNwP9Z{Nq9}WqG{(@ObS4v7vS)qUML37NX*1{0aZIxB<c;M0_9lCp zW|~NgHL^q~Yp<6>$<ktJevjvMzs@q#gtzbKH-F4|z3%n8uj{(6`?{|Cy6;zg|6cP3 zmLBs~$Jp)_4KoL^NxmZU_#n6CUQs$<0X*7rFa0KdJ9`ZrzPxp&FRjnWY$y90ty9_f zQQ}bQwR<N{NQahlV!)mq{qg_7%+1CBvPpQw@u*K!&Iby%WVYlygOaOi&Bgzst9h56 zn+p_VKAQYZ4>+w+{}=z&{!gR-)0*}_7A`LA|E`C!{ZCZ?Kb+IFf2<qaJv#pq-$$;3 zs?oz+#P;>hfo7a*8%_wq+67JpXA5JV_Z|%hTux#gG6H3W_1I1i5~@mU$}{wq`L?nA z!+MejqI?F;6e_cJS^L3Mh<C~wMC0hxDM-PYL<PXo*@0QhAntpUS@yjx0w_Z0<C*tB z^ELm<4zm+}6;j=W1Pjgvp69%_U_DU0CTD8%^EE4<ZGLM{MH?#VP?6zGYvFvbvV+-U zx$9hzjV)GL08EQkob5{zf6cJUx3STc=sQpN$gTn$`Ht@Bqg*CfqAwD~sTezJ4NX<e zwOJJ!E5K7#Hrezw_c}d!uekAr6I|75kf&>03Hf5~XEa3BT0**{-3N?K5r2V=kS<^Q zAWf>z-|0Myxp1O|nsS?svnUZx(le1sqc}jx!gHIwT*T(UMnU*OWI9Rq<@i<Ju5_uR z5UG(<@cd7WrX9eXeCfx@qM1uJh^|@~t=_i>=R~GPs$Or!tVb91zD3PqcTSpPKFDb? zW5dx)L<#LnPdmsq=LVp4R=^Wk5B*f3ARQX3!I*W0i)b1(oQtS%FG3>bdP-Xy)Qfl| zysLT3Jc&|}o~PO!Zs13yrpGPX!eVg@73pzpXwuAzO+Zg&`bwly$uOg(eNup0hRUBQ z7Ho2W*ww03T~d9yXu8;Y&o!GUCfPMR#x+aPZ&cJ>rLcCcgW~xsR4uehuVv*PKjGx7 zD%P+`IQbOrAhr1-oa;Z#3+ggUhd&l=8Hej}xD2AzMGJ0j*`lr^-wB@9OYE|5t^0VA zLQ<yfO-fxi@-o|b?a#_GemL1enOqCeqHZ5DX=@YL)^)Vy{lFH5+(L?BicB9sfk>^& z(tFMp-U*NzlX6Q^Xy_#w!qr6w(h#4^>X-V)d&o7%`W{Z|8%_S+{PR`-jcf~aTZUAT zS{$jP3v{*6J`YIA^m)OfGli|3smd5w-C9nB76r_OtsxEg7S?ViwDt=&GqSUvw$w|~ zzMNnQO^w{9+Qp<|u6DF8?h|^`B^SKqNO4ub5Z96%nZ9;&8?b)|)fu?If>iI#GXYwg zTdb087zN{f2T96!55EZ_d_kRQdr`r^oJ_RwEmUSssKcC=`dEM-TV)?b-?y~^yd7l- zY-Q$s85>O8CbO<}H)b9j5UGO`V2Gd841DkuI)cBH7rt0SSGnnN7wM5&b=+%_IsS%F z#+-HzwIb#ek{anJP30Y7Kr5MJo$qHn=F?&$xcrDW^;S~M50dPu`<hBJ6j?;lEb0w? zPu!L07KpOvDXLc!Oxi=;P{z)tG<h#M-ck@bDD|w%PL~{yq--p=4yBY$wms+}KiPWm z23JfD_O9AcDxCb3fd?22C*HP~Mp&#B7Nw6a_AaL1N-Rh*mb{O|%4uh~U&>oYaJ@k| z6&BVv-acP8$6wtw0`b=~G!7*y(`QXaFGhq#ML--Bd0t#|hOiiV>0XCg^KefWoaP*A z<lzR!*C?%d24t(eI$knQKt>KI`~Ag3)#VpnMmyC-i^jupZ!tTk^`R~AfER7nW^VU- zoKAkgrEiIKs>@4VmC35&Q6<wY0NJ7CcmY^lzJ)7wjY|EdhWA&)U+`HBI7q_@Crbdq z@4-KBFX|NPyUp;EHvbv-tM|BZYYBa)=@R-P{=>p0^fBJ4Gs?tn(T%TBwJg#xoIC{w z7A$xX>9$6V;XUguS?e8r8ZrI~nLC<f+eDAG#h0<UNRcU)pD+$murOG*mU@>_T3oAj zaVm~Q$5AE!Mi9{TYj^9XZ^0t^qEb|NA6hp*sJ-<T2wH84ucrjaA%WxNn#$s?aAKg9 zIMt@Kmb8X#iL%MIS=fT3~-KQSbXI5ldkXmiYH!tNVy(r04ESDFaBJ86j%f#JkU z^2QRoVxfa}UN7+(G{oO@$tl4YBv`c$JMDr+XA{Am__u1NkvjDisf{YCMx)M*mjwdf zvFTQP_5{-e(v{shR;G5FX~no@ONS22PHi{xB%DZ~f~c$A7OJ2$^}t>9+o>jAD^tt7 zpMe21j=P8DwQ6<C_)P8Ew5up3LTB_u2%|E!L(M*zRP#w!$x+i&fNCyK#VQ$N{Fuzi zLf#`Z>kcGt4>!`icMB;DbQ}$cJV{-?XtqhD_GPsdhZu~;wH1F>jhsdm+KjbzsCorK z5old*r>n2>Q<EgbXnBvI<-}8LE@;ajJp@67hqNqo&YhzFW26&?$#TI34Goz+8p&G| z>*+zDubV?(|8}aZ!=PZ1(MQt*+tE}fnu?zmEq!g|<>Ys)Y`MBJU98FlIGqe4kq(NN zdC>3`9=8*)gHyp2f0Q_2(AvLv^!4W4``SC_WU<<i$>`75`*&%I(f(G^>ee5z`wi8y z9mF5VJZhl|zvY(91L&&>yY(a~z>`QeT#ajb9A$X1)2ia@*pNIjW2X;FnL5iHzWWZ5 z&Kx><Tj@O^Hyyg4yqt=+5rDe5qe2-eT0d%~nL3V(MXd+Cn}fv6ttyh>EuS4u?yEIX z`bW(kJ4nO~VcvaULM;&nZd)ne_c!OUW)bY7<GA@9|NUqT5>Y6U`ox&Z{}I+?Y3x5k z0CzZ)AIa;pFK}9ADN8$>s7)2i?S%UD2~sQ%kZ8;A2?>9#$(49<n}ixYiseri2?@)+ zt6j^9RW>C|$ImI2--_{^V)<O10BP`s4kIZQdV*JO5qp52aPoE0hbRWzv4p8(JE`51 zp`L#|FRaaDW>dPlq~)9X>7et9UT8S0#SW3$8^B4;qb3koi&pv@*zn5_r-s)RXIFL) z=mJ`@a*^8Wsp7Lta*F6gXc24@y{ZE8kw<DDRDn+^z_bLl;u-%3vLm(6kz<8O79}id z*Ol_;8?2$%F&UgOecOe=(ES9AS$QHNwR5P<98^6=Gk*Ym)X2>ksa;8?k6kQHa|KNx zq<@ok^?|nmKpGqCx=lfw)*5i<5~@jeO>lpzFx#*Im@*xkna-9;3$c-OYwJr+2(F^- zV8VV6pb~=D(XNExyxe4c9CBz%Pdna3;FOxZb^!P17~r|_ERWQdkt`Tu0iJJWNEYxm z*_X$~Yejt<NFR+XU3Bv;!c;H94!uX;F>kSLj(by%gYsKaCO;!=jbA~Mjo^LnAmA1W zQp?5nw#{ZC06UZ3SpDx{DUDR{RyOGPWHgH{@r0nV^te`5!Lrmx-uNj}Du50pOv3sn zslvbU&jy{HnaQ&O#UCzpV<u>;OnGh<>MxnQ3BwATon-=-`}ol3hO&&F#m#K1o9c6H zbF$0KCc1a#M*+7klB*_&0XvrFO|RHQtRbj!8`EXkp7lN469i`^{|X86I|Kkrwt**X z8RJ2y2Gaf65;;3TGK44|0^agP0-jW^{}4F@%Y9DU-q}zl5Ch3ILdqoQ8mT>2?QO1d z^?rNNc24NkX*tv4h2Swa!=K}edA^PvRHTP;MgSIGKwTj*J&2W?eVsuJv!%*M5MQ!1 zYOKI=ZvZUhKf#Oj%zW2yVS?IWfFM=Z{|S4j(fXFt|BkVkyb7s)*A1pw&4_=R|G8>S ztE-1sRMi!$v)C@thIw|GMS?dW{p$I}E3eZOZbh_`D(WE5+wre62M{FLQKeTF_*W_a zeZKr*Dj!@C9ZsHPwYeyAg)Vz3Z$AqGvHuWQ&}qfN>7|ki(q$E_;L=2!Fch(wUl!UB zdoFf3+R;}Nc<9f=mwMnnhX(HlibZtZHXJ*sfAY&w1CZvUUUp4Q$~M*3Kxh-+SJQ6w zv1swTi0)<OkJAn@`>GzFspb}uNi(BgjPPk(XTU_pj5j=JMcIjLwzeW;CMoH6O5)kC z=1h`1$h6S=`DnUMmvjms=;k1Zw~bV>ahy~oQ6Rt4UO<D)g}K>SUvHrrU?L0@E(QtI zzFaTE8WlSCMiteD)M9qE*iO8WqM1(k)s;Iim+QIQOURAPV79XDt?PFQpA0S%qj{GR z|0;7A6dC;z6nR$t26oCt@LC3sD`4eS$C)BodgT0qq$ga`Lf0A@T+T>;C;;JPA0E7F z3ix~Ql;g)CE+W4N?ASs?Aw+}|5yqLRL35qYwB6Yg8tC25Yk{r!57mdXjGl=Q;To5t z)g^{vbdEFP)7)2EHKJXs@C{eCVzFNo9{;YI9oxTN&8I$OT1|15yEMSuen7>{uZyGR z%Aiz>ik7o0X09zp(#)+a9o{ZHes|j9NXPdecB-xG#5D>@=LkszA`!+Pn=YAv=XIrb z+mV(ESo7nXdF_vKZ^Z7(x5nkddutE}XVOqfI}nbBJ)x5KyJ}KU#o`|pz$aZ`@G&lv z+Tp}uAhFjXCOZ+7{bbm5>ozF8+v19<-y7nmR-~tQ3&317lV<B32(dl1a2kj|fMF-Y z;%&W)9lWu_#r1Z#?N{O?_JqIF$OffocTT^>ZRk>K!u*QTSBU3_C#0SCt{6MZC<lp3 zhfWD6b^D0_IJpe(ksGqZ8#o*|y3mpOcr0@_?LcS-I~bhypBo^T1Lo<_gj}VME;hb? z0bn&3PX{W@U7A-Qd5uxZ{8D;i%Vs|+R#takOs&k05`TI6MrVFeT-lOa8-FcUchS=0 z+l@MjqbLgtC_1Gc5Chu9h^-4yHRlM%0KwXN1Av34SXg8DuOO-gv6+WBt_FNxdj|=r zWZj(k!dszQAkTZ8BCP+7gR*nyjkEr2VwRA|B^{9T-r#^*J81fG?%Q<O@?WketAs2q z%%z;UxB#9cdvl;>&Ms2+R<0&zP{4?*{UfylPv-<-De#hBNr8s>YD&y>wThQ6jBRFX ziL^Z*U#D7s*mXWqtxt7q5>9ZHtW&{ClFhgNxwQ_bS?gc%R$1D>rg*yKWK~H0=Dp6I z7FvutUjSH4dmLIN2d>*(S!f=8hm#sncJpDAEFe#kh!qjA`f6#@94KIK*gNfTr^ij9 z@qCF-DdFuNWZg!VMJ1Gko9p%{>-O@3Zf_NN1NHx(qyz9LG^nZh``0ooVqHwpt2Yf6 z+=55bin*RK9KSSkf$&;OMXwvo5#T<VV5V5L`MNhy@H<V~`*4tPTbygSSYOkj6H+3y z#C`W+HZ3MnAds|945Ql2%^LPQidWfQ!q1XlTs9*Sw^+fc<==orvl!oOHh$W-q(-{p z`y{zVgIK9-5ctd9P%s$~IVne}8;0LoVnUSd$yhDiDV#i(Z10XGK^dg#NDf{|Y<NFZ zY822yQ;U0dDd;QG&stD0L(b+(rq#$%G~(StB|AM*53-=c5YXC$%gaI&#$l^plx3Rt z0oJ*dV%$iW<(Vz1sQr(<Xprv5T}v1F+_lr;m*3G|;1lHvF0J~zXyD*n2)D)UW-|P7 z`~&LPDS}x3tN0z>!;2dl#*D0ofp;R;3(*Z+U?UaAGEcElGv9Bkys)D;Zg`Y8U#>y# zH;QL9&GAZItJJS8)f{BWy}@<nt|t56E(TK9{KGciTqjsHG34Ll`y3djxh=A5z;E8a z7r$IyB9!;rsS{4@3VAfzZ$W@j<3JLSDqMfjQ71LN9O!U{&@m0ge7OH%6l^aZLkn^% zr$grl{hMD^)5-Z&3mFLl-usN8>~J4HCRa~#hWdpJ&mb<?{$YoR9!_UUlyqSYXkw+) zfOsxYC7%~)1oV6%z!!V(yJizVF>Kdte*5QM6?Im6IDq1Xp{f>Yqt~+TYo3-IGEr&U z1CT;(PJ<f0j>$3B_mhH0Q}o5t;G8`{P^50^&d8bR@6lz3TV>1VoJX1JqM8x7abM|< z8&`2tUZ;mJtm~%bi|!Gro1S}<tjO9z1L?1^ao2|w8t&s7K7)q)rB?QXsptI5e8aZi z;dN0dx1|GxF9cF2dSORgoLcI2l>*VZ>$uzJMjE)94aWb*d*yXmXH9o=UVuT&+pb7C z7QomhK+9ByV|5J$_qU3Jl=Ll0LRyjpe=#o-iTjAD+k>lsYRQ2lMCz`w;lE3heizsP ztLk)Nc}^(yRL-h8J^QG}57G=dk21OKhGOb9*|d@Tg^YIJHh}y_w|*;%Me6R#^=F{o zNkhIQPP6Cd*pK<S!u;pgCjdM*znW}8Z-Y-KKfl7sjd_P}FM=<dh%3p<spRGz*fqSd zwh*A`ZC(*L(3NHmbQi`fs}X|&?%e&0DiQQrd8N{!1D^#ZwRk_}u_xQuy#VJ~=1mxn zWO7XD7c#Q}$vfC_;{tuDwBIkpi1bz!7lVwLJ(4+R8rrgJG-mPnDR>d!9gL672S|?p z3N(?rCwHY<b$RF<id7fQj|Uw2i&rwyIFc0ypSF2?*|e19&ez#ASnoncDoZ~(ngstk zOKtFuC6%!zw}eojZ_nqNMW3!PHqo0^Yd)2pqI)u6_^SXpoLpilCwFrO_j2A)LI$ON zvdaT6mf3CoadrYw33P9bw<s!!<Z%U{HjNPL=ENA*yc2`Q<imJio@NQkPoWRvW*Rad z#+iaa7k;!yW!(+129++4clJMXz<B4Y!}RW3xQuXO9_f(u0;G?T^h8xBbjnEjm}TZk zs<yKv-5!$W?3<{gr);8T=-Fj#mY(C`4oA;}`{T0HDTzqkV#vuv?e&h7TU}a$2grK~ zdNWx3CXv+QMmN1L@FtN*Sch?$ToKWRw#1*?-2cE!k?DV`mvqT<|5e8wp65p^&Fmpg z?0<+`1gbRk&$ebaDDcnjD-O^4XO|jczJpovv*&x>;LlqZi^L7y$FAkXwj?{2NascW zLX~x*znej_)SG@BNvTk0!B^IKGk(I!sjAx$h7X9&1VXht{ZIz83oqVa@MT1=4=4MR z5Sbz6B~te<L*94(x1`m$q=$o~$&zR3(4C_-7R{#Lj%C$Yb4cTf1UdXC)x)xW>S0z^ zaohnEMrJq)%?Vn(j&iuEj#F0MA`)GJUhk-p6X=f0<nL#scoq7@2IitCU*gPv1>kI) z1811PIUjHe_`p9zbCApUsoS+t-C}0hkWoU^J2=HOk22aZIoOhJq{l(2-$mrB7zS!9 z$cfsf;0np36niYoz0=5YiA$AO`tm4tKT28v5W0kfM)Eb9_J=Do9a{K;@K&_(lcJG! zAtl=@)7|HiE_a?CTy~z|k<u3Wuvip^HAz5DqKc^tOn4r9y<@C&w;IA@nH3%fY7B{~ zq=H8>EVKshL=Ea+uj^nNh1FEON>t5K@2*!&3P`(dYeFuet?=ABehp(q9&lYKTakCr zv}A%}$(MTPh|q59^6`;EXj<9nje0G@KI8mXMM~Q<?r1}qHN)|uIxADD0Do=$l@(oL zRXvhHWVqVUJoAeUDmFm;Ri?|dJ&S!uA#iK*=y(TZ91nhD1>*x)0DMoRY;O1Gb=qBb zhg?K_Or^CRcY#y<_WaYBZXwldjEDU#wTV#oE!^pUuttyH>G5?Qv15M~HJJ&Bcs4nH z=f^8%E@rxV%Ogy+qu}94U3fPt=zu;IUZsLp{-JQ~RN~E4#HbmmD^kHrX<0`f*!gAI z5vm8JuV!b{?tUSLYSV7`W)b#yK9+i!gM-T-!L#4qdh13bgos&_{+8;sEOZQdU^wCI z0X)KhW{ktH85wL&RHmmap;gn1N|dba+quy>FM|-Hx}#z^she~BUi_nb?tstAkW)$V z-aE(|j_n7ZpNH2q*eDn^&21FiPrKfAlo1zYHiyn5iz=!+eH^WNxuf5a2J$?$1>=I= zuhR(hMhv)hS1~X?)3Cu?3+(Vjz;~6D3nvuK49nqXN^z1cxAJ}8gyAE6^~c=zKX?zn zBtmdds&MJMgQg7+Qs!{K$bBD9x&R-}c#R<2mw@Q?j(@KtXWi~#oCPPdVWe(PLw-$5 zMyf&jS3*oA*cyJkPZ)U?UG2nFGgi|<r0yd4NdoW6Ri-v}CkwT4(4#rEasS{kE6vZ7 zFMfB5RisaKs=<a32~;>oyZ{C_;cUdu4@Rs8Z$@7L*V)4w*KgAG3*_3s^xp)nk-Fn- z0D?W>pm#`K$Nz&qNj!#DgZ*(WG}0#v?X_Q6zYF!rZ*09U>GC*;$VV2kFc~-AiGrsU z(Vbhnhc{SESB$-MV4zPbP5LBvD9i?R(kB&GfVFcA9wI)N<n+m9j|Kd#yU947jYg#t zYDY9tD3_3%)jqm5y}!ov$<EE|llNn@xD`+y3aJ|P-b)9_c-kDgM`};lgNCcizdM;? z)kR}2kUqJrAJJuB-KHgt&}}wvwxMl*KmKWv=>}^^W0ZZ2VM8Q9$(nyRi=>61Fwh!x zyJk2cH8Lys`vX`w`H7`uwZ`vxlQ_w0i<)DOGo18(4CHdSR@23J9p|*pnKfP`m@-C- zAG}LvG&5t)QX7h2(j_q_oKY6LH(Wt#>DMTW8ImQf$|*<2*DeEtj&ykFz{vr<{-NsW z!yUPvvCO=(ILzMNtpV%N|Hr6EGy4DKS$ds<C&b)7lOb8S3{_!EqgV=xK}VA_!2!LS z$~7jm#ZL<(0k5)DoP*3SZC!<v5=m06PAA9TP%qli`dunZy5!b})N_a1_)(eL4s#0Q zYQzS|m)so4M~ZHmR~R>e`Z<NsO^=_^=kn8IwUof>k{{o94D=t@a$;90eQs*CVPwW3 zpQ)(R7h4B_+%SlwROt7A(Mwt9W&DJbGgY-=Gk77KJPrWGmp8!GzV@`eVvrR~&E#1o z_1YWeDjnwhO&M^FOFEn+hh#rc8PAGm2`~?{-kV+8c&>nX|8;dzv%fk)Wi-}KcBjoq zoukktK|c>u4uLvIS+z+LT>&YI_0bf2{(~WbEdqW|(ZH#G>#B_wYH3<*Z-KNAAQkX} ze*hD4y=r5ZnDCV`wULl8sg0Xh(l~m=5D=;RF_cK%R-%EajSYH|+PKu~NtR3eS&6KI zCtyL%qXn(;@SJ@tFTWOU1nQYx1#Zxv)j~Q{N0pq0vzy6F56^w$_!bG1(1kJ#(nZw| z^JBUvd*_;oCzEcvCo2rS6DulbS-NC8ie^*Y^J0pK|6YmIb>tC@8+V<dnt|2&%4L$m z<49pAELeX{s2KMtrhA>O^s2X{eaZ~&Sd)`18%rTeJcnpE9SkjVx!000n~XU{9p;qJ zZy=l*US**@)qC=2gJ(l2pJtS$bokgEdaR?YS?kwWnF8hWr%P28G31m_H18H{!DN-s zeNaK5(9X2)w6Lt^JB$W3-33lKc|4rwAI3kqjE)jq<|`NgEBX8LFH(Cu{OW&>E)c1` zLyyuY(Fvb_1Z-EA%=wRgI?UzATU2RE<iGc0{-tO#Qv0GRT;`O>Bo(~XZwg;diR`Z; zMwUqJ3luaNB;BJTom~e~jA>9h7OVrNLbJkyVz&(Zs}HzI{p4FqwQte}_;XGAze^)2 z3x$QG#6-H1Xy^)P#sE~zE0I%|(4zSbc2jbiNZqUwSz(k2C;v$U{xE9=1(J&-Y`st3 zLyC7Rswa)cxQDN($0a<wNRx5`Jhax`M4R5BlxeCw3iWxOcpuQ9*NrqFdLa$+M0y7K z;ZKsVnNBI$67J+eTM9cbmDck`c4vj+Kjb=D=O9AEET*{p@c&?c&ph6R`r~mlY`XhA zV_-Iu51~H^g>rKI-n@WYUtWVq?FWWw>5jD@I;7WVcKI=ghn!o%kM}Sm&Z4Oew7{aE zNTjx-tLsm2ieo2{X-=ryeL2OkeejqS>tm!icB2>{Cv=LV9E%*)aLNJ3#b)ks23MpR zfjIxr8<1D<QsesElRllKmDDz!v9{%&0Q?5Bukrbug8M``|AK%2cO+3;tl>ubBH=eV z|NaLIt59E@!#mPw*@KKfO~I@OWw|llb*%Pz-}&{tK`s~hnzk#ndLy#<N~ki@7dUe& zYA?E~N;hf3orDt5Nf6O}ABe6@{YW$Q92HRXxsD3RXHjrefDOCFl2_+GFWPekrO|fO zi8Nsnm9N;#u8eJlcKY*0Z0&68U!^2uLvM9c)_pOl;l$ZWM2~(Tm`=X~PF`mfywP-C z3F=_)P6_JV3ukXaz#+9vU)@%@&FDYFgmd$M;`OobeQmL~mZzQRD^lB*qaHA1e*WCP zZ?NrC$kk&>Y;0#=ObTjl-=p+XbQfC)fttJadhxEXkkq#U{BZ_!$sKnKj1G75BY{5d zV5baeV+o{lw}zu}ULX38mbCOGT97W2rjjMUTX=3G*EC^c1{n{?(97Nu7cBMeag8UW zL^joju2#`NA2L`PysP_>gg$ha2vf3*pK$VIiU}v29l{k9PF@CstLYK@FeA?91)Rxj zdy_}6CHTzl2V73VG@-WchrI+;x#9@G&=sd5wLd55k9i$8%x?(h9TlvtFa7c00%j<= zP@@&W?!ph@-M&|2V%gf})*L&W5mhax=;Y5K%Rg3x)V>7sBb;0YOcl5hgv<SyPE8m0 zUci%|OAwY4Hiv$&>Kl=en?v#nx@`*0A>0JP*%BB2e*&1WQxVLebbo9LeeJbB+cZsV z3btux+f4ew>++0d65BM5W>PyEvIYNXF*q~ne8dx1;7yHPYCa=q!L3le-f0+IY#i`_ z6$`$WvVZ|epQ%iJk>~3=62b0u3@N8JRjZbrYb-qZrCB<`ny?<-`TNl%WD=|<qIxF; zr?&}&$x_{pNc8|ubseB;rc0!@r%_i)68Bnoru9^QZ_?q4Hb+poy6E(wQ26!hj4O^* zqum0~vr5(Q^Cc#99gFLl%aBY!rG_?-R9l*U@a8=wrg*stQfmaU?B*r3hYjPra*rsr ztn=a4lLi8pJf_(S8lLLwrs;DeN9uNB0Fl~-@O2<Docq*&1;qsL{398q_tPF)ubgIb zu7<5zbvjezFXNT1v9bKHRHbguEmfBXkA*X?B`cMmqG;Y7wgxDgy2G-5j<3nn1pQ!7 zCa5k`&Vu_cJ@;DVCQLT~^|$6<qj;Nj;=9-{Bgg~p4V`cvc*t#-?G*5I!J>t;q0yp+ z@NlbDS?IoVHTTYt3}U^pY0Ija2~RLdSM_omz5{0)2ZT_Tg)XLa{AxZ57p{I+vM1fY zW3=T$Zi!%_l2uS}AWax{kQCiTt!QbqW9&?6Wy?{!q(F@n{%!h=;E(|KJ^kSQwyWF! zo?w)h!g@LECWK9*HUB(btncILTdQ72%2l@Xa{b50WNwf?1WxWdN8L+4jX4<ZT}jI| zNJaeQi}!~2ce7&E<>|vHR$Vmu#729^OA;s(uJmV=HiQK4U+}KFOfUr_DGnv%wE?;& z!~c1AB{h;3pOeI-@?4jj(q+HYT4IAQr8ihrs_h-n0md%ARls-XYCj{Vcr6Za3~o}? zNh~yt{3`T_RkJYr-|taXJHKfn=ON1)IYp9_n7*o!Q<<rglvrJI<*VwAh^lt3{lqRH zD91eo+c_y~L{c)8yhZH;)3@c6O@&74y{z*^{DhO|S~<FrH}W3jxwZZc1ox};Ru;PG zY)Oinc+vVg2C5j8(!>?_f|oZRf)0024JW#h)v&-yA#I@r5p?APXoeFfe6MKa)P@Cc zmF0IJ-;~f?9QwuLH4s)=I)c5|udLfu-Y~{#6@DdQT`s&F5y;1aP{1&v?i2U*pqb1q z1sve(Kq(C~QrZV-_W#e)$i^Fpk~3Nc*!-`DSrCFvj7nA(V&N7`N1OGyV3^a`dVT@K zn29oy_E=cly7eHbm<dxeBWi?-$c%@LIam6V7)NBrB=-ilf+Q>9pFjq%c#9G7jF<~3 z(?ys4LpZVU_;C-(Xo;QT-9|nRRRR-#%A2!$TX*G)D9;+&gugq8bm`Ei))*W>VCLqz zJ9F~^O}~KZ$c#6D%-2WMvANSFCnA0dSTs2lAdRI?1@U<<O`b@44J!=|To4Sj*2(6W zYRn1!J|QQYzsWutP2j%H5~3rmWzIaNhof8L{Ihrm72$di>DH;&bSq#(8>eB1lV%!g zM)U@5zgz-(#x*&#R&XXj@c69&qp3VTK6~q8=+!edK8<94_B1cQ6OmOdlJ7`lH$4;h z8*LWa6yNfWZ(<y{TE?1V=3iE^beuksiI!I^-5f7D|F&k!>hzh@n-BnEOqr<@G*bhh zva9&N@sos;qsXzv491;^1Pdo*wlu$>IlH_qWMglK^7TNyz7-#h;0N!6$HeTMB(rZ} zXCv$8i8}*eG@}u!%$_L-)+b$#g%KMp9;ng0jBQSYMg)MF598up{BmH_OdTagF57+Q zAP4cGfpWg`X1dV8=c<8h{KiI>nKxbD72<=NeAeT?wIb`<FMFIWnrpeaA7=wo5a;bt z-NpMC?Mq-SK1#szz`oWE7sZ)80B@!r;U9E95W#`OKZqZ#k>TD>;ID*%D^edj4#>;< z!EIE@<o#DBkMr{WaLbas5B6~qM=GVdq!Zf_GVr^(rV|}EQX8iI%4%(+p$kDLSOX^O zAFCEnT7UYGnF>9q_p;76^F#DG<>X;beL>6~LCS{#s@nezP0Bxz7jFXN&+1s3<B=Ih zXK~>W;h)Iff_EOpe3w6j{7idL<UeWU&*$A0H4OTlC{Hd)zJm9l>k}9(4)2@exbVWP z76mAW4t`RSdVQA1Dm-=Ws2nudMLZ&tB3M4TnMVluFP#dTZqH{5Z!ntneBPupbDTa& zTCnFc05m4q+#7Z$n>jqooyFOy4ZRLK(zu#aTn?gP0t{a-k>F@>JVAn;FJUlzYQ}ot z7!jK7svW2$Nuc{7W>Ljvf>~nUSvYn<JW6`xIMgWa!msD+o>RH`d}8E9AZXz|{faSD z;yvCB-UE&8hfbA#f|rf>c|KL-nueB4`Uc%K7LKDNHF�p3DwsPtbZ@%yW~H@%MxK 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 literal 0 HcmV?d00001 diff --git a/libs/sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..df604d4786b189e8692c43a370fc0a52709d4fba GIT binary patch literal 94672 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π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 literal 0 HcmV?d00001 diff --git a/libs/sqlalchemy/cyextension/processors.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/processors.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..b62460351361912d4f8571238e5512a4368263e3 GIT binary patch literal 75976 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 literal 0 HcmV?d00001 diff --git a/libs/sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..12e48bb10af7e5bd7e06f2fdbb68df5d198e467e GIT binary patch literal 78080 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 bDUG5ZC@fpG_Ebf2OH$M`5L<eY_w4=`9o$x# literal 0 HcmV?d00001 diff --git a/libs/sqlalchemy/cyextension/util.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/util.cpython-38-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..4b2d8145200deebc4ea10af97d09011fe1deb174 GIT binary patch literal 93064 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 z%0D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 cXd<F8Wv&mrK1^bsWVlP4Kb&3C9K5O3?|*Cg<7 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 RjpL<3B_U<<yhQB(e*j){T|oc< literal 0 HcmV?d00001 diff --git a/libs/sqlalchemy/dialects/mssql/base.py b/libs/sqlalchemy/dialects/mssql/base.py index 98f7f6dce..07dbe401d 100644 --- a/libs/sqlalchemy/dialects/mssql/base.py +++ b/libs/sqlalchemy/dialects/mssql/base.py @@ -9,7 +9,6 @@ """ .. dialect:: mssql :name: Microsoft SQL Server - :full_support: 2017 :normal_support: 2012+ :best_effort: 2005+ @@ -1555,29 +1554,6 @@ def process(value): return process - def _sentinel_value_resolver(self, dialect): - if not self.native_uuid: - # dealing entirely with strings going in and out of - # CHAR(32) - return None - - # true if we expect the returned UUID values to be strings - # pymssql sends UUID objects back, pyodbc sends strings, - # however pyodbc converts them to uppercase coming back, so - # need special logic here - character_based_uuid = not dialect.supports_native_uuid - - if character_based_uuid: - # we sent UUID objects in all cases, see bind_processor() - def process(uuid_value): - return str(uuid_value).upper() - - return process - elif not self.as_uuid: - return _python_UUID - else: - return None - class UNIQUEIDENTIFIER(sqltypes.Uuid[sqltypes._UUID_RETURN]): __visit_name__ = "UNIQUEIDENTIFIER" @@ -1841,7 +1817,6 @@ class MSExecutionContext(default.DefaultExecutionContext): _enable_identity_insert = False _select_lastrowid = False _lastrowid = None - _rowcount = None dialect: MSDialect @@ -1961,13 +1936,6 @@ def post_exec(self): def get_lastrowid(self): return self._lastrowid - @property - def rowcount(self): - if self._rowcount is not None: - return self._rowcount - else: - return self.cursor.rowcount - def handle_dbapi_exception(self, e): if self._enable_identity_insert: try: @@ -2019,6 +1987,10 @@ def __init__(self, *args, **kwargs): self.tablealiases = {} super().__init__(*args, **kwargs) + def _format_frame_clause(self, range_, **kw): + kw["literal_execute"] = True + return super()._format_frame_clause(range_, **kw) + def _with_legacy_schema_aliasing(fn): def decorate(self, *arg, **kw): if self.dialect.legacy_schema_aliasing: diff --git a/libs/sqlalchemy/dialects/mssql/provision.py b/libs/sqlalchemy/dialects/mssql/provision.py index 143d386c4..1c684b1df 100644 --- a/libs/sqlalchemy/dialects/mssql/provision.py +++ b/libs/sqlalchemy/dialects/mssql/provision.py @@ -22,10 +22,17 @@ from ...testing.provision import get_temp_table_name from ...testing.provision import log from ...testing.provision import normalize_sequence +from ...testing.provision import post_configure_engine from ...testing.provision import run_reap_dbs from ...testing.provision import temp_table_keyword_args +@post_configure_engine.for_db("mssql") +def post_configure_engine(url, engine, follower_ident): + if engine.driver == "pyodbc": + engine.dialect.dbapi.pooling = False + + @generate_driver_url.for_db("mssql") def generate_driver_url(url, driver, query_str): backend = url.get_backend_name() diff --git a/libs/sqlalchemy/dialects/mssql/pymssql.py b/libs/sqlalchemy/dialects/mssql/pymssql.py index ea1f9bd3a..c4207987b 100644 --- a/libs/sqlalchemy/dialects/mssql/pymssql.py +++ b/libs/sqlalchemy/dialects/mssql/pymssql.py @@ -103,6 +103,7 @@ def is_disconnect(self, e, connection, cursor): "message 20006", # Write to the server failed "message 20017", # Unexpected EOF from the server "message 20047", # DBPROCESS is dead or not enabled + "The server failed to resume the transaction", ): if msg in str(e): return True diff --git a/libs/sqlalchemy/dialects/mysql/aiomysql.py b/libs/sqlalchemy/dialects/mysql/aiomysql.py index 405fa82c8..45e226b94 100644 --- a/libs/sqlalchemy/dialects/mysql/aiomysql.py +++ b/libs/sqlalchemy/dialects/mysql/aiomysql.py @@ -27,6 +27,8 @@ """ # noqa +from collections import deque + from .pymysql import MySQLDialect_pymysql from ... import pool from ... import util @@ -57,7 +59,7 @@ def __init__(self, adapt_connection): # see https://github.com/aio-libs/aiomysql/issues/543 self._cursor = self.await_(cursor.__aenter__()) - self._rows = [] + self._rows = deque() @property def description(self): @@ -87,7 +89,7 @@ def close(self): # exhausting rows, which we already have done for sync cursor. # another option would be to emulate aiosqlite dialect and assign # cursor only if we are doing server side cursor operation. - self._rows[:] = [] + self._rows.clear() def execute(self, operation, parameters=None): return self.await_(self._execute_async(operation, parameters)) @@ -106,7 +108,7 @@ async def _execute_async(self, operation, parameters): # of that here since our default result is not async. # we could just as easily grab "_rows" here and be done with it # but this is safer. - self._rows = list(await self._cursor.fetchall()) + self._rows = deque(await self._cursor.fetchall()) return result async def _executemany_async(self, operation, seq_of_parameters): @@ -118,11 +120,11 @@ def setinputsizes(self, *inputsizes): def __iter__(self): while self._rows: - yield self._rows.pop(0) + yield self._rows.popleft() def fetchone(self): if self._rows: - return self._rows.pop(0) + return self._rows.popleft() else: return None @@ -130,13 +132,12 @@ def fetchmany(self, size=None): if size is None: size = self.arraysize - retval = self._rows[0:size] - self._rows[:] = self._rows[size:] - return retval + rr = self._rows + return [rr.popleft() for _ in range(min(size, len(rr)))] def fetchall(self): - retval = self._rows[:] - self._rows[:] = [] + retval = list(self._rows) + self._rows.clear() return retval diff --git a/libs/sqlalchemy/dialects/mysql/asyncmy.py b/libs/sqlalchemy/dialects/mysql/asyncmy.py index 7360044d2..474eb626d 100644 --- a/libs/sqlalchemy/dialects/mysql/asyncmy.py +++ b/libs/sqlalchemy/dialects/mysql/asyncmy.py @@ -25,6 +25,7 @@ """ # noqa +from collections import deque from contextlib import asynccontextmanager from .pymysql import MySQLDialect_pymysql @@ -56,7 +57,7 @@ def __init__(self, adapt_connection): cursor = self._connection.cursor() self._cursor = self.await_(cursor.__aenter__()) - self._rows = [] + self._rows = deque() @property def description(self): @@ -86,7 +87,7 @@ def close(self): # exhausting rows, which we already have done for sync cursor. # another option would be to emulate aiosqlite dialect and assign # cursor only if we are doing server side cursor operation. - self._rows[:] = [] + self._rows.clear() def execute(self, operation, parameters=None): return self.await_(self._execute_async(operation, parameters)) @@ -108,7 +109,7 @@ async def _execute_async(self, operation, parameters): # of that here since our default result is not async. # we could just as easily grab "_rows" here and be done with it # but this is safer. - self._rows = list(await self._cursor.fetchall()) + self._rows = deque(await self._cursor.fetchall()) return result async def _executemany_async(self, operation, seq_of_parameters): @@ -120,11 +121,11 @@ def setinputsizes(self, *inputsizes): def __iter__(self): while self._rows: - yield self._rows.pop(0) + yield self._rows.popleft() def fetchone(self): if self._rows: - return self._rows.pop(0) + return self._rows.popleft() else: return None @@ -132,13 +133,12 @@ def fetchmany(self, size=None): if size is None: size = self.arraysize - retval = self._rows[0:size] - self._rows[:] = self._rows[size:] - return retval + rr = self._rows + return [rr.popleft() for _ in range(min(size, len(rr)))] def fetchall(self): - retval = self._rows[:] - self._rows[:] = [] + retval = list(self._rows) + self._rows.clear() return retval diff --git a/libs/sqlalchemy/dialects/mysql/base.py b/libs/sqlalchemy/dialects/mysql/base.py index dacbb7afa..b41ec15ba 100644 --- a/libs/sqlalchemy/dialects/mysql/base.py +++ b/libs/sqlalchemy/dialects/mysql/base.py @@ -11,7 +11,6 @@ .. dialect:: mysql :name: MySQL / MariaDB - :full_support: 5.6, 5.7, 8.0 / 10.8, 10.9 :normal_support: 5.6+ / 10+ :best_effort: 5.0.2+ / 5.0.2+ @@ -1349,7 +1348,7 @@ def visit_on_duplicate_key_update(self, on_duplicate, **kw): clauses = [] - requires_mysql8_alias = ( + requires_mysql8_alias = statement.select is None and ( self.dialect._requires_alias_for_on_duplicate_key ) @@ -1850,7 +1849,15 @@ def get_column_specification(self, column, **kw): else: default = self.get_column_default_string(column) if default is not None: - colspec.append("DEFAULT " + default) + if ( + isinstance( + column.server_default.arg, functions.FunctionElement + ) + and self.dialect._support_default_function + ): + colspec.append(f"DEFAULT ({default})") + else: + colspec.append("DEFAULT " + default) return " ".join(colspec) def post_create_table(self, table): @@ -2380,6 +2387,8 @@ def visit_LONGBLOB(self, type_, **kw): def _visit_enumerated_values(self, name, type_, enumerated_values): quoted_enums = [] for e in enumerated_values: + if self.dialect.identifier_preparer._double_percents: + e = e.replace("%", "%%") quoted_enums.append("'%s'" % e.replace("'", "''")) return self._extend_string( type_, {}, "%s(%s)" % (name, ",".join(quoted_enums)) @@ -2893,6 +2902,17 @@ def _support_float_cast(self): # ref https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-17.html#mysqld-8-0-17-feature # noqa return self.server_version_info >= (8, 0, 17) + @property + def _support_default_function(self): + if not self.server_version_info: + return False + elif self.is_mariadb: + # ref https://mariadb.com/kb/en/mariadb-1021-release-notes/ + return self.server_version_info >= (10, 2, 1) + else: + # ref https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html # noqa + return self.server_version_info >= (8, 0, 13) + @property def _is_mariadb(self): return self.is_mariadb @@ -3050,29 +3070,47 @@ def lower(s): return s default_schema_name = connection.dialect.default_schema_name - col_tuples = [ - ( - lower(rec["referred_schema"] or default_schema_name), - lower(rec["referred_table"]), - col_name, - ) - for rec in fkeys - for col_name in rec["referred_columns"] - ] - if col_tuples: - correct_for_wrong_fk_case = connection.execute( - sql.text( - """ - select table_schema, table_name, column_name - from information_schema.columns - where (table_schema, table_name, lower(column_name)) in - :table_data; - """ - ).bindparams(sql.bindparam("table_data", expanding=True)), - dict(table_data=col_tuples), + # NOTE: using (table_schema, table_name, lower(column_name)) in (...) + # is very slow since mysql does not seem able to properly use indexse. + # Unpack the where condition instead. + schema_by_table_by_column = defaultdict(lambda: defaultdict(list)) + for rec in fkeys: + sch = lower(rec["referred_schema"] or default_schema_name) + tbl = lower(rec["referred_table"]) + for col_name in rec["referred_columns"]: + schema_by_table_by_column[sch][tbl].append(col_name) + + if schema_by_table_by_column: + + condition = sql.or_( + *( + sql.and_( + _info_columns.c.table_schema == schema, + sql.or_( + *( + sql.and_( + _info_columns.c.table_name == table, + sql.func.lower( + _info_columns.c.column_name + ).in_(columns), + ) + for table, columns in tables.items() + ) + ), + ) + for schema, tables in schema_by_table_by_column.items() + ) ) + select = sql.select( + _info_columns.c.table_schema, + _info_columns.c.table_name, + _info_columns.c.column_name, + ).where(condition) + + correct_for_wrong_fk_case = connection.execute(select) + # in casing=0, table name and schema name come back in their # exact case. # in casing=1, table name and schema name come back in lower @@ -3445,3 +3483,12 @@ def __getattr__(self, attr): return item.decode(self.charset) else: return item + + +_info_columns = sql.table( + "columns", + sql.column("table_schema", VARCHAR(64)), + sql.column("table_name", VARCHAR(64)), + sql.column("column_name", VARCHAR(64)), + schema="information_schema", +) diff --git a/libs/sqlalchemy/dialects/mysql/mariadbconnector.py b/libs/sqlalchemy/dialects/mysql/mariadbconnector.py index 2fe3a192a..1730c1a6f 100644 --- a/libs/sqlalchemy/dialects/mysql/mariadbconnector.py +++ b/libs/sqlalchemy/dialects/mysql/mariadbconnector.py @@ -87,13 +87,6 @@ def post_exec(self): if self.isinsert and self.compiled.postfetch_lastrowid: self._lastrowid = self.cursor.lastrowid - @property - def rowcount(self): - if self._rowcount is not None: - return self._rowcount - else: - return self.cursor.rowcount - def get_lastrowid(self): return self._lastrowid @@ -172,6 +165,7 @@ def is_disconnect(self, e, connection, cursor): def create_connect_args(self, url): opts = url.translate_connect_args() + opts.update(url.query) int_params = [ "connect_timeout", @@ -186,6 +180,7 @@ def create_connect_args(self, url): "ssl_verify_cert", "ssl", "pool_reset_connection", + "compress", ] for key in int_params: diff --git a/libs/sqlalchemy/dialects/mysql/mysqlconnector.py b/libs/sqlalchemy/dialects/mysql/mysqlconnector.py index b1523392d..8f4b41741 100644 --- a/libs/sqlalchemy/dialects/mysql/mysqlconnector.py +++ b/libs/sqlalchemy/dialects/mysql/mysqlconnector.py @@ -96,6 +96,7 @@ def create_connect_args(self, url): util.coerce_kw_type(opts, "allow_local_infile", bool) util.coerce_kw_type(opts, "autocommit", bool) util.coerce_kw_type(opts, "buffered", bool) + util.coerce_kw_type(opts, "client_flag", int) util.coerce_kw_type(opts, "compress", bool) util.coerce_kw_type(opts, "connection_timeout", int) util.coerce_kw_type(opts, "connect_timeout", int) diff --git a/libs/sqlalchemy/dialects/mysql/mysqldb.py b/libs/sqlalchemy/dialects/mysql/mysqldb.py index d46d159d4..0baf10f70 100644 --- a/libs/sqlalchemy/dialects/mysql/mysqldb.py +++ b/libs/sqlalchemy/dialects/mysql/mysqldb.py @@ -97,12 +97,7 @@ class MySQLExecutionContext_mysqldb(MySQLExecutionContext): - @property - def rowcount(self): - if hasattr(self, "_rowcount"): - return self._rowcount - else: - return self.cursor.rowcount + pass class MySQLCompiler_mysqldb(MySQLCompiler): @@ -217,7 +212,7 @@ def create_connect_args(self, url, _translate_args=None): util.coerce_kw_type(opts, "read_timeout", int) util.coerce_kw_type(opts, "write_timeout", int) util.coerce_kw_type(opts, "client_flag", int) - util.coerce_kw_type(opts, "local_infile", int) + util.coerce_kw_type(opts, "local_infile", bool) # Note: using either of the below will cause all strings to be # returned as Unicode, both in raw SQL operations and with column # types like String and MSString. diff --git a/libs/sqlalchemy/dialects/mysql/provision.py b/libs/sqlalchemy/dialects/mysql/provision.py index 3f05bcee7..836ffa1df 100644 --- a/libs/sqlalchemy/dialects/mysql/provision.py +++ b/libs/sqlalchemy/dialects/mysql/provision.py @@ -40,6 +40,9 @@ def generate_driver_url(url, driver, query_str): drivername="%s+%s" % (backend, driver) ).update_query_string(query_str) + if driver == "mariadbconnector": + new_url = new_url.difference_update_query(["charset"]) + try: new_url.get_dialect() except exc.NoSuchModuleError: diff --git a/libs/sqlalchemy/dialects/mysql/reflection.py b/libs/sqlalchemy/dialects/mysql/reflection.py index c764e8ccc..d7622c546 100644 --- a/libs/sqlalchemy/dialects/mysql/reflection.py +++ b/libs/sqlalchemy/dialects/mysql/reflection.py @@ -505,7 +505,7 @@ def _prep_regexes(self): # # unique constraints come back as KEYs kw = quotes.copy() - kw["on"] = "RESTRICT|CASCADE|SET NULL|NO ACTION" + kw["on"] = "RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULT" self._re_fk_constraint = _re_compile( r" " r"CONSTRAINT +" diff --git a/libs/sqlalchemy/dialects/mysql/reserved_words.py b/libs/sqlalchemy/dialects/mysql/reserved_words.py index 009988a60..04764c17e 100644 --- a/libs/sqlalchemy/dialects/mysql/reserved_words.py +++ b/libs/sqlalchemy/dialects/mysql/reserved_words.py @@ -282,6 +282,7 @@ } ) +# https://dev.mysql.com/doc/refman/8.3/en/keywords.html # https://dev.mysql.com/doc/refman/8.0/en/keywords.html # https://dev.mysql.com/doc/refman/5.7/en/keywords.html # https://dev.mysql.com/doc/refman/5.6/en/keywords.html @@ -403,6 +404,7 @@ "int4", "int8", "integer", + "intersect", "interval", "into", "io_after_gtids", @@ -468,6 +470,7 @@ "outfile", "over", "parse_gcol_expr", + "parallel", "partition", "percent_rank", "persist", @@ -476,6 +479,7 @@ "primary", "procedure", "purge", + "qualify", "range", "rank", "read", diff --git a/libs/sqlalchemy/dialects/mysql/types.py b/libs/sqlalchemy/dialects/mysql/types.py index f563ead35..734f6ae37 100644 --- a/libs/sqlalchemy/dialects/mysql/types.py +++ b/libs/sqlalchemy/dialects/mysql/types.py @@ -499,7 +499,7 @@ def __init__(self, display_width=None): class TEXT(_StringType, sqltypes.TEXT): - """MySQL TEXT type, for text up to 2^16 characters.""" + """MySQL TEXT type, for character storage encoded up to 2^16 bytes.""" __visit_name__ = "TEXT" @@ -508,7 +508,7 @@ def __init__(self, length=None, **kw): :param length: Optional, if provided the server may optimize storage by substituting the smallest TEXT type sufficient to store - ``length`` characters. + ``length`` bytes of characters. :param charset: Optional, a column-level character set for this string value. Takes precedence to 'ascii' or 'unicode' short-hand. @@ -535,7 +535,7 @@ def __init__(self, length=None, **kw): class TINYTEXT(_StringType): - """MySQL TINYTEXT type, for text up to 2^8 characters.""" + """MySQL TINYTEXT type, for character storage encoded up to 2^8 bytes.""" __visit_name__ = "TINYTEXT" @@ -567,7 +567,8 @@ def __init__(self, **kwargs): class MEDIUMTEXT(_StringType): - """MySQL MEDIUMTEXT type, for text up to 2^24 characters.""" + """MySQL MEDIUMTEXT type, for character storage encoded up + to 2^24 bytes.""" __visit_name__ = "MEDIUMTEXT" @@ -599,7 +600,7 @@ def __init__(self, **kwargs): class LONGTEXT(_StringType): - """MySQL LONGTEXT type, for text up to 2^32 characters.""" + """MySQL LONGTEXT type, for character storage encoded up to 2^32 bytes.""" __visit_name__ = "LONGTEXT" @@ -683,7 +684,7 @@ def __init__(self, length=None, **kwargs): super().__init__(length=length, **kwargs) @classmethod - def _adapt_string_for_cast(self, type_): + def _adapt_string_for_cast(cls, type_): # copy the given string type into a CHAR # for the purposes of rendering a CAST expression type_ = sqltypes.to_instance(type_) diff --git a/libs/sqlalchemy/dialects/oracle/base.py b/libs/sqlalchemy/dialects/oracle/base.py index a548b3449..abf3645c7 100644 --- a/libs/sqlalchemy/dialects/oracle/base.py +++ b/libs/sqlalchemy/dialects/oracle/base.py @@ -10,7 +10,6 @@ r""" .. dialect:: oracle :name: Oracle - :full_support: 18c :normal_support: 11+ :best_effort: 9+ @@ -326,13 +325,12 @@ on parity with other backends. - ON UPDATE CASCADE ----------------- Oracle doesn't have native ON UPDATE CASCADE functionality. A trigger based solution is available at -https://asktom.oracle.com/tkyte/update_cascade/index.html . +https://web.archive.org/web/20090317041251/https://asktom.oracle.com/tkyte/update_cascade/index.html When using the SQLAlchemy ORM, the ORM has limited ability to manually issue cascading updates - specify ForeignKey objects using the @@ -467,7 +465,7 @@ .. _oracle_table_options: Oracle Table Options -------------------------- +-------------------- The CREATE TABLE phrase supports the following options with Oracle in conjunction with the :class:`_schema.Table` construct: @@ -1244,6 +1242,31 @@ def visit_regexp_replace_op_binary(self, binary, operator, **kw): def visit_aggregate_strings_func(self, fn, **kw): return "LISTAGG%s" % self.function_argspec(fn, **kw) + def _visit_bitwise(self, binary, fn_name, custom_right=None, **kw): + left = self.process(binary.left, **kw) + right = self.process( + custom_right if custom_right is not None else binary.right, **kw + ) + return f"{fn_name}({left}, {right})" + + def visit_bitwise_xor_op_binary(self, binary, operator, **kw): + return self._visit_bitwise(binary, "BITXOR", **kw) + + def visit_bitwise_or_op_binary(self, binary, operator, **kw): + return self._visit_bitwise(binary, "BITOR", **kw) + + def visit_bitwise_and_op_binary(self, binary, operator, **kw): + return self._visit_bitwise(binary, "BITAND", **kw) + + def visit_bitwise_rshift_op_binary(self, binary, operator, **kw): + raise exc.CompileError("Cannot compile bitwise_rshift in oracle") + + def visit_bitwise_lshift_op_binary(self, binary, operator, **kw): + raise exc.CompileError("Cannot compile bitwise_lshift in oracle") + + def visit_bitwise_not_op_unary_operator(self, element, operator, **kw): + raise exc.CompileError("Cannot compile bitwise_not in oracle") + class OracleDDLCompiler(compiler.DDLCompiler): def define_constraint_cascades(self, constraint): @@ -1253,7 +1276,7 @@ def define_constraint_cascades(self, constraint): # oracle has no ON UPDATE CASCADE - # its only available via triggers - # https://asktom.oracle.com/tkyte/update_cascade/index.html + # https://web.archive.org/web/20090317041251/https://asktom.oracle.com/tkyte/update_cascade/index.html if constraint.onupdate is not None: util.warn( "Oracle does not contain native UPDATE CASCADE " @@ -2036,8 +2059,16 @@ def _table_options_query( ): query = select( dictionary.all_tables.c.table_name, - dictionary.all_tables.c.compression, - dictionary.all_tables.c.compress_for, + ( + dictionary.all_tables.c.compression + if self._supports_table_compression + else sql.null().label("compression") + ), + ( + dictionary.all_tables.c.compress_for + if self._supports_table_compress_for + else sql.null().label("compress_for") + ), ).where(dictionary.all_tables.c.owner == owner) if has_filter_names: query = query.where( diff --git a/libs/sqlalchemy/dialects/oracle/cx_oracle.py b/libs/sqlalchemy/dialects/oracle/cx_oracle.py index 934622466..ed9b02d3f 100644 --- a/libs/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/libs/sqlalchemy/dialects/oracle/cx_oracle.py @@ -62,7 +62,7 @@ Users of Oracle Cloud should use this syntax and also configure the cloud wallet as shown in cx_Oracle documentation `Connecting to Autononmous Databases -<https://cx-oracle.readthedocs.io/en/latest/user_guide/connection_handling.html#connecting-to-autononmous-databases>`_. +<https://cx-oracle.readthedocs.io/en/latest/user_guide/connection_handling.html#autonomousdb>`_. SID Connections ^^^^^^^^^^^^^^^ @@ -377,14 +377,12 @@ def _remove_clob(inputsizes, cursor, statement, parameters, context): ``auto_convert_lobs=False`` may be passed to :func:`_sa.create_engine`, which takes place only engine-wide. -Two Phase Transactions Not Supported -------------------------------------- +Two Phase Transactions Not Supported (use oracledb) +--------------------------------------------------- -Two phase transactions are **not supported** under cx_Oracle due to poor -driver support. As of cx_Oracle 6.0b1, the interface for -two phase transactions has been changed to be more of a direct pass-through -to the underlying OCI layer with less automation. The additional logic -to support this system is not implemented in SQLAlchemy. +Two phase transactions are **not supported** under cx_Oracle due to poor driver +support. The newer :ref:`oracledb` dialect however **does** support two phase +transactions and should be preferred. .. _cx_oracle_numeric: @@ -1423,13 +1421,6 @@ def is_disconnect(self, e, connection, cursor): return False def create_xid(self): - """create a two-phase transaction ID. - - this id will be passed to do_begin_twophase(), do_rollback_twophase(), - do_commit_twophase(). its format is unspecified. - - """ - id_ = random.randint(0, 2**128) return (0x1234, "%032x" % id_, "%032x" % 9) diff --git a/libs/sqlalchemy/dialects/oracle/oracledb.py b/libs/sqlalchemy/dialects/oracle/oracledb.py index 9cdec3b55..0667ed768 100644 --- a/libs/sqlalchemy/dialects/oracle/oracledb.py +++ b/libs/sqlalchemy/dialects/oracle/oracledb.py @@ -13,6 +13,9 @@ :connectstring: oracle+oracledb://user:pass@hostname:port[/dbname][?service_name=<service>[&key=value&key=value...]] :url: https://oracle.github.io/python-oracledb/ +Description +----------- + python-oracledb is released by Oracle to supersede the cx_Oracle driver. It is fully compatible with cx_Oracle and features both a "thin" client mode that requires no dependencies, as well as a "thick" mode that uses @@ -21,7 +24,7 @@ .. seealso:: :ref:`cx_oracle` - all of cx_Oracle's notes apply to the oracledb driver - as well. + as well, with the exception that oracledb supports two phase transactions. The SQLAlchemy ``oracledb`` dialect provides both a sync and an async implementation under the same dialect name. The proper version is @@ -70,6 +73,16 @@ https://python-oracledb.readthedocs.io/en/latest/api_manual/module.html#oracledb.init_oracle_client +Two Phase Transactions Supported +-------------------------------- + +Two phase transactions are fully supported under oracledb. Starting with +oracledb 2.3 two phase transactions are supported also in thin mode. APIs +for two phase transactions are provided at the Core level via +:meth:`_engine.Connection.begin_twophase` and :paramref:`_orm.Session.twophase` +for transparent ORM use. + +.. versionchanged:: 2.0.32 added support for two phase transactions .. versionadded:: 2.0.0 added support for oracledb driver. @@ -81,12 +94,14 @@ from typing import Any from typing import TYPE_CHECKING -from .cx_oracle import OracleDialect_cx_oracle as _OracleDialect_cx_oracle +from . import cx_oracle as _cx_oracle from ... import exc from ... import pool from ...connectors.asyncio import AsyncAdapt_dbapi_connection from ...connectors.asyncio import AsyncAdapt_dbapi_cursor +from ...connectors.asyncio import AsyncAdapt_dbapi_ss_cursor from ...connectors.asyncio import AsyncAdaptFallback_dbapi_connection +from ...engine import default from ...util import asbool from ...util import await_fallback from ...util import await_only @@ -96,8 +111,16 @@ from oracledb import AsyncCursor -class OracleDialect_oracledb(_OracleDialect_cx_oracle): +class OracleExecutionContext_oracledb( + _cx_oracle.OracleExecutionContext_cx_oracle +): + pass + + +class OracleDialect_oracledb(_cx_oracle.OracleDialect_cx_oracle): supports_statement_cache = True + execution_ctx_cls = OracleExecutionContext_oracledb + driver = "oracledb" _min_version = (1,) @@ -155,6 +178,49 @@ def _load_version(self, dbapi_module): f"oracledb version {self._min_version} and above are supported" ) + def do_begin_twophase(self, connection, xid): + conn_xis = connection.connection.xid(*xid) + connection.connection.tpc_begin(conn_xis) + connection.connection.info["oracledb_xid"] = conn_xis + + def do_prepare_twophase(self, connection, xid): + should_commit = connection.connection.tpc_prepare() + connection.info["oracledb_should_commit"] = should_commit + + def do_rollback_twophase( + self, connection, xid, is_prepared=True, recover=False + ): + if recover: + conn_xid = connection.connection.xid(*xid) + else: + conn_xid = None + connection.connection.tpc_rollback(conn_xid) + + def do_commit_twophase( + self, connection, xid, is_prepared=True, recover=False + ): + conn_xid = None + if not is_prepared: + should_commit = connection.connection.tpc_prepare() + elif recover: + conn_xid = connection.connection.xid(*xid) + should_commit = True + else: + should_commit = connection.info["oracledb_should_commit"] + if should_commit: + connection.connection.tpc_commit(conn_xid) + + def do_recover_twophase(self, connection): + return [ + # oracledb seems to return bytes + ( + fi, + gti.decode() if isinstance(gti, bytes) else gti, + bq.decode() if isinstance(bq, bytes) else bq, + ) + for fi, gti, bq in connection.connection.tpc_recover() + ] + class AsyncAdapt_oracledb_cursor(AsyncAdapt_dbapi_cursor): _cursor: AsyncCursor @@ -211,6 +277,17 @@ def __exit__(self, type_: Any, value: Any, traceback: Any) -> None: self.close() +class AsyncAdapt_oracledb_ss_cursor( + AsyncAdapt_dbapi_ss_cursor, AsyncAdapt_oracledb_cursor +): + __slots__ = () + + def close(self) -> None: + if self._cursor is not None: + self._cursor.close() + self._cursor = None # type: ignore + + class AsyncAdapt_oracledb_connection(AsyncAdapt_dbapi_connection): _connection: AsyncConnection __slots__ = () @@ -251,6 +328,27 @@ def stmtcachesize(self, value): def cursor(self): return AsyncAdapt_oracledb_cursor(self) + def ss_cursor(self): + return AsyncAdapt_oracledb_ss_cursor(self) + + def xid(self, *args: Any, **kwargs: Any) -> Any: + return self._connection.xid(*args, **kwargs) + + def tpc_begin(self, *args: Any, **kwargs: Any) -> Any: + return self.await_(self._connection.tpc_begin(*args, **kwargs)) + + def tpc_commit(self, *args: Any, **kwargs: Any) -> Any: + return self.await_(self._connection.tpc_commit(*args, **kwargs)) + + def tpc_prepare(self, *args: Any, **kwargs: Any) -> Any: + return self.await_(self._connection.tpc_prepare(*args, **kwargs)) + + def tpc_recover(self, *args: Any, **kwargs: Any) -> Any: + return self.await_(self._connection.tpc_recover(*args, **kwargs)) + + def tpc_rollback(self, *args: Any, **kwargs: Any) -> Any: + return self.await_(self._connection.tpc_rollback(*args, **kwargs)) + class AsyncAdaptFallback_oracledb_connection( AsyncAdaptFallback_dbapi_connection, AsyncAdapt_oracledb_connection @@ -281,9 +379,31 @@ def connect(self, *arg, **kw): ) +class OracleExecutionContextAsync_oracledb(OracleExecutionContext_oracledb): + # restore default create cursor + create_cursor = default.DefaultExecutionContext.create_cursor + + def create_default_cursor(self): + # copy of OracleExecutionContext_cx_oracle.create_cursor + c = self._dbapi_connection.cursor() + if self.dialect.arraysize: + c.arraysize = self.dialect.arraysize + + return c + + def create_server_side_cursor(self): + c = self._dbapi_connection.ss_cursor() + if self.dialect.arraysize: + c.arraysize = self.dialect.arraysize + + return c + + class OracleDialectAsync_oracledb(OracleDialect_oracledb): is_async = True + supports_server_side_cursors = True supports_statement_cache = True + execution_ctx_cls = OracleExecutionContextAsync_oracledb _min_version = (2,) diff --git a/libs/sqlalchemy/dialects/postgresql/__init__.py b/libs/sqlalchemy/dialects/postgresql/__init__.py index 17b14f4d0..325ea8869 100644 --- a/libs/sqlalchemy/dialects/postgresql/__init__.py +++ b/libs/sqlalchemy/dialects/postgresql/__init__.py @@ -8,7 +8,7 @@ from types import ModuleType -from . import array as arraylib # noqa # must be above base and other dialects +from . import array as arraylib # noqa # keep above base and other dialects from . import asyncpg # noqa from . import base from . import pg8000 # noqa diff --git a/libs/sqlalchemy/dialects/postgresql/array.py b/libs/sqlalchemy/dialects/postgresql/array.py index e88c27d2d..1d63655ee 100644 --- a/libs/sqlalchemy/dialects/postgresql/array.py +++ b/libs/sqlalchemy/dialects/postgresql/array.py @@ -183,8 +183,9 @@ class also mytable.c.data.contains([1, 2]) - The :class:`_postgresql.ARRAY` type may not be supported on all - PostgreSQL DBAPIs; it is currently known to work on psycopg2 only. + Indexed access is one-based by default, to match that of PostgreSQL; + for zero-based indexed access, set + :paramref:`_postgresql.ARRAY.zero_indexes`. Additionally, the :class:`_postgresql.ARRAY` type does not work directly in @@ -224,41 +225,6 @@ class SomeOrmClass(Base): """ - class Comparator(sqltypes.ARRAY.Comparator): - """Define comparison operations for :class:`_types.ARRAY`. - - Note that these operations are in addition to those provided - by the base :class:`.types.ARRAY.Comparator` class, including - :meth:`.types.ARRAY.Comparator.any` and - :meth:`.types.ARRAY.Comparator.all`. - - """ - - def contains(self, other, **kwargs): - """Boolean expression. Test if elements are a superset of the - elements of the argument array expression. - - kwargs may be ignored by this operator but are required for API - conformance. - """ - return self.operate(CONTAINS, other, result_type=sqltypes.Boolean) - - def contained_by(self, other): - """Boolean expression. Test if elements are a proper subset of the - elements of the argument array expression. - """ - return self.operate( - CONTAINED_BY, other, result_type=sqltypes.Boolean - ) - - def overlap(self, other): - """Boolean expression. Test if array has elements in common with - an argument array expression. - """ - return self.operate(OVERLAP, other, result_type=sqltypes.Boolean) - - comparator_factory = Comparator - def __init__( self, item_type: _TypeEngineArgument[Any], @@ -310,6 +276,41 @@ def __init__( self.dimensions = dimensions self.zero_indexes = zero_indexes + class Comparator(sqltypes.ARRAY.Comparator): + """Define comparison operations for :class:`_types.ARRAY`. + + Note that these operations are in addition to those provided + by the base :class:`.types.ARRAY.Comparator` class, including + :meth:`.types.ARRAY.Comparator.any` and + :meth:`.types.ARRAY.Comparator.all`. + + """ + + def contains(self, other, **kwargs): + """Boolean expression. Test if elements are a superset of the + elements of the argument array expression. + + kwargs may be ignored by this operator but are required for API + conformance. + """ + return self.operate(CONTAINS, other, result_type=sqltypes.Boolean) + + def contained_by(self, other): + """Boolean expression. Test if elements are a proper subset of the + elements of the argument array expression. + """ + return self.operate( + CONTAINED_BY, other, result_type=sqltypes.Boolean + ) + + def overlap(self, other): + """Boolean expression. Test if array has elements in common with + an argument array expression. + """ + return self.operate(OVERLAP, other, result_type=sqltypes.Boolean) + + comparator_factory = Comparator + @property def hashable(self): return self.as_tuple diff --git a/libs/sqlalchemy/dialects/postgresql/asyncpg.py b/libs/sqlalchemy/dialects/postgresql/asyncpg.py index 4c60c3d83..27bd07ab0 100644 --- a/libs/sqlalchemy/dialects/postgresql/asyncpg.py +++ b/libs/sqlalchemy/dialects/postgresql/asyncpg.py @@ -112,8 +112,8 @@ .. _asyncpg_prepared_statement_name: -Prepared Statement Name ------------------------ +Prepared Statement Name with PGBouncer +-------------------------------------- By default, asyncpg enumerates prepared statements in numeric order, which can lead to errors if a name has already been taken for another prepared @@ -128,7 +128,7 @@ from uuid import uuid4 engine = create_async_engine( - "postgresql+asyncpg://user:pass@hostname/dbname", + "postgresql+asyncpg://user:pass@somepgbouncer/dbname", poolclass=NullPool, connect_args={ 'prepared_statement_name_func': lambda: f'__asyncpg_{uuid4()}__', @@ -141,7 +141,7 @@ https://github.com/sqlalchemy/sqlalchemy/issues/6467 -.. warning:: To prevent a buildup of useless prepared statements in +.. warning:: When using PGBouncer, to prevent a buildup of useless prepared statements in your application, it's important to use the :class:`.NullPool` pool class, and to configure PgBouncer to use `DISCARD <https://www.postgresql.org/docs/current/sql-discard.html>`_ when returning connections. The DISCARD command is used to release resources held by the db connection, @@ -171,7 +171,7 @@ from __future__ import annotations -import collections +from collections import deque import decimal import json as _py_json import re @@ -263,15 +263,11 @@ class AsyncpgBigInteger(sqltypes.BigInteger): class AsyncpgJSON(json.JSON): - render_bind_cast = True - def result_processor(self, dialect, coltype): return None class AsyncpgJSONB(json.JSONB): - render_bind_cast = True - def result_processor(self, dialect, coltype): return None @@ -487,7 +483,7 @@ class AsyncAdapt_asyncpg_cursor: def __init__(self, adapt_connection): self._adapt_connection = adapt_connection self._connection = adapt_connection._connection - self._rows = [] + self._rows = deque() self._cursor = None self.description = None self.arraysize = 1 @@ -495,7 +491,7 @@ def __init__(self, adapt_connection): self._invalidate_schema_cache_asof = 0 def close(self): - self._rows[:] = [] + self._rows.clear() def _handle_exception(self, error): self._adapt_connection._handle_exception(error) @@ -535,7 +531,7 @@ async def _prepare_and_execute(self, operation, parameters): self._cursor = await prepared_stmt.cursor(*parameters) self.rowcount = -1 else: - self._rows = await prepared_stmt.fetch(*parameters) + self._rows = deque(await prepared_stmt.fetch(*parameters)) status = prepared_stmt.get_statusmsg() reg = re.match( @@ -583,11 +579,11 @@ def setinputsizes(self, *inputsizes): def __iter__(self): while self._rows: - yield self._rows.pop(0) + yield self._rows.popleft() def fetchone(self): if self._rows: - return self._rows.pop(0) + return self._rows.popleft() else: return None @@ -595,13 +591,12 @@ def fetchmany(self, size=None): if size is None: size = self.arraysize - retval = self._rows[0:size] - self._rows[:] = self._rows[size:] - return retval + rr = self._rows + return [rr.popleft() for _ in range(min(size, len(rr)))] def fetchall(self): - retval = self._rows[:] - self._rows[:] = [] + retval = list(self._rows) + self._rows.clear() return retval @@ -611,23 +606,21 @@ class AsyncAdapt_asyncpg_ss_cursor(AsyncAdapt_asyncpg_cursor): def __init__(self, adapt_connection): super().__init__(adapt_connection) - self._rowbuffer = None + self._rowbuffer = deque() def close(self): self._cursor = None - self._rowbuffer = None + self._rowbuffer.clear() def _buffer_rows(self): + assert self._cursor is not None new_rows = self._adapt_connection.await_(self._cursor.fetch(50)) - self._rowbuffer = collections.deque(new_rows) + self._rowbuffer.extend(new_rows) def __aiter__(self): return self async def __anext__(self): - if not self._rowbuffer: - self._buffer_rows() - while True: while self._rowbuffer: yield self._rowbuffer.popleft() @@ -650,21 +643,19 @@ def fetchmany(self, size=None): if not self._rowbuffer: self._buffer_rows() - buf = list(self._rowbuffer) - lb = len(buf) + assert self._cursor is not None + rb = self._rowbuffer + lb = len(rb) if size > lb: - buf.extend( + rb.extend( self._adapt_connection.await_(self._cursor.fetch(size - lb)) ) - result = buf[0:size] - self._rowbuffer = collections.deque(buf[size:]) - return result + return [rb.popleft() for _ in range(min(size, len(rb)))] def fetchall(self): - ret = list(self._rowbuffer) + list( - self._adapt_connection.await_(self._all()) - ) + ret = list(self._rowbuffer) + ret.extend(self._adapt_connection.await_(self._all())) self._rowbuffer.clear() return ret @@ -849,25 +840,45 @@ def cursor(self, server_side=False): else: return AsyncAdapt_asyncpg_cursor(self) + async def _rollback_and_discard(self): + try: + await self._transaction.rollback() + finally: + # if asyncpg .rollback() was actually called, then whether or + # not it raised or succeeded, the transation is done, discard it + self._transaction = None + self._started = False + + async def _commit_and_discard(self): + try: + await self._transaction.commit() + finally: + # if asyncpg .commit() was actually called, then whether or + # not it raised or succeeded, the transation is done, discard it + self._transaction = None + self._started = False + def rollback(self): if self._started: try: - self.await_(self._transaction.rollback()) - except Exception as error: - self._handle_exception(error) - finally: + self.await_(self._rollback_and_discard()) self._transaction = None self._started = False + except Exception as error: + # don't dereference asyncpg transaction if we didn't + # actually try to call rollback() on it + self._handle_exception(error) def commit(self): if self._started: try: - self.await_(self._transaction.commit()) - except Exception as error: - self._handle_exception(error) - finally: + self.await_(self._commit_and_discard()) self._transaction = None self._started = False + except Exception as error: + # don't dereference asyncpg transaction if we didn't + # actually try to call commit() on it + self._handle_exception(error) def close(self): self.rollback() @@ -884,6 +895,7 @@ def terminate(self): self.await_(self._connection.close(timeout=2)) except ( asyncio.TimeoutError, + asyncio.CancelledError, OSError, self.dbapi.asyncpg.PostgresError, ): diff --git a/libs/sqlalchemy/dialects/postgresql/base.py b/libs/sqlalchemy/dialects/postgresql/base.py index 3fe8900ac..e5e7fceb1 100644 --- a/libs/sqlalchemy/dialects/postgresql/base.py +++ b/libs/sqlalchemy/dialects/postgresql/base.py @@ -9,7 +9,6 @@ r""" .. dialect:: postgresql :name: PostgreSQL - :full_support: 12, 13, 14, 15 :normal_support: 9.6+ :best_effort: 9+ @@ -346,7 +345,9 @@ def set_search_path(dbapi_connection, connection_record): .. admonition:: Section Best Practices Summarized keep the ``search_path`` variable set to its default of ``public``, without - any other schema names. For other schema names, name these explicitly + any other schema names. Ensure the username used to connect **does not** + match remote schemas, or ensure the ``"$user"`` token is **removed** from + ``search_path``. For other schema names, name these explicitly within :class:`_schema.Table` definitions. Alternatively, the ``postgresql_ignore_search_path`` option will cause all reflected :class:`_schema.Table` objects to have a :attr:`_schema.Table.schema` @@ -355,12 +356,63 @@ def set_search_path(dbapi_connection, connection_record): The PostgreSQL dialect can reflect tables from any schema, as outlined in :ref:`metadata_reflection_schemas`. +In all cases, the first thing SQLAlchemy does when reflecting tables is +to **determine the default schema for the current database connection**. +It does this using the PostgreSQL ``current_schema()`` +function, illustated below using a PostgreSQL client session (i.e. using +the ``psql`` tool):: + + test=> select current_schema(); + current_schema + ---------------- + public + (1 row) + +Above we see that on a plain install of PostgreSQL, the default schema name +is the name ``public``. + +However, if your database username **matches the name of a schema**, PostgreSQL's +default is to then **use that name as the default schema**. Below, we log in +using the username ``scott``. When we create a schema named ``scott``, **it +implicitly changes the default schema**:: + + test=> select current_schema(); + current_schema + ---------------- + public + (1 row) + + test=> create schema scott; + CREATE SCHEMA + test=> select current_schema(); + current_schema + ---------------- + scott + (1 row) + +The behavior of ``current_schema()`` is derived from the +`PostgreSQL search path +<https://www.postgresql.org/docs/current/static/ddl-schemas.html#DDL-SCHEMAS-PATH>`_ +variable ``search_path``, which in modern PostgreSQL versions defaults to this:: + + test=> show search_path; + search_path + ----------------- + "$user", public + (1 row) + +Where above, the ``"$user"`` variable will inject the current username as the +default schema, if one exists. Otherwise, ``public`` is used. + +When a :class:`_schema.Table` object is reflected, if it is present in the +schema indicated by the ``current_schema()`` function, **the schema name assigned +to the ".schema" attribute of the Table is the Python "None" value**. Otherwise, the +".schema" attribute will be assigned the string name of that schema. + With regards to tables which these :class:`_schema.Table` objects refer to via foreign key constraint, a decision must be made as to how the ``.schema`` is represented in those remote tables, in the case where that -remote schema name is also a member of the current -`PostgreSQL search path -<https://www.postgresql.org/docs/current/static/ddl-schemas.html#DDL-SCHEMAS-PATH>`_. +remote schema name is also a member of the current ``search_path``. By default, the PostgreSQL dialect mimics the behavior encouraged by PostgreSQL's own ``pg_get_constraintdef()`` builtin procedure. This function @@ -466,13 +518,6 @@ def set_search_path(dbapi_connection, connection_record): described here are only for those users who can't, or prefer not to, stay within these guidelines. -Note that **in all cases**, the "default" schema is always reflected as -``None``. The "default" schema on PostgreSQL is that which is returned by the -PostgreSQL ``current_schema()`` function. On a typical PostgreSQL -installation, this is the name ``public``. So a table that refers to another -which is in the ``public`` (i.e. default) schema will always have the -``.schema`` attribute set to ``None``. - .. seealso:: :ref:`reflection_schema_qualified_interaction` - discussion of the issue @@ -2730,6 +2775,8 @@ class ReflectedDomain(ReflectedNamedType): """The constraints defined in the domain, if any. The constraint are in order of evaluation by postgresql. """ + collation: Optional[str] + """The collation for the domain.""" class ReflectedEnum(ReflectedNamedType): @@ -3661,20 +3708,156 @@ def get_multi_columns( return columns.items() - def _get_columns_info(self, rows, domains, enums, schema): - array_type_pattern = re.compile(r"\[\]$") - attype_pattern = re.compile(r"\(.*\)") - charlen_pattern = re.compile(r"\(([\d,]+)\)") - args_pattern = re.compile(r"\((.*)\)") - args_split_pattern = re.compile(r"\s*,\s*") - - def _handle_array_type(attype): - return ( - # strip '[]' from integer[], etc. - array_type_pattern.sub("", attype), - attype.endswith("[]"), + _format_type_args_pattern = re.compile(r"\((.*)\)") + _format_type_args_delim = re.compile(r"\s*,\s*") + _format_array_spec_pattern = re.compile(r"((?:\[\])*)$") + + def _reflect_type( + self, + format_type: Optional[str], + domains: dict[str, ReflectedDomain], + enums: dict[str, ReflectedEnum], + type_description: str, + ) -> sqltypes.TypeEngine[Any]: + """ + Attempts to reconstruct a column type defined in ischema_names based + on the information available in the format_type. + + If the `format_type` cannot be associated with a known `ischema_names`, + it is treated as a reference to a known PostgreSQL named `ENUM` or + `DOMAIN` type. + """ + type_description = type_description or "unknown type" + if format_type is None: + util.warn( + "PostgreSQL format_type() returned NULL for %s" + % type_description + ) + return sqltypes.NULLTYPE + + attype_args_match = self._format_type_args_pattern.search(format_type) + if attype_args_match and attype_args_match.group(1): + attype_args = self._format_type_args_delim.split( + attype_args_match.group(1) + ) + else: + attype_args = () + + match_array_dim = self._format_array_spec_pattern.search(format_type) + # Each "[]" in array specs corresponds to an array dimension + array_dim = len(match_array_dim.group(1) or "") // 2 + + # Remove all parameters and array specs from format_type to obtain an + # ischema_name candidate + attype = self._format_type_args_pattern.sub("", format_type) + attype = self._format_array_spec_pattern.sub("", attype) + + schema_type = self.ischema_names.get(attype.lower(), None) + args, kwargs = (), {} + + if attype == "numeric": + if len(attype_args) == 2: + precision, scale = map(int, attype_args) + args = (precision, scale) + + elif attype == "double precision": + args = (53,) + + elif attype == "integer": + args = () + + elif attype in ("timestamp with time zone", "time with time zone"): + kwargs["timezone"] = True + if len(attype_args) == 1: + kwargs["precision"] = int(attype_args[0]) + + elif attype in ( + "timestamp without time zone", + "time without time zone", + "time", + ): + kwargs["timezone"] = False + if len(attype_args) == 1: + kwargs["precision"] = int(attype_args[0]) + + elif attype == "bit varying": + kwargs["varying"] = True + if len(attype_args) == 1: + charlen = int(attype_args[0]) + args = (charlen,) + + elif attype.startswith("interval"): + schema_type = INTERVAL + + field_match = re.match(r"interval (.+)", attype) + if field_match: + kwargs["fields"] = field_match.group(1) + + if len(attype_args) == 1: + kwargs["precision"] = int(attype_args[0]) + + else: + enum_or_domain_key = tuple(util.quoted_token_parser(attype)) + + if enum_or_domain_key in enums: + schema_type = ENUM + enum = enums[enum_or_domain_key] + + args = tuple(enum["labels"]) + kwargs["name"] = enum["name"] + + if not enum["visible"]: + kwargs["schema"] = enum["schema"] + args = tuple(enum["labels"]) + elif enum_or_domain_key in domains: + schema_type = DOMAIN + domain = domains[enum_or_domain_key] + + data_type = self._reflect_type( + domain["type"], + domains, + enums, + type_description="DOMAIN '%s'" % domain["name"], + ) + args = (domain["name"], data_type) + + kwargs["collation"] = domain["collation"] + kwargs["default"] = domain["default"] + kwargs["not_null"] = not domain["nullable"] + kwargs["create_type"] = False + + if domain["constraints"]: + # We only support a single constraint + check_constraint = domain["constraints"][0] + + kwargs["constraint_name"] = check_constraint["name"] + kwargs["check"] = check_constraint["check"] + + if not domain["visible"]: + kwargs["schema"] = domain["schema"] + + else: + try: + charlen = int(attype_args[0]) + args = (charlen, *attype_args[1:]) + except (ValueError, IndexError): + args = attype_args + + if not schema_type: + util.warn( + "Did not recognize type '%s' of %s" + % (attype, type_description) ) + return sqltypes.NULLTYPE + + data_type = schema_type(*args, **kwargs) + if array_dim >= 1: + # postgres does not preserve dimensionality or size of array types. + data_type = _array.ARRAY(data_type) + + return data_type + def _get_columns_info(self, rows, domains, enums, schema): columns = defaultdict(list) for row_dict in rows: # ensure that each table has an entry, even if it has no columns @@ -3685,131 +3868,28 @@ def _handle_array_type(attype): continue table_cols = columns[(schema, row_dict["table_name"])] - format_type = row_dict["format_type"] + coltype = self._reflect_type( + row_dict["format_type"], + domains, + enums, + type_description="column '%s'" % row_dict["name"], + ) + default = row_dict["default"] name = row_dict["name"] generated = row_dict["generated"] - identity = row_dict["identity_options"] - - if format_type is None: - no_format_type = True - attype = format_type = "no format_type()" - is_array = False - else: - no_format_type = False - - # strip (*) from character varying(5), timestamp(5) - # with time zone, geometry(POLYGON), etc. - attype = attype_pattern.sub("", format_type) - - # strip '[]' from integer[], etc. and check if an array - attype, is_array = _handle_array_type(attype) - - # strip quotes from case sensitive enum or domain names - enum_or_domain_key = tuple(util.quoted_token_parser(attype)) - nullable = not row_dict["not_null"] - charlen = charlen_pattern.search(format_type) - if charlen: - charlen = charlen.group(1) - args = args_pattern.search(format_type) - if args and args.group(1): - args = tuple(args_split_pattern.split(args.group(1))) - else: - args = () - kwargs = {} + if isinstance(coltype, DOMAIN): + if not default: + # domain can override the default value but + # cant set it to None + if coltype.default is not None: + default = coltype.default - if attype == "numeric": - if charlen: - prec, scale = charlen.split(",") - args = (int(prec), int(scale)) - else: - args = () - elif attype == "double precision": - args = (53,) - elif attype == "integer": - args = () - elif attype in ("timestamp with time zone", "time with time zone"): - kwargs["timezone"] = True - if charlen: - kwargs["precision"] = int(charlen) - args = () - elif attype in ( - "timestamp without time zone", - "time without time zone", - "time", - ): - kwargs["timezone"] = False - if charlen: - kwargs["precision"] = int(charlen) - args = () - elif attype == "bit varying": - kwargs["varying"] = True - if charlen: - args = (int(charlen),) - else: - args = () - elif attype.startswith("interval"): - field_match = re.match(r"interval (.+)", attype, re.I) - if charlen: - kwargs["precision"] = int(charlen) - if field_match: - kwargs["fields"] = field_match.group(1) - attype = "interval" - args = () - elif charlen: - args = (int(charlen),) - - while True: - # looping here to suit nested domains - if attype in self.ischema_names: - coltype = self.ischema_names[attype] - break - elif enum_or_domain_key in enums: - enum = enums[enum_or_domain_key] - coltype = ENUM - kwargs["name"] = enum["name"] - if not enum["visible"]: - kwargs["schema"] = enum["schema"] - args = tuple(enum["labels"]) - break - elif enum_or_domain_key in domains: - domain = domains[enum_or_domain_key] - attype = domain["type"] - attype, is_array = _handle_array_type(attype) - # strip quotes from case sensitive enum or domain names - enum_or_domain_key = tuple( - util.quoted_token_parser(attype) - ) - # A table can't override a not null on the domain, - # but can override nullable - nullable = nullable and domain["nullable"] - if domain["default"] and not default: - # It can, however, override the default - # value, but can't set it to null. - default = domain["default"] - continue - else: - coltype = None - break - - if coltype: - coltype = coltype(*args, **kwargs) - if is_array: - coltype = self.ischema_names["_array"](coltype) - elif no_format_type: - util.warn( - "PostgreSQL format_type() returned NULL for column '%s'" - % (name,) - ) - coltype = sqltypes.NULLTYPE - else: - util.warn( - "Did not recognize type '%s' of column '%s'" - % (attype, name) - ) - coltype = sqltypes.NULLTYPE + nullable = nullable and not coltype.not_null + + identity = row_dict["identity_options"] # If a zero byte or blank string depending on driver (is also # absent for older PG versions), then not a generated column. @@ -4608,6 +4688,8 @@ def _comment_query(self, schema, has_filter_names, scope, kind): pg_catalog.pg_class.c.oid == pg_catalog.pg_description.c.objoid, pg_catalog.pg_description.c.objsubid == 0, + pg_catalog.pg_description.c.classoid + == sql.func.cast("pg_catalog.pg_class", REGCLASS), ), ) .where(self._pg_class_relkind_condition(relkinds)) @@ -4858,12 +4940,18 @@ def _domain_query(self, schema): pg_catalog.pg_namespace.c.nspname.label("schema"), con_sq.c.condefs, con_sq.c.connames, + pg_catalog.pg_collation.c.collname, ) .join( pg_catalog.pg_namespace, pg_catalog.pg_namespace.c.oid == pg_catalog.pg_type.c.typnamespace, ) + .outerjoin( + pg_catalog.pg_collation, + pg_catalog.pg_type.c.typcollation + == pg_catalog.pg_collation.c.oid, + ) .outerjoin( con_sq, pg_catalog.pg_type.c.oid == con_sq.c.contypid, @@ -4877,14 +4965,13 @@ def _domain_query(self, schema): @reflection.cache def _load_domains(self, connection, schema=None, **kw): - # Load data types for domains: result = connection.execute(self._domain_query(schema)) - domains = [] + domains: List[ReflectedDomain] = [] for domain in result.mappings(): # strip (30) from character varying(30) attype = re.search(r"([^\(]+)", domain["attype"]).group(1) - constraints = [] + constraints: List[ReflectedDomainConstraint] = [] if domain["connames"]: # When a domain has multiple CHECK constraints, they will # be tested in alphabetical order by name. @@ -4898,7 +4985,7 @@ def _load_domains(self, connection, schema=None, **kw): check = def_[7:-1] constraints.append({"name": name, "check": check}) - domain_rec = { + domain_rec: ReflectedDomain = { "name": domain["name"], "schema": domain["schema"], "visible": domain["visible"], @@ -4906,6 +4993,7 @@ def _load_domains(self, connection, schema=None, **kw): "nullable": domain["nullable"], "default": domain["default"], "constraints": constraints, + "collation": domain["collname"], } domains.append(domain_rec) diff --git a/libs/sqlalchemy/dialects/postgresql/json.py b/libs/sqlalchemy/dialects/postgresql/json.py index dff12e7f4..914d8423d 100644 --- a/libs/sqlalchemy/dialects/postgresql/json.py +++ b/libs/sqlalchemy/dialects/postgresql/json.py @@ -144,6 +144,7 @@ class JSON(sqltypes.JSON): """ # noqa + render_bind_cast = True astext_type = sqltypes.Text() def __init__(self, none_as_null=False, astext_type=None): @@ -155,7 +156,7 @@ def __init__(self, none_as_null=False, astext_type=None): be used to persist a NULL value:: from sqlalchemy import null - conn.execute(table.insert(), data=null()) + conn.execute(table.insert(), {"data": null()}) .. seealso:: @@ -256,22 +257,27 @@ class Comparator(JSON.Comparator): """Define comparison operations for :class:`_types.JSON`.""" def has_key(self, other): - """Boolean expression. Test for presence of a key. Note that the - key may be a SQLA expression. + """Boolean expression. Test for presence of a key (equivalent of + the ``?`` operator). Note that the key may be a SQLA expression. """ return self.operate(HAS_KEY, other, result_type=sqltypes.Boolean) def has_all(self, other): - """Boolean expression. Test for presence of all keys in jsonb""" + """Boolean expression. Test for presence of all keys in jsonb + (equivalent of the ``?&`` operator) + """ return self.operate(HAS_ALL, other, result_type=sqltypes.Boolean) def has_any(self, other): - """Boolean expression. Test for presence of any key in jsonb""" + """Boolean expression. Test for presence of any key in jsonb + (equivalent of the ``?|`` operator) + """ return self.operate(HAS_ANY, other, result_type=sqltypes.Boolean) def contains(self, other, **kwargs): """Boolean expression. Test if keys (or array) are a superset - of/contained the keys of the argument jsonb expression. + of/contained the keys of the argument jsonb expression + (equivalent of the ``@>`` operator). kwargs may be ignored by this operator but are required for API conformance. @@ -280,7 +286,8 @@ def contains(self, other, **kwargs): def contained_by(self, other): """Boolean expression. Test if keys are a proper subset of the - keys of the argument jsonb expression. + keys of the argument jsonb expression + (equivalent of the ``<@`` operator). """ return self.operate( CONTAINED_BY, other, result_type=sqltypes.Boolean @@ -288,7 +295,7 @@ def contained_by(self, other): def delete_path(self, array): """JSONB expression. Deletes field or array element specified in - the argument array. + the argument array (equivalent of the ``#-`` operator). The input may be a list of strings that will be coerced to an ``ARRAY`` or an instance of :meth:`_postgres.array`. @@ -302,7 +309,7 @@ def delete_path(self, array): def path_exists(self, other): """Boolean expression. Test for presence of item given by the - argument JSONPath expression. + argument JSONPath expression (equivalent of the ``@?`` operator). .. versionadded:: 2.0 """ @@ -312,7 +319,8 @@ def path_exists(self, other): def path_match(self, other): """Boolean expression. Test if JSONPath predicate given by the - argument JSONPath expression matches. + argument JSONPath expression matches + (equivalent of the ``@@`` operator). Only the first item of the result is taken into account. diff --git a/libs/sqlalchemy/dialects/postgresql/named_types.py b/libs/sqlalchemy/dialects/postgresql/named_types.py index 56bec1dc7..16e5c867e 100644 --- a/libs/sqlalchemy/dialects/postgresql/named_types.py +++ b/libs/sqlalchemy/dialects/postgresql/named_types.py @@ -416,10 +416,10 @@ def __init__( data_type: _TypeEngineArgument[Any], *, collation: Optional[str] = None, - default: Optional[Union[str, elements.TextClause]] = None, + default: Union[elements.TextClause, str, None] = None, constraint_name: Optional[str] = None, not_null: Optional[bool] = None, - check: Optional[str] = None, + check: Union[elements.TextClause, str, None] = None, create_type: bool = True, **kw: Any, ): @@ -463,7 +463,7 @@ def __init__( self.default = default self.collation = collation self.constraint_name = constraint_name - self.not_null = not_null + self.not_null = bool(not_null) if check is not None: check = coercions.expect(roles.DDLExpressionRole, check) self.check = check @@ -474,6 +474,20 @@ def __init__( def __test_init__(cls): return cls("name", sqltypes.Integer) + def adapt(self, impl, **kw): + if self.default: + kw["default"] = self.default + if self.constraint_name is not None: + kw["constraint_name"] = self.constraint_name + if self.not_null: + kw["not_null"] = self.not_null + if self.check is not None: + kw["check"] = str(self.check) + if self.create_type: + kw["create_type"] = self.create_type + + return super().adapt(impl, **kw) + class CreateEnumType(schema._CreateDropBase): __visit_name__ = "create_enum_type" diff --git a/libs/sqlalchemy/dialects/postgresql/pg_catalog.py b/libs/sqlalchemy/dialects/postgresql/pg_catalog.py index 7b44bc93f..9b5562c13 100644 --- a/libs/sqlalchemy/dialects/postgresql/pg_catalog.py +++ b/libs/sqlalchemy/dialects/postgresql/pg_catalog.py @@ -77,7 +77,7 @@ def process(value): RELKINDS_ALL_TABLE_LIKE = RELKINDS_TABLE + RELKINDS_VIEW + RELKINDS_MAT_VIEW # tables -pg_catalog_meta = MetaData() +pg_catalog_meta = MetaData(schema="pg_catalog") pg_namespace = Table( "pg_namespace", @@ -85,7 +85,6 @@ def process(value): Column("oid", OID), Column("nspname", NAME), Column("nspowner", OID), - schema="pg_catalog", ) pg_class = Table( @@ -120,7 +119,6 @@ def process(value): Column("relispartition", Boolean, info={"server_version": (10,)}), Column("relrewrite", OID, info={"server_version": (11,)}), Column("reloptions", ARRAY(Text)), - schema="pg_catalog", ) pg_type = Table( @@ -155,7 +153,6 @@ def process(value): Column("typndims", Integer), Column("typcollation", OID, info={"server_version": (9, 1)}), Column("typdefault", Text), - schema="pg_catalog", ) pg_index = Table( @@ -182,7 +179,6 @@ def process(value): Column("indoption", INT2VECTOR), Column("indexprs", PG_NODE_TREE), Column("indpred", PG_NODE_TREE), - schema="pg_catalog", ) pg_attribute = Table( @@ -209,7 +205,6 @@ def process(value): Column("attislocal", Boolean), Column("attinhcount", Integer), Column("attcollation", OID, info={"server_version": (9, 1)}), - schema="pg_catalog", ) pg_constraint = Table( @@ -235,7 +230,6 @@ def process(value): Column("connoinherit", Boolean, info={"server_version": (9, 2)}), Column("conkey", ARRAY(SmallInteger)), Column("confkey", ARRAY(SmallInteger)), - schema="pg_catalog", ) pg_sequence = Table( @@ -249,7 +243,6 @@ def process(value): Column("seqmin", BigInteger), Column("seqcache", BigInteger), Column("seqcycle", Boolean), - schema="pg_catalog", info={"server_version": (10,)}, ) @@ -260,7 +253,6 @@ def process(value): Column("adrelid", OID), Column("adnum", SmallInteger), Column("adbin", PG_NODE_TREE), - schema="pg_catalog", ) pg_description = Table( @@ -270,7 +262,6 @@ def process(value): Column("classoid", OID), Column("objsubid", Integer), Column("description", Text(collation="C")), - schema="pg_catalog", ) pg_enum = Table( @@ -280,7 +271,6 @@ def process(value): Column("enumtypid", OID), Column("enumsortorder", Float(), info={"server_version": (9, 1)}), Column("enumlabel", NAME), - schema="pg_catalog", ) pg_am = Table( @@ -290,5 +280,21 @@ def process(value): Column("amname", NAME), Column("amhandler", REGPROC, info={"server_version": (9, 6)}), Column("amtype", CHAR, info={"server_version": (9, 6)}), - schema="pg_catalog", +) + +pg_collation = Table( + "pg_collation", + pg_catalog_meta, + Column("oid", OID, info={"server_version": (9, 3)}), + Column("collname", NAME), + Column("collnamespace", OID), + Column("collowner", OID), + Column("collprovider", CHAR, info={"server_version": (10,)}), + Column("collisdeterministic", Boolean, info={"server_version": (12,)}), + Column("collencoding", Integer), + Column("collcollate", Text), + Column("collctype", Text), + Column("colliculocale", Text), + Column("collicurules", Text, info={"server_version": (16,)}), + Column("collversion", Text, info={"server_version": (10,)}), ) diff --git a/libs/sqlalchemy/dialects/postgresql/provision.py b/libs/sqlalchemy/dialects/postgresql/provision.py index a87bb9320..38573c77a 100644 --- a/libs/sqlalchemy/dialects/postgresql/provision.py +++ b/libs/sqlalchemy/dialects/postgresql/provision.py @@ -97,7 +97,7 @@ def drop_all_schema_objects_pre_tables(cfg, eng): for xid in conn.exec_driver_sql( "select gid from pg_prepared_xacts" ).scalars(): - conn.execute("ROLLBACK PREPARED '%s'" % xid) + conn.exec_driver_sql("ROLLBACK PREPARED '%s'" % xid) @drop_all_schema_objects_post_tables.for_db("postgresql") diff --git a/libs/sqlalchemy/dialects/postgresql/psycopg.py b/libs/sqlalchemy/dialects/postgresql/psycopg.py index 90177a43c..66a2c7746 100644 --- a/libs/sqlalchemy/dialects/postgresql/psycopg.py +++ b/libs/sqlalchemy/dialects/postgresql/psycopg.py @@ -50,9 +50,42 @@ dialect shares most of its behavior with the ``psycopg2`` dialect. Further documentation is available there. +Using a different Cursor class +------------------------------ + +One of the differences between ``psycopg`` and the older ``psycopg2`` +is how bound parameters are handled: ``psycopg2`` would bind them +client side, while ``psycopg`` by default will bind them server side. + +It's possible to configure ``psycopg`` to do client side binding by +specifying the ``cursor_factory`` to be ``ClientCursor`` when creating +the engine:: + + from psycopg import ClientCursor + + client_side_engine = create_engine( + "postgresql+psycopg://...", + connect_args={"cursor_factory": ClientCursor}, + ) + +Similarly when using an async engine the ``AsyncClientCursor`` can be +specified:: + + from psycopg import AsyncClientCursor + + client_side_engine = create_async_engine( + "postgresql+psycopg://...", + connect_args={"cursor_factory": AsyncClientCursor}, + ) + +.. seealso:: + + `Client-side-binding cursors <https://www.psycopg.org/psycopg3/docs/advanced/cursors.html#client-side-binding-cursors>`_ + """ # noqa from __future__ import annotations +from collections import deque import logging import re from typing import cast @@ -93,8 +126,6 @@ class _PGREGCONFIG(REGCONFIG): class _PGJSON(JSON): - render_bind_cast = True - def bind_processor(self, dialect): return self._make_bind_processor(None, dialect._psycopg_Json) @@ -103,8 +134,6 @@ def result_processor(self, dialect, coltype): class _PGJSONB(JSONB): - render_bind_cast = True - def bind_processor(self, dialect): return self._make_bind_processor(None, dialect._psycopg_Jsonb) @@ -532,7 +561,7 @@ class AsyncAdapt_psycopg_cursor: def __init__(self, cursor, await_) -> None: self._cursor = cursor self.await_ = await_ - self._rows = [] + self._rows = deque() def __getattr__(self, name): return getattr(self._cursor, name) @@ -559,24 +588,19 @@ def execute(self, query, params=None, **kw): # eq/ne if res and res.status == self._psycopg_ExecStatus.TUPLES_OK: rows = self.await_(self._cursor.fetchall()) - if not isinstance(rows, list): - self._rows = list(rows) - else: - self._rows = rows + self._rows = deque(rows) return result def executemany(self, query, params_seq): return self.await_(self._cursor.executemany(query, params_seq)) def __iter__(self): - # TODO: try to avoid pop(0) on a list while self._rows: - yield self._rows.pop(0) + yield self._rows.popleft() def fetchone(self): if self._rows: - # TODO: try to avoid pop(0) on a list - return self._rows.pop(0) + return self._rows.popleft() else: return None @@ -584,13 +608,12 @@ def fetchmany(self, size=None): if size is None: size = self._cursor.arraysize - retval = self._rows[0:size] - self._rows = self._rows[size:] - return retval + rr = self._rows + return [rr.popleft() for _ in range(min(size, len(rr)))] def fetchall(self): - retval = self._rows - self._rows = [] + retval = list(self._rows) + self._rows.clear() return retval diff --git a/libs/sqlalchemy/dialects/postgresql/psycopg2.py b/libs/sqlalchemy/dialects/postgresql/psycopg2.py index 9bf2e4933..fc05aca90 100644 --- a/libs/sqlalchemy/dialects/postgresql/psycopg2.py +++ b/libs/sqlalchemy/dialects/postgresql/psycopg2.py @@ -242,7 +242,7 @@ Modern versions of psycopg2 include a feature known as `Fast Execution Helpers \ -<https://initd.org/psycopg/docs/extras.html#fast-execution-helpers>`_, which +<https://www.psycopg.org/docs/extras.html#fast-execution-helpers>`_, which have been shown in benchmarking to improve psycopg2's executemany() performance, primarily with INSERT statements, by at least an order of magnitude. @@ -844,33 +844,43 @@ def is_disconnect(self, e, connection, cursor): # checks based on strings. in the case that .closed # didn't cut it, fall back onto these. str_e = str(e).partition("\n")[0] - for msg in [ - # these error messages from libpq: interfaces/libpq/fe-misc.c - # and interfaces/libpq/fe-secure.c. - "terminating connection", - "closed the connection", - "connection not open", - "could not receive data from server", - "could not send data to server", - # psycopg2 client errors, psycopg2/connection.h, - # psycopg2/cursor.h - "connection already closed", - "cursor already closed", - # not sure where this path is originally from, it may - # be obsolete. It really says "losed", not "closed". - "losed the connection unexpectedly", - # these can occur in newer SSL - "connection has been closed unexpectedly", - "SSL error: decryption failed or bad record mac", - "SSL SYSCALL error: Bad file descriptor", - "SSL SYSCALL error: EOF detected", - "SSL SYSCALL error: Operation timed out", - "SSL SYSCALL error: Bad address", - ]: + for msg in self._is_disconnect_messages: idx = str_e.find(msg) if idx >= 0 and '"' not in str_e[:idx]: return True return False + @util.memoized_property + def _is_disconnect_messages(self): + return ( + # these error messages from libpq: interfaces/libpq/fe-misc.c + # and interfaces/libpq/fe-secure.c. + "terminating connection", + "closed the connection", + "connection not open", + "could not receive data from server", + "could not send data to server", + # psycopg2 client errors, psycopg2/connection.h, + # psycopg2/cursor.h + "connection already closed", + "cursor already closed", + # not sure where this path is originally from, it may + # be obsolete. It really says "losed", not "closed". + "losed the connection unexpectedly", + # these can occur in newer SSL + "connection has been closed unexpectedly", + "SSL error: decryption failed or bad record mac", + "SSL SYSCALL error: Bad file descriptor", + "SSL SYSCALL error: EOF detected", + "SSL SYSCALL error: Operation timed out", + "SSL SYSCALL error: Bad address", + # This can occur in OpenSSL 1 when an unexpected EOF occurs. + # https://www.openssl.org/docs/man1.1.1/man3/SSL_get_error.html#BUGS + # It may also occur in newer OpenSSL for a non-recoverable I/O + # error as a result of a system call that does not set 'errno' + # in libc. + "SSL SYSCALL error: Success", + ) + dialect = PGDialect_psycopg2 diff --git a/libs/sqlalchemy/dialects/sqlite/aiosqlite.py b/libs/sqlalchemy/dialects/sqlite/aiosqlite.py index 6c915634d..796a80cf0 100644 --- a/libs/sqlalchemy/dialects/sqlite/aiosqlite.py +++ b/libs/sqlalchemy/dialects/sqlite/aiosqlite.py @@ -78,6 +78,7 @@ def do_begin(conn): """ # noqa import asyncio +from collections import deque from functools import partial from .base import SQLiteExecutionContext @@ -113,10 +114,10 @@ def __init__(self, adapt_connection): self.arraysize = 1 self.rowcount = -1 self.description = None - self._rows = [] + self._rows = deque() def close(self): - self._rows[:] = [] + self._rows.clear() def execute(self, operation, parameters=None): try: @@ -132,7 +133,7 @@ def execute(self, operation, parameters=None): self.lastrowid = self.rowcount = -1 if not self.server_side: - self._rows = self.await_(_cursor.fetchall()) + self._rows = deque(self.await_(_cursor.fetchall())) else: self.description = None self.lastrowid = _cursor.lastrowid @@ -161,11 +162,11 @@ def setinputsizes(self, *inputsizes): def __iter__(self): while self._rows: - yield self._rows.pop(0) + yield self._rows.popleft() def fetchone(self): if self._rows: - return self._rows.pop(0) + return self._rows.popleft() else: return None @@ -173,13 +174,12 @@ def fetchmany(self, size=None): if size is None: size = self.arraysize - retval = self._rows[0:size] - self._rows[:] = self._rows[size:] - return retval + rr = self._rows + return [rr.popleft() for _ in range(min(size, len(rr)))] def fetchall(self): - retval = self._rows[:] - self._rows[:] = [] + retval = list(self._rows) + self._rows.clear() return retval diff --git a/libs/sqlalchemy/dialects/sqlite/base.py b/libs/sqlalchemy/dialects/sqlite/base.py index 6db821465..84bb8937e 100644 --- a/libs/sqlalchemy/dialects/sqlite/base.py +++ b/libs/sqlalchemy/dialects/sqlite/base.py @@ -10,7 +10,6 @@ r""" .. dialect:: sqlite :name: SQLite - :full_support: 3.36.0 :normal_support: 3.12+ :best_effort: 3.7.16+ @@ -1528,6 +1527,13 @@ def visit_on_conflict_do_update(self, on_conflict, **kw): return "ON CONFLICT %s DO UPDATE SET %s" % (target_text, action_text) + def visit_bitwise_xor_op_binary(self, binary, operator, **kw): + # sqlite has no xor. Use "a XOR b" = "(a | b) - (a & b)". + kw["eager_grouping"] = True + or_ = self._generate_generic_binary(binary, " | ", **kw) + and_ = self._generate_generic_binary(binary, " & ", **kw) + return f"({or_} - {and_})" + class SQLiteDDLCompiler(compiler.DDLCompiler): def get_column_specification(self, column, **kwargs): @@ -2231,6 +2237,14 @@ def get_columns(self, connection, table_name, schema=None, **kw): tablesql = self._get_table_sql( connection, table_name, schema, **kw ) + # remove create table + match = re.match( + r"create table .*?\((.*)\)$", + tablesql.strip(), + re.DOTALL | re.IGNORECASE, + ) + assert match, f"create table not found in {tablesql}" + tablesql = match.group(1).strip() columns.append( self._get_column_info( @@ -2285,7 +2299,10 @@ def _get_column_info( if generated: sqltext = "" if tablesql: - pattern = r"[^,]*\s+AS\s+\(([^,]*)\)\s*(?:virtual|stored)?" + pattern = ( + r"[^,]*\s+GENERATED\s+ALWAYS\s+AS" + r"\s+\((.*)\)\s*(?:virtual|stored)?" + ) match = re.search( re.escape(name) + pattern, tablesql, re.IGNORECASE ) @@ -2570,8 +2587,8 @@ def parse_uqs(): return UNIQUE_PATTERN = r'(?:CONSTRAINT "?(.+?)"? +)?UNIQUE *\((.+?)\)' INLINE_UNIQUE_PATTERN = ( - r'(?:(".+?")|(?:[\[`])?([a-z0-9_]+)(?:[\]`])?) ' - r"+[a-z0-9_ ]+? +UNIQUE" + r'(?:(".+?")|(?:[\[`])?([a-z0-9_]+)(?:[\]`])?)[\t ]' + r"+[a-z0-9_ ]+?[\t ]+UNIQUE" ) for match in re.finditer(UNIQUE_PATTERN, table_data, re.I): @@ -2606,15 +2623,21 @@ def get_check_constraints(self, connection, table_name, schema=None, **kw): connection, table_name, schema=schema, **kw ) - CHECK_PATTERN = r"(?:CONSTRAINT (.+) +)?" r"CHECK *\( *(.+) *\),? *" - cks = [] - # NOTE: we aren't using re.S here because we actually are - # taking advantage of each CHECK constraint being all on one - # line in the table definition in order to delineate. This + # NOTE NOTE NOTE + # DO NOT CHANGE THIS REGULAR EXPRESSION. There is no known way + # to parse CHECK constraints that contain newlines themselves using + # regular expressions, and the approach here relies upon each + # individual + # CHECK constraint being on a single line by itself. This # necessarily makes assumptions as to how the CREATE TABLE - # was emitted. + # was emitted. A more comprehensive DDL parsing solution would be + # needed to improve upon the current situation. See #11840 for + # background + CHECK_PATTERN = r"(?:CONSTRAINT (.+) +)?CHECK *\( *(.+) *\),? *" + cks = [] for match in re.finditer(CHECK_PATTERN, table_data or "", re.I): + name = match.group(1) if name: diff --git a/libs/sqlalchemy/dialects/sqlite/pysqlite.py b/libs/sqlalchemy/dialects/sqlite/pysqlite.py index e24877900..69a902c32 100644 --- a/libs/sqlalchemy/dialects/sqlite/pysqlite.py +++ b/libs/sqlalchemy/dialects/sqlite/pysqlite.py @@ -51,11 +51,14 @@ # absolute path on Windows e = create_engine('sqlite:///C:\\path\\to\\database.db') -The sqlite ``:memory:`` identifier is the default if no filepath is -present. Specify ``sqlite://`` and nothing else:: - - # in-memory database - e = create_engine('sqlite://') +To use sqlite ``:memory:`` database specify it as the filename using +``sqlite:///:memory:``. It's also the default if no filepath is +present, specifying only ``sqlite://`` and nothing else:: + + # in-memory database (note three slashes) + e = create_engine('sqlite:///:memory:') + # also in-memory database + e2 = create_engine('sqlite://') .. _pysqlite_uri_connections: diff --git a/libs/sqlalchemy/engine/base.py b/libs/sqlalchemy/engine/base.py index e577839c1..983bdae03 100644 --- a/libs/sqlalchemy/engine/base.py +++ b/libs/sqlalchemy/engine/base.py @@ -109,6 +109,7 @@ class Connection(ConnectionEventsTarget, inspection.Inspectable["Inspector"]): """ + dialect: Dialect dispatch: dispatcher[ConnectionEventsTarget] _sqla_logger_namespace = "sqlalchemy.engine.Connection" @@ -173,13 +174,9 @@ def __init__( if self._has_events or self.engine._has_events: self.dispatch.engine_connect(self) - @util.memoized_property - def _message_formatter(self) -> Any: - if "logging_token" in self._execution_options: - token = self._execution_options["logging_token"] - return lambda msg: "[%s] %s" % (token, msg) - else: - return None + # this can be assigned differently via + # characteristics.LoggingTokenCharacteristic + _message_formatter: Any = None def _log_info(self, message: str, *arg: Any, **kw: Any) -> None: fmt = self._message_formatter @@ -250,6 +247,7 @@ def execution_options( yield_per: int = ..., insertmanyvalues_page_size: int = ..., schema_translate_map: Optional[SchemaTranslateMapType] = ..., + preserve_rowcount: bool = False, **opt: Any, ) -> Connection: ... @@ -490,6 +488,18 @@ def execution_options(self, **opt: Any) -> Connection: :ref:`schema_translating` + :param preserve_rowcount: Boolean; when True, the ``cursor.rowcount`` + attribute will be unconditionally memoized within the result and + made available via the :attr:`.CursorResult.rowcount` attribute. + Normally, this attribute is only preserved for UPDATE and DELETE + statements. Using this option, the DBAPIs rowcount value can + be accessed for other kinds of statements such as INSERT and SELECT, + to the degree that the DBAPI supports these statements. See + :attr:`.CursorResult.rowcount` for notes regarding the behavior + of this attribute. + + .. versionadded:: 2.0.28 + .. seealso:: :meth:`_engine.Engine.execution_options` @@ -1831,10 +1841,7 @@ def _execute_context( context.pre_exec() if context.execute_style is ExecuteStyle.INSERTMANYVALUES: - return self._exec_insertmany_context( - dialect, - context, - ) + return self._exec_insertmany_context(dialect, context) else: return self._exec_single_context( dialect, context, statement, parameters @@ -2018,7 +2025,13 @@ def _exec_insertmany_context( if self._echo: stats = context._get_cache_stats() + " (insertmanyvalues)" + preserve_rowcount = context.execution_options.get( + "preserve_rowcount", False + ) + rowcount = 0 + for imv_batch in dialect._deliver_insertmanyvalues_batches( + self, cursor, str_statement, effective_parameters, @@ -2039,6 +2052,7 @@ def _exec_insertmany_context( imv_batch.replaced_parameters, None, context, + is_sub_exec=True, ) sub_stmt = imv_batch.replaced_statement @@ -2128,9 +2142,15 @@ def _exec_insertmany_context( context.executemany, ) + if preserve_rowcount: + rowcount += imv_batch.current_batch_size + try: context.post_exec() + if preserve_rowcount: + context._rowcount = rowcount # type: ignore[attr-defined] + result = context._setup_result_proxy() except BaseException as e: diff --git a/libs/sqlalchemy/engine/characteristics.py b/libs/sqlalchemy/engine/characteristics.py index 7dd3a2f31..97b17fbdf 100644 --- a/libs/sqlalchemy/engine/characteristics.py +++ b/libs/sqlalchemy/engine/characteristics.py @@ -12,6 +12,7 @@ from typing import ClassVar if typing.TYPE_CHECKING: + from .base import Connection from .interfaces import DBAPIConnection from .interfaces import Dialect @@ -44,13 +45,30 @@ class ConnectionCharacteristic(abc.ABC): def reset_characteristic( self, dialect: Dialect, dbapi_conn: DBAPIConnection ) -> None: - """Reset the characteristic on the connection to its default value.""" + """Reset the characteristic on the DBAPI connection to its default + value.""" @abc.abstractmethod def set_characteristic( self, dialect: Dialect, dbapi_conn: DBAPIConnection, value: Any ) -> None: - """set characteristic on the connection to a given value.""" + """set characteristic on the DBAPI connection to a given value.""" + + def set_connection_characteristic( + self, + dialect: Dialect, + conn: Connection, + dbapi_conn: DBAPIConnection, + value: Any, + ) -> None: + """set characteristic on the :class:`_engine.Connection` to a given + value. + + .. versionadded:: 2.0.30 - added to support elements that are local + to the :class:`_engine.Connection` itself. + + """ + self.set_characteristic(dialect, dbapi_conn, value) @abc.abstractmethod def get_characteristic( @@ -61,8 +79,22 @@ def get_characteristic( """ + def get_connection_characteristic( + self, dialect: Dialect, conn: Connection, dbapi_conn: DBAPIConnection + ) -> Any: + """Given a :class:`_engine.Connection`, get the current value of the + characteristic. + + .. versionadded:: 2.0.30 - added to support elements that are local + to the :class:`_engine.Connection` itself. + + """ + return self.get_characteristic(dialect, dbapi_conn) + class IsolationLevelCharacteristic(ConnectionCharacteristic): + """Manage the isolation level on a DBAPI connection""" + transactional: ClassVar[bool] = True def reset_characteristic( @@ -79,3 +111,45 @@ def get_characteristic( self, dialect: Dialect, dbapi_conn: DBAPIConnection ) -> Any: return dialect.get_isolation_level(dbapi_conn) + + +class LoggingTokenCharacteristic(ConnectionCharacteristic): + """Manage the 'logging_token' option of a :class:`_engine.Connection`. + + .. versionadded:: 2.0.30 + + """ + + transactional: ClassVar[bool] = False + + def reset_characteristic( + self, dialect: Dialect, dbapi_conn: DBAPIConnection + ) -> None: + pass + + def set_characteristic( + self, dialect: Dialect, dbapi_conn: DBAPIConnection, value: Any + ) -> None: + raise NotImplementedError() + + def set_connection_characteristic( + self, + dialect: Dialect, + conn: Connection, + dbapi_conn: DBAPIConnection, + value: Any, + ) -> None: + if value: + conn._message_formatter = lambda msg: "[%s] %s" % (value, msg) + else: + del conn._message_formatter + + def get_characteristic( + self, dialect: Dialect, dbapi_conn: DBAPIConnection + ) -> Any: + raise NotImplementedError() + + def get_connection_characteristic( + self, dialect: Dialect, conn: Connection, dbapi_conn: DBAPIConnection + ) -> Any: + return conn._execution_options.get("logging_token", None) diff --git a/libs/sqlalchemy/engine/create.py b/libs/sqlalchemy/engine/create.py index fb3c3b79c..74a3cf801 100644 --- a/libs/sqlalchemy/engine/create.py +++ b/libs/sqlalchemy/engine/create.py @@ -663,6 +663,17 @@ def connect( else: pool._dialect = dialect + if ( + hasattr(pool, "_is_asyncio") + and pool._is_asyncio is not dialect.is_async + ): + raise exc.ArgumentError( + f"Pool class {pool.__class__.__name__} cannot be " + f"used with {'non-' if not dialect.is_async else ''}" + "asyncio engine", + code="pcls", + ) + # create engine. if not pop_kwarg("future", True): raise exc.ArgumentError( diff --git a/libs/sqlalchemy/engine/cursor.py b/libs/sqlalchemy/engine/cursor.py index 4b18ddb43..b83cb4515 100644 --- a/libs/sqlalchemy/engine/cursor.py +++ b/libs/sqlalchemy/engine/cursor.py @@ -688,6 +688,7 @@ def _merge_textual_cols_by_position( % (num_ctx_cols, len(cursor_description)) ) seen = set() + for ( idx, colname, @@ -1246,8 +1247,9 @@ def fetchmany(self, result, dbapi_cursor, size=None): if size is None: return self.fetchall(result, dbapi_cursor) - buf = list(self._rowbuffer) - lb = len(buf) + rb = self._rowbuffer + lb = len(rb) + close = False if size > lb: try: new = dbapi_cursor.fetchmany(size - lb) @@ -1255,13 +1257,15 @@ def fetchmany(self, result, dbapi_cursor, size=None): self.handle_exception(result, dbapi_cursor, e) else: if not new: - result._soft_close() + # defer closing since it may clear the row buffer + close = True else: - buf.extend(new) + rb.extend(new) - result = buf[0:size] - self._rowbuffer = collections.deque(buf[size:]) - return result + res = [rb.popleft() for _ in range(min(size, len(rb)))] + if close: + result._soft_close() + return res def fetchall(self, result, dbapi_cursor): try: @@ -1315,9 +1319,8 @@ def fetchmany(self, result, dbapi_cursor, size=None): if size is None: return self.fetchall(result, dbapi_cursor) - buf = list(self._rowbuffer) - rows = buf[0:size] - self._rowbuffer = collections.deque(buf[size:]) + rb = self._rowbuffer + rows = [rb.popleft() for _ in range(min(size, len(rb)))] if not rows: result._soft_close() return rows @@ -1975,8 +1978,28 @@ def supports_sane_multi_rowcount(self): def rowcount(self) -> int: """Return the 'rowcount' for this result. - The 'rowcount' reports the number of rows *matched* - by the WHERE criterion of an UPDATE or DELETE statement. + The primary purpose of 'rowcount' is to report the number of rows + matched by the WHERE criterion of an UPDATE or DELETE statement + executed once (i.e. for a single parameter set), which may then be + compared to the number of rows expected to be updated or deleted as a + means of asserting data integrity. + + This attribute is transferred from the ``cursor.rowcount`` attribute + of the DBAPI before the cursor is closed, to support DBAPIs that + don't make this value available after cursor close. Some DBAPIs may + offer meaningful values for other kinds of statements, such as INSERT + and SELECT statements as well. In order to retrieve ``cursor.rowcount`` + for these statements, set the + :paramref:`.Connection.execution_options.preserve_rowcount` + execution option to True, which will cause the ``cursor.rowcount`` + value to be unconditionally memoized before any results are returned + or the cursor is closed, regardless of statement type. + + For cases where the DBAPI does not support rowcount for a particular + kind of statement and/or execution, the returned value will be ``-1``, + which is delivered directly from the DBAPI and is part of :pep:`249`. + All DBAPIs should support rowcount for single-parameter-set + UPDATE and DELETE statements, however. .. note:: @@ -1985,38 +2008,47 @@ def rowcount(self) -> int: * This attribute returns the number of rows *matched*, which is not necessarily the same as the number of rows - that were actually *modified* - an UPDATE statement, for example, + that were actually *modified*. For example, an UPDATE statement may have no net change on a given row if the SET values given are the same as those present in the row already. Such a row would be matched but not modified. On backends that feature both styles, such as MySQL, - rowcount is configured by default to return the match + rowcount is configured to return the match count in all cases. - * :attr:`_engine.CursorResult.rowcount` - is *only* useful in conjunction - with an UPDATE or DELETE statement. Contrary to what the Python - DBAPI says, it does *not* reliably return the - number of rows available from the results of a SELECT statement - as DBAPIs cannot support this functionality when rows are - unbuffered. - - * :attr:`_engine.CursorResult.rowcount` - may not be fully implemented by - all dialects. In particular, most DBAPIs do not support an - aggregate rowcount result from an executemany call. - The :meth:`_engine.CursorResult.supports_sane_rowcount` and - :meth:`_engine.CursorResult.supports_sane_multi_rowcount` methods - will report from the dialect if each usage is known to be - supported. - - * Statements that use RETURNING may not return a correct - rowcount. + * :attr:`_engine.CursorResult.rowcount` in the default case is + *only* useful in conjunction with an UPDATE or DELETE statement, + and only with a single set of parameters. For other kinds of + statements, SQLAlchemy will not attempt to pre-memoize the value + unless the + :paramref:`.Connection.execution_options.preserve_rowcount` + execution option is used. Note that contrary to :pep:`249`, many + DBAPIs do not support rowcount values for statements that are not + UPDATE or DELETE, particularly when rows are being returned which + are not fully pre-buffered. DBAPIs that dont support rowcount + for a particular kind of statement should return the value ``-1`` + for such statements. + + * :attr:`_engine.CursorResult.rowcount` may not be meaningful + when executing a single statement with multiple parameter sets + (i.e. an :term:`executemany`). Most DBAPIs do not sum "rowcount" + values across multiple parameter sets and will return ``-1`` + when accessed. + + * SQLAlchemy's :ref:`engine_insertmanyvalues` feature does support + a correct population of :attr:`_engine.CursorResult.rowcount` + when the :paramref:`.Connection.execution_options.preserve_rowcount` + execution option is set to True. + + * Statements that use RETURNING may not support rowcount, returning + a ``-1`` value instead. .. seealso:: :ref:`tutorial_update_delete_rowcount` - in the :ref:`unified_tutorial` + :paramref:`.Connection.execution_options.preserve_rowcount` + """ # noqa: E501 try: return self.context.rowcount @@ -2110,8 +2142,7 @@ def _raw_row_iterator(self): def merge(self, *others: Result[Any]) -> MergedResult[Any]: merged_result = super().merge(*others) - setup_rowcounts = self.context._has_rowcount - if setup_rowcounts: + if self.context._has_rowcount: merged_result.rowcount = sum( cast("CursorResult[Any]", result).rowcount for result in (self,) + others diff --git a/libs/sqlalchemy/engine/default.py b/libs/sqlalchemy/engine/default.py index d64f05cdf..d42a3138b 100644 --- a/libs/sqlalchemy/engine/default.py +++ b/libs/sqlalchemy/engine/default.py @@ -58,6 +58,7 @@ from ..sql import dml from ..sql import expression from ..sql import type_api +from ..sql import util as sql_util from ..sql._typing import is_tuple_type from ..sql.base import _NoArg from ..sql.compiler import DDLCompiler @@ -95,6 +96,7 @@ from ..sql.elements import BindParameter from ..sql.schema import Column from ..sql.type_api import _BindProcessorType + from ..sql.type_api import _ResultProcessorType from ..sql.type_api import TypeEngine # When we're handed literal SQL, ensure it's a SELECT query @@ -167,7 +169,10 @@ class DefaultDialect(Dialect): tuple_in_values = False connection_characteristics = util.immutabledict( - {"isolation_level": characteristics.IsolationLevelCharacteristic()} + { + "isolation_level": characteristics.IsolationLevelCharacteristic(), + "logging_token": characteristics.LoggingTokenCharacteristic(), + } ) engine_config_types: Mapping[str, Any] = util.immutabledict( @@ -659,7 +664,7 @@ def _set_connection_characteristics(self, connection, characteristics): if connection.in_transaction(): trans_objs = [ (name, obj) - for name, obj, value in characteristic_values + for name, obj, _ in characteristic_values if obj.transactional ] if trans_objs: @@ -672,8 +677,10 @@ def _set_connection_characteristics(self, connection, characteristics): ) dbapi_connection = connection.connection.dbapi_connection - for name, characteristic, value in characteristic_values: - characteristic.set_characteristic(self, dbapi_connection, value) + for _, characteristic, value in characteristic_values: + characteristic.set_connection_characteristic( + self, connection, dbapi_connection, value + ) connection.connection._connection_record.finalize_callback.append( functools.partial(self._reset_characteristics, characteristics) ) @@ -756,11 +763,25 @@ def do_release_savepoint(self, connection, name): connection.execute(expression.ReleaseSavepointClause(name)) def _deliver_insertmanyvalues_batches( - self, cursor, statement, parameters, generic_setinputsizes, context + self, + connection, + cursor, + statement, + parameters, + generic_setinputsizes, + context, ): context = cast(DefaultExecutionContext, context) compiled = cast(SQLCompiler, context.compiled) + _composite_sentinel_proc: Sequence[ + Optional[_ResultProcessorType[Any]] + ] = () + _scalar_sentinel_proc: Optional[_ResultProcessorType[Any]] = None + _sentinel_proc_initialized: bool = False + + compiled_parameters = context.compiled_parameters + imv = compiled._insertmanyvalues assert imv is not None @@ -769,7 +790,12 @@ def _deliver_insertmanyvalues_batches( "insertmanyvalues_page_size", self.insertmanyvalues_page_size ) - sentinel_value_resolvers = None + if compiled.schema_translate_map: + schema_translate_map = context.execution_options.get( + "schema_translate_map", {} + ) + else: + schema_translate_map = None if is_returning: result: Optional[List[Any]] = [] @@ -777,10 +803,6 @@ def _deliver_insertmanyvalues_batches( sort_by_parameter_order = imv.sort_by_parameter_order - if imv.num_sentinel_columns: - sentinel_value_resolvers = ( - compiled._imv_sentinel_value_resolvers - ) else: sort_by_parameter_order = False result = None @@ -788,14 +810,27 @@ def _deliver_insertmanyvalues_batches( for imv_batch in compiled._deliver_insertmanyvalues_batches( statement, parameters, + compiled_parameters, generic_setinputsizes, batch_size, sort_by_parameter_order, + schema_translate_map, ): yield imv_batch if is_returning: - rows = context.fetchall_for_returning(cursor) + + try: + rows = context.fetchall_for_returning(cursor) + except BaseException as be: + connection._handle_dbapi_exception( + be, + sql_util._long_statement(imv_batch.replaced_statement), + imv_batch.replaced_parameters, + None, + context, + is_sub_exec=True, + ) # I would have thought "is_returning: Final[bool]" # would have assured this but pylance thinks not @@ -815,11 +850,46 @@ def _deliver_insertmanyvalues_batches( # otherwise, create dictionaries to match up batches # with parameters assert imv.sentinel_param_keys + assert imv.sentinel_columns + _nsc = imv.num_sentinel_columns + + if not _sentinel_proc_initialized: + if composite_sentinel: + _composite_sentinel_proc = [ + col.type._cached_result_processor( + self, cursor_desc[1] + ) + for col, cursor_desc in zip( + imv.sentinel_columns, + cursor.description[-_nsc:], + ) + ] + else: + _scalar_sentinel_proc = ( + imv.sentinel_columns[0] + ).type._cached_result_processor( + self, cursor.description[-1][1] + ) + _sentinel_proc_initialized = True + + rows_by_sentinel: Union[ + Dict[Tuple[Any, ...], Any], + Dict[Any, Any], + ] if composite_sentinel: - _nsc = imv.num_sentinel_columns rows_by_sentinel = { - tuple(row[-_nsc:]): row for row in rows + tuple( + (proc(val) if proc else val) + for val, proc in zip( + row[-_nsc:], _composite_sentinel_proc + ) + ): row + for row in rows + } + elif _scalar_sentinel_proc: + rows_by_sentinel = { + _scalar_sentinel_proc(row[-1]): row for row in rows } else: rows_by_sentinel = {row[-1]: row for row in rows} @@ -838,63 +908,10 @@ def _deliver_insertmanyvalues_batches( ) try: - if composite_sentinel: - if sentinel_value_resolvers: - # composite sentinel (PK) with value resolvers - ordered_rows = [ - rows_by_sentinel[ - tuple( - ( - _resolver(parameters[_spk]) # type: ignore # noqa: E501 - if _resolver - else parameters[_spk] # type: ignore # noqa: E501 - ) - for _resolver, _spk in zip( - sentinel_value_resolvers, - imv.sentinel_param_keys, - ) - ) - ] - for parameters in imv_batch.batch - ] - else: - # composite sentinel (PK) with no value - # resolvers - ordered_rows = [ - rows_by_sentinel[ - tuple( - parameters[_spk] # type: ignore - for _spk in imv.sentinel_param_keys - ) - ] - for parameters in imv_batch.batch - ] - else: - _sentinel_param_key = imv.sentinel_param_keys[0] - if ( - sentinel_value_resolvers - and sentinel_value_resolvers[0] - ): - # single-column sentinel with value resolver - _sentinel_value_resolver = ( - sentinel_value_resolvers[0] - ) - ordered_rows = [ - rows_by_sentinel[ - _sentinel_value_resolver( - parameters[_sentinel_param_key] # type: ignore # noqa: E501 - ) - ] - for parameters in imv_batch.batch - ] - else: - # single-column sentinel with no value resolver - ordered_rows = [ - rows_by_sentinel[ - parameters[_sentinel_param_key] # type: ignore # noqa: E501 - ] - for parameters in imv_batch.batch - ] + ordered_rows = [ + rows_by_sentinel[sentinel_keys] + for sentinel_keys in imv_batch.sentinel_values + ] except KeyError as ke: # see test_insert_exec.py:: # IMVSentinelTest::test_sentinel_cant_match_keys @@ -1198,7 +1215,7 @@ class DefaultExecutionContext(ExecutionContext): _soft_closed = False - _has_rowcount = False + _rowcount: Optional[int] = None # a hook for SQLite's translation of # result column names @@ -1788,7 +1805,14 @@ def handle_dbapi_exception(self, e): @util.non_memoized_property def rowcount(self) -> int: - return self.cursor.rowcount + if self._rowcount is not None: + return self._rowcount + else: + return self.cursor.rowcount + + @property + def _has_rowcount(self): + return self._rowcount is not None def supports_sane_rowcount(self): return self.dialect.supports_sane_rowcount @@ -1799,6 +1823,9 @@ def supports_sane_multi_rowcount(self): def _setup_result_proxy(self): exec_opt = self.execution_options + if self._rowcount is None and exec_opt.get("preserve_rowcount", False): + self._rowcount = self.cursor.rowcount + if self.is_crud or self.is_text: result = self._setup_dml_or_text_result() yp = sr = False @@ -1955,8 +1982,7 @@ def _setup_dml_or_text_result(self): if rows: self.returned_default_rows = rows - result.rowcount = len(rows) - self._has_rowcount = True + self._rowcount = len(rows) if self._is_supplemental_returning: result._rewind(rows) @@ -1970,12 +1996,12 @@ def _setup_dml_or_text_result(self): elif not result._metadata.returns_rows: # no results, get rowcount # (which requires open cursor on some drivers) - result.rowcount - self._has_rowcount = True + if self._rowcount is None: + self._rowcount = self.cursor.rowcount result._soft_close() elif self.isupdate or self.isdelete: - result.rowcount - self._has_rowcount = True + if self._rowcount is None: + self._rowcount = self.cursor.rowcount return result @util.memoized_property diff --git a/libs/sqlalchemy/engine/interfaces.py b/libs/sqlalchemy/engine/interfaces.py index 67eb68ae9..17a133f27 100644 --- a/libs/sqlalchemy/engine/interfaces.py +++ b/libs/sqlalchemy/engine/interfaces.py @@ -270,6 +270,7 @@ class _CoreKnownExecutionOptions(TypedDict, total=False): yield_per: int insertmanyvalues_page_size: int schema_translate_map: Optional[SchemaTranslateMapType] + preserve_rowcount: bool _ExecuteOptions = immutabledict[str, Any] @@ -1252,8 +1253,7 @@ def import_dbapi(cls) -> ModuleType: """ raise NotImplementedError() - @classmethod - def type_descriptor(cls, typeobj: TypeEngine[_T]) -> TypeEngine[_T]: + def type_descriptor(self, typeobj: TypeEngine[_T]) -> TypeEngine[_T]: """Transform a generic type to a dialect-specific type. Dialect classes will usually use the @@ -1315,6 +1315,7 @@ def get_columns( def get_multi_columns( self, connection: Connection, + *, schema: Optional[str] = None, filter_names: Optional[Collection[str]] = None, **kw: Any, @@ -1363,6 +1364,7 @@ def get_pk_constraint( def get_multi_pk_constraint( self, connection: Connection, + *, schema: Optional[str] = None, filter_names: Optional[Collection[str]] = None, **kw: Any, @@ -1409,6 +1411,7 @@ def get_foreign_keys( def get_multi_foreign_keys( self, connection: Connection, + *, schema: Optional[str] = None, filter_names: Optional[Collection[str]] = None, **kw: Any, @@ -1568,6 +1571,7 @@ def get_indexes( def get_multi_indexes( self, connection: Connection, + *, schema: Optional[str] = None, filter_names: Optional[Collection[str]] = None, **kw: Any, @@ -1614,6 +1618,7 @@ def get_unique_constraints( def get_multi_unique_constraints( self, connection: Connection, + *, schema: Optional[str] = None, filter_names: Optional[Collection[str]] = None, **kw: Any, @@ -1661,6 +1666,7 @@ def get_check_constraints( def get_multi_check_constraints( self, connection: Connection, + *, schema: Optional[str] = None, filter_names: Optional[Collection[str]] = None, **kw: Any, @@ -1703,6 +1709,7 @@ def get_table_options( def get_multi_table_options( self, connection: Connection, + *, schema: Optional[str] = None, filter_names: Optional[Collection[str]] = None, **kw: Any, @@ -1754,6 +1761,7 @@ def get_table_comment( def get_multi_table_comment( self, connection: Connection, + *, schema: Optional[str] = None, filter_names: Optional[Collection[str]] = None, **kw: Any, @@ -2146,6 +2154,7 @@ def do_recover_twophase(self, connection: Connection) -> List[Any]: def _deliver_insertmanyvalues_batches( self, + connection: Connection, cursor: DBAPICursor, statement: str, parameters: _DBAPIMultiExecuteParams, @@ -2977,6 +2986,9 @@ class ExecutionContext: inline SQL expression value was fired off. Applies to inserts and updates.""" + execution_options: _ExecuteOptions + """Execution options associated with the current statement execution""" + @classmethod def _init_ddl( cls, diff --git a/libs/sqlalchemy/engine/reflection.py b/libs/sqlalchemy/engine/reflection.py index ef1e566c2..09b098803 100644 --- a/libs/sqlalchemy/engine/reflection.py +++ b/libs/sqlalchemy/engine/reflection.py @@ -55,6 +55,7 @@ from ..sql import operators from ..sql import schema as sa_schema from ..sql.cache_key import _ad_hoc_cache_key_from_args +from ..sql.elements import quoted_name from ..sql.elements import TextClause from ..sql.type_api import TypeEngine from ..sql.visitors import InternalTraversal @@ -89,8 +90,16 @@ def cache( exclude = {"info_cache", "unreflectable"} key = ( fn.__name__, - tuple(a for a in args if isinstance(a, str)), - tuple((k, v) for k, v in kw.items() if k not in exclude), + tuple( + (str(a), a.quote) if isinstance(a, quoted_name) else a + for a in args + if isinstance(a, str) + ), + tuple( + (k, (str(v), v.quote) if isinstance(v, quoted_name) else v) + for k, v in kw.items() + if k not in exclude + ), ) ret: _R = info_cache.get(key) if ret is None: diff --git a/libs/sqlalchemy/engine/result.py b/libs/sqlalchemy/engine/result.py index 56b3a68bc..5ff41f1cb 100644 --- a/libs/sqlalchemy/engine/result.py +++ b/libs/sqlalchemy/engine/result.py @@ -1452,11 +1452,11 @@ def scalar_one(self) -> Any: """Return exactly one scalar result or raise an exception. This is equivalent to calling :meth:`_engine.Result.scalars` and - then :meth:`_engine.Result.one`. + then :meth:`_engine.ScalarResult.one`. .. seealso:: - :meth:`_engine.Result.one` + :meth:`_engine.ScalarResult.one` :meth:`_engine.Result.scalars` @@ -1475,11 +1475,11 @@ def scalar_one_or_none(self) -> Optional[Any]: """Return exactly one scalar result or ``None``. This is equivalent to calling :meth:`_engine.Result.scalars` and - then :meth:`_engine.Result.one_or_none`. + then :meth:`_engine.ScalarResult.one_or_none`. .. seealso:: - :meth:`_engine.Result.one_or_none` + :meth:`_engine.ScalarResult.one_or_none` :meth:`_engine.Result.scalars` @@ -1917,11 +1917,11 @@ def scalar_one(self) -> Any: """Return exactly one scalar result or raise an exception. This is equivalent to calling :meth:`_engine.Result.scalars` - and then :meth:`_engine.Result.one`. + and then :meth:`_engine.ScalarResult.one`. .. seealso:: - :meth:`_engine.Result.one` + :meth:`_engine.ScalarResult.one` :meth:`_engine.Result.scalars` @@ -1940,11 +1940,11 @@ def scalar_one_or_none(self) -> Optional[Any]: """Return exactly one or no scalar result. This is equivalent to calling :meth:`_engine.Result.scalars` - and then :meth:`_engine.Result.one_or_none`. + and then :meth:`_engine.ScalarResult.one_or_none`. .. seealso:: - :meth:`_engine.Result.one_or_none` + :meth:`_engine.ScalarResult.one_or_none` :meth:`_engine.Result.scalars` diff --git a/libs/sqlalchemy/engine/util.py b/libs/sqlalchemy/engine/util.py index 3d95ac586..186ca4c32 100644 --- a/libs/sqlalchemy/engine/util.py +++ b/libs/sqlalchemy/engine/util.py @@ -17,6 +17,7 @@ from .. import util from ..util._has_cy import HAS_CYEXTENSION from ..util.typing import Protocol +from ..util.typing import Self if typing.TYPE_CHECKING or not HAS_CYEXTENSION: from ._py_util import _distill_params_20 as _distill_params_20 @@ -113,7 +114,7 @@ def _trans_ctx_check(cls, subject: _TConsSubject) -> None: "before emitting further commands." ) - def __enter__(self) -> TransactionalContext: + def __enter__(self) -> Self: subject = self._get_subject() # none for outer transaction, may be non-None for nested diff --git a/libs/sqlalchemy/event/api.py b/libs/sqlalchemy/event/api.py index 4a39d10f4..230ec6986 100644 --- a/libs/sqlalchemy/event/api.py +++ b/libs/sqlalchemy/event/api.py @@ -132,7 +132,7 @@ def listens_for( The :func:`.listens_for` decorator is part of the primary interface for the SQLAlchemy event system, documented at :ref:`event_toplevel`. - This function generally shares the same kwargs as :func:`.listens`. + This function generally shares the same kwargs as :func:`.listen`. e.g.:: diff --git a/libs/sqlalchemy/event/base.py b/libs/sqlalchemy/event/base.py index 1f52e2eb7..cddfc982a 100644 --- a/libs/sqlalchemy/event/base.py +++ b/libs/sqlalchemy/event/base.py @@ -191,13 +191,8 @@ def _join(self, other: _DispatchCommon[_ET]) -> _JoinedDispatcher[_ET]: :class:`._Dispatch` objects. """ - if "_joined_dispatch_cls" not in self.__class__.__dict__: - cls = type( - "Joined%s" % self.__class__.__name__, - (_JoinedDispatcher,), - {"__slots__": self._event_names}, - ) - self.__class__._joined_dispatch_cls = cls + assert "_joined_dispatch_cls" in self.__class__.__dict__ + return self._joined_dispatch_cls(self, other) def __reduce__(self) -> Union[str, Tuple[Any, ...]]: @@ -328,6 +323,51 @@ def _create_dispatcher_class( else: dispatch_target_cls.dispatch = dispatcher(cls) + klass = type( + "Joined%s" % dispatch_cls.__name__, + (_JoinedDispatcher,), + {"__slots__": event_names}, + ) + dispatch_cls._joined_dispatch_cls = klass + + # establish pickle capability by adding it to this module + globals()[klass.__name__] = klass + + +class _JoinedDispatcher(_DispatchCommon[_ET]): + """Represent a connection between two _Dispatch objects.""" + + __slots__ = "local", "parent", "_instance_cls" + + local: _DispatchCommon[_ET] + parent: _DispatchCommon[_ET] + _instance_cls: Optional[Type[_ET]] + + def __init__( + self, local: _DispatchCommon[_ET], parent: _DispatchCommon[_ET] + ): + self.local = local + self.parent = parent + self._instance_cls = self.local._instance_cls + + def __reduce__(self) -> Any: + return (self.__class__, (self.local, self.parent)) + + def __getattr__(self, name: str) -> _JoinedListener[_ET]: + # Assign _JoinedListeners as attributes on demand + # to reduce startup time for new dispatch objects. + ls = getattr(self.local, name) + jl = _JoinedListener(self.parent, ls.name, ls) + setattr(self, ls.name, jl) + return jl + + def _listen(self, event_key: _EventKey[_ET], **kw: Any) -> None: + return self.parent._listen(event_key, **kw) + + @property + def _events(self) -> Type[_HasEventsDispatch[_ET]]: + return self.parent._events + class Events(_HasEventsDispatch[_ET]): """Define event listening functions for a particular target type.""" @@ -382,38 +422,6 @@ def _clear(cls) -> None: cls.dispatch._clear() -class _JoinedDispatcher(_DispatchCommon[_ET]): - """Represent a connection between two _Dispatch objects.""" - - __slots__ = "local", "parent", "_instance_cls" - - local: _DispatchCommon[_ET] - parent: _DispatchCommon[_ET] - _instance_cls: Optional[Type[_ET]] - - def __init__( - self, local: _DispatchCommon[_ET], parent: _DispatchCommon[_ET] - ): - self.local = local - self.parent = parent - self._instance_cls = self.local._instance_cls - - def __getattr__(self, name: str) -> _JoinedListener[_ET]: - # Assign _JoinedListeners as attributes on demand - # to reduce startup time for new dispatch objects. - ls = getattr(self.local, name) - jl = _JoinedListener(self.parent, ls.name, ls) - setattr(self, ls.name, jl) - return jl - - def _listen(self, event_key: _EventKey[_ET], **kw: Any) -> None: - return self.parent._listen(event_key, **kw) - - @property - def _events(self) -> Type[_HasEventsDispatch[_ET]]: - return self.parent._events - - class dispatcher(Generic[_ET]): """Descriptor used by target classes to deliver the _Dispatch class at the class level diff --git a/libs/sqlalchemy/ext/associationproxy.py b/libs/sqlalchemy/ext/associationproxy.py index 80e6fdac9..99cb266e3 100644 --- a/libs/sqlalchemy/ext/associationproxy.py +++ b/libs/sqlalchemy/ext/associationproxy.py @@ -98,6 +98,7 @@ def association_proxy( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 ) -> AssociationProxy[Any]: r"""Return a Python property implementing a view of a target attribute which references an attribute on members of the @@ -198,6 +199,13 @@ def association_proxy( .. versionadded:: 2.0.0b4 + :param hash: Specific to + :ref:`orm_declarative_native_dataclasses`, controls if this field + is included when generating the ``__hash__()`` method for the mapped + class. + + .. versionadded:: 2.0.36 + :param info: optional, will be assigned to :attr:`.AssociationProxy.info` if present. @@ -237,7 +245,7 @@ def association_proxy( cascade_scalar_deletes=cascade_scalar_deletes, create_on_none_assignment=create_on_none_assignment, attribute_options=_AttributeOptions( - init, repr, default, default_factory, compare, kw_only + init, repr, default, default_factory, compare, kw_only, hash ), ) diff --git a/libs/sqlalchemy/ext/asyncio/engine.py b/libs/sqlalchemy/ext/asyncio/engine.py index 3c718fad3..8fc8e96db 100644 --- a/libs/sqlalchemy/ext/asyncio/engine.py +++ b/libs/sqlalchemy/ext/asyncio/engine.py @@ -41,6 +41,8 @@ from ...engine.base import Transaction from ...exc import ArgumentError from ...util.concurrency import greenlet_spawn +from ...util.typing import Concatenate +from ...util.typing import ParamSpec if TYPE_CHECKING: from ...engine.cursor import CursorResult @@ -61,6 +63,7 @@ from ...sql.base import Executable from ...sql.selectable import TypedReturnsRows +_P = ParamSpec("_P") _T = TypeVar("_T", bound=Any) @@ -414,6 +417,7 @@ async def execution_options( yield_per: int = ..., insertmanyvalues_page_size: int = ..., schema_translate_map: Optional[SchemaTranslateMapType] = ..., + preserve_rowcount: bool = False, **opt: Any, ) -> AsyncConnection: ... @@ -812,7 +816,10 @@ async def stream_scalars( yield result.scalars() async def run_sync( - self, fn: Callable[..., _T], *arg: Any, **kw: Any + self, + fn: Callable[Concatenate[Connection, _P], _T], + *arg: _P.args, + **kw: _P.kwargs, ) -> _T: """Invoke the given synchronous (i.e. not async) callable, passing a synchronous-style :class:`_engine.Connection` as the first @@ -876,7 +883,9 @@ async def do_something_async(async_engine: AsyncEngine) -> None: """ # noqa: E501 - return await greenlet_spawn(fn, self._proxied, *arg, **kw) + return await greenlet_spawn( + fn, self._proxied, *arg, _require_await=False, **kw + ) def __await__(self) -> Generator[Any, None, AsyncConnection]: return self.start().__await__() @@ -921,7 +930,7 @@ def invalidated(self) -> Any: return self._proxied.invalidated @property - def dialect(self) -> Any: + def dialect(self) -> Dialect: r"""Proxy for the :attr:`_engine.Connection.dialect` attribute on behalf of the :class:`_asyncio.AsyncConnection` class. @@ -930,7 +939,7 @@ def dialect(self) -> Any: return self._proxied.dialect @dialect.setter - def dialect(self, attr: Any) -> None: + def dialect(self, attr: Dialect) -> None: self._proxied.dialect = attr @property diff --git a/libs/sqlalchemy/ext/asyncio/result.py b/libs/sqlalchemy/ext/asyncio/result.py index 7dcbe3280..745a51b81 100644 --- a/libs/sqlalchemy/ext/asyncio/result.py +++ b/libs/sqlalchemy/ext/asyncio/result.py @@ -333,11 +333,11 @@ async def scalar_one(self) -> Any: """Return exactly one scalar result or raise an exception. This is equivalent to calling :meth:`_asyncio.AsyncResult.scalars` and - then :meth:`_asyncio.AsyncResult.one`. + then :meth:`_asyncio.AsyncScalarResult.one`. .. seealso:: - :meth:`_asyncio.AsyncResult.one` + :meth:`_asyncio.AsyncScalarResult.one` :meth:`_asyncio.AsyncResult.scalars` @@ -356,11 +356,11 @@ async def scalar_one_or_none(self) -> Optional[Any]: """Return exactly one scalar result or ``None``. This is equivalent to calling :meth:`_asyncio.AsyncResult.scalars` and - then :meth:`_asyncio.AsyncResult.one_or_none`. + then :meth:`_asyncio.AsyncScalarResult.one_or_none`. .. seealso:: - :meth:`_asyncio.AsyncResult.one_or_none` + :meth:`_asyncio.AsyncScalarResult.one_or_none` :meth:`_asyncio.AsyncResult.scalars` @@ -869,11 +869,11 @@ async def scalar_one(self) -> Any: """Return exactly one scalar result or raise an exception. This is equivalent to calling :meth:`_engine.Result.scalars` - and then :meth:`_engine.Result.one`. + and then :meth:`_engine.AsyncScalarResult.one`. .. seealso:: - :meth:`_engine.Result.one` + :meth:`_engine.AsyncScalarResult.one` :meth:`_engine.Result.scalars` @@ -892,11 +892,11 @@ async def scalar_one_or_none(self) -> Optional[Any]: """Return exactly one or no scalar result. This is equivalent to calling :meth:`_engine.Result.scalars` - and then :meth:`_engine.Result.one_or_none`. + and then :meth:`_engine.AsyncScalarResult.one_or_none`. .. seealso:: - :meth:`_engine.Result.one_or_none` + :meth:`_engine.AsyncScalarResult.one_or_none` :meth:`_engine.Result.scalars` diff --git a/libs/sqlalchemy/ext/asyncio/scoping.py b/libs/sqlalchemy/ext/asyncio/scoping.py index e879a1654..162f34eab 100644 --- a/libs/sqlalchemy/ext/asyncio/scoping.py +++ b/libs/sqlalchemy/ext/asyncio/scoping.py @@ -864,7 +864,7 @@ def is_modified( This method retrieves the history for each instrumented attribute on the instance and performs a comparison of the current - value to its previously committed value, if any. + value to its previously flushed or committed value, if any. It is in effect a more expensive and accurate version of checking for the given instance in the diff --git a/libs/sqlalchemy/ext/asyncio/session.py b/libs/sqlalchemy/ext/asyncio/session.py index a9ea55e49..c2a47d780 100644 --- a/libs/sqlalchemy/ext/asyncio/session.py +++ b/libs/sqlalchemy/ext/asyncio/session.py @@ -38,6 +38,9 @@ from ...orm import SessionTransaction from ...orm import state as _instance_state from ...util.concurrency import greenlet_spawn +from ...util.typing import Concatenate +from ...util.typing import ParamSpec + if TYPE_CHECKING: from .engine import AsyncConnection @@ -71,6 +74,7 @@ _AsyncSessionBind = Union["AsyncEngine", "AsyncConnection"] +_P = ParamSpec("_P") _T = TypeVar("_T", bound=Any) @@ -332,7 +336,10 @@ async def refresh( ) async def run_sync( - self, fn: Callable[..., _T], *arg: Any, **kw: Any + self, + fn: Callable[Concatenate[Session, _P], _T], + *arg: _P.args, + **kw: _P.kwargs, ) -> _T: """Invoke the given synchronous (i.e. not async) callable, passing a synchronous-style :class:`_orm.Session` as the first @@ -386,7 +393,9 @@ async def do_something_async(async_engine: AsyncEngine) -> None: :ref:`session_run_sync` """ # noqa: E501 - return await greenlet_spawn(fn, self.sync_session, *arg, **kw) + return await greenlet_spawn( + fn, self.sync_session, *arg, _require_await=False, **kw + ) @overload async def execute( @@ -1298,7 +1307,7 @@ def is_modified( This method retrieves the history for each instrumented attribute on the instance and performs a comparison of the current - value to its previously committed value, if any. + value to its previously flushed or committed value, if any. It is in effect a more expensive and accurate version of checking for the given instance in the @@ -1854,7 +1863,7 @@ async def start( ) -> AsyncSessionTransaction: self.sync_transaction = self._assign_proxied( await greenlet_spawn( - self.session.sync_session.begin_nested # type: ignore + self.session.sync_session.begin_nested if self.nested else self.session.sync_session.begin ) diff --git a/libs/sqlalchemy/ext/automap.py b/libs/sqlalchemy/ext/automap.py index 7d1f92534..70b0fe62c 100644 --- a/libs/sqlalchemy/ext/automap.py +++ b/libs/sqlalchemy/ext/automap.py @@ -11,7 +11,7 @@ It is hoped that the :class:`.AutomapBase` system provides a quick and modernized solution to the problem that the very famous -`SQLSoup <https://sqlsoup.readthedocs.io/en/latest/>`_ +`SQLSoup <https://pypi.org/project/sqlsoup/>`_ also tries to solve, that of generating a quick and rudimentary object model from an existing database on the fly. By addressing the issue strictly at the mapper configuration level, and integrating fully with existing @@ -64,7 +64,7 @@ # collection-based relationships are by default named # "<classname>_collection" u1 = session.query(User).first() - print (u1.address_collection) + print(u1.address_collection) Above, calling :meth:`.AutomapBase.prepare` while passing along the :paramref:`.AutomapBase.prepare.reflect` parameter indicates that the @@ -101,6 +101,7 @@ from sqlalchemy import create_engine, MetaData, Table, Column, ForeignKey from sqlalchemy.ext.automap import automap_base + engine = create_engine("sqlite:///mydatabase.db") # produce our own MetaData object @@ -108,13 +109,15 @@ # we can reflect it ourselves from a database, using options # such as 'only' to limit what tables we look at... - metadata.reflect(engine, only=['user', 'address']) + metadata.reflect(engine, only=["user", "address"]) # ... or just define our own Table objects with it (or combine both) - Table('user_order', metadata, - Column('id', Integer, primary_key=True), - Column('user_id', ForeignKey('user.id')) - ) + Table( + "user_order", + metadata, + Column("id", Integer, primary_key=True), + Column("user_id", ForeignKey("user.id")), + ) # we can then produce a set of mappings from this MetaData. Base = automap_base(metadata=metadata) @@ -123,8 +126,9 @@ Base.prepare() # mapped classes are ready - User, Address, Order = Base.classes.user, Base.classes.address,\ - Base.classes.user_order + User = Base.classes.user + Address = Base.classes.address + Order = Base.classes.user_order .. _automap_by_module: @@ -177,19 +181,20 @@ Base.metadata.create_all(e) + def module_name_for_table(cls, tablename, table): if table.schema is not None: return f"mymodule.{table.schema}" else: return f"mymodule.default" + Base = automap_base() Base.prepare(e, modulename_for_table=module_name_for_table) Base.prepare(e, schema="test_schema", modulename_for_table=module_name_for_table) Base.prepare(e, schema="test_schema_2", modulename_for_table=module_name_for_table) - The same named-classes are organized into a hierarchical collection available at :attr:`.AutomapBase.by_module`. This collection is traversed using the dot-separated name of a particular package/module down into the desired @@ -251,12 +256,13 @@ class name. # automap base Base = automap_base() + # pre-declare User for the 'user' table class User(Base): - __tablename__ = 'user' + __tablename__ = "user" # override schema elements like Columns - user_name = Column('name', String) + user_name = Column("name", String) # override relationships too, if desired. # we must use the same name that automap would use for the @@ -264,6 +270,7 @@ class User(Base): # generate for "address" address_collection = relationship("address", collection_class=set) + # reflect engine = create_engine("sqlite:///mydatabase.db") Base.prepare(autoload_with=engine) @@ -274,11 +281,11 @@ class User(Base): Address = Base.classes.address u1 = session.query(User).first() - print (u1.address_collection) + print(u1.address_collection) # the backref is still there: a1 = session.query(Address).first() - print (a1.user) + print(a1.user) Above, one of the more intricate details is that we illustrated overriding one of the :func:`_orm.relationship` objects that automap would have created. @@ -305,35 +312,49 @@ class User(Base): import re import inflect + def camelize_classname(base, tablename, table): - "Produce a 'camelized' class name, e.g. " + "Produce a 'camelized' class name, e.g." "'words_and_underscores' -> 'WordsAndUnderscores'" - return str(tablename[0].upper() + \ - re.sub(r'_([a-z])', lambda m: m.group(1).upper(), tablename[1:])) + return str( + tablename[0].upper() + + re.sub( + r"_([a-z])", + lambda m: m.group(1).upper(), + tablename[1:], + ) + ) + _pluralizer = inflect.engine() + + def pluralize_collection(base, local_cls, referred_cls, constraint): - "Produce an 'uncamelized', 'pluralized' class name, e.g. " + "Produce an 'uncamelized', 'pluralized' class name, e.g." "'SomeTerm' -> 'some_terms'" referred_name = referred_cls.__name__ - uncamelized = re.sub(r'[A-Z]', - lambda m: "_%s" % m.group(0).lower(), - referred_name)[1:] + uncamelized = re.sub( + r"[A-Z]", + lambda m: "_%s" % m.group(0).lower(), + referred_name, + )[1:] pluralized = _pluralizer.plural(uncamelized) return pluralized + from sqlalchemy.ext.automap import automap_base Base = automap_base() engine = create_engine("sqlite:///mydatabase.db") - Base.prepare(autoload_with=engine, - classname_for_table=camelize_classname, - name_for_collection_relationship=pluralize_collection - ) + Base.prepare( + autoload_with=engine, + classname_for_table=camelize_classname, + name_for_collection_relationship=pluralize_collection, + ) From the above mapping, we would now have classes ``User`` and ``Address``, where the collection from ``User`` to ``Address`` is called @@ -422,16 +443,21 @@ def pluralize_collection(base, local_cls, referred_cls, constraint): options along to all one-to-many relationships:: from sqlalchemy.ext.automap import generate_relationship + from sqlalchemy.orm import interfaces + - def _gen_relationship(base, direction, return_fn, - attrname, local_cls, referred_cls, **kw): + def _gen_relationship( + base, direction, return_fn, attrname, local_cls, referred_cls, **kw + ): if direction is interfaces.ONETOMANY: - kw['cascade'] = 'all, delete-orphan' - kw['passive_deletes'] = True + kw["cascade"] = "all, delete-orphan" + kw["passive_deletes"] = True # make use of the built-in function to actually return # the result. - return generate_relationship(base, direction, return_fn, - attrname, local_cls, referred_cls, **kw) + return generate_relationship( + base, direction, return_fn, attrname, local_cls, referred_cls, **kw + ) + from sqlalchemy.ext.automap import automap_base from sqlalchemy import create_engine @@ -440,8 +466,7 @@ def _gen_relationship(base, direction, return_fn, Base = automap_base() engine = create_engine("sqlite:///mydatabase.db") - Base.prepare(autoload_with=engine, - generate_relationship=_gen_relationship) + Base.prepare(autoload_with=engine, generate_relationship=_gen_relationship) Many-to-Many relationships -------------------------- @@ -482,18 +507,20 @@ def _gen_relationship(base, direction, return_fn, classes given as follows:: class Employee(Base): - __tablename__ = 'employee' + __tablename__ = "employee" id = Column(Integer, primary_key=True) type = Column(String(50)) __mapper_args__ = { - 'polymorphic_identity':'employee', 'polymorphic_on': type + "polymorphic_identity": "employee", + "polymorphic_on": type, } + class Engineer(Employee): - __tablename__ = 'engineer' - id = Column(Integer, ForeignKey('employee.id'), primary_key=True) + __tablename__ = "engineer" + id = Column(Integer, ForeignKey("employee.id"), primary_key=True) __mapper_args__ = { - 'polymorphic_identity':'engineer', + "polymorphic_identity": "engineer", } The foreign key from ``Engineer`` to ``Employee`` is used not for a @@ -508,25 +535,26 @@ class Engineer(Employee): SQLAlchemy can guess:: class Employee(Base): - __tablename__ = 'employee' + __tablename__ = "employee" id = Column(Integer, primary_key=True) type = Column(String(50)) __mapper_args__ = { - 'polymorphic_identity':'employee', 'polymorphic_on':type + "polymorphic_identity": "employee", + "polymorphic_on": type, } + class Engineer(Employee): - __tablename__ = 'engineer' - id = Column(Integer, ForeignKey('employee.id'), primary_key=True) - favorite_employee_id = Column(Integer, ForeignKey('employee.id')) + __tablename__ = "engineer" + id = Column(Integer, ForeignKey("employee.id"), primary_key=True) + favorite_employee_id = Column(Integer, ForeignKey("employee.id")) - favorite_employee = relationship(Employee, - foreign_keys=favorite_employee_id) + favorite_employee = relationship(Employee, foreign_keys=favorite_employee_id) __mapper_args__ = { - 'polymorphic_identity':'engineer', - 'inherit_condition': id == Employee.id + "polymorphic_identity": "engineer", + "inherit_condition": id == Employee.id, } Handling Simple Naming Conflicts @@ -564,15 +592,15 @@ def name_for_scalar_relationship(base, local_cls, referred_cls, constraint): local_table = local_cls.__table__ if name in local_table.columns: newname = name + "_" - warnings.warn( - "Already detected name %s present. using %s" % - (name, newname)) + warnings.warn("Already detected name %s present. using %s" % (name, newname)) return newname return name - Base.prepare(autoload_with=engine, - name_for_scalar_relationship=name_for_scalar_relationship) + Base.prepare( + autoload_with=engine, + name_for_scalar_relationship=name_for_scalar_relationship, + ) Alternatively, we can change the name on the column side. The columns that are mapped can be modified using the technique described at @@ -581,12 +609,13 @@ def name_for_scalar_relationship(base, local_cls, referred_cls, constraint): Base = automap_base() + class TableB(Base): - __tablename__ = 'table_b' - _table_a = Column('table_a', ForeignKey('table_a.id')) + __tablename__ = "table_b" + _table_a = Column("table_a", ForeignKey("table_a.id")) - Base.prepare(autoload_with=engine) + Base.prepare(autoload_with=engine) Using Automap with Explicit Declarations ======================================== @@ -603,26 +632,29 @@ class TableB(Base): Base = automap_base() + class User(Base): - __tablename__ = 'user' + __tablename__ = "user" id = Column(Integer, primary_key=True) name = Column(String) + class Address(Base): - __tablename__ = 'address' + __tablename__ = "address" id = Column(Integer, primary_key=True) email = Column(String) - user_id = Column(ForeignKey('user.id')) + user_id = Column(ForeignKey("user.id")) + # produce relationships Base.prepare() # mapping is complete, with "address_collection" and # "user" relationships - a1 = Address(email='u1') - a2 = Address(email='u2') + a1 = Address(email="u1") + a2 = Address(email="u2") u1 = User(address_collection=[a1, a2]) assert a1.user is u1 @@ -651,7 +683,8 @@ class Address(Base): @event.listens_for(Base.metadata, "column_reflect") def column_reflect(inspector, table, column_info): # set column.key = "attr_<lower_case_name>" - column_info['key'] = "attr_%s" % column_info['name'].lower() + column_info["key"] = "attr_%s" % column_info["name"].lower() + # run reflection Base.prepare(autoload_with=engine) @@ -1002,6 +1035,12 @@ class that is produced by the :func:`.declarative.declarative_base` User, Address = Base.classes.User, Base.classes.Address + For class names that overlap with a method name of + :class:`.util.Properties`, such as ``items()``, the getitem form + is also supported:: + + Item = Base.classes["items"] + """ by_module: ClassVar[ByModuleProperties] diff --git a/libs/sqlalchemy/ext/compiler.py b/libs/sqlalchemy/ext/compiler.py index 01462ad0b..b870adce9 100644 --- a/libs/sqlalchemy/ext/compiler.py +++ b/libs/sqlalchemy/ext/compiler.py @@ -4,7 +4,6 @@ # # This module is part of SQLAlchemy and is released under # the MIT License: https://www.opensource.org/licenses/mit-license.php -# mypy: ignore-errors r"""Provides an API for creation of custom ClauseElements and compilers. @@ -452,15 +451,29 @@ def int_false(element, compiler, **kw): ) """ +from __future__ import annotations + +from typing import Any +from typing import Callable +from typing import Dict +from typing import Type +from typing import TYPE_CHECKING +from typing import TypeVar + from .. import exc from ..sql import sqltypes +if TYPE_CHECKING: + from ..sql.compiler import SQLCompiler + +_F = TypeVar("_F", bound=Callable[..., Any]) + -def compiles(class_, *specs): +def compiles(class_: Type[Any], *specs: str) -> Callable[[_F], _F]: """Register a function as a compiler for a given :class:`_expression.ClauseElement` type.""" - def decorate(fn): + def decorate(fn: _F) -> _F: # get an existing @compiles handler existing = class_.__dict__.get("_compiler_dispatcher", None) @@ -473,7 +486,9 @@ def decorate(fn): if existing_dispatch: - def _wrap_existing_dispatch(element, compiler, **kw): + def _wrap_existing_dispatch( + element: Any, compiler: SQLCompiler, **kw: Any + ) -> Any: try: return existing_dispatch(element, compiler, **kw) except exc.UnsupportedCompilationError as uce: @@ -505,7 +520,7 @@ def _wrap_existing_dispatch(element, compiler, **kw): return decorate -def deregister(class_): +def deregister(class_: Type[Any]) -> None: """Remove all custom compilers associated with a given :class:`_expression.ClauseElement` type. @@ -517,10 +532,10 @@ def deregister(class_): class _dispatcher: - def __init__(self): - self.specs = {} + def __init__(self) -> None: + self.specs: Dict[str, Callable[..., Any]] = {} - def __call__(self, element, compiler, **kw): + def __call__(self, element: Any, compiler: SQLCompiler, **kw: Any) -> Any: # TODO: yes, this could also switch off of DBAPI in use. fn = self.specs.get(compiler.dialect.name, None) if not fn: diff --git a/libs/sqlalchemy/ext/hybrid.py b/libs/sqlalchemy/ext/hybrid.py index 25b74d8d6..ee8d6a781 100644 --- a/libs/sqlalchemy/ext/hybrid.py +++ b/libs/sqlalchemy/ext/hybrid.py @@ -1096,7 +1096,7 @@ def value(self, value): self.expr = _unwrap_classmethod(expr) self.custom_comparator = _unwrap_classmethod(custom_comparator) self.update_expr = _unwrap_classmethod(update_expr) - util.update_wrapper(self, fget) + util.update_wrapper(self, fget) # type: ignore[arg-type] @overload def __get__(self, instance: Any, owner: Literal[None]) -> Self: ... diff --git a/libs/sqlalchemy/ext/mypy/names.py b/libs/sqlalchemy/ext/mypy/names.py index 35b4e2ba8..fc3d708e7 100644 --- a/libs/sqlalchemy/ext/mypy/names.py +++ b/libs/sqlalchemy/ext/mypy/names.py @@ -58,6 +58,14 @@ NAMED_TYPE_BUILTINS_LIST = "builtins.list" NAMED_TYPE_SQLA_MAPPED = "sqlalchemy.orm.base.Mapped" +_RelFullNames = { + "sqlalchemy.orm.relationships.Relationship", + "sqlalchemy.orm.relationships.RelationshipProperty", + "sqlalchemy.orm.relationships._RelationshipDeclared", + "sqlalchemy.orm.Relationship", + "sqlalchemy.orm.RelationshipProperty", +} + _lookup: Dict[str, Tuple[int, Set[str]]] = { "Column": ( COLUMN, @@ -66,24 +74,9 @@ "sqlalchemy.sql.Column", }, ), - "Relationship": ( - RELATIONSHIP, - { - "sqlalchemy.orm.relationships.Relationship", - "sqlalchemy.orm.relationships.RelationshipProperty", - "sqlalchemy.orm.Relationship", - "sqlalchemy.orm.RelationshipProperty", - }, - ), - "RelationshipProperty": ( - RELATIONSHIP, - { - "sqlalchemy.orm.relationships.Relationship", - "sqlalchemy.orm.relationships.RelationshipProperty", - "sqlalchemy.orm.Relationship", - "sqlalchemy.orm.RelationshipProperty", - }, - ), + "Relationship": (RELATIONSHIP, _RelFullNames), + "RelationshipProperty": (RELATIONSHIP, _RelFullNames), + "_RelationshipDeclared": (RELATIONSHIP, _RelFullNames), "registry": ( REGISTRY, { diff --git a/libs/sqlalchemy/ext/mypy/util.py b/libs/sqlalchemy/ext/mypy/util.py index 7f04c481d..af0882bc3 100644 --- a/libs/sqlalchemy/ext/mypy/util.py +++ b/libs/sqlalchemy/ext/mypy/util.py @@ -80,7 +80,7 @@ def serialize(self) -> JsonDict: "name": self.name, "line": self.line, "column": self.column, - "type": self.type.serialize(), + "type": serialize_type(self.type), } def expand_typevar_from_subtype(self, sub_type: TypeInfo) -> None: @@ -336,3 +336,22 @@ def info_for_cls( return sym.node return cls.info + + +def serialize_type(typ: Type) -> Union[str, JsonDict]: + try: + return typ.serialize() + except Exception: + pass + if hasattr(typ, "args"): + typ.args = tuple( + ( + a.resolve_string_annotation() + if hasattr(a, "resolve_string_annotation") + else a + ) + for a in typ.args + ) + elif hasattr(typ, "resolve_string_annotation"): + typ = typ.resolve_string_annotation() + return typ.serialize() diff --git a/libs/sqlalchemy/ext/serializer.py b/libs/sqlalchemy/ext/serializer.py index f21e997a2..130d25374 100644 --- a/libs/sqlalchemy/ext/serializer.py +++ b/libs/sqlalchemy/ext/serializer.py @@ -82,10 +82,9 @@ __all__ = ["Serializer", "Deserializer", "dumps", "loads"] -def Serializer(*args, **kw): - pickler = pickle.Pickler(*args, **kw) +class Serializer(pickle.Pickler): - def persistent_id(obj): + def persistent_id(self, obj): # print "serializing:", repr(obj) if isinstance(obj, Mapper) and not obj.non_primary: id_ = "mapper:" + b64encode(pickle.dumps(obj.class_)) @@ -113,9 +112,6 @@ def persistent_id(obj): return None return id_ - pickler.persistent_id = persistent_id - return pickler - our_ids = re.compile( r"(mapperprop|mapper|mapper_selectable|table|column|" @@ -123,20 +119,23 @@ def persistent_id(obj): ) -def Deserializer(file, metadata=None, scoped_session=None, engine=None): - unpickler = pickle.Unpickler(file) +class Deserializer(pickle.Unpickler): + + def __init__(self, file, metadata=None, scoped_session=None, engine=None): + super().__init__(file) + self.metadata = metadata + self.scoped_session = scoped_session + self.engine = engine - def get_engine(): - if engine: - return engine - elif scoped_session and scoped_session().bind: - return scoped_session().bind - elif metadata and metadata.bind: - return metadata.bind + def get_engine(self): + if self.engine: + return self.engine + elif self.scoped_session and self.scoped_session().bind: + return self.scoped_session().bind else: return None - def persistent_load(id_): + def persistent_load(self, id_): m = our_ids.match(str(id_)) if not m: return None @@ -157,20 +156,17 @@ def persistent_load(id_): cls = pickle.loads(b64decode(mapper)) return class_mapper(cls).attrs[keyname] elif type_ == "table": - return metadata.tables[args] + return self.metadata.tables[args] elif type_ == "column": table, colname = args.split(":") - return metadata.tables[table].c[colname] + return self.metadata.tables[table].c[colname] elif type_ == "session": - return scoped_session() + return self.scoped_session() elif type_ == "engine": - return get_engine() + return self.get_engine() else: raise Exception("Unknown token: %s" % type_) - unpickler.persistent_load = persistent_load - return unpickler - def dumps(obj, protocol=pickle.HIGHEST_PROTOCOL): buf = BytesIO() diff --git a/libs/sqlalchemy/orm/_orm_constructors.py b/libs/sqlalchemy/orm/_orm_constructors.py index f74de91c1..4c777b3b3 100644 --- a/libs/sqlalchemy/orm/_orm_constructors.py +++ b/libs/sqlalchemy/orm/_orm_constructors.py @@ -28,8 +28,8 @@ from .properties import MappedSQLExpression from .query import AliasOption from .relationships import _RelationshipArgumentType +from .relationships import _RelationshipDeclared from .relationships import _RelationshipSecondaryArgument -from .relationships import Relationship from .relationships import RelationshipProperty from .session import Session from .util import _ORMJoin @@ -70,7 +70,7 @@ from ..sql._typing import _TypeEngineArgument from ..sql.elements import ColumnElement from ..sql.schema import _ServerDefaultArgument - from ..sql.schema import FetchedValue + from ..sql.schema import _ServerOnUpdateArgument from ..sql.selectable import Alias from ..sql.selectable import Subquery @@ -108,6 +108,7 @@ def mapped_column( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 nullable: Optional[ Union[bool, Literal[SchemaConst.NULL_UNSPECIFIED]] ] = SchemaConst.NULL_UNSPECIFIED, @@ -127,7 +128,7 @@ def mapped_column( onupdate: Optional[Any] = None, insert_default: Optional[Any] = _NoArg.NO_ARG, server_default: Optional[_ServerDefaultArgument] = None, - server_onupdate: Optional[FetchedValue] = None, + server_onupdate: Optional[_ServerOnUpdateArgument] = None, active_history: bool = False, quote: Optional[bool] = None, system: bool = False, @@ -255,12 +256,28 @@ def mapped_column( be used instead**. This is necessary to disambiguate the callable from being interpreted as a dataclass level default. + .. seealso:: + + :ref:`defaults_default_factory_insert_default` + + :paramref:`_orm.mapped_column.insert_default` + + :paramref:`_orm.mapped_column.default_factory` + :param insert_default: Passed directly to the :paramref:`_schema.Column.default` parameter; will supersede the value of :paramref:`_orm.mapped_column.default` when present, however :paramref:`_orm.mapped_column.default` will always apply to the constructor default for a dataclasses mapping. + .. seealso:: + + :ref:`defaults_default_factory_insert_default` + + :paramref:`_orm.mapped_column.default` + + :paramref:`_orm.mapped_column.default_factory` + :param sort_order: An integer that indicates how this mapped column should be sorted compared to the others when the ORM is creating a :class:`_schema.Table`. Among mapped columns that have the same @@ -295,6 +312,15 @@ def mapped_column( specifies a default-value generation function that will take place as part of the ``__init__()`` method as generated by the dataclass process. + + .. seealso:: + + :ref:`defaults_default_factory_insert_default` + + :paramref:`_orm.mapped_column.default` + + :paramref:`_orm.mapped_column.insert_default` + :param compare: Specific to :ref:`orm_declarative_native_dataclasses`, indicates if this field should be included in comparison operations when generating the @@ -306,6 +332,13 @@ def mapped_column( :ref:`orm_declarative_native_dataclasses`, indicates if this field should be marked as keyword-only when generating the ``__init__()``. + :param hash: Specific to + :ref:`orm_declarative_native_dataclasses`, controls if this field + is included when generating the ``__hash__()`` method for the mapped + class. + + .. versionadded:: 2.0.36 + :param \**kw: All remaining keyword arguments are passed through to the constructor for the :class:`_schema.Column`. @@ -320,7 +353,7 @@ def mapped_column( autoincrement=autoincrement, insert_default=insert_default, attribute_options=_AttributeOptions( - init, repr, default, default_factory, compare, kw_only + init, repr, default, default_factory, compare, kw_only, hash ), doc=doc, key=key, @@ -415,12 +448,13 @@ def column_property( deferred: bool = False, raiseload: bool = False, comparator_factory: Optional[Type[PropComparator[_T]]] = None, - init: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 + init: Union[_NoArg, bool] = _NoArg.NO_ARG, repr: Union[_NoArg, bool] = _NoArg.NO_ARG, # noqa: A002 default: Optional[Any] = _NoArg.NO_ARG, default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 active_history: bool = False, expire_on_flush: bool = True, info: Optional[_InfoType] = None, @@ -509,13 +543,43 @@ def column_property( :ref:`orm_queryguide_deferred_raiseload` - :param init: + :param init: Specific to :ref:`orm_declarative_native_dataclasses`, + specifies if the mapped attribute should be part of the ``__init__()`` + method as generated by the dataclass process. + :param repr: Specific to :ref:`orm_declarative_native_dataclasses`, + specifies if the mapped attribute should be part of the ``__repr__()`` + method as generated by the dataclass process. + :param default_factory: Specific to + :ref:`orm_declarative_native_dataclasses`, + specifies a default-value generation function that will take place + as part of the ``__init__()`` + method as generated by the dataclass process. + + .. seealso:: + + :ref:`defaults_default_factory_insert_default` + + :paramref:`_orm.mapped_column.default` + + :paramref:`_orm.mapped_column.insert_default` + + :param compare: Specific to + :ref:`orm_declarative_native_dataclasses`, indicates if this field + should be included in comparison operations when generating the + ``__eq__()`` and ``__ne__()`` methods for the mapped class. - :param default: + .. versionadded:: 2.0.0b4 - :param default_factory: + :param kw_only: Specific to + :ref:`orm_declarative_native_dataclasses`, indicates if this field + should be marked as keyword-only when generating the ``__init__()``. - :param kw_only: + :param hash: Specific to + :ref:`orm_declarative_native_dataclasses`, controls if this field + is included when generating the ``__hash__()`` method for the mapped + class. + + .. versionadded:: 2.0.36 """ return MappedSQLExpression( @@ -528,6 +592,7 @@ def column_property( default_factory, compare, kw_only, + hash, ), group=group, deferred=deferred, @@ -556,6 +621,7 @@ def composite( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 info: Optional[_InfoType] = None, doc: Optional[str] = None, **__kw: Any, @@ -577,6 +643,7 @@ def composite( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 info: Optional[_InfoType] = None, doc: Optional[str] = None, **__kw: Any, @@ -598,6 +665,7 @@ def composite( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 info: Optional[_InfoType] = None, doc: Optional[str] = None, **__kw: Any, @@ -620,6 +688,7 @@ def composite( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 info: Optional[_InfoType] = None, doc: Optional[str] = None, **__kw: Any, @@ -694,6 +763,12 @@ def composite( :ref:`orm_declarative_native_dataclasses`, indicates if this field should be marked as keyword-only when generating the ``__init__()``. + :param hash: Specific to + :ref:`orm_declarative_native_dataclasses`, controls if this field + is included when generating the ``__hash__()`` method for the mapped + class. + + .. versionadded:: 2.0.36 """ if __kw: raise _no_kw() @@ -702,7 +777,7 @@ def composite( _class_or_attr, *attrs, attribute_options=_AttributeOptions( - init, repr, default, default_factory, compare, kw_only + init, repr, default, default_factory, compare, kw_only, hash ), group=group, deferred=deferred, @@ -716,7 +791,10 @@ def composite( def with_loader_criteria( entity_or_base: _EntityType[Any], - where_criteria: _ColumnExpressionArgument[bool], + where_criteria: Union[ + _ColumnExpressionArgument[bool], + Callable[[Any], _ColumnExpressionArgument[bool]], + ], loader_only: bool = False, include_aliases: bool = False, propagate_to_loaders: bool = True, @@ -927,6 +1005,7 @@ def relationship( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 lazy: _LazyLoadArgumentType = "select", passive_deletes: Union[Literal["all"], bool] = False, passive_updates: bool = True, @@ -947,7 +1026,7 @@ def relationship( omit_join: Literal[None, False] = None, sync_backref: Optional[bool] = None, **kw: Any, -) -> Relationship[Any]: +) -> _RelationshipDeclared[Any]: """Provide a relationship between two mapped classes. This corresponds to a parent-child or associative table relationship. @@ -1750,10 +1829,15 @@ class that will be synchronized with this one. It is usually :ref:`orm_declarative_native_dataclasses`, indicates if this field should be marked as keyword-only when generating the ``__init__()``. + :param hash: Specific to + :ref:`orm_declarative_native_dataclasses`, controls if this field + is included when generating the ``__hash__()`` method for the mapped + class. + .. versionadded:: 2.0.36 """ - return Relationship( + return _RelationshipDeclared( argument, secondary=secondary, uselist=uselist, @@ -1768,7 +1852,7 @@ class that will be synchronized with this one. It is usually cascade=cascade, viewonly=viewonly, attribute_options=_AttributeOptions( - init, repr, default, default_factory, compare, kw_only + init, repr, default, default_factory, compare, kw_only, hash ), lazy=lazy, passive_deletes=passive_deletes, @@ -1803,6 +1887,7 @@ def synonym( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 info: Optional[_InfoType] = None, doc: Optional[str] = None, ) -> Synonym[Any]: @@ -1913,7 +1998,7 @@ def _job_status_descriptor(self): descriptor=descriptor, comparator_factory=comparator_factory, attribute_options=_AttributeOptions( - init, repr, default, default_factory, compare, kw_only + init, repr, default, default_factory, compare, kw_only, hash ), doc=doc, info=info, @@ -2044,6 +2129,7 @@ def deferred( default_factory: Union[_NoArg, Callable[[], _T]] = _NoArg.NO_ARG, compare: Union[_NoArg, bool] = _NoArg.NO_ARG, kw_only: Union[_NoArg, bool] = _NoArg.NO_ARG, + hash: Union[_NoArg, bool, None] = _NoArg.NO_ARG, # noqa: A002 active_history: bool = False, expire_on_flush: bool = True, info: Optional[_InfoType] = None, @@ -2078,7 +2164,7 @@ def deferred( column, *additional_columns, attribute_options=_AttributeOptions( - init, repr, default, default_factory, compare, kw_only + init, repr, default, default_factory, compare, kw_only, hash ), group=group, deferred=True, @@ -2121,6 +2207,7 @@ def query_expression( _NoArg.NO_ARG, compare, _NoArg.NO_ARG, + _NoArg.NO_ARG, ), expire_on_flush=expire_on_flush, info=info, @@ -2267,6 +2354,16 @@ def aliased( supported by all modern databases with regards to right-nested joins and generally produces more efficient queries. + When :paramref:`_orm.aliased.flat` is combined with + :paramref:`_orm.aliased.name`, the resulting joins will alias individual + tables using a naming scheme similar to ``<prefix>_<tablename>``. This + naming scheme is for visibility / debugging purposes only and the + specific scheme is subject to change without notice. + + .. versionadded:: 2.0.32 added support for combining + :paramref:`_orm.aliased.name` with :paramref:`_orm.aliased.flat`. + Previously, this would raise ``NotImplementedError``. + :param adapt_on_names: if True, more liberal "matching" will be used when mapping the mapped columns of the ORM entity to those of the given selectable - a name-based match will be performed if the @@ -2314,6 +2411,7 @@ def with_polymorphic( aliased: bool = False, innerjoin: bool = False, adapt_on_names: bool = False, + name: Optional[str] = None, _use_mapper_path: bool = False, ) -> AliasedClass[_O]: """Produce an :class:`.AliasedClass` construct which specifies @@ -2385,6 +2483,10 @@ def with_polymorphic( .. versionadded:: 1.4.33 + :param name: Name given to the generated :class:`.AliasedClass`. + + .. versionadded:: 2.0.31 + """ return AliasedInsp._with_polymorphic_factory( base, @@ -2395,6 +2497,7 @@ def with_polymorphic( adapt_on_names=adapt_on_names, aliased=aliased, innerjoin=innerjoin, + name=name, _use_mapper_path=_use_mapper_path, ) diff --git a/libs/sqlalchemy/orm/attributes.py b/libs/sqlalchemy/orm/attributes.py index d9b2d8213..33cca5649 100644 --- a/libs/sqlalchemy/orm/attributes.py +++ b/libs/sqlalchemy/orm/attributes.py @@ -401,7 +401,7 @@ def adapt_to_entity(self, adapt_to_entity: AliasedInsp[Any]) -> Self: parententity=adapt_to_entity, ) - def of_type(self, entity: _EntityType[Any]) -> QueryableAttribute[_T]: + def of_type(self, entity: _EntityType[_T]) -> QueryableAttribute[_T]: return QueryableAttribute( self.class_, self.key, @@ -503,7 +503,7 @@ def _queryable_attribute_unreduce( return getattr(entity, key) -class InstrumentedAttribute(QueryableAttribute[_T]): +class InstrumentedAttribute(QueryableAttribute[_T_co]): """Class bound instrumented attribute which adds basic :term:`descriptor` methods. @@ -544,14 +544,14 @@ def __delete__(self, instance: object) -> None: @overload def __get__( self, instance: None, owner: Any - ) -> InstrumentedAttribute[_T]: ... + ) -> InstrumentedAttribute[_T_co]: ... @overload - def __get__(self, instance: object, owner: Any) -> _T: ... + def __get__(self, instance: object, owner: Any) -> _T_co: ... def __get__( self, instance: Optional[object], owner: Any - ) -> Union[InstrumentedAttribute[_T], _T]: + ) -> Union[InstrumentedAttribute[_T_co], _T_co]: if instance is None: return self diff --git a/libs/sqlalchemy/orm/base.py b/libs/sqlalchemy/orm/base.py index 86af81cd6..b5f7dbbaf 100644 --- a/libs/sqlalchemy/orm/base.py +++ b/libs/sqlalchemy/orm/base.py @@ -21,6 +21,7 @@ from typing import no_type_check from typing import Optional from typing import overload +from typing import Tuple from typing import Type from typing import TYPE_CHECKING from typing import TypeVar @@ -282,6 +283,8 @@ class NotExtension(InspectionAttrExtensionType): _none_set = frozenset([None, NEVER_SET, PASSIVE_NO_RESULT]) +_none_only_set = frozenset([None]) + _SET_DEFERRED_EXPIRED = util.symbol("SET_DEFERRED_EXPIRED") _DEFER_FOR_STATE = util.symbol("DEFER_FOR_STATE") @@ -579,7 +582,7 @@ class InspectionAttr: """ - __slots__ = () + __slots__: Tuple[str, ...] = () is_selectable = False """Return True if this object is an instance of diff --git a/libs/sqlalchemy/orm/bulk_persistence.py b/libs/sqlalchemy/orm/bulk_persistence.py index 5d2558d95..755192384 100644 --- a/libs/sqlalchemy/orm/bulk_persistence.py +++ b/libs/sqlalchemy/orm/bulk_persistence.py @@ -76,6 +76,7 @@ def _bulk_insert( mapper: Mapper[_O], mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]], session_transaction: SessionTransaction, + *, isstates: bool, return_defaults: bool, render_nulls: bool, @@ -89,6 +90,7 @@ def _bulk_insert( mapper: Mapper[_O], mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]], session_transaction: SessionTransaction, + *, isstates: bool, return_defaults: bool, render_nulls: bool, @@ -101,6 +103,7 @@ def _bulk_insert( mapper: Mapper[_O], mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]], session_transaction: SessionTransaction, + *, isstates: bool, return_defaults: bool, render_nulls: bool, @@ -116,13 +119,35 @@ def _bulk_insert( ) if isstates: + if TYPE_CHECKING: + mappings = cast(Iterable[InstanceState[_O]], mappings) + if return_defaults: + # list of states allows us to attach .key for return_defaults case states = [(state, state.dict) for state in mappings] mappings = [dict_ for (state, dict_) in states] else: mappings = [state.dict for state in mappings] else: - mappings = [dict(m) for m in mappings] + if TYPE_CHECKING: + mappings = cast(Iterable[Dict[str, Any]], mappings) + + if return_defaults: + # use dictionaries given, so that newly populated defaults + # can be delivered back to the caller (see #11661). This is **not** + # compatible with other use cases such as a session-executed + # insert() construct, as this will confuse the case of + # insert-per-subclass for joined inheritance cases (see + # test_bulk_statements.py::BulkDMLReturningJoinedInhTest). + # + # So in this conditional, we have **only** called + # session.bulk_insert_mappings() which does not have this + # requirement + mappings = list(mappings) + else: + # for all other cases we need to establish a local dictionary + # so that the incoming dictionaries aren't mutated + mappings = [dict(m) for m in mappings] _expand_composites(mapper, mappings) connection = session_transaction.connection(base_mapper) @@ -218,6 +243,7 @@ def _bulk_insert( state.key = ( identity_cls, tuple([dict_[key] for key in identity_props]), + None, ) if use_orm_insert_stmt is not None: @@ -230,6 +256,7 @@ def _bulk_update( mapper: Mapper[Any], mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]], session_transaction: SessionTransaction, + *, isstates: bool, update_changed_only: bool, use_orm_update_stmt: Literal[None] = ..., @@ -242,6 +269,7 @@ def _bulk_update( mapper: Mapper[Any], mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]], session_transaction: SessionTransaction, + *, isstates: bool, update_changed_only: bool, use_orm_update_stmt: Optional[dml.Update] = ..., @@ -253,6 +281,7 @@ def _bulk_update( mapper: Mapper[Any], mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]], session_transaction: SessionTransaction, + *, isstates: bool, update_changed_only: bool, use_orm_update_stmt: Optional[dml.Update] = None, @@ -590,6 +619,7 @@ def _return_orm_returning( querycontext = QueryContext( compile_state.from_statement_ctx, compile_state.select_statement, + statement, params, session, load_options, @@ -614,6 +644,7 @@ class default_update_options(Options): _eval_condition = None _matched_rows = None _identity_token = None + _populate_existing: bool = False @classmethod def can_use_returning( @@ -646,6 +677,7 @@ def orm_pre_session_exec( { "synchronize_session", "autoflush", + "populate_existing", "identity_token", "is_delete_using", "is_update_from", @@ -830,53 +862,39 @@ def _adjust_for_extra_criteria(cls, global_attributes, ext_info): return return_crit @classmethod - def _interpret_returning_rows(cls, mapper, rows): - """translate from local inherited table columns to base mapper - primary key columns. - - Joined inheritance mappers always establish the primary key in terms of - the base table. When we UPDATE a sub-table, we can only get - RETURNING for the sub-table's columns. + def _interpret_returning_rows(cls, result, mapper, rows): + """return rows that indicate PK cols in mapper.primary_key position + for RETURNING rows. - Here, we create a lookup from the local sub table's primary key - columns to the base table PK columns so that we can get identity - key values from RETURNING that's against the joined inheritance - sub-table. + Prior to 2.0.36, this method seemed to be written for some kind of + inheritance scenario but the scenario was unused for actual joined + inheritance, and the function instead seemed to perform some kind of + partial translation that would remove non-PK cols if the PK cols + happened to be first in the row, but not otherwise. The joined + inheritance walk feature here seems to have never been used as it was + always skipped by the "local_table" check. - the complexity here is to support more than one level deep of - inheritance, where we have to link columns to each other across - the inheritance hierarchy. + As of 2.0.36 the function strips away non-PK cols and provides the + PK cols for the table in mapper PK order. """ - if mapper.local_table is not mapper.base_mapper.local_table: - return rows - - # this starts as a mapping of - # local_pk_col: local_pk_col. - # we will then iteratively rewrite the "value" of the dict with - # each successive superclass column - local_pk_to_base_pk = {pk: pk for pk in mapper.local_table.primary_key} - - for mp in mapper.iterate_to_root(): - if mp.inherits is None: - break - elif mp.local_table is mp.inherits.local_table: - continue + try: + if mapper.local_table is not mapper.base_mapper.local_table: + # TODO: dive more into how a local table PK is used for fetch + # sync, not clear if this is correct as it depends on the + # downstream routine to fetch rows using + # local_table.primary_key order + pk_keys = result._tuple_getter(mapper.local_table.primary_key) + else: + pk_keys = result._tuple_getter(mapper.primary_key) + except KeyError: + # can't use these rows, they don't have PK cols in them + # this is an unusual case where the user would have used + # .return_defaults() + return [] - t_to_e = dict(mp._table_to_equated[mp.inherits.local_table]) - col_to_col = {sub_pk: super_pk for super_pk, sub_pk in t_to_e[mp]} - for pk, super_ in local_pk_to_base_pk.items(): - local_pk_to_base_pk[pk] = col_to_col[super_] - - lookup = { - local_pk_to_base_pk[lpk]: idx - for idx, lpk in enumerate(mapper.local_table.primary_key) - } - primary_key_convert = [ - lookup[bpk] for bpk in mapper.base_mapper.primary_key - ] - return [tuple(row[idx] for idx in primary_key_convert) for row in rows] + return [pk_keys(row) for row in rows] @classmethod def _get_matched_objects_on_criteria(cls, update_options, states): @@ -1439,6 +1457,9 @@ def _setup_for_orm_update(self, statement, compiler, **kw): new_stmt = statement._clone() + if new_stmt.table._annotations["parententity"] is mapper: + new_stmt.table = mapper.local_table + # note if the statement has _multi_values, these # are passed through to the new statement, which will then raise # InvalidRequestError because UPDATE doesn't support multi_values @@ -1557,10 +1578,20 @@ def orm_execute_statement( bind_arguments: _BindArguments, conn: Connection, ) -> _result.Result: + update_options = execution_options.get( "_sa_orm_update_options", cls.default_update_options ) + if update_options._populate_existing: + load_options = execution_options.get( + "_sa_orm_load_options", QueryContext.default_load_options + ) + load_options += {"_populate_existing": True} + execution_options = execution_options.union( + {"_sa_orm_load_options": load_options} + ) + if update_options._dml_strategy not in ( "orm", "auto", @@ -1716,7 +1747,10 @@ def _do_post_synchronize_evaluate( session, update_options, statement, + result.context.compiled_parameters[0], [(obj, state, dict_) for obj, state, dict_, _ in matched_objects], + result.prefetch_cols(), + result.postfetch_cols(), ) @classmethod @@ -1728,9 +1762,8 @@ def _do_post_synchronize_fetch( returned_defaults_rows = result.returned_defaults_rows if returned_defaults_rows: pk_rows = cls._interpret_returning_rows( - target_mapper, returned_defaults_rows + result, target_mapper, returned_defaults_rows ) - matched_rows = [ tuple(row) + (update_options._identity_token,) for row in pk_rows @@ -1761,6 +1794,7 @@ def _do_post_synchronize_fetch( session, update_options, statement, + result.context.compiled_parameters[0], [ ( obj, @@ -1769,16 +1803,26 @@ def _do_post_synchronize_fetch( ) for obj in objs ], + result.prefetch_cols(), + result.postfetch_cols(), ) @classmethod def _apply_update_set_values_to_objects( - cls, session, update_options, statement, matched_objects + cls, + session, + update_options, + statement, + effective_params, + matched_objects, + prefetch_cols, + postfetch_cols, ): """apply values to objects derived from an update statement, e.g. UPDATE..SET <values> """ + mapper = update_options._subject_mapper target_cls = mapper.class_ evaluator_compiler = evaluator._EvaluatorCompiler(target_cls) @@ -1801,7 +1845,35 @@ def _apply_update_set_values_to_objects( attrib = {k for k, v in resolved_keys_as_propnames} states = set() + + to_prefetch = { + c + for c in prefetch_cols + if c.key in effective_params + and c in mapper._columntoproperty + and c.key not in evaluated_keys + } + to_expire = { + mapper._columntoproperty[c].key + for c in postfetch_cols + if c in mapper._columntoproperty + }.difference(evaluated_keys) + + prefetch_transfer = [ + (mapper._columntoproperty[c].key, c.key) for c in to_prefetch + ] + for obj, state, dict_ in matched_objects: + + dict_.update( + { + col_to_prop: effective_params[c_key] + for col_to_prop, c_key in prefetch_transfer + } + ) + + state._expire_attributes(state.dict, to_expire) + to_evaluate = state.unmodified.intersection(evaluated_keys) for key in to_evaluate: @@ -1858,6 +1930,9 @@ def create_for_statement(cls, statement, compiler, **kw): new_stmt = statement._clone() + if new_stmt.table._annotations["parententity"] is mapper: + new_stmt.table = mapper.local_table + new_crit = cls._adjust_for_extra_criteria( self.global_attributes, mapper ) @@ -2018,7 +2093,7 @@ def _do_post_synchronize_fetch( if returned_defaults_rows: pk_rows = cls._interpret_returning_rows( - target_mapper, returned_defaults_rows + result, target_mapper, returned_defaults_rows ) matched_rows = [ diff --git a/libs/sqlalchemy/orm/clsregistry.py b/libs/sqlalchemy/orm/clsregistry.py index 26113d8b2..382d6aef9 100644 --- a/libs/sqlalchemy/orm/clsregistry.py +++ b/libs/sqlalchemy/orm/clsregistry.py @@ -287,8 +287,9 @@ def __getitem__(self, name: str) -> ClsRegistryToken: def _remove_item(self, name: str) -> None: self.contents.pop(name, None) - if not self.contents and self.parent is not None: - self.parent._remove_item(self.name) + if not self.contents: + if self.parent is not None: + self.parent._remove_item(self.name) _registries.discard(self) def resolve_attr(self, key: str) -> Union[_ModNS, Type[Any]]: diff --git a/libs/sqlalchemy/orm/collections.py b/libs/sqlalchemy/orm/collections.py index 6fefd787a..d713abb0e 100644 --- a/libs/sqlalchemy/orm/collections.py +++ b/libs/sqlalchemy/orm/collections.py @@ -148,10 +148,12 @@ def shift(self): "keyfunc_mapping", "column_keyed_dict", "attribute_keyed_dict", - "column_keyed_dict", - "attribute_keyed_dict", - "MappedCollection", "KeyFuncDict", + # old names in < 2.0 + "mapped_collection", + "column_mapped_collection", + "attribute_mapped_collection", + "MappedCollection", ] __instrumentation_mutex = threading.Lock() diff --git a/libs/sqlalchemy/orm/context.py b/libs/sqlalchemy/orm/context.py index 3056016e7..6bacd77eb 100644 --- a/libs/sqlalchemy/orm/context.py +++ b/libs/sqlalchemy/orm/context.py @@ -104,6 +104,7 @@ class QueryContext: "top_level_context", "compile_state", "query", + "user_passed_query", "params", "load_options", "bind_arguments", @@ -148,6 +149,10 @@ def __init__( self, compile_state: CompileState, statement: Union[Select[Any], FromStatement[Any]], + user_passed_query: Union[ + Select[Any], + FromStatement[Any], + ], params: _CoreSingleExecuteParams, session: Session, load_options: Union[ @@ -162,6 +167,13 @@ def __init__( self.bind_arguments = bind_arguments or _EMPTY_DICT self.compile_state = compile_state self.query = statement + + # the query that the end user passed to Session.execute() or similar. + # this is usually the same as .query, except in the bulk_persistence + # routines where a separate FromStatement is manufactured in the + # compile stage; this allows differentiation in that case. + self.user_passed_query = user_passed_query + self.session = session self.loaders_require_buffering = False self.loaders_require_uniquing = False @@ -169,7 +181,7 @@ def __init__( self.top_level_context = load_options._sa_top_level_orm_context cached_options = compile_state.select_statement._with_options - uncached_options = statement._with_options + uncached_options = user_passed_query._with_options # see issue #7447 , #8399 for some background # propagated loader options will be present on loaded InstanceState @@ -578,6 +590,7 @@ def orm_setup_cursor_result( querycontext = QueryContext( compile_state, statement, + statement, params, session, load_options, @@ -888,6 +901,8 @@ class FromStatement(GroupedElement, Generative, TypedReturnsRows[_TP]): ("_compile_options", InternalTraversal.dp_has_cache_key) ] + is_from_statement = True + def __init__( self, entities: Iterable[_ColumnsClauseArgument[Any]], @@ -905,6 +920,10 @@ def __init__( ] self.element = element self.is_dml = element.is_dml + self.is_select = element.is_select + self.is_delete = element.is_delete + self.is_insert = element.is_insert + self.is_update = element.is_update self._label_style = ( element._label_style if is_select_base(element) else None ) @@ -3044,7 +3063,10 @@ def __init__( if not is_current_entities or column._is_text_clause: self._label_name = None else: - self._label_name = compile_state._label_convention(column) + if parent_bundle: + self._label_name = column._proxy_key + else: + self._label_name = compile_state._label_convention(column) if parent_bundle: parent_bundle._entities.append(self) @@ -3138,9 +3160,12 @@ def __init__( self.raw_column_index = raw_column_index if is_current_entities: - self._label_name = compile_state._label_convention( - column, col_name=orm_key - ) + if parent_bundle: + self._label_name = orm_key if orm_key else column._proxy_key + else: + self._label_name = compile_state._label_convention( + column, col_name=orm_key + ) else: self._label_name = None diff --git a/libs/sqlalchemy/orm/decl_api.py b/libs/sqlalchemy/orm/decl_api.py index 09128ea8f..91f9539be 100644 --- a/libs/sqlalchemy/orm/decl_api.py +++ b/libs/sqlalchemy/orm/decl_api.py @@ -1232,31 +1232,39 @@ def update_type_annotation_map( def _resolve_type( self, python_type: _MatchedOnType ) -> Optional[sqltypes.TypeEngine[Any]]: - search: Iterable[Tuple[_MatchedOnType, Type[Any]]] + + python_type_to_check = python_type + while is_pep695(python_type_to_check): + python_type_to_check = python_type_to_check.__value__ + + check_is_pt = python_type is python_type_to_check + python_type_type: Type[Any] + search: Iterable[Tuple[_MatchedOnType, Type[Any]]] - if is_generic(python_type): - if is_literal(python_type): - python_type_type = cast("Type[Any]", python_type) + if is_generic(python_type_to_check): + if is_literal(python_type_to_check): + python_type_type = cast("Type[Any]", python_type_to_check) search = ( # type: ignore[assignment] (python_type, python_type_type), (Literal, python_type_type), ) else: - python_type_type = python_type.__origin__ + python_type_type = python_type_to_check.__origin__ search = ((python_type, python_type_type),) - elif is_newtype(python_type): - python_type_type = flatten_newtype(python_type) - search = ((python_type, python_type_type),) - elif is_pep695(python_type): - python_type_type = python_type.__value__ - flattened = None + elif is_newtype(python_type_to_check): + python_type_type = flatten_newtype(python_type_to_check) search = ((python_type, python_type_type),) + elif isinstance(python_type_to_check, type): + python_type_type = python_type_to_check + search = ( + (pt if check_is_pt else python_type, pt) + for pt in python_type_type.__mro__ + ) else: - python_type_type = cast("Type[Any]", python_type) - flattened = None - search = ((pt, pt) for pt in python_type_type.__mro__) + python_type_type = python_type_to_check # type: ignore[assignment] + search = ((python_type, python_type_type),) for pt, flattened in search: # we search through full __mro__ for types. however... diff --git a/libs/sqlalchemy/orm/decl_base.py b/libs/sqlalchemy/orm/decl_base.py index 96530c3ac..b069d23c0 100644 --- a/libs/sqlalchemy/orm/decl_base.py +++ b/libs/sqlalchemy/orm/decl_base.py @@ -431,7 +431,7 @@ def _setup_inheritance(self, mapper_kw: _MapperKwArgs) -> None: class _CollectedAnnotation(NamedTuple): raw_annotation: _AnnotationScanType mapped_container: Optional[Type[Mapped[Any]]] - extracted_mapped_annotation: Union[Type[Any], str] + extracted_mapped_annotation: Union[_AnnotationScanType, str] is_dataclass: bool attr_value: Any originating_module: str @@ -453,6 +453,7 @@ class _ClassScanMapperConfig(_MapperConfig): "tablename", "mapper_args", "mapper_args_fn", + "table_fn", "inherits", "single", "allow_dataclass_fields", @@ -759,7 +760,7 @@ def _scan_attributes(self) -> None: _include_dunders = self._include_dunders mapper_args_fn = None table_args = inherited_table_args = None - + table_fn = None tablename = None fixed_table = "__table__" in clsdict_view @@ -840,6 +841,22 @@ def _mapper_args_fn() -> Dict[str, Any]: ) if not tablename and (not class_mapped or check_decl): tablename = cls_as_Decl.__tablename__ + elif name == "__table__": + check_decl = _check_declared_props_nocascade( + obj, name, cls + ) + # if a @declared_attr using "__table__" is detected, + # wrap up a callable to look for "__table__" from + # the final concrete class when we set up a table. + # this was fixed by + # #11509, regression in 2.0 from version 1.4. + if check_decl and not table_fn: + # don't even invoke __table__ until we're ready + def _table_fn() -> FromClause: + return cls_as_Decl.__table__ + + table_fn = _table_fn + elif name == "__table_args__": check_decl = _check_declared_props_nocascade( obj, name, cls @@ -856,9 +873,10 @@ def _mapper_args_fn() -> Dict[str, Any]: if base is not cls: inherited_table_args = True else: - # skip all other dunder names, which at the moment - # should only be __table__ - continue + # any other dunder names; should not be here + # as we have tested for all four names in + # _include_dunders + assert False elif class_mapped: if _is_declarative_props(obj) and not obj._quiet: util.warn( @@ -1031,6 +1049,7 @@ def _mapper_args_fn() -> Dict[str, Any]: self.table_args = table_args self.tablename = tablename self.mapper_args_fn = mapper_args_fn + self.table_fn = table_fn def _setup_dataclasses_transforms(self) -> None: dataclass_setup_arguments = self.dataclass_setup_arguments @@ -1048,6 +1067,16 @@ def _setup_dataclasses_transforms(self) -> None: "'@registry.mapped_as_dataclass'" ) + # can't create a dataclass if __table__ is already there. This would + # fail an assertion when calling _get_arguments_for_make_dataclass: + # assert False, "Mapped[] received without a mapping declaration" + if "__table__" in self.cls.__dict__: + raise exc.InvalidRequestError( + f"Class {self.cls} already defines a '__table__'. " + "ORM Annotated Dataclasses do not support a pre-existing " + "'__table__' element" + ) + warn_for_non_dc_attrs = collections.defaultdict(list) def _allow_dataclass_field( @@ -1687,7 +1716,11 @@ def _setup_table(self, table: Optional[FromClause] = None) -> None: manager = attributes.manager_of_class(cls) - if "__table__" not in clsdict_view and table is None: + if ( + self.table_fn is None + and "__table__" not in clsdict_view + and table is None + ): if hasattr(cls, "__table_cls__"): table_cls = cast( Type[Table], @@ -1733,7 +1766,12 @@ def _setup_table(self, table: Optional[FromClause] = None) -> None: ) else: if table is None: - table = cls_as_Decl.__table__ + if self.table_fn: + table = self.set_cls_attribute( + "__table__", self.table_fn() + ) + else: + table = cls_as_Decl.__table__ if declared_columns: for c in declared_columns: if not table.c.contains_column(c): diff --git a/libs/sqlalchemy/orm/descriptor_props.py b/libs/sqlalchemy/orm/descriptor_props.py index a3650f5f0..faf287cce 100644 --- a/libs/sqlalchemy/orm/descriptor_props.py +++ b/libs/sqlalchemy/orm/descriptor_props.py @@ -781,7 +781,9 @@ def _bulk_update_tuples( elif isinstance(self.prop.composite_class, type) and isinstance( value, self.prop.composite_class ): - values = self.prop._composite_values_from_instance(value) + values = self.prop._composite_values_from_instance( + value # type: ignore[arg-type] + ) else: raise sa_exc.ArgumentError( "Can't UPDATE composite attribute %s to %r" diff --git a/libs/sqlalchemy/orm/dynamic.py b/libs/sqlalchemy/orm/dynamic.py index 7496e5c30..ad1b239c1 100644 --- a/libs/sqlalchemy/orm/dynamic.py +++ b/libs/sqlalchemy/orm/dynamic.py @@ -161,10 +161,12 @@ def _iter(self) -> Union[result.ScalarResult[_T], result.Result[_T]]: return result.IteratorResult( result.SimpleResultMetaData([self.attr.class_.__name__]), - self.attr._get_collection_history( # type: ignore[arg-type] - attributes.instance_state(self.instance), - PassiveFlag.PASSIVE_NO_INITIALIZE, - ).added_items, + iter( + self.attr._get_collection_history( + attributes.instance_state(self.instance), + PassiveFlag.PASSIVE_NO_INITIALIZE, + ).added_items + ), _source_supports_scalars=True, ).scalars() else: diff --git a/libs/sqlalchemy/orm/evaluator.py b/libs/sqlalchemy/orm/evaluator.py index f2644548c..2c10ec55a 100644 --- a/libs/sqlalchemy/orm/evaluator.py +++ b/libs/sqlalchemy/orm/evaluator.py @@ -28,6 +28,7 @@ from .. import inspect from ..sql import and_ from ..sql import operators +from ..sql.sqltypes import Concatenable from ..sql.sqltypes import Integer from ..sql.sqltypes import Numeric from ..util import warn_deprecated @@ -311,6 +312,16 @@ def visit_not_in_op_binary_op( def visit_concat_op_binary_op( self, operator, eval_left, eval_right, clause ): + + if not issubclass( + clause.left.type._type_affinity, Concatenable + ) or not issubclass(clause.right.type._type_affinity, Concatenable): + raise UnevaluatableError( + f"Cannot evaluate concatenate operator " + f'"{operator.__name__}" for ' + f"datatypes {clause.left.type}, {clause.right.type}" + ) + return self._straight_evaluate( lambda a, b: a + b, eval_left, eval_right, clause ) diff --git a/libs/sqlalchemy/orm/events.py b/libs/sqlalchemy/orm/events.py index 2233d7ee1..f2eae852b 100644 --- a/libs/sqlalchemy/orm/events.py +++ b/libs/sqlalchemy/orm/events.py @@ -1939,7 +1939,7 @@ def after_soft_rollback( @event.listens_for(Session, "after_soft_rollback") def do_something(session, previous_transaction): if session.is_active: - session.execute("select * from some_table") + session.execute(text("select * from some_table")) :param session: The target :class:`.Session`. :param previous_transaction: The :class:`.SessionTransaction` @@ -3155,7 +3155,9 @@ def no_deleted(query, update_context): entity = desc['entity'] query = query.filter(entity.deleted == False) - update_context.values['timestamp'] = datetime.utcnow() + update_context.values['timestamp'] = ( + datetime.datetime.now(datetime.UTC) + ) return query The ``.values`` dictionary of the "update context" object can also diff --git a/libs/sqlalchemy/orm/exc.py b/libs/sqlalchemy/orm/exc.py index 8ab831002..39dd54011 100644 --- a/libs/sqlalchemy/orm/exc.py +++ b/libs/sqlalchemy/orm/exc.py @@ -16,6 +16,7 @@ from typing import TYPE_CHECKING from typing import TypeVar +from .util import _mapper_property_as_plain_name from .. import exc as sa_exc from .. import util from ..exc import MultipleResultsFound # noqa @@ -191,8 +192,8 @@ def __init__( % ( util.clsname_as_plain_name(actual_strategy_type), requesting_property, - util.clsname_as_plain_name(applied_to_property_type), - util.clsname_as_plain_name(applies_to), + _mapper_property_as_plain_name(applied_to_property_type), + _mapper_property_as_plain_name(applies_to), ), ) diff --git a/libs/sqlalchemy/orm/interfaces.py b/libs/sqlalchemy/orm/interfaces.py index 2f090588f..094053fa0 100644 --- a/libs/sqlalchemy/orm/interfaces.py +++ b/libs/sqlalchemy/orm/interfaces.py @@ -149,13 +149,17 @@ class ORMColumnDescription(TypedDict): class _IntrospectsAnnotations: __slots__ = () + @classmethod + def _mapper_property_name(cls) -> str: + return cls.__name__ + def found_in_pep593_annotated(self) -> Any: """return a copy of this object to use in declarative when the object is found inside of an Annotated object.""" raise NotImplementedError( - f"Use of the {self.__class__} construct inside of an " - f"Annotated object is not yet supported." + f"Use of the {self._mapper_property_name()!r} " + "construct inside of an Annotated object is not yet supported." ) def declarative_scan( @@ -181,7 +185,8 @@ def _raise_for_required(self, key: str, cls: Type[Any]) -> NoReturn: raise sa_exc.ArgumentError( f"Python typing annotation is required for attribute " f'"{cls.__name__}.{key}" when primary argument(s) for ' - f'"{self.__class__.__name__}" construct are None or not present' + f'"{self._mapper_property_name()}" ' + "construct are None or not present" ) @@ -201,6 +206,7 @@ class _AttributeOptions(NamedTuple): dataclasses_default_factory: Union[_NoArg, Callable[[], Any]] dataclasses_compare: Union[_NoArg, bool] dataclasses_kw_only: Union[_NoArg, bool] + dataclasses_hash: Union[_NoArg, bool, None] def _as_dataclass_field(self, key: str) -> Any: """Return a ``dataclasses.Field`` object given these arguments.""" @@ -218,6 +224,8 @@ def _as_dataclass_field(self, key: str) -> Any: kw["compare"] = self.dataclasses_compare if self.dataclasses_kw_only is not _NoArg.NO_ARG: kw["kw_only"] = self.dataclasses_kw_only + if self.dataclasses_hash is not _NoArg.NO_ARG: + kw["hash"] = self.dataclasses_hash if "default" in kw and callable(kw["default"]): # callable defaults are ambiguous. deprecate them in favour of @@ -297,6 +305,7 @@ def _get_arguments_for_make_dataclass( _NoArg.NO_ARG, _NoArg.NO_ARG, _NoArg.NO_ARG, + _NoArg.NO_ARG, ) _DEFAULT_READONLY_ATTRIBUTE_OPTIONS = _AttributeOptions( @@ -306,6 +315,7 @@ def _get_arguments_for_make_dataclass( _NoArg.NO_ARG, _NoArg.NO_ARG, _NoArg.NO_ARG, + _NoArg.NO_ARG, ) diff --git a/libs/sqlalchemy/orm/loading.py b/libs/sqlalchemy/orm/loading.py index 4e2cb8250..6176d72a6 100644 --- a/libs/sqlalchemy/orm/loading.py +++ b/libs/sqlalchemy/orm/loading.py @@ -1010,21 +1010,38 @@ def _instance_processor( # loading does not apply assert only_load_props is None - callable_ = _load_subclass_via_in( - context, - path, - selectin_load_via, - _polymorphic_from, - option_entities, - ) - PostLoad.callable_for_path( - context, - load_path, - selectin_load_via.mapper, - selectin_load_via, - callable_, - selectin_load_via, - ) + if selectin_load_via.is_mapper: + _load_supers = [] + _endmost_mapper = selectin_load_via + while ( + _endmost_mapper + and _endmost_mapper is not _polymorphic_from + ): + _load_supers.append(_endmost_mapper) + _endmost_mapper = _endmost_mapper.inherits + else: + _load_supers = [selectin_load_via] + + for _selectinload_entity in _load_supers: + if PostLoad.path_exists( + context, load_path, _selectinload_entity + ): + continue + callable_ = _load_subclass_via_in( + context, + path, + _selectinload_entity, + _polymorphic_from, + option_entities, + ) + PostLoad.callable_for_path( + context, + load_path, + _selectinload_entity.mapper, + _selectinload_entity, + callable_, + _selectinload_entity, + ) post_load = PostLoad.for_context(context, load_path, only_load_props) diff --git a/libs/sqlalchemy/orm/mapped_collection.py b/libs/sqlalchemy/orm/mapped_collection.py index 13c6b689e..0d3079fb5 100644 --- a/libs/sqlalchemy/orm/mapped_collection.py +++ b/libs/sqlalchemy/orm/mapped_collection.py @@ -29,6 +29,8 @@ from ..sql import coercions from ..sql import expression from ..sql import roles +from ..util.langhelpers import Missing +from ..util.langhelpers import MissingOr from ..util.typing import Literal if TYPE_CHECKING: @@ -40,8 +42,6 @@ _KT = TypeVar("_KT", bound=Any) _VT = TypeVar("_VT", bound=Any) -_F = TypeVar("_F", bound=Callable[[Any], Any]) - class _PlainColumnGetter(Generic[_KT]): """Plain column getter, stores collection of Column objects @@ -70,7 +70,7 @@ def __reduce__( def _cols(self, mapper: Mapper[_KT]) -> Sequence[ColumnElement[_KT]]: return self.cols - def __call__(self, value: _KT) -> Union[_KT, Tuple[_KT, ...]]: + def __call__(self, value: _KT) -> MissingOr[Union[_KT, Tuple[_KT, ...]]]: state = base.instance_state(value) m = base._state_mapper(state) @@ -83,7 +83,7 @@ def __call__(self, value: _KT) -> Union[_KT, Tuple[_KT, ...]]: else: obj = key[0] if obj is None: - return _UNMAPPED_AMBIGUOUS_NONE + return Missing else: return obj @@ -198,9 +198,6 @@ def column_keyed_dict( ) -_UNMAPPED_AMBIGUOUS_NONE = object() - - class _AttrGetter: __slots__ = ("attr_name", "getter") @@ -217,9 +214,9 @@ def __call__(self, mapped_object: Any) -> Any: dict_ = state.dict obj = dict_.get(self.attr_name, base.NO_VALUE) if obj is None: - return _UNMAPPED_AMBIGUOUS_NONE + return Missing else: - return _UNMAPPED_AMBIGUOUS_NONE + return Missing return obj @@ -277,7 +274,7 @@ def attribute_keyed_dict( def keyfunc_mapping( - keyfunc: _F, + keyfunc: Callable[[Any], Any], *, ignore_unpopulated_attribute: bool = False, ) -> Type[KeyFuncDict[_KT, Any]]: @@ -353,7 +350,7 @@ class KeyFuncDict(Dict[_KT, _VT]): def __init__( self, - keyfunc: _F, + keyfunc: Callable[[Any], Any], *dict_args: Any, ignore_unpopulated_attribute: bool = False, ) -> None: @@ -377,7 +374,7 @@ def __init__( @classmethod def _unreduce( cls, - keyfunc: _F, + keyfunc: Callable[[Any], Any], values: Dict[_KT, _KT], adapter: Optional[CollectionAdapter] = None, ) -> "KeyFuncDict[_KT, _KT]": @@ -464,7 +461,7 @@ def set( ) else: return - elif key is _UNMAPPED_AMBIGUOUS_NONE: + elif key is Missing: if not self.ignore_unpopulated_attribute: self._raise_for_unpopulated( value, _sa_initiator, warn_only=True @@ -492,7 +489,7 @@ def remove( value, _sa_initiator, warn_only=False ) return - elif key is _UNMAPPED_AMBIGUOUS_NONE: + elif key is Missing: if not self.ignore_unpopulated_attribute: self._raise_for_unpopulated( value, _sa_initiator, warn_only=True @@ -514,7 +511,7 @@ def remove( def _mapped_collection_cls( - keyfunc: _F, ignore_unpopulated_attribute: bool + keyfunc: Callable[[Any], Any], ignore_unpopulated_attribute: bool ) -> Type[KeyFuncDict[_KT, _KT]]: class _MKeyfuncMapped(KeyFuncDict[_KT, _KT]): def __init__(self, *dict_args: Any) -> None: diff --git a/libs/sqlalchemy/orm/mapper.py b/libs/sqlalchemy/orm/mapper.py index 0caed0e2f..29659e6e8 100644 --- a/libs/sqlalchemy/orm/mapper.py +++ b/libs/sqlalchemy/orm/mapper.py @@ -296,6 +296,17 @@ class will overwrite all data within object instances that already particular primary key value. A "partial primary key" can occur if one has mapped to an OUTER JOIN, for example. + The :paramref:`.orm.Mapper.allow_partial_pks` parameter also + indicates to the ORM relationship lazy loader, when loading a + many-to-one related object, if a composite primary key that has + partial NULL values should result in an attempt to load from the + database, or if a load attempt is not necessary. + + .. versionadded:: 2.0.36 :paramref:`.orm.Mapper.allow_partial_pks` + is consulted by the relationship lazy loader strategy, such that + when set to False, a SELECT for a composite primary key that + has partial NULL values will not be emitted. + :param batch: Defaults to ``True``, indicating that save operations of multiple entities can be batched together for efficiency. Setting to False indicates @@ -442,7 +453,7 @@ class User(Base): mapping of the class to an alternate selectable, for loading only. - .. seealso:: + .. seealso:: :ref:`relationship_aliased_class` - the new pattern that removes the need for the :paramref:`_orm.Mapper.non_primary` flag. @@ -3805,6 +3816,7 @@ def _subclass_load_via_in(self, entity, polymorphic_from): this subclass as a SELECT with IN. """ + strategy_options = util.preloaded.orm_strategy_options assert self.inherits @@ -3828,7 +3840,7 @@ def _subclass_load_via_in(self, entity, polymorphic_from): classes_to_include.add(m) m = m.inherits - for prop in self.attrs: + for prop in self.column_attrs + self.relationships: # skip prop keys that are not instrumented on the mapped class. # this is primarily the "_sa_polymorphic_on" property that gets # created for an ad-hoc polymorphic_on SQL expression, issue #8704 diff --git a/libs/sqlalchemy/orm/path_registry.py b/libs/sqlalchemy/orm/path_registry.py index 76484b3e6..4ee8ac71b 100644 --- a/libs/sqlalchemy/orm/path_registry.py +++ b/libs/sqlalchemy/orm/path_registry.py @@ -35,7 +35,7 @@ if TYPE_CHECKING: from ._typing import _InternalEntityType - from .interfaces import MapperProperty + from .interfaces import StrategizedProperty from .mapper import Mapper from .relationships import RelationshipProperty from .util import AliasedInsp @@ -57,13 +57,13 @@ def is_entity(path: PathRegistry) -> TypeGuard[AbstractEntityRegistry]: ... _SerializedPath = List[Any] _StrPathToken = str _PathElementType = Union[ - _StrPathToken, "_InternalEntityType[Any]", "MapperProperty[Any]" + _StrPathToken, "_InternalEntityType[Any]", "StrategizedProperty[Any]" ] # the representation is in fact # a tuple with alternating: -# [_InternalEntityType[Any], Union[str, MapperProperty[Any]], -# _InternalEntityType[Any], Union[str, MapperProperty[Any]], ...] +# [_InternalEntityType[Any], Union[str, StrategizedProperty[Any]], +# _InternalEntityType[Any], Union[str, StrategizedProperty[Any]], ...] # this might someday be a tuple of 2-tuples instead, but paths can be # chopped at odd intervals as well so this is less flexible _PathRepresentation = Tuple[_PathElementType, ...] @@ -71,7 +71,7 @@ def is_entity(path: PathRegistry) -> TypeGuard[AbstractEntityRegistry]: ... # NOTE: these names are weird since the array is 0-indexed, # the "_Odd" entries are at 0, 2, 4, etc _OddPathRepresentation = Sequence["_InternalEntityType[Any]"] -_EvenPathRepresentation = Sequence[Union["MapperProperty[Any]", str]] +_EvenPathRepresentation = Sequence[Union["StrategizedProperty[Any]", str]] log = logging.getLogger(__name__) @@ -197,7 +197,9 @@ def __getitem__( ) -> AbstractEntityRegistry: ... @overload - def __getitem__(self, entity: MapperProperty[Any]) -> PropRegistry: ... + def __getitem__( + self, entity: StrategizedProperty[Any] + ) -> PropRegistry: ... def __getitem__( self, @@ -206,7 +208,7 @@ def __getitem__( int, slice, _InternalEntityType[Any], - MapperProperty[Any], + StrategizedProperty[Any], ], ) -> Union[ TokenRegistry, @@ -225,7 +227,7 @@ def length(self) -> int: def pairs( self, ) -> Iterator[ - Tuple[_InternalEntityType[Any], Union[str, MapperProperty[Any]]] + Tuple[_InternalEntityType[Any], Union[str, StrategizedProperty[Any]]] ]: odd_path = cast(_OddPathRepresentation, self.path) even_path = cast(_EvenPathRepresentation, odd_path) @@ -531,15 +533,16 @@ class PropRegistry(PathRegistry): inherit_cache = True is_property = True - prop: MapperProperty[Any] + prop: StrategizedProperty[Any] mapper: Optional[Mapper[Any]] entity: Optional[_InternalEntityType[Any]] def __init__( - self, parent: AbstractEntityRegistry, prop: MapperProperty[Any] + self, parent: AbstractEntityRegistry, prop: StrategizedProperty[Any] ): + # restate this path in terms of the - # given MapperProperty's parent. + # given StrategizedProperty's parent. insp = cast("_InternalEntityType[Any]", parent[-1]) natural_parent: AbstractEntityRegistry = parent diff --git a/libs/sqlalchemy/orm/properties.py b/libs/sqlalchemy/orm/properties.py index 7a5eb8625..5c49222be 100644 --- a/libs/sqlalchemy/orm/properties.py +++ b/libs/sqlalchemy/orm/properties.py @@ -58,6 +58,7 @@ from ..util.typing import is_fwd_ref from ..util.typing import is_optional_union from ..util.typing import is_pep593 +from ..util.typing import is_pep695 from ..util.typing import is_union from ..util.typing import Self from ..util.typing import typing_get_args @@ -688,7 +689,7 @@ def declarative_scan( supercls_mapper = class_mapper(decl_scan.inherits, False) colname = column.name if column.name is not None else key - column = self.column = supercls_mapper.local_table.c.get( # type: ignore # noqa: E501 + column = self.column = supercls_mapper.local_table.c.get( # type: ignore[assignment] # noqa: E501 colname, column ) @@ -760,6 +761,11 @@ def _init_column_for_annotation( use_args_from = None + our_original_type = our_type + + if is_pep695(our_type): + our_type = our_type.__value__ + if is_pep593(our_type): our_type_is_pep593 = True @@ -852,9 +858,9 @@ def _init_column_for_annotation( new_sqltype = None if our_type_is_pep593: - checks = [our_type, raw_pep_593_type] + checks = [our_original_type, raw_pep_593_type] else: - checks = [our_type] + checks = [our_original_type] for check_type in checks: new_sqltype = registry._resolve_type(check_type) diff --git a/libs/sqlalchemy/orm/query.py b/libs/sqlalchemy/orm/query.py index 77bce7884..5c1a45b5f 100644 --- a/libs/sqlalchemy/orm/query.py +++ b/libs/sqlalchemy/orm/query.py @@ -731,7 +731,7 @@ def label(self, name: Optional[str]) -> Label[Any]: ) @overload - def as_scalar( + def as_scalar( # type: ignore[overload-overlap] self: Query[Tuple[_MAYBE_ENTITY]], ) -> ScalarSelect[_MAYBE_ENTITY]: ... @@ -1710,6 +1710,7 @@ def execution_options( schema_translate_map: Optional[SchemaTranslateMapType] = ..., populate_existing: bool = False, autoflush: bool = False, + preserve_rowcount: bool = False, **opt: Any, ) -> Self: ... @@ -2938,6 +2939,7 @@ def instances( context = QueryContext( compile_state, compile_state.statement, + compile_state.statement, self._params, self.session, self.load_options, @@ -3297,6 +3299,7 @@ def _compile_context(self, for_statement: bool = False) -> QueryContext: context = QueryContext( compile_state, compile_state.statement, + compile_state.statement, self._params, self.session, self.load_options, diff --git a/libs/sqlalchemy/orm/relationships.py b/libs/sqlalchemy/orm/relationships.py index 11ea59112..b5e33ffdb 100644 --- a/libs/sqlalchemy/orm/relationships.py +++ b/libs/sqlalchemy/orm/relationships.py @@ -19,6 +19,7 @@ from collections import abc import dataclasses import inspect as _py_inspect +import itertools import re import typing from typing import Any @@ -26,6 +27,7 @@ from typing import cast from typing import Collection from typing import Dict +from typing import FrozenSet from typing import Generic from typing import Iterable from typing import Iterator @@ -1753,19 +1755,17 @@ def declarative_scan( argument = extracted_mapped_annotation assert originating_module is not None - is_write_only = mapped_container is not None and issubclass( - mapped_container, WriteOnlyMapped - ) - if is_write_only: - self.lazy = "write_only" - self.strategy_key = (("lazy", self.lazy),) - - is_dynamic = mapped_container is not None and issubclass( - mapped_container, DynamicMapped - ) - if is_dynamic: - self.lazy = "dynamic" - self.strategy_key = (("lazy", self.lazy),) + if mapped_container is not None: + is_write_only = issubclass(mapped_container, WriteOnlyMapped) + is_dynamic = issubclass(mapped_container, DynamicMapped) + if is_write_only: + self.lazy = "write_only" + self.strategy_key = (("lazy", self.lazy),) + elif is_dynamic: + self.lazy = "dynamic" + self.strategy_key = (("lazy", self.lazy),) + else: + is_write_only = is_dynamic = False argument = de_optionalize_union_types(argument) @@ -3235,6 +3235,15 @@ def _gather_columns_with_annotation( if annotation_set.issubset(col._annotations) } + @util.memoized_property + def _secondary_lineage_set(self) -> FrozenSet[ColumnElement[Any]]: + if self.secondary is not None: + return frozenset( + itertools.chain(*[c.proxy_set for c in self.secondary.c]) + ) + else: + return util.EMPTY_SET + def join_targets( self, source_selectable: Optional[FromClause], @@ -3285,23 +3294,25 @@ def join_targets( if extra_criteria: - def mark_unrelated_columns_as_ok_to_adapt( + def mark_exclude_cols( elem: SupportsAnnotations, annotations: _AnnotationDict ) -> SupportsAnnotations: - """note unrelated columns in the "extra criteria" as OK - to adapt, even though they are not part of our "local" - or "remote" side. + """note unrelated columns in the "extra criteria" as either + should be adapted or not adapted, even though they are not + part of our "local" or "remote" side. - see #9779 for this case + see #9779 for this case, as well as #11010 for a follow up """ parentmapper_for_element = elem._annotations.get( "parentmapper", None ) + if ( parentmapper_for_element is not self.prop.parent and parentmapper_for_element is not self.prop.mapper + and elem not in self._secondary_lineage_set ): return _safe_annotate(elem, annotations) else: @@ -3310,8 +3321,8 @@ def mark_unrelated_columns_as_ok_to_adapt( extra_criteria = tuple( _deep_annotate( elem, - {"ok_to_adapt_in_join_condition": True}, - annotate_callable=mark_unrelated_columns_as_ok_to_adapt, + {"should_not_adapt": True}, + annotate_callable=mark_exclude_cols, ) for elem in extra_criteria ) @@ -3325,14 +3336,16 @@ def mark_unrelated_columns_as_ok_to_adapt( if secondary is not None: secondary = secondary._anonymous_fromclause(flat=True) primary_aliasizer = ClauseAdapter( - secondary, exclude_fn=_ColInAnnotations("local") + secondary, + exclude_fn=_local_col_exclude, ) secondary_aliasizer = ClauseAdapter( dest_selectable, equivalents=self.child_equivalents ).chain(primary_aliasizer) if source_selectable is not None: primary_aliasizer = ClauseAdapter( - secondary, exclude_fn=_ColInAnnotations("local") + secondary, + exclude_fn=_local_col_exclude, ).chain( ClauseAdapter( source_selectable, @@ -3344,14 +3357,14 @@ def mark_unrelated_columns_as_ok_to_adapt( else: primary_aliasizer = ClauseAdapter( dest_selectable, - exclude_fn=_ColInAnnotations("local"), + exclude_fn=_local_col_exclude, equivalents=self.child_equivalents, ) if source_selectable is not None: primary_aliasizer.chain( ClauseAdapter( source_selectable, - exclude_fn=_ColInAnnotations("remote"), + exclude_fn=_remote_col_exclude, equivalents=self.parent_equivalents, ) ) @@ -3430,25 +3443,29 @@ def col_to_bind( class _ColInAnnotations: - """Serializable object that tests for a name in c._annotations.""" + """Serializable object that tests for names in c._annotations. - __slots__ = ("name",) + TODO: does this need to be serializable anymore? can we find what the + use case was for that? - def __init__(self, name: str): - self.name = name + """ + + __slots__ = ("names",) + + def __init__(self, *names: str): + self.names = frozenset(names) def __call__(self, c: ClauseElement) -> bool: - return ( - self.name in c._annotations - or "ok_to_adapt_in_join_condition" in c._annotations - ) + return bool(self.names.intersection(c._annotations)) + +_local_col_exclude = _ColInAnnotations("local", "should_not_adapt") +_remote_col_exclude = _ColInAnnotations("remote", "should_not_adapt") -class Relationship( # type: ignore + +class Relationship( RelationshipProperty[_T], _DeclarativeMapped[_T], - WriteOnlyMapped[_T], # not compatible with Mapped[_T] - DynamicMapped[_T], # not compatible with Mapped[_T] ): """Describes an object property that holds a single item or list of items that correspond to a related database table. @@ -3466,3 +3483,18 @@ class Relationship( # type: ignore inherit_cache = True """:meta private:""" + + +class _RelationshipDeclared( # type: ignore[misc] + Relationship[_T], + WriteOnlyMapped[_T], # not compatible with Mapped[_T] + DynamicMapped[_T], # not compatible with Mapped[_T] +): + """Relationship subclass used implicitly for declarative mapping.""" + + inherit_cache = True + """:meta private:""" + + @classmethod + def _mapper_property_name(cls) -> str: + return "Relationship" diff --git a/libs/sqlalchemy/orm/scoping.py b/libs/sqlalchemy/orm/scoping.py index 819616ae8..283f4a022 100644 --- a/libs/sqlalchemy/orm/scoping.py +++ b/libs/sqlalchemy/orm/scoping.py @@ -1228,7 +1228,7 @@ def is_modified( This method retrieves the history for each instrumented attribute on the instance and performs a comparison of the current - value to its previously committed value, if any. + value to its previously flushed or committed value, if any. It is in effect a more expensive and accurate version of checking for the given instance in the diff --git a/libs/sqlalchemy/orm/session.py b/libs/sqlalchemy/orm/session.py index 3eba5aaf4..eb81f16e0 100644 --- a/libs/sqlalchemy/orm/session.py +++ b/libs/sqlalchemy/orm/session.py @@ -575,22 +575,67 @@ def is_executemany(self) -> bool: @property def is_select(self) -> bool: - """return True if this is a SELECT operation.""" + """return True if this is a SELECT operation. + + .. versionchanged:: 2.0.30 - the attribute is also True for a + :meth:`_sql.Select.from_statement` construct that is itself against + a :class:`_sql.Select` construct, such as + ``select(Entity).from_statement(select(..))`` + + """ return self.statement.is_select + @property + def is_from_statement(self) -> bool: + """return True if this operation is a + :meth:`_sql.Select.from_statement` operation. + + This is independent from :attr:`_orm.ORMExecuteState.is_select`, as a + ``select().from_statement()`` construct can be used with + INSERT/UPDATE/DELETE RETURNING types of statements as well. + :attr:`_orm.ORMExecuteState.is_select` will only be set if the + :meth:`_sql.Select.from_statement` is itself against a + :class:`_sql.Select` construct. + + .. versionadded:: 2.0.30 + + """ + return self.statement.is_from_statement + @property def is_insert(self) -> bool: - """return True if this is an INSERT operation.""" + """return True if this is an INSERT operation. + + .. versionchanged:: 2.0.30 - the attribute is also True for a + :meth:`_sql.Select.from_statement` construct that is itself against + a :class:`_sql.Insert` construct, such as + ``select(Entity).from_statement(insert(..))`` + + """ return self.statement.is_dml and self.statement.is_insert @property def is_update(self) -> bool: - """return True if this is an UPDATE operation.""" + """return True if this is an UPDATE operation. + + .. versionchanged:: 2.0.30 - the attribute is also True for a + :meth:`_sql.Select.from_statement` construct that is itself against + a :class:`_sql.Update` construct, such as + ``select(Entity).from_statement(update(..))`` + + """ return self.statement.is_dml and self.statement.is_update @property def is_delete(self) -> bool: - """return True if this is a DELETE operation.""" + """return True if this is a DELETE operation. + + .. versionchanged:: 2.0.30 - the attribute is also True for a + :meth:`_sql.Select.from_statement` construct that is itself against + a :class:`_sql.Delete` construct, such as + ``select(Entity).from_statement(delete(..))`` + + """ return self.statement.is_dml and self.statement.is_delete @property @@ -1166,6 +1211,17 @@ def _connection_for_bind( else: join_transaction_mode = "rollback_only" + if local_connect: + util.warn( + "The engine provided as bind produced a " + "connection that is already in a transaction. " + "This is usually caused by a core event, " + "such as 'engine_connect', that has left a " + "transaction open. The effective join " + "transaction mode used by this session is " + f"{join_transaction_mode!r}. To silence this " + "warning, do not leave transactions open" + ) if join_transaction_mode in ( "control_fully", "rollback_only", @@ -4529,11 +4585,11 @@ def grouping_key( self._bulk_save_mappings( mapper, states, - isupdate, - True, - return_defaults, - update_changed_only, - False, + isupdate=isupdate, + isstates=True, + return_defaults=return_defaults, + update_changed_only=update_changed_only, + render_nulls=False, ) def bulk_insert_mappings( @@ -4612,11 +4668,11 @@ def bulk_insert_mappings( self._bulk_save_mappings( mapper, mappings, - False, - False, - return_defaults, - False, - render_nulls, + isupdate=False, + isstates=False, + return_defaults=return_defaults, + update_changed_only=False, + render_nulls=render_nulls, ) def bulk_update_mappings( @@ -4658,13 +4714,20 @@ def bulk_update_mappings( """ self._bulk_save_mappings( - mapper, mappings, True, False, False, False, False + mapper, + mappings, + isupdate=True, + isstates=False, + return_defaults=False, + update_changed_only=False, + render_nulls=False, ) def _bulk_save_mappings( self, mapper: Mapper[_O], mappings: Union[Iterable[InstanceState[_O]], Iterable[Dict[str, Any]]], + *, isupdate: bool, isstates: bool, return_defaults: bool, @@ -4681,17 +4744,17 @@ def _bulk_save_mappings( mapper, mappings, transaction, - isstates, - update_changed_only, + isstates=isstates, + update_changed_only=update_changed_only, ) else: bulk_persistence._bulk_insert( mapper, mappings, transaction, - isstates, - return_defaults, - render_nulls, + isstates=isstates, + return_defaults=return_defaults, + render_nulls=render_nulls, ) transaction.commit() @@ -4709,7 +4772,7 @@ def is_modified( This method retrieves the history for each instrumented attribute on the instance and performs a comparison of the current - value to its previously committed value, if any. + value to its previously flushed or committed value, if any. It is in effect a more expensive and accurate version of checking for the given instance in the diff --git a/libs/sqlalchemy/orm/state.py b/libs/sqlalchemy/orm/state.py index 03b81f904..9dfd7f64f 100644 --- a/libs/sqlalchemy/orm/state.py +++ b/libs/sqlalchemy/orm/state.py @@ -98,7 +98,7 @@ def __call__( @inspection._self_inspects class InstanceState(interfaces.InspectionAttrInfo, Generic[_O]): - """tracks state information at the instance level. + """Tracks state information at the instance level. The :class:`.InstanceState` is a key object used by the SQLAlchemy ORM in order to track the state of an object; @@ -148,7 +148,14 @@ class InstanceState(interfaces.InspectionAttrInfo, Generic[_O]): committed_state: Dict[str, Any] modified: bool = False + """When ``True`` the object was modified.""" expired: bool = False + """When ``True`` the object is :term:`expired`. + + .. seealso:: + + :ref:`session_expire` + """ _deleted: bool = False _load_pending: bool = False _orphaned_outside_of_session: bool = False @@ -169,11 +176,12 @@ def _instance_dict(self): expired_attributes: Set[str] """The set of keys which are 'expired' to be loaded by - the manager's deferred scalar loader, assuming no pending - changes. + the manager's deferred scalar loader, assuming no pending + changes. - see also the ``unmodified`` collection which is intersected - against this set when a refresh operation occurs.""" + See also the ``unmodified`` collection which is intersected + against this set when a refresh operation occurs. + """ callables: Dict[str, Callable[[InstanceState[_O], PassiveFlag], Any]] """A namespace where a per-state loader callable can be associated. @@ -228,7 +236,6 @@ def transient(self) -> bool: def pending(self) -> bool: """Return ``True`` if the object is :term:`pending`. - .. seealso:: :ref:`session_object_states` diff --git a/libs/sqlalchemy/orm/strategies.py b/libs/sqlalchemy/orm/strategies.py index 20c3b9cc6..c89a12efd 100644 --- a/libs/sqlalchemy/orm/strategies.py +++ b/libs/sqlalchemy/orm/strategies.py @@ -16,8 +16,10 @@ import itertools from typing import Any from typing import Dict +from typing import Optional from typing import Tuple from typing import TYPE_CHECKING +from typing import Union from . import attributes from . import exc as orm_exc @@ -45,7 +47,7 @@ from .session import _state_session from .state import InstanceState from .strategy_options import Load -from .util import _none_set +from .util import _none_only_set from .util import AliasedClass from .. import event from .. import exc as sa_exc @@ -57,8 +59,10 @@ from ..sql import visitors from ..sql.selectable import LABEL_STYLE_TABLENAME_PLUS_COL from ..sql.selectable import Select +from ..util.typing import Literal if TYPE_CHECKING: + from .mapper import Mapper from .relationships import RelationshipProperty from ..sql.elements import ColumnElement @@ -932,8 +936,15 @@ def _load_for_state( elif LoaderCallableStatus.NEVER_SET in primary_key_identity: return LoaderCallableStatus.NEVER_SET - if _none_set.issuperset(primary_key_identity): - return None + # test for None alone in primary_key_identity based on + # allow_partial_pks preference. PASSIVE_NO_RESULT and NEVER_SET + # have already been tested above + if not self.mapper.allow_partial_pks: + if _none_only_set.intersection(primary_key_identity): + return None + else: + if _none_only_set.issuperset(primary_key_identity): + return None if ( self.key in state.dict @@ -1373,12 +1384,16 @@ def create_row_processor( adapter, populators, ): + if not context.compile_state.compile_options._enable_eagerloads: + return + ( effective_path, run_loader, execution_options, recursion_depth, ) = self._setup_for_recursion(context, path, loadopt, self.join_depth) + if not run_loader: # this will not emit SQL and will only emit for a many-to-one # "use get" load. the "_RELATED" part means it may return @@ -1957,6 +1972,18 @@ def create_row_processor( adapter, populators, ): + if ( + loadopt + and context.compile_state.statement is not None + and context.compile_state.statement.is_dml + ): + util.warn_deprecated( + "The subqueryload loader option is not compatible with DML " + "statements such as INSERT, UPDATE. Only SELECT may be used." + "This warning will become an exception in a future release.", + "2.0", + ) + if context.refresh_state: return self._immediateload_create_row_processor( context, @@ -2122,6 +2149,17 @@ def setup_query( if not compile_state.compile_options._enable_eagerloads: return + elif ( + loadopt + and compile_state.statement is not None + and compile_state.statement.is_dml + ): + util.warn_deprecated( + "The joinedload loader option is not compatible with DML " + "statements such as INSERT, UPDATE. Only SELECT may be used." + "This warning will become an exception in a future release.", + "2.0", + ) elif self.uselist: compile_state.multi_row_eager_loaders = True @@ -2506,13 +2544,13 @@ def _create_eager_join( or query_entity.entity_zero.represents_outer_join or (chained_from_outerjoin and isinstance(towrap, sql.Join)), _left_memo=self.parent, - _right_memo=self.mapper, + _right_memo=path[self.mapper], _extra_criteria=extra_join_criteria, ) else: # all other cases are innerjoin=='nested' approach eagerjoin = self._splice_nested_inner_join( - path, towrap, clauses, onclause, extra_join_criteria + path, path[-2], towrap, clauses, onclause, extra_join_criteria ) compile_state.eager_joins[query_entity_key] = eagerjoin @@ -2546,93 +2584,177 @@ def _create_eager_join( ) def _splice_nested_inner_join( - self, path, join_obj, clauses, onclause, extra_criteria, splicing=False + self, + path, + entity_we_want_to_splice_onto, + join_obj, + clauses, + onclause, + extra_criteria, + entity_inside_join_structure: Union[ + Mapper, None, Literal[False] + ] = False, + detected_existing_path: Optional[path_registry.PathRegistry] = None, ): # recursive fn to splice a nested join into an existing one. - # splicing=False means this is the outermost call, and it - # should return a value. splicing=<from object> is the recursive - # form, where it can return None to indicate the end of the recursion + # entity_inside_join_structure=False means this is the outermost call, + # and it should return a value. entity_inside_join_structure=<mapper> + # indicates we've descended into a join and are looking at a FROM + # clause representing this mapper; if this is not + # entity_we_want_to_splice_onto then return None to end the recursive + # branch + + assert entity_we_want_to_splice_onto is path[-2] - if splicing is False: - # first call is always handed a join object - # from the outside + if entity_inside_join_structure is False: assert isinstance(join_obj, orm_util._ORMJoin) - elif isinstance(join_obj, sql.selectable.FromGrouping): + + if isinstance(join_obj, sql.selectable.FromGrouping): + # FromGrouping - continue descending into the structure return self._splice_nested_inner_join( path, + entity_we_want_to_splice_onto, join_obj.element, clauses, onclause, extra_criteria, - splicing, + entity_inside_join_structure, ) - elif not isinstance(join_obj, orm_util._ORMJoin): - if path[-2].isa(splicing): - return orm_util._ORMJoin( - join_obj, - clauses.aliased_insp, - onclause, - isouter=False, - _left_memo=splicing, - _right_memo=path[-1].mapper, - _extra_criteria=extra_criteria, - ) - else: - return None + elif isinstance(join_obj, orm_util._ORMJoin): + # _ORMJoin - continue descending into the structure - target_join = self._splice_nested_inner_join( - path, - join_obj.right, - clauses, - onclause, - extra_criteria, - join_obj._right_memo, - ) - if target_join is None: - right_splice = False + join_right_path = join_obj._right_memo + + # see if right side of join is viable target_join = self._splice_nested_inner_join( path, - join_obj.left, + entity_we_want_to_splice_onto, + join_obj.right, clauses, onclause, extra_criteria, - join_obj._left_memo, + entity_inside_join_structure=( + join_right_path[-1].mapper + if join_right_path is not None + else None + ), ) - if target_join is None: - # should only return None when recursively called, - # e.g. splicing refers to a from obj - assert ( - splicing is not False - ), "assertion failed attempting to produce joined eager loads" - return None - else: - right_splice = True - - if right_splice: - # for a right splice, attempt to flatten out - # a JOIN b JOIN c JOIN .. to avoid needless - # parenthesis nesting - if not join_obj.isouter and not target_join.isouter: - eagerjoin = join_obj._splice_into_center(target_join) + + if target_join is not None: + # for a right splice, attempt to flatten out + # a JOIN b JOIN c JOIN .. to avoid needless + # parenthesis nesting + if not join_obj.isouter and not target_join.isouter: + eagerjoin = join_obj._splice_into_center(target_join) + else: + eagerjoin = orm_util._ORMJoin( + join_obj.left, + target_join, + join_obj.onclause, + isouter=join_obj.isouter, + _left_memo=join_obj._left_memo, + ) + + eagerjoin._target_adapter = target_join._target_adapter + return eagerjoin + else: - eagerjoin = orm_util._ORMJoin( + # see if left side of join is viable + target_join = self._splice_nested_inner_join( + path, + entity_we_want_to_splice_onto, join_obj.left, - target_join, - join_obj.onclause, - isouter=join_obj.isouter, - _left_memo=join_obj._left_memo, + clauses, + onclause, + extra_criteria, + entity_inside_join_structure=join_obj._left_memo, + detected_existing_path=join_right_path, ) - else: - eagerjoin = orm_util._ORMJoin( - target_join, - join_obj.right, - join_obj.onclause, - isouter=join_obj.isouter, - _right_memo=join_obj._right_memo, - ) - eagerjoin._target_adapter = target_join._target_adapter - return eagerjoin + if target_join is not None: + eagerjoin = orm_util._ORMJoin( + target_join, + join_obj.right, + join_obj.onclause, + isouter=join_obj.isouter, + _right_memo=join_obj._right_memo, + ) + eagerjoin._target_adapter = target_join._target_adapter + return eagerjoin + + # neither side viable, return None, or fail if this was the top + # most call + if entity_inside_join_structure is False: + assert ( + False + ), "assertion failed attempting to produce joined eager loads" + return None + + # reached an endpoint (e.g. a table that's mapped, or an alias of that + # table). determine if we can use this endpoint to splice onto + + # is this the entity we want to splice onto in the first place? + if not entity_we_want_to_splice_onto.isa(entity_inside_join_structure): + return None + + # path check. if we know the path how this join endpoint got here, + # lets look at our path we are satisfying and see if we're in the + # wrong place. This is specifically for when our entity may + # appear more than once in the path, issue #11449 + # updated in issue #11965. + if detected_existing_path and len(detected_existing_path) > 2: + # this assertion is currently based on how this call is made, + # where given a join_obj, the call will have these parameters as + # entity_inside_join_structure=join_obj._left_memo + # and entity_inside_join_structure=join_obj._right_memo.mapper + assert detected_existing_path[-3] is entity_inside_join_structure + + # from that, see if the path we are targeting matches the + # "existing" path of this join all the way up to the midpoint + # of this join object (e.g. the relationship). + # if not, then this is not our target + # + # a test condition where this test is false looks like: + # + # desired splice: Node->kind->Kind + # path of desired splice: NodeGroup->nodes->Node->kind + # path we've located: NodeGroup->nodes->Node->common_node->Node + # + # above, because we want to splice kind->Kind onto + # NodeGroup->nodes->Node, this is not our path because it actually + # goes more steps than we want into self-referential + # ->common_node->Node + # + # a test condition where this test is true looks like: + # + # desired splice: B->c2s->C2 + # path of desired splice: A->bs->B->c2s + # path we've located: A->bs->B->c1s->C1 + # + # above, we want to splice c2s->C2 onto B, and the located path + # shows that the join ends with B->c1s->C1. so we will + # add another join onto that, which would create a "branch" that + # we might represent in a pseudopath as: + # + # B->c1s->C1 + # ->c2s->C2 + # + # i.e. A JOIN B ON <bs> JOIN C1 ON <c1s> + # JOIN C2 ON <c2s> + # + + if detected_existing_path[0:-2] != path.path[0:-1]: + return None + + return orm_util._ORMJoin( + join_obj, + clauses.aliased_insp, + onclause, + isouter=False, + _left_memo=entity_inside_join_structure, + _right_memo=path[path[-1].mapper], + _extra_criteria=extra_criteria, + ) def _create_eager_adapter(self, context, result, adapter, path, loadopt): compile_state = context.compile_state @@ -2681,6 +2803,10 @@ def create_row_processor( adapter, populators, ): + + if not context.compile_state.compile_options._enable_eagerloads: + return + if not self.parent.class_manager[self.key].impl.supports_population: raise sa_exc.InvalidRequestError( "'%s' does not support object " @@ -2960,6 +3086,9 @@ def create_row_processor( if not run_loader: return + if not context.compile_state.compile_options._enable_eagerloads: + return + if not self.parent.class_manager[self.key].impl.supports_population: raise sa_exc.InvalidRequestError( "'%s' does not support object " @@ -3117,7 +3246,7 @@ def _load_for_path( orig_query = context.compile_state.select_statement # the actual statement that was requested is this one: - # context_query = context.query + # context_query = context.user_passed_query # # that's not the cached one, however. So while it is of the identical # structure, if it has entities like AliasedInsp, which we get from @@ -3141,11 +3270,11 @@ def _load_for_path( effective_path = path[self.parent_property] - if orig_query is context.query: + if orig_query is context.user_passed_query: new_options = orig_query._with_options else: cached_options = orig_query._with_options - uncached_options = context.query._with_options + uncached_options = context.user_passed_query._with_options # propagate compile state options from the original query, # updating their "extra_criteria" as necessary. diff --git a/libs/sqlalchemy/orm/strategy_options.py b/libs/sqlalchemy/orm/strategy_options.py index c20215ac3..b4bfea147 100644 --- a/libs/sqlalchemy/orm/strategy_options.py +++ b/libs/sqlalchemy/orm/strategy_options.py @@ -98,6 +98,7 @@ def contains_eager( attr: _AttrType, alias: Optional[_FromClauseArgument] = None, _is_chain: bool = False, + _propagate_to_loaders: bool = False, ) -> Self: r"""Indicate that the given attribute should be eagerly loaded from columns stated manually in the query. @@ -108,9 +109,9 @@ def contains_eager( The option is used in conjunction with an explicit join that loads the desired rows, i.e.:: - sess.query(Order).\ - join(Order.user).\ - options(contains_eager(Order.user)) + sess.query(Order).join(Order.user).options( + contains_eager(Order.user) + ) The above query would join from the ``Order`` entity to its related ``User`` entity, and the returned ``Order`` objects would have the @@ -121,11 +122,9 @@ def contains_eager( :ref:`orm_queryguide_populate_existing` execution option assuming the primary collection of parent objects may already have been loaded:: - sess.query(User).\ - join(User.addresses).\ - filter(Address.email_address.like('%@aol.com')).\ - options(contains_eager(User.addresses)).\ - populate_existing() + sess.query(User).join(User.addresses).filter( + Address.email_address.like("%@aol.com") + ).options(contains_eager(User.addresses)).populate_existing() See the section :ref:`contains_eager` for complete usage details. @@ -160,7 +159,7 @@ def contains_eager( cloned = self._set_relationship_strategy( attr, {"lazy": "joined"}, - propagate_to_loaders=False, + propagate_to_loaders=_propagate_to_loaders, opts={"eager_from_alias": coerced_alias}, _reconcile_to_other=True if _is_chain else None, ) @@ -191,10 +190,18 @@ def load_only(self, *attrs: _AttrType, raiseload: bool = False) -> Self: the lead entity can be specifically referred to using the :class:`_orm.Load` constructor:: - stmt = select(User, Address).join(User.addresses).options( - Load(User).load_only(User.name, User.fullname), - Load(Address).load_only(Address.email_address) - ) + stmt = ( + select(User, Address) + .join(User.addresses) + .options( + Load(User).load_only(User.name, User.fullname), + Load(Address).load_only(Address.email_address), + ) + ) + + When used together with the + :ref:`populate_existing <orm_queryguide_populate_existing>` + execution option only the attributes listed will be refreshed. :param \*attrs: Attributes to be loaded, all others will be deferred. @@ -247,28 +254,31 @@ def joinedload( examples:: # joined-load the "orders" collection on "User" - query(User).options(joinedload(User.orders)) + select(User).options(joinedload(User.orders)) # joined-load Order.items and then Item.keywords - query(Order).options( - joinedload(Order.items).joinedload(Item.keywords)) + select(Order).options( + joinedload(Order.items).joinedload(Item.keywords) + ) # lazily load Order.items, but when Items are loaded, # joined-load the keywords collection - query(Order).options( - lazyload(Order.items).joinedload(Item.keywords)) + select(Order).options( + lazyload(Order.items).joinedload(Item.keywords) + ) :param innerjoin: if ``True``, indicates that the joined eager load should use an inner join instead of the default of left outer join:: - query(Order).options(joinedload(Order.user, innerjoin=True)) + select(Order).options(joinedload(Order.user, innerjoin=True)) In order to chain multiple eager joins together where some may be OUTER and others INNER, right-nested joins are used to link them:: - query(A).options( - joinedload(A.bs, innerjoin=False). - joinedload(B.cs, innerjoin=True) + select(A).options( + joinedload(A.bs, innerjoin=False).joinedload( + B.cs, innerjoin=True + ) ) The above query, linking A.bs via "outer" join and B.cs via "inner" @@ -283,11 +293,11 @@ def joinedload( will render as LEFT OUTER JOIN. For example, supposing ``A.bs`` is an outerjoin:: - query(A).options( - joinedload(A.bs). - joinedload(B.cs, innerjoin="unnested") + select(A).options( + joinedload(A.bs).joinedload(B.cs, innerjoin="unnested") ) + The above join will render as "a LEFT OUTER JOIN b LEFT OUTER JOIN c", rather than as "a LEFT OUTER JOIN (b JOIN c)". @@ -338,16 +348,18 @@ def subqueryload(self, attr: _AttrType) -> Self: examples:: # subquery-load the "orders" collection on "User" - query(User).options(subqueryload(User.orders)) + select(User).options(subqueryload(User.orders)) # subquery-load Order.items and then Item.keywords - query(Order).options( - subqueryload(Order.items).subqueryload(Item.keywords)) + select(Order).options( + subqueryload(Order.items).subqueryload(Item.keywords) + ) # lazily load Order.items, but when Items are loaded, # subquery-load the keywords collection - query(Order).options( - lazyload(Order.items).subqueryload(Item.keywords)) + select(Order).options( + lazyload(Order.items).subqueryload(Item.keywords) + ) .. seealso:: @@ -373,16 +385,18 @@ def selectinload( examples:: # selectin-load the "orders" collection on "User" - query(User).options(selectinload(User.orders)) + select(User).options(selectinload(User.orders)) # selectin-load Order.items and then Item.keywords - query(Order).options( - selectinload(Order.items).selectinload(Item.keywords)) + select(Order).options( + selectinload(Order.items).selectinload(Item.keywords) + ) # lazily load Order.items, but when Items are loaded, # selectin-load the keywords collection - query(Order).options( - lazyload(Order.items).selectinload(Item.keywords)) + select(Order).options( + lazyload(Order.items).selectinload(Item.keywords) + ) :param recursion_depth: optional int; when set to a positive integer in conjunction with a self-referential relationship, @@ -493,10 +507,10 @@ def noload(self, attr: _AttrType) -> Self: :func:`_orm.noload` applies to :func:`_orm.relationship` attributes only. - .. note:: Setting this loading strategy as the default strategy - for a relationship using the :paramref:`.orm.relationship.lazy` - parameter may cause issues with flushes, such if a delete operation - needs to load related objects and instead ``None`` was returned. + .. legacy:: The :func:`_orm.noload` option is **legacy**. As it + forces collections to be empty, which invariably leads to + non-intuitive and difficult to predict results. There are no + legitimate uses for this option in modern SQLAlchemy. .. seealso:: @@ -558,17 +572,20 @@ def defaultload(self, attr: _AttrType) -> Self: element of an element:: session.query(MyClass).options( - defaultload(MyClass.someattribute). - joinedload(MyOtherClass.someotherattribute) + defaultload(MyClass.someattribute).joinedload( + MyOtherClass.someotherattribute + ) ) :func:`.defaultload` is also useful for setting column-level options on a related class, namely that of :func:`.defer` and :func:`.undefer`:: - session.query(MyClass).options( - defaultload(MyClass.someattribute). - defer("some_column"). - undefer("some_other_column") + session.scalars( + select(MyClass).options( + defaultload(MyClass.someattribute) + .defer("some_column") + .undefer("some_other_column") + ) ) .. seealso:: @@ -609,7 +626,7 @@ def defer(self, key: _AttrType, raiseload: bool = False) -> Self: at once using :meth:`_orm.Load.options`:: - session.query(MyClass).options( + select(MyClass).options( defaultload(MyClass.someattr).options( defer(RelatedClass.some_column), defer(RelatedClass.some_other_column), @@ -660,11 +677,13 @@ def undefer(self, key: _AttrType) -> Self: # undefer all columns specific to a single class using Load + * session.query(MyClass, MyOtherClass).options( - Load(MyClass).undefer("*")) + Load(MyClass).undefer("*") + ) # undefer a column on a related object - session.query(MyClass).options( - defaultload(MyClass.items).undefer(MyClass.text)) + select(MyClass).options( + defaultload(MyClass.items).undefer(MyClass.text) + ) :param key: Attribute to be undeferred. @@ -697,8 +716,9 @@ def undefer_group(self, name: str) -> Self: spelled out using relationship loader options, such as :func:`_orm.defaultload`:: - session.query(MyClass).options( - defaultload("someattr").undefer_group("large_attrs")) + select(MyClass).options( + defaultload("someattr").undefer_group("large_attrs") + ) .. seealso:: @@ -1034,6 +1054,8 @@ def _construct_for_existing_path( def _adapt_cached_option_to_uncached_option( self, context: QueryContext, uncached_opt: ORMOption ) -> ORMOption: + if uncached_opt is self: + return self return self._adjust_for_extra_criteria(context) def _prepend_path(self, path: PathRegistry) -> Load: @@ -1049,47 +1071,51 @@ def _adjust_for_extra_criteria(self, context: QueryContext) -> Load: returning a new instance of this ``Load`` object. """ - orig_query = context.compile_state.select_statement - orig_cache_key: Optional[CacheKey] = None - replacement_cache_key: Optional[CacheKey] = None - found_crit = False - - def process(opt: _LoadElement) -> _LoadElement: - nonlocal orig_cache_key, replacement_cache_key, found_crit - - found_crit = True + # avoid generating cache keys for the queries if we don't + # actually have any extra_criteria options, which is the + # common case + for value in self.context: + if value._extra_criteria: + break + else: + return self - if orig_cache_key is None or replacement_cache_key is None: - orig_cache_key = orig_query._generate_cache_key() - replacement_cache_key = context.query._generate_cache_key() + replacement_cache_key = context.user_passed_query._generate_cache_key() - if replacement_cache_key is not None: - assert orig_cache_key is not None + if replacement_cache_key is None: + return self - opt._extra_criteria = tuple( - replacement_cache_key._apply_params_to_element( - orig_cache_key, crit - ) - for crit in opt._extra_criteria + orig_query = context.compile_state.select_statement + orig_cache_key = orig_query._generate_cache_key() + assert orig_cache_key is not None + + def process( + opt: _LoadElement, + replacement_cache_key: CacheKey, + orig_cache_key: CacheKey, + ) -> _LoadElement: + cloned_opt = opt._clone() + + cloned_opt._extra_criteria = tuple( + replacement_cache_key._apply_params_to_element( + orig_cache_key, crit ) + for crit in cloned_opt._extra_criteria + ) - return opt + return cloned_opt - # avoid generating cache keys for the queries if we don't - # actually have any extra_criteria options, which is the - # common case - new_context = tuple( - process(value._clone()) if value._extra_criteria else value + cloned = self._clone() + cloned.context = tuple( + ( + process(value, replacement_cache_key, orig_cache_key) + if value._extra_criteria + else value + ) for value in self.context ) - - if found_crit: - cloned = self._clone() - cloned.context = new_context - return cloned - else: - return self + return cloned def _reconcile_query_entities_with_us(self, mapper_entities, raiseerr): """called at process time to allow adjustment of the root @@ -1121,7 +1147,20 @@ def _process( mapper_entities, raiseerr ) + # if the context has a current path, this is a lazy load + has_current_path = bool(compile_state.compile_options._current_path) + for loader in self.context: + # issue #11292 + # historically, propagate_to_loaders was only considered at + # object loading time, whether or not to carry along options + # onto an object's loaded state where it would be used by lazyload. + # however, the defaultload() option needs to propagate in case + # its sub-options propagate_to_loaders, but its sub-options + # that dont propagate should not be applied for lazy loaders. + # so we check again + if has_current_path and not loader.propagate_to_loaders: + continue loader.process_compile_state( self, compile_state, diff --git a/libs/sqlalchemy/orm/util.py b/libs/sqlalchemy/orm/util.py index 90508206e..69556751a 100644 --- a/libs/sqlalchemy/orm/util.py +++ b/libs/sqlalchemy/orm/util.py @@ -42,6 +42,7 @@ from .base import _class_to_mapper as _class_to_mapper from .base import _MappedAnnotationBase from .base import _never_set as _never_set # noqa: F401 +from .base import _none_only_set as _none_only_set # noqa: F401 from .base import _none_set as _none_set # noqa: F401 from .base import attribute_str as attribute_str # noqa: F401 from .base import class_mapper as class_mapper @@ -89,6 +90,7 @@ de_stringify_union_elements as _de_stringify_union_elements, ) from ..util.typing import eval_name_only as _eval_name_only +from ..util.typing import fixup_container_fwd_refs from ..util.typing import is_origin_of_cls from ..util.typing import Literal from ..util.typing import Protocol @@ -247,7 +249,7 @@ def __new__( values.clear() values.discard("all") - self = super().__new__(cls, values) # type: ignore + self = super().__new__(cls, values) self.save_update = "save-update" in values self.delete = "delete" in values self.refresh_expire = "refresh-expire" in values @@ -1067,6 +1069,7 @@ def _with_polymorphic_factory( aliased: bool = False, innerjoin: bool = False, adapt_on_names: bool = False, + name: Optional[str] = None, _use_mapper_path: bool = False, ) -> AliasedClass[_O]: primary_mapper = _class_to_mapper(base) @@ -1087,6 +1090,7 @@ def _with_polymorphic_factory( return AliasedClass( base, selectable, + name=name, with_polymorphic_mappers=mappers, adapt_on_names=adapt_on_names, with_polymorphic_discriminator=polymorphic_on, @@ -1378,7 +1382,10 @@ class LoaderCriteriaOption(CriteriaOption): def __init__( self, entity_or_base: _EntityType[Any], - where_criteria: _ColumnExpressionArgument[bool], + where_criteria: Union[ + _ColumnExpressionArgument[bool], + Callable[[Any], _ColumnExpressionArgument[bool]], + ], loader_only: bool = False, include_aliases: bool = False, propagate_to_loaders: bool = True, @@ -1676,7 +1683,7 @@ def entity_namespace( c: ReadOnlyColumnCollection[str, KeyedColumnElement[Any]] """An alias for :attr:`.Bundle.columns`.""" - def _clone(self): + def _clone(self, **kw): cloned = self.__class__.__new__(self.__class__) cloned.__dict__.update(self.__dict__) return cloned @@ -1938,7 +1945,7 @@ def _splice_into_center(self, other): self.onclause, isouter=self.isouter, _left_memo=self._left_memo, - _right_memo=other._left_memo, + _right_memo=other._left_memo._path_registry, ) return _ORMJoin( @@ -2149,7 +2156,7 @@ def _entity_isa(given: _InternalEntityType[Any], mapper: Mapper[Any]) -> bool: mapper ) elif given.with_polymorphic_mappers: - return mapper in given.with_polymorphic_mappers + return mapper in given.with_polymorphic_mappers or given.isa(mapper) else: return given.isa(mapper) @@ -2316,7 +2323,7 @@ def _extract_mapped_subtype( is_dataclass_field: bool, expect_mapped: bool = True, raiseerr: bool = True, -) -> Optional[Tuple[Union[type, str], Optional[type]]]: +) -> Optional[Tuple[Union[_AnnotationScanType, str], Optional[type]]]: """given an annotation, figure out if it's ``Mapped[something]`` and if so, return the ``something`` part. @@ -2402,4 +2409,16 @@ def _extract_mapped_subtype( "Expected sub-type for Mapped[] annotation" ) - return annotated.__args__[0], annotated.__origin__ + return ( + # fix dict/list/set args to be ForwardRef, see #11814 + fixup_container_fwd_refs(annotated.__args__[0]), + annotated.__origin__, + ) + + +def _mapper_property_as_plain_name(prop: Type[Any]) -> str: + if hasattr(prop, "_mapper_property_name"): + name = prop._mapper_property_name() + else: + name = None + return util.clsname_as_plain_name(prop, name) diff --git a/libs/sqlalchemy/pool/impl.py b/libs/sqlalchemy/pool/impl.py index 18f9414ca..157455cbe 100644 --- a/libs/sqlalchemy/pool/impl.py +++ b/libs/sqlalchemy/pool/impl.py @@ -47,8 +47,18 @@ class QueuePool(Pool): that imposes a limit on the number of open connections. :class:`.QueuePool` is the default pooling implementation used for - all :class:`_engine.Engine` objects, unless the SQLite dialect is - in use with a ``:memory:`` database. + all :class:`_engine.Engine` objects other than SQLite with a ``:memory:`` + database. + + The :class:`.QueuePool` class **is not compatible** with asyncio and + :func:`_asyncio.create_async_engine`. The + :class:`.AsyncAdaptedQueuePool` class is used automatically when + using :func:`_asyncio.create_async_engine`, if no other kind of pool + is specified. + + .. seealso:: + + :class:`.AsyncAdaptedQueuePool` """ @@ -123,6 +133,7 @@ def __init__( :class:`_pool.Pool` constructor. """ + Pool.__init__(self, creator, **kw) self._pool = self._queue_class(pool_size, use_lifo=use_lifo) self._overflow = 0 - pool_size @@ -248,6 +259,18 @@ def checkedout(self) -> int: class AsyncAdaptedQueuePool(QueuePool): + """An asyncio-compatible version of :class:`.QueuePool`. + + This pool is used by default when using :class:`.AsyncEngine` engines that + were generated from :func:`_asyncio.create_async_engine`. It uses an + asyncio-compatible queue implementation that does not use + ``threading.Lock``. + + The arguments and operation of :class:`.AsyncAdaptedQueuePool` are + otherwise identical to that of :class:`.QueuePool`. + + """ + _is_asyncio = True # type: ignore[assignment] _queue_class: Type[sqla_queue.QueueCommon[ConnectionPoolEntry]] = ( sqla_queue.AsyncAdaptedQueue @@ -270,6 +293,9 @@ class NullPool(Pool): invalidation are not supported by this Pool implementation, since no connections are held persistently. + The :class:`.NullPool` class **is compatible** with asyncio and + :func:`_asyncio.create_async_engine`. + """ def status(self) -> str: @@ -317,6 +343,9 @@ class SingletonThreadPool(Pool): scenarios using a SQLite ``:memory:`` database and is not recommended for production use. + The :class:`.SingletonThreadPool` class **is not compatible** with asyncio + and :func:`_asyncio.create_async_engine`. + Options are the same as those of :class:`_pool.Pool`, as well as: @@ -425,6 +454,8 @@ class StaticPool(Pool): invalidation (which is also used to support auto-reconnect) are only partially supported right now and may not yield good results. + The :class:`.StaticPool` class **is compatible** with asyncio and + :func:`_asyncio.create_async_engine`. """ @@ -489,6 +520,9 @@ class AssertionPool(Pool): at a time. Useful for debugging code that is using more connections than desired. + The :class:`.AssertionPool` class **is compatible** with asyncio and + :func:`_asyncio.create_async_engine`. + """ _conn: Optional[ConnectionPoolEntry] diff --git a/libs/sqlalchemy/sql/_elements_constructors.py b/libs/sqlalchemy/sql/_elements_constructors.py index 27bac59e1..bdc0534ab 100644 --- a/libs/sqlalchemy/sql/_elements_constructors.py +++ b/libs/sqlalchemy/sql/_elements_constructors.py @@ -493,8 +493,9 @@ def bindparam( from sqlalchemy import bindparam - stmt = select(users_table).\ - where(users_table.c.name == bindparam('username')) + stmt = select(users_table).where( + users_table.c.name == bindparam("username") + ) The above statement, when rendered, will produce SQL similar to:: @@ -504,22 +505,25 @@ def bindparam( would typically be applied at execution time to a method like :meth:`_engine.Connection.execute`:: - result = connection.execute(stmt, username='wendy') + result = connection.execute(stmt, {"username": "wendy"}) Explicit use of :func:`.bindparam` is also common when producing UPDATE or DELETE statements that are to be invoked multiple times, where the WHERE criterion of the statement is to change on each invocation, such as:: - stmt = (users_table.update(). - where(user_table.c.name == bindparam('username')). - values(fullname=bindparam('fullname')) - ) + stmt = ( + users_table.update() + .where(user_table.c.name == bindparam("username")) + .values(fullname=bindparam("fullname")) + ) connection.execute( - stmt, [{"username": "wendy", "fullname": "Wendy Smith"}, - {"username": "jack", "fullname": "Jack Jones"}, - ] + stmt, + [ + {"username": "wendy", "fullname": "Wendy Smith"}, + {"username": "jack", "fullname": "Jack Jones"}, + ], ) SQLAlchemy's Core expression system makes wide use of @@ -568,7 +572,7 @@ def bindparam( bound placeholders based on the arguments passed, as in:: stmt = users_table.insert() - result = connection.execute(stmt, name='Wendy') + result = connection.execute(stmt, {"name": "Wendy"}) The above will produce SQL output as:: @@ -1086,16 +1090,23 @@ def desc( def distinct(expr: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: """Produce an column-expression-level unary ``DISTINCT`` clause. - This applies the ``DISTINCT`` keyword to an individual column - expression, and is typically contained within an aggregate function, - as in:: + This applies the ``DISTINCT`` keyword to an **individual column + expression** (e.g. not the whole statement), and renders **specifically + in that column position**; this is used for containment within + an aggregate function, as in:: from sqlalchemy import distinct, func - stmt = select(func.count(distinct(users_table.c.name))) + stmt = select(users_table.c.id, func.count(distinct(users_table.c.name))) + + The above would produce an statement resembling:: - The above would produce an expression resembling:: + SELECT user.id, count(DISTINCT user.name) FROM user - SELECT COUNT(DISTINCT name) FROM user + .. tip:: The :func:`_sql.distinct` function does **not** apply DISTINCT + to the full SELECT statement, instead applying a DISTINCT modifier + to **individual column expressions**. For general ``SELECT DISTINCT`` + support, use the + :meth:`_sql.Select.distinct` method on :class:`_sql.Select`. The :func:`.distinct` function is also available as a column-level method, e.g. :meth:`_expression.ColumnElement.distinct`, as in:: @@ -1118,7 +1129,7 @@ def distinct(expr: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: :data:`.func` - """ + """ # noqa: E501 return UnaryExpression._create_distinct(expr) @@ -1148,6 +1159,9 @@ def extract(field: str, expr: _ColumnExpressionArgument[Any]) -> Extract: :param field: The field to extract. + .. warning:: This field is used as a literal SQL string. + **DO NOT PASS UNTRUSTED INPUT TO THIS STRING**. + :param expr: A column or Python scalar expression serving as the right side of the ``EXTRACT`` expression. @@ -1589,7 +1603,7 @@ def text(text: str) -> TextClause: E.g.:: t = text("SELECT * FROM users WHERE id=:user_id") - result = connection.execute(t, user_id=12) + result = connection.execute(t, {"user_id": 12}) For SQL statements where a colon is required verbatim, as within an inline string, use a backslash to escape:: @@ -1619,7 +1633,7 @@ def text(text: str) -> TextClause: such as for the WHERE clause of a SELECT statement:: s = select(users.c.id, users.c.name).where(text("id=:user_id")) - result = connection.execute(s, user_id=12) + result = connection.execute(s, {"user_id": 12}) :func:`_expression.text` is also used for the construction of a full, standalone statement using plain text. diff --git a/libs/sqlalchemy/sql/_typing.py b/libs/sqlalchemy/sql/_typing.py index ea9cbe1f4..73ed88996 100644 --- a/libs/sqlalchemy/sql/_typing.py +++ b/libs/sqlalchemy/sql/_typing.py @@ -69,6 +69,7 @@ from .sqltypes import TableValueType from .sqltypes import TupleType from .type_api import TypeEngine + from ..engine import Dialect from ..util.typing import TypeGuard _T = TypeVar("_T", bound=Any) @@ -92,11 +93,21 @@ class _CoreAdapterProto(Protocol): def __call__(self, obj: _CE) -> _CE: ... +class _HasDialect(Protocol): + """protocol for Engine/Connection-like objects that have dialect + attribute. + """ + + @property + def dialect(self) -> Dialect: ... + + # match column types that are not ORM entities _NOT_ENTITY = TypeVar( "_NOT_ENTITY", int, str, + bool, "datetime", "date", "time", @@ -106,10 +117,12 @@ def __call__(self, obj: _CE) -> _CE: ... "Decimal", ) +_StarOrOne = Literal["*", 1] + _MAYBE_ENTITY = TypeVar( "_MAYBE_ENTITY", roles.ColumnsClauseRole, - Literal["*", 1], + _StarOrOne, Type[Any], Inspectable[_HasClauseElement[Any]], _HasClauseElement[Any], @@ -134,7 +147,7 @@ def __call__(self, obj: _CE) -> _CE: ... roles.TypedColumnsClauseRole[_T], roles.ColumnsClauseRole, "SQLCoreOperations[_T]", - Literal["*", 1], + _StarOrOne, Type[_T], Inspectable[_HasClauseElement[_T]], _HasClauseElement[_T], @@ -174,6 +187,7 @@ def __call__(self, obj: _CE) -> _CE: ... _HasClauseElement[_T], "SQLCoreOperations[_T]", roles.ExpressionElementRole[_T], + roles.TypedColumnsClauseRole[_T], Callable[[], "ColumnElement[_T]"], "LambdaElement", ] diff --git a/libs/sqlalchemy/sql/base.py b/libs/sqlalchemy/sql/base.py index cea0f177d..e4a7256b5 100644 --- a/libs/sqlalchemy/sql/base.py +++ b/libs/sqlalchemy/sql/base.py @@ -72,7 +72,6 @@ from .elements import ClauseList from .elements import ColumnClause # noqa from .elements import ColumnElement - from .elements import KeyedColumnElement from .elements import NamedColumn from .elements import SQLCoreOperations from .elements import TextClause @@ -1029,6 +1028,7 @@ class Executable(roles.StatementRole): ] is_select = False + is_from_statement = False is_update = False is_insert = False is_text = False @@ -1167,6 +1167,7 @@ def execution_options( render_nulls: bool = ..., is_delete_using: bool = ..., is_update_from: bool = ..., + preserve_rowcount: bool = False, **opt: Any, ) -> Self: ... @@ -1352,7 +1353,7 @@ class _SentinelColumnCharacterization(NamedTuple): _COLKEY = TypeVar("_COLKEY", Union[None, str], str) _COL_co = TypeVar("_COL_co", bound="ColumnElement[Any]", covariant=True) -_COL = TypeVar("_COL", bound="KeyedColumnElement[Any]") +_COL = TypeVar("_COL", bound="ColumnElement[Any]") class _ColumnMetrics(Generic[_COL_co]): @@ -1640,9 +1641,15 @@ def compare(self, other: ColumnCollection[Any, Any]) -> bool: def __eq__(self, other: Any) -> bool: return self.compare(other) + @overload + def get(self, key: str, default: None = None) -> Optional[_COL_co]: ... + + @overload + def get(self, key: str, default: _COL) -> Union[_COL_co, _COL]: ... + def get( - self, key: str, default: Optional[_COL_co] = None - ) -> Optional[_COL_co]: + self, key: str, default: Optional[_COL] = None + ) -> Optional[Union[_COL_co, _COL]]: """Get a :class:`_sql.ColumnClause` or :class:`_schema.Column` object based on a string key name from this :class:`_expression.ColumnCollection`.""" @@ -1923,16 +1930,15 @@ class DedupeColumnCollection(ColumnCollection[str, _NAMEDCOL]): """ - def add( - self, column: ColumnElement[Any], key: Optional[str] = None + def add( # type: ignore[override] + self, column: _NAMEDCOL, key: Optional[str] = None ) -> None: - named_column = cast(_NAMEDCOL, column) - if key is not None and named_column.key != key: + if key is not None and column.key != key: raise exc.ArgumentError( "DedupeColumnCollection requires columns be under " "the same key as their .key" ) - key = named_column.key + key = column.key if key is None: raise exc.ArgumentError( @@ -1942,17 +1948,17 @@ def add( if key in self._index: existing = self._index[key][1] - if existing is named_column: + if existing is column: return - self.replace(named_column) + self.replace(column) # pop out memoized proxy_set as this # operation may very well be occurring # in a _make_proxy operation - util.memoized_property.reset(named_column, "proxy_set") + util.memoized_property.reset(column, "proxy_set") else: - self._append_new_column(key, named_column) + self._append_new_column(key, column) def _append_new_column(self, key: str, named_column: _NAMEDCOL) -> None: l = len(self._collection) @@ -2131,7 +2137,7 @@ def __eq__(self, other): l.append(c == local) return elements.and_(*l) - def __hash__(self): + def __hash__(self): # type: ignore[override] return hash(tuple(x for x in self)) diff --git a/libs/sqlalchemy/sql/cache_key.py b/libs/sqlalchemy/sql/cache_key.py index b4b6b23fa..1172d3c98 100644 --- a/libs/sqlalchemy/sql/cache_key.py +++ b/libs/sqlalchemy/sql/cache_key.py @@ -37,6 +37,7 @@ if typing.TYPE_CHECKING: from .elements import BindParameter from .elements import ClauseElement + from .elements import ColumnElement from .visitors import _TraverseInternalsType from ..engine.interfaces import _CoreSingleExecuteParams @@ -557,18 +558,17 @@ def _generate_param_dict(self) -> Dict[str, Any]: _anon_map = prefix_anon_map() return {b.key % _anon_map: b.effective_value for b in self.bindparams} + @util.preload_module("sqlalchemy.sql.elements") def _apply_params_to_element( - self, original_cache_key: CacheKey, target_element: ClauseElement - ) -> ClauseElement: - if target_element._is_immutable: + self, original_cache_key: CacheKey, target_element: ColumnElement[Any] + ) -> ColumnElement[Any]: + if target_element._is_immutable or original_cache_key is self: return target_element - translate = { - k.key: v.value - for k, v in zip(original_cache_key.bindparams, self.bindparams) - } - - return target_element.params(translate) + elements = util.preloaded.sql_elements + return elements._OverrideBinds( + target_element, self.bindparams, original_cache_key.bindparams + ) def _ad_hoc_cache_key_from_args( diff --git a/libs/sqlalchemy/sql/coercions.py b/libs/sqlalchemy/sql/coercions.py index 22d609155..1d11cbbd3 100644 --- a/libs/sqlalchemy/sql/coercions.py +++ b/libs/sqlalchemy/sql/coercions.py @@ -29,7 +29,6 @@ from typing import TypeVar from typing import Union -from . import operators from . import roles from . import visitors from ._typing import is_from_clause @@ -493,6 +492,7 @@ def _raise_for_expected( element: Any, argname: Optional[str] = None, resolved: Optional[Any] = None, + *, advice: Optional[str] = None, code: Optional[str] = None, err: Optional[Exception] = None, @@ -595,7 +595,7 @@ def _no_text_coercion( class _NoTextCoercion(RoleImpl): __slots__ = () - def _literal_coercion(self, element, argname=None, **kw): + def _literal_coercion(self, element, *, argname=None, **kw): if isinstance(element, str) and issubclass( elements.TextClause, self._role_class ): @@ -613,7 +613,7 @@ class _CoerceLiterals(RoleImpl): def _text_coercion(self, element, argname=None): return _no_text_coercion(element, argname) - def _literal_coercion(self, element, argname=None, **kw): + def _literal_coercion(self, element, *, argname=None, **kw): if isinstance(element, str): if self._coerce_star and element == "*": return elements.ColumnClause("*", is_literal=True) @@ -641,7 +641,8 @@ def _implicit_coercions( self, element, resolved, - argname, + argname=None, + *, type_=None, literal_execute=False, **kw, @@ -659,7 +660,7 @@ def _implicit_coercions( literal_execute=literal_execute, ) - def _literal_coercion(self, element, argname=None, type_=None, **kw): + def _literal_coercion(self, element, **kw): return element @@ -671,6 +672,7 @@ def _raise_for_expected( element: Any, argname: Optional[str] = None, resolved: Optional[Any] = None, + *, advice: Optional[str] = None, code: Optional[str] = None, err: Optional[Exception] = None, @@ -745,7 +747,7 @@ class ExpressionElementImpl(_ColumnCoercions, RoleImpl): __slots__ = () def _literal_coercion( - self, element, name=None, type_=None, argname=None, is_crud=False, **kw + self, element, *, name=None, type_=None, is_crud=False, **kw ): if ( element is None @@ -787,15 +789,22 @@ def _raise_for_expected(self, element, argname=None, resolved=None, **kw): class BinaryElementImpl(ExpressionElementImpl, RoleImpl): __slots__ = () - def _literal_coercion( - self, element, expr, operator, bindparam_type=None, argname=None, **kw + def _literal_coercion( # type: ignore[override] + self, + element, + *, + expr, + operator, + bindparam_type=None, + argname=None, + **kw, ): try: return expr._bind_param(operator, element, type_=bindparam_type) except exc.ArgumentError as err: self._raise_for_expected(element, err=err) - def _post_coercion(self, resolved, expr, bindparam_type=None, **kw): + def _post_coercion(self, resolved, *, expr, bindparam_type=None, **kw): if resolved.type._isnull and not expr.type._isnull: resolved = resolved._with_binary_element_type( bindparam_type if bindparam_type is not None else expr.type @@ -833,16 +842,19 @@ def _warn_for_implicit_coercion(self, elem): % (elem.__class__.__name__) ) - def _literal_coercion(self, element, expr, operator, **kw): + @util.preload_module("sqlalchemy.sql.elements") + def _literal_coercion(self, element, *, expr, operator, **kw): if util.is_non_string_iterable(element): non_literal_expressions: Dict[ - Optional[operators.ColumnOperators], - operators.ColumnOperators, + Optional[ColumnElement[Any]], + ColumnElement[Any], ] = {} element = list(element) for o in element: if not _is_literal(o): - if not isinstance(o, operators.ColumnOperators): + if not isinstance( + o, util.preloaded.sql_elements.ColumnElement + ): self._raise_for_expected(element, **kw) else: @@ -867,7 +879,7 @@ def _literal_coercion(self, element, expr, operator, **kw): else: self._raise_for_expected(element, **kw) - def _post_coercion(self, element, expr, operator, **kw): + def _post_coercion(self, element, *, expr, operator, **kw): if element._is_select_base: # for IN, we are doing scalar_subquery() coercion without # a warning @@ -893,12 +905,10 @@ class OnClauseImpl(_ColumnCoercions, RoleImpl): _coerce_consts = True - def _literal_coercion( - self, element, name=None, type_=None, argname=None, is_crud=False, **kw - ): + def _literal_coercion(self, element, **kw): self._raise_for_expected(element) - def _post_coercion(self, resolved, original_element=None, **kw): + def _post_coercion(self, resolved, *, original_element=None, **kw): # this is a hack right now as we want to use coercion on an # ORM InstrumentedAttribute, but we want to return the object # itself if it is one, not its clause element. @@ -983,7 +993,7 @@ def _implicit_coercions( class DMLColumnImpl(_ReturnsStringKey, RoleImpl): __slots__ = () - def _post_coercion(self, element, as_key=False, **kw): + def _post_coercion(self, element, *, as_key=False, **kw): if as_key: return element.key else: @@ -993,7 +1003,7 @@ def _post_coercion(self, element, as_key=False, **kw): class ConstExprImpl(RoleImpl): __slots__ = () - def _literal_coercion(self, element, argname=None, **kw): + def _literal_coercion(self, element, *, argname=None, **kw): if element is None: return elements.Null() elif element is False: @@ -1019,7 +1029,7 @@ def _implicit_coercions( else: self._raise_for_expected(element, argname, resolved) - def _literal_coercion(self, element, argname=None, **kw): + def _literal_coercion(self, element, **kw): """coerce the given value to :class:`._truncated_label`. Existing :class:`._truncated_label` and @@ -1069,7 +1079,9 @@ def _implicit_coercions( else: self._raise_for_expected(element, argname, resolved) - def _literal_coercion(self, element, name, type_, **kw): + def _literal_coercion( # type: ignore[override] + self, element, *, name, type_, **kw + ): if element is None: return None else: @@ -1111,7 +1123,7 @@ class ColumnsClauseImpl(_SelectIsNotFrom, _CoerceLiterals, RoleImpl): _guess_straight_column = re.compile(r"^\w\S*$", re.I) def _raise_for_expected( - self, element, argname=None, resolved=None, advice=None, **kw + self, element, argname=None, resolved=None, *, advice=None, **kw ): if not advice and isinstance(element, list): advice = ( @@ -1149,7 +1161,9 @@ class ReturnsRowsImpl(RoleImpl): class StatementImpl(_CoerceLiterals, RoleImpl): __slots__ = () - def _post_coercion(self, resolved, original_element, argname=None, **kw): + def _post_coercion( + self, resolved, *, original_element, argname=None, **kw + ): if resolved is not original_element and not isinstance( original_element, str ): @@ -1215,7 +1229,7 @@ class JoinTargetImpl(RoleImpl): _skip_clauseelement_for_target_match = True - def _literal_coercion(self, element, argname=None, **kw): + def _literal_coercion(self, element, *, argname=None, **kw): self._raise_for_expected(element, argname) def _implicit_coercions( @@ -1223,6 +1237,7 @@ def _implicit_coercions( element: Any, resolved: Any, argname: Optional[str] = None, + *, legacy: bool = False, **kw: Any, ) -> Any: @@ -1256,6 +1271,7 @@ def _implicit_coercions( element: Any, resolved: Any, argname: Optional[str] = None, + *, explicit_subquery: bool = False, allow_select: bool = True, **kw: Any, @@ -1277,7 +1293,7 @@ def _implicit_coercions( else: self._raise_for_expected(element, argname, resolved) - def _post_coercion(self, element, deannotate=False, **kw): + def _post_coercion(self, element, *, deannotate=False, **kw): if deannotate: return element._deannotate() else: @@ -1292,7 +1308,7 @@ def _implicit_coercions( element: Any, resolved: Any, argname: Optional[str] = None, - explicit_subquery: bool = False, + *, allow_select: bool = False, **kw: Any, ) -> Any: @@ -1312,7 +1328,7 @@ def _implicit_coercions( class AnonymizedFromClauseImpl(StrictFromClauseImpl): __slots__ = () - def _post_coercion(self, element, flat=False, name=None, **kw): + def _post_coercion(self, element, *, flat=False, name=None, **kw): assert name is None return element._anonymous_fromclause(flat=flat) diff --git a/libs/sqlalchemy/sql/compiler.py b/libs/sqlalchemy/sql/compiler.py index ba8e3ea45..634e5ce11 100644 --- a/libs/sqlalchemy/sql/compiler.py +++ b/libs/sqlalchemy/sql/compiler.py @@ -29,6 +29,7 @@ import collections.abc as collections_abc import contextlib from enum import IntEnum +import functools import itertools import operator import re @@ -114,7 +115,6 @@ from .selectable import Select from .selectable import SelectState from .type_api import _BindProcessorType - from .type_api import _SentinelProcessorType from ..engine.cursor import CursorResultMetaData from ..engine.interfaces import _CoreSingleExecuteParams from ..engine.interfaces import _DBAPIAnyExecuteParams @@ -545,8 +545,8 @@ class _InsertManyValues(NamedTuple): """ - sentinel_param_keys: Optional[Sequence[Union[str, int]]] = None - """parameter str keys / int indexes in each param dictionary / tuple + sentinel_param_keys: Optional[Sequence[str]] = None + """parameter str keys in each param dictionary / tuple that would link to the client side "sentinel" values for that row, which we can use to match up parameter sets to result rows. @@ -556,6 +556,10 @@ class _InsertManyValues(NamedTuple): .. versionadded:: 2.0.10 + .. versionchanged:: 2.0.29 - the sequence is now string dictionary keys + only, used against the "compiled parameteters" collection before + the parameters were converted by bound parameter processors + """ implicit_sentinel: bool = False @@ -600,7 +604,8 @@ class _InsertManyValuesBatch(NamedTuple): replaced_parameters: _DBAPIAnyExecuteParams processed_setinputsizes: Optional[_GenericSetInputSizesType] batch: Sequence[_DBAPISingleExecuteParams] - batch_size: int + sentinel_values: Sequence[Tuple[Any, ...]] + current_batch_size: int batchnum: int total_batches: int rows_sorted: bool @@ -1675,19 +1680,9 @@ def find_position(m: re.Match[str]) -> str: for v in self._insertmanyvalues.insert_crud_params ] - sentinel_param_int_idxs = ( - [ - self.positiontup.index(cast(str, _param_key)) - for _param_key in self._insertmanyvalues.sentinel_param_keys # noqa: E501 - ] - if self._insertmanyvalues.sentinel_param_keys is not None - else None - ) - self._insertmanyvalues = self._insertmanyvalues._replace( single_values_expr=single_values_expr, insert_crud_params=insert_crud_params, - sentinel_param_keys=sentinel_param_int_idxs, ) def _process_numeric(self): @@ -1756,21 +1751,11 @@ def _process_numeric(self): for v in self._insertmanyvalues.insert_crud_params ] - sentinel_param_int_idxs = ( - [ - self.positiontup.index(cast(str, _param_key)) - for _param_key in self._insertmanyvalues.sentinel_param_keys # noqa: E501 - ] - if self._insertmanyvalues.sentinel_param_keys is not None - else None - ) - self._insertmanyvalues = self._insertmanyvalues._replace( # This has the numbers (:1, :2) single_values_expr=single_values_expr, # The single binds are instead %s so they can be formatted insert_crud_params=insert_crud_params, - sentinel_param_keys=sentinel_param_int_idxs, ) @util.memoized_property @@ -1802,23 +1787,6 @@ def _bind_processors( if value is not None } - @util.memoized_property - def _imv_sentinel_value_resolvers( - self, - ) -> Optional[Sequence[Optional[_SentinelProcessorType[Any]]]]: - imv = self._insertmanyvalues - if imv is None or imv.sentinel_columns is None: - return None - - sentinel_value_resolvers = [ - _scol.type._cached_sentinel_value_processor(self.dialect) - for _scol in imv.sentinel_columns - ] - if util.NONE_SET.issuperset(sentinel_value_resolvers): - return None - else: - return sentinel_value_resolvers - def is_subquery(self): return len(self.stack) > 1 @@ -2383,6 +2351,70 @@ def default_from(self): """ return "" + def visit_override_binds(self, override_binds, **kw): + """SQL compile the nested element of an _OverrideBinds with + bindparams swapped out. + + The _OverrideBinds is not normally expected to be compiled; it + is meant to be used when an already cached statement is to be used, + the compilation was already performed, and only the bound params should + be swapped in at execution time. + + However, there are test cases that exericise this object, and + additionally the ORM subquery loader is known to feed in expressions + which include this construct into new queries (discovered in #11173), + so it has to do the right thing at compile time as well. + + """ + + # get SQL text first + sqltext = override_binds.element._compiler_dispatch(self, **kw) + + # for a test compile that is not for caching, change binds after the + # fact. note that we don't try to + # swap the bindparam as we compile, because our element may be + # elsewhere in the statement already (e.g. a subquery or perhaps a + # CTE) and was already visited / compiled. See + # test_relationship_criteria.py -> + # test_selectinload_local_criteria_subquery + for k in override_binds.translate: + if k not in self.binds: + continue + bp = self.binds[k] + + # so this would work, just change the value of bp in place. + # but we dont want to mutate things outside. + # bp.value = override_binds.translate[bp.key] + # continue + + # instead, need to replace bp with new_bp or otherwise accommodate + # in all internal collections + new_bp = bp._with_value( + override_binds.translate[bp.key], + maintain_key=True, + required=False, + ) + + name = self.bind_names[bp] + self.binds[k] = self.binds[name] = new_bp + self.bind_names[new_bp] = name + self.bind_names.pop(bp, None) + + if bp in self.post_compile_params: + self.post_compile_params |= {new_bp} + if bp in self.literal_execute_params: + self.literal_execute_params |= {new_bp} + + ckbm_tuple = self._cache_key_bind_match + if ckbm_tuple: + ckbm, cksm = ckbm_tuple + for bp in bp._cloned_set: + if bp.key in cksm: + cb = cksm[bp.key] + ckbm[cb].append(new_bp) + + return sqltext + def visit_grouping(self, grouping, asfrom=False, **kwargs): return "(" + grouping.element._compiler_dispatch(self, **kwargs) + ")" @@ -2904,7 +2936,7 @@ def visit_function( **kwargs: Any, ) -> str: if add_to_result_map is not None: - add_to_result_map(func.name, func.name, (), func.type) + add_to_result_map(func.name, func.name, (func.name,), func.type) disp = getattr(self, "visit_%s_func" % func.name.lower(), None) @@ -3614,6 +3646,7 @@ def visit_bindparam( render_postcompile=False, **kwargs, ): + if not skip_bind_expression: impl = bindparam.type.dialect_impl(self.dialect) if impl._has_bind_expression: @@ -4353,6 +4386,11 @@ def _add_to_result_map( objects: Tuple[Any, ...], type_: TypeEngine[Any], ) -> None: + + # note objects must be non-empty for cursor.py to handle the + # collection properly + assert objects + if keyname is None or keyname == "*": self._ordered_columns = False self._ad_hoc_textual = True @@ -4426,7 +4464,7 @@ def _label_select_column( _add_to_result_map = add_to_result_map def add_to_result_map(keyname, name, objects, type_): - _add_to_result_map(keyname, name, (), type_) + _add_to_result_map(keyname, name, (keyname,), type_) # if we redefined col_expr for type expressions, wrap the # callable with one that adds the original column to the targets @@ -5358,13 +5396,22 @@ def _deliver_insertmanyvalues_batches( self, statement: str, parameters: _DBAPIMultiExecuteParams, + compiled_parameters: List[_MutableCoreSingleExecuteParams], generic_setinputsizes: Optional[_GenericSetInputSizesType], batch_size: int, sort_by_parameter_order: bool, + schema_translate_map: Optional[SchemaTranslateMapType], ) -> Iterator[_InsertManyValuesBatch]: imv = self._insertmanyvalues assert imv is not None + if not imv.sentinel_param_keys: + _sentinel_from_params = None + else: + _sentinel_from_params = operator.itemgetter( + *imv.sentinel_param_keys + ) + lenparams = len(parameters) if imv.is_default_expr and not self.dialect.supports_default_metavalue: # backend doesn't support @@ -5396,15 +5443,24 @@ def _deliver_insertmanyvalues_batches( downgraded = False if use_row_at_a_time: - for batchnum, param in enumerate( - cast("Sequence[_DBAPISingleExecuteParams]", parameters), 1 + for batchnum, (param, compiled_param) in enumerate( + cast( + "Sequence[Tuple[_DBAPISingleExecuteParams, _MutableCoreSingleExecuteParams]]", # noqa: E501 + zip(parameters, compiled_parameters), + ), + 1, ): yield _InsertManyValuesBatch( statement, param, generic_setinputsizes, [param], - batch_size, + ( + [_sentinel_from_params(compiled_param)] + if _sentinel_from_params + else [] + ), + 1, batchnum, lenparams, sort_by_parameter_order, @@ -5412,7 +5468,19 @@ def _deliver_insertmanyvalues_batches( ) return - executemany_values = f"({imv.single_values_expr})" + if schema_translate_map: + rst = functools.partial( + self.preparer._render_schema_translates, + schema_translate_map=schema_translate_map, + ) + else: + rst = None + + imv_single_values_expr = imv.single_values_expr + if rst: + imv_single_values_expr = rst(imv_single_values_expr) + + executemany_values = f"({imv_single_values_expr})" statement = statement.replace(executemany_values, "__EXECMANY_TOKEN__") # Use optional insertmanyvalues_max_parameters @@ -5435,7 +5503,10 @@ def _deliver_insertmanyvalues_batches( ), ) - batches = list(parameters) + batches = cast("List[Sequence[Any]]", list(parameters)) + compiled_batches = cast( + "List[Sequence[Any]]", list(compiled_parameters) + ) processed_setinputsizes: Optional[_GenericSetInputSizesType] = None batchnum = 1 @@ -5446,6 +5517,12 @@ def _deliver_insertmanyvalues_batches( insert_crud_params = imv.insert_crud_params assert insert_crud_params is not None + if rst: + insert_crud_params = [ + (col, key, rst(expr), st) + for col, key, expr, st in insert_crud_params + ] + escaped_bind_names: Mapping[str, str] expand_pos_lower_index = expand_pos_upper_index = 0 @@ -5493,10 +5570,10 @@ def apply_placeholders(keys, formatted): if imv.embed_values_counter: executemany_values_w_comma = ( - f"({imv.single_values_expr}, _IMV_VALUES_COUNTER), " + f"({imv_single_values_expr}, _IMV_VALUES_COUNTER), " ) else: - executemany_values_w_comma = f"({imv.single_values_expr}), " + executemany_values_w_comma = f"({imv_single_values_expr}), " all_names_we_will_expand: Set[str] = set() for elem in imv.insert_crud_params: @@ -5529,8 +5606,16 @@ def apply_placeholders(keys, formatted): ) while batches: - batch = cast("Sequence[Any]", batches[0:batch_size]) + batch = batches[0:batch_size] + compiled_batch = compiled_batches[0:batch_size] + batches[0:batch_size] = [] + compiled_batches[0:batch_size] = [] + + if batches: + current_batch_size = batch_size + else: + current_batch_size = len(batch) if generic_setinputsizes: # if setinputsizes is present, expand this collection to @@ -5540,7 +5625,7 @@ def apply_placeholders(keys, formatted): (new_key, len_, typ) for new_key, len_, typ in ( (f"{key}_{index}", len_, typ) - for index in range(len(batch)) + for index in range(current_batch_size) for key, len_, typ in generic_setinputsizes ) ] @@ -5550,6 +5635,9 @@ def apply_placeholders(keys, formatted): num_ins_params = imv.num_positional_params_counted batch_iterator: Iterable[Sequence[Any]] + extra_params_left: Sequence[Any] + extra_params_right: Sequence[Any] + if num_ins_params == len(batch[0]): extra_params_left = extra_params_right = () batch_iterator = batch @@ -5572,7 +5660,7 @@ def apply_placeholders(keys, formatted): )[:-2] else: expanded_values_string = ( - (executemany_values_w_comma * len(batch)) + (executemany_values_w_comma * current_batch_size) )[:-2] if self._numeric_binds and num_ins_params > 0: @@ -5588,7 +5676,7 @@ def apply_placeholders(keys, formatted): assert not extra_params_right start = expand_pos_lower_index + 1 - end = num_ins_params * (len(batch)) + start + end = num_ins_params * (current_batch_size) + start # need to format here, since statement may contain # unescaped %, while values_string contains just (%s, %s) @@ -5638,7 +5726,12 @@ def apply_placeholders(keys, formatted): replaced_parameters, processed_setinputsizes, batch, - batch_size, + ( + [_sentinel_from_params(cb) for cb in compiled_batch] + if _sentinel_from_params + else [] + ), + current_batch_size, batchnum, total_batches, sort_by_parameter_order, @@ -6396,8 +6489,10 @@ def visit_json_getitem_op_binary(self, binary, operator, **kw): def visit_json_path_getitem_op_binary(self, binary, operator, **kw): return self.visit_getitem_binary(binary, operator, **kw) - def visit_sequence(self, seq, **kw): - return "<next sequence value: %s>" % self.preparer.format_sequence(seq) + def visit_sequence(self, sequence, **kw): + return ( + f"<next sequence value: {self.preparer.format_sequence(sequence)}>" + ) def returning_clause( self, @@ -6431,7 +6526,7 @@ def delete_extra_from_clause( for t in extra_froms ) - def visit_empty_set_expr(self, type_, **kw): + def visit_empty_set_expr(self, element_types, **kw): return "SELECT 1 WHERE 1!=1" def get_from_hint_text(self, table, text): @@ -7202,7 +7297,7 @@ def visit_user_defined(self, type_, **kw): class _SchemaForObjectCallable(Protocol): - def __call__(self, obj: Any) -> str: ... + def __call__(self, __obj: Any) -> str: ... class _BindNameForColProtocol(Protocol): diff --git a/libs/sqlalchemy/sql/crud.py b/libs/sqlalchemy/sql/crud.py index 499a19d97..d14266582 100644 --- a/libs/sqlalchemy/sql/crud.py +++ b/libs/sqlalchemy/sql/crud.py @@ -1286,7 +1286,7 @@ def __init__(self, original, index): def compare(self, other, **kw): raise NotImplementedError() - def _copy_internals(self, other, **kw): + def _copy_internals(self, **kw): raise NotImplementedError() def __eq__(self, other): diff --git a/libs/sqlalchemy/sql/ddl.py b/libs/sqlalchemy/sql/ddl.py index d9e3f673a..ab717e2b3 100644 --- a/libs/sqlalchemy/sql/ddl.py +++ b/libs/sqlalchemy/sql/ddl.py @@ -470,8 +470,8 @@ class CreateSchema(_CreateBase): def __init__( self, - name, - if_not_exists=False, + name: str, + if_not_exists: bool = False, ): """Create a new :class:`.CreateSchema` construct.""" @@ -491,9 +491,9 @@ class DropSchema(_DropBase): def __init__( self, - name, - cascade=False, - if_exists=False, + name: str, + cascade: bool = False, + if_exists: bool = False, ): """Create a new :class:`.DropSchema` construct.""" diff --git a/libs/sqlalchemy/sql/elements.py b/libs/sqlalchemy/sql/elements.py index e8131994b..45c1674d9 100644 --- a/libs/sqlalchemy/sql/elements.py +++ b/libs/sqlalchemy/sql/elements.py @@ -14,7 +14,7 @@ from __future__ import annotations from decimal import Decimal -from enum import IntEnum +from enum import Enum import itertools import operator import re @@ -77,12 +77,14 @@ from ..util import HasMemoized_ro_memoized_attribute from ..util import TypingOnly from ..util.typing import Literal +from ..util.typing import ParamSpec from ..util.typing import Self if typing.TYPE_CHECKING: from ._typing import _ByArgument from ._typing import _ColumnExpressionArgument from ._typing import _ColumnExpressionOrStrLabelArgument + from ._typing import _HasDialect from ._typing import _InfoType from ._typing import _PropagateAttrsType from ._typing import _TypeEngineArgument @@ -104,9 +106,9 @@ from .type_api import TypeEngine from .visitors import _CloneCallableType from .visitors import _TraverseInternalsType + from .visitors import anon_map from ..engine import Connection from ..engine import Dialect - from ..engine import Engine from ..engine.interfaces import _CoreMultiExecuteParams from ..engine.interfaces import CacheStats from ..engine.interfaces import CompiledCacheType @@ -243,7 +245,7 @@ class CompilerElement(Visitable): @util.preload_module("sqlalchemy.engine.url") def compile( self, - bind: Optional[Union[Engine, Connection]] = None, + bind: Optional[_HasDialect] = None, dialect: Optional[Dialect] = None, **kw: Any, ) -> Compiled: @@ -775,7 +777,7 @@ def _compiler(self, dialect: Dialect, **kw: Any) -> SQLCompiler: def compile( # noqa: A001 self, - bind: Optional[Union[Engine, Connection]] = None, + bind: Optional[_HasDialect] = None, dialect: Optional[Dialect] = None, **kw: Any, ) -> SQLCompiler: ... @@ -1064,6 +1066,9 @@ def __add__( other: Any, ) -> ColumnElement[str]: ... + @overload + def __add__(self, other: Any) -> ColumnElement[Any]: ... + def __add__(self, other: Any) -> ColumnElement[Any]: ... @overload @@ -1425,13 +1430,11 @@ def _non_anon_label(self) -> Optional[str]: _alt_names: Sequence[str] = () @overload - def self_group( - self: ColumnElement[_T], against: Optional[OperatorType] = None - ) -> ColumnElement[_T]: ... + def self_group(self, against: None = None) -> ColumnElement[_T]: ... @overload def self_group( - self: ColumnElement[Any], against: Optional[OperatorType] = None + self, against: Optional[OperatorType] = None ) -> ColumnElement[Any]: ... def self_group( @@ -1910,8 +1913,9 @@ class BindParameter(roles.InElementRole, KeyedColumnElement[_T]): from sqlalchemy import bindparam - stmt = select(users_table).\ - where(users_table.c.name == bindparam('username')) + stmt = select(users_table).where( + users_table.c.name == bindparam("username") + ) Detailed discussion of how :class:`.BindParameter` is used is at :func:`.bindparam`. @@ -2576,7 +2580,9 @@ def comparator(self): # be using this method. return self.type.comparator_factory(self) # type: ignore - def self_group(self, against=None): + def self_group( + self, against: Optional[OperatorType] = None + ) -> Union[Self, Grouping[Any]]: if against is operators.in_op: return Grouping(self) else: @@ -2781,7 +2787,9 @@ def append(self, clause): def _from_objects(self) -> List[FromClause]: return list(itertools.chain(*[c._from_objects for c in self.clauses])) - def self_group(self, against=None): + def self_group( + self, against: Optional[OperatorType] = None + ) -> Union[Self, Grouping[Any]]: if self.group and operators.is_precedent(self.operator, against): return Grouping(self) else: @@ -2804,7 +2812,9 @@ class OperatorExpression(ColumnElement[_T]): def is_comparison(self): return operators.is_comparison(self.operator) - def self_group(self, against=None): + def self_group( + self, against: Optional[OperatorType] = None + ) -> Union[Self, Grouping[_T]]: if ( self.group and operators.is_precedent(self.operator, against) @@ -3164,7 +3174,9 @@ def or_( def _select_iterable(self) -> _SelectIterable: return (self,) - def self_group(self, against=None): + def self_group( + self, against: Optional[OperatorType] = None + ) -> Union[Self, Grouping[bool]]: if not self.clauses: return self else: @@ -3247,7 +3259,7 @@ def _bind_param(self, operator, obj, type_=None, expanding=False): ] ) - def self_group(self, against=None): + def self_group(self, against: Optional[OperatorType] = None) -> Self: # Tuple is parenthesized by definition. return self @@ -3480,7 +3492,9 @@ def typed_expression(self): def wrapped_column_expression(self): return self.clause - def self_group(self, against=None): + def self_group( + self, against: Optional[OperatorType] = None + ) -> TypeCoerce[_T]: grouped = self.clause.self_group(against=against) if grouped is not self.clause: return TypeCoerce(grouped, self.type) @@ -3675,7 +3689,7 @@ def _create_bitwise_not( @property def _order_by_label_element(self) -> Optional[Label[Any]]: - if self.modifier in (operators.desc_op, operators.asc_op): + if operators.is_order_by_modifier(self.modifier): return self.element._order_by_label_element else: return None @@ -3695,7 +3709,9 @@ def _negate(self): else: return ClauseElement._negate(self) - def self_group(self, against=None): + def self_group( + self, against: Optional[OperatorType] = None + ) -> Union[Self, Grouping[_T]]: if self.operator and operators.is_precedent(self.operator, against): return Grouping(self) else: @@ -3782,7 +3798,7 @@ def __init__(self, element, operator, negate): def wrapped_column_expression(self): return self.element - def self_group(self, against=None): + def self_group(self, against: Optional[OperatorType] = None) -> Self: return self def _negate(self): @@ -3982,7 +3998,7 @@ def __init__(self, start, stop, step, _name=None): ) self.type = type_api.NULLTYPE - def self_group(self, against=None): + def self_group(self, against: Optional[OperatorType] = None) -> Self: assert against is operator.getitem return self @@ -4001,7 +4017,7 @@ class GroupedElement(DQLDMLClauseElement): element: ClauseElement - def self_group(self, against=None): + def self_group(self, against: Optional[OperatorType] = None) -> Self: return self def _ungroup(self): @@ -4065,8 +4081,65 @@ def __setstate__(self, state): self.element = state["element"] self.type = state["type"] + if TYPE_CHECKING: + + def self_group( + self, against: Optional[OperatorType] = None + ) -> Self: ... + + +class _OverrideBinds(Grouping[_T]): + """used by cache_key->_apply_params_to_element to allow compilation / + execution of a SQL element that's been cached, using an alternate set of + bound parameter values. + + This is used by the ORM to swap new parameter values into expressions + that are embedded into loader options like with_expression(), + selectinload(). Previously, this task was accomplished using the + .params() method which would perform a deep-copy instead. This deep + copy proved to be too expensive for more complex expressions. + + See #11085 + + """ + + __visit_name__ = "override_binds" + + def __init__( + self, + element: ColumnElement[_T], + bindparams: Sequence[BindParameter[Any]], + replaces_params: Sequence[BindParameter[Any]], + ): + self.element = element + self.translate = { + k.key: v.value for k, v in zip(replaces_params, bindparams) + } + + def _gen_cache_key( + self, anon_map: anon_map, bindparams: List[BindParameter[Any]] + ) -> Optional[typing_Tuple[Any, ...]]: + """generate a cache key for the given element, substituting its bind + values for the translation values present.""" + + existing_bps: List[BindParameter[Any]] = [] + ck = self.element._gen_cache_key(anon_map, existing_bps) + + bindparams.extend( + ( + bp._with_value( + self.translate[bp.key], maintain_key=True, required=False + ) + if bp.key in self.translate + else bp + ) + for bp in existing_bps + ) + + return ck + -class _OverRange(IntEnum): +class _OverRange(Enum): RANGE_UNBOUNDED = 0 RANGE_CURRENT = 1 @@ -4074,6 +4147,8 @@ class _OverRange(IntEnum): RANGE_UNBOUNDED = _OverRange.RANGE_UNBOUNDED RANGE_CURRENT = _OverRange.RANGE_CURRENT +_IntOrRange = Union[int, _OverRange] + class Over(ColumnElement[_T]): """Represent an OVER clause. @@ -4102,7 +4177,8 @@ class Over(ColumnElement[_T]): """The underlying expression object to which this :class:`.Over` object refers.""" - range_: Optional[typing_Tuple[int, int]] + range_: Optional[typing_Tuple[_IntOrRange, _IntOrRange]] + rows: Optional[typing_Tuple[_IntOrRange, _IntOrRange]] def __init__( self, @@ -4147,19 +4223,24 @@ def __reduce__(self): ) def _interpret_range( - self, range_: typing_Tuple[Optional[int], Optional[int]] - ) -> typing_Tuple[int, int]: + self, + range_: typing_Tuple[Optional[_IntOrRange], Optional[_IntOrRange]], + ) -> typing_Tuple[_IntOrRange, _IntOrRange]: if not isinstance(range_, tuple) or len(range_) != 2: raise exc.ArgumentError("2-tuple expected for range/rows") - lower: int - upper: int + r0, r1 = range_ + + lower: _IntOrRange + upper: _IntOrRange - if range_[0] is None: + if r0 is None: lower = RANGE_UNBOUNDED + elif isinstance(r0, _OverRange): + lower = r0 else: try: - lower = int(range_[0]) + lower = int(r0) except ValueError as err: raise exc.ArgumentError( "Integer or None expected for range value" @@ -4168,11 +4249,13 @@ def _interpret_range( if lower == 0: lower = RANGE_CURRENT - if range_[1] is None: + if r1 is None: upper = RANGE_UNBOUNDED + elif isinstance(r1, _OverRange): + upper = r1 else: try: - upper = int(range_[1]) + upper = int(r1) except ValueError as err: raise exc.ArgumentError( "Integer or None expected for range value" @@ -4230,7 +4313,7 @@ class WithinGroup(ColumnElement[_T]): def __init__( self, - element: FunctionElement[_T], + element: Union[FunctionElement[_T], FunctionFilter[_T]], *order_by: _ColumnExpressionArgument[Any], ): self.element = element @@ -4244,7 +4327,14 @@ def __reduce__(self): tuple(self.order_by) if self.order_by is not None else () ) - def over(self, partition_by=None, order_by=None, range_=None, rows=None): + def over( + self, + *, + partition_by: Optional[_ByArgument] = None, + order_by: Optional[_ByArgument] = None, + rows: Optional[typing_Tuple[Optional[int], Optional[int]]] = None, + range_: Optional[typing_Tuple[Optional[int], Optional[int]]] = None, + ) -> Over[_T]: """Produce an OVER clause against this :class:`.WithinGroup` construct. @@ -4260,6 +4350,24 @@ def over(self, partition_by=None, order_by=None, range_=None, rows=None): rows=rows, ) + @overload + def filter(self) -> Self: ... + + @overload + def filter( + self, + __criterion0: _ColumnExpressionArgument[bool], + *criterion: _ColumnExpressionArgument[bool], + ) -> FunctionFilter[_T]: ... + + def filter( + self, *criterion: _ColumnExpressionArgument[bool] + ) -> Union[Self, FunctionFilter[_T]]: + """Produce a FILTER clause against this function.""" + if not criterion: + return self + return FunctionFilter(self, *criterion) + if not TYPE_CHECKING: @util.memoized_property @@ -4283,7 +4391,7 @@ def _from_objects(self) -> List[FromClause]: ) -class FunctionFilter(ColumnElement[_T]): +class FunctionFilter(Generative, ColumnElement[_T]): """Represent a function FILTER clause. This is a special operator against aggregate and window functions, @@ -4312,12 +4420,13 @@ class FunctionFilter(ColumnElement[_T]): def __init__( self, - func: FunctionElement[_T], + func: Union[FunctionElement[_T], WithinGroup[_T]], *criterion: _ColumnExpressionArgument[bool], ): self.func = func - self.filter(*criterion) + self.filter.non_generative(self, *criterion) # type: ignore + @_generative def filter(self, *criterion: _ColumnExpressionArgument[bool]) -> Self: """Produce an additional FILTER against the function. @@ -4382,6 +4491,19 @@ def over( rows=rows, ) + def within_group( + self, *order_by: _ColumnExpressionArgument[Any] + ) -> WithinGroup[_T]: + """Produce a WITHIN GROUP (ORDER BY expr) clause against + this function. + """ + return WithinGroup(self, *order_by) + + def within_group_type( + self, within_group: WithinGroup[_T] + ) -> Optional[TypeEngine[_T]]: + return None + def self_group( self, against: Optional[OperatorType] = None ) -> Union[Self, Grouping[_T]]: @@ -4514,6 +4636,9 @@ def _make_proxy( return c.key, c +_PS = ParamSpec("_PS") + + class Label(roles.LabeledColumnExprRole[_T], NamedColumn[_T]): """Represents a column label (AS). @@ -4611,13 +4736,18 @@ def _order_by_label_element(self): def element(self) -> ColumnElement[_T]: return self._element.self_group(against=operators.as_) - def self_group(self, against=None): + def self_group(self, against: Optional[OperatorType] = None) -> Label[_T]: return self._apply_to_inner(self._element.self_group, against=against) def _negate(self): return self._apply_to_inner(self._element._negate) - def _apply_to_inner(self, fn, *arg, **kw): + def _apply_to_inner( + self, + fn: Callable[_PS, ColumnElement[_T]], + *arg: _PS.args, + **kw: _PS.kwargs, + ) -> Label[_T]: sub_element = fn(*arg, **kw) if sub_element is not self._element: return Label(self.name, sub_element, type_=self.type) @@ -4978,15 +5108,25 @@ class CollationClause(ColumnElement[str]): ] @classmethod + @util.preload_module("sqlalchemy.sql.sqltypes") def _create_collation_expression( cls, expression: _ColumnExpressionArgument[str], collation: str ) -> BinaryExpression[str]: + + sqltypes = util.preloaded.sql_sqltypes + expr = coercions.expect(roles.ExpressionElementRole[str], expression) + + if expr.type._type_affinity is sqltypes.String: + collate_type = expr.type._with_collation(collation) + else: + collate_type = expr.type + return BinaryExpression( expr, CollationClause(collation), operators.collate, - type_=expr.type, + type_=collate_type, ) def __init__(self, collation): @@ -5175,7 +5315,14 @@ def __init__(self, element, values): def _with_annotations(self, values): clone = super()._with_annotations(values) - clone.__dict__.pop("comparator", None) + for attr in ( + "comparator", + "_proxy_key", + "_tq_key_label", + "_tq_label", + "_non_anon_label", + ): + clone.__dict__.pop(attr, None) return clone @util.memoized_property diff --git a/libs/sqlalchemy/sql/functions.py b/libs/sqlalchemy/sql/functions.py index afb2b1d9b..8ef7f75bc 100644 --- a/libs/sqlalchemy/sql/functions.py +++ b/libs/sqlalchemy/sql/functions.py @@ -69,6 +69,7 @@ from ._typing import _ColumnExpressionArgument from ._typing import _ColumnExpressionOrLiteralArgument from ._typing import _ColumnExpressionOrStrLabelArgument + from ._typing import _StarOrOne from ._typing import _TypeEngineArgument from .base import _EntityNamespace from .elements import ClauseElement @@ -1721,7 +1722,9 @@ class count(GenericFunction[int]): def __init__( self, - expression: Optional[_ColumnExpressionArgument[Any]] = None, + expression: Union[ + _ColumnExpressionArgument[Any], _StarOrOne, None + ] = None, **kwargs: Any, ): if expression is None: diff --git a/libs/sqlalchemy/sql/lambdas.py b/libs/sqlalchemy/sql/lambdas.py index 726fa2411..7a6b7b8f7 100644 --- a/libs/sqlalchemy/sql/lambdas.py +++ b/libs/sqlalchemy/sql/lambdas.py @@ -437,7 +437,7 @@ class DeferredLambdaElement(LambdaElement): def __init__( self, - fn: _LambdaType, + fn: _AnyLambdaType, role: Type[roles.SQLRole], opts: Union[Type[LambdaOptions], LambdaOptions] = LambdaOptions, lambda_args: Tuple[Any, ...] = (), diff --git a/libs/sqlalchemy/sql/operators.py b/libs/sqlalchemy/sql/operators.py index 9fb096e47..5939f1249 100644 --- a/libs/sqlalchemy/sql/operators.py +++ b/libs/sqlalchemy/sql/operators.py @@ -2474,6 +2474,12 @@ def is_associative(op: OperatorType) -> bool: return op in _associative +def is_order_by_modifier(op: Optional[OperatorType]) -> bool: + return op in _order_by_modifier + + +_order_by_modifier = {desc_op, asc_op, nulls_first_op, nulls_last_op} + _natural_self_precedent = _associative.union( [getitem, json_getitem_op, json_path_getitem_op] ) diff --git a/libs/sqlalchemy/sql/schema.py b/libs/sqlalchemy/sql/schema.py index 2932fffad..65c12b308 100644 --- a/libs/sqlalchemy/sql/schema.py +++ b/libs/sqlalchemy/sql/schema.py @@ -60,6 +60,7 @@ from . import type_api from . import visitors from .base import _DefaultDescriptionTuple +from .base import _NoArg from .base import _NoneName from .base import _SentinelColumnCharacterization from .base import _SentinelDefaultCharacterization @@ -76,7 +77,6 @@ from .selectable import TableClause from .type_api import to_instance from .visitors import ExternallyTraversible -from .visitors import InternalTraversal from .. import event from .. import exc from .. import inspection @@ -100,7 +100,6 @@ from .elements import BindParameter from .functions import Function from .type_api import TypeEngine - from .visitors import _TraverseInternalsType from .visitors import anon_map from ..engine import Connection from ..engine import Engine @@ -124,6 +123,8 @@ "FetchedValue", str, TextClause, ColumnElement[Any] ] +_ServerOnUpdateArgument = _ServerDefaultArgument + class SchemaConst(Enum): RETAIN_SCHEMA = 1 @@ -391,11 +392,6 @@ def foreign_keys(self) -> Set[ForeignKey]: ... """ - _traverse_internals: _TraverseInternalsType = ( - TableClause._traverse_internals - + [("schema", InternalTraversal.dp_string)] - ) - if TYPE_CHECKING: @util.ro_non_memoized_property @@ -1438,7 +1434,7 @@ def referred_schema_fn(table, to_schema, args = [] for col in self.columns: - args.append(col._copy(schema=actual_schema)) + args.append(col._copy(schema=actual_schema, _to_metadata=metadata)) table = Table( name, metadata, @@ -1514,7 +1510,8 @@ def __init__( name: Optional[str] = None, type_: Optional[_TypeEngineArgument[_T]] = None, autoincrement: _AutoIncrementType = "auto", - default: Optional[Any] = None, + default: Optional[Any] = _NoArg.NO_ARG, + insert_default: Optional[Any] = _NoArg.NO_ARG, doc: Optional[str] = None, key: Optional[str] = None, index: Optional[bool] = None, @@ -1526,7 +1523,7 @@ def __init__( onupdate: Optional[Any] = None, primary_key: bool = False, server_default: Optional[_ServerDefaultArgument] = None, - server_onupdate: Optional[FetchedValue] = None, + server_onupdate: Optional[_ServerOnUpdateArgument] = None, quote: Optional[bool] = None, system: bool = False, comment: Optional[str] = None, @@ -1751,6 +1748,11 @@ def __init__( :ref:`metadata_defaults_toplevel` + :param insert_default: An alias of :paramref:`.Column.default` + for compatibility with :func:`_orm.mapped_column`. + + .. versionadded: 2.0.31 + :param doc: optional String that can be used by the ORM or similar to document attributes on the Python side. This attribute does **not** render SQL comments; use the @@ -2104,12 +2106,19 @@ def __init__( # otherwise, add DDL-related events self._set_type(self.type) - if default is not None: - if not isinstance(default, (ColumnDefault, Sequence)): - default = ColumnDefault(default) + if insert_default is not _NoArg.NO_ARG: + resolved_default = insert_default + elif default is not _NoArg.NO_ARG: + resolved_default = default + else: + resolved_default = None + + if resolved_default is not None: + if not isinstance(resolved_default, (ColumnDefault, Sequence)): + resolved_default = ColumnDefault(resolved_default) - self.default = default - l_args.append(default) + self.default = resolved_default + l_args.append(resolved_default) else: self.default = None @@ -2466,6 +2475,8 @@ def _copy(self, **kw: Any) -> Column[Any]: server_onupdate = self.server_onupdate if isinstance(server_default, (Computed, Identity)): # TODO: likely should be copied in all cases + # TODO: if a Sequence, we would need to transfer the Sequence + # .metadata as well args.append(server_default._copy(**kw)) server_default = server_onupdate = None @@ -2569,8 +2580,11 @@ def _merge(self, other: Column[Any]) -> None: new_onupdate = self.onupdate._copy() new_onupdate._set_parent(other) - if self.index and not other.index: - other.index = True + if self.index in (True, False) and other.index is None: + other.index = self.index + + if self.unique in (True, False) and other.unique is None: + other.unique = self.unique if self.doc and other.doc is None: other.doc = self.doc @@ -2578,9 +2592,6 @@ def _merge(self, other: Column[Any]) -> None: if self.comment and other.comment is None: other.comment = self.comment - if self.unique and not other.unique: - other.unique = True - for const in self.constraints: if not const._type_bound: new_const = const._copy() @@ -5616,6 +5627,38 @@ def sorted_tables(self) -> List[Table]: sorted(self.tables.values(), key=lambda t: t.key) # type: ignore ) + # overload needed to work around mypy this mypy + # https://github.com/python/mypy/issues/17093 + @overload + def reflect( + self, + bind: Engine, + schema: Optional[str] = ..., + views: bool = ..., + only: Union[ + _typing_Sequence[str], Callable[[str, MetaData], bool], None + ] = ..., + extend_existing: bool = ..., + autoload_replace: bool = ..., + resolve_fks: bool = ..., + **dialect_kwargs: Any, + ) -> None: ... + + @overload + def reflect( + self, + bind: Connection, + schema: Optional[str] = ..., + views: bool = ..., + only: Union[ + _typing_Sequence[str], Callable[[str, MetaData], bool], None + ] = ..., + extend_existing: bool = ..., + autoload_replace: bool = ..., + resolve_fks: bool = ..., + **dialect_kwargs: Any, + ) -> None: ... + @util.preload_module("sqlalchemy.engine.reflection") def reflect( self, diff --git a/libs/sqlalchemy/sql/selectable.py b/libs/sqlalchemy/sql/selectable.py index 65978f664..c6aa8a188 100644 --- a/libs/sqlalchemy/sql/selectable.py +++ b/libs/sqlalchemy/sql/selectable.py @@ -473,14 +473,25 @@ class HasHints: ("_hints", InternalTraversal.dp_table_hint_list), ] + @_generative def with_statement_hint(self, text: str, dialect_name: str = "*") -> Self: """Add a statement hint to this :class:`_expression.Select` or other selectable object. - This method is similar to :meth:`_expression.Select.with_hint` - except that - it does not require an individual table, and instead applies to the - statement as a whole. + .. tip:: + + :meth:`_expression.Select.with_statement_hint` generally adds hints + **at the trailing end** of a SELECT statement. To place + dialect-specific hints such as optimizer hints at the **front** of + the SELECT statement after the SELECT keyword, use the + :meth:`_expression.Select.prefix_with` method for an open-ended + space, or for table-specific hints the + :meth:`_expression.Select.with_hint` may be used, which places + hints in a dialect-specific location. + + This method is similar to :meth:`_expression.Select.with_hint` except + that it does not require an individual table, and instead applies to + the statement as a whole. Hints here are specific to the backend database and may include directives such as isolation levels, file directives, fetch directives, @@ -492,7 +503,7 @@ def with_statement_hint(self, text: str, dialect_name: str = "*") -> Self: :meth:`_expression.Select.prefix_with` - generic SELECT prefixing which also can suit some database-specific HINT syntaxes such as - MySQL optimizer hints + MySQL or Oracle optimizer hints """ return self._with_hint(None, text, dialect_name) @@ -508,6 +519,17 @@ def with_hint( selectable to this :class:`_expression.Select` or other selectable object. + .. tip:: + + The :meth:`_expression.Select.with_hint` method adds hints that are + **specific to a single table** to a statement, in a location that + is **dialect-specific**. To add generic optimizer hints to the + **beginning** of a statement ahead of the SELECT keyword such as + for MySQL or Oracle, use the :meth:`_expression.Select.prefix_with` + method. To add optimizer hints to the **end** of a statement such + as for PostgreSQL, use the + :meth:`_expression.Select.with_statement_hint` method. + The text of the hint is rendered in the appropriate location for the database backend in use, relative to the given :class:`_schema.Table` or :class:`_expression.Alias` @@ -537,6 +559,10 @@ def with_hint( :meth:`_expression.Select.with_statement_hint` + :meth:`_expression.Select.prefix_with` - generic SELECT prefixing + which also can suit some database-specific HINT syntaxes such as + MySQL or Oracle optimizer hints + """ return self._with_hint(selectable, text, dialect_name) @@ -1242,7 +1268,6 @@ def is_derived_from(self, fromclause: Optional[FromClause]) -> bool: def self_group( self, against: Optional[OperatorType] = None ) -> FromGrouping: - ... return FromGrouping(self) @util.preload_module("sqlalchemy.sql.util") @@ -1517,11 +1542,23 @@ def _anonymous_fromclause( ) -> TODO_Any: sqlutil = util.preloaded.sql_util if flat: - if name is not None: - raise exc.ArgumentError("Can't send name argument with flat") + if isinstance(self.left, (FromGrouping, Join)): + left_name = name # will recurse + else: + if name and isinstance(self.left, NamedFromClause): + left_name = f"{name}_{self.left.name}" + else: + left_name = name + if isinstance(self.right, (FromGrouping, Join)): + right_name = name # will recurse + else: + if name and isinstance(self.right, NamedFromClause): + right_name = f"{name}_{self.right.name}" + else: + right_name = name left_a, right_a = ( - self.left._anonymous_fromclause(flat=True), - self.right._anonymous_fromclause(flat=True), + self.left._anonymous_fromclause(name=left_name, flat=flat), + self.right._anonymous_fromclause(name=right_name, flat=flat), ) adapter = sqlutil.ClauseAdapter(left_a).chain( sqlutil.ClauseAdapter(right_a) @@ -2889,6 +2926,12 @@ def __getstate__(self) -> Dict[str, FromClause]: def __setstate__(self, state: Dict[str, FromClause]) -> None: self.element = state["element"] + if TYPE_CHECKING: + + def self_group( + self, against: Optional[OperatorType] = None + ) -> Self: ... + class NamedFromGrouping(FromGrouping, NamedFromClause): """represent a grouping of a named FROM clause @@ -2899,6 +2942,12 @@ class NamedFromGrouping(FromGrouping, NamedFromClause): inherit_cache = True + if TYPE_CHECKING: + + def self_group( + self, against: Optional[OperatorType] = None + ) -> Self: ... + class TableClause(roles.DMLTableRole, Immutable, NamedFromClause): """Represents a minimal "table" construct. @@ -3070,6 +3119,7 @@ class ForUpdateArg(ClauseElement): ("nowait", InternalTraversal.dp_boolean), ("read", InternalTraversal.dp_boolean), ("skip_locked", InternalTraversal.dp_boolean), + ("key_share", InternalTraversal.dp_boolean), ] of: Optional[Sequence[ClauseElement]] @@ -3312,6 +3362,12 @@ def _column_types(self) -> List[TypeEngine[Any]]: def __clause_element__(self) -> ScalarValues: return self + if TYPE_CHECKING: + + def self_group( + self, against: Optional[OperatorType] = None + ) -> Self: ... + class SelectBase( roles.SelectStatementRole, @@ -3651,7 +3707,7 @@ class SelectStatementGrouping(GroupedElement, SelectBase, Generic[_SB]): __visit_name__ = "select_statement_grouping" _traverse_internals: _TraverseInternalsType = [ ("element", InternalTraversal.dp_clauseelement) - ] + ] + SupportsCloneAnnotations._clone_annotations_traverse_internals _is_select_container = True @@ -3684,7 +3740,6 @@ def select_statement(self) -> _SB: return self.element def self_group(self, against: Optional[OperatorType] = None) -> Self: - ... return self if TYPE_CHECKING: @@ -3732,6 +3787,10 @@ def selected_columns(self) -> ColumnCollection[str, ColumnElement[Any]]: def _from_objects(self) -> List[FromClause]: return self.element._from_objects + def add_cte(self, *ctes: CTE, nest_here: bool = False) -> Self: + # SelectStatementGrouping not generative: has no attribute '_generate' + raise NotImplementedError + class GenerativeSelect(SelectBase, Generative): """Base class for SELECT statements where additional elements can be @@ -3840,7 +3899,7 @@ def set_label_style(self, style: SelectLabelStyle) -> Self: :attr:`_sql.SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY`, :attr:`_sql.SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL`, and :attr:`_sql.SelectLabelStyle.LABEL_STYLE_NONE`. The default style is - :attr:`_sql.SelectLabelStyle.LABEL_STYLE_TABLENAME_PLUS_COL`. + :attr:`_sql.SelectLabelStyle.LABEL_STYLE_DISAMBIGUATE_ONLY`. In modern SQLAlchemy, there is not generally a need to change the labeling style, as per-expression labels are more effectively used by @@ -4101,7 +4160,7 @@ def slice( For example, :: - stmt = select(User).order_by(User).id.slice(1, 3) + stmt = select(User).order_by(User.id).slice(1, 3) renders as @@ -4277,17 +4336,21 @@ class CompoundSelect(HasCompileState, GenerativeSelect, ExecutableReturnsRows): __visit_name__ = "compound_select" - _traverse_internals: _TraverseInternalsType = [ - ("selects", InternalTraversal.dp_clauseelement_list), - ("_limit_clause", InternalTraversal.dp_clauseelement), - ("_offset_clause", InternalTraversal.dp_clauseelement), - ("_fetch_clause", InternalTraversal.dp_clauseelement), - ("_fetch_clause_options", InternalTraversal.dp_plain_dict), - ("_order_by_clauses", InternalTraversal.dp_clauseelement_list), - ("_group_by_clauses", InternalTraversal.dp_clauseelement_list), - ("_for_update_arg", InternalTraversal.dp_clauseelement), - ("keyword", InternalTraversal.dp_string), - ] + SupportsCloneAnnotations._clone_annotations_traverse_internals + _traverse_internals: _TraverseInternalsType = ( + [ + ("selects", InternalTraversal.dp_clauseelement_list), + ("_limit_clause", InternalTraversal.dp_clauseelement), + ("_offset_clause", InternalTraversal.dp_clauseelement), + ("_fetch_clause", InternalTraversal.dp_clauseelement), + ("_fetch_clause_options", InternalTraversal.dp_plain_dict), + ("_order_by_clauses", InternalTraversal.dp_clauseelement_list), + ("_group_by_clauses", InternalTraversal.dp_clauseelement_list), + ("_for_update_arg", InternalTraversal.dp_clauseelement), + ("keyword", InternalTraversal.dp_string), + ] + + SupportsCloneAnnotations._clone_annotations_traverse_internals + + HasCTE._has_ctes_traverse_internals + ) selects: List[SelectBase] @@ -4547,6 +4610,7 @@ def _column_naming_convention( cls, label_style: SelectLabelStyle ) -> _LabelConventionCallable: table_qualified = label_style is LABEL_STYLE_TABLENAME_PLUS_COL + dedupe = label_style is not LABEL_STYLE_NONE pa = prefix_anon_map() @@ -5755,22 +5819,33 @@ def reduce_columns(self, only_synonyms: bool = True) -> Select[Any]: ) return woc - # START OVERLOADED FUNCTIONS self.with_only_columns Select 8 + # START OVERLOADED FUNCTIONS self.with_only_columns Select 1-8 ", *, maintain_column_froms: bool =..." # noqa: E501 # code within this block is **programmatically, - # statically generated** by tools/generate_sel_v1_overloads.py + # statically generated** by tools/generate_tuple_map_overloads.py @overload - def with_only_columns(self, __ent0: _TCCA[_T0]) -> Select[Tuple[_T0]]: ... + def with_only_columns( + self, __ent0: _TCCA[_T0], *, maintain_column_froms: bool = ... + ) -> Select[Tuple[_T0]]: ... @overload def with_only_columns( - self, __ent0: _TCCA[_T0], __ent1: _TCCA[_T1] + self, + __ent0: _TCCA[_T0], + __ent1: _TCCA[_T1], + *, + maintain_column_froms: bool = ..., ) -> Select[Tuple[_T0, _T1]]: ... @overload def with_only_columns( - self, __ent0: _TCCA[_T0], __ent1: _TCCA[_T1], __ent2: _TCCA[_T2] + self, + __ent0: _TCCA[_T0], + __ent1: _TCCA[_T1], + __ent2: _TCCA[_T2], + *, + maintain_column_froms: bool = ..., ) -> Select[Tuple[_T0, _T1, _T2]]: ... @overload @@ -5780,6 +5855,8 @@ def with_only_columns( __ent1: _TCCA[_T1], __ent2: _TCCA[_T2], __ent3: _TCCA[_T3], + *, + maintain_column_froms: bool = ..., ) -> Select[Tuple[_T0, _T1, _T2, _T3]]: ... @overload @@ -5790,6 +5867,8 @@ def with_only_columns( __ent2: _TCCA[_T2], __ent3: _TCCA[_T3], __ent4: _TCCA[_T4], + *, + maintain_column_froms: bool = ..., ) -> Select[Tuple[_T0, _T1, _T2, _T3, _T4]]: ... @overload @@ -5801,6 +5880,8 @@ def with_only_columns( __ent3: _TCCA[_T3], __ent4: _TCCA[_T4], __ent5: _TCCA[_T5], + *, + maintain_column_froms: bool = ..., ) -> Select[Tuple[_T0, _T1, _T2, _T3, _T4, _T5]]: ... @overload @@ -5813,6 +5894,8 @@ def with_only_columns( __ent4: _TCCA[_T4], __ent5: _TCCA[_T5], __ent6: _TCCA[_T6], + *, + maintain_column_froms: bool = ..., ) -> Select[Tuple[_T0, _T1, _T2, _T3, _T4, _T5, _T6]]: ... @overload @@ -5826,6 +5909,8 @@ def with_only_columns( __ent5: _TCCA[_T5], __ent6: _TCCA[_T6], __ent7: _TCCA[_T7], + *, + maintain_column_froms: bool = ..., ) -> Select[Tuple[_T0, _T1, _T2, _T3, _T4, _T5, _T6, _T7]]: ... # END OVERLOADED FUNCTIONS self.with_only_columns @@ -5972,11 +6057,26 @@ def having(self, *having: _ColumnExpressionArgument[bool]) -> Self: @_generative def distinct(self, *expr: _ColumnExpressionArgument[Any]) -> Self: r"""Return a new :func:`_expression.select` construct which - will apply DISTINCT to its columns clause. + will apply DISTINCT to the SELECT statement overall. + + E.g.:: + + from sqlalchemy import select + stmt = select(users_table.c.id, users_table.c.name).distinct() + + The above would produce an statement resembling:: + + SELECT DISTINCT user.id, user.name FROM user + + The method also accepts an ``*expr`` parameter which produces the + PostgreSQL dialect-specific ``DISTINCT ON`` expression. Using this + parameter on other backends which don't support this syntax will + raise an error. :param \*expr: optional column expressions. When present, - the PostgreSQL dialect will render a ``DISTINCT ON (<expressions>>)`` - construct. + the PostgreSQL dialect will render a ``DISTINCT ON (<expressions>)`` + construct. A deprecation warning and/or :class:`_exc.CompileError` + will be raised on other backends. .. deprecated:: 1.4 Using \*expr in other dialects is deprecated and will raise :class:`_exc.CompileError` in a future version. @@ -6308,7 +6408,6 @@ def _needs_parens_for_grouping(self) -> bool: def self_group( self, against: Optional[OperatorType] = None ) -> Union[SelectStatementGrouping[Self], Self]: - ... """Return a 'grouping' construct as per the :class:`_expression.ClauseElement` specification. @@ -6500,19 +6599,7 @@ def where(self, crit: _ColumnExpressionArgument[bool]) -> Self: self.element = cast("Select[Any]", self.element).where(crit) return self - @overload - def self_group( - self: ScalarSelect[Any], against: Optional[OperatorType] = None - ) -> ScalarSelect[Any]: ... - - @overload - def self_group( - self: ColumnElement[Any], against: Optional[OperatorType] = None - ) -> ColumnElement[Any]: ... - - def self_group( - self, against: Optional[OperatorType] = None - ) -> ColumnElement[Any]: + def self_group(self, against: Optional[OperatorType] = None) -> Self: return self if TYPE_CHECKING: @@ -6648,7 +6735,7 @@ def _regroup( assert isinstance(return_value, SelectStatementGrouping) return return_value - def select(self) -> Select[Any]: + def select(self) -> Select[Tuple[bool]]: r"""Return a SELECT of this :class:`_expression.Exists`. e.g.:: @@ -6771,10 +6858,14 @@ class was renamed _label_style = LABEL_STYLE_NONE - _traverse_internals: _TraverseInternalsType = [ - ("element", InternalTraversal.dp_clauseelement), - ("column_args", InternalTraversal.dp_clauseelement_list), - ] + SupportsCloneAnnotations._clone_annotations_traverse_internals + _traverse_internals: _TraverseInternalsType = ( + [ + ("element", InternalTraversal.dp_clauseelement), + ("column_args", InternalTraversal.dp_clauseelement_list), + ] + + SupportsCloneAnnotations._clone_annotations_traverse_internals + + HasCTE._has_ctes_traverse_internals + ) _is_textual = True diff --git a/libs/sqlalchemy/sql/sqltypes.py b/libs/sqlalchemy/sql/sqltypes.py index fa4c7827f..dd7110e88 100644 --- a/libs/sqlalchemy/sql/sqltypes.py +++ b/libs/sqlalchemy/sql/sqltypes.py @@ -217,6 +217,11 @@ def __init__( self.length = length self.collation = collation + def _with_collation(self, collation): + new_type = self.copy() + new_type.collation = collation + return new_type + def _resolve_for_literal(self, value): # I was SO PROUD of my regex trick, but we dont need it. # re.search(r"[^\u0000-\u007F]", value) @@ -865,6 +870,12 @@ class _Binary(TypeEngine[bytes]): def __init__(self, length: Optional[int] = None): self.length = length + @util.ro_memoized_property + def _generic_type_affinity( + self, + ) -> Type[TypeEngine[bytes]]: + return LargeBinary + def literal_processor(self, dialect): def process(value): # TODO: this is useless for real world scenarios; implement @@ -1006,7 +1017,7 @@ def __init__( if _adapted_from: self.dispatch = self.dispatch._join(_adapted_from.dispatch) - def _set_parent(self, column, **kw): + def _set_parent(self, parent, **kw): # set parent hook is when this type is associated with a column. # Column calls it for all SchemaEventTarget instances, either the # base type and/or variants in _variant_mapping. @@ -1020,7 +1031,7 @@ def _set_parent(self, column, **kw): # on_table/metadata_create/drop in this method, which is used by # "native" types with a separate CREATE/DROP e.g. Postgresql.ENUM - column._on_table_attach(util.portable_instancemethod(self._set_table)) + parent._on_table_attach(util.portable_instancemethod(self._set_table)) def _variant_mapping_for_set_table(self, column): if column.type._variant_mapping: @@ -1080,6 +1091,11 @@ def copy(self, **kw): return self.adapt( cast("Type[TypeEngine[Any]]", self.__class__), _create_events=True, + metadata=( + kw.get("_to_metadata", self.metadata) + if self.metadata is not None + else None + ), ) @overload @@ -1664,10 +1680,10 @@ def adapt_to_emulated(self, impltype, **kw): assert "_enums" in kw return impltype(**kw) - def adapt(self, impltype, **kw): + def adapt(self, cls, **kw): kw["_enums"] = self._enums_argument kw["_disable_warnings"] = True - return super().adapt(impltype, **kw) + return super().adapt(cls, **kw) def _should_create_constraint(self, compiler, **kw): if not self._is_impl_for_variant(compiler.dialect, kw): @@ -1903,6 +1919,13 @@ def __init__( if _adapted_from: self.dispatch = self.dispatch._join(_adapted_from.dispatch) + def copy(self, **kw): + # override SchemaType.copy() to not include to_metadata logic + return self.adapt( + cast("Type[TypeEngine[Any]]", self.__class__), + _create_events=True, + ) + def _should_create_constraint(self, compiler, **kw): if not self._is_impl_for_variant(compiler.dialect, kw): return False @@ -2516,7 +2539,10 @@ def _setup_getitem(self, index): return operator, index, self.type def as_boolean(self): - """Cast an indexed value as boolean. + """Consider an indexed value as boolean. + + This is similar to using :class:`_sql.type_coerce`, and will + usually not apply a ``CAST()``. e.g.:: @@ -2532,7 +2558,10 @@ def as_boolean(self): return self._binary_w_type(Boolean(), "as_boolean") def as_string(self): - """Cast an indexed value as string. + """Consider an indexed value as string. + + This is similar to using :class:`_sql.type_coerce`, and will + usually not apply a ``CAST()``. e.g.:: @@ -2549,7 +2578,10 @@ def as_string(self): return self._binary_w_type(Unicode(), "as_string") def as_integer(self): - """Cast an indexed value as integer. + """Consider an indexed value as integer. + + This is similar to using :class:`_sql.type_coerce`, and will + usually not apply a ``CAST()``. e.g.:: @@ -2565,7 +2597,10 @@ def as_integer(self): return self._binary_w_type(Integer(), "as_integer") def as_float(self): - """Cast an indexed value as float. + """Consider an indexed value as float. + + This is similar to using :class:`_sql.type_coerce`, and will + usually not apply a ``CAST()``. e.g.:: @@ -2581,7 +2616,10 @@ def as_float(self): return self._binary_w_type(Float(), "as_float") def as_numeric(self, precision, scale, asdecimal=True): - """Cast an indexed value as numeric/decimal. + """Consider an indexed value as numeric/decimal. + + This is similar to using :class:`_sql.type_coerce`, and will + usually not apply a ``CAST()``. e.g.:: @@ -2600,7 +2638,10 @@ def as_numeric(self, precision, scale, asdecimal=True): ) def as_json(self): - """Cast an indexed value as JSON. + """Consider an indexed value as JSON. + + This is similar to using :class:`_sql.type_coerce`, and will + usually not apply a ``CAST()``. e.g.:: @@ -2766,23 +2807,23 @@ class ARRAY( dimension parameter will generally assume single-dimensional behaviors. SQL expressions of type :class:`_types.ARRAY` have support for "index" and - "slice" behavior. The Python ``[]`` operator works normally here, given - integer indexes or slices. Arrays default to 1-based indexing. - The operator produces binary expression + "slice" behavior. The ``[]`` operator produces expression constructs which will produce the appropriate SQL, both for SELECT statements:: select(mytable.c.data[5], mytable.c.data[2:7]) as well as UPDATE statements when the :meth:`_expression.Update.values` - method - is used:: + method is used:: mytable.update().values({ mytable.c.data[5]: 7, mytable.c.data[2:7]: [1, 2, 3] }) + Indexed access is one-based by default; + for zero-based index conversion, set :paramref:`_types.ARRAY.zero_indexes`. + The :class:`_types.ARRAY` type also provides for the operators :meth:`.types.ARRAY.Comparator.any` and :meth:`.types.ARRAY.Comparator.all`. The PostgreSQL-specific version of @@ -2827,6 +2868,56 @@ class SomeOrmClass(Base): """If True, Python zero-based indexes should be interpreted as one-based on the SQL expression side.""" + def __init__( + self, + item_type: _TypeEngineArgument[Any], + as_tuple: bool = False, + dimensions: Optional[int] = None, + zero_indexes: bool = False, + ): + """Construct an :class:`_types.ARRAY`. + + E.g.:: + + Column('myarray', ARRAY(Integer)) + + Arguments are: + + :param item_type: The data type of items of this array. Note that + dimensionality is irrelevant here, so multi-dimensional arrays like + ``INTEGER[][]``, are constructed as ``ARRAY(Integer)``, not as + ``ARRAY(ARRAY(Integer))`` or such. + + :param as_tuple=False: Specify whether return results + should be converted to tuples from lists. This parameter is + not generally needed as a Python list corresponds well + to a SQL array. + + :param dimensions: if non-None, the ARRAY will assume a fixed + number of dimensions. This impacts how the array is declared + on the database, how it goes about interpreting Python and + result values, as well as how expression behavior in conjunction + with the "getitem" operator works. See the description at + :class:`_types.ARRAY` for additional detail. + + :param zero_indexes=False: when True, index values will be converted + between Python zero-based and SQL one-based indexes, e.g. + a value of one will be added to all index values before passing + to the database. + + """ + if isinstance(item_type, ARRAY): + raise ValueError( + "Do not nest ARRAY types; ARRAY(basetype) " + "handles multi-dimensional arrays of basetype" + ) + if isinstance(item_type, type): + item_type = item_type() + self.item_type = item_type + self.as_tuple = as_tuple + self.dimensions = dimensions + self.zero_indexes = zero_indexes + class Comparator( Indexable.Comparator[Sequence[Any]], Concatenable.Comparator[Sequence[Any]], @@ -2981,56 +3072,6 @@ def all(self, other, operator=None): comparator_factory = Comparator - def __init__( - self, - item_type: _TypeEngineArgument[Any], - as_tuple: bool = False, - dimensions: Optional[int] = None, - zero_indexes: bool = False, - ): - """Construct an :class:`_types.ARRAY`. - - E.g.:: - - Column('myarray', ARRAY(Integer)) - - Arguments are: - - :param item_type: The data type of items of this array. Note that - dimensionality is irrelevant here, so multi-dimensional arrays like - ``INTEGER[][]``, are constructed as ``ARRAY(Integer)``, not as - ``ARRAY(ARRAY(Integer))`` or such. - - :param as_tuple=False: Specify whether return results - should be converted to tuples from lists. This parameter is - not generally needed as a Python list corresponds well - to a SQL array. - - :param dimensions: if non-None, the ARRAY will assume a fixed - number of dimensions. This impacts how the array is declared - on the database, how it goes about interpreting Python and - result values, as well as how expression behavior in conjunction - with the "getitem" operator works. See the description at - :class:`_types.ARRAY` for additional detail. - - :param zero_indexes=False: when True, index values will be converted - between Python zero-based and SQL one-based indexes, e.g. - a value of one will be added to all index values before passing - to the database. - - """ - if isinstance(item_type, ARRAY): - raise ValueError( - "Do not nest ARRAY types; ARRAY(basetype) " - "handles multi-dimensional arrays of basetype" - ) - if isinstance(item_type, type): - item_type = item_type() - self.item_type = item_type - self.as_tuple = as_tuple - self.dimensions = dimensions - self.zero_indexes = zero_indexes - @property def hashable(self): return self.as_tuple @@ -3042,13 +3083,13 @@ def python_type(self): def compare_values(self, x, y): return x == y - def _set_parent(self, column, outer=False, **kw): + def _set_parent(self, parent, outer=False, **kw): """Support SchemaEventTarget""" if not outer and isinstance(self.item_type, SchemaEventTarget): - self.item_type._set_parent(column, **kw) + self.item_type._set_parent(parent, **kw) - def _set_parent_with_dispatch(self, parent): + def _set_parent_with_dispatch(self, parent, **kw): """Support SchemaEventTarget""" super()._set_parent_with_dispatch(parent, outer=True) @@ -3661,31 +3702,6 @@ def process(value): return process - def _sentinel_value_resolver(self, dialect): - """For the "insertmanyvalues" feature only, return a callable that - will receive the uuid object or string - as it is normally passed to the DB in the parameter set, after - bind_processor() is called. Convert this value to match - what it would be as coming back from a RETURNING or similar - statement for the given backend. - - Individual dialects and drivers may need their own implementations - based on how their UUID types send data and how the drivers behave - (e.g. pyodbc) - - """ - if not self.native_uuid or not dialect.supports_native_uuid: - # dealing entirely with strings going in and out of - # CHAR(32) - return None - - elif self.as_uuid: - # we sent UUID objects and we are getting UUID objects back - return None - else: - # we sent strings and we are getting UUID objects back - return _python_UUID - class UUID(Uuid[_UUID_RETURN], type_api.NativeForEmulated): """Represent the SQL UUID type. diff --git a/libs/sqlalchemy/sql/traversals.py b/libs/sqlalchemy/sql/traversals.py index 3ca3caf9e..8bb2939cb 100644 --- a/libs/sqlalchemy/sql/traversals.py +++ b/libs/sqlalchemy/sql/traversals.py @@ -562,6 +562,8 @@ def compare( return False else: continue + elif right_child is None: + return False comparison = dispatch( left_attrname, left, left_child, right, right_child, **kw diff --git a/libs/sqlalchemy/sql/type_api.py b/libs/sqlalchemy/sql/type_api.py index 414b91ab4..2f6494e61 100644 --- a/libs/sqlalchemy/sql/type_api.py +++ b/libs/sqlalchemy/sql/type_api.py @@ -183,6 +183,9 @@ def __init__(self, expr: ColumnElement[_CT]): self.expr = expr self.type = expr.type + def __reduce__(self) -> Any: + return self.__class__, (self.expr,) + @util.preload_module("sqlalchemy.sql.default_comparator") def operate( self, op: OperatorType, *other: Any, **kwargs: Any @@ -574,18 +577,6 @@ class explicitly. """ return None - def _sentinel_value_resolver( - self, dialect: Dialect - ) -> Optional[_SentinelProcessorType[_T]]: - """Return an optional callable that will match parameter values - (post-bind processing) to result values - (pre-result-processing), for use in the "sentinel" feature. - - .. versionadded:: 2.0.10 - - """ - return None - @util.memoized_property def _has_bind_expression(self) -> bool: """memoized boolean, check if bind_expression is implemented. @@ -767,6 +758,10 @@ def _resolve_for_python_type( return self + def _with_collation(self, collation: str) -> Self: + """set up error handling for the collate expression""" + raise NotImplementedError("this datatype does not support collation") + @util.ro_memoized_property def _type_affinity(self) -> Optional[Type[TypeEngine[_T]]]: """Return a rudimental 'affinity' value expressing the general class @@ -933,18 +928,6 @@ def _cached_result_processor( d["result"][coltype] = rp return rp - def _cached_sentinel_value_processor( - self, dialect: Dialect - ) -> Optional[_SentinelProcessorType[_T]]: - try: - return dialect._type_memos[self]["sentinel"] - except KeyError: - pass - - d = self._dialect_info(dialect) - d["sentinel"] = bp = d["impl"]._sentinel_value_resolver(dialect) - return bp - def _cached_custom_processor( self, dialect: Dialect, key: str, fn: Callable[[TypeEngine[_T]], _O] ) -> _O: @@ -1029,9 +1012,11 @@ def adapt( types with "implementation" types that are specific to a particular dialect. """ - return util.constructor_copy( + typ = util.constructor_copy( self, cast(Type[TypeEngine[Any]], cls), **kw ) + typ._variant_mapping = self._variant_mapping + return typ def coerce_compared_value( self, op: Optional[OperatorType], value: Any @@ -1575,6 +1560,8 @@ class produces the same behavior each time, it may be set to ``True``. class MyEpochType(types.TypeDecorator): impl = types.Integer + cache_ok = True + epoch = datetime.date(1970, 1, 1) def process_bind_param(self, value, dialect): @@ -1737,20 +1724,48 @@ def reverse_operate( kwargs["_python_is_types"] = self.expr.type.coerce_to_is_types return super().reverse_operate(op, other, **kwargs) + @staticmethod + def _reduce_td_comparator( + impl: TypeEngine[Any], expr: ColumnElement[_T] + ) -> Any: + return TypeDecorator._create_td_comparator_type(impl)(expr) + + @staticmethod + def _create_td_comparator_type( + impl: TypeEngine[Any], + ) -> _ComparatorFactory[Any]: + + def __reduce__(self: TypeDecorator.Comparator[Any]) -> Any: + return (TypeDecorator._reduce_td_comparator, (impl, self.expr)) + + return type( + "TDComparator", + (TypeDecorator.Comparator, impl.comparator_factory), # type: ignore # noqa: E501 + {"__reduce__": __reduce__}, + ) + @property def comparator_factory( # type: ignore # mypy properties bug self, ) -> _ComparatorFactory[Any]: if TypeDecorator.Comparator in self.impl.comparator_factory.__mro__: # type: ignore # noqa: E501 - return self.impl.comparator_factory + return self.impl_instance.comparator_factory else: # reconcile the Comparator class on the impl with that - # of TypeDecorator - return type( - "TDComparator", - (TypeDecorator.Comparator, self.impl.comparator_factory), # type: ignore # noqa: E501 - {}, + # of TypeDecorator. + # the use of multiple staticmethods is to support repeated + # pickling of the Comparator itself + return TypeDecorator._create_td_comparator_type(self.impl_instance) + + def _copy_with_check(self) -> Self: + tt = self.copy() + if not isinstance(tt, self.__class__): + raise AssertionError( + "Type object %s does not properly " + "implement the copy() method, it must " + "return an object of type %s" % (self, self.__class__) ) + return tt def _gen_dialect_impl(self, dialect: Dialect) -> TypeEngine[_T]: if dialect.name in self._variant_mapping: @@ -1766,16 +1781,17 @@ def _gen_dialect_impl(self, dialect: Dialect) -> TypeEngine[_T]: # to a copy of this TypeDecorator and return # that. typedesc = self.load_dialect_impl(dialect).dialect_impl(dialect) - tt = self.copy() - if not isinstance(tt, self.__class__): - raise AssertionError( - "Type object %s does not properly " - "implement the copy() method, it must " - "return an object of type %s" % (self, self.__class__) - ) + tt = self._copy_with_check() tt.impl = tt.impl_instance = typedesc return tt + def _with_collation(self, collation: str) -> Self: + tt = self._copy_with_check() + tt.impl = tt.impl_instance = self.impl_instance._with_collation( + collation + ) + return tt + @util.ro_non_memoized_property def _type_affinity(self) -> Optional[Type[TypeEngine[Any]]]: return self.impl_instance._type_affinity diff --git a/libs/sqlalchemy/testing/__init__.py b/libs/sqlalchemy/testing/__init__.py index d3a6f32c7..7fa361c9b 100644 --- a/libs/sqlalchemy/testing/__init__.py +++ b/libs/sqlalchemy/testing/__init__.py @@ -83,6 +83,7 @@ from .util import resolve_lambda from .util import rowset from .util import run_as_contextmanager +from .util import skip_if_timeout from .util import teardown_events from .warnings import assert_warnings from .warnings import warn_test_suite diff --git a/libs/sqlalchemy/testing/asyncio.py b/libs/sqlalchemy/testing/asyncio.py index 17dc861c9..f71ca57fe 100644 --- a/libs/sqlalchemy/testing/asyncio.py +++ b/libs/sqlalchemy/testing/asyncio.py @@ -24,16 +24,21 @@ import inspect from . import config -from ..util.concurrency import _util_async_run -from ..util.concurrency import _util_async_run_coroutine_function +from ..util.concurrency import _AsyncUtil # may be set to False if the # --disable-asyncio flag is passed to the test runner. ENABLE_ASYNCIO = True +_async_util = _AsyncUtil() # it has lazy init so just always create one + + +def _shutdown(): + """called when the test finishes""" + _async_util.close() def _run_coroutine_function(fn, *args, **kwargs): - return _util_async_run_coroutine_function(fn, *args, **kwargs) + return _async_util.run(fn, *args, **kwargs) def _assume_async(fn, *args, **kwargs): @@ -50,7 +55,7 @@ def _assume_async(fn, *args, **kwargs): if not ENABLE_ASYNCIO: return fn(*args, **kwargs) - return _util_async_run(fn, *args, **kwargs) + return _async_util.run_in_greenlet(fn, *args, **kwargs) def _maybe_async_provisioning(fn, *args, **kwargs): @@ -69,7 +74,7 @@ def _maybe_async_provisioning(fn, *args, **kwargs): return fn(*args, **kwargs) if config.any_async: - return _util_async_run(fn, *args, **kwargs) + return _async_util.run_in_greenlet(fn, *args, **kwargs) else: return fn(*args, **kwargs) @@ -89,7 +94,7 @@ def _maybe_async(fn, *args, **kwargs): is_async = config._current.is_async if is_async: - return _util_async_run(fn, *args, **kwargs) + return _async_util.run_in_greenlet(fn, *args, **kwargs) else: return fn(*args, **kwargs) diff --git a/libs/sqlalchemy/testing/engines.py b/libs/sqlalchemy/testing/engines.py index e055d99d2..7cae807eb 100644 --- a/libs/sqlalchemy/testing/engines.py +++ b/libs/sqlalchemy/testing/engines.py @@ -368,7 +368,12 @@ def do_begin(conn): True # enable event blocks, helps with profiling ) - if isinstance(engine.pool, pool.QueuePool): + if ( + isinstance(engine.pool, pool.QueuePool) + and "pool" not in options + and "pool_timeout" not in options + and "max_overflow" not in options + ): engine.pool._timeout = 0 engine.pool._max_overflow = 0 if use_reaper: diff --git a/libs/sqlalchemy/testing/fixtures/sql.py b/libs/sqlalchemy/testing/fixtures/sql.py index 144851062..39e5b0844 100644 --- a/libs/sqlalchemy/testing/fixtures/sql.py +++ b/libs/sqlalchemy/testing/fixtures/sql.py @@ -459,6 +459,10 @@ def __init__(self, cursor): # by not having the other methods we assert that those aren't being # used + @property + def description(self): + return self.cursor.description + def fetchall(self): rows = self.cursor.fetchall() rows = list(rows) @@ -466,22 +470,29 @@ def fetchall(self): return rows def _deliver_insertmanyvalues_batches( - cursor, statement, parameters, generic_setinputsizes, context + connection, + cursor, + statement, + parameters, + generic_setinputsizes, + context, ): if randomize_rows: cursor = RandomCursor(cursor) for batch in orig_dialect( - cursor, statement, parameters, generic_setinputsizes, context + connection, + cursor, + statement, + parameters, + generic_setinputsizes, + context, ): if warn_on_downgraded and batch.is_downgraded: util.warn("Batches were downgraded for sorted INSERT") yield batch - def _exec_insertmany_context( - dialect, - context, - ): + def _exec_insertmany_context(dialect, context): with mock.patch.object( dialect, "_deliver_insertmanyvalues_batches", diff --git a/libs/sqlalchemy/testing/plugin/pytestplugin.py b/libs/sqlalchemy/testing/plugin/pytestplugin.py index b63e06359..1a4d4bb30 100644 --- a/libs/sqlalchemy/testing/plugin/pytestplugin.py +++ b/libs/sqlalchemy/testing/plugin/pytestplugin.py @@ -182,6 +182,12 @@ def pytest_sessionfinish(session): collect_types.dump_stats(session.config.option.dump_pyannotate) +def pytest_unconfigure(config): + from sqlalchemy.testing import asyncio + + asyncio._shutdown() + + def pytest_collection_finish(session): if session.config.option.dump_pyannotate: from pyannotate_runtime import collect_types diff --git a/libs/sqlalchemy/testing/provision.py b/libs/sqlalchemy/testing/provision.py index e50c6eb5d..c6dc43e53 100644 --- a/libs/sqlalchemy/testing/provision.py +++ b/libs/sqlalchemy/testing/provision.py @@ -362,7 +362,7 @@ def update_db_opts(db_url, db_opts, options): def post_configure_engine(url, engine, follower_ident): """Perform extra steps after configuring an engine for testing. - (For the internal dialects, currently only used by sqlite, oracle) + (For the internal dialects, currently only used by sqlite, oracle, mssql) """ diff --git a/libs/sqlalchemy/testing/requirements.py b/libs/sqlalchemy/testing/requirements.py index 31aac741d..a11e23631 100644 --- a/libs/sqlalchemy/testing/requirements.py +++ b/libs/sqlalchemy/testing/requirements.py @@ -796,6 +796,11 @@ def unique_constraint_reflection(self): """target dialect supports reflection of unique constraints""" return exclusions.open() + @property + def inline_check_constraint_reflection(self): + """target dialect supports reflection of inline check constraints""" + return exclusions.closed() + @property def check_constraint_reflection(self): """target dialect supports reflection of check constraints""" @@ -1093,6 +1098,11 @@ def go(config): return exclusions.only_if(go) + @property + def array_type(self): + """Target platform implements a native ARRAY type""" + return exclusions.closed() + @property def json_type(self): """target platform implements a native JSON type.""" @@ -1781,3 +1791,28 @@ def materialized_views(self): def materialized_views_reflect_pk(self): """Target database reflect MATERIALIZED VIEWs pks.""" return exclusions.closed() + + @property + def supports_bitwise_or(self): + """Target database supports bitwise or""" + return exclusions.closed() + + @property + def supports_bitwise_and(self): + """Target database supports bitwise and""" + return exclusions.closed() + + @property + def supports_bitwise_not(self): + """Target database supports bitwise not""" + return exclusions.closed() + + @property + def supports_bitwise_xor(self): + """Target database supports bitwise xor""" + return exclusions.closed() + + @property + def supports_bitwise_shift(self): + """Target database supports bitwise left or right shift""" + return exclusions.closed() diff --git a/libs/sqlalchemy/testing/suite/test_reflection.py b/libs/sqlalchemy/testing/suite/test_reflection.py index f257d2fcb..91113be9b 100644 --- a/libs/sqlalchemy/testing/suite/test_reflection.py +++ b/libs/sqlalchemy/testing/suite/test_reflection.py @@ -6,6 +6,7 @@ # the MIT License: https://www.opensource.org/licenses/mit-license.php # mypy: ignore-errors +import contextlib import operator import re @@ -2454,62 +2455,158 @@ def test_get_columns_view_no_columns(self, connection, view_no_columns): class ComponentReflectionTestExtra(ComparesIndexes, fixtures.TestBase): __backend__ = True - @testing.combinations( - (True, testing.requires.schemas), (False,), argnames="use_schema" - ) - @testing.requires.check_constraint_reflection - def test_get_check_constraints(self, metadata, connection, use_schema): - if use_schema: - schema = config.test_schema + @testing.fixture(params=[True, False]) + def use_schema_fixture(self, request): + if request.param: + return config.test_schema else: - schema = None + return None - Table( - "sa_cc", - metadata, - Column("a", Integer()), - sa.CheckConstraint("a > 1 AND a < 5", name="cc1"), - sa.CheckConstraint( - "a = 1 OR (a > 2 AND a < 5)", name="UsesCasing" - ), - schema=schema, - ) - Table( - "no_constraints", - metadata, - Column("data", sa.String(20)), - schema=schema, - ) + @testing.fixture() + def inspect_for_table(self, metadata, connection, use_schema_fixture): + @contextlib.contextmanager + def go(tablename): + yield use_schema_fixture, inspect(connection) - metadata.create_all(connection) + metadata.create_all(connection) - insp = inspect(connection) - reflected = sorted( - insp.get_check_constraints("sa_cc", schema=schema), - key=operator.itemgetter("name"), - ) + return go + def ck_eq(self, reflected, expected): # trying to minimize effect of quoting, parenthesis, etc. # may need to add more to this as new dialects get CHECK # constraint reflection support def normalize(sqltext): return " ".join( - re.findall(r"and|\d|=|a|or|<|>", sqltext.lower(), re.I) + re.findall(r"and|\d|=|a|b|c|or|<|>", sqltext.lower(), re.I) ) - reflected = [ - {"name": item["name"], "sqltext": normalize(item["sqltext"])} - for item in reflected - ] - eq_( + reflected = sorted( + [ + {"name": item["name"], "sqltext": normalize(item["sqltext"])} + for item in reflected + ], + key=lambda item: (item["sqltext"]), + ) + + expected = sorted( + expected, + key=lambda item: (item["sqltext"]), + ) + eq_(reflected, expected) + + @testing.requires.check_constraint_reflection + def test_check_constraint_no_constraint(self, metadata, inspect_for_table): + with inspect_for_table("no_constraints") as (schema, inspector): + Table( + "no_constraints", + metadata, + Column("data", sa.String(20)), + schema=schema, + ) + + self.ck_eq( + inspector.get_check_constraints("no_constraints", schema=schema), + [], + ) + + @testing.requires.inline_check_constraint_reflection + @testing.combinations( + "my_inline", "MyInline", None, argnames="constraint_name" + ) + def test_check_constraint_inline( + self, metadata, inspect_for_table, constraint_name + ): + + with inspect_for_table("sa_cc") as (schema, inspector): + Table( + "sa_cc", + metadata, + Column("id", Integer(), primary_key=True), + Column( + "a", + Integer(), + sa.CheckConstraint( + "a > 1 AND a < 5", name=constraint_name + ), + ), + Column("data", String(50)), + schema=schema, + ) + + reflected = inspector.get_check_constraints("sa_cc", schema=schema) + + self.ck_eq( + reflected, + [ + { + "name": constraint_name or mock.ANY, + "sqltext": "a > 1 and a < 5", + }, + ], + ) + + @testing.requires.check_constraint_reflection + @testing.combinations( + "my_ck_const", "MyCkConst", None, argnames="constraint_name" + ) + def test_check_constraint_standalone( + self, metadata, inspect_for_table, constraint_name + ): + with inspect_for_table("sa_cc") as (schema, inspector): + Table( + "sa_cc", + metadata, + Column("a", Integer()), + sa.CheckConstraint( + "a = 1 OR (a > 2 AND a < 5)", name=constraint_name + ), + schema=schema, + ) + + reflected = inspector.get_check_constraints("sa_cc", schema=schema) + + self.ck_eq( + reflected, + [ + { + "name": constraint_name or mock.ANY, + "sqltext": "a = 1 or a > 2 and a < 5", + }, + ], + ) + + @testing.requires.inline_check_constraint_reflection + def test_check_constraint_mixed(self, metadata, inspect_for_table): + with inspect_for_table("sa_cc") as (schema, inspector): + Table( + "sa_cc", + metadata, + Column("id", Integer(), primary_key=True), + Column("a", Integer(), sa.CheckConstraint("a > 1 AND a < 5")), + Column( + "b", + Integer(), + sa.CheckConstraint("b > 1 AND b < 5", name="my_inline"), + ), + Column("c", Integer()), + Column("data", String(50)), + sa.UniqueConstraint("data", name="some_uq"), + sa.CheckConstraint("c > 1 AND c < 5", name="cc1"), + sa.UniqueConstraint("c", name="some_c_uq"), + schema=schema, + ) + + reflected = inspector.get_check_constraints("sa_cc", schema=schema) + + self.ck_eq( reflected, [ - {"name": "UsesCasing", "sqltext": "a = 1 or a > 2 and a < 5"}, - {"name": "cc1", "sqltext": "a > 1 and a < 5"}, + {"name": "cc1", "sqltext": "c > 1 and c < 5"}, + {"name": "my_inline", "sqltext": "b > 1 and b < 5"}, + {"name": mock.ANY, "sqltext": "a > 1 and a < 5"}, ], ) - no_cst = "no_constraints" - eq_(insp.get_check_constraints(no_cst, schema=schema), []) @testing.requires.indexes_with_expressions def test_reflect_expression_based_indexes(self, metadata, connection): diff --git a/libs/sqlalchemy/testing/suite/test_results.py b/libs/sqlalchemy/testing/suite/test_results.py index b3f432fb7..2b91a559d 100644 --- a/libs/sqlalchemy/testing/suite/test_results.py +++ b/libs/sqlalchemy/testing/suite/test_results.py @@ -7,6 +7,7 @@ # mypy: ignore-errors import datetime +import re from .. import engines from .. import fixtures @@ -273,6 +274,8 @@ def _is_server_side(self, cursor): return getattr(cursor, "server_side", False) elif self.engine.dialect.driver == "psycopg": return bool(getattr(cursor, "name", False)) + elif self.engine.dialect.driver == "oracledb": + return getattr(cursor, "server_side", False) else: return False @@ -293,11 +296,26 @@ def _fixture(self, server_side_cursors): ) return self.engine + def stringify(self, str_): + return re.compile(r"SELECT (\d+)", re.I).sub( + lambda m: str(select(int(m.group(1))).compile(testing.db)), str_ + ) + @testing.combinations( - ("global_string", True, "select 1", True), - ("global_text", True, text("select 1"), True), + ("global_string", True, lambda stringify: stringify("select 1"), True), + ( + "global_text", + True, + lambda stringify: text(stringify("select 1")), + True, + ), ("global_expr", True, select(1), True), - ("global_off_explicit", False, text("select 1"), False), + ( + "global_off_explicit", + False, + lambda stringify: text(stringify("select 1")), + False, + ), ( "stmt_option", False, @@ -315,15 +333,22 @@ def _fixture(self, server_side_cursors): ( "for_update_string", True, - "SELECT 1 FOR UPDATE", + lambda stringify: stringify("SELECT 1 FOR UPDATE"), True, testing.skip_if(["sqlite", "mssql"]), ), - ("text_no_ss", False, text("select 42"), False), + ( + "text_no_ss", + False, + lambda stringify: text(stringify("select 42")), + False, + ), ( "text_ss_option", False, - text("select 42").execution_options(stream_results=True), + lambda stringify: text(stringify("select 42")).execution_options( + stream_results=True + ), True, ), id_="iaaa", @@ -334,6 +359,11 @@ def test_ss_cursor_status( ): engine = self._fixture(engine_ss_arg) with engine.begin() as conn: + if callable(statement): + statement = testing.resolve_lambda( + statement, stringify=self.stringify + ) + if isinstance(statement, str): result = conn.exec_driver_sql(statement) else: @@ -348,7 +378,7 @@ def test_conn_option(self): # should be enabled for this one result = conn.execution_options( stream_results=True - ).exec_driver_sql("select 1") + ).exec_driver_sql(self.stringify("select 1")) assert self._is_server_side(result.cursor) # the connection has autobegun, which means at the end of the @@ -402,7 +432,9 @@ def test_roundtrip_fetchall(self, metadata): test_table = Table( "test_table", md, - Column("id", Integer, primary_key=True), + Column( + "id", Integer, primary_key=True, test_needs_autoincrement=True + ), Column("data", String(50)), ) @@ -442,7 +474,9 @@ def test_roundtrip_fetchmany(self, metadata): test_table = Table( "test_table", md, - Column("id", Integer, primary_key=True), + Column( + "id", Integer, primary_key=True, test_needs_autoincrement=True + ), Column("data", String(50)), ) diff --git a/libs/sqlalchemy/testing/suite/test_select.py b/libs/sqlalchemy/testing/suite/test_select.py index 866bf09cb..8e1ae79b2 100644 --- a/libs/sqlalchemy/testing/suite/test_select.py +++ b/libs/sqlalchemy/testing/suite/test_select.py @@ -1886,3 +1886,114 @@ def test_is_or_is_not_distinct_from( len(result), expected_row_count_for_is_not, ) + + +class WindowFunctionTest(fixtures.TablesTest): + __requires__ = ("window_functions",) + + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table( + "some_table", + metadata, + Column("id", Integer, primary_key=True), + Column("col1", Integer), + Column("col2", Integer), + ) + + @classmethod + def insert_data(cls, connection): + connection.execute( + cls.tables.some_table.insert(), + [{"id": i, "col1": i, "col2": i * 5} for i in range(1, 50)], + ) + + def test_window(self, connection): + some_table = self.tables.some_table + rows = connection.execute( + select( + func.max(some_table.c.col2).over( + order_by=[some_table.c.col1.desc()] + ) + ).where(some_table.c.col1 < 20) + ).all() + + eq_(rows, [(95,) for i in range(19)]) + + def test_window_rows_between(self, connection): + some_table = self.tables.some_table + + # note the rows are part of the cache key right now, not handled + # as binds. this is issue #11515 + rows = connection.execute( + select( + func.max(some_table.c.col2).over( + order_by=[some_table.c.col1], + rows=(-5, 0), + ) + ) + ).all() + + eq_(rows, [(i,) for i in range(5, 250, 5)]) + + +class BitwiseTest(fixtures.TablesTest): + __backend__ = True + run_inserts = run_deletes = "once" + + inserted_data = [{"a": i, "b": i + 1} for i in range(10)] + + @classmethod + def define_tables(cls, metadata): + Table("bitwise", metadata, Column("a", Integer), Column("b", Integer)) + + @classmethod + def insert_data(cls, connection): + connection.execute(cls.tables.bitwise.insert(), cls.inserted_data) + + @testing.combinations( + ( + lambda a: a.bitwise_xor(5), + [i for i in range(10) if i != 5], + testing.requires.supports_bitwise_xor, + ), + ( + lambda a: a.bitwise_or(1), + list(range(10)), + testing.requires.supports_bitwise_or, + ), + ( + lambda a: a.bitwise_and(4), + list(range(4, 8)), + testing.requires.supports_bitwise_and, + ), + ( + lambda a: (a - 2).bitwise_not(), + [0], + testing.requires.supports_bitwise_not, + ), + ( + lambda a: a.bitwise_lshift(1), + list(range(1, 10)), + testing.requires.supports_bitwise_shift, + ), + ( + lambda a: a.bitwise_rshift(2), + list(range(4, 10)), + testing.requires.supports_bitwise_shift, + ), + argnames="case, expected", + ) + def test_bitwise(self, case, expected, connection): + tbl = self.tables.bitwise + + a = tbl.c.a + + op = testing.resolve_lambda(case, a=a) + + stmt = select(tbl).where(op > 0).order_by(a) + + res = connection.execute(stmt).mappings().all() + eq_(res, [self.inserted_data[i] for i in expected]) diff --git a/libs/sqlalchemy/testing/suite/test_types.py b/libs/sqlalchemy/testing/suite/test_types.py index 4a7c1f199..d4c5a2250 100644 --- a/libs/sqlalchemy/testing/suite/test_types.py +++ b/libs/sqlalchemy/testing/suite/test_types.py @@ -32,6 +32,7 @@ from ... import cast from ... import Date from ... import DateTime +from ... import Enum from ... import Float from ... import Integer from ... import Interval @@ -1918,6 +1919,74 @@ def test_string_cast_crit_against_string_basic(self): ) +class EnumTest(_LiteralRoundTripFixture, fixtures.TablesTest): + __backend__ = True + + enum_values = "a", "b", "a%", "b%percent", "réveillé" + + datatype = Enum(*enum_values, name="myenum") + + @classmethod + def define_tables(cls, metadata): + Table( + "enum_table", + metadata, + Column("id", Integer, primary_key=True), + Column("enum_data", cls.datatype), + ) + + @testing.combinations(*enum_values, argnames="data") + def test_round_trip(self, data, connection): + connection.execute( + self.tables.enum_table.insert(), {"id": 1, "enum_data": data} + ) + + eq_( + connection.scalar( + select(self.tables.enum_table.c.enum_data).where( + self.tables.enum_table.c.id == 1 + ) + ), + data, + ) + + def test_round_trip_executemany(self, connection): + connection.execute( + self.tables.enum_table.insert(), + [ + {"id": 1, "enum_data": "b%percent"}, + {"id": 2, "enum_data": "réveillé"}, + {"id": 3, "enum_data": "b"}, + {"id": 4, "enum_data": "a%"}, + ], + ) + + eq_( + connection.scalars( + select(self.tables.enum_table.c.enum_data).order_by( + self.tables.enum_table.c.id + ) + ).all(), + ["b%percent", "réveillé", "b", "a%"], + ) + + @testing.requires.insert_executemany_returning + def test_round_trip_executemany_returning(self, connection): + result = connection.execute( + self.tables.enum_table.insert().returning( + self.tables.enum_table.c.enum_data + ), + [ + {"id": 1, "enum_data": "b%percent"}, + {"id": 2, "enum_data": "réveillé"}, + {"id": 3, "enum_data": "b"}, + {"id": 4, "enum_data": "a%"}, + ], + ) + + eq_(result.scalars().all(), ["b%percent", "réveillé", "b", "a%"]) + + class UuidTest(_LiteralRoundTripFixture, fixtures.TablesTest): __backend__ = True @@ -2066,6 +2135,7 @@ class NativeUUIDTest(UuidTest): "DateHistoricTest", "StringTest", "BooleanTest", + "EnumTest", "UuidTest", "NativeUUIDTest", ) diff --git a/libs/sqlalchemy/testing/util.py b/libs/sqlalchemy/testing/util.py index a6ce6ca3c..f6fad11d0 100644 --- a/libs/sqlalchemy/testing/util.py +++ b/libs/sqlalchemy/testing/util.py @@ -10,13 +10,16 @@ from __future__ import annotations from collections import deque +import contextlib import decimal import gc from itertools import chain import random import sys from sys import getsizeof +import time import types +from typing import Any from . import config from . import mock @@ -517,3 +520,18 @@ def count_cache_key_tuples(tup): if elem: stack = list(elem) + [sentinel] + stack return num_elements + + +@contextlib.contextmanager +def skip_if_timeout(seconds: float, cleanup: Any = None): + + now = time.time() + yield + sec = time.time() - now + if sec > seconds: + try: + cleanup() + finally: + config.skip_test( + f"test took too long ({sec:.4f} seconds > {seconds})" + ) diff --git a/libs/sqlalchemy/util/__init__.py b/libs/sqlalchemy/util/__init__.py index 69424e7cc..33b7addb6 100644 --- a/libs/sqlalchemy/util/__init__.py +++ b/libs/sqlalchemy/util/__init__.py @@ -65,6 +65,7 @@ from .compat import py310 as py310 from .compat import py311 as py311 from .compat import py312 as py312 +from .compat import py313 as py313 from .compat import py38 as py38 from .compat import py39 as py39 from .compat import pypy as pypy diff --git a/libs/sqlalchemy/util/_collections.py b/libs/sqlalchemy/util/_collections.py index e3a8ad834..9755f8d99 100644 --- a/libs/sqlalchemy/util/_collections.py +++ b/libs/sqlalchemy/util/_collections.py @@ -16,6 +16,7 @@ from typing import Any from typing import Callable from typing import cast +from typing import Container from typing import Dict from typing import FrozenSet from typing import Generic @@ -425,15 +426,14 @@ def to_list(x: Any, default: Optional[List[Any]] = None) -> List[Any]: return list(x) -def has_intersection(set_, iterable): +def has_intersection(set_: Container[Any], iterable: Iterable[Any]) -> bool: r"""return True if any items of set\_ are present in iterable. Goes through special effort to ensure __hash__ is not called on items in iterable that don't support it. """ - # TODO: optimize, write in C, etc. - return bool(set_.intersection([i for i in iterable if i.__hash__])) + return any(i in set_ for i in iterable if i.__hash__) def to_set(x): diff --git a/libs/sqlalchemy/util/_concurrency_py3k.py b/libs/sqlalchemy/util/_concurrency_py3k.py index 42ceb8122..a19607cd0 100644 --- a/libs/sqlalchemy/util/_concurrency_py3k.py +++ b/libs/sqlalchemy/util/_concurrency_py3k.py @@ -19,10 +19,14 @@ from typing import Optional from typing import TYPE_CHECKING from typing import TypeVar +from typing import Union from .langhelpers import memoized_property from .. import exc +from ..util import py311 +from ..util.typing import Literal from ..util.typing import Protocol +from ..util.typing import Self from ..util.typing import TypeGuard _T = TypeVar("_T") @@ -70,9 +74,10 @@ def is_exit_exception(e: BaseException) -> bool: class _AsyncIoGreenlet(greenlet): dead: bool + __sqlalchemy_greenlet_provider__ = True + def __init__(self, fn: Callable[..., Any], driver: greenlet): greenlet.__init__(self, fn, driver) - self.driver = driver if _has_gr_context: self.gr_context = driver.gr_context @@ -98,7 +103,7 @@ def _safe_cancel_awaitable(awaitable: Awaitable[Any]) -> None: def in_greenlet() -> bool: current = getcurrent() - return isinstance(current, _AsyncIoGreenlet) + return getattr(current, "__sqlalchemy_greenlet_provider__", False) def await_only(awaitable: Awaitable[_T]) -> _T: @@ -112,7 +117,7 @@ def await_only(awaitable: Awaitable[_T]) -> _T: """ # this is called in the context greenlet while running fn current = getcurrent() - if not isinstance(current, _AsyncIoGreenlet): + if not getattr(current, "__sqlalchemy_greenlet_provider__", False): _safe_cancel_awaitable(awaitable) raise exc.MissingGreenlet( @@ -124,7 +129,7 @@ def await_only(awaitable: Awaitable[_T]) -> _T: # a coroutine to run. Once the awaitable is done, the driver greenlet # switches back to this greenlet with the result of awaitable that is # then returned to the caller (or raised as error) - return current.driver.switch(awaitable) # type: ignore[no-any-return] + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 def await_fallback(awaitable: Awaitable[_T]) -> _T: @@ -144,7 +149,7 @@ def await_fallback(awaitable: Awaitable[_T]) -> _T: # this is called in the context greenlet while running fn current = getcurrent() - if not isinstance(current, _AsyncIoGreenlet): + if not getattr(current, "__sqlalchemy_greenlet_provider__", False): loop = get_event_loop() if loop.is_running(): _safe_cancel_awaitable(awaitable) @@ -156,7 +161,7 @@ def await_fallback(awaitable: Awaitable[_T]) -> _T: ) return loop.run_until_complete(awaitable) - return current.driver.switch(awaitable) # type: ignore[no-any-return] + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 async def greenlet_spawn( @@ -182,24 +187,21 @@ async def greenlet_spawn( # coroutine to wait. If the context is dead the function has # returned, and its result can be returned. switch_occurred = False - try: - result = context.switch(*args, **kwargs) - while not context.dead: - switch_occurred = True - try: - # wait for a coroutine from await_only and then return its - # result back to it. - value = await result - except BaseException: - # this allows an exception to be raised within - # the moderated greenlet so that it can continue - # its expected flow. - result = context.throw(*sys.exc_info()) - else: - result = context.switch(value) - finally: - # clean up to avoid cycle resolution by gc - del context.driver + result = context.switch(*args, **kwargs) + while not context.dead: + switch_occurred = True + try: + # wait for a coroutine from await_only and then return its + # result back to it. + value = await result + except BaseException: + # this allows an exception to be raised within + # the moderated greenlet so that it can continue + # its expected flow. + result = context.throw(*sys.exc_info()) + else: + result = context.switch(value) + if _require_await and not switch_occurred: raise exc.AwaitRequired( "The current operation required an async execution but none was " @@ -225,34 +227,6 @@ def __exit__(self, *arg: Any, **kw: Any) -> None: self.mutex.release() -def _util_async_run_coroutine_function( - fn: Callable[..., Coroutine[Any, Any, Any]], *args: Any, **kwargs: Any -) -> Any: - """for test suite/ util only""" - - loop = get_event_loop() - if loop.is_running(): - raise Exception( - "for async run coroutine we expect that no greenlet or event " - "loop is running when we start out" - ) - return loop.run_until_complete(fn(*args, **kwargs)) - - -def _util_async_run( - fn: Callable[..., Coroutine[Any, Any, Any]], *args: Any, **kwargs: Any -) -> Any: - """for test suite/ util only""" - - loop = get_event_loop() - if not loop.is_running(): - return loop.run_until_complete(greenlet_spawn(fn, *args, **kwargs)) - else: - # allow for a wrapped test function to call another - assert isinstance(getcurrent(), _AsyncIoGreenlet) - return fn(*args, **kwargs) - - def get_event_loop() -> asyncio.AbstractEventLoop: """vendor asyncio.get_event_loop() for python 3.7 and above. @@ -265,3 +239,50 @@ def get_event_loop() -> asyncio.AbstractEventLoop: # avoid "During handling of the above exception, another exception..." pass return asyncio.get_event_loop_policy().get_event_loop() + + +if not TYPE_CHECKING and py311: + _Runner = asyncio.Runner +else: + + class _Runner: + """Runner implementation for test only""" + + _loop: Union[None, asyncio.AbstractEventLoop, Literal[False]] + + def __init__(self) -> None: + self._loop = None + + def __enter__(self) -> Self: + self._lazy_init() + return self + + def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None: + self.close() + + def close(self) -> None: + if self._loop: + try: + self._loop.run_until_complete( + self._loop.shutdown_asyncgens() + ) + finally: + self._loop.close() + self._loop = False + + def get_loop(self) -> asyncio.AbstractEventLoop: + """Return embedded event loop.""" + self._lazy_init() + assert self._loop + return self._loop + + def run(self, coro: Coroutine[Any, Any, _T]) -> _T: + self._lazy_init() + assert self._loop + return self._loop.run_until_complete(coro) + + def _lazy_init(self) -> None: + if self._loop is False: + raise RuntimeError("Runner is closed") + if self._loop is None: + self._loop = asyncio.new_event_loop() diff --git a/libs/sqlalchemy/util/compat.py b/libs/sqlalchemy/util/compat.py index e1b5e6614..7620a3645 100644 --- a/libs/sqlalchemy/util/compat.py +++ b/libs/sqlalchemy/util/compat.py @@ -32,6 +32,7 @@ from typing import TypeVar +py313 = sys.version_info >= (3, 13) py312 = sys.version_info >= (3, 12) py311 = sys.version_info >= (3, 11) py310 = sys.version_info >= (3, 10) @@ -58,7 +59,7 @@ class FullArgSpec(typing.NamedTuple): varkw: Optional[str] defaults: Optional[Tuple[Any, ...]] kwonlyargs: List[str] - kwonlydefaults: Dict[str, Any] + kwonlydefaults: Optional[Dict[str, Any]] annotations: Dict[str, Any] diff --git a/libs/sqlalchemy/util/concurrency.py b/libs/sqlalchemy/util/concurrency.py index 65a620521..de6195de8 100644 --- a/libs/sqlalchemy/util/concurrency.py +++ b/libs/sqlalchemy/util/concurrency.py @@ -10,11 +10,15 @@ import asyncio # noqa import typing +from typing import Any +from typing import Callable +from typing import Coroutine +from typing import TypeVar have_greenlet = False greenlet_error = None try: - import greenlet # type: ignore # noqa: F401 + import greenlet # type: ignore[import-untyped,unused-ignore] # noqa: F401,E501 except ImportError as e: greenlet_error = str(e) pass @@ -26,12 +30,43 @@ from ._concurrency_py3k import greenlet_spawn as greenlet_spawn from ._concurrency_py3k import is_exit_exception as is_exit_exception from ._concurrency_py3k import AsyncAdaptedLock as AsyncAdaptedLock - from ._concurrency_py3k import ( - _util_async_run as _util_async_run, - ) # noqa: F401 - from ._concurrency_py3k import ( - _util_async_run_coroutine_function as _util_async_run_coroutine_function, # noqa: F401, E501 - ) + from ._concurrency_py3k import _Runner + +_T = TypeVar("_T") + + +class _AsyncUtil: + """Asyncio util for test suite/ util only""" + + def __init__(self) -> None: + if have_greenlet: + self.runner = _Runner() + + def run( + self, + fn: Callable[..., Coroutine[Any, Any, _T]], + *args: Any, + **kwargs: Any, + ) -> _T: + """Run coroutine on the loop""" + return self.runner.run(fn(*args, **kwargs)) + + def run_in_greenlet( + self, fn: Callable[..., _T], *args: Any, **kwargs: Any + ) -> _T: + """Run sync function in greenlet. Support nested calls""" + if have_greenlet: + if self.runner.get_loop().is_running(): + return fn(*args, **kwargs) + else: + return self.runner.run(greenlet_spawn(fn, *args, **kwargs)) + else: + return fn(*args, **kwargs) + + def close(self) -> None: + if have_greenlet: + self.runner.close() + if not typing.TYPE_CHECKING and not have_greenlet: diff --git a/libs/sqlalchemy/util/langhelpers.py b/libs/sqlalchemy/util/langhelpers.py index 396a03977..9312976e7 100644 --- a/libs/sqlalchemy/util/langhelpers.py +++ b/libs/sqlalchemy/util/langhelpers.py @@ -174,10 +174,11 @@ def string_or_unprintable(element: Any) -> str: return "unprintable element %r" % element -def clsname_as_plain_name(cls: Type[Any]) -> str: - return " ".join( - n.lower() for n in re.findall(r"([A-Z][a-z]+|SQL)", cls.__name__) - ) +def clsname_as_plain_name( + cls: Type[Any], use_name: Optional[str] = None +) -> str: + name = use_name or cls.__name__ + return " ".join(n.lower() for n in re.findall(r"([A-Z][a-z]+|SQL)", name)) def method_is_overridden( @@ -307,10 +308,10 @@ def decorate(fn: _Fn) -> _Fn: ) decorated.__defaults__ = getattr(fn, "__func__", fn).__defaults__ - decorated.__wrapped__ = fn # type: ignore - return cast(_Fn, update_wrapper(decorated, fn)) + decorated.__wrapped__ = fn # type: ignore[attr-defined] + return update_wrapper(decorated, fn) # type: ignore[return-value] - return update_wrapper(decorate, target) + return update_wrapper(decorate, target) # type: ignore[return-value] def _update_argspec_defaults_into_env(spec, env): @@ -1658,6 +1659,8 @@ def __init__( items: List[symbol] cls._items = items = [] for k, v in dict_.items(): + if re.match(r"^__.*__$", k): + continue if isinstance(v, int): sym = symbol(k, canonical=v) elif not k.startswith("_"): @@ -1957,6 +1960,9 @@ def attrsetter(attrname): return env["set"] +_dunders = re.compile("^__.+__$") + + class TypingOnly: """A mixin class that marks a class as 'typing only', meaning it has absolutely no methods, attributes, or runtime functionality whatsoever. @@ -1967,15 +1973,9 @@ class TypingOnly: def __init_subclass__(cls) -> None: if TypingOnly in cls.__bases__: - remaining = set(cls.__dict__).difference( - { - "__module__", - "__doc__", - "__slots__", - "__orig_bases__", - "__annotations__", - } - ) + remaining = { + name for name in cls.__dict__ if not _dunders.match(name) + } if remaining: raise AssertionError( f"Class {cls} directly inherits TypingOnly but has " @@ -2208,3 +2208,11 @@ def has_compiled_ext(raise_=False): ) else: return False + + +class _Missing(enum.Enum): + Missing = enum.auto() + + +Missing = _Missing.Missing +MissingOr = Union[_T, Literal[_Missing.Missing]] diff --git a/libs/sqlalchemy/util/typing.py b/libs/sqlalchemy/util/typing.py index 2d9e2250a..a3df97770 100644 --- a/libs/sqlalchemy/util/typing.py +++ b/libs/sqlalchemy/util/typing.py @@ -62,6 +62,13 @@ _VT = TypeVar("_VT") _VT_co = TypeVar("_VT_co", covariant=True) +if compat.py38: + # typing_extensions.Literal is different from typing.Literal until + # Python 3.10.1 + _LITERAL_TYPES = frozenset([typing.Literal, Literal]) +else: + _LITERAL_TYPES = frozenset([Literal]) + if compat.py310: # why they took until py310 to put this in stdlib is beyond me, @@ -188,9 +195,51 @@ def de_stringify_annotation( ) return _copy_generic_annotation_with(annotation, elements) + return annotation # type: ignore +def fixup_container_fwd_refs( + type_: _AnnotationScanType, +) -> _AnnotationScanType: + """Correct dict['x', 'y'] into dict[ForwardRef('x'), ForwardRef('y')] + and similar for list, set + + """ + + if ( + is_generic(type_) + and typing_get_origin(type_) + in ( + dict, + set, + list, + collections_abc.MutableSet, + collections_abc.MutableMapping, + collections_abc.MutableSequence, + collections_abc.Mapping, + collections_abc.Sequence, + ) + # fight, kick and scream to struggle to tell the difference between + # dict[] and typing.Dict[] which DO NOT compare the same and DO NOT + # behave the same yet there is NO WAY to distinguish between which type + # it is using public attributes + and not re.match( + "typing.(?:Dict|List|Set|.*Mapping|.*Sequence|.*Set)", repr(type_) + ) + ): + # compat with py3.10 and earlier + return typing_get_origin(type_).__class_getitem__( # type: ignore + tuple( + [ + ForwardRef(elem) if isinstance(elem, str) else elem + for elem in typing_get_args(type_) + ] + ) + ) + return type_ + + def _copy_generic_annotation_with( annotation: GenericProtocol[_T], elements: Tuple[_AnnotationScanType, ...] ) -> Type[_T]: @@ -314,7 +363,7 @@ def is_non_string_iterable(obj: Any) -> TypeGuard[Iterable[Any]]: def is_literal(type_: _AnnotationScanType) -> bool: - return get_origin(type_) is Literal + return get_origin(type_) in _LITERAL_TYPES def is_newtype(type_: Optional[_AnnotationScanType]) -> TypeGuard[NewType]: @@ -337,7 +386,7 @@ def flatten_newtype(type_: NewType) -> Type[Any]: super_type = type_.__supertype__ while is_newtype(super_type): super_type = super_type.__supertype__ - return super_type + return super_type # type: ignore[return-value] def is_fwd_ref( diff --git a/libs/stevedore-5.2.0.dist-info/WHEEL b/libs/stevedore-5.2.0.dist-info/WHEEL deleted file mode 100644 index ba48cbcf9..000000000 --- a/libs/stevedore-5.2.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.3) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/stevedore-5.2.0.dist-info/pbr.json b/libs/stevedore-5.2.0.dist-info/pbr.json deleted file mode 100644 index 635843679..000000000 --- a/libs/stevedore-5.2.0.dist-info/pbr.json +++ /dev/null @@ -1 +0,0 @@ -{"git_version": "21d601f", "is_release": true} \ No newline at end of file diff --git a/libs/stevedore-5.2.0.dist-info/AUTHORS b/libs/stevedore-5.3.0.dist-info/AUTHORS similarity index 100% rename from libs/stevedore-5.2.0.dist-info/AUTHORS rename to libs/stevedore-5.3.0.dist-info/AUTHORS diff --git a/libs/stevedore-5.2.0.dist-info/INSTALLER b/libs/stevedore-5.3.0.dist-info/INSTALLER similarity index 100% rename from libs/stevedore-5.2.0.dist-info/INSTALLER rename to libs/stevedore-5.3.0.dist-info/INSTALLER diff --git a/libs/stevedore-5.2.0.dist-info/LICENSE b/libs/stevedore-5.3.0.dist-info/LICENSE similarity index 100% rename from libs/stevedore-5.2.0.dist-info/LICENSE rename to libs/stevedore-5.3.0.dist-info/LICENSE diff --git a/libs/stevedore-5.2.0.dist-info/METADATA b/libs/stevedore-5.3.0.dist-info/METADATA similarity index 97% rename from libs/stevedore-5.2.0.dist-info/METADATA rename to libs/stevedore-5.3.0.dist-info/METADATA index 689f088aa..01c452849 100644 --- a/libs/stevedore-5.2.0.dist-info/METADATA +++ b/libs/stevedore-5.3.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: stevedore -Version: 5.2.0 +Version: 5.3.0 Summary: Manage dynamic plugins for Python applications Home-page: https://docs.openstack.org/stevedore/latest/ Author: OpenStack @@ -20,7 +20,7 @@ Classifier: Environment :: Console Requires-Python: >=3.8 License-File: LICENSE License-File: AUTHORS -Requires-Dist: pbr !=2.1.0,>=2.0.0 +Requires-Dist: pbr >=2.0.0 =========================================================== stevedore -- Manage dynamic plugins for Python applications diff --git a/libs/stevedore-5.2.0.dist-info/RECORD b/libs/stevedore-5.3.0.dist-info/RECORD similarity index 82% rename from libs/stevedore-5.2.0.dist-info/RECORD rename to libs/stevedore-5.3.0.dist-info/RECORD index 6d59d86e9..84b5f6da6 100644 --- a/libs/stevedore-5.2.0.dist-info/RECORD +++ b/libs/stevedore-5.3.0.dist-info/RECORD @@ -1,13 +1,13 @@ -stevedore-5.2.0.dist-info/AUTHORS,sha256=QQb_ThCRK-AvzWkx5sPEG9axRZOOE1nCuBRK0l0VzUg,2815 -stevedore-5.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -stevedore-5.2.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 -stevedore-5.2.0.dist-info/METADATA,sha256=qr9P6i9k2e_kZQyTaC_y1RUDEH-VQ2n5MhqXx37-G3E,2265 -stevedore-5.2.0.dist-info/RECORD,, -stevedore-5.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -stevedore-5.2.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -stevedore-5.2.0.dist-info/entry_points.txt,sha256=pESxBgqYcVV5wevQpKBLQoutvWWhIyRZbEzhsD9z_LY,387 -stevedore-5.2.0.dist-info/pbr.json,sha256=JTcag4yGkhjv_22HXJHIijGy7P9JB7zbzLtloJrI6S0,46 -stevedore-5.2.0.dist-info/top_level.txt,sha256=rtOULIhauZOXFiAgHRCDBdnqb0wKxA-NqLlvo_b_SOM,10 +stevedore-5.3.0.dist-info/AUTHORS,sha256=QQb_ThCRK-AvzWkx5sPEG9axRZOOE1nCuBRK0l0VzUg,2815 +stevedore-5.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +stevedore-5.3.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +stevedore-5.3.0.dist-info/METADATA,sha256=u_CTdbYWvjVzjrBeJnnMJwpdQwPjlCZDYwPZ_GkmzIQ,2257 +stevedore-5.3.0.dist-info/RECORD,, +stevedore-5.3.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +stevedore-5.3.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +stevedore-5.3.0.dist-info/entry_points.txt,sha256=pESxBgqYcVV5wevQpKBLQoutvWWhIyRZbEzhsD9z_LY,387 +stevedore-5.3.0.dist-info/pbr.json,sha256=UJUmQUdxFqM3X_Kq1rHgsD5Mx1hthZuzZmV8-__HYYg,46 +stevedore-5.3.0.dist-info/top_level.txt,sha256=rtOULIhauZOXFiAgHRCDBdnqb0wKxA-NqLlvo_b_SOM,10 stevedore/__init__.py,sha256=lwsEP3iDFwk2lPJjgW3IbeQkhN6TeLM76tCl9V5BWYM,544 stevedore/_cache.py,sha256=zRIQCUAXx-XgPEvIxN61lhXubES04ZjJrSjn-Y3wPuA,6672 stevedore/dispatch.py,sha256=1elzSbz_JS_ITTAypnVtCG_Q0_ZpLtVgmouk67wEAl0,9561 diff --git a/libs/stevedore-5.2.0.dist-info/REQUESTED b/libs/stevedore-5.3.0.dist-info/REQUESTED similarity index 100% rename from libs/stevedore-5.2.0.dist-info/REQUESTED rename to libs/stevedore-5.3.0.dist-info/REQUESTED diff --git a/libs/itsdangerous-2.1.2.dist-info/WHEEL b/libs/stevedore-5.3.0.dist-info/WHEEL similarity index 100% rename from libs/itsdangerous-2.1.2.dist-info/WHEEL rename to libs/stevedore-5.3.0.dist-info/WHEEL diff --git a/libs/stevedore-5.2.0.dist-info/entry_points.txt b/libs/stevedore-5.3.0.dist-info/entry_points.txt similarity index 100% rename from libs/stevedore-5.2.0.dist-info/entry_points.txt rename to libs/stevedore-5.3.0.dist-info/entry_points.txt diff --git a/libs/stevedore-5.3.0.dist-info/pbr.json b/libs/stevedore-5.3.0.dist-info/pbr.json new file mode 100644 index 000000000..b1b1a2071 --- /dev/null +++ b/libs/stevedore-5.3.0.dist-info/pbr.json @@ -0,0 +1 @@ +{"git_version": "51134a4", "is_release": true} \ No newline at end of file diff --git a/libs/stevedore-5.2.0.dist-info/top_level.txt b/libs/stevedore-5.3.0.dist-info/top_level.txt similarity index 100% rename from libs/stevedore-5.2.0.dist-info/top_level.txt rename to libs/stevedore-5.3.0.dist-info/top_level.txt diff --git a/libs/textdistance-4.6.2.dist-info/WHEEL b/libs/textdistance-4.6.2.dist-info/WHEEL deleted file mode 100644 index bab98d675..000000000 --- a/libs/textdistance-4.6.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.43.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/textdistance-4.6.2.dist-info/INSTALLER b/libs/textdistance-4.6.3.dist-info/INSTALLER similarity index 100% rename from libs/textdistance-4.6.2.dist-info/INSTALLER rename to libs/textdistance-4.6.3.dist-info/INSTALLER diff --git a/libs/textdistance-4.6.2.dist-info/LICENSE b/libs/textdistance-4.6.3.dist-info/LICENSE similarity index 100% rename from libs/textdistance-4.6.2.dist-info/LICENSE rename to libs/textdistance-4.6.3.dist-info/LICENSE diff --git a/libs/textdistance-4.6.2.dist-info/METADATA b/libs/textdistance-4.6.3.dist-info/METADATA similarity index 78% rename from libs/textdistance-4.6.2.dist-info/METADATA rename to libs/textdistance-4.6.3.dist-info/METADATA index d9fa87435..47f5a3d5e 100644 --- a/libs/textdistance-4.6.2.dist-info/METADATA +++ b/libs/textdistance-4.6.3.dist-info/METADATA @@ -1,402 +1,402 @@ -Metadata-Version: 2.1 -Name: textdistance -Version: 4.6.2 -Summary: Compute distance between the two texts. -Home-page: https://github.com/orsinium/textdistance -Download-URL: https://github.com/orsinium/textdistance/tarball/master -Author: orsinium -Author-email: gram@orsinium.dev -License: MIT -Keywords: distance between text strings sequences iterators -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Plugins -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Topic :: Scientific/Engineering :: Human Machine Interfaces -Requires-Python: >=3.5 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: dameraulevenshtein -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'dameraulevenshtein' -Requires-Dist: jellyfish ; extra == 'dameraulevenshtein' -Requires-Dist: pyxDamerauLevenshtein ; extra == 'dameraulevenshtein' -Provides-Extra: hamming -Requires-Dist: Levenshtein ; extra == 'hamming' -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'hamming' -Requires-Dist: jellyfish ; extra == 'hamming' -Requires-Dist: distance ; extra == 'hamming' -Provides-Extra: jaro -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'jaro' -Requires-Dist: Levenshtein ; extra == 'jaro' -Provides-Extra: jarowinkler -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'jarowinkler' -Requires-Dist: jellyfish ; extra == 'jarowinkler' -Provides-Extra: levenshtein -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'levenshtein' -Requires-Dist: Levenshtein ; extra == 'levenshtein' -Provides-Extra: all -Requires-Dist: jellyfish ; extra == 'all' -Requires-Dist: numpy ; extra == 'all' -Requires-Dist: Levenshtein ; extra == 'all' -Requires-Dist: pyxDamerauLevenshtein ; extra == 'all' -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'all' -Requires-Dist: distance ; extra == 'all' -Requires-Dist: pylev ; extra == 'all' -Requires-Dist: py-stringmatching ; extra == 'all' -Requires-Dist: tabulate ; extra == 'all' -Provides-Extra: benchmark -Requires-Dist: jellyfish ; extra == 'benchmark' -Requires-Dist: numpy ; extra == 'benchmark' -Requires-Dist: Levenshtein ; extra == 'benchmark' -Requires-Dist: pyxDamerauLevenshtein ; extra == 'benchmark' -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'benchmark' -Requires-Dist: distance ; extra == 'benchmark' -Requires-Dist: pylev ; extra == 'benchmark' -Requires-Dist: py-stringmatching ; extra == 'benchmark' -Requires-Dist: tabulate ; extra == 'benchmark' -Provides-Extra: benchmarks -Requires-Dist: jellyfish ; extra == 'benchmarks' -Requires-Dist: numpy ; extra == 'benchmarks' -Requires-Dist: Levenshtein ; extra == 'benchmarks' -Requires-Dist: pyxDamerauLevenshtein ; extra == 'benchmarks' -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'benchmarks' -Requires-Dist: distance ; extra == 'benchmarks' -Requires-Dist: pylev ; extra == 'benchmarks' -Requires-Dist: py-stringmatching ; extra == 'benchmarks' -Requires-Dist: tabulate ; extra == 'benchmarks' -Provides-Extra: common -Requires-Dist: jellyfish ; extra == 'common' -Requires-Dist: numpy ; extra == 'common' -Requires-Dist: Levenshtein ; extra == 'common' -Requires-Dist: pyxDamerauLevenshtein ; extra == 'common' -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'common' -Provides-Extra: extra -Requires-Dist: jellyfish ; extra == 'extra' -Requires-Dist: numpy ; extra == 'extra' -Requires-Dist: Levenshtein ; extra == 'extra' -Requires-Dist: pyxDamerauLevenshtein ; extra == 'extra' -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'extra' -Provides-Extra: extras -Requires-Dist: jellyfish ; extra == 'extras' -Requires-Dist: numpy ; extra == 'extras' -Requires-Dist: Levenshtein ; extra == 'extras' -Requires-Dist: pyxDamerauLevenshtein ; extra == 'extras' -Requires-Dist: rapidfuzz >=2.6.0 ; extra == 'extras' -Provides-Extra: lint -Requires-Dist: twine ; extra == 'lint' -Requires-Dist: mypy ; extra == 'lint' -Requires-Dist: isort ; extra == 'lint' -Requires-Dist: flake8 ; extra == 'lint' -Requires-Dist: types-tabulate ; extra == 'lint' -Requires-Dist: flake8-blind-except ; extra == 'lint' -Requires-Dist: flake8-bugbear ; extra == 'lint' -Requires-Dist: flake8-commas ; extra == 'lint' -Requires-Dist: flake8-logging-format ; extra == 'lint' -Requires-Dist: flake8-mutable ; extra == 'lint' -Requires-Dist: flake8-pep3101 ; extra == 'lint' -Requires-Dist: flake8-quotes ; extra == 'lint' -Requires-Dist: flake8-string-format ; extra == 'lint' -Requires-Dist: flake8-tidy-imports ; extra == 'lint' -Requires-Dist: pep8-naming ; extra == 'lint' -Provides-Extra: test -Requires-Dist: hypothesis ; extra == 'test' -Requires-Dist: isort ; extra == 'test' -Requires-Dist: numpy ; extra == 'test' -Requires-Dist: pytest ; extra == 'test' - -# TextDistance - -![TextDistance logo](logo.png) - -[![Build Status](https://travis-ci.org/life4/textdistance.svg?branch=master)](https://travis-ci.org/life4/textdistance) [![PyPI version](https://img.shields.io/pypi/v/textdistance.svg)](https://pypi.python.org/pypi/textdistance) [![Status](https://img.shields.io/pypi/status/textdistance.svg)](https://pypi.python.org/pypi/textdistance) [![License](https://img.shields.io/pypi/l/textdistance.svg)](LICENSE) - -**TextDistance** -- python library for comparing distance between two or more sequences by many algorithms. - -Features: - -- 30+ algorithms -- Pure python implementation -- Simple usage -- More than two sequences comparing -- Some algorithms have more than one implementation in one class. -- Optional numpy usage for maximum speed. - -## Algorithms - -### Edit based - -| Algorithm | Class | Functions | -|-------------------------------------------------------------------------------------------|----------------------|------------------------| -| [Hamming](https://en.wikipedia.org/wiki/Hamming_distance) | `Hamming` | `hamming` | -| [MLIPNS](http://www.sial.iias.spb.su/files/386-386-1-PB.pdf) | `Mlipns` | `mlipns` | -| [Levenshtein](https://en.wikipedia.org/wiki/Levenshtein_distance) | `Levenshtein` | `levenshtein` | -| [Damerau-Levenshtein](https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance) | `DamerauLevenshtein` | `damerau_levenshtein` | -| [Jaro-Winkler](https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance) | `JaroWinkler` | `jaro_winkler`, `jaro` | -| [Strcmp95](http://cpansearch.perl.org/src/SCW/Text-JaroWinkler-0.1/strcmp95.c) | `StrCmp95` | `strcmp95` | -| [Needleman-Wunsch](https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm) | `NeedlemanWunsch` | `needleman_wunsch` | -| [Gotoh](http://bioinfo.ict.ac.cn/~dbu/AlgorithmCourses/Lectures/LOA/Lec6-Sequence-Alignment-Affine-Gaps-Gotoh1982.pdf) | `Gotoh` | `gotoh` | -| [Smith-Waterman](https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm) | `SmithWaterman` | `smith_waterman` | - -### Token based - -| Algorithm | Class | Functions | -|-------------------------------------------------------------------------------------------|----------------------|---------------| -| [Jaccard index](https://en.wikipedia.org/wiki/Jaccard_index) | `Jaccard` | `jaccard` | -| [Sørensen–Dice coefficient](https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient) | `Sorensen` | `sorensen`, `sorensen_dice`, `dice` | -| [Tversky index](https://en.wikipedia.org/wiki/Tversky_index) | `Tversky` | `tversky` | -| [Overlap coefficient](https://en.wikipedia.org/wiki/Overlap_coefficient) | `Overlap` | `overlap` | -| [Tanimoto distance](https://en.wikipedia.org/wiki/Jaccard_index#Tanimoto_similarity_and_distance) | `Tanimoto` | `tanimoto` | -| [Cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) | `Cosine` | `cosine` | -| [Monge-Elkan](https://www.academia.edu/200314/Generalized_Monge-Elkan_Method_for_Approximate_Text_String_Comparison) | `MongeElkan` | `monge_elkan` | -| [Bag distance](https://github.com/Yomguithereal/talisman/blob/master/src/metrics/bag.js) | `Bag` | `bag` | - -### Sequence based - -| Algorithm | Class | Functions | -|-----------|-------|-----------| -| [longest common subsequence similarity](https://en.wikipedia.org/wiki/Longest_common_subsequence_problem) | `LCSSeq` | `lcsseq` | -| [longest common substring similarity](https://docs.python.org/2/library/difflib.html#difflib.SequenceMatcher) | `LCSStr` | `lcsstr` | -| [Ratcliff-Obershelp similarity](https://en.wikipedia.org/wiki/Gestalt_Pattern_Matching) | `RatcliffObershelp` | `ratcliff_obershelp` | - -### Compression based - -[Normalized compression distance](https://en.wikipedia.org/wiki/Normalized_compression_distance#Normalized_compression_distance) with different compression algorithms. - -Classic compression algorithms: - -| Algorithm | Class | Function | -|----------------------------------------------------------------------------|-------------|--------------| -| [Arithmetic coding](https://en.wikipedia.org/wiki/Arithmetic_coding) | `ArithNCD` | `arith_ncd` | -| [RLE](https://en.wikipedia.org/wiki/Run-length_encoding) | `RLENCD` | `rle_ncd` | -| [BWT RLE](https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform) | `BWTRLENCD` | `bwtrle_ncd` | - -Normal compression algorithms: - -| Algorithm | Class | Function | -|----------------------------------------------------------------------------|--------------|---------------| -| Square Root | `SqrtNCD` | `sqrt_ncd` | -| [Entropy](https://en.wikipedia.org/wiki/Entropy_(information_theory)) | `EntropyNCD` | `entropy_ncd` | - -Work in progress algorithms that compare two strings as array of bits: - -| Algorithm | Class | Function | -|--------------------------------------------|-----------|------------| -| [BZ2](https://en.wikipedia.org/wiki/Bzip2) | `BZ2NCD` | `bz2_ncd` | -| [LZMA](https://en.wikipedia.org/wiki/LZMA) | `LZMANCD` | `lzma_ncd` | -| [ZLib](https://en.wikipedia.org/wiki/Zlib) | `ZLIBNCD` | `zlib_ncd` | - -See [blog post](https://articles.life4web.ru/other/ncd/) for more details about NCD. - -### Phonetic - -| Algorithm | Class | Functions | -|------------------------------------------------------------------------------|----------|-----------| -| [MRA](https://en.wikipedia.org/wiki/Match_rating_approach) | `MRA` | `mra` | -| [Editex](https://anhaidgroup.github.io/py_stringmatching/v0.3.x/Editex.html) | `Editex` | `editex` | - -### Simple - -| Algorithm | Class | Functions | -|---------------------|------------|------------| -| Prefix similarity | `Prefix` | `prefix` | -| Postfix similarity | `Postfix` | `postfix` | -| Length distance | `Length` | `length` | -| Identity similarity | `Identity` | `identity` | -| Matrix similarity | `Matrix` | `matrix` | - -## Installation - -### Stable - -Only pure python implementation: - -```bash -pip install textdistance -``` - -With extra libraries for maximum speed: - -```bash -pip install "textdistance[extras]" -``` - -With all libraries (required for [benchmarking](#benchmarks) and [testing](#running-tests)): - -```bash -pip install "textdistance[benchmark]" -``` - -With algorithm specific extras: - -```bash -pip install "textdistance[Hamming]" -``` - -Algorithms with available extras: `DamerauLevenshtein`, `Hamming`, `Jaro`, `JaroWinkler`, `Levenshtein`. - -### Dev - -Via pip: - -```bash -pip install -e git+https://github.com/life4/textdistance.git#egg=textdistance -``` - -Or clone repo and install with some extras: - -```bash -git clone https://github.com/life4/textdistance.git -pip install -e ".[benchmark]" -``` - -## Usage - -All algorithms have 2 interfaces: - -1. Class with algorithm-specific params for customizing. -1. Class instance with default params for quick and simple usage. - -All algorithms have some common methods: - -1. `.distance(*sequences)` -- calculate distance between sequences. -1. `.similarity(*sequences)` -- calculate similarity for sequences. -1. `.maximum(*sequences)` -- maximum possible value for distance and similarity. For any sequence: `distance + similarity == maximum`. -1. `.normalized_distance(*sequences)` -- normalized distance between sequences. The return value is a float between 0 and 1, where 0 means equal, and 1 totally different. -1. `.normalized_similarity(*sequences)` -- normalized similarity for sequences. The return value is a float between 0 and 1, where 0 means totally different, and 1 equal. - -Most common init arguments: - -1. `qval` -- q-value for split sequences into q-grams. Possible values: - - 1 (default) -- compare sequences by chars. - - 2 or more -- transform sequences to q-grams. - - None -- split sequences by words. -1. `as_set` -- for token-based algorithms: - - True -- `t` and `ttt` is equal. - - False (default) -- `t` and `ttt` is different. - -## Examples - -For example, [Hamming distance](https://en.wikipedia.org/wiki/Hamming_distance): - -```python -import textdistance - -textdistance.hamming('test', 'text') -# 1 - -textdistance.hamming.distance('test', 'text') -# 1 - -textdistance.hamming.similarity('test', 'text') -# 3 - -textdistance.hamming.normalized_distance('test', 'text') -# 0.25 - -textdistance.hamming.normalized_similarity('test', 'text') -# 0.75 - -textdistance.Hamming(qval=2).distance('test', 'text') -# 2 - -``` - -Any other algorithms have same interface. - -## Articles - -A few articles with examples how to use textdistance in the real world: - -- [Guide to Fuzzy Matching with Python](http://theautomatic.net/2019/11/13/guide-to-fuzzy-matching-with-python/) -- [String similarity — the basic know your algorithms guide!](https://itnext.io/string-similarity-the-basic-know-your-algorithms-guide-3de3d7346227) -- [Normalized compression distance](https://articles.life4web.ru/other/ncd/) - -## Extra libraries - -For main algorithms textdistance try to call known external libraries (fastest first) if available (installed in your system) and possible (this implementation can compare this type of sequences). [Install](#installation) textdistance with extras for this feature. - -You can disable this by passing `external=False` argument on init: - -```python3 -import textdistance -hamming = textdistance.Hamming(external=False) -hamming('text', 'testit') -# 3 -``` - -Supported libraries: - -1. [Distance](https://github.com/doukremt/distance) -1. [jellyfish](https://github.com/jamesturk/jellyfish) -1. [py_stringmatching](https://github.com/anhaidgroup/py_stringmatching) -1. [pylev](https://github.com/toastdriven/pylev) -1. [Levenshtein](https://github.com/maxbachmann/Levenshtein) -1. [pyxDamerauLevenshtein](https://github.com/gfairchild/pyxDamerauLevenshtein) - -Algorithms: - -1. DamerauLevenshtein -1. Hamming -1. Jaro -1. JaroWinkler -1. Levenshtein - -## Benchmarks - -Without extras installation: - -| algorithm | library | time | -|--------------------|-----------------------|---------| -| DamerauLevenshtein | rapidfuzz | 0.00312 | -| DamerauLevenshtein | jellyfish | 0.00591 | -| DamerauLevenshtein | pyxdameraulevenshtein | 0.03335 | -| DamerauLevenshtein | **textdistance** | 0.83524 | -| Hamming | Levenshtein | 0.00038 | -| Hamming | rapidfuzz | 0.00044 | -| Hamming | jellyfish | 0.00091 | -| Hamming | distance | 0.00812 | -| Hamming | **textdistance** | 0.03531 | -| Jaro | rapidfuzz | 0.00092 | -| Jaro | jellyfish | 0.00191 | -| Jaro | **textdistance** | 0.07365 | -| JaroWinkler | rapidfuzz | 0.00094 | -| JaroWinkler | jellyfish | 0.00195 | -| JaroWinkler | **textdistance** | 0.07501 | -| Levenshtein | rapidfuzz | 0.00099 | -| Levenshtein | Levenshtein | 0.00122 | -| Levenshtein | jellyfish | 0.00254 | -| Levenshtein | pylev | 0.15688 | -| Levenshtein | distance | 0.28669 | -| Levenshtein | **textdistance** | 0.53902 | - -Total: 24 libs. - -Yeah, so slow. Use TextDistance on production only with extras. - -Textdistance use benchmark's results for algorithm's optimization and try to call fastest external lib first (if possible). - -You can run benchmark manually on your system: - -```bash -pip install textdistance[benchmark] -python3 -m textdistance.benchmark -``` - -TextDistance show benchmarks results table for your system and save libraries priorities into `libraries.json` file in TextDistance's folder. This file will be used by textdistance for calling fastest algorithm implementation. Default [libraries.json](textdistance/libraries.json) already included in package. - -## Running tests - -All you need is [task](https://taskfile.dev/). See [Taskfile.yml](./Taskfile.yml) for the list of available commands. For example, to run tests including third-party libraries usage, execute `task pytest-external:run`. - -## Contributing - -PRs are welcome! - -- Found a bug? Fix it! -- Want to add more algorithms? Sure! Just make it with the same interface as other algorithms in the lib and add some tests. -- Can make something faster? Great! Just avoid external dependencies and remember that everything should work not only with strings. -- Something else that do you think is good? Do it! Just make sure that CI passes and everything from the README is still applicable (interface, features, and so on). -- Have no time to code? Tell your friends and subscribers about `textdistance`. More users, more contributions, more amazing features. - -Thank you :heart: +Metadata-Version: 2.1 +Name: textdistance +Version: 4.6.3 +Summary: Compute distance between the two texts. +Home-page: https://github.com/orsinium/textdistance +Download-URL: https://github.com/orsinium/textdistance/tarball/master +Author: orsinium +Author-email: gram@orsinium.dev +License: MIT +Keywords: distance between text strings sequences iterators +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Plugins +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Topic :: Scientific/Engineering :: Human Machine Interfaces +Requires-Python: >=3.5 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: dameraulevenshtein +Requires-Dist: rapidfuzz>=2.6.0; extra == "dameraulevenshtein" +Requires-Dist: jellyfish; extra == "dameraulevenshtein" +Requires-Dist: pyxDamerauLevenshtein; extra == "dameraulevenshtein" +Provides-Extra: hamming +Requires-Dist: Levenshtein; extra == "hamming" +Requires-Dist: rapidfuzz>=2.6.0; extra == "hamming" +Requires-Dist: jellyfish; extra == "hamming" +Requires-Dist: distance; extra == "hamming" +Provides-Extra: jaro +Requires-Dist: rapidfuzz>=2.6.0; extra == "jaro" +Requires-Dist: Levenshtein; extra == "jaro" +Provides-Extra: jarowinkler +Requires-Dist: rapidfuzz>=2.6.0; extra == "jarowinkler" +Requires-Dist: jellyfish; extra == "jarowinkler" +Provides-Extra: levenshtein +Requires-Dist: rapidfuzz>=2.6.0; extra == "levenshtein" +Requires-Dist: Levenshtein; extra == "levenshtein" +Provides-Extra: all +Requires-Dist: jellyfish; extra == "all" +Requires-Dist: numpy; extra == "all" +Requires-Dist: Levenshtein; extra == "all" +Requires-Dist: pyxDamerauLevenshtein; extra == "all" +Requires-Dist: rapidfuzz>=2.6.0; extra == "all" +Requires-Dist: distance; extra == "all" +Requires-Dist: pylev; extra == "all" +Requires-Dist: py-stringmatching; extra == "all" +Requires-Dist: tabulate; extra == "all" +Provides-Extra: benchmark +Requires-Dist: jellyfish; extra == "benchmark" +Requires-Dist: numpy; extra == "benchmark" +Requires-Dist: Levenshtein; extra == "benchmark" +Requires-Dist: pyxDamerauLevenshtein; extra == "benchmark" +Requires-Dist: rapidfuzz>=2.6.0; extra == "benchmark" +Requires-Dist: distance; extra == "benchmark" +Requires-Dist: pylev; extra == "benchmark" +Requires-Dist: py-stringmatching; extra == "benchmark" +Requires-Dist: tabulate; extra == "benchmark" +Provides-Extra: benchmarks +Requires-Dist: jellyfish; extra == "benchmarks" +Requires-Dist: numpy; extra == "benchmarks" +Requires-Dist: Levenshtein; extra == "benchmarks" +Requires-Dist: pyxDamerauLevenshtein; extra == "benchmarks" +Requires-Dist: rapidfuzz>=2.6.0; extra == "benchmarks" +Requires-Dist: distance; extra == "benchmarks" +Requires-Dist: pylev; extra == "benchmarks" +Requires-Dist: py-stringmatching; extra == "benchmarks" +Requires-Dist: tabulate; extra == "benchmarks" +Provides-Extra: common +Requires-Dist: jellyfish; extra == "common" +Requires-Dist: numpy; extra == "common" +Requires-Dist: Levenshtein; extra == "common" +Requires-Dist: pyxDamerauLevenshtein; extra == "common" +Requires-Dist: rapidfuzz>=2.6.0; extra == "common" +Provides-Extra: extra +Requires-Dist: jellyfish; extra == "extra" +Requires-Dist: numpy; extra == "extra" +Requires-Dist: Levenshtein; extra == "extra" +Requires-Dist: pyxDamerauLevenshtein; extra == "extra" +Requires-Dist: rapidfuzz>=2.6.0; extra == "extra" +Provides-Extra: extras +Requires-Dist: jellyfish; extra == "extras" +Requires-Dist: numpy; extra == "extras" +Requires-Dist: Levenshtein; extra == "extras" +Requires-Dist: pyxDamerauLevenshtein; extra == "extras" +Requires-Dist: rapidfuzz>=2.6.0; extra == "extras" +Provides-Extra: lint +Requires-Dist: twine; extra == "lint" +Requires-Dist: mypy; extra == "lint" +Requires-Dist: isort; extra == "lint" +Requires-Dist: flake8; extra == "lint" +Requires-Dist: types-tabulate; extra == "lint" +Requires-Dist: flake8-blind-except; extra == "lint" +Requires-Dist: flake8-bugbear; extra == "lint" +Requires-Dist: flake8-commas; extra == "lint" +Requires-Dist: flake8-logging-format; extra == "lint" +Requires-Dist: flake8-mutable; extra == "lint" +Requires-Dist: flake8-pep3101; extra == "lint" +Requires-Dist: flake8-quotes; extra == "lint" +Requires-Dist: flake8-string-format; extra == "lint" +Requires-Dist: flake8-tidy-imports; extra == "lint" +Requires-Dist: pep8-naming; extra == "lint" +Provides-Extra: test +Requires-Dist: hypothesis; extra == "test" +Requires-Dist: isort; extra == "test" +Requires-Dist: numpy; extra == "test" +Requires-Dist: pytest; extra == "test" + +# TextDistance + +![TextDistance logo](logo.png) + +[![Build Status](https://travis-ci.org/life4/textdistance.svg?branch=master)](https://travis-ci.org/life4/textdistance) [![PyPI version](https://img.shields.io/pypi/v/textdistance.svg)](https://pypi.python.org/pypi/textdistance) [![Status](https://img.shields.io/pypi/status/textdistance.svg)](https://pypi.python.org/pypi/textdistance) [![License](https://img.shields.io/pypi/l/textdistance.svg)](LICENSE) + +**TextDistance** -- python library for comparing distance between two or more sequences by many algorithms. + +Features: + +- 30+ algorithms +- Pure python implementation +- Simple usage +- More than two sequences comparing +- Some algorithms have more than one implementation in one class. +- Optional numpy usage for maximum speed. + +## Algorithms + +### Edit based + +| Algorithm | Class | Functions | +|-------------------------------------------------------------------------------------------|----------------------|------------------------| +| [Hamming](https://en.wikipedia.org/wiki/Hamming_distance) | `Hamming` | `hamming` | +| [MLIPNS](http://www.sial.iias.spb.su/files/386-386-1-PB.pdf) | `MLIPNS` | `mlipns` | +| [Levenshtein](https://en.wikipedia.org/wiki/Levenshtein_distance) | `Levenshtein` | `levenshtein` | +| [Damerau-Levenshtein](https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance) | `DamerauLevenshtein` | `damerau_levenshtein` | +| [Jaro-Winkler](https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance) | `JaroWinkler` | `jaro_winkler`, `jaro` | +| [Strcmp95](http://cpansearch.perl.org/src/SCW/Text-JaroWinkler-0.1/strcmp95.c) | `StrCmp95` | `strcmp95` | +| [Needleman-Wunsch](https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm) | `NeedlemanWunsch` | `needleman_wunsch` | +| [Gotoh](http://bioinfo.ict.ac.cn/~dbu/AlgorithmCourses/Lectures/LOA/Lec6-Sequence-Alignment-Affine-Gaps-Gotoh1982.pdf) | `Gotoh` | `gotoh` | +| [Smith-Waterman](https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm) | `SmithWaterman` | `smith_waterman` | + +### Token based + +| Algorithm | Class | Functions | +|-------------------------------------------------------------------------------------------|----------------------|---------------| +| [Jaccard index](https://en.wikipedia.org/wiki/Jaccard_index) | `Jaccard` | `jaccard` | +| [Sørensen–Dice coefficient](https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient) | `Sorensen` | `sorensen`, `sorensen_dice`, `dice` | +| [Tversky index](https://en.wikipedia.org/wiki/Tversky_index) | `Tversky` | `tversky` | +| [Overlap coefficient](https://en.wikipedia.org/wiki/Overlap_coefficient) | `Overlap` | `overlap` | +| [Tanimoto distance](https://en.wikipedia.org/wiki/Jaccard_index#Tanimoto_similarity_and_distance) | `Tanimoto` | `tanimoto` | +| [Cosine similarity](https://en.wikipedia.org/wiki/Cosine_similarity) | `Cosine` | `cosine` | +| [Monge-Elkan](https://www.academia.edu/200314/Generalized_Monge-Elkan_Method_for_Approximate_Text_String_Comparison) | `MongeElkan` | `monge_elkan` | +| [Bag distance](https://github.com/Yomguithereal/talisman/blob/master/src/metrics/bag.js) | `Bag` | `bag` | + +### Sequence based + +| Algorithm | Class | Functions | +|-----------|-------|-----------| +| [longest common subsequence similarity](https://en.wikipedia.org/wiki/Longest_common_subsequence_problem) | `LCSSeq` | `lcsseq` | +| [longest common substring similarity](https://docs.python.org/2/library/difflib.html#difflib.SequenceMatcher) | `LCSStr` | `lcsstr` | +| [Ratcliff-Obershelp similarity](https://en.wikipedia.org/wiki/Gestalt_Pattern_Matching) | `RatcliffObershelp` | `ratcliff_obershelp` | + +### Compression based + +[Normalized compression distance](https://en.wikipedia.org/wiki/Normalized_compression_distance#Normalized_compression_distance) with different compression algorithms. + +Classic compression algorithms: + +| Algorithm | Class | Function | +|----------------------------------------------------------------------------|-------------|--------------| +| [Arithmetic coding](https://en.wikipedia.org/wiki/Arithmetic_coding) | `ArithNCD` | `arith_ncd` | +| [RLE](https://en.wikipedia.org/wiki/Run-length_encoding) | `RLENCD` | `rle_ncd` | +| [BWT RLE](https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform) | `BWTRLENCD` | `bwtrle_ncd` | + +Normal compression algorithms: + +| Algorithm | Class | Function | +|----------------------------------------------------------------------------|--------------|---------------| +| Square Root | `SqrtNCD` | `sqrt_ncd` | +| [Entropy](https://en.wikipedia.org/wiki/Entropy_(information_theory)) | `EntropyNCD` | `entropy_ncd` | + +Work in progress algorithms that compare two strings as array of bits: + +| Algorithm | Class | Function | +|--------------------------------------------|-----------|------------| +| [BZ2](https://en.wikipedia.org/wiki/Bzip2) | `BZ2NCD` | `bz2_ncd` | +| [LZMA](https://en.wikipedia.org/wiki/LZMA) | `LZMANCD` | `lzma_ncd` | +| [ZLib](https://en.wikipedia.org/wiki/Zlib) | `ZLIBNCD` | `zlib_ncd` | + +See [blog post](https://articles.life4web.ru/other/ncd/) for more details about NCD. + +### Phonetic + +| Algorithm | Class | Functions | +|------------------------------------------------------------------------------|----------|-----------| +| [MRA](https://en.wikipedia.org/wiki/Match_rating_approach) | `MRA` | `mra` | +| [Editex](https://anhaidgroup.github.io/py_stringmatching/v0.3.x/Editex.html) | `Editex` | `editex` | + +### Simple + +| Algorithm | Class | Functions | +|---------------------|------------|------------| +| Prefix similarity | `Prefix` | `prefix` | +| Postfix similarity | `Postfix` | `postfix` | +| Length distance | `Length` | `length` | +| Identity similarity | `Identity` | `identity` | +| Matrix similarity | `Matrix` | `matrix` | + +## Installation + +### Stable + +Only pure python implementation: + +```bash +pip install textdistance +``` + +With extra libraries for maximum speed: + +```bash +pip install "textdistance[extras]" +``` + +With all libraries (required for [benchmarking](#benchmarks) and [testing](#running-tests)): + +```bash +pip install "textdistance[benchmark]" +``` + +With algorithm specific extras: + +```bash +pip install "textdistance[Hamming]" +``` + +Algorithms with available extras: `DamerauLevenshtein`, `Hamming`, `Jaro`, `JaroWinkler`, `Levenshtein`. + +### Dev + +Via pip: + +```bash +pip install -e git+https://github.com/life4/textdistance.git#egg=textdistance +``` + +Or clone repo and install with some extras: + +```bash +git clone https://github.com/life4/textdistance.git +pip install -e ".[benchmark]" +``` + +## Usage + +All algorithms have 2 interfaces: + +1. Class with algorithm-specific params for customizing. +1. Class instance with default params for quick and simple usage. + +All algorithms have some common methods: + +1. `.distance(*sequences)` -- calculate distance between sequences. +1. `.similarity(*sequences)` -- calculate similarity for sequences. +1. `.maximum(*sequences)` -- maximum possible value for distance and similarity. For any sequence: `distance + similarity == maximum`. +1. `.normalized_distance(*sequences)` -- normalized distance between sequences. The return value is a float between 0 and 1, where 0 means equal, and 1 totally different. +1. `.normalized_similarity(*sequences)` -- normalized similarity for sequences. The return value is a float between 0 and 1, where 0 means totally different, and 1 equal. + +Most common init arguments: + +1. `qval` -- q-value for split sequences into q-grams. Possible values: + - 1 (default) -- compare sequences by chars. + - 2 or more -- transform sequences to q-grams. + - None -- split sequences by words. +1. `as_set` -- for token-based algorithms: + - True -- `t` and `ttt` is equal. + - False (default) -- `t` and `ttt` is different. + +## Examples + +For example, [Hamming distance](https://en.wikipedia.org/wiki/Hamming_distance): + +```python +import textdistance + +textdistance.hamming('test', 'text') +# 1 + +textdistance.hamming.distance('test', 'text') +# 1 + +textdistance.hamming.similarity('test', 'text') +# 3 + +textdistance.hamming.normalized_distance('test', 'text') +# 0.25 + +textdistance.hamming.normalized_similarity('test', 'text') +# 0.75 + +textdistance.Hamming(qval=2).distance('test', 'text') +# 2 + +``` + +Any other algorithms have same interface. + +## Articles + +A few articles with examples how to use textdistance in the real world: + +- [Guide to Fuzzy Matching with Python](http://theautomatic.net/2019/11/13/guide-to-fuzzy-matching-with-python/) +- [String similarity — the basic know your algorithms guide!](https://itnext.io/string-similarity-the-basic-know-your-algorithms-guide-3de3d7346227) +- [Normalized compression distance](https://articles.life4web.ru/other/ncd/) + +## Extra libraries + +For main algorithms textdistance try to call known external libraries (fastest first) if available (installed in your system) and possible (this implementation can compare this type of sequences). [Install](#installation) textdistance with extras for this feature. + +You can disable this by passing `external=False` argument on init: + +```python3 +import textdistance +hamming = textdistance.Hamming(external=False) +hamming('text', 'testit') +# 3 +``` + +Supported libraries: + +1. [Distance](https://github.com/doukremt/distance) +1. [jellyfish](https://github.com/jamesturk/jellyfish) +1. [py_stringmatching](https://github.com/anhaidgroup/py_stringmatching) +1. [pylev](https://github.com/toastdriven/pylev) +1. [Levenshtein](https://github.com/maxbachmann/Levenshtein) +1. [pyxDamerauLevenshtein](https://github.com/gfairchild/pyxDamerauLevenshtein) + +Algorithms: + +1. DamerauLevenshtein +1. Hamming +1. Jaro +1. JaroWinkler +1. Levenshtein + +## Benchmarks + +Without extras installation: + +| algorithm | library | time | +|--------------------|-----------------------|---------| +| DamerauLevenshtein | rapidfuzz | 0.00312 | +| DamerauLevenshtein | jellyfish | 0.00591 | +| DamerauLevenshtein | pyxdameraulevenshtein | 0.03335 | +| DamerauLevenshtein | **textdistance** | 0.83524 | +| Hamming | Levenshtein | 0.00038 | +| Hamming | rapidfuzz | 0.00044 | +| Hamming | jellyfish | 0.00091 | +| Hamming | distance | 0.00812 | +| Hamming | **textdistance** | 0.03531 | +| Jaro | rapidfuzz | 0.00092 | +| Jaro | jellyfish | 0.00191 | +| Jaro | **textdistance** | 0.07365 | +| JaroWinkler | rapidfuzz | 0.00094 | +| JaroWinkler | jellyfish | 0.00195 | +| JaroWinkler | **textdistance** | 0.07501 | +| Levenshtein | rapidfuzz | 0.00099 | +| Levenshtein | Levenshtein | 0.00122 | +| Levenshtein | jellyfish | 0.00254 | +| Levenshtein | pylev | 0.15688 | +| Levenshtein | distance | 0.28669 | +| Levenshtein | **textdistance** | 0.53902 | + +Total: 24 libs. + +Yeah, so slow. Use TextDistance on production only with extras. + +Textdistance use benchmark's results for algorithm's optimization and try to call fastest external lib first (if possible). + +You can run benchmark manually on your system: + +```bash +pip install textdistance[benchmark] +python3 -m textdistance.benchmark +``` + +TextDistance show benchmarks results table for your system and save libraries priorities into `libraries.json` file in TextDistance's folder. This file will be used by textdistance for calling fastest algorithm implementation. Default [libraries.json](textdistance/libraries.json) already included in package. + +## Running tests + +All you need is [task](https://taskfile.dev/). See [Taskfile.yml](./Taskfile.yml) for the list of available commands. For example, to run tests including third-party libraries usage, execute `task pytest-external:run`. + +## Contributing + +PRs are welcome! + +- Found a bug? Fix it! +- Want to add more algorithms? Sure! Just make it with the same interface as other algorithms in the lib and add some tests. +- Can make something faster? Great! Just avoid external dependencies and remember that everything should work not only with strings. +- Something else that do you think is good? Do it! Just make sure that CI passes and everything from the README is still applicable (interface, features, and so on). +- Have no time to code? Tell your friends and subscribers about `textdistance`. More users, more contributions, more amazing features. + +Thank you :heart: diff --git a/libs/textdistance-4.6.2.dist-info/RECORD b/libs/textdistance-4.6.3.dist-info/RECORD similarity index 70% rename from libs/textdistance-4.6.2.dist-info/RECORD rename to libs/textdistance-4.6.3.dist-info/RECORD index bd4979d44..fcf0158fb 100644 --- a/libs/textdistance-4.6.2.dist-info/RECORD +++ b/libs/textdistance-4.6.3.dist-info/RECORD @@ -1,23 +1,23 @@ -textdistance-4.6.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -textdistance-4.6.2.dist-info/LICENSE,sha256=oOV_OJnxc9uQzeaMabB-rqV8Gti-Q1kQXusPgFxoEJI,1049 -textdistance-4.6.2.dist-info/METADATA,sha256=VEcNYZKg6DmHP3PO13LsHReUXriHMAPQ26SDcTkrENo,18635 -textdistance-4.6.2.dist-info/RECORD,, -textdistance-4.6.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -textdistance-4.6.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92 -textdistance-4.6.2.dist-info/top_level.txt,sha256=GBIsLNa3pcbaPSp8KNq93YdHKE3CNIQMQrLrZdectak,13 -textdistance/__init__.py,sha256=abtyaG6QgNqbwQTs_8q1rJUSPr78akEOLYgJDXHgtLM,355 -textdistance/algorithms/__init__.py,sha256=1raagDGcgHenA-Ncj3oKHTCk0ai8ltLdqQzTA__clkg,217 -textdistance/algorithms/base.py,sha256=IJwzIa3G4n6piDS9dOhSAVUoHmD4sCJCvGHH1Z4F_0o,6332 -textdistance/algorithms/compression_based.py,sha256=qXg-jUm4ifd1jLLXhvrNkhbi-_JK5AQyjr4026qquVE,8190 -textdistance/algorithms/edit_based.py,sha256=OZc-sGjzRx0eFl5jsEA3V3Q5MkBJR5QLbZYiz_EAPL0,27598 -textdistance/algorithms/phonetic.py,sha256=E7yCZVV_6XDkq7tbLHmYd2CAIyj7VQcpf7rQhHXMMj8,6133 -textdistance/algorithms/sequence_based.py,sha256=0iS9iZkx_eYJQFZKjRpBFp8jCs1c_1Hz0kWq6CBnJVg,6158 -textdistance/algorithms/simple.py,sha256=2wryMhYmBRDGjG9AT74AAI9SpmYDLABqpSUbw_Fy8AU,3209 -textdistance/algorithms/token_based.py,sha256=D2__lJONSfvU6Eiuq8IkB6TIBWCHPb3JWNH5LuL5liA,9405 -textdistance/algorithms/types.py,sha256=PVVh0bcCEK8ziRsmKgHyIJ8i9TERKaGoVA36_5lnAr0,166 -textdistance/algorithms/vector_based.py,sha256=jmbeSioJlATSlx097ptcJRl0G6dHzp2x_fyOcKYY6ZE,2821 -textdistance/benchmark.py,sha256=NpxvQQgBFVElQrG0wP44AlmcxEntLI11qj1A0KFSrCY,3818 -textdistance/libraries.json,sha256=bZw0jXy6oPnKr7VPu0LyOMDA1EAUoF-TDwjazl3lknc,1161 -textdistance/libraries.py,sha256=GGQsTRlyMOoak2WQ1w_mESgDzmcYeUiCHmWqP0s8ncI,6716 -textdistance/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -textdistance/utils.py,sha256=SDJclnzpkOpoyJmZ23AO7JZQfdsdpWmOO0xofzi95YQ,783 +textdistance-4.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +textdistance-4.6.3.dist-info/LICENSE,sha256=oOV_OJnxc9uQzeaMabB-rqV8Gti-Q1kQXusPgFxoEJI,1049 +textdistance-4.6.3.dist-info/METADATA,sha256=v0xojwY_m6pFs-ZggR9u3C0Nx1ZMnYvU9n5hPbWLJTg,18148 +textdistance-4.6.3.dist-info/RECORD,, +textdistance-4.6.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +textdistance-4.6.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +textdistance-4.6.3.dist-info/top_level.txt,sha256=GBIsLNa3pcbaPSp8KNq93YdHKE3CNIQMQrLrZdectak,13 +textdistance/__init__.py,sha256=abtyaG6QgNqbwQTs_8q1rJUSPr78akEOLYgJDXHgtLM,355 +textdistance/algorithms/__init__.py,sha256=1raagDGcgHenA-Ncj3oKHTCk0ai8ltLdqQzTA__clkg,217 +textdistance/algorithms/base.py,sha256=IJwzIa3G4n6piDS9dOhSAVUoHmD4sCJCvGHH1Z4F_0o,6332 +textdistance/algorithms/compression_based.py,sha256=qXg-jUm4ifd1jLLXhvrNkhbi-_JK5AQyjr4026qquVE,8190 +textdistance/algorithms/edit_based.py,sha256=OZc-sGjzRx0eFl5jsEA3V3Q5MkBJR5QLbZYiz_EAPL0,27598 +textdistance/algorithms/phonetic.py,sha256=E7yCZVV_6XDkq7tbLHmYd2CAIyj7VQcpf7rQhHXMMj8,6133 +textdistance/algorithms/sequence_based.py,sha256=0iS9iZkx_eYJQFZKjRpBFp8jCs1c_1Hz0kWq6CBnJVg,6158 +textdistance/algorithms/simple.py,sha256=2wryMhYmBRDGjG9AT74AAI9SpmYDLABqpSUbw_Fy8AU,3209 +textdistance/algorithms/token_based.py,sha256=QT36CbihwuurzVTG4CSYzmNAI3iJ_cmOngYAY8Lrkf8,9413 +textdistance/algorithms/types.py,sha256=PVVh0bcCEK8ziRsmKgHyIJ8i9TERKaGoVA36_5lnAr0,166 +textdistance/algorithms/vector_based.py,sha256=jmbeSioJlATSlx097ptcJRl0G6dHzp2x_fyOcKYY6ZE,2821 +textdistance/benchmark.py,sha256=NpxvQQgBFVElQrG0wP44AlmcxEntLI11qj1A0KFSrCY,3818 +textdistance/libraries.json,sha256=bZw0jXy6oPnKr7VPu0LyOMDA1EAUoF-TDwjazl3lknc,1161 +textdistance/libraries.py,sha256=GGQsTRlyMOoak2WQ1w_mESgDzmcYeUiCHmWqP0s8ncI,6716 +textdistance/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +textdistance/utils.py,sha256=SDJclnzpkOpoyJmZ23AO7JZQfdsdpWmOO0xofzi95YQ,783 diff --git a/libs/textdistance-4.6.2.dist-info/REQUESTED b/libs/textdistance-4.6.3.dist-info/REQUESTED similarity index 100% rename from libs/textdistance-4.6.2.dist-info/REQUESTED rename to libs/textdistance-4.6.3.dist-info/REQUESTED diff --git a/libs/textdistance-4.6.3.dist-info/WHEEL b/libs/textdistance-4.6.3.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/textdistance-4.6.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/textdistance-4.6.2.dist-info/top_level.txt b/libs/textdistance-4.6.3.dist-info/top_level.txt similarity index 100% rename from libs/textdistance-4.6.2.dist-info/top_level.txt rename to libs/textdistance-4.6.3.dist-info/top_level.txt diff --git a/libs/textdistance/algorithms/token_based.py b/libs/textdistance/algorithms/token_based.py index 3dd8c07fd..d499b8468 100644 --- a/libs/textdistance/algorithms/token_based.py +++ b/libs/textdistance/algorithms/token_based.py @@ -15,7 +15,7 @@ 'Jaccard', 'Sorensen', 'Tversky', 'Overlap', 'Cosine', 'Tanimoto', 'MongeElkan', 'Bag', - 'jaccard', 'sorensen', 'tversky', 'sorensen_dice', + 'jaccard', 'sorensen', 'tversky', 'sorensen_dice', 'dice', 'overlap', 'cosine', 'tanimoto', 'monge_elkan', 'bag', ] diff --git a/libs/tld-0.13.dist-info/RECORD b/libs/tld-0.13.dist-info/RECORD index 8aa81a595..e4ef5fe2a 100644 --- a/libs/tld-0.13.dist-info/RECORD +++ b/libs/tld-0.13.dist-info/RECORD @@ -4,7 +4,7 @@ tld-0.13.dist-info/LICENSE_LGPL_2.1.txt,sha256=lhMXOO1t3BzePhSCoSWiJ7WltJiBMbC0v tld-0.13.dist-info/METADATA,sha256=PchbNu-mskdDUuPHmlKPVxtz87CEFkgMJS3dPMg4-ek,9412 tld-0.13.dist-info/RECORD,, tld-0.13.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tld-0.13.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110 +tld-0.13.dist-info/WHEEL,sha256=TJ49d73sNs10F0aze1W_bTW2P_X7-F4YXOlBqoqA-jY,109 tld-0.13.dist-info/entry_points.txt,sha256=9Lt5EVKQYjI_rCULtund6omvOBP2GGt-eOqScX-yyPk,68 tld-0.13.dist-info/top_level.txt,sha256=e6zHqPEXgmXJdg57TauJs82kkabhIofwO_J2n7-olDc,4 tld/__init__.py,sha256=o15veYtcZ8LenSgXY-Hmtoa8ALABZ4_i-5Yx0euHRCc,441 diff --git a/libs/tld-0.13.dist-info/WHEEL b/libs/tld-0.13.dist-info/WHEEL index 4724c4573..17c0299e4 100644 --- a/libs/tld-0.13.dist-info/WHEEL +++ b/libs/tld-0.13.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/libs/tqdm-4.66.2.dist-info/RECORD b/libs/tqdm-4.66.2.dist-info/RECORD deleted file mode 100644 index 20f15e8e7..000000000 --- a/libs/tqdm-4.66.2.dist-info/RECORD +++ /dev/null @@ -1,43 +0,0 @@ -../../bin/tqdm,sha256=sIQGANa0Ss4XAwHxESDSgOd-paMFKgM1S2k-LA3IZ0c,230 -tqdm-4.66.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -tqdm-4.66.2.dist-info/LICENCE,sha256=3DMlLoKQFeOxUAhvubOkD2rW-zLC9GEM6BL6Z301mGo,1985 -tqdm-4.66.2.dist-info/METADATA,sha256=hqX0to0oQdiQK_4I-kKeZTMZVBuSLqQlR-stAlZWUe4,57587 -tqdm-4.66.2.dist-info/RECORD,, -tqdm-4.66.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tqdm-4.66.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -tqdm-4.66.2.dist-info/entry_points.txt,sha256=ReJCH7Ui3Zyh6M16E4OhsZ1oU7WtMXCfbtoyBhGO29Y,39 -tqdm-4.66.2.dist-info/top_level.txt,sha256=NLiUJNfmc9At15s7JURiwvqMEjUi9G5PMGRrmMYzNSM,5 -tqdm/__init__.py,sha256=9mQNYSSqP99JasubEC1POJLMmhkkBH6cJZxPIR5G2pQ,1572 -tqdm/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 -tqdm/_dist_ver.py,sha256=WtMQthlgvWIN7EQ42ET8BE1M6YXdXKafzqbKD3PLmGk,23 -tqdm/_main.py,sha256=9ySvgmi_2Sw4CAo5UDW0Q2dxfTryboEWGHohfCJz0sA,283 -tqdm/_monitor.py,sha256=Uku-DPWgzJ7dO5CK08xKJK-E_F6qQ-JB3ksuXczSYR0,3699 -tqdm/_tqdm.py,sha256=LfLCuJ6bpsVo9xilmtBXyEm1vGnUCFrliW85j3J-nD4,283 -tqdm/_tqdm_gui.py,sha256=03Hc8KayxJveieI5-0-2NGiDpLvw9jZekofJUV7CCwk,287 -tqdm/_tqdm_notebook.py,sha256=BuHiLuxu6uEfZFaPJW3RPpPaxaVctEQA3kdSJSDL1hw,307 -tqdm/_tqdm_pandas.py,sha256=c9jptUgigN6axRDhRd4Rif98Tmxeopc1nFNFhIpbFUE,888 -tqdm/_utils.py,sha256=_4E73bfDj4f1s3sM42NLHNrZDOkijZoWq-n6xWLkdZ8,553 -tqdm/asyncio.py,sha256=WcWbVEjc1-GxqnN0BVntDuwYR31JN9SV7ERZhEz8kKo,2775 -tqdm/auto.py,sha256=nDZflj6p2zKkjBCNBourrhS81zYfZy1_dQvbckrdW8o,871 -tqdm/autonotebook.py,sha256=Yb9F5uaiBPhfbDDFpbtoG8I2YUw3uQJ89rUDLbfR6ws,956 -tqdm/cli.py,sha256=RZh5sKVclaNp_7tZ3iCXWJB3-V6KfeQNNw7mZ818gMc,10594 -tqdm/completion.sh,sha256=j79KbSmpIj_E11jfTfBXrGnUTzKXVpQ1vGVQvsyDRl4,946 -tqdm/contrib/__init__.py,sha256=cNNaRURdcPjbQpkxPGe4iaShyQr_Dx8h6NQJubPhq7g,2513 -tqdm/contrib/bells.py,sha256=Yx1HqGCmHrESCAO700j5wE__JCleNODJxedh1ijPLD0,837 -tqdm/contrib/concurrent.py,sha256=K1yjloKS5WRNFyjLRth0DmU5PAnDbF0A-GD27N-J4a8,3986 -tqdm/contrib/discord.py,sha256=hhbOL1VGTWXQ4z1RUsIybhga7oUMYH5CoAkNWTt7t70,3962 -tqdm/contrib/itertools.py,sha256=WdKKQU5eSzsqHu29SN_oH12huYZo0Jihqoi9-nVhwz4,774 -tqdm/contrib/logging.py,sha256=aUvbBPGm0jetH22p1H5bobkdzewwYpXkdO8C_6nmAJk,3785 -tqdm/contrib/slack.py,sha256=CYIzKBgbk0azM19F4kSA8Ccod9I8hNfuscbcc9kjGYU,4068 -tqdm/contrib/telegram.py,sha256=ICWNBIb-l-quSgjKw4PhRdrH2_bKk7umy6BfEsp9EuU,5100 -tqdm/contrib/utils_worker.py,sha256=HJP5Mz1S1xyzEke2JaqJ2sYLHXADYoo2epT5AzQ38eA,1207 -tqdm/dask.py,sha256=RWR3rz9s36zNceeESTm-F3H1F7dxuBuqS1bhifOuvEY,1337 -tqdm/gui.py,sha256=LhGizt5G1w4f17OjFRBWza8MEmQZjrFgTx9Y9Lc7-gA,5809 -tqdm/keras.py,sha256=op9sBkb6q6c6dw2wJ0SD2ZwpPK7yM1Vbg4l1Qiy3MIo,4373 -tqdm/notebook.py,sha256=A6waQCPa0Ud3OrByzZwj91STnhwoJ1Ui3THrmQBZjqE,11023 -tqdm/rich.py,sha256=8SamiW-LlUKEMQwzubomHCXkX6awaz-7Tq-gnMkJJ5A,5018 -tqdm/std.py,sha256=AuM80Fy023Ex6N7J8TP8XaJehJLo8OnjIfLk9r7j7T4,57478 -tqdm/tk.py,sha256=Hp9QwXTsihURoxt5aXbIe8Cu1qjLBZzkhfl_nAgD418,6727 -tqdm/tqdm.1,sha256=aILyUPk2S4OPe_uWy2P4AMjUf0oQ6PUW0nLYXB-BWwI,7889 -tqdm/utils.py,sha256=abBTZZ38isuYMR38AgZ-nQzC-KvRn8M-mFCuzFpgsuA,11883 -tqdm/version.py,sha256=-1yWjfu3P0eghVsysHH07fbzdiADNRdzRtYPqOaqR2A,333 diff --git a/libs/tqdm-4.66.2.dist-info/WHEEL b/libs/tqdm-4.66.2.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/tqdm-4.66.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/tqdm-4.66.2.dist-info/INSTALLER b/libs/tqdm-4.66.6.dist-info/INSTALLER similarity index 100% rename from libs/tqdm-4.66.2.dist-info/INSTALLER rename to libs/tqdm-4.66.6.dist-info/INSTALLER diff --git a/libs/tqdm-4.66.2.dist-info/LICENCE b/libs/tqdm-4.66.6.dist-info/LICENCE similarity index 100% rename from libs/tqdm-4.66.2.dist-info/LICENCE rename to libs/tqdm-4.66.6.dist-info/LICENCE diff --git a/libs/tqdm-4.66.2.dist-info/METADATA b/libs/tqdm-4.66.6.dist-info/METADATA similarity index 98% rename from libs/tqdm-4.66.2.dist-info/METADATA rename to libs/tqdm-4.66.6.dist-info/METADATA index 3dd9013fb..a39d2312a 100644 --- a/libs/tqdm-4.66.2.dist-info/METADATA +++ b/libs/tqdm-4.66.6.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: tqdm -Version: 4.66.2 +Version: 4.66.6 Summary: Fast, Extensible Progress Meter Maintainer-email: tqdm developers <devs@tqdm.ml> License: MPL-2.0 AND MIT @@ -42,6 +42,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 :: 3.12 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: Implementation Classifier: Programming Language :: Python :: Implementation :: IronPython @@ -66,18 +67,18 @@ Classifier: Topic :: Utilities Requires-Python: >=3.7 Description-Content-Type: text/x-rst License-File: LICENCE -Requires-Dist: colorama ; platform_system == "Windows" +Requires-Dist: colorama; platform_system == "Windows" Provides-Extra: dev -Requires-Dist: pytest >=6 ; extra == 'dev' -Requires-Dist: pytest-cov ; extra == 'dev' -Requires-Dist: pytest-timeout ; extra == 'dev' -Requires-Dist: pytest-xdist ; extra == 'dev' +Requires-Dist: pytest>=6; extra == "dev" +Requires-Dist: pytest-cov; extra == "dev" +Requires-Dist: pytest-timeout; extra == "dev" +Requires-Dist: pytest-xdist; extra == "dev" Provides-Extra: notebook -Requires-Dist: ipywidgets >=6 ; extra == 'notebook' +Requires-Dist: ipywidgets>=6; extra == "notebook" Provides-Extra: slack -Requires-Dist: slack-sdk ; extra == 'slack' +Requires-Dist: slack-sdk; extra == "slack" Provides-Extra: telegram -Requires-Dist: requests ; extra == 'telegram' +Requires-Dist: requests; extra == "telegram" |Logo| @@ -847,7 +848,7 @@ Additional ``bar_format`` parameters may also be defined by overriding """Provides a `total_time` format parameter""" @property def format_dict(self): - d = super(TqdmExtraFormat, self).format_dict + d = super().format_dict total_time = d["elapsed"] * (d["total"] or 0) / max(d["n"], 1) d.update(total_time=self.format_interval(total_time) + " in total") return d @@ -1063,7 +1064,7 @@ custom callback take advantage of this, simply use the return value of class TqdmExt(std_tqdm): def update(self, n=1): - displayed = super(TqdmExt, self).update(n) + displayed = super().update(n) if displayed: external_callback(**self.format_dict) return displayed @@ -1586,5 +1587,5 @@ Citation information: |DOI| .. |Screenshot-Jupyter1| image:: https://tqdm.github.io/img/jupyter-1.gif .. |Screenshot-Jupyter2| image:: https://tqdm.github.io/img/jupyter-2.gif .. |Screenshot-Jupyter3| image:: https://tqdm.github.io/img/jupyter-3.gif -.. |README-Hits| image:: https://caspersci.uk.to/cgi-bin/hits.cgi?q=tqdm&style=social&r=https://github.com/tqdm/tqdm&l=https://tqdm.github.io/img/favicon.png&f=https://tqdm.github.io/img/logo.gif - :target: https://caspersci.uk.to/cgi-bin/hits.cgi?q=tqdm&a=plot&r=https://github.com/tqdm/tqdm&l=https://tqdm.github.io/img/favicon.png&f=https://tqdm.github.io/img/logo.gif&style=social +.. |README-Hits| image:: https://cgi.cdcl.ml/hits?q=tqdm&style=social&r=https://github.com/tqdm/tqdm&l=https://tqdm.github.io/img/favicon.png&f=https://tqdm.github.io/img/logo.gif + :target: https://cgi.cdcl.ml/hits?q=tqdm&a=plot&r=https://github.com/tqdm/tqdm&l=https://tqdm.github.io/img/favicon.png&f=https://tqdm.github.io/img/logo.gif&style=social diff --git a/libs/tqdm-4.66.6.dist-info/RECORD b/libs/tqdm-4.66.6.dist-info/RECORD new file mode 100644 index 000000000..5ed127ab2 --- /dev/null +++ b/libs/tqdm-4.66.6.dist-info/RECORD @@ -0,0 +1,43 @@ +../../bin/tqdm,sha256=sIQGANa0Ss4XAwHxESDSgOd-paMFKgM1S2k-LA3IZ0c,230 +tqdm-4.66.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +tqdm-4.66.6.dist-info/LICENCE,sha256=3DMlLoKQFeOxUAhvubOkD2rW-zLC9GEM6BL6Z301mGo,1985 +tqdm-4.66.6.dist-info/METADATA,sha256=fGOzO1tkAvMSMmuQrb-to3zpcAsLN7LlJ6f8-I0L1VI,57562 +tqdm-4.66.6.dist-info/RECORD,, +tqdm-4.66.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tqdm-4.66.6.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +tqdm-4.66.6.dist-info/entry_points.txt,sha256=ReJCH7Ui3Zyh6M16E4OhsZ1oU7WtMXCfbtoyBhGO29Y,39 +tqdm-4.66.6.dist-info/top_level.txt,sha256=NLiUJNfmc9At15s7JURiwvqMEjUi9G5PMGRrmMYzNSM,5 +tqdm/__init__.py,sha256=9mQNYSSqP99JasubEC1POJLMmhkkBH6cJZxPIR5G2pQ,1572 +tqdm/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +tqdm/_dist_ver.py,sha256=pjja9d_4fZAsKZvXK6PdorstRyGb6VfRnVMJpaotC_E,23 +tqdm/_main.py,sha256=9ySvgmi_2Sw4CAo5UDW0Q2dxfTryboEWGHohfCJz0sA,283 +tqdm/_monitor.py,sha256=Uku-DPWgzJ7dO5CK08xKJK-E_F6qQ-JB3ksuXczSYR0,3699 +tqdm/_tqdm.py,sha256=LfLCuJ6bpsVo9xilmtBXyEm1vGnUCFrliW85j3J-nD4,283 +tqdm/_tqdm_gui.py,sha256=03Hc8KayxJveieI5-0-2NGiDpLvw9jZekofJUV7CCwk,287 +tqdm/_tqdm_notebook.py,sha256=BuHiLuxu6uEfZFaPJW3RPpPaxaVctEQA3kdSJSDL1hw,307 +tqdm/_tqdm_pandas.py,sha256=c9jptUgigN6axRDhRd4Rif98Tmxeopc1nFNFhIpbFUE,888 +tqdm/_utils.py,sha256=_4E73bfDj4f1s3sM42NLHNrZDOkijZoWq-n6xWLkdZ8,553 +tqdm/asyncio.py,sha256=Kp2rSkNRf9KRqa3d9YpgeZQ7L7EZf2Ki4bSc7UPIyoo,2757 +tqdm/auto.py,sha256=nDZflj6p2zKkjBCNBourrhS81zYfZy1_dQvbckrdW8o,871 +tqdm/autonotebook.py,sha256=Yb9F5uaiBPhfbDDFpbtoG8I2YUw3uQJ89rUDLbfR6ws,956 +tqdm/cli.py,sha256=SbKlN8QyZ2ogenqt-wT_p6_sx2OOdCjCyhoZBFnlmyI,11010 +tqdm/completion.sh,sha256=j79KbSmpIj_E11jfTfBXrGnUTzKXVpQ1vGVQvsyDRl4,946 +tqdm/contrib/__init__.py,sha256=OgSwVXm-vlDJ-2imtoQ9z8qdom4snMSRztH72KMA82A,2494 +tqdm/contrib/bells.py,sha256=Yx1HqGCmHrESCAO700j5wE__JCleNODJxedh1ijPLD0,837 +tqdm/contrib/concurrent.py,sha256=K1yjloKS5WRNFyjLRth0DmU5PAnDbF0A-GD27N-J4a8,3986 +tqdm/contrib/discord.py,sha256=CCr_Rj-kodhXhp2XT06p_Uy_lM3i-ZfUC-8Tf1pga9w,3893 +tqdm/contrib/itertools.py,sha256=WdKKQU5eSzsqHu29SN_oH12huYZo0Jihqoi9-nVhwz4,774 +tqdm/contrib/logging.py,sha256=NsYtnKttj2mMrGm58mEdo5a9DP_2vv8pZyrimSuWulA,3760 +tqdm/contrib/slack.py,sha256=eP_Mr5sQonYniHxxQNGue3jk2JkIPmPWFZqIYxnOui0,4007 +tqdm/contrib/telegram.py,sha256=vn_9SATMbbwn2PAbzSDyOX6av3eBB01QBug11P4H-Og,5008 +tqdm/contrib/utils_worker.py,sha256=HJP5Mz1S1xyzEke2JaqJ2sYLHXADYoo2epT5AzQ38eA,1207 +tqdm/dask.py,sha256=9Ei58eVqTossRLhAfWyUFCduXYKjmLmwkaXIy-CHYfs,1319 +tqdm/gui.py,sha256=4Oi-iBTGEG3uQUFuRKR1fkqwAamABQTO6sWQmJhI6vs,5795 +tqdm/keras.py,sha256=op9sBkb6q6c6dw2wJ0SD2ZwpPK7yM1Vbg4l1Qiy3MIo,4373 +tqdm/notebook.py,sha256=GtZ3IapLL1v8WNDaTSvPw0bJGTyfp71Vfz5HDnAzx1M,10895 +tqdm/rich.py,sha256=YyMPkEHVyYUVUR3adJKbVX26iTmNKpNMf3DEqmm-m60,5021 +tqdm/std.py,sha256=tWjz6-QCa92aqYjz7PIdkLUCAfiy-lJZheBtZyIIyO0,57461 +tqdm/tk.py,sha256=Gu0uwXwLCGPRGHORdi3WvBLGiseUp_xxX_h_gp9VpK0,6701 +tqdm/tqdm.1,sha256=aILyUPk2S4OPe_uWy2P4AMjUf0oQ6PUW0nLYXB-BWwI,7889 +tqdm/utils.py,sha256=6E0BQw3Sg7uGWKBM_cDn3P42tXswRhzkggbhBgLDjl8,11821 +tqdm/version.py,sha256=-1yWjfu3P0eghVsysHH07fbzdiADNRdzRtYPqOaqR2A,333 diff --git a/libs/tqdm-4.66.2.dist-info/REQUESTED b/libs/tqdm-4.66.6.dist-info/REQUESTED similarity index 100% rename from libs/tqdm-4.66.2.dist-info/REQUESTED rename to libs/tqdm-4.66.6.dist-info/REQUESTED diff --git a/libs/tqdm-4.66.6.dist-info/WHEEL b/libs/tqdm-4.66.6.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/tqdm-4.66.6.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/tqdm-4.66.2.dist-info/entry_points.txt b/libs/tqdm-4.66.6.dist-info/entry_points.txt similarity index 100% rename from libs/tqdm-4.66.2.dist-info/entry_points.txt rename to libs/tqdm-4.66.6.dist-info/entry_points.txt diff --git a/libs/tqdm-4.66.2.dist-info/top_level.txt b/libs/tqdm-4.66.6.dist-info/top_level.txt similarity index 100% rename from libs/tqdm-4.66.2.dist-info/top_level.txt rename to libs/tqdm-4.66.6.dist-info/top_level.txt diff --git a/libs/tqdm/_dist_ver.py b/libs/tqdm/_dist_ver.py index 63c9d0ae8..dd70c503d 100644 --- a/libs/tqdm/_dist_ver.py +++ b/libs/tqdm/_dist_ver.py @@ -1 +1 @@ -__version__ = '4.66.2' +__version__ = '4.66.6' diff --git a/libs/tqdm/asyncio.py b/libs/tqdm/asyncio.py index ddc89b853..2d00a0a2e 100644 --- a/libs/tqdm/asyncio.py +++ b/libs/tqdm/asyncio.py @@ -21,7 +21,7 @@ class tqdm_asyncio(std_tqdm): Asynchronous-friendly version of tqdm. """ def __init__(self, iterable=None, *args, **kwargs): - super(tqdm_asyncio, self).__init__(iterable, *args, **kwargs) + super().__init__(iterable, *args, **kwargs) self.iterable_awaitable = False if iterable is not None: if hasattr(iterable, "__anext__"): diff --git a/libs/tqdm/cli.py b/libs/tqdm/cli.py index 1223d4977..e54a7fc85 100644 --- a/libs/tqdm/cli.py +++ b/libs/tqdm/cli.py @@ -5,6 +5,7 @@ import re import sys from ast import literal_eval as numeric +from textwrap import indent from .std import TqdmKeyError, TqdmTypeError, tqdm from .version import __version__ @@ -21,23 +22,34 @@ def cast(val, typ): return cast(val, t) except TqdmTypeError: pass - raise TqdmTypeError(val + ' : ' + typ) + raise TqdmTypeError(f"{val} : {typ}") # sys.stderr.write('\ndebug | `val:type`: `' + val + ':' + typ + '`.\n') if typ == 'bool': if (val == 'True') or (val == ''): return True - elif val == 'False': + if val == 'False': return False - else: - raise TqdmTypeError(val + ' : ' + typ) - try: - return eval(typ + '("' + val + '")') - except Exception: - if typ == 'chr': - return chr(ord(eval('"' + val + '"'))).encode() - else: - raise TqdmTypeError(val + ' : ' + typ) + raise TqdmTypeError(val + ' : ' + typ) + if typ == 'chr': + if len(val) == 1: + return val.encode() + if re.match(r"^\\\w+$", val): + return eval(f'"{val}"').encode() + raise TqdmTypeError(f"{val} : {typ}") + if typ == 'str': + return val + if typ == 'int': + try: + return int(val) + except ValueError as exc: + raise TqdmTypeError(f"{val} : {typ}") from exc + if typ == 'float': + try: + return float(val) + except ValueError as exc: + raise TqdmTypeError(f"{val} : {typ}") from exc + raise TqdmTypeError(f"{val} : {typ}") def posix_pipe(fin, fout, delim=b'\\n', buf_size=256, @@ -166,7 +178,9 @@ def main(fp=sys.stderr, argv=None): logging.basicConfig(level=getattr(logging, logLevel), format="%(levelname)s:%(module)s:%(lineno)d:%(message)s") - d = tqdm.__doc__ + CLI_EXTRA_DOC + # py<3.13 doesn't dedent docstrings + d = (tqdm.__doc__ if sys.version_info < (3, 13) + else indent(tqdm.__doc__, " ")) + CLI_EXTRA_DOC opt_types = dict(RE_OPTS.findall(d)) # opt_types['delim'] = 'chr' @@ -244,22 +258,21 @@ def write(_): stdout = getattr(stdout, 'buffer', stdout) stdin = getattr(sys.stdin, 'buffer', sys.stdin) if manpath or comppath: - from importlib import resources - from os import path - from shutil import copyfile + try: # py<3.9 + import importlib_resources as resources + except ImportError: + from importlib import resources + from pathlib import Path def cp(name, dst): """copy resource `name` to `dst`""" - if hasattr(resources, 'files'): - copyfile(str(resources.files('tqdm') / name), dst) - else: # py<3.9 - with resources.path('tqdm', name) as src: - copyfile(str(src), dst) + fi = resources.files('tqdm') / name + dst.write_bytes(fi.read_bytes()) log.info("written:%s", dst) if manpath is not None: - cp('tqdm.1', path.join(manpath, 'tqdm.1')) + cp('tqdm.1', Path(manpath) / 'tqdm.1') if comppath is not None: - cp('completion.sh', path.join(comppath, 'tqdm_completion.sh')) + cp('completion.sh', Path(comppath) / 'tqdm_completion.sh') sys.exit(0) if tee: stdout_write = stdout.write diff --git a/libs/tqdm/contrib/__init__.py b/libs/tqdm/contrib/__init__.py index 7338c960a..d059461f9 100644 --- a/libs/tqdm/contrib/__init__.py +++ b/libs/tqdm/contrib/__init__.py @@ -17,7 +17,7 @@ class DummyTqdmFile(ObjectWrapper): """Dummy file-like that will write to tqdm""" def __init__(self, wrapped): - super(DummyTqdmFile, self).__init__(wrapped) + super().__init__(wrapped) self._buf = [] def write(self, x, nolock=False): diff --git a/libs/tqdm/contrib/discord.py b/libs/tqdm/contrib/discord.py index 1e4130828..fd663f981 100644 --- a/libs/tqdm/contrib/discord.py +++ b/libs/tqdm/contrib/discord.py @@ -27,7 +27,7 @@ class DiscordIO(MonoWorker): """Non-blocking file-like IO using a Discord Bot.""" def __init__(self, token, channel_id): """Creates a new message in the given `channel_id`.""" - super(DiscordIO, self).__init__() + super().__init__() config = ClientConfig() config.token = token client = Client(config) @@ -91,10 +91,10 @@ def __init__(self, *args, **kwargs): kwargs.pop('token', getenv("TQDM_DISCORD_TOKEN")), kwargs.pop('channel_id', getenv("TQDM_DISCORD_CHANNEL_ID"))) kwargs['mininterval'] = max(1.5, kwargs.get('mininterval', 1.5)) - super(tqdm_discord, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def display(self, **kwargs): - super(tqdm_discord, self).display(**kwargs) + super().display(**kwargs) fmt = self.format_dict if fmt.get('bar_format', None): fmt['bar_format'] = fmt['bar_format'].replace( @@ -104,7 +104,7 @@ def display(self, **kwargs): self.dio.write(self.format_meter(**fmt)) def clear(self, *args, **kwargs): - super(tqdm_discord, self).clear(*args, **kwargs) + super().clear(*args, **kwargs) if not self.disable: self.dio.write("") diff --git a/libs/tqdm/contrib/logging.py b/libs/tqdm/contrib/logging.py index b8eaec53f..e06febe37 100644 --- a/libs/tqdm/contrib/logging.py +++ b/libs/tqdm/contrib/logging.py @@ -18,7 +18,7 @@ def __init__( self, tqdm_class=std_tqdm # type: Type[std_tqdm] ): - super(_TqdmLoggingHandler, self).__init__() + super().__init__() self.tqdm_class = tqdm_class def emit(self, record): diff --git a/libs/tqdm/contrib/slack.py b/libs/tqdm/contrib/slack.py index d4c850ca4..9bca8ee98 100644 --- a/libs/tqdm/contrib/slack.py +++ b/libs/tqdm/contrib/slack.py @@ -27,7 +27,7 @@ class SlackIO(MonoWorker): """Non-blocking file-like IO using a Slack app.""" def __init__(self, token, channel): """Creates a new message in the given `channel`.""" - super(SlackIO, self).__init__() + super().__init__() self.client = WebClient(token=token) self.text = self.__class__.__name__ try: @@ -88,10 +88,10 @@ def __init__(self, *args, **kwargs): kwargs.pop('token', getenv("TQDM_SLACK_TOKEN")), kwargs.pop('channel', getenv("TQDM_SLACK_CHANNEL"))) kwargs['mininterval'] = max(1.5, kwargs.get('mininterval', 1.5)) - super(tqdm_slack, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def display(self, **kwargs): - super(tqdm_slack, self).display(**kwargs) + super().display(**kwargs) fmt = self.format_dict if fmt.get('bar_format', None): fmt['bar_format'] = fmt['bar_format'].replace( @@ -105,7 +105,7 @@ def display(self, **kwargs): self.sio.write(self.format_meter(**fmt)) def clear(self, *args, **kwargs): - super(tqdm_slack, self).clear(*args, **kwargs) + super().clear(*args, **kwargs) if not self.disable: self.sio.write("") diff --git a/libs/tqdm/contrib/telegram.py b/libs/tqdm/contrib/telegram.py index cbeadf20f..019151800 100644 --- a/libs/tqdm/contrib/telegram.py +++ b/libs/tqdm/contrib/telegram.py @@ -27,7 +27,7 @@ class TelegramIO(MonoWorker): def __init__(self, token, chat_id): """Creates a new message in the given `chat_id`.""" - super(TelegramIO, self).__init__() + super().__init__() self.token = token self.chat_id = chat_id self.session = Session() @@ -118,10 +118,10 @@ def __init__(self, *args, **kwargs): self.tgio = TelegramIO( kwargs.pop('token', getenv('TQDM_TELEGRAM_TOKEN')), kwargs.pop('chat_id', getenv('TQDM_TELEGRAM_CHAT_ID'))) - super(tqdm_telegram, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def display(self, **kwargs): - super(tqdm_telegram, self).display(**kwargs) + super().display(**kwargs) fmt = self.format_dict if fmt.get('bar_format', None): fmt['bar_format'] = fmt['bar_format'].replace( @@ -131,14 +131,14 @@ def display(self, **kwargs): self.tgio.write(self.format_meter(**fmt)) def clear(self, *args, **kwargs): - super(tqdm_telegram, self).clear(*args, **kwargs) + super().clear(*args, **kwargs) if not self.disable: self.tgio.write("") def close(self): if self.disable: return - super(tqdm_telegram, self).close() + super().close() if not (self.leave or (self.leave is None and self.pos == 0)): self.tgio.delete() diff --git a/libs/tqdm/dask.py b/libs/tqdm/dask.py index af9926a27..57f1b668f 100644 --- a/libs/tqdm/dask.py +++ b/libs/tqdm/dask.py @@ -20,7 +20,7 @@ def __init__(self, start=None, pretask=None, tqdm_class=tqdm_auto, tqdm_kwargs : optional Any other arguments used for all bars. """ - super(TqdmCallback, self).__init__(start=start, pretask=pretask) + super().__init__(start=start, pretask=pretask) if tqdm_kwargs: tqdm_class = partial(tqdm_class, **tqdm_kwargs) self.tqdm_class = tqdm_class diff --git a/libs/tqdm/gui.py b/libs/tqdm/gui.py index 8bab6ac78..1a806819e 100644 --- a/libs/tqdm/gui.py +++ b/libs/tqdm/gui.py @@ -32,7 +32,7 @@ def __init__(self, *args, **kwargs): kwargs = kwargs.copy() kwargs['gui'] = True colour = kwargs.pop('colour', 'g') - super(tqdm_gui, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) if self.disable: return diff --git a/libs/tqdm/notebook.py b/libs/tqdm/notebook.py index 6ee43a6c2..77b91bdd4 100644 --- a/libs/tqdm/notebook.py +++ b/libs/tqdm/notebook.py @@ -80,7 +80,7 @@ def _json_(self, pretty=None): def __repr__(self, pretty=False): pbar = getattr(self, 'pbar', None) if pbar is None: - return super(TqdmHBox, self).__repr__() + return super().__repr__() return pbar.format_meter(**self._json_(pretty)) def _repr_pretty_(self, pp, *_, **__): @@ -220,7 +220,7 @@ def __init__(self, *args, **kwargs): kwargs['disable'] = bool(kwargs.get('disable', False)) colour = kwargs.pop('colour', None) display_here = kwargs.pop('display', True) - super(tqdm_notebook, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) if self.disable or not kwargs['gui']: self.disp = lambda *_, **__: None return @@ -246,7 +246,7 @@ def __init__(self, *args, **kwargs): def __iter__(self): try: - it = super(tqdm_notebook, self).__iter__() + it = super().__iter__() for obj in it: # return super(tqdm...) will not catch exception yield obj @@ -259,7 +259,7 @@ def __iter__(self): def update(self, n=1): try: - return super(tqdm_notebook, self).update(n=n) + return super().update(n=n) # NB: except ... [ as ...] breaks IPython async KeyboardInterrupt except: # NOQA # cannot catch KeyboardInterrupt when using manual tqdm @@ -272,7 +272,7 @@ def update(self, n=1): def close(self): if self.disable: return - super(tqdm_notebook, self).close() + super().close() # Try to detect if there was an error or KeyboardInterrupt # in manual mode: if n < total, things probably got wrong if self.total and self.n < self.total: @@ -297,14 +297,14 @@ def reset(self, total=None): total : int or float, optional. Total to use for the new bar. """ if self.disable: - return super(tqdm_notebook, self).reset(total=total) + return super().reset(total=total) _, pbar, _ = self.container.children pbar.bar_style = '' if total is not None: pbar.max = total if not self.total and self.ncols is None: # no longer unknown total pbar.layout.width = None # reset width - return super(tqdm_notebook, self).reset(total=total) + return super().reset(total=total) def tnrange(*args, **kwargs): diff --git a/libs/tqdm/rich.py b/libs/tqdm/rich.py index 00e1ddf26..3d392edaf 100644 --- a/libs/tqdm/rich.py +++ b/libs/tqdm/rich.py @@ -90,7 +90,7 @@ def __init__(self, *args, **kwargs): kwargs['disable'] = bool(kwargs.get('disable', False)) progress = kwargs.pop('progress', None) options = kwargs.pop('options', {}).copy() - super(tqdm_rich, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) if self.disable: return @@ -116,7 +116,8 @@ def __init__(self, *args, **kwargs): def close(self): if self.disable: return - super(tqdm_rich, self).close() + self.display() # print 100%, vis #1306 + super().close() self._prog.__exit__(None, None, None) def clear(self, *_, **__): @@ -137,7 +138,7 @@ def reset(self, total=None): """ if hasattr(self, '_prog'): self._prog.reset(total=total) - super(tqdm_rich, self).reset(total=total) + super().reset(total=total) def trrange(*args, **kwargs): diff --git a/libs/tqdm/std.py b/libs/tqdm/std.py index e58fdca91..e91ad3090 100644 --- a/libs/tqdm/std.py +++ b/libs/tqdm/std.py @@ -46,7 +46,7 @@ def __init__(self, msg, fp_write=None, *a, **k): if fp_write is not None: fp_write("\n" + self.__class__.__name__ + ": " + str(msg).rstrip() + '\n') else: - super(TqdmWarning, self).__init__(msg, *a, **k) + super().__init__(msg, *a, **k) class TqdmExperimentalWarning(TqdmWarning, FutureWarning): diff --git a/libs/tqdm/tk.py b/libs/tqdm/tk.py index dfebf5c74..788303c86 100644 --- a/libs/tqdm/tk.py +++ b/libs/tqdm/tk.py @@ -53,7 +53,7 @@ def __init__(self, *args, **kwargs): grab = kwargs.pop('grab', False) tk_parent = kwargs.pop('tk_parent', None) self._cancel_callback = kwargs.pop('cancel_callback', None) - super(tqdm_tk, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) if self.disable: return @@ -172,7 +172,7 @@ def reset(self, total=None): self._tk_pbar.configure(maximum=100, mode="indeterminate") else: self._tk_pbar.configure(maximum=total, mode="determinate") - super(tqdm_tk, self).reset(total=total) + super().reset(total=total) @staticmethod def _tk_dispatching_helper(): diff --git a/libs/tqdm/utils.py b/libs/tqdm/utils.py index 9883fdaea..af3ec7ded 100644 --- a/libs/tqdm/utils.py +++ b/libs/tqdm/utils.py @@ -14,7 +14,7 @@ _range, _unich, _unicode, _basestring = range, chr, str, str CUR_OS = sys.platform IS_WIN = any(CUR_OS.startswith(i) for i in ['win32', 'cygwin']) -IS_NIX = any(CUR_OS.startswith(i) for i in ['aix', 'linux', 'darwin']) +IS_NIX = any(CUR_OS.startswith(i) for i in ['aix', 'linux', 'darwin', 'freebsd']) RE_ANSI = re.compile(r"\x1b\[[;\d]*[A-Za-z]") try: @@ -167,7 +167,7 @@ class SimpleTextIOWrapper(ObjectWrapper): """ # pylint: disable=too-few-public-methods def __init__(self, wrapped, encoding): - super(SimpleTextIOWrapper, self).__init__(wrapped) + super().__init__(wrapped) self.wrapper_setattr('encoding', encoding) def write(self, s): @@ -211,7 +211,7 @@ def inner(*args, **kwargs): return inner def __init__(self, wrapped, tqdm_instance): - super(DisableOnWriteError, self).__init__(wrapped) + super().__init__(wrapped) if hasattr(wrapped, 'write'): self.wrapper_setattr( 'write', self.disable_on_exception(tqdm_instance, wrapped.write)) @@ -229,7 +229,7 @@ def __init__(self, callback, stream, method="read"): Wrap a given `file`-like object's `read()` or `write()` to report lengths to the given `callback` """ - super(CallbackIOWrapper, self).__init__(stream) + super().__init__(stream) func = getattr(stream, method) if method == "write": @wraps(func) diff --git a/libs/trakit-0.2.1.dist-info/WHEEL b/libs/trakit-0.2.1.dist-info/WHEEL deleted file mode 100644 index d73ccaae8..000000000 --- a/libs/trakit-0.2.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 1.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/libs/trakit-0.2.1.dist-info/INSTALLER b/libs/trakit-0.2.2.dist-info/INSTALLER similarity index 100% rename from libs/trakit-0.2.1.dist-info/INSTALLER rename to libs/trakit-0.2.2.dist-info/INSTALLER diff --git a/libs/trakit-0.2.1.dist-info/LICENSE b/libs/trakit-0.2.2.dist-info/LICENSE similarity index 100% rename from libs/trakit-0.2.1.dist-info/LICENSE rename to libs/trakit-0.2.2.dist-info/LICENSE diff --git a/libs/trakit-0.2.1.dist-info/METADATA b/libs/trakit-0.2.2.dist-info/METADATA similarity index 98% rename from libs/trakit-0.2.1.dist-info/METADATA rename to libs/trakit-0.2.2.dist-info/METADATA index ad31ab577..910bbe458 100644 --- a/libs/trakit-0.2.1.dist-info/METADATA +++ b/libs/trakit-0.2.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: trakit -Version: 0.2.1 +Version: 0.2.2 Summary: Guess additional information from track titles Home-page: https://github.com/ratoaq2/trakit License: MIT @@ -18,8 +18,8 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 Classifier: Topic :: Multimedia :: Video Classifier: Topic :: Software Development :: Libraries :: Python Modules Requires-Dist: babelfish (>=0.6.0,<0.7.0) diff --git a/libs/trakit-0.2.1.dist-info/RECORD b/libs/trakit-0.2.2.dist-info/RECORD similarity index 60% rename from libs/trakit-0.2.1.dist-info/RECORD rename to libs/trakit-0.2.2.dist-info/RECORD index 3aa7879fa..eaa8cb061 100644 --- a/libs/trakit-0.2.1.dist-info/RECORD +++ b/libs/trakit-0.2.2.dist-info/RECORD @@ -1,15 +1,15 @@ ../../bin/trakit,sha256=061GX_FSkORuBimuhcYrShFcfjURVuy8f4oP724YRaA,237 -trakit-0.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -trakit-0.2.1.dist-info/LICENSE,sha256=SQOlWLdyOaJn59XweZU7tqq5GShFrWixpgZA7BqePkc,1061 -trakit-0.2.1.dist-info/METADATA,sha256=RvJvZ6a9gfYBxdYYF1JrcMobicc5mRr8s9Pm2qGyxEI,5235 -trakit-0.2.1.dist-info/RECORD,, -trakit-0.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -trakit-0.2.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88 -trakit-0.2.1.dist-info/entry_points.txt,sha256=ua6hFDKScrfZ2Xs1RaVrkvyYK4QLZEfGRuqY6P7ZmV4,47 -trakit/__init__.py,sha256=PyNSXj0gDAbqM1pp1sBdLEagiws51ns-ZvfaQpUWLM0,398 +trakit-0.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +trakit-0.2.2.dist-info/LICENSE,sha256=SQOlWLdyOaJn59XweZU7tqq5GShFrWixpgZA7BqePkc,1061 +trakit-0.2.2.dist-info/METADATA,sha256=zm5ekYHajiNFnczuVNS-j2SNVaTpDMx1AW0qPH0uDBI,5236 +trakit-0.2.2.dist-info/RECORD,, +trakit-0.2.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +trakit-0.2.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 +trakit-0.2.2.dist-info/entry_points.txt,sha256=ua6hFDKScrfZ2Xs1RaVrkvyYK4QLZEfGRuqY6P7ZmV4,47 +trakit/__init__.py,sha256=oEfzI2hOhog85Ys5GkAWjEB8Jf80a0Kb86meZikhQyU,344 trakit/__main__.py,sha256=etlpZCxfmuCHoqbQEdC9SH58TzoW4ij_YtH7grvyWIM,3151 trakit/api.py,sha256=Lm03p5yFivTlgyCihqr0m0UaACkKboboKA7qL9j8T4c,757 -trakit/config.py,sha256=wQxO-mk5qmX1zSkoG-zrqymIBZ5GLenEGjzcfIo287Q,802 +trakit/config.py,sha256=mygnzoMCSIdeb0k3OmVGALcKGzyLMVvHYtuP2NwJRhY,970 trakit/context.py,sha256=Q-5FaoP3QNUfQCcstp0x2ygLbmScZ0GmnhxTg-JJ_-U,886 trakit/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 trakit/converters/country.py,sha256=eTQFtfO3bsd9vyqAhdjsBIkqN2ZbRaDn04zrobiUUQg,869 diff --git a/libs/trakit-0.2.1.dist-info/REQUESTED b/libs/trakit-0.2.2.dist-info/REQUESTED similarity index 100% rename from libs/trakit-0.2.1.dist-info/REQUESTED rename to libs/trakit-0.2.2.dist-info/REQUESTED diff --git a/libs/trakit-0.2.2.dist-info/WHEEL b/libs/trakit-0.2.2.dist-info/WHEEL new file mode 100644 index 000000000..8b9b3a1bf --- /dev/null +++ b/libs/trakit-0.2.2.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: poetry-core 1.9.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/libs/trakit-0.2.1.dist-info/entry_points.txt b/libs/trakit-0.2.2.dist-info/entry_points.txt similarity index 100% rename from libs/trakit-0.2.1.dist-info/entry_points.txt rename to libs/trakit-0.2.2.dist-info/entry_points.txt diff --git a/libs/trakit/__init__.py b/libs/trakit/__init__.py index 5ea2d6f63..0c98ebc70 100644 --- a/libs/trakit/__init__.py +++ b/libs/trakit/__init__.py @@ -5,7 +5,6 @@ __short_version__ = '.'.join(__version__.split('.')[:2]) __author__ = metadata.metadata(__package__)['author'] __license__ = metadata.metadata(__package__)['license'] -__url__ = metadata.metadata(__package__)['home_page'] del metadata diff --git a/libs/trakit/config.py b/libs/trakit/config.py index 6458b4bbd..30c280b32 100644 --- a/libs/trakit/config.py +++ b/libs/trakit/config.py @@ -1,12 +1,16 @@ import json import typing -from pkg_resources import resource_stream +try: + from importlib.resources import files +except ImportError: + from importlib_resources import files # type: ignore[assignment,no-redef,import-not-found] class Config: def __init__(self, config: typing.Optional[typing.Mapping[str, typing.Any]]): - with resource_stream('trakit', 'data/config.json') as f: + config_file = files(__package__).joinpath('data/config.json') + with config_file.open('rb') as f: cfg: typing.Dict[str, typing.Any] = json.load(f) if config: cfg.update(config) diff --git a/libs/typing_extensions-4.10.0.dist-info/RECORD b/libs/typing_extensions-4.10.0.dist-info/RECORD deleted file mode 100644 index 2ab7c7154..000000000 --- a/libs/typing_extensions-4.10.0.dist-info/RECORD +++ /dev/null @@ -1,7 +0,0 @@ -typing_extensions-4.10.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -typing_extensions-4.10.0.dist-info/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936 -typing_extensions-4.10.0.dist-info/METADATA,sha256=bOf50GPcCK0zOP8nCDWSOABNwCEiX62UQhDUWnNOaxU,2967 -typing_extensions-4.10.0.dist-info/RECORD,, -typing_extensions-4.10.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -typing_extensions-4.10.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -typing_extensions.py,sha256=TaQTqUtLUZa4yzkKE1hjChDIWPmH1y2qG0FXYX8kigk,117599 diff --git a/libs/typing_extensions-4.10.0.dist-info/INSTALLER b/libs/typing_extensions-4.12.2.dist-info/INSTALLER similarity index 100% rename from libs/typing_extensions-4.10.0.dist-info/INSTALLER rename to libs/typing_extensions-4.12.2.dist-info/INSTALLER diff --git a/libs/typing_extensions-4.10.0.dist-info/LICENSE b/libs/typing_extensions-4.12.2.dist-info/LICENSE similarity index 100% rename from libs/typing_extensions-4.10.0.dist-info/LICENSE rename to libs/typing_extensions-4.12.2.dist-info/LICENSE diff --git a/libs/typing_extensions-4.10.0.dist-info/METADATA b/libs/typing_extensions-4.12.2.dist-info/METADATA similarity index 97% rename from libs/typing_extensions-4.10.0.dist-info/METADATA rename to libs/typing_extensions-4.12.2.dist-info/METADATA index 13d06e24b..f15e2b387 100644 --- a/libs/typing_extensions-4.10.0.dist-info/METADATA +++ b/libs/typing_extensions-4.12.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: typing_extensions -Version: 4.10.0 +Version: 4.12.2 Summary: Backported and Experimental Type Hints for Python 3.8+ Keywords: annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing Author-email: "Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee" <levkivskyi@gmail.com> @@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Software Development Project-URL: Bug Tracker, https://github.com/python/typing_extensions/issues Project-URL: Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md diff --git a/libs/typing_extensions-4.12.2.dist-info/RECORD b/libs/typing_extensions-4.12.2.dist-info/RECORD new file mode 100644 index 000000000..b8bde9a36 --- /dev/null +++ b/libs/typing_extensions-4.12.2.dist-info/RECORD @@ -0,0 +1,7 @@ +typing_extensions-4.12.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +typing_extensions-4.12.2.dist-info/LICENSE,sha256=Oy-B_iHRgcSZxZolbI4ZaEVdZonSaaqFNzv7avQdo78,13936 +typing_extensions-4.12.2.dist-info/METADATA,sha256=BeUQIa8cnYbrjWx-N8TOznM9UGW5Gm2DicVpDtRA8W0,3018 +typing_extensions-4.12.2.dist-info/RECORD,, +typing_extensions-4.12.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +typing_extensions-4.12.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +typing_extensions.py,sha256=gwekpyG9DVG3lxWKX4ni8u7nk3We5slG98mA9F3DJQw,134451 diff --git a/libs/typing_extensions-4.10.0.dist-info/REQUESTED b/libs/typing_extensions-4.12.2.dist-info/REQUESTED similarity index 100% rename from libs/typing_extensions-4.10.0.dist-info/REQUESTED rename to libs/typing_extensions-4.12.2.dist-info/REQUESTED diff --git a/libs/platformdirs-4.2.0.dist-info/WHEEL b/libs/typing_extensions-4.12.2.dist-info/WHEEL similarity index 67% rename from libs/platformdirs-4.2.0.dist-info/WHEEL rename to libs/typing_extensions-4.12.2.dist-info/WHEEL index 5998f3aab..3b5e64b5e 100644 --- a/libs/platformdirs-4.2.0.dist-info/WHEEL +++ b/libs/typing_extensions-4.12.2.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.21.1 +Generator: flit 3.9.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/typing_extensions.py b/libs/typing_extensions.py index f3132ea4a..dec429ca8 100644 --- a/libs/typing_extensions.py +++ b/libs/typing_extensions.py @@ -1,6 +1,7 @@ import abc import collections import collections.abc +import contextlib import functools import inspect import operator @@ -116,6 +117,7 @@ 'MutableMapping', 'MutableSequence', 'MutableSet', + 'NoDefault', 'Optional', 'Pattern', 'Reversible', @@ -134,6 +136,7 @@ # for backward compatibility PEP_560 = True GenericMeta = type +_PEP_696_IMPLEMENTED = sys.version_info >= (3, 13, 0, "beta") # The functions below are modified copies of typing internal helpers. # They are needed by _ProtocolMeta and they provide support for PEP 646. @@ -147,27 +150,6 @@ def __repr__(self): _marker = _Sentinel() -def _check_generic(cls, parameters, elen=_marker): - """Check correct count for parameters of a generic cls (internal helper). - This gives a nice error message in case of count mismatch. - """ - if not elen: - raise TypeError(f"{cls} is not a generic class") - if elen is _marker: - if not hasattr(cls, "__parameters__") or not cls.__parameters__: - raise TypeError(f"{cls} is not a generic class") - elen = len(cls.__parameters__) - alen = len(parameters) - if alen != elen: - if hasattr(cls, "__parameters__"): - parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] - num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) - if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): - return - raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};" - f" actual {alen}, expected {elen}") - - if sys.version_info >= (3, 10): def _should_collect_from_parameters(t): return isinstance( @@ -181,27 +163,6 @@ def _should_collect_from_parameters(t): return isinstance(t, typing._GenericAlias) and not t._special -def _collect_type_vars(types, typevar_types=None): - """Collect all type variable contained in types in order of - first appearance (lexicographic order). For example:: - - _collect_type_vars((T, List[S, T])) == (T, S) - """ - if typevar_types is None: - typevar_types = typing.TypeVar - tvars = [] - for t in types: - if ( - isinstance(t, typevar_types) and - t not in tvars and - not _is_unpack(t) - ): - tvars.append(t) - if _should_collect_from_parameters(t): - tvars.extend([t for t in t.__parameters__ if t not in tvars]) - return tuple(tvars) - - NoReturn = typing.NoReturn # Some unconstrained type variables. These are used by the container types. @@ -448,17 +409,96 @@ def clear_overloads(): AsyncIterable = typing.AsyncIterable AsyncIterator = typing.AsyncIterator Deque = typing.Deque -ContextManager = typing.ContextManager -AsyncContextManager = typing.AsyncContextManager DefaultDict = typing.DefaultDict OrderedDict = typing.OrderedDict Counter = typing.Counter ChainMap = typing.ChainMap -AsyncGenerator = typing.AsyncGenerator Text = typing.Text TYPE_CHECKING = typing.TYPE_CHECKING +if sys.version_info >= (3, 13, 0, "beta"): + from typing import AsyncContextManager, AsyncGenerator, ContextManager, Generator +else: + def _is_dunder(attr): + return attr.startswith('__') and attr.endswith('__') + + # Python <3.9 doesn't have typing._SpecialGenericAlias + _special_generic_alias_base = getattr( + typing, "_SpecialGenericAlias", typing._GenericAlias + ) + + class _SpecialGenericAlias(_special_generic_alias_base, _root=True): + def __init__(self, origin, nparams, *, inst=True, name=None, defaults=()): + if _special_generic_alias_base is typing._GenericAlias: + # Python <3.9 + self.__origin__ = origin + self._nparams = nparams + super().__init__(origin, nparams, special=True, inst=inst, name=name) + else: + # Python >= 3.9 + super().__init__(origin, nparams, inst=inst, name=name) + self._defaults = defaults + + def __setattr__(self, attr, val): + allowed_attrs = {'_name', '_inst', '_nparams', '_defaults'} + if _special_generic_alias_base is typing._GenericAlias: + # Python <3.9 + allowed_attrs.add("__origin__") + if _is_dunder(attr) or attr in allowed_attrs: + object.__setattr__(self, attr, val) + else: + setattr(self.__origin__, attr, val) + + @typing._tp_cache + def __getitem__(self, params): + if not isinstance(params, tuple): + params = (params,) + msg = "Parameters to generic types must be types." + params = tuple(typing._type_check(p, msg) for p in params) + if ( + self._defaults + and len(params) < self._nparams + and len(params) + len(self._defaults) >= self._nparams + ): + params = (*params, *self._defaults[len(params) - self._nparams:]) + actual_len = len(params) + + if actual_len != self._nparams: + if self._defaults: + expected = f"at least {self._nparams - len(self._defaults)}" + else: + expected = str(self._nparams) + if not self._nparams: + raise TypeError(f"{self} is not a generic class") + raise TypeError( + f"Too {'many' if actual_len > self._nparams else 'few'}" + f" arguments for {self};" + f" actual {actual_len}, expected {expected}" + ) + return self.copy_with(params) + + _NoneType = type(None) + Generator = _SpecialGenericAlias( + collections.abc.Generator, 3, defaults=(_NoneType, _NoneType) + ) + AsyncGenerator = _SpecialGenericAlias( + collections.abc.AsyncGenerator, 2, defaults=(_NoneType,) + ) + ContextManager = _SpecialGenericAlias( + contextlib.AbstractContextManager, + 2, + name="ContextManager", + defaults=(typing.Optional[bool],) + ) + AsyncContextManager = _SpecialGenericAlias( + contextlib.AbstractAsyncContextManager, + 2, + name="AsyncContextManager", + defaults=(typing.Optional[bool],) + ) + + _PROTO_ALLOWLIST = { 'collections.abc': [ 'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable', @@ -469,23 +509,11 @@ def clear_overloads(): } -_EXCLUDED_ATTRS = { - "__abstractmethods__", "__annotations__", "__weakref__", "_is_protocol", - "_is_runtime_protocol", "__dict__", "__slots__", "__parameters__", - "__orig_bases__", "__module__", "_MutableMapping__marker", "__doc__", - "__subclasshook__", "__orig_class__", "__init__", "__new__", - "__protocol_attrs__", "__non_callable_proto_members__", - "__match_args__", +_EXCLUDED_ATTRS = frozenset(typing.EXCLUDED_ATTRIBUTES) | { + "__match_args__", "__protocol_attrs__", "__non_callable_proto_members__", + "__final__", } -if sys.version_info >= (3, 9): - _EXCLUDED_ATTRS.add("__class_getitem__") - -if sys.version_info >= (3, 12): - _EXCLUDED_ATTRS.add("__type_params__") - -_EXCLUDED_ATTRS = frozenset(_EXCLUDED_ATTRS) - def _get_protocol_attrs(cls): attrs = set() @@ -711,13 +739,18 @@ def close(self): ... not their type signatures! """ if not issubclass(cls, typing.Generic) or not getattr(cls, '_is_protocol', False): - raise TypeError('@runtime_checkable can be only applied to protocol classes,' - ' got %r' % cls) + raise TypeError(f'@runtime_checkable can be only applied to protocol classes,' + f' got {cls!r}') cls._is_runtime_protocol = True - # Only execute the following block if it's a typing_extensions.Protocol class. - # typing.Protocol classes don't need it. - if isinstance(cls, _ProtocolMeta): + # typing.Protocol classes on <=3.11 break if we execute this block, + # because typing.Protocol classes on <=3.11 don't have a + # `__protocol_attrs__` attribute, and this block relies on the + # `__protocol_attrs__` attribute. Meanwhile, typing.Protocol classes on 3.12.2+ + # break if we *don't* execute this block, because *they* assume that all + # protocol classes have a `__non_callable_proto_members__` attribute + # (which this block sets) + if isinstance(cls, _ProtocolMeta) or sys.version_info >= (3, 12, 2): # PEP 544 prohibits using issubclass() # with protocols that have non-method members. # See gh-113320 for why we compute this attribute here, @@ -834,7 +867,11 @@ def inner(func): return inner -if hasattr(typing, "ReadOnly"): +# Update this to something like >=3.13.0b1 if and when +# PEP 728 is implemented in CPython +_PEP_728_IMPLEMENTED = False + +if _PEP_728_IMPLEMENTED: # The standard library TypedDict in Python 3.8 does not store runtime information # about which (if any) keys are optional. See https://bugs.python.org/issue38834 # The standard library TypedDict in Python 3.9.0/1 does not honour the "total" @@ -845,7 +882,8 @@ def inner(func): # Aaaand on 3.12 we add __orig_bases__ to TypedDict # to enable better runtime introspection. # On 3.13 we deprecate some odd ways of creating TypedDicts. - # PEP 705 proposes adding the ReadOnly[] qualifier. + # Also on 3.13, PEP 705 adds the ReadOnly[] qualifier. + # PEP 728 (still pending) makes more changes. TypedDict = typing.TypedDict _TypedDictMeta = typing._TypedDictMeta is_typeddict = typing.is_typeddict @@ -904,7 +942,13 @@ def __new__(cls, name, bases, ns, *, total=True, closed=False): tp_dict.__orig_bases__ = bases annotations = {} - own_annotations = ns.get('__annotations__', {}) + if "__annotations__" in ns: + own_annotations = ns["__annotations__"] + elif "__annotate__" in ns: + # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated + own_annotations = ns["__annotate__"](1) + else: + own_annotations = {} msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" if _TAKES_MODULE: own_annotations = { @@ -1122,15 +1166,15 @@ def greet(name: str) -> None: return val -if hasattr(typing, "Required"): # 3.11+ +if hasattr(typing, "ReadOnly"): # 3.13+ get_type_hints = typing.get_type_hints -else: # <=3.10 +else: # <=3.13 # replaces _strip_annotations() def _strip_extras(t): """Strips Annotated, Required and NotRequired from a given type.""" if isinstance(t, _AnnotatedAlias): return _strip_extras(t.__origin__) - if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired): + if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired, ReadOnly): return _strip_extras(t.__args__[0]) if isinstance(t, typing._GenericAlias): stripped_args = tuple(_strip_extras(a) for a in t.__args__) @@ -1227,7 +1271,7 @@ def __repr__(self): def __reduce__(self): return operator.getitem, ( - Annotated, (self.__origin__,) + self.__metadata__ + Annotated, (self.__origin__, *self.__metadata__) ) def __eq__(self, other): @@ -1353,7 +1397,7 @@ def get_args(tp): get_args(Callable[[], T][int]) == ([], int) """ if isinstance(tp, _AnnotatedAlias): - return (tp.__origin__,) + tp.__metadata__ + return (tp.__origin__, *tp.__metadata__) if isinstance(tp, (typing._GenericAlias, _typing_GenericAlias)): if getattr(tp, "_special", False): return () @@ -1399,17 +1443,37 @@ def TypeAlias(self, parameters): ) +if hasattr(typing, "NoDefault"): + NoDefault = typing.NoDefault +else: + class NoDefaultTypeMeta(type): + def __setattr__(cls, attr, value): + # TypeError is consistent with the behavior of NoneType + raise TypeError( + f"cannot set {attr!r} attribute of immutable type {cls.__name__!r}" + ) + + class NoDefaultType(metaclass=NoDefaultTypeMeta): + """The type of the NoDefault singleton.""" + + __slots__ = () + + def __new__(cls): + return globals().get("NoDefault") or object.__new__(cls) + + def __repr__(self): + return "typing_extensions.NoDefault" + + def __reduce__(self): + return "NoDefault" + + NoDefault = NoDefaultType() + del NoDefaultType, NoDefaultTypeMeta + + def _set_default(type_param, default): - if isinstance(default, (tuple, list)): - type_param.__default__ = tuple((typing._type_check(d, "Default must be a type") - for d in default)) - elif default != _marker: - if isinstance(type_param, ParamSpec) and default is ...: # ... not valid <3.11 - type_param.__default__ = default - else: - type_param.__default__ = typing._type_check(default, "Default must be a type") - else: - type_param.__default__ = None + type_param.has_default = lambda: default is not NoDefault + type_param.__default__ = default def _set_module(typevarlike): @@ -1432,32 +1496,46 @@ def __instancecheck__(cls, __instance: Any) -> bool: return isinstance(__instance, cls._backported_typevarlike) -# Add default and infer_variance parameters from PEP 696 and 695 -class TypeVar(metaclass=_TypeVarLikeMeta): - """Type variable.""" +if _PEP_696_IMPLEMENTED: + from typing import TypeVar +else: + # Add default and infer_variance parameters from PEP 696 and 695 + class TypeVar(metaclass=_TypeVarLikeMeta): + """Type variable.""" - _backported_typevarlike = typing.TypeVar + _backported_typevarlike = typing.TypeVar - def __new__(cls, name, *constraints, bound=None, - covariant=False, contravariant=False, - default=_marker, infer_variance=False): - if hasattr(typing, "TypeAliasType"): - # PEP 695 implemented (3.12+), can pass infer_variance to typing.TypeVar - typevar = typing.TypeVar(name, *constraints, bound=bound, - covariant=covariant, contravariant=contravariant, - infer_variance=infer_variance) - else: - typevar = typing.TypeVar(name, *constraints, bound=bound, - covariant=covariant, contravariant=contravariant) - if infer_variance and (covariant or contravariant): - raise ValueError("Variance cannot be specified with infer_variance.") - typevar.__infer_variance__ = infer_variance - _set_default(typevar, default) - _set_module(typevar) - return typevar + def __new__(cls, name, *constraints, bound=None, + covariant=False, contravariant=False, + default=NoDefault, infer_variance=False): + if hasattr(typing, "TypeAliasType"): + # PEP 695 implemented (3.12+), can pass infer_variance to typing.TypeVar + typevar = typing.TypeVar(name, *constraints, bound=bound, + covariant=covariant, contravariant=contravariant, + infer_variance=infer_variance) + else: + typevar = typing.TypeVar(name, *constraints, bound=bound, + covariant=covariant, contravariant=contravariant) + if infer_variance and (covariant or contravariant): + raise ValueError("Variance cannot be specified with infer_variance.") + typevar.__infer_variance__ = infer_variance - def __init_subclass__(cls) -> None: - raise TypeError(f"type '{__name__}.TypeVar' is not an acceptable base type") + _set_default(typevar, default) + _set_module(typevar) + + def _tvar_prepare_subst(alias, args): + if ( + typevar.has_default() + and alias.__parameters__.index(typevar) == len(args) + ): + args += (typevar.__default__,) + return args + + typevar.__typing_prepare_subst__ = _tvar_prepare_subst + return typevar + + def __init_subclass__(cls) -> None: + raise TypeError(f"type '{__name__}.TypeVar' is not an acceptable base type") # Python 3.10+ has PEP 612 @@ -1522,8 +1600,12 @@ def __eq__(self, other): return NotImplemented return self.__origin__ == other.__origin__ + +if _PEP_696_IMPLEMENTED: + from typing import ParamSpec + # 3.10+ -if hasattr(typing, 'ParamSpec'): +elif hasattr(typing, 'ParamSpec'): # Add default parameter - PEP 696 class ParamSpec(metaclass=_TypeVarLikeMeta): @@ -1533,7 +1615,7 @@ class ParamSpec(metaclass=_TypeVarLikeMeta): def __new__(cls, name, *, bound=None, covariant=False, contravariant=False, - infer_variance=False, default=_marker): + infer_variance=False, default=NoDefault): if hasattr(typing, "TypeAliasType"): # PEP 695 implemented, can pass infer_variance to typing.TypeVar paramspec = typing.ParamSpec(name, bound=bound, @@ -1548,6 +1630,24 @@ def __new__(cls, name, *, bound=None, _set_default(paramspec, default) _set_module(paramspec) + + def _paramspec_prepare_subst(alias, args): + params = alias.__parameters__ + i = params.index(paramspec) + if i == len(args) and paramspec.has_default(): + args = [*args, paramspec.__default__] + if i >= len(args): + raise TypeError(f"Too few arguments for {alias}") + # Special case where Z[[int, str, bool]] == Z[int, str, bool] in PEP 612. + if len(params) == 1 and not typing._is_param_expr(args[0]): + assert i == 0 + args = (args,) + # Convert lists to tuples to help other libraries cache the results. + elif isinstance(args[i], list): + args = (*args[:i], tuple(args[i]), *args[i + 1:]) + return args + + paramspec.__typing_prepare_subst__ = _paramspec_prepare_subst return paramspec def __init_subclass__(cls) -> None: @@ -1616,8 +1716,8 @@ def kwargs(self): return ParamSpecKwargs(self) def __init__(self, name, *, bound=None, covariant=False, contravariant=False, - infer_variance=False, default=_marker): - super().__init__([self]) + infer_variance=False, default=NoDefault): + list.__init__(self, [self]) self.__name__ = name self.__covariant__ = bool(covariant) self.__contravariant__ = bool(contravariant) @@ -1711,7 +1811,7 @@ def _concatenate_getitem(self, parameters): # 3.10+ if hasattr(typing, 'Concatenate'): Concatenate = typing.Concatenate - _ConcatenateGenericAlias = typing._ConcatenateGenericAlias # noqa: F811 + _ConcatenateGenericAlias = typing._ConcatenateGenericAlias # 3.9 elif sys.version_info[:2] >= (3, 9): @_ExtensionsSpecialForm @@ -2246,6 +2346,17 @@ def __init__(self, getitem): class _UnpackAlias(typing._GenericAlias, _root=True): __class__ = typing.TypeVar + @property + def __typing_unpacked_tuple_args__(self): + assert self.__origin__ is Unpack + assert len(self.__args__) == 1 + arg, = self.__args__ + if isinstance(arg, (typing._GenericAlias, _types.GenericAlias)): + if arg.__origin__ is not tuple: + raise TypeError("Unpack[...] must be used with a tuple type") + return arg.__args__ + return None + @_UnpackSpecialForm def Unpack(self, parameters): item = typing._type_check(parameters, f'{self._name} accepts only a single type.') @@ -2270,7 +2381,20 @@ def _is_unpack(obj): return isinstance(obj, _UnpackAlias) -if hasattr(typing, "TypeVarTuple"): # 3.11+ +if _PEP_696_IMPLEMENTED: + from typing import TypeVarTuple + +elif hasattr(typing, "TypeVarTuple"): # 3.11+ + + def _unpack_args(*args): + newargs = [] + for arg in args: + subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) + if subargs is not None and not (subargs and subargs[-1] is ...): + newargs.extend(subargs) + else: + newargs.append(arg) + return newargs # Add default parameter - PEP 696 class TypeVarTuple(metaclass=_TypeVarLikeMeta): @@ -2278,10 +2402,57 @@ class TypeVarTuple(metaclass=_TypeVarLikeMeta): _backported_typevarlike = typing.TypeVarTuple - def __new__(cls, name, *, default=_marker): + def __new__(cls, name, *, default=NoDefault): tvt = typing.TypeVarTuple(name) _set_default(tvt, default) _set_module(tvt) + + def _typevartuple_prepare_subst(alias, args): + params = alias.__parameters__ + typevartuple_index = params.index(tvt) + for param in params[typevartuple_index + 1:]: + if isinstance(param, TypeVarTuple): + raise TypeError( + f"More than one TypeVarTuple parameter in {alias}" + ) + + alen = len(args) + plen = len(params) + left = typevartuple_index + right = plen - typevartuple_index - 1 + var_tuple_index = None + fillarg = None + for k, arg in enumerate(args): + if not isinstance(arg, type): + subargs = getattr(arg, '__typing_unpacked_tuple_args__', None) + if subargs and len(subargs) == 2 and subargs[-1] is ...: + if var_tuple_index is not None: + raise TypeError( + "More than one unpacked " + "arbitrary-length tuple argument" + ) + var_tuple_index = k + fillarg = subargs[0] + if var_tuple_index is not None: + left = min(left, var_tuple_index) + right = min(right, alen - var_tuple_index - 1) + elif left + right > alen: + raise TypeError(f"Too few arguments for {alias};" + f" actual {alen}, expected at least {plen - 1}") + if left == alen - right and tvt.has_default(): + replacement = _unpack_args(tvt.__default__) + else: + replacement = args[left: alen - right] + + return ( + *args[:left], + *([fillarg] * (typevartuple_index - left)), + replacement, + *([fillarg] * (plen - right - left - typevartuple_index - 1)), + *args[alen - right:], + ) + + tvt.__typing_prepare_subst__ = _typevartuple_prepare_subst return tvt def __init_subclass__(self, *args, **kwds): @@ -2338,7 +2509,7 @@ def get_shape(self) -> Tuple[*Ts]: def __iter__(self): yield self.__unpacked__ - def __init__(self, name, *, default=_marker): + def __init__(self, name, *, default=NoDefault): self.__name__ = name _DefaultMixin.__init__(self, default) @@ -2389,6 +2560,12 @@ def reveal_type(obj: T, /) -> T: return obj +if hasattr(typing, "_ASSERT_NEVER_REPR_MAX_LENGTH"): # 3.11+ + _ASSERT_NEVER_REPR_MAX_LENGTH = typing._ASSERT_NEVER_REPR_MAX_LENGTH +else: # <=3.10 + _ASSERT_NEVER_REPR_MAX_LENGTH = 100 + + if hasattr(typing, "assert_never"): # 3.11+ assert_never = typing.assert_never else: # <=3.10 @@ -2412,7 +2589,10 @@ def int_or_str(arg: int | str) -> None: At runtime, this throws an exception when called. """ - raise AssertionError("Expected code to be unreachable") + value = repr(arg) + if len(value) > _ASSERT_NEVER_REPR_MAX_LENGTH: + value = value[:_ASSERT_NEVER_REPR_MAX_LENGTH] + '...' + raise AssertionError(f"Expected code to be unreachable, but got: {value}") if sys.version_info >= (3, 12): # 3.12+ @@ -2689,10 +2869,222 @@ def wrapper(*args, **kwargs): # counting generic parameters, so that when we subscript a generic, # the runtime doesn't try to substitute the Unpack with the subscripted type. if not hasattr(typing, "TypeVarTuple"): - typing._collect_type_vars = _collect_type_vars + def _check_generic(cls, parameters, elen=_marker): + """Check correct count for parameters of a generic cls (internal helper). + + This gives a nice error message in case of count mismatch. + """ + if not elen: + raise TypeError(f"{cls} is not a generic class") + if elen is _marker: + if not hasattr(cls, "__parameters__") or not cls.__parameters__: + raise TypeError(f"{cls} is not a generic class") + elen = len(cls.__parameters__) + alen = len(parameters) + if alen != elen: + expect_val = elen + if hasattr(cls, "__parameters__"): + parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] + num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) + if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): + return + + # deal with TypeVarLike defaults + # required TypeVarLikes cannot appear after a defaulted one. + if alen < elen: + # since we validate TypeVarLike default in _collect_type_vars + # or _collect_parameters we can safely check parameters[alen] + if ( + getattr(parameters[alen], '__default__', NoDefault) + is not NoDefault + ): + return + + num_default_tv = sum(getattr(p, '__default__', NoDefault) + is not NoDefault for p in parameters) + + elen -= num_default_tv + + expect_val = f"at least {elen}" + + things = "arguments" if sys.version_info >= (3, 10) else "parameters" + raise TypeError(f"Too {'many' if alen > elen else 'few'} {things}" + f" for {cls}; actual {alen}, expected {expect_val}") +else: + # Python 3.11+ + + def _check_generic(cls, parameters, elen): + """Check correct count for parameters of a generic cls (internal helper). + + This gives a nice error message in case of count mismatch. + """ + if not elen: + raise TypeError(f"{cls} is not a generic class") + alen = len(parameters) + if alen != elen: + expect_val = elen + if hasattr(cls, "__parameters__"): + parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] + + # deal with TypeVarLike defaults + # required TypeVarLikes cannot appear after a defaulted one. + if alen < elen: + # since we validate TypeVarLike default in _collect_type_vars + # or _collect_parameters we can safely check parameters[alen] + if ( + getattr(parameters[alen], '__default__', NoDefault) + is not NoDefault + ): + return + + num_default_tv = sum(getattr(p, '__default__', NoDefault) + is not NoDefault for p in parameters) + + elen -= num_default_tv + + expect_val = f"at least {elen}" + + raise TypeError(f"Too {'many' if alen > elen else 'few'} arguments" + f" for {cls}; actual {alen}, expected {expect_val}") + +if not _PEP_696_IMPLEMENTED: typing._check_generic = _check_generic +def _has_generic_or_protocol_as_origin() -> bool: + try: + frame = sys._getframe(2) + # - Catch AttributeError: not all Python implementations have sys._getframe() + # - Catch ValueError: maybe we're called from an unexpected module + # and the call stack isn't deep enough + except (AttributeError, ValueError): + return False # err on the side of leniency + else: + # If we somehow get invoked from outside typing.py, + # also err on the side of leniency + if frame.f_globals.get("__name__") != "typing": + return False + origin = frame.f_locals.get("origin") + # Cannot use "in" because origin may be an object with a buggy __eq__ that + # throws an error. + return origin is typing.Generic or origin is Protocol or origin is typing.Protocol + + +_TYPEVARTUPLE_TYPES = {TypeVarTuple, getattr(typing, "TypeVarTuple", None)} + + +def _is_unpacked_typevartuple(x) -> bool: + if get_origin(x) is not Unpack: + return False + args = get_args(x) + return ( + bool(args) + and len(args) == 1 + and type(args[0]) in _TYPEVARTUPLE_TYPES + ) + + +# Python 3.11+ _collect_type_vars was renamed to _collect_parameters +if hasattr(typing, '_collect_type_vars'): + def _collect_type_vars(types, typevar_types=None): + """Collect all type variable contained in types in order of + first appearance (lexicographic order). For example:: + + _collect_type_vars((T, List[S, T])) == (T, S) + """ + if typevar_types is None: + typevar_types = typing.TypeVar + tvars = [] + + # A required TypeVarLike cannot appear after a TypeVarLike with a default + # if it was a direct call to `Generic[]` or `Protocol[]` + enforce_default_ordering = _has_generic_or_protocol_as_origin() + default_encountered = False + + # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple + type_var_tuple_encountered = False + + for t in types: + if _is_unpacked_typevartuple(t): + type_var_tuple_encountered = True + elif isinstance(t, typevar_types) and t not in tvars: + if enforce_default_ordering: + has_default = getattr(t, '__default__', NoDefault) is not NoDefault + if has_default: + if type_var_tuple_encountered: + raise TypeError('Type parameter with a default' + ' follows TypeVarTuple') + default_encountered = True + elif default_encountered: + raise TypeError(f'Type parameter {t!r} without a default' + ' follows type parameter with a default') + + tvars.append(t) + if _should_collect_from_parameters(t): + tvars.extend([t for t in t.__parameters__ if t not in tvars]) + return tuple(tvars) + + typing._collect_type_vars = _collect_type_vars +else: + def _collect_parameters(args): + """Collect all type variables and parameter specifications in args + in order of first appearance (lexicographic order). + + For example:: + + assert _collect_parameters((T, Callable[P, T])) == (T, P) + """ + parameters = [] + + # A required TypeVarLike cannot appear after a TypeVarLike with default + # if it was a direct call to `Generic[]` or `Protocol[]` + enforce_default_ordering = _has_generic_or_protocol_as_origin() + default_encountered = False + + # Also, a TypeVarLike with a default cannot appear after a TypeVarTuple + type_var_tuple_encountered = False + + for t in args: + if isinstance(t, type): + # We don't want __parameters__ descriptor of a bare Python class. + pass + elif isinstance(t, tuple): + # `t` might be a tuple, when `ParamSpec` is substituted with + # `[T, int]`, or `[int, *Ts]`, etc. + for x in t: + for collected in _collect_parameters([x]): + if collected not in parameters: + parameters.append(collected) + elif hasattr(t, '__typing_subst__'): + if t not in parameters: + if enforce_default_ordering: + has_default = ( + getattr(t, '__default__', NoDefault) is not NoDefault + ) + + if type_var_tuple_encountered and has_default: + raise TypeError('Type parameter with a default' + ' follows TypeVarTuple') + + if has_default: + default_encountered = True + elif default_encountered: + raise TypeError(f'Type parameter {t!r} without a default' + ' follows type parameter with a default') + + parameters.append(t) + else: + if _is_unpacked_typevartuple(t): + type_var_tuple_encountered = True + for x in getattr(t, '__parameters__', ()): + if x not in parameters: + parameters.append(x) + + return tuple(parameters) + + if not _PEP_696_IMPLEMENTED: + typing._collect_parameters = _collect_parameters + # Backport typing.NamedTuple as it exists in Python 3.13. # In 3.11, the ability to define generic `NamedTuple`s was supported. # This was explicitly disallowed in 3.9-3.10, and only half-worked in <=3.8. @@ -2725,7 +3117,13 @@ def __new__(cls, typename, bases, ns): raise TypeError( 'can only inherit from a NamedTuple type and Generic') bases = tuple(tuple if base is _NamedTuple else base for base in bases) - types = ns.get('__annotations__', {}) + if "__annotations__" in ns: + types = ns["__annotations__"] + elif "__annotate__" in ns: + # TODO: Use inspect.VALUE here, and make the annotations lazily evaluated + types = ns["__annotate__"](1) + else: + types = {} default_names = [] for field_name in types: if field_name in ns: @@ -2857,7 +3255,7 @@ class Employee(NamedTuple): if hasattr(collections.abc, "Buffer"): Buffer = collections.abc.Buffer else: - class Buffer(abc.ABC): + class Buffer(abc.ABC): # noqa: B024 """Base class for classes that implement the buffer protocol. The buffer protocol allows Python objects to expose a low-level @@ -3184,6 +3582,23 @@ def __eq__(self, other: object) -> bool: return self.documentation == other.documentation +_CapsuleType = getattr(_types, "CapsuleType", None) + +if _CapsuleType is None: + try: + import _socket + except ImportError: + pass + else: + _CAPI = getattr(_socket, "CAPI", None) + if _CAPI is not None: + _CapsuleType = type(_CAPI) + +if _CapsuleType is not None: + CapsuleType = _CapsuleType + __all__.append("CapsuleType") + + # Aliases for items that have always been in typing. # Explicitly assign these (rather than using `from typing import *` at the top), # so that we get a CI error if one of these is deleted from typing.py @@ -3197,7 +3612,6 @@ def __eq__(self, other: object) -> bool: Dict = typing.Dict ForwardRef = typing.ForwardRef FrozenSet = typing.FrozenSet -Generator = typing.Generator Generic = typing.Generic Hashable = typing.Hashable IO = typing.IO diff --git a/libs/tzdata-2024.1.dist-info/INSTALLER b/libs/tzdata-2024.2.dist-info/INSTALLER similarity index 100% rename from libs/tzdata-2024.1.dist-info/INSTALLER rename to libs/tzdata-2024.2.dist-info/INSTALLER diff --git a/libs/tzdata-2024.1.dist-info/LICENSE b/libs/tzdata-2024.2.dist-info/LICENSE similarity index 100% rename from libs/tzdata-2024.1.dist-info/LICENSE rename to libs/tzdata-2024.2.dist-info/LICENSE diff --git a/libs/tzdata-2024.1.dist-info/LICENSE_APACHE b/libs/tzdata-2024.2.dist-info/LICENSE_APACHE similarity index 100% rename from libs/tzdata-2024.1.dist-info/LICENSE_APACHE rename to libs/tzdata-2024.2.dist-info/LICENSE_APACHE diff --git a/libs/tzdata-2024.1.dist-info/METADATA b/libs/tzdata-2024.2.dist-info/METADATA similarity index 98% rename from libs/tzdata-2024.1.dist-info/METADATA rename to libs/tzdata-2024.2.dist-info/METADATA index 5ca4be319..4feec22ac 100644 --- a/libs/tzdata-2024.1.dist-info/METADATA +++ b/libs/tzdata-2024.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: tzdata -Version: 2024.1 +Version: 2024.2 Summary: Provider of IANA time zone data Home-page: https://github.com/python/tzdata Author: Python Software Foundation diff --git a/libs/tzdata-2024.1.dist-info/RECORD b/libs/tzdata-2024.2.dist-info/RECORD similarity index 91% rename from libs/tzdata-2024.1.dist-info/RECORD rename to libs/tzdata-2024.2.dist-info/RECORD index 786c5e04e..57b38356b 100644 --- a/libs/tzdata-2024.1.dist-info/RECORD +++ b/libs/tzdata-2024.2.dist-info/RECORD @@ -1,12 +1,12 @@ -tzdata-2024.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -tzdata-2024.1.dist-info/LICENSE,sha256=M-jlAC01EtP8wigrmV5rrZ0zR4G5xawxhD9ASQDh87Q,592 -tzdata-2024.1.dist-info/LICENSE_APACHE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357 -tzdata-2024.1.dist-info/METADATA,sha256=opWqMTU2QGRjhy337uxoIBXNr84QcEx8I9-iisPqxmA,1393 -tzdata-2024.1.dist-info/RECORD,, -tzdata-2024.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tzdata-2024.1.dist-info/WHEEL,sha256=-G_t0oGuE7UD0DrSpVZnq1hHMBV9DD2XkS5v7XpmTnk,110 -tzdata-2024.1.dist-info/top_level.txt,sha256=MO6QqC0xRrN67Gh9xU_nMmadwBVlYzPNkq_h4gYuzaQ,7 -tzdata/__init__.py,sha256=iofGPw33aJlVNgOXQP4kzxiXOEj8im69E8cgZZS874Q,252 +tzdata-2024.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +tzdata-2024.2.dist-info/LICENSE,sha256=M-jlAC01EtP8wigrmV5rrZ0zR4G5xawxhD9ASQDh87Q,592 +tzdata-2024.2.dist-info/LICENSE_APACHE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357 +tzdata-2024.2.dist-info/METADATA,sha256=5HAWgRuxvc1h1LHVUCXna4uZ7h6KjIet66Kn8AUDh5c,1393 +tzdata-2024.2.dist-info/RECORD,, +tzdata-2024.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tzdata-2024.2.dist-info/WHEEL,sha256=TJ49d73sNs10F0aze1W_bTW2P_X7-F4YXOlBqoqA-jY,109 +tzdata-2024.2.dist-info/top_level.txt,sha256=MO6QqC0xRrN67Gh9xU_nMmadwBVlYzPNkq_h4gYuzaQ,7 +tzdata/__init__.py,sha256=9o0ijEmis4rXSl6J7-eVzqZxxUWI7aGSQLwuzQFBtz4,252 tzdata/zoneinfo/Africa/Abidjan,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4,130 tzdata/zoneinfo/Africa/Accra,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4,130 tzdata/zoneinfo/Africa/Addis_Ababa,sha256=B4OFT1LDOtprbSpdhnZi8K6OFSONL857mtpPTTGetGY,191 @@ -17,9 +17,9 @@ tzdata/zoneinfo/Africa/Bamako,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4 tzdata/zoneinfo/Africa/Bangui,sha256=5e8SiFccxWxSdsqWbhyKZ1xnR3JtdY7K_n7_zm7Ke-Q,180 tzdata/zoneinfo/Africa/Banjul,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4,130 tzdata/zoneinfo/Africa/Bissau,sha256=wa3uva129dJHRCi7tYt04kFOn1-osMS2afMjleO9mDw,149 -tzdata/zoneinfo/Africa/Blantyre,sha256=_UqXNoIwqJZ2yYd3lRCpkg_o2RH6BlSBU20QSM0PUp4,131 +tzdata/zoneinfo/Africa/Blantyre,sha256=kQyXwJHNNK50J8gyJiNM57Ty9CXFgi1macJL5iAQp5I,131 tzdata/zoneinfo/Africa/Brazzaville,sha256=5e8SiFccxWxSdsqWbhyKZ1xnR3JtdY7K_n7_zm7Ke-Q,180 -tzdata/zoneinfo/Africa/Bujumbura,sha256=_UqXNoIwqJZ2yYd3lRCpkg_o2RH6BlSBU20QSM0PUp4,131 +tzdata/zoneinfo/Africa/Bujumbura,sha256=kQyXwJHNNK50J8gyJiNM57Ty9CXFgi1macJL5iAQp5I,131 tzdata/zoneinfo/Africa/Cairo,sha256=icuaNiEvuC6TPc2fqhDv36lpop7IDDIGO7tFGMAz0b4,1309 tzdata/zoneinfo/Africa/Casablanca,sha256=MMps8T4AwqbEN6PIN_pkNiPMBEBqtRZRZceLN-9rxMM,1919 tzdata/zoneinfo/Africa/Ceuta,sha256=oEIgK53afz1SYxYB_D0jR98Ss3g581yb8TnLppPaYcY,562 @@ -30,22 +30,22 @@ tzdata/zoneinfo/Africa/Djibouti,sha256=B4OFT1LDOtprbSpdhnZi8K6OFSONL857mtpPTTGet tzdata/zoneinfo/Africa/Douala,sha256=5e8SiFccxWxSdsqWbhyKZ1xnR3JtdY7K_n7_zm7Ke-Q,180 tzdata/zoneinfo/Africa/El_Aaiun,sha256=6hfLbLfrD1Qy9ZZqLXr1Xw7fzeEs_FqeHN2zZJZUVJI,1830 tzdata/zoneinfo/Africa/Freetown,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4,130 -tzdata/zoneinfo/Africa/Gaborone,sha256=_UqXNoIwqJZ2yYd3lRCpkg_o2RH6BlSBU20QSM0PUp4,131 -tzdata/zoneinfo/Africa/Harare,sha256=_UqXNoIwqJZ2yYd3lRCpkg_o2RH6BlSBU20QSM0PUp4,131 +tzdata/zoneinfo/Africa/Gaborone,sha256=kQyXwJHNNK50J8gyJiNM57Ty9CXFgi1macJL5iAQp5I,131 +tzdata/zoneinfo/Africa/Harare,sha256=kQyXwJHNNK50J8gyJiNM57Ty9CXFgi1macJL5iAQp5I,131 tzdata/zoneinfo/Africa/Johannesburg,sha256=0Zrr4kNcToS_euZVM9I6nUQPmBYuW01pxz94PgIpnsg,190 tzdata/zoneinfo/Africa/Juba,sha256=VTpoMAP-jJ6cKsDeNVr7l3LKGoKDUxGU2b1gqvDPz34,458 tzdata/zoneinfo/Africa/Kampala,sha256=B4OFT1LDOtprbSpdhnZi8K6OFSONL857mtpPTTGetGY,191 tzdata/zoneinfo/Africa/Khartoum,sha256=NRwOwIg4SR6XuD11k3hxBz77uoBpzejXq7vxtq2Xys8,458 -tzdata/zoneinfo/Africa/Kigali,sha256=_UqXNoIwqJZ2yYd3lRCpkg_o2RH6BlSBU20QSM0PUp4,131 +tzdata/zoneinfo/Africa/Kigali,sha256=kQyXwJHNNK50J8gyJiNM57Ty9CXFgi1macJL5iAQp5I,131 tzdata/zoneinfo/Africa/Kinshasa,sha256=5e8SiFccxWxSdsqWbhyKZ1xnR3JtdY7K_n7_zm7Ke-Q,180 tzdata/zoneinfo/Africa/Lagos,sha256=5e8SiFccxWxSdsqWbhyKZ1xnR3JtdY7K_n7_zm7Ke-Q,180 tzdata/zoneinfo/Africa/Libreville,sha256=5e8SiFccxWxSdsqWbhyKZ1xnR3JtdY7K_n7_zm7Ke-Q,180 tzdata/zoneinfo/Africa/Lome,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4,130 tzdata/zoneinfo/Africa/Luanda,sha256=5e8SiFccxWxSdsqWbhyKZ1xnR3JtdY7K_n7_zm7Ke-Q,180 -tzdata/zoneinfo/Africa/Lubumbashi,sha256=_UqXNoIwqJZ2yYd3lRCpkg_o2RH6BlSBU20QSM0PUp4,131 -tzdata/zoneinfo/Africa/Lusaka,sha256=_UqXNoIwqJZ2yYd3lRCpkg_o2RH6BlSBU20QSM0PUp4,131 +tzdata/zoneinfo/Africa/Lubumbashi,sha256=kQyXwJHNNK50J8gyJiNM57Ty9CXFgi1macJL5iAQp5I,131 +tzdata/zoneinfo/Africa/Lusaka,sha256=kQyXwJHNNK50J8gyJiNM57Ty9CXFgi1macJL5iAQp5I,131 tzdata/zoneinfo/Africa/Malabo,sha256=5e8SiFccxWxSdsqWbhyKZ1xnR3JtdY7K_n7_zm7Ke-Q,180 -tzdata/zoneinfo/Africa/Maputo,sha256=_UqXNoIwqJZ2yYd3lRCpkg_o2RH6BlSBU20QSM0PUp4,131 +tzdata/zoneinfo/Africa/Maputo,sha256=kQyXwJHNNK50J8gyJiNM57Ty9CXFgi1macJL5iAQp5I,131 tzdata/zoneinfo/Africa/Maseru,sha256=0Zrr4kNcToS_euZVM9I6nUQPmBYuW01pxz94PgIpnsg,190 tzdata/zoneinfo/Africa/Mbabane,sha256=0Zrr4kNcToS_euZVM9I6nUQPmBYuW01pxz94PgIpnsg,190 tzdata/zoneinfo/Africa/Mogadishu,sha256=B4OFT1LDOtprbSpdhnZi8K6OFSONL857mtpPTTGetGY,191 @@ -86,7 +86,7 @@ tzdata/zoneinfo/America/Asuncion,sha256=PuuUl8VILSBeZWDyLkM67bWl47xPMcJ0fY-rAhvS tzdata/zoneinfo/America/Atikokan,sha256=p41zBnujy9lPiiPf3WqotoyzOxhIS8F7TiDqGuwvCoE,149 tzdata/zoneinfo/America/Atka,sha256=q_sZgOINX4TsX9iBx1gNd6XGwBnzCjg6qpdAQhK0ieA,969 tzdata/zoneinfo/America/Bahia,sha256=_-ZFw-HzXc7byacHW_NJHtJ03ADFdqt1kaYgyWYobYw,682 -tzdata/zoneinfo/America/Bahia_Banderas,sha256=F2Tz2IIWs9nqdSb5sdKLrO6Cu0xiGLbQZ3TamKR4v5A,728 +tzdata/zoneinfo/America/Bahia_Banderas,sha256=lJ8K-PrUqLTefuqpcKp_YWvfvzH0WNNrZ_LIel_0oZQ,700 tzdata/zoneinfo/America/Barbados,sha256=gdiJf9ZKOMs9QB4ex0-crvdmhNfHpNzXTV2xTaNDCAg,278 tzdata/zoneinfo/America/Belem,sha256=w0jv-gdBbEBZQBF2z2liKpRM9CEOWA36O1qU1nJKeCs,394 tzdata/zoneinfo/America/Belize,sha256=uYBPJqnCGnOOeKnoz1IG9POWTvXD5kUirpFuB0PHjVo,1045 @@ -97,14 +97,14 @@ tzdata/zoneinfo/America/Boise,sha256=Jt3omyPSPRoKE-KXVd-wxVON-CDE5oGaJA7Ar90Q2OM tzdata/zoneinfo/America/Buenos_Aires,sha256=IEVOpSfI6oiJJmFNIb9Vb0bOOMIgxO5bghFw7vkHFGk,708 tzdata/zoneinfo/America/Cambridge_Bay,sha256=NFwNVfgxb2YMLzc-42RA-SKtNcODpukEfYf_QWWYTsI,883 tzdata/zoneinfo/America/Campo_Grande,sha256=mngKYjaH_ENVmJ-mtURVjjFo5kHgLfYNPHZaCVSxQFE,952 -tzdata/zoneinfo/America/Cancun,sha256=XOYTJdVeHFfKeSGxHcZ_stJ9_Vkqn0q0LmS1mhnGI8o,529 +tzdata/zoneinfo/America/Cancun,sha256=YSoUxbjaL2MycKCTB3ZAK9jPVaeMhW7MkOEA8eWakKY,538 tzdata/zoneinfo/America/Caracas,sha256=UHmUwc0mFPoidR4UDCWb4T4w_mpCBsSb4BkW3SOKIVY,190 tzdata/zoneinfo/America/Catamarca,sha256=UC0fxx7ZPmjPw3D0BK-5vap-c1cBzbgR293MdmEfOx0,708 tzdata/zoneinfo/America/Cayenne,sha256=9URU4o1v5759UWuh8xI9vnaANOceOeRW67XoGQuuUa8,151 tzdata/zoneinfo/America/Cayman,sha256=p41zBnujy9lPiiPf3WqotoyzOxhIS8F7TiDqGuwvCoE,149 tzdata/zoneinfo/America/Chicago,sha256=wntzn_RqffBZThINcltDkhfhHkTqmlDNxJEwODtUguc,1754 -tzdata/zoneinfo/America/Chihuahua,sha256=hHey29pNZGuKh_bTiluGQSOGAhiQuCG4VMNGlJCgxPs,691 -tzdata/zoneinfo/America/Ciudad_Juarez,sha256=eJkqieD7ixtltRojAKRk4iNRk-bZZZDPQV2hyR1vMmI,718 +tzdata/zoneinfo/America/Chihuahua,sha256=tzOmA7trhFykyUZ7QbuMA6A88BSF2o4mumo65aojzqo,691 +tzdata/zoneinfo/America/Ciudad_Juarez,sha256=mEE-VN-sqVDaHFJyFGUBYyOsYHCRspUZcSJqt26Wufg,718 tzdata/zoneinfo/America/Coral_Harbour,sha256=p41zBnujy9lPiiPf3WqotoyzOxhIS8F7TiDqGuwvCoE,149 tzdata/zoneinfo/America/Cordoba,sha256=9Ij3WjT9mWMKQ43LeSUIqQuDb9zS3FSlHYPVNQJTFf0,708 tzdata/zoneinfo/America/Costa_Rica,sha256=ihoqA_tHmYm0YjTRLZu3q8PqsqqOeb1CELjWhPf_HXE,232 @@ -120,7 +120,7 @@ tzdata/zoneinfo/America/Dominica,sha256=q76GKN1Uh8iJ24Fs46UHe7tH9rr6_rlBHZLW7y9w tzdata/zoneinfo/America/Edmonton,sha256=Dq2mxcSNWZhMWRqxwwtMcaqwAIGMwkOzz-mW8fJscV8,970 tzdata/zoneinfo/America/Eirunepe,sha256=6tKYaRpnbBSmXiwXy7_m4WW_rbVfn5LUec0keC3J7Iw,436 tzdata/zoneinfo/America/El_Salvador,sha256=4wjsCpRH9AFk5abLAbnuv-zouhRKcwb0aenk-nWtmz0,176 -tzdata/zoneinfo/America/Ensenada,sha256=x2_eWDUWxIi5gKTGmM_d5V1HFt1-JN-j8dIpqj5Dn7M,1025 +tzdata/zoneinfo/America/Ensenada,sha256=MGWr-6toDRarjMXTaiOIWgBFWNbw7lHvidLuPKFxfIo,1079 tzdata/zoneinfo/America/Fort_Nelson,sha256=_j7IJ-hXHtV_7dSMg6pxGQLb6z_IaUMj3aJde_F49QQ,1448 tzdata/zoneinfo/America/Fort_Wayne,sha256=5nj0KhPvvXvg8mqc5T4EscKKWC6rBWEcsBwWg2Qy8Hs,531 tzdata/zoneinfo/America/Fortaleza,sha256=ugF4DWO3j_khONebf7CLsT9ldL-JOWey_69S0jl2LIA,484 @@ -135,7 +135,7 @@ tzdata/zoneinfo/America/Guayaquil,sha256=8OIaCy-SirKKz4I77l6MQFDgSLHtjN0TvklLVEZ tzdata/zoneinfo/America/Guyana,sha256=PmnEtWtOTamsPJXEo7PcNQCy2Rp-evGyJh4cf0pjAR4,181 tzdata/zoneinfo/America/Halifax,sha256=kO5ahBM2oTLfWS4KX15FbKXfo5wg-f9vw1_hMOISGig,1672 tzdata/zoneinfo/America/Havana,sha256=ms5rCuq2yBM49VmTymMtFQN3c5aBN1lkd8jjzKdnNm8,1117 -tzdata/zoneinfo/America/Hermosillo,sha256=W-QiSzPq2J-hWWQ-uzD6McLKzG8XPEawbJpnXlNp3-Q,286 +tzdata/zoneinfo/America/Hermosillo,sha256=Ur1MYSAX3QbT2UX57LmD83o6s2Z-6YbYeOufKvT-zTM,258 tzdata/zoneinfo/America/Indiana/Indianapolis,sha256=5nj0KhPvvXvg8mqc5T4EscKKWC6rBWEcsBwWg2Qy8Hs,531 tzdata/zoneinfo/America/Indiana/Knox,sha256=KJCzXct8CTMItVLYLYeBqM6aT6b53gWCg6aDbsH58oI,1016 tzdata/zoneinfo/America/Indiana/Marengo,sha256=ygWmq8sYee8NFwlSZyQ_tsKopFQMp9Ne557zGGbyF2Y,567 @@ -167,15 +167,15 @@ tzdata/zoneinfo/America/Manaus,sha256=9kgrhpryB94YOVoshJliiiDSf9mwjb3OZwX0HusNRr tzdata/zoneinfo/America/Marigot,sha256=q76GKN1Uh8iJ24Fs46UHe7tH9rr6_rlBHZLW7y9wzo0,177 tzdata/zoneinfo/America/Martinique,sha256=m3rC6Mogc6cc1a9XJ8FPIYhZaSFNdYkxaZ-pfHhG3X4,178 tzdata/zoneinfo/America/Matamoros,sha256=KxgAMGkE7TJuug9byFsT3KN836X3OyXq77v-tFpLVvc,437 -tzdata/zoneinfo/America/Mazatlan,sha256=C5CBj73KgB8vbDbDEgqMHfPeMeglQj156WNbwYSxux8,718 +tzdata/zoneinfo/America/Mazatlan,sha256=IN7ecQ9SDq9sDNvu_nc_xuMN2LHSiq8X6YQgmVUe6aY,690 tzdata/zoneinfo/America/Mendoza,sha256=dL4q0zgY2FKPbG8cC-Wknnpp8tF2Y7SWgWSC_G_WznI,708 tzdata/zoneinfo/America/Menominee,sha256=oUmJmzOZtChYrB9In-E1GqEVi2ogKjPESXlUySUGs94,917 -tzdata/zoneinfo/America/Merida,sha256=KTdHMhhdhJtTg40KW2qSfd6N9PAQ50d_ektYDt2ouy0,654 +tzdata/zoneinfo/America/Merida,sha256=LBpOEv4xxUcL5B7wFSNa3UyE762-EiSXb1KPQNKwwCU,654 tzdata/zoneinfo/America/Metlakatla,sha256=EVj1LkMCgry6mT8Ln_FpHxpJSU0oSncfbHGWIQ0SI_0,586 -tzdata/zoneinfo/America/Mexico_City,sha256=vhDy1hSceJyFa3bIqn2qRi1kgxtvrCCaaB7s65mljtY,773 +tzdata/zoneinfo/America/Mexico_City,sha256=N90r8I8T_OD3B8Ox9M7EAY772cR8g2ew-03rvUYb1y8,773 tzdata/zoneinfo/America/Miquelon,sha256=Eey-Id5b4HFODINweRFtbDjcgjs_myiC2UwsgYt4kVk,550 tzdata/zoneinfo/America/Moncton,sha256=knrBNDFwHAGFr0nWJTBQ-10F_fZ5x4n3SnZtH-KI6h8,1493 -tzdata/zoneinfo/America/Monterrey,sha256=GWEQgKgJQV89hVpFOO6nS1AYvdM6Lcw_xeYwMfkV6bg,644 +tzdata/zoneinfo/America/Monterrey,sha256=1aYsIp-Na0lDAKVrcW4wVKFAXy5BAqDG2wWLT9wTmmQ,709 tzdata/zoneinfo/America/Montevideo,sha256=l7FjW6qscGzdvfjlbIeZ5CQ_AFWS3ZeVDS5ppMJCNM0,969 tzdata/zoneinfo/America/Montreal,sha256=gVq023obEpKGfS-SS3GOG7oyRVzp-SIF2y_rZQKcZ2E,1717 tzdata/zoneinfo/America/Montserrat,sha256=q76GKN1Uh8iJ24Fs46UHe7tH9rr6_rlBHZLW7y9wzo0,177 @@ -189,7 +189,7 @@ tzdata/zoneinfo/America/North_Dakota/Center,sha256=M09x4Mx6hcBAwktvwv16YvPRmsuDj tzdata/zoneinfo/America/North_Dakota/New_Salem,sha256=mZca9gyfO2USzax7v0mLJEYBKBVmIqylWqnfLgSsVys,990 tzdata/zoneinfo/America/North_Dakota/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 tzdata/zoneinfo/America/Nuuk,sha256=LlGZ5Y_ud9JwWRvncHnUHRArQbbnNcmmrz3duMhR3Hc,965 -tzdata/zoneinfo/America/Ojinaga,sha256=EMAldBXpY3Vgog_8yESXQb3qoS1v69jmWm0JPgs3k9U,718 +tzdata/zoneinfo/America/Ojinaga,sha256=97mJ9VI8h1lRAREIdJdTz_MCLtwh4b36iaQ9QolETpA,718 tzdata/zoneinfo/America/Panama,sha256=p41zBnujy9lPiiPf3WqotoyzOxhIS8F7TiDqGuwvCoE,149 tzdata/zoneinfo/America/Pangnirtung,sha256=nONS7zksGHTrbEJj73LYRZW964OncQuj_V6fNjpDoQ0,855 tzdata/zoneinfo/America/Paramaribo,sha256=C2v9tR6no54CRECWDFhANTl40UsA4AhHsdnGoNCb4_Q,187 @@ -207,7 +207,7 @@ tzdata/zoneinfo/America/Regina,sha256=_JHuns225iE-THc9NFp-RBq4PWULAuGw2OLbpOB_UM tzdata/zoneinfo/America/Resolute,sha256=2UeJBR2ZSkn1bUZy0G0SEhBtY9vycwSRU4naK-sw044,807 tzdata/zoneinfo/America/Rio_Branco,sha256=VjuQUr668phq5bcH40r94BPnZBKHzJf_MQBfM6Db96U,418 tzdata/zoneinfo/America/Rosario,sha256=9Ij3WjT9mWMKQ43LeSUIqQuDb9zS3FSlHYPVNQJTFf0,708 -tzdata/zoneinfo/America/Santa_Isabel,sha256=x2_eWDUWxIi5gKTGmM_d5V1HFt1-JN-j8dIpqj5Dn7M,1025 +tzdata/zoneinfo/America/Santa_Isabel,sha256=MGWr-6toDRarjMXTaiOIWgBFWNbw7lHvidLuPKFxfIo,1079 tzdata/zoneinfo/America/Santarem,sha256=dDEGsnrm4wrzl4sK6K8PzEroBKD7A1V7HBa8cWW4cMk,409 tzdata/zoneinfo/America/Santiago,sha256=_QBpU8K0QqLh5m2yqWfdkypIJDkPAc3dnIAc5jRQxxU,1354 tzdata/zoneinfo/America/Santo_Domingo,sha256=xmJo59mZXN7Wnf-3Jjl37mCC-8GfN6xmk2l_vngyfeI,317 @@ -225,7 +225,7 @@ tzdata/zoneinfo/America/Swift_Current,sha256=F-b65Yaax23CsuhSmeTDl6Tv9du4IsvWvMb tzdata/zoneinfo/America/Tegucigalpa,sha256=KlvqBJGswa9DIXlE3acU-pgd4IFqDeBRrUz02PmlNC0,194 tzdata/zoneinfo/America/Thule,sha256=LzL5jdmZkxRkHdA3XkoqJPG_ImllnSRhYYLQpMf_TY8,455 tzdata/zoneinfo/America/Thunder_Bay,sha256=gVq023obEpKGfS-SS3GOG7oyRVzp-SIF2y_rZQKcZ2E,1717 -tzdata/zoneinfo/America/Tijuana,sha256=x2_eWDUWxIi5gKTGmM_d5V1HFt1-JN-j8dIpqj5Dn7M,1025 +tzdata/zoneinfo/America/Tijuana,sha256=MGWr-6toDRarjMXTaiOIWgBFWNbw7lHvidLuPKFxfIo,1079 tzdata/zoneinfo/America/Toronto,sha256=gVq023obEpKGfS-SS3GOG7oyRVzp-SIF2y_rZQKcZ2E,1717 tzdata/zoneinfo/America/Tortola,sha256=q76GKN1Uh8iJ24Fs46UHe7tH9rr6_rlBHZLW7y9wzo0,177 tzdata/zoneinfo/America/Vancouver,sha256=Epou71sUffvHB1rd7wT0krvo3okXAV45_TWcOFpy26Q,1330 @@ -269,14 +269,14 @@ tzdata/zoneinfo/Asia/Bishkek,sha256=RXdxVxaiE5zxX5atQl-7ZesEeZVjsCXBGZ6cJbVU9pE, tzdata/zoneinfo/Asia/Brunei,sha256=3ajgII3xZ-Wc-dqXRTSMw8qQRDSjXlSBIxyE_sDRGTk,320 tzdata/zoneinfo/Asia/Calcutta,sha256=OgC9vhvElZ5ydWfHMLpRsDRV7NRV98GQxa0UOG63mw0,220 tzdata/zoneinfo/Asia/Chita,sha256=1Lme3ccO47R5gmTe5VCq1BSb0m_1opWibq21zvZlntg,750 -tzdata/zoneinfo/Asia/Choibalsan,sha256=hsakX_o0anB6tNBNp_FKGx4k57IcODYubf1u2G_2Vqk,619 +tzdata/zoneinfo/Asia/Choibalsan,sha256=--I8P6_e4BtRIe3wCSkPtwHOu_k9rPsw-KqQKHJC9vM,594 tzdata/zoneinfo/Asia/Chongqing,sha256=v4t-2C_m5j5tmPjOqTTurJAc0Wq6hetXVc4_i0KJ6oo,393 tzdata/zoneinfo/Asia/Chungking,sha256=v4t-2C_m5j5tmPjOqTTurJAc0Wq6hetXVc4_i0KJ6oo,393 tzdata/zoneinfo/Asia/Colombo,sha256=QAyjK7gtXUWfLuju1M0H3_ew6iTM-bwfzO5obgvaHy8,247 tzdata/zoneinfo/Asia/Dacca,sha256=rCGmEwbW4qkUU2QfTj5zLrydVCq8HTWl1dsqEDQOvvo,231 tzdata/zoneinfo/Asia/Damascus,sha256=AtZTDRzHEB7QnKxFXvtWsNUI1cCCe27sAfpDfQd0MwY,1234 tzdata/zoneinfo/Asia/Dhaka,sha256=rCGmEwbW4qkUU2QfTj5zLrydVCq8HTWl1dsqEDQOvvo,231 -tzdata/zoneinfo/Asia/Dili,sha256=ByL6yx7Cuq6axUp5D1n8a9MtmAod_mw6JQP_ltYdOUg,170 +tzdata/zoneinfo/Asia/Dili,sha256=5fcCHkVIZkLV8TcsqBQ8HstILEpz3ay3MGGU6sgNxLA,170 tzdata/zoneinfo/Asia/Dubai,sha256=DZ6lBT6DGIAypvtNMB1dtoj0MBHltrH5F6EbcaDaexY,133 tzdata/zoneinfo/Asia/Dushanbe,sha256=8qbn76rf9xu47NYVdfGvjnkf2KZxNN5J8ekFiXUz3AQ,366 tzdata/zoneinfo/Asia/Famagusta,sha256=385fbaRnx-mdEaXqSyBKVBDDKPzCGKbynWYt75wwCug,940 @@ -350,14 +350,14 @@ tzdata/zoneinfo/Asia/Yangon,sha256=6J2DXIEdTaRKqLOGeCzogo3whaoO6PJWYamIHS8A6Qw,1 tzdata/zoneinfo/Asia/Yekaterinburg,sha256=q17eUyqOEK2LJYKXYLCJqylj-vmaCG2vSNMttqrQTRk,760 tzdata/zoneinfo/Asia/Yerevan,sha256=pLEBdchA8H9l-9hdA6FjHmwaj5T1jupK0u-bor1KKa0,708 tzdata/zoneinfo/Asia/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tzdata/zoneinfo/Atlantic/Azores,sha256=KmvA_G-yNl76C0A17JdtFg7ju9LHa5JIWh15GOzLxds,1453 +tzdata/zoneinfo/Atlantic/Azores,sha256=6XBp-rgg8hERTe2c-bTKahYPlkDn2sROBuqo9wAdtPE,1401 tzdata/zoneinfo/Atlantic/Bermuda,sha256=PuxqD2cD99Pzjb8hH99Dws053d_zXnZHjeH0kZ8LSLI,1024 tzdata/zoneinfo/Atlantic/Canary,sha256=XMmxBlscPIWXhiauKy_d5bxX4xjNMM-5Vw84FwZkT00,478 tzdata/zoneinfo/Atlantic/Cape_Verde,sha256=E5ss6xpIpD0g_VEDsFMFi-ltsebp98PBSpULoVxIAyU,175 tzdata/zoneinfo/Atlantic/Faeroe,sha256=Iw0qB0mBuviH5w3Qy8jaxCOes07ZHh2wkW8MPUWJqj0,441 tzdata/zoneinfo/Atlantic/Faroe,sha256=Iw0qB0mBuviH5w3Qy8jaxCOes07ZHh2wkW8MPUWJqj0,441 tzdata/zoneinfo/Atlantic/Jan_Mayen,sha256=p_2ZMteF1NaQkAuDTDVjwYEMHPLgFxG8wJJq9sB2fLc,705 -tzdata/zoneinfo/Atlantic/Madeira,sha256=IX1jlaiB-DaaGwjnfc5pYr8eEtX7_Wol-T50QNAs3qw,1453 +tzdata/zoneinfo/Atlantic/Madeira,sha256=2F3vLmp7OTm4ZMSLxyIVQQ6iXeGUkKKPeUdiGmqVuuI,1372 tzdata/zoneinfo/Atlantic/Reykjavik,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4,130 tzdata/zoneinfo/Atlantic/South_Georgia,sha256=kPGfCLQD2C6_Xc5TyAmqmXP-GYdLLPucpBn3S7ybWu8,132 tzdata/zoneinfo/Atlantic/St_Helena,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4,130 @@ -392,8 +392,8 @@ tzdata/zoneinfo/Brazil/DeNoronha,sha256=Q0r3GtA5y2RGkOj56OTZG5tuBy1B6kfbhyrJqCgf tzdata/zoneinfo/Brazil/East,sha256=-izrIi8GXAKJ85l_8MVLoFp0pZm0Uihw-oapbiThiJE,952 tzdata/zoneinfo/Brazil/West,sha256=9kgrhpryB94YOVoshJliiiDSf9mwjb3OZwX0HusNRrk,412 tzdata/zoneinfo/Brazil/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tzdata/zoneinfo/CET,sha256=9q70fJErxHX0_hfgu5Wk0oH5ZZLUWhBIHJI1z7gHgBI,621 -tzdata/zoneinfo/CST6CDT,sha256=ajbQjR1ESk2m3dg1sAR2slqafjcfIhw-SC4SC6F7VBY,951 +tzdata/zoneinfo/CET,sha256=sQ-VQqhQnwpj68p449gEMt2GuOopZAAoD-vZz6dugog,1103 +tzdata/zoneinfo/CST6CDT,sha256=wntzn_RqffBZThINcltDkhfhHkTqmlDNxJEwODtUguc,1754 tzdata/zoneinfo/Canada/Atlantic,sha256=kO5ahBM2oTLfWS4KX15FbKXfo5wg-f9vw1_hMOISGig,1672 tzdata/zoneinfo/Canada/Central,sha256=ANzwYGBU1PknQW4LR-H92i5c4Db95LU-UQhPhWZCjDo,1294 tzdata/zoneinfo/Canada/Eastern,sha256=gVq023obEpKGfS-SS3GOG7oyRVzp-SIF2y_rZQKcZ2E,1717 @@ -407,9 +407,9 @@ tzdata/zoneinfo/Chile/Continental,sha256=_QBpU8K0QqLh5m2yqWfdkypIJDkPAc3dnIAc5jR tzdata/zoneinfo/Chile/EasterIsland,sha256=EwVM74XjsboPVxK9bWmdd4nTrtvasP1zlLdxrMB_YaE,1174 tzdata/zoneinfo/Chile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 tzdata/zoneinfo/Cuba,sha256=ms5rCuq2yBM49VmTymMtFQN3c5aBN1lkd8jjzKdnNm8,1117 -tzdata/zoneinfo/EET,sha256=ftIfVTZNlKejEciANKFFxES2uv_Z4rTAgyjwvk1lLpE,497 -tzdata/zoneinfo/EST,sha256=Eqcp0sCDGh_NPbcYAbBhmUob540rIs8FUnkmkZDQ0go,111 -tzdata/zoneinfo/EST5EDT,sha256=RAPR1jPCcVa5nvibF24lGKApc2bRw3Y87RbesyI3BP4,951 +tzdata/zoneinfo/EET,sha256=8f1niwVI4ymziTT2KBJV5pjfp2GtH_hB9sy3lgbGE0U,682 +tzdata/zoneinfo/EST,sha256=p41zBnujy9lPiiPf3WqotoyzOxhIS8F7TiDqGuwvCoE,149 +tzdata/zoneinfo/EST5EDT,sha256=1_IgazpFmJ_JrWPVWJIlMvpzUigNX4cXa_HbecsdH6k,1744 tzdata/zoneinfo/Egypt,sha256=icuaNiEvuC6TPc2fqhDv36lpop7IDDIGO7tFGMAz0b4,1309 tzdata/zoneinfo/Eire,sha256=EcADNuAvExj-dkqylGfF8q_vv_-mRPqN0k9bCDtJW3E,1496 tzdata/zoneinfo/Etc/GMT,sha256=3EoHVxsQiE5PTzRQydGhy_TAPvU9Bu0uTqFS2eul1dc,111 @@ -473,7 +473,7 @@ tzdata/zoneinfo/Europe/Kaliningrad,sha256=57ov9G8m25w1pPdJF8zoFWzq5I6UoBMVsk2eHP tzdata/zoneinfo/Europe/Kiev,sha256=BYnoDd7Ov50wd4mMEpddK-c5PfKFbumSbFNHY-Hia_I,558 tzdata/zoneinfo/Europe/Kirov,sha256=KqXGcIbMGTuOoKZYBG-5bj7kVzFbKyGMA99PA0414D0,735 tzdata/zoneinfo/Europe/Kyiv,sha256=BYnoDd7Ov50wd4mMEpddK-c5PfKFbumSbFNHY-Hia_I,558 -tzdata/zoneinfo/Europe/Lisbon,sha256=Nr-w4MM_s8Zhwdu1D4cNOQiTZMwZibYswSH1nB1GUKg,1454 +tzdata/zoneinfo/Europe/Lisbon,sha256=RNL2z4RzfmoeDa-RQQnpQla-ykC0DJoRt6BOi92u5Ow,1463 tzdata/zoneinfo/Europe/Ljubljana,sha256=qMlk8-qnognZplD7FsaMAD6aX8Yv-7sQ-oSdVPs2YtY,478 tzdata/zoneinfo/Europe/London,sha256=Z2VB8LitRXx0TAk_gHWJrcrZCeP9A_kBeH0IeG7tvTM,1599 tzdata/zoneinfo/Europe/Luxembourg,sha256=sQ-VQqhQnwpj68p449gEMt2GuOopZAAoD-vZz6dugog,1103 @@ -521,7 +521,7 @@ tzdata/zoneinfo/GMT+0,sha256=3EoHVxsQiE5PTzRQydGhy_TAPvU9Bu0uTqFS2eul1dc,111 tzdata/zoneinfo/GMT-0,sha256=3EoHVxsQiE5PTzRQydGhy_TAPvU9Bu0uTqFS2eul1dc,111 tzdata/zoneinfo/GMT0,sha256=3EoHVxsQiE5PTzRQydGhy_TAPvU9Bu0uTqFS2eul1dc,111 tzdata/zoneinfo/Greenwich,sha256=3EoHVxsQiE5PTzRQydGhy_TAPvU9Bu0uTqFS2eul1dc,111 -tzdata/zoneinfo/HST,sha256=up2TB-9E2uBD6IGaCSOnR96o_DENUVI9ZCE1zQS0SzY,112 +tzdata/zoneinfo/HST,sha256=HapXKaoeDzLNRL4RLQGtTMVnqf522H3LuRgr6NLIj_A,221 tzdata/zoneinfo/Hongkong,sha256=9AaPcyRtuXQX9zRnRTVkxX1mRs5JCbn6JTaSPvzX608,775 tzdata/zoneinfo/Iceland,sha256=8-f8qg6YQP9BadNWfY-1kmZEhI9JY9es-SMghDxdSG4,130 tzdata/zoneinfo/Indian/Antananarivo,sha256=B4OFT1LDOtprbSpdhnZi8K6OFSONL857mtpPTTGetGY,191 @@ -542,18 +542,18 @@ tzdata/zoneinfo/Jamaica,sha256=pDexcAMzrv9TqLWGjVOHwIDcFMLT6Vqlzjb5AbNmkoQ,339 tzdata/zoneinfo/Japan,sha256=WaOHFDDw07k-YZ-jCkOkHR6IvdSf8m8J0PQFpQBwb5Y,213 tzdata/zoneinfo/Kwajalein,sha256=S-ZFi6idKzDaelLy7DRjGPeD0s7oVud3xLMxZKNlBk8,219 tzdata/zoneinfo/Libya,sha256=zzMBLZZh4VQ4_ARe5k4L_rsuqKP7edKvVt8F6kvj5FM,431 -tzdata/zoneinfo/MET,sha256=EgkGCb0euba8FQGgUqAYFx4mRuKeRD6W5GIAyV6yDJ0,621 -tzdata/zoneinfo/MST,sha256=84AZayGFK2nfpYS0-u16q9QWrYYkCwUJcNdOnG7Ai1s,111 -tzdata/zoneinfo/MST7MDT,sha256=yt9ENOc1sfICs1yxJjiii6FhCQkEsEuw67zvs-EeBb4,951 -tzdata/zoneinfo/Mexico/BajaNorte,sha256=x2_eWDUWxIi5gKTGmM_d5V1HFt1-JN-j8dIpqj5Dn7M,1025 -tzdata/zoneinfo/Mexico/BajaSur,sha256=C5CBj73KgB8vbDbDEgqMHfPeMeglQj156WNbwYSxux8,718 -tzdata/zoneinfo/Mexico/General,sha256=vhDy1hSceJyFa3bIqn2qRi1kgxtvrCCaaB7s65mljtY,773 +tzdata/zoneinfo/MET,sha256=sQ-VQqhQnwpj68p449gEMt2GuOopZAAoD-vZz6dugog,1103 +tzdata/zoneinfo/MST,sha256=rhFFPCHQiYTedfLv7ATckxeKe04jxeUvIJi4vUXMtUc,240 +tzdata/zoneinfo/MST7MDT,sha256=m7cDkg7KS2EZ6BoQVYOk9soiBlHxO0GEeat81WxBPz4,1042 +tzdata/zoneinfo/Mexico/BajaNorte,sha256=MGWr-6toDRarjMXTaiOIWgBFWNbw7lHvidLuPKFxfIo,1079 +tzdata/zoneinfo/Mexico/BajaSur,sha256=IN7ecQ9SDq9sDNvu_nc_xuMN2LHSiq8X6YQgmVUe6aY,690 +tzdata/zoneinfo/Mexico/General,sha256=N90r8I8T_OD3B8Ox9M7EAY772cR8g2ew-03rvUYb1y8,773 tzdata/zoneinfo/Mexico/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 tzdata/zoneinfo/NZ,sha256=Dgbn5VrtvJLvWz0Qbnw5KrFijP2KQosg6S6ZAooL-7k,1043 tzdata/zoneinfo/NZ-CHAT,sha256=pnhY_Lb8V4eo6cK3yL6JZL086SI_etG6rCycppJfTHg,808 tzdata/zoneinfo/Navajo,sha256=m7cDkg7KS2EZ6BoQVYOk9soiBlHxO0GEeat81WxBPz4,1042 tzdata/zoneinfo/PRC,sha256=v4t-2C_m5j5tmPjOqTTurJAc0Wq6hetXVc4_i0KJ6oo,393 -tzdata/zoneinfo/PST8PDT,sha256=8w8p5P18af0k8f2C3amKrvi4tSK83QUhUCV6QmyeTa8,951 +tzdata/zoneinfo/PST8PDT,sha256=IA0FdU9tg6Nxz0CNcIUSV5dlezsL6-uh5QjP_oaj5cg,1294 tzdata/zoneinfo/Pacific/Apia,sha256=3HDEfICrLIehq3VLq4_r_DhQgFniSd_lXnOjdZgI6hQ,407 tzdata/zoneinfo/Pacific/Auckland,sha256=Dgbn5VrtvJLvWz0Qbnw5KrFijP2KQosg6S6ZAooL-7k,1043 tzdata/zoneinfo/Pacific/Bougainville,sha256=rqdn1Y4HSarx-vjPk00lsHNfhj3IQgKCViAsumuN_IY,201 @@ -600,7 +600,7 @@ tzdata/zoneinfo/Pacific/Wallis,sha256=CQNWIL2DFpej6Qcvgt40z8pekS1QyNpUdzmqLyj7bY tzdata/zoneinfo/Pacific/Yap,sha256=aDABBVtu-dydiHNODt3ReC8cNkO3wTp16c-OkFIAbhk,154 tzdata/zoneinfo/Pacific/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 tzdata/zoneinfo/Poland,sha256=6I9aUfFoFXpBrC3YpO4OmoeUGchMYSK0dxsaKjPZOkw,923 -tzdata/zoneinfo/Portugal,sha256=Nr-w4MM_s8Zhwdu1D4cNOQiTZMwZibYswSH1nB1GUKg,1454 +tzdata/zoneinfo/Portugal,sha256=RNL2z4RzfmoeDa-RQQnpQla-ykC0DJoRt6BOi92u5Ow,1463 tzdata/zoneinfo/ROC,sha256=oEwscvT3aoMXjQNt2X0VfuHzLkeORN2npcEJI2h-5s8,511 tzdata/zoneinfo/ROK,sha256=ZKcLb7zJtl52Lb0l64m29AwTcUbtyNvU0IHq-s2reN4,415 tzdata/zoneinfo/Singapore,sha256=CVSy2aMB2U9DSAJGBqcbvLL6JNPNNwn1vIvKYFA5eF0,256 @@ -622,13 +622,13 @@ tzdata/zoneinfo/US/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF tzdata/zoneinfo/UTC,sha256=_dzh5kihcyrCmv2aFhUbKXPN8ILn7AxpD35CvmtZi5M,111 tzdata/zoneinfo/Universal,sha256=_dzh5kihcyrCmv2aFhUbKXPN8ILn7AxpD35CvmtZi5M,111 tzdata/zoneinfo/W-SU,sha256=7S4KCZ-0RrJBZoNDjT9W-fxaYqFsdUmn9Zy8k1s2TIo,908 -tzdata/zoneinfo/WET,sha256=pAiBtwIi4Sqi79_Ppm2V4VMiMrJKOUvMdCZTJeAizAc,494 +tzdata/zoneinfo/WET,sha256=RNL2z4RzfmoeDa-RQQnpQla-ykC0DJoRt6BOi92u5Ow,1463 tzdata/zoneinfo/Zulu,sha256=_dzh5kihcyrCmv2aFhUbKXPN8ILn7AxpD35CvmtZi5M,111 tzdata/zoneinfo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 tzdata/zoneinfo/iso3166.tab,sha256=oBpdFY8x1GrY5vjMKgbGQYEGgqk5fUYDIPaNVCG2XnE,4791 -tzdata/zoneinfo/leapseconds,sha256=fjC39Eu3wB6I4g7x_VL7HzvDVbiKbLUjfQAEgo7442I,3257 -tzdata/zoneinfo/tzdata.zi,sha256=q6xnElaYdX6HiShmu3FxIV9CeWaQHmnF9XLjV2-bYv0,109388 -tzdata/zoneinfo/zone.tab,sha256=qSLfeCWE3tsCDIIQbr71DMkmCUXTIUEgNZgfN-60d-Y,18846 -tzdata/zoneinfo/zone1970.tab,sha256=FJErvL9wggoFluO2WceYn8ZQ-nA9A073Lub1x2Pzg40,17582 -tzdata/zoneinfo/zonenow.tab,sha256=YoPd7huhHsKlJliOO-eMIBE5-bHBKpbfjkSJQFAto6I,8311 -tzdata/zones,sha256=W13GrYuma2VrkfW_VDfQpCt0Ivs2tvvYE4I63b0Z6jM,9084 +tzdata/zoneinfo/leapseconds,sha256=X1FVahN0_N2AY6gOUBNWW9MsP297cqFQTHJypTr0rgI,3253 +tzdata/zoneinfo/tzdata.zi,sha256=7zXE0Xivypn5-hCW5ALTasSlFTDMoMOcUTEE29FiOo4,107022 +tzdata/zoneinfo/zone.tab,sha256=a2hE16NtKUnPJzM2krm5rKu1vxtP98nUhGHO3sE6DbM,18775 +tzdata/zoneinfo/zone1970.tab,sha256=3ANHICItrC0iU1vSQAMKZXN1a68sozBiy9AHi9ZGooE,17510 +tzdata/zoneinfo/zonenow.tab,sha256=vEbqGYEEhc_CL-FnoeZ5q3CsPTu8sETOnicuJxFJRqY,8101 +tzdata/zones,sha256=QtJFuOPGCOVEojCYP6b1p4Q_LwMzioibni6fGFIseYQ,9084 diff --git a/libs/tzdata-2024.1.dist-info/REQUESTED b/libs/tzdata-2024.2.dist-info/REQUESTED similarity index 100% rename from libs/tzdata-2024.1.dist-info/REQUESTED rename to libs/tzdata-2024.2.dist-info/REQUESTED diff --git a/libs/tzdata-2024.1.dist-info/WHEEL b/libs/tzdata-2024.2.dist-info/WHEEL similarity index 70% rename from libs/tzdata-2024.1.dist-info/WHEEL rename to libs/tzdata-2024.2.dist-info/WHEEL index 4724c4573..17c0299e4 100644 --- a/libs/tzdata-2024.1.dist-info/WHEEL +++ b/libs/tzdata-2024.2.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/libs/tzdata-2024.1.dist-info/top_level.txt b/libs/tzdata-2024.2.dist-info/top_level.txt similarity index 100% rename from libs/tzdata-2024.1.dist-info/top_level.txt rename to libs/tzdata-2024.2.dist-info/top_level.txt diff --git a/libs/tzdata/__init__.py b/libs/tzdata/__init__.py index b319ed555..e558a8a53 100644 --- a/libs/tzdata/__init__.py +++ b/libs/tzdata/__init__.py @@ -1,6 +1,6 @@ # IANA versions like 2020a are not valid PEP 440 identifiers; the recommended # way to translate the version is to use YYYY.n where `n` is a 0-based index. -__version__ = "2024.1" +__version__ = "2024.2" # This exposes the original IANA version number. -IANA_VERSION = "2024a" +IANA_VERSION = "2024b" diff --git a/libs/tzdata/zoneinfo/Africa/Blantyre b/libs/tzdata/zoneinfo/Africa/Blantyre index 651e5cf67a54ea3c729780cc8991407dd2a8a841..581bb0e08b616a433d422ccb8f958cbebdae1770 100644 GIT binary patch delta 39 rcmZo>Y-XI0tkCOpwTzL0L9UAd2xJr(SbTg#7@QqL7`T9ht`QdiyLt#O delta 39 rcmZo>Y-XI0tkC3k^a~>cgIo^-5XdMnu=x0fFgQDgFmM40T_Y|4$1Dh# diff --git a/libs/tzdata/zoneinfo/Africa/Bujumbura b/libs/tzdata/zoneinfo/Africa/Bujumbura index 651e5cf67a54ea3c729780cc8991407dd2a8a841..581bb0e08b616a433d422ccb8f958cbebdae1770 100644 GIT binary patch delta 39 rcmZo>Y-XI0tkCOpwTzL0L9UAd2xJr(SbTg#7@QqL7`T9ht`QdiyLt#O delta 39 rcmZo>Y-XI0tkC3k^a~>cgIo^-5XdMnu=x0fFgQDgFmM40T_Y|4$1Dh# diff --git a/libs/tzdata/zoneinfo/Africa/Gaborone b/libs/tzdata/zoneinfo/Africa/Gaborone index 651e5cf67a54ea3c729780cc8991407dd2a8a841..581bb0e08b616a433d422ccb8f958cbebdae1770 100644 GIT binary patch delta 39 rcmZo>Y-XI0tkCOpwTzL0L9UAd2xJr(SbTg#7@QqL7`T9ht`QdiyLt#O delta 39 rcmZo>Y-XI0tkC3k^a~>cgIo^-5XdMnu=x0fFgQDgFmM40T_Y|4$1Dh# diff --git a/libs/tzdata/zoneinfo/Africa/Harare b/libs/tzdata/zoneinfo/Africa/Harare index 651e5cf67a54ea3c729780cc8991407dd2a8a841..581bb0e08b616a433d422ccb8f958cbebdae1770 100644 GIT binary patch delta 39 rcmZo>Y-XI0tkCOpwTzL0L9UAd2xJr(SbTg#7@QqL7`T9ht`QdiyLt#O delta 39 rcmZo>Y-XI0tkC3k^a~>cgIo^-5XdMnu=x0fFgQDgFmM40T_Y|4$1Dh# diff --git a/libs/tzdata/zoneinfo/Africa/Kigali b/libs/tzdata/zoneinfo/Africa/Kigali index 651e5cf67a54ea3c729780cc8991407dd2a8a841..581bb0e08b616a433d422ccb8f958cbebdae1770 100644 GIT binary patch delta 39 rcmZo>Y-XI0tkCOpwTzL0L9UAd2xJr(SbTg#7@QqL7`T9ht`QdiyLt#O delta 39 rcmZo>Y-XI0tkC3k^a~>cgIo^-5XdMnu=x0fFgQDgFmM40T_Y|4$1Dh# diff --git a/libs/tzdata/zoneinfo/Africa/Lubumbashi b/libs/tzdata/zoneinfo/Africa/Lubumbashi index 651e5cf67a54ea3c729780cc8991407dd2a8a841..581bb0e08b616a433d422ccb8f958cbebdae1770 100644 GIT binary patch delta 39 rcmZo>Y-XI0tkCOpwTzL0L9UAd2xJr(SbTg#7@QqL7`T9ht`QdiyLt#O delta 39 rcmZo>Y-XI0tkC3k^a~>cgIo^-5XdMnu=x0fFgQDgFmM40T_Y|4$1Dh# diff --git a/libs/tzdata/zoneinfo/Africa/Lusaka b/libs/tzdata/zoneinfo/Africa/Lusaka index 651e5cf67a54ea3c729780cc8991407dd2a8a841..581bb0e08b616a433d422ccb8f958cbebdae1770 100644 GIT binary patch delta 39 rcmZo>Y-XI0tkCOpwTzL0L9UAd2xJr(SbTg#7@QqL7`T9ht`QdiyLt#O delta 39 rcmZo>Y-XI0tkC3k^a~>cgIo^-5XdMnu=x0fFgQDgFmM40T_Y|4$1Dh# diff --git a/libs/tzdata/zoneinfo/Africa/Maputo b/libs/tzdata/zoneinfo/Africa/Maputo index 651e5cf67a54ea3c729780cc8991407dd2a8a841..581bb0e08b616a433d422ccb8f958cbebdae1770 100644 GIT binary patch delta 39 rcmZo>Y-XI0tkCOpwTzL0L9UAd2xJr(SbTg#7@QqL7`T9ht`QdiyLt#O delta 39 rcmZo>Y-XI0tkC3k^a~>cgIo^-5XdMnu=x0fFgQDgFmM40T_Y|4$1Dh# diff --git a/libs/tzdata/zoneinfo/America/Bahia_Banderas b/libs/tzdata/zoneinfo/America/Bahia_Banderas index 48faea2ecefa7dca89c7b2f5e0bfec6b47becf69..882400bd33bdc23fc75b092a01ea935b02431715 100644 GIT binary patch delta 144 zcmcb?x`%Z_n5HcQ0|P4%i~I+IrQ2Q<favufwZZhZw6Fvaf4ie?!Nhurjmx()PEKNy z3SnksVZsIf|DPMezyKsCFtGgpzj^@!2Z&_k`Tu|C21WrN-w+1h;1C99Aog_u(m>1w I<d|^*05^L!L;wH) delta 175 zcmdnPdV_UBn5I1g0|OfnOZ*3drQ2Q<favv~@*aTbZE0Z%AbPv=rG$y~5&|Ihjfq=6 z0M!FQLBq!B+Zh>ICI>P}PEKHAiD6~J1^@q_8^XW<BquPi{Qtjt0Rsn!WaRn(zrTS2 iXzb1nj3Pe1Aq>93Aq>ty?CTQ35CCEWX)d6E85aP+v_zBu diff --git a/libs/tzdata/zoneinfo/America/Cancun b/libs/tzdata/zoneinfo/America/Cancun index 640b259fd0f87a34f03554cf34b4346cffd5ef22..3110cdfd6e6f4ccd889447657dff43560d5aaee0 100644 GIT binary patch delta 175 zcmbQpGK*zGn4>lW0|P4%i~I+IrQ2>L0ND&;UC%%igGBk63n1Dsy$nP#7!`9AfM{d) z2oS|!67;HIW4|I}5)&gcBQp~VkRSk={{LUMf`Q@x|J4f^SpNUtxq*QLL^AUH|9|`d aqkxZZ2!nHQ2!ksSJG%gBAm##cOt}E>Nh+cM delta 166 zcmbQmGLdCMn57m20|P4%i~I+IrQ2>L0ND&;ZCAmxVS4%p5Z|ci7npDC?g{3b1l>v4 zI9-u3k(mhuSr`dH=KufKtzcmI|9|xY2A2Q-j~`&<`2T<B1_mAw$td9C8^Yim9Kzu0 P0>nVt8Ax*h8KztSxScCj diff --git a/libs/tzdata/zoneinfo/America/Chihuahua b/libs/tzdata/zoneinfo/America/Chihuahua index 5e0a54f00468f11913f12aaab341b1fabd9aded6..f65bb1c9310447737822ad026470d5092ce87678 100644 GIT binary patch delta 30 icmdnYx|wxCj_^nAg8x9UEiEhoL~nPrE!bFZ!UO;Xk`Unl delta 30 icmdnYx|wxCj_{|v2mgU!TUuBGh~DmeDPd#12@?Pp*Ag56 diff --git a/libs/tzdata/zoneinfo/America/Ciudad_Juarez b/libs/tzdata/zoneinfo/America/Ciudad_Juarez index f636ee643fe49a583fb2db3ff8408c341a06e8d3..5f865ea808b57d97634d4331fc5fce84349ded36 100644 GIT binary patch delta 30 icmX@ddX9BMj_^nAg8x9UEiEhoL~nPrE!bG^&jbJq<`FUg delta 30 icmX@ddX9BMj_{|v2mgU!TUuBGh~DmeDPd#1KNA2RD-vx0 diff --git a/libs/tzdata/zoneinfo/America/Ensenada b/libs/tzdata/zoneinfo/America/Ensenada index 42087af4cceb049f1395cabaaa85b7c39253ed97..18d0d14afc1cdf37c8f3607181e3f72211da99e9 100644 GIT binary patch delta 98 zcmZqV*v>H_j4@?mxGeKW%Z7>Ny3TXgefSRq*QFyFK=h4?TfqF=4D4Y3?E}SN{+)Z9 k7l7pNu3R$#MBm#t70kci**9V1_ODEn3z*p^uVD@a0Q@;YIRF3v delta 46 zcmdna(a13&j4^IvxGeLhnhz7pb%kf{D)<is*QFyFK=h4?TRv=j{*`I+Bj!*58j%^R diff --git a/libs/tzdata/zoneinfo/America/Hermosillo b/libs/tzdata/zoneinfo/America/Hermosillo index 5c92e2967e7cc5a0e3567ed0321f15b8b3a6b6f8..ba7b14760d47d1e10241e78e976f0093ada6551b 100644 GIT binary patch delta 80 zcmbQo)WkF)Op}*^fq?~x1^xrU(rqsaK=k^L+F*KHT37;zzunQcU}C+*#O3A_AIORM X_=Yg}28S>>1F^452m=?8W6lKtAqpea delta 109 zcmZo-n#VLDOp~91fq@l>Mg9Z9(rqsaK=k@gc@IGJwzRMW5WU^`Qo_V~2>}rM#>6cj wfa-yupkd;4b4HelXXO?C|L<>L5b*I0VekzOVQ>awUzZSu03gi;6foxk0Ny|`ApigX diff --git a/libs/tzdata/zoneinfo/America/Mazatlan b/libs/tzdata/zoneinfo/America/Mazatlan index 97d4d36c137fce3b89da84ba2b27dc17a86a15cb..5aa6039ea4cb36077f048782b54c6275c25e86b3 100644 GIT binary patch delta 86 zcmX@dx`}l{n5HcQ0|N^X3;YLyrQ2Q<favufwZZhZw6Fvaf4ie?!Nhurjmx()PEKMn dnLLF_O3cSMguypBguxkzeO*ErxPTmUE&ww-CF=kH delta 119 zcmdnQdX9BMn5I1g0|P4%i~I+IrQ2Q<favv~@*aTbZE0Z%AbPv=rG$y~5&|Ihjfq=6 z0M!FQLBq!B+Zh>ICI>PZPflQBncTu8q458Ie*=Snk8cQrZ*T~MGZ6c_gfIjEX)d6E GITrvCBs3lX diff --git a/libs/tzdata/zoneinfo/America/Merida b/libs/tzdata/zoneinfo/America/Merida index e5de1131dc48e5d652c7bd6a77be22a2e9b500cc..e5c7d8cc2d2a986374f35561d8b629110b481a66 100644 GIT binary patch delta 22 bcmeBU?PHyg!`=0a0R$veZWU}S7iR(hOfd#! delta 22 ccmeBU?PHyg!`*f@fdL34e7plTmWwk108Ir3DF6Tf diff --git a/libs/tzdata/zoneinfo/America/Mexico_City b/libs/tzdata/zoneinfo/America/Mexico_City index 80a415c70ca3d94aa25bbc1e90f3ed169943a704..18112346129a885b5d5fa27109682b63784f72c0 100644 GIT binary patch delta 30 icmZo=Yh{~|Bm7aj;6D&-OAAW?(c2wu3pUobF#!Pk^AOnp delta 30 icmZo=Yh{~|Bm61v!G9pwmKK%(qPII=O4wN6#smNkM-mhO diff --git a/libs/tzdata/zoneinfo/America/Monterrey b/libs/tzdata/zoneinfo/America/Monterrey index a5822e2c626ae1927cb2dfc201c9561430cdd581..c1e05464513a451ab3cc49452e39da2b04e01de0 100644 GIT binary patch delta 184 zcmZo+J<2*E%+ij5fq@l>Mg9Z9(rvdAK=k^L+65qbTUr>HzunOm%-_Ld2IlYh+xB5& z`eDXmW=19!GU5OK3%@Wh{Qp090t3tc|Em`;aDYfgp8x-MZeSGf@eN_{4Gv*&24Y_q MAPvM^K#my~05)+!8vp<R delta 119 zcmX@g+QK>^Owf{nfq@x_dHw^z(rvdAHufK8jACLW2mb%R@CyUO|NpBOFtGgpzjFg4 UhmUUvgL5ztyM!=s0U2go0Q_Pa2><{9 diff --git a/libs/tzdata/zoneinfo/America/Ojinaga b/libs/tzdata/zoneinfo/America/Ojinaga index f7e40c08185080d9594d56add6a5c7c5874d0332..1dd08b1cafd4b36ce963bdc42a075665fa723b54 100644 GIT binary patch delta 30 icmX@ddX9BMj_^nAg8x9UEiEhoL~nPrE!bG^&jbJq<`FUg delta 30 icmX@ddX9BMj_{|v2mgU!TUuBGh~DmeDPd#1KNA2RD-vx0 diff --git a/libs/tzdata/zoneinfo/America/Santa_Isabel b/libs/tzdata/zoneinfo/America/Santa_Isabel index 42087af4cceb049f1395cabaaa85b7c39253ed97..18d0d14afc1cdf37c8f3607181e3f72211da99e9 100644 GIT binary patch delta 98 zcmZqV*v>H_j4@?mxGeKW%Z7>Ny3TXgefSRq*QFyFK=h4?TfqF=4D4Y3?E}SN{+)Z9 k7l7pNu3R$#MBm#t70kci**9V1_ODEn3z*p^uVD@a0Q@;YIRF3v delta 46 zcmdna(a13&j4^IvxGeLhnhz7pb%kf{D)<is*QFyFK=h4?TRv=j{*`I+Bj!*58j%^R diff --git a/libs/tzdata/zoneinfo/America/Tijuana b/libs/tzdata/zoneinfo/America/Tijuana index 42087af4cceb049f1395cabaaa85b7c39253ed97..18d0d14afc1cdf37c8f3607181e3f72211da99e9 100644 GIT binary patch delta 98 zcmZqV*v>H_j4@?mxGeKW%Z7>Ny3TXgefSRq*QFyFK=h4?TfqF=4D4Y3?E}SN{+)Z9 k7l7pNu3R$#MBm#t70kci**9V1_ODEn3z*p^uVD@a0Q@;YIRF3v delta 46 zcmdna(a13&j4^IvxGeLhnhz7pb%kf{D)<is*QFyFK=h4?TRv=j{*`I+Bj!*58j%^R diff --git a/libs/tzdata/zoneinfo/Asia/Choibalsan b/libs/tzdata/zoneinfo/Asia/Choibalsan index 0a948c2eaca30cde2963c330144215ba52d67c5e..6f5d3a15abbe48b8a4dc72aadc88c416160a56a6 100644 GIT binary patch literal 594 zcmWHE%1kq2AP5+NDnJ+nLI`UCnaBdf0{?-a?eaSxkUoCyI}<>(#LE*6AX@U)pAR5f z>Wps#h?d@CPynK3*625YXxTYJV7^?BAeb*-{RPZd$o>rGD@I=f^Od}>g89nUJHUJu z?d@Q`s`M-{UyXYvn6J*V?E?c4sDIf8q8K!u%mDK>ugn1RwT@JQ`Py5mz<ix0F<`## zlo&8yuf-0`*DtXH^9@oIz<k5ls0NULk*{q5h&HyhX#mkCy7FMYsjM8BZ^p|A=3Bko zyZ|I`y=Bb=5N)$$^#TxWJEafIw`=JI^X*Ftz<h_4d@$cJBnZrRatQ?UolQ)@d>0jC zFyB=+P=EmlLPckR`C+Vy1t5Od*BUTC{Hb#RBQq0;kbxn^1Y}B50Vqc6CNOd^FcdT} a@c8(KFlZZ?1F<C#TQG3h07*Mt3oZbPsA3NQ literal 619 zcma*fyGw#$6vy#nX+#QH6m+wzW@TPdD@*OB(NH$og(66iAZ&OCx1t;*s2m)eqQb$b zq|vc4$f2#KXmH5FrG#p(=luSGIuD2M`+?_q{VSUrR{C>f;s!5||L-R@ajimZ-H(|4 zhqoSnSFL<ba2txbD7W$HJ<n~rAD6hzH=XO;mg^2!b0UXZ<K=MM_AA^TF2EhDIk<E7 z4(@VhV6EW_)-}iBZsifImtW>djQ;DQ#O--G%yWAm58%GrE!dC^!~N-b*qHRerkDjb zN6fG#R0|KR%}FH2>NBr%ZEh26H`c&|8Z|tm`h-V|=Lx>&%$`NLuJkGFPDbIe*d9C{ z3BnVh06gjU!c$%k?6G&lUabzE)_90#<|9+$F4P~VxQmK_gnsY9O9hW4E0dT1|CA}j xAqp?^Z-NrZiKHl16742PMHElT)ch?|&H4OfundcJh#eurfQ71DLSsfp)h})}XzBm} diff --git a/libs/tzdata/zoneinfo/Asia/Dili b/libs/tzdata/zoneinfo/Asia/Dili index bb7be9f3a47112bffcb2f33f70810819b5c2b726..22e705ca1ab1218e9f36b9f4f607258389853c8b 100644 GIT binary patch delta 12 TcmZ3*xQcN?Dw7<;#B^r>8D#^f delta 12 TcmZ3*xQcN?DwD*KiRsP&99INo diff --git a/libs/tzdata/zoneinfo/Atlantic/Azores b/libs/tzdata/zoneinfo/Atlantic/Azores index e6e2616e98b161a60546d26fcc49d90c45d92f38..cda1c1d225ae261ae433579e56d94a84ae2acd38 100644 GIT binary patch delta 403 zcmZ3>{gZ1#7-uU30|N&T%TA0}ixgk*9|-22oIe3X&#UuR0MYYTT^0b*3*zg*@(X*| z!19Znn8EzTdEH?C5@mC+`lbH+!RlABaf8KIJ+GN~?;I2JyUptuZ!*?{jQaUF_yEvS z265)I6TtN6ePCMR@p>>Vd3gbtmO4BUOiS<CD*#d_vt}KbmYp*nOw0950Mqg{jbK_K zrwB|d#w3GjC7%#5t!(28rd4#z0>KPb8FetN#v=iy)mfb<fGkk|Y67M;o~nXr&8uQy zTI(n~nAW!CQvj*c-tq&?*O5OYFu9*)iX;;&3s%TJ*_l;OiBEu01f-2Y(#JQ1!2^hO W4Ge+Uh(X)HfFay9IAn4Mt11AMFMdY= delta 456 zcmey#wU&EA7-tUy0|Pq{OH7Pci{zZ}9|-22oDZhw)%Stv`KvAqfW#NX7l8Q-d)UDA zBFC>_dU0Mim|mi+DF9Np)PFyiUd6@@7GL#c^~8JUm>9h`uVcK)SP!&}fp@m10Ep)6 zmIBlKEv^$le1Q@(FfEv(4yJ`d)E0omg<Uwod=V24Fke*pCzuu!eg&q*nQuer&u752 z#N*Q&7=S?X@;WeI>hOFpExqS-y#i32L1xV!FfBW0Etr<;nFprjYx=>oLQVsiR*WeG z(@H)`U|QKG7)-0^xPWO@8B;K=#-j$N)mZ}<FaUx2S0^y7@zfYhYhG0W(^^NlM8OR0 uEk7nq4riI7z{-LjPG(`%6K7yx5b^O1VekNAT?0cPHe%2=Fqj;|stN#gl!I*m diff --git a/libs/tzdata/zoneinfo/Atlantic/Madeira b/libs/tzdata/zoneinfo/Atlantic/Madeira index cf965c3f9274923cc8410311741b0e30b06339bb..21e84571ee1694758dd244ed0702fbae962648e6 100644 GIT binary patch delta 255 zcmZ3>eTQp87-RFqaNVf6oD=>7!Q7J*8$k5DI$Hq{J%80v1`xd<z5p!0u=@vCev#u> zFn@7gEttPVSre>&ssBc>`c<rd!Q!i)=S{qKj*0of=5>rW83RB@{e0}YfdL4_d47Q? z2Jz1u8bGwf<Aq>a^714wEp@mVOiS-s50qtKkXf?;Ov}!h2&UzFniw|Av#>BSGEFvM zm1bsRWt;5Hs-Oy#6k%ZC6JV6^@eN^c17d9h0|s3KLm+L)5bhcR#KDs%u*w1e)4gnN delta 330 zcmcb^wU&EA7-P@GaNVdmzZ?Do!Q7J*!SuZP1~5H;)lmkJ_=5N(Fn?k94=}yR@i~}Y zoL38`mncg!fYdGZ-w38xvHk^%ulh1~;=OZBjJBKCG2UdXX8;1;+0r12fv=kfO!K#x zH-H!dB^qE_Fhvqf3x!Bb0Er7b{|56#jDLaoqROwqw3zT6FfGn}7D9jC2c{(+?_B`W zCwX}Rm@jpBBAAxmvsY38Bq6hA9hjD#GapRL^-K`he4Uwvaq>eJ$;lsBxPX{-@-G$z oRXzbm5s(fBNgv-31~(wqHZWk&H82Fyh794Z!686mvOTLT0BqcO*#H0l diff --git a/libs/tzdata/zoneinfo/CET b/libs/tzdata/zoneinfo/CET index 546748d6eace6007bc1239dbe2bd5c324623ca56..31973271d2f87f7e9df4e8b0a1481f09a9e5407d 100644 GIT binary patch literal 1103 zcmb8t{Yz6(7zgk>-LhoqO>@p^wOVUsb1!a_h#+h32XiZ-QDS9*B1JEZAyHA0FetGf zW&{eewrsjAon_86r)6eal=d>U96^wjMNn1*(l2(O@BRSmT+aF2?{l7e;9jn^^iX9k zGw<MW9W-fJ=YOP<Yg@og$s9L!b-({a9{n6<$cBQ#bEHcsx54q~4B0s8cam4U0eH37 z3EhtRn4_~A+V>o2o*}QD?X!_hsubkwr_9i6sD{mDGVHg=4ah!)3*N})!PbN`F~8|; zbk5D`{m8f86vMXA7TEsO2mL-7?C|WcQUC4p0^~b2hheA9?4kNydnfEFR>44Fsg&y7 z8W#Cp?s3?Y{4?g<6zu&z2JcVQN~yo^?GG3Xe}Mfx5jfzk@zDN*h5+(IS0)@hQ4b#- zya0zvPQu5V)gI~}-mnMx$;Lq#Dw#k%6kP<v+cHppK3&98|43`PlN@a_BEPt#hcAzn zq5jG)LVmqHA30K&k33c+bJBmZ*jo;hY9%b?WQPfvt;&N-DikoqDu$_+0+#xg>i!_7 z$-Y8S>N}VoKN9oT02EJkz>J6oN`~rSX0V^7bF$j}a9N`pF2Cr6D^6EK=@C0zxwjmy zGFzc+lL@X?=0SOu0<IB?p+aDE()o(tdbswZ9IhJ|!R+A#xV~!^D!pG|&gCdnIi5jv zRS;?_+M#yeB+HA7=i`bK{QDJq;y+e~;Y;WZxRp;b3mGPfWrW-}lk!-)=cSn~R%R<V icblw?5pyR6Zb{@~j@HQCDlIydL8Vbzv>H;aOZ*G`0?%at delta 136 zcmX@l@s?#mn4l>G0|OHfbN&Z{**xM26YF(YPH+}Zn9R?lD%7MZ0204gBnGB0`8jM3 hW3pm&XJ8})GVlp7ure^nC@?ZOy9S2<iOGg6asV)+93ub# diff --git a/libs/tzdata/zoneinfo/CST6CDT b/libs/tzdata/zoneinfo/CST6CDT index d9315580584f6ad8f741781fab24d7af992c5df8..b016880653929aa40dd5ac0e82e4094a9d787cdf 100644 GIT binary patch literal 1754 zcmb``YfzL`7{Kwv{UQjZBm$vHxgogR;v%kz!4Ba>SgseW(IHKuX<|#1ai+m_B26cw zG{@}1#anoxMK?ksVMQVaYbHU74c!*9l`v%$Qv}*=&;OI(^h4*J^FHVIT+aLH)vPF3 z8!zs=T$~+p%cZ&hh~C-e>D<8%=UVAzuavR;P_$0Qitp}fWvtvX5m$ZIi}#%^5;DL4 z-8(iJ52!n-A6#w1hZdWte-*Tc{_2EATx~Z{KQie{e8jvPA06I=k2MwJnyx(jb$Kq< z8`5!Y$y|K=i&Z-L-4prCwK5vsS%AOEOvQCCN8oQ2VYpu9flqqcaYN`8++elfMh|x( z?`dpn!QWrD;!}FFP3D_g+i`Q55gS)@<I}Y&`ddmrz-Mwwskg3q6aNsi7Pn<@*U5W+ z40sl|&wc~9kG#r!hyU}qqbC!eecz5dBW~f&JRjz|)(;DL&-t{g_`;G4xO@7~_}9dG z+#~eZ6towcEFa_F>~%Uh-)mflFPit@ONT$w%DlO0BmRBc+t^b667DO|;Qo?%_>Zh4 ze0k+G{O2;2P0m|0RYJxq$>DfF5sv?wBJiM>z=OB@@l|U-{=2&sUu$c{*PHva@}42R zMJJ=J;tak~)`D+tI*5l058zv?w&H(sw&2_I3-Fzo*YL=b@7d%%cLNsUQSW>_I+8DB zerzBMkN0HZf7_$5{bUq&RQucH|0F*3C%9}K!mh<b*zGMptvtBrP0-2cvFJMXOuL4? zVt>J2I~3R_@C5d$*)Q9Luk8~&!Lp0GpQ+X+^Zv&5cw)m&9B_E2OpCz1Mfjm@Mfl;3 zOYx+FrFe2~3J%Ij!H>)d!BZkbaPW*|tvpQi9>*cBQ*p@6V4X~a_Ko4NbEEjt)0c4g z@r!s`RWqKxAwaf^$2M2t8B1>9h}Tcq<l*teF8sv83OqBY4l8DD#tQp6olHdfuEvpO z1D-Xg#!*eXadg)!TG=<dycjDD891gS7su|JiR1D&$Tktb&KoCWF2_&3IEWJ!sW>VA zC!FjRhEqZZZ1Rv|wc|Ns9XPekg6H-g!z%r_PA29xeu$qgGvoQ6YjIkk5icm+p_P5l z<m|)gYYK5jOet1pynxli^}^NV0Uoz|dfYwk!GjF{uRRV&&3X9~H`KbgI~+$Vg||El xKQe*5CqI|15$PGuy;vjE&Yix@xff}KuQQS4EJSA~DC3o}(b;iv$~a}L?|+gw5kdd} delta 176 zcmcb`yPbVP7-s|n0|N^X3rtK`5kB4Vui-xsTvGm00HzZ;H~TSnGSxFOFfuSP0|_d_ n|NmDnU|{+Gf9D291~AD1CV8A)LKvKbfjAt9141SrWRnB{8}BD_ diff --git a/libs/tzdata/zoneinfo/EET b/libs/tzdata/zoneinfo/EET index 378919ea113105881f9ade477d91692f6ac263b9..231bf9c3b713e3676dbd8f3ced867973c601e104 100644 GIT binary patch delta 344 zcmey!yoz-~SiLy|0|OfnOZ^9e68jl0AbNI#VgrcYS@ZG%m_D}t0*F5ODH+T^C9om@ z#6R=gTL46#UFGuuM4wwE0hT{MIkN!7zb`y50Zeb_3IN){!1*RF0Yr04e1Xtsz1D&F z3_N@1gK6F+p$#AgUr#KU=5H|v(*jw41VG|~Db*i9v{2A0FfHuXlmOz37#|9lIR9ro zGZQltD+?<Nh$bE~Fo@ZJOaYQC3=CQZj2sLMG71d5Kz9f*2!hy*qCUPM430qT>KY6p XLKvLE7|7uQ@^p<r;yRP>F$x0!Dray? delta 146 zcmZ3*`jL4;n5Q}e0|OHfa{@5~?~>#RAeygRN&rOjx444&0wrc(S};W&ObdlbfN5c0 q7Xgqu5#wJICd)Jav}9l;3NpwjFt9Q(Xc;gvxVi?10Ex+6ObP(|bP{U- diff --git a/libs/tzdata/zoneinfo/EST b/libs/tzdata/zoneinfo/EST index 3ae969114563a5d7a1df96237c38a10df92baf56..9154643f4c9189998392afb8a93e2e2eb9eaecf5 100644 GIT binary patch delta 69 zcmd0w$~Ym+o{52hff<N-{sTc~yP5!q?*5Yaf|2R}|E&cK3_wzXf#v`Iof{Z9e0)O~ QoPpRiID~-<NSJZ~0Q8v~cmMzZ delta 30 kcmbQrm_H$Gq5_L3BLf2i%m4p7H!v``28S?k0SQws0Eg-bLjV8( diff --git a/libs/tzdata/zoneinfo/EST5EDT b/libs/tzdata/zoneinfo/EST5EDT index 50c95e0cb07692f2a177a505041a10f284cf0a60..2b6c2eea14df07392729ae9f5712a44ec4f02bae 100644 GIT binary patch literal 1744 zcmb8vc~FdD90%~HLuD)FSXb_AZECl}O63S8VJF8nxh5}Dn&pq)VT2iS6v+%R8pbh8 zbU9ZSR%{`w$+%iaIr5f-h*vpM?0TNB|CxR}&wlswdw;)Y|Jv0o(ys6$|1BFj!450U z|5x;MtP4H8th8e6#JwzaIfHnX$F6+fSRUU&;LO8!;S+K7@X6%&0(+jd@;sca%Ej}X z`IRE;=StJyJpZ$Bo+TUer+e;!PuHfxXIgpqtWgV}GtYz1>t@0F!m;p$ByTwX=v<!N zUl2c&V_CS-A1(^_f{T|(;fu0v@TK4%@MQ-PHh9#)hQ=zm#QvMe?kO=9!B-oe!q@Z< z1lBi}8{pFP0=O*e2z)&u1HO^63BDPb2$#n$g>NYrz$W!Zp51fXEeNjgj)5!MqB+*D zbPa(ks{`RXJ4Lu^_}9P5bzslDwn1d`k3wF;kE2ZRlOd(>Q&k>ZO)}vc=`OfNNQR$T za(TA@yetlWQJV(8JhhEu{aWKH_*GggEa=p5opw50pQMCeM~sFWV!Fd`q7?$$Zw&Vq zS-uT$hu_KE;P<^-;3kJJaMSlk@P|e-{PD>}xY<+;e=0R|?4Hm1DxRfytQh{1UIe#n zJ_xra9Du(r-2i`!Tn~SrycqtWTm-j`UMH}7e!5M7+npA|?QIK0*6(;14F9SQf`3;G zge{i`z}8%=Kz}2I9JGimY*On4mbU8z*p9bw%=X-Go@JLg0>{!J<Q44ba|3qV-4E{S zo&|S3mw|nWxC3?;w&S@=%?W|faxII8yBShow^PZOcR#cO?w%G0_t-E4?x_ujdoA>Y zr4e$tcc2U0NA3*w9VX`pt$t3;aDQ88xPOa;XMK;lW_ZBEkMO|j_u)bL_u#>q`S6fL zg8iXe_rt@Y>fzxl^#Y+aLRAiroVgDkCC!0lo@-#4<tESO<dP^@UYiYjHU+?AjH$4f zS;NsW;;qxdio$WQGHDj<v%fFw8y_#SIltBIuzz?2Ja*m-SS1?+kMlFa0gkTlc#mfS zp*6noGaT4)6%H~zgoB^!;0gLqJe!+XvIU-${s5kQWH}s?PykO!+04-~GBq*-o))_d z4pk<?VWHFDu+}`$)~1s$JNr&9boLAWId8RI(Gf!b%F1l)tyaSY;)KsGcz2(z){wAJ gdgjv;P0t(+kx-~;(@X8I@KgABseOGFz6u}7AFmWIC;$Ke delta 176 zcmcb>yPbVP7-s|n0|N^X3rtK`5kB4Vq2NCdTvGl5p%Z>@_G9j3s%K<iWME<j5>$r& m|L@$u!1Dk9@dJzuV3Gq&^0>N$Ft`Q-aX1hMgiPMfCJ6wP1}L!r diff --git a/libs/tzdata/zoneinfo/Europe/Lisbon b/libs/tzdata/zoneinfo/Europe/Lisbon index f0c70b690660ce4ebf469a7016f9b8343eb20ea6..7e9aae727b2b660e7f5e383121f445daf033a9c5 100644 GIT binary patch delta 268 zcmZ3-y`6hP7-QeWaJ|Ui4gY~)?#bo?5IwI>p8-VAU$yN6h+Yt%1eRae{R%9<$niOt zzc?=+%wM7`4OYL@e-T*yD%SU4@m0^`C*C{9#C&P<I>wuf>>#6lJ~p4+#w=g&I)MQQ z1WL@nv|x%lm=+3=0Mo+0E&?EV5#wKAzNqru1`uCN_#BuPXWkE?KW_lj5|0;xY01lz sz_iriW-u+iXFUT5$gEiare)_$1k-YxRan>=nHX6nUtm#~?8BM_04&vT?EnA( delta 263 zcmdnay^ecA7-R3maJ|U41^<Cy?#X5_J+Hn9OwV7n?E^@BL3{|9zp(oim|o;~6HG78 z%Lmg-lzBdY)GhU21g2N9z6Xo1`qDS?-Z>^l{mttbZ!%8qXO^osZ(sldff5ZcEtnz+ zriDTzCV<3+oqvP*BF4YKd{O1sU|LN04wx2aJ`15g?*r2kkM}MB>65&?0L+&<JP}Mw o@7XH=5|>%C4ou6=nGdGrHtVpkGcvMFc4QTq{D6gLawuyO0KblIwEzGB diff --git a/libs/tzdata/zoneinfo/HST b/libs/tzdata/zoneinfo/HST index 160a53e045c872be729de80a522bb8b6f6ddee91..40e3d492e6c22c30041c31f159d4fe0ee9451c03 100644 GIT binary patch literal 221 zcmWHE%1kq2AP5+NDnJ+nLI`VN2P$I&Vv+wqQ1YN)ABf(~>g)lg6$>Lk^yyC96CnDM z@|OZIo#<%+qObNAdoVIFGP5wU{{NrD#J~U~BN$lz|F6nm<N%XAU{c`!|KbD&79Zab X29IDMb^+pWAPxv&-~tL58gKysKlwyC delta 31 lcmcc1STG@Mq5_K;BLf2i%m4qy2@DJ#!66J>K*G>~3jmQE2q^#n diff --git a/libs/tzdata/zoneinfo/MET b/libs/tzdata/zoneinfo/MET index 6f0558c3b6f4ab18385bc549894cc16098eade75..31973271d2f87f7e9df4e8b0a1481f09a9e5407d 100644 GIT binary patch literal 1103 zcmb8t{Yz6(7zgk>-LhoqO>@p^wOVUsb1!a_h#+h32XiZ-QDS9*B1JEZAyHA0FetGf zW&{eewrsjAon_86r)6eal=d>U96^wjMNn1*(l2(O@BRSmT+aF2?{l7e;9jn^^iX9k zGw<MW9W-fJ=YOP<Yg@og$s9L!b-({a9{n6<$cBQ#bEHcsx54q~4B0s8cam4U0eH37 z3EhtRn4_~A+V>o2o*}QD?X!_hsubkwr_9i6sD{mDGVHg=4ah!)3*N})!PbN`F~8|; zbk5D`{m8f86vMXA7TEsO2mL-7?C|WcQUC4p0^~b2hheA9?4kNydnfEFR>44Fsg&y7 z8W#Cp?s3?Y{4?g<6zu&z2JcVQN~yo^?GG3Xe}Mfx5jfzk@zDN*h5+(IS0)@hQ4b#- zya0zvPQu5V)gI~}-mnMx$;Lq#Dw#k%6kP<v+cHppK3&98|43`PlN@a_BEPt#hcAzn zq5jG)LVmqHA30K&k33c+bJBmZ*jo;hY9%b?WQPfvt;&N-DikoqDu$_+0+#xg>i!_7 z$-Y8S>N}VoKN9oT02EJkz>J6oN`~rSX0V^7bF$j}a9N`pF2Cr6D^6EK=@C0zxwjmy zGFzc+lL@X?=0SOu0<IB?p+aDE()o(tdbswZ9IhJ|!R+A#xV~!^D!pG|&gCdnIi5jv zRS;?_+M#yeB+HA7=i`bK{QDJq;y+e~;Y;WZxRp;b3mGPfWrW-}lk!-)=cSn~R%R<V icblw?5pyR6Zb{@~j@HQCDlIydL8Vbzv>H;aOZ*G`0?%at delta 162 zcmX@l@s?#mn4l>G0|OHfbN&Z{**xM26YF(YPH+}Zn9R?lD%7MZ0204gBnGB0`8jM3 zW3pmQWnd%&GVlp7ure^nC@?bkx(0^;i4X=ZAfamr;_CPs>zV2q==d5MfM|VVE&yj+ BA-(_r diff --git a/libs/tzdata/zoneinfo/MST b/libs/tzdata/zoneinfo/MST index a0953d1e791eaddbec13d086f7c4588738297606..c2bd2f949b248b835c98216b4dc66f9f6eb0265e 100644 GIT binary patch literal 240 zcmWHE%1kq2AP5+NDnJ+nLI`W&1}b9#VuAla5XZu^0YuMRW;Fps&)?170HPPP$$<F_ zXT1dTPj~Ww`RB#&%Yfw1_di_&qAxT`f%(6FlnQ|Ozh6W!FfjrlGY~Q|{r^Ah9RtJv l|Em`;vi$!)cLD<kn9bwk8^Yl00>r^U93H~J1!S0W0RTV0SUUg! delta 30 kcmeysm_H$Gq5_L3BLf2i%m4p#ConMh28S?k0SR+10FUShbN~PV diff --git a/libs/tzdata/zoneinfo/MST7MDT b/libs/tzdata/zoneinfo/MST7MDT index 137867c8bf5b2df2e55e8c0c84ecc7deafc3ba79..09e54e5c7c5bb2384e37626d4b985cfad29ed29b 100644 GIT binary patch delta 227 zcmdnaK8a&Om|!9U0|P4%i~I+II2N7_6XR8+7p4B20OBuhVPgQ%OI#m-`AhnjO{|lZ z{;ppJ=Kj!_0+#;C9|7k7;walVt&^#qi4h8!S>Q~V5LM{^|L0C&09w6z0V4~LJ%ND( S%;o`;0xUkhAq<oInKb~RE=L0Z delta 175 zcmbQlv7LQF7-s|n0|N^X3rtK`5kB3?GvPlFTvGm00HzZqHs0%Gs%K<iWME<j5>$r& m|IeMk!1Dk9>IIApV3Gq&^7y)hF!%-oaX1hMgiQX)EC~RTXC}h{ diff --git a/libs/tzdata/zoneinfo/Mexico/BajaNorte b/libs/tzdata/zoneinfo/Mexico/BajaNorte index 42087af4cceb049f1395cabaaa85b7c39253ed97..18d0d14afc1cdf37c8f3607181e3f72211da99e9 100644 GIT binary patch delta 98 zcmZqV*v>H_j4@?mxGeKW%Z7>Ny3TXgefSRq*QFyFK=h4?TfqF=4D4Y3?E}SN{+)Z9 k7l7pNu3R$#MBm#t70kci**9V1_ODEn3z*p^uVD@a0Q@;YIRF3v delta 46 zcmdna(a13&j4^IvxGeLhnhz7pb%kf{D)<is*QFyFK=h4?TRv=j{*`I+Bj!*58j%^R diff --git a/libs/tzdata/zoneinfo/Mexico/BajaSur b/libs/tzdata/zoneinfo/Mexico/BajaSur index 97d4d36c137fce3b89da84ba2b27dc17a86a15cb..5aa6039ea4cb36077f048782b54c6275c25e86b3 100644 GIT binary patch delta 86 zcmX@dx`}l{n5HcQ0|N^X3;YLyrQ2Q<favufwZZhZw6Fvaf4ie?!Nhurjmx()PEKMn dnLLF_O3cSMguypBguxkzeO*ErxPTmUE&ww-CF=kH delta 119 zcmdnQdX9BMn5I1g0|P4%i~I+IrQ2Q<favv~@*aTbZE0Z%AbPv=rG$y~5&|Ihjfq=6 z0M!FQLBq!B+Zh>ICI>PZPflQBncTu8q458Ie*=Snk8cQrZ*T~MGZ6c_gfIjEX)d6E GITrvCBs3lX diff --git a/libs/tzdata/zoneinfo/Mexico/General b/libs/tzdata/zoneinfo/Mexico/General index 80a415c70ca3d94aa25bbc1e90f3ed169943a704..18112346129a885b5d5fa27109682b63784f72c0 100644 GIT binary patch delta 30 icmZo=Yh{~|Bm7aj;6D&-OAAW?(c2wu3pUobF#!Pk^AOnp delta 30 icmZo=Yh{~|Bm61v!G9pwmKK%(qPII=O4wN6#smNkM-mhO diff --git a/libs/tzdata/zoneinfo/PST8PDT b/libs/tzdata/zoneinfo/PST8PDT index fde4833f6be38b0d3627ec08d861e25e789fddb4..aaf07787ad92b65eadae63b64bba290f9f961507 100644 GIT binary patch delta 482 zcmdna-p4f|Ot6-Lfq@l>Mg9Xp9E;R}iSah|*Z!5nfcQ5W)=mJ?xBeXl)3*;y5CHM- z+*=Cf-(9%|OyAqr4yNyS_JQdK^D@Eo!^{FO{ix0xOh5Jv0@F|8biwpfO%pKv%-u@> zWbSjJKoDL3|Ao2^Sm4DcV=(=Soex4^5(U$*pM3z+Z#I4h({GPm0@Lp%-UQR{*T0(p zGVnv;ZZQ92{{=ArQ~g0O{W*UVnEn#K7)*clp8}@8*|!2|+5i8)>z9EAerPNb02%a? zKLX7E#nG~HS|?LI6C)5Zvw$fOldkape}#!^3=IGO&z-=?^8bH-0|N(`%>yO{e0)O~ JCigRI003g({P_R? delta 156 zcmeC<+Ri>9j5C6Pfq?~x1tzB3Y(C7`!c@=5z{tSF3?!%w|NrlAU|{+Gf9?cE1~AD1 XCV2u}LKp&qfjAt9141T$Wsw8`b4nPl diff --git a/libs/tzdata/zoneinfo/Portugal b/libs/tzdata/zoneinfo/Portugal index f0c70b690660ce4ebf469a7016f9b8343eb20ea6..7e9aae727b2b660e7f5e383121f445daf033a9c5 100644 GIT binary patch delta 268 zcmZ3-y`6hP7-QeWaJ|Ui4gY~)?#bo?5IwI>p8-VAU$yN6h+Yt%1eRae{R%9<$niOt zzc?=+%wM7`4OYL@e-T*yD%SU4@m0^`C*C{9#C&P<I>wuf>>#6lJ~p4+#w=g&I)MQQ z1WL@nv|x%lm=+3=0Mo+0E&?EV5#wKAzNqru1`uCN_#BuPXWkE?KW_lj5|0;xY01lz sz_iriW-u+iXFUT5$gEiare)_$1k-YxRan>=nHX6nUtm#~?8BM_04&vT?EnA( delta 263 zcmdnay^ecA7-R3maJ|U41^<Cy?#X5_J+Hn9OwV7n?E^@BL3{|9zp(oim|o;~6HG78 z%Lmg-lzBdY)GhU21g2N9z6Xo1`qDS?-Z>^l{mttbZ!%8qXO^osZ(sldff5ZcEtnz+ zriDTzCV<3+oqvP*BF4YKd{O1sU|LN04wx2aJ`15g?*r2kkM}MB>65&?0L+&<JP}Mw o@7XH=5|>%C4ou6=nGdGrHtVpkGcvMFc4QTq{D6gLawuyO0KblIwEzGB diff --git a/libs/tzdata/zoneinfo/WET b/libs/tzdata/zoneinfo/WET index 423c6c203a508a162f86fbe44822b78213b575ff..7e9aae727b2b660e7f5e383121f445daf033a9c5 100644 GIT binary patch literal 1463 zcma*mdoWZ{90%~bu{BtaC}F8(lSr&bN>kI6G#R8}8#GCSkxFI6)HF>awim{rG!4pH zjAkS6&?xfAD}+?!6(J%k38{3?_x{s=+&gDK=lA=bb9VRctnlb5e@kk~i$$*>gIvO; zx5UuPR?>sJNMFZybM%Pu!!cpRB*(Ks@NX^Z<m3hTpgscqhgZ!hlBY<Y%7|ibALOY~ zW5^|YM^LAoJC8b@&&B!-7YWu&*^}r?N4!yI*Jr{fnS7Wdc0rzdlZ`s>_8FKTWPpA_ z@GV$)SRNKzI>8dvI>yCPSUM?%Wp%|e@;RTEJc2J$ywNYeABnmmQ3hXL3WSvbUa-pJ z5Uk$A4kG(&b_h_v+IbJwdSszr+t~-}<=Pmhc(7r>M@IHF7P&Hxr}dNib(kY#H}gE2 z60DIoRXLs@d2_G?d2>xU&S?qNMBb8h68$%>BF2nV<gLOv<gL*T=(kz=GhSzYuXfLB z<Zm5{V25ohkG#)2<4X8my8wPrNN1c+fSsc^U{~iw__00!c9(j>o_vv*oYN}_g?;h< zus_@#ehNMa2YhVdpsNY|ypIcqEIDvk{|_AD8uQ3`UzBth7nI=W*l#%2H37di^uqCH zEpS3w0ly{Y!O2JolwH09r%sFDci$W_Ie*$s41d_g!5OP?_>+GD&T9C<Ik_W@(+A-E z;C3<npP@L9O$d~75*MmOaiFTmK9)?>LTun_KO?9v)Pfq$`_)Lk#_AX9wfvqiQfq27 z!*z1yjMKSLYcLgRx5q=BstCv}%c01nn<a*N$#HOfbS%!_aOE201qMU?W4_S9NeKD7 z?BPaJ8)&F&1UGTCpb^_HmK<m_V+}VC8A9U@O=wcH3T`Q!gQn@DaO>SJXeMfe<{@QJ z;Fk?8ygJpW6|Cjoa`f8&$8vYdFSSsfjhnT&IO|Kksfrp)o=7RsPnE|~CLKy0b4@2_ nA?0rGMqbFED?55(M>>jhOF%MHXDhR9W&(2yQ)deSnJNAQHdoT( delta 178 zcmdna{f>D;n4~%b0|OHfa{@5~?~>#RAeygRN?`JGW;3tXV6K?(9WX7<d=^4~-Up^7 z9<K+}l9v~NX{o~#!L;<Ay#gR(WY(+$)3S5s3rtpLSz*P<KpX^VW(7J!fRQ2GH8=!F JOrFIm3jjUo9n=5- diff --git a/libs/tzdata/zoneinfo/leapseconds b/libs/tzdata/zoneinfo/leapseconds index ce150bfe0..6c715cb20 100644 --- a/libs/tzdata/zoneinfo/leapseconds +++ b/libs/tzdata/zoneinfo/leapseconds @@ -69,11 +69,11 @@ Leap 2016 Dec 31 23:59:60 + S # Any additional leap seconds will come after this. # This Expires line is commented out for now, # so that pre-2020a zic implementations do not reject this file. -#Expires 2024 Dec 28 00:00:00 +#Expires 2025 Jun 28 00:00:00 # POSIX timestamps for the data in this file: -#updated 1704708379 (2024-01-08 10:06:19 UTC) -#expires 1735344000 (2024-12-28 00:00:00 UTC) +#updated 1720104763 (2024-07-04 14:52:43 UTC) +#expires 1751068800 (2025-06-28 00:00:00 UTC) # Updated through IERS Bulletin C (https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat) -# File expires on 28 December 2024 +# File expires on 28 June 2025 diff --git a/libs/tzdata/zoneinfo/tzdata.zi b/libs/tzdata/zoneinfo/tzdata.zi index be1c40859..62e78bb82 100644 --- a/libs/tzdata/zoneinfo/tzdata.zi +++ b/libs/tzdata/zoneinfo/tzdata.zi @@ -1,4 +1,4 @@ -# version 2024a +# version 2024b # This zic input file is in the public domain. R d 1916 o - Jun 14 23s 1 S R d 1916 1919 - O Su>=1 23s 0 - @@ -1324,14 +1324,10 @@ R O 1961 1964 - May lastSu 1s 1 S R O 1962 1964 - S lastSu 1s 0 - R p 1916 o - Jun 17 23 1 S R p 1916 o - N 1 1 0 - -R p 1917 o - F 28 23s 1 S -R p 1917 1921 - O 14 23s 0 - -R p 1918 o - Mar 1 23s 1 S -R p 1919 o - F 28 23s 1 S -R p 1920 o - F 29 23s 1 S -R p 1921 o - F 28 23s 1 S +R p 1917 1921 - Mar 1 0 1 S +R p 1917 1921 - O 14 24 0 - R p 1924 o - Ap 16 23s 1 S -R p 1924 o - O 14 23s 0 - +R p 1924 o - O 4 23s 0 - R p 1926 o - Ap 17 23s 1 S R p 1926 1929 - O Sa>=1 23s 0 - R p 1927 o - Ap 9 23s 1 S @@ -1349,8 +1345,9 @@ R p 1938 o - Mar 26 23s 1 S R p 1939 o - Ap 15 23s 1 S R p 1939 o - N 18 23s 0 - R p 1940 o - F 24 23s 1 S -R p 1940 1941 - O 5 23s 0 - +R p 1940 o - O 7 23s 0 - R p 1941 o - Ap 5 23s 1 S +R p 1941 o - O 5 23s 0 - R p 1942 1945 - Mar Sa>=8 23s 1 S R p 1942 o - Ap 25 22s 2 M R p 1942 o - Au 15 22s 1 S @@ -1360,16 +1357,16 @@ R p 1943 1945 - Au Sa>=25 22s 1 S R p 1944 1945 - Ap Sa>=21 22s 2 M R p 1946 o - Ap Sa>=1 23s 1 S R p 1946 o - O Sa>=1 23s 0 - -R p 1947 1965 - Ap Su>=1 2s 1 S +R p 1947 1966 - Ap Su>=1 2s 1 S R p 1947 1965 - O Su>=1 2s 0 - -R p 1977 o - Mar 27 0s 1 S -R p 1977 o - S 25 0s 0 - -R p 1978 1979 - Ap Su>=1 0s 1 S -R p 1978 o - O 1 0s 0 - -R p 1979 1982 - S lastSu 1s 0 - -R p 1980 o - Mar lastSu 0s 1 S -R p 1981 1982 - Mar lastSu 1s 1 S -R p 1983 o - Mar lastSu 2s 1 S +R p 1976 o - S lastSu 1 0 - +R p 1977 o - Mar lastSu 0s 1 S +R p 1977 o - S lastSu 0s 0 - +R p 1978 1980 - Ap Su>=1 1s 1 S +R p 1978 o - O 1 1s 0 - +R p 1979 1980 - S lastSu 1s 0 - +R p 1981 1986 - Mar lastSu 0s 1 S +R p 1981 1985 - S lastSu 0s 0 - R z 1932 o - May 21 0s 1 S R z 1932 1939 - O Su>=1 0s 0 - R z 1933 1939 - Ap Su>=2 0s 1 S @@ -1728,7 +1725,7 @@ R Y 1972 2006 - O lastSu 2 0 S R Y 1987 2006 - Ap Su>=1 2 1 D R Yu 1965 o - Ap lastSu 0 2 DD R Yu 1965 o - O lastSu 2 0 S -R m 1931 o - May 1 23 1 D +R m 1931 o - April 30 0 1 D R m 1931 o - O 1 0 0 S R m 1939 o - F 5 0 1 D R m 1939 o - Jun 25 0 0 S @@ -2096,15 +2093,15 @@ Z Africa/Algiers 0:12:12 - LMT 1891 Mar 16 0 d WE%sT 1981 May 1 - CET Z Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u --1 - -01 1975 +-1 - %z 1975 0 - GMT Z Africa/Cairo 2:5:9 - LMT 1900 O 2 K EE%sT Z Africa/Casablanca -0:30:20 - LMT 1913 O 26 -0 M +00/+01 1984 Mar 16 -1 - +01 1986 -0 M +00/+01 2018 O 28 3 -1 M +01/+00 +0 M %z 1984 Mar 16 +1 - %z 1986 +0 M %z 2018 O 28 3 +1 M %z Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u 0 - WET 1918 May 6 23 0 1 WEST 1918 O 7 23 @@ -2115,9 +2112,9 @@ Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u 1 - CET 1986 1 E CE%sT Z Africa/El_Aaiun -0:52:48 - LMT 1934 --1 - -01 1976 Ap 14 -0 M +00/+01 2018 O 28 3 -1 M +01/+00 +-1 - %z 1976 Ap 14 +0 M %z 2018 O 28 3 +1 M %z Z Africa/Johannesburg 1:52 - LMT 1892 F 8 1:30 - SAST 1903 Mar 2 SA SAST @@ -2132,19 +2129,19 @@ Z Africa/Khartoum 2:10:8 - LMT 1931 Z Africa/Lagos 0:13:35 - LMT 1905 Jul 0 - GMT 1908 Jul 0:13:35 - LMT 1914 -0:30 - +0030 1919 S +0:30 - %z 1919 S 1 - WAT -Z Africa/Maputo 2:10:20 - LMT 1903 Mar +Z Africa/Maputo 2:10:18 - LMT 1909 2 - CAT Z Africa/Monrovia -0:43:8 - LMT 1882 -0:43:8 - MMT 1919 Mar -0:44:30 - MMT 1972 Ja 7 0 - GMT Z Africa/Nairobi 2:27:16 - LMT 1908 May -2:30 - +0230 1928 Jun 30 24 +2:30 - %z 1928 Jun 30 24 3 - EAT 1930 Ja 4 24 -2:30 - +0230 1936 D 31 24 -2:45 - +0245 1942 Jul 31 24 +2:30 - %z 1936 D 31 24 +2:45 - %z 1942 Jul 31 24 3 - EAT Z Africa/Ndjamena 1:0:12 - LMT 1912 1 - WAT 1979 O 14 @@ -2168,7 +2165,7 @@ Z Africa/Tunis 0:40:44 - LMT 1881 May 12 0:9:21 - PMT 1911 Mar 11 1 n CE%sT Z Africa/Windhoek 1:8:24 - LMT 1892 F 8 -1:30 - +0130 1903 Mar +1:30 - %z 1903 Mar 2 - SAST 1942 S 20 2 2 1 SAST 1943 Mar 21 2 2 - SAST 1990 Mar 21 @@ -2191,167 +2188,166 @@ Z America/Anchorage 14:0:24 - LMT 1867 O 19 14:31:37 -9 u Y%sT 1983 N 30 -9 u AK%sT Z America/Araguaina -3:12:48 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1995 S 14 --3 B -03/-02 2003 S 24 --3 - -03 2012 O 21 --3 B -03/-02 2013 S --3 - -03 +-3 B %z 1990 S 17 +-3 - %z 1995 S 14 +-3 B %z 2003 S 24 +-3 - %z 2012 O 21 +-3 B %z 2013 S +-3 - %z Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z Z America/Argentina/Catamarca -4:23:8 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/Cordoba -4:16:48 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z Z America/Argentina/Jujuy -4:21:12 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 Mar 4 --4 - -04 1990 O 28 --4 1 -03 1991 Mar 17 --4 - -04 1991 O 6 --3 1 -02 1992 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 Mar 4 +-4 - %z 1990 O 28 +-4 1 %z 1991 Mar 17 +-4 - %z 1991 O 6 +-3 1 %z 1992 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/La_Rioja -4:27:24 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar --4 - -04 1991 May 7 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar +-4 - %z 1991 May 7 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/Mendoza -4:35:16 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 Mar 4 --4 - -04 1990 O 15 --4 1 -03 1991 Mar --4 - -04 1991 O 15 --4 1 -03 1992 Mar --4 - -04 1992 O 18 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 23 --4 - -04 2004 S 26 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 Mar 4 +-4 - %z 1990 O 15 +-4 1 %z 1991 Mar +-4 - %z 1991 O 15 +-4 1 %z 1992 Mar +-4 - %z 1992 O 18 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 23 +-4 - %z 2004 S 26 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/Salta -4:21:40 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/San_Juan -4:34:4 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar --4 - -04 1991 May 7 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 31 --4 - -04 2004 Jul 25 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar +-4 - %z 1991 May 7 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 31 +-4 - %z 2004 Jul 25 +-3 A %z 2008 O 18 +-3 - %z Z America/Argentina/San_Luis -4:25:24 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 --3 1 -02 1990 Mar 14 --4 - -04 1990 O 15 --4 1 -03 1991 Mar --4 - -04 1991 Jun --3 - -03 1999 O 3 --4 1 -03 2000 Mar 3 --3 - -03 2004 May 31 --4 - -04 2004 Jul 25 --3 A -03/-02 2008 Ja 21 --4 Sa -04/-03 2009 O 11 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 +-3 1 %z 1990 Mar 14 +-4 - %z 1990 O 15 +-4 1 %z 1991 Mar +-4 - %z 1991 Jun +-3 - %z 1999 O 3 +-4 1 %z 2000 Mar 3 +-3 - %z 2004 May 31 +-4 - %z 2004 Jul 25 +-3 A %z 2008 Ja 21 +-4 Sa %z 2009 O 11 +-3 - %z Z America/Argentina/Tucuman -4:20:52 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 13 --3 A -03/-02 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 13 +-3 A %z Z America/Argentina/Ushuaia -4:33:12 - LMT 1894 O 31 -4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 30 --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 30 +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z Z America/Asuncion -3:50:40 - LMT 1890 -3:50:40 - AMT 1931 O 10 --4 - -04 1972 O --3 - -03 1974 Ap --4 y -04/-03 +-4 - %z 1972 O +-3 - %z 1974 Ap +-4 y %z Z America/Bahia -2:34:4 - LMT 1914 --3 B -03/-02 2003 S 24 --3 - -03 2011 O 16 --3 B -03/-02 2012 O 21 --3 - -03 +-3 B %z 2003 S 24 +-3 - %z 2011 O 16 +-3 B %z 2012 O 21 +-3 - %z Z America/Bahia_Banderas -7:1 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 +-7 - MST 1970 -7 m M%sT 2010 Ap 4 2 -6 m C%sT Z America/Barbados -3:58:29 - LMT 1911 Au 28 @@ -2359,18 +2355,18 @@ Z America/Barbados -3:58:29 - LMT 1911 Au 28 -4 BB AST/-0330 1945 -4 BB A%sT Z America/Belem -3:13:56 - LMT 1914 --3 B -03/-02 1988 S 12 --3 - -03 +-3 B %z 1988 S 12 +-3 - %z Z America/Belize -5:52:48 - LMT 1912 Ap -6 BZ %s Z America/Boa_Vista -4:2:40 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 1999 S 30 --4 B -04/-03 2000 O 15 --4 - -04 +-4 B %z 1988 S 12 +-4 - %z 1999 S 30 +-4 B %z 2000 O 15 +-4 - %z Z America/Bogota -4:56:16 - LMT 1884 Mar 13 -4:56:16 - BMT 1914 N 23 --5 CO -05/-04 +-5 CO %z Z America/Boise -7:44:49 - LMT 1883 N 18 20u -8 u P%sT 1923 May 13 2 -7 u M%sT 1974 @@ -2383,21 +2379,23 @@ Z America/Cambridge_Bay 0 - -00 1920 -6 - CST 2001 Ap 1 3 -7 C M%sT Z America/Campo_Grande -3:38:28 - LMT 1914 --4 B -04/-03 +-4 B %z Z America/Cancun -5:47:4 - LMT 1922 Ja 1 6u --6 - CST 1981 D 23 +-6 - CST 1981 D 26 2 +-5 - EST 1983 Ja 4 +-6 m C%sT 1997 O 26 2 -5 m E%sT 1998 Au 2 2 -6 m C%sT 2015 F 1 2 -5 - EST Z America/Caracas -4:27:44 - LMT 1890 -4:27:40 - CMT 1912 F 12 --4:30 - -0430 1965 --4 - -04 2007 D 9 3 --4:30 - -0430 2016 May 1 2:30 --4 - -04 +-4:30 - %z 1965 +-4 - %z 2007 D 9 3 +-4:30 - %z 2016 May 1 2:30 +-4 - %z Z America/Cayenne -3:29:20 - LMT 1911 Jul --4 - -04 1967 O --3 - -03 +-4 - %z 1967 O +-3 - %z Z America/Chicago -5:50:36 - LMT 1883 N 18 18u -6 u C%sT 1920 -6 Ch C%sT 1936 Mar 1 2 @@ -2407,7 +2405,7 @@ Z America/Chicago -5:50:36 - LMT 1883 N 18 18u -6 Ch C%sT 1967 -6 u C%sT Z America/Chihuahua -7:4:20 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1996 @@ -2416,7 +2414,7 @@ Z America/Chihuahua -7:4:20 - LMT 1922 Ja 1 7u -7 m M%sT 2022 O 30 2 -6 - CST Z America/Ciudad_Juarez -7:5:56 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1996 @@ -2430,12 +2428,12 @@ Z America/Costa_Rica -5:36:13 - LMT 1890 -5:36:13 - SJMT 1921 Ja 15 -6 CR C%sT Z America/Cuiaba -3:44:20 - LMT 1914 --4 B -04/-03 2003 S 24 --4 - -04 2004 O --4 B -04/-03 +-4 B %z 2003 S 24 +-4 - %z 2004 O +-4 B %z Z America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28 --3 - -03 1980 Ap 6 2 --3 E -03/-02 1996 +-3 - %z 1980 Ap 6 2 +-3 E %z 1996 0 - GMT Z America/Dawson -9:17:40 - LMT 1900 Au 20 -9 Y Y%sT 1965 @@ -2467,12 +2465,12 @@ Z America/Edmonton -7:33:52 - LMT 1906 S -7 Ed M%sT 1987 -7 C M%sT Z America/Eirunepe -4:39:28 - LMT 1914 --5 B -05/-04 1988 S 12 --5 - -05 1993 S 28 --5 B -05/-04 1994 S 22 --5 - -05 2008 Jun 24 --4 - -04 2013 N 10 --5 - -05 +-5 B %z 1988 S 12 +-5 - %z 1993 S 28 +-5 B %z 1994 S 22 +-5 - %z 2008 Jun 24 +-4 - %z 2013 N 10 +-5 - %z Z America/El_Salvador -5:56:48 - LMT 1921 -6 SV C%sT Z America/Fort_Nelson -8:10:47 - LMT 1884 @@ -2482,12 +2480,12 @@ Z America/Fort_Nelson -8:10:47 - LMT 1884 -8 C P%sT 2015 Mar 8 2 -7 - MST Z America/Fortaleza -2:34 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 22 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 +-3 B %z 1990 S 17 +-3 - %z 1999 S 30 +-3 B %z 2000 O 22 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z Z America/Glace_Bay -3:59:48 - LMT 1902 Jun 15 -4 C A%sT 1953 -4 H A%sT 1954 @@ -2514,12 +2512,12 @@ Z America/Guatemala -6:2:4 - LMT 1918 O 5 -6 GT C%sT Z America/Guayaquil -5:19:20 - LMT 1890 -5:14 - QMT 1931 --5 EC -05/-04 +-5 EC %z Z America/Guyana -3:52:39 - LMT 1911 Au --4 - -04 1915 Mar --3:45 - -0345 1975 Au --3 - -03 1992 Mar 29 1 --4 - -04 +-4 - %z 1915 Mar +-3:45 - %z 1975 Au +-3 - %z 1992 Mar 29 1 +-4 - %z Z America/Halifax -4:14:24 - LMT 1902 Jun 15 -4 H A%sT 1918 -4 C A%sT 1919 @@ -2531,12 +2529,11 @@ Z America/Havana -5:29:28 - LMT 1890 -5:29:36 - HMT 1925 Jul 19 12 -5 Q C%sT Z America/Hermosillo -7:23:52 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 +-7 - MST 1996 -7 m M%sT 1999 -7 - MST Z America/Indiana/Indianapolis -5:44:38 - LMT 1883 N 18 18u @@ -2644,23 +2641,23 @@ Z America/Kentucky/Monticello -5:39:24 - LMT 1883 N 18 18u Z America/La_Paz -4:32:36 - LMT 1890 -4:32:36 - CMT 1931 O 15 -4:32:36 1 BST 1932 Mar 21 --4 - -04 +-4 - %z Z America/Lima -5:8:12 - LMT 1890 -5:8:36 - LMT 1908 Jul 28 --5 PE -05/-04 +-5 PE %z Z America/Los_Angeles -7:52:58 - LMT 1883 N 18 20u -8 u P%sT 1946 -8 CA P%sT 1967 -8 u P%sT Z America/Maceio -2:22:52 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1995 O 13 --3 B -03/-02 1996 S 4 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 22 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 +-3 B %z 1990 S 17 +-3 - %z 1995 O 13 +-3 B %z 1996 S 4 +-3 - %z 1999 S 30 +-3 B %z 2000 O 22 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z Z America/Managua -5:45:8 - LMT 1890 -5:45:12 - MMT 1934 Jun 23 -6 - CST 1973 May @@ -2671,10 +2668,10 @@ Z America/Managua -5:45:8 - LMT 1890 -5 - EST 1997 -6 NI C%sT Z America/Manaus -4:0:4 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 1993 S 28 --4 B -04/-03 1994 S 22 --4 - -04 +-4 B %z 1988 S 12 +-4 - %z 1993 S 28 +-4 B %z 1994 S 22 +-4 - %z Z America/Martinique -4:4:20 - LMT 1890 -4:4:20 - FFMT 1911 May -4 - AST 1980 Ap 6 @@ -2686,12 +2683,11 @@ Z America/Matamoros -6:30 - LMT 1922 Ja 1 6u -6 m C%sT 2010 -6 u C%sT Z America/Mazatlan -7:5:40 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 +-7 - MST 1970 -7 m M%sT Z America/Menominee -5:50:27 - LMT 1885 S 18 12 -6 u C%sT 1946 @@ -2699,8 +2695,8 @@ Z America/Menominee -5:50:27 - LMT 1885 S 18 12 -5 - EST 1973 Ap 29 2 -6 u C%sT Z America/Merida -5:58:28 - LMT 1922 Ja 1 6u --6 - CST 1981 D 23 --5 - EST 1982 D 2 +-6 - CST 1981 D 26 2 +-5 - EST 1982 N 2 2 -6 m C%sT Z America/Metlakatla 15:13:42 - LMT 1867 O 19 15:44:55 -8:46:18 - LMT 1900 Au 20 12 @@ -2713,7 +2709,7 @@ Z America/Metlakatla 15:13:42 - LMT 1867 O 19 15:44:55 -8 - PST 2019 Ja 20 2 -9 u AK%sT Z America/Mexico_City -6:36:36 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 m C%sT 2001 S 30 2 @@ -2721,8 +2717,8 @@ Z America/Mexico_City -6:36:36 - LMT 1922 Ja 1 7u -6 m C%sT Z America/Miquelon -3:44:40 - LMT 1911 Jun 15 -4 - AST 1980 May --3 - -03 1987 --3 C -03/-02 +-3 - %z 1987 +-3 C %z Z America/Moncton -4:19:8 - LMT 1883 D 9 -5 - EST 1902 Jun 15 -4 C A%sT 1933 @@ -2733,20 +2729,23 @@ Z America/Moncton -4:19:8 - LMT 1883 D 9 -4 o A%sT 2007 -4 C A%sT Z America/Monterrey -6:41:16 - LMT 1922 Ja 1 6u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap -6 - CST 1988 -6 u C%sT 1989 -6 m C%sT Z America/Montevideo -3:44:51 - LMT 1908 Jun 10 -3:44:51 - MMT 1920 May --4 - -04 1923 O --3:30 U -0330/-03 1942 D 14 --3 U -03/-0230 1960 --3 U -03/-02 1968 --3 U -03/-0230 1970 --3 U -03/-02 1974 --3 U -03/-0130 1974 Mar 10 --3 U -03/-0230 1974 D 22 --3 U -03/-02 +-4 - %z 1923 O +-3:30 U %z 1942 D 14 +-3 U %z 1960 +-3 U %z 1968 +-3 U %z 1970 +-3 U %z 1974 +-3 U %z 1974 Mar 10 +-3 U %z 1974 D 22 +-3 U %z Z America/New_York -4:56:2 - LMT 1883 N 18 17u -5 u E%sT 1920 -5 NY E%sT 1942 @@ -2763,12 +2762,12 @@ Z America/Nome 12:58:22 - LMT 1867 O 19 13:29:35 -9 u Y%sT 1983 N 30 -9 u AK%sT Z America/Noronha -2:9:40 - LMT 1914 --2 B -02/-01 1990 S 17 --2 - -02 1999 S 30 --2 B -02/-01 2000 O 15 --2 - -02 2001 S 13 --2 B -02/-01 2002 O --2 - -02 +-2 B %z 1990 S 17 +-2 - %z 1999 S 30 +-2 B %z 2000 O 15 +-2 - %z 2001 S 13 +-2 B %z 2002 O +-2 - %z Z America/North_Dakota/Beulah -6:47:7 - LMT 1883 N 18 19u -7 u M%sT 2010 N 7 2 -6 u C%sT @@ -2779,12 +2778,12 @@ Z America/North_Dakota/New_Salem -6:45:39 - LMT 1883 N 18 19u -7 u M%sT 2003 O 26 2 -6 u C%sT Z America/Nuuk -3:26:56 - LMT 1916 Jul 28 --3 - -03 1980 Ap 6 2 --3 E -03/-02 2023 Mar 26 1u --2 - -02 2023 O 29 1u --2 E -02/-01 +-3 - %z 1980 Ap 6 2 +-3 E %z 2023 Mar 26 1u +-2 - %z 2023 O 29 1u +-2 E %z Z America/Ojinaga -6:57:40 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 +-7 - MST 1927 Jun 10 -6 - CST 1930 N 15 -7 m M%sT 1932 Ap -6 - CST 1996 @@ -2800,8 +2799,8 @@ Z America/Panama -5:18:8 - LMT 1890 Z America/Paramaribo -3:40:40 - LMT 1911 -3:40:52 - PMT 1935 -3:40:36 - PMT 1945 O --3:30 - -0330 1984 O --3 - -03 +-3:30 - %z 1984 O +-3 - %z Z America/Phoenix -7:28:18 - LMT 1883 N 18 19u -7 u M%sT 1944 Ja 1 0:1 -7 - MST 1944 Ap 1 0:1 @@ -2813,37 +2812,37 @@ Z America/Port-au-Prince -4:49:20 - LMT 1890 -4:49 - PPMT 1917 Ja 24 12 -5 HT E%sT Z America/Porto_Velho -4:15:36 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 +-4 B %z 1988 S 12 +-4 - %z Z America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12 -4 - AST 1942 May 3 -4 u A%sT 1946 -4 - AST Z America/Punta_Arenas -4:43:40 - LMT 1890 -4:42:45 - SMT 1910 Ja 10 --5 - -05 1916 Jul +-5 - %z 1916 Jul -4:42:45 - SMT 1918 S 10 --4 - -04 1919 Jul +-4 - %z 1919 Jul -4:42:45 - SMT 1927 S --5 x -05/-04 1932 S --4 - -04 1942 Jun --5 - -05 1942 Au --4 - -04 1946 Au 28 24 --5 1 -04 1947 Mar 31 24 --5 - -05 1947 May 21 23 --4 x -04/-03 2016 D 4 --3 - -03 +-5 x %z 1932 S +-4 - %z 1942 Jun +-5 - %z 1942 Au +-4 - %z 1946 Au 28 24 +-5 1 %z 1947 Mar 31 24 +-5 - %z 1947 May 21 23 +-4 x %z 2016 D 4 +-3 - %z Z America/Rankin_Inlet 0 - -00 1957 -6 Y C%sT 2000 O 29 2 -5 - EST 2001 Ap 1 3 -6 C C%sT Z America/Recife -2:19:36 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 15 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 +-3 B %z 1990 S 17 +-3 - %z 1999 S 30 +-3 B %z 2000 O 15 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z Z America/Regina -6:58:36 - LMT 1905 S -7 r M%sT 1960 Ap lastSu 2 -6 - CST @@ -2854,28 +2853,28 @@ Z America/Resolute 0 - -00 1947 Au 31 -5 - EST 2007 Mar 11 3 -6 C C%sT Z America/Rio_Branco -4:31:12 - LMT 1914 --5 B -05/-04 1988 S 12 --5 - -05 2008 Jun 24 --4 - -04 2013 N 10 --5 - -05 +-5 B %z 1988 S 12 +-5 - %z 2008 Jun 24 +-4 - %z 2013 N 10 +-5 - %z Z America/Santarem -3:38:48 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 2008 Jun 24 --3 - -03 +-4 B %z 1988 S 12 +-4 - %z 2008 Jun 24 +-3 - %z Z America/Santiago -4:42:45 - LMT 1890 -4:42:45 - SMT 1910 Ja 10 --5 - -05 1916 Jul +-5 - %z 1916 Jul -4:42:45 - SMT 1918 S 10 --4 - -04 1919 Jul +-4 - %z 1919 Jul -4:42:45 - SMT 1927 S --5 x -05/-04 1932 S --4 - -04 1942 Jun --5 - -05 1942 Au --4 - -04 1946 Jul 14 24 --4 1 -03 1946 Au 28 24 --5 1 -04 1947 Mar 31 24 --5 - -05 1947 May 21 23 --4 x -04/-03 +-5 x %z 1932 S +-4 - %z 1942 Jun +-5 - %z 1942 Au +-4 - %z 1946 Jul 14 24 +-4 1 %z 1946 Au 28 24 +-5 1 %z 1947 Mar 31 24 +-5 - %z 1947 May 21 23 +-4 x %z Z America/Santo_Domingo -4:39:36 - LMT 1890 -4:40 - SDMT 1933 Ap 1 12 -5 DO %s 1974 O 27 @@ -2883,14 +2882,14 @@ Z America/Santo_Domingo -4:39:36 - LMT 1890 -5 u E%sT 2000 D 3 1 -4 - AST Z America/Sao_Paulo -3:6:28 - LMT 1914 --3 B -03/-02 1963 O 23 --3 1 -02 1964 --3 B -03/-02 +-3 B %z 1963 O 23 +-3 1 %z 1964 +-3 B %z Z America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 --2 - -02 1980 Ap 6 2 --2 c -02/-01 1981 Mar 29 --1 E -01/+00 2024 Mar 31 --2 E -02/-01 +-2 - %z 1980 Ap 6 2 +-2 c %z 1981 Mar 29 +-1 E %z 2024 Mar 31 +-2 E %z Z America/Sitka 14:58:47 - LMT 1867 O 19 15:30 -9:1:13 - LMT 1900 Au 20 12 -8 - PST 1942 @@ -2918,15 +2917,21 @@ Z America/Thule -4:35:8 - LMT 1916 Jul 28 -4 Th A%sT Z America/Tijuana -7:48:4 - LMT 1922 Ja 1 7u -7 - MST 1924 --8 - PST 1927 Jun 10 23 +-8 - PST 1927 Jun 10 -7 - MST 1930 N 15 -8 - PST 1931 Ap -8 1 PDT 1931 S 30 -8 - PST 1942 Ap 24 -8 1 PWT 1945 Au 14 23u --8 1 PPT 1945 N 12 +-8 1 PPT 1945 N 15 -8 - PST 1948 Ap 5 -8 1 PDT 1949 Ja 14 +-8 - PST 1950 May +-8 1 PDT 1950 S 24 +-8 - PST 1951 Ap 29 2 +-8 1 PDT 1951 S 30 2 +-8 - PST 1952 Ap 27 2 +-8 1 PDT 1952 S 28 2 -8 - PST 1954 -8 CA P%sT 1961 -8 - PST 1976 @@ -2961,31 +2966,31 @@ Z America/Yakutat 14:41:5 - LMT 1867 O 19 15:12:18 -9 u Y%sT 1983 N 30 -9 u AK%sT Z Antarctica/Casey 0 - -00 1969 -8 - +08 2009 O 18 2 -11 - +11 2010 Mar 5 2 -8 - +08 2011 O 28 2 -11 - +11 2012 F 21 17u -8 - +08 2016 O 22 -11 - +11 2018 Mar 11 4 -8 - +08 2018 O 7 4 -11 - +11 2019 Mar 17 3 -8 - +08 2019 O 4 3 -11 - +11 2020 Mar 8 3 -8 - +08 2020 O 4 0:1 -11 - +11 2021 Mar 14 -8 - +08 2021 O 3 0:1 -11 - +11 2022 Mar 13 -8 - +08 2022 O 2 0:1 -11 - +11 2023 Mar 9 3 -8 - +08 +8 - %z 2009 O 18 2 +11 - %z 2010 Mar 5 2 +8 - %z 2011 O 28 2 +11 - %z 2012 F 21 17u +8 - %z 2016 O 22 +11 - %z 2018 Mar 11 4 +8 - %z 2018 O 7 4 +11 - %z 2019 Mar 17 3 +8 - %z 2019 O 4 3 +11 - %z 2020 Mar 8 3 +8 - %z 2020 O 4 0:1 +11 - %z 2021 Mar 14 +8 - %z 2021 O 3 0:1 +11 - %z 2022 Mar 13 +8 - %z 2022 O 2 0:1 +11 - %z 2023 Mar 9 3 +8 - %z Z Antarctica/Davis 0 - -00 1957 Ja 13 -7 - +07 1964 N +7 - %z 1964 N 0 - -00 1969 F -7 - +07 2009 O 18 2 -5 - +05 2010 Mar 10 20u -7 - +07 2011 O 28 2 -5 - +05 2012 F 21 20u -7 - +07 +7 - %z 2009 O 18 2 +5 - %z 2010 Mar 10 20u +7 - %z 2011 O 28 2 +5 - %z 2012 F 21 20u +7 - %z Z Antarctica/Macquarie 0 - -00 1899 N 10 - AEST 1916 O 1 2 10 1 AEDT 1917 F @@ -2996,151 +3001,146 @@ Z Antarctica/Macquarie 0 - -00 1899 N 10 1 AEDT 2011 10 AT AE%sT Z Antarctica/Mawson 0 - -00 1954 F 13 -6 - +06 2009 O 18 2 -5 - +05 +6 - %z 2009 O 18 2 +5 - %z Z Antarctica/Palmer 0 - -00 1965 --4 A -04/-03 1969 O 5 --3 A -03/-02 1982 May --4 x -04/-03 2016 D 4 --3 - -03 +-4 A %z 1969 O 5 +-3 A %z 1982 May +-4 x %z 2016 D 4 +-3 - %z Z Antarctica/Rothera 0 - -00 1976 D --3 - -03 +-3 - %z Z Antarctica/Troll 0 - -00 2005 F 12 0 Tr %s Z Antarctica/Vostok 0 - -00 1957 D 16 -7 - +07 1994 F +7 - %z 1994 F 0 - -00 1994 N -7 - +07 2023 D 18 2 -5 - +05 +7 - %z 2023 D 18 2 +5 - %z Z Asia/Almaty 5:7:48 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 2004 O 31 2s -6 - +06 2024 Mar -5 - +05 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1992 Ja 19 2s +6 R %z 2004 O 31 2s +6 - %z 2024 Mar +5 - %z Z Asia/Amman 2:23:44 - LMT 1931 2 J EE%sT 2022 O 28 0s -3 - +03 +3 - %z Z Asia/Anadyr 11:49:56 - LMT 1924 May 2 -12 - +12 1930 Jun 21 -13 R +13/+14 1982 Ap 1 0s -12 R +12/+13 1991 Mar 31 2s -11 R +11/+12 1992 Ja 19 2s -12 R +12/+13 2010 Mar 28 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 +12 - %z 1930 Jun 21 +13 R %z 1982 Ap 1 0s +12 R %z 1991 Mar 31 2s +11 R %z 1992 Ja 19 2s +12 R %z 2010 Mar 28 2s +11 R %z 2011 Mar 27 2s +12 - %z Z Asia/Aqtau 3:21:4 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1994 S 25 2s -4 R +04/+05 2004 O 31 2s -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 1994 S 25 2s +4 R %z 2004 O 31 2s +5 - %z Z Asia/Aqtobe 3:48:40 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2004 O 31 2s -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2004 O 31 2s +5 - %z Z Asia/Ashgabat 3:53:32 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 R +05/+06 1991 Mar 31 2 -4 R +04/+05 1992 Ja 19 2 -5 - +05 +4 - %z 1930 Jun 21 +5 R %z 1991 Mar 31 2 +4 R %z 1992 Ja 19 2 +5 - %z Z Asia/Atyrau 3:27:44 - LMT 1924 May 2 -3 - +03 1930 Jun 21 -5 - +05 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1999 Mar 28 2s -4 R +04/+05 2004 O 31 2s -5 - +05 +3 - %z 1930 Jun 21 +5 - %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 1999 Mar 28 2s +4 R %z 2004 O 31 2s +5 - %z Z Asia/Baghdad 2:57:40 - LMT 1890 2:57:36 - BMT 1918 -3 - +03 1982 May -3 IQ +03/+04 +3 - %z 1982 May +3 IQ %z Z Asia/Baku 3:19:24 - LMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1992 S lastSu 2s -4 - +04 1996 -4 E +04/+05 1997 -4 AZ +04/+05 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1992 S lastSu 2s +4 - %z 1996 +4 E %z 1997 +4 AZ %z Z Asia/Bangkok 6:42:4 - LMT 1880 6:42:4 - BMT 1920 Ap -7 - +07 +7 - %z Z Asia/Barnaul 5:35 - LMT 1919 D 10 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 1995 May 28 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 Mar 27 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 1995 May 28 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 Mar 27 2s +7 - %z Z Asia/Beirut 2:22 - LMT 1880 2 l EE%sT Z Asia/Bishkek 4:58:24 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1991 Au 31 2 -5 KG +05/+06 2005 Au 12 -6 - +06 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1991 Au 31 2 +5 KG %z 2005 Au 12 +6 - %z Z Asia/Chita 7:33:52 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2011 Mar 27 2s -10 - +10 2014 O 26 2s -8 - +08 2016 Mar 27 2 -9 - +09 -Z Asia/Choibalsan 7:38 - LMT 1905 Au -7 - +07 1978 -8 - +08 1983 Ap -9 X +09/+10 2008 Mar 31 -8 X +08/+09 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2011 Mar 27 2s +10 - %z 2014 O 26 2s +8 - %z 2016 Mar 27 2 +9 - %z Z Asia/Colombo 5:19:24 - LMT 1880 5:19:32 - MMT 1906 -5:30 - +0530 1942 Ja 5 -5:30 0:30 +06 1942 S -5:30 1 +0630 1945 O 16 2 -5:30 - +0530 1996 May 25 -6:30 - +0630 1996 O 26 0:30 -6 - +06 2006 Ap 15 0:30 -5:30 - +0530 +5:30 - %z 1942 Ja 5 +5:30 0:30 %z 1942 S +5:30 1 %z 1945 O 16 2 +5:30 - %z 1996 May 25 +6:30 - %z 1996 O 26 0:30 +6 - %z 2006 Ap 15 0:30 +5:30 - %z Z Asia/Damascus 2:25:12 - LMT 1920 2 S EE%sT 2022 O 28 -3 - +03 +3 - %z Z Asia/Dhaka 6:1:40 - LMT 1890 5:53:20 - HMT 1941 O -6:30 - +0630 1942 May 15 -5:30 - +0530 1942 S -6:30 - +0630 1951 S 30 -6 - +06 2009 -6 BD +06/+07 -Z Asia/Dili 8:22:20 - LMT 1912 -8 - +08 1942 F 21 23 -9 - +09 1976 May 3 -8 - +08 2000 S 17 -9 - +09 +6:30 - %z 1942 May 15 +5:30 - %z 1942 S +6:30 - %z 1951 S 30 +6 - %z 2009 +6 BD %z +Z Asia/Dili 8:22:20 - LMT 1911 D 31 16u +8 - %z 1942 F 21 23 +9 - %z 1976 May 3 +8 - %z 2000 S 17 +9 - %z Z Asia/Dubai 3:41:12 - LMT 1920 -4 - +04 +4 - %z Z Asia/Dushanbe 4:35:12 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 1 +06 1991 S 9 2s -5 - +05 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 1 %z 1991 S 9 2s +5 - %z Z Asia/Famagusta 2:15:48 - LMT 1921 N 14 2 CY EE%sT 1998 S 2 E EE%sT 2016 S 8 -3 - +03 2017 O 29 1u +3 - %z 2017 O 29 1u 2 E EE%sT Z Asia/Gaza 2:17:52 - LMT 1900 O 2 Z EET/EEST 1948 May 15 @@ -3162,14 +3162,14 @@ Z Asia/Hebron 2:20:23 - LMT 1900 O 2 P EE%sT Z Asia/Ho_Chi_Minh 7:6:30 - LMT 1906 Jul 7:6:30 - PLMT 1911 May -7 - +07 1942 D 31 23 -8 - +08 1945 Mar 14 23 -9 - +09 1945 S 1 24 -7 - +07 1947 Ap -8 - +08 1955 Jul 1 1 -7 - +07 1959 D 31 23 -8 - +08 1975 Jun 13 -7 - +07 +7 - %z 1942 D 31 23 +8 - %z 1945 Mar 14 23 +9 - %z 1945 S 1 24 +7 - %z 1947 Ap +8 - %z 1955 Jul 1 1 +7 - %z 1959 D 31 23 +8 - %z 1975 Jun 13 +7 - %z Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 29 17u 8 - HKT 1941 Jun 15 3 8 1 HKST 1941 O 1 4 @@ -3177,96 +3177,96 @@ Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 29 17u 9 - JST 1945 N 18 2 8 HK HK%sT Z Asia/Hovd 6:6:36 - LMT 1905 Au -6 - +06 1978 -7 X +07/+08 +6 - %z 1978 +7 X %z Z Asia/Irkutsk 6:57:5 - LMT 1880 6:57:5 - IMT 1920 Ja 25 -7 - +07 1930 Jun 21 -8 R +08/+09 1991 Mar 31 2s -7 R +07/+08 1992 Ja 19 2s -8 R +08/+09 2011 Mar 27 2s -9 - +09 2014 O 26 2s -8 - +08 +7 - %z 1930 Jun 21 +8 R %z 1991 Mar 31 2s +7 R %z 1992 Ja 19 2s +8 R %z 2011 Mar 27 2s +9 - %z 2014 O 26 2s +8 - %z Z Asia/Jakarta 7:7:12 - LMT 1867 Au 10 7:7:12 - BMT 1923 D 31 16:40u -7:20 - +0720 1932 N -7:30 - +0730 1942 Mar 23 -9 - +09 1945 S 23 -7:30 - +0730 1948 May -8 - +08 1950 May -7:30 - +0730 1964 +7:20 - %z 1932 N +7:30 - %z 1942 Mar 23 +9 - %z 1945 S 23 +7:30 - %z 1948 May +8 - %z 1950 May +7:30 - %z 1964 7 - WIB Z Asia/Jayapura 9:22:48 - LMT 1932 N -9 - +09 1944 S -9:30 - +0930 1964 +9 - %z 1944 S +9:30 - %z 1964 9 - WIT Z Asia/Jerusalem 2:20:54 - LMT 1880 2:20:40 - JMT 1918 2 Z I%sT Z Asia/Kabul 4:36:48 - LMT 1890 -4 - +04 1945 -4:30 - +0430 +4 - %z 1945 +4:30 - %z Z Asia/Kamchatka 10:34:36 - LMT 1922 N 10 -11 - +11 1930 Jun 21 -12 R +12/+13 1991 Mar 31 2s -11 R +11/+12 1992 Ja 19 2s -12 R +12/+13 2010 Mar 28 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 +11 - %z 1930 Jun 21 +12 R %z 1991 Mar 31 2s +11 R %z 1992 Ja 19 2s +12 R %z 2010 Mar 28 2s +11 R %z 2011 Mar 27 2s +12 - %z Z Asia/Karachi 4:28:12 - LMT 1907 -5:30 - +0530 1942 S -5:30 1 +0630 1945 O 15 -5:30 - +0530 1951 S 30 -5 - +05 1971 Mar 26 +5:30 - %z 1942 S +5:30 1 %z 1945 O 15 +5:30 - %z 1951 S 30 +5 - %z 1971 Mar 26 5 PK PK%sT Z Asia/Kathmandu 5:41:16 - LMT 1920 -5:30 - +0530 1986 -5:45 - +0545 +5:30 - %z 1986 +5:45 - %z Z Asia/Khandyga 9:2:13 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2004 -10 R +10/+11 2011 Mar 27 2s -11 - +11 2011 S 13 0s -10 - +10 2014 O 26 2s -9 - +09 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2004 +10 R %z 2011 Mar 27 2s +11 - %z 2011 S 13 0s +10 - %z 2014 O 26 2s +9 - %z Z Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 5:53:20 - HMT 1870 5:21:10 - MMT 1906 5:30 - IST 1941 O -5:30 1 +0630 1942 May 15 +5:30 1 %z 1942 May 15 5:30 - IST 1942 S -5:30 1 +0630 1945 O 15 +5:30 1 %z 1945 O 15 5:30 - IST Z Asia/Krasnoyarsk 6:11:26 - LMT 1920 Ja 6 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2011 Mar 27 2s -8 - +08 2014 O 26 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2011 Mar 27 2s +8 - %z 2014 O 26 2s +7 - %z Z Asia/Kuching 7:21:20 - LMT 1926 Mar -7:30 - +0730 1933 -8 NB +08/+0820 1942 F 16 -9 - +09 1945 S 12 -8 - +08 +7:30 - %z 1933 +8 NB %z 1942 F 16 +9 - %z 1945 S 12 +8 - %z Z Asia/Macau 7:34:10 - LMT 1904 O 30 8 - CST 1941 D 21 23 -9 _ +09/+10 1945 S 30 24 +9 _ %z 1945 S 30 24 8 _ C%sT Z Asia/Magadan 10:3:12 - LMT 1924 May 2 -10 - +10 1930 Jun 21 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2014 O 26 2s -10 - +10 2016 Ap 24 2s -11 - +11 +10 - %z 1930 Jun 21 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2014 O 26 2s +10 - %z 2016 Ap 24 2s +11 - %z Z Asia/Makassar 7:57:36 - LMT 1920 7:57:36 - MMT 1932 N -8 - +08 1942 F 9 -9 - +09 1945 S 23 +8 - %z 1942 F 9 +9 - %z 1945 S 23 8 - WITA Z Asia/Manila -15:56 - LMT 1844 D 31 8:4 - LMT 1899 May 11 @@ -3277,45 +3277,45 @@ Z Asia/Nicosia 2:13:28 - LMT 1921 N 14 2 CY EE%sT 1998 S 2 E EE%sT Z Asia/Novokuznetsk 5:48:48 - LMT 1924 May -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2010 Mar 28 2s -6 R +06/+07 2011 Mar 27 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2010 Mar 28 2s +6 R %z 2011 Mar 27 2s +7 - %z Z Asia/Novosibirsk 5:31:40 - LMT 1919 D 14 6 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 1993 May 23 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 Jul 24 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 1993 May 23 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 Jul 24 2s +7 - %z Z Asia/Omsk 4:53:30 - LMT 1919 N 14 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1992 Ja 19 2s +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z Z Asia/Oral 3:25:24 - LMT 1924 May 2 -3 - +03 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1989 Mar 26 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1992 Mar 29 2s -4 R +04/+05 2004 O 31 2s -5 - +05 +3 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1989 Mar 26 2s +4 R %z 1992 Ja 19 2s +5 R %z 1992 Mar 29 2s +4 R %z 2004 O 31 2s +5 - %z Z Asia/Pontianak 7:17:20 - LMT 1908 May 7:17:20 - PMT 1932 N -7:30 - +0730 1942 Ja 29 -9 - +09 1945 S 23 -7:30 - +0730 1948 May -8 - +08 1950 May -7:30 - +0730 1964 +7:30 - %z 1942 Ja 29 +9 - %z 1945 S 23 +7:30 - %z 1948 May +8 - %z 1950 May +7:30 - %z 1964 8 - WITA 1988 7 - WIB Z Asia/Pyongyang 8:23 - LMT 1908 Ap @@ -3325,48 +3325,48 @@ Z Asia/Pyongyang 8:23 - LMT 1908 Ap 8:30 - KST 2018 May 4 23:30 9 - KST Z Asia/Qatar 3:26:8 - LMT 1920 -4 - +04 1972 Jun -3 - +03 +4 - %z 1972 Jun +3 - %z Z Asia/Qostanay 4:14:28 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2004 O 31 2s -6 - +06 2024 Mar -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2004 O 31 2s +6 - %z 2024 Mar +5 - %z Z Asia/Qyzylorda 4:21:52 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1991 S 29 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 1992 Mar 29 2s -5 R +05/+06 2004 O 31 2s -6 - +06 2018 D 21 -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1991 S 29 2s +5 R %z 1992 Ja 19 2s +6 R %z 1992 Mar 29 2s +5 R %z 2004 O 31 2s +6 - %z 2018 D 21 +5 - %z Z Asia/Riyadh 3:6:52 - LMT 1947 Mar 14 -3 - +03 +3 - %z Z Asia/Sakhalin 9:30:48 - LMT 1905 Au 23 -9 - +09 1945 Au 25 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 1997 Mar lastSu 2s -10 R +10/+11 2011 Mar 27 2s -11 - +11 2014 O 26 2s -10 - +10 2016 Mar 27 2s -11 - +11 +9 - %z 1945 Au 25 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 1997 Mar lastSu 2s +10 R %z 2011 Mar 27 2s +11 - %z 2014 O 26 2s +10 - %z 2016 Mar 27 2s +11 - %z Z Asia/Samarkand 4:27:53 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1992 -5 - +05 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1992 +5 - %z Z Asia/Seoul 8:27:52 - LMT 1908 Ap 8:30 - KST 1912 9 - JST 1945 S 8 @@ -3378,161 +3378,147 @@ Z Asia/Shanghai 8:5:43 - LMT 1901 8 CN C%sT Z Asia/Singapore 6:55:25 - LMT 1901 6:55:25 - SMT 1905 Jun -7 - +07 1933 -7 0:20 +0720 1936 -7:20 - +0720 1941 S -7:30 - +0730 1942 F 16 -9 - +09 1945 S 12 -7:30 - +0730 1981 D 31 16u -8 - +08 +7 - %z 1933 +7 0:20 %z 1936 +7:20 - %z 1941 S +7:30 - %z 1942 F 16 +9 - %z 1945 S 12 +7:30 - %z 1981 D 31 16u +8 - %z Z Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2 -10 - +10 1930 Jun 21 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2014 O 26 2s -11 - +11 +10 - %z 1930 Jun 21 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2014 O 26 2s +11 - %z Z Asia/Taipei 8:6 - LMT 1896 8 - CST 1937 O 9 - JST 1945 S 21 1 8 f C%sT Z Asia/Tashkent 4:37:11 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2 -5 R +05/+06 1992 -5 - +05 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2 +5 R %z 1992 +5 - %z Z Asia/Tbilisi 2:59:11 - LMT 1880 2:59:11 - TBMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1992 -3 e +03/+04 1994 S lastSu -4 e +04/+05 1996 O lastSu -4 1 +05 1997 Mar lastSu -4 e +04/+05 2004 Jun 27 -3 R +03/+04 2005 Mar lastSu 2 -4 - +04 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1992 +3 e %z 1994 S lastSu +4 e %z 1996 O lastSu +4 1 %z 1997 Mar lastSu +4 e %z 2004 Jun 27 +3 R %z 2005 Mar lastSu 2 +4 - %z Z Asia/Tehran 3:25:44 - LMT 1916 3:25:44 - TMT 1935 Jun 13 -3:30 i +0330/+0430 1977 O 20 24 -4 i +04/+05 1979 -3:30 i +0330/+0430 +3:30 i %z 1977 O 20 24 +4 i %z 1979 +3:30 i %z Z Asia/Thimphu 5:58:36 - LMT 1947 Au 15 -5:30 - +0530 1987 O -6 - +06 +5:30 - %z 1987 O +6 - %z Z Asia/Tokyo 9:18:59 - LMT 1887 D 31 15u 9 JP J%sT Z Asia/Tomsk 5:39:51 - LMT 1919 D 22 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2002 May 1 3 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 May 29 2s -7 - +07 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2002 May 1 3 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 May 29 2s +7 - %z Z Asia/Ulaanbaatar 7:7:32 - LMT 1905 Au -7 - +07 1978 -8 X +08/+09 +7 - %z 1978 +8 X %z Z Asia/Urumqi 5:50:20 - LMT 1928 -6 - +06 +6 - %z Z Asia/Ust-Nera 9:32:54 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1981 Ap -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2011 S 13 0s -11 - +11 2014 O 26 2s -10 - +10 +8 - %z 1930 Jun 21 +9 R %z 1981 Ap +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2011 S 13 0s +11 - %z 2014 O 26 2s +10 - %z Z Asia/Vladivostok 8:47:31 - LMT 1922 N 15 -9 - +09 1930 Jun 21 -10 R +10/+11 1991 Mar 31 2s -9 R +09/+10 1992 Ja 19 2s -10 R +10/+11 2011 Mar 27 2s -11 - +11 2014 O 26 2s -10 - +10 +9 - %z 1930 Jun 21 +10 R %z 1991 Mar 31 2s +9 R %z 1992 Ja 19 2s +10 R %z 2011 Mar 27 2s +11 - %z 2014 O 26 2s +10 - %z Z Asia/Yakutsk 8:38:58 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2011 Mar 27 2s -10 - +10 2014 O 26 2s -9 - +09 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2011 Mar 27 2s +10 - %z 2014 O 26 2s +9 - %z Z Asia/Yangon 6:24:47 - LMT 1880 6:24:47 - RMT 1920 -6:30 - +0630 1942 May -9 - +09 1945 May 3 -6:30 - +0630 +6:30 - %z 1942 May +9 - %z 1945 May 3 +6:30 - %z Z Asia/Yekaterinburg 4:2:33 - LMT 1916 Jul 3 3:45:5 - PMT 1919 Jul 15 4 -4 - +04 1930 Jun 21 -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2011 Mar 27 2s -6 - +06 2014 O 26 2s -5 - +05 +4 - %z 1930 Jun 21 +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2011 Mar 27 2s +6 - %z 2014 O 26 2s +5 - %z Z Asia/Yerevan 2:58 - LMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1995 S 24 2s -4 - +04 1997 -4 R +04/+05 2011 -4 AM +04/+05 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1995 S 24 2s +4 - %z 1997 +4 R %z 2011 +4 AM %z Z Atlantic/Azores -1:42:40 - LMT 1884 -1:54:32 - HMT 1912 Ja 1 2u --2 p -02/-01 1942 Ap 25 22s --2 p +00 1942 Au 15 22s --2 p -02/-01 1943 Ap 17 22s --2 p +00 1943 Au 28 22s --2 p -02/-01 1944 Ap 22 22s --2 p +00 1944 Au 26 22s --2 p -02/-01 1945 Ap 21 22s --2 p +00 1945 Au 25 22s --2 p -02/-01 1966 Ap 3 2 --1 p -01/+00 1983 S 25 1s --1 W- -01/+00 1992 S 27 1s -0 E WE%sT 1993 Mar 28 1u --1 E -01/+00 +-2 p %z 1966 O 2 2s +-1 - %z 1982 Mar 28 0s +-1 p %z 1986 +-1 E %z 1992 D 27 1s +0 E WE%sT 1993 Jun 17 1u +-1 E %z Z Atlantic/Bermuda -4:19:18 - LMT 1890 -4:19:18 Be BMT/BST 1930 Ja 1 2 -4 Be A%sT 1974 Ap 28 2 -4 C A%sT 1976 -4 u A%sT Z Atlantic/Canary -1:1:36 - LMT 1922 Mar --1 - -01 1946 S 30 1 +-1 - %z 1946 S 30 1 0 - WET 1980 Ap 6 0s 0 1 WEST 1980 S 28 1u 0 E WE%sT Z Atlantic/Cape_Verde -1:34:4 - LMT 1912 Ja 1 2u --2 - -02 1942 S --2 1 -01 1945 O 15 --2 - -02 1975 N 25 2 --1 - -01 +-2 - %z 1942 S +-2 1 %z 1945 O 15 +-2 - %z 1975 N 25 2 +-1 - %z Z Atlantic/Faroe -0:27:4 - LMT 1908 Ja 11 0 - WET 1981 0 E WE%sT Z Atlantic/Madeira -1:7:36 - LMT 1884 -1:7:36 - FMT 1912 Ja 1 1u --1 p -01/+00 1942 Ap 25 22s --1 p +01 1942 Au 15 22s --1 p -01/+00 1943 Ap 17 22s --1 p +01 1943 Au 28 22s --1 p -01/+00 1944 Ap 22 22s --1 p +01 1944 Au 26 22s --1 p -01/+00 1945 Ap 21 22s --1 p +01 1945 Au 25 22s --1 p -01/+00 1966 Ap 3 2 -0 p WE%sT 1983 S 25 1s +-1 p %z 1966 O 2 2s +0 - WET 1982 Ap 4 +0 p WE%sT 1986 Jul 31 0 E WE%sT Z Atlantic/South_Georgia -2:26:8 - LMT 1890 --2 - -02 +-2 - %z Z Atlantic/Stanley -3:51:24 - LMT 1890 -3:51:24 - SMT 1912 Mar 12 --4 FK -04/-03 1983 May --3 FK -03/-02 1985 S 15 --4 FK -04/-03 2010 S 5 2 --3 - -03 +-4 FK %z 1983 May +-3 FK %z 1985 S 15 +-4 FK %z 2010 S 5 2 +-3 - %z Z Australia/Adelaide 9:14:20 - LMT 1895 F 9 - ACST 1899 May 9:30 AU AC%sT 1971 @@ -3550,8 +3536,8 @@ Z Australia/Darwin 8:43:20 - LMT 1895 F 9 - ACST 1899 May 9:30 AU AC%sT Z Australia/Eucla 8:35:28 - LMT 1895 D -8:45 AU +0845/+0945 1943 Jul -8:45 AW +0845/+0945 +8:45 AU %z 1943 Jul +8:45 AW %z Z Australia/Hobart 9:49:16 - LMT 1895 S 10 AT AE%sT 1919 O 24 10 AU AE%sT 1967 @@ -3562,8 +3548,8 @@ Z Australia/Lindeman 9:55:56 - LMT 1895 10 Ho AE%sT Z Australia/Lord_Howe 10:36:20 - LMT 1895 F 10 - AEST 1981 Mar -10:30 LH +1030/+1130 1985 Jul -10:30 LH +1030/+11 +10:30 LH %z 1985 Jul +10:30 LH %z Z Australia/Melbourne 9:39:52 - LMT 1895 F 10 AU AE%sT 1971 10 AV AE%sT @@ -3573,52 +3559,47 @@ Z Australia/Perth 7:43:24 - LMT 1895 D Z Australia/Sydney 10:4:52 - LMT 1895 F 10 AU AE%sT 1971 10 AN AE%sT -Z CET 1 c CE%sT -Z CST6CDT -6 u C%sT -Z EET 2 E EE%sT -Z EST -5 - EST -Z EST5EDT -5 u E%sT Z Etc/GMT 0 - GMT -Z Etc/GMT+1 -1 - -01 -Z Etc/GMT+10 -10 - -10 -Z Etc/GMT+11 -11 - -11 -Z Etc/GMT+12 -12 - -12 -Z Etc/GMT+2 -2 - -02 -Z Etc/GMT+3 -3 - -03 -Z Etc/GMT+4 -4 - -04 -Z Etc/GMT+5 -5 - -05 -Z Etc/GMT+6 -6 - -06 -Z Etc/GMT+7 -7 - -07 -Z Etc/GMT+8 -8 - -08 -Z Etc/GMT+9 -9 - -09 -Z Etc/GMT-1 1 - +01 -Z Etc/GMT-10 10 - +10 -Z Etc/GMT-11 11 - +11 -Z Etc/GMT-12 12 - +12 -Z Etc/GMT-13 13 - +13 -Z Etc/GMT-14 14 - +14 -Z Etc/GMT-2 2 - +02 -Z Etc/GMT-3 3 - +03 -Z Etc/GMT-4 4 - +04 -Z Etc/GMT-5 5 - +05 -Z Etc/GMT-6 6 - +06 -Z Etc/GMT-7 7 - +07 -Z Etc/GMT-8 8 - +08 -Z Etc/GMT-9 9 - +09 +Z Etc/GMT+1 -1 - %z +Z Etc/GMT+10 -10 - %z +Z Etc/GMT+11 -11 - %z +Z Etc/GMT+12 -12 - %z +Z Etc/GMT+2 -2 - %z +Z Etc/GMT+3 -3 - %z +Z Etc/GMT+4 -4 - %z +Z Etc/GMT+5 -5 - %z +Z Etc/GMT+6 -6 - %z +Z Etc/GMT+7 -7 - %z +Z Etc/GMT+8 -8 - %z +Z Etc/GMT+9 -9 - %z +Z Etc/GMT-1 1 - %z +Z Etc/GMT-10 10 - %z +Z Etc/GMT-11 11 - %z +Z Etc/GMT-12 12 - %z +Z Etc/GMT-13 13 - %z +Z Etc/GMT-14 14 - %z +Z Etc/GMT-2 2 - %z +Z Etc/GMT-3 3 - %z +Z Etc/GMT-4 4 - %z +Z Etc/GMT-5 5 - %z +Z Etc/GMT-6 6 - %z +Z Etc/GMT-7 7 - %z +Z Etc/GMT-8 8 - %z +Z Etc/GMT-9 9 - %z Z Etc/UTC 0 - UTC Z Europe/Andorra 0:6:4 - LMT 1901 0 - WET 1946 S 30 1 - CET 1985 Mar 31 2 1 E CE%sT Z Europe/Astrakhan 3:12:12 - LMT 1924 May -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 Mar 27 2s -4 - +04 +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +4 - %z 1992 Mar 29 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 Mar 27 2s +4 - %z Z Europe/Athens 1:34:52 - LMT 1895 S 14 1:34:52 - AMT 1916 Jul 28 0:1 2 g EE%sT 1941 Ap 30 @@ -3691,7 +3672,7 @@ Z Europe/Helsinki 1:39:49 - LMT 1878 May 31 Z Europe/Istanbul 1:55:52 - LMT 1880 1:56:56 - IMT 1910 O 2 T EE%sT 1978 Jun 29 -3 T +03/+04 1984 N 1 2 +3 T %z 1984 N 1 2 2 T EE%sT 2007 2 E EE%sT 2011 Mar 27 1u 2 - EET 2011 Mar 28 1u @@ -3700,19 +3681,19 @@ Z Europe/Istanbul 1:55:52 - LMT 1880 2 E EE%sT 2015 O 25 1u 2 1 EEST 2015 N 8 1u 2 E EE%sT 2016 S 7 -3 - +03 +3 - %z Z Europe/Kaliningrad 1:22 - LMT 1893 Ap 1 c CE%sT 1945 Ap 10 2 O EE%sT 1946 Ap 7 3 R MSK/MSD 1989 Mar 26 2s 2 R EE%sT 2011 Mar 27 2s -3 - +03 2014 O 26 2s +3 - %z 2014 O 26 2s 2 - EET Z Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s 3 R MSK/MSD 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s +4 - %z 1992 Mar 29 2s 3 R MSK/MSD 2011 Mar 27 2s 4 - MSK 2014 O 26 2s 3 - MSK @@ -3727,10 +3708,10 @@ Z Europe/Kyiv 2:2:4 - LMT 1880 2 E EE%sT Z Europe/Lisbon -0:36:45 - LMT 1884 -0:36:45 - LMT 1912 Ja 1 0u -0 p WE%sT 1966 Ap 3 2 +0 p WE%sT 1966 O 2 2s 1 - CET 1976 S 26 1 -0 p WE%sT 1983 S 25 1s -0 W- WE%sT 1992 S 27 1s +0 p WE%sT 1986 +0 E WE%sT 1992 S 27 1u 1 E CE%sT 1996 Mar 31 1u 0 E WE%sT Z Europe/London -0:1:15 - LMT 1847 D @@ -3754,7 +3735,7 @@ Z Europe/Minsk 1:50:16 - LMT 1880 3 R MSK/MSD 1990 3 - MSK 1991 Mar 31 2s 2 R EE%sT 2011 Mar 27 2s -3 - +03 +3 - %z Z Europe/Moscow 2:30:17 - LMT 1880 2:30:17 - MMT 1916 Jul 3 2:31:19 R %s 1919 Jul 1 0u @@ -3802,24 +3783,24 @@ Z Europe/Rome 0:49:56 - LMT 1866 D 12 1 I CE%sT 1980 1 E CE%sT Z Europe/Samara 3:20:20 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 - +04 1935 Ja 27 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -2 R +02/+03 1991 S 29 2s -3 - +03 1991 O 20 3 -4 R +04/+05 2010 Mar 28 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 +3 - %z 1930 Jun 21 +4 - %z 1935 Ja 27 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +2 R %z 1991 S 29 2s +3 - %z 1991 O 20 3 +4 R %z 2010 Mar 28 2s +3 R %z 2011 Mar 27 2s +4 - %z Z Europe/Saratov 3:4:18 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1988 Mar 27 2s -3 R +03/+04 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 D 4 2s -4 - +04 +3 - %z 1930 Jun 21 +4 R %z 1988 Mar 27 2s +3 R %z 1991 Mar 31 2s +4 - %z 1992 Mar 29 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 D 4 2s +4 - %z Z Europe/Simferopol 2:16:24 - LMT 1880 2:16 - SMT 1924 May 2 2 - EET 1930 Jun 21 @@ -3863,14 +3844,14 @@ Z Europe/Tirane 1:19:20 - LMT 1914 1 q CE%sT 1984 Jul 1 E CE%sT Z Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -2 R +02/+03 1992 Ja 19 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 Mar 27 2s -4 - +04 +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +2 R %z 1992 Ja 19 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 Mar 27 2s +4 - %z Z Europe/Vienna 1:5:21 - LMT 1893 Ap 1 c CE%sT 1920 1 a CE%sT 1940 Ap 1 2s @@ -3895,15 +3876,15 @@ Z Europe/Vilnius 1:41:16 - LMT 1880 2 - EET 2003 2 E EE%sT Z Europe/Volgograd 2:57:40 - LMT 1920 Ja 3 -3 - +03 1930 Jun 21 -4 - +04 1961 N 11 -4 R +04/+05 1988 Mar 27 2s +3 - %z 1930 Jun 21 +4 - %z 1961 N 11 +4 R %z 1988 Mar 27 2s 3 R MSK/MSD 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s +4 - %z 1992 Mar 29 2s 3 R MSK/MSD 2011 Mar 27 2s 4 - MSK 2014 O 26 2s 3 - MSK 2018 O 28 2s -4 - +04 2020 D 27 2s +4 - %z 2020 D 27 2s 3 - MSK Z Europe/Warsaw 1:24 - LMT 1880 1:24 - WMT 1915 Au 5 @@ -3919,58 +3900,53 @@ Z Europe/Zurich 0:34:8 - LMT 1853 Jul 16 1 CH CE%sT 1981 1 E CE%sT Z Factory 0 - -00 -Z HST -10 - HST Z Indian/Chagos 4:49:40 - LMT 1907 -5 - +05 1996 -6 - +06 +5 - %z 1996 +6 - %z Z Indian/Maldives 4:54 - LMT 1880 4:54 - MMT 1960 -5 - +05 +5 - %z Z Indian/Mauritius 3:50 - LMT 1907 -4 MU +04/+05 -Z MET 1 c ME%sT -Z MST -7 - MST -Z MST7MDT -7 u M%sT -Z PST8PDT -8 u P%sT +4 MU %z Z Pacific/Apia 12:33:4 - LMT 1892 Jul 5 -11:26:56 - LMT 1911 --11:30 - -1130 1950 --11 WS -11/-10 2011 D 29 24 -13 WS +13/+14 +-11:30 - %z 1950 +-11 WS %z 2011 D 29 24 +13 WS %z Z Pacific/Auckland 11:39:4 - LMT 1868 N 2 11:30 NZ NZ%sT 1946 12 NZ NZ%sT Z Pacific/Bougainville 10:22:16 - LMT 1880 9:48:32 - PMMT 1895 -10 - +10 1942 Jul -9 - +09 1945 Au 21 -10 - +10 2014 D 28 2 -11 - +11 +10 - %z 1942 Jul +9 - %z 1945 Au 21 +10 - %z 2014 D 28 2 +11 - %z Z Pacific/Chatham 12:13:48 - LMT 1868 N 2 -12:15 - +1215 1946 -12:45 k +1245/+1345 +12:15 - %z 1946 +12:45 k %z Z Pacific/Easter -7:17:28 - LMT 1890 -7:17:28 - EMT 1932 S --7 x -07/-06 1982 Mar 14 3u --6 x -06/-05 +-7 x %z 1982 Mar 14 3u +-6 x %z Z Pacific/Efate 11:13:16 - LMT 1912 Ja 13 -11 VU +11/+12 +11 VU %z Z Pacific/Fakaofo -11:24:56 - LMT 1901 --11 - -11 2011 D 30 -13 - +13 +-11 - %z 2011 D 30 +13 - %z Z Pacific/Fiji 11:55:44 - LMT 1915 O 26 -12 FJ +12/+13 +12 FJ %z Z Pacific/Galapagos -5:58:24 - LMT 1931 --5 - -05 1986 --6 EC -06/-05 +-5 - %z 1986 +-6 EC %z Z Pacific/Gambier -8:59:48 - LMT 1912 O --9 - -09 +-9 - %z Z Pacific/Guadalcanal 10:39:48 - LMT 1912 O -11 - +11 +11 - %z Z Pacific/Guam -14:21 - LMT 1844 D 31 9:39 - LMT 1901 10 - GST 1941 D 10 -9 - +09 1944 Jul 31 +9 - %z 1944 Jul 31 10 Gu G%sT 2000 D 23 10 - ChST Z Pacific/Honolulu -10:31:26 - LMT 1896 Ja 13 12 @@ -3979,74 +3955,73 @@ Z Pacific/Honolulu -10:31:26 - LMT 1896 Ja 13 12 -10:30 u H%sT 1947 Jun 8 2 -10 - HST Z Pacific/Kanton 0 - -00 1937 Au 31 --12 - -12 1979 O --11 - -11 1994 D 31 -13 - +13 +-12 - %z 1979 O +-11 - %z 1994 D 31 +13 - %z Z Pacific/Kiritimati -10:29:20 - LMT 1901 --10:40 - -1040 1979 O --10 - -10 1994 D 31 -14 - +14 +-10:40 - %z 1979 O +-10 - %z 1994 D 31 +14 - %z Z Pacific/Kosrae -13:8:4 - LMT 1844 D 31 10:51:56 - LMT 1901 -11 - +11 1914 O -9 - +09 1919 F -11 - +11 1937 -10 - +10 1941 Ap -9 - +09 1945 Au -11 - +11 1969 O -12 - +12 1999 -11 - +11 +11 - %z 1914 O +9 - %z 1919 F +11 - %z 1937 +10 - %z 1941 Ap +9 - %z 1945 Au +11 - %z 1969 O +12 - %z 1999 +11 - %z Z Pacific/Kwajalein 11:9:20 - LMT 1901 -11 - +11 1937 -10 - +10 1941 Ap -9 - +09 1944 F 6 -11 - +11 1969 O --12 - -12 1993 Au 20 24 -12 - +12 +11 - %z 1937 +10 - %z 1941 Ap +9 - %z 1944 F 6 +11 - %z 1969 O +-12 - %z 1993 Au 20 24 +12 - %z Z Pacific/Marquesas -9:18 - LMT 1912 O --9:30 - -0930 +-9:30 - %z Z Pacific/Nauru 11:7:40 - LMT 1921 Ja 15 -11:30 - +1130 1942 Au 29 -9 - +09 1945 S 8 -11:30 - +1130 1979 F 10 2 -12 - +12 +11:30 - %z 1942 Au 29 +9 - %z 1945 S 8 +11:30 - %z 1979 F 10 2 +12 - %z Z Pacific/Niue -11:19:40 - LMT 1952 O 16 --11:20 - -1120 1964 Jul --11 - -11 +-11:20 - %z 1964 Jul +-11 - %z Z Pacific/Norfolk 11:11:52 - LMT 1901 -11:12 - +1112 1951 -11:30 - +1130 1974 O 27 2s -11:30 1 +1230 1975 Mar 2 2s -11:30 - +1130 2015 O 4 2s -11 - +11 2019 Jul -11 AN +11/+12 +11:12 - %z 1951 +11:30 - %z 1974 O 27 2s +11:30 1 %z 1975 Mar 2 2s +11:30 - %z 2015 O 4 2s +11 - %z 2019 Jul +11 AN %z Z Pacific/Noumea 11:5:48 - LMT 1912 Ja 13 -11 NC +11/+12 +11 NC %z Z Pacific/Pago_Pago 12:37:12 - LMT 1892 Jul 5 -11:22:48 - LMT 1911 -11 - SST Z Pacific/Palau -15:2:4 - LMT 1844 D 31 8:57:56 - LMT 1901 -9 - +09 +9 - %z Z Pacific/Pitcairn -8:40:20 - LMT 1901 --8:30 - -0830 1998 Ap 27 --8 - -08 +-8:30 - %z 1998 Ap 27 +-8 - %z Z Pacific/Port_Moresby 9:48:40 - LMT 1880 9:48:32 - PMMT 1895 -10 - +10 +10 - %z Z Pacific/Rarotonga 13:20:56 - LMT 1899 D 26 -10:39:4 - LMT 1952 O 16 --10:30 - -1030 1978 N 12 --10 CK -10/-0930 +-10:30 - %z 1978 N 12 +-10 CK %z Z Pacific/Tahiti -9:58:16 - LMT 1912 O --10 - -10 +-10 - %z Z Pacific/Tarawa 11:32:4 - LMT 1901 -12 - +12 +12 - %z Z Pacific/Tongatapu 12:19:12 - LMT 1945 S 10 -12:20 - +1220 1961 -13 - +13 1999 -13 TO +13/+14 -Z WET 0 E WE%sT +12:20 - %z 1961 +13 - %z 1999 +13 TO %z L Etc/GMT GMT L Australia/Sydney Australia/ACT L Australia/Lord_Howe Australia/LHI @@ -4062,6 +4037,8 @@ L America/Rio_Branco Brazil/Acre L America/Noronha Brazil/DeNoronha L America/Sao_Paulo Brazil/East L America/Manaus Brazil/West +L Europe/Brussels CET +L America/Chicago CST6CDT L America/Halifax Canada/Atlantic L America/Winnipeg Canada/Central L America/Toronto Canada/Eastern @@ -4073,6 +4050,9 @@ L America/Whitehorse Canada/Yukon L America/Santiago Chile/Continental L Pacific/Easter Chile/EasterIsland L America/Havana Cuba +L Europe/Athens EET +L America/Panama EST +L America/New_York EST5EDT L Africa/Cairo Egypt L Europe/Dublin Eire L Etc/GMT Etc/GMT+0 @@ -4096,6 +4076,9 @@ L America/Jamaica Jamaica L Asia/Tokyo Japan L Pacific/Kwajalein Kwajalein L Africa/Tripoli Libya +L Europe/Brussels MET +L America/Phoenix MST +L America/Denver MST7MDT L America/Tijuana Mexico/BajaNorte L America/Mazatlan Mexico/BajaSur L America/Mexico_City Mexico/General @@ -4259,6 +4242,7 @@ L America/Denver America/Shiprock L America/Toronto America/Thunder_Bay L America/Edmonton America/Yellowknife L Pacific/Auckland Antarctica/South_Pole +L Asia/Ulaanbaatar Asia/Choibalsan L Asia/Shanghai Asia/Chongqing L Asia/Shanghai Asia/Harbin L Asia/Urumqi Asia/Kashgar @@ -4273,6 +4257,7 @@ L Europe/Kyiv Europe/Zaporozhye L Pacific/Kanton Pacific/Enderbury L Pacific/Honolulu Pacific/Johnston L Pacific/Port_Moresby Pacific/Yap +L Europe/Lisbon WET L Africa/Nairobi Africa/Asmera L America/Nuuk America/Godthab L Asia/Ashgabat Asia/Ashkhabad @@ -4290,5 +4275,7 @@ L Asia/Ulaanbaatar Asia/Ulan_Bator L Atlantic/Faroe Atlantic/Faeroe L Europe/Kyiv Europe/Kiev L Asia/Nicosia Europe/Nicosia +L Pacific/Honolulu HST +L America/Los_Angeles PST8PDT L Pacific/Guadalcanal Pacific/Ponape L Pacific/Port_Moresby Pacific/Truk diff --git a/libs/tzdata/zoneinfo/zone.tab b/libs/tzdata/zoneinfo/zone.tab index 3fa9306af..bfc0b5933 100644 --- a/libs/tzdata/zoneinfo/zone.tab +++ b/libs/tzdata/zoneinfo/zone.tab @@ -264,8 +264,7 @@ MK +4159+02126 Europe/Skopje ML +1239-00800 Africa/Bamako MM +1647+09610 Asia/Yangon MN +4755+10653 Asia/Ulaanbaatar most of Mongolia -MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan -MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar +MN +4801+09139 Asia/Hovd Bayan-Olgii, Hovd, Uvs MO +221150+1133230 Asia/Macau MP +1512+14545 Pacific/Saipan MQ +1436-06105 America/Martinique diff --git a/libs/tzdata/zoneinfo/zone1970.tab b/libs/tzdata/zoneinfo/zone1970.tab index abd948975..7726f39a0 100644 --- a/libs/tzdata/zoneinfo/zone1970.tab +++ b/libs/tzdata/zoneinfo/zone1970.tab @@ -209,8 +209,7 @@ MD +4700+02850 Europe/Chisinau MH +0905+16720 Pacific/Kwajalein Kwajalein MM,CC +1647+09610 Asia/Yangon MN +4755+10653 Asia/Ulaanbaatar most of Mongolia -MN +4801+09139 Asia/Hovd Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan -MN +4804+11430 Asia/Choibalsan Dornod, Sükhbaatar +MN +4801+09139 Asia/Hovd Bayan-Ölgii, Hovd, Uvs MO +221150+1133230 Asia/Macau MQ +1436-06105 America/Martinique MT +3554+01431 Europe/Malta diff --git a/libs/tzdata/zoneinfo/zonenow.tab b/libs/tzdata/zoneinfo/zonenow.tab index b6f291095..01f536b3b 100644 --- a/libs/tzdata/zoneinfo/zonenow.tab +++ b/libs/tzdata/zoneinfo/zonenow.tab @@ -5,7 +5,7 @@ # From Paul Eggert (2023-12-18): # This file contains a table where each row stands for a timezone # where civil timestamps are predicted to agree from now on. -# This file is like zone1970.tab (see zone1970.tab's coments), +# This file is like zone1970.tab (see zone1970.tab's comments), # but with the following changes: # # 1. Each timezone corresponds to a set of clocks that are planned @@ -123,8 +123,6 @@ XX +1455-02331 Atlantic/Cape_Verde Cape Verde # # -01/+00 (EU DST) XX +3744-02540 Atlantic/Azores Azores -# -01/+00 (EU DST) until 2024-03-31; then -02/-01 (EU DST) -XX +7029-02158 America/Scoresbysund Ittoqqortoormiit # # +00 - GMT XX +0519-00402 Africa/Abidjan far western Africa; Iceland ("GMT") @@ -199,7 +197,7 @@ XX +2518+05518 Asia/Dubai Russia; Caucasus; Persian Gulf; Seychelles; Réunion XX +3431+06912 Asia/Kabul Afghanistan # # +05 -XX +4120+06918 Asia/Tashkent Russia; west Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives +XX +4120+06918 Asia/Tashkent Russia; Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives # # +05 - PKT XX +2452+06703 Asia/Karachi Pakistan ("PKT") @@ -215,8 +213,6 @@ XX +2743+08519 Asia/Kathmandu Nepal # # +06 XX +2343+09025 Asia/Dhaka Russia; Kyrgyzstan; Bhutan; Bangladesh; Chagos -# +06 until 2024-03-01; then +05 -XX +4315+07657 Asia/Almaty Kazakhstan (except western areas) # # +06:30 XX +1647+09610 Asia/Yangon Myanmar; Cocos diff --git a/libs/tzdata/zones b/libs/tzdata/zones index b054f0101..3c4a951d4 100644 --- a/libs/tzdata/zones +++ b/libs/tzdata/zones @@ -159,7 +159,6 @@ Asia/Barnaul Asia/Beirut Asia/Bishkek Asia/Chita -Asia/Choibalsan Asia/Colombo Asia/Damascus Asia/Dhaka @@ -239,11 +238,6 @@ Australia/Lord_Howe Australia/Melbourne Australia/Perth Australia/Sydney -CET -CST6CDT -EET -EST -EST5EDT Etc/GMT Etc/GMT+1 Etc/GMT+10 @@ -311,14 +305,9 @@ Europe/Volgograd Europe/Warsaw Europe/Zurich Factory -HST Indian/Chagos Indian/Maldives Indian/Mauritius -MET -MST -MST7MDT -PST8PDT Pacific/Apia Pacific/Auckland Pacific/Bougainville @@ -349,7 +338,6 @@ Pacific/Rarotonga Pacific/Tahiti Pacific/Tarawa Pacific/Tongatapu -WET GMT Australia/ACT Australia/LHI @@ -365,6 +353,8 @@ Brazil/Acre Brazil/DeNoronha Brazil/East Brazil/West +CET +CST6CDT Canada/Atlantic Canada/Central Canada/Eastern @@ -376,6 +366,9 @@ Canada/Yukon Chile/Continental Chile/EasterIsland Cuba +EET +EST +EST5EDT Egypt Eire Etc/GMT+0 @@ -399,6 +392,9 @@ Jamaica Japan Kwajalein Libya +MET +MST +MST7MDT Mexico/BajaNorte Mexico/BajaSur Mexico/General @@ -562,6 +558,7 @@ America/Shiprock America/Thunder_Bay America/Yellowknife Antarctica/South_Pole +Asia/Choibalsan Asia/Chongqing Asia/Harbin Asia/Kashgar @@ -576,6 +573,7 @@ Europe/Zaporozhye Pacific/Enderbury Pacific/Johnston Pacific/Yap +WET Africa/Asmera America/Godthab Asia/Ashkhabad @@ -593,5 +591,7 @@ Asia/Ulan_Bator Atlantic/Faeroe Europe/Kiev Europe/Nicosia +HST +PST8PDT Pacific/Ponape Pacific/Truk diff --git a/libs/tzlocal-5.2.dist-info/RECORD b/libs/tzlocal-5.2.dist-info/RECORD index fe9846af8..dcc09b7f9 100644 --- a/libs/tzlocal-5.2.dist-info/RECORD +++ b/libs/tzlocal-5.2.dist-info/RECORD @@ -3,7 +3,7 @@ tzlocal-5.2.dist-info/LICENSE.txt,sha256=2ZqyCa6xaq0sJckP_YPBqYHikP__dqQgoqsD4D8 tzlocal-5.2.dist-info/METADATA,sha256=7l5yLSSHm6d5LzlQXQC2qouE182y8XY0MWFhWGK2DKA,7787 tzlocal-5.2.dist-info/RECORD,, tzlocal-5.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tzlocal-5.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +tzlocal-5.2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 tzlocal-5.2.dist-info/top_level.txt,sha256=QR6vZWP520waETnkotApPQPyVh9VnjoYPoAVHLK1DrE,8 tzlocal/__init__.py,sha256=2OQDx61TZv_HmBl7JKKP4ATldlx5OdEXOjKXAt8rQwY,396 tzlocal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/tzlocal-5.2.dist-info/WHEEL b/libs/tzlocal-5.2.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/tzlocal-5.2.dist-info/WHEEL +++ b/libs/tzlocal-5.2.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/urllib3-2.2.1.dist-info/RECORD b/libs/urllib3-2.2.1.dist-info/RECORD deleted file mode 100644 index 540ff4166..000000000 --- a/libs/urllib3-2.2.1.dist-info/RECORD +++ /dev/null @@ -1,42 +0,0 @@ -urllib3-2.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -urllib3-2.2.1.dist-info/METADATA,sha256=uROmjQwfAbwRYjV9PMdc5JF5NA3kRkpoKafPkNzybfc,6434 -urllib3-2.2.1.dist-info/RECORD,, -urllib3-2.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -urllib3-2.2.1.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87 -urllib3-2.2.1.dist-info/licenses/LICENSE.txt,sha256=Ew46ZNX91dCWp1JpRjSn2d8oRGnehuVzIQAmgEHj1oY,1093 -urllib3/__init__.py,sha256=JMo1tg1nIV1AeJ2vENC_Txfl0e5h6Gzl9DGVk1rWRbo,6979 -urllib3/_base_connection.py,sha256=p-DOG_Me7-sJXO1R9VgDpNmdVU_kIS8VtaC7ptEllA0,5640 -urllib3/_collections.py,sha256=vzKA-7X-9resOamEWq52uV1nHshChjbYDvz47H0mMjw,17400 -urllib3/_request_methods.py,sha256=ucEpHQyQf06b9o1RxKLkCpzGH0ct-v7X2xGpU6rmmlo,9984 -urllib3/_version.py,sha256=12idLAcGmrAURPX52rGioBo33oQ__-ENJEdeqHvUUZg,98 -urllib3/connection.py,sha256=zFgaaoqrICsl7-kBp-_4va9m82sYhioAuy4-4iDpK0I,34704 -urllib3/connectionpool.py,sha256=XjTfYowLwN5ZzRMO41_OTbGNX4ANifgYVpWsVMRuC00,43556 -urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -urllib3/contrib/emscripten/__init__.py,sha256=u6KNgzjlFZbuAAXa_ybCR7gQ71VJESnF-IIdDA73brw,733 -urllib3/contrib/emscripten/connection.py,sha256=kaBe2tWt7Yy9vNUFRBV7CSyDnfhCYILGxju9KTZj8Sw,8755 -urllib3/contrib/emscripten/emscripten_fetch_worker.js,sha256=CDfYF_9CDobtx2lGidyJ1zjDEvwNT5F-dchmVWXDh0E,3655 -urllib3/contrib/emscripten/fetch.py,sha256=ymwJlHBBuw6WTpKgPHpdmmrNBxlsr75HqoD4Rn27YXk,14131 -urllib3/contrib/emscripten/request.py,sha256=mL28szy1KvE3NJhWor5jNmarp8gwplDU-7gwGZY5g0Q,566 -urllib3/contrib/emscripten/response.py,sha256=wIDmdJ4doFWqLl5s86l9n0V70gFjQ2HWaPgz69jM52E,9546 -urllib3/contrib/pyopenssl.py,sha256=X31eCYGwB09EkAHX8RhDKC0X0Ki7d0cCVWoMJZUM5bQ,19161 -urllib3/contrib/socks.py,sha256=gFS2-zOw4_vLGpUvExOf3fNVT8liz6vhM2t6lBPn3CY,7572 -urllib3/exceptions.py,sha256=RDaiudtR7rqbVKTKpLSgZBBtwaIqV7eZtervZV_mZag,9393 -urllib3/fields.py,sha256=8vi0PeRo_pE5chPmJA07LZtMkVls4UrBS1k2xM506jM,10843 -urllib3/filepost.py,sha256=-9qJT11cNGjO9dqnI20-oErZuTvNaM18xZZPCjZSbOE,2395 -urllib3/http2.py,sha256=4QQcjTM9UYOQZe0r8KnA8anU9ST4p_s3SB3gRTueyPc,7480 -urllib3/poolmanager.py,sha256=fcC3OwjFKxha06NsOORwbZOzrVt1pyY-bNCbKiqC0l8,22935 -urllib3/py.typed,sha256=UaCuPFa3H8UAakbt-5G8SPacldTOGvJv18pPjUJ5gDY,93 -urllib3/response.py,sha256=lmvseToQbkLXuFyA3jcSyCPjTgSfa6YPA4xUhVqq8QI,43874 -urllib3/util/__init__.py,sha256=-qeS0QceivazvBEKDNFCAI-6ACcdDOE4TMvo7SLNlAQ,1001 -urllib3/util/connection.py,sha256=QeUUEuNmhznpuKNPL-B0IVOkMdMCu8oJX62OC0Vpzug,4462 -urllib3/util/proxy.py,sha256=seP8-Q5B6bB0dMtwPj-YcZZQ30vHuLqRu-tI0JZ2fzs,1148 -urllib3/util/request.py,sha256=PQnBmKUHMQ0hQQ41uhbLNAeA24ke60m6zeiwfwocpGo,8102 -urllib3/util/response.py,sha256=vQE639uoEhj1vpjEdxu5lNIhJCSUZkd7pqllUI0BZOA,3374 -urllib3/util/retry.py,sha256=WB-7x1m7fQH_-Qqtrk2OGvz93GvBTxc-pRn8Vf3p4mg,18384 -urllib3/util/ssl_.py,sha256=FeymdS68RggEROwMB9VLGSqLHq2hRUKnIbQC_bCpGJI,19109 -urllib3/util/ssl_match_hostname.py,sha256=gaWqixoYtQ_GKO8fcRGFj3VXeMoqyxQQuUTPgWeiL_M,5812 -urllib3/util/ssltransport.py,sha256=SF__JQXVcHBQniFJZp3P9q-UeHM310WVwcBwqT9dCLE,9034 -urllib3/util/timeout.py,sha256=4eT1FVeZZU7h7mYD1Jq2OXNe4fxekdNvhoWUkZusRpA,10346 -urllib3/util/url.py,sha256=wHORhp80RAXyTlAIkTqLFzSrkU7J34ZDxX-tN65MBZk,15213 -urllib3/util/util.py,sha256=j3lbZK1jPyiwD34T8IgJzdWEZVT-4E-0vYIJi9UjeNA,1146 -urllib3/util/wait.py,sha256=_ph8IrUR3sqPqi0OopQgJUlH4wzkGeM5CiyA7XGGtmI,4423 diff --git a/libs/urllib3-2.2.1.dist-info/INSTALLER b/libs/urllib3-2.2.3.dist-info/INSTALLER similarity index 100% rename from libs/urllib3-2.2.1.dist-info/INSTALLER rename to libs/urllib3-2.2.3.dist-info/INSTALLER diff --git a/libs/urllib3-2.2.1.dist-info/METADATA b/libs/urllib3-2.2.3.dist-info/METADATA similarity index 98% rename from libs/urllib3-2.2.1.dist-info/METADATA rename to libs/urllib3-2.2.3.dist-info/METADATA index 9da6d09f0..0b7645966 100644 --- a/libs/urllib3-2.2.1.dist-info/METADATA +++ b/libs/urllib3-2.2.3.dist-info/METADATA @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: urllib3 -Version: 2.2.1 +Version: 2.2.3 Summary: HTTP library with thread-safe connection pooling, file post, and more. Project-URL: Changelog, https://github.com/urllib3/urllib3/blob/main/CHANGES.rst Project-URL: Documentation, https://urllib3.readthedocs.io @@ -22,6 +22,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Internet :: WWW/HTTP diff --git a/libs/urllib3-2.2.3.dist-info/RECORD b/libs/urllib3-2.2.3.dist-info/RECORD new file mode 100644 index 000000000..a1f482b64 --- /dev/null +++ b/libs/urllib3-2.2.3.dist-info/RECORD @@ -0,0 +1,44 @@ +urllib3-2.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +urllib3-2.2.3.dist-info/METADATA,sha256=NpyLMYu-QoAmQK6pmmgoZRuq0HPt-lf_J9zIuCGMRNY,6485 +urllib3-2.2.3.dist-info/RECORD,, +urllib3-2.2.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3-2.2.3.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +urllib3-2.2.3.dist-info/licenses/LICENSE.txt,sha256=Ew46ZNX91dCWp1JpRjSn2d8oRGnehuVzIQAmgEHj1oY,1093 +urllib3/__init__.py,sha256=JMo1tg1nIV1AeJ2vENC_Txfl0e5h6Gzl9DGVk1rWRbo,6979 +urllib3/_base_connection.py,sha256=tH0ZlOxWKika-S9NW-MuIlI_PLFQUUmSnoE_9MeywkM,5652 +urllib3/_collections.py,sha256=aGhh9zCYce3o-5FW9DPSUay6O9LjHx8z6T7wDtdhrkY,17370 +urllib3/_request_methods.py,sha256=LTDxHenEP5XX-tVWBNkEkAgizCERkZF0JK-F-wCxqwI,9938 +urllib3/_version.py,sha256=gF7zM8AsdLRqhgteXesNHb7_t8ukr2zzkok2g1nvvhA,411 +urllib3/connection.py,sha256=QAwhOV5GOVdsFnMvX5Vv6fQ8f47EzfrROAArfxRdQOY,39508 +urllib3/connectionpool.py,sha256=5fPIHypPwlbKBASMs6bESTEJVEGlsj9FOY9_GGU2GpM,43393 +urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +urllib3/contrib/emscripten/__init__.py,sha256=u6KNgzjlFZbuAAXa_ybCR7gQ71VJESnF-IIdDA73brw,733 +urllib3/contrib/emscripten/connection.py,sha256=kaBe2tWt7Yy9vNUFRBV7CSyDnfhCYILGxju9KTZj8Sw,8755 +urllib3/contrib/emscripten/emscripten_fetch_worker.js,sha256=CDfYF_9CDobtx2lGidyJ1zjDEvwNT5F-dchmVWXDh0E,3655 +urllib3/contrib/emscripten/fetch.py,sha256=ymwJlHBBuw6WTpKgPHpdmmrNBxlsr75HqoD4Rn27YXk,14131 +urllib3/contrib/emscripten/request.py,sha256=mL28szy1KvE3NJhWor5jNmarp8gwplDU-7gwGZY5g0Q,566 +urllib3/contrib/emscripten/response.py,sha256=wEYWPHCL-JsgCtpCpfnWGYA1-DcjDGpFGqWCXZLwbHY,10017 +urllib3/contrib/pyopenssl.py,sha256=9iP4j8JafA4hqtX9AgJ9zxrqI-icohGrqFqAMryoNdA,19338 +urllib3/contrib/socks.py,sha256=-iardc61GypsJzD6W6yuRS7KVCyfowcQrl_719H7lIM,7549 +urllib3/exceptions.py,sha256=RDaiudtR7rqbVKTKpLSgZBBtwaIqV7eZtervZV_mZag,9393 +urllib3/fields.py,sha256=8vi0PeRo_pE5chPmJA07LZtMkVls4UrBS1k2xM506jM,10843 +urllib3/filepost.py,sha256=-9qJT11cNGjO9dqnI20-oErZuTvNaM18xZZPCjZSbOE,2395 +urllib3/http2/__init__.py,sha256=xzrASH7R5ANRkPJOot5lGnATOq3KKuyXzI42rcnwmqs,1741 +urllib3/http2/connection.py,sha256=GNlp9BjI3DmfSKe1W0b9IqRBeM8Q13xd2MA3ROcJ3dY,12668 +urllib3/http2/probe.py,sha256=nnAkqbhAakOiF75rz7W0udZ38Eeh_uD8fjV74N73FEI,3014 +urllib3/poolmanager.py,sha256=2_L2AjVDgoQ0qBmYbX9u9QqyU1u5J37zQbtv_-ueZQA,22913 +urllib3/py.typed,sha256=UaCuPFa3H8UAakbt-5G8SPacldTOGvJv18pPjUJ5gDY,93 +urllib3/response.py,sha256=NS0rqwRmtwWtC_6XDqgDJN_uo-jEmBVzx0V6KCsHlwg,44801 +urllib3/util/__init__.py,sha256=-qeS0QceivazvBEKDNFCAI-6ACcdDOE4TMvo7SLNlAQ,1001 +urllib3/util/connection.py,sha256=0o79-5NbRfpBDyoehGPLmCA544sCSiXvx0mF9xy3GG0,4458 +urllib3/util/proxy.py,sha256=seP8-Q5B6bB0dMtwPj-YcZZQ30vHuLqRu-tI0JZ2fzs,1148 +urllib3/util/request.py,sha256=UrZ2g3y3stGpH8rm-Sx8-ollgeiiKI496DZXRCwxb9o,8064 +urllib3/util/response.py,sha256=vQE639uoEhj1vpjEdxu5lNIhJCSUZkd7pqllUI0BZOA,3374 +urllib3/util/retry.py,sha256=bj-2YUqblxLlv8THg5fxww-DM54XCbjgZXIQ71XioCY,18459 +urllib3/util/ssl_.py,sha256=WN8a6KPPcvukbZ0MUlBAOkGil8bYKY8NoIYOw7QeOLI,19238 +urllib3/util/ssl_match_hostname.py,sha256=gaWqixoYtQ_GKO8fcRGFj3VXeMoqyxQQuUTPgWeiL_M,5812 +urllib3/util/ssltransport.py,sha256=wprBvhkgjddhhMwwEbHyP4lygHpP6SS-45Euh7oe48k,8887 +urllib3/util/timeout.py,sha256=4eT1FVeZZU7h7mYD1Jq2OXNe4fxekdNvhoWUkZusRpA,10346 +urllib3/util/url.py,sha256=wHORhp80RAXyTlAIkTqLFzSrkU7J34ZDxX-tN65MBZk,15213 +urllib3/util/util.py,sha256=j3lbZK1jPyiwD34T8IgJzdWEZVT-4E-0vYIJi9UjeNA,1146 +urllib3/util/wait.py,sha256=_ph8IrUR3sqPqi0OopQgJUlH4wzkGeM5CiyA7XGGtmI,4423 diff --git a/libs/urllib3-2.2.1.dist-info/REQUESTED b/libs/urllib3-2.2.3.dist-info/REQUESTED similarity index 100% rename from libs/urllib3-2.2.1.dist-info/REQUESTED rename to libs/urllib3-2.2.3.dist-info/REQUESTED diff --git a/libs/urllib3-2.2.3.dist-info/WHEEL b/libs/urllib3-2.2.3.dist-info/WHEEL new file mode 100644 index 000000000..cdd68a497 --- /dev/null +++ b/libs/urllib3-2.2.3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.25.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/libs/urllib3-2.2.1.dist-info/licenses/LICENSE.txt b/libs/urllib3-2.2.3.dist-info/licenses/LICENSE.txt similarity index 100% rename from libs/urllib3-2.2.1.dist-info/licenses/LICENSE.txt rename to libs/urllib3-2.2.3.dist-info/licenses/LICENSE.txt diff --git a/libs/urllib3/_base_connection.py b/libs/urllib3/_base_connection.py index bb349c744..29ca33487 100644 --- a/libs/urllib3/_base_connection.py +++ b/libs/urllib3/_base_connection.py @@ -12,7 +12,7 @@ class ProxyConfig(typing.NamedTuple): ssl_context: ssl.SSLContext | None use_forwarding_for_https: bool - assert_hostname: None | str | Literal[False] + assert_hostname: None | str | typing.Literal[False] assert_fingerprint: str | None @@ -28,7 +28,7 @@ class _ResponseOptions(typing.NamedTuple): if typing.TYPE_CHECKING: import ssl - from typing import Literal, Protocol + from typing import Protocol from .response import BaseHTTPResponse @@ -124,7 +124,7 @@ class BaseHTTPSConnection(BaseHTTPConnection, Protocol): # Certificate verification methods cert_reqs: int | str | None - assert_hostname: None | str | Literal[False] + assert_hostname: None | str | typing.Literal[False] assert_fingerprint: str | None ssl_context: ssl.SSLContext | None @@ -155,7 +155,7 @@ def __init__( proxy: Url | None = None, proxy_config: ProxyConfig | None = None, cert_reqs: int | str | None = None, - assert_hostname: None | str | Literal[False] = None, + assert_hostname: None | str | typing.Literal[False] = None, assert_fingerprint: str | None = None, server_hostname: str | None = None, ssl_context: ssl.SSLContext | None = None, diff --git a/libs/urllib3/_collections.py b/libs/urllib3/_collections.py index 55b032479..8a4409a12 100644 --- a/libs/urllib3/_collections.py +++ b/libs/urllib3/_collections.py @@ -427,7 +427,7 @@ def _copy_from(self, other: HTTPHeaderDict) -> None: val = other.getlist(key) self._container[key.lower()] = [key, *val] - def copy(self) -> HTTPHeaderDict: + def copy(self) -> Self: clone = type(self)() clone._copy_from(self) return clone @@ -462,7 +462,7 @@ def __ior__(self, other: object) -> HTTPHeaderDict: self.extend(maybe_constructable) return self - def __or__(self, other: object) -> HTTPHeaderDict: + def __or__(self, other: object) -> Self: # Supports merging header dicts using operator | # combining items with add instead of __setitem__ maybe_constructable = ensure_can_construct_http_header_dict(other) @@ -472,7 +472,7 @@ def __or__(self, other: object) -> HTTPHeaderDict: result.extend(maybe_constructable) return result - def __ror__(self, other: object) -> HTTPHeaderDict: + def __ror__(self, other: object) -> Self: # Supports merging header dicts using operator | when other is on left side # combining items with add instead of __setitem__ maybe_constructable = ensure_can_construct_http_header_dict(other) diff --git a/libs/urllib3/_request_methods.py b/libs/urllib3/_request_methods.py index 632042f03..03186e512 100644 --- a/libs/urllib3/_request_methods.py +++ b/libs/urllib3/_request_methods.py @@ -97,8 +97,7 @@ def request( an iterable of :class:`str`/:class:`bytes`, or a file-like object. :param fields: - Data to encode and send in the request body. Values are processed - by :func:`urllib.parse.urlencode`. + Data to encode and send in the URL or request body, depending on ``method``. :param headers: Dictionary of custom headers to send, such as User-Agent, @@ -164,7 +163,7 @@ def request_encode_url( The URL to perform the request on. :param fields: - Data to encode and send in the request body. + Data to encode and send in the URL. :param headers: Dictionary of custom headers to send, such as User-Agent, diff --git a/libs/urllib3/_version.py b/libs/urllib3/_version.py index 095cf3c16..eb8b5c285 100644 --- a/libs/urllib3/_version.py +++ b/libs/urllib3/_version.py @@ -1,4 +1,16 @@ -# This file is protected via CODEOWNERS -from __future__ import annotations +# file generated by setuptools_scm +# don't change, don't track in version control +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import Tuple, Union + VERSION_TUPLE = Tuple[Union[int, str], ...] +else: + VERSION_TUPLE = object -__version__ = "2.2.1" +version: str +__version__: str +__version_tuple__: VERSION_TUPLE +version_tuple: VERSION_TUPLE + +__version__ = version = '2.2.3' +__version_tuple__ = version_tuple = (2, 2, 3) diff --git a/libs/urllib3/connection.py b/libs/urllib3/connection.py index aa5c547c6..7cbef7d5a 100644 --- a/libs/urllib3/connection.py +++ b/libs/urllib3/connection.py @@ -1,11 +1,13 @@ from __future__ import annotations import datetime +import http.client import logging import os import re import socket import sys +import threading import typing import warnings from http.client import HTTPConnection as _HTTPConnection @@ -14,13 +16,12 @@ from socket import timeout as SocketTimeout if typing.TYPE_CHECKING: - from typing import Literal - from .response import HTTPResponse from .util.ssl_ import _TYPE_PEER_CERT_RET_DICT from .util.ssltransport import SSLTransport from ._collections import HTTPHeaderDict +from .http2 import probe as http2_probe from .util.response import assert_header_parsing from .util.timeout import _DEFAULT_TIMEOUT, _TYPE_TIMEOUT, Timeout from .util.util import to_str @@ -234,6 +235,46 @@ def set_tunnel( super().set_tunnel(host, port=port, headers=headers) self._tunnel_scheme = scheme + if sys.version_info < (3, 11, 4): + + def _tunnel(self) -> None: + _MAXLINE = http.client._MAXLINE # type: ignore[attr-defined] + connect = b"CONNECT %s:%d HTTP/1.0\r\n" % ( # type: ignore[str-format] + self._tunnel_host.encode("ascii"), # type: ignore[union-attr] + self._tunnel_port, + ) + headers = [connect] + for header, value in self._tunnel_headers.items(): # type: ignore[attr-defined] + headers.append(f"{header}: {value}\r\n".encode("latin-1")) + headers.append(b"\r\n") + # Making a single send() call instead of one per line encourages + # the host OS to use a more optimal packet size instead of + # potentially emitting a series of small packets. + self.send(b"".join(headers)) + del headers + + response = self.response_class(self.sock, method=self._method) # type: ignore[attr-defined] + try: + (version, code, message) = response._read_status() # type: ignore[attr-defined] + + if code != http.HTTPStatus.OK: + self.close() + raise OSError(f"Tunnel connection failed: {code} {message.strip()}") + while True: + line = response.fp.readline(_MAXLINE + 1) + if len(line) > _MAXLINE: + raise http.client.LineTooLong("header line") + if not line: + # for sites which EOF without sending a trailer + break + if line in (b"\r\n", b"\n", b""): + break + + if self.debuglevel > 0: + print("header:", line.decode()) + finally: + response.close() + def connect(self) -> None: self.sock = self._new_conn() if self._tunnel_host: @@ -241,7 +282,7 @@ def connect(self) -> None: self._has_connected_to_proxy = True # TODO: Fix tunnel so it doesn't depend on self.sock state. - self._tunnel() # type: ignore[attr-defined] + self._tunnel() # If there's a proxy to be connected to we are fully connected. # This is set twice (once above and here) due to forwarding proxies @@ -482,6 +523,7 @@ def getresponse( # type: ignore[override] headers=headers, status=httplib_response.status, version=httplib_response.version, + version_string=getattr(self, "_http_vsn_str", "HTTP/?"), reason=httplib_response.reason, preload_content=resp_options.preload_content, decode_content=resp_options.decode_content, @@ -509,6 +551,7 @@ class HTTPSConnection(HTTPConnection): ssl_minimum_version: int | None = None ssl_maximum_version: int | None = None assert_fingerprint: str | None = None + _connect_callback: typing.Callable[..., None] | None = None def __init__( self, @@ -523,7 +566,7 @@ def __init__( proxy: Url | None = None, proxy_config: ProxyConfig | None = None, cert_reqs: int | str | None = None, - assert_hostname: None | str | Literal[False] = None, + assert_hostname: None | str | typing.Literal[False] = None, assert_fingerprint: str | None = None, server_hostname: str | None = None, ssl_context: ssl.SSLContext | None = None, @@ -569,6 +612,7 @@ def __init__( else: cert_reqs = resolve_cert_reqs(None) self.cert_reqs = cert_reqs + self._connect_callback = None def set_cert( self, @@ -577,7 +621,7 @@ def set_cert( cert_reqs: int | str | None = None, key_password: str | None = None, ca_certs: str | None = None, - assert_hostname: None | str | Literal[False] = None, + assert_hostname: None | str | typing.Literal[False] = None, assert_fingerprint: str | None = None, ca_cert_dir: str | None = None, ca_cert_data: None | str | bytes = None, @@ -612,63 +656,122 @@ def set_cert( self.ca_cert_data = ca_cert_data def connect(self) -> None: - sock: socket.socket | ssl.SSLSocket - self.sock = sock = self._new_conn() - server_hostname: str = self.host - tls_in_tls = False - - # Do we need to establish a tunnel? - if self._tunnel_host is not None: - # We're tunneling to an HTTPS origin so need to do TLS-in-TLS. - if self._tunnel_scheme == "https": - # _connect_tls_proxy will verify and assign proxy_is_verified - self.sock = sock = self._connect_tls_proxy(self.host, sock) - tls_in_tls = True - elif self._tunnel_scheme == "http": - self.proxy_is_verified = False + # Today we don't need to be doing this step before the /actual/ socket + # connection, however in the future we'll need to decide whether to + # create a new socket or re-use an existing "shared" socket as a part + # of the HTTP/2 handshake dance. + if self._tunnel_host is not None and self._tunnel_port is not None: + probe_http2_host = self._tunnel_host + probe_http2_port = self._tunnel_port + else: + probe_http2_host = self.host + probe_http2_port = self.port + + # Check if the target origin supports HTTP/2. + # If the value comes back as 'None' it means that the current thread + # is probing for HTTP/2 support. Otherwise, we're waiting for another + # probe to complete, or we get a value right away. + target_supports_http2: bool | None + if "h2" in ssl_.ALPN_PROTOCOLS: + target_supports_http2 = http2_probe.acquire_and_get( + host=probe_http2_host, port=probe_http2_port + ) + else: + # If HTTP/2 isn't going to be offered it doesn't matter if + # the target supports HTTP/2. Don't want to make a probe. + target_supports_http2 = False + + if self._connect_callback is not None: + self._connect_callback( + "before connect", + thread_id=threading.get_ident(), + target_supports_http2=target_supports_http2, + ) - # If we're tunneling it means we're connected to our proxy. - self._has_connected_to_proxy = True + try: + sock: socket.socket | ssl.SSLSocket + self.sock = sock = self._new_conn() + server_hostname: str = self.host + tls_in_tls = False + + # Do we need to establish a tunnel? + if self._tunnel_host is not None: + # We're tunneling to an HTTPS origin so need to do TLS-in-TLS. + if self._tunnel_scheme == "https": + # _connect_tls_proxy will verify and assign proxy_is_verified + self.sock = sock = self._connect_tls_proxy(self.host, sock) + tls_in_tls = True + elif self._tunnel_scheme == "http": + self.proxy_is_verified = False + + # If we're tunneling it means we're connected to our proxy. + self._has_connected_to_proxy = True + + self._tunnel() + # Override the host with the one we're requesting data from. + server_hostname = self._tunnel_host + + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn( + ( + f"System time is way off (before {RECENT_DATE}). This will probably " + "lead to SSL verification errors" + ), + SystemTimeWarning, + ) - self._tunnel() # type: ignore[attr-defined] - # Override the host with the one we're requesting data from. - server_hostname = self._tunnel_host - - if self.server_hostname is not None: - server_hostname = self.server_hostname - - is_time_off = datetime.date.today() < RECENT_DATE - if is_time_off: - warnings.warn( - ( - f"System time is way off (before {RECENT_DATE}). This will probably " - "lead to SSL verification errors" - ), - SystemTimeWarning, + # Remove trailing '.' from fqdn hostnames to allow certificate validation + server_hostname_rm_dot = server_hostname.rstrip(".") + + sock_and_verified = _ssl_wrap_socket_and_match_hostname( + sock=sock, + cert_reqs=self.cert_reqs, + ssl_version=self.ssl_version, + ssl_minimum_version=self.ssl_minimum_version, + ssl_maximum_version=self.ssl_maximum_version, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + ca_cert_data=self.ca_cert_data, + cert_file=self.cert_file, + key_file=self.key_file, + key_password=self.key_password, + server_hostname=server_hostname_rm_dot, + ssl_context=self.ssl_context, + tls_in_tls=tls_in_tls, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint, ) + self.sock = sock_and_verified.socket + + # If an error occurs during connection/handshake we may need to release + # our lock so another connection can probe the origin. + except BaseException: + if self._connect_callback is not None: + self._connect_callback( + "after connect failure", + thread_id=threading.get_ident(), + target_supports_http2=target_supports_http2, + ) - # Remove trailing '.' from fqdn hostnames to allow certificate validation - server_hostname_rm_dot = server_hostname.rstrip(".") - - sock_and_verified = _ssl_wrap_socket_and_match_hostname( - sock=sock, - cert_reqs=self.cert_reqs, - ssl_version=self.ssl_version, - ssl_minimum_version=self.ssl_minimum_version, - ssl_maximum_version=self.ssl_maximum_version, - ca_certs=self.ca_certs, - ca_cert_dir=self.ca_cert_dir, - ca_cert_data=self.ca_cert_data, - cert_file=self.cert_file, - key_file=self.key_file, - key_password=self.key_password, - server_hostname=server_hostname_rm_dot, - ssl_context=self.ssl_context, - tls_in_tls=tls_in_tls, - assert_hostname=self.assert_hostname, - assert_fingerprint=self.assert_fingerprint, - ) - self.sock = sock_and_verified.socket + if target_supports_http2 is None: + http2_probe.set_and_release( + host=probe_http2_host, port=probe_http2_port, supports_http2=None + ) + raise + + # If this connection doesn't know if the origin supports HTTP/2 + # we report back to the HTTP/2 probe our result. + if target_supports_http2 is None: + supports_http2 = sock_and_verified.socket.selected_alpn_protocol() == "h2" + http2_probe.set_and_release( + host=probe_http2_host, + port=probe_http2_port, + supports_http2=supports_http2, + ) # Forwarding proxies can never have a verified target since # the proxy is the one doing the verification. Should instead @@ -742,7 +845,7 @@ def _ssl_wrap_socket_and_match_hostname( ca_certs: str | None, ca_cert_dir: str | None, ca_cert_data: None | str | bytes, - assert_hostname: None | str | Literal[False], + assert_hostname: None | str | typing.Literal[False], assert_fingerprint: str | None, server_hostname: str | None, ssl_context: ssl.SSLContext | None, diff --git a/libs/urllib3/connectionpool.py b/libs/urllib3/connectionpool.py index bd58ff14d..a2c3cf609 100644 --- a/libs/urllib3/connectionpool.py +++ b/libs/urllib3/connectionpool.py @@ -53,7 +53,8 @@ if typing.TYPE_CHECKING: import ssl - from typing import Literal + + from typing_extensions import Self from ._base_connection import BaseHTTPConnection, BaseHTTPSConnection @@ -61,8 +62,6 @@ _TYPE_TIMEOUT = typing.Union[Timeout, float, _TYPE_DEFAULT, None] -_SelfT = typing.TypeVar("_SelfT") - # Pool objects class ConnectionPool: @@ -95,7 +94,7 @@ def __init__(self, host: str, port: int | None = None) -> None: def __str__(self) -> str: return f"{type(self).__name__}(host={self.host!r}, port={self.port!r})" - def __enter__(self: _SelfT) -> _SelfT: + def __enter__(self) -> Self: return self def __exit__( @@ -103,7 +102,7 @@ def __exit__( exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None, - ) -> Literal[False]: + ) -> typing.Literal[False]: self.close() # Return False to re-raise any potential exceptions return False @@ -544,17 +543,14 @@ def _make_request( response._connection = response_conn # type: ignore[attr-defined] response._pool = self # type: ignore[attr-defined] - # emscripten connection doesn't have _http_vsn_str - http_version = getattr(conn, "_http_vsn_str", "HTTP/?") log.debug( - '%s://%s:%s "%s %s %s" %s %s', + '%s://%s:%s "%s %s HTTP/%s" %s %s', self.scheme, self.host, self.port, method, url, - # HTTP version - http_version, + response.version, response.status, response.length_remaining, ) @@ -1002,7 +998,7 @@ def __init__( ssl_version: int | str | None = None, ssl_minimum_version: ssl.TLSVersion | None = None, ssl_maximum_version: ssl.TLSVersion | None = None, - assert_hostname: str | Literal[False] | None = None, + assert_hostname: str | typing.Literal[False] | None = None, assert_fingerprint: str | None = None, ca_cert_dir: str | None = None, **conn_kw: typing.Any, diff --git a/libs/urllib3/contrib/emscripten/response.py b/libs/urllib3/contrib/emscripten/response.py index 303b4ee01..cd3d80e43 100644 --- a/libs/urllib3/contrib/emscripten/response.py +++ b/libs/urllib3/contrib/emscripten/response.py @@ -45,6 +45,7 @@ def __init__( status=internal_response.status_code, request_url=url, version=0, + version_string="HTTP/?", reason="", decode_content=True, ) @@ -155,7 +156,7 @@ def read( self.length_is_certain = True # wrap body in IOStream self._response.body = BytesIO(self._response.body) - if amt is not None: + if amt is not None and amt >= 0: # don't cache partial content cache_content = False data = self._response.body.read(amt) @@ -211,13 +212,21 @@ def data(self) -> bytes: def json(self) -> typing.Any: """ - Parses the body of the HTTP response as JSON. + Deserializes the body of the HTTP response as a Python object. - To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to the decoder. + The body of the HTTP response must be encoded using UTF-8, as per + `RFC 8529 Section 8.1 <https://www.rfc-editor.org/rfc/rfc8259#section-8.1>`_. - This method can raise either `UnicodeDecodeError` or `json.JSONDecodeError`. + To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to + your custom decoder instead. - Read more :ref:`here <json>`. + If the body of the HTTP response is not decodable to UTF-8, a + `UnicodeDecodeError` will be raised. If the body of the HTTP response is not a + valid JSON document, a `json.JSONDecodeError` will be raised. + + Read more :ref:`here <json_content>`. + + :returns: The body of the HTTP response as a Python object. """ data = self.data.decode("utf-8") return _json.loads(data) diff --git a/libs/urllib3/contrib/pyopenssl.py b/libs/urllib3/contrib/pyopenssl.py index b89a6dab8..c12cb3174 100644 --- a/libs/urllib3/contrib/pyopenssl.py +++ b/libs/urllib3/contrib/pyopenssl.py @@ -400,6 +400,10 @@ def getpeercert( def version(self) -> str: return self.connection.get_protocol_version_name() # type: ignore[no-any-return] + def selected_alpn_protocol(self) -> str | None: + alpn_proto = self.connection.get_alpn_proto_negotiated() + return alpn_proto.decode() if alpn_proto else None + WrappedSocket.makefile = socket_cls.makefile # type: ignore[attr-defined] diff --git a/libs/urllib3/contrib/socks.py b/libs/urllib3/contrib/socks.py index 5a803916b..c62b5e033 100644 --- a/libs/urllib3/contrib/socks.py +++ b/libs/urllib3/contrib/socks.py @@ -71,10 +71,8 @@ except ImportError: ssl = None # type: ignore[assignment] -from typing import TypedDict - -class _TYPE_SOCKS_OPTIONS(TypedDict): +class _TYPE_SOCKS_OPTIONS(typing.TypedDict): socks_version: int proxy_host: str | None proxy_port: str | None diff --git a/libs/urllib3/http2.py b/libs/urllib3/http2.py deleted file mode 100644 index 15fa9d915..000000000 --- a/libs/urllib3/http2.py +++ /dev/null @@ -1,229 +0,0 @@ -from __future__ import annotations - -import threading -import types -import typing - -import h2.config # type: ignore[import-untyped] -import h2.connection # type: ignore[import-untyped] -import h2.events # type: ignore[import-untyped] - -import urllib3.connection -import urllib3.util.ssl_ -from urllib3.response import BaseHTTPResponse - -from ._collections import HTTPHeaderDict -from .connection import HTTPSConnection -from .connectionpool import HTTPSConnectionPool - -orig_HTTPSConnection = HTTPSConnection - -T = typing.TypeVar("T") - - -class _LockedObject(typing.Generic[T]): - """ - A wrapper class that hides a specific object behind a lock. - - The goal here is to provide a simple way to protect access to an object - that cannot safely be simultaneously accessed from multiple threads. The - intended use of this class is simple: take hold of it with a context - manager, which returns the protected object. - """ - - def __init__(self, obj: T): - self.lock = threading.RLock() - self._obj = obj - - def __enter__(self) -> T: - self.lock.acquire() - return self._obj - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: types.TracebackType | None, - ) -> None: - self.lock.release() - - -class HTTP2Connection(HTTPSConnection): - def __init__( - self, host: str, port: int | None = None, **kwargs: typing.Any - ) -> None: - self._h2_conn = self._new_h2_conn() - self._h2_stream: int | None = None - self._h2_headers: list[tuple[bytes, bytes]] = [] - - if "proxy" in kwargs or "proxy_config" in kwargs: # Defensive: - raise NotImplementedError("Proxies aren't supported with HTTP/2") - - super().__init__(host, port, **kwargs) - - def _new_h2_conn(self) -> _LockedObject[h2.connection.H2Connection]: - config = h2.config.H2Configuration(client_side=True) - return _LockedObject(h2.connection.H2Connection(config=config)) - - def connect(self) -> None: - super().connect() - - with self._h2_conn as h2_conn: - h2_conn.initiate_connection() - self.sock.sendall(h2_conn.data_to_send()) - - def putrequest( - self, - method: str, - url: str, - skip_host: bool = False, - skip_accept_encoding: bool = False, - ) -> None: - with self._h2_conn as h2_conn: - self._request_url = url - self._h2_stream = h2_conn.get_next_available_stream_id() - - if ":" in self.host: - authority = f"[{self.host}]:{self.port or 443}" - else: - authority = f"{self.host}:{self.port or 443}" - - self._h2_headers.extend( - ( - (b":scheme", b"https"), - (b":method", method.encode()), - (b":authority", authority.encode()), - (b":path", url.encode()), - ) - ) - - def putheader(self, header: str, *values: str) -> None: # type: ignore[override] - for value in values: - self._h2_headers.append( - (header.encode("utf-8").lower(), value.encode("utf-8")) - ) - - def endheaders(self) -> None: # type: ignore[override] - with self._h2_conn as h2_conn: - h2_conn.send_headers( - stream_id=self._h2_stream, - headers=self._h2_headers, - end_stream=True, - ) - if data_to_send := h2_conn.data_to_send(): - self.sock.sendall(data_to_send) - - def send(self, data: bytes) -> None: # type: ignore[override] # Defensive: - if not data: - return - raise NotImplementedError("Sending data isn't supported yet") - - def getresponse( # type: ignore[override] - self, - ) -> HTTP2Response: - status = None - data = bytearray() - with self._h2_conn as h2_conn: - end_stream = False - while not end_stream: - # TODO: Arbitrary read value. - if received_data := self.sock.recv(65535): - events = h2_conn.receive_data(received_data) - for event in events: - if isinstance(event, h2.events.ResponseReceived): - headers = HTTPHeaderDict() - for header, value in event.headers: - if header == b":status": - status = int(value.decode()) - else: - headers.add( - header.decode("ascii"), value.decode("ascii") - ) - - elif isinstance(event, h2.events.DataReceived): - data += event.data - h2_conn.acknowledge_received_data( - event.flow_controlled_length, event.stream_id - ) - - elif isinstance(event, h2.events.StreamEnded): - end_stream = True - - if data_to_send := h2_conn.data_to_send(): - self.sock.sendall(data_to_send) - - # We always close to not have to handle connection management. - self.close() - - assert status is not None - return HTTP2Response( - status=status, - headers=headers, - request_url=self._request_url, - data=bytes(data), - ) - - def close(self) -> None: - with self._h2_conn as h2_conn: - try: - h2_conn.close_connection() - if data := h2_conn.data_to_send(): - self.sock.sendall(data) - except Exception: - pass - - # Reset all our HTTP/2 connection state. - self._h2_conn = self._new_h2_conn() - self._h2_stream = None - self._h2_headers = [] - - super().close() - - -class HTTP2Response(BaseHTTPResponse): - # TODO: This is a woefully incomplete response object, but works for non-streaming. - def __init__( - self, - status: int, - headers: HTTPHeaderDict, - request_url: str, - data: bytes, - decode_content: bool = False, # TODO: support decoding - ) -> None: - super().__init__( - status=status, - headers=headers, - # Following CPython, we map HTTP versions to major * 10 + minor integers - version=20, - # No reason phrase in HTTP/2 - reason=None, - decode_content=decode_content, - request_url=request_url, - ) - self._data = data - self.length_remaining = 0 - - @property - def data(self) -> bytes: - return self._data - - def get_redirect_location(self) -> None: - return None - - def close(self) -> None: - pass - - -def inject_into_urllib3() -> None: - HTTPSConnectionPool.ConnectionCls = HTTP2Connection - urllib3.connection.HTTPSConnection = HTTP2Connection # type: ignore[misc] - - # TODO: Offer 'http/1.1' as well, but for testing purposes this is handy. - urllib3.util.ssl_.ALPN_PROTOCOLS = ["h2"] - - -def extract_from_urllib3() -> None: - HTTPSConnectionPool.ConnectionCls = orig_HTTPSConnection - urllib3.connection.HTTPSConnection = orig_HTTPSConnection # type: ignore[misc] - - urllib3.util.ssl_.ALPN_PROTOCOLS = ["http/1.1"] diff --git a/libs/urllib3/http2/__init__.py b/libs/urllib3/http2/__init__.py new file mode 100644 index 000000000..133e1d8f2 --- /dev/null +++ b/libs/urllib3/http2/__init__.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +from importlib.metadata import version + +__all__ = [ + "inject_into_urllib3", + "extract_from_urllib3", +] + +import typing + +orig_HTTPSConnection: typing.Any = None + + +def inject_into_urllib3() -> None: + # First check if h2 version is valid + h2_version = version("h2") + if not h2_version.startswith("4."): + raise ImportError( + "urllib3 v2 supports h2 version 4.x.x, currently " + f"the 'h2' module is compiled with {h2_version!r}. " + "See: https://github.com/urllib3/urllib3/issues/3290" + ) + + # Import here to avoid circular dependencies. + from .. import connection as urllib3_connection + from .. import util as urllib3_util + from ..connectionpool import HTTPSConnectionPool + from ..util import ssl_ as urllib3_util_ssl + from .connection import HTTP2Connection + + global orig_HTTPSConnection + orig_HTTPSConnection = urllib3_connection.HTTPSConnection + + HTTPSConnectionPool.ConnectionCls = HTTP2Connection + urllib3_connection.HTTPSConnection = HTTP2Connection # type: ignore[misc] + + # TODO: Offer 'http/1.1' as well, but for testing purposes this is handy. + urllib3_util.ALPN_PROTOCOLS = ["h2"] + urllib3_util_ssl.ALPN_PROTOCOLS = ["h2"] + + +def extract_from_urllib3() -> None: + from .. import connection as urllib3_connection + from .. import util as urllib3_util + from ..connectionpool import HTTPSConnectionPool + from ..util import ssl_ as urllib3_util_ssl + + HTTPSConnectionPool.ConnectionCls = orig_HTTPSConnection + urllib3_connection.HTTPSConnection = orig_HTTPSConnection # type: ignore[misc] + + urllib3_util.ALPN_PROTOCOLS = ["http/1.1"] + urllib3_util_ssl.ALPN_PROTOCOLS = ["http/1.1"] diff --git a/libs/urllib3/http2/connection.py b/libs/urllib3/http2/connection.py new file mode 100644 index 000000000..f48614528 --- /dev/null +++ b/libs/urllib3/http2/connection.py @@ -0,0 +1,356 @@ +from __future__ import annotations + +import logging +import re +import threading +import types +import typing + +import h2.config # type: ignore[import-untyped] +import h2.connection # type: ignore[import-untyped] +import h2.events # type: ignore[import-untyped] + +from .._base_connection import _TYPE_BODY +from .._collections import HTTPHeaderDict +from ..connection import HTTPSConnection, _get_default_user_agent +from ..exceptions import ConnectionError +from ..response import BaseHTTPResponse + +orig_HTTPSConnection = HTTPSConnection + +T = typing.TypeVar("T") + +log = logging.getLogger(__name__) + +RE_IS_LEGAL_HEADER_NAME = re.compile(rb"^[!#$%&'*+\-.^_`|~0-9a-z]+$") +RE_IS_ILLEGAL_HEADER_VALUE = re.compile(rb"[\0\x00\x0a\x0d\r\n]|^[ \r\n\t]|[ \r\n\t]$") + + +def _is_legal_header_name(name: bytes) -> bool: + """ + "An implementation that validates fields according to the definitions in Sections + 5.1 and 5.5 of [HTTP] only needs an additional check that field names do not + include uppercase characters." (https://httpwg.org/specs/rfc9113.html#n-field-validity) + + `http.client._is_legal_header_name` does not validate the field name according to the + HTTP 1.1 spec, so we do that here, in addition to checking for uppercase characters. + + This does not allow for the `:` character in the header name, so should not + be used to validate pseudo-headers. + """ + return bool(RE_IS_LEGAL_HEADER_NAME.match(name)) + + +def _is_illegal_header_value(value: bytes) -> bool: + """ + "A field value MUST NOT contain the zero value (ASCII NUL, 0x00), line feed + (ASCII LF, 0x0a), or carriage return (ASCII CR, 0x0d) at any position. A field + value MUST NOT start or end with an ASCII whitespace character (ASCII SP or HTAB, + 0x20 or 0x09)." (https://httpwg.org/specs/rfc9113.html#n-field-validity) + """ + return bool(RE_IS_ILLEGAL_HEADER_VALUE.search(value)) + + +class _LockedObject(typing.Generic[T]): + """ + A wrapper class that hides a specific object behind a lock. + The goal here is to provide a simple way to protect access to an object + that cannot safely be simultaneously accessed from multiple threads. The + intended use of this class is simple: take hold of it with a context + manager, which returns the protected object. + """ + + __slots__ = ( + "lock", + "_obj", + ) + + def __init__(self, obj: T): + self.lock = threading.RLock() + self._obj = obj + + def __enter__(self) -> T: + self.lock.acquire() + return self._obj + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: types.TracebackType | None, + ) -> None: + self.lock.release() + + +class HTTP2Connection(HTTPSConnection): + def __init__( + self, host: str, port: int | None = None, **kwargs: typing.Any + ) -> None: + self._h2_conn = self._new_h2_conn() + self._h2_stream: int | None = None + self._headers: list[tuple[bytes, bytes]] = [] + + if "proxy" in kwargs or "proxy_config" in kwargs: # Defensive: + raise NotImplementedError("Proxies aren't supported with HTTP/2") + + super().__init__(host, port, **kwargs) + + if self._tunnel_host is not None: + raise NotImplementedError("Tunneling isn't supported with HTTP/2") + + def _new_h2_conn(self) -> _LockedObject[h2.connection.H2Connection]: + config = h2.config.H2Configuration(client_side=True) + return _LockedObject(h2.connection.H2Connection(config=config)) + + def connect(self) -> None: + super().connect() + with self._h2_conn as conn: + conn.initiate_connection() + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + + def putrequest( # type: ignore[override] + self, + method: str, + url: str, + **kwargs: typing.Any, + ) -> None: + """putrequest + This deviates from the HTTPConnection method signature since we never need to override + sending accept-encoding headers or the host header. + """ + if "skip_host" in kwargs: + raise NotImplementedError("`skip_host` isn't supported") + if "skip_accept_encoding" in kwargs: + raise NotImplementedError("`skip_accept_encoding` isn't supported") + + self._request_url = url or "/" + self._validate_path(url) # type: ignore[attr-defined] + + if ":" in self.host: + authority = f"[{self.host}]:{self.port or 443}" + else: + authority = f"{self.host}:{self.port or 443}" + + self._headers.append((b":scheme", b"https")) + self._headers.append((b":method", method.encode())) + self._headers.append((b":authority", authority.encode())) + self._headers.append((b":path", url.encode())) + + with self._h2_conn as conn: + self._h2_stream = conn.get_next_available_stream_id() + + def putheader(self, header: str | bytes, *values: str | bytes) -> None: + # TODO SKIPPABLE_HEADERS from urllib3 are ignored. + header = header.encode() if isinstance(header, str) else header + header = header.lower() # A lot of upstream code uses capitalized headers. + if not _is_legal_header_name(header): + raise ValueError(f"Illegal header name {str(header)}") + + for value in values: + value = value.encode() if isinstance(value, str) else value + if _is_illegal_header_value(value): + raise ValueError(f"Illegal header value {str(value)}") + self._headers.append((header, value)) + + def endheaders(self, message_body: typing.Any = None) -> None: # type: ignore[override] + if self._h2_stream is None: + raise ConnectionError("Must call `putrequest` first.") + + with self._h2_conn as conn: + conn.send_headers( + stream_id=self._h2_stream, + headers=self._headers, + end_stream=(message_body is None), + ) + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + self._headers = [] # Reset headers for the next request. + + def send(self, data: typing.Any) -> None: + """Send data to the server. + `data` can be: `str`, `bytes`, an iterable, or file-like objects + that support a .read() method. + """ + if self._h2_stream is None: + raise ConnectionError("Must call `putrequest` first.") + + with self._h2_conn as conn: + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + + if hasattr(data, "read"): # file-like objects + while True: + chunk = data.read(self.blocksize) + if not chunk: + break + if isinstance(chunk, str): + chunk = chunk.encode() # pragma: no cover + conn.send_data(self._h2_stream, chunk, end_stream=False) + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + conn.end_stream(self._h2_stream) + return + + if isinstance(data, str): # str -> bytes + data = data.encode() + + try: + if isinstance(data, bytes): + conn.send_data(self._h2_stream, data, end_stream=True) + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + else: + for chunk in data: + conn.send_data(self._h2_stream, chunk, end_stream=False) + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + conn.end_stream(self._h2_stream) + except TypeError: + raise TypeError( + "`data` should be str, bytes, iterable, or file. got %r" + % type(data) + ) + + def set_tunnel( + self, + host: str, + port: int | None = None, + headers: typing.Mapping[str, str] | None = None, + scheme: str = "http", + ) -> None: + raise NotImplementedError( + "HTTP/2 does not support setting up a tunnel through a proxy" + ) + + def getresponse( # type: ignore[override] + self, + ) -> HTTP2Response: + status = None + data = bytearray() + with self._h2_conn as conn: + end_stream = False + while not end_stream: + # TODO: Arbitrary read value. + if received_data := self.sock.recv(65535): + events = conn.receive_data(received_data) + for event in events: + if isinstance(event, h2.events.ResponseReceived): + headers = HTTPHeaderDict() + for header, value in event.headers: + if header == b":status": + status = int(value.decode()) + else: + headers.add( + header.decode("ascii"), value.decode("ascii") + ) + + elif isinstance(event, h2.events.DataReceived): + data += event.data + conn.acknowledge_received_data( + event.flow_controlled_length, event.stream_id + ) + + elif isinstance(event, h2.events.StreamEnded): + end_stream = True + + if data_to_send := conn.data_to_send(): + self.sock.sendall(data_to_send) + + assert status is not None + return HTTP2Response( + status=status, + headers=headers, + request_url=self._request_url, + data=bytes(data), + ) + + def request( # type: ignore[override] + self, + method: str, + url: str, + body: _TYPE_BODY | None = None, + headers: typing.Mapping[str, str] | None = None, + *, + preload_content: bool = True, + decode_content: bool = True, + enforce_content_length: bool = True, + **kwargs: typing.Any, + ) -> None: + """Send an HTTP/2 request""" + if "chunked" in kwargs: + # TODO this is often present from upstream. + # raise NotImplementedError("`chunked` isn't supported with HTTP/2") + pass + + if self.sock is not None: + self.sock.settimeout(self.timeout) + + self.putrequest(method, url) + + headers = headers or {} + for k, v in headers.items(): + if k.lower() == "transfer-encoding" and v == "chunked": + continue + else: + self.putheader(k, v) + + if b"user-agent" not in dict(self._headers): + self.putheader(b"user-agent", _get_default_user_agent()) + + if body: + self.endheaders(message_body=body) + self.send(body) + else: + self.endheaders() + + def close(self) -> None: + with self._h2_conn as conn: + try: + conn.close_connection() + if data := conn.data_to_send(): + self.sock.sendall(data) + except Exception: + pass + + # Reset all our HTTP/2 connection state. + self._h2_conn = self._new_h2_conn() + self._h2_stream = None + self._headers = [] + + super().close() + + +class HTTP2Response(BaseHTTPResponse): + # TODO: This is a woefully incomplete response object, but works for non-streaming. + def __init__( + self, + status: int, + headers: HTTPHeaderDict, + request_url: str, + data: bytes, + decode_content: bool = False, # TODO: support decoding + ) -> None: + super().__init__( + status=status, + headers=headers, + # Following CPython, we map HTTP versions to major * 10 + minor integers + version=20, + version_string="HTTP/2", + # No reason phrase in HTTP/2 + reason=None, + decode_content=decode_content, + request_url=request_url, + ) + self._data = data + self.length_remaining = 0 + + @property + def data(self) -> bytes: + return self._data + + def get_redirect_location(self) -> None: + return None + + def close(self) -> None: + pass diff --git a/libs/urllib3/http2/probe.py b/libs/urllib3/http2/probe.py new file mode 100644 index 000000000..9ea900764 --- /dev/null +++ b/libs/urllib3/http2/probe.py @@ -0,0 +1,87 @@ +from __future__ import annotations + +import threading + + +class _HTTP2ProbeCache: + __slots__ = ( + "_lock", + "_cache_locks", + "_cache_values", + ) + + def __init__(self) -> None: + self._lock = threading.Lock() + self._cache_locks: dict[tuple[str, int], threading.RLock] = {} + self._cache_values: dict[tuple[str, int], bool | None] = {} + + def acquire_and_get(self, host: str, port: int) -> bool | None: + # By the end of this block we know that + # _cache_[values,locks] is available. + value = None + with self._lock: + key = (host, port) + try: + value = self._cache_values[key] + # If it's a known value we return right away. + if value is not None: + return value + except KeyError: + self._cache_locks[key] = threading.RLock() + self._cache_values[key] = None + + # If the value is unknown, we acquire the lock to signal + # to the requesting thread that the probe is in progress + # or that the current thread needs to return their findings. + key_lock = self._cache_locks[key] + key_lock.acquire() + try: + # If the by the time we get the lock the value has been + # updated we want to return the updated value. + value = self._cache_values[key] + + # In case an exception like KeyboardInterrupt is raised here. + except BaseException as e: # Defensive: + assert not isinstance(e, KeyError) # KeyError shouldn't be possible. + key_lock.release() + raise + + return value + + def set_and_release( + self, host: str, port: int, supports_http2: bool | None + ) -> None: + key = (host, port) + key_lock = self._cache_locks[key] + with key_lock: # Uses an RLock, so can be locked again from same thread. + if supports_http2 is None and self._cache_values[key] is not None: + raise ValueError( + "Cannot reset HTTP/2 support for origin after value has been set." + ) # Defensive: not expected in normal usage + + self._cache_values[key] = supports_http2 + key_lock.release() + + def _values(self) -> dict[tuple[str, int], bool | None]: + """This function is for testing purposes only. Gets the current state of the probe cache""" + with self._lock: + return {k: v for k, v in self._cache_values.items()} + + def _reset(self) -> None: + """This function is for testing purposes only. Reset the cache values""" + with self._lock: + self._cache_locks = {} + self._cache_values = {} + + +_HTTP2_PROBE_CACHE = _HTTP2ProbeCache() + +set_and_release = _HTTP2_PROBE_CACHE.set_and_release +acquire_and_get = _HTTP2_PROBE_CACHE.acquire_and_get +_values = _HTTP2_PROBE_CACHE._values +_reset = _HTTP2_PROBE_CACHE._reset + +__all__ = [ + "set_and_release", + "acquire_and_get", +] diff --git a/libs/urllib3/poolmanager.py b/libs/urllib3/poolmanager.py index 32da0a00a..085d1dbaf 100644 --- a/libs/urllib3/poolmanager.py +++ b/libs/urllib3/poolmanager.py @@ -26,7 +26,8 @@ if typing.TYPE_CHECKING: import ssl - from typing import Literal + + from typing_extensions import Self __all__ = ["PoolManager", "ProxyManager", "proxy_from_url"] @@ -51,8 +52,6 @@ # http.client.HTTPConnection & http.client.HTTPSConnection in Python 3.7 _DEFAULT_BLOCKSIZE = 16384 -_SelfT = typing.TypeVar("_SelfT") - class PoolKey(typing.NamedTuple): """ @@ -214,7 +213,7 @@ def __init__( self.pool_classes_by_scheme = pool_classes_by_scheme self.key_fn_by_scheme = key_fn_by_scheme.copy() - def __enter__(self: _SelfT) -> _SelfT: + def __enter__(self) -> Self: return self def __exit__( @@ -222,7 +221,7 @@ def __exit__( exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None, - ) -> Literal[False]: + ) -> typing.Literal[False]: self.clear() # Return False to re-raise any potential exceptions return False @@ -553,7 +552,7 @@ def __init__( proxy_headers: typing.Mapping[str, str] | None = None, proxy_ssl_context: ssl.SSLContext | None = None, use_forwarding_for_https: bool = False, - proxy_assert_hostname: None | str | Literal[False] = None, + proxy_assert_hostname: None | str | typing.Literal[False] = None, proxy_assert_fingerprint: str | None = None, **connection_pool_kw: typing.Any, ) -> None: diff --git a/libs/urllib3/response.py b/libs/urllib3/response.py index d31fac9ba..a0273d65b 100644 --- a/libs/urllib3/response.py +++ b/libs/urllib3/response.py @@ -26,20 +26,21 @@ brotli = None try: - import zstandard as zstd # type: ignore[import-not-found] - + import zstandard as zstd +except (AttributeError, ImportError, ValueError): # Defensive: + HAS_ZSTD = False +else: # The package 'zstandard' added the 'eof' property starting # in v0.18.0 which we require to ensure a complete and # valid zstd stream was fed into the ZstdDecoder. # See: https://github.com/urllib3/urllib3/pull/2624 - _zstd_version = _zstd_version = tuple( + _zstd_version = tuple( map(int, re.search(r"^([0-9]+)\.([0-9]+)", zstd.__version__).groups()) # type: ignore[union-attr] ) if _zstd_version < (0, 18): # Defensive: - zstd = None - -except (AttributeError, ImportError, ValueError): # Defensive: - zstd = None + HAS_ZSTD = False + else: + HAS_ZSTD = True from . import util from ._base_connection import _TYPE_BODY @@ -61,8 +62,6 @@ from .util.retry import Retry if typing.TYPE_CHECKING: - from typing import Literal - from .connectionpool import HTTPConnectionPool log = logging.getLogger(__name__) @@ -163,7 +162,7 @@ def flush(self) -> bytes: return b"" -if zstd is not None: +if HAS_ZSTD: class ZstdDecoder(ContentDecoder): def __init__(self) -> None: @@ -183,7 +182,7 @@ def flush(self) -> bytes: ret = self._obj.flush() # note: this is a no-op if not self._obj.eof: raise DecodeError("Zstandard data is incomplete") - return ret # type: ignore[no-any-return] + return ret class MultiDecoder(ContentDecoder): @@ -219,7 +218,7 @@ def _get_decoder(mode: str) -> ContentDecoder: if brotli is not None and mode == "br": return BrotliDecoder() - if zstd is not None and mode == "zstd": + if HAS_ZSTD and mode == "zstd": return ZstdDecoder() return DeflateDecoder() @@ -302,7 +301,7 @@ class BaseHTTPResponse(io.IOBase): CONTENT_DECODERS = ["gzip", "x-gzip", "deflate"] if brotli is not None: CONTENT_DECODERS += ["br"] - if zstd is not None: + if HAS_ZSTD: CONTENT_DECODERS += ["zstd"] REDIRECT_STATUSES = [301, 302, 303, 307, 308] @@ -310,7 +309,7 @@ class BaseHTTPResponse(io.IOBase): if brotli is not None: DECODER_ERROR_CLASSES += (brotli.error,) - if zstd is not None: + if HAS_ZSTD: DECODER_ERROR_CLASSES += (zstd.ZstdError,) def __init__( @@ -319,6 +318,7 @@ def __init__( headers: typing.Mapping[str, str] | typing.Mapping[bytes, bytes] | None = None, status: int, version: int, + version_string: str, reason: str | None, decode_content: bool, request_url: str | None, @@ -330,6 +330,7 @@ def __init__( self.headers = HTTPHeaderDict(headers) # type: ignore[arg-type] self.status = status self.version = version + self.version_string = version_string self.reason = reason self.decode_content = decode_content self._has_decoded_content = False @@ -346,7 +347,7 @@ def __init__( self._decoder: ContentDecoder | None = None self.length_remaining: int | None - def get_redirect_location(self) -> str | None | Literal[False]: + def get_redirect_location(self) -> str | None | typing.Literal[False]: """ Should we redirect and where to? @@ -364,13 +365,21 @@ def data(self) -> bytes: def json(self) -> typing.Any: """ - Parses the body of the HTTP response as JSON. + Deserializes the body of the HTTP response as a Python object. + + The body of the HTTP response must be encoded using UTF-8, as per + `RFC 8529 Section 8.1 <https://www.rfc-editor.org/rfc/rfc8259#section-8.1>`_. - To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to the decoder. + To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to + your custom decoder instead. - This method can raise either `UnicodeDecodeError` or `json.JSONDecodeError`. + If the body of the HTTP response is not decodable to UTF-8, a + `UnicodeDecodeError` will be raised. If the body of the HTTP response is not a + valid JSON document, a `json.JSONDecodeError` will be raised. - Read more :ref:`here <json>`. + Read more :ref:`here <json_content>`. + + :returns: The body of the HTTP response as a Python object. """ data = self.data.decode("utf-8") return _json.loads(data) @@ -567,6 +576,7 @@ def __init__( headers: typing.Mapping[str, str] | typing.Mapping[bytes, bytes] | None = None, status: int = 0, version: int = 0, + version_string: str = "HTTP/?", reason: str | None = None, preload_content: bool = True, decode_content: bool = True, @@ -584,6 +594,7 @@ def __init__( headers=headers, status=status, version=version, + version_string=version_string, reason=reason, decode_content=decode_content, request_url=request_url, @@ -926,7 +937,10 @@ def read( if decode_content is None: decode_content = self.decode_content - if amt is not None: + if amt and amt < 0: + # Negative numbers and `None` should be treated the same. + amt = None + elif amt is not None: cache_content = False if len(self._decoded_buffer) >= amt: @@ -986,6 +1000,9 @@ def read1( """ if decode_content is None: decode_content = self.decode_content + if amt and amt < 0: + # Negative numbers and `None` should be treated the same. + amt = None # try and respond without going to the network if self._has_decoded_content: if not decode_content: @@ -1180,6 +1197,11 @@ def read_chunked( if self._fp.fp is None: # type: ignore[union-attr] return None + if amt and amt < 0: + # Negative numbers and `None` should be treated the same, + # but httplib handles only `None` correctly. + amt = None + while True: self._update_chunk_length() if self.chunk_left == 0: diff --git a/libs/urllib3/util/connection.py b/libs/urllib3/util/connection.py index 5c7da73f4..89bd189fb 100644 --- a/libs/urllib3/util/connection.py +++ b/libs/urllib3/util/connection.py @@ -6,7 +6,7 @@ from ..exceptions import LocationParseError from .timeout import _DEFAULT_TIMEOUT, _TYPE_TIMEOUT -_TYPE_SOCKET_OPTIONS = typing.Sequence[typing.Tuple[int, int, typing.Union[int, bytes]]] +_TYPE_SOCKET_OPTIONS = typing.List[typing.Tuple[int, int, typing.Union[int, bytes]]] if typing.TYPE_CHECKING: from .._base_connection import BaseHTTPConnection diff --git a/libs/urllib3/util/request.py b/libs/urllib3/util/request.py index fe0e3485e..82454a099 100644 --- a/libs/urllib3/util/request.py +++ b/libs/urllib3/util/request.py @@ -29,7 +29,7 @@ else: ACCEPT_ENCODING += ",br" try: - import zstandard as _unused_module_zstd # type: ignore[import-not-found] # noqa: F401 + import zstandard as _unused_module_zstd # noqa: F401 except ImportError: pass else: @@ -227,7 +227,7 @@ def chunk_readable() -> typing.Iterable[bytes]: if not datablock: break if encode: - datablock = datablock.encode("iso-8859-1") + datablock = datablock.encode("utf-8") yield datablock chunks = chunk_readable() diff --git a/libs/urllib3/util/retry.py b/libs/urllib3/util/retry.py index 7572bfd26..0456cceba 100644 --- a/libs/urllib3/util/retry.py +++ b/libs/urllib3/util/retry.py @@ -21,6 +21,8 @@ from .util import reraise if typing.TYPE_CHECKING: + from typing_extensions import Self + from ..connectionpool import ConnectionPool from ..response import BaseHTTPResponse @@ -187,7 +189,9 @@ class Retry: RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) #: Default headers to be used for ``remove_headers_on_redirect`` - DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset(["Cookie", "Authorization"]) + DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset( + ["Cookie", "Authorization", "Proxy-Authorization"] + ) #: Default maximum backoff time. DEFAULT_BACKOFF_MAX = 120 @@ -240,7 +244,7 @@ def __init__( ) self.backoff_jitter = backoff_jitter - def new(self, **kw: typing.Any) -> Retry: + def new(self, **kw: typing.Any) -> Self: params = dict( total=self.total, connect=self.connect, @@ -429,7 +433,7 @@ def increment( error: Exception | None = None, _pool: ConnectionPool | None = None, _stacktrace: TracebackType | None = None, - ) -> Retry: + ) -> Self: """Return a new Retry object with incremented retry counters. :param response: A response object, or None, if the server did not diff --git a/libs/urllib3/util/ssl_.py b/libs/urllib3/util/ssl_.py index b14cf27b6..5e93be9ce 100644 --- a/libs/urllib3/util/ssl_.py +++ b/libs/urllib3/util/ssl_.py @@ -1,5 +1,6 @@ from __future__ import annotations +import hashlib import hmac import os import socket @@ -7,7 +8,6 @@ import typing import warnings from binascii import unhexlify -from hashlib import md5, sha1, sha256 from ..exceptions import ProxySchemeUnsupported, SSLError from .url import _BRACELESS_IPV6_ADDRZ_RE, _IPV4_RE @@ -21,7 +21,10 @@ _TYPE_VERSION_INFO = typing.Tuple[int, int, int, str, int] # Maps the length of a digest to a possible hash function producing this digest -HASHFUNC_MAP = {32: md5, 40: sha1, 64: sha256} +HASHFUNC_MAP = { + length: getattr(hashlib, algorithm, None) + for length, algorithm in ((32, "md5"), (40, "sha1"), (64, "sha256")) +} def _is_bpo_43522_fixed( @@ -78,7 +81,7 @@ def _is_has_never_check_common_name_reliable( if typing.TYPE_CHECKING: from ssl import VerifyMode - from typing import Literal, TypedDict + from typing import TypedDict from .ssltransport import SSLTransport as SSLTransportType @@ -159,9 +162,13 @@ def assert_fingerprint(cert: bytes | None, fingerprint: str) -> None: fingerprint = fingerprint.replace(":", "").lower() digest_length = len(fingerprint) - hashfunc = HASHFUNC_MAP.get(digest_length) - if not hashfunc: + if digest_length not in HASHFUNC_MAP: raise SSLError(f"Fingerprint of invalid length: {fingerprint}") + hashfunc = HASHFUNC_MAP.get(digest_length) + if hashfunc is None: + raise SSLError( + f"Hash function implementation unavailable for fingerprint length: {digest_length}" + ) # We need encode() here for py32; works on py2 and p33. fingerprint_bytes = unhexlify(fingerprint.encode()) @@ -365,7 +372,7 @@ def ssl_wrap_socket( ca_cert_dir: str | None = ..., key_password: str | None = ..., ca_cert_data: None | str | bytes = ..., - tls_in_tls: Literal[False] = ..., + tls_in_tls: typing.Literal[False] = ..., ) -> ssl.SSLSocket: ... @@ -457,10 +464,7 @@ def ssl_wrap_socket( else: context.load_cert_chain(certfile, keyfile, key_password) - try: - context.set_alpn_protocols(ALPN_PROTOCOLS) - except NotImplementedError: # Defensive: in CI, we always have set_alpn_protocols - pass + context.set_alpn_protocols(ALPN_PROTOCOLS) ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname) return ssl_sock diff --git a/libs/urllib3/util/ssltransport.py b/libs/urllib3/util/ssltransport.py index fa9f2b37c..d69ccb342 100644 --- a/libs/urllib3/util/ssltransport.py +++ b/libs/urllib3/util/ssltransport.py @@ -8,12 +8,11 @@ from ..exceptions import ProxySchemeUnsupported if typing.TYPE_CHECKING: - from typing import Literal + from typing_extensions import Self from .ssl_ import _TYPE_PEER_CERT_RET, _TYPE_PEER_CERT_RET_DICT -_SelfT = typing.TypeVar("_SelfT", bound="SSLTransport") _WriteBuffer = typing.Union[bytearray, memoryview] _ReturnValue = typing.TypeVar("_ReturnValue") @@ -70,7 +69,7 @@ def __init__( # Perform initial handshake. self._ssl_io_loop(self.sslobj.do_handshake) - def __enter__(self: _SelfT) -> _SelfT: + def __enter__(self) -> Self: return self def __exit__(self, *_: typing.Any) -> None: @@ -174,12 +173,12 @@ def close(self) -> None: @typing.overload def getpeercert( - self, binary_form: Literal[False] = ... + self, binary_form: typing.Literal[False] = ... ) -> _TYPE_PEER_CERT_RET_DICT | None: ... @typing.overload - def getpeercert(self, binary_form: Literal[True]) -> bytes | None: + def getpeercert(self, binary_form: typing.Literal[True]) -> bytes | None: ... def getpeercert(self, binary_form: bool = False) -> _TYPE_PEER_CERT_RET: @@ -194,9 +193,6 @@ def cipher(self) -> tuple[str, str, int] | None: def selected_alpn_protocol(self) -> str | None: return self.sslobj.selected_alpn_protocol() - def selected_npn_protocol(self) -> str | None: - return self.sslobj.selected_npn_protocol() - def shared_ciphers(self) -> list[tuple[str, str, int]] | None: return self.sslobj.shared_ciphers() diff --git a/libs/version.txt b/libs/version.txt index fd884e307..1ae8ab2e6 100644 --- a/libs/version.txt +++ b/libs/version.txt @@ -1,45 +1,45 @@ # Bazarr dependencies -alembic==1.13.1 +alembic==1.13.3 aniso8601==9.0.1 -apprise==1.7.6 +apprise==1.9.0 apscheduler<=3.10.4 -attrs==23.2.0 -blinker==1.7.0 -charset-normalizer==3.3.2 +attrs==24.2.0 +blinker==1.8.2 +charset-normalizer==3.4.0 deep-translator==1.11.4 -dogpile.cache==1.3.2 -dynaconf==3.2.4 +dogpile.cache==1.3.3 +dynaconf==3.2.6 fese==0.3.0 -ffsubsync==0.4.25 -flask-cors==4.0.0 -flask-migrate==4.0.5 +ffsubsync==0.4.26 +flask-cors==5.0.0 +flask-migrate==4.0.7 flask-restx==1.3.0 -Flask-SocketIO==5.3.6 +Flask-SocketIO==5.4.1 flask_sqlalchemy==3.1.1 -Flask==3.0.2 +Flask==3.0.3 ga4mp==2.0.4 guess_language-spirit==0.5.3 guessit==3.8.0 h11==0.14.0 -inflect==7.0.0 +inflect==7.4.0 jsonschema<=4.17.3 # newer version require other compiled dependency -knowit==0.5.3 -Mako==1.3.2 -pycountry==23.12.11 +knowit<=0.5.3 # newer version doesn't support Python 3.8 anymore +Mako==1.3.6 +pycountry==24.6.1 pyrsistent==0.20.0 -pysubs2==1.7.2 -python-engineio==4.9.0 -python-socketio==5.11.1 -pytz==2024.1 +pysubs2==1.7.3 +python-engineio==4.10.1 +python-socketio==5.11.4 +pytz==2024.2 pytz_deprecation_shim==0.1.0.post0 -rarfile==4.1 +rarfile==4.2 referencing<=0.23.0 # newer version require other compiled dependency -requests==2.31.0 +requests==2.32.3 semver==3.0.2 signalrcore==0.9.5 -simple-websocket==1.0.0 -sqlalchemy==2.0.27 -textdistance==4.6.2 +simple-websocket==1.1.0 +sqlalchemy==2.0.36 +textdistance==4.6.3 unidecode==1.3.8 waitress==3.0.0 whichcraft==0.6.1 @@ -48,12 +48,12 @@ wsproto==1.2.0 ## indirect dependencies # Required-by: apprise -importlib_metadata==7.0.1 -markdown==3.5.2 -requests_oauthlib==1.3.1 +importlib_metadata<=7.2.1 # Newer version raise a KeyError with knowit +markdown==3.7 +requests_oauthlib==2.0.0 # Required-by: apscheduler -tzdata==2024.1 +tzdata==2024.2 tzlocal==5.2 # Required-by: beautifulsoup4 @@ -63,30 +63,30 @@ soupsieve==2.3.2.post1 auditok<=0.1.5 # do not upgrade unless ffsubsync requirements.txt change ffmpeg-python==0.2.0 future==1.0.0 -rich==13.7.0 +rich==13.9.3 srt==3.5.3 -tqdm==4.66.2 -typing_extensions==4.10.0 +tqdm==4.66.6 +typing_extensions==4.12.2 # Required-by: flask click==8.1.7 -itsdangerous==2.1.2 -jinja2==3.1.3 -werkzeug==3.0.1 +itsdangerous==2.2.0 +jinja2==3.1.4 +werkzeug==3.0.6 # Required-by: guessit -python-dateutil==2.8.2 -importlib_resources==6.1.2 +python-dateutil==2.9.0 +importlib_resources==6.4.5 rebulk==3.2.0 -zipp==3.17.0 +zipp==3.20.2 # Required-by: jinja2 -markupsafe==2.1.5 +markupsafe<=2.1.5 # newer version doesn't support Python 3.8 anymore # Required-by: knowit pymediainfo==6.1.0 -pyyaml==6.0.1 -trakit==0.2.1 +pyyaml==6.0.2 +trakit==0.2.2 # Required-by: python-socketio bidict==0.23.1 @@ -95,30 +95,30 @@ bidict==0.23.1 backports.zoneinfo==0.2.1 # Required-by: signalr-client-threads -websocket-client==1.7.0 +websocket-client==1.8.0 # Required-by: signalrcore -msgpack==1.0.7 +msgpack==1.1.0 # Required-by: subliminal appdirs==1.4.4 -babelfish==0.6.0 +babelfish==0.6.1 beautifulsoup4==4.12.3 chardet==5.2.0 pysrt==1.1.2 -stevedore==5.2.0 +stevedore==5.3.0 # Required-by: subliminal_patch cloudscraper==1.2.58 # newer version dropped captcha v1 support decorator==5.1.1 -dnspython==2.6.1 -enzyme==0.4.1 -ftfy==6.1.3 +dnspython<=2.6.1 # newer version doesn't support Python 3.8 anymore +enzyme==0.5.2 +ftfy<=6.2.3 # newer version doesn't support Python 3.8 anymore html5lib==1.1 Js2Py==0.74 pydantic<=1.10.14 # newer version require other compiled dependency pyjsparser==2.7.1 -pyparsing==3.1.1 +pyparsing<=3.1.4 # newer version doesn't support Python 3.8 anymore python-anticaptcha==1.0.0 retry==0.9.2 six==1.16.0 @@ -130,19 +130,19 @@ backports.functools-lru-cache==2.0.0 fcache==0.5.2 json_tricks==3.17.3 tld==0.13 -platformdirs==4.2.0 +platformdirs==4.3.6 # Required-by: requests -certifi==2024.2.2 -idna==3.6 +certifi==2024.8.30 +idna==3.10 oauthlib==3.2.2 requests_toolbelt==1.0.0 -urllib3==2.2.1 +urllib3==2.2.3 # Required-by: rich colorama==0.4.6 commonmark==0.9.1 -Pygments==2.17.2 +Pygments==2.18.0 # Required-by: websocket pysocks==1.7.1 diff --git a/libs/waitress-3.0.0.dist-info/RECORD b/libs/waitress-3.0.0.dist-info/RECORD index c21885637..5df5c85b3 100644 --- a/libs/waitress-3.0.0.dist-info/RECORD +++ b/libs/waitress-3.0.0.dist-info/RECORD @@ -4,7 +4,7 @@ waitress-3.0.0.dist-info/LICENSE.txt,sha256=PmcdsR32h1FswdtbPWXkqjg-rKPCDOo_r1Og waitress-3.0.0.dist-info/METADATA,sha256=LcIRiiQFPBQfYWZELvGinG7VDEEob2Rwxs50fHvzhfE,4205 waitress-3.0.0.dist-info/RECORD,, waitress-3.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -waitress-3.0.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +waitress-3.0.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 waitress-3.0.0.dist-info/entry_points.txt,sha256=tDR8epG2g4I70Lak9d-1qTHbCfBzZd5FDEScAkVuH_E,106 waitress-3.0.0.dist-info/top_level.txt,sha256=_kFnXYtDXvRWHSXprH53h56AM2jDfY-Y7sgIakVEImI,9 waitress/__init__.py,sha256=XucLsghawSMTlUAAZ6ToN5qKZyJNv3iolYYgx812a5o,1370 diff --git a/libs/waitress-3.0.0.dist-info/WHEEL b/libs/waitress-3.0.0.dist-info/WHEEL index 98c0d20b7..da25d7b42 100644 --- a/libs/waitress-3.0.0.dist-info/WHEEL +++ b/libs/waitress-3.0.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) +Generator: setuptools (75.2.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/websocket/__init__.py b/libs/websocket/__init__.py index 2ff758799..559b38a6b 100644 --- a/libs/websocket/__init__.py +++ b/libs/websocket/__init__.py @@ -2,7 +2,7 @@ __init__.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ limitations under the License. """ from ._abnf import * -from ._app import WebSocketApp, setReconnect +from ._app import WebSocketApp as WebSocketApp, setReconnect as setReconnect from ._core import * from ._exceptions import * from ._logging import * from ._socket import * -__version__ = "1.7.0" +__version__ = "1.8.0" diff --git a/libs/websocket/_abnf.py b/libs/websocket/_abnf.py index 416ebc8ff..d7754e0de 100644 --- a/libs/websocket/_abnf.py +++ b/libs/websocket/_abnf.py @@ -5,14 +5,14 @@ from threading import Lock from typing import Callable, Optional, Union -from ._exceptions import * +from ._exceptions import WebSocketPayloadException, WebSocketProtocolException from ._utils import validate_utf8 """ _abnf.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/libs/websocket/_app.py b/libs/websocket/_app.py index 4d8af3b5b..9fee76546 100644 --- a/libs/websocket/_app.py +++ b/libs/websocket/_app.py @@ -13,13 +13,14 @@ WebSocketException, WebSocketTimeoutException, ) +from ._ssl_compat import SSLEOFError from ._url import parse_url """ _app.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -165,6 +166,7 @@ def __init__( url: str, header: Union[list, dict, Callable, None] = None, on_open: Optional[Callable[[WebSocket], None]] = None, + on_reconnect: Optional[Callable[[WebSocket], None]] = None, on_message: Optional[Callable[[WebSocket, Any], None]] = None, on_error: Optional[Callable[[WebSocket, Any], None]] = None, on_close: Optional[Callable[[WebSocket, Any, Any], None]] = None, @@ -194,6 +196,10 @@ def __init__( Callback object which is called at opening websocket. on_open has one argument. The 1st argument is this class object. + on_reconnect: function + Callback object which is called at reconnecting websocket. + on_reconnect has one argument. + The 1st argument is this class object. on_message: function Callback object which is called when received data. on_message has 2 arguments. @@ -244,6 +250,7 @@ def __init__( self.cookie = cookie self.on_open = on_open + self.on_reconnect = on_reconnect self.on_message = on_message self.on_data = on_data self.on_error = on_error @@ -424,6 +431,7 @@ def run_forever( self.ping_interval = ping_interval self.ping_timeout = ping_timeout self.ping_payload = ping_payload + self.has_done_teardown = False self.keep_running = True def teardown(close_frame: ABNF = None): @@ -495,7 +503,10 @@ def setSock(reconnecting: bool = False) -> None: if self.ping_interval: self._start_ping_thread() - self._callback(self.on_open) + if reconnecting and self.on_reconnect: + self._callback(self.on_reconnect) + else: + self._callback(self.on_open) dispatcher.read(self.sock.sock, read, check) except ( @@ -516,9 +527,10 @@ def read() -> bool: except ( WebSocketConnectionClosedException, KeyboardInterrupt, + SSLEOFError, ) as e: if custom_dispatcher: - return handleDisconnect(e) + return handleDisconnect(e, bool(reconnect)) else: raise e diff --git a/libs/websocket/_cookiejar.py b/libs/websocket/_cookiejar.py index 61079402b..7480e5fc2 100644 --- a/libs/websocket/_cookiejar.py +++ b/libs/websocket/_cookiejar.py @@ -5,7 +5,7 @@ _cookiejar.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -23,13 +23,13 @@ class SimpleCookieJar: def __init__(self) -> None: - self.jar: dict = dict() + self.jar: dict = {} def add(self, set_cookie: Optional[str]) -> None: if set_cookie: - simpleCookie = http.cookies.SimpleCookie(set_cookie) + simple_cookie = http.cookies.SimpleCookie(set_cookie) - for k, v in simpleCookie.items(): + for v in simple_cookie.values(): if domain := v.get("domain"): if not domain.startswith("."): domain = f".{domain}" @@ -38,25 +38,25 @@ def add(self, set_cookie: Optional[str]) -> None: if self.jar.get(domain) else http.cookies.SimpleCookie() ) - cookie.update(simpleCookie) + cookie.update(simple_cookie) self.jar[domain.lower()] = cookie def set(self, set_cookie: str) -> None: if set_cookie: - simpleCookie = http.cookies.SimpleCookie(set_cookie) + simple_cookie = http.cookies.SimpleCookie(set_cookie) - for k, v in simpleCookie.items(): + for v in simple_cookie.values(): if domain := v.get("domain"): if not domain.startswith("."): domain = f".{domain}" - self.jar[domain.lower()] = simpleCookie + self.jar[domain.lower()] = simple_cookie def get(self, host: str) -> str: if not host: return "" cookies = [] - for domain, simpleCookie in self.jar.items(): + for domain, _ in self.jar.items(): host = host.lower() if host.endswith(domain) or host == domain[1:]: cookies.append(self.jar.get(domain)) @@ -66,7 +66,7 @@ def get(self, host: str) -> str: None, sorted( [ - "%s=%s" % (k, v.value) + f"{k}={v.value}" for cookie in filter(None, cookies) for k, v in cookie.items() ] diff --git a/libs/websocket/_core.py b/libs/websocket/_core.py index f28ca4b91..f940ed057 100644 --- a/libs/websocket/_core.py +++ b/libs/websocket/_core.py @@ -5,20 +5,20 @@ from typing import Optional, Union # websocket modules -from ._abnf import * -from ._exceptions import * -from ._handshake import * -from ._http import * -from ._logging import * -from ._socket import * -from ._ssl_compat import * -from ._utils import * +from ._abnf import ABNF, STATUS_NORMAL, continuous_frame, frame_buffer +from ._exceptions import WebSocketProtocolException, WebSocketConnectionClosedException +from ._handshake import SUPPORTED_REDIRECT_STATUSES, handshake +from ._http import connect, proxy_info +from ._logging import debug, error, trace, isEnabledForError, isEnabledForTrace +from ._socket import getdefaulttimeout, recv, send, sock_opt +from ._ssl_compat import ssl +from ._utils import NoLock """ _core.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -259,7 +259,7 @@ def connect(self, url, **options): try: self.handshake_response = handshake(self.sock, url, *addrs, **options) - for attempt in range(options.pop("redirect_limit", 3)): + for _ in range(options.pop("redirect_limit", 3)): if self.handshake_response.status in SUPPORTED_REDIRECT_STATUSES: url = self.handshake_response.headers["location"] self.sock.close() diff --git a/libs/websocket/_exceptions.py b/libs/websocket/_exceptions.py index c146fa5d1..cd196e44a 100644 --- a/libs/websocket/_exceptions.py +++ b/libs/websocket/_exceptions.py @@ -2,7 +2,7 @@ _exceptions.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/libs/websocket/_handshake.py b/libs/websocket/_handshake.py index e63dc9793..7bd61b82f 100644 --- a/libs/websocket/_handshake.py +++ b/libs/websocket/_handshake.py @@ -2,7 +2,7 @@ _handshake.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -23,10 +23,10 @@ from http import HTTPStatus from ._cookiejar import SimpleCookieJar -from ._exceptions import * -from ._http import * -from ._logging import * -from ._socket import * +from ._exceptions import WebSocketException, WebSocketBadStatusException +from ._http import read_headers +from ._logging import dump, error +from ._socket import send __all__ = ["handshake_response", "handshake", "SUPPORTED_REDIRECT_STATUSES"] diff --git a/libs/websocket/_http.py b/libs/websocket/_http.py index 977a30f19..9b1bf859d 100644 --- a/libs/websocket/_http.py +++ b/libs/websocket/_http.py @@ -2,7 +2,7 @@ _http.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,11 +21,15 @@ import socket from base64 import encodebytes as base64encode -from ._exceptions import * -from ._logging import * -from ._socket import * -from ._ssl_compat import * -from ._url import * +from ._exceptions import ( + WebSocketAddressException, + WebSocketException, + WebSocketProxyException, +) +from ._logging import debug, dump, trace +from ._socket import DEFAULT_SOCKET_OPTION, recv_line, send +from ._ssl_compat import HAVE_SSL, ssl +from ._url import get_proxy_info, parse_url __all__ = ["proxy_info", "connect", "read_headers"] @@ -283,22 +287,22 @@ def _wrap_sni_socket(sock: socket.socket, sslopt: dict, hostname, check_hostname def _ssl_socket(sock: socket.socket, user_sslopt: dict, hostname): - sslopt: dict = dict(cert_reqs=ssl.CERT_REQUIRED) + sslopt: dict = {"cert_reqs": ssl.CERT_REQUIRED} sslopt.update(user_sslopt) - certPath = os.environ.get("WEBSOCKET_CLIENT_CA_BUNDLE") + cert_path = os.environ.get("WEBSOCKET_CLIENT_CA_BUNDLE") if ( - certPath - and os.path.isfile(certPath) + cert_path + and os.path.isfile(cert_path) and user_sslopt.get("ca_certs", None) is None ): - sslopt["ca_certs"] = certPath + sslopt["ca_certs"] = cert_path elif ( - certPath - and os.path.isdir(certPath) + cert_path + and os.path.isdir(cert_path) and user_sslopt.get("ca_cert_path", None) is None ): - sslopt["ca_cert_path"] = certPath + sslopt["ca_cert_path"] = cert_path if sslopt.get("server_hostname", None): hostname = sslopt["server_hostname"] @@ -327,7 +331,7 @@ def _tunnel(sock: socket.socket, host, port: int, auth) -> socket.socket: send(sock, connect_header) try: - status, resp_headers, status_message = read_headers(sock) + status, _, _ = read_headers(sock) except Exception as e: raise WebSocketProxyException(str(e)) diff --git a/libs/websocket/_logging.py b/libs/websocket/_logging.py index b88cda374..0f673d3af 100644 --- a/libs/websocket/_logging.py +++ b/libs/websocket/_logging.py @@ -4,7 +4,7 @@ _logging.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/libs/websocket/_socket.py b/libs/websocket/_socket.py index f0ad27a5d..81094ffc8 100644 --- a/libs/websocket/_socket.py +++ b/libs/websocket/_socket.py @@ -3,15 +3,18 @@ import socket from typing import Union -from ._exceptions import * -from ._ssl_compat import * -from ._utils import * +from ._exceptions import ( + WebSocketConnectionClosedException, + WebSocketTimeoutException, +) +from ._ssl_compat import SSLError, SSLWantReadError, SSLWantWriteError +from ._utils import extract_error_code, extract_err_message """ _socket.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/libs/websocket/_ssl_compat.py b/libs/websocket/_ssl_compat.py index 029a5c6e8..0a8a32b59 100644 --- a/libs/websocket/_ssl_compat.py +++ b/libs/websocket/_ssl_compat.py @@ -2,7 +2,7 @@ _ssl_compat.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,11 +16,18 @@ See the License for the specific language governing permissions and limitations under the License. """ -__all__ = ["HAVE_SSL", "ssl", "SSLError", "SSLWantReadError", "SSLWantWriteError"] +__all__ = [ + "HAVE_SSL", + "ssl", + "SSLError", + "SSLEOFError", + "SSLWantReadError", + "SSLWantWriteError", +] try: import ssl - from ssl import SSLError, SSLWantReadError, SSLWantWriteError + from ssl import SSLError, SSLEOFError, SSLWantReadError, SSLWantWriteError HAVE_SSL = True except ImportError: @@ -28,6 +35,9 @@ class SSLError(Exception): pass + class SSLEOFError(Exception): + pass + class SSLWantReadError(Exception): pass diff --git a/libs/websocket/_url.py b/libs/websocket/_url.py index 7d53830e1..902131710 100644 --- a/libs/websocket/_url.py +++ b/libs/websocket/_url.py @@ -3,12 +3,13 @@ import struct from typing import Optional from urllib.parse import unquote, urlparse +from ._exceptions import WebSocketProxyException """ _url.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -167,6 +168,8 @@ def get_proxy_info( return None, 0, None if proxy_host: + if not proxy_port: + raise WebSocketProxyException("Cannot use port 0 when proxy_host specified") port = proxy_port auth = proxy_auth return proxy_host, port, auth diff --git a/libs/websocket/_utils.py b/libs/websocket/_utils.py index c63adfa59..65f3c0daf 100644 --- a/libs/websocket/_utils.py +++ b/libs/websocket/_utils.py @@ -4,7 +4,7 @@ _url.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/libs/websocket/_wsdump.py b/libs/websocket/_wsdump.py index 34c3d127e..d4d76dc50 100644 --- a/libs/websocket/_wsdump.py +++ b/libs/websocket/_wsdump.py @@ -4,7 +4,7 @@ wsdump.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/libs/websocket/tests/echo-server.py b/libs/websocket/tests/echo-server.py index a32c65034..5d1e87087 100644 --- a/libs/websocket/tests/echo-server.py +++ b/libs/websocket/tests/echo-server.py @@ -10,7 +10,7 @@ LOCAL_WS_SERVER_PORT = int(os.environ.get("LOCAL_WS_SERVER_PORT", "8765")) -async def echo(websocket, path): +async def echo(websocket): async for message in websocket: await websocket.send(message) diff --git a/libs/websocket/tests/test_abnf.py b/libs/websocket/tests/test_abnf.py index df5bc6bd7..a749f13bd 100644 --- a/libs/websocket/tests/test_abnf.py +++ b/libs/websocket/tests/test_abnf.py @@ -2,14 +2,14 @@ # import unittest -import websocket as ws -from websocket._abnf import * +from websocket._abnf import ABNF, frame_buffer +from websocket._exceptions import WebSocketProtocolException """ test_abnf.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ class ABNFTest(unittest.TestCase): - def testInit(self): + def test_init(self): a = ABNF(0, 0, 0, 0, opcode=ABNF.OPCODE_PING) self.assertEqual(a.fin, 0) self.assertEqual(a.rsv1, 0) @@ -38,28 +38,28 @@ def testInit(self): self.assertEqual(a_bad.rsv1, 1) self.assertEqual(a_bad.opcode, 77) - def testValidate(self): + def test_validate(self): a_invalid_ping = ABNF(0, 0, 0, 0, opcode=ABNF.OPCODE_PING) self.assertRaises( - ws._exceptions.WebSocketProtocolException, + WebSocketProtocolException, a_invalid_ping.validate, skip_utf8_validation=False, ) a_bad_rsv_value = ABNF(0, 1, 0, 0, opcode=ABNF.OPCODE_TEXT) self.assertRaises( - ws._exceptions.WebSocketProtocolException, + WebSocketProtocolException, a_bad_rsv_value.validate, skip_utf8_validation=False, ) a_bad_opcode = ABNF(0, 0, 0, 0, opcode=77) self.assertRaises( - ws._exceptions.WebSocketProtocolException, + WebSocketProtocolException, a_bad_opcode.validate, skip_utf8_validation=False, ) a_bad_close_frame = ABNF(0, 0, 0, 0, opcode=ABNF.OPCODE_CLOSE, data=b"\x01") self.assertRaises( - ws._exceptions.WebSocketProtocolException, + WebSocketProtocolException, a_bad_close_frame.validate, skip_utf8_validation=False, ) @@ -67,7 +67,7 @@ def testValidate(self): 0, 0, 0, 0, opcode=ABNF.OPCODE_CLOSE, data=b"\x01\x8a\xaa\xff\xdd" ) self.assertRaises( - ws._exceptions.WebSocketProtocolException, + WebSocketProtocolException, a_bad_close_frame_2.validate, skip_utf8_validation=False, ) @@ -75,12 +75,12 @@ def testValidate(self): 0, 0, 0, 0, opcode=ABNF.OPCODE_CLOSE, data=b"\x03\xe7" ) self.assertRaises( - ws._exceptions.WebSocketProtocolException, + WebSocketProtocolException, a_bad_close_frame_3.validate, skip_utf8_validation=True, ) - def testMask(self): + def test_mask(self): abnf_none_data = ABNF( 0, 0, 0, 0, opcode=ABNF.OPCODE_PING, mask_value=1, data=None ) @@ -91,7 +91,7 @@ def testMask(self): ) self.assertEqual(abnf_str_data._get_masked(bytes_val), b"aaaa\x00") - def testFormat(self): + def test_format(self): abnf_bad_rsv_bits = ABNF(2, 0, 0, 0, opcode=ABNF.OPCODE_TEXT) self.assertRaises(ValueError, abnf_bad_rsv_bits.format) abnf_bad_opcode = ABNF(0, 0, 0, 0, opcode=5) @@ -110,7 +110,7 @@ def testFormat(self): ) self.assertEqual(b"\x01\x03\x01\x8a\xcc", abnf_no_mask.format()) - def testFrameBuffer(self): + def test_frame_buffer(self): fb = frame_buffer(0, True) self.assertEqual(fb.recv, 0) self.assertEqual(fb.skip_utf8_validation, True) diff --git a/libs/websocket/tests/test_app.py b/libs/websocket/tests/test_app.py index 5ed9a22ed..18eace544 100644 --- a/libs/websocket/tests/test_app.py +++ b/libs/websocket/tests/test_app.py @@ -12,7 +12,7 @@ test_app.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -53,10 +53,13 @@ def tearDown(self): WebSocketAppTest.get_mask_key_id = WebSocketAppTest.NotSetYet() WebSocketAppTest.on_error_data = WebSocketAppTest.NotSetYet() + def close(self): + pass + @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testKeepRunning(self): + def test_keep_running(self): """A WebSocketApp should keep running as long as its self.keep_running is not False (in the boolean context). """ @@ -69,7 +72,7 @@ def on_open(self, *args, **kwargs): WebSocketAppTest.keep_running_open = self.keep_running self.keep_running = False - def on_message(wsapp, message): + def on_message(_, message): print(message) self.close() @@ -87,7 +90,7 @@ def on_close(self, *args, **kwargs): # @unittest.skipUnless(TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled") @unittest.skipUnless(False, "Test disabled for now (requires rel)") - def testRunForeverDispatcher(self): + def test_run_forever_dispatcher(self): """A WebSocketApp should keep running as long as its self.keep_running is not False (in the boolean context). """ @@ -98,7 +101,7 @@ def on_open(self, *args, **kwargs): self.recv() self.send("goodbye!") - def on_message(wsapp, message): + def on_message(_, message): print(message) self.close() @@ -115,7 +118,7 @@ def on_message(wsapp, message): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testRunForeverTeardownCleanExit(self): + def test_run_forever_teardown_clean_exit(self): """The WebSocketApp.run_forever() method should return `False` when the application ends gracefully.""" app = ws.WebSocketApp(f"ws://127.0.0.1:{LOCAL_WS_SERVER_PORT}") threading.Timer(interval=0.2, function=app.close).start() @@ -123,7 +126,7 @@ def testRunForeverTeardownCleanExit(self): self.assertEqual(teardown, False) @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testSockMaskKey(self): + def test_sock_mask_key(self): """A WebSocketApp should forward the received mask_key function down to the actual socket. """ @@ -140,14 +143,14 @@ def my_mask_key_func(): self.assertEqual(id(app.get_mask_key), id(my_mask_key_func)) @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testInvalidPingIntervalPingTimeout(self): + def test_invalid_ping_interval_ping_timeout(self): """Test exception handling if ping_interval < ping_timeout""" - def on_ping(app, msg): + def on_ping(app, _): print("Got a ping!") app.close() - def on_pong(app, msg): + def on_pong(app, _): print("Got a pong! No need to respond") app.close() @@ -163,14 +166,14 @@ def on_pong(app, msg): ) @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testPingInterval(self): + def test_ping_interval(self): """Test WebSocketApp proper ping functionality""" - def on_ping(app, msg): + def on_ping(app, _): print("Got a ping!") app.close() - def on_pong(app, msg): + def on_pong(app, _): print("Got a pong! No need to respond") app.close() @@ -182,7 +185,7 @@ def on_pong(app, msg): ) @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testOpcodeClose(self): + def test_opcode_close(self): """Test WebSocketApp close opcode""" app = ws.WebSocketApp("wss://tsock.us1.twilio.com/v3/wsconnect") @@ -197,7 +200,7 @@ def testOpcodeClose(self): # app.run_forever(ping_interval=2, ping_timeout=1, ping_payload="Ping payload") @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testBadPingInterval(self): + def test_bad_ping_interval(self): """A WebSocketApp handling of negative ping_interval""" app = ws.WebSocketApp("wss://api-pub.bitfinex.com/ws/1") self.assertRaises( @@ -208,7 +211,7 @@ def testBadPingInterval(self): ) @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testBadPingTimeout(self): + def test_bad_ping_timeout(self): """A WebSocketApp handling of negative ping_timeout""" app = ws.WebSocketApp("wss://api-pub.bitfinex.com/ws/1") self.assertRaises( @@ -219,7 +222,7 @@ def testBadPingTimeout(self): ) @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testCloseStatusCode(self): + def test_close_status_code(self): """Test extraction of close frame status code and close reason in WebSocketApp""" def on_close(wsapp, close_status_code, close_msg): @@ -249,7 +252,7 @@ def on_close(wsapp, close_status_code, close_msg): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testCallbackFunctionException(self): + def test_callback_function_exception(self): """Test callback function exception handling""" exc = None @@ -264,7 +267,7 @@ def on_error(app, err): nonlocal exc exc = err - def on_pong(app, msg): + def on_pong(app, _): app.close() app = ws.WebSocketApp( @@ -282,7 +285,7 @@ def on_pong(app, msg): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testCallbackMethodException(self): + def test_callback_method_exception(self): """Test callback method exception handling""" class Callbacks: @@ -297,14 +300,14 @@ def __init__(self): ) self.app.run_forever(ping_interval=2, ping_timeout=1) - def on_open(self, app): + def on_open(self, _): raise RuntimeError("Callback failed") def on_error(self, app, err): self.passed_app = app self.exc = err - def on_pong(self, app, msg): + def on_pong(self, app, _): app.close() callbacks = Callbacks() @@ -316,16 +319,16 @@ def on_pong(self, app, msg): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testReconnect(self): + def test_reconnect(self): """Test reconnect""" pong_count = 0 exc = None - def on_error(app, err): + def on_error(_, err): nonlocal exc exc = err - def on_pong(app, msg): + def on_pong(app, _): nonlocal pong_count pong_count += 1 if pong_count == 1: diff --git a/libs/websocket/tests/test_cookiejar.py b/libs/websocket/tests/test_cookiejar.py index 0de87517d..67eddb627 100644 --- a/libs/websocket/tests/test_cookiejar.py +++ b/libs/websocket/tests/test_cookiejar.py @@ -6,7 +6,7 @@ test_cookiejar.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ class CookieJarTest(unittest.TestCase): - def testAdd(self): + def test_add(self): cookie_jar = SimpleCookieJar() cookie_jar.add("") self.assertFalse( @@ -67,7 +67,7 @@ def testAdd(self): self.assertEqual(cookie_jar.get("xyz"), "e=f") self.assertEqual(cookie_jar.get("something"), "") - def testSet(self): + def test_set(self): cookie_jar = SimpleCookieJar() cookie_jar.set("a=b") self.assertFalse( @@ -104,7 +104,7 @@ def testSet(self): self.assertEqual(cookie_jar.get("xyz"), "e=f") self.assertEqual(cookie_jar.get("something"), "") - def testGet(self): + def test_get(self): cookie_jar = SimpleCookieJar() cookie_jar.set("a=b; c=d; domain=abc.com") self.assertEqual(cookie_jar.get("abc.com"), "a=b; c=d") diff --git a/libs/websocket/tests/test_http.py b/libs/websocket/tests/test_http.py index 0d6031a3d..f495e6355 100644 --- a/libs/websocket/tests/test_http.py +++ b/libs/websocket/tests/test_http.py @@ -7,7 +7,7 @@ import unittest import websocket -import websocket as ws +from websocket._exceptions import WebSocketProxyException, WebSocketException from websocket._http import ( _get_addrinfo_list, _start_proxied_socket, @@ -15,13 +15,14 @@ connect, proxy_info, read_headers, + HAVE_PYTHON_SOCKS, ) """ test_http.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -93,20 +94,18 @@ def __init__(self): class HttpTest(unittest.TestCase): - def testReadHeader(self): - status, header, status_message = read_headers( - HeaderSockMock("data/header01.txt") - ) + def test_read_header(self): + status, header, _ = read_headers(HeaderSockMock("data/header01.txt")) self.assertEqual(status, 101) self.assertEqual(header["connection"], "Upgrade") # header02.txt is intentionally malformed self.assertRaises( - ws.WebSocketException, read_headers, HeaderSockMock("data/header02.txt") + WebSocketException, read_headers, HeaderSockMock("data/header02.txt") ) - def testTunnel(self): + def test_tunnel(self): self.assertRaises( - ws.WebSocketProxyException, + WebSocketProxyException, _tunnel, HeaderSockMock("data/header01.txt"), "example.com", @@ -114,7 +113,7 @@ def testTunnel(self): ("username", "password"), ) self.assertRaises( - ws.WebSocketProxyException, + WebSocketProxyException, _tunnel, HeaderSockMock("data/header02.txt"), "example.com", @@ -123,9 +122,9 @@ def testTunnel(self): ) @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testConnect(self): + def test_connect(self): # Not currently testing an actual proxy connection, so just check whether proxy errors are raised. This requires internet for a DNS lookup - if ws._http.HAVE_PYTHON_SOCKS: + if HAVE_PYTHON_SOCKS: # Need this check, otherwise case where python_socks is not installed triggers # websocket._exceptions.WebSocketException: Python Socks is needed for SOCKS proxying but is not available self.assertRaises( @@ -244,7 +243,7 @@ def testConnect(self): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testProxyConnect(self): + def test_proxy_connect(self): ws = websocket.WebSocket() ws.connect( f"ws://127.0.0.1:{LOCAL_WS_SERVER_PORT}", @@ -289,7 +288,7 @@ def testProxyConnect(self): # TODO: Test SOCKS4 and SOCK5 proxies with unit tests @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testSSLopt(self): + def test_sslopt(self): ssloptions = { "check_hostname": False, "server_hostname": "ServerName", @@ -315,7 +314,7 @@ def testSSLopt(self): ws_ssl2.connect("wss://api.bitfinex.com/ws/2") ws_ssl2.close - def testProxyInfo(self): + def test_proxy_info(self): self.assertEqual( proxy_info( http_proxy_host="127.0.0.1", http_proxy_port="8080", proxy_type="http" diff --git a/libs/websocket/tests/test_url.py b/libs/websocket/tests/test_url.py index 792399ebf..110fdfad7 100644 --- a/libs/websocket/tests/test_url.py +++ b/libs/websocket/tests/test_url.py @@ -9,12 +9,13 @@ get_proxy_info, parse_url, ) +from websocket._exceptions import WebSocketProxyException """ test_url.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -36,7 +37,7 @@ def test_address_in_network(self): self.assertTrue(_is_address_in_network("127.1.0.1", "127.0.0.0/8")) self.assertFalse(_is_address_in_network("127.1.0.1", "127.0.0.0/24")) - def testParseUrl(self): + def test_parse_url(self): p = parse_url("ws://www.example.com/r") self.assertEqual(p[0], "www.example.com") self.assertEqual(p[1], 80) @@ -130,9 +131,13 @@ def tearDown(self): elif "no_proxy" in os.environ: del os.environ["no_proxy"] - def testMatchAll(self): + def test_match_all(self): self.assertTrue(_is_no_proxy_host("any.websocket.org", ["*"])) self.assertTrue(_is_no_proxy_host("192.168.0.1", ["*"])) + self.assertFalse(_is_no_proxy_host("192.168.0.1", ["192.168.1.1"])) + self.assertFalse( + _is_no_proxy_host("any.websocket.org", ["other.websocket.org"]) + ) self.assertTrue( _is_no_proxy_host("any.websocket.org", ["other.websocket.org", "*"]) ) @@ -142,7 +147,7 @@ def testMatchAll(self): os.environ["no_proxy"] = "other.websocket.org, *" self.assertTrue(_is_no_proxy_host("any.websocket.org", None)) - def testIpAddress(self): + def test_ip_address(self): self.assertTrue(_is_no_proxy_host("127.0.0.1", ["127.0.0.1"])) self.assertFalse(_is_no_proxy_host("127.0.0.2", ["127.0.0.1"])) self.assertTrue( @@ -158,7 +163,7 @@ def testIpAddress(self): self.assertTrue(_is_no_proxy_host("127.0.0.1", None)) self.assertFalse(_is_no_proxy_host("127.0.0.2", None)) - def testIpAddressInRange(self): + def test_ip_address_in_range(self): self.assertTrue(_is_no_proxy_host("127.0.0.1", ["127.0.0.0/8"])) self.assertTrue(_is_no_proxy_host("127.0.0.2", ["127.0.0.0/8"])) self.assertFalse(_is_no_proxy_host("127.1.0.1", ["127.0.0.0/24"])) @@ -168,7 +173,7 @@ def testIpAddressInRange(self): os.environ["no_proxy"] = "127.0.0.0/24" self.assertFalse(_is_no_proxy_host("127.1.0.1", None)) - def testHostnameMatch(self): + def test_hostname_match(self): self.assertTrue(_is_no_proxy_host("my.websocket.org", ["my.websocket.org"])) self.assertTrue( _is_no_proxy_host( @@ -182,7 +187,7 @@ def testHostnameMatch(self): os.environ["no_proxy"] = "other.websocket.org, my.websocket.org" self.assertTrue(_is_no_proxy_host("my.websocket.org", None)) - def testHostnameMatchDomain(self): + def test_hostname_match_domain(self): self.assertTrue(_is_no_proxy_host("any.websocket.org", [".websocket.org"])) self.assertTrue(_is_no_proxy_host("my.other.websocket.org", [".websocket.org"])) self.assertTrue( @@ -227,10 +232,13 @@ def tearDown(self): elif "no_proxy" in os.environ: del os.environ["no_proxy"] - def testProxyFromArgs(self): - self.assertEqual( - get_proxy_info("echo.websocket.events", False, proxy_host="localhost"), - ("localhost", 0, None), + def test_proxy_from_args(self): + self.assertRaises( + WebSocketProxyException, + get_proxy_info, + "echo.websocket.events", + False, + proxy_host="localhost", ) self.assertEqual( get_proxy_info( @@ -238,10 +246,6 @@ def testProxyFromArgs(self): ), ("localhost", 3128, None), ) - self.assertEqual( - get_proxy_info("echo.websocket.events", True, proxy_host="localhost"), - ("localhost", 0, None), - ) self.assertEqual( get_proxy_info( "echo.websocket.events", True, proxy_host="localhost", proxy_port=3128 @@ -254,9 +258,10 @@ def testProxyFromArgs(self): "echo.websocket.events", False, proxy_host="localhost", + proxy_port=9001, proxy_auth=("a", "b"), ), - ("localhost", 0, ("a", "b")), + ("localhost", 9001, ("a", "b")), ) self.assertEqual( get_proxy_info( @@ -273,9 +278,10 @@ def testProxyFromArgs(self): "echo.websocket.events", True, proxy_host="localhost", + proxy_port=8765, proxy_auth=("a", "b"), ), - ("localhost", 0, ("a", "b")), + ("localhost", 8765, ("a", "b")), ) self.assertEqual( get_proxy_info( @@ -311,7 +317,18 @@ def testProxyFromArgs(self): (None, 0, None), ) - def testProxyFromEnv(self): + self.assertEqual( + get_proxy_info( + "echo.websocket.events", + True, + proxy_host="localhost", + proxy_port=3128, + no_proxy=[".websocket.events"], + ), + (None, 0, None), + ) + + def test_proxy_from_env(self): os.environ["http_proxy"] = "http://localhost/" self.assertEqual( get_proxy_info("echo.websocket.events", False), ("localhost", None, None) diff --git a/libs/websocket/tests/test_websocket.py b/libs/websocket/tests/test_websocket.py index 498def578..a1d7ad5be 100644 --- a/libs/websocket/tests/test_websocket.py +++ b/libs/websocket/tests/test_websocket.py @@ -7,6 +7,7 @@ from base64 import decodebytes as base64decode import websocket as ws +from websocket._exceptions import WebSocketBadStatusException, WebSocketAddressException from websocket._handshake import _create_sec_websocket_key from websocket._handshake import _validate as _validate_header from websocket._http import read_headers @@ -16,7 +17,7 @@ test_websocket.py websocket - WebSocket client library for Python -Copyright 2023 engn33r +Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -33,7 +34,6 @@ try: import ssl - from ssl import SSLError except ImportError: # dummy class of SSLError for ssl none-support environment. class SSLError(Exception): @@ -95,24 +95,24 @@ def setUp(self): def tearDown(self): pass - def testDefaultTimeout(self): + def test_default_timeout(self): self.assertEqual(ws.getdefaulttimeout(), None) ws.setdefaulttimeout(10) self.assertEqual(ws.getdefaulttimeout(), 10) ws.setdefaulttimeout(None) - def testWSKey(self): + def test_ws_key(self): key = _create_sec_websocket_key() self.assertTrue(key != 24) self.assertTrue("¥n" not in key) - def testNonce(self): + def test_nonce(self): """WebSocket key should be a random 16-byte nonce.""" key = _create_sec_websocket_key() nonce = base64decode(key.encode("utf-8")) self.assertEqual(16, len(nonce)) - def testWsUtils(self): + def test_ws_utils(self): key = "c6b8hTg4EeGb2gQMztV1/g==" required_header = { "upgrade": "websocket", @@ -157,16 +157,12 @@ def testWsUtils(self): # This case will print out a logging error using the error() function, but that is expected self.assertEqual(_validate_header(header, key, ["Sub1", "suB2"]), (False, None)) - def testReadHeader(self): - status, header, status_message = read_headers( - HeaderSockMock("data/header01.txt") - ) + def test_read_header(self): + status, header, _ = read_headers(HeaderSockMock("data/header01.txt")) self.assertEqual(status, 101) self.assertEqual(header["connection"], "Upgrade") - status, header, status_message = read_headers( - HeaderSockMock("data/header03.txt") - ) + status, header, _ = read_headers(HeaderSockMock("data/header03.txt")) self.assertEqual(status, 101) self.assertEqual(header["connection"], "Upgrade, Keep-Alive") @@ -175,7 +171,7 @@ def testReadHeader(self): ws.WebSocketException, read_headers, HeaderSockMock("data/header02.txt") ) - def testSend(self): + def test_send(self): # TODO: add longer frame data sock = ws.WebSocket() sock.set_mask_key(create_mask_key) @@ -194,7 +190,7 @@ def testSend(self): self.assertEqual(sock.send_binary(b"1111111111101"), 19) - def testRecv(self): + def test_recv(self): # TODO: add longer frame data sock = ws.WebSocket() s = sock.sock = SockMock() @@ -210,7 +206,7 @@ def testRecv(self): self.assertEqual(data, "Hello") @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testIter(self): + def test_iter(self): count = 2 s = ws.create_connection("wss://api.bitfinex.com/ws/2") s.send('{"event": "subscribe", "channel": "ticker"}') @@ -220,11 +216,11 @@ def testIter(self): break @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testNext(self): + def test_next(self): sock = ws.create_connection("wss://api.bitfinex.com/ws/2") self.assertEqual(str, type(next(sock))) - def testInternalRecvStrict(self): + def test_internal_recv_strict(self): sock = ws.WebSocket() s = sock.sock = SockMock() s.add_packet(b"foo") @@ -241,7 +237,7 @@ def testInternalRecvStrict(self): with self.assertRaises(ws.WebSocketConnectionClosedException): sock.frame_buffer.recv_strict(1) - def testRecvTimeout(self): + def test_recv_timeout(self): sock = ws.WebSocket() s = sock.sock = SockMock() s.add_packet(b"\x81") @@ -258,7 +254,7 @@ def testRecvTimeout(self): with self.assertRaises(ws.WebSocketConnectionClosedException): sock.recv() - def testRecvWithSimpleFragmentation(self): + def test_recv_with_simple_fragmentation(self): sock = ws.WebSocket() s = sock.sock = SockMock() # OPCODE=TEXT, FIN=0, MSG="Brevity is " @@ -270,7 +266,7 @@ def testRecvWithSimpleFragmentation(self): with self.assertRaises(ws.WebSocketConnectionClosedException): sock.recv() - def testRecvWithFireEventOfFragmentation(self): + def test_recv_with_fire_event_of_fragmentation(self): sock = ws.WebSocket(fire_cont_frame=True) s = sock.sock = SockMock() # OPCODE=TEXT, FIN=0, MSG="Brevity is " @@ -296,7 +292,7 @@ def testRecvWithFireEventOfFragmentation(self): with self.assertRaises(ws.WebSocketConnectionClosedException): sock.recv() - def testClose(self): + def test_close(self): sock = ws.WebSocket() sock.connected = True sock.close @@ -308,14 +304,14 @@ def testClose(self): sock.recv() self.assertEqual(sock.connected, False) - def testRecvContFragmentation(self): + def test_recv_cont_fragmentation(self): sock = ws.WebSocket() s = sock.sock = SockMock() # OPCODE=CONT, FIN=1, MSG="the soul of wit" s.add_packet(b"\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17") self.assertRaises(ws.WebSocketException, sock.recv) - def testRecvWithProlongedFragmentation(self): + def test_recv_with_prolonged_fragmentation(self): sock = ws.WebSocket() s = sock.sock = SockMock() # OPCODE=TEXT, FIN=0, MSG="Once more unto the breach, " @@ -331,7 +327,7 @@ def testRecvWithProlongedFragmentation(self): with self.assertRaises(ws.WebSocketConnectionClosedException): sock.recv() - def testRecvWithFragmentationAndControlFrame(self): + def test_recv_with_fragmentation_and_control_frame(self): sock = ws.WebSocket() sock.set_mask_key(create_mask_key) s = sock.sock = SockMock() @@ -352,7 +348,7 @@ def testRecvWithFragmentationAndControlFrame(self): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testWebSocket(self): + def test_websocket(self): s = ws.create_connection(f"ws://127.0.0.1:{LOCAL_WS_SERVER_PORT}") self.assertNotEqual(s, None) s.send("Hello, World") @@ -369,7 +365,7 @@ def testWebSocket(self): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testPingPong(self): + def test_ping_pong(self): s = ws.create_connection(f"ws://127.0.0.1:{LOCAL_WS_SERVER_PORT}") self.assertNotEqual(s, None) s.ping("Hello") @@ -377,17 +373,13 @@ def testPingPong(self): s.close() @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testSupportRedirect(self): + def test_support_redirect(self): s = ws.WebSocket() - self.assertRaises( - ws._exceptions.WebSocketBadStatusException, s.connect, "ws://google.com/" - ) + self.assertRaises(WebSocketBadStatusException, s.connect, "ws://google.com/") # Need to find a URL that has a redirect code leading to a websocket @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testSecureWebSocket(self): - import ssl - + def test_secure_websocket(self): s = ws.create_connection("wss://api.bitfinex.com/ws/2") self.assertNotEqual(s, None) self.assertTrue(isinstance(s.sock, ssl.SSLSocket)) @@ -401,7 +393,7 @@ def testSecureWebSocket(self): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testWebSocketWithCustomHeader(self): + def test_websocket_with_custom_header(self): s = ws.create_connection( f"ws://127.0.0.1:{LOCAL_WS_SERVER_PORT}", headers={"User-Agent": "PythonWebsocketClient"}, @@ -417,7 +409,7 @@ def testWebSocketWithCustomHeader(self): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testAfterClose(self): + def test_after_close(self): s = ws.create_connection(f"ws://127.0.0.1:{LOCAL_WS_SERVER_PORT}") self.assertNotEqual(s, None) s.close() @@ -429,7 +421,7 @@ class SockOptTest(unittest.TestCase): @unittest.skipUnless( TEST_WITH_LOCAL_SERVER, "Tests using local websocket server are disabled" ) - def testSockOpt(self): + def test_sockopt(self): sockopt = ((socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),) s = ws.create_connection( f"ws://127.0.0.1:{LOCAL_WS_SERVER_PORT}", sockopt=sockopt @@ -441,7 +433,7 @@ def testSockOpt(self): class UtilsTest(unittest.TestCase): - def testUtf8Validator(self): + def test_utf8_validator(self): state = validate_utf8(b"\xf0\x90\x80\x80") self.assertEqual(state, True) state = validate_utf8( @@ -454,7 +446,7 @@ def testUtf8Validator(self): class HandshakeTest(unittest.TestCase): @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def test_http_SSL(self): + def test_http_ssl(self): websock1 = ws.WebSocket( sslopt={"cert_chain": ssl.get_default_verify_paths().capath}, enable_multithread=False, @@ -466,7 +458,7 @@ def test_http_SSL(self): ) @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled") - def testManualHeaders(self): + def test_manual_headers(self): websock3 = ws.WebSocket( sslopt={ "ca_certs": ssl.get_default_verify_paths().cafile, @@ -474,7 +466,7 @@ def testManualHeaders(self): } ) self.assertRaises( - ws._exceptions.WebSocketBadStatusException, + WebSocketBadStatusException, websock3.connect, "wss://api.bitfinex.com/ws/2", cookie="chocolate", @@ -490,16 +482,14 @@ def testManualHeaders(self): }, ) - def testIPv6(self): + def test_ipv6(self): websock2 = ws.WebSocket() self.assertRaises(ValueError, websock2.connect, "2001:4860:4860::8888") - def testBadURLs(self): + def test_bad_urls(self): websock3 = ws.WebSocket() self.assertRaises(ValueError, websock3.connect, "ws//example.com") - self.assertRaises( - ws.WebSocketAddressException, websock3.connect, "ws://example" - ) + self.assertRaises(WebSocketAddressException, websock3.connect, "ws://example") self.assertRaises(ValueError, websock3.connect, "example.com") diff --git a/libs/websocket_client-1.7.0.dist-info/RECORD b/libs/websocket_client-1.7.0.dist-info/RECORD deleted file mode 100644 index d4c42f22d..000000000 --- a/libs/websocket_client-1.7.0.dist-info/RECORD +++ /dev/null @@ -1,34 +0,0 @@ -../../bin/wsdump,sha256=ODMg_dbnNIbQ5Nu7nTPqahow2IljtBblXYCyuSebVzM,239 -websocket/__init__.py,sha256=S348n01gQDlBuhOc3mP6fGgEPPH2ZVlVoHlhw4aE8F0,801 -websocket/_abnf.py,sha256=6KCnCt_SUu1Wv6zh4BJqNsowjlqeeArEH3pguBQBJIo,14333 -websocket/_app.py,sha256=eWtcdldn0xPwnGkK3qDxpUsRm1RfeN44aBR3GPEkbw8,23614 -websocket/_cookiejar.py,sha256=zYzD7PgnPDc3cGih6rUbacNctBKP9rew5Y5baVerpME,2418 -websocket/_core.py,sha256=eTNHdf_3M5dS15vlqizeyPQJVqaAN-b7AKOSahT5R3M,20819 -websocket/_exceptions.py,sha256=-FmBq5KmekDV07o_UzoDFn2beG-pUcHoqXIuUBV17-8,2178 -websocket/_handshake.py,sha256=9DeOe8Tr9G6idMcvNfEY4l46huTzeogzE-6rIVluhUE,6508 -websocket/_http.py,sha256=Hj2ZcWCf-Y4qkN3ryRx7WiSBoEZ0kiWnwDzoF9wSQSo,12660 -websocket/_logging.py,sha256=7LCmNoWaSeC7x8ge-U2cXf-OKbLrIPKxRFF6O_GTQgg,2228 -websocket/_socket.py,sha256=kwJ9dDjlziL_CpfgIRK9crsb0ckRIVPbl1DkgHTwBnc,5043 -websocket/_ssl_compat.py,sha256=Mmoh73mcHZ0BSmkHuqfegXvqnzGERhTcbnzfXIM2X90,1085 -websocket/_url.py,sha256=VSiyPeW_VXVASZS0ylqW1nxZsBXvqtg-3_OwDJLpnhk,5086 -websocket/_utils.py,sha256=Q5srXsF2qlFe7YUcTNw6toWE2yfDighdS9IsTU4Khco,6961 -websocket/_wsdump.py,sha256=Y57angSaHi-ens8C0nbl3PeQGx2Lb9Z7gqgOFW3MsV8,7010 -websocket/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -websocket/tests/data/header01.txt,sha256=eR9UDpnf7mREys9MttKytzB5OXA5IwOGWJZKmaF4II8,163 -websocket/tests/data/header02.txt,sha256=1HzQGIMG0OGwfnboRkUqwbTEg2nTevOX2Waj0gQARaw,161 -websocket/tests/data/header03.txt,sha256=l_soTbfEWjZTLC5Ydx2U8uj8NJ30IwAc8yo5IUG5fyQ,216 -websocket/tests/echo-server.py,sha256=1FaKzg2V3RFJFWLPxhHdpv6EtGRJeH8AIXIEiElEXkk,488 -websocket/tests/test_abnf.py,sha256=rPK8omNGLNWc7vM2rRWIN4ITiW7Nx0w7DrYOiA9gwP0,4658 -websocket/tests/test_app.py,sha256=gqsYXwYMiysqbPO4AcOV8yhhCVN58tbDxE_e51UewGI,12317 -websocket/tests/test_cookiejar.py,sha256=RDLL84u0Hg6tjJnnyE_y9g1P72x4Wxxo3dimMCuX5aA,4392 -websocket/tests/test_http.py,sha256=QudEl8aGm8YM0ZGhDfYhHXwfDdfXgJQF09QbLJ1H9sA,12427 -websocket/tests/test_url.py,sha256=pHQ-0TiqPc2wCMFS36BOmED6ArEWwbLYIRD5u-S4BUc,17203 -websocket/tests/test_websocket.py,sha256=h_jZIPh3eOtHpYm5P5neiwMv120cc7cgjbwP8AGwi8c,18434 -websocket_client-1.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -websocket_client-1.7.0.dist-info/LICENSE,sha256=Sb7oRCI-MIhpjcBBwnuSektU2hvNPp6Cv7fU9pUU3JU,11339 -websocket_client-1.7.0.dist-info/METADATA,sha256=LeUPkJp3tMwLfRDf607-d7NMc-jvlL3b1pmgeL_ZwXc,7887 -websocket_client-1.7.0.dist-info/RECORD,, -websocket_client-1.7.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -websocket_client-1.7.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -websocket_client-1.7.0.dist-info/entry_points.txt,sha256=IoCGCuANLuLxE3m2QXEd2Ip57qScBjf7RfQnkjn6DNE,50 -websocket_client-1.7.0.dist-info/top_level.txt,sha256=8m_tTpcUlzWGl8v-pj5Wi7XhAFaN1_bLKRHQKCyz5_I,10 diff --git a/libs/websocket_client-1.7.0.dist-info/WHEEL b/libs/websocket_client-1.7.0.dist-info/WHEEL deleted file mode 100644 index ba48cbcf9..000000000 --- a/libs/websocket_client-1.7.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.3) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/websocket_client-1.7.0.dist-info/INSTALLER b/libs/websocket_client-1.8.0.dist-info/INSTALLER similarity index 100% rename from libs/websocket_client-1.7.0.dist-info/INSTALLER rename to libs/websocket_client-1.8.0.dist-info/INSTALLER diff --git a/libs/websocket_client-1.7.0.dist-info/LICENSE b/libs/websocket_client-1.8.0.dist-info/LICENSE similarity index 99% rename from libs/websocket_client-1.7.0.dist-info/LICENSE rename to libs/websocket_client-1.8.0.dist-info/LICENSE index 88a0d3eb1..62a54ca49 100644 --- a/libs/websocket_client-1.7.0.dist-info/LICENSE +++ b/libs/websocket_client-1.8.0.dist-info/LICENSE @@ -187,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2023 engn33r + Copyright 2024 engn33r Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/libs/websocket_client-1.7.0.dist-info/METADATA b/libs/websocket_client-1.8.0.dist-info/METADATA similarity index 95% rename from libs/websocket_client-1.7.0.dist-info/METADATA rename to libs/websocket_client-1.8.0.dist-info/METADATA index 61847cefe..563e5c052 100644 --- a/libs/websocket_client-1.7.0.dist-info/METADATA +++ b/libs/websocket_client-1.8.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: websocket-client -Version: 1.7.0 +Version: 1.8.0 Summary: WebSocket client for Python with low level API options Home-page: https://github.com/websocket-client/websocket-client.git Download-URL: https://github.com/websocket-client/websocket-client/releases @@ -32,6 +32,7 @@ License-File: LICENSE Provides-Extra: docs Requires-Dist: Sphinx >=6.0 ; extra == 'docs' Requires-Dist: sphinx-rtd-theme >=1.1.0 ; extra == 'docs' +Requires-Dist: myst-parser >=2.0.0 ; extra == 'docs' Provides-Extra: optional Requires-Dist: python-socks ; extra == 'optional' Requires-Dist: wsaccel ; extra == 'optional' @@ -66,20 +67,20 @@ Please see the [contribution guidelines](https://github.com/websocket-client/web ## Installation -You can use either `python3 setup.py install` or `pip3 install websocket-client` -to install. This module is tested on Python 3.8+. +You can use `pip install websocket-client` to install, or `pip install -e .` +to install from a local copy of the code. This module is tested on Python 3.8+. There are several optional dependencies that can be installed to enable specific websocket-client features. - To install `python-socks` for proxy usage and `wsaccel` for a minor performance boost, use: - `pip3 install websocket-client[optional]` + `pip install websocket-client[optional]` - To install `websockets` to run unit tests using the local echo server, use: - `pip3 install websocket-client[test]` + `pip install websocket-client[test]` - To install `Sphinx` and `sphinx_rtd_theme` to build project documentation, use: - `pip3 install websocket-client[docs]` + `pip install websocket-client[docs]` While not a strict dependency, [rel](https://github.com/bubbleboy14/registeredeventlistener) -is useful when using `run_forever` with automatic reconnect. Install rel with `pip3 install rel`. +is useful when using `run_forever` with automatic reconnect. Install rel with `pip install rel`. Footnote: Some shells, such as zsh, require you to escape the `[` and `]` characters with a `\`. diff --git a/libs/websocket_client-1.8.0.dist-info/RECORD b/libs/websocket_client-1.8.0.dist-info/RECORD new file mode 100644 index 000000000..d096dcc42 --- /dev/null +++ b/libs/websocket_client-1.8.0.dist-info/RECORD @@ -0,0 +1,34 @@ +../../bin/wsdump,sha256=ODMg_dbnNIbQ5Nu7nTPqahow2IljtBblXYCyuSebVzM,239 +websocket/__init__.py,sha256=GvVpTPkjvhYEGZcjXszSfrs2FaVHudUdGgGSqf_Rbw4,833 +websocket/_abnf.py,sha256=WesUJSSGSRpzuTp0VeK12O4SYYVMN6CyN6bqXS4lk2w,14385 +websocket/_app.py,sha256=xCAlaM2FfsPLsaEsBGXhdg4olHDEEzif6llSWefHcm8,24176 +websocket/_cookiejar.py,sha256=893SWoHmk_JysiXj8lkyLy95co5zvuC62XGMrvmgI7E,2399 +websocket/_core.py,sha256=P-lYcwk-LKJUKDqBleJsmRSIJjX2v_o4FongdJYbhn8,21080 +websocket/_exceptions.py,sha256=r7lGaC8Y2brBnaK_YJJRDdYY6UCGWxOXoQsMcgFFeJ4,2178 +websocket/_handshake.py,sha256=h_88S6vhStOZBj5zMGJtIKFV1RVMVuEskLybjJCnaj4,6578 +websocket/_http.py,sha256=33GsroWgLhOsE8pMC2Xka-RjonPuUypjeFRABFAtQJo,12818 +websocket/_logging.py,sha256=DHRUl4sEaSkolvMo4A6upn7UIYF0kJT5NlAL0vWCHRI,2228 +websocket/_socket.py,sha256=NpsUBO1ihnC-xPA0U2o1-hMXK8eiplNcU9R2VZvZ3qU,5198 +websocket/_ssl_compat.py,sha256=SRPtw1rT3LPSl9q70mCi5hW9h2xS-nIfdcXbjyGi8sE,1188 +websocket/_url.py,sha256=kbEdbdZ-BMMoYQ3sMfcp9QEY1IYrDppIKCpIIHdGVMc,5251 +websocket/_utils.py,sha256=R36FnFTxYVJyKlh-yEaapRxpoK8Xwn9JFXCy2q2haY0,6961 +websocket/_wsdump.py,sha256=kV82LWLlD6d3vzOKOVAEqkfoCA_Qkpd0hc9WN2Tq2kM,7010 +websocket/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +websocket/tests/data/header01.txt,sha256=eR9UDpnf7mREys9MttKytzB5OXA5IwOGWJZKmaF4II8,163 +websocket/tests/data/header02.txt,sha256=1HzQGIMG0OGwfnboRkUqwbTEg2nTevOX2Waj0gQARaw,161 +websocket/tests/data/header03.txt,sha256=l_soTbfEWjZTLC5Ydx2U8uj8NJ30IwAc8yo5IUG5fyQ,216 +websocket/tests/echo-server.py,sha256=yYwKXimgqo6gHFjGgqhkADb6fRncSrF-OewX6UinZVg,482 +websocket/tests/test_abnf.py,sha256=fGZ335DReScT4zSNayl5H8z7MxzJ9NXbiSvt97SJGDI,4629 +websocket/tests/test_app.py,sha256=0YoTjRjcZ2MqG3Hd8-4rfvkPkNA9BUAt1UODkjXu3Y0,12364 +websocket/tests/test_cookiejar.py,sha256=FNm9Hjxu0YBwA8GLRi1GSrAp8jkKzdND6Icm7iIIu_Y,4395 +websocket/tests/test_http.py,sha256=VLqGlXOovB6DGZDnq25c7cOjAWWTJAhhjeKSFYXnLnc,12461 +websocket/tests/test_url.py,sha256=5oONcPf4rU8KSQjDYjNevcnUpOnqUNFmontSiXB5Qd4,17718 +websocket/tests/test_websocket.py,sha256=F5XtOwa_v2JHUE-xOpCWdhUgUYfNbHGErHJKQ0bEsTI,18390 +websocket_client-1.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +websocket_client-1.8.0.dist-info/LICENSE,sha256=RT5qaUJ-2f-SoD7y17Ie8dtB_fVtYjB6SbqFBZ96DGI,11339 +websocket_client-1.8.0.dist-info/METADATA,sha256=mUuXo30suA6pEGGHkoT30gxksNLloIXGTTH1JPE5zjc,7962 +websocket_client-1.8.0.dist-info/RECORD,, +websocket_client-1.8.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +websocket_client-1.8.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +websocket_client-1.8.0.dist-info/entry_points.txt,sha256=IoCGCuANLuLxE3m2QXEd2Ip57qScBjf7RfQnkjn6DNE,50 +websocket_client-1.8.0.dist-info/top_level.txt,sha256=8m_tTpcUlzWGl8v-pj5Wi7XhAFaN1_bLKRHQKCyz5_I,10 diff --git a/libs/websocket_client-1.7.0.dist-info/REQUESTED b/libs/websocket_client-1.8.0.dist-info/REQUESTED similarity index 100% rename from libs/websocket_client-1.7.0.dist-info/REQUESTED rename to libs/websocket_client-1.8.0.dist-info/REQUESTED diff --git a/libs/pytz-2024.1.dist-info/WHEEL b/libs/websocket_client-1.8.0.dist-info/WHEEL similarity index 100% rename from libs/pytz-2024.1.dist-info/WHEEL rename to libs/websocket_client-1.8.0.dist-info/WHEEL diff --git a/libs/websocket_client-1.7.0.dist-info/entry_points.txt b/libs/websocket_client-1.8.0.dist-info/entry_points.txt similarity index 100% rename from libs/websocket_client-1.7.0.dist-info/entry_points.txt rename to libs/websocket_client-1.8.0.dist-info/entry_points.txt diff --git a/libs/websocket_client-1.7.0.dist-info/top_level.txt b/libs/websocket_client-1.8.0.dist-info/top_level.txt similarity index 100% rename from libs/websocket_client-1.7.0.dist-info/top_level.txt rename to libs/websocket_client-1.8.0.dist-info/top_level.txt diff --git a/libs/werkzeug-3.0.1.dist-info/RECORD b/libs/werkzeug-3.0.1.dist-info/RECORD deleted file mode 100644 index 434c1e5ba..000000000 --- a/libs/werkzeug-3.0.1.dist-info/RECORD +++ /dev/null @@ -1,74 +0,0 @@ -werkzeug-3.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -werkzeug-3.0.1.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -werkzeug-3.0.1.dist-info/METADATA,sha256=VFUXbdFj9EGXq7b-oPcd4u7dsYGytx5CE6WAEV8gkCo,4093 -werkzeug-3.0.1.dist-info/RECORD,, -werkzeug-3.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug-3.0.1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -werkzeug/__init__.py,sha256=HX_PSY5E2vtVlD3R4YblwBRCjg7j3Tlm3LASbYqOSkU,727 -werkzeug/_internal.py,sha256=aVz_qPOvQFpvqBaEKdVuCBnJPekok4miXms5xIM4M04,5542 -werkzeug/_reloader.py,sha256=1O1DDWlqVwYIX8kgJwH5B4a_Uh6acQnw3sQf01JpXtM,14745 -werkzeug/datastructures/__init__.py,sha256=yzBdOT9DdK3nraNG49pA3bVsvtPPLx2-t2N8ZmuAd9w,1900 -werkzeug/datastructures/accept.py,sha256=CuCvBAxNzbt4QUb17rH986vvOVGURFUjo0DX2PQy_yI,10670 -werkzeug/datastructures/accept.pyi,sha256=6P114gncjZoy-i_n_3OQy2nJVwjEAIe7PcBxKYqCEfc,1917 -werkzeug/datastructures/auth.py,sha256=8X5XytGDP008Jlj110t8G5h29ntwAyjMH0Mq9PjW6rs,10086 -werkzeug/datastructures/cache_control.py,sha256=RTUipZev50s-1TAn2rYGZrytm_6IOIxQd67fkR5bNF0,6043 -werkzeug/datastructures/cache_control.pyi,sha256=6Q93jRysAKMPWRA72OMksyn7d3ZysuxwGlHp_iwF9pA,3756 -werkzeug/datastructures/csp.py,sha256=DAOAO266LK0JKbvlG80bbkAgfrNsnU9HBoz-FdIYNdo,3244 -werkzeug/datastructures/csp.pyi,sha256=AmDWiZU4rrJA4SZmyMNI1L5PLdIfJsI5Li9r5lE1q6M,5765 -werkzeug/datastructures/etag.py,sha256=JsyI-yXayF-hQu26MyFzbHFIZsaQ6odj3RZO_jF-_cc,2913 -werkzeug/datastructures/etag.pyi,sha256=N9cuUBrZnxHmsbW0BBmjKW-djNY7WKbI6t_WopB8Zo0,1047 -werkzeug/datastructures/file_storage.py,sha256=ePeMtr65s_1_sunXMv_SBOiFof5CX5BepYv5_W16fZk,6184 -werkzeug/datastructures/file_storage.pyi,sha256=2sdbKHhvbQF5FjrJuO6l_m1yZvZ4oPCUTspmdmjQlSU,1433 -werkzeug/datastructures/headers.py,sha256=97-P-LgzterxEwxLbQsBEGiZpCOAXzZ7fExXXd4uH-o,17286 -werkzeug/datastructures/headers.pyi,sha256=66Gh9DbD8QNpLRBOuer4DMCj12csddHrcgxiJPLE5n8,4237 -werkzeug/datastructures/mixins.py,sha256=-IQSQ70UOMQlqtJEIyyhplOd4obaTOfzGvka-cunCtM,5337 -werkzeug/datastructures/mixins.pyi,sha256=y92tClxVslJBEGgAwDRsQLExfin2p0x7NfnP_b8w6xc,4191 -werkzeug/datastructures/range.py,sha256=JXSDPseG7iH5giJp3R1SnQC_SqQp634M8Iv6QTsbTxM,5669 -werkzeug/datastructures/range.pyi,sha256=bsM61iNp86gT2lyN0F_Dqg8xsnfPerdmElipuHppiJQ,1792 -werkzeug/datastructures/structures.py,sha256=_bhAf0adEk6WU2uy8jdmuxFMTFcuClY1p7jQ-3wYXj4,31761 -werkzeug/datastructures/structures.pyi,sha256=MRg-RubT3UPjh62i9-7Xht8DVL0zTApRzjs52Hfz_j4,8148 -werkzeug/debug/__init__.py,sha256=WRTLJSvnuK6jlBuQLllTnN57th0HKPjxbS7-d8QJZIc,18760 -werkzeug/debug/console.py,sha256=FIO8gDX2eQ1_4MtpJ4s0i2gR4fFCJZTPwhSVByF4kbo,6068 -werkzeug/debug/repr.py,sha256=ECmIpNVlCppTfCuIuEgrJVfuhr8iDqPSWeVJyxt1QOM,9328 -werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222 -werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 -werkzeug/debug/shared/debugger.js,sha256=FVBBUirz4kKedIbM08QQCYeEoicoSbnm4BnBF4dCYfA,10562 -werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 -werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 -werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078 -werkzeug/debug/tbtools.py,sha256=8Xg7p2JzCC1AMWuse5HYc594OdzC5ToeJbNk49_zZCc,13271 -werkzeug/exceptions.py,sha256=d6VNzGcVgLazIpfwRD8pN_d3yAJNyngBDFvlXQbR-38,26062 -werkzeug/formparser.py,sha256=sCEK0h4lM7Z4UZ8ROYuXQpc0dNTsSo7-ABk9_uHgBFY,15247 -werkzeug/http.py,sha256=oDCppI-07PHsAE2Taxf3wFMWp3LYOjt1VO2EMz_nCYg,43363 -werkzeug/local.py,sha256=Jawgwa7Q7orExtyzVlhbh-4mGWg3v63bspIU5Nnl-DU,22003 -werkzeug/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug/middleware/dispatcher.py,sha256=6ltzPtDsIdLTY_T1GW6kxBJL0KZftbipa_WVdKtpVQ8,2601 -werkzeug/middleware/http_proxy.py,sha256=vsSvt84m656x3mV_Fj78y7O2eYHmurWngErTcjeiz8U,7833 -werkzeug/middleware/lint.py,sha256=6CqcwMWro1p-GRUGPgQ1n21KFnTTqc6-81CGTzpcK74,13916 -werkzeug/middleware/profiler.py,sha256=r0BtSk_iLY4JdkjfsXlUnALogjrQSJ2ja-wPDuJN6sw,5561 -werkzeug/middleware/proxy_fix.py,sha256=dcOOSjSok2QsSh1VSNsw-a0Vy_Jn5DunlO6PRbXBq0A,6754 -werkzeug/middleware/shared_data.py,sha256=DeM8OouhfhZs8w5T7Wxw-uKuOHXoH0x5RopzxR2RRjI,9513 -werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug/routing/__init__.py,sha256=HpvahY7WwkLdV4Cq3Bsc3GrqNon4u6t8-vhbb9E5o00,4819 -werkzeug/routing/converters.py,sha256=nEWOaAfeZWPJMneegi91e0L1MhuH7hmyKoxGNJ6QKW8,7249 -werkzeug/routing/exceptions.py,sha256=yGZ5AUL-buHp-vK8AJbZ0bLIbSckh1UyiGKgRg4ZjaA,4698 -werkzeug/routing/map.py,sha256=ag-ZqsuH8PvWWlFO3mwUNIFEF3t6JeLwxvLP81k7qj0,36350 -werkzeug/routing/matcher.py,sha256=FyPG45iqR1XwxFujejSqfNEKV7IgbR2td7Jp-ocSASY,7817 -werkzeug/routing/rules.py,sha256=F8S1sXXG2QZzmOqBKMWjpQPBNqFpmINDBLn0Yu0FyCE,31895 -werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug/sansio/http.py,sha256=EZIQJSO6cQfLA_ApVY-bLrVa52x_chCwFYew25eCgRA,5320 -werkzeug/sansio/multipart.py,sha256=u_XLs68tvP2AO704Yq5zZg7ZN0A33SQaZfQE40gsduo,11490 -werkzeug/sansio/request.py,sha256=Y-Q7zQGTpn3XOY-3_68dYPgUcV9uuhSNI9I9aw2n0LA,19954 -werkzeug/sansio/response.py,sha256=CurS5HqPJRt_vCsUuIYa2EOGciUW8GUkIVdpKac6bYo,27647 -werkzeug/sansio/utils.py,sha256=LYgmrN7yr04ZDVk5flPcUJLo1rDnTzhF04OH3-ujCWQ,4950 -werkzeug/security.py,sha256=5ttgIiVZxNtbP7Hao1aCmcL0nPtgNt6UyPDjaPAr1aU,5294 -werkzeug/serving.py,sha256=wjw7TMvCQHzxmHXDrNGQYetP4gYRTbLRo0XRhXIBUCQ,39332 -werkzeug/test.py,sha256=aaU1kP1JTx0RQRRKPH6h9NiO6wqg89APsr9lo44flPw,52633 -werkzeug/testapp.py,sha256=Q7SXVDXeXnnXo7-TWVoAJCTF2GnXxoH-v5_pvjUyTWc,6135 -werkzeug/urls.py,sha256=7rvnhTmjJ9X_VVJO1aMj9V-yDzOIVpgGnLWLR0VhIPw,6849 -werkzeug/user_agent.py,sha256=lSlLYKCcbzCUSkbdAoO8zPk2UR-8Mdn6iu_iA2kYPBA,1416 -werkzeug/utils.py,sha256=DYkOtfDR_Wc3ro3_peReo9KkUC-6yhOvz27_PUAckbA,24654 -werkzeug/wrappers/__init__.py,sha256=kGyK7rOud3qCxll_jFyW15YarJhj1xtdf3ocx9ZheB8,120 -werkzeug/wrappers/request.py,sha256=mIURGEyuGrYhtLJ3roPn8-hyliVuRbSIlwyFsfDHuVQ,24620 -werkzeug/wrappers/response.py,sha256=aiEoV3pHugfcw-1SXjQ8b2t2VeGlDiKGC88fZbaKXPY,32587 -werkzeug/wsgi.py,sha256=P7jB0VpG6X6miies4uk7Zgm7NVm4Yz8Ra6Inr5q_FMs,20894 diff --git a/libs/werkzeug-3.0.1.dist-info/INSTALLER b/libs/werkzeug-3.0.6.dist-info/INSTALLER similarity index 100% rename from libs/werkzeug-3.0.1.dist-info/INSTALLER rename to libs/werkzeug-3.0.6.dist-info/INSTALLER diff --git a/libs/werkzeug-3.0.1.dist-info/LICENSE.rst b/libs/werkzeug-3.0.6.dist-info/LICENSE.txt similarity index 100% rename from libs/werkzeug-3.0.1.dist-info/LICENSE.rst rename to libs/werkzeug-3.0.6.dist-info/LICENSE.txt diff --git a/libs/werkzeug-3.0.1.dist-info/METADATA b/libs/werkzeug-3.0.6.dist-info/METADATA similarity index 69% rename from libs/werkzeug-3.0.1.dist-info/METADATA rename to libs/werkzeug-3.0.6.dist-info/METADATA index 8565ec99d..b7cfe0a10 100644 --- a/libs/werkzeug-3.0.1.dist-info/METADATA +++ b/libs/werkzeug-3.0.6.dist-info/METADATA @@ -1,10 +1,10 @@ Metadata-Version: 2.1 Name: Werkzeug -Version: 3.0.1 +Version: 3.0.6 Summary: The comprehensive WSGI web application library. Maintainer-email: Pallets <contact@palletsprojects.com> Requires-Python: >=3.8 -Description-Content-Type: text/x-rst +Description-Content-Type: text/markdown Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers @@ -16,6 +16,7 @@ Classifier: Topic :: Internet :: WWW/HTTP :: WSGI Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Typing :: Typed Requires-Dist: MarkupSafe>=2.1.1 Requires-Dist: watchdog>=2.3 ; extra == "watchdog" Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/ @@ -26,12 +27,11 @@ Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/ Project-URL: Source Code, https://github.com/pallets/werkzeug/ Provides-Extra: watchdog -Werkzeug -======== +# Werkzeug *werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") -Werkzeug is a comprehensive `WSGI`_ web application library. It began as +Werkzeug is a comprehensive [WSGI][] web application library. It began as a simple collection of various utilities for WSGI applications and has become one of the most advanced WSGI utility libraries. @@ -59,60 +59,41 @@ choose a template engine, database adapter, and even how to handle requests. It can be used to build all sorts of end user applications such as blogs, wikis, or bulletin boards. -`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +[Flask][] wraps Werkzeug, using it to handle the details of WSGI while providing more structure and patterns for defining powerful applications. -.. _WSGI: https://wsgi.readthedocs.io/en/latest/ -.. _Flask: https://www.palletsprojects.com/p/flask/ +[WSGI]: https://wsgi.readthedocs.io/en/latest/ +[Flask]: https://www.palletsprojects.com/p/flask/ -Installing ----------- +## A Simple Example -Install and update using `pip`_: +```python +# save this as app.py +from werkzeug.wrappers import Request, Response -.. code-block:: text +@Request.application +def application(request: Request) -> Response: + return Response("Hello, World!") - pip install -U Werkzeug +if __name__ == "__main__": + from werkzeug.serving import run_simple + run_simple("127.0.0.1", 5000, application) +``` -.. _pip: https://pip.pypa.io/en/stable/getting-started/ +``` +$ python -m app + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) +``` -A Simple Example ----------------- - -.. code-block:: python - - from werkzeug.wrappers import Request, Response - - @Request.application - def application(request): - return Response('Hello, World!') - - if __name__ == '__main__': - from werkzeug.serving import run_simple - run_simple('localhost', 4000, application) - - -Donate ------- +## Donate The Pallets organization develops and supports Werkzeug 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 ------ +[please donate today][]. -- Documentation: https://werkzeug.palletsprojects.com/ -- Changes: https://werkzeug.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/Werkzeug/ -- Source Code: https://github.com/pallets/werkzeug/ -- Issue Tracker: https://github.com/pallets/werkzeug/issues/ -- Chat: https://discord.gg/pallets +[please donate today]: https://palletsprojects.com/donate diff --git a/libs/werkzeug-3.0.6.dist-info/RECORD b/libs/werkzeug-3.0.6.dist-info/RECORD new file mode 100644 index 000000000..64d539c77 --- /dev/null +++ b/libs/werkzeug-3.0.6.dist-info/RECORD @@ -0,0 +1,74 @@ +werkzeug-3.0.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +werkzeug-3.0.6.dist-info/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +werkzeug-3.0.6.dist-info/METADATA,sha256=im31HsOnwlqXdpNMK9QeIqZNo8hRiVBl7pCusz3C8sU,3682 +werkzeug-3.0.6.dist-info/RECORD,, +werkzeug-3.0.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug-3.0.6.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +werkzeug/__init__.py,sha256=HX_PSY5E2vtVlD3R4YblwBRCjg7j3Tlm3LASbYqOSkU,727 +werkzeug/_internal.py,sha256=su1olkbHMkzt0VKcEkPLCha8sdVzXNBuqW6YVpp8GHg,5545 +werkzeug/_reloader.py,sha256=QuMO-UwuD-cHsUpwSEUr7iYNbv_ziHFhgNDAiv25J80,15429 +werkzeug/datastructures/__init__.py,sha256=yzBdOT9DdK3nraNG49pA3bVsvtPPLx2-t2N8ZmuAd9w,1900 +werkzeug/datastructures/accept.py,sha256=CuCvBAxNzbt4QUb17rH986vvOVGURFUjo0DX2PQy_yI,10670 +werkzeug/datastructures/accept.pyi,sha256=6P114gncjZoy-i_n_3OQy2nJVwjEAIe7PcBxKYqCEfc,1917 +werkzeug/datastructures/auth.py,sha256=tZz0wZ1sIpIcAQoEAVhrUvy8M3kqKvIytmvGvwkAdxo,10021 +werkzeug/datastructures/cache_control.py,sha256=RTUipZev50s-1TAn2rYGZrytm_6IOIxQd67fkR5bNF0,6043 +werkzeug/datastructures/cache_control.pyi,sha256=NI5myF8f4yzgiqOHJANgp6XtT8SGCWI_GBp5JuH3NIs,3870 +werkzeug/datastructures/csp.py,sha256=DAOAO266LK0JKbvlG80bbkAgfrNsnU9HBoz-FdIYNdo,3244 +werkzeug/datastructures/csp.pyi,sha256=AmDWiZU4rrJA4SZmyMNI1L5PLdIfJsI5Li9r5lE1q6M,5765 +werkzeug/datastructures/etag.py,sha256=JsyI-yXayF-hQu26MyFzbHFIZsaQ6odj3RZO_jF-_cc,2913 +werkzeug/datastructures/etag.pyi,sha256=N9cuUBrZnxHmsbW0BBmjKW-djNY7WKbI6t_WopB8Zo0,1047 +werkzeug/datastructures/file_storage.py,sha256=ePeMtr65s_1_sunXMv_SBOiFof5CX5BepYv5_W16fZk,6184 +werkzeug/datastructures/file_storage.pyi,sha256=PvUx7s2U3ifIf2YxMUhFtZFdkLFderInKG1U3VWwM9E,1457 +werkzeug/datastructures/headers.py,sha256=97-P-LgzterxEwxLbQsBEGiZpCOAXzZ7fExXXd4uH-o,17286 +werkzeug/datastructures/headers.pyi,sha256=66Gh9DbD8QNpLRBOuer4DMCj12csddHrcgxiJPLE5n8,4237 +werkzeug/datastructures/mixins.py,sha256=-IQSQ70UOMQlqtJEIyyhplOd4obaTOfzGvka-cunCtM,5337 +werkzeug/datastructures/mixins.pyi,sha256=Axe16elbs9zSOK9IuXIGs08ukgqSSPCxXFEjB_ACYSM,4189 +werkzeug/datastructures/range.py,sha256=JXSDPseG7iH5giJp3R1SnQC_SqQp634M8Iv6QTsbTxM,5669 +werkzeug/datastructures/range.pyi,sha256=bsM61iNp86gT2lyN0F_Dqg8xsnfPerdmElipuHppiJQ,1792 +werkzeug/datastructures/structures.py,sha256=8nRqvwHM8moZj_fEaxOqF-N7lguoXgnNJeT2l9LX7xA,31917 +werkzeug/datastructures/structures.pyi,sha256=9NeGm8NDS-x3XmE2ZP9676tKvQfo5G9GGvIlfV4v3aY,8237 +werkzeug/debug/__init__.py,sha256=80vaavVZYwV21ItrsOLQudEUi2uKDlxcjm5cCmeU1u4,20016 +werkzeug/debug/console.py,sha256=t4hZ0Qg1p6Uu2MWimqoMDi7S3WYZvLMjnc8v_dPaxAo,6089 +werkzeug/debug/repr.py,sha256=iHMYny8whiiMDasvUqj0nm4-1VHVvwe697KleiZVK1s,9303 +werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=SRL9YZ9FTVngaYD-INQNincEVdZ-kBHa_-VJx0U7-rg,10068 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/style.css,sha256=-xSxzUEZGw_IqlDR5iZxitNl8LQUjBM-_Y4UAvXVH8g,6078 +werkzeug/debug/tbtools.py,sha256=p25f0gP9V2GCzwxJxdxMcbTz0GkcG7_DkN8tFBLkP9k,13553 +werkzeug/exceptions.py,sha256=SX3MUTqvWVyA9SnfMPxowNPu5beR9DyrmbUJ4AD2XT0,26160 +werkzeug/formparser.py,sha256=mkrP8j4CYxthuYtNRPsSn_xxzspLLJRlcjgpPNAGBbo,15849 +werkzeug/http.py,sha256=18eD84Lys8tIQVyzlSfaxSMmkU_utOEFoND_kHhhfcM,44452 +werkzeug/local.py,sha256=KUFuAm8BAayQouzVg0MGqW_hiwY8Z_lY5l7d1Scvsx8,22492 +werkzeug/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/middleware/dispatcher.py,sha256=zWN5_lqJr_sc9UDv-PPoSlDHN_zR33z6B74F_4Cxpo8,2602 +werkzeug/middleware/http_proxy.py,sha256=sdk-V6GoZ6aMny-D0QNKNf5MWD2OTO3AGbBg6upp4Hc,7834 +werkzeug/middleware/lint.py,sha256=lwsZhyDNTnsNr4D8dqsgG8Akp7YP9D_X49SCiZucE04,14478 +werkzeug/middleware/profiler.py,sha256=1ZAHlDeYNdhgp8THOXkV5lgmcLl307phAr2Ufy30-lY,5562 +werkzeug/middleware/proxy_fix.py,sha256=n-HW-MRWJquCIhmqiZKoGdbbEeHuWJqPRHhFpuj4pzY,6755 +werkzeug/middleware/shared_data.py,sha256=G28bG3rzrP6R0kODOsbFfWOj5Xcc_qIOVu1VNVl8iW0,9546 +werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/routing/__init__.py,sha256=d8TRxsk24IWu2BdoOYUfL--deolHwiGVCBJqLoEe3YM,4820 +werkzeug/routing/converters.py,sha256=iqpee_mAjr1oGbq0etujYF9PiDv5U7DgNkARHXnMId0,7297 +werkzeug/routing/exceptions.py,sha256=wNBiUmUk4OtFOpbdDSr7KKKUjH7yn84JqwBicUup8p8,4846 +werkzeug/routing/map.py,sha256=mEXlHOyinkg1Jtx5L0UDYsvoX4eVLiEuEVQzD5LVAz8,36515 +werkzeug/routing/matcher.py,sha256=nfBbl37eGAkZ1dQlumshFcPuyfggmFjPuSSQOE6GuYs,7849 +werkzeug/routing/rules.py,sha256=eGi6PD-COG2As_HY0nAw-nxYxLTH0FsuqRaSy8d9FjQ,32510 +werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/sansio/http.py,sha256=_5fVKoogLUyNH5O2BnKty6dFB1p4REBZieJ4vYoOUOA,5370 +werkzeug/sansio/multipart.py,sha256=fMGgY9CvMDRgNgKozz2cBIp0iN2EME2IIOBh306_Ecs,11637 +werkzeug/sansio/request.py,sha256=MI59ROX1P_Y6F4FkCLjaV9hwPEXE7aTTqaVphiTw4UA,19983 +werkzeug/sansio/response.py,sha256=uhKYuDy5-Q5v0Mk5VIxiF-Xob9vfGdDzWiJG7J7MYYc,27585 +werkzeug/sansio/utils.py,sha256=Y7zkEmIvBLtVvgwSdtBhFpGqCclBtYx7GUhckiRSyhI,4957 +werkzeug/security.py,sha256=W56YSXPBE6H5TkyhnPmjk1PUo9XCV63CCw9I2CHgGzQ,5479 +werkzeug/serving.py,sha256=Yb4WgEtaLY2QK0X-_CknmIgrnoraGP2DbZFbQDuv_QQ,39859 +werkzeug/test.py,sha256=kMEWtC_bZ5LqvBya-Pvtq1Jvtb4RR_t7pBp27_4JpJo,52782 +werkzeug/testapp.py,sha256=5_IS5Dh_WfWfNcTLmbydj01lomgcKA_4l9PPCNZnmdI,6332 +werkzeug/urls.py,sha256=XyNKwHvK5IC37-wuIDMYWkiCJ3yLTLGv7wn2GF3ndqI,6430 +werkzeug/user_agent.py,sha256=lSlLYKCcbzCUSkbdAoO8zPk2UR-8Mdn6iu_iA2kYPBA,1416 +werkzeug/utils.py,sha256=6iV_-JdFaLXG6bCR3FMSMyUY0HCnsdzlKirANavAXkk,24699 +werkzeug/wrappers/__init__.py,sha256=b78jCM8x96kJUGLZ5FYFR3zlK-3pnFAmP9RJIGU0ses,138 +werkzeug/wrappers/request.py,sha256=dvsuukldNLz5tiwyrbcethow903DA4wmQ7McR0RQgjk,24645 +werkzeug/wrappers/response.py,sha256=u6zg7VpNYrCeEjpIgf8VqgfaSi9yR_9wi9ly2uudglg,32459 +werkzeug/wsgi.py,sha256=P7jB0VpG6X6miies4uk7Zgm7NVm4Yz8Ra6Inr5q_FMs,20894 diff --git a/libs/werkzeug-3.0.1.dist-info/REQUESTED b/libs/werkzeug-3.0.6.dist-info/REQUESTED similarity index 100% rename from libs/werkzeug-3.0.1.dist-info/REQUESTED rename to libs/werkzeug-3.0.6.dist-info/REQUESTED diff --git a/libs/werkzeug-3.0.6.dist-info/WHEEL b/libs/werkzeug-3.0.6.dist-info/WHEEL new file mode 100644 index 000000000..3b5e64b5e --- /dev/null +++ b/libs/werkzeug-3.0.6.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/libs/werkzeug/_internal.py b/libs/werkzeug/_internal.py index 70ab68761..7dd2fbccd 100644 --- a/libs/werkzeug/_internal.py +++ b/libs/werkzeug/_internal.py @@ -9,6 +9,7 @@ if t.TYPE_CHECKING: from _typeshed.wsgi import WSGIEnvironment + from .wrappers.request import Request _logger: logging.Logger | None = None @@ -60,7 +61,7 @@ def _has_level_handler(logger: logging.Logger) -> bool: return False -class _ColorStreamHandler(logging.StreamHandler): +class _ColorStreamHandler(logging.StreamHandler): # type: ignore[type-arg] """On Windows, wrap stream with Colorama for ANSI style support.""" def __init__(self) -> None: @@ -97,13 +98,11 @@ def _log(type: str, message: str, *args: t.Any, **kwargs: t.Any) -> None: @t.overload -def _dt_as_utc(dt: None) -> None: - ... +def _dt_as_utc(dt: None) -> None: ... @t.overload -def _dt_as_utc(dt: datetime) -> datetime: - ... +def _dt_as_utc(dt: datetime) -> datetime: ... def _dt_as_utc(dt: datetime | None) -> datetime | None: @@ -149,12 +148,10 @@ def lookup(self, instance: t.Any) -> t.MutableMapping[str, t.Any]: @t.overload def __get__( self, instance: None, owner: type - ) -> _DictAccessorProperty[_TAccessorValue]: - ... + ) -> _DictAccessorProperty[_TAccessorValue]: ... @t.overload - def __get__(self, instance: t.Any, owner: type) -> _TAccessorValue: - ... + def __get__(self, instance: t.Any, owner: type) -> _TAccessorValue: ... def __get__( self, instance: t.Any | None, owner: type diff --git a/libs/werkzeug/_reloader.py b/libs/werkzeug/_reloader.py index c8683593f..8fd50b963 100644 --- a/libs/werkzeug/_reloader.py +++ b/libs/werkzeug/_reloader.py @@ -141,7 +141,7 @@ def _find_watchdog_paths( def _find_common_roots(paths: t.Iterable[str]) -> t.Iterable[str]: - root: dict[str, dict] = {} + root: dict[str, dict[str, t.Any]] = {} for chunks in sorted((PurePath(x).parts for x in paths), key=len, reverse=True): node = root @@ -153,11 +153,13 @@ def _find_common_roots(paths: t.Iterable[str]) -> t.Iterable[str]: rv = set() - def _walk(node: t.Mapping[str, dict], path: tuple[str, ...]) -> None: + def _walk(node: t.Mapping[str, dict[str, t.Any]], path: tuple[str, ...]) -> None: for prefix, child in node.items(): _walk(child, path + (prefix,)) - if not node: + # If there are no more nodes, and a path has been accumulated, add it. + # Path may be empty if the "" entry is in sys.path. + if not node and path: rv.add(os.path.join(*path)) _walk(root, ()) @@ -279,7 +281,7 @@ def trigger_reload(self, filename: str) -> None: self.log_reload(filename) sys.exit(3) - def log_reload(self, filename: str) -> None: + def log_reload(self, filename: str | bytes) -> None: filename = os.path.abspath(filename) _log("info", f" * Detected change in {filename!r}, reloading") @@ -310,17 +312,28 @@ def run_step(self) -> None: class WatchdogReloaderLoop(ReloaderLoop): def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: - from watchdog.observers import Observer - from watchdog.events import PatternMatchingEventHandler - from watchdog.events import EVENT_TYPE_OPENED + from watchdog.events import EVENT_TYPE_CLOSED + from watchdog.events import EVENT_TYPE_CREATED + from watchdog.events import EVENT_TYPE_DELETED + from watchdog.events import EVENT_TYPE_MODIFIED + from watchdog.events import EVENT_TYPE_MOVED from watchdog.events import FileModifiedEvent + from watchdog.events import PatternMatchingEventHandler + from watchdog.observers import Observer super().__init__(*args, **kwargs) trigger_reload = self.trigger_reload class EventHandler(PatternMatchingEventHandler): def on_any_event(self, event: FileModifiedEvent): # type: ignore - if event.event_type == EVENT_TYPE_OPENED: + if event.event_type not in { + EVENT_TYPE_CLOSED, + EVENT_TYPE_CREATED, + EVENT_TYPE_DELETED, + EVENT_TYPE_MODIFIED, + EVENT_TYPE_MOVED, + }: + # skip events that don't involve changes to the file return trigger_reload(event.src_path) @@ -347,7 +360,7 @@ def on_any_event(self, event: FileModifiedEvent): # type: ignore ) self.should_reload = False - def trigger_reload(self, filename: str) -> None: + def trigger_reload(self, filename: str | bytes) -> None: # This is called inside an event handler, which means throwing # SystemExit has no effect. # https://github.com/gorakhargosh/watchdog/issues/294 diff --git a/libs/werkzeug/datastructures/auth.py b/libs/werkzeug/datastructures/auth.py index 494576ded..a3ca0de46 100644 --- a/libs/werkzeug/datastructures/auth.py +++ b/libs/werkzeug/datastructures/auth.py @@ -124,7 +124,7 @@ def to_header(self) -> str: if self.type == "basic": value = base64.b64encode( f"{self.username}:{self.password}".encode() - ).decode("utf8") + ).decode("ascii") return f"Basic {value}" if self.token is not None: @@ -172,7 +172,7 @@ def __init__( token: str | None = None, ): self._type = auth_type.lower() - self._parameters: dict[str, str | None] = CallbackDict( # type: ignore[misc] + self._parameters: dict[str, str | None] = CallbackDict( values, lambda _: self._trigger_on_update() ) self._token = token @@ -201,9 +201,7 @@ def parameters(self) -> dict[str, str | None]: @parameters.setter def parameters(self, value: dict[str, str]) -> None: - self._parameters = CallbackDict( # type: ignore[misc] - value, lambda _: self._trigger_on_update() - ) + self._parameters = CallbackDict(value, lambda _: self._trigger_on_update()) self._trigger_on_update() @property diff --git a/libs/werkzeug/datastructures/cache_control.pyi b/libs/werkzeug/datastructures/cache_control.pyi index 06fe667a2..54ec02082 100644 --- a/libs/werkzeug/datastructures/cache_control.pyi +++ b/libs/werkzeug/datastructures/cache_control.pyi @@ -8,15 +8,19 @@ from .mixins import UpdateDictMixin T = TypeVar("T") _CPT = TypeVar("_CPT", str, int, bool) -_OptCPT = _CPT | None -def cache_control_property(key: str, empty: _OptCPT, type: type[_CPT]) -> property: ... +def cache_control_property( + key: str, empty: _CPT | None, type: type[_CPT] +) -> property: ... -class _CacheControl(UpdateDictMixin[str, _OptCPT], dict[str, _OptCPT]): +class _CacheControl( + UpdateDictMixin[str, str | int | bool | None], dict[str, str | int | bool | None] +): provided: bool def __init__( self, - values: Mapping[str, _OptCPT] | Iterable[tuple[str, _OptCPT]] = (), + values: Mapping[str, str | int | bool | None] + | Iterable[tuple[str, str | int | bool | None]] = (), on_update: Callable[[_CacheControl], None] | None = None, ) -> None: ... @property @@ -48,9 +52,11 @@ class _CacheControl(UpdateDictMixin[str, _OptCPT], dict[str, _OptCPT]): def _del_cache_value(self, key: str) -> None: ... def to_header(self) -> str: ... @staticmethod - def cache_property(key: str, empty: _OptCPT, type: type[_CPT]) -> property: ... + def cache_property(key: str, empty: _CPT | None, type: type[_CPT]) -> property: ... -class RequestCacheControl(ImmutableDictMixin[str, _OptCPT], _CacheControl): +class RequestCacheControl( # type: ignore[misc] + ImmutableDictMixin[str, str | int | bool | None], _CacheControl +): @property def max_stale(self) -> int | None: ... @max_stale.setter diff --git a/libs/werkzeug/datastructures/file_storage.pyi b/libs/werkzeug/datastructures/file_storage.pyi index 730789e35..36a7ed9f2 100644 --- a/libs/werkzeug/datastructures/file_storage.pyi +++ b/libs/werkzeug/datastructures/file_storage.pyi @@ -15,7 +15,7 @@ class FileStorage: def __init__( self, stream: IO[bytes] | None = None, - filename: str | PathLike | None = None, + filename: str | PathLike[str] | None = None, name: str | None = None, content_type: str | None = None, content_length: int | None = None, @@ -30,7 +30,9 @@ class FileStorage: def mimetype(self) -> str: ... @property def mimetype_params(self) -> dict[str, str]: ... - def save(self, dst: str | PathLike | IO[bytes], buffer_size: int = ...) -> None: ... + def save( + self, dst: str | PathLike[str] | IO[bytes], buffer_size: int = ... + ) -> None: ... def close(self) -> None: ... def __bool__(self) -> bool: ... def __getattr__(self, name: str) -> Any: ... diff --git a/libs/werkzeug/datastructures/mixins.pyi b/libs/werkzeug/datastructures/mixins.pyi index 74ed4b81e..40453f703 100644 --- a/libs/werkzeug/datastructures/mixins.pyi +++ b/libs/werkzeug/datastructures/mixins.pyi @@ -21,7 +21,7 @@ class ImmutableListMixin(list[V]): _hash_cache: int | None def __hash__(self) -> int: ... # type: ignore def __delitem__(self, key: SupportsIndex | slice) -> NoReturn: ... - def __iadd__(self, other: t.Any) -> NoReturn: ... # type: ignore + def __iadd__(self, other: Any) -> NoReturn: ... # type: ignore def __imul__(self, other: SupportsIndex) -> NoReturn: ... def __setitem__(self, key: int | slice, value: V) -> NoReturn: ... # type: ignore def append(self, value: V) -> NoReturn: ... diff --git a/libs/werkzeug/datastructures/structures.py b/libs/werkzeug/datastructures/structures.py index 7ea7bee28..4279ceb98 100644 --- a/libs/werkzeug/datastructures/structures.py +++ b/libs/werkzeug/datastructures/structures.py @@ -70,8 +70,12 @@ def get(self, key, default=None, type=None): be looked up. If not further specified `None` is returned. :param type: A callable that is used to cast the value in the - :class:`MultiDict`. If a :exc:`ValueError` is raised - by this callable the default value is returned. + :class:`MultiDict`. If a :exc:`ValueError` or a + :exc:`TypeError` is raised by this callable the default + value is returned. + + .. versionchanged:: 3.0.2 + Returns the default value on :exc:`TypeError`, too. """ try: rv = self[key] @@ -80,7 +84,7 @@ def get(self, key, default=None, type=None): if type is not None: try: rv = type(rv) - except ValueError: + except (ValueError, TypeError): rv = default return rv @@ -146,7 +150,7 @@ class MultiDict(TypeConversionDict): def __init__(self, mapping=None): if isinstance(mapping, MultiDict): - dict.__init__(self, ((k, l[:]) for k, l in mapping.lists())) + dict.__init__(self, ((k, vs[:]) for k, vs in mapping.lists())) elif isinstance(mapping, dict): tmp = {} for key, value in mapping.items(): diff --git a/libs/werkzeug/datastructures/structures.pyi b/libs/werkzeug/datastructures/structures.pyi index 2e7af35be..7086ddae1 100644 --- a/libs/werkzeug/datastructures/structures.pyi +++ b/libs/werkzeug/datastructures/structures.pyi @@ -9,22 +9,20 @@ from typing import NoReturn from typing import overload from typing import TypeVar -from .mixins import ( - ImmutableDictMixin, - ImmutableListMixin, - ImmutableMultiDictMixin, - UpdateDictMixin, -) +from .mixins import ImmutableDictMixin +from .mixins import ImmutableListMixin +from .mixins import ImmutableMultiDictMixin +from .mixins import UpdateDictMixin D = TypeVar("D") K = TypeVar("K") T = TypeVar("T") V = TypeVar("V") -_CD = TypeVar("_CD", bound="CallbackDict") +_CD = TypeVar("_CD", bound="CallbackDict[Any, Any]") def is_immutable(self: object) -> NoReturn: ... def iter_multi_items( - mapping: Mapping[K, V | Iterable[V]] | Iterable[tuple[K, V]] + mapping: Mapping[K, V | Iterable[V]] | Iterable[tuple[K, V]], ) -> Iterator[tuple[K, V]]: ... class ImmutableList(ImmutableListMixin[V]): ... @@ -41,7 +39,7 @@ class TypeConversionDict(dict[K, V]): class ImmutableTypeConversionDict(ImmutableDictMixin[K, V], TypeConversionDict[K, V]): def copy(self) -> TypeConversionDict[K, V]: ... - def __copy__(self) -> ImmutableTypeConversionDict: ... + def __copy__(self) -> ImmutableTypeConversionDict[K, V]: ... class MultiDict(TypeConversionDict[K, V]): def __init__( @@ -84,16 +82,16 @@ class MultiDict(TypeConversionDict[K, V]): def __deepcopy__(self, memo: Any) -> MultiDict[K, V]: ... class _omd_bucket(Generic[K, V]): - prev: _omd_bucket | None - next: _omd_bucket | None + prev: _omd_bucket[K, V] | None + next: _omd_bucket[K, V] | None key: K value: V - def __init__(self, omd: OrderedMultiDict, key: K, value: V) -> None: ... - def unlink(self, omd: OrderedMultiDict) -> None: ... + def __init__(self, omd: OrderedMultiDict[K, V], key: K, value: V) -> None: ... + def unlink(self, omd: OrderedMultiDict[K, V]) -> None: ... class OrderedMultiDict(MultiDict[K, V]): - _first_bucket: _omd_bucket | None - _last_bucket: _omd_bucket | None + _first_bucket: _omd_bucket[K, V] | None + _last_bucket: _omd_bucket[K, V] | None def __init__(self, mapping: Mapping[K, V] | None = None) -> None: ... def __eq__(self, other: object) -> bool: ... def __getitem__(self, key: K) -> V: ... diff --git a/libs/werkzeug/debug/__init__.py b/libs/werkzeug/debug/__init__.py index 3b04b534e..0c4cabd89 100644 --- a/libs/werkzeug/debug/__init__.py +++ b/libs/werkzeug/debug/__init__.py @@ -13,13 +13,16 @@ from contextlib import ExitStack from io import BytesIO from itertools import chain +from multiprocessing import Value from os.path import basename from os.path import join from zlib import adler32 from .._internal import _log from ..exceptions import NotFound +from ..exceptions import SecurityError from ..http import parse_cookie +from ..sansio.utils import host_is_trusted from ..security import gen_salt from ..utils import send_file from ..wrappers.request import Request @@ -82,7 +85,8 @@ def _generate() -> str | bytes | None: try: # subprocess may not be available, e.g. Google App Engine # https://github.com/pallets/werkzeug/issues/925 - from subprocess import Popen, PIPE + from subprocess import PIPE + from subprocess import Popen dump = Popen( ["ioreg", "-c", "IOPlatformExpertDevice", "-d", "2"], stdout=PIPE @@ -110,7 +114,7 @@ def _generate() -> str | bytes | None: guid, guid_type = winreg.QueryValueEx(rk, "MachineGuid") if guid_type == winreg.REG_SZ: - return guid.encode("utf-8") + return guid.encode() return guid except OSError: @@ -169,7 +173,8 @@ def get_pin_and_cookie_name( # App Engine. It may also raise a KeyError if the UID does not # have a username, such as in Docker. username = getpass.getuser() - except (ImportError, KeyError): + # Python >= 3.13 only raises OSError + except (ImportError, KeyError, OSError): username = None mod = sys.modules.get(modname) @@ -193,7 +198,7 @@ def get_pin_and_cookie_name( if not bit: continue if isinstance(bit, str): - bit = bit.encode("utf-8") + bit = bit.encode() h.update(bit) h.update(b"cookiesalt") @@ -283,7 +288,7 @@ def __init__( self.console_init_func = console_init_func self.show_hidden_frames = show_hidden_frames self.secret = gen_salt(20) - self._failed_pin_auth = 0 + self._failed_pin_auth = Value("B") self.pin_logging = pin_logging if pin_security: @@ -297,6 +302,14 @@ def __init__( else: self.pin = None + self.trusted_hosts: list[str] = [".localhost", "127.0.0.1"] + """List of domains to allow requests to the debugger from. A leading dot + allows all subdomains. This only allows ``".localhost"`` domains by + default. + + .. versionadded:: 3.0.3 + """ + @property def pin(self) -> str | None: if not hasattr(self, "_pin"): @@ -343,7 +356,7 @@ def debug_application( is_trusted = bool(self.check_pin_trust(environ)) html = tb.render_debugger_html( - evalex=self.evalex, + evalex=self.evalex and self.check_host_trust(environ), secret=self.secret, evalex_trusted=is_trusted, ) @@ -364,13 +377,16 @@ def debug_application( environ["wsgi.errors"].write("".join(tb.render_traceback_text())) - def execute_command( # type: ignore[return] + def execute_command( self, request: Request, command: str, frame: DebugFrameSummary | _ConsoleFrame, ) -> Response: """Execute a command in a console.""" + if not self.check_host_trust(request.environ): + return SecurityError() # type: ignore[return-value] + contexts = self.frame_contexts.get(id(frame), []) with ExitStack() as exit_stack: @@ -381,6 +397,9 @@ def execute_command( # type: ignore[return] def display_console(self, request: Request) -> Response: """Display a standalone shell.""" + if not self.check_host_trust(request.environ): + return SecurityError() # type: ignore[return-value] + if 0 not in self.frames: if self.console_init_func is None: ns = {} @@ -433,12 +452,21 @@ def check_pin_trust(self, environ: WSGIEnvironment) -> bool | None: return None return (time.time() - PIN_TIME) < ts + def check_host_trust(self, environ: WSGIEnvironment) -> bool: + return host_is_trusted(environ.get("HTTP_HOST"), self.trusted_hosts) + def _fail_pin_auth(self) -> None: - time.sleep(5.0 if self._failed_pin_auth > 5 else 0.5) - self._failed_pin_auth += 1 + with self._failed_pin_auth.get_lock(): + count = self._failed_pin_auth.value + self._failed_pin_auth.value = count + 1 + + time.sleep(5.0 if count > 5 else 0.5) def pin_auth(self, request: Request) -> Response: """Authenticates with the pin.""" + if not self.check_host_trust(request.environ): + return SecurityError() # type: ignore[return-value] + exhausted = False auth = False trust = self.check_pin_trust(request.environ) @@ -459,7 +487,7 @@ def pin_auth(self, request: Request) -> Response: auth = True # If we failed too many times, then we're locked out. - elif self._failed_pin_auth > 10: + elif self._failed_pin_auth.value > 10: exhausted = True # Otherwise go through pin based authentication @@ -467,7 +495,7 @@ def pin_auth(self, request: Request) -> Response: entered_pin = request.args["pin"] if entered_pin.strip().replace("-", "") == pin.replace("-", ""): - self._failed_pin_auth = 0 + self._failed_pin_auth.value = 0 auth = True else: self._fail_pin_auth() @@ -488,8 +516,11 @@ def pin_auth(self, request: Request) -> Response: rv.delete_cookie(self.pin_cookie_name) return rv - def log_pin_request(self) -> Response: + def log_pin_request(self, request: Request) -> Response: """Log the pin if needed.""" + if not self.check_host_trust(request.environ): + return SecurityError() # type: ignore[return-value] + if self.pin_logging and self.pin is not None: _log( "info", " * To enable the debugger you need to enter the security pin:" @@ -516,7 +547,7 @@ def __call__( elif cmd == "pinauth" and secret == self.secret: response = self.pin_auth(request) # type: ignore elif cmd == "printpin" and secret == self.secret: - response = self.log_pin_request() # type: ignore + response = self.log_pin_request(request) # type: ignore elif ( self.evalex and cmd is not None diff --git a/libs/werkzeug/debug/console.py b/libs/werkzeug/debug/console.py index 03ddc07f2..4e40475a5 100644 --- a/libs/werkzeug/debug/console.py +++ b/libs/werkzeug/debug/console.py @@ -13,7 +13,7 @@ from .repr import helper _stream: ContextVar[HTMLStringO] = ContextVar("werkzeug.debug.console.stream") -_ipy: ContextVar = ContextVar("werkzeug.debug.console.ipy") +_ipy: ContextVar[_InteractiveConsole] = ContextVar("werkzeug.debug.console.ipy") class HTMLStringO: diff --git a/libs/werkzeug/debug/repr.py b/libs/werkzeug/debug/repr.py index 3bf15a77a..2bbd9d546 100644 --- a/libs/werkzeug/debug/repr.py +++ b/libs/werkzeug/debug/repr.py @@ -4,6 +4,7 @@ Together with the CSS and JavaScript of the debugger this gives a colorful and more compact output. """ + from __future__ import annotations import codecs @@ -80,9 +81,7 @@ def __call__(self, topic: t.Any | None = None) -> None: helper = _Helper() -def _add_subclass_info( - inner: str, obj: object, base: t.Type | tuple[t.Type, ...] -) -> str: +def _add_subclass_info(inner: str, obj: object, base: type | tuple[type, ...]) -> str: if isinstance(base, tuple): for cls in base: if type(obj) is cls: @@ -96,9 +95,9 @@ def _add_subclass_info( def _sequence_repr_maker( - left: str, right: str, base: t.Type, limit: int = 8 -) -> t.Callable[[DebugReprGenerator, t.Iterable, bool], str]: - def proxy(self: DebugReprGenerator, obj: t.Iterable, recursive: bool) -> str: + left: str, right: str, base: type, limit: int = 8 +) -> t.Callable[[DebugReprGenerator, t.Iterable[t.Any], bool], str]: + def proxy(self: DebugReprGenerator, obj: t.Iterable[t.Any], recursive: bool) -> str: if recursive: return _add_subclass_info(f"{left}...{right}", obj, base) buf = [left] @@ -130,7 +129,7 @@ def __init__(self) -> None: '<span class="module">collections.</span>deque([', "])", deque ) - def regex_repr(self, obj: t.Pattern) -> str: + def regex_repr(self, obj: t.Pattern[t.AnyStr]) -> str: pattern = repr(obj.pattern) pattern = codecs.decode(pattern, "unicode-escape", "ignore") pattern = f"r{pattern}" @@ -188,7 +187,7 @@ def dict_repr( buf.append("}") return _add_subclass_info("".join(buf), d, dict) - def object_repr(self, obj: type[dict] | t.Callable | type[list] | None) -> str: + def object_repr(self, obj: t.Any) -> str: r = repr(obj) return f'<span class="object">{escape(r)}</span>' diff --git a/libs/werkzeug/debug/shared/debugger.js b/libs/werkzeug/debug/shared/debugger.js index f463e9c77..809b14a6e 100644 --- a/libs/werkzeug/debug/shared/debugger.js +++ b/libs/werkzeug/debug/shared/debugger.js @@ -37,18 +37,22 @@ function wrapPlainTraceback() { plainTraceback.replaceWith(wrapper); } +function makeDebugURL(args) { + const params = new URLSearchParams(args) + params.set("s", SECRET) + return `?__debugger__=yes&${params}` +} + function initPinBox() { document.querySelector(".pin-prompt form").addEventListener( "submit", function (event) { event.preventDefault(); - const pin = encodeURIComponent(this.pin.value); - const encodedSecret = encodeURIComponent(SECRET); const btn = this.btn; btn.disabled = true; fetch( - `${document.location.pathname}?__debugger__=yes&cmd=pinauth&pin=${pin}&s=${encodedSecret}` + makeDebugURL({cmd: "pinauth", pin: this.pin.value}) ) .then((res) => res.json()) .then(({auth, exhausted}) => { @@ -77,10 +81,7 @@ function initPinBox() { function promptForPin() { if (!EVALEX_TRUSTED) { - const encodedSecret = encodeURIComponent(SECRET); - fetch( - `${document.location.pathname}?__debugger__=yes&cmd=printpin&s=${encodedSecret}` - ); + fetch(makeDebugURL({cmd: "printpin"})); const pinPrompt = document.getElementsByClassName("pin-prompt")[0]; fadeIn(pinPrompt); document.querySelector('.pin-prompt input[name="pin"]').focus(); @@ -237,7 +238,7 @@ function createConsoleInput() { function createIconForConsole() { const img = document.createElement("img"); - img.setAttribute("src", "?__debugger__=yes&cmd=resource&f=console.png"); + img.setAttribute("src", makeDebugURL({cmd: "resource", f: "console.png"})); img.setAttribute("title", "Open an interactive python shell in this frame"); return img; } @@ -263,24 +264,7 @@ function handleConsoleSubmit(e, command, frameID) { e.preventDefault(); return new Promise((resolve) => { - // Get input command. - const cmd = command.value; - - // Setup GET request. - const urlPath = ""; - const params = { - __debugger__: "yes", - cmd: cmd, - frm: frameID, - s: SECRET, - }; - const paramString = Object.keys(params) - .map((key) => { - return "&" + encodeURIComponent(key) + "=" + encodeURIComponent(params[key]); - }) - .join(""); - - fetch(urlPath + "?" + paramString) + fetch(makeDebugURL({cmd: command.value, frm: frameID})) .then((res) => { return res.text(); }) diff --git a/libs/werkzeug/debug/tbtools.py b/libs/werkzeug/debug/tbtools.py index c45f56ef0..e81ed6e18 100644 --- a/libs/werkzeug/debug/tbtools.py +++ b/libs/werkzeug/debug/tbtools.py @@ -187,7 +187,7 @@ def _process_traceback( if hasattr(fs, "colno"): frame_args["colno"] = fs.colno - frame_args["end_colno"] = fs.end_colno # type: ignore[attr-defined] + frame_args["end_colno"] = fs.end_colno new_stack.append(DebugFrameSummary(**frame_args)) @@ -265,7 +265,9 @@ def all_tracebacks( @cached_property def all_frames(self) -> list[DebugFrameSummary]: return [ - f for _, te in self.all_tracebacks for f in te.stack # type: ignore[misc] + f # type: ignore[misc] + for _, te in self.all_tracebacks + for f in te.stack ] def render_traceback_text(self) -> str: @@ -294,7 +296,12 @@ def render_traceback_html(self, include_title: bool = True) -> str: rows.append("\n".join(row_parts)) - is_syntax_error = issubclass(self._te.exc_type, SyntaxError) + if sys.version_info < (3, 13): + exc_type_str = self._te.exc_type.__name__ + else: + exc_type_str = self._te.exc_type_str + + is_syntax_error = exc_type_str == "SyntaxError" if include_title: if is_syntax_error: @@ -323,13 +330,19 @@ def render_debugger_html( ) -> str: exc_lines = list(self._te.format_exception_only()) plaintext = "".join(self._te.format()) + + if sys.version_info < (3, 13): + exc_type_str = self._te.exc_type.__name__ + else: + exc_type_str = self._te.exc_type_str + return PAGE_HTML % { "evalex": "true" if evalex else "false", "evalex_trusted": "true" if evalex_trusted else "false", "console": "false", "title": escape(exc_lines[0]), "exception": escape("".join(exc_lines)), - "exception_type": escape(self._te.exc_type.__name__), + "exception_type": escape(exc_type_str), "summary": self.render_traceback_html(include_title=False), "plaintext": escape(plaintext), "plaintext_cs": re.sub("-{2,}", "-", plaintext), diff --git a/libs/werkzeug/exceptions.py b/libs/werkzeug/exceptions.py index 253612918..6ce7ef955 100644 --- a/libs/werkzeug/exceptions.py +++ b/libs/werkzeug/exceptions.py @@ -43,6 +43,7 @@ def application(request): return e """ + from __future__ import annotations import typing as t @@ -56,6 +57,7 @@ def application(request): if t.TYPE_CHECKING: from _typeshed.wsgi import StartResponse from _typeshed.wsgi import WSGIEnvironment + from .datastructures import WWWAuthenticate from .sansio.response import Response from .wrappers.request import Request as WSGIRequest @@ -94,7 +96,7 @@ def name(self) -> str: def get_description( self, environ: WSGIEnvironment | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> str: """Get the description.""" if self.description is None: @@ -108,7 +110,7 @@ def get_description( def get_body( self, environ: WSGIEnvironment | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> str: """Get the HTML body.""" return ( @@ -122,7 +124,7 @@ def get_body( def get_headers( self, environ: WSGIEnvironment | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> list[tuple[str, str]]: """Get a list of headers.""" return [("Content-Type", "text/html; charset=utf-8")] @@ -130,7 +132,7 @@ def get_headers( def get_response( self, environ: WSGIEnvironment | WSGIRequest | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> Response: """Get a response object. If one was passed to the exception it's returned directly. @@ -312,7 +314,7 @@ def __init__( def get_headers( self, environ: WSGIEnvironment | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> list[tuple[str, str]]: headers = super().get_headers(environ, scope) if self.www_authenticate: @@ -376,7 +378,7 @@ def __init__( def get_headers( self, environ: WSGIEnvironment | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> list[tuple[str, str]]: headers = super().get_headers(environ, scope) if self.valid_methods: @@ -536,7 +538,7 @@ def __init__( def get_headers( self, environ: WSGIEnvironment | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> list[tuple[str, str]]: headers = super().get_headers(environ, scope) if self.length is not None: @@ -645,7 +647,7 @@ def __init__( def get_headers( self, environ: WSGIEnvironment | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> list[tuple[str, str]]: headers = super().get_headers(environ, scope) diff --git a/libs/werkzeug/formparser.py b/libs/werkzeug/formparser.py index ee30666dd..3c6875e26 100644 --- a/libs/werkzeug/formparser.py +++ b/libs/werkzeug/formparser.py @@ -30,9 +30,12 @@ if t.TYPE_CHECKING: import typing as te + from _typeshed.wsgi import WSGIEnvironment - t_parse_result = t.Tuple[t.IO[bytes], MultiDict, MultiDict] + t_parse_result = t.Tuple[ + t.IO[bytes], MultiDict[str, str], MultiDict[str, FileStorage] + ] class TStreamFactory(te.Protocol): def __call__( @@ -41,8 +44,7 @@ def __call__( content_type: str | None, filename: str | None, content_length: int | None = None, - ) -> t.IO[bytes]: - ... + ) -> t.IO[bytes]: ... F = t.TypeVar("F", bound=t.Callable[..., t.Any]) @@ -69,7 +71,7 @@ def parse_form_data( stream_factory: TStreamFactory | None = None, max_form_memory_size: int | None = None, max_content_length: int | None = None, - cls: type[MultiDict] | None = None, + cls: type[MultiDict[str, t.Any]] | None = None, silent: bool = True, *, max_form_parts: int | None = None, @@ -170,7 +172,7 @@ def __init__( stream_factory: TStreamFactory | None = None, max_form_memory_size: int | None = None, max_content_length: int | None = None, - cls: type[MultiDict] | None = None, + cls: type[MultiDict[str, t.Any]] | None = None, silent: bool = True, *, max_form_parts: int | None = None, @@ -184,7 +186,7 @@ def __init__( self.max_form_parts = max_form_parts if cls is None: - cls = MultiDict + cls = t.cast("type[MultiDict[str, t.Any]]", MultiDict) self.cls = cls self.silent = silent @@ -279,15 +281,11 @@ def _parse_urlencoded( ): raise RequestEntityTooLarge() - try: - items = parse_qsl( - stream.read().decode(), - keep_blank_values=True, - errors="werkzeug.url_quote", - ) - except ValueError as e: - raise RequestEntityTooLarge() from e - + items = parse_qsl( + stream.read().decode(), + keep_blank_values=True, + errors="werkzeug.url_quote", + ) return stream, self.cls(items), self.cls() @@ -296,7 +294,7 @@ def __init__( self, stream_factory: TStreamFactory | None = None, max_form_memory_size: int | None = None, - cls: type[MultiDict] | None = None, + cls: type[MultiDict[str, t.Any]] | None = None, buffer_size: int = 64 * 1024, max_form_parts: int | None = None, ) -> None: @@ -309,7 +307,7 @@ def __init__( self.stream_factory = stream_factory if cls is None: - cls = MultiDict + cls = t.cast("type[MultiDict[str, t.Any]]", MultiDict) self.cls = cls self.buffer_size = buffer_size @@ -352,8 +350,9 @@ def start_file_streaming( def parse( self, stream: t.IO[bytes], boundary: bytes, content_length: int | None - ) -> tuple[MultiDict, MultiDict]: + ) -> tuple[MultiDict[str, str], MultiDict[str, FileStorage]]: current_part: Field | File + field_size: int | None = None container: t.IO[bytes] | list[bytes] _write: t.Callable[[bytes], t.Any] @@ -372,13 +371,23 @@ def parse( while not isinstance(event, (Epilogue, NeedData)): if isinstance(event, Field): current_part = event + field_size = 0 container = [] _write = container.append elif isinstance(event, File): current_part = event + field_size = None container = self.start_file_streaming(event, content_length) _write = container.write elif isinstance(event, Data): + if self.max_form_memory_size is not None and field_size is not None: + # Ensure that accumulated data events do not exceed limit. + # Also checked within single event in MultipartDecoder. + field_size += len(event.data) + + if field_size > self.max_form_memory_size: + raise RequestEntityTooLarge() + _write(event.data) if not event.more_data: if isinstance(current_part, Field): diff --git a/libs/werkzeug/http.py b/libs/werkzeug/http.py index 8280f51fa..cb8bc2581 100644 --- a/libs/werkzeug/http.py +++ b/libs/werkzeug/http.py @@ -157,19 +157,19 @@ def quote_header_value(value: t.Any, allow_token: bool = True) -> str: .. versionadded:: 0.5 """ - value = str(value) + value_str = str(value) - if not value: + if not value_str: return '""' if allow_token: token_chars = _token_chars - if token_chars.issuperset(value): - return value + if token_chars.issuperset(value_str): + return value_str - value = value.replace("\\", "\\\\").replace('"', '\\"') - return f'"{value}"' + value_str = value_str.replace("\\", "\\\\").replace('"', '\\"') + return f'"{value_str}"' def unquote_header_value(value: str) -> str: @@ -361,6 +361,10 @@ def parse_dict_header(value: str) -> dict[str, str | None]: key, has_value, value = item.partition("=") key = key.strip() + if not key: + # =value is not valid + continue + if not has_value: result[key] = None continue @@ -395,22 +399,8 @@ def parse_dict_header(value: str) -> dict[str, str | None]: # https://httpwg.org/specs/rfc9110.html#parameter -_parameter_re = re.compile( - r""" - # don't match multiple empty parts, that causes backtracking - \s*;\s* # find the part delimiter - (?: - ([\w!#$%&'*+\-.^`|~]+) # key, one or more token chars - = # equals, with no space on either side - ( # value, token or quoted string - [\w!#$%&'*+\-.^`|~]+ # one or more token chars - | - "(?:\\\\|\\"|.)*?" # quoted string, consuming slash escapes - ) - )? # optionally match key=value, to account for empty parts - """, - re.ASCII | re.VERBOSE, -) +_parameter_key_re = re.compile(r"([\w!#$%&'*+\-.^`|~]+)=", flags=re.ASCII) +_parameter_token_value_re = re.compile(r"[\w!#$%&'*+\-.^`|~]+", flags=re.ASCII) # https://www.rfc-editor.org/rfc/rfc2231#section-4 _charset_value_re = re.compile( r""" @@ -492,18 +482,49 @@ def parse_options_header(value: str | None) -> tuple[str, dict[str, str]]: # empty (invalid) value, or value without options return value, {} - rest = f";{rest}" + # Collect all valid key=value parts without processing the value. + parts: list[tuple[str, str]] = [] + + while True: + if (m := _parameter_key_re.match(rest)) is not None: + pk = m.group(1).lower() + rest = rest[m.end() :] + + # Value may be a token. + if (m := _parameter_token_value_re.match(rest)) is not None: + parts.append((pk, m.group())) + + # Value may be a quoted string, find the closing quote. + elif rest[:1] == '"': + pos = 1 + length = len(rest) + + while pos < length: + if rest[pos : pos + 2] in {"\\\\", '\\"'}: + # Consume escaped slashes and quotes. + pos += 2 + elif rest[pos] == '"': + # Stop at an unescaped quote. + parts.append((pk, rest[: pos + 1])) + rest = rest[pos + 1 :] + break + else: + # Consume any other character. + pos += 1 + + # Find the next section delimited by `;`, if any. + if (end := rest.find(";")) == -1: + break + + rest = rest[end + 1 :].lstrip() + options: dict[str, str] = {} encoding: str | None = None continued_encoding: str | None = None - for pk, pv in _parameter_re.findall(rest): - if not pk: - # empty or invalid part - continue - - pk = pk.lower() - + # For each collected part, process optional charset and continuation, + # unquote quoted values. + for pk, pv in parts: if pk[-1] == "*": # key*=charset''value becomes key=value, where value is percent encoded pk = pk[:-1] @@ -553,13 +574,11 @@ def parse_options_header(value: str | None) -> tuple[str, dict[str, str]]: @t.overload -def parse_accept_header(value: str | None) -> ds.Accept: - ... +def parse_accept_header(value: str | None) -> ds.Accept: ... @t.overload -def parse_accept_header(value: str | None, cls: type[_TAnyAccept]) -> _TAnyAccept: - ... +def parse_accept_header(value: str | None, cls: type[_TAnyAccept]) -> _TAnyAccept: ... def parse_accept_header( @@ -616,26 +635,26 @@ def parse_accept_header( _TAnyCC = t.TypeVar("_TAnyCC", bound="ds.cache_control._CacheControl") -_t_cc_update = t.Optional[t.Callable[[_TAnyCC], None]] @t.overload def parse_cache_control_header( - value: str | None, on_update: _t_cc_update, cls: None = None -) -> ds.RequestCacheControl: - ... + value: str | None, + on_update: t.Callable[[ds.cache_control._CacheControl], None] | None = None, +) -> ds.RequestCacheControl: ... @t.overload def parse_cache_control_header( - value: str | None, on_update: _t_cc_update, cls: type[_TAnyCC] -) -> _TAnyCC: - ... + value: str | None, + on_update: t.Callable[[ds.cache_control._CacheControl], None] | None = None, + cls: type[_TAnyCC] = ..., +) -> _TAnyCC: ... def parse_cache_control_header( value: str | None, - on_update: _t_cc_update = None, + on_update: t.Callable[[ds.cache_control._CacheControl], None] | None = None, cls: type[_TAnyCC] | None = None, ) -> _TAnyCC: """Parse a cache control header. The RFC differs between response and @@ -655,7 +674,7 @@ def parse_cache_control_header( :return: a `cls` object. """ if cls is None: - cls = t.cast(t.Type[_TAnyCC], ds.RequestCacheControl) + cls = t.cast("type[_TAnyCC]", ds.RequestCacheControl) if not value: return cls((), on_update) @@ -664,26 +683,26 @@ def parse_cache_control_header( _TAnyCSP = t.TypeVar("_TAnyCSP", bound="ds.ContentSecurityPolicy") -_t_csp_update = t.Optional[t.Callable[[_TAnyCSP], None]] @t.overload def parse_csp_header( - value: str | None, on_update: _t_csp_update, cls: None = None -) -> ds.ContentSecurityPolicy: - ... + value: str | None, + on_update: t.Callable[[ds.ContentSecurityPolicy], None] | None = None, +) -> ds.ContentSecurityPolicy: ... @t.overload def parse_csp_header( - value: str | None, on_update: _t_csp_update, cls: type[_TAnyCSP] -) -> _TAnyCSP: - ... + value: str | None, + on_update: t.Callable[[ds.ContentSecurityPolicy], None] | None = None, + cls: type[_TAnyCSP] = ..., +) -> _TAnyCSP: ... def parse_csp_header( value: str | None, - on_update: _t_csp_update = None, + on_update: t.Callable[[ds.ContentSecurityPolicy], None] | None = None, cls: type[_TAnyCSP] | None = None, ) -> _TAnyCSP: """Parse a Content Security Policy header. @@ -699,7 +718,7 @@ def parse_csp_header( :return: a `cls` object. """ if cls is None: - cls = t.cast(t.Type[_TAnyCSP], ds.ContentSecurityPolicy) + cls = t.cast("type[_TAnyCSP]", ds.ContentSecurityPolicy) if value is None: return cls((), on_update) @@ -1160,7 +1179,7 @@ def is_hop_by_hop_header(header: str) -> bool: def parse_cookie( header: WSGIEnvironment | str | None, - cls: type[ds.MultiDict] | None = None, + cls: type[ds.MultiDict[str, str]] | None = None, ) -> ds.MultiDict[str, str]: """Parse a cookie from a string or WSGI environ. diff --git a/libs/werkzeug/local.py b/libs/werkzeug/local.py index fba80e974..302589bba 100644 --- a/libs/werkzeug/local.py +++ b/libs/werkzeug/local.py @@ -20,7 +20,7 @@ F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -def release_local(local: Local | LocalStack) -> None: +def release_local(local: Local | LocalStack[t.Any]) -> None: """Release the data for the current context in a :class:`Local` or :class:`LocalStack` without using a :class:`LocalManager`. @@ -64,7 +64,9 @@ def __init__(self, context_var: ContextVar[dict[str, t.Any]] | None = None) -> N def __iter__(self) -> t.Iterator[tuple[str, t.Any]]: return iter(self.__storage.get({}).items()) - def __call__(self, name: str, *, unbound_message: str | None = None) -> LocalProxy: + def __call__( + self, name: str, *, unbound_message: str | None = None + ) -> LocalProxy[t.Any]: """Create a :class:`LocalProxy` that access an attribute on this local namespace. @@ -169,7 +171,7 @@ def top(self) -> T | None: def __call__( self, name: str | None = None, *, unbound_message: str | None = None - ) -> LocalProxy: + ) -> LocalProxy[t.Any]: """Create a :class:`LocalProxy` that accesses the top of this local stack. @@ -205,7 +207,8 @@ class LocalManager: def __init__( self, - locals: None | (Local | LocalStack | t.Iterable[Local | LocalStack]) = None, + locals: None + | (Local | LocalStack[t.Any] | t.Iterable[Local | LocalStack[t.Any]]) = None, ) -> None: if locals is None: self.locals = [] @@ -269,23 +272,27 @@ class _ProxyLookup: def __init__( self, - f: t.Callable | None = None, - fallback: t.Callable | None = None, + f: t.Callable[..., t.Any] | None = None, + fallback: t.Callable[[LocalProxy[t.Any]], t.Any] | None = None, class_value: t.Any | None = None, is_attr: bool = False, ) -> None: - bind_f: t.Callable[[LocalProxy, t.Any], t.Callable] | None + bind_f: t.Callable[[LocalProxy[t.Any], t.Any], t.Callable[..., t.Any]] | None if hasattr(f, "__get__"): # A Python function, can be turned into a bound method. - def bind_f(instance: LocalProxy, obj: t.Any) -> t.Callable: + def bind_f( + instance: LocalProxy[t.Any], obj: t.Any + ) -> t.Callable[..., t.Any]: return f.__get__(obj, type(obj)) # type: ignore elif f is not None: # A C function, use partial to bind the first argument. - def bind_f(instance: LocalProxy, obj: t.Any) -> t.Callable: + def bind_f( + instance: LocalProxy[t.Any], obj: t.Any + ) -> t.Callable[..., t.Any]: return partial(f, obj) else: @@ -297,10 +304,10 @@ def bind_f(instance: LocalProxy, obj: t.Any) -> t.Callable: self.class_value = class_value self.is_attr = is_attr - def __set_name__(self, owner: LocalProxy, name: str) -> None: + def __set_name__(self, owner: LocalProxy[t.Any], name: str) -> None: self.name = name - def __get__(self, instance: LocalProxy, owner: type | None = None) -> t.Any: + def __get__(self, instance: LocalProxy[t.Any], owner: type | None = None) -> t.Any: if instance is None: if self.class_value is not None: return self.class_value @@ -330,7 +337,9 @@ def __get__(self, instance: LocalProxy, owner: type | None = None) -> t.Any: def __repr__(self) -> str: return f"proxy {self.name}" - def __call__(self, instance: LocalProxy, *args: t.Any, **kwargs: t.Any) -> t.Any: + def __call__( + self, instance: LocalProxy[t.Any], *args: t.Any, **kwargs: t.Any + ) -> t.Any: """Support calling unbound methods from the class. For example, this happens with ``copy.copy``, which does ``type(x).__copy__(x)``. ``type(x)`` can't be proxied, so it @@ -347,12 +356,14 @@ class _ProxyIOp(_ProxyLookup): __slots__ = () def __init__( - self, f: t.Callable | None = None, fallback: t.Callable | None = None + self, + f: t.Callable[..., t.Any] | None = None, + fallback: t.Callable[[LocalProxy[t.Any]], t.Any] | None = None, ) -> None: super().__init__(f, fallback) - def bind_f(instance: LocalProxy, obj: t.Any) -> t.Callable: - def i_op(self: t.Any, other: t.Any) -> LocalProxy: + def bind_f(instance: LocalProxy[t.Any], obj: t.Any) -> t.Callable[..., t.Any]: + def i_op(self: t.Any, other: t.Any) -> LocalProxy[t.Any]: f(self, other) # type: ignore return instance @@ -520,32 +531,33 @@ def _get_current_object() -> T: object.__setattr__(self, "_LocalProxy__wrapped", local) object.__setattr__(self, "_get_current_object", _get_current_object) - __doc__ = _ProxyLookup( # type: ignore + __doc__ = _ProxyLookup( # type: ignore[assignment] class_value=__doc__, fallback=lambda self: type(self).__doc__, is_attr=True ) __wrapped__ = _ProxyLookup( - fallback=lambda self: self._LocalProxy__wrapped, is_attr=True + fallback=lambda self: self._LocalProxy__wrapped, # type: ignore[attr-defined] + is_attr=True, ) # __del__ should only delete the proxy - __repr__ = _ProxyLookup( # type: ignore + __repr__ = _ProxyLookup( # type: ignore[assignment] repr, fallback=lambda self: f"<{type(self).__name__} unbound>" ) - __str__ = _ProxyLookup(str) # type: ignore + __str__ = _ProxyLookup(str) # type: ignore[assignment] __bytes__ = _ProxyLookup(bytes) - __format__ = _ProxyLookup() # type: ignore + __format__ = _ProxyLookup() # type: ignore[assignment] __lt__ = _ProxyLookup(operator.lt) __le__ = _ProxyLookup(operator.le) - __eq__ = _ProxyLookup(operator.eq) # type: ignore - __ne__ = _ProxyLookup(operator.ne) # type: ignore + __eq__ = _ProxyLookup(operator.eq) # type: ignore[assignment] + __ne__ = _ProxyLookup(operator.ne) # type: ignore[assignment] __gt__ = _ProxyLookup(operator.gt) __ge__ = _ProxyLookup(operator.ge) - __hash__ = _ProxyLookup(hash) # type: ignore + __hash__ = _ProxyLookup(hash) # type: ignore[assignment] __bool__ = _ProxyLookup(bool, fallback=lambda self: False) __getattr__ = _ProxyLookup(getattr) # __getattribute__ triggered through __getattr__ - __setattr__ = _ProxyLookup(setattr) # type: ignore - __delattr__ = _ProxyLookup(delattr) # type: ignore - __dir__ = _ProxyLookup(dir, fallback=lambda self: []) # type: ignore + __setattr__ = _ProxyLookup(setattr) # type: ignore[assignment] + __delattr__ = _ProxyLookup(delattr) # type: ignore[assignment] + __dir__ = _ProxyLookup(dir, fallback=lambda self: []) # type: ignore[assignment] # __get__ (proxying descriptor not supported) # __set__ (descriptor) # __delete__ (descriptor) @@ -556,9 +568,7 @@ def _get_current_object() -> T: # __weakref__ (__getattr__) # __init_subclass__ (proxying metaclass not supported) # __prepare__ (metaclass) - __class__ = _ProxyLookup( - fallback=lambda self: type(self), is_attr=True - ) # type: ignore + __class__ = _ProxyLookup(fallback=lambda self: type(self), is_attr=True) # type: ignore[assignment] __instancecheck__ = _ProxyLookup(lambda self, other: isinstance(other, self)) __subclasscheck__ = _ProxyLookup(lambda self, other: issubclass(other, self)) # __class_getitem__ triggered through __getitem__ diff --git a/libs/werkzeug/middleware/dispatcher.py b/libs/werkzeug/middleware/dispatcher.py index 559fea585..e11bacc52 100644 --- a/libs/werkzeug/middleware/dispatcher.py +++ b/libs/werkzeug/middleware/dispatcher.py @@ -30,6 +30,7 @@ :copyright: 2007 Pallets :license: BSD-3-Clause """ + from __future__ import annotations import typing as t diff --git a/libs/werkzeug/middleware/http_proxy.py b/libs/werkzeug/middleware/http_proxy.py index 59ba9b324..5e239156a 100644 --- a/libs/werkzeug/middleware/http_proxy.py +++ b/libs/werkzeug/middleware/http_proxy.py @@ -7,6 +7,7 @@ :copyright: 2007 Pallets :license: BSD-3-Clause """ + from __future__ import annotations import typing as t diff --git a/libs/werkzeug/middleware/lint.py b/libs/werkzeug/middleware/lint.py index 462959943..de93b526a 100644 --- a/libs/werkzeug/middleware/lint.py +++ b/libs/werkzeug/middleware/lint.py @@ -12,6 +12,7 @@ :copyright: 2007 Pallets :license: BSD-3-Clause """ + from __future__ import annotations import typing as t @@ -37,7 +38,7 @@ class HTTPWarning(Warning): """Warning class for HTTP warnings.""" -def check_type(context: str, obj: object, need: t.Type = str) -> None: +def check_type(context: str, obj: object, need: type = str) -> None: if type(obj) is not need: warn( f"{context!r} requires {need.__name__!r}, got {type(obj).__name__!r}.", @@ -180,30 +181,44 @@ def close(self) -> None: key ): warn( - f"Entity header {key!r} found in 304 response.", HTTPWarning + f"Entity header {key!r} found in 304 response.", + HTTPWarning, + stacklevel=2, ) if bytes_sent: - warn("304 responses must not have a body.", HTTPWarning) + warn( + "304 responses must not have a body.", + HTTPWarning, + stacklevel=2, + ) elif 100 <= status_code < 200 or status_code == 204: if content_length != 0: warn( f"{status_code} responses must have an empty content length.", HTTPWarning, + stacklevel=2, ) if bytes_sent: - warn(f"{status_code} responses must not have a body.", HTTPWarning) + warn( + f"{status_code} responses must not have a body.", + HTTPWarning, + stacklevel=2, + ) elif content_length is not None and content_length != bytes_sent: warn( "Content-Length and the number of bytes sent to the" " client do not match.", WSGIWarning, + stacklevel=2, ) def __del__(self) -> None: if not self.closed: try: warn( - "Iterator was garbage collected before it was closed.", WSGIWarning + "Iterator was garbage collected before it was closed.", + WSGIWarning, + stacklevel=2, ) except Exception: pass @@ -236,7 +251,7 @@ def __init__(self, app: WSGIApplication) -> None: self.app = app def check_environ(self, environ: WSGIEnvironment) -> None: - if type(environ) is not dict: + if type(environ) is not dict: # noqa: E721 warn( "WSGI environment is not a standard Python dict.", WSGIWarning, @@ -304,14 +319,14 @@ def check_start_response( if status_code < 100: warn("Status code < 100 detected.", WSGIWarning, stacklevel=3) - if type(headers) is not list: + if type(headers) is not list: # noqa: E721 warn("Header list is not a list.", WSGIWarning, stacklevel=3) for item in headers: if type(item) is not tuple or len(item) != 2: warn("Header items must be 2-item tuples.", WSGIWarning, stacklevel=3) name, value = item - if type(name) is not str or type(value) is not str: + if type(name) is not str or type(value) is not str: # noqa: E721 warn( "Header keys and values must be strings.", WSGIWarning, stacklevel=3 ) @@ -326,10 +341,10 @@ def check_start_response( if exc_info is not None and not isinstance(exc_info, tuple): warn("Invalid value for exc_info.", WSGIWarning, stacklevel=3) - headers = Headers(headers) - self.check_headers(headers) + headers_obj = Headers(headers) + self.check_headers(headers_obj) - return status_code, headers + return status_code, headers_obj def check_headers(self, headers: Headers) -> None: etag = headers.get("etag") @@ -402,13 +417,17 @@ def checking_start_response( ) if kwargs: - warn("'start_response' does not take keyword arguments.", WSGIWarning) + warn( + "'start_response' does not take keyword arguments.", + WSGIWarning, + stacklevel=2, + ) status: str = args[0] headers: list[tuple[str, str]] = args[1] - exc_info: None | ( - tuple[type[BaseException], BaseException, TracebackType] - ) = (args[2] if len(args) == 3 else None) + exc_info: ( + None | (tuple[type[BaseException], BaseException, TracebackType]) + ) = args[2] if len(args) == 3 else None headers_set[:] = self.check_start_response(status, headers, exc_info) return GuardedWrite(start_response(status, headers, exc_info), chunks) diff --git a/libs/werkzeug/middleware/profiler.py b/libs/werkzeug/middleware/profiler.py index 1120c83ef..112b87776 100644 --- a/libs/werkzeug/middleware/profiler.py +++ b/libs/werkzeug/middleware/profiler.py @@ -11,6 +11,7 @@ :copyright: 2007 Pallets :license: BSD-3-Clause """ + from __future__ import annotations import os.path diff --git a/libs/werkzeug/middleware/proxy_fix.py b/libs/werkzeug/middleware/proxy_fix.py index 8dfbb36c0..cbf4e0bae 100644 --- a/libs/werkzeug/middleware/proxy_fix.py +++ b/libs/werkzeug/middleware/proxy_fix.py @@ -21,6 +21,7 @@ :copyright: 2007 Pallets :license: BSD-3-Clause """ + from __future__ import annotations import typing as t diff --git a/libs/werkzeug/middleware/shared_data.py b/libs/werkzeug/middleware/shared_data.py index e3ec7cab8..0f467f2e2 100644 --- a/libs/werkzeug/middleware/shared_data.py +++ b/libs/werkzeug/middleware/shared_data.py @@ -8,8 +8,10 @@ :copyright: 2007 Pallets :license: BSD-3-Clause """ + from __future__ import annotations +import collections.abc as cabc import importlib.util import mimetypes import os @@ -38,7 +40,6 @@ class SharedDataMiddleware: - """A WSGI middleware which provides static content for development environments or simple server setups. Its usage is quite simple:: @@ -103,7 +104,7 @@ def __init__( self, app: WSGIApplication, exports: ( - dict[str, str | tuple[str, str]] + cabc.Mapping[str, str | tuple[str, str]] | t.Iterable[tuple[str, str | tuple[str, str]]] ), disallow: None = None, @@ -116,7 +117,7 @@ def __init__( self.cache = cache self.cache_timeout = cache_timeout - if isinstance(exports, dict): + if isinstance(exports, cabc.Mapping): exports = exports.items() for key, value in exports: @@ -218,9 +219,9 @@ def loader( return loader def generate_etag(self, mtime: datetime, file_size: int, real_filename: str) -> str: - real_filename = os.fsencode(real_filename) + fn_str = os.fsencode(real_filename) timestamp = mtime.timestamp() - checksum = adler32(real_filename) & 0xFFFFFFFF + checksum = adler32(fn_str) & 0xFFFFFFFF return f"wzsdm-{timestamp}-{file_size}-{checksum}" def __call__( diff --git a/libs/werkzeug/routing/__init__.py b/libs/werkzeug/routing/__init__.py index 84b043fdf..62adc48fb 100644 --- a/libs/werkzeug/routing/__init__.py +++ b/libs/werkzeug/routing/__init__.py @@ -105,6 +105,7 @@ routing tried to match a ``POST`` request) a ``MethodNotAllowed`` exception is raised. """ + from .converters import AnyConverter as AnyConverter from .converters import BaseConverter as BaseConverter from .converters import FloatConverter as FloatConverter diff --git a/libs/werkzeug/routing/converters.py b/libs/werkzeug/routing/converters.py index ce01dd1ea..6016a975e 100644 --- a/libs/werkzeug/routing/converters.py +++ b/libs/werkzeug/routing/converters.py @@ -131,7 +131,7 @@ class NumberConverter(BaseConverter): """ weight = 50 - num_convert: t.Callable = int + num_convert: t.Callable[[t.Any], t.Any] = int def __init__( self, @@ -152,18 +152,18 @@ def __init__( def to_python(self, value: str) -> t.Any: if self.fixed_digits and len(value) != self.fixed_digits: raise ValidationError() - value = self.num_convert(value) - if (self.min is not None and value < self.min) or ( - self.max is not None and value > self.max + value_num = self.num_convert(value) + if (self.min is not None and value_num < self.min) or ( + self.max is not None and value_num > self.max ): raise ValidationError() - return value + return value_num def to_url(self, value: t.Any) -> str: - value = str(self.num_convert(value)) + value_str = str(self.num_convert(value)) if self.fixed_digits: - value = value.zfill(self.fixed_digits) - return value + value_str = value_str.zfill(self.fixed_digits) + return value_str @property def signed_regex(self) -> str: diff --git a/libs/werkzeug/routing/exceptions.py b/libs/werkzeug/routing/exceptions.py index 9d0a5281b..eeabd4ed1 100644 --- a/libs/werkzeug/routing/exceptions.py +++ b/libs/werkzeug/routing/exceptions.py @@ -10,10 +10,11 @@ if t.TYPE_CHECKING: from _typeshed.wsgi import WSGIEnvironment - from .map import MapAdapter - from .rules import Rule + from ..wrappers.request import Request from ..wrappers.response import Response + from .map import MapAdapter + from .rules import Rule class RoutingException(Exception): @@ -40,7 +41,7 @@ def __init__(self, new_url: str) -> None: def get_response( self, environ: WSGIEnvironment | Request | None = None, - scope: dict | None = None, + scope: dict[str, t.Any] | None = None, ) -> Response: return redirect(self.new_url, self.code) @@ -58,7 +59,7 @@ def __init__(self, path_info: str) -> None: class RequestAliasRedirect(RoutingException): # noqa: B903 """This rule is an alias and wants to redirect to the canonical URL.""" - def __init__(self, matched_values: t.Mapping[str, t.Any], endpoint: str) -> None: + def __init__(self, matched_values: t.Mapping[str, t.Any], endpoint: t.Any) -> None: super().__init__() self.matched_values = matched_values self.endpoint = endpoint @@ -71,7 +72,7 @@ class BuildError(RoutingException, LookupError): def __init__( self, - endpoint: str, + endpoint: t.Any, values: t.Mapping[str, t.Any], method: str | None, adapter: MapAdapter | None = None, @@ -92,7 +93,10 @@ def _score_rule(rule: Rule) -> float: [ 0.98 * difflib.SequenceMatcher( - None, rule.endpoint, self.endpoint + # endpoints can be any type, compare as strings + None, + str(rule.endpoint), + str(self.endpoint), ).ratio(), 0.01 * bool(set(self.values or ()).issubset(rule.arguments)), 0.01 * bool(rule.methods and self.method in rule.methods), diff --git a/libs/werkzeug/routing/map.py b/libs/werkzeug/routing/map.py index 76bbe2f3b..4d15e8824 100644 --- a/libs/werkzeug/routing/map.py +++ b/libs/werkzeug/routing/map.py @@ -32,9 +32,10 @@ if t.TYPE_CHECKING: from _typeshed.wsgi import WSGIApplication from _typeshed.wsgi import WSGIEnvironment + + from ..wrappers.request import Request from .converters import BaseConverter from .rules import RuleFactory - from ..wrappers.request import Request class Map: @@ -103,13 +104,12 @@ def __init__( host_matching: bool = False, ) -> None: self._matcher = StateMachineMatcher(merge_slashes) - self._rules_by_endpoint: dict[str, list[Rule]] = {} + self._rules_by_endpoint: dict[t.Any, list[Rule]] = {} self._remap = True self._remap_lock = self.lock_class() self.default_subdomain = default_subdomain self.strict_slashes = strict_slashes - self.merge_slashes = merge_slashes self.redirect_defaults = redirect_defaults self.host_matching = host_matching @@ -123,7 +123,15 @@ def __init__( for rulefactory in rules or (): self.add(rulefactory) - def is_endpoint_expecting(self, endpoint: str, *arguments: str) -> bool: + @property + def merge_slashes(self) -> bool: + return self._matcher.merge_slashes + + @merge_slashes.setter + def merge_slashes(self, value: bool) -> None: + self._matcher.merge_slashes = value + + def is_endpoint_expecting(self, endpoint: t.Any, *arguments: str) -> bool: """Iterate over all rules and check if the endpoint expects the arguments provided. This is for example useful if you have some URLs that expect a language code and others that do not and @@ -137,9 +145,9 @@ def is_endpoint_expecting(self, endpoint: str, *arguments: str) -> bool: checked. """ self.update() - arguments = set(arguments) + arguments_set = set(arguments) for rule in self._rules_by_endpoint[endpoint]: - if arguments.issubset(rule.arguments): + if arguments_set.issubset(rule.arguments): return True return False @@ -147,7 +155,7 @@ def is_endpoint_expecting(self, endpoint: str, *arguments: str) -> bool: def _rules(self) -> list[Rule]: return [rule for rules in self._rules_by_endpoint.values() for rule in rules] - def iter_rules(self, endpoint: str | None = None) -> t.Iterator[Rule]: + def iter_rules(self, endpoint: t.Any | None = None) -> t.Iterator[Rule]: """Iterate over all rules or the rules of an endpoint. :param endpoint: if provided only the rules for that endpoint @@ -372,7 +380,6 @@ def __repr__(self) -> str: class MapAdapter: - """Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does the URL matching and building based on runtime information. """ @@ -463,15 +470,14 @@ def application(environ, start_response): raise @t.overload - def match( # type: ignore + def match( self, path_info: str | None = None, method: str | None = None, return_rule: t.Literal[False] = False, query_args: t.Mapping[str, t.Any] | str | None = None, websocket: bool | None = None, - ) -> tuple[str, t.Mapping[str, t.Any]]: - ... + ) -> tuple[t.Any, t.Mapping[str, t.Any]]: ... @t.overload def match( @@ -481,8 +487,7 @@ def match( return_rule: t.Literal[True] = True, query_args: t.Mapping[str, t.Any] | str | None = None, websocket: bool | None = None, - ) -> tuple[Rule, t.Mapping[str, t.Any]]: - ... + ) -> tuple[Rule, t.Mapping[str, t.Any]]: ... def match( self, @@ -491,7 +496,7 @@ def match( return_rule: bool = False, query_args: t.Mapping[str, t.Any] | str | None = None, websocket: bool | None = None, - ) -> tuple[str | Rule, t.Mapping[str, t.Any]]: + ) -> tuple[t.Any | Rule, t.Mapping[str, t.Any]]: """The usage is simple: you just pass the match method the current path info as well as the method (which defaults to `GET`). The following things can then happen: @@ -765,7 +770,7 @@ def make_redirect_url( def make_alias_redirect_url( self, path: str, - endpoint: str, + endpoint: t.Any, values: t.Mapping[str, t.Any], method: str, query_args: t.Mapping[str, t.Any] | str, @@ -781,7 +786,7 @@ def make_alias_redirect_url( def _partial_build( self, - endpoint: str, + endpoint: t.Any, values: t.Mapping[str, t.Any], method: str | None, append_unknown: bool, @@ -822,7 +827,7 @@ def _partial_build( def build( self, - endpoint: str, + endpoint: t.Any, values: t.Mapping[str, t.Any] | None = None, method: str | None = None, force_external: bool = False, diff --git a/libs/werkzeug/routing/matcher.py b/libs/werkzeug/routing/matcher.py index 0d1210a67..1fd00efca 100644 --- a/libs/werkzeug/routing/matcher.py +++ b/libs/werkzeug/routing/matcher.py @@ -177,7 +177,7 @@ def _match( rv = _match(self._root, [domain, *path.split("/")], []) except SlashRequired: raise RequestPath(f"{path}/") from None - if rv is None: + if rv is None or rv[0].merge_slashes is False: raise NoMatch(have_match_for, websocket_mismatch) else: raise RequestPath(f"{path}") diff --git a/libs/werkzeug/routing/rules.py b/libs/werkzeug/routing/rules.py index 5c8184ccb..2dad31dd3 100644 --- a/libs/werkzeug/routing/rules.py +++ b/libs/werkzeug/routing/rules.py @@ -67,6 +67,7 @@ class RulePart: _simple_rule_re = re.compile(r"<([^>]+)>") _converter_args_re = re.compile( r""" + \s* ((?P<name>\w+)\s*=\s*)? (?P<value> True|False| @@ -100,7 +101,7 @@ def _pythonize(value: str) -> None | bool | int | float | str: return _PYTHON_CONSTANTS[value] for convert in int, float: try: - return convert(value) # type: ignore + return convert(value) except ValueError: pass if value[:1] == value[-1:] and value[0] in "\"'": @@ -108,12 +109,18 @@ def _pythonize(value: str) -> None | bool | int | float | str: return str(value) -def parse_converter_args(argstr: str) -> tuple[t.Tuple, dict[str, t.Any]]: +def parse_converter_args(argstr: str) -> tuple[tuple[t.Any, ...], dict[str, t.Any]]: argstr += "," args = [] kwargs = {} + position = 0 for item in _converter_args_re.finditer(argstr): + if item.start() != position: + raise ValueError( + f"Cannot parse converter argument '{argstr[position:item.start()]}'" + ) + value = item.group("stringval") if value is None: value = item.group("value") @@ -123,6 +130,7 @@ def parse_converter_args(argstr: str) -> tuple[t.Tuple, dict[str, t.Any]]: else: name = item.group("name") kwargs[name] = value + position = item.end() return tuple(args), kwargs @@ -286,11 +294,18 @@ def get_rules(self, map: Map) -> t.Iterator[Rule]: ) -def _prefix_names(src: str) -> ast.stmt: +_ASTT = t.TypeVar("_ASTT", bound=ast.AST) + + +def _prefix_names(src: str, expected_type: type[_ASTT]) -> _ASTT: """ast parse and prefix names with `.` to avoid collision with user vars""" - tree = ast.parse(src).body[0] + tree: ast.AST = ast.parse(src).body[0] if isinstance(tree, ast.Expr): - tree = tree.value # type: ignore + tree = tree.value + if not isinstance(tree, expected_type): + raise TypeError( + f"AST node is of type {type(tree).__name__}, not {expected_type.__name__}" + ) for node in ast.walk(tree): if isinstance(node, ast.Name): node.id = f".{node.id}" @@ -305,8 +320,11 @@ def _prefix_names(src: str) -> ast.stmt: else: q = params = "" """ -_IF_KWARGS_URL_ENCODE_AST = _prefix_names(_IF_KWARGS_URL_ENCODE_CODE) -_URL_ENCODE_AST_NAMES = (_prefix_names("q"), _prefix_names("params")) +_IF_KWARGS_URL_ENCODE_AST = _prefix_names(_IF_KWARGS_URL_ENCODE_CODE, ast.If) +_URL_ENCODE_AST_NAMES = ( + _prefix_names("q", ast.Name), + _prefix_names("params", ast.Name), +) class Rule(RuleFactory): @@ -445,7 +463,7 @@ def __init__( subdomain: str | None = None, methods: t.Iterable[str] | None = None, build_only: bool = False, - endpoint: str | None = None, + endpoint: t.Any | None = None, strict_slashes: bool | None = None, merge_slashes: bool | None = None, redirect_to: str | t.Callable[..., str] | None = None, @@ -485,7 +503,7 @@ def __init__( ) self.methods = methods - self.endpoint: str = endpoint # type: ignore + self.endpoint: t.Any = endpoint self.redirect_to = redirect_to if defaults: @@ -566,7 +584,7 @@ def get_converter( self, variable_name: str, converter_name: str, - args: t.Tuple, + args: tuple[t.Any, ...], kwargs: t.Mapping[str, t.Any], ) -> BaseConverter: """Looks up the converter for the given parameter. @@ -743,13 +761,13 @@ def _compile_builder( else: opl.append((True, data)) - def _convert(elem: str) -> ast.stmt: - ret = _prefix_names(_CALL_CONVERTER_CODE_FMT.format(elem=elem)) - ret.args = [ast.Name(str(elem), ast.Load())] # type: ignore # str for py2 + def _convert(elem: str) -> ast.Call: + ret = _prefix_names(_CALL_CONVERTER_CODE_FMT.format(elem=elem), ast.Call) + ret.args = [ast.Name(elem, ast.Load())] return ret - def _parts(ops: list[tuple[bool, str]]) -> list[ast.AST]: - parts = [ + def _parts(ops: list[tuple[bool, str]]) -> list[ast.expr]: + parts: list[ast.expr] = [ _convert(elem) if is_dynamic else ast.Constant(elem) for is_dynamic, elem in ops ] @@ -765,13 +783,14 @@ def _parts(ops: list[tuple[bool, str]]) -> list[ast.AST]: dom_parts = _parts(dom_ops) url_parts = _parts(url_ops) + body: list[ast.stmt] if not append_unknown: body = [] else: body = [_IF_KWARGS_URL_ENCODE_AST] url_parts.extend(_URL_ENCODE_AST_NAMES) - def _join(parts: list[ast.AST]) -> ast.AST: + def _join(parts: list[ast.expr]) -> ast.expr: if len(parts) == 1: # shortcut return parts[0] return ast.JoinedStr(parts) @@ -787,7 +806,7 @@ def _join(parts: list[ast.AST]) -> ast.AST: ] kargs = [str(k) for k in defaults] - func_ast: ast.FunctionDef = _prefix_names("def _(): pass") # type: ignore + func_ast = _prefix_names("def _(): pass", ast.FunctionDef) func_ast.name = f"<builder:{self.rule!r}>" func_ast.args.args.append(ast.arg(".self", None)) for arg in pargs + kargs: @@ -807,13 +826,13 @@ def _join(parts: list[ast.AST]) -> ast.AST: # bad line numbers cause an assert to fail in debug builds for node in ast.walk(module): if "lineno" in node._attributes: - node.lineno = 1 + node.lineno = 1 # type: ignore[attr-defined] if "end_lineno" in node._attributes: - node.end_lineno = node.lineno + node.end_lineno = node.lineno # type: ignore[attr-defined] if "col_offset" in node._attributes: - node.col_offset = 0 + node.col_offset = 0 # type: ignore[attr-defined] if "end_col_offset" in node._attributes: - node.end_col_offset = node.col_offset + node.end_col_offset = node.col_offset # type: ignore[attr-defined] code = compile(module, "<werkzeug routing>", "exec") return self._get_func_code(code, func_ast.name) @@ -904,6 +923,6 @@ def __repr__(self) -> str: parts.append(f"<{data}>") else: parts.append(data) - parts = "".join(parts).lstrip("|") + parts_str = "".join(parts).lstrip("|") methods = f" ({', '.join(self.methods)})" if self.methods is not None else "" - return f"<{type(self).__name__} {parts!r}{methods} -> {self.endpoint}>" + return f"<{type(self).__name__} {parts_str!r}{methods} -> {self.endpoint}>" diff --git a/libs/werkzeug/sansio/http.py b/libs/werkzeug/sansio/http.py index e3cd3330c..b2b887799 100644 --- a/libs/werkzeug/sansio/http.py +++ b/libs/werkzeug/sansio/http.py @@ -122,7 +122,7 @@ def _cookie_unslash_replace(m: t.Match[bytes]) -> bytes: def parse_cookie( cookie: str | None = None, - cls: type[ds.MultiDict] | None = None, + cls: type[ds.MultiDict[str, str]] | None = None, ) -> ds.MultiDict[str, str]: """Parse a cookie from a string. @@ -141,7 +141,7 @@ def parse_cookie( .. versionadded:: 2.2 """ if cls is None: - cls = ds.MultiDict + cls = t.cast("type[ds.MultiDict[str, str]]", ds.MultiDict) if not cookie: return cls() diff --git a/libs/werkzeug/sansio/multipart.py b/libs/werkzeug/sansio/multipart.py index fc8735378..731be0336 100644 --- a/libs/werkzeug/sansio/multipart.py +++ b/libs/werkzeug/sansio/multipart.py @@ -140,6 +140,8 @@ def receive_data(self, data: bytes | None) -> None: self.max_form_memory_size is not None and len(self.buffer) + len(data) > self.max_form_memory_size ): + # Ensure that data within single event does not exceed limit. + # Also checked across accumulated events in MultiPartParser. raise RequestEntityTooLarge() else: self.buffer.extend(data) diff --git a/libs/werkzeug/sansio/request.py b/libs/werkzeug/sansio/request.py index b59bd5bd6..dd0805d71 100644 --- a/libs/werkzeug/sansio/request.py +++ b/libs/werkzeug/sansio/request.py @@ -74,7 +74,7 @@ class Request: #: possible to use mutable structures, but this is not recommended. #: #: .. versionadded:: 0.6 - parameter_storage_class: type[MultiDict] = ImmutableMultiDict + parameter_storage_class: type[MultiDict[str, t.Any]] = ImmutableMultiDict #: The type to be used for dict values from the incoming WSGI #: environment. (For example for :attr:`cookies`.) By default an @@ -84,14 +84,14 @@ class Request: #: Changed to ``ImmutableMultiDict`` to support multiple values. #: #: .. versionadded:: 0.6 - dict_storage_class: type[MultiDict] = ImmutableMultiDict + dict_storage_class: type[MultiDict[str, t.Any]] = ImmutableMultiDict #: the type to be used for list values from the incoming WSGI environment. #: By default an :class:`~werkzeug.datastructures.ImmutableList` is used #: (for example for :attr:`access_list`). #: #: .. versionadded:: 0.6 - list_storage_class: type[t.List] = ImmutableList + list_storage_class: type[list[t.Any]] = ImmutableList user_agent_class: type[UserAgent] = UserAgent """The class used and returned by the :attr:`user_agent` property to diff --git a/libs/werkzeug/sansio/response.py b/libs/werkzeug/sansio/response.py index 271974ecf..9093b0a8c 100644 --- a/libs/werkzeug/sansio/response.py +++ b/libs/werkzeug/sansio/response.py @@ -6,32 +6,35 @@ from datetime import timezone from http import HTTPStatus +from ..datastructures import CallbackDict +from ..datastructures import ContentRange +from ..datastructures import ContentSecurityPolicy from ..datastructures import Headers from ..datastructures import HeaderSet +from ..datastructures import ResponseCacheControl +from ..datastructures import WWWAuthenticate +from ..http import COEP +from ..http import COOP +from ..http import dump_age from ..http import dump_cookie +from ..http import dump_header +from ..http import dump_options_header +from ..http import http_date from ..http import HTTP_STATUS_CODES +from ..http import parse_age +from ..http import parse_cache_control_header +from ..http import parse_content_range_header +from ..http import parse_csp_header +from ..http import parse_date +from ..http import parse_options_header +from ..http import parse_set_header +from ..http import quote_etag +from ..http import unquote_etag from ..utils import get_content_type -from werkzeug.datastructures import CallbackDict -from werkzeug.datastructures import ContentRange -from werkzeug.datastructures import ContentSecurityPolicy -from werkzeug.datastructures import ResponseCacheControl -from werkzeug.datastructures import WWWAuthenticate -from werkzeug.http import COEP -from werkzeug.http import COOP -from werkzeug.http import dump_age -from werkzeug.http import dump_header -from werkzeug.http import dump_options_header -from werkzeug.http import http_date -from werkzeug.http import parse_age -from werkzeug.http import parse_cache_control_header -from werkzeug.http import parse_content_range_header -from werkzeug.http import parse_csp_header -from werkzeug.http import parse_date -from werkzeug.http import parse_options_header -from werkzeug.http import parse_set_header -from werkzeug.http import quote_etag -from werkzeug.http import unquote_etag -from werkzeug.utils import header_property +from ..utils import header_property + +if t.TYPE_CHECKING: + from ..datastructures.cache_control import _CacheControl def _set_property(name: str, doc: str | None = None) -> property: @@ -305,7 +308,7 @@ def mimetype_params(self) -> dict[str, str]: .. versionadded:: 0.5 """ - def on_update(d: CallbackDict) -> None: + def on_update(d: CallbackDict[str, str]) -> None: self.headers["Content-Type"] = dump_options_header(self.mimetype, d) d = parse_options_header(self.headers.get("content-type", ""))[1] @@ -480,7 +483,7 @@ def cache_control(self) -> ResponseCacheControl: request/response chain. """ - def on_update(cache_control: ResponseCacheControl) -> None: + def on_update(cache_control: _CacheControl) -> None: if not cache_control and "cache-control" in self.headers: del self.headers["cache-control"] elif cache_control: diff --git a/libs/werkzeug/sansio/utils.py b/libs/werkzeug/sansio/utils.py index 48ec1bfa0..14fa0ac88 100644 --- a/libs/werkzeug/sansio/utils.py +++ b/libs/werkzeug/sansio/utils.py @@ -8,7 +8,7 @@ from ..urls import uri_to_iri -def host_is_trusted(hostname: str, trusted_list: t.Iterable[str]) -> bool: +def host_is_trusted(hostname: str | None, trusted_list: t.Iterable[str]) -> bool: """Check if a host matches a list of trusted names. :param hostname: The name to check. diff --git a/libs/werkzeug/security.py b/libs/werkzeug/security.py index 578caf7f3..997597990 100644 --- a/libs/werkzeug/security.py +++ b/libs/werkzeug/security.py @@ -24,8 +24,8 @@ def gen_salt(length: int) -> str: def _hash_internal(method: str, salt: str, password: str) -> tuple[str, str]: method, *args = method.split(":") - salt = salt.encode("utf-8") - password = password.encode("utf-8") + salt_bytes = salt.encode() + password_bytes = password.encode() if method == "scrypt": if not args: @@ -40,7 +40,9 @@ def _hash_internal(method: str, salt: str, password: str) -> tuple[str, str]: maxmem = 132 * n * r * p # ideally 128, but some extra seems needed return ( - hashlib.scrypt(password, salt=salt, n=n, r=r, p=p, maxmem=maxmem).hex(), + hashlib.scrypt( + password_bytes, salt=salt_bytes, n=n, r=r, p=p, maxmem=maxmem + ).hex(), f"scrypt:{n}:{r}:{p}", ) elif method == "pbkdf2": @@ -59,7 +61,9 @@ def _hash_internal(method: str, salt: str, password: str) -> tuple[str, str]: raise ValueError("'pbkdf2' takes 2 arguments.") return ( - hashlib.pbkdf2_hmac(hash_name, password, salt, iterations).hex(), + hashlib.pbkdf2_hmac( + hash_name, password_bytes, salt_bytes, iterations + ).hex(), f"pbkdf2:{hash_name}:{iterations}", ) else: @@ -147,6 +151,8 @@ def safe_join(directory: str, *pathnames: str) -> str | None: if ( any(sep in filename for sep in _os_alt_seps) or os.path.isabs(filename) + # ntpath.isabs doesn't catch this on Python < 3.11 + or filename.startswith("/") or filename == ".." or filename.startswith("../") ): diff --git a/libs/werkzeug/serving.py b/libs/werkzeug/serving.py index ff5eb8c66..ef32b8811 100644 --- a/libs/werkzeug/serving.py +++ b/libs/werkzeug/serving.py @@ -11,6 +11,7 @@ from myapp import create_app from werkzeug import run_simple """ + from __future__ import annotations import errno @@ -36,6 +37,12 @@ try: import ssl + + connection_dropped_errors: tuple[type[Exception], ...] = ( + ConnectionError, + socket.timeout, + ssl.SSLEOFError, + ) except ImportError: class _SslDummy: @@ -46,6 +53,7 @@ def __getattr__(self, name: str) -> t.Any: ) ssl = _SslDummy() # type: ignore + connection_dropped_errors = (ConnectionError, socket.timeout) _log_add_style = True @@ -360,7 +368,7 @@ def execute(app: WSGIApplication) -> None: try: execute(self.server.app) - except (ConnectionError, socket.timeout) as e: + except connection_dropped_errors as e: self.connection_dropped(e, environ) except Exception as e: if self.server.passthrough_errors: @@ -465,9 +473,11 @@ def log_message(self, format: str, *args: t.Any) -> None: self.log("info", format, *args) def log(self, type: str, message: str, *args: t.Any) -> None: + # an IPv6 scoped address contains "%" which breaks logging + address_string = self.address_string().replace("%", "%%") _log( type, - f"{self.address_string()} - - [{self.log_date_time_string()}] {message}\n", + f"{address_string} - - [{self.log_date_time_string()}] {message}\n", *args, ) @@ -496,10 +506,10 @@ def generate_adhoc_ssl_pair( ) -> tuple[Certificate, RSAPrivateKeyWithSerialization]: try: from cryptography import x509 - from cryptography.x509.oid import NameOID from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import rsa + from cryptography.x509.oid import NameOID except ImportError: raise TypeError( "Using ad-hoc certificates requires the cryptography library." @@ -531,7 +541,10 @@ def generate_adhoc_ssl_pair( .not_valid_before(dt.now(timezone.utc)) .not_valid_after(dt.now(timezone.utc) + timedelta(days=365)) .add_extension(x509.ExtendedKeyUsage([x509.OID_SERVER_AUTH]), critical=False) - .add_extension(x509.SubjectAlternativeName([x509.DNSName(cn)]), critical=False) + .add_extension( + x509.SubjectAlternativeName([x509.DNSName(cn), x509.DNSName(f"*.{cn}")]), + critical=False, + ) .sign(pkey, hashes.SHA256(), backend) ) return cert, pkey @@ -559,7 +572,7 @@ def make_ssl_devcert( """ if host is not None: - cn = f"*.{host}/CN={host}" + cn = host cert, pkey = generate_adhoc_ssl_pair(cn=cn) from cryptography.hazmat.primitives import serialization @@ -583,8 +596,8 @@ def make_ssl_devcert( def generate_adhoc_ssl_context() -> ssl.SSLContext: """Generates an adhoc SSL context for the development server.""" - import tempfile import atexit + import tempfile cert, pkey = generate_adhoc_ssl_pair() @@ -1068,6 +1081,9 @@ def run_simple( from .debug import DebuggedApplication application = DebuggedApplication(application, evalex=use_evalex) + # Allow the specified hostname to use the debugger, in addition to + # localhost domains. + application.trusted_hosts.append(hostname) if not is_running_from_reloader(): fd = None diff --git a/libs/werkzeug/test.py b/libs/werkzeug/test.py index 7b5899a97..38f69bfb9 100644 --- a/libs/werkzeug/test.py +++ b/libs/werkzeug/test.py @@ -46,9 +46,9 @@ from .wsgi import get_current_url if t.TYPE_CHECKING: + import typing_extensions as te from _typeshed.wsgi import WSGIApplication from _typeshed.wsgi import WSGIEnvironment - import typing_extensions as te def stream_encode_multipart( @@ -172,7 +172,7 @@ def _iter_data(data: t.Mapping[str, t.Any]) -> t.Iterator[tuple[str, t.Any]]: yield key, value -_TAnyMultiDict = t.TypeVar("_TAnyMultiDict", bound=MultiDict) +_TAnyMultiDict = t.TypeVar("_TAnyMultiDict", bound="MultiDict[t.Any, t.Any]") class EnvironBuilder: @@ -289,10 +289,10 @@ class EnvironBuilder: json_dumps = staticmethod(json.dumps) del json - _args: MultiDict | None + _args: MultiDict[str, str] | None _query_string: str | None _input_stream: t.IO[bytes] | None - _form: MultiDict | None + _form: MultiDict[str, str] | None _files: FileMultiDict | None def __init__( @@ -506,7 +506,7 @@ def mimetype_params(self) -> t.Mapping[str, str]: .. versionadded:: 0.14 """ - def on_update(d: CallbackDict) -> None: + def on_update(d: CallbackDict[str, str]) -> None: self.headers["Content-Type"] = dump_options_header(self.mimetype, d) d = parse_options_header(self.headers.get("content-type", ""))[1] @@ -545,7 +545,7 @@ def _get_form(self, name: str, storage: type[_TAnyMultiDict]) -> _TAnyMultiDict: return rv # type: ignore - def _set_form(self, name: str, value: MultiDict) -> None: + def _set_form(self, name: str, value: MultiDict[str, t.Any]) -> None: """Common behavior for setting the :attr:`form` and :attr:`files` properties. @@ -556,12 +556,12 @@ def _set_form(self, name: str, value: MultiDict) -> None: setattr(self, name, value) @property - def form(self) -> MultiDict: + def form(self) -> MultiDict[str, str]: """A :class:`MultiDict` of form values.""" return self._get_form("_form", MultiDict) @form.setter - def form(self, value: MultiDict) -> None: + def form(self, value: MultiDict[str, str]) -> None: self._set_form("_form", value) @property @@ -607,7 +607,7 @@ def query_string(self, value: str | None) -> None: self._args = None @property - def args(self) -> MultiDict: + def args(self) -> MultiDict[str, str]: """The URL arguments as :class:`MultiDict`.""" if self._query_string is not None: raise AttributeError("a query string is defined") @@ -616,7 +616,7 @@ def args(self) -> MultiDict: return self._args @args.setter - def args(self, value: MultiDict | None) -> None: + def args(self, value: MultiDict[str, str] | None) -> None: self._query_string = None self._args = value @@ -809,10 +809,12 @@ def __init__( if response_wrapper in {None, Response}: response_wrapper = TestResponse - elif not isinstance(response_wrapper, TestResponse): + elif response_wrapper is not None and not issubclass( + response_wrapper, TestResponse + ): response_wrapper = type( "WrapperTestResponse", - (TestResponse, response_wrapper), # type: ignore + (TestResponse, response_wrapper), {}, ) @@ -1111,8 +1113,8 @@ def open( finally: builder.close() - response = self.run_wsgi_app(request.environ, buffered=buffered) - response = self.response_wrapper(*response, request=request) + response_parts = self.run_wsgi_app(request.environ, buffered=buffered) + response = self.response_wrapper(*response_parts, request=request) redirects = set() history: list[TestResponse] = [] diff --git a/libs/werkzeug/testapp.py b/libs/werkzeug/testapp.py index 57f1f6fdf..cdf7fac1a 100644 --- a/libs/werkzeug/testapp.py +++ b/libs/werkzeug/testapp.py @@ -1,8 +1,10 @@ """A small application that can be used to test a WSGI server and check it for WSGI compliance. """ + from __future__ import annotations +import importlib.metadata import os import sys import typing as t @@ -10,7 +12,6 @@ from markupsafe import escape -from . import __version__ as _werkzeug_version from .wrappers.request import Request from .wrappers.response import Response @@ -153,13 +154,13 @@ def test_app(req: Request) -> Response: sys_path = [] for item, virtual, expanded in iter_sys_path(): - class_ = [] + css = [] if virtual: - class_.append("virtual") + css.append("virtual") if expanded: - class_.append("exp") - class_ = f' class="{" ".join(class_)}"' if class_ else "" - sys_path.append(f"<li{class_}>{escape(item)}") + css.append("exp") + class_str = f' class="{" ".join(css)}"' if css else "" + sys_path.append(f"<li{class_str}>{escape(item)}") context = { "python_version": "<br>".join(escape(sys.version).splitlines()), @@ -167,7 +168,7 @@ def test_app(req: Request) -> Response: "os": escape(os.name), "api_version": sys.api_version, "byteorder": sys.byteorder, - "werkzeug_version": _werkzeug_version, + "werkzeug_version": _get_werkzeug_version(), "python_eggs": "\n".join(python_eggs), "wsgi_env": "\n".join(wsgi_env), "sys_path": "\n".join(sys_path), @@ -175,6 +176,18 @@ def test_app(req: Request) -> Response: return Response(TEMPLATE % context, mimetype="text/html") +_werkzeug_version = "" + + +def _get_werkzeug_version() -> str: + global _werkzeug_version + + if not _werkzeug_version: + _werkzeug_version = importlib.metadata.version("werkzeug") + + return _werkzeug_version + + if __name__ == "__main__": from .serving import run_simple diff --git a/libs/werkzeug/urls.py b/libs/werkzeug/urls.py index 4d61e600b..5bffe3928 100644 --- a/libs/werkzeug/urls.py +++ b/libs/werkzeug/urls.py @@ -3,6 +3,7 @@ import codecs import re import typing as t +import urllib.parse from urllib.parse import quote from urllib.parse import unquote from urllib.parse import urlencode @@ -164,25 +165,11 @@ def iri_to_uri(iri: str) -> str: return urlunsplit((parts.scheme, netloc, path, query, fragment)) -def _invalid_iri_to_uri(iri: str) -> str: - """The URL scheme ``itms-services://`` must contain the ``//`` even though it does - not have a host component. There may be other invalid schemes as well. Currently, - responses will always call ``iri_to_uri`` on the redirect ``Location`` header, which - removes the ``//``. For now, if the IRI only contains ASCII and does not contain - spaces, pass it on as-is. In Werkzeug 3.0, this should become a - ``response.process_location`` flag. - - :meta private: - """ - try: - iri.encode("ascii") - except UnicodeError: - pass - else: - if len(iri.split(None, 1)) == 1: - return iri - - return iri_to_uri(iri) +# Python < 3.12 +# itms-services was worked around in previous iri_to_uri implementations, but +# we can tell Python directly that it needs to preserve the //. +if "itms-services" not in urllib.parse.uses_netloc: + urllib.parse.uses_netloc.append("itms-services") def _decode_idna(domain: str) -> str: diff --git a/libs/werkzeug/utils.py b/libs/werkzeug/utils.py index 785ac28b9..59b97b732 100644 --- a/libs/werkzeug/utils.py +++ b/libs/werkzeug/utils.py @@ -26,6 +26,7 @@ if t.TYPE_CHECKING: from _typeshed.wsgi import WSGIEnvironment + from .wrappers.request import Request from .wrappers.response import Response @@ -316,7 +317,7 @@ def append_slash_redirect(environ: WSGIEnvironment, code: int = 308) -> Response def send_file( - path_or_file: os.PathLike | str | t.IO[bytes], + path_or_file: os.PathLike[str] | str | t.IO[bytes], environ: WSGIEnvironment, mimetype: str | None = None, as_attachment: bool = False, @@ -327,7 +328,7 @@ def send_file( max_age: None | (int | t.Callable[[str | None], int | None]) = None, use_x_sendfile: bool = False, response_class: type[Response] | None = None, - _root_path: os.PathLike | str | None = None, + _root_path: os.PathLike[str] | str | None = None, ) -> Response: """Send the contents of a file to the client. @@ -415,7 +416,7 @@ def send_file( if isinstance(path_or_file, (os.PathLike, str)) or hasattr( path_or_file, "__fspath__" ): - path_or_file = t.cast(t.Union[os.PathLike, str], path_or_file) + path_or_file = t.cast("t.Union[os.PathLike[str], str]", path_or_file) # Flask will pass app.root_path, allowing its send_file wrapper # to not have to deal with paths. @@ -514,7 +515,7 @@ def send_file( if isinstance(etag, str): rv.set_etag(etag) elif etag and path is not None: - check = adler32(path.encode("utf-8")) & 0xFFFFFFFF + check = adler32(path.encode()) & 0xFFFFFFFF rv.set_etag(f"{mtime}-{size}-{check}") if conditional: @@ -535,8 +536,8 @@ def send_file( def send_from_directory( - directory: os.PathLike | str, - path: os.PathLike | str, + directory: os.PathLike[str] | str, + path: os.PathLike[str] | str, environ: WSGIEnvironment, **kwargs: t.Any, ) -> Response: @@ -560,20 +561,20 @@ def send_from_directory( .. versionadded:: 2.0 Adapted from Flask's implementation. """ - path = safe_join(os.fspath(directory), os.fspath(path)) + path_str = safe_join(os.fspath(directory), os.fspath(path)) - if path is None: + if path_str is None: raise NotFound() # Flask will pass app.root_path, allowing its send_from_directory # wrapper to not have to deal with paths. if "_root_path" in kwargs: - path = os.path.join(kwargs["_root_path"], path) + path_str = os.path.join(kwargs["_root_path"], path_str) - if not os.path.isfile(path): + if not os.path.isfile(path_str): raise NotFound() - return send_file(path, environ, **kwargs) + return send_file(path_str, environ, **kwargs) def import_string(import_name: str, silent: bool = False) -> t.Any: diff --git a/libs/werkzeug/wrappers/__init__.py b/libs/werkzeug/wrappers/__init__.py index b8c45d71c..b36f228f2 100644 --- a/libs/werkzeug/wrappers/__init__.py +++ b/libs/werkzeug/wrappers/__init__.py @@ -1,3 +1,3 @@ from .request import Request as Request from .response import Response as Response -from .response import ResponseStream +from .response import ResponseStream as ResponseStream diff --git a/libs/werkzeug/wrappers/request.py b/libs/werkzeug/wrappers/request.py index 25b091691..344f28b60 100644 --- a/libs/werkzeug/wrappers/request.py +++ b/libs/werkzeug/wrappers/request.py @@ -1,5 +1,6 @@ from __future__ import annotations +import collections.abc as cabc import functools import json import typing as t @@ -182,13 +183,13 @@ def my_wsgi_app(request): from ..exceptions import HTTPException @functools.wraps(f) - def application(*args): # type: ignore + def application(*args: t.Any) -> cabc.Iterable[bytes]: request = cls(args[-2]) with request: try: resp = f(*args[:-2] + (request,)) except HTTPException as e: - resp = e.get_response(args[-2]) + resp = t.cast("WSGIApplication", e.get_response(args[-2])) return resp(*args[-2:]) return t.cast("WSGIApplication", application) @@ -369,13 +370,12 @@ def data(self) -> bytes: return self.get_data(parse_form_data=True) @t.overload - def get_data( # type: ignore + def get_data( self, cache: bool = True, as_text: t.Literal[False] = False, parse_form_data: bool = False, - ) -> bytes: - ... + ) -> bytes: ... @t.overload def get_data( @@ -383,8 +383,7 @@ def get_data( cache: bool = True, as_text: t.Literal[True] = ..., parse_form_data: bool = False, - ) -> str: - ... + ) -> str: ... def get_data( self, cache: bool = True, as_text: bool = False, parse_form_data: bool = False @@ -564,14 +563,12 @@ def json(self) -> t.Any | None: @t.overload def get_json( self, force: bool = ..., silent: t.Literal[False] = ..., cache: bool = ... - ) -> t.Any: - ... + ) -> t.Any: ... @t.overload def get_json( self, force: bool = ..., silent: bool = ..., cache: bool = ... - ) -> t.Any | None: - ... + ) -> t.Any | None: ... def get_json( self, force: bool = False, silent: bool = False, cache: bool = True diff --git a/libs/werkzeug/wrappers/response.py b/libs/werkzeug/wrappers/response.py index ee5c69478..7f01287c7 100644 --- a/libs/werkzeug/wrappers/response.py +++ b/libs/werkzeug/wrappers/response.py @@ -5,26 +5,26 @@ from http import HTTPStatus from urllib.parse import urljoin +from .._internal import _get_environ from ..datastructures import Headers +from ..http import generate_etag +from ..http import http_date +from ..http import is_resource_modified +from ..http import parse_etags +from ..http import parse_range_header from ..http import remove_entity_headers from ..sansio.response import Response as _SansIOResponse -from ..urls import _invalid_iri_to_uri from ..urls import iri_to_uri from ..utils import cached_property +from ..wsgi import _RangeWrapper from ..wsgi import ClosingIterator from ..wsgi import get_current_url -from werkzeug._internal import _get_environ -from werkzeug.http import generate_etag -from werkzeug.http import http_date -from werkzeug.http import is_resource_modified -from werkzeug.http import parse_etags -from werkzeug.http import parse_range_header -from werkzeug.wsgi import _RangeWrapper if t.TYPE_CHECKING: from _typeshed.wsgi import StartResponse from _typeshed.wsgi import WSGIApplication from _typeshed.wsgi import WSGIEnvironment + from .request import Request @@ -260,12 +260,10 @@ def from_app( return cls(*run_wsgi_app(app, environ, buffered)) @t.overload - def get_data(self, as_text: t.Literal[False] = False) -> bytes: - ... + def get_data(self, as_text: t.Literal[False] = False) -> bytes: ... @t.overload - def get_data(self, as_text: t.Literal[True]) -> str: - ... + def get_data(self, as_text: t.Literal[True]) -> str: ... def get_data(self, as_text: bool = False) -> bytes | str: """The string representation of the response body. Whenever you call @@ -480,7 +478,7 @@ def get_wsgi_headers(self, environ: WSGIEnvironment) -> Headers: content_length = value if location is not None: - location = _invalid_iri_to_uri(location) + location = iri_to_uri(location) if self.autocorrect_location_header: # Make the location header an absolute URL. @@ -595,12 +593,10 @@ def json(self) -> t.Any | None: return self.get_json() @t.overload - def get_json(self, force: bool = ..., silent: t.Literal[False] = ...) -> t.Any: - ... + def get_json(self, force: bool = ..., silent: t.Literal[False] = ...) -> t.Any: ... @t.overload - def get_json(self, force: bool = ..., silent: bool = ...) -> t.Any | None: - ... + def get_json(self, force: bool = ..., silent: bool = ...) -> t.Any | None: ... def get_json(self, force: bool = False, silent: bool = False) -> t.Any | None: """Parse :attr:`data` as JSON. Useful during testing. diff --git a/libs/yaml/__init__.py b/libs/yaml/__init__.py index 824936194..2ec4f203c 100644 --- a/libs/yaml/__init__.py +++ b/libs/yaml/__init__.py @@ -8,7 +8,7 @@ from .loader import * from .dumper import * -__version__ = '6.0.1' +__version__ = '6.0.2' try: from .cyaml import * __with_libyaml__ = True diff --git a/libs/zipp-3.17.0.dist-info/RECORD b/libs/zipp-3.17.0.dist-info/RECORD deleted file mode 100644 index 5994e25b6..000000000 --- a/libs/zipp-3.17.0.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -zipp-3.17.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -zipp-3.17.0.dist-info/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023 -zipp-3.17.0.dist-info/METADATA,sha256=bD_qvS324MIYXaThQ1mhk358dp6DCRDAB_Rus_Re2f8,3740 -zipp-3.17.0.dist-info/RECORD,, -zipp-3.17.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -zipp-3.17.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -zipp-3.17.0.dist-info/top_level.txt,sha256=iAbdoSHfaGqBfVb2XuR9JqSQHCoOsOtG6y9C_LSpqFw,5 -zipp/__init__.py,sha256=sJklStuqI1GxLgvyo4slmA_C1dMWUSUGUiY_7_C97Nk,11164 -zipp/glob.py,sha256=HAHyKxFoTE4qpHBRpF7ow1wqyNlTjC7860MVvllW7d8,899 -zipp/py310compat.py,sha256=eZpkW0zRtunkhEh8jjX3gCGe22emoKCBJw72Zt4RkhA,219 diff --git a/libs/zipp-3.17.0.dist-info/WHEEL b/libs/zipp-3.17.0.dist-info/WHEEL deleted file mode 100644 index 98c0d20b7..000000000 --- a/libs/zipp-3.17.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/zipp-3.17.0.dist-info/INSTALLER b/libs/zipp-3.20.2.dist-info/INSTALLER similarity index 100% rename from libs/zipp-3.17.0.dist-info/INSTALLER rename to libs/zipp-3.20.2.dist-info/INSTALLER diff --git a/libs/zipp-3.17.0.dist-info/LICENSE b/libs/zipp-3.20.2.dist-info/LICENSE similarity index 100% rename from libs/zipp-3.17.0.dist-info/LICENSE rename to libs/zipp-3.20.2.dist-info/LICENSE diff --git a/libs/zipp-3.17.0.dist-info/METADATA b/libs/zipp-3.20.2.dist-info/METADATA similarity index 55% rename from libs/zipp-3.17.0.dist-info/METADATA rename to libs/zipp-3.20.2.dist-info/METADATA index 14a952664..cf6be8388 100644 --- a/libs/zipp-3.17.0.dist-info/METADATA +++ b/libs/zipp-3.20.2.dist-info/METADATA @@ -1,45 +1,49 @@ Metadata-Version: 2.1 Name: zipp -Version: 3.17.0 +Version: 3.20.2 Summary: Backport of pathlib-compatible object wrapper for zip files -Home-page: https://github.com/jaraco/zipp -Author: Jason R. Coombs -Author-email: jaraco@jaraco.com +Author-email: "Jason R. Coombs" <jaraco@jaraco.com> +Project-URL: Source, https://github.com/jaraco/zipp Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only Requires-Python: >=3.8 +Description-Content-Type: text/x-rst License-File: LICENSE -Provides-Extra: docs -Requires-Dist: sphinx >=3.5 ; extra == 'docs' -Requires-Dist: sphinx <7.2.5 ; extra == 'docs' -Requires-Dist: jaraco.packaging >=9.3 ; 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: 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: jaraco.itertools ; extra == 'testing' -Requires-Dist: jaraco.functools ; extra == 'testing' -Requires-Dist: more-itertools ; extra == 'testing' -Requires-Dist: big-O ; extra == 'testing' -Requires-Dist: pytest-ignore-flaky ; 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' +Provides-Extra: check +Requires-Dist: pytest-checkdocs >=2.4 ; extra == 'check' +Requires-Dist: pytest-ruff >=0.2.1 ; (sys_platform != "cygwin") and extra == 'check' +Provides-Extra: cover +Requires-Dist: pytest-cov ; extra == 'cover' +Provides-Extra: doc +Requires-Dist: sphinx >=3.5 ; extra == 'doc' +Requires-Dist: jaraco.packaging >=9.3 ; extra == 'doc' +Requires-Dist: rst.linker >=1.9 ; extra == 'doc' +Requires-Dist: furo ; extra == 'doc' +Requires-Dist: sphinx-lint ; extra == 'doc' +Requires-Dist: jaraco.tidelift >=1.4 ; extra == 'doc' +Provides-Extra: enabler +Requires-Dist: pytest-enabler >=2.2 ; extra == 'enabler' +Provides-Extra: test +Requires-Dist: pytest !=8.1.*,>=6 ; extra == 'test' +Requires-Dist: jaraco.itertools ; extra == 'test' +Requires-Dist: jaraco.functools ; extra == 'test' +Requires-Dist: more-itertools ; extra == 'test' +Requires-Dist: big-O ; extra == 'test' +Requires-Dist: pytest-ignore-flaky ; extra == 'test' +Requires-Dist: jaraco.test ; extra == 'test' +Requires-Dist: importlib-resources ; (python_version < "3.9") and extra == 'test' +Provides-Extra: type +Requires-Dist: pytest-mypy ; extra == 'type' .. image:: https://img.shields.io/pypi/v/zipp.svg :target: https://pypi.org/project/zipp .. image:: https://img.shields.io/pypi/pyversions/zipp.svg -.. image:: https://github.com/jaraco/zipp/workflows/tests/badge.svg +.. image:: https://github.com/jaraco/zipp/actions/workflows/main.yml/badge.svg :target: https://github.com/jaraco/zipp/actions?query=workflow%3A%22tests%22 :alt: tests @@ -47,14 +51,10 @@ Requires-Dist: pytest-mypy >=0.9.1 ; (platform_python_implementation != "PyPy") :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/zipp/badge/?version=latest +.. :target: https://zipp.readthedocs.io/en/latest/?badge=latest -.. .. image:: https://readthedocs.org/projects/PROJECT_RTD/badge/?version=latest -.. :target: https://PROJECT_RTD.readthedocs.io/en/latest/?badge=latest - -.. image:: https://img.shields.io/badge/skeleton-2023-informational +.. image:: https://img.shields.io/badge/skeleton-2024-informational :target: https://blog.jaraco.com/skeleton .. image:: https://tidelift.com/badges/package/pypi/zipp @@ -77,7 +77,9 @@ were contributed to different versions in the standard library: * - zipp - stdlib - * - 3.15 + * - 3.18 + - 3.13 + * - 3.16 - 3.12 * - 3.5 - 3.11 diff --git a/libs/zipp-3.20.2.dist-info/RECORD b/libs/zipp-3.20.2.dist-info/RECORD new file mode 100644 index 000000000..b53660496 --- /dev/null +++ b/libs/zipp-3.20.2.dist-info/RECORD @@ -0,0 +1,12 @@ +zipp-3.20.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +zipp-3.20.2.dist-info/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023 +zipp-3.20.2.dist-info/METADATA,sha256=BY9j659m6ayOwffzL5nKNwcZW5S5Ms2LVHQJ4qspY1g,3682 +zipp-3.20.2.dist-info/RECORD,, +zipp-3.20.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +zipp-3.20.2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +zipp-3.20.2.dist-info/top_level.txt,sha256=iAbdoSHfaGqBfVb2XuR9JqSQHCoOsOtG6y9C_LSpqFw,5 +zipp/__init__.py,sha256=WFZd5W532NrC0tyPAEqzjk2xifPH7BePG0L2PPihoM0,11831 +zipp/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +zipp/compat/overlay.py,sha256=oEIGAnbr8yGjuKTrVSO2ByewPui71uppbX18BLnYTKE,783 +zipp/compat/py310.py,sha256=KS3sidGTSkoGh3biXiCqRzE6RMEGH0sbRQBevWU73dU,256 +zipp/glob.py,sha256=yPjGfHwcJxUn0fld7I-K-ZQSfTaJBBoimCIygU1SZQw,3315 diff --git a/libs/zipp-3.17.0.dist-info/REQUESTED b/libs/zipp-3.20.2.dist-info/REQUESTED similarity index 100% rename from libs/zipp-3.17.0.dist-info/REQUESTED rename to libs/zipp-3.20.2.dist-info/REQUESTED diff --git a/libs/zipp-3.20.2.dist-info/WHEEL b/libs/zipp-3.20.2.dist-info/WHEEL new file mode 100644 index 000000000..da25d7b42 --- /dev/null +++ b/libs/zipp-3.20.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.2.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/zipp-3.17.0.dist-info/top_level.txt b/libs/zipp-3.20.2.dist-info/top_level.txt similarity index 100% rename from libs/zipp-3.17.0.dist-info/top_level.txt rename to libs/zipp-3.20.2.dist-info/top_level.txt diff --git a/libs/zipp/__init__.py b/libs/zipp/__init__.py index becd010a9..161a4fb1c 100644 --- a/libs/zipp/__init__.py +++ b/libs/zipp/__init__.py @@ -1,3 +1,12 @@ +""" +A Path-like interface for zipfiles. + +This codebase is shared between zipfile.Path in the stdlib +and zipp in PyPI. See +https://github.com/python/importlib_metadata/wiki/Development-Methodology +for more detail. +""" + import io import posixpath import zipfile @@ -5,9 +14,11 @@ import contextlib import pathlib import re +import stat +import sys -from .py310compat import text_encoding -from .glob import translate +from .compat.py310 import text_encoding +from .glob import Translator __all__ = ['Path'] @@ -35,7 +46,7 @@ def _parents(path): def _ancestry(path): """ Given a path with elements separated by - posixpath.sep, generate all elements of that path + posixpath.sep, generate all elements of that path. >>> list(_ancestry('b/d')) ['b/d', 'b'] @@ -47,9 +58,14 @@ def _ancestry(path): ['b'] >>> list(_ancestry('')) [] + + Multiple separators are treated like a single. + + >>> list(_ancestry('//b//d///f//')) + ['//b//d///f', '//b//d', '//b'] """ path = path.rstrip(posixpath.sep) - while path and path != posixpath.sep: + while path.rstrip(posixpath.sep): yield path path, tail = posixpath.split(path) @@ -179,13 +195,18 @@ def _name_set(self): def _extract_text_encoding(encoding=None, *args, **kwargs): - # stacklevel=3 so that the caller of the caller see any warning. - return text_encoding(encoding, 3), args, kwargs + # compute stack level so that the caller of the caller sees any warning. + is_pypy = sys.implementation.name == 'pypy' + stack_level = 3 + is_pypy + return text_encoding(encoding, stack_level), args, kwargs class Path: """ - A pathlib-compatible interface for zip files. + A :class:`importlib.resources.abc.Traversable` interface for zip files. + + Implements many of the features users enjoy from + :class:`pathlib.Path`. Consider a zip file with this structure:: @@ -260,7 +281,7 @@ class Path: >>> str(path.parent) 'mem' - If the zipfile has no filename, such attribtues are not + If the zipfile has no filename, such attributes are not valid and accessing them will raise an Exception. >>> zf.filename = None @@ -388,16 +409,19 @@ def match(self, path_pattern): def is_symlink(self): """ - Return whether this path is a symlink. Always false (python/cpython#82102). + Return whether this path is a symlink. """ - return False + info = self.root.getinfo(self.at) + mode = info.external_attr >> 16 + return stat.S_ISLNK(mode) def glob(self, pattern): if not pattern: raise ValueError(f"Unacceptable pattern: {pattern!r}") prefix = re.escape(self.at) - matches = re.compile(prefix + translate(pattern)).fullmatch + tr = Translator(seps='/') + matches = re.compile(prefix + tr.translate(pattern)).fullmatch return map(self._next, filter(matches, self.root.namelist())) def rglob(self, pattern): diff --git a/libs/importlib_resources/tests/data02/__init__.py b/libs/zipp/compat/__init__.py similarity index 100% rename from libs/importlib_resources/tests/data02/__init__.py rename to libs/zipp/compat/__init__.py diff --git a/libs/zipp/compat/overlay.py b/libs/zipp/compat/overlay.py new file mode 100644 index 000000000..5a97ee7cd --- /dev/null +++ b/libs/zipp/compat/overlay.py @@ -0,0 +1,37 @@ +""" +Expose zipp.Path as .zipfile.Path. + +Includes everything else in ``zipfile`` to match future usage. Just +use: + +>>> from zipp.compat.overlay import zipfile + +in place of ``import zipfile``. + +Relative imports are supported too. + +>>> from zipp.compat.overlay.zipfile import ZipInfo + +The ``zipfile`` object added to ``sys.modules`` needs to be +hashable (#126). + +>>> _ = hash(sys.modules['zipp.compat.overlay.zipfile']) +""" + +import importlib +import sys +import types + +import zipp + + +class HashableNamespace(types.SimpleNamespace): + def __hash__(self): + return hash(tuple(vars(self))) + + +zipfile = HashableNamespace(**vars(importlib.import_module('zipfile'))) +zipfile.Path = zipp.Path +zipfile._path = zipp + +sys.modules[__name__ + '.zipfile'] = zipfile # type: ignore[assignment] diff --git a/libs/zipp/py310compat.py b/libs/zipp/compat/py310.py similarity index 51% rename from libs/zipp/py310compat.py rename to libs/zipp/compat/py310.py index d5ca53e03..8264a482f 100644 --- a/libs/zipp/py310compat.py +++ b/libs/zipp/compat/py310.py @@ -7,5 +7,7 @@ def _text_encoding(encoding, stacklevel=2, /): # pragma: no cover text_encoding = ( - io.text_encoding if sys.version_info > (3, 10) else _text_encoding # type: ignore + io.text_encoding # type: ignore[unused-ignore, attr-defined] + if sys.version_info > (3, 10) + else _text_encoding ) diff --git a/libs/zipp/glob.py b/libs/zipp/glob.py index 63ff8b9cb..4320f1c0b 100644 --- a/libs/zipp/glob.py +++ b/libs/zipp/glob.py @@ -1,18 +1,105 @@ +import os import re -def translate(pattern): - r""" - Given a glob pattern, produce a regex that matches it. +_default_seps = os.sep + str(os.altsep) * bool(os.altsep) - >>> translate('*.txt') - '[^/]*\\.txt' - >>> translate('a?txt') - 'a[^/]txt' - >>> translate('**/*') - '.*/[^/]*' + +class Translator: + """ + >>> Translator('xyz') + Traceback (most recent call last): + ... + AssertionError: Invalid separators + + >>> Translator('') + Traceback (most recent call last): + ... + AssertionError: Invalid separators """ - return ''.join(map(replace, separate(pattern))) + + seps: str + + def __init__(self, seps: str = _default_seps): + assert seps and set(seps) <= set(_default_seps), "Invalid separators" + self.seps = seps + + def translate(self, pattern): + """ + Given a glob pattern, produce a regex that matches it. + """ + return self.extend(self.match_dirs(self.translate_core(pattern))) + + def extend(self, pattern): + r""" + Extend regex for pattern-wide concerns. + + Apply '(?s:)' to create a non-matching group that + matches newlines (valid on Unix). + + Append '\Z' to imply fullmatch even when match is used. + """ + return rf'(?s:{pattern})\Z' + + def match_dirs(self, pattern): + """ + Ensure that zipfile.Path directory names are matched. + + zipfile.Path directory names always end in a slash. + """ + return rf'{pattern}[/]?' + + def translate_core(self, pattern): + r""" + Given a glob pattern, produce a regex that matches it. + + >>> t = Translator() + >>> t.translate_core('*.txt').replace('\\\\', '') + '[^/]*\\.txt' + >>> t.translate_core('a?txt') + 'a[^/]txt' + >>> t.translate_core('**/*').replace('\\\\', '') + '.*/[^/][^/]*' + """ + self.restrict_rglob(pattern) + return ''.join(map(self.replace, separate(self.star_not_empty(pattern)))) + + def replace(self, match): + """ + Perform the replacements for a match from :func:`separate`. + """ + return match.group('set') or ( + re.escape(match.group(0)) + .replace('\\*\\*', r'.*') + .replace('\\*', rf'[^{re.escape(self.seps)}]*') + .replace('\\?', r'[^/]') + ) + + def restrict_rglob(self, pattern): + """ + Raise ValueError if ** appears in anything but a full path segment. + + >>> Translator().translate('**foo') + Traceback (most recent call last): + ... + ValueError: ** must appear alone in a path segment + """ + seps_pattern = rf'[{re.escape(self.seps)}]+' + segments = re.split(seps_pattern, pattern) + if any('**' in segment and segment != '**' for segment in segments): + raise ValueError("** must appear alone in a path segment") + + def star_not_empty(self, pattern): + """ + Ensure that * will not match an empty segment. + """ + + def handle_segment(match): + segment = match.group(0) + return '?*' if segment == '*' else segment + + not_seps_pattern = rf'[^{re.escape(self.seps)}]+' + return re.sub(not_seps_pattern, handle_segment, pattern) def separate(pattern): @@ -25,16 +112,3 @@ def separate(pattern): ['a', '[?]', 'txt'] """ return re.finditer(r'([^\[]+)|(?P<set>[\[].*?[\]])|([\[][^\]]*$)', pattern) - - -def replace(match): - """ - Perform the replacements for a match from :func:`separate`. - """ - - return match.group('set') or ( - re.escape(match.group(0)) - .replace('\\*\\*', r'.*') - .replace('\\*', r'[^/]*') - .replace('\\?', r'[^/]') - ) From cdbf1674dd4714e4fe276a6bff8e7b3605458729 Mon Sep 17 00:00:00 2001 From: morpheus65535 <louis_vezina@hotmail.com> Date: Mon, 28 Oct 2024 23:37:50 -0400 Subject: [PATCH 2/7] no log: some cleanup --- libs/CHANGELOG.md | 638 ------------------ libs/README.md | 143 ---- .../zoneinfo/_czoneinfo.cpython-38-darwin.so | Bin 37616 -> 0 bytes libs/bin/ftfy | 8 - .../markupsafe/_speedups.cpython-38-darwin.so | Bin 18712 -> 0 bytes libs/msgpack/_cmsgpack.cpython-38-darwin.so | Bin 181448 -> 0 bytes libs/pvectorc.cpython-38-darwin.so | Bin 39120 -> 0 bytes .../collections.cpython-38-darwin.so | Bin 233760 -> 0 bytes .../immutabledict.cpython-38-darwin.so | Bin 94672 -> 0 bytes .../processors.cpython-38-darwin.so | Bin 75976 -> 0 bytes .../resultproxy.cpython-38-darwin.so | Bin 78080 -> 0 bytes .../cyextension/util.cpython-38-darwin.so | Bin 93064 -> 0 bytes 12 files changed, 789 deletions(-) delete mode 100644 libs/CHANGELOG.md delete mode 100644 libs/README.md delete mode 100755 libs/backports/zoneinfo/_czoneinfo.cpython-38-darwin.so delete mode 100755 libs/bin/ftfy delete mode 100755 libs/markupsafe/_speedups.cpython-38-darwin.so delete mode 100755 libs/msgpack/_cmsgpack.cpython-38-darwin.so delete mode 100755 libs/pvectorc.cpython-38-darwin.so delete mode 100755 libs/sqlalchemy/cyextension/collections.cpython-38-darwin.so delete mode 100755 libs/sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so delete mode 100755 libs/sqlalchemy/cyextension/processors.cpython-38-darwin.so delete mode 100755 libs/sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so delete mode 100755 libs/sqlalchemy/cyextension/util.cpython-38-darwin.so diff --git a/libs/CHANGELOG.md b/libs/CHANGELOG.md deleted file mode 100644 index 042259839..000000000 --- a/libs/CHANGELOG.md +++ /dev/null @@ -1,638 +0,0 @@ -## Version 6.2.0 (March 16, 2024) - -- Fixed a case where an en-dash and a space near other mojibake would be - interpreted (probably incorrectly) as MacRoman mojibake. -- Added [project.urls] metadata to pyproject.toml. -- README contains license clarifications for entitled jerks. - -## Version 6.1.3 (November 21, 2023) - -- Updated wcwidth. -- Switched to the Apache 2.0 license. -- Dropped support for Python 3.7. - -## Version 6.1.2 (February 17, 2022) - -- Added type information for `guess_bytes`. - -## Version 6.1.1 (February 9, 2022) - -- Updated the heuristic to fix the letter ß in UTF-8/MacRoman mojibake, - which had regressed since version 5.6. - -- Packaging fixes to pyproject.toml. - -## Version 6.1 (February 9, 2022) - -- Updated the heuristic to fix the letter Ñ with more confidence. - -- Fixed type annotations and added py.typed. - -- ftfy is packaged using Poetry now, and wheels are created and uploaded to - PyPI. - -## Version 6.0.3 (May 14, 2021) - -- Allow the keyword argument `fix_entities` as a deprecated alias for - `unescape_html`, raising a warning. - -- `ftfy.formatting` functions now disregard ANSI terminal escapes when - calculating text width. - - -## Version 6.0.2 (May 4, 2021) - -This version is purely a cosmetic change, updating the maintainer's e-mail -address and the project's canonical location on GitHub. - - -## Version 6.0.1 (April 12, 2021) - -- The `remove_terminal_escapes` step was accidentally not being used. This - version restores it. - -- Specified in setup.py that ftfy 6 requires Python 3.6 or later. - -- Use a lighter link color when the docs are viewed in dark mode. - -## Version 6.0 (April 2, 2021) - -- New function: `ftfy.fix_and_explain()` can describe all the transformations - that happen when fixing a string. This is similar to what - `ftfy.fixes.fix_encoding_and_explain()` did in previous versions, but it - can fix more than the encoding. - -- `fix_and_explain()` and `fix_encoding_and_explain()` are now in the top-level - ftfy module. - -- Changed the heuristic entirely. ftfy no longer needs to categorize every - Unicode character, but only characters that are expected to appear in - mojibake. - -- Because of the new heuristic, ftfy will no longer have to release a new - version for every new version of Unicode. It should also run faster and - use less RAM when imported. - -- The heuristic `ftfy.badness.is_bad(text)` can be used to determine whether - there appears to be mojibake in a string. Some users were already using - the old function `sequence_weirdness()` for that, but this one is actually - designed for that purpose. - -- Instead of a pile of named keyword arguments, ftfy functions now take in - a TextFixerConfig object. The keyword arguments still work, and become - settings that override the defaults in TextFixerConfig. - -- Added support for UTF-8 mixups with Windows-1253 and Windows-1254. - -- Overhauled the documentation: https://ftfy.readthedocs.org - -## Version 5.9 (February 10, 2021) - -This version is brought to you by the letter à and the number 0xC3. - -- Tweaked the heuristic to decode, for example, "à" as the letter "à" - more often. - -- This combines with the non-breaking-space fixer to decode "à " as "à" as - well. However, in many cases, the text " à " was intended to be " à ", - preserving the space -- the underlying mojibake had two spaces after it, but - the Web coalesced them into one. We detect this case based on common French - and Portuguese words, and preserve the space when it appears intended. - -Thanks to @zehavoc for bringing to my attention how common this case is. - -- Updated the data file of Unicode character categories to Unicode 13, as - used in Python 3.9. (No matter what version of Python you're on, ftfy uses - the same data.) - -## Version 5.8 (July 17, 2020) - -- Improved detection of UTF-8 mojibake of Greek, Cyrillic, Hebrew, and Arabic - scripts. - -- Fixed the undeclared dependency on setuptools by removing the use of - `pkg_resources`. - -## Version 5.7 (February 18, 2020) - -- Updated the data file of Unicode character categories to Unicode 12.1, as - used in Python 3.8. (No matter what version of Python you're on, ftfy uses - the same data.) - -- Corrected an omission where short sequences involving the ACUTE ACCENT - character were not being fixed. - -## Version 5.6 (August 7, 2019) - -- The `unescape_html` function now supports all the HTML5 entities that appear - in `html.entities.html5`, including those with long names such as - `˝`. - -- Unescaping of numeric HTML entities now uses the standard library's - `html.unescape`, making edge cases consistent. - - (The reason we don't run `html.unescape` on all text is that it's not always - appropriate to apply, and can lead to false positive fixes. The text - "This&NotThat" should not have "&Not" replaced by a symbol, as - `html.unescape` would do.) - -- On top of Python's support for HTML5 entities, ftfy will also convert HTML - escapes of common Latin capital letters that are (nonstandardly) written - in all caps, such as `&NTILDE;` for `Ñ`. - - -## Version 5.5.1 (September 14, 2018) - -- Added Python 3.7 support. - -- Updated the data file of Unicode character categories to Unicode 11, as used - in Python 3.7.0. (No matter what version of Python you're on, ftfy uses the - same data.) - - -## Version 5.5 (September 6, 2018) - -- Recent versions have emphasized making a reasonable attempt to fix short, - common mojibake sequences, such as `û`. In this version, we've expanded the - heuristics to recognize these sequences in MacRoman as well as Windows-125x - encodings. - -- A related rule for fixing isolated Windows-1252/UTF-8 mixups, even when they - were inconsistent with the rest of the string, claimed to work on Latin-1/UTF-8 - mixups as well, but in practice it didn't. We've made the rule more robust. - -- Fixed a failure when testing the CLI on Windows. - -- Removed the `pytest-runner` invocation from setup.py, as it created complex - dependencies that would stop setup.py from working in some environments. - The `pytest` command still works fine. `pytest-runner` is just too clever. - - -## Version 5.4.1 (June 14, 2018) - -- Fixed a bug in the `setup.py` metadata. - - This bug was causing ftfy, a package that fixes encoding mismatches, to not - install in some environments due to an encoding mismatch. (We were really - putting the "meta" in "metadata" here.) - - -## Version 5.4 (June 1, 2018) - -- ftfy was still too conservative about fixing short mojibake sequences, - such as "août" -> "août", when the broken version contained punctuation - such as curly or angle quotation marks. - - The new heuristic observes in some cases that, even if quotation marks are - expected to appear next to letters, it is strange to have an accented capital - A before the quotation mark and more letters after the quotation mark. - -- Provides better metadata for the new PyPI. - -- Switched from nosetests to pytest. - - -## Version 5.3 (January 25, 2018) - -- A heuristic has been too conservative since version 4.2, causing a regression - compared to previous versions: ftfy would fail to fix mojibake of common - characters such as `á` when seen in isolation. A new heuristic now makes it - possible to fix more of these common cases with less evidence. - - -## Version 5.2 (November 27, 2017) - -- The command-line tool will not accept the same filename as its input - and output. (Previously, this would write a zero-length file.) - -- The `uncurl_quotes` fixer, which replaces curly quotes with straight quotes, - now also replaces MODIFIER LETTER APOSTROPHE. - -- Codepoints that contain two Latin characters crammed together for legacy - encoding reasons are replaced by those two separate characters, even in NFC - mode. We formerly did this just with ligatures such as `fi` and `IJ`, but now - this includes the Afrikaans digraph `ʼn` and Serbian/Croatian digraphs such as - `dž`. - - -## Version 5.1.1 and 4.4.3 (May 15, 2017) - -These releases fix two unrelated problems with the tests, one in each version. - -- v5.1.1: fixed the CLI tests (which are new in v5) so that they pass - on Windows, as long as the Python output encoding is UTF-8. - -- v4.4.3: added the `# coding: utf-8` declaration to two files that were - missing it, so that tests can run on Python 2. - -## Version 5.1 (April 7, 2017) - -- Removed the dependency on `html5lib` by dropping support for Python 3.2. - - We previously used the dictionary `html5lib.constants.entities` to decode - HTML entities. In Python 3.3 and later, that exact dictionary is now in the - standard library as `html.entities.html5`. - -- Moved many test cases about how particular text should be fixed into - `test_cases.json`, which may ease porting to other languages. - -The functionality of this version remains the same as 5.0.2 and 4.4.2. - - -## Version 5.0.2 and 4.4.2 (March 21, 2017) - -Added a `MANIFEST.in` that puts files such as the license file and this -changelog inside the source distribution. - - -## Version 5.0.1 and 4.4.1 (March 10, 2017) - -Bug fix: - -- The `unescape_html` fixer will decode entities between `€` and `Ÿ` - as what they would be in Windows-1252, even without the help of - `fix_encoding`. - - This better matches what Web browsers do, and fixes a regression that version - 4.4 introduced in an example that uses `…` as an ellipsis. - - -## Version 5.0 (February 17, 2017) - -Breaking changes: - -- Dropped support for Python 2. If you need Python 2 support, you should get - version 4.4, which has the same features as this version. - -- The top-level functions require their arguments to be given as keyword - arguments. - -Version 5.0 also now has tests for the command-line invocation of ftfy. - - -## Version 4.4.0 (February 17, 2017) - -Heuristic changes: - -- ftfy can now fix mojibake involving the Windows-1250 or ISO-8859-2 encodings. - -- The `fix_entities` fixer is now applied after `fix_encoding`. This makes - more situations resolvable when both fixes are needed. - -- With a few exceptions for commonly-used characters such as `^`, it is now - considered "weird" whenever a diacritic appears in non-combining form, - such as the diaeresis character `¨`. - -- It is also now weird when IPA phonetic letters, besides `ə`, appear next to - capital letters. - -- These changes to the heuristics, and others we've made in recent versions, - let us lower the "cost" for fixing mojibake in some encodings, causing them - to be fixed in more cases. - - -## Version 4.3.1 (January 12, 2017) - -Bug fix: - -- `remove_control_chars` was removing U+0D ('\r') prematurely. That's the - job of `fix_line_breaks`. - - -## Version 4.3.0 (December 29, 2016) - -ftfy has gotten by for four years without dependencies on other Python -libraries, but now we can spare ourselves some code and some maintenance burden -by delegating certain tasks to other libraries that already solve them well. -This version now depends on the `html5lib` and `wcwidth` libraries. - -Feature changes: - -- The `remove_control_chars` fixer will now remove some non-ASCII control - characters as well, such as deprecated Arabic control characters and - byte-order marks. Bidirectional controls are still left as is. - - This should have no impact on well-formed text, while cleaning up many - characters that the Unicode Consortium deems "not suitable for markup" - (see Unicode Technical Report #20). - -- The `unescape_html` fixer uses a more thorough list of HTML entities, - which it imports from `html5lib`. - -- `ftfy.formatting` now uses `wcwidth` to compute the width that a string - will occupy in a text console. - -Heuristic changes: - -- Updated the data file of Unicode character categories to Unicode 9, as used - in Python 3.6.0. (No matter what version of Python you're on, ftfy uses the - same data.) - -Pending deprecations: - -- The `remove_bom` option will become deprecated in 5.0, because it has been - superseded by `remove_control_chars`. - -- ftfy 5.0 will remove the previously deprecated name `fix_text_encoding`. It - was renamed to `fix_encoding` in 4.0. - -- ftfy 5.0 will require Python 3.2 or later, as planned. Python 2 users, please - specify `ftfy < 5` in your dependencies if you haven't already. - - -## Version 4.2.0 (September 28, 2016) - -Heuristic changes: - -- Math symbols next to currency symbols are no longer considered 'weird' by the - heuristic. This fixes a false positive where text that involved the - multiplication sign and British pounds or euros (as in '5×£35') could turn - into Hebrew letters. - -- A heuristic that used to be a bonus for certain punctuation now also gives a - bonus to successfully decoding other common codepoints, such as the - non-breaking space, the degree sign, and the byte order mark. - -- In version 4.0, we tried to "future-proof" the categorization of emoji (as a - kind of symbol) to include codepoints that would likely be assigned to emoji - later. The future happened, and there are even more emoji than we expected. - We have expanded the range to include those emoji, too. - - ftfy is still mostly based on information from Unicode 8 (as Python 3.5 is), - but this expanded range should include the emoji from Unicode 9 and 10. - -- Emoji are increasingly being modified by variation selectors and skin-tone - modifiers. Those codepoints are now grouped with 'symbols' in ftfy, so they - fit right in with emoji, instead of being considered 'marks' as their Unicode - category would suggest. - - This enables fixing mojibake that involves iOS's new diverse emoji. - -- An old heuristic that wasn't necessary anymore considered Latin text with - high-numbered codepoints to be 'weird', but this is normal in languages such - as Vietnamese and Azerbaijani. This does not seem to have caused any false - positives, but it caused ftfy to be too reluctant to fix some cases of broken - text in those languages. - - The heuristic has been changed, and all languages that use Latin letters - should be on even footing now. - - -## Version 4.1.1 (April 13, 2016) - -- Bug fix: in the command-line interface, the `-e` option had no effect on - Python 3 when using standard input. Now, it correctly lets you specify - a different encoding for standard input. - - -## Version 4.1.0 (February 25, 2016) - -Heuristic changes: - -- ftfy can now deal with "lossy" mojibake. If your text has been run through - a strict Windows-1252 decoder, such as the one in Python, it may contain - the replacement character � (U+FFFD) where there were bytes that are - unassigned in Windows-1252. - - Although ftfy won't recover the lost information, it can now detect this - situation, replace the entire lossy character with �, and decode the rest of - the characters. Previous versions would be unable to fix any string that - contained U+FFFD. - - As an example, text in curly quotes that gets corrupted `“ like this â€�` - now gets fixed to be `“ like this �`. - -- Updated the data file of Unicode character categories to Unicode 8.0, as used - in Python 3.5.0. (No matter what version of Python you're on, ftfy uses the - same data.) - -- Heuristics now count characters such as `~` and `^` as punctuation instead - of wacky math symbols, improving the detection of mojibake in some edge cases. - -New features: - -- A new module, `ftfy.formatting`, can be used to justify Unicode text in a - monospaced terminal. It takes into account that each character can take up - anywhere from 0 to 2 character cells. - -- Internally, the `utf-8-variants` codec was simplified and optimized. - - -## Version 4.0.0 (April 10, 2015) - -Breaking changes: - -- The default normalization form is now NFC, not NFKC. NFKC replaces a large - number of characters with 'equivalent' characters, and some of these - replacements are useful, but some are not desirable to do by default. - -- The `fix_text` function has some new options that perform more targeted - operations that are part of NFKC normalization, such as - `fix_character_width`, without requiring hitting all your text with the huge - mallet that is NFKC. - - - If you were already using NFC normalization, or in general if you want to - preserve the *spacing* of CJK text, you should be sure to set - `fix_character_width=False`. - -- The `remove_unsafe_private_use` parameter has been removed entirely, after - two versions of deprecation. The function name `fix_bad_encoding` is also - gone. - -New features: - -- Fixers for strange new forms of mojibake, including particularly clear cases - of mixed UTF-8 and Windows-1252. - -- New heuristics, so that ftfy can fix more stuff, while maintaining - approximately zero false positives. - -- The command-line tool trusts you to know what encoding your *input* is in, - and assumes UTF-8 by default. You can still tell it to guess with the `-g` - option. - -- The command-line tool can be configured with options, and can be used as a - pipe. - -- Recognizes characters that are new in Unicode 7.0, as well as emoji from - Unicode 8.0+ that may already be in use on iOS. - -Deprecations: - -- `fix_text_encoding` is being renamed again, for conciseness and consistency. - It's now simply called `fix_encoding`. The name `fix_text_encoding` is - available but emits a warning. - -Pending deprecations: - -- Python 2.6 support is largely coincidental. - -- Python 2.7 support is on notice. If you use Python 2, be sure to pin a - version of ftfy less than 5.0 in your requirements. - - -## Version 3.4.0 (January 15, 2015) - -New features: - -- `ftfy.fixes.fix_surrogates` will fix all 16-bit surrogate codepoints, - which would otherwise break various encoding and output functions. - -Deprecations: - -- `remove_unsafe_private_use` emits a warning, and will disappear in the - next minor or major version. - - -## Version 3.3.1 (December 12, 2014) - -This version restores compatibility with Python 2.6. - - -## Version 3.3.0 (August 16, 2014) - -Heuristic changes: - -- Certain symbols are marked as "ending punctuation" that may naturally occur - after letters. When they follow an accented capital letter and look like - mojibake, they will not be "fixed" without further evidence. - An example is that "MARQUÉ…" will become "MARQUÉ...", and not "MARQUɅ". - -New features: - -- `ftfy.explain_unicode` is a diagnostic function that shows you what's going - on in a Unicode string. It shows you a table with each code point in - hexadecimal, its glyph, its name, and its Unicode category. - -- `ftfy.fixes.decode_escapes` adds a feature missing from the standard library: - it lets you decode a Unicode string with backslashed escape sequences in it - (such as "\u2014") the same way that Python itself would. - -- `ftfy.streamtester` is a release of the code that I use to test ftfy on - an endless stream of real-world data from Twitter. With the new heuristics, - the false positive rate of ftfy is about 1 per 6 million tweets. (See - the "Accuracy" section of the documentation.) - -Deprecations: - -- Python 2.6 is no longer supported. - -- `remove_unsafe_private_use` is no longer needed in any current version of - Python. This fixer will disappear in a later version of ftfy. - - -## Version 3.2.0 (June 27, 2014) - -- `fix_line_breaks` fixes three additional characters that are considered line - breaks in some environments, such as Javascript, and Python's "codecs" - library. These are all now replaced with \n: - - U+0085 <control>, with alias "NEXT LINE" - U+2028 LINE SEPARATOR - U+2029 PARAGRAPH SEPARATOR - - -## Version 3.1.3 (May 15, 2014) - -- Fix `utf-8-variants` so it never outputs surrogate codepoints, even on - Python 2 where that would otherwise be possible. - - -## Version 3.1.2 (January 29, 2014) - -- Fix bug in 3.1.1 where strings with backslashes in them could never be fixed - - -## Version 3.1.1 (January 29, 2014) - -- Add the `ftfy.bad_codecs` package, which registers new codecs that can - decoding things that Python may otherwise refuse to decode: - - - `utf-8-variants`, which decodes CESU-8 and its Java lookalike - - - `sloppy-windows-*`, which decodes character-map encodings while treating - unmapped characters as Latin-1 - -- Simplify the code using `ftfy.bad_codecs`. - - -## Version 3.0.6 (November 5, 2013) - -- `fix_entities` can now be True, False, or 'auto'. The new case is True, which - will decode all entities, even in text that already contains angle brackets. - This may also be faster, because it doesn't have to check. -- `build_data.py` will refuse to run on Python < 3.3, to prevent building - an inconsistent data file. - - -## Version 3.0.5 (November 1, 2013) - -- Fix the arguments to `fix_file`, because they were totally wrong. - - -## Version 3.0.4 (October 1, 2013) - -- Restore compatibility with Python 2.6. - - -## Version 3.0.3 (September 9, 2013) - -- Fixed an ugly regular expression bug that prevented ftfy from importing on a - narrow build of Python. - - -## Version 3.0.2 (September 4, 2013) - -- Fixed some false positives. - - - Basically, 3.0.1 was too eager to treat text as MacRoman or cp437 when - three consecutive characters coincidentally decoded as UTF-8. Increased the - cost of those encodings so that they have to successfully decode multiple - UTF-8 characters. - - - See `tests/test_real_tweets.py` for the new test cases that were added as a - result. - - -## Version 3.0.1 (August 30, 2013) - -- Fix bug in `fix_java_encoding` that led to only the first instance of - CESU-8 badness per line being fixed -- Add a fixer that removes unassigned characters that can break Python 3.3 - (http://bugs.python.org/issue18183) - - -## Version 3.0 (August 26, 2013) - -- Generally runs faster -- Idempotent -- Simplified decoding logic -- Understands more encodings and more kinds of mistakes -- Takes options that enable or disable particular normalization steps -- Long line handling: now the time-consuming step (`fix_text_encoding`) will be - consistently skipped on long lines, but all other fixes will apply -- Tested on millions of examples from Twitter, ensuring a near-zero rate of - false positives - - -## Version 2.0.2 (June 20, 2013) - -- Fix breaking up of long lines, so it can't go into an infinite loop - - -## Version 2.0.1 (March 19, 2013) - -- Restored Python 2.6 support - - -## Version 2.0 (January 30, 2013) - -- Python 3 support -- Use fast Python built-ins to speed up fixes -- Bugfixes - - -## Version 1.0 (August 24, 2012) - -- Made into its own package with no dependencies, instead of a part of - `metanl` diff --git a/libs/README.md b/libs/README.md deleted file mode 100644 index 7da285da5..000000000 --- a/libs/README.md +++ /dev/null @@ -1,143 +0,0 @@ -# ftfy: fixes text for you - -[![PyPI package](https://badge.fury.io/py/ftfy.svg)](https://badge.fury.io/py/ftfy) -[![Docs](https://readthedocs.org/projects/ftfy/badge/?version=latest)](https://ftfy.readthedocs.org/en/latest/) - -```python - ->>> from ftfy import fix_encoding ->>> print(fix_encoding("(ง'⌣')ง")) -(ง'⌣')ง - -``` - -The full documentation of ftfy is available at [ftfy.readthedocs.org](https://ftfy.readthedocs.org). The documentation covers a lot more than this README, so here are -some links into it: - -- [Fixing problems and getting explanations](https://ftfy.readthedocs.io/en/latest/explain.html) -- [Configuring ftfy](https://ftfy.readthedocs.io/en/latest/config.html) -- [Encodings ftfy can handle](https://ftfy.readthedocs.io/en/latest/encodings.html) -- [“Fixer” functions](https://ftfy.readthedocs.io/en/latest/fixes.html) -- [Is ftfy an encoding detector?](https://ftfy.readthedocs.io/en/latest/detect.html) -- [Heuristics for detecting mojibake](https://ftfy.readthedocs.io/en/latest/heuristic.html) -- [Support for “bad” encodings](https://ftfy.readthedocs.io/en/latest/bad_encodings.html) -- [Command-line usage](https://ftfy.readthedocs.io/en/latest/cli.html) -- [Citing ftfy](https://ftfy.readthedocs.io/en/latest/cite.html) - -## Testimonials - -- “My life is livable again!” - — [@planarrowspace](https://twitter.com/planarrowspace) -- “A handy piece of magic” - — [@simonw](https://twitter.com/simonw) -- “Saved me a large amount of frustrating dev work” - — [@iancal](https://twitter.com/iancal) -- “ftfy did the right thing right away, with no faffing about. Excellent work, solving a very tricky real-world (whole-world!) problem.” - — Brennan Young -- “I have no idea when I’m gonna need this, but I’m definitely bookmarking it.” - — [/u/ocrow](https://reddit.com/u/ocrow) -- “9.2/10” - — [pylint](https://bitbucket.org/logilab/pylint/) - -## What it does - -Here are some examples (found in the real world) of what ftfy can do: - -ftfy can fix mojibake (encoding mix-ups), by detecting patterns of characters that were clearly meant to be UTF-8 but were decoded as something else: - - >>> import ftfy - >>> ftfy.fix_text('✔ No problems') - '✔ No problems' - -Does this sound impossible? It's really not. UTF-8 is a well-designed encoding that makes it obvious when it's being misused, and a string of mojibake usually contains all the information we need to recover the original string. - -ftfy can fix multiple layers of mojibake simultaneously: - - >>> ftfy.fix_text('The Mona Lisa doesn’t have eyebrows.') - "The Mona Lisa doesn't have eyebrows." - -It can fix mojibake that has had "curly quotes" applied on top of it, which cannot be consistently decoded until the quotes are uncurled: - - >>> ftfy.fix_text("l’humanité") - "l'humanité" - -ftfy can fix mojibake that would have included the character U+A0 (non-breaking space), but the U+A0 was turned into an ASCII space and then combined with another following space: - - >>> ftfy.fix_text('Ã\xa0 perturber la réflexion') - 'à perturber la réflexion' - >>> ftfy.fix_text('à perturber la réflexion') - 'à perturber la réflexion' - -ftfy can also decode HTML entities that appear outside of HTML, even in cases where the entity has been incorrectly capitalized: - - >>> # by the HTML 5 standard, only 'PÉREZ' is acceptable - >>> ftfy.fix_text('P&EACUTE;REZ') - 'PÉREZ' - -These fixes are not applied in all cases, because ftfy has a strongly-held goal of avoiding false positives -- it should never change correctly-decoded text to something else. - -The following text could be encoded in Windows-1252 and decoded in UTF-8, and it would decode as 'MARQUɅ'. However, the original text is already sensible, so it is unchanged. - - >>> ftfy.fix_text('IL Y MARQUÉ…') - 'IL Y MARQUÉ…' - -## Installing - -ftfy is a Python 3 package that can be installed using `pip`: - - pip install ftfy - -(Or use `pip3 install ftfy` on systems where Python 2 and 3 are both globally -installed and `pip` refers to Python 2.) - -### Local development - -ftfy is developed using `poetry`. Its `setup.py` is vestigial and is not the -recommended way to install it. - -[Install Poetry](https://python-poetry.org/docs/master/#installing-with-the-official-installer), check out this repository, and run `poetry install` to install ftfy for local development, such as experimenting with the heuristic or running tests. - -## Who maintains ftfy? - -I'm Robyn Speer, also known as Elia Robyn Lake. You can find me -[on GitHub](https://github.com/rspeer) or [Cohost](https://cohost.org/arborelia). - -## Citing ftfy - -ftfy has been used as a crucial data processing step in major NLP research. - -It's important to give credit appropriately to everyone whose work you build on -in research. This includes software, not just high-status contributions such as -mathematical models. All I ask when you use ftfy for research is that you cite -it. - -ftfy has a citable record [on Zenodo](https://zenodo.org/record/2591652). -A citation of ftfy may look like this: - - Robyn Speer. (2019). ftfy (Version 5.5). Zenodo. - http://doi.org/10.5281/zenodo.2591652 - -In BibTeX format, the citation is:: - - @misc{speer-2019-ftfy, - author = {Robyn Speer}, - title = {ftfy}, - note = {Version 5.5}, - year = 2019, - howpublished = {Zenodo}, - doi = {10.5281/zenodo.2591652}, - url = {https://doi.org/10.5281/zenodo.2591652} - } - -## Important license clarifications - -If you do not follow ftfy's license, you do not have a license to ftfy. - -This sounds obvious and tautological, but there are people who think open source licenses mean that they can just do what they want, especially in the field of generative AI. It's a permissive license but you still have to follow it. The [Apache license](https://www.apache.org/licenses/LICENSE-2.0) is the only thing that gives you permission to use and copy ftfy; otherwise, all rights are reserved. - -If you use or distribute ftfy, you must follow the terms of the [Apache license](https://www.apache.org/licenses/LICENSE-2.0), including that you must attribute the author of ftfy (Robyn Speer) correctly. - -You _may not_ make a derived work of ftfy that obscures its authorship, such as by putting its code in an AI training dataset, including the code in AI training at runtime, or using a generative AI that copies code from such a dataset. - -At my discretion, I may notify you of a license violation, and give you a chance to either remedy it or delete all copies of ftfy in your possession. - diff --git a/libs/backports/zoneinfo/_czoneinfo.cpython-38-darwin.so b/libs/backports/zoneinfo/_czoneinfo.cpython-38-darwin.so deleted file mode 100755 index b8561438696255724045484466db49cc7dc08bfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37616 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 diff --git a/libs/bin/ftfy b/libs/bin/ftfy deleted file mode 100755 index 2c1de6a2b..000000000 --- a/libs/bin/ftfy +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/local/opt/python@3.8/bin/python3.8 -# -*- coding: utf-8 -*- -import re -import sys -from ftfy.cli import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/libs/markupsafe/_speedups.cpython-38-darwin.so b/libs/markupsafe/_speedups.cpython-38-darwin.so deleted file mode 100755 index 1e95bfdece9d811a0d0e1e5e73366f37847d7ef3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18712 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 diff --git a/libs/msgpack/_cmsgpack.cpython-38-darwin.so b/libs/msgpack/_cmsgpack.cpython-38-darwin.so deleted file mode 100755 index d8eaf4c85d8e037e9de56e0e4ee22b519dad7845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181448 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ôjU(1Xyl)~)HXRhn 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 Q=&?^YMt|32|9zr=1LU88EC2ui diff --git a/libs/pvectorc.cpython-38-darwin.so b/libs/pvectorc.cpython-38-darwin.so deleted file mode 100755 index 56e9bb21f0305b9d76fe9c65f346a7df35c7dda3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39120 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 aD(LK{S@Raok+)PtjhmAamjjNk2mTXV!bj== diff --git a/libs/sqlalchemy/cyextension/collections.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/collections.cpython-38-darwin.so deleted file mode 100755 index a881184757b2c509a2747b41a00ac8e8f244c506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233760 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�p3DwsPtbZ@%yW~H@%MxK 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 diff --git a/libs/sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so deleted file mode 100755 index df604d4786b189e8692c43a370fc0a52709d4fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94672 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π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 diff --git a/libs/sqlalchemy/cyextension/processors.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/processors.cpython-38-darwin.so deleted file mode 100755 index b62460351361912d4f8571238e5512a4368263e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75976 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 diff --git a/libs/sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so deleted file mode 100755 index 12e48bb10af7e5bd7e06f2fdbb68df5d198e467e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78080 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 bDUG5ZC@fpG_Ebf2OH$M`5L<eY_w4=`9o$x# diff --git a/libs/sqlalchemy/cyextension/util.cpython-38-darwin.so b/libs/sqlalchemy/cyextension/util.cpython-38-darwin.so deleted file mode 100755 index 4b2d8145200deebc4ea10af97d09011fe1deb174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93064 zcmeFad3==B`S+hdMj|ClT(EILqJn~TAxe}OV>6QIJvvdUqEtmtTyUo{Be;OkWGc6} zqtt4PTZ^@=eC;B&)>4%$fCO9-Hx!GA3->UJh&CW7^SnRj+%s8hzrW}C<M&_ldL`#v zXZc*$xz2W-?ar&)Kik=_prEjCK|w(=za{)G4;2(7arLt|zr*_!6il3WR{i+1Oi<51 z>w1y}0S!cfes>9?Cr*rCG9w-kIKA=4iZMTJPgz%Vk@ecYMFoxB$%zxE#S<4z%Lnzw zD_v}(E<kqu<Y-G#)&Q?dKH*KAa>-RwFS(9Hz45MDYIF7pgv!x5JcMn``|(ViIC)z9 zy34P*EC}q4H+8v<cqVM!933Pt2*l2j!n^jGX<Z8JjW=?&O*$(mkmx|vJVtlV#EFS( zreA)|#S<^T=F)44=#95vtxY|)(7K{~%hVlD?PM;$6DQV1&WcPNbNXp#+SalzNL3oR zy=b*N{fdo}Oq_VxwOytB&v=3Q3e?_|Klh{JUy>tmCD&}gtz6wAHV6Llz|GNtoH@C2 zI-EH1stYGhyW#4KuDxpF)cAG(5pQ@-81QmlaiEVC%nDe^nK<#{3*#4d1@xA0<d-&X z!S}2yIwwn4t}dV2$JJL~drdB+H{QCPHl{m9_xcQ~IhP&zE}GWWyS}Tx%>mxrZh+mq zratpvcvKG#zY{0MqNkl&Ul+BlgGvuLPtB#a^z17wEvmb02No1Gjx<q)1&z3kitSdA z#y*7w#r>)C0fhzQiC0t^zf(&J3wEbM%1<mTm@=ZEKx!S!uYT?!k$#o-UjB5iCzGJt zpE)NK7JS%^&UyF6BR-#nzqg@a+R<&lDcj}xU(Ec&RYwt4&aW-Q04i~y@td|WU~ti) z#Fg@!`yoZaXnutydHP%&VHhneI5IKqx+AZ;{389HdBe2$C08GD;t?0$07W8x4(3-l z>nQgeT#9IDmHWRx|JA^MHSk{z{8t12)xdu>@c*v{#yRfCPO9ePj|&PWr0@S*LBXZw z=ZNr-X2V$Vk#izvN5)0YI&*B)-RYM;jb-G`DD^8z?RX`pe1g;Tbv9n^RJF$sbG%UF zDn*QTQk7$#EhzBceyX4#eI&+#<Aw&C#M`pr=KU4m4L<%0oaCB#v6Jna9-y#PW$KxN zf|$G2A1?;Uws7+nY=WrU;kX@svBKOX(QG(T9CNe&F_I>^CfxiAX&m=`e+}GBrUgN! zROQ71p2;h`p(bi6tj3zCtm7{BH~qDsAmTnB%?=nU=neiFSk)(vk((5cEJ1DN(4 zhwW%6>I!DxE||x9!`z#L8De3!{lk{-#vIJbJj_QX%1AS*H%vngW;MxSxio+|ItTN6 z1GCJj4mG}3P!JzZnrAIu%-!Ob8oZ8Zc3^z3`eZij&LesHPX5$aWC=}dl*WC)Ozdq$ zWPU<j{ub$|OMm^7tg+kT7x=H^NpISj%@TQg5c#}~jQCG0vMg&NuLvUN+sL8*{fa!% zMm7YIo{jA1-;5^{cCz0~6sr~|B1pv=$6f6-EiFDTa(-k&<bue=2}|bmXphdVpAN?W zMUsaN9u1&=CDevZ1S0JSr)pcc`D@BTV1LUJwG2QleguXK5hk1d;Q_?EHBTy2wx9n1 z5wz65LdH_V-s>nRc$SK@ZR-06DGlnc86=EBN~#9+uo4jNhMI+vs>v=Sy7MnV^e^+# zS1a19ImtMK&M}EAKTzVwzyfNvx}86i+6q5CGIjRKiWQC9cMacuGojB&jN0(iov8tC zYQSkt?JJ$htHMu@DoxE=nO$7lnC*Yv2kr`|{e!aF#+^sR&r2UphKjcI#Bz9cgg*I< z?EFMpufh1QujouK8Db*d%tu@sL_AJJq;+aQJp^TW0~=1h4Tdv$OZe&IN7kiIURlu@ zY23E!^uxnL8ikI0+0>|~Q=_IgEki12@^%uARzi~Xziyq|>9l`R>J)x~ynx+77NzP9 zmmh!rukeZkyu=Bq>k6I8oxNlm*0i`!4;-Vn<4Yw~c5z;=!Y|zA!w@H1!*)yG_*GH& zg=qW6vi5XoUHIvDoTg8UW2u@a|4!*sgC^j_QYF87-e}TEJ>2$XHrt{_KCSm3S}a8t z7W22FEple$jL13u`3s0@T3T)tSwR<H>p%a5t?^2#iR!4x`Y$Vy8yfp*_cph^TpVjw zFwiMgr@t%tNOcscOym2=CYYa3@QQ`mJD1=Un_w4Y_AgRqy2dz-r`dv-H?049jYk_= zjzC;LM3arBrWBH-Azb$<BW%pw<i8qZ8mZCFt1a$q`~!&_ZS`rKfpz+z!60{p9?KBL zPkNkaFEsfjIivkY{%lIyybr<tT@aLM`Um(o0<MN%NCX{jGGUf&%w6yQEQtJQKQd%P zClRTke`NZ70wS$9(L_z}OmBsbdUZp~8UJcY6;9r%kZd^I{1l#;J8X9ZYe;?+Zhj8h zNrn1IJ#Oes(+5ii5bL-pRil$CsatBO<)S*0D{+{aC|z<jUX||Bj^sMLg$2u!>lH+v zRU1tn9}=p_B5W4bk=%we&>|Fkl}9L+w{TgqKW-s;=30bONZ~Cpcx9qGlI3zN!f?ES z3?t<Q;V8M}xxgZfR^n92I*U*%sw3&(oMsWmDmg!tV!XT{oGX_+LoLE2NT^K~VT!1Z z<W!vFEW!*Ww+M}RrH9)TM4pXlBlm1bs81}y98n#~xj5<;c;_j(MVK!yGCYneJuI*Y z3m~EXXb~2Q>PWWXge<~xyaB>Wypmy+g2;2dMOY09b*)8MC#oaq;|#C}o0Xg&^sr4{ zWY~@?8IHFI1^+S#RTiOGR7bKDCuk34cmsrTyprKSxghkh2*V+vzFus!GE!7Wax_kW zP>VM}aPSJ@6a|rIxo`4}g@pQtMHnxtBRL5tK$xQBwiHw4r4-lUN`|{E!VE~LMvKrW zsv|iYXLqvUor5<(m@6*`58w*nEQ>G?66ykrFke(haskdB7GWXY0HIA@5EkPKVIPaI z91`kCi?C7@-3cdb5!T@i5PW$-*oZ5HbsLNxHbX-7w+P!rbtDTqvsnfKm7*ALfKVzg z2)pA7;rAAy3=+z3H+bcuI+DY24zLI#@dgN^<ptq5Tp?U#5o#f!-m(aesE*`VoP#XF zc)S6^BzZx&2v-P4S%fK&P)jYsR8bwt893TO!`p~AK$tBr2zTHLVVjI+H#G+m>Ngf) zuBeXWJe;5|=Hm?z7RU?2lej`?u?Pzxp&Bhho2ZWDa-32t!%DmX!fJUzco$a)%@$!D zB-CjZ!57t$+>BFf5w_tC5DK<hgg&@JFzW?3RSXHWq{Wn}R8&W@3};u1P>wf17%nd| z9EvN1QY*tqNT^k924S?Qj$|#)E*8PT8z7987lbo#h49wLCeL_Cs9#uwNuoNEQ*eS( zOvM`@%)qO@d82~J^N>YogcO1uA7+c9JK+R%F;~g?VT73{FEacFS2A2=5#~ce#Vx`D zQ60&JID3)}ZyVkKVY$2@ynri&;TB;fB-H9wQ>N9Tn4NI?Sp*+%fUp^_O0h*j<k|F* z$+Ha->S2peu+1P8;}lthQoI2|nY_rb53Xc*$|96QLQS*?!$ox@N8<Fg2&3@^2(@@6 z!-)!V+@yocbbO_0O3AUJn3iw?=983;A5=I+UYK8j3-i#)hIw)-B-D0`Fhdmm2q$Pt zv+)K9bL0i#9$X=mScJKdP>-6%n4Bl7BRL;Or+j!9;0+KK$_v6XxI%dSL#Z&?1_^bI zMOZEh!vQByz-qh!!a8|DSdS}&`z?YG33a4J*er@^2`A7)!Pj|&VtGO6k1K?U7NHap z>Wf82qB2n!4md$W7>+lPVWhku9EB@{VHRODB-GOup;i=z1J3uX9>(Gg5XQ?3!nwFY z$gDS9CqY8}iv_XcCZ~wPaKH)7pBZ=qghqKmxD8hbf3XO&A)#ul40A+bIN<cRGR(sp zAk4?Bru4Xi$TQs{EP#X>)M{i{D2jfB6KHa|lJi50S}89wtiqKHH5OqtB(~`LEb?OR z@76(q;NuLnGHk{hAZ(Ktgza)c=xY%Qwi_94ea^^GEDFN`CuoypcmsrTc|kZ3S2C>l zz~mVY33aMP7%2+F0cW_Cp%!m|;NX=WPEinf?zRYHA)%@)!gx^_4mgKdgegkS4|<r2 zR|wZBh&<yg!VE~LS+*`3MPWGL1P0U`CASE3<)su4;Hnh+T7-F!P_MJZb=>59QFJGq zKo1M?1_*8Pg0L7@2p_C7d6q*${rXu$trUgffD;VT>+l8$zPuo8#1+D07GX0a)Fl>S zn<xy29r^Z9j5k0il^2BFafNWTMJR)WI>aKBi^6cg33}E@yaB>!c|kZ1R|rR2gjz_b zPi?<&L}57K1PJ5t1_+bn1>quGA$<M5DftvgsAnz0R8bfXIKiadh&Mo(EiVXn;0mGD zBFuq=axKDKQ60&7I4p=X%FV|cAS{p<geP%@khBO3A)zj_2yLP;9B>Y_2rKah2&?4< z;ayxIoN5u)K|+nQ2)-x`2b`d1ZNnQN6ntY5`rry-H;YgV2{pzdl#0S|zzK}ma=Zb; zaCwp8P+TFrz1C=QBqY=x7Gbm~3<sRR6m{?h2xH|1;S5|MJZurhLqe@%d~n?4BvH&x zIKg}|6>oqrLtYSW#1+D1i_i!O^#_YETNH)^PSCUF;tdey$qT}7aD_0!BFu+`N?3#i zqA(nAg0Z>{Z-B5|UJzcu6~gELG;*(mgsQTwdbKDF2b}%Mhu6m&AZ(Twge|y2_?t!8 z1_|}H)nvi92B8>dh(##H8z7X)3&K9QLb%ByltV(zXTQ&Jlfy+}IN$`O7>zeTsFfFl z6LEzQu?P+%)R%UI87m6=0Vik=lkf%zQ{)BV3S1%dvj|fmp^mW#GeluO-~@BlY`g)& z9C<;w2UiF$zh~s03klW7BFqy-cftvg5AOoJ0m4FgL3jpN2tT(7ZIDpUYkSE}E*Hh@ zgcHnqtMLX1>*NJtJ+2UbY!Q4&sFX$6EDHMpCuoxe?AZng#qxsCA6E!NEJCSvb(w!G zLYXM+2b{nZ9ga6Z7%49ZN8t+L<26R^(U4GkS%g|q*bg{4`vGr&FkW5|&czkNA1uNo zNT_;tLmlh~QOr&_`;iat47>qCqr4#8hAV`hScKV-P!H>1z)j8(h5djNEDPr04G`wb z3&P{LLO9kUEP#XxSs50J!hXOB#)sv21B8|Gg0M<1dA@zua9s@vHN?uWP88h<Cz$m% zD>*;RyxZgjVLPs5SYi>_h7`gl=C~tSEDHMpCzvnF@CFFw@`7+6t`J;{FdP!<4;Eph zDC`HEpgq*$4G<i8K{y3h2&Y?wv5-*LTZHkVupe*&J8BBv0AZ@UAY6wlgh3Wz1|-yI zgHYe-bkxtbwNO9DW~`q}uKEWG!{@YxN7OIicOHq_6dCgtX*aHc!;0p+MW_Czy|qk* z4yf|`!%p@Uf7|^!hv}znO%4w_{KFn(r_Vbf+O%vqx!LOUX03~Q*ZYz1(<gl$>3`C; z_=-s5tnCHyu>U_KwOJF-XI_kYXKx13Nv?|TR<XjL(iJ&B^Jjm07kPi?*R6%f<d1nk z^&L9m9qmRwurGv;14hu?TT9RVV_*Lu8^0IvCMK+y{yS!c{9SEKQ7-0RboAEe$E3gK ze@=10+_E~zvqmv5ua1=XZ`zo3xtMmvobbS-CH}KE=9OH`V~VL8P(9Fp#Kt_Ai%AjF zRCDi}NFP6tqljnmIbP*eZ_61}kK^x!Xxfpz1PjZrA%Em)Z3u^(7m`=|#;MBR{aG@0 z_z%uCLMHYn?@xr3s=R|Joy`4;D52a=kz-!XAKns!nu`s)lZzd%QB5G`?qtLEG5Se3 zc?swhtNvm1S}E;_<>dsTjF%DLAIsb*#K&nv4IEo~p<kE|7RtUsqHKX5X2@59YsqBm z=a*K#aPt*Lbat;pr$~Y<o5iuAWsX~jO!Enexu5uBS+pCbV@=|2M}aG)M6WVz5`OOA zo=bQ}4z;FPB6yXb$>A{Z!CzWQM$%n%q8M(z+4vd?!p+V2taM+K$}qfBk?!+IcYaQ~ zhCnzEy=f2ruawQC{f04wefVg$p+M)9pZiB!;SMyyZSXgeP*|x@`JW_Aa-r!(pM{&( zk(1)S^SYeMEr=R(H~O1@VMQGh2xvjqqPVW3(3Mi77y7$$GR}E5Df!&cPfb8L5%T|R zQVdEOHI%HCEMDkZqGMjk9E!kh|A^((Z>Rsj9#E><8*D*9J6SMZr4uOcf<U6jsOK&j zVwS@XEQgydhZ4)-7|UTphv6_f$Ki-PhmTho4x7Y?>iOnATjr@fIBZmPc!PdsIqYLO z{DGX5;XNqI@H;rPX!!GA&(+5|dWks~2`w~C78cWjDb4P{=m=v@!0X5!yk;3*HA%Ag z>nSgM53qcHqkLZIXv_C1%eNuV_q-h6<~-lp9()fC_?88H*JFcpX>k|Jw?ureuzdew zv|nQKd7)=HJf^(gNSIX3zn107`{8Z`sM_|=^Ic9-$IF%XT~!6;op-O*?R`D?-eq{z z+(#CF3zDh4M(mO&mCp-}v3&2ed>_v9y)wslk=m!upF-n%@I4V2@f{xUb$amK%kmv2 zzBgLFKQq}&j<bAUTxrU?pXFPh=ldngDpTI`^L*Elw5z;F1$-C$+?IFO9(;dgc-8!g zEPkJ$yq51`<?}*kTE2fo3iSNh^Eo}=l;gWY?ZuRLN)NuL1bjyae3#N3yXyB~%ePW| z??5By`7b7WiOJ`M*1T%Ud%Wd)U!HH@9A7WbcQZ-5%DWx$rRTPLY<bV=!S~OGSIr`_ z_`6%afu2_>ALoFU?@LHed28UySa4Su$~3AR)0%3-wDK$|i=KK$z->?uZnc)fAy%VP zEr&wO;X2D<$5O-LupEb_svfDc=ABnmtjdj23mi88%$BF6Z+AVeMZ5kAqKtUI%4dGa zW*#KYWd3WA`OYA7IQg-e)i(GK1CU+~5o!H1c0uOHOpS}pNFAE{gajDP;9Jq=-v@%K zFWk&xgcIJ6bY_{1eaHqBlju31aCUh%Ty=JttRp<q+5{kH!R%1gJSM1`&X*-<Hh!wp zRP#0dg7Cd<k;cx#Nb#~nIqFU^cGkH&-FIW|2fizncr}ZIJjZfq`=s*l<8Zcmh`%14 zXUhE&Tl&Oabh$q<soN_(Cj#Xc5mnI!vzy6SxOW@Zfc7<o+SRFUSQ$=!h&r5Gm+Epx zx62#4RP$4?bA`NYJ-09R!bHTrh_pUJq0%x_BdssXkV=In{T|28U(eDByS4IKP#Th- z#rM}N81sIoDK4D+5))bz;(^4bKM`SL((jsx4gRh~C`UMX^ER7wD+RH0@zrx+MpI12 ziHfwYMg;Wx&);#t%q&un{skD3*7XD%+EiIm_HFt~Bl8X`^B>8OlUYla`ijqN(gr1! z%^hj&M+C*YwOi8R-IL0YPY*Il_pnLN?v`{^_oQ2qD!tK&w!ck!dbgx9rSby2q@=AT z>7h31&~8cT{ar~PQPO)&(qnDXH-FnzET?<Y>y`9!lk_Syplc;pvF41l*4c~?b<22G z_lz~lIFdigQf0E7PL_0)DffBu{@8eL0XAJ`5;V$NV!XG?yMyhANb99a+sCB6PG0FG z(t0yql)NAO)1R7<-zm$h+Og1xvmWJSSDG4sh@(XR%Y$gw``ksQWLsiin*0lYz;AA` z4a69Yx!dWieu}V;P&M6AKatiy3iBo-#$WL^xSyu4Hq;U*(`XfRt_fOB5E9+-C{DLl zov)xDP_Xp=rgSgbq!W834a)vc8yo2sYntfihRr%+!R*#bR}r3m-b6k|Wco$+*dnc8 z<E4e~_zi-htAg}XCOCwj;ExonR+)a-1n*{pUskYMVEU&7`z`1z(z>6Gdy}~IwI=m& z8?r>H)w0s#O>m_Ro~>ZDqIARrpJ;=BqF}X=^r0rWf#A$uk=7r}{Y#|vV!69;FUcmq zRLRxC(>vJFjkMlqgMW|@{)k|IplVFr`tJ-8>Ah$O-@V^>=2)hK2VW$iH|S2|l+46w z?F%@SULy!Mbem$-avlsRW#t(*!x)=kRJRNRY=$4_GF)LZ9PmOg)_|#-cVM27OL8(v zV&0$&mdhD@I*u8YxbI^ZMD<)Gve$~vxMII-<^C&Zyp?nK%k`o&$Ldey4F8)u0Bu@2 z7U01-;7vsmHWV_zgE~9@Bk<TOhG#2ZAz8L^v~bUeoRO{k6(Y+w)}Pmfy@Eiah<gln z<qDFcx$Wd-9++%6h4wT~$=?*m&8b%AcXXMp{DuHO<0*7$DT3DJ!0G`*1Lq?l8j!u) z+DCb$0cGy4fl=AYr;Ma`@wdAMwz~#c8u&pD_*1Hp>N?0u88c4F%Z5$p0;pCPtD4W2 zP;Tg1B~Ud#MLq<2ahVb5Ih?L4QI_rk6=o~{Y6SXMFM%$1^8)=Q2Yj9t=pK@ywli^T zN!$F_rDQi$n@d??MR2SLRT3eu6M4FeP@1hAZ$!ARmk6KC&WmtJ4tO=W(Mg!3h|q{K zsJXqZPWl_CWCu<wtx~F~wsI{{a;fHivZI;>&l}Y|g3~3JvUHcr$yUxo@NDIJ{&ugc z)4JsPWe&L3$~D~xG-y6KkgMIwb%g{9>gsW+)eRkz%U5g#8e#=1?IBR_x;iUcIo$~K zqh10nx*bs4eFo-$pD=5=(6Xhbz<<a24~<~#6|{jT4DJ`gHQnc0M7G`M!Y=G*2sBze z(_&v?vCk7W#jq`2p1c;vUP0yFWU%kcWAB^C4s~H)n#0~oekyn;nxKN;H%^If)Dv1^ zoRU>Ixe7j4b>W8I2i=IaknB|Ot4mA;x8YQ*vBROdW2n1ukuy~C-vO4b+{)kXRea@7 z!Lu5D!$QX|WH6dxU<X}}^B+KsHlqgfQDGWwMuM`B_4nw)Z4PjE4Xz4LSn@2EKsK{E zxR0v)!i?{!n(7u6v1U)0a_#*2N9Bwe>3H5~Rf8Kk)x;0pvsF|{J&wPba}b*QZ1gKF zzOxvo>6voPIoj~L4U4gW-K#WMiGh@Boj_e1?A2VP<X&Yp_3AH0;AGp32xj-s3HA>@ zz|a+#17i%sP_qHQX}B(KduNt`cAXJXx9C@4a?=a1Oa?cWQEBmc6PEOp{|CZJ)qG`( z@tG~g{%tTDVTv(>rO%-K|3eWD&J|&Bk0SiK-4tQGL@qQ%2+zI|?NW?4i1H_v7ZkYd z6>Z5CVfQk^(-Zjf-T77T2lRHJGs=o4(F`U#wN>2WM?EocSm>~pin(9V;{A7skGjk9 zH^IljH|B0OWwv*~F&HzS{rmR`j{7A~6dW(VzbH=oWmjs`65o)RyUhaSFO>VA8GedR ze1O)UdPGGY?Qdx^b>GaYroew6Lf7MyR(1wJ)jZpu7f>bS3^&t%jMQG`_oOqThUKEv zO0@7q1TOs!%mo8U@bgOg27V;e$|Sy*Rts9!42&PFt?y)1t@$u5YfdGrViW7Nkg74% zzywRWt^P;|lX_oMJE5KPOettP@3a5G4S&ad7u}A4QCbHM!JYqKWfmJBn0I9!4-cs; zDCl{=zUkAl2KUvNTfaQ&z7locbQ5nx-EXM==hZ*%$f@JVLX~-mSO13FWI9F1nBf!; zolRzrKd;Q`7&Aq5L$Wj8H=5lg=1wcuj{k0BMn|*tB)iff$yg=9ooZaKe!1h08P9g3 z_VCHoFXrAfsiUb;vHUn4O;Wmk$TLH3c(*2cik$f-v}vJ2`B`{(9|n<w>V}p!ZR<B{ zzna@1<HKuiBPxDq)3)NoX>`PUF2uY%q-k5<czM&dqC_=8uTCOpPdo=-gy(yB9+syM zOJA3<gLev#f?;1NlyzI^(vJT4Ya-0*;bSIG|MgoTbB`NtqZ%sKWIDn_YQLlJ(T@9K z#C;>;ZjHL%`p21;v5Y4fb?zl^IPQeDn0xiYa5K{%=ru#s*>yg0H5CvEm!33U2Ph5R zHB-=TB)r>6<D(rX8O{3}B`96sT(bu<nl4ht&^2%|L)R?E!xB8^8O@_Yt{z;8_~GUS zmKbe_-;1EgpHLK<e3G4sf;7u#HLvuiiu7vkS|q3Pbma2S*b6@#Pq&TV|8tP<z9OX= z{Nb<2KF9bgRSv&TlyJrbH>7)sQLktySIyZ34_yu^*^(ElD}?+XH432SK+Eex;|yvB z&Yu7aHE3_v_y+INNm1{DDdFMu^Nc1M+-s(2izLJzNBkf*Q{uart~OM!j}D`5>by(d zNF1UPt_LPF*k6M~y2R?td+Km6L6SD{h7#7h-$u6nvpziLQ(g$g52wOEY*Tbw`~a_H zIbQdb>?`5f8&He8#c5w(R9AIXX>mApHvv)ar16frly}l3+<8XKUiGC%IL(nlAX7EN zwWXIDbTfV2@e&K`+^^}%s~ZiwaC2E-5Y6!7|2`Mi*+)rdwmI%HZ`>RH+F44%_`)tz zGK&N%&bK5^Z-Jmsj;Y9I23~6Vf1UeEr0VNg$41=EkrCVK+{Nu1htw4=er<c<_Sodb z(e`ykCwX-R#S!<l`YQjH*JkdUy0I|gev#>@<6S_-s)|m6Yr_vMD}2k{QuRVO71n?> z`2}93NCm~k;pDfBKQZt4VtO<)QtVkXv~mu_fm<trstKUR0d?-=t5g|}-GcDB*Ite( z;Tl!q_u^rO^3mOUo%?>zko4Y4E<G5vt@q!YX%wN6vUwfK?P@5eO>r1-qAoS#)z8D7 z6m>5!?WI(EV&9`z`Y$4h<G!P&v!@w{2ckzsJZU4G<cfHSligJ>m|pcCCQz@(nzyPJ zy^y)+s;T0y(B9zR(&XKDvMXks?V_CZMG^Ns(?o9m2`DF4tjY|q_2GV9_4cgM?kgkS zinw1z+CLo<Df}w(+BcEHH=>ij;wep$7av(%=WeL0+H}k7GY3afXALcMU(GD{rWUi! zR<VNc@I&o&g&#!Rmm*c~&D=dY`K7MPXr7EP)q~al5=S&GsdXlQDNIdDx1uX5BHVne z<aa}TCGg;X(c8Si8~7V>SJ#hNH|uJ$2-1Dk+4{EQZi#fZ6~_0Ax|`KhoYdLbsQX%! z%0D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 cXd<F8Wv&mrK1^bsWVlP4Kb&3C9K5O3?|*Cg<7 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 RjpL<3B_U<<yhQB(e*j){T|oc< From 27a849587d35476eee6f5c55dc1067d361669d87 Mon Sep 17 00:00:00 2001 From: morpheus65535 <louis_vezina@hotmail.com> Date: Sat, 28 Dec 2024 23:10:02 -0500 Subject: [PATCH 3/7] no log: wip --- libs/apprise/Apprise.pyi | 62 ---------------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 libs/apprise/Apprise.pyi diff --git a/libs/apprise/Apprise.pyi b/libs/apprise/Apprise.pyi deleted file mode 100644 index 5a34c9c65..000000000 --- a/libs/apprise/Apprise.pyi +++ /dev/null @@ -1,62 +0,0 @@ -from typing import Any, Dict, List, Iterable, Iterator, Optional - -from . import (AppriseAsset, AppriseAttachment, AppriseConfig, ConfigBase, - NotifyBase, NotifyFormat, NotifyType) -from .common import ContentLocation - -_Server = Union[str, ConfigBase, NotifyBase, AppriseConfig] -_Servers = Union[_Server, Dict[Any, _Server], Iterable[_Server]] -# Can't define this recursively as mypy doesn't support recursive types: -# https://github.com/python/mypy/issues/731 -_Tag = Union[str, Iterable[Union[str, Iterable[str]]]] - -class Apprise: - def __init__( - self, - servers: _Servers = ..., - asset: Optional[AppriseAsset] = ..., - location: Optional[ContentLocation] = ..., - debug: bool = ... - ) -> None: ... - @staticmethod - def instantiate( - url: Union[str, Dict[str, NotifyBase]], - asset: Optional[AppriseAsset] = ..., - tag: Optional[_Tag] = ..., - suppress_exceptions: bool = ... - ) -> NotifyBase: ... - def add( - self, - servers: _Servers = ..., - asset: Optional[AppriseAsset] = ..., - tag: Optional[_Tag] = ... - ) -> bool: ... - def clear(self) -> None: ... - def find(self, tag: str = ...) -> Iterator[Apprise]: ... - def notify( - self, - body: str, - title: str = ..., - notify_type: NotifyType = ..., - body_format: NotifyFormat = ..., - tag: _Tag = ..., - attach: Optional[AppriseAttachment] = ..., - interpret_escapes: Optional[bool] = ... - ) -> bool: ... - async def async_notify( - self, - body: str, - title: str = ..., - notify_type: NotifyType = ..., - body_format: NotifyFormat = ..., - tag: _Tag = ..., - attach: Optional[AppriseAttachment] = ..., - interpret_escapes: Optional[bool] = ... - ) -> bool: ... - def details(self, lang: Optional[str] = ...) -> Dict[str, Any]: ... - def urls(self, privacy: bool = ...) -> Iterable[str]: ... - def pop(self, index: int) -> ConfigBase: ... - def __getitem__(self, index: int) -> ConfigBase: ... - def __bool__(self) -> bool: ... - def __iter__(self) -> Iterator[ConfigBase]: ... - def __len__(self) -> int: ... \ No newline at end of file From 0cc5578b5441241b90c7d5a2b55836924a011952 Mon Sep 17 00:00:00 2001 From: morpheus65535 <louis_vezina@hotmail.com> Date: Sat, 28 Dec 2024 23:10:16 -0500 Subject: [PATCH 4/7] no log: wip --- libs/apprise/Apprise.py | 887 ---------------------------------------- 1 file changed, 887 deletions(-) delete mode 100644 libs/apprise/Apprise.py diff --git a/libs/apprise/Apprise.py b/libs/apprise/Apprise.py deleted file mode 100644 index 05a2ee3cc..000000000 --- a/libs/apprise/Apprise.py +++ /dev/null @@ -1,887 +0,0 @@ -# -*- coding: utf-8 -*- -# BSD 2-Clause License -# -# Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> -# -# 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. -# -# 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. - -import asyncio -import concurrent.futures as cf -import os -from itertools import chain -from . import common -from .conversion import convert_between -from .utils import is_exclusive_match -from .manager_plugins import NotificationManager -from .utils import parse_list -from .utils import parse_urls -from .utils import cwe312_url -from .emojis import apply_emojis -from .logger import logger -from .asset import AppriseAsset -from .apprise_config import AppriseConfig -from .apprise_attachment import AppriseAttachment -from .locale import AppriseLocale -from .config.base import ConfigBase -from .plugins.base import NotifyBase - -from . import plugins -from . import __version__ - -# Grant access to our Notification Manager Singleton -N_MGR = NotificationManager() - - -class Apprise: - """ - Our Notification Manager - - """ - - def __init__(self, servers=None, asset=None, location=None, debug=False): - """ - Loads a set of server urls while applying the Asset() module to each - if specified. - - If no asset is provided, then the default asset is used. - - Optionally specify a global ContentLocation for a more strict means - of handling Attachments. - """ - - # Initialize a server list of URLs - self.servers = list() - - # Assigns an central asset object that will be later passed into each - # notification plugin. Assets contain information such as the local - # directory images can be found in. It can also identify remote - # URL paths that contain the images you want to present to the end - # user. If no asset is specified, then the default one is used. - self.asset = \ - asset if isinstance(asset, AppriseAsset) else AppriseAsset() - - if servers: - self.add(servers) - - # Initialize our locale object - self.locale = AppriseLocale() - - # Set our debug flag - self.debug = debug - - # Store our hosting location for optional strict rule handling - # of Attachments. Setting this to None removes any attachment - # restrictions. - self.location = location - - @staticmethod - def instantiate(url, asset=None, tag=None, suppress_exceptions=True): - """ - Returns the instance of a instantiated plugin based on the provided - Server URL. If the url fails to be parsed, then None is returned. - - The specified url can be either a string (the URL itself) or a - dictionary containing all of the components needed to istantiate - the notification service. If identifying a dictionary, at the bare - minimum, one must specify the schema. - - An example of a url dictionary object might look like: - { - schema: 'mailto', - host: 'google.com', - user: 'myuser', - password: 'mypassword', - } - - Alternatively the string is much easier to specify: - mailto://user:mypassword@google.com - - The dictionary works well for people who are calling details() to - extract the components they need to build the URL manually. - """ - - # Initialize our result set - results = None - - # Prepare our Asset Object - asset = asset if isinstance(asset, AppriseAsset) else AppriseAsset() - - if isinstance(url, str): - # Acquire our url tokens - results = plugins.url_to_dict( - url, secure_logging=asset.secure_logging) - - if results is None: - # Failed to parse the server URL; detailed logging handled - # inside url_to_dict - nothing to report here. - return None - - elif isinstance(url, dict): - # We already have our result set - results = url - - if results.get('schema') not in N_MGR: - # schema is a mandatory dictionary item as it is the only way - # we can index into our loaded plugins - logger.error('Dictionary does not include a "schema" entry.') - logger.trace( - 'Invalid dictionary unpacked as:{}{}'.format( - os.linesep, os.linesep.join( - ['{}="{}"'.format(k, v) - for k, v in results.items()]))) - return None - - logger.trace( - 'Dictionary unpacked as:{}{}'.format( - os.linesep, os.linesep.join( - ['{}="{}"'.format(k, v) for k, v in results.items()]))) - - # Otherwise we handle the invalid input specified - else: - logger.error( - 'An invalid URL type (%s) was specified for instantiation', - type(url)) - return None - - if not N_MGR[results['schema']].enabled: - # - # First Plugin Enable Check (Pre Initialization) - # - - # Plugin has been disabled at a global level - logger.error( - '%s:// is disabled on this system.', results['schema']) - return None - - # Build a list of tags to associate with the newly added notifications - results['tag'] = set(parse_list(tag)) - - # Set our Asset Object - results['asset'] = asset - - if suppress_exceptions: - try: - # Attempt to create an instance of our plugin using the parsed - # URL information - plugin = N_MGR[results['schema']](**results) - - # Create log entry of loaded URL - logger.debug( - 'Loaded {} URL: {}'.format( - N_MGR[results['schema']].service_name, - plugin.url(privacy=asset.secure_logging))) - - except Exception: - # CWE-312 (Secure Logging) Handling - loggable_url = url if not asset.secure_logging \ - else cwe312_url(url) - - # the arguments are invalid or can not be used. - logger.error( - 'Could not load {} URL: {}'.format( - N_MGR[results['schema']].service_name, - loggable_url)) - return None - - else: - # Attempt to create an instance of our plugin using the parsed - # URL information but don't wrap it in a try catch - plugin = N_MGR[results['schema']](**results) - - if not plugin.enabled: - # - # Second Plugin Enable Check (Post Initialization) - # - - # Service/Plugin is disabled (on a more local level). This is a - # case where the plugin was initially enabled but then after the - # __init__() was called under the hood something pre-determined - # that it could no longer be used. - - # The only downside to doing it this way is services are - # initialized prior to returning the details() if 3rd party tools - # are polling what is available. These services that become - # disabled thereafter are shown initially that they can be used. - logger.error( - '%s:// has become disabled on this system.', results['schema']) - return None - - return plugin - - def add(self, servers, asset=None, tag=None): - """ - Adds one or more server URLs into our list. - - You can override the global asset if you wish by including it with the - server(s) that you add. - - The tag allows you to associate 1 or more tag values to the server(s) - being added. tagging a service allows you to exclusively access them - when calling the notify() function. - """ - - # Initialize our return status - return_status = True - - if asset is None: - # prepare default asset - asset = self.asset - - if isinstance(servers, str): - # build our server list - servers = parse_urls(servers) - if len(servers) == 0: - return False - - elif isinstance(servers, dict): - # no problem, we support kwargs, convert it to a list - servers = [servers] - - elif isinstance(servers, (ConfigBase, NotifyBase, AppriseConfig)): - # Go ahead and just add our plugin into our list - self.servers.append(servers) - return True - - elif not isinstance(servers, (tuple, set, list)): - logger.error( - "An invalid notification (type={}) was specified.".format( - type(servers))) - return False - - for _server in servers: - - if isinstance(_server, (ConfigBase, NotifyBase, AppriseConfig)): - # Go ahead and just add our plugin into our list - self.servers.append(_server) - continue - - elif not isinstance(_server, (str, dict)): - logger.error( - "An invalid notification (type={}) was specified.".format( - type(_server))) - return_status = False - continue - - # Instantiate ourselves an object, this function throws or - # returns None if it fails - instance = Apprise.instantiate(_server, asset=asset, tag=tag) - if not isinstance(instance, NotifyBase): - # No logging is required as instantiate() handles failure - # and/or success reasons for us - return_status = False - continue - - # Add our initialized plugin to our server listings - self.servers.append(instance) - - # Return our status - return return_status - - def clear(self): - """ - Empties our server list - - """ - self.servers[:] = [] - - def find(self, tag=common.MATCH_ALL_TAG, match_always=True): - """ - Returns a list of all servers matching against the tag specified. - - """ - - # Build our tag setup - # - top level entries are treated as an 'or' - # - second level (or more) entries are treated as 'and' - # - # examples: - # tag="tagA, tagB" = tagA or tagB - # tag=['tagA', 'tagB'] = tagA or tagB - # tag=[('tagA', 'tagC'), 'tagB'] = (tagA and tagC) or tagB - # tag=[('tagB', 'tagC')] = tagB and tagC - - # A match_always flag allows us to pick up on our 'any' keyword - # and notify these services under all circumstances - match_always = common.MATCH_ALWAYS_TAG if match_always else None - - # Iterate over our loaded plugins - for entry in self.servers: - - if isinstance(entry, (ConfigBase, AppriseConfig)): - # load our servers - servers = entry.servers() - - else: - servers = [entry, ] - - for server in servers: - # Apply our tag matching based on our defined logic - if is_exclusive_match( - logic=tag, data=server.tags, - match_all=common.MATCH_ALL_TAG, - match_always=match_always): - yield server - return - - def notify(self, body, title='', notify_type=common.NotifyType.INFO, - body_format=None, tag=common.MATCH_ALL_TAG, match_always=True, - attach=None, interpret_escapes=None): - """ - Send a notification to all the plugins previously loaded. - - If the body_format specified is NotifyFormat.MARKDOWN, it will - be converted to HTML if the Notification type expects this. - - if the tag is specified (either a string or a set/list/tuple - of strings), then only the notifications flagged with that - tagged value are notified. By default, all added services - are notified (tag=MATCH_ALL_TAG) - - This function returns True if all notifications were successfully - sent, False if even just one of them fails, and None if no - notifications were sent at all as a result of tag filtering and/or - simply having empty configuration files that were read. - - Attach can contain a list of attachment URLs. attach can also be - represented by an AttachBase() (or list of) object(s). This - identifies the products you wish to notify - - Set interpret_escapes to True if you want to pre-escape a string - such as turning a \n into an actual new line, etc. - """ - - try: - # Process arguments and build synchronous and asynchronous calls - # (this step can throw internal errors). - sequential_calls, parallel_calls = self._create_notify_calls( - body, title, - notify_type=notify_type, body_format=body_format, - tag=tag, match_always=match_always, attach=attach, - interpret_escapes=interpret_escapes, - ) - - except TypeError: - # No notifications sent, and there was an internal error. - return False - - if not sequential_calls and not parallel_calls: - # Nothing to send - return None - - sequential_result = Apprise._notify_sequential(*sequential_calls) - parallel_result = Apprise._notify_parallel_threadpool(*parallel_calls) - return sequential_result and parallel_result - - async def async_notify(self, *args, **kwargs): - """ - Send a notification to all the plugins previously loaded, for - asynchronous callers. - - The arguments are identical to those of Apprise.notify(). - - """ - try: - # Process arguments and build synchronous and asynchronous calls - # (this step can throw internal errors). - sequential_calls, parallel_calls = self._create_notify_calls( - *args, **kwargs) - - except TypeError: - # No notifications sent, and there was an internal error. - return False - - if not sequential_calls and not parallel_calls: - # Nothing to send - return None - - sequential_result = Apprise._notify_sequential(*sequential_calls) - parallel_result = \ - await Apprise._notify_parallel_asyncio(*parallel_calls) - return sequential_result and parallel_result - - def _create_notify_calls(self, *args, **kwargs): - """ - Creates notifications for all the plugins loaded. - - Returns a list of (server, notify() kwargs) tuples for plugins with - parallelism disabled and another list for plugins with parallelism - enabled. - """ - - all_calls = list(self._create_notify_gen(*args, **kwargs)) - - # Split into sequential and parallel notify() calls. - sequential, parallel = [], [] - for (server, notify_kwargs) in all_calls: - if server.asset.async_mode: - parallel.append((server, notify_kwargs)) - else: - sequential.append((server, notify_kwargs)) - - return sequential, parallel - - def _create_notify_gen(self, body, title='', - notify_type=common.NotifyType.INFO, - body_format=None, tag=common.MATCH_ALL_TAG, - match_always=True, attach=None, - interpret_escapes=None): - """ - Internal generator function for _create_notify_calls(). - """ - - if len(self) == 0: - # Nothing to notify - msg = "There are no service(s) to notify" - logger.error(msg) - raise TypeError(msg) - - if not (title or body or attach): - msg = "No message content specified to deliver" - logger.error(msg) - raise TypeError(msg) - - try: - if title and isinstance(title, bytes): - title = title.decode(self.asset.encoding) - - if body and isinstance(body, bytes): - body = body.decode(self.asset.encoding) - - except UnicodeDecodeError: - msg = 'The content passed into Apprise was not of encoding ' \ - 'type: {}'.format(self.asset.encoding) - logger.error(msg) - raise TypeError(msg) - - # Tracks conversions - conversion_body_map = dict() - conversion_title_map = dict() - - # Prepare attachments if required - if attach is not None and not isinstance(attach, AppriseAttachment): - attach = AppriseAttachment( - attach, asset=self.asset, location=self.location) - - # Allow Asset default value - body_format = self.asset.body_format \ - if body_format is None else body_format - - # Allow Asset default value - interpret_escapes = self.asset.interpret_escapes \ - if interpret_escapes is None else interpret_escapes - - # Iterate over our loaded plugins - for server in self.find(tag, match_always=match_always): - # If our code reaches here, we either did not define a tag (it - # was set to None), or we did define a tag and the logic above - # determined we need to notify the service it's associated with - - # First we need to generate a key we will use to determine if we - # need to build our data out. Entries without are merged with - # the body at this stage. - key = server.notify_format if server.title_maxlen > 0\ - else f'_{server.notify_format}' - - if server.interpret_emojis: - # alter our key slightly to handle emojis since their value is - # pulled out of the notification - key += "-emojis" - - if key not in conversion_title_map: - - # Prepare our title - conversion_title_map[key] = '' if not title else title - - # Conversion of title only occurs for services where the title - # is blended with the body (title_maxlen <= 0) - if conversion_title_map[key] and server.title_maxlen <= 0: - conversion_title_map[key] = convert_between( - body_format, server.notify_format, - content=conversion_title_map[key]) - - # Our body is always converted no matter what - conversion_body_map[key] = \ - convert_between( - body_format, server.notify_format, content=body) - - if interpret_escapes: - # - # Escape our content - # - - try: - # Added overhead required due to Python 3 Encoding Bug - # identified here: https://bugs.python.org/issue21331 - conversion_body_map[key] = \ - conversion_body_map[key]\ - .encode('ascii', 'backslashreplace')\ - .decode('unicode-escape') - - conversion_title_map[key] = \ - conversion_title_map[key]\ - .encode('ascii', 'backslashreplace')\ - .decode('unicode-escape') - - except AttributeError: - # Must be of string type - msg = 'Failed to escape message body' - logger.error(msg) - raise TypeError(msg) - - if server.interpret_emojis: - # - # Convert our :emoji: definitions - # - - conversion_body_map[key] = \ - apply_emojis(conversion_body_map[key]) - conversion_title_map[key] = \ - apply_emojis(conversion_title_map[key]) - - kwargs = dict( - body=conversion_body_map[key], - title=conversion_title_map[key], - notify_type=notify_type, - attach=attach, - body_format=body_format - ) - yield (server, kwargs) - - @staticmethod - def _notify_sequential(*servers_kwargs): - """ - Process a list of notify() calls sequentially and synchronously. - """ - - success = True - - for (server, kwargs) in servers_kwargs: - try: - # Send notification - result = server.notify(**kwargs) - success = success and result - - except TypeError: - # These are our internally thrown notifications. - success = False - - except Exception: - # A catch all so we don't have to abort early - # just because one of our plugins has a bug in it. - logger.exception("Unhandled Notification Exception") - success = False - - return success - - @staticmethod - def _notify_parallel_threadpool(*servers_kwargs): - """ - Process a list of notify() calls in parallel and synchronously. - """ - - n_calls = len(servers_kwargs) - - # 0-length case - if n_calls == 0: - return True - - # There's no need to use a thread pool for just a single notification - if n_calls == 1: - return Apprise._notify_sequential(servers_kwargs[0]) - - # Create log entry - logger.info( - 'Notifying %d service(s) with threads.', len(servers_kwargs)) - - with cf.ThreadPoolExecutor() as executor: - success = True - futures = [executor.submit(server.notify, **kwargs) - for (server, kwargs) in servers_kwargs] - - for future in cf.as_completed(futures): - try: - result = future.result() - success = success and result - - except TypeError: - # These are our internally thrown notifications. - success = False - - except Exception: - # A catch all so we don't have to abort early - # just because one of our plugins has a bug in it. - logger.exception("Unhandled Notification Exception") - success = False - - return success - - @staticmethod - async def _notify_parallel_asyncio(*servers_kwargs): - """ - Process a list of async_notify() calls in parallel and asynchronously. - """ - - n_calls = len(servers_kwargs) - - # 0-length case - if n_calls == 0: - return True - - # (Unlike with the thread pool, we don't optimize for the single- - # notification case because asyncio can do useful work while waiting - # for that thread to complete) - - # Create log entry - logger.info( - 'Notifying %d service(s) asynchronously.', len(servers_kwargs)) - - async def do_call(server, kwargs): - return await server.async_notify(**kwargs) - - cors = (do_call(server, kwargs) for (server, kwargs) in servers_kwargs) - results = await asyncio.gather(*cors, return_exceptions=True) - - if any(isinstance(status, Exception) - and not isinstance(status, TypeError) for status in results): - # A catch all so we don't have to abort early just because - # one of our plugins has a bug in it. - logger.exception("Unhandled Notification Exception") - return False - - if any(isinstance(status, TypeError) for status in results): - # These are our internally thrown notifications. - return False - - return all(results) - - def details(self, lang=None, show_requirements=False, show_disabled=False): - """ - Returns the details associated with the Apprise object - - """ - - # general object returned - response = { - # Defines the current version of Apprise - 'version': __version__, - # Lists all of the currently supported Notifications - 'schemas': [], - # Includes the configured asset details - 'asset': self.asset.details(), - } - - for plugin in N_MGR.plugins(): - # Iterate over our hashed plugins and dynamically build details on - # their status: - - content = { - 'service_name': getattr(plugin, 'service_name', None), - 'service_url': getattr(plugin, 'service_url', None), - 'setup_url': getattr(plugin, 'setup_url', None), - # Placeholder - populated below - 'details': None, - - # Let upstream service know of the plugins that support - # attachments - 'attachment_support': getattr( - plugin, 'attachment_support', False), - - # Differentiat between what is a custom loaded plugin and - # which is native. - 'category': getattr(plugin, 'category', None) - } - - # Standard protocol(s) should be None or a tuple - enabled = getattr(plugin, 'enabled', True) - if not show_disabled and not enabled: - # Do not show inactive plugins - continue - - elif show_disabled: - # Add current state to response - content['enabled'] = enabled - - # Standard protocol(s) should be None or a tuple - protocols = getattr(plugin, 'protocol', None) - if isinstance(protocols, str): - protocols = (protocols, ) - - # Secure protocol(s) should be None or a tuple - secure_protocols = getattr(plugin, 'secure_protocol', None) - if isinstance(secure_protocols, str): - secure_protocols = (secure_protocols, ) - - # Add our protocol details to our content - content.update({ - 'protocols': protocols, - 'secure_protocols': secure_protocols, - }) - - if not lang: - # Simply return our results - content['details'] = plugins.details(plugin) - if show_requirements: - content['requirements'] = plugins.requirements(plugin) - - else: - # Emulate the specified language when returning our results - with self.locale.lang_at(lang): - content['details'] = plugins.details(plugin) - if show_requirements: - content['requirements'] = plugins.requirements(plugin) - - # Build our response object - response['schemas'].append(content) - - return response - - def urls(self, privacy=False): - """ - Returns all of the loaded URLs defined in this apprise object. - """ - return [x.url(privacy=privacy) for x in self.servers] - - def pop(self, index): - """ - Removes an indexed Notification Service from the stack and returns it. - - The thing is we can never pop AppriseConfig() entries, only what was - loaded within them. So pop needs to carefully iterate over our list - and only track actual entries. - """ - - # Tracking variables - prev_offset = -1 - offset = prev_offset - - for idx, s in enumerate(self.servers): - if isinstance(s, (ConfigBase, AppriseConfig)): - servers = s.servers() - if len(servers) > 0: - # Acquire a new maximum offset to work with - offset = prev_offset + len(servers) - - if offset >= index: - # we can pop an element from our config stack - fn = s.pop if isinstance(s, ConfigBase) \ - else s.server_pop - - return fn(index if prev_offset == -1 - else (index - prev_offset - 1)) - - else: - offset = prev_offset + 1 - if offset == index: - return self.servers.pop(idx) - - # Update our old offset - prev_offset = offset - - # If we reach here, then we indexed out of range - raise IndexError('list index out of range') - - def __getitem__(self, index): - """ - Returns the indexed server entry of a loaded notification server - """ - # Tracking variables - prev_offset = -1 - offset = prev_offset - - for idx, s in enumerate(self.servers): - if isinstance(s, (ConfigBase, AppriseConfig)): - # Get our list of servers associate with our config object - servers = s.servers() - if len(servers) > 0: - # Acquire a new maximum offset to work with - offset = prev_offset + len(servers) - - if offset >= index: - return servers[index if prev_offset == -1 - else (index - prev_offset - 1)] - - else: - offset = prev_offset + 1 - if offset == index: - return self.servers[idx] - - # Update our old offset - prev_offset = offset - - # If we reach here, then we indexed out of range - raise IndexError('list index out of range') - - def __getstate__(self): - """ - Pickle Support dumps() - """ - attributes = { - 'asset': self.asset, - # Prepare our URL list as we need to extract the associated tags - # and asset details associated with it - 'urls': [{ - 'url': server.url(privacy=False), - 'tag': server.tags if server.tags else None, - 'asset': server.asset} for server in self.servers], - 'locale': self.locale, - 'debug': self.debug, - 'location': self.location, - } - - return attributes - - def __setstate__(self, state): - """ - Pickle Support loads() - """ - self.servers = list() - self.asset = state['asset'] - self.locale = state['locale'] - self.location = state['location'] - for entry in state['urls']: - self.add(entry['url'], asset=entry['asset'], tag=entry['tag']) - - def __bool__(self): - """ - Allows the Apprise object to be wrapped in an 'if statement'. - True is returned if at least one service has been loaded. - """ - return len(self) > 0 - - def __iter__(self): - """ - Returns an iterator to each of our servers loaded. This includes those - found inside configuration. - """ - return chain(*[[s] if not isinstance(s, (ConfigBase, AppriseConfig)) - else iter(s.servers()) for s in self.servers]) - - def __len__(self): - """ - Returns the number of servers loaded; this includes those found within - loaded configuration. This funtion nnever actually counts the - Config entry themselves (if they exist), only what they contain. - """ - return sum([1 if not isinstance(s, (ConfigBase, AppriseConfig)) - else len(s.servers()) for s in self.servers]) From 44b37ec72cb0103708a40a52a1d6d43b0a000475 Mon Sep 17 00:00:00 2001 From: morpheus65535 <louis_vezina@hotmail.com> Date: Sun, 29 Dec 2024 00:35:05 -0500 Subject: [PATCH 5/7] wip --- libs/Flask_SocketIO-5.4.1.dist-info/RECORD | 10 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- libs/Flask_SocketIO-5.5.0.dist-info/RECORD | 10 + .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- .../RECORD | 20 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../top_level.txt | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- .../RECORD | 32 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../top_level.txt | 0 libs/alembic/__init__.py | 2 +- libs/alembic/ddl/base.py | 18 +- libs/alembic/ddl/impl.py | 41 +- libs/alembic/runtime/migration.py | 29 +- libs/alembic/templates/async/alembic.ini.mako | 4 +- .../templates/generic/alembic.ini.mako | 4 +- .../templates/multidb/alembic.ini.mako | 4 +- libs/alembic/testing/env.py | 8 +- libs/apprise-1.9.0.dist-info/RECORD | 191 ---- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 20 +- libs/apprise-1.9.1.dist-info/RECORD | 204 +++++ .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 0 .../top_level.txt | 0 libs/apprise/__init__.py | 2 +- libs/apprise/apprise.py | 7 +- libs/apprise/apprise_attachment.py | 2 +- libs/apprise/apprise_config.py | 5 +- libs/apprise/asset.py | 6 + libs/apprise/attachment/base.py | 58 +- libs/apprise/attachment/file.py | 8 +- libs/apprise/cli.py | 92 +- libs/apprise/config/base.py | 7 +- libs/apprise/config/file.py | 2 +- libs/apprise/decorators/base.py | 6 +- libs/apprise/exception.py | 8 + libs/apprise/i18n/en/LC_MESSAGES/apprise.mo | Bin 3959 -> 3959 bytes libs/apprise/manager.py | 14 +- libs/apprise/persistent_store.py | 2 +- libs/apprise/plugins/__init__.py | 5 +- libs/apprise/plugins/africas_talking.py | 6 +- libs/apprise/plugins/apprise_api.py | 3 +- libs/apprise/plugins/aprs.py | 3 +- libs/apprise/plugins/bark.py | 38 +- libs/apprise/plugins/base.py | 2 +- libs/apprise/plugins/boxcar.py | 404 --------- libs/apprise/plugins/bulksms.py | 4 +- libs/apprise/plugins/bulkvs.py | 4 +- libs/apprise/plugins/burstsms.py | 6 +- libs/apprise/plugins/chantify.py | 2 +- libs/apprise/plugins/clicksend.py | 4 +- libs/apprise/plugins/d7networks.py | 6 +- libs/apprise/plugins/dapnet.py | 6 +- libs/apprise/plugins/dbus.py | 2 +- libs/apprise/plugins/dingtalk.py | 3 +- libs/apprise/plugins/discord.py | 3 +- libs/apprise/plugins/email/__init__.py | 53 ++ .../plugins/{email.py => email/base.py} | 812 ++++++++---------- libs/apprise/plugins/email/common.py | 84 ++ libs/apprise/plugins/email/templates.py | 272 ++++++ libs/apprise/plugins/emby.py | 2 +- libs/apprise/plugins/fcm/__init__.py | 6 +- libs/apprise/plugins/fcm/color.py | 2 +- libs/apprise/plugins/feishu.py | 2 +- libs/apprise/plugins/flock.py | 4 +- libs/apprise/plugins/gnome.py | 2 +- libs/apprise/plugins/google_chat.py | 2 +- libs/apprise/plugins/gotify.py | 2 +- libs/apprise/plugins/growl.py | 2 +- libs/apprise/plugins/home_assistant.py | 2 +- libs/apprise/plugins/httpsms.py | 4 +- libs/apprise/plugins/ifttt.py | 3 +- libs/apprise/plugins/join.py | 4 +- libs/apprise/plugins/kavenegar.py | 4 +- libs/apprise/plugins/kumulos.py | 2 +- libs/apprise/plugins/lametric.py | 4 +- libs/apprise/plugins/line.py | 4 +- libs/apprise/plugins/lunasea.py | 6 +- libs/apprise/plugins/macosx.py | 2 +- libs/apprise/plugins/mailgun.py | 6 +- libs/apprise/plugins/mastodon.py | 4 +- libs/apprise/plugins/matrix.py | 373 ++++++-- libs/apprise/plugins/mattermost.py | 56 +- libs/apprise/plugins/messagebird.py | 4 +- libs/apprise/plugins/misskey.py | 5 +- libs/apprise/plugins/mqtt.py | 5 +- libs/apprise/plugins/msg91.py | 5 +- libs/apprise/plugins/msteams.py | 119 ++- libs/apprise/plugins/nextcloud.py | 2 +- libs/apprise/plugins/nextcloudtalk.py | 2 +- libs/apprise/plugins/notica.py | 2 +- libs/apprise/plugins/notifiarr.py | 3 +- libs/apprise/plugins/notifico.py | 3 +- libs/apprise/plugins/ntfy.py | 7 +- libs/apprise/plugins/office365.py | 612 +++++++++---- libs/apprise/plugins/one_signal.py | 8 +- libs/apprise/plugins/opsgenie.py | 5 +- libs/apprise/plugins/pagerduty.py | 3 +- libs/apprise/plugins/pagertree.py | 3 +- libs/apprise/plugins/parseplatform.py | 2 +- libs/apprise/plugins/plivo.py | 403 +++++++++ libs/apprise/plugins/popcorn_notify.py | 7 +- libs/apprise/plugins/prowl.py | 2 +- libs/apprise/plugins/pushbullet.py | 4 +- libs/apprise/plugins/pushdeer.py | 2 +- libs/apprise/plugins/pushed.py | 3 +- libs/apprise/plugins/pushjet.py | 2 +- libs/apprise/plugins/pushme.py | 3 +- libs/apprise/plugins/pushover.py | 3 +- libs/apprise/plugins/pushsafer.py | 3 +- libs/apprise/plugins/pushy.py | 3 +- libs/apprise/plugins/reddit.py | 4 +- libs/apprise/plugins/revolt.py | 3 +- libs/apprise/plugins/rocketchat.py | 3 +- libs/apprise/plugins/rsyslog.py | 2 +- libs/apprise/plugins/ryver.py | 3 +- libs/apprise/plugins/sendgrid.py | 4 +- libs/apprise/plugins/serverchan.py | 2 +- libs/apprise/plugins/ses.py | 4 +- libs/apprise/plugins/seven.py | 290 +++++++ libs/apprise/plugins/sfr.py | 3 +- libs/apprise/plugins/signal_api.py | 4 +- libs/apprise/plugins/simplepush.py | 22 +- libs/apprise/plugins/sinch.py | 4 +- libs/apprise/plugins/slack.py | 6 +- libs/apprise/plugins/smseagle.py | 6 +- libs/apprise/plugins/smsmanager.py | 6 +- libs/apprise/plugins/smtp2go.py | 6 +- libs/apprise/plugins/sns.py | 4 +- libs/apprise/plugins/sparkpost.py | 6 +- libs/apprise/plugins/splunk.py | 2 +- libs/apprise/plugins/streamlabs.py | 2 +- libs/apprise/plugins/syslog.py | 2 +- libs/apprise/plugins/techuluspush.py | 2 +- libs/apprise/plugins/telegram.py | 4 +- libs/apprise/plugins/threema.py | 5 +- libs/apprise/plugins/twilio.py | 4 +- libs/apprise/plugins/twist.py | 3 +- libs/apprise/plugins/twitter.py | 4 +- libs/apprise/plugins/voipms.py | 54 +- libs/apprise/plugins/vonage.py | 4 +- libs/apprise/plugins/webexteams.py | 2 +- libs/apprise/plugins/wecombot.py | 2 +- libs/apprise/plugins/whatsapp.py | 4 +- libs/apprise/plugins/windows.py | 2 +- libs/apprise/plugins/workflows.py | 6 +- libs/apprise/plugins/wxpusher.py | 3 +- libs/apprise/plugins/xbmc.py | 2 +- libs/apprise/plugins/zulip.py | 10 +- libs/apprise/url.py | 7 +- libs/apprise/utils/__init__.py | 27 + libs/apprise/utils/base64.py | 88 ++ libs/apprise/utils/cwe312.py | 197 +++++ libs/apprise/utils/disk.py | 178 ++++ libs/apprise/utils/logic.py | 121 +++ libs/apprise/utils/module.py | 59 ++ libs/apprise/{utils.py => utils/parse.py} | 688 +-------------- libs/apprise/utils/pgp.py | 354 ++++++++ libs/apprise/utils/singleton.py | 43 + libs/apprise/utils/templates.py | 84 ++ libs/attr/__init__.py | 17 +- libs/attr/__init__.pyi | 57 +- libs/attr/_compat.py | 9 - libs/attr/_config.py | 2 +- libs/attr/_funcs.py | 54 -- libs/attr/_make.py | 181 +++- libs/attr/_next_gen.py | 16 +- libs/attr/converters.py | 23 +- libs/attr/converters.pyi | 20 +- libs/attr/setters.py | 2 +- libs/attr/validators.py | 3 +- libs/attr/validators.pyi | 7 +- libs/attrs-24.2.0.dist-info/RECORD | 37 - .../INSTALLER | 0 .../METADATA | 68 +- libs/attrs-24.3.0.dist-info/RECORD | 37 + .../REQUESTED | 0 .../WHEEL | 2 +- .../licenses/LICENSE | 0 libs/attrs/__init__.py | 14 +- libs/attrs/__init__.pyi | 19 +- libs/blinker-1.8.2.dist-info/METADATA | 2 +- libs/blinker-1.8.2.dist-info/RECORD | 4 +- libs/blinker-1.8.2.dist-info/WHEEL | 2 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 3 +- libs/certifi-2024.12.14.dist-info/RECORD | 12 + .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 libs/certifi-2024.8.30.dist-info/RECORD | 12 - libs/certifi/__init__.py | 2 +- libs/certifi/cacert.pem | 153 +--- .../charset_normalizer-3.4.0.dist-info/RECORD | 22 - libs/charset_normalizer-3.4.0.dist-info/WHEEL | 5 - .../entry_points.txt | 2 - .../INSTALLER | 0 .../LICENSE | 4 +- .../METADATA | 70 +- .../charset_normalizer-3.4.1.dist-info/RECORD | 22 + .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 2 + .../top_level.txt | 0 libs/charset_normalizer/__init__.py | 4 +- libs/charset_normalizer/__main__.py | 2 + libs/charset_normalizer/api.py | 60 +- libs/charset_normalizer/cd.py | 68 +- libs/charset_normalizer/cli/__init__.py | 2 + libs/charset_normalizer/cli/__main__.py | 11 +- libs/charset_normalizer/constant.py | 27 +- libs/charset_normalizer/legacy.py | 11 +- libs/charset_normalizer/md.py | 46 +- libs/charset_normalizer/models.py | 79 +- libs/charset_normalizer/utils.py | 75 +- libs/charset_normalizer/version.py | 4 +- libs/click-8.1.7.dist-info/METADATA | 103 --- libs/click-8.1.7.dist-info/RECORD | 24 - libs/click-8.1.7.dist-info/WHEEL | 5 - libs/click-8.1.7.dist-info/top_level.txt | 1 - .../INSTALLER | 0 .../LICENSE.txt} | 0 libs/click-8.1.8.dist-info/METADATA | 74 ++ libs/click-8.1.8.dist-info/RECORD | 23 + .../REQUESTED | 0 .../WHEEL | 2 +- libs/click/__init__.py | 4 +- libs/click/_compat.py | 2 +- libs/click/_termui_impl.py | 113 ++- libs/click/core.py | 131 +-- libs/click/decorators.py | 81 +- libs/click/exceptions.py | 14 +- libs/click/globals.py | 7 +- libs/click/parser.py | 4 +- libs/click/shell_completion.py | 15 +- libs/click/termui.py | 2 +- libs/click/testing.py | 6 +- libs/click/types.py | 16 +- libs/click/utils.py | 10 +- libs/engineio/async_client.py | 44 +- .../engineio/async_drivers/_websocket_wsgi.py | 2 +- libs/engineio/async_drivers/aiohttp.py | 6 +- libs/engineio/async_drivers/asgi.py | 30 +- libs/engineio/async_drivers/eventlet.py | 2 - libs/engineio/async_drivers/gevent_uwsgi.py | 8 +- libs/engineio/async_drivers/sanic.py | 9 +- libs/engineio/async_drivers/tornado.py | 6 +- libs/engineio/async_server.py | 105 ++- libs/engineio/async_socket.py | 25 +- libs/engineio/base_client.py | 14 +- libs/engineio/base_server.py | 13 + libs/engineio/base_socket.py | 1 - libs/engineio/client.py | 32 +- libs/engineio/middleware.py | 4 +- libs/engineio/packet.py | 2 +- libs/engineio/payload.py | 2 +- libs/engineio/server.py | 77 +- libs/engineio/socket.py | 17 +- libs/fcache-0.5.2.dist-info/METADATA | 2 +- libs/fcache-0.5.2.dist-info/RECORD | 4 +- libs/fcache-0.5.2.dist-info/WHEEL | 2 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 3 +- .../RECORD | 22 +- .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 0 .../top_level.txt | 0 libs/ffsubsync/_version.py | 6 +- libs/ffsubsync/generic_subtitles.py | 4 +- libs/ffsubsync/subtitle_parser.py | 2 +- libs/flask-3.0.3.dist-info/METADATA | 2 +- libs/flask-3.0.3.dist-info/RECORD | 4 +- libs/flask-3.0.3.dist-info/WHEEL | 2 +- libs/flask_socketio/__init__.py | 25 +- libs/flask_socketio/namespace.py | 14 +- libs/flask_socketio/test_client.py | 2 +- libs/inflect-7.4.0.dist-info/RECORD | 2 +- libs/inflect-7.4.0.dist-info/WHEEL | 2 +- libs/jinja2-3.1.4.dist-info/RECORD | 33 - .../INSTALLER | 0 .../LICENSE.txt | 0 .../METADATA | 27 +- libs/jinja2-3.1.5.dist-info/RECORD | 33 + .../REQUESTED | 0 libs/jinja2-3.1.5.dist-info/WHEEL | 4 + .../entry_points.txt | 0 libs/jinja2/__init__.py | 2 +- libs/jinja2/async_utils.py | 27 +- libs/jinja2/compiler.py | 98 ++- libs/jinja2/debug.py | 2 +- libs/jinja2/environment.py | 41 +- libs/jinja2/ext.py | 2 +- libs/jinja2/filters.py | 28 +- libs/jinja2/idtracking.py | 26 +- libs/jinja2/lexer.py | 8 +- libs/jinja2/loaders.py | 64 +- libs/jinja2/parser.py | 42 +- libs/jinja2/runtime.py | 42 +- libs/jinja2/sandbox.py | 87 +- libs/jinja2/utils.py | 19 +- libs/mako/__init__.py | 2 +- libs/mako/parsetree.py | 2 +- libs/pysubs2-1.7.3.dist-info/RECORD | 2 +- libs/pysubs2-1.7.3.dist-info/WHEEL | 2 +- libs/python_engineio-4.10.1.dist-info/RECORD | 33 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- libs/python_engineio-4.11.1.dist-info/RECORD | 33 + .../REQUESTED | 0 libs/python_engineio-4.11.1.dist-info/WHEEL | 5 + .../top_level.txt | 0 libs/python_socketio-5.11.4.dist-info/RECORD | 38 - libs/python_socketio-5.11.4.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 4 +- libs/python_socketio-5.12.0.dist-info/RECORD | 38 + .../REQUESTED | 0 libs/python_socketio-5.12.0.dist-info/WHEEL | 5 + .../top_level.txt | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- .../RECORD | 14 +- .../REQUESTED | 0 .../WHEEL | 0 libs/rich/cells.py | 55 +- libs/six-1.16.0.dist-info/RECORD | 8 - .../INSTALLER | 0 .../LICENSE | 2 +- .../METADATA | 6 +- libs/six-1.17.0.dist-info/RECORD | 8 + .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 libs/six.py | 15 +- libs/socketio/admin.py | 2 +- libs/socketio/async_client.py | 42 +- libs/socketio/async_namespace.py | 40 +- libs/socketio/async_server.py | 35 +- libs/socketio/base_client.py | 5 +- libs/socketio/base_manager.py | 3 +- libs/socketio/base_namespace.py | 2 +- libs/socketio/base_server.py | 3 + libs/socketio/client.py | 31 +- libs/socketio/kafka_manager.py | 3 +- libs/socketio/kombu_manager.py | 2 +- libs/socketio/namespace.py | 18 +- libs/socketio/packet.py | 2 +- libs/socketio/redis_manager.py | 3 +- libs/socketio/server.py | 28 +- libs/socketio/zmq_manager.py | 2 +- libs/tqdm-4.66.6.dist-info/WHEEL | 5 - .../INSTALLER | 0 .../LICENCE | 0 .../METADATA | 7 +- .../RECORD | 22 +- .../REQUESTED | 0 libs/tqdm-4.67.1.dist-info/WHEEL | 5 + .../entry_points.txt | 0 .../top_level.txt | 0 libs/tqdm/_dist_ver.py | 2 +- libs/tqdm/contrib/discord.py | 83 +- libs/tqdm/gui.py | 17 +- libs/urllib3-2.2.3.dist-info/METADATA | 2 +- libs/urllib3-2.2.3.dist-info/RECORD | 4 +- libs/urllib3-2.2.3.dist-info/WHEEL | 2 +- libs/version.txt | 52 +- libs/waitress-3.0.0.dist-info/RECORD | 2 +- libs/waitress-3.0.0.dist-info/WHEEL | 2 +- libs/werkzeug-3.0.6.dist-info/METADATA | 2 +- libs/werkzeug-3.0.6.dist-info/RECORD | 4 +- libs/werkzeug-3.0.6.dist-info/WHEEL | 2 +- libs/zipp-3.20.2.dist-info/RECORD | 2 +- libs/zipp-3.20.2.dist-info/WHEEL | 2 +- 396 files changed, 6327 insertions(+), 4005 deletions(-) delete mode 100644 libs/Flask_SocketIO-5.4.1.dist-info/RECORD rename libs/{Flask_SocketIO-5.4.1.dist-info => Flask_SocketIO-5.5.0.dist-info}/INSTALLER (100%) rename libs/{Flask_SocketIO-5.4.1.dist-info => Flask_SocketIO-5.5.0.dist-info}/LICENSE (100%) rename libs/{Flask_SocketIO-5.4.1.dist-info => Flask_SocketIO-5.5.0.dist-info}/METADATA (99%) create mode 100644 libs/Flask_SocketIO-5.5.0.dist-info/RECORD rename libs/{Flask_SocketIO-5.4.1.dist-info => Flask_SocketIO-5.5.0.dist-info}/REQUESTED (100%) rename libs/{Mako-1.3.6.dist-info => Flask_SocketIO-5.5.0.dist-info}/WHEEL (65%) rename libs/{Flask_SocketIO-5.4.1.dist-info => Flask_SocketIO-5.5.0.dist-info}/top_level.txt (100%) rename libs/{Mako-1.3.6.dist-info => Mako-1.3.8.dist-info}/INSTALLER (100%) rename libs/{Mako-1.3.6.dist-info => Mako-1.3.8.dist-info}/LICENSE (100%) rename libs/{Mako-1.3.6.dist-info => Mako-1.3.8.dist-info}/METADATA (99%) rename libs/{Mako-1.3.6.dist-info => Mako-1.3.8.dist-info}/RECORD (79%) rename libs/{Mako-1.3.6.dist-info => Mako-1.3.8.dist-info}/REQUESTED (100%) rename libs/{alembic-1.13.3.dist-info => Mako-1.3.8.dist-info}/WHEEL (65%) rename libs/{Mako-1.3.6.dist-info => Mako-1.3.8.dist-info}/entry_points.txt (100%) rename libs/{Mako-1.3.6.dist-info => Mako-1.3.8.dist-info}/top_level.txt (100%) rename libs/{alembic-1.13.3.dist-info => alembic-1.14.0.dist-info}/INSTALLER (100%) rename libs/{alembic-1.13.3.dist-info => alembic-1.14.0.dist-info}/LICENSE (100%) rename libs/{alembic-1.13.3.dist-info => alembic-1.14.0.dist-info}/METADATA (99%) rename libs/{alembic-1.13.3.dist-info => alembic-1.14.0.dist-info}/RECORD (83%) rename libs/{alembic-1.13.3.dist-info => alembic-1.14.0.dist-info}/REQUESTED (100%) rename libs/{Flask_SocketIO-5.4.1.dist-info => alembic-1.14.0.dist-info}/WHEEL (65%) rename libs/{alembic-1.13.3.dist-info => alembic-1.14.0.dist-info}/entry_points.txt (100%) rename libs/{alembic-1.13.3.dist-info => alembic-1.14.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/apprise-1.9.0.dist-info/RECORD rename libs/{apprise-1.9.0.dist-info => apprise-1.9.1.dist-info}/INSTALLER (100%) rename libs/{apprise-1.9.0.dist-info => apprise-1.9.1.dist-info}/LICENSE (100%) rename libs/{apprise-1.9.0.dist-info => apprise-1.9.1.dist-info}/METADATA (94%) create mode 100644 libs/apprise-1.9.1.dist-info/RECORD rename libs/{apprise-1.9.0.dist-info => apprise-1.9.1.dist-info}/REQUESTED (100%) rename libs/{apprise-1.9.0.dist-info => apprise-1.9.1.dist-info}/WHEEL (100%) rename libs/{apprise-1.9.0.dist-info => apprise-1.9.1.dist-info}/entry_points.txt (100%) rename libs/{apprise-1.9.0.dist-info => apprise-1.9.1.dist-info}/top_level.txt (100%) delete mode 100644 libs/apprise/plugins/boxcar.py create mode 100644 libs/apprise/plugins/email/__init__.py rename libs/apprise/plugins/{email.py => email/base.py} (67%) create mode 100644 libs/apprise/plugins/email/common.py create mode 100644 libs/apprise/plugins/email/templates.py create mode 100644 libs/apprise/plugins/plivo.py create mode 100644 libs/apprise/plugins/seven.py create mode 100644 libs/apprise/utils/__init__.py create mode 100644 libs/apprise/utils/base64.py create mode 100644 libs/apprise/utils/cwe312.py create mode 100644 libs/apprise/utils/disk.py create mode 100644 libs/apprise/utils/logic.py create mode 100644 libs/apprise/utils/module.py rename libs/apprise/{utils.py => utils/parse.py} (67%) create mode 100644 libs/apprise/utils/pgp.py create mode 100644 libs/apprise/utils/singleton.py create mode 100644 libs/apprise/utils/templates.py delete mode 100644 libs/attrs-24.2.0.dist-info/RECORD rename libs/{attrs-24.2.0.dist-info => attrs-24.3.0.dist-info}/INSTALLER (100%) rename libs/{attrs-24.2.0.dist-info => attrs-24.3.0.dist-info}/METADATA (78%) create mode 100644 libs/attrs-24.3.0.dist-info/RECORD rename libs/{attrs-24.2.0.dist-info => attrs-24.3.0.dist-info}/REQUESTED (100%) rename libs/{attrs-24.2.0.dist-info => attrs-24.3.0.dist-info}/WHEEL (67%) rename libs/{attrs-24.2.0.dist-info => attrs-24.3.0.dist-info}/licenses/LICENSE (100%) rename libs/{certifi-2024.8.30.dist-info => certifi-2024.12.14.dist-info}/INSTALLER (100%) rename libs/{certifi-2024.8.30.dist-info => certifi-2024.12.14.dist-info}/LICENSE (100%) rename libs/{certifi-2024.8.30.dist-info => certifi-2024.12.14.dist-info}/METADATA (96%) create mode 100644 libs/certifi-2024.12.14.dist-info/RECORD rename libs/{certifi-2024.8.30.dist-info => certifi-2024.12.14.dist-info}/REQUESTED (100%) rename libs/{certifi-2024.8.30.dist-info => certifi-2024.12.14.dist-info}/WHEEL (100%) rename libs/{certifi-2024.8.30.dist-info => certifi-2024.12.14.dist-info}/top_level.txt (100%) delete mode 100644 libs/certifi-2024.8.30.dist-info/RECORD delete mode 100644 libs/charset_normalizer-3.4.0.dist-info/RECORD delete mode 100644 libs/charset_normalizer-3.4.0.dist-info/WHEEL delete mode 100644 libs/charset_normalizer-3.4.0.dist-info/entry_points.txt rename libs/{charset_normalizer-3.4.0.dist-info => charset_normalizer-3.4.1.dist-info}/INSTALLER (100%) rename libs/{charset_normalizer-3.4.0.dist-info => charset_normalizer-3.4.1.dist-info}/LICENSE (95%) rename libs/{charset_normalizer-3.4.0.dist-info => charset_normalizer-3.4.1.dist-info}/METADATA (93%) create mode 100644 libs/charset_normalizer-3.4.1.dist-info/RECORD rename libs/{charset_normalizer-3.4.0.dist-info => charset_normalizer-3.4.1.dist-info}/REQUESTED (100%) rename libs/{python_engineio-4.10.1.dist-info => charset_normalizer-3.4.1.dist-info}/WHEEL (65%) create mode 100644 libs/charset_normalizer-3.4.1.dist-info/entry_points.txt rename libs/{charset_normalizer-3.4.0.dist-info => charset_normalizer-3.4.1.dist-info}/top_level.txt (100%) delete mode 100644 libs/click-8.1.7.dist-info/METADATA delete mode 100644 libs/click-8.1.7.dist-info/RECORD delete mode 100644 libs/click-8.1.7.dist-info/WHEEL delete mode 100644 libs/click-8.1.7.dist-info/top_level.txt rename libs/{click-8.1.7.dist-info => click-8.1.8.dist-info}/INSTALLER (100%) rename libs/{click-8.1.7.dist-info/LICENSE.rst => click-8.1.8.dist-info/LICENSE.txt} (100%) create mode 100644 libs/click-8.1.8.dist-info/METADATA create mode 100644 libs/click-8.1.8.dist-info/RECORD rename libs/{click-8.1.7.dist-info => click-8.1.8.dist-info}/REQUESTED (100%) rename libs/{jinja2-3.1.4.dist-info => click-8.1.8.dist-info}/WHEEL (71%) rename libs/{ffsubsync-0.4.26.dist-info => ffsubsync-0.4.27.dist-info}/INSTALLER (100%) rename libs/{ffsubsync-0.4.26.dist-info => ffsubsync-0.4.27.dist-info}/LICENSE (100%) rename libs/{ffsubsync-0.4.26.dist-info => ffsubsync-0.4.27.dist-info}/METADATA (99%) rename libs/{ffsubsync-0.4.26.dist-info => ffsubsync-0.4.27.dist-info}/RECORD (64%) rename libs/{ffsubsync-0.4.26.dist-info => ffsubsync-0.4.27.dist-info}/REQUESTED (100%) rename libs/{ffsubsync-0.4.26.dist-info => ffsubsync-0.4.27.dist-info}/WHEEL (100%) rename libs/{ffsubsync-0.4.26.dist-info => ffsubsync-0.4.27.dist-info}/entry_points.txt (100%) rename libs/{ffsubsync-0.4.26.dist-info => ffsubsync-0.4.27.dist-info}/top_level.txt (100%) delete mode 100644 libs/jinja2-3.1.4.dist-info/RECORD rename libs/{jinja2-3.1.4.dist-info => jinja2-3.1.5.dist-info}/INSTALLER (100%) rename libs/{jinja2-3.1.4.dist-info => jinja2-3.1.5.dist-info}/LICENSE.txt (100%) rename libs/{jinja2-3.1.4.dist-info => jinja2-3.1.5.dist-info}/METADATA (88%) create mode 100644 libs/jinja2-3.1.5.dist-info/RECORD rename libs/{jinja2-3.1.4.dist-info => jinja2-3.1.5.dist-info}/REQUESTED (100%) create mode 100644 libs/jinja2-3.1.5.dist-info/WHEEL rename libs/{jinja2-3.1.4.dist-info => jinja2-3.1.5.dist-info}/entry_points.txt (100%) delete mode 100644 libs/python_engineio-4.10.1.dist-info/RECORD rename libs/{python_engineio-4.10.1.dist-info => python_engineio-4.11.1.dist-info}/INSTALLER (100%) rename libs/{python_engineio-4.10.1.dist-info => python_engineio-4.11.1.dist-info}/LICENSE (100%) rename libs/{python_engineio-4.10.1.dist-info => python_engineio-4.11.1.dist-info}/METADATA (99%) create mode 100644 libs/python_engineio-4.11.1.dist-info/RECORD rename libs/{python_engineio-4.10.1.dist-info => python_engineio-4.11.1.dist-info}/REQUESTED (100%) create mode 100644 libs/python_engineio-4.11.1.dist-info/WHEEL rename libs/{python_engineio-4.10.1.dist-info => python_engineio-4.11.1.dist-info}/top_level.txt (100%) delete mode 100644 libs/python_socketio-5.11.4.dist-info/RECORD delete mode 100644 libs/python_socketio-5.11.4.dist-info/WHEEL rename libs/{python_socketio-5.11.4.dist-info => python_socketio-5.12.0.dist-info}/INSTALLER (100%) rename libs/{python_socketio-5.11.4.dist-info => python_socketio-5.12.0.dist-info}/LICENSE (100%) rename libs/{python_socketio-5.11.4.dist-info => python_socketio-5.12.0.dist-info}/METADATA (98%) create mode 100644 libs/python_socketio-5.12.0.dist-info/RECORD rename libs/{python_socketio-5.11.4.dist-info => python_socketio-5.12.0.dist-info}/REQUESTED (100%) create mode 100644 libs/python_socketio-5.12.0.dist-info/WHEEL rename libs/{python_socketio-5.11.4.dist-info => python_socketio-5.12.0.dist-info}/top_level.txt (100%) rename libs/{rich-13.9.3.dist-info => rich-13.9.4.dist-info}/INSTALLER (100%) rename libs/{rich-13.9.3.dist-info => rich-13.9.4.dist-info}/LICENSE (100%) rename libs/{rich-13.9.3.dist-info => rich-13.9.4.dist-info}/METADATA (99%) rename libs/{rich-13.9.3.dist-info => rich-13.9.4.dist-info}/RECORD (92%) rename libs/{rich-13.9.3.dist-info => rich-13.9.4.dist-info}/REQUESTED (100%) rename libs/{rich-13.9.3.dist-info => rich-13.9.4.dist-info}/WHEEL (100%) delete mode 100644 libs/six-1.16.0.dist-info/RECORD rename libs/{six-1.16.0.dist-info => six-1.17.0.dist-info}/INSTALLER (100%) rename libs/{six-1.16.0.dist-info => six-1.17.0.dist-info}/LICENSE (96%) rename libs/{six-1.16.0.dist-info => six-1.17.0.dist-info}/METADATA (91%) create mode 100644 libs/six-1.17.0.dist-info/RECORD rename libs/{six-1.16.0.dist-info => six-1.17.0.dist-info}/REQUESTED (100%) rename libs/{six-1.16.0.dist-info => six-1.17.0.dist-info}/WHEEL (100%) rename libs/{six-1.16.0.dist-info => six-1.17.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/tqdm-4.66.6.dist-info/WHEEL rename libs/{tqdm-4.66.6.dist-info => tqdm-4.67.1.dist-info}/INSTALLER (100%) rename libs/{tqdm-4.66.6.dist-info => tqdm-4.67.1.dist-info}/LICENCE (100%) rename libs/{tqdm-4.66.6.dist-info => tqdm-4.67.1.dist-info}/METADATA (99%) rename libs/{tqdm-4.66.6.dist-info => tqdm-4.67.1.dist-info}/RECORD (76%) rename libs/{tqdm-4.66.6.dist-info => tqdm-4.67.1.dist-info}/REQUESTED (100%) create mode 100644 libs/tqdm-4.67.1.dist-info/WHEEL rename libs/{tqdm-4.66.6.dist-info => tqdm-4.67.1.dist-info}/entry_points.txt (100%) rename libs/{tqdm-4.66.6.dist-info => tqdm-4.67.1.dist-info}/top_level.txt (100%) diff --git a/libs/Flask_SocketIO-5.4.1.dist-info/RECORD b/libs/Flask_SocketIO-5.4.1.dist-info/RECORD deleted file mode 100644 index 41359c3ae..000000000 --- a/libs/Flask_SocketIO-5.4.1.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -Flask_SocketIO-5.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_SocketIO-5.4.1.dist-info/LICENSE,sha256=aNCWbkgKjS_T1cJtACyZbvCM36KxWnfQ0LWTuavuYKQ,1082 -Flask_SocketIO-5.4.1.dist-info/METADATA,sha256=mySfdtGXW8DrfdcqpYk_ENRoDASLlechS67F_kpdY78,2637 -Flask_SocketIO-5.4.1.dist-info/RECORD,, -Flask_SocketIO-5.4.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_SocketIO-5.4.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 -Flask_SocketIO-5.4.1.dist-info/top_level.txt,sha256=C1ugzQBJ3HHUJsWGzyt70XRVOX-y4CUAR8MWKjwJOQ8,15 -flask_socketio/__init__.py,sha256=jwNzwRoorTH6Q5A5KgHJPoCJ_xYKD4P5R8Z3BS2HH1Q,55135 -flask_socketio/namespace.py,sha256=Zv0k0q5KiOn8SF1Nk1CKtPYRSx8jM6Ht75Lp0QusdM0,2028 -flask_socketio/test_client.py,sha256=9_R1y_vP8yr8wzimQUEMAUyVqX12FMXurLj8t1ecDdc,11034 diff --git a/libs/Flask_SocketIO-5.4.1.dist-info/INSTALLER b/libs/Flask_SocketIO-5.5.0.dist-info/INSTALLER similarity index 100% rename from libs/Flask_SocketIO-5.4.1.dist-info/INSTALLER rename to libs/Flask_SocketIO-5.5.0.dist-info/INSTALLER diff --git a/libs/Flask_SocketIO-5.4.1.dist-info/LICENSE b/libs/Flask_SocketIO-5.5.0.dist-info/LICENSE similarity index 100% rename from libs/Flask_SocketIO-5.4.1.dist-info/LICENSE rename to libs/Flask_SocketIO-5.5.0.dist-info/LICENSE diff --git a/libs/Flask_SocketIO-5.4.1.dist-info/METADATA b/libs/Flask_SocketIO-5.5.0.dist-info/METADATA similarity index 99% rename from libs/Flask_SocketIO-5.4.1.dist-info/METADATA rename to libs/Flask_SocketIO-5.5.0.dist-info/METADATA index fba427379..98bc5fd62 100644 --- a/libs/Flask_SocketIO-5.4.1.dist-info/METADATA +++ b/libs/Flask_SocketIO-5.5.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: Flask-SocketIO -Version: 5.4.1 +Version: 5.5.0 Summary: Socket.IO integration for Flask applications Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> Project-URL: Homepage, https://github.com/miguelgrinberg/flask-socketio diff --git a/libs/Flask_SocketIO-5.5.0.dist-info/RECORD b/libs/Flask_SocketIO-5.5.0.dist-info/RECORD new file mode 100644 index 000000000..a86a348d1 --- /dev/null +++ b/libs/Flask_SocketIO-5.5.0.dist-info/RECORD @@ -0,0 +1,10 @@ +Flask_SocketIO-5.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_SocketIO-5.5.0.dist-info/LICENSE,sha256=aNCWbkgKjS_T1cJtACyZbvCM36KxWnfQ0LWTuavuYKQ,1082 +Flask_SocketIO-5.5.0.dist-info/METADATA,sha256=LRFQve-hu_8O4YwU7xPb2BDoRKp88hPIzyUmOogxHBg,2637 +Flask_SocketIO-5.5.0.dist-info/RECORD,, +Flask_SocketIO-5.5.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_SocketIO-5.5.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +Flask_SocketIO-5.5.0.dist-info/top_level.txt,sha256=C1ugzQBJ3HHUJsWGzyt70XRVOX-y4CUAR8MWKjwJOQ8,15 +flask_socketio/__init__.py,sha256=5hN0LE0hfGMUDcX4FheZrtXERJ1IBEPagv0pgeqdtlU,54904 +flask_socketio/namespace.py,sha256=UkVryJvFYgnCMKWSF35GVfGdyh2cXRDyRbfmEPPchVA,2329 +flask_socketio/test_client.py,sha256=rClk02TSRqgidH8IyeohspKVKdpRx7gcZBjg1YUtZpA,11026 diff --git a/libs/Flask_SocketIO-5.4.1.dist-info/REQUESTED b/libs/Flask_SocketIO-5.5.0.dist-info/REQUESTED similarity index 100% rename from libs/Flask_SocketIO-5.4.1.dist-info/REQUESTED rename to libs/Flask_SocketIO-5.5.0.dist-info/REQUESTED diff --git a/libs/Mako-1.3.6.dist-info/WHEEL b/libs/Flask_SocketIO-5.5.0.dist-info/WHEEL similarity index 65% rename from libs/Mako-1.3.6.dist-info/WHEEL rename to libs/Flask_SocketIO-5.5.0.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/Mako-1.3.6.dist-info/WHEEL +++ b/libs/Flask_SocketIO-5.5.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/Flask_SocketIO-5.4.1.dist-info/top_level.txt b/libs/Flask_SocketIO-5.5.0.dist-info/top_level.txt similarity index 100% rename from libs/Flask_SocketIO-5.4.1.dist-info/top_level.txt rename to libs/Flask_SocketIO-5.5.0.dist-info/top_level.txt diff --git a/libs/Mako-1.3.6.dist-info/INSTALLER b/libs/Mako-1.3.8.dist-info/INSTALLER similarity index 100% rename from libs/Mako-1.3.6.dist-info/INSTALLER rename to libs/Mako-1.3.8.dist-info/INSTALLER diff --git a/libs/Mako-1.3.6.dist-info/LICENSE b/libs/Mako-1.3.8.dist-info/LICENSE similarity index 100% rename from libs/Mako-1.3.6.dist-info/LICENSE rename to libs/Mako-1.3.8.dist-info/LICENSE diff --git a/libs/Mako-1.3.6.dist-info/METADATA b/libs/Mako-1.3.8.dist-info/METADATA similarity index 99% rename from libs/Mako-1.3.6.dist-info/METADATA rename to libs/Mako-1.3.8.dist-info/METADATA index 404f6dc2b..bf0b1f45b 100644 --- a/libs/Mako-1.3.6.dist-info/METADATA +++ b/libs/Mako-1.3.8.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: Mako -Version: 1.3.6 +Version: 1.3.8 Summary: A super-fast templating language that borrows the best ideas from the existing templating languages. Home-page: https://www.makotemplates.org/ Author: Mike Bayer diff --git a/libs/Mako-1.3.6.dist-info/RECORD b/libs/Mako-1.3.8.dist-info/RECORD similarity index 79% rename from libs/Mako-1.3.6.dist-info/RECORD rename to libs/Mako-1.3.8.dist-info/RECORD index 132f7f753..7e79ae7aa 100644 --- a/libs/Mako-1.3.6.dist-info/RECORD +++ b/libs/Mako-1.3.8.dist-info/RECORD @@ -1,13 +1,13 @@ ../../bin/mako-render,sha256=NK39DgCmw8pz5T7ALDcW2MB6hFGNVOpWXAHq3-GKyss,236 -Mako-1.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Mako-1.3.6.dist-info/LICENSE,sha256=FWJ7NrONBynN1obfmr9gZQPZnWJLL17FyyVKddWvqJE,1098 -Mako-1.3.6.dist-info/METADATA,sha256=acS60Hd7WhYKop08nPD7xyTeA7K0BvI5tZ1bFDzu_eI,2896 -Mako-1.3.6.dist-info/RECORD,, -Mako-1.3.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Mako-1.3.6.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 -Mako-1.3.6.dist-info/entry_points.txt,sha256=LsKkUsOsJQYbJ2M72hZCm968wi5K8Ywb5uFxCuN8Obk,512 -Mako-1.3.6.dist-info/top_level.txt,sha256=LItdH8cDPetpUu8rUyBG3DObS6h9Gcpr9j_WLj2S-R0,5 -mako/__init__.py,sha256=tBgTwfysRucStb1CjE0XkNmFru0tZ_O0G6d_hZu6Psw,242 +Mako-1.3.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Mako-1.3.8.dist-info/LICENSE,sha256=FWJ7NrONBynN1obfmr9gZQPZnWJLL17FyyVKddWvqJE,1098 +Mako-1.3.8.dist-info/METADATA,sha256=YtMX8Z6wVX7TvuBzOsUAOAq_jdceHFW4rR6hwvMNZgE,2896 +Mako-1.3.8.dist-info/RECORD,, +Mako-1.3.8.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Mako-1.3.8.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +Mako-1.3.8.dist-info/entry_points.txt,sha256=LsKkUsOsJQYbJ2M72hZCm968wi5K8Ywb5uFxCuN8Obk,512 +Mako-1.3.8.dist-info/top_level.txt,sha256=LItdH8cDPetpUu8rUyBG3DObS6h9Gcpr9j_WLj2S-R0,5 +mako/__init__.py,sha256=sMLX8sANJQjjeIsZjbrwotWPXHEpRcKxELPgkx2Cyw8,242 mako/_ast_util.py,sha256=CenxCrdES1irHDhOQU6Ldta4rdsytfYaMkN6s0TlveM,20247 mako/ast.py,sha256=pY7MH-5cLnUuVz5YAwoGhWgWfgoVvLQkRDtc_s9qqw0,6642 mako/cache.py,sha256=5DBBorj1NqiWDqNhN3ZJ8tMCm-h6Mew541276kdsxAU,7680 @@ -27,7 +27,7 @@ mako/ext/turbogears.py,sha256=0emY1WiMnuY8Pf6ARv5JBArKtouUdmuTljI-w6rE3J4,2141 mako/filters.py,sha256=F7aDIKTUxnT-Og4rgboQtnML7Q87DJTHQyhi_dY_Ih4,4658 mako/lexer.py,sha256=Xi6Lk8CnASf3UYAaPoYrfjuPkrYauNjvYvULCUkKYaY,16321 mako/lookup.py,sha256=rkMvT5T7EOS5KRvPtgYii-sjh1nWWyKok_mEk-cEzrM,12428 -mako/parsetree.py,sha256=7RNVRTsKcsMt8vU4NQi5C7e4vhdUyA9tqyd1yIkvAAQ,19007 +mako/parsetree.py,sha256=BHdZI9vyxKB27Q4hzym5TdZ_982_3k31_HMsGLz3Tlg,19021 mako/pygen.py,sha256=d4f_ugRACCXuV9hJgEk6Ncoj38EaRHA3RTxkr_tK7UQ,10416 mako/pyparser.py,sha256=eY_a94QDXaK3vIA2jZYT9so7oXKKJLT0SO_Yrl3IOb8,7478 mako/runtime.py,sha256=ZsUEN22nX3d3dECQujF69mBKDQS6yVv2nvz_0eTvFGg,27804 diff --git a/libs/Mako-1.3.6.dist-info/REQUESTED b/libs/Mako-1.3.8.dist-info/REQUESTED similarity index 100% rename from libs/Mako-1.3.6.dist-info/REQUESTED rename to libs/Mako-1.3.8.dist-info/REQUESTED diff --git a/libs/alembic-1.13.3.dist-info/WHEEL b/libs/Mako-1.3.8.dist-info/WHEEL similarity index 65% rename from libs/alembic-1.13.3.dist-info/WHEEL rename to libs/Mako-1.3.8.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/alembic-1.13.3.dist-info/WHEEL +++ b/libs/Mako-1.3.8.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/Mako-1.3.6.dist-info/entry_points.txt b/libs/Mako-1.3.8.dist-info/entry_points.txt similarity index 100% rename from libs/Mako-1.3.6.dist-info/entry_points.txt rename to libs/Mako-1.3.8.dist-info/entry_points.txt diff --git a/libs/Mako-1.3.6.dist-info/top_level.txt b/libs/Mako-1.3.8.dist-info/top_level.txt similarity index 100% rename from libs/Mako-1.3.6.dist-info/top_level.txt rename to libs/Mako-1.3.8.dist-info/top_level.txt diff --git a/libs/alembic-1.13.3.dist-info/INSTALLER b/libs/alembic-1.14.0.dist-info/INSTALLER similarity index 100% rename from libs/alembic-1.13.3.dist-info/INSTALLER rename to libs/alembic-1.14.0.dist-info/INSTALLER diff --git a/libs/alembic-1.13.3.dist-info/LICENSE b/libs/alembic-1.14.0.dist-info/LICENSE similarity index 100% rename from libs/alembic-1.13.3.dist-info/LICENSE rename to libs/alembic-1.14.0.dist-info/LICENSE diff --git a/libs/alembic-1.13.3.dist-info/METADATA b/libs/alembic-1.14.0.dist-info/METADATA similarity index 99% rename from libs/alembic-1.13.3.dist-info/METADATA rename to libs/alembic-1.14.0.dist-info/METADATA index 2754bc050..2f6963fc6 100644 --- a/libs/alembic-1.13.3.dist-info/METADATA +++ b/libs/alembic-1.14.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: alembic -Version: 1.13.3 +Version: 1.14.0 Summary: A database migration tool for SQLAlchemy. Home-page: https://alembic.sqlalchemy.org Author: Mike Bayer diff --git a/libs/alembic-1.13.3.dist-info/RECORD b/libs/alembic-1.14.0.dist-info/RECORD similarity index 83% rename from libs/alembic-1.13.3.dist-info/RECORD rename to libs/alembic-1.14.0.dist-info/RECORD index 74fbae089..f7cc605d0 100644 --- a/libs/alembic-1.13.3.dist-info/RECORD +++ b/libs/alembic-1.14.0.dist-info/RECORD @@ -1,13 +1,13 @@ ../../bin/alembic,sha256=xqPGhIsDow0IG3BUa3a_VtCtKJgqxLpVJuFe1PQcGoA,236 -alembic-1.13.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -alembic-1.13.3.dist-info/LICENSE,sha256=zhnnuit3ylhLgqZ5KFbhOOswsxHIlrB2wJpAXuRfvuk,1059 -alembic-1.13.3.dist-info/METADATA,sha256=6CGNPkq-FufkoGWO6PUhx64LztmqCUAyhbObbop42yQ,7390 -alembic-1.13.3.dist-info/RECORD,, -alembic-1.13.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -alembic-1.13.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 -alembic-1.13.3.dist-info/entry_points.txt,sha256=aykM30soxwGN0pB7etLc1q0cHJbL9dy46RnK9VX4LLw,48 -alembic-1.13.3.dist-info/top_level.txt,sha256=FwKWd5VsPFC8iQjpu1u9Cn-JnK3-V1RhUCmWqz1cl-s,8 -alembic/__init__.py,sha256=IZLF4dqHa7mXm10zXXAxFsXBP7yE27ZxghGv3BhN-Jw,63 +alembic-1.14.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +alembic-1.14.0.dist-info/LICENSE,sha256=zhnnuit3ylhLgqZ5KFbhOOswsxHIlrB2wJpAXuRfvuk,1059 +alembic-1.14.0.dist-info/METADATA,sha256=5hNrxl9umF2WKbNL-MxyMUEZem8-OxRa49Qz9w7jqzo,7390 +alembic-1.14.0.dist-info/RECORD,, +alembic-1.14.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +alembic-1.14.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +alembic-1.14.0.dist-info/entry_points.txt,sha256=aykM30soxwGN0pB7etLc1q0cHJbL9dy46RnK9VX4LLw,48 +alembic-1.14.0.dist-info/top_level.txt,sha256=FwKWd5VsPFC8iQjpu1u9Cn-JnK3-V1RhUCmWqz1cl-s,8 +alembic/__init__.py,sha256=qw_qYmTjOKiGcs--x0c6kjZo70tQTR5m8_lqF98Qr_0,63 alembic/__main__.py,sha256=373m7-TBh72JqrSMYviGrxCHZo-cnweM8AGF8A22PmY,78 alembic/autogenerate/__init__.py,sha256=ntmUTXhjLm4_zmqIwyVaECdpPDn6_u1yM9vYk6-553E,543 alembic/autogenerate/api.py,sha256=Bh-37G0PSFeT9WSfEQ-3TZoainXGLL2nsl4okv_xYc0,22173 @@ -20,8 +20,8 @@ alembic/context.py,sha256=hK1AJOQXJ29Bhn276GYcosxeG7pC5aZRT5E8c4bMJ4Q,195 alembic/context.pyi,sha256=hUHbSnbSeEEMVkk0gDSXOq4_9edSjYzsjmmf-mL9Iao,31737 alembic/ddl/__init__.py,sha256=Df8fy4Vn_abP8B7q3x8gyFwEwnLw6hs2Ljt_bV3EZWE,152 alembic/ddl/_autogen.py,sha256=Blv2RrHNyF4cE6znCQXNXG5T9aO-YmiwD4Fz-qfoaWA,9275 -alembic/ddl/base.py,sha256=fzGvWyvpSluIOKDQ7Ajc-i_jlDpH4j-JZFOOPxxYS-s,9986 -alembic/ddl/impl.py,sha256=VggQMr6aqeVw12Cj4EqJpiETMhbrwIiG22HEJtPcR4s,29067 +alembic/ddl/base.py,sha256=gazpvtk_6XURcsa0libwcaIquL5HwJDP1ZWKJ6P7x0I,9788 +alembic/ddl/impl.py,sha256=7-oxMb7KeycaK96x-kXw4mR6NSE1tmN0UEZIZrPcuhY,30195 alembic/ddl/mssql.py,sha256=ydvgBSaftKYjaBaMyqius66Ta4CICQSj79Og3Ed2atY,14219 alembic/ddl/mysql.py,sha256=kXOGYmpnL_9WL3ijXNsG4aAwy3m1HWJOoLZSePzmJF0,17316 alembic/ddl/oracle.py,sha256=669YlkcZihlXFbnXhH2krdrvDry8q5pcUGfoqkg_R6Y,6243 @@ -40,26 +40,26 @@ alembic/operations/toimpl.py,sha256=Fx-UKcq6S8pVtsEwPFjTKtEcAVKjfptn-BfpE1k3_ck, alembic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 alembic/runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 alembic/runtime/environment.py,sha256=SkYB_am1h3FSG8IsExAQxGP_7WwzOVigqjlO747Aokc,41497 -alembic/runtime/migration.py,sha256=sku7-2_TralZQnNeoDaEFlydTStL-SJechbr9K8AHJs,50093 +alembic/runtime/migration.py,sha256=9GZ_bYZ6yMF7DUD1hgZdmB0YqvcdcNBBfxFaXKHeQoM,49857 alembic/script/__init__.py,sha256=lSj06O391Iy5avWAiq8SPs6N8RBgxkSPjP8wpXcNDGg,100 alembic/script/base.py,sha256=XLNpdsLnBBSz4ZKMFUArFUdtL1HcjtuUDHNbA-5VlZA,37809 alembic/script/revision.py,sha256=NTu-eu5Y78u4NoVXpT0alpD2oL40SGATA2sEMEf1el4,62306 alembic/script/write_hooks.py,sha256=NGB6NGgfdf7HK6XNNpSKqUCfzxazj-NRUePgFx7MJSM,5036 alembic/templates/async/README,sha256=ISVtAOvqvKk_5ThM5ioJE-lMkvf9IbknFUFVU_vPma4,58 -alembic/templates/async/alembic.ini.mako,sha256=7VfUJqH9tEsydKOOmpnGFTsERHWhs7ghORuASnJb_Co,3632 +alembic/templates/async/alembic.ini.mako,sha256=lw_6ie1tMbYGpbvE7MnzJvx101RbSTh9uu4t9cvDpug,3638 alembic/templates/async/env.py,sha256=zbOCf3Y7w2lg92hxSwmG1MM_7y56i_oRH4AKp0pQBYo,2389 alembic/templates/async/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635 alembic/templates/generic/README,sha256=MVlc9TYmr57RbhXET6QxgyCcwWP7w-vLkEsirENqiIQ,38 -alembic/templates/generic/alembic.ini.mako,sha256=5wy1rOdDJjHbeEnieycSaZ9tz6AM6hONYk4RiOVXnmk,3740 +alembic/templates/generic/alembic.ini.mako,sha256=YcwTOEoiZr663Gkt6twCjmaqZao0n6xjRl0B5prK79s,3746 alembic/templates/generic/env.py,sha256=TLRWOVW3Xpt_Tpf8JFzlnoPn_qoUu8UV77Y4o9XD6yI,2103 alembic/templates/generic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635 alembic/templates/multidb/README,sha256=dWLDhnBgphA4Nzb7sNlMfCS3_06YqVbHhz-9O5JNqyI,606 -alembic/templates/multidb/alembic.ini.mako,sha256=oThPQgzkg-NOcbsSXIemi-Lg4nib3G6hDHKdejjtJIM,3834 +alembic/templates/multidb/alembic.ini.mako,sha256=AW1OGb-QezxBY5mynSWW7b1lGKnh9sVPImfGgfXf2EM,3840 alembic/templates/multidb/env.py,sha256=6zNjnW8mXGUk7erTsAvrfhvqoczJ-gagjVq1Ypg2YIQ,4230 alembic/templates/multidb/script.py.mako,sha256=N06nMtNSwHkgl0EBXDyMt8njp9tlOesR583gfq21nbY,1090 alembic/testing/__init__.py,sha256=kOxOh5nwmui9d-_CCq9WA4Udwy7ITjm453w74CTLZDo,1159 alembic/testing/assertions.py,sha256=ScUb1sVopIl70BirfHUJDvwswC70Q93CiIWwkiZbhHg,5207 -alembic/testing/env.py,sha256=zJacVb_z6uLs2U1TtkmnFH9P3_F-3IfYbVv4UEPOvfo,10754 +alembic/testing/env.py,sha256=giHWVLhHkfNWrPEfrAqhpMOLL6FgWoBCVAzBVrVbSSA,10766 alembic/testing/fixtures.py,sha256=nBntOynOmVCFc7IYiN3DIQ3TBNTfiGCvL_1-FyCry8o,9462 alembic/testing/plugin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 alembic/testing/plugin/bootstrap.py,sha256=9C6wtjGrIVztZ928w27hsQE0KcjDLIUtUN3dvZKsMVk,50 diff --git a/libs/alembic-1.13.3.dist-info/REQUESTED b/libs/alembic-1.14.0.dist-info/REQUESTED similarity index 100% rename from libs/alembic-1.13.3.dist-info/REQUESTED rename to libs/alembic-1.14.0.dist-info/REQUESTED diff --git a/libs/Flask_SocketIO-5.4.1.dist-info/WHEEL b/libs/alembic-1.14.0.dist-info/WHEEL similarity index 65% rename from libs/Flask_SocketIO-5.4.1.dist-info/WHEEL rename to libs/alembic-1.14.0.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/Flask_SocketIO-5.4.1.dist-info/WHEEL +++ b/libs/alembic-1.14.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/alembic-1.13.3.dist-info/entry_points.txt b/libs/alembic-1.14.0.dist-info/entry_points.txt similarity index 100% rename from libs/alembic-1.13.3.dist-info/entry_points.txt rename to libs/alembic-1.14.0.dist-info/entry_points.txt diff --git a/libs/alembic-1.13.3.dist-info/top_level.txt b/libs/alembic-1.14.0.dist-info/top_level.txt similarity index 100% rename from libs/alembic-1.13.3.dist-info/top_level.txt rename to libs/alembic-1.14.0.dist-info/top_level.txt diff --git a/libs/alembic/__init__.py b/libs/alembic/__init__.py index acf69a623..637b2d4e1 100644 --- a/libs/alembic/__init__.py +++ b/libs/alembic/__init__.py @@ -1,4 +1,4 @@ from . import context from . import op -__version__ = "1.13.3" +__version__ = "1.14.0" diff --git a/libs/alembic/ddl/base.py b/libs/alembic/ddl/base.py index 690c15376..6fbe95245 100644 --- a/libs/alembic/ddl/base.py +++ b/libs/alembic/ddl/base.py @@ -175,7 +175,7 @@ def __init__( self.comment = comment -@compiles(RenameTable) # type: ignore[misc] +@compiles(RenameTable) def visit_rename_table( element: RenameTable, compiler: DDLCompiler, **kw ) -> str: @@ -185,7 +185,7 @@ def visit_rename_table( ) -@compiles(AddColumn) # type: ignore[misc] +@compiles(AddColumn) def visit_add_column(element: AddColumn, compiler: DDLCompiler, **kw) -> str: return "%s %s" % ( alter_table(compiler, element.table_name, element.schema), @@ -193,7 +193,7 @@ def visit_add_column(element: AddColumn, compiler: DDLCompiler, **kw) -> str: ) -@compiles(DropColumn) # type: ignore[misc] +@compiles(DropColumn) def visit_drop_column(element: DropColumn, compiler: DDLCompiler, **kw) -> str: return "%s %s" % ( alter_table(compiler, element.table_name, element.schema), @@ -201,7 +201,7 @@ def visit_drop_column(element: DropColumn, compiler: DDLCompiler, **kw) -> str: ) -@compiles(ColumnNullable) # type: ignore[misc] +@compiles(ColumnNullable) def visit_column_nullable( element: ColumnNullable, compiler: DDLCompiler, **kw ) -> str: @@ -212,7 +212,7 @@ def visit_column_nullable( ) -@compiles(ColumnType) # type: ignore[misc] +@compiles(ColumnType) def visit_column_type(element: ColumnType, compiler: DDLCompiler, **kw) -> str: return "%s %s %s" % ( alter_table(compiler, element.table_name, element.schema), @@ -221,7 +221,7 @@ def visit_column_type(element: ColumnType, compiler: DDLCompiler, **kw) -> str: ) -@compiles(ColumnName) # type: ignore[misc] +@compiles(ColumnName) def visit_column_name(element: ColumnName, compiler: DDLCompiler, **kw) -> str: return "%s RENAME %s TO %s" % ( alter_table(compiler, element.table_name, element.schema), @@ -230,7 +230,7 @@ def visit_column_name(element: ColumnName, compiler: DDLCompiler, **kw) -> str: ) -@compiles(ColumnDefault) # type: ignore[misc] +@compiles(ColumnDefault) def visit_column_default( element: ColumnDefault, compiler: DDLCompiler, **kw ) -> str: @@ -245,7 +245,7 @@ def visit_column_default( ) -@compiles(ComputedColumnDefault) # type: ignore[misc] +@compiles(ComputedColumnDefault) def visit_computed_column( element: ComputedColumnDefault, compiler: DDLCompiler, **kw ): @@ -255,7 +255,7 @@ def visit_computed_column( ) -@compiles(IdentityColumnDefault) # type: ignore[misc] +@compiles(IdentityColumnDefault) def visit_identity_column( element: IdentityColumnDefault, compiler: DDLCompiler, **kw ): diff --git a/libs/alembic/ddl/impl.py b/libs/alembic/ddl/impl.py index 25746889a..2609a62de 100644 --- a/libs/alembic/ddl/impl.py +++ b/libs/alembic/ddl/impl.py @@ -21,7 +21,12 @@ from typing import Union from sqlalchemy import cast +from sqlalchemy import Column +from sqlalchemy import MetaData +from sqlalchemy import PrimaryKeyConstraint from sqlalchemy import schema +from sqlalchemy import String +from sqlalchemy import Table from sqlalchemy import text from . import _autogen @@ -43,11 +48,9 @@ from sqlalchemy.sql import Executable from sqlalchemy.sql.elements import ColumnElement from sqlalchemy.sql.elements import quoted_name - from sqlalchemy.sql.schema import Column from sqlalchemy.sql.schema import Constraint from sqlalchemy.sql.schema import ForeignKeyConstraint from sqlalchemy.sql.schema import Index - from sqlalchemy.sql.schema import Table from sqlalchemy.sql.schema import UniqueConstraint from sqlalchemy.sql.selectable import TableClause from sqlalchemy.sql.type_api import TypeEngine @@ -136,6 +139,40 @@ def static_output(self, text: str) -> None: self.output_buffer.write(text + "\n\n") self.output_buffer.flush() + def version_table_impl( + self, + *, + version_table: str, + version_table_schema: Optional[str], + version_table_pk: bool, + **kw: Any, + ) -> Table: + """Generate a :class:`.Table` object which will be used as the + structure for the Alembic version table. + + Third party dialects may override this hook to provide an alternate + structure for this :class:`.Table`; requirements are only that it + be named based on the ``version_table`` parameter and contains + at least a single string-holding column named ``version_num``. + + .. versionadded:: 1.14 + + """ + vt = Table( + version_table, + MetaData(), + Column("version_num", String(32), nullable=False), + schema=version_table_schema, + ) + if version_table_pk: + vt.append_constraint( + PrimaryKeyConstraint( + "version_num", name=f"{version_table}_pkc" + ) + ) + + return vt + def requires_recreate_in_batch( self, batch_op: BatchOperationsImpl ) -> bool: diff --git a/libs/alembic/runtime/migration.py b/libs/alembic/runtime/migration.py index 6cfe5e23e..28f01c3b3 100644 --- a/libs/alembic/runtime/migration.py +++ b/libs/alembic/runtime/migration.py @@ -24,10 +24,6 @@ from sqlalchemy import Column from sqlalchemy import literal_column -from sqlalchemy import MetaData -from sqlalchemy import PrimaryKeyConstraint -from sqlalchemy import String -from sqlalchemy import Table from sqlalchemy.engine import Engine from sqlalchemy.engine import url as sqla_url from sqlalchemy.engine.strategies import MockEngineStrategy @@ -36,6 +32,7 @@ from .. import util from ..util import sqla_compat from ..util.compat import EncodedIO +from ..util.sqla_compat import _select if TYPE_CHECKING: from sqlalchemy.engine import Dialect @@ -190,18 +187,6 @@ def __init__( self.version_table_schema = version_table_schema = opts.get( "version_table_schema", None ) - self._version = Table( - version_table, - MetaData(), - Column("version_num", String(32), nullable=False), - schema=version_table_schema, - ) - if opts.get("version_table_pk", True): - self._version.append_constraint( - PrimaryKeyConstraint( - "version_num", name="%s_pkc" % version_table - ) - ) self._start_from_rev: Optional[str] = opts.get("starting_rev") self.impl = ddl.DefaultImpl.get_by_dialect(dialect)( @@ -212,6 +197,13 @@ def __init__( self.output_buffer, opts, ) + + self._version = self.impl.version_table_impl( + version_table=version_table, + version_table_schema=version_table_schema, + version_table_pk=opts.get("version_table_pk", True), + ) + log.info("Context impl %s.", self.impl.__class__.__name__) if self.as_sql: log.info("Generating static SQL") @@ -540,7 +532,10 @@ def get_current_heads(self) -> Tuple[str, ...]: return () assert self.connection is not None return tuple( - row[0] for row in self.connection.execute(self._version.select()) + row[0] + for row in self.connection.execute( + _select(self._version.c.version_num) + ) ) def _ensure_version_table(self, purge: bool = False) -> None: diff --git a/libs/alembic/templates/async/alembic.ini.mako b/libs/alembic/templates/async/alembic.ini.mako index 46a0904ed..7eee91320 100644 --- a/libs/alembic/templates/async/alembic.ini.mako +++ b/libs/alembic/templates/async/alembic.ini.mako @@ -90,12 +90,12 @@ keys = console keys = generic [logger_root] -level = WARN +level = WARNING handlers = console qualname = [logger_sqlalchemy] -level = WARN +level = WARNING handlers = qualname = sqlalchemy.engine diff --git a/libs/alembic/templates/generic/alembic.ini.mako b/libs/alembic/templates/generic/alembic.ini.mako index dd4ea588e..f1f76cae8 100644 --- a/libs/alembic/templates/generic/alembic.ini.mako +++ b/libs/alembic/templates/generic/alembic.ini.mako @@ -92,12 +92,12 @@ keys = console keys = generic [logger_root] -level = WARN +level = WARNING handlers = console qualname = [logger_sqlalchemy] -level = WARN +level = WARNING handlers = qualname = sqlalchemy.engine diff --git a/libs/alembic/templates/multidb/alembic.ini.mako b/libs/alembic/templates/multidb/alembic.ini.mako index d5cc86f1e..bf383ea1d 100644 --- a/libs/alembic/templates/multidb/alembic.ini.mako +++ b/libs/alembic/templates/multidb/alembic.ini.mako @@ -97,12 +97,12 @@ keys = console keys = generic [logger_root] -level = WARN +level = WARNING handlers = console qualname = [logger_sqlalchemy] -level = WARN +level = WARNING handlers = qualname = sqlalchemy.engine diff --git a/libs/alembic/testing/env.py b/libs/alembic/testing/env.py index 5df7ef822..c37b4d303 100644 --- a/libs/alembic/testing/env.py +++ b/libs/alembic/testing/env.py @@ -118,7 +118,7 @@ def _sqlite_testing_config(sourceless=False, future=False): keys = console [logger_root] -level = WARN +level = WARNING handlers = console qualname = @@ -171,7 +171,7 @@ def _multi_dir_testing_config(sourceless=False, extra_version_location=""): keys = console [logger_root] -level = WARN +level = WARNING handlers = console qualname = @@ -216,7 +216,7 @@ def _no_sql_testing_config(dialect="postgresql", directives=""): keys = console [logger_root] -level = WARN +level = WARNING handlers = console qualname = @@ -497,7 +497,7 @@ def _multidb_testing_config(engines): keys = console [logger_root] -level = WARN +level = WARNING handlers = console qualname = diff --git a/libs/apprise-1.9.0.dist-info/RECORD b/libs/apprise-1.9.0.dist-info/RECORD deleted file mode 100644 index 2a31ed0fb..000000000 --- a/libs/apprise-1.9.0.dist-info/RECORD +++ /dev/null @@ -1,191 +0,0 @@ -../../bin/apprise,sha256=ZJ-e4qqxNLtdW_DAvpuPPX5iROIiQd8I6nvg7vtAv-g,233 -apprise-1.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -apprise-1.9.0.dist-info/LICENSE,sha256=gt7qKBxRhVcdmXCYVtrWP6DtYjD0DzONet600dkU994,1343 -apprise-1.9.0.dist-info/METADATA,sha256=UWcGYd35BH6HUvjk3YkguNH_-4qwmPA04q5zTL6OW3c,51747 -apprise-1.9.0.dist-info/RECORD,, -apprise-1.9.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise-1.9.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -apprise-1.9.0.dist-info/entry_points.txt,sha256=71YypBuNdjAKiaLsiMG40HEfLHxkU4Mi7o_S0s0d8wI,45 -apprise-1.9.0.dist-info/top_level.txt,sha256=JrCRn-_rXw5LMKXkIgMSE4E0t1Ks9TYrBH54Pflwjkk,8 -apprise/__init__.py,sha256=FnBwBB3Csp_wvdSC6dFs9SUEZKddewLe8PUYeBWxtWc,3887 -apprise/apprise.py,sha256=JWSqg5pYJOydubQyaIjR9gIPhb2okcrGe2mQ_NhPNS0,32837 -apprise/apprise.pyi,sha256=_4TBKvT-QVj3s6PuTh3YX-BbQMeJTdBGdVpubLMY4_k,2203 -apprise/apprise_attachment.py,sha256=h-JAC9_v076heEWmOH-qbqm_IvMJvQf8hOG9e8zMov4,12357 -apprise/apprise_attachment.pyi,sha256=R9-0dVqWpeaFrVpcREwPhGy3qHWztG5jEjYIOsbE5dM,1145 -apprise/apprise_config.py,sha256=qlNtd-OkldrY9rE9vT67fVPHINx9fkkbwQinhbBjQ_I,16896 -apprise/apprise_config.pyi,sha256=_mUlCnncqAq8sL01WxQTgZjnb2ic9kZXvtqZmVl-fc8,1568 -apprise/asset.py,sha256=Abk3Fe58CYrSSPPK5KaZp0-zz2jgUuDaBY9NK-6eL4E,14812 -apprise/asset.pyi,sha256=NYLXXYbScgRkspP27XGpRRM_uliPu1OCdWdZBPPvLng,979 -apprise/assets/NotifyXML-1.0.xsd,sha256=292qQ_IUl5EWDhPyzm9UTT0C2rVvJkyGar8jiODkJs8,986 -apprise/assets/NotifyXML-1.1.xsd,sha256=bjR3CGG4AEXoJjYkGCbDttKHSkPP1FlIWO02E7G59g4,1758 -apprise/assets/themes/default/apprise-failure-128x128.ico,sha256=Mt0ptfHJaN3Wsv5UCNDn9_3lyEDHxVDv1JdaDEI_xCA,67646 -apprise/assets/themes/default/apprise-failure-128x128.png,sha256=66ps8TDPxVH3g9PlObJqF-0x952CjnqQyN3zvpRcOT8,16135 -apprise/assets/themes/default/apprise-failure-256x256.png,sha256=bQBsKKCsKfR9EqgYOZrcVcVa5y8qG58PN2mEqO5eNRI,41931 -apprise/assets/themes/default/apprise-failure-32x32.png,sha256=vH0pZffIDCvkejpr3fJHGXW__8Yc3R_p0bacX6t6l18,2437 -apprise/assets/themes/default/apprise-failure-72x72.png,sha256=EP5A8DHRDr9srgupFSwOoyQ308bNJ8aL192J_L4K-ec,7600 -apprise/assets/themes/default/apprise-info-128x128.ico,sha256=F5_CirmXueRCRI5Z_Crf6TS6jVIXTJlRD83zw1oJ66g,67646 -apprise/assets/themes/default/apprise-info-128x128.png,sha256=bBqRZAgQey-gkmJrnFhPbzjILSrljE59mRkgj3raMQo,16671 -apprise/assets/themes/default/apprise-info-256x256.png,sha256=B5r_O4d9MHCmSWZwfbqQgZSp-ZetTdiBSwKcMTF1aFA,43331 -apprise/assets/themes/default/apprise-info-32x32.png,sha256=lt3NZ95TzkiCNVNlurrB2fE2nriMa1wftl7nrNXmb6c,2485 -apprise/assets/themes/default/apprise-info-72x72.png,sha256=kDnsZpqNUZGqs9t1ECUup7FOfXUIL-rupnQCYJp9So4,7875 -apprise/assets/themes/default/apprise-logo.png,sha256=85ttALudKkLmiqilJT7mUQLUXRFmM1AK89rnwLm313s,160907 -apprise/assets/themes/default/apprise-success-128x128.ico,sha256=uCopPwdQjxgfohKazHaDzYs9y4oiaOpL048PYC6WRlg,67646 -apprise/assets/themes/default/apprise-success-128x128.png,sha256=nvDuU_QqhGlw6cMtdj7Mv-gPgqCEx-0DaaXn1KBLVYg,17446 -apprise/assets/themes/default/apprise-success-256x256.png,sha256=vXfKuxY3n0eeXHKdb9hTxICxOEn7HjAQ4IZpX0HSLzc,48729 -apprise/assets/themes/default/apprise-success-32x32.png,sha256=Jg9pFJh3YPI-LiPBebyJ7Z4Vt7BRecaE8AsRjQVIkME,2471 -apprise/assets/themes/default/apprise-success-72x72.png,sha256=FQbgvIhqKOhEK0yvrhaSpai0R7hrkTt_-GaC2KUgCCk,7858 -apprise/assets/themes/default/apprise-warning-128x128.ico,sha256=6XaQPOx0oWK_xbhr4Yhb7qNazCWwSs9lk2SYR2MHTrQ,67646 -apprise/assets/themes/default/apprise-warning-128x128.png,sha256=pf5c4Ph7jWH7gf39dJoieSj8TzAsY3TXI-sGISGVIW4,16784 -apprise/assets/themes/default/apprise-warning-256x256.png,sha256=SY-xlaiXaj420iEYKC2_fJxU-yj2SuaQg6xfPNi83bw,43708 -apprise/assets/themes/default/apprise-warning-32x32.png,sha256=97R2ywNvcwczhBoWEIgajVtWjgT8fLs4FCCz4wu0dwc,2472 -apprise/assets/themes/default/apprise-warning-72x72.png,sha256=L8moEInkO_OLxoOcuvN7rmrGZo64iJeH20o-24MQghE,7913 -apprise/attachment/__init__.py,sha256=9jSiGEbLllS-0Vbpgxo4MCpZfIJ-saezWWgQ1PofZ9I,1678 -apprise/attachment/base.py,sha256=ndvbqEh-Q6y5A_MQFVXlofgjkpcl-iECcaVYwqEy5Sg,15912 -apprise/attachment/base.pyi,sha256=w0XG_QKauiMLJ7eQ4S57IiLIURZHm_Snw7l6-ih9GP8,961 -apprise/attachment/file.py,sha256=JGEMYXktKF9qBfomhJIDLdS_Tc-asbBlO2l7r-4E2hQ,4900 -apprise/attachment/http.py,sha256=o9341E3G8SZGQ1uDkN6Rto1WeKXHRibkraocOiUvm8Y,13758 -apprise/attachment/memory.py,sha256=TlDRGqoelOhaFkKW6bMDm8mw7gJLYMNHH4aDAL2MvHg,6999 -apprise/cli.py,sha256=VHR4r7IHa1RD9kWxv56pwnMieCXHw6IfpbgKM5u84NM,33471 -apprise/common.py,sha256=B_4Nwo8HejUDnqdeya6Vvn-y6pkFXBpeHJy9uejEujc,6524 -apprise/common.pyi,sha256=luF3QRiClDCk8Z23rI6FCGYsVmodOt_JYfYyzGogdNM,447 -apprise/config/__init__.py,sha256=oDxdoqG2NEYu_bbpLsLaM3L9WKY3gNn5gjIwb2h3LU4,1679 -apprise/config/base.py,sha256=iWgrBk4-wm_SHtNbe7dCQOYnbkI3oKWP_b60qwjGSoU,53173 -apprise/config/base.pyi,sha256=cngfobwH6v2vxYbQrObDi5Z-t5wcquWF-wR0kBCr3Eg,54 -apprise/config/file.py,sha256=Hir8MvTN-_5lMRnhaGM8jgIz9TDrjVYLLpycmwUbhIE,6240 -apprise/config/http.py,sha256=CjQtv_OQJykMxD4ssiwbFI3P8CeQiPdYV_ZIiL_XqMw,9440 -apprise/config/memory.py,sha256=8VICU-WLux8KnW6i9sf9fgmns90J-MfVYI3pvTiyTno,2816 -apprise/conversion.py,sha256=7q00QmrT0TCWu49j6TnPc0l_vfCIWCdDT3KiSq3SLJc,6350 -apprise/decorators/__init__.py,sha256=e_PDAm0kQNzwDPx-NJZLPfLMd2VAABvNZtxx_iDviRM,1487 -apprise/decorators/base.py,sha256=1yqJsHehHvTTsFnt4vmPDA8xYyoEfvt4L9uPgAROlBM,8110 -apprise/decorators/notify.py,sha256=FzIa7m-G5KnVVa__rjyn990zt2lqE8sdHW-XY79lbAU,5097 -apprise/emojis.py,sha256=ONF0t8dY9f2XlEkLUG79-ybKVAj2GqbPj2-Be97vAoI,87738 -apprise/exception.py,sha256=rOAfvCogjDOvCuRd5fKTTOtMLpj4wYfF6AAIdXJrdCE,2096 -apprise/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise/i18n/en/LC_MESSAGES/apprise.mo,sha256=H5qH3ZKbfyD_-2cS2sqK-ti35f-sQgZeNOkB14TngkM,3959 -apprise/locale.py,sha256=4uSr4Nj_rz6ISMMAfRVRk58wZVLKOofJgk2x0_E8NkQ,8994 -apprise/logger.py,sha256=131hqhed8cUj9x_mfXDEvwA2YbcYDFAYiWVK1HgxRVY,6921 -apprise/manager.py,sha256=vz-GARIhcnPT6FYDa3SrYnjPWOZ8WF01DckUMIYAKk8,27228 -apprise/manager_attachment.py,sha256=EkrcKtKjbxTXXyDaKyiu4XSfDu9wKFSdJD7TOTpyOUc,2200 -apprise/manager_config.py,sha256=sCIOlBTH13bQ1cuhQVpUq2vyKWBArA8YRyPnXIB1iWQ,2205 -apprise/manager_plugins.py,sha256=Xbg5-xr-06zMIDoWviz-zKcbzusHj0iBBMchKPpUOkg,2211 -apprise/persistent_store.py,sha256=kJ0XdcJC287NcvkYijVhuj45doAX5MNF658QfYK7LfI,56441 -apprise/plugins/__init__.py,sha256=Hm-vt-Xtxir5mgOdehqlGLhIlc45LA31zjqV42uRnB8,18701 -apprise/plugins/africas_talking.py,sha256=54mpTFY2C5d8Iv_iuqTuuhDcWiYt2dl6F8pFQwIj2hI,16072 -apprise/plugins/apprise_api.py,sha256=yMlBjBELVBgTTsnksu8s73xVHu0laqfyiSBuOrQM26M,16815 -apprise/plugins/aprs.py,sha256=7CAiHhSNsbVOJXn22Z7aFBDclI2jTvAsMex43oBQZgQ,25792 -apprise/plugins/bark.py,sha256=R-FR2H-S-FuOPSH1oHkLwv5pRBB-Ke7tfli1ATpgc9Y,16067 -apprise/plugins/base.py,sha256=ykZpvOrD-30JV6nFXlNvcM1yH2aWCCJYsu7Lw20dwNw,32778 -apprise/plugins/base.pyi,sha256=aKlZXRYUgG8lz_ZgGkYYJ_GKhuf18youTmMU-FlG7z8,21 -apprise/plugins/boxcar.py,sha256=rHN5ttKfZGniG0c7wjpv1m36PF6apoLG56NUxzB8nvY,13145 -apprise/plugins/bulksms.py,sha256=Um9YAmcXlZsJYkgfj_QbzdVZbokdXlO-Ig4tRKas9w0,16378 -apprise/plugins/bulkvs.py,sha256=gwFu1svKVZkHGDwZKbN8ZjtGnf3gt_WvMd2pnNC7JFc,13581 -apprise/plugins/burstsms.py,sha256=eIYvpkIR7MeTk3NkCa2Iid0ev5v00mLGgVXiXrTLsCw,15841 -apprise/plugins/chantify.py,sha256=NNGbUmA3NKOBwYVeDFJ-qBqwW2Sp_FaG2Pp6x3h_b40,6941 -apprise/plugins/clicksend.py,sha256=-dsuPploihlUQ5hWBQvr8XOXOQ0anWHE3ok_rFhJnY4,11703 -apprise/plugins/custom_form.py,sha256=BV1adXR5NMcB5JMuylUXYIiRqy2cm8P5kRoM86EGpXY,18443 -apprise/plugins/custom_json.py,sha256=9v9r8EEA6tPEt5sfLubpLNVbgFT1jkomT383monPeYA,14312 -apprise/plugins/custom_xml.py,sha256=ihl0uYOTYO9e80RashRj2lIiIYtjAb9PPywKNy4xOi8,17569 -apprise/plugins/d7networks.py,sha256=NRu1SyzOKwS_H0lujMjbpwTTpk9SaBCZjfoQ5VmfuPQ,15311 -apprise/plugins/dapnet.py,sha256=Eh-HPtc--7UP1XzUfvX1pl_yrL31Hw7WPbXcubWUzOU,13902 -apprise/plugins/dbus.py,sha256=5PBknIvhY90UjNgp3OUGPmheMnofRs0xTnyTGjLwzMU,14485 -apprise/plugins/dingtalk.py,sha256=dsoaMfnmSG8fJw7-q2tuWg1qmq-WvT_3bhRdkxFDlkU,12286 -apprise/plugins/discord.py,sha256=SUanqne3EhBGfBL967LYgjxEie9yT343Wihw8UKwijU,26359 -apprise/plugins/email.py,sha256=87rwjdxF_CRCkyvaJgXcEiGIgxNePtS7CluxcwIx5DU,40583 -apprise/plugins/emby.py,sha256=rhnO36Av_lyJWe7REsSIy-N8RLAITl5OxeiT9Jj3ATg,24421 -apprise/plugins/enigma2.py,sha256=s3cKfNUGVe7_IcRCvdPMZ4hv_A5g7dcOvW6-aKz6-dI,11931 -apprise/plugins/fcm/__init__.py,sha256=wyV1kQtRDCcjECXKr2tPyqcFiFa5OvqcRh1whartLu0,21964 -apprise/plugins/fcm/color.py,sha256=rQxVRL_CcRlgnNTQXkjB1Bfs0Xc933zOB1tURSdhi7Y,4585 -apprise/plugins/fcm/common.py,sha256=978uBUoNdtopCtylipGiKQdsQ8FTONxkFBp7uJMZHc8,1718 -apprise/plugins/fcm/oauth.py,sha256=Vvbd0-rd5BPIjAneG3rILU153JIzfSZ0kaDov6hm96M,11197 -apprise/plugins/fcm/priority.py,sha256=0WuRW1y1HVnybgjlTeCZPHzt7j8SwWnC7faNcjioAOc,8163 -apprise/plugins/feishu.py,sha256=qqoymGpe2LKdlO72IzaBChj39o7gVBRZTpBGjRSoJGQ,7534 -apprise/plugins/flock.py,sha256=aNpV1V1989rdpiA2NP3d2VHRr1-QKmOj40fUOxtcra4,13016 -apprise/plugins/freemobile.py,sha256=Wefq8No34MKfLewanvvOlREFZhjWFTcLxJDpD2_R7Eo,6974 -apprise/plugins/gnome.py,sha256=XJjVOu66HtslNQNzPODoL0iC14kvY5BaWGEnf9hAgoA,9221 -apprise/plugins/google_chat.py,sha256=pxVNeXbFVmsrKylUrsUXuwHaf5OX66Z4SHlUX1JPmhM,12967 -apprise/plugins/gotify.py,sha256=ocFzfk4yNt91bcgxivA-eQhvxIy2WhQksq6xXA3d87s,11022 -apprise/plugins/growl.py,sha256=3wupm2ELbtbnXTU9JVtw_zfTtYa2WbaYs9HKclsfeEk,14440 -apprise/plugins/guilded.py,sha256=lhE6gK7laQNYEubD9lBGRemFK-IHis_u2tNekbUoGgM,3707 -apprise/plugins/home_assistant.py,sha256=jC9W8ZKbRZPCAElsYbkvH9kyTV4cn28Kl12Q7m2RsnQ,11270 -apprise/plugins/httpsms.py,sha256=cLlqg1SNajYOF9uLcKHDYJJouGInjrMimYqJ8ZxBJ4Y,11418 -apprise/plugins/ifttt.py,sha256=WMQEvVXNQksAEk9B_F7xKE0cdNDMDVyAM4BMCCBP4MI,13698 -apprise/plugins/join.py,sha256=1sEKsW2H6n8kmLj1_hMoQiOV6nRMIYBybtJMddQMR7k,13850 -apprise/plugins/kavenegar.py,sha256=obx_J_AxdSEDB4_l8Zn4ipEioSA4_PVVLQK8mXQgyDk,12902 -apprise/plugins/kumulos.py,sha256=cAsZl6eqkm1_s-SMo7yjGLhpRUEwatUWp2raDZUj0LE,8499 -apprise/plugins/lametric.py,sha256=_vfV-EEImcegkdLRulYRk4AhFz5TXAGdE-oGwbuLks8,38481 -apprise/plugins/line.py,sha256=IlEQ6KDhbnIs0wki2BT2zEDyy0TxOZXBIEC19g1TzEs,10940 -apprise/plugins/lunasea.py,sha256=PegbhfspU19zuamH7rb_yIu3loE_XRANpiUmqQQN9K0,15133 -apprise/plugins/macosx.py,sha256=-lg52pquesSsWzZwe2w5QHnebEVDomvz9wEoDOgMIKQ,8433 -apprise/plugins/mailgun.py,sha256=qAOeiKUOdTCkiy64upBYpbCAPwgkc4hEGehthCI0BB0,25912 -apprise/plugins/mastodon.py,sha256=fEtgIDocAhOPyRhAy17O_lOw9uvGbbCWjGIvEHosQ30,35642 -apprise/plugins/matrix.py,sha256=EmBzADUkiSak_dEqrSEwYOHxQFQt-SnfpkrINUHLoOY,53198 -apprise/plugins/mattermost.py,sha256=7PJFRi8cWro-97zzFDiEPzdL7gzgJDpoXYjBrwAcJtg,13474 -apprise/plugins/messagebird.py,sha256=79FsQhwLlhokrWpUn6GdODmcmwS75Y53h8fmuywHljA,12530 -apprise/plugins/misskey.py,sha256=4kGrN_LA-3bytKyYYCENCxgyzsgQT2e4oh_IdFrJVYY,9959 -apprise/plugins/mqtt.py,sha256=4CO9cxuo4DE8i1yVVr2Z9HypPr9TZQopavrIoGo8F8I,20642 -apprise/plugins/msg91.py,sha256=yhuT9BQsp52p982ePlg_Hw3USUvijJIeK8Kw1BpaURg,12962 -apprise/plugins/msteams.py,sha256=SznuXuUSvW2uiSgexRoW1YSH5ocHuJwT5aQRWA_W0VQ,23687 -apprise/plugins/nextcloud.py,sha256=Z1F8FQzbCgJbsz1tT2jMVoVKoaBCz1Wz8QTETi8NhGE,13128 -apprise/plugins/nextcloudtalk.py,sha256=xVNihpeaAePlSjps1H950221OHCxeKd6JvGSxDTiIYA,11380 -apprise/plugins/notica.py,sha256=Gn8-y9dxx4yfMEG6Fj07b7-7ELNq8j3M6w6pIJ2I0_0,13394 -apprise/plugins/notifiarr.py,sha256=BVbJBLZLt3WYqMa59Oo5soA6gc66UzVjKZgmjs_eYL4,15529 -apprise/plugins/notifico.py,sha256=nmhRGymTvNlHScHy21yb_-cDt0Q9VU2wmYYR0n6ZEB0,12322 -apprise/plugins/ntfy.py,sha256=m4CtamCHXVcJYzNHZAha6F5eTMDZSnX5LkgMlt3qHPo,30226 -apprise/plugins/office365.py,sha256=VGPPBy9n_KVBDhfCswGYGQU9Swjr17VAPtStNCjxE2s,25531 -apprise/plugins/one_signal.py,sha256=FPsAhD2u3iognOgHkFVMg0Hads6Ff4HiCX5f8iKLaKs,22618 -apprise/plugins/opsgenie.py,sha256=o10KCij84XHH2qT_m_q3mb8631C6f4NbIOn9knVZx9Q,28479 -apprise/plugins/pagerduty.py,sha256=GzsSgOWhwwSIhBwai5BrNuMle-vhTkBbEJsbWHgB68Q,18209 -apprise/plugins/pagertree.py,sha256=mvw2QOtZjVQkL_5HjJ8PRp5x7BYRnQDty_juxSXUbow,14123 -apprise/plugins/parseplatform.py,sha256=5uBBqvTrIhR5VvfJh6oxeAvhOLVT0zWZWrOPr3fOhJQ,10703 -apprise/plugins/popcorn_notify.py,sha256=Fa4gfJe4BR0t2_jBzlfrN0_ei14Ircp2-dY4DSI36yc,10856 -apprise/plugins/prowl.py,sha256=7_YuEFN18ivXU4Votl1ccTyqcA6aom13a1n88ad9QA4,10069 -apprise/plugins/pushbullet.py,sha256=lLFBkP_GzcxxzF_kigqZLK7KNJSLHSUCc0zXWEL-AUA,15727 -apprise/plugins/pushdeer.py,sha256=oQxwCXq30V2ny-8JgdG-tl_FyKl6G1ZViQ1iyzhDfaA,7284 -apprise/plugins/pushed.py,sha256=9V3NbVLV9CGs2bdFsy18PxRAOsLzlCI0IXbslHDzkcg,12553 -apprise/plugins/pushjet.py,sha256=tOmOB8VsRrb_2DoBM2kBFeX1A5x-KUUE3FisUugLyTg,9338 -apprise/plugins/pushme.py,sha256=A7GsoPglvLRoxt-yyUpv7Lyf8O3tFwgecgT6t1FOK7Q,7402 -apprise/plugins/pushover.py,sha256=th9yBrL-6hvqCMdCdi-Zxb_imwAciQvQqGVndHQH0Wo,21490 -apprise/plugins/pushsafer.py,sha256=qpz5DGvRyDeO1keOhFRDANuR07DibUMsCn_JaTqSbx0,27179 -apprise/plugins/pushy.py,sha256=FyqqsB_AFpIuw7JXmZejZ7CgMP7ozEe0EEtdOmfX_tQ,12765 -apprise/plugins/reddit.py,sha256=3286wpB7nMnNwvOMD3TWRJFKX9tIkPTZ8qHgqboUt5M,26134 -apprise/plugins/revolt.py,sha256=T8NTXYzMOim0ekrcu1Wb7YLx58z96KDCzQipfOUNSCQ,14772 -apprise/plugins/rocketchat.py,sha256=6AkdQao3ONh-TPB7l6xP5dLdKdI9Hux7wZK-jHEYd3E,26306 -apprise/plugins/rsyslog.py,sha256=YXd-A4apTnQRM573HZwJayeLS3Ab6qm_AFie-tQ0zPo,12358 -apprise/plugins/ryver.py,sha256=n7c6RRgJ7gfmDy6CZHBZO1pcCbNoFXN5NoVyrHyGszg,12110 -apprise/plugins/sendgrid.py,sha256=j-gGkm27XXMUUpaYCqCgbCamJtd67SWzkYDC2gUSyaQ,18119 -apprise/plugins/serverchan.py,sha256=Ac4syJAZvbo_doWqWu_qfkNbCvTLecyh2nN4JI_noxw,6048 -apprise/plugins/ses.py,sha256=Ph8lotJ3u8s9vgKs1z72JxJnGlZsUmpAJ8gh7wt8SwM,34064 -apprise/plugins/sfr.py,sha256=AlS8Y8kO0LLHNcYHdMsm1Ut_KBs78B0ujwHp1m1EbCQ,15205 -apprise/plugins/signal_api.py,sha256=P0LFhoXzize9HpPmJS-YR54RlOKA-LtXPSvS8CcuyXs,17093 -apprise/plugins/simplepush.py,sha256=Tlu_VkrtGe5Y9tLY3vYyqDBb5oRnk4DmFLtAij-RVko,11167 -apprise/plugins/sinch.py,sha256=LuVfVnp3oqgdwJ6lRWGQUNAd0hIiviPCUlaXqC8A6uk,17185 -apprise/plugins/slack.py,sha256=E8yvU9qmTujmy55RKPXFjef7BaY_UcVQs0uRt-emLqs,44348 -apprise/plugins/smseagle.py,sha256=uFnDCyp54anQ5s1dT9GJS0wtdGKny9C1tY6qfkUniv0,24527 -apprise/plugins/smsmanager.py,sha256=Fe1rGmJSZ4WZqj6rMjX0HaUf2Q_cysK2_Gl3QonX9CU,14397 -apprise/plugins/smtp2go.py,sha256=TIHuIlblj4IwwIA2v_DhyiULnvlzPoHlozPofhivTao,20028 -apprise/plugins/sns.py,sha256=zkx6fzpTTQWiIR2vlgLPEOsdJ4DFumBP-u_Ui5H1oM0,24520 -apprise/plugins/sparkpost.py,sha256=20ox2JFUFRvvHn5_k7KAvREGTYzSGjoJnLwTAVCOA_Y,28157 -apprise/plugins/splunk.py,sha256=Tp0KTEJCYhwtYCVmbsVdeJdlJCuRtnCPokJSDEvS3vg,16601 -apprise/plugins/streamlabs.py,sha256=dAfw9Jjvv1wH9ixRGqUAQ0wcIVxUVoU99k0fcEa_YRI,16300 -apprise/plugins/synology.py,sha256=VLoZU-UZnO2wxIbsc9UhN34zJ7H7ZRmjrcm_xTZsx2Q,11525 -apprise/plugins/syslog.py,sha256=oNMs_iOtYn6s5eApfV6I7CBGJ7AX1PSedQsfLV-3he0,10779 -apprise/plugins/techuluspush.py,sha256=Ogl9gOk49Gf37NFXX7GifQukUxZnXycL_LJxTEvCNhI,7522 -apprise/plugins/telegram.py,sha256=dAn4GKSzY8iegDN4JYRW8XNv-qh2n4k1MWLC_u1Olu8,38519 -apprise/plugins/threema.py,sha256=bv9jsyOZcYbwRjxL9EdpKriH953UHcwc_0GhT3TLUYc,12161 -apprise/plugins/twilio.py,sha256=xa5PnVtPUDRSwCDTVw699T8WKqOik3ij_OMA3Yp9b64,18500 -apprise/plugins/twist.py,sha256=gZPuB02SoTeEL7I7tOwooHdUrGYQi6Qea_MINpDu3R4,29210 -apprise/plugins/twitter.py,sha256=eca8Fj1K7O-zXXGgfyRviHkG7wCP4F2Oz89oIlxx7WE,30644 -apprise/plugins/voipms.py,sha256=lSglAyzyEUQPsNne9MbmyPqzmfD1uq5xnprFjY6ctw4,12871 -apprise/plugins/vonage.py,sha256=KR6Mm4nPCcsuCXsGfpo3AYoEpm7aPpSbNoRTk9f70rE,13712 -apprise/plugins/webexteams.py,sha256=tWRGiX3jS-AhnyrU2-PBg_oWN59JRJ4V9kXbgJoHJJU,9435 -apprise/plugins/wecombot.py,sha256=0_hza9urwnFXBE85Zd-KOyrhg-g1aH8JBh_29KcoVbI,9055 -apprise/plugins/whatsapp.py,sha256=VkDOQDeW9Kfm5rD5sovLNT9FFv9rcWlM0ZKxQ7Qa2ww,20212 -apprise/plugins/windows.py,sha256=RemtHy0jnhHFx8zvFcZsXYTJ7MKN8PAPCn4h9IEEu3Y,8725 -apprise/plugins/workflows.py,sha256=T8sImroqDcAXELG138Sf6gUfBz-5jK54ARFF4OkqiDg,19872 -apprise/plugins/wxpusher.py,sha256=DBgdXqGZMALh4fgvHKvTlGYoexHh6hcrCOWBulw8_Bw,12701 -apprise/plugins/xbmc.py,sha256=cSLPG5RPQUID7SvOKo0nkF8XP1MUFFyZguvE97z6nCw,12736 -apprise/plugins/zulip.py,sha256=3wZAeFb1B1Q60uIgcMIBIEX8kUuvCY2QCfYYqF_PQ2A,14305 -apprise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise/url.py,sha256=KVvUUkJe3ugNfo9tJRjWu4PX7wmytbU3n1JvA6anV5s,35085 -apprise/url.pyi,sha256=WLaRREH7FzZ5x3-qkDkupojWGFC4uFwJ1EDt02lVs8c,520 -apprise/utils.py,sha256=2FghO1ETBWjvjqOBSmBPI2FPLa6vNv7FUS636QORoMs,58581 diff --git a/libs/apprise-1.9.0.dist-info/INSTALLER b/libs/apprise-1.9.1.dist-info/INSTALLER similarity index 100% rename from libs/apprise-1.9.0.dist-info/INSTALLER rename to libs/apprise-1.9.1.dist-info/INSTALLER diff --git a/libs/apprise-1.9.0.dist-info/LICENSE b/libs/apprise-1.9.1.dist-info/LICENSE similarity index 100% rename from libs/apprise-1.9.0.dist-info/LICENSE rename to libs/apprise-1.9.1.dist-info/LICENSE diff --git a/libs/apprise-1.9.0.dist-info/METADATA b/libs/apprise-1.9.1.dist-info/METADATA similarity index 94% rename from libs/apprise-1.9.0.dist-info/METADATA rename to libs/apprise-1.9.1.dist-info/METADATA index 66f9ce0ea..212d8da2b 100644 --- a/libs/apprise-1.9.0.dist-info/METADATA +++ b/libs/apprise-1.9.1.dist-info/METADATA @@ -1,12 +1,12 @@ Metadata-Version: 2.1 Name: apprise -Version: 1.9.0 +Version: 1.9.1 Summary: Push Notifications that work with just about every platform! Home-page: https://github.com/caronc/apprise Author: Chris Caron Author-email: lead2gold@gmail.com License: BSD -Keywords: Africas Talking Alerts Apprise API Automated Packet Reporting System AWS Boxcar BulkSMS BulkVS Burst SMS Chantify Chat CLI ClickSend D7Networks Dapnet DBus DingTalk Discord Email Emby Enigma2 FCM Feishu Flock Form Free Mobile Gnome Google Chat Gotify Growl Guilded Home Assistant httpSMS IFTTT Join JSON Kavenegar KODI Kumulos LaMetric Line LunaSea MacOSX Mailgun Mastodon Matrix Mattermost MessageBird Microsoft Misskey MQTT MSG91 MSTeams Nextcloud NextcloudTalk Notica Notifiarr Notifico Ntfy Office365 OneSignal Opsgenie PagerDuty PagerTree ParsePlatform PopcornNotify Power Automate Prowl PushBullet Pushed Pushjet PushMe Push Notifications Pushover PushSafer Pushy PushDeer Reddit Revolt Rocket.Chat RSyslog Ryver SendGrid ServerChan SES SFR Signal SimplePush Sinch Slack SMSEagle SMS Manager SMTP2Go SNS SparkPost Splunk Streamlabs Stride Synology Chat Syslog Techulus Telegram Threema Gateway Twilio Twist Twitter VictorOps Voipms Vonage Webex WeCom Bot WhatsApp Windows Workflows WxPusher XBMC XML Zulip +Keywords: Africas Talking Alerts Apprise API Automated Packet Reporting System AWS BulkSMS BulkVS Burst SMS Chantify Chat CLI ClickSend D7Networks Dapnet DBus DingTalk Discord Email Emby Enigma2 FCM Feishu Flock Form Free Mobile Gnome Google Chat Gotify Growl Guilded Home Assistant httpSMS IFTTT Join JSON Kavenegar KODI Kumulos LaMetric Line LunaSea MacOSX Mailgun Mastodon Matrix Mattermost MessageBird Microsoft Misskey MQTT MSG91 MSTeams Nextcloud NextcloudTalk Notica Notifiarr Notifico Ntfy Office365 OneSignal Opsgenie PagerDuty PagerTree ParsePlatform Plivo PopcornNotify Power Automate Prowl PushBullet Pushed Pushjet PushMe Push Notifications Pushover PushSafer Pushy PushDeer Reddit Revolt Rocket.Chat RSyslog Ryver SendGrid ServerChan Seven SES SFR Signal SimplePush Sinch Slack SMSEagle SMS Manager SMTP2Go SNS SparkPost Splunk Streamlabs Stride Synology Chat Syslog Techulus Telegram Threema Gateway Twilio Twist Twitter VictorOps Voipms Vonage Webex WeCom Bot WhatsApp Windows Workflows WxPusher XBMC XML Zulip Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators @@ -77,6 +77,7 @@ System Administrators and DevOps who wish to send a notification now no longer n * [Configuration Files](#cli-configuration-files) * [File Attachments](#cli-file-attachments) * [Loading Custom Notifications/Hooks](#cli-loading-custom-notificationshooks) + * [Environment Variables](#cli-environment-variables) * [Developer API Usage](#developer-api-usage) * [Configuration Files](#api-configuration-files) * [File Attachments](#api-file-attachments) @@ -98,7 +99,6 @@ The table below identifies the services this tool supports and some example serv | [Apprise API](https://github.com/caronc/apprise/wiki/Notify_apprise_api) | apprise:// or apprises:// | (TCP) 80 or 443 | apprise://hostname/Token | [AWS SES](https://github.com/caronc/apprise/wiki/Notify_ses) | ses:// | (TCP) 443 | ses://user@domain/AccessKeyID/AccessSecretKey/RegionName<br/>ses://user@domain/AccessKeyID/AccessSecretKey/RegionName/email1/email2/emailN | [Bark](https://github.com/caronc/apprise/wiki/Notify_bark) | bark:// | (TCP) 80 or 443 | bark://hostname<br />bark://hostname/device_key<br />bark://hostname/device_key1/device_key2/device_keyN<br/>barks://hostname<br />barks://hostname/device_key<br />barks://hostname/device_key1/device_key2/device_keyN -| [Boxcar](https://github.com/caronc/apprise/wiki/Notify_boxcar) | boxcar:// | (TCP) 443 | boxcar://hostname<br />boxcar://hostname/@tag<br/>boxcar://hostname/device_token<br />boxcar://hostname/device_token1/device_token2/device_tokenN<br />boxcar://hostname/@tag/@tag2/device_token | [Chantify](https://github.com/caronc/apprise/wiki/Notify_chantify) | chantify:// | (TCP) 443 | chantify://token | [Discord](https://github.com/caronc/apprise/wiki/Notify_discord) | discord:// | (TCP) 443 | discord://webhook_id/webhook_token<br />discord://avatar@webhook_id/webhook_token | [Emby](https://github.com/caronc/apprise/wiki/Notify_emby) | emby:// or embys:// | (TCP) 8096 | emby://user@hostname/<br />emby://user:password@hostname @@ -185,7 +185,6 @@ The table below identifies the services this tool supports and some example serv | [BulkSMS](https://github.com/caronc/apprise/wiki/Notify_bulksms) | bulksms:// | (TCP) 443 | bulksms://user:password@ToPhoneNo<br/>bulksms://User:Password@ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [BulkVS](https://github.com/caronc/apprise/wiki/Notify_bulkvs) | bulkvs:// | (TCP) 443 | bulkvs://user:password@FromPhoneNo<br/>bulkvs://user:password@FromPhoneNo/ToPhoneNo<br/>bulkvs://user:password@FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Burst SMS](https://github.com/caronc/apprise/wiki/Notify_burst_sms) | burstsms:// | (TCP) 443 | burstsms://ApiKey:ApiSecret@FromPhoneNo/ToPhoneNo<br/>burstsms://ApiKey:ApiSecret@FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ -| [Burst SMS](https://github.com/caronc/apprise/wiki/Notify_burst_sms) | burstsms:// | (TCP) 443 | burstsms://ApiKey:ApiSecret@FromPhoneNo/ToPhoneNo<br/>burstsms://ApiKey:ApiSecret@FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [ClickSend](https://github.com/caronc/apprise/wiki/Notify_clicksend) | clicksend:// | (TCP) 443 | clicksend://user:pass@PhoneNo<br/>clicksend://user:pass@ToPhoneNo1/ToPhoneNo2/ToPhoneNoN | [DAPNET](https://github.com/caronc/apprise/wiki/Notify_dapnet) | dapnet:// | (TCP) 80 | dapnet://user:pass@callsign<br/>dapnet://user:pass@callsign1/callsign2/callsignN | [D7 Networks](https://github.com/caronc/apprise/wiki/Notify_d7networks) | d7sms:// | (TCP) 443 | d7sms://token@PhoneNo<br/>d7sms://token@ToPhoneNo1/ToPhoneNo2/ToPhoneNoN @@ -195,6 +194,8 @@ The table below identifies the services this tool supports and some example serv | [Kavenegar](https://github.com/caronc/apprise/wiki/Notify_kavenegar) | kavenegar:// | (TCP) 443 | kavenegar://ApiKey/ToPhoneNo<br/>kavenegar://FromPhoneNo@ApiKey/ToPhoneNo<br/>kavenegar://ApiKey/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN | [MessageBird](https://github.com/caronc/apprise/wiki/Notify_messagebird) | msgbird:// | (TCP) 443 | msgbird://ApiKey/FromPhoneNo<br/>msgbird://ApiKey/FromPhoneNo/ToPhoneNo<br/>msgbird://ApiKey/FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [MSG91](https://github.com/caronc/apprise/wiki/Notify_msg91) | msg91:// | (TCP) 443 | msg91://TemplateID@AuthKey/ToPhoneNo<br/>msg91://TemplateID@AuthKey/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ +| [Plivo](https://github.com/caronc/apprise/wiki/Notify_plivo) | plivo:// | (TCP) 443 | plivo://AuthID@Token@FromPhoneNo<br/>plivo://AuthID@Token/FromPhoneNo/ToPhoneNo<br/>plivo://AuthID@Token/FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ +| [Seven](https://github.com/caronc/apprise/wiki/Notify_seven) | seven:// | (TCP) 443 | seven://ApiKey/FromPhoneNo<br/>seven://ApiKey/FromPhoneNo/ToPhoneNo<br/>seven://ApiKey/FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Société Française du Radiotéléphone (SFR)](https://github.com/caronc/apprise/wiki/Notify_sfr) | sfr:// | (TCP) 443 | sfr://user:password>@spaceId/ToPhoneNo<br/>sfr://user:password>@spaceId/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Signal API](https://github.com/caronc/apprise/wiki/Notify_signal) | signal:// or signals:// | (TCP) 80 or 443 | signal://hostname:port/FromPhoneNo<br/>signal://hostname:port/FromPhoneNo/ToPhoneNo<br/>signal://hostname:port/FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ | [Sinch](https://github.com/caronc/apprise/wiki/Notify_sinch) | sinch:// | (TCP) 443 | sinch://ServicePlanId:ApiToken@FromPhoneNo<br/>sinch://ServicePlanId:ApiToken@FromPhoneNo/ToPhoneNo<br/>sinch://ServicePlanId:ApiToken@FromPhoneNo/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/<br/>sinch://ServicePlanId:ApiToken@ShortCode/ToPhoneNo<br/>sinch://ServicePlanId:ApiToken@ShortCode/ToPhoneNo1/ToPhoneNo2/ToPhoneNoN/ @@ -391,6 +392,17 @@ apprise -vv --title 'custom override' \ You can read more about creating your own custom notifications and/or hooks [here](https://github.com/caronc/apprise/wiki/decorator_notify). +## CLI Environment Variables + +Those using the Command Line Interface (CLI) can also leverage environment variables to pre-set the default settings: + +| Variable | Description | +|------------------------ | ----------------- | +| `APPRISE_URLS` | Specify the default URLs to notify IF none are otherwise specified on the command line explicitly. If the `--config` (`-c`) is specified, then this will over-rides any reference to this variable. Use white space and/or a comma (`,`) to delimit multiple entries. +| `APPRISE_CONFIG_PATH` | Explicitly specify the config search path to use (over-riding the default). The path(s) defined here must point to the absolute filename to open/reference. Use a semi-colon (`;`), line-feed (`\n`), and/or carriage return (`\r`) to delimit multiple entries. +| `APPRISE_PLUGIN_PATH` | Explicitly specify the custom plugin search path to use (over-riding the default). Use a semi-colon (`;`), line-feed (`\n`), and/or carriage return (`\r`) to delimit multiple entries. +| `APPRISE_STORAGE_PATH` | Explicitly specify the persistent storage path to use (over-riding the default). + # Developer API Usage To send a notification from within your python application, just do the following: diff --git a/libs/apprise-1.9.1.dist-info/RECORD b/libs/apprise-1.9.1.dist-info/RECORD new file mode 100644 index 000000000..871ad1223 --- /dev/null +++ b/libs/apprise-1.9.1.dist-info/RECORD @@ -0,0 +1,204 @@ +../../bin/apprise,sha256=ZJ-e4qqxNLtdW_DAvpuPPX5iROIiQd8I6nvg7vtAv-g,233 +apprise-1.9.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +apprise-1.9.1.dist-info/LICENSE,sha256=gt7qKBxRhVcdmXCYVtrWP6DtYjD0DzONet600dkU994,1343 +apprise-1.9.1.dist-info/METADATA,sha256=UayxDNlv8dJVozBLd5Nvj_q6vZfELt5ycUOJCoyk8bo,52950 +apprise-1.9.1.dist-info/RECORD,, +apprise-1.9.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise-1.9.1.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +apprise-1.9.1.dist-info/entry_points.txt,sha256=71YypBuNdjAKiaLsiMG40HEfLHxkU4Mi7o_S0s0d8wI,45 +apprise-1.9.1.dist-info/top_level.txt,sha256=JrCRn-_rXw5LMKXkIgMSE4E0t1Ks9TYrBH54Pflwjkk,8 +apprise/__init__.py,sha256=RxGvVVtaXg0sEAhIEraiFg1L61jM6k_YLG8DTa97yPo,3887 +apprise/apprise.py,sha256=kB1Oc5hHGnVx_vLX8TafMUq4bopxYnBiaxkCb8QpC7M,32838 +apprise/apprise.pyi,sha256=_4TBKvT-QVj3s6PuTh3YX-BbQMeJTdBGdVpubLMY4_k,2203 +apprise/apprise_attachment.py,sha256=Dz4ZIEueRsGVyulyI1ulugdSXIcDKCATn990UukxaNU,12363 +apprise/apprise_attachment.pyi,sha256=R9-0dVqWpeaFrVpcREwPhGy3qHWztG5jEjYIOsbE5dM,1145 +apprise/apprise_config.py,sha256=wCSvFW57LkeyvG-WGnLlfUSU9s8hl3P0L8V3Q4Q8wP8,16890 +apprise/apprise_config.pyi,sha256=_mUlCnncqAq8sL01WxQTgZjnb2ic9kZXvtqZmVl-fc8,1568 +apprise/asset.py,sha256=U5FXcQFCXP5R7MnxcxdLXzEZ7IidLHBzQjUyc5l1Y0U,15103 +apprise/asset.pyi,sha256=NYLXXYbScgRkspP27XGpRRM_uliPu1OCdWdZBPPvLng,979 +apprise/assets/NotifyXML-1.0.xsd,sha256=292qQ_IUl5EWDhPyzm9UTT0C2rVvJkyGar8jiODkJs8,986 +apprise/assets/NotifyXML-1.1.xsd,sha256=bjR3CGG4AEXoJjYkGCbDttKHSkPP1FlIWO02E7G59g4,1758 +apprise/assets/themes/default/apprise-failure-128x128.ico,sha256=Mt0ptfHJaN3Wsv5UCNDn9_3lyEDHxVDv1JdaDEI_xCA,67646 +apprise/assets/themes/default/apprise-failure-128x128.png,sha256=66ps8TDPxVH3g9PlObJqF-0x952CjnqQyN3zvpRcOT8,16135 +apprise/assets/themes/default/apprise-failure-256x256.png,sha256=bQBsKKCsKfR9EqgYOZrcVcVa5y8qG58PN2mEqO5eNRI,41931 +apprise/assets/themes/default/apprise-failure-32x32.png,sha256=vH0pZffIDCvkejpr3fJHGXW__8Yc3R_p0bacX6t6l18,2437 +apprise/assets/themes/default/apprise-failure-72x72.png,sha256=EP5A8DHRDr9srgupFSwOoyQ308bNJ8aL192J_L4K-ec,7600 +apprise/assets/themes/default/apprise-info-128x128.ico,sha256=F5_CirmXueRCRI5Z_Crf6TS6jVIXTJlRD83zw1oJ66g,67646 +apprise/assets/themes/default/apprise-info-128x128.png,sha256=bBqRZAgQey-gkmJrnFhPbzjILSrljE59mRkgj3raMQo,16671 +apprise/assets/themes/default/apprise-info-256x256.png,sha256=B5r_O4d9MHCmSWZwfbqQgZSp-ZetTdiBSwKcMTF1aFA,43331 +apprise/assets/themes/default/apprise-info-32x32.png,sha256=lt3NZ95TzkiCNVNlurrB2fE2nriMa1wftl7nrNXmb6c,2485 +apprise/assets/themes/default/apprise-info-72x72.png,sha256=kDnsZpqNUZGqs9t1ECUup7FOfXUIL-rupnQCYJp9So4,7875 +apprise/assets/themes/default/apprise-logo.png,sha256=85ttALudKkLmiqilJT7mUQLUXRFmM1AK89rnwLm313s,160907 +apprise/assets/themes/default/apprise-success-128x128.ico,sha256=uCopPwdQjxgfohKazHaDzYs9y4oiaOpL048PYC6WRlg,67646 +apprise/assets/themes/default/apprise-success-128x128.png,sha256=nvDuU_QqhGlw6cMtdj7Mv-gPgqCEx-0DaaXn1KBLVYg,17446 +apprise/assets/themes/default/apprise-success-256x256.png,sha256=vXfKuxY3n0eeXHKdb9hTxICxOEn7HjAQ4IZpX0HSLzc,48729 +apprise/assets/themes/default/apprise-success-32x32.png,sha256=Jg9pFJh3YPI-LiPBebyJ7Z4Vt7BRecaE8AsRjQVIkME,2471 +apprise/assets/themes/default/apprise-success-72x72.png,sha256=FQbgvIhqKOhEK0yvrhaSpai0R7hrkTt_-GaC2KUgCCk,7858 +apprise/assets/themes/default/apprise-warning-128x128.ico,sha256=6XaQPOx0oWK_xbhr4Yhb7qNazCWwSs9lk2SYR2MHTrQ,67646 +apprise/assets/themes/default/apprise-warning-128x128.png,sha256=pf5c4Ph7jWH7gf39dJoieSj8TzAsY3TXI-sGISGVIW4,16784 +apprise/assets/themes/default/apprise-warning-256x256.png,sha256=SY-xlaiXaj420iEYKC2_fJxU-yj2SuaQg6xfPNi83bw,43708 +apprise/assets/themes/default/apprise-warning-32x32.png,sha256=97R2ywNvcwczhBoWEIgajVtWjgT8fLs4FCCz4wu0dwc,2472 +apprise/assets/themes/default/apprise-warning-72x72.png,sha256=L8moEInkO_OLxoOcuvN7rmrGZo64iJeH20o-24MQghE,7913 +apprise/attachment/__init__.py,sha256=9jSiGEbLllS-0Vbpgxo4MCpZfIJ-saezWWgQ1PofZ9I,1678 +apprise/attachment/base.py,sha256=cSMzn0afNynXTnqTnyMgue__8ya_OPo5azMwTYOKS2k,16509 +apprise/attachment/base.pyi,sha256=w0XG_QKauiMLJ7eQ4S57IiLIURZHm_Snw7l6-ih9GP8,961 +apprise/attachment/file.py,sha256=t_osFOH0QD6KuuywZfKN61aQdAjxTFff5BgFNBzWoY0,4976 +apprise/attachment/http.py,sha256=o9341E3G8SZGQ1uDkN6Rto1WeKXHRibkraocOiUvm8Y,13758 +apprise/attachment/memory.py,sha256=TlDRGqoelOhaFkKW6bMDm8mw7gJLYMNHH4aDAL2MvHg,6999 +apprise/cli.py,sha256=upLvnKnD_Lo4EMv-S-LJQ-ZP6AoUxJSR7S6U17XEXrc,35327 +apprise/common.py,sha256=B_4Nwo8HejUDnqdeya6Vvn-y6pkFXBpeHJy9uejEujc,6524 +apprise/common.pyi,sha256=luF3QRiClDCk8Z23rI6FCGYsVmodOt_JYfYyzGogdNM,447 +apprise/config/__init__.py,sha256=oDxdoqG2NEYu_bbpLsLaM3L9WKY3gNn5gjIwb2h3LU4,1679 +apprise/config/base.py,sha256=QSGJt7-gmK7gI_chB2YukBEU5vsiaCjz7wUG50SU2a4,53129 +apprise/config/base.pyi,sha256=cngfobwH6v2vxYbQrObDi5Z-t5wcquWF-wR0kBCr3Eg,54 +apprise/config/file.py,sha256=A54MYobIVIQqbrhYmC26foMKnDN83Hz7U_go9gL802A,6245 +apprise/config/http.py,sha256=CjQtv_OQJykMxD4ssiwbFI3P8CeQiPdYV_ZIiL_XqMw,9440 +apprise/config/memory.py,sha256=8VICU-WLux8KnW6i9sf9fgmns90J-MfVYI3pvTiyTno,2816 +apprise/conversion.py,sha256=7q00QmrT0TCWu49j6TnPc0l_vfCIWCdDT3KiSq3SLJc,6350 +apprise/decorators/__init__.py,sha256=e_PDAm0kQNzwDPx-NJZLPfLMd2VAABvNZtxx_iDviRM,1487 +apprise/decorators/base.py,sha256=HgqmvjqRel421G0SW-6H0zGYAC-o4E2nj9-w_ifu-50,8084 +apprise/decorators/notify.py,sha256=FzIa7m-G5KnVVa__rjyn990zt2lqE8sdHW-XY79lbAU,5097 +apprise/emojis.py,sha256=ONF0t8dY9f2XlEkLUG79-ybKVAj2GqbPj2-Be97vAoI,87738 +apprise/exception.py,sha256=5E-jQ6qA0hQHVnE9sjVLRuj4d0QgGJQ5HdtCui215XU,2337 +apprise/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise/i18n/en/LC_MESSAGES/apprise.mo,sha256=aOLjg1I4K-9KQEqyFhs7wW13jUPjxY4X7EN2XvYR8Qw,3959 +apprise/locale.py,sha256=4uSr4Nj_rz6ISMMAfRVRk58wZVLKOofJgk2x0_E8NkQ,8994 +apprise/logger.py,sha256=131hqhed8cUj9x_mfXDEvwA2YbcYDFAYiWVK1HgxRVY,6921 +apprise/manager.py,sha256=ZgpusHA3yAyUf57qxOtBDcw4IICMKBNTveCAEqSm7wk,27352 +apprise/manager_attachment.py,sha256=EkrcKtKjbxTXXyDaKyiu4XSfDu9wKFSdJD7TOTpyOUc,2200 +apprise/manager_config.py,sha256=sCIOlBTH13bQ1cuhQVpUq2vyKWBArA8YRyPnXIB1iWQ,2205 +apprise/manager_plugins.py,sha256=Xbg5-xr-06zMIDoWviz-zKcbzusHj0iBBMchKPpUOkg,2211 +apprise/persistent_store.py,sha256=Kn-iwudFQiUerlLdSquTLoGMEgFTYXcrHyK4tU4RMEE,56446 +apprise/plugins/__init__.py,sha256=CvH8porbgIJTuDqK6E3Ejy_7n_yOOsI4baRZF3TYDMU,18695 +apprise/plugins/africas_talking.py,sha256=0Mcc7FhxPTBDhWxoF5Etfzyw0Dfkn4vApEmAWw3oq4U,16028 +apprise/plugins/apprise_api.py,sha256=OGpwoNkujgg1MvlEYlz0yYiJYdvISnR5R9L_3v_I5yw,16802 +apprise/plugins/aprs.py,sha256=72sfop7ulQ8g5JIa1KfBvWpj-dSV9pv0CtT2ZQToT7A,25779 +apprise/plugins/bark.py,sha256=MaWLHKHs6dCaMjKLy9wEx62ec6n1i9pD_0u3ZaHVzWw,17079 +apprise/plugins/base.py,sha256=A9octO0MKqDH195PVPXoARqqTLozqxcvcUKGqput3o8,32784 +apprise/plugins/base.pyi,sha256=aKlZXRYUgG8lz_ZgGkYYJ_GKhuf18youTmMU-FlG7z8,21 +apprise/plugins/bulksms.py,sha256=3IrRv7N2c2jTbJ2uwKPOi0_5DF9Gu3zgWdbO8FI665g,16346 +apprise/plugins/bulkvs.py,sha256=hi620_T4rPOTqMDJdqtsQqvihL6r4I1OQD6ag1F5fOY,13549 +apprise/plugins/burstsms.py,sha256=VLHaPfJJ1lLt7uFi1oJdbE3-j6z4mNBX1ObY3ottAIM,15797 +apprise/plugins/chantify.py,sha256=9xjBwOY4syj94g25_2ndfPjHgJbcxqTjST8epqtqLmI,6947 +apprise/plugins/clicksend.py,sha256=-ifaogTKQ7L4JtOOrdxk3WS7WOm92oNNVYmx4w1v9aU,11671 +apprise/plugins/custom_form.py,sha256=BV1adXR5NMcB5JMuylUXYIiRqy2cm8P5kRoM86EGpXY,18443 +apprise/plugins/custom_json.py,sha256=9v9r8EEA6tPEt5sfLubpLNVbgFT1jkomT383monPeYA,14312 +apprise/plugins/custom_xml.py,sha256=ihl0uYOTYO9e80RashRj2lIiIYtjAb9PPywKNy4xOi8,17569 +apprise/plugins/d7networks.py,sha256=42YgB9ukIqrGQWH68vsl0Ci-2qqVO4Bop2M4Bo_ejt0,15267 +apprise/plugins/dapnet.py,sha256=xFbPpFp64zxalW0zw9MV-gTyPUGgqG1HUtogPUtuNro,13858 +apprise/plugins/dbus.py,sha256=MXPGaWI9EEpOlncO1t9KBVUn3W6OfAqJKXhmWQzRNoc,14491 +apprise/plugins/dingtalk.py,sha256=gmKuqDXt7nmLtKltY7myJguFTTmz_vnDYOkecAmoLaM,12273 +apprise/plugins/discord.py,sha256=INdWWHcY5LmcamN4bvJCGbYjJ0vX_VfIZ-SqduYoVX0,26346 +apprise/plugins/email/__init__.py,sha256=pUp4xX_1_LC6ITIkj7lCNFiFgb8UfmLxpevnW-xKcSs,2101 +apprise/plugins/email/base.py,sha256=V-Gbu3eD2efvu7poTRajsa6SPOFz6HyGaQbbz56p9XA,38373 +apprise/plugins/email/common.py,sha256=jzuFhKMeyoTCfRtbKu3zi4v-c51Ewr66fE0lfUfh2Tg,2569 +apprise/plugins/email/templates.py,sha256=js9M2lkvay_-lbxRPCVyvP7xraSe2HV082aUaXV8wpA,9376 +apprise/plugins/emby.py,sha256=HHyXbT2Ld23-tEkMjfFgHyOSToPwnU0epWVNd3AQj2Y,24427 +apprise/plugins/enigma2.py,sha256=s3cKfNUGVe7_IcRCvdPMZ4hv_A5g7dcOvW6-aKz6-dI,11931 +apprise/plugins/fcm/__init__.py,sha256=CX-aZVcFw6nUcC7sWXHbSnU9fp_nR0IxDZyOyGlq8uQ,21936 +apprise/plugins/fcm/color.py,sha256=2DfMOAXkLU07XzT8XIYKZ5yXBw77MiMXueVaDSlWWQU,4591 +apprise/plugins/fcm/common.py,sha256=978uBUoNdtopCtylipGiKQdsQ8FTONxkFBp7uJMZHc8,1718 +apprise/plugins/fcm/oauth.py,sha256=Vvbd0-rd5BPIjAneG3rILU153JIzfSZ0kaDov6hm96M,11197 +apprise/plugins/fcm/priority.py,sha256=0WuRW1y1HVnybgjlTeCZPHzt7j8SwWnC7faNcjioAOc,8163 +apprise/plugins/feishu.py,sha256=AoTytULz_b1mzEh9tE9BahAZcveUu12bSrHbXOLBfdo,7540 +apprise/plugins/flock.py,sha256=JGjLeIagtCP79DLtHb9V9ESy7AusHLbV8rBdHrri3QU,12984 +apprise/plugins/freemobile.py,sha256=Wefq8No34MKfLewanvvOlREFZhjWFTcLxJDpD2_R7Eo,6974 +apprise/plugins/gnome.py,sha256=p87RCNgjMmDN7SFOwX_xuMGha7SIz9lVQelXJ0OlvMY,9227 +apprise/plugins/google_chat.py,sha256=XJCienlBBFc63KFc8ajlIQ5VKOoJZZNB5hG2G0y3r2g,12973 +apprise/plugins/gotify.py,sha256=OZapVd5E71xRsF7Ktpe4U70uwImjocW_li92WLXxecg,11028 +apprise/plugins/growl.py,sha256=QSmVkVTHEdve8fCb8tOK9FVQmV5cy4l2rbU4Vxkl0Qo,14446 +apprise/plugins/guilded.py,sha256=lhE6gK7laQNYEubD9lBGRemFK-IHis_u2tNekbUoGgM,3707 +apprise/plugins/home_assistant.py,sha256=1eEYQNpabnMvnYbn0xcQoUjl4jLQqGNoVYtMu094JX4,11276 +apprise/plugins/httpsms.py,sha256=o53aEDp-7DWa82h8D2By55DLz_dfZOsW9_jXtcHzxkU,11386 +apprise/plugins/ifttt.py,sha256=_oBxKsAQcPrSGAJ-KaV19P8HjXABZqE3q4PI5ooTyaY,13685 +apprise/plugins/join.py,sha256=JvMIesIOWf6Tbe8penPbqccleQ1rJeUU7g0lopGJlQQ,13818 +apprise/plugins/kavenegar.py,sha256=ES69k9nNUQuMf5IqwWQ55hmkJODShYh1b_v-H8phXew,12870 +apprise/plugins/kumulos.py,sha256=r1WFh4RrYSCwa5S30x4oRyniJhf8GKa0Nn_C3uzbBcg,8505 +apprise/plugins/lametric.py,sha256=wWMwryKwewIBUsOBybFeWPYrvjDQBNc67jaU59oktQ0,38449 +apprise/plugins/line.py,sha256=Py5GU-uNj-9rzq8NcVG-_5Hpo1nKBbhD8z1D8s_Xo9I,10908 +apprise/plugins/lunasea.py,sha256=4m7f8kn1hwkQ4HaiOttC4kPtyJYrhtQ3lBrrC9Q5OrU,15089 +apprise/plugins/macosx.py,sha256=BMPB3muOKen_EkRcxKdIF4Iz_4kY7NW7e0Ruau61iiY,8439 +apprise/plugins/mailgun.py,sha256=adcMibdGEHIIW-fhIsSwJC2dWfmiXhKq9_oHfC4ZHpM,25868 +apprise/plugins/mastodon.py,sha256=2Bf6dNbXStvB8DPFp-9nxGTG78qxtm-h3o-24AhgQLg,35610 +apprise/plugins/matrix.py,sha256=vVvm-gmpAHt-2aUA2BlDOwNa-2ovGSkmVf1G5JUWAUo,63276 +apprise/plugins/mattermost.py,sha256=uLZfzDAMhkkFcdMK7qsKvTxsYt7EjcLC_8lcXRDBmZ4,14813 +apprise/plugins/messagebird.py,sha256=XRUWILix-Gjo3tc4aUlnb0pyuhi6kUXkXcHPqgbHscA,12498 +apprise/plugins/misskey.py,sha256=UMEluu2KmGb7lHcjn6vFwacjFHVOSN-9WLXmy5qZrO0,9909 +apprise/plugins/mqtt.py,sha256=XRMwYPEVYeb8beBeqNTFa732L7ES2FHYcQ1mX7-D6Sc,20630 +apprise/plugins/msg91.py,sha256=sLFJrMckUfRjySwXbQ_Pu6YDCRB6MqICBotnOY_jFFU,12937 +apprise/plugins/msteams.py,sha256=3azwj5kLkPpOiLi2R6gmIsT03wNCbfKX8cPSv2XkMUg,26653 +apprise/plugins/nextcloud.py,sha256=YLdiR9I23iVxdP7kgpLblim7DN2JGh1bfGJvY5_BNZI,13134 +apprise/plugins/nextcloudtalk.py,sha256=krD8kr9J2g0XLADHa8aPdoIyj01UBJ7MhWJ2jlb2IfQ,11386 +apprise/plugins/notica.py,sha256=yR4IMVxzgzQ0I0BveVkLPl6q0ma_0kUwWnkDAafPSpM,13400 +apprise/plugins/notifiarr.py,sha256=LZuvq7lmKXekJHcKrodXopgfJWg_yqhtk-9nt9k-X6g,15516 +apprise/plugins/notifico.py,sha256=BUkras-ZeZg1i1sg-jlwC4KHRqL43tDVhaHT6Cj55uc,12309 +apprise/plugins/ntfy.py,sha256=O0hVLLvx9GUPgtJIJxZ5TpAmHfe31iCbqJ5sDABhljk,30163 +apprise/plugins/office365.py,sha256=8gLy1ITiG92RAQSKGlWwZtudMHjFTbSGzgTXPxHr93s,36877 +apprise/plugins/one_signal.py,sha256=oqFjJG-JwYgggCk7qJll6ODGVYcOn5aFNt_JZHfDVhk,22555 +apprise/plugins/opsgenie.py,sha256=CgSC7ELgvkqchhHDhbRMcuT7mjyZMKdGhyfBgg8Lz64,28428 +apprise/plugins/pagerduty.py,sha256=8sGPW7xAaoUdUdWF4HD9X3f0g6CyXpvYV440lL3klps,18196 +apprise/plugins/pagertree.py,sha256=VaKfof2NE_zVxsQpzgkmClofhRZDFIeqXJyefxSLQGc,14110 +apprise/plugins/parseplatform.py,sha256=txtC-xATfL2VAa-7aEGCiaoT50vWisfgz35A0NzDiR0,10709 +apprise/plugins/plivo.py,sha256=wYDlwG6XstiDO82N8uRLdAUGiq_hj0_q3Vle4g1NjyY,13840 +apprise/plugins/popcorn_notify.py,sha256=dJxDapVSzQh9-ENmb6RI8_278hi6zC0ceKMKypzmKek,10793 +apprise/plugins/prowl.py,sha256=2axHoKN2HCy4T8ByG85eX70rO2-TC8s-JSevQiQOmaw,10075 +apprise/plugins/pushbullet.py,sha256=Gh3NvSk4-SEaECtrjCtSyEDIIfq1XSq1rrjSvYv1DJU,15695 +apprise/plugins/pushdeer.py,sha256=B5ghGWNQdkdR_SYwFpFe6ZIhDpck4B5e1F8Y30lx6NA,7290 +apprise/plugins/pushed.py,sha256=KkvkIIZd_mkOPjPnfUK3YeGT_AlYK8aw8Q4J0pcIdHA,12540 +apprise/plugins/pushjet.py,sha256=H0R92-tqdeYiLsPQ7sam9lDXvJr3KxChH9_txIvegsM,9344 +apprise/plugins/pushme.py,sha256=jB0G2oDU9kw7l4feF8Vr9sqUZT_of_Y8KdBxzoFVN5I,7389 +apprise/plugins/pushover.py,sha256=uSgHUsnWn8AGbLCL0ZhKUXh6kHD1HGTNUMPeAYZLfWU,21477 +apprise/plugins/pushsafer.py,sha256=1vOL0I-_MD6pDwIEcz7Em1_nF70Af94Br8TNjiFRIBo,27166 +apprise/plugins/pushy.py,sha256=BussLKjyUcVZmJkOj1seNGHfm3P_dsI5mW2uu5wUtvY,12752 +apprise/plugins/reddit.py,sha256=TBGdBXUeV5CW3LrVFtb5OhNS9k5HWc40Umf_TpcjLlc,26102 +apprise/plugins/revolt.py,sha256=Ks8OEmsEUNNYcJuSKqc45yDe7phobkBlRg4MbBezH8Y,14759 +apprise/plugins/rocketchat.py,sha256=32yTz_bq7MniGYpbQAyhvp7nrKiwB3_UdAeOqdUo6CY,26293 +apprise/plugins/rsyslog.py,sha256=TQG0JhcYxDzLNaP-3OxnnaYuxMinoNyx0c3QAKsDVqM,12364 +apprise/plugins/ryver.py,sha256=dxV8518h45BDDpn4rpe4D3xwMhiuKPvreRrOfJhpAOQ,12097 +apprise/plugins/sendgrid.py,sha256=IMlQftYmA9xtUUcmd4p7wY1KAdg3c1_jlWnOWWbSCjw,18087 +apprise/plugins/serverchan.py,sha256=39IWtP_1qBlTvrRiGtGaJ87Z8cikYFdErKPz4_8AMhg,6054 +apprise/plugins/ses.py,sha256=qlKtvbhnAYGgT0N9b5_s0Ppys5LnfwnNjrSKpmHU8HM,34032 +apprise/plugins/seven.py,sha256=yw7yNHCAfSqrnDYoiuCIKRUSEZbMau1b7EAWBBftht8,10422 +apprise/plugins/sfr.py,sha256=wEV4CPLUPhlCSRTDBLywdTgEI5FL-_7QxnLciixuc_Y,15192 +apprise/plugins/signal_api.py,sha256=6N7P1cWxnjfba1wObwnAp968GTm1zx-r-BMevFWJi64,17061 +apprise/plugins/simplepush.py,sha256=9Wl-67UeNUR8-Wg53F82jbtvwApIEieHZOLNN2_d_L8,12049 +apprise/plugins/sinch.py,sha256=PwJ5ntzPFu4RRtP8aJC76OrQx8p0y7ccZXmLYhdDxvU,17153 +apprise/plugins/slack.py,sha256=-rkv6AemHeZW9cluaw-oouG09AK39SVxorhkxcdAJQg,44304 +apprise/plugins/smseagle.py,sha256=Jt9MBVQcbEyzyA59GYeUepAIPpnjpK4pE3NOUXwU3mE,24483 +apprise/plugins/smsmanager.py,sha256=aRlYTKpktu8VH6ZxOF9FNzGTqEe1MGNEyazi3vTLVQ8,14353 +apprise/plugins/smtp2go.py,sha256=fiHS0o2VxU6cQpxfEiZoqOf7EQPKrw9wL2LL0SyG1vw,19984 +apprise/plugins/sns.py,sha256=g1MU8t04pW9LxKFKgjEovzHMGKshst-uhr2_YrPmkC0,24488 +apprise/plugins/sparkpost.py,sha256=_mTyvFOfQx12QWOXumaABTaQ09DGSGx6HN-dUgcBc9w,28113 +apprise/plugins/splunk.py,sha256=AgZSR8IX_TZywEbLoH_L7cCFtcU764cqoxzy0ktv47Y,16607 +apprise/plugins/streamlabs.py,sha256=DwuaI0I3lV4UrMrscJBESVg4WoXk7FRDFV2JDWKSXh4,16306 +apprise/plugins/synology.py,sha256=VLoZU-UZnO2wxIbsc9UhN34zJ7H7ZRmjrcm_xTZsx2Q,11525 +apprise/plugins/syslog.py,sha256=czReqzBuJjjsBs103DMJ_niDmLC-Y8gwmmHfmENHmDQ,10785 +apprise/plugins/techuluspush.py,sha256=atMvgOdOUEdKhETWK1NSOjO7Fy6LwDtgAZmP_Ul7DV0,7528 +apprise/plugins/telegram.py,sha256=b8VoM5i56DrFNCoSltar5NX1TJivxtRhyNyQhdW2UXQ,38487 +apprise/plugins/threema.py,sha256=UH_WXZg4ftDN1JoWRMotsbD4CU3LtailDbILgnK01OY,12110 +apprise/plugins/twilio.py,sha256=iPmHSaI2FDVJxlbrMJOYFlmoO5yRSk4nk9LJdJ5AcnA,18468 +apprise/plugins/twist.py,sha256=ZxojFBgq4swlrF2UbZPpT5Zb1GrOBASa5hb71YwPIv0,29197 +apprise/plugins/twitter.py,sha256=bh5s7jOw3u-DA01ovsb95a_rWgmpmvCkX1T1Jw5DiGw,30612 +apprise/plugins/voipms.py,sha256=FGO3AO8Bidg-AjZqobOapWtU98ZTQTLJz4W4g8QWqoQ,13114 +apprise/plugins/vonage.py,sha256=kNjkCp7gt46BiS59K2TH0pPsiRpNt_PGb39Axe0PJJY,13680 +apprise/plugins/webexteams.py,sha256=V3SlKZVfL8zNvIha_BUKWEJEC3qrgoVazHP4MKJtits,9441 +apprise/plugins/wecombot.py,sha256=-ygeUlSF_uTZOfJH-3Zr9r2hM0eQ_DG4ISsPxHL_YjY,9061 +apprise/plugins/whatsapp.py,sha256=J-OlOhGhGljpfBBAfcY0L5aW6ykaKOoyrxIjZAHiaeg,20180 +apprise/plugins/windows.py,sha256=50gdOp36pmFI6wPkPfGFeow8BqtIZlWkuJRK3p6ogcc,8731 +apprise/plugins/workflows.py,sha256=uTSZwgUEUrM22JUcivy32c8mqIMMBLxK5j6UP8396Po,19850 +apprise/plugins/wxpusher.py,sha256=ZR3Yxe5zVDtMkjUOzRRbr3KeOyVL8KkPEgR00bwaNvs,12688 +apprise/plugins/xbmc.py,sha256=7ByWHUSjeuhfSeRZ6oCNMmDobqzKU1_o7ROwf4offR0,12742 +apprise/plugins/zulip.py,sha256=P62A7-cNqAlDryIlpJs0O72FW2baUYHeucjRxVnghx8,14360 +apprise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise/url.py,sha256=otU2AADtGUpEXw00dFNCMxTMgXPjY4ygOm1AuXyXuv8,35026 +apprise/url.pyi,sha256=WLaRREH7FzZ5x3-qkDkupojWGFC4uFwJ1EDt02lVs8c,520 +apprise/utils/__init__.py,sha256=8TgDzOFje6b9ybinURyyIOk_fqF6C2AtLbd_kh_Lubs,1430 +apprise/utils/base64.py,sha256=LehdJII_pMfv1f0l7wUWaBW2K3KU9oSSDgrKnMkMcMU,3167 +apprise/utils/cwe312.py,sha256=9YRbjAaBuKIb-Rp0fHXcCnnritoIKZxfb5sjTeYZshY,7375 +apprise/utils/disk.py,sha256=43-QOYDq_m48EbBSg646jjv9DcBh-aadQF7VUGXkUHw,5801 +apprise/utils/logic.py,sha256=YyUlpqcpFESK6cqmxG-aAs5m5Bjnkj884dxDaxN6Fjg,4573 +apprise/utils/module.py,sha256=G3l6DYi5uTXAtf3Tg9urhsb5zlI3vGm9uUafflNHxSU,2117 +apprise/utils/parse.py,sha256=k5MOZWR3gqn5MF2oATlwRUQSkEiHLmrcAIQ7sbC-H98,39386 +apprise/utils/pgp.py,sha256=cKYCJww5EQNP7E78BhwpbgBeCOjYmaU74-4dYNf_Vkk,11489 +apprise/utils/singleton.py,sha256=6OEIIkpRQCjYHlSWt_WWIwLOrlBCMz7tYhbUXx-lHSQ,1844 +apprise/utils/templates.py,sha256=5fifEhuLJwCFyQ5F7Z9BuqXG5UhOiqA6pxDd2GvI7Tw,3252 diff --git a/libs/apprise-1.9.0.dist-info/REQUESTED b/libs/apprise-1.9.1.dist-info/REQUESTED similarity index 100% rename from libs/apprise-1.9.0.dist-info/REQUESTED rename to libs/apprise-1.9.1.dist-info/REQUESTED diff --git a/libs/apprise-1.9.0.dist-info/WHEEL b/libs/apprise-1.9.1.dist-info/WHEEL similarity index 100% rename from libs/apprise-1.9.0.dist-info/WHEEL rename to libs/apprise-1.9.1.dist-info/WHEEL diff --git a/libs/apprise-1.9.0.dist-info/entry_points.txt b/libs/apprise-1.9.1.dist-info/entry_points.txt similarity index 100% rename from libs/apprise-1.9.0.dist-info/entry_points.txt rename to libs/apprise-1.9.1.dist-info/entry_points.txt diff --git a/libs/apprise-1.9.0.dist-info/top_level.txt b/libs/apprise-1.9.1.dist-info/top_level.txt similarity index 100% rename from libs/apprise-1.9.0.dist-info/top_level.txt rename to libs/apprise-1.9.1.dist-info/top_level.txt diff --git a/libs/apprise/__init__.py b/libs/apprise/__init__.py index 6feaffbae..c231d5e3d 100644 --- a/libs/apprise/__init__.py +++ b/libs/apprise/__init__.py @@ -27,7 +27,7 @@ # POSSIBILITY OF SUCH DAMAGE. __title__ = 'Apprise' -__version__ = '1.9.0' +__version__ = '1.9.1' __author__ = 'Chris Caron' __license__ = 'BSD' __copywrite__ = 'Copyright (C) 2024 Chris Caron <lead2gold@gmail.com>' diff --git a/libs/apprise/apprise.py b/libs/apprise/apprise.py index 05a2ee3cc..16125009a 100644 --- a/libs/apprise/apprise.py +++ b/libs/apprise/apprise.py @@ -32,11 +32,10 @@ from itertools import chain from . import common from .conversion import convert_between -from .utils import is_exclusive_match +from .utils.logic import is_exclusive_match +from .utils.parse import parse_list, parse_urls +from .utils.cwe312 import cwe312_url from .manager_plugins import NotificationManager -from .utils import parse_list -from .utils import parse_urls -from .utils import cwe312_url from .emojis import apply_emojis from .logger import logger from .asset import AppriseAsset diff --git a/libs/apprise/apprise_attachment.py b/libs/apprise/apprise_attachment.py index ecf415ec9..7b491eef1 100644 --- a/libs/apprise/apprise_attachment.py +++ b/libs/apprise/apprise_attachment.py @@ -33,7 +33,7 @@ from .logger import logger from .common import ContentLocation from .common import CONTENT_LOCATIONS -from .utils import GET_SCHEMA_RE +from .utils.parse import GET_SCHEMA_RE # Grant access to our Notification Manager Singleton A_MGR = AttachmentManager() diff --git a/libs/apprise/apprise_config.py b/libs/apprise/apprise_config.py index 080f70d30..c96b69f24 100644 --- a/libs/apprise/apprise_config.py +++ b/libs/apprise/apprise_config.py @@ -32,9 +32,8 @@ from . import URLBase from .asset import AppriseAsset from . import common -from .utils import GET_SCHEMA_RE -from .utils import parse_list -from .utils import is_exclusive_match +from .utils.parse import GET_SCHEMA_RE, parse_list +from .utils.logic import is_exclusive_match from .logger import logger # Grant access to our Configuration Manager Singleton diff --git a/libs/apprise/asset.py b/libs/apprise/asset.py index 2f08a6661..d952e9415 100644 --- a/libs/apprise/asset.py +++ b/libs/apprise/asset.py @@ -143,6 +143,12 @@ class AppriseAsset: # Defines the encoding of the content passed into Apprise encoding = 'utf-8' + # Automatically generate our Pretty Good Privacy (PGP) keys if one isn't + # present and our environment configuration allows for it. + # For example, a case where the environment wouldn't allow for it would be + # if Persistent Storage was set to `memory` + pgp_autogen = True + # For more detail see CWE-312 @ # https://cwe.mitre.org/data/definitions/312.html # diff --git a/libs/apprise/attachment/base.py b/libs/apprise/attachment/base.py index a0f74f9a9..b3743e036 100644 --- a/libs/apprise/attachment/base.py +++ b/libs/apprise/attachment/base.py @@ -32,7 +32,7 @@ import base64 from .. import exception from ..url import URLBase -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..common import ContentLocation from ..locale import gettext_lazy as _ @@ -269,25 +269,26 @@ def exists(self, retrieve_if_missing=True): cache = self.template_args['cache']['default'] \ if self.cache is None else self.cache - if self.download_path and os.path.isfile(self.download_path) \ - and cache: + try: + if self.download_path and os.path.isfile(self.download_path) \ + and cache: - # We have enough reason to look further into our cached content - # and verify it has not expired. - if cache is True: - # return our fixed content as is; we will always cache it - return True + # We have enough reason to look further into our cached content + # and verify it has not expired. + if cache is True: + # return our fixed content as is; we will always cache it + return True - # Verify our cache time to determine whether we will get our - # content again. - try: - age_in_sec = time.time() - os.stat(self.download_path).st_mtime + # Verify our cache time to determine whether we will get our + # content again. + age_in_sec = \ + time.time() - os.stat(self.download_path).st_mtime if age_in_sec <= cache: return True - except (OSError, IOError): - # The file is not present - pass + except (OSError, IOError): + # The file is not present + pass return False if not retrieve_if_missing else self.download() @@ -359,12 +360,27 @@ def download(self): def open(self, mode='rb'): """ - return our file pointer and track it (we'll auto close later + return our file pointer and track it (we'll auto close later) """ pointer = open(self.path, mode=mode) self.__pointers.add(pointer) return pointer + def chunk(self, size=5242880): + """ + A Generator that yield chunks of a file with the specified size. + + By default the chunk size is set to 5MB (5242880 bytes) + """ + + with self.open() as file: + while True: + chunk = file.read(size) + if not chunk: + break + + yield chunk + def __enter__(self): """ support with keyword @@ -431,7 +447,15 @@ def __len__(self): Returns the filesize of the attachment. """ - return os.path.getsize(self.path) if self.path else 0 + if not self: + return 0 + + try: + return os.path.getsize(self.path) if self.path else 0 + + except OSError: + # OSError can occur if the file is inaccessible + return 0 def __bool__(self): """ diff --git a/libs/apprise/attachment/file.py b/libs/apprise/attachment/file.py index e24e1fbed..f0aeb72b6 100644 --- a/libs/apprise/attachment/file.py +++ b/libs/apprise/attachment/file.py @@ -29,7 +29,7 @@ import re import os from .base import AttachBase -from ..utils import path_decode +from ..utils.disk import path_decode from ..common import ContentLocation from ..locale import gettext_lazy as _ @@ -101,7 +101,11 @@ def download(self, **kwargs): # Ensure any existing content set has been invalidated self.invalidate() - if not os.path.isfile(self.dirty_path): + try: + if not os.path.isfile(self.dirty_path): + return False + + except OSError: return False if self.max_file_size > 0 and \ diff --git a/libs/apprise/cli.py b/libs/apprise/cli.py index 78a9853c2..4072a645b 100644 --- a/libs/apprise/cli.py +++ b/libs/apprise/cli.py @@ -43,7 +43,8 @@ from . import AppriseConfig from . import PersistentStore -from .utils import dir_size, bytes_to_str, parse_list, path_decode +from .utils.parse import parse_list +from .utils.disk import dir_size, bytes_to_str, path_decode from .common import NOTIFY_TYPES from .common import NOTIFY_FORMATS from .common import PERSISTENT_STORE_MODES @@ -68,6 +69,21 @@ DEFAULT_STORAGE_UID_LENGTH = \ int(os.environ.get('APPRISE_STORAGE_UID_LENGTH', 8)) +# Defines the envrionment variable to parse if defined. This is ONLY +# Referenced if: +# - No Configuration Files were found/loaded/specified +# - No URLs were provided directly into the CLI Call +DEFAULT_ENV_APPRISE_URLS = 'APPRISE_URLS' + +# Defines the over-ride path for the configuration files read +DEFAULT_ENV_APPRISE_CONFIG_PATH = 'APPRISE_CONFIG_PATH' + +# Defines the over-ride path for the plugins to load +DEFAULT_ENV_APPRISE_PLUGIN_PATH = 'APPRISE_PLUGIN_PATH' + +# Defines the over-ride path for the persistent storage +DEFAULT_ENV_APPRISE_STORAGE_PATH = 'APPRISE_STORAGE_PATH' + # Defines our click context settings adding -h to the additional options that # can be specified to get the help menu to come up CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) @@ -496,11 +512,53 @@ def main(ctx, body, title, config, attach, urls, notification_type, theme, tag, # issue. For consistency, we also return a 2 ctx.exit(2) - if not plugin_path: - # Prepare a default set of plugin path - plugin_path = \ - [path for path in DEFAULT_PLUGIN_PATHS - if exists(path_decode(path))] + # + # Apply Environment Over-rides if defined + # + _config_paths = DEFAULT_CONFIG_PATHS + if 'APPRISE_CONFIG' in os.environ: + # Deprecate (this was from previous versions of Apprise <= 1.9.1) + logger.deprecate( + 'APPRISE_CONFIG environment variable has been changed to ' + f'{DEFAULT_ENV_APPRISE_CONFIG_PATH}') + logger.debug( + 'Loading provided APPRISE_CONFIG (deprecated) environment ' + 'variable') + _config_paths = (os.environ.get('APPRISE_CONFIG', '').strip(), ) + + elif DEFAULT_ENV_APPRISE_CONFIG_PATH in os.environ: + logger.debug( + f'Loading provided {DEFAULT_ENV_APPRISE_CONFIG_PATH} ' + 'environment variable') + _config_paths = re.split( + r'[\r\n;]+', os.environ.get( + DEFAULT_ENV_APPRISE_CONFIG_PATH).strip()) + + _plugin_paths = DEFAULT_PLUGIN_PATHS + if DEFAULT_ENV_APPRISE_PLUGIN_PATH in os.environ: + logger.debug( + f'Loading provided {DEFAULT_ENV_APPRISE_PLUGIN_PATH} environment ' + 'variable') + _plugin_paths = re.split( + r'[\r\n;]+', os.environ.get( + DEFAULT_ENV_APPRISE_PLUGIN_PATH).strip()) + + if DEFAULT_ENV_APPRISE_STORAGE_PATH in os.environ: + logger.debug( + f'Loading provided {DEFAULT_ENV_APPRISE_STORAGE_PATH} environment ' + 'variable') + storage_path = \ + os.environ.get(DEFAULT_ENV_APPRISE_STORAGE_PATH).strip() + + # + # Continue with initialization process + # + + # Prepare a default set of plugin paths to scan; anything specified + # on the CLI always trumps + plugin_paths = \ + [path for path in _plugin_paths if exists(path_decode(path))] \ + if not plugin_path else plugin_path if storage_uid_length < 2: click.echo( @@ -533,7 +591,7 @@ def main(ctx, body, title, config, attach, urls, notification_type, theme, tag, async_mode=disable_async is not True, # Load our plugins - plugin_paths=plugin_path, + plugin_paths=plugin_paths, # Load our persistent storage path storage_path=path_decode(storage_path), @@ -636,8 +694,7 @@ def main(ctx, body, title, config, attach, urls, notification_type, theme, tag, # 1. URLs by command line # 2. Configuration by command line # 3. URLs by environment variable: APPRISE_URLS - # 4. Configuration by environment variable: APPRISE_CONFIG - # 5. Default Configuration File(s) (if found) + # 4. Default Configuration File(s) # elif urls and not storage_action: if tag: @@ -662,8 +719,10 @@ def main(ctx, body, title, config, attach, urls, notification_type, theme, tag, a.add(AppriseConfig( paths=config, asset=asset, recursion=recursion_depth)) - elif os.environ.get('APPRISE_URLS', '').strip(): - logger.debug('Loading provided APPRISE_URLS environment variable') + elif os.environ.get(DEFAULT_ENV_APPRISE_URLS, '').strip(): + logger.debug( + f'Loading provided {DEFAULT_ENV_APPRISE_URLS} environment ' + 'variable') if tag: # Ignore any tags specified logger.warning( @@ -671,19 +730,12 @@ def main(ctx, body, title, config, attach, urls, notification_type, theme, tag, tag = None # Attempt to use our APPRISE_URLS environment variable (if populated) - a.add(os.environ['APPRISE_URLS'].strip()) - - elif os.environ.get('APPRISE_CONFIG', '').strip(): - logger.debug('Loading provided APPRISE_CONFIG environment variable') - # Fall back to config environment variable (if populated) - a.add(AppriseConfig( - paths=os.environ['APPRISE_CONFIG'].strip(), - asset=asset, recursion=recursion_depth)) + a.add(os.environ[DEFAULT_ENV_APPRISE_URLS].strip()) else: # Load default configuration a.add(AppriseConfig( - paths=[f for f in DEFAULT_CONFIG_PATHS if isfile(path_decode(f))], + paths=[f for f in _config_paths if isfile(path_decode(f))], asset=asset, recursion=recursion_depth)) if not dry_run and not (a or storage_action): diff --git a/libs/apprise/config/base.py b/libs/apprise/config/base.py index 953cee394..03a4423a9 100644 --- a/libs/apprise/config/base.py +++ b/libs/apprise/config/base.py @@ -35,11 +35,8 @@ from .. import common from ..asset import AppriseAsset from ..url import URLBase -from ..utils import GET_SCHEMA_RE -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import parse_urls -from ..utils import cwe312_url +from ..utils.parse import GET_SCHEMA_RE, parse_list, parse_bool, parse_urls +from ..utils.cwe312 import cwe312_url from ..manager_config import ConfigurationManager from ..manager_plugins import NotificationManager diff --git a/libs/apprise/config/file.py b/libs/apprise/config/file.py index 9340f62bb..89224e2ea 100644 --- a/libs/apprise/config/file.py +++ b/libs/apprise/config/file.py @@ -29,7 +29,7 @@ import re import os from .base import ConfigBase -from ..utils import path_decode +from ..utils.disk import path_decode from ..common import ConfigFormat from ..common import ContentIncludeMode from ..locale import gettext_lazy as _ diff --git a/libs/apprise/decorators/base.py b/libs/apprise/decorators/base.py index 688fd96dc..e7cf7b666 100644 --- a/libs/apprise/decorators/base.py +++ b/libs/apprise/decorators/base.py @@ -29,10 +29,8 @@ from ..plugins.base import NotifyBase from ..manager_plugins import NotificationManager -from ..utils import URL_DETAILS_RE -from ..utils import parse_url -from ..utils import url_assembly -from ..utils import dict_full_update +from ..utils.parse import URL_DETAILS_RE, parse_url, url_assembly +from ..utils.logic import dict_full_update from .. import common from ..logger import logger import inspect diff --git a/libs/apprise/exception.py b/libs/apprise/exception.py index 40967f5aa..a11f28248 100644 --- a/libs/apprise/exception.py +++ b/libs/apprise/exception.py @@ -37,6 +37,14 @@ def __init__(self, message, error_code=0): self.error_code = error_code +class ApprisePluginException(AppriseException): + """ + Class object for handling exceptions raised from within a plugin + """ + def __init__(self, message, error_code=600): + super().__init__(message, error_code=error_code) + + class AppriseDiskIOError(AppriseException): """ Thrown when an disk i/o error occurs diff --git a/libs/apprise/i18n/en/LC_MESSAGES/apprise.mo b/libs/apprise/i18n/en/LC_MESSAGES/apprise.mo index d916aab40e3f164fffefe0be0e98480fd743b984..8eafd6512921d92a6af67b16334ee240e4b1db51 100644 GIT binary patch delta 14 Vcmew^_g!v7HaDZ$<{WNr762`z1i=6R delta 14 Vcmew^_g!v7HaDZ`<{WNr762`t1i%0Q diff --git a/libs/apprise/manager.py b/libs/apprise/manager.py index ab7f6c994..afc9c1a32 100644 --- a/libs/apprise/manager.py +++ b/libs/apprise/manager.py @@ -33,10 +33,10 @@ import hashlib import inspect import threading -from .utils import import_module -from .utils import Singleton -from .utils import parse_list -from .utils import path_decode +from .utils.module import import_module +from .utils.singleton import Singleton +from .utils.parse import parse_list +from .utils.disk import path_decode from os.path import dirname from os.path import abspath from os.path import join @@ -244,8 +244,10 @@ def load_modules(self, path=None, name=None, force=False): for schema in schemas: if schema in self._schema_map: logger.error( - "{} schema ({}) mismatch detected - {} to {}" - .format(self.name, schema, self._schema_map, + "{} schema ({}) mismatch detected -" + ' {} already maps to {}' + .format(self.name, schema, + self._schema_map[schema], plugin)) continue diff --git a/libs/apprise/persistent_store.py b/libs/apprise/persistent_store.py index ca7048517..6151beb5e 100644 --- a/libs/apprise/persistent_store.py +++ b/libs/apprise/persistent_store.py @@ -37,7 +37,7 @@ import time import hashlib from .common import PersistentStoreMode, PERSISTENT_STORE_MODES -from .utils import path_decode +from .utils.disk import path_decode from .logger import logger # Used for writing/reading time stored in cache file diff --git a/libs/apprise/plugins/__init__.py b/libs/apprise/plugins/__init__.py index bfce14371..62ddeaa5f 100644 --- a/libs/apprise/plugins/__init__.py +++ b/libs/apprise/plugins/__init__.py @@ -36,9 +36,8 @@ from ..common import NOTIFY_IMAGE_SIZES from ..common import NotifyType from ..common import NOTIFY_TYPES -from ..utils import parse_list -from ..utils import cwe312_url -from ..utils import GET_SCHEMA_RE +from ..utils.cwe312 import cwe312_url +from ..utils.parse import parse_list, GET_SCHEMA_RE from ..logger import logger from ..locale import gettext_lazy as _ from ..locale import LazyTranslation diff --git a/libs/apprise/plugins/africas_talking.py b/libs/apprise/plugins/africas_talking.py index af8a78577..98b2a208e 100644 --- a/libs/apprise/plugins/africas_talking.py +++ b/libs/apprise/plugins/africas_talking.py @@ -35,10 +35,8 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_bool -from ..utils import parse_phone_no -from ..utils import validate_regex +from ..utils.parse import ( + is_phone_no, parse_bool, parse_phone_no, validate_regex) from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/apprise_api.py b/libs/apprise/plugins/apprise_api.py index d6156438f..bd1177930 100644 --- a/libs/apprise/plugins/apprise_api.py +++ b/libs/apprise/plugins/apprise_api.py @@ -34,8 +34,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/aprs.py b/libs/apprise/plugins/aprs.py index d87025fee..d3c9dc1a2 100644 --- a/libs/apprise/plugins/aprs.py +++ b/libs/apprise/plugins/aprs.py @@ -74,8 +74,7 @@ from ..locale import gettext_lazy as _ from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_call_sign -from ..utils import parse_call_sign +from ..utils.parse import is_call_sign, parse_call_sign from .. import __version__ import re diff --git a/libs/apprise/plugins/bark.py b/libs/apprise/plugins/bark.py index e676e0c31..0e415a290 100644 --- a/libs/apprise/plugins/bark.py +++ b/libs/apprise/plugins/bark.py @@ -36,8 +36,7 @@ from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_list -from ..utils import parse_bool +from ..utils.parse import parse_list, parse_bool from ..locale import gettext_lazy as _ @@ -89,11 +88,14 @@ class NotifyBarkLevel: PASSIVE = 'passive' + CRITICAL = 'critical' + BARK_LEVELS = ( NotifyBarkLevel.ACTIVE, NotifyBarkLevel.TIME_SENSITIVE, NotifyBarkLevel.PASSIVE, + NotifyBarkLevel.CRITICAL, ) @@ -178,6 +180,12 @@ class NotifyBark(NotifyBase): 'type': 'choice:string', 'values': BARK_LEVELS, }, + 'volume': { + 'name': _('Volume'), + 'type': 'int', + 'min': 0, + 'max': 10, + }, 'click': { 'name': _('Click'), 'type': 'string', @@ -205,7 +213,7 @@ class NotifyBark(NotifyBase): def __init__(self, targets=None, include_image=True, sound=None, category=None, group=None, level=None, click=None, - badge=None, **kwargs): + badge=None, volume=None, **kwargs): """ Initialize Notify Bark Object """ @@ -260,6 +268,19 @@ def __init__(self, targets=None, include_image=True, sound=None, self.logger.warning( 'The specified Bark sound ({}) was not found ', sound) + # Volume + self.volume = None + if volume is not None: + try: + self.volume = int(volume) if volume is not None else None + if self.volume is not None and not (0 <= self.volume <= 10): + raise ValueError() + + except (TypeError, ValueError): + self.logger.warning( + 'The specified Bark volume ({}) is not valid. ' + 'Must be between 0 and 10', volume) + # Level self.level = None if not level else next( (f for f in BARK_LEVELS if f[0] == level[0]), None) @@ -330,6 +351,9 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): if self.group: payload['group'] = self.group + if self.volume: + payload['volume'] = self.volume + auth = None if self.user: auth = (self.user, self.password) @@ -429,6 +453,9 @@ def url(self, privacy=False, *args, **kwargs): if self.level: params['level'] = self.level + if self.volume: + params['volume'] = str(self.volume) + if self.category: params['category'] = self.category @@ -502,6 +529,11 @@ def parse_url(url): results['badge'] = NotifyBark.unquote( results['qsd']['badge'].strip()) + # Volume + if 'volume' in results['qsd'] and results['qsd']['volume']: + results['volume'] = NotifyBark.unquote( + results['qsd']['volume'].strip()) + # Level if 'level' in results['qsd'] and results['qsd']['level']: results['level'] = NotifyBark.unquote( diff --git a/libs/apprise/plugins/base.py b/libs/apprise/plugins/base.py index 1c490defa..b7f774423 100644 --- a/libs/apprise/plugins/base.py +++ b/libs/apprise/plugins/base.py @@ -32,7 +32,7 @@ from ..url import URLBase from ..common import NotifyType -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..common import NOTIFY_TYPES from ..common import NotifyFormat from ..common import NOTIFY_FORMATS diff --git a/libs/apprise/plugins/boxcar.py b/libs/apprise/plugins/boxcar.py deleted file mode 100644 index f7f16b04a..000000000 --- a/libs/apprise/plugins/boxcar.py +++ /dev/null @@ -1,404 +0,0 @@ -# -*- coding: utf-8 -*- -# BSD 2-Clause License -# -# Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> -# -# 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. -# -# 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. - -import re -import requests -import hmac -from json import dumps -from time import time -from hashlib import sha1 -from itertools import chain -from urllib.parse import urlparse - -from .base import NotifyBase -from ..url import PrivacyMode -from ..utils import parse_bool -from ..utils import parse_list -from ..utils import validate_regex -from ..common import NotifyType -from ..common import NotifyImageSize -from ..locale import gettext_lazy as _ - -# Default to sending to all devices if nothing is specified -DEFAULT_TAG = '@all' - -# The tags value is an structure containing an array of strings defining the -# list of tagged devices that the notification need to be send to, and a -# boolean operator (‘and’ / ‘or’) that defines the criteria to match devices -# against those tags. -IS_TAG = re.compile(r'^[@]?(?P<name>[A-Z0-9]{1,63})$', re.I) - -# Device tokens are only referenced when developing. -# It's not likely you'll send a message directly to a device, but if you do; -# this plugin supports it. -IS_DEVICETOKEN = re.compile(r'^[A-Z0-9]{64}$', re.I) - -# Used to break apart list of potential tags by their delimiter into a useable -# list. -TAGS_LIST_DELIM = re.compile(r'[ \t\r\n,\\/]+') - - -class NotifyBoxcar(NotifyBase): - """ - A wrapper for Boxcar Notifications - """ - - # The default descriptive name associated with the Notification - service_name = 'Boxcar' - - # The services URL - service_url = 'https://boxcar.io/' - - # All boxcar notifications are secure - secure_protocol = 'boxcar' - - # A URL that takes you to the setup/help of the specific protocol - setup_url = 'https://github.com/caronc/apprise/wiki/Notify_boxcar' - - # Boxcar URL - notify_url = 'https://boxcar-api.io/api/push/' - - # Allows the user to specify the NotifyImageSize object - image_size = NotifyImageSize.XY_72 - - # The maximum allowable characters allowed in the body per message - body_maxlen = 10000 - - # Define object templates - templates = ( - '{schema}://{access_key}/{secret_key}/', - '{schema}://{access_key}/{secret_key}/{targets}', - ) - - # Define our template tokens - template_tokens = dict(NotifyBase.template_tokens, **{ - 'access_key': { - 'name': _('Access Key'), - 'type': 'string', - 'private': True, - 'required': True, - 'regex': (r'^[A-Z0-9_-]{64}$', 'i'), - 'map_to': 'access', - }, - 'secret_key': { - 'name': _('Secret Key'), - 'type': 'string', - 'private': True, - 'required': True, - 'regex': (r'^[A-Z0-9_-]{64}$', 'i'), - 'map_to': 'secret', - }, - 'target_tag': { - 'name': _('Target Tag ID'), - 'type': 'string', - 'prefix': '@', - 'regex': (r'^[A-Z0-9]{1,63}$', 'i'), - 'map_to': 'targets', - }, - 'target_device': { - 'name': _('Target Device ID'), - 'type': 'string', - 'regex': (r'^[A-Z0-9]{64}$', 'i'), - 'map_to': 'targets', - }, - 'targets': { - 'name': _('Targets'), - 'type': 'list:string', - }, - }) - - # Define our template arguments - template_args = dict(NotifyBase.template_args, **{ - 'image': { - 'name': _('Include Image'), - 'type': 'bool', - 'default': True, - 'map_to': 'include_image', - }, - 'to': { - 'alias_of': 'targets', - }, - 'access': { - 'alias_of': 'access_key', - }, - 'secret': { - 'alias_of': 'secret_key', - }, - }) - - def __init__(self, access, secret, targets=None, include_image=True, - **kwargs): - """ - Initialize Boxcar Object - """ - super().__init__(**kwargs) - - # Initialize tag list - self._tags = list() - - # Initialize device_token list - self.device_tokens = list() - - # Access Key (associated with project) - self.access = validate_regex( - access, *self.template_tokens['access_key']['regex']) - if not self.access: - msg = 'An invalid Boxcar Access Key ' \ - '({}) was specified.'.format(access) - self.logger.warning(msg) - raise TypeError(msg) - - # Secret Key (associated with project) - self.secret = validate_regex( - secret, *self.template_tokens['secret_key']['regex']) - if not self.secret: - msg = 'An invalid Boxcar Secret Key ' \ - '({}) was specified.'.format(secret) - self.logger.warning(msg) - raise TypeError(msg) - - if not targets: - self._tags.append(DEFAULT_TAG) - targets = [] - - # Validate targets and drop bad ones: - for target in parse_list(targets): - result = IS_TAG.match(target) - if result: - # store valid tag/alias - self._tags.append(result.group('name')) - continue - - result = IS_DEVICETOKEN.match(target) - if result: - # store valid device - self.device_tokens.append(target) - continue - - self.logger.warning( - 'Dropped invalid tag/alias/device_token ' - '({}) specified.'.format(target), - ) - - # Track whether or not we want to send an image with our notification - # or not. - self.include_image = include_image - - return - - def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): - """ - Perform Boxcar Notification - """ - headers = { - 'User-Agent': self.app_id, - 'Content-Type': 'application/json' - } - - # prepare Boxcar Object - payload = { - 'aps': { - 'badge': 'auto', - 'alert': '', - }, - 'expires': str(int(time() + 30)), - } - - if title: - payload['aps']['@title'] = title - - payload['aps']['alert'] = body - - if self._tags: - payload['tags'] = {'or': self._tags} - - if self.device_tokens: - payload['device_tokens'] = self.device_tokens - - # Source picture should be <= 450 DP wide, ~2:1 aspect. - image_url = None if not self.include_image \ - else self.image_url(notify_type) - - if image_url: - # Set our image - payload['@img'] = image_url - - # Acquire our hostname - host = urlparse(self.notify_url).hostname - - # Calculate signature. - str_to_sign = "%s\n%s\n%s\n%s" % ( - "POST", host, "/api/push", dumps(payload)) - - h = hmac.new( - bytearray(self.secret, 'utf-8'), - bytearray(str_to_sign, 'utf-8'), - sha1, - ) - - params = NotifyBoxcar.urlencode({ - "publishkey": self.access, - "signature": h.hexdigest(), - }) - - notify_url = '%s?%s' % (self.notify_url, params) - self.logger.debug('Boxcar POST URL: %s (cert_verify=%r)' % ( - notify_url, self.verify_certificate, - )) - self.logger.debug('Boxcar Payload: %s' % str(payload)) - - # Always call throttle before any remote server i/o is made - self.throttle() - - try: - r = requests.post( - notify_url, - data=dumps(payload), - headers=headers, - verify=self.verify_certificate, - timeout=self.request_timeout, - ) - - # Boxcar returns 201 (Created) when successful - if r.status_code != requests.codes.created: - # We had a problem - status_str = \ - NotifyBoxcar.http_response_code_lookup(r.status_code) - - self.logger.warning( - 'Failed to send Boxcar notification: ' - '{}{}error={}.'.format( - status_str, - ', ' if status_str else '', - r.status_code)) - - self.logger.debug('Response Details:\r\n{}'.format(r.content)) - - # Return; we're done - return False - - else: - self.logger.info('Sent Boxcar notification.') - - except requests.RequestException as e: - self.logger.warning( - 'A Connection error occurred sending Boxcar ' - 'notification to %s.' % (host)) - - self.logger.debug('Socket Exception: %s' % str(e)) - - # Return; we're done - return False - - return True - - def url(self, privacy=False, *args, **kwargs): - """ - Returns the URL built dynamically based on specified arguments. - """ - - # Define any URL parameters - params = { - 'image': 'yes' if self.include_image else 'no', - } - - # Extend our parameters - params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) - - return '{schema}://{access}/{secret}/{targets}?{params}'.format( - schema=self.secure_protocol, - access=self.pprint(self.access, privacy, safe=''), - secret=self.pprint( - self.secret, privacy, mode=PrivacyMode.Secret, safe=''), - targets='/'.join([ - NotifyBoxcar.quote(x, safe='') for x in chain( - self._tags, self.device_tokens) if x != DEFAULT_TAG]), - params=NotifyBoxcar.urlencode(params), - ) - - @property - def url_identifier(self): - """ - Returns all of the identifiers that make this URL unique from - another simliar one. Targets or end points should never be identified - here. - """ - return (self.secure_protocol, self.access, self.secret) - - def __len__(self): - """ - Returns the number of targets associated with this notification - """ - targets = len(self._tags) + len(self.device_tokens) - # DEFAULT_TAG is set if no tokens/tags are otherwise set - return targets if targets > 0 else 1 - - @staticmethod - def parse_url(url): - """ - Parses the URL and returns it broken apart into a dictionary. - - """ - results = NotifyBase.parse_url(url, verify_host=False) - if not results: - # We're done early - return None - - # The first token is stored in the hostname - results['access'] = NotifyBoxcar.unquote(results['host']) - - # Get our entries; split_path() looks after unquoting content for us - # by default - entries = NotifyBoxcar.split_path(results['fullpath']) - - # Now fetch the remaining tokens - results['secret'] = entries.pop(0) if entries else None - - # Our recipients make up the remaining entries of our array - results['targets'] = entries - - # The 'to' makes it easier to use yaml configuration - if 'to' in results['qsd'] and len(results['qsd']['to']): - results['targets'] += \ - NotifyBoxcar.parse_list(results['qsd'].get('to')) - - # Access - if 'access' in results['qsd'] and results['qsd']['access']: - results['access'] = NotifyBoxcar.unquote( - results['qsd']['access'].strip()) - - # Secret - if 'secret' in results['qsd'] and results['qsd']['secret']: - results['secret'] = NotifyBoxcar.unquote( - results['qsd']['secret'].strip()) - - # Include images with our message - results['include_image'] = \ - parse_bool(results['qsd'].get('image', True)) - - return results diff --git a/libs/apprise/plugins/bulksms.py b/libs/apprise/plugins/bulksms.py index f53f61267..ce0daef49 100644 --- a/libs/apprise/plugins/bulksms.py +++ b/libs/apprise/plugins/bulksms.py @@ -39,9 +39,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import parse_bool +from ..utils.parse import is_phone_no, parse_phone_no, parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/bulkvs.py b/libs/apprise/plugins/bulkvs.py index a02d8ab8c..14a1369ed 100644 --- a/libs/apprise/plugins/bulkvs.py +++ b/libs/apprise/plugins/bulkvs.py @@ -38,9 +38,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import parse_bool +from ..utils.parse import is_phone_no, parse_phone_no, parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/burstsms.py b/libs/apprise/plugins/burstsms.py index 3b6f2669a..898f98641 100644 --- a/libs/apprise/plugins/burstsms.py +++ b/libs/apprise/plugins/burstsms.py @@ -36,10 +36,8 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import ( + is_phone_no, parse_phone_no, parse_bool, validate_regex) from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/chantify.py b/libs/apprise/plugins/chantify.py index e7c5f63e9..e9be66161 100644 --- a/libs/apprise/plugins/chantify.py +++ b/libs/apprise/plugins/chantify.py @@ -37,7 +37,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/clicksend.py b/libs/apprise/plugins/clicksend.py index 7f28ac913..92a2405e0 100644 --- a/libs/apprise/plugins/clicksend.py +++ b/libs/apprise/plugins/clicksend.py @@ -45,9 +45,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import parse_bool +from ..utils.parse import is_phone_no, parse_phone_no, parse_bool from ..locale import gettext_lazy as _ # Extend HTTP Error Messages diff --git a/libs/apprise/plugins/d7networks.py b/libs/apprise/plugins/d7networks.py index ff2e31b05..8b35458d5 100644 --- a/libs/apprise/plugins/d7networks.py +++ b/libs/apprise/plugins/d7networks.py @@ -41,10 +41,8 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import validate_regex -from ..utils import parse_bool +from ..utils.parse import ( + is_phone_no, parse_phone_no, validate_regex, parse_bool) from ..locale import gettext_lazy as _ # Extend HTTP Error Messages diff --git a/libs/apprise/plugins/dapnet.py b/libs/apprise/plugins/dapnet.py index 725174c14..2d25759eb 100644 --- a/libs/apprise/plugins/dapnet.py +++ b/libs/apprise/plugins/dapnet.py @@ -55,10 +55,8 @@ from ..locale import gettext_lazy as _ from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_call_sign -from ..utils import parse_call_sign -from ..utils import parse_list -from ..utils import parse_bool +from ..utils.parse import ( + is_call_sign, parse_call_sign, parse_list, parse_bool) class DapnetPriority: diff --git a/libs/apprise/plugins/dbus.py b/libs/apprise/plugins/dbus.py index 9a22a85f8..5d99c7e0e 100644 --- a/libs/apprise/plugins/dbus.py +++ b/libs/apprise/plugins/dbus.py @@ -30,7 +30,7 @@ from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..locale import gettext_lazy as _ # Default our global support flag diff --git a/libs/apprise/plugins/dingtalk.py b/libs/apprise/plugins/dingtalk.py index e675f5302..2380d2e0a 100644 --- a/libs/apprise/plugins/dingtalk.py +++ b/libs/apprise/plugins/dingtalk.py @@ -38,8 +38,7 @@ from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ # Register at https://dingtalk.com diff --git a/libs/apprise/plugins/discord.py b/libs/apprise/plugins/discord.py index e41e22cdc..d2eb7541d 100644 --- a/libs/apprise/plugins/discord.py +++ b/libs/apprise/plugins/discord.py @@ -54,8 +54,7 @@ from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import NotifyType -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_bool, validate_regex from ..locale import gettext_lazy as _ from ..attachment.base import AttachBase diff --git a/libs/apprise/plugins/email/__init__.py b/libs/apprise/plugins/email/__init__.py new file mode 100644 index 000000000..31afabcab --- /dev/null +++ b/libs/apprise/plugins/email/__init__.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. + +from email import charset + +from .base import NotifyEmail +from .common import ( + AppriseEmailException, EmailMessage, SecureMailMode, SECURE_MODES, + WebBaseLogin) +from .templates import EMAIL_TEMPLATES + +# Globally Default encoding mode set to Quoted Printable. +charset.add_charset('utf-8', charset.QP, charset.QP, 'utf-8') + +__all__ = [ + # Reference + 'NotifyEmail', + + # Pretty Good Privacy + 'ApprisePGPController', 'ApprisePGPException', + + # Other + 'AppriseEmailException', 'EmailMessage', 'SecureMailMode', 'SECURE_MODES', + 'WebBaseLogin', + + # Additional entries that may be useful to some developers + 'EMAIL_TEMPLATES', 'PGP_SUPPORT', +] diff --git a/libs/apprise/plugins/email.py b/libs/apprise/plugins/email/base.py similarity index 67% rename from libs/apprise/plugins/email.py rename to libs/apprise/plugins/email/base.py index 2e423916a..7f29fa26c 100644 --- a/libs/apprise/plugins/email.py +++ b/libs/apprise/plugins/email/base.py @@ -26,312 +26,32 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -import dataclasses import re import smtplib -import typing as t from email.mime.text import MIMEText from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart +from email.mime.base import MIMEBase from email.utils import formataddr, make_msgid from email.header import Header -from email import charset from socket import error as SocketError from datetime import datetime from datetime import timezone -from .base import NotifyBase -from ..url import PrivacyMode -from ..common import NotifyFormat, NotifyType -from ..conversion import convert_between -from ..utils import is_ipaddr, is_email, parse_emails, is_hostname -from ..locale import gettext_lazy as _ -from ..logger import logger - -# Globally Default encoding mode set to Quoted Printable. -charset.add_charset('utf-8', charset.QP, charset.QP, 'utf-8') - - -class WebBaseLogin: - """ - This class is just used in conjunction of the default emailers - to best formulate a login to it using the data detected - """ - # User Login must be Email Based - EMAIL = 'Email' - - # User Login must UserID Based - USERID = 'UserID' - - -# Secure Email Modes -class SecureMailMode: - INSECURE = "insecure" - SSL = "ssl" - STARTTLS = "starttls" - - -# Define all of the secure modes (used during validation) -SECURE_MODES = { - SecureMailMode.STARTTLS: { - 'default_port': 587, - }, - SecureMailMode.SSL: { - 'default_port': 465, - }, - SecureMailMode.INSECURE: { - 'default_port': 25, - }, -} - -# To attempt to make this script stupid proof, if we detect an email address -# that is part of the this table, we can pre-use a lot more defaults if they -# aren't otherwise specified on the users input. -EMAIL_TEMPLATES = ( - # Google GMail - ( - 'Google Mail', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>gmail\.com)$', re.I), - { - 'port': 587, - 'smtp_host': 'smtp.gmail.com', - 'secure': True, - 'secure_mode': SecureMailMode.STARTTLS, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Yandex - ( - 'Yandex', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>yandex\.(com|ru|ua|by|kz|uz|tr|fr))$', re.I), - { - 'port': 465, - 'smtp_host': 'smtp.yandex.ru', - 'secure': True, - 'secure_mode': SecureMailMode.SSL, - 'login_type': (WebBaseLogin.USERID, ) - }, - ), - - # Microsoft Hotmail - ( - 'Microsoft Hotmail', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>(hotmail|live)\.com(\.au)?)$', re.I), - { - 'port': 587, - 'smtp_host': 'smtp-mail.outlook.com', - 'secure': True, - 'secure_mode': SecureMailMode.STARTTLS, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Microsoft Outlook - ( - 'Microsoft Outlook', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>(smtp\.)?outlook\.com(\.au)?)$', re.I), - { - 'port': 587, - 'smtp_host': 'smtp.outlook.com', - 'secure': True, - 'secure_mode': SecureMailMode.STARTTLS, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Microsoft Office 365 (Email Server) - # You must specify an authenticated sender address in the from= settings - # and a valid email in the to= to deliver your emails to - ( - 'Microsoft Office 365', - re.compile( - r'^[^@]+@(?P<domain>(smtp\.)?office365\.com)$', re.I), - { - 'port': 587, - 'smtp_host': 'smtp.office365.com', - 'secure': True, - 'secure_mode': SecureMailMode.STARTTLS, - }, - ), - - # Yahoo Mail - ( - 'Yahoo Mail', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>yahoo\.(ca|com))$', re.I), - { - 'port': 465, - 'smtp_host': 'smtp.mail.yahoo.com', - 'secure': True, - 'secure_mode': SecureMailMode.STARTTLS, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Fast Mail (Series 1) - ( - 'Fast Mail', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>fastmail\.(com|cn|co\.uk|com\.au|de|es|fm|fr|im|' - r'in|jp|mx|net|nl|org|se|to|tw|uk|us))$', re.I), - { - 'port': 465, - 'smtp_host': 'smtp.fastmail.com', - 'secure': True, - 'secure_mode': SecureMailMode.SSL, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Fast Mail (Series 2) - ( - 'Fast Mail Extended Addresses', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>123mail\.org|airpost\.net|eml\.cc|fmail\.co\.uk|' - r'fmgirl\.com|fmguy\.com|mailbolt\.com|mailcan\.com|' - r'mailhaven\.com|mailmight\.com|ml1\.net|mm\.st|myfastmail\.com|' - r'proinbox\.com|promessage\.com|rushpost\.com|sent\.(as|at|com)|' - r'speedymail\.org|warpmail\.net|xsmail\.com|150mail\.com|' - r'150ml\.com|16mail\.com|2-mail\.com|4email\.net|50mail\.com|' - r'allmail\.net|bestmail\.us|cluemail\.com|elitemail\.org|' - r'emailcorner\.net|emailengine\.(net|org)|emailgroups\.net|' - r'emailplus\.org|emailuser\.net|f-m\.fm|fast-email\.com|' - r'fast-mail\.org|fastem\.com|fastemail\.us|fastemailer\.com|' - r'fastest\.cc|fastimap\.com|fastmailbox\.net|fastmessaging\.com|' - r'fea\.st|fmailbox\.com|ftml\.net|h-mail\.us|hailmail\.net|' - r'imap-mail\.com|imap\.cc|imapmail\.org|inoutbox\.com|' - r'internet-e-mail\.com|internet-mail\.org|internetemails\.net|' - r'internetmailing\.net|jetemail\.net|justemail\.net|' - r'letterboxes\.org|mail-central\.com|mail-page\.com|' - r'mailandftp\.com|mailas\.com|mailc\.net|mailforce\.net|' - r'mailftp\.com|mailingaddress\.org|mailite\.com|mailnew\.com|' - r'mailsent\.net|mailservice\.ms|mailup\.net|mailworks\.org|' - r'mymacmail\.com|nospammail\.net|ownmail\.net|petml\.com|' - r'postinbox\.com|postpro\.net|realemail\.net|reallyfast\.biz|' - r'reallyfast\.info|speedpost\.net|ssl-mail\.com|swift-mail\.com|' - r'the-fastest\.net|the-quickest\.com|theinternetemail\.com|' - r'veryfast\.biz|veryspeedy\.net|yepmail\.net)$', re.I), - { - 'port': 465, - 'smtp_host': 'smtp.fastmail.com', - 'secure': True, - 'secure_mode': SecureMailMode.SSL, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Zoho Mail (Free) - ( - 'Zoho Mail', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>zoho(mail)?\.com)$', re.I), - { - 'port': 587, - 'smtp_host': 'smtp.zoho.com', - 'secure': True, - 'secure_mode': SecureMailMode.STARTTLS, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # SendGrid (Email Server) - # You must specify an authenticated sender address in the from= settings - # and a valid email in the to= to deliver your emails to - ( - 'SendGrid', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>(\.smtp)?sendgrid\.(com|net))$', re.I), - { - 'port': 465, - 'smtp_host': 'smtp.sendgrid.net', - 'secure': True, - 'secure_mode': SecureMailMode.SSL, - 'login_type': (WebBaseLogin.USERID, ) - }, - ), - - # 163.com - ( - '163.com', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>163\.com)$', re.I), - { - 'port': 465, - 'smtp_host': 'smtp.163.com', - 'secure': True, - 'secure_mode': SecureMailMode.SSL, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Foxmail.com - ( - 'Foxmail.com', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>(foxmail|qq)\.com)$', re.I), - { - 'port': 587, - 'smtp_host': 'smtp.qq.com', - 'secure': True, - 'secure_mode': SecureMailMode.STARTTLS, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Comcast.net - ( - 'Comcast.net', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>(comcast)\.net)$', re.I), - { - 'port': 465, - 'smtp_host': 'smtp.comcast.net', - 'secure': True, - 'secure_mode': SecureMailMode.SSL, - 'login_type': (WebBaseLogin.EMAIL, ) - }, - ), - - # Catch All - ( - 'Custom', - re.compile( - r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' - r'(?P<domain>.+)$', re.I), - { - # Setting smtp_host to None is a way of - # auto-detecting it based on other parameters - # specified. There is no reason to ever modify - # this Catch All - 'smtp_host': None, - }, - ), -) - - -@dataclasses.dataclass -class EmailMessage: - recipient: str - to_addrs: t.List[str] - body: str +from ..base import NotifyBase +from ...url import PrivacyMode +from ...common import NotifyFormat, NotifyType +from ...conversion import convert_between +from ...utils import pgp as _pgp +from ...utils.parse import ( + is_ipaddr, is_email, parse_emails, is_hostname, parse_bool) +from ...locale import gettext_lazy as _ +from ...logger import logger +from .common import ( + AppriseEmailException, EmailMessage, SecureMailMode, SECURE_MODES, + WebBaseLogin) +from . import templates class NotifyEmail(NotifyBase): @@ -451,6 +171,20 @@ class NotifyEmail(NotifyBase): 'type': 'list:string', 'map_to': 'reply_to', }, + 'pgp': { + 'name': _('PGP Encryption'), + 'type': 'bool', + 'map_to': 'use_pgp', + 'default': False, + }, + 'pgpkey': { + 'name': _('PGP Public Key Path'), + 'type': 'string', + 'private': True, + # By default persistent storage is referenced + 'default': '', + 'map_to': 'pgp_key', + }, }) # Define any kwargs we're using @@ -463,7 +197,7 @@ class NotifyEmail(NotifyBase): def __init__(self, smtp_host=None, from_addr=None, secure_mode=None, targets=None, cc=None, bcc=None, reply_to=None, headers=None, - **kwargs): + use_pgp=None, pgp_key=None, **kwargs): """ Initialize Email Object @@ -564,7 +298,7 @@ def __init__(self, smtp_host=None, from_addr=None, secure_mode=None, ) # Apply any defaults based on certain known configurations - self.NotifyEmailDefaults(secure_mode=secure_mode, **kwargs) + self.apply_email_defaults(secure_mode=secure_mode, **kwargs) if self.user: if self.host: @@ -635,9 +369,25 @@ def __init__(self, smtp_host=None, from_addr=None, secure_mode=None, if not self.smtp_host: self.smtp_host = self.host + # Prepare our Pretty Good Privacy Object + self.pgp = _pgp.ApprisePGPController( + path=self.store.path, pub_keyfile=pgp_key, + email=self.from_addr[1], asset=self.asset) + + # We store so we can generate a URL later on + self.pgp_key = pgp_key + + self.use_pgp = use_pgp if not None \ + else self.template_args['pgp']['default'] + + if self.use_pgp and not _pgp.PGP_SUPPORT: + self.logger.warning( + 'PGP Support is not available on this installation; ' + 'ask admin to install PGPy') + return - def NotifyEmailDefaults(self, secure_mode=None, port=None, **kwargs): + def apply_email_defaults(self, secure_mode=None, port=None, **kwargs): """ A function that prefills defaults based on the email it was provided. @@ -656,39 +406,40 @@ def NotifyEmailDefaults(self, secure_mode=None, port=None, **kwargs): self.host, ) - for i in range(len(EMAIL_TEMPLATES)): # pragma: no branch + for i in range(len(templates.EMAIL_TEMPLATES)): # pragma: no branch self.logger.trace('Scanning %s against %s' % ( - from_addr, EMAIL_TEMPLATES[i][0] + from_addr, templates.EMAIL_TEMPLATES[i][0] )) - match = EMAIL_TEMPLATES[i][1].match(from_addr) + match = templates.EMAIL_TEMPLATES[i][1].match(from_addr) if match: self.logger.info( 'Applying %s Defaults' % - EMAIL_TEMPLATES[i][0], + templates.EMAIL_TEMPLATES[i][0], ) # the secure flag can not be altered if defined in the template - self.secure = EMAIL_TEMPLATES[i][2]\ + self.secure = templates.EMAIL_TEMPLATES[i][2]\ .get('secure', self.secure) # The SMTP Host check is already done above; if it was # specified we wouldn't even reach this part of the code. - self.smtp_host = EMAIL_TEMPLATES[i][2]\ + self.smtp_host = templates.EMAIL_TEMPLATES[i][2]\ .get('smtp_host', self.smtp_host) # The following can be over-ridden if defined manually in the # Apprise URL. Otherwise they take on the template value if not port: - self.port = EMAIL_TEMPLATES[i][2]\ + self.port = templates.EMAIL_TEMPLATES[i][2]\ .get('port', self.port) if not secure_mode: - self.secure_mode = EMAIL_TEMPLATES[i][2]\ + self.secure_mode = templates.EMAIL_TEMPLATES[i][2]\ .get('secure_mode', self.secure_mode) # Adjust email login based on the defined usertype. If no entry # was specified, then we default to having them all set (which # basically implies that there are no restrictions and use use # whatever was specified) - login_type = EMAIL_TEMPLATES[i][2].get('login_type', []) + login_type = \ + templates.EMAIL_TEMPLATES[i][2].get('login_type', []) if login_type: # only apply additional logic to our user if a login_type # was specified. @@ -709,157 +460,14 @@ def NotifyEmailDefaults(self, secure_mode=None, port=None, **kwargs): break - def _get_charset(self, input_string): - """ - Get utf-8 charset if non ascii string only - - Encode an ascii string to utf-8 is bad for email deliverability - because some anti-spam gives a bad score for that - like SUBJ_EXCESS_QP flag on Rspamd - """ - if not input_string: - return None - return 'utf-8' if not all(ord(c) < 128 for c in input_string) else None - def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, **kwargs): - """ - Perform Email Notification - """ if not self.targets: # There is no one to email; we're done - self.logger.warning( - 'There are no Email recipients to notify') + logger.warning('There are no Email recipients to notify') return False - messages: t.List[EmailMessage] = [] - - # Create a copy of the targets list - emails = list(self.targets) - while len(emails): - # Get our email to notify - to_name, to_addr = emails.pop(0) - - # Strip target out of cc list if in To or Bcc - cc = (self.cc - self.bcc - set([to_addr])) - - # Strip target out of bcc list if in To - bcc = (self.bcc - set([to_addr])) - - # Strip target out of reply_to list if in To - reply_to = (self.reply_to - set([to_addr])) - - # Format our cc addresses to support the Name field - cc = [formataddr( - (self.names.get(addr, False), addr), charset='utf-8') - for addr in cc] - - # Format our bcc addresses to support the Name field - bcc = [formataddr( - (self.names.get(addr, False), addr), charset='utf-8') - for addr in bcc] - - if reply_to: - # Format our reply-to addresses to support the Name field - reply_to = [formataddr( - (self.names.get(addr, False), addr), charset='utf-8') - for addr in reply_to] - - self.logger.debug( - 'Email From: {}'.format( - formataddr(self.from_addr, charset='utf-8'))) - - self.logger.debug('Email To: {}'.format(to_addr)) - if cc: - self.logger.debug('Email Cc: {}'.format(', '.join(cc))) - if bcc: - self.logger.debug('Email Bcc: {}'.format(', '.join(bcc))) - if reply_to: - self.logger.debug( - 'Email Reply-To: {}'.format(', '.join(reply_to)) - ) - self.logger.debug('Login ID: {}'.format(self.user)) - self.logger.debug( - 'Delivery: {}:{}'.format(self.smtp_host, self.port)) - - # Prepare Email Message - if self.notify_format == NotifyFormat.HTML: - base = MIMEMultipart("alternative") - base.attach(MIMEText( - convert_between( - NotifyFormat.HTML, NotifyFormat.TEXT, body), - 'plain', 'utf-8') - ) - base.attach(MIMEText(body, 'html', 'utf-8')) - else: - base = MIMEText(body, 'plain', 'utf-8') - - if attach and self.attachment_support: - mixed = MIMEMultipart("mixed") - mixed.attach(base) - # Now store our attachments - for no, attachment in enumerate(attach, start=1): - if not attachment: - # We could not load the attachment; take an early - # exit since this isn't what the end user wanted - - # We could not access the attachment - self.logger.error( - 'Could not access attachment {}.'.format( - attachment.url(privacy=True))) - - return False - - self.logger.debug( - 'Preparing Email attachment {}'.format( - attachment.url(privacy=True))) - - with open(attachment.path, "rb") as abody: - app = MIMEApplication(abody.read()) - app.set_type(attachment.mimetype) - - # Prepare our attachment name - filename = attachment.name \ - if attachment.name else f'file{no:03}.dat' - - app.add_header( - 'Content-Disposition', - 'attachment; filename="{}"'.format( - Header(filename, 'utf-8')), - ) - mixed.attach(app) - base = mixed - - # Apply any provided custom headers - for k, v in self.headers.items(): - base[k] = Header(v, self._get_charset(v)) - - base['Subject'] = Header(title, self._get_charset(title)) - base['From'] = formataddr(self.from_addr, charset='utf-8') - base['To'] = formataddr((to_name, to_addr), charset='utf-8') - base['Message-ID'] = make_msgid(domain=self.smtp_host) - base['Date'] = \ - datetime.now(timezone.utc)\ - .strftime("%a, %d %b %Y %H:%M:%S +0000") - base['X-Application'] = self.app_id - - if cc: - base['Cc'] = ','.join(cc) - - if reply_to: - base['Reply-To'] = ','.join(reply_to) - - message = EmailMessage( - recipient=to_addr, - to_addrs=[to_addr] + list(cc) + list(bcc), - body=base.as_string()) - messages.append(message) - - return self.submit(messages) - - def submit(self, messages: t.List[EmailMessage]): - # error tracking (used for function return) has_error = False @@ -888,42 +496,66 @@ def submit(self, messages: t.List[EmailMessage]): self.logger.debug('Securing connection with STARTTLS...') socket.starttls() + self.logger.trace('Login ID: {}'.format(self.user)) if self.user and self.password: # Apply Login credetials self.logger.debug('Applying user credentials...') socket.login(self.user, self.password) - # Send the emails - for message in messages: + # Prepare our headers + headers = { + 'X-Application': self.app_id, + } + headers.update(self.headers) + + # Iterate over our email messages we can generate and then + # send them off. + for message in NotifyEmail.prepare_emails( + subject=title, body=body, notify_format=self.notify_format, + from_addr=self.from_addr, to=self.targets, + cc=self.cc, bcc=self.bcc, reply_to=self.reply_to, + smtp_host=self.smtp_host, + attach=attach, headers=headers, names=self.names, + pgp=self.pgp if self.use_pgp else None): try: socket.sendmail( self.from_addr[1], message.to_addrs, message.body) - self.logger.info( - f'Sent Email notification to "{message.recipient}".') + self.logger.info('Sent Email to %s', message.recipient) + except (SocketError, smtplib.SMTPException, RuntimeError) as e: self.logger.warning( - f'Sending email to "{message.recipient}" failed. ' - f'Reason: {e}') + 'Sending email to "%s" failed.', message.recipient) + self.logger.debug(f'Socket Exception: {e}') # Mark as failure has_error = True except (SocketError, smtplib.SMTPException, RuntimeError) as e: self.logger.warning( - f'Connection error while submitting email to {self.smtp_host}.' - f' Reason: {e}') + 'Connection error while submitting email to "%s"', + self.smtp_host) + self.logger.debug(f'Socket Exception: {e}') + + # Mark as failure + has_error = True + + except AppriseEmailException as e: + self.logger.debug(f'Socket Exception: {e}') # Mark as failure has_error = True finally: # Gracefully terminate the connection with the server - if socket is not None: # pragma: no branch + if socket is not None: socket.quit() + # Reduce our dictionary (eliminate expired keys if any) + self.pgp.prune() + return not has_error def url(self, privacy=False, *args, **kwargs): @@ -932,7 +564,13 @@ def url(self, privacy=False, *args, **kwargs): """ # Define an URL parameters - params = {} + params = { + 'pgp': 'yes' if self.use_pgp else 'no', + } + + # Store our public key back into your URL + if self.pgp_key is not None: + params['pgp_key'] = NotifyEmail.quote(self.pgp_key, safe=':\\/') # Append our headers into our parameters params.update({'+{}'.format(k): v for k, v in self.headers.items()}) @@ -965,7 +603,7 @@ def url(self, privacy=False, *args, **kwargs): params['from'] = \ formataddr((False, self.from_addr[1]), charset='utf-8') - if len(self.cc) > 0: + if self.cc: # Handle our Carbon Copy Addresses params['cc'] = ','.join([ formataddr( @@ -975,7 +613,7 @@ def url(self, privacy=False, *args, **kwargs): charset='utf-8').replace(',', '%2C') for e in self.cc]) - if len(self.bcc) > 0: + if self.bcc: # Handle our Blind Carbon Copy Addresses params['bcc'] = ','.join([ formataddr( @@ -1044,7 +682,7 @@ def url_identifier(self): """ return ( self.secure_protocol if self.secure else self.protocol, - self.user, self.password, self.host, + self.user, self.password, self.host, self.smtp_host, self.port if self.port else SECURE_MODES[self.secure_mode]['default_port'], ) @@ -1053,8 +691,7 @@ def __len__(self): """ Returns the number of targets associated with this notification """ - targets = len(self.targets) - return targets if targets > 0 else 1 + return len(self.targets) if self.targets else 1 @staticmethod def parse_url(url): @@ -1086,6 +723,16 @@ def parse_url(url): # value if invalid; we'll attempt to figure this out later on results['host'] = '' + # Get PGP Flag + results['use_pgp'] = \ + parse_bool(results['qsd'].get( + 'pgp', NotifyEmail.template_args['pgp']['default'])) + + # Get PGP Public Key Override + if 'pgpkey' in results['qsd'] and results['qsd']['pgpkey']: + results['pgp_key'] = \ + NotifyEmail.unquote(results['qsd']['pgpkey']) + # The From address is a must; either through the use of templates # from= entry and/or merging the user and hostname together, this # must be calculated or parse_url will fail. @@ -1107,14 +754,9 @@ def parse_url(url): from_addr = NotifyEmail.unquote(results['qsd']['from']) if 'name' in results['qsd'] and len(results['qsd']['name']): - # Depricate use of both `from=` and `name=` in the same url as - # they will be synomomus of one another in the future. from_addr = formataddr( (NotifyEmail.unquote(results['qsd']['name']), from_addr), charset='utf-8') - logger.warning( - 'Email name= and from= are synonymous; ' - 'use one or the other.') elif 'name' in results['qsd'] and len(results['qsd']['name']): # Extract from name to associate with from address @@ -1150,3 +792,233 @@ def parse_url(url): for x, y in results['qsd+'].items()} return results + + @staticmethod + def _get_charset(input_string): + """ + Get utf-8 charset if non ascii string only + + Encode an ascii string to utf-8 is bad for email deliverability + because some anti-spam gives a bad score for that + like SUBJ_EXCESS_QP flag on Rspamd + """ + if not input_string: + return None + return 'utf-8' if not all(ord(c) < 128 for c in input_string) else None + + @staticmethod + def prepare_emails(subject, body, from_addr, to, + cc=set(), bcc=set(), reply_to=set(), + # Providing an SMTP Host helps improve Email Message-ID + # and avoids getting flagged as spam + smtp_host=None, + # Can be either 'html' or 'text' + notify_format=NotifyFormat.HTML, + attach=None, headers=dict(), + # Names can be a dictionary + names=None, + # Pretty Good Privacy Support; Pass in an + # ApprisePGPController if you wish to use it + pgp=None): + """ + Generator for emails + from_addr: must be in format: (from_name, from_addr) + to: must be in the format: + [(to_name, to_addr), (to_name, to_addr)), ...] + cc: must be a set of email addresses + bcc: must be a set of email addresses + reply_to: must be either None, or an email address + smtp_host: This is used to generate the email's Message-ID. Set + this correctly to avoid getting flagged as Spam + notify_format: can be either 'text' or 'html' + attach: must be of class AppriseAttachment + headers: Optionally provide a dictionary of additional headers you + would like to include in the email payload + names: This is a dictionary of email addresses as keys and the + Names to associate with them when sending the email. + This is cross referenced for the cc and bcc lists + pgp: Encrypting the message using Pretty Good Privacy support + This requires that the pgp_path provided exists and + keys can be referenced here to perform the encryption + with. If a key isn't found, one will be generated. + + pgp support requires the 'PGPy' Python library to be + available. + + Pass in an ApprisePGPController() if you wish to use this + """ + + if not to: + # There is no one to email; we're done + msg = 'There are no Email recipients to notify' + logger.warning(msg) + raise AppriseEmailException(msg) + + elif pgp and not _pgp.PGP_SUPPORT: + msg = 'PGP Support unavailable; install PGPy library' + logger.warning(msg) + raise AppriseEmailException(msg) + + if not names: + # Prepare a empty dictionary to prevent errors/warnings + names = {} + + if not smtp_host: + # Generate a host identifier (used for Message-ID Creation) + smtp_host = from_addr[1].split('@')[1] + + logger.debug('SMTP Host: {smtp_host}') + + # Create a copy of the targets list + emails = list(to) + while len(emails): + # Get our email to notify + to_name, to_addr = emails.pop(0) + + # Strip target out of cc list if in To or Bcc + _cc = (cc - bcc - set([to_addr])) + + # Strip target out of bcc list if in To + _bcc = (bcc - set([to_addr])) + + # Strip target out of reply_to list if in To + _reply_to = (reply_to - set([to_addr])) + + # Format our cc addresses to support the Name field + _cc = [formataddr( + (names.get(addr, False), addr), charset='utf-8') + for addr in _cc] + + # Format our bcc addresses to support the Name field + _bcc = [formataddr( + (names.get(addr, False), addr), charset='utf-8') + for addr in _bcc] + + if reply_to: + # Format our reply-to addresses to support the Name field + reply_to = [formataddr( + (names.get(addr, False), addr), charset='utf-8') + for addr in reply_to] + + logger.debug( + 'Email From: {}'.format( + formataddr(from_addr, charset='utf-8'))) + + logger.debug('Email To: {}'.format(to_addr)) + if _cc: + logger.debug('Email Cc: {}'.format(', '.join(_cc))) + if _bcc: + logger.debug('Email Bcc: {}'.format(', '.join(_bcc))) + if _reply_to: + logger.debug( + 'Email Reply-To: {}'.format(', '.join(_reply_to)) + ) + + # Prepare Email Message + if notify_format == NotifyFormat.HTML: + base = MIMEMultipart("alternative") + base.attach(MIMEText( + convert_between( + NotifyFormat.HTML, NotifyFormat.TEXT, body), + 'plain', 'utf-8') + ) + base.attach(MIMEText(body, 'html', 'utf-8')) + else: + base = MIMEText(body, 'plain', 'utf-8') + + if attach: + mixed = MIMEMultipart("mixed") + mixed.attach(base) + # Now store our attachments + for no, attachment in enumerate(attach, start=1): + if not attachment: + # We could not load the attachment; take an early + # exit since this isn't what the end user wanted + + # We could not access the attachment + msg = 'Could not access attachment {}.'.format( + attachment.url(privacy=True)) + logger.warning(msg) + raise AppriseEmailException(msg) + + logger.debug( + 'Preparing Email attachment {}'.format( + attachment.url(privacy=True))) + + with open(attachment.path, "rb") as abody: + app = MIMEApplication(abody.read()) + app.set_type(attachment.mimetype) + + # Prepare our attachment name + filename = attachment.name \ + if attachment.name else f'file{no:03}.dat' + + app.add_header( + 'Content-Disposition', + 'attachment; filename="{}"'.format( + Header(filename, 'utf-8')), + ) + mixed.attach(app) + base = mixed + + if pgp: + logger.debug("Securing Email with PGP Encryption") + # Set our header information to include in the encryption + base['From'] = formataddr( + (None, from_addr[1]), charset='utf-8') + base['To'] = formataddr((None, to_addr), charset='utf-8') + base['Subject'] = \ + Header(subject, NotifyEmail._get_charset(subject)) + + # Apply our encryption + encrypted_content = \ + pgp.encrypt(base.as_string(), to_addr) + + if not encrypted_content: + # Unable to send notification + msg = 'Unable to encrypt email via PGP' + logger.warning(msg) + raise AppriseEmailException(msg) + + # prepare our messsage + base = MIMEMultipart( + "encrypted", protocol="application/pgp-encrypted") + + # Store Autocrypt header (DeltaChat Support) + base.add_header( + "Autocrypt", + "addr=%s; prefer-encrypt=mutual" % formataddr( + (False, to_addr), charset='utf-8')) + + # Set Encryption Info Part + enc_payload = MIMEText("Version: 1", "plain") + enc_payload.set_type("application/pgp-encrypted") + base.attach(enc_payload) + + enc_payload = MIMEBase("application", "octet-stream") + enc_payload.set_payload(encrypted_content) + base.attach(enc_payload) + + # Apply any provided custom headers + for k, v in headers.items(): + base[k] = Header(v, NotifyEmail._get_charset(v)) + + base['Subject'] = \ + Header(subject, NotifyEmail._get_charset(subject)) + base['From'] = formataddr(from_addr, charset='utf-8') + base['To'] = formataddr((to_name, to_addr), charset='utf-8') + base['Message-ID'] = make_msgid(domain=smtp_host) + base['Date'] = \ + datetime.now(timezone.utc)\ + .strftime("%a, %d %b %Y %H:%M:%S +0000") + + if cc: + base['Cc'] = ','.join(_cc) + + if reply_to: + base['Reply-To'] = ','.join(_reply_to) + + yield EmailMessage( + recipient=to_addr, + to_addrs=[to_addr] + list(_cc) + list(_bcc), + body=base.as_string()) diff --git a/libs/apprise/plugins/email/common.py b/libs/apprise/plugins/email/common.py new file mode 100644 index 000000000..f14ef8811 --- /dev/null +++ b/libs/apprise/plugins/email/common.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. + + +import dataclasses +import typing as t + +from ...exception import ApprisePluginException + + +class AppriseEmailException(ApprisePluginException): + """ + Thrown when there is an error with the Email Attachment + """ + def __init__(self, message, error_code=601): + super().__init__(message, error_code=error_code) + + +class WebBaseLogin: + """ + This class is just used in conjunction of the default emailers + to best formulate a login to it using the data detected + """ + # User Login must be Email Based + EMAIL = 'Email' + + # User Login must UserID Based + USERID = 'UserID' + + +# Secure Email Modes +class SecureMailMode: + INSECURE = "insecure" + SSL = "ssl" + STARTTLS = "starttls" + + +# Define all of the secure modes (used during validation) +SECURE_MODES = { + SecureMailMode.STARTTLS: { + 'default_port': 587, + }, + SecureMailMode.SSL: { + 'default_port': 465, + }, + SecureMailMode.INSECURE: { + 'default_port': 25, + }, +} + + +@dataclasses.dataclass +class EmailMessage: + """ + Our message structure + """ + recipient: str + to_addrs: t.List[str] + body: str diff --git a/libs/apprise/plugins/email/templates.py b/libs/apprise/plugins/email/templates.py new file mode 100644 index 000000000..0d87ff95a --- /dev/null +++ b/libs/apprise/plugins/email/templates.py @@ -0,0 +1,272 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. + + +import re +from .common import (SecureMailMode, WebBaseLogin) + +# To attempt to make this script stupid proof, if we detect an email address +# that is part of the this table, we can pre-use a lot more defaults if they +# aren't otherwise specified on the users input. +EMAIL_TEMPLATES = ( + # Google GMail + ( + 'Google Mail', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>gmail\.com)$', re.I), + { + 'port': 587, + 'smtp_host': 'smtp.gmail.com', + 'secure': True, + 'secure_mode': SecureMailMode.STARTTLS, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Yandex + ( + 'Yandex', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>yandex\.(com|ru|ua|by|kz|uz|tr|fr))$', re.I), + { + 'port': 465, + 'smtp_host': 'smtp.yandex.ru', + 'secure': True, + 'secure_mode': SecureMailMode.SSL, + 'login_type': (WebBaseLogin.USERID, ) + }, + ), + + # Microsoft Hotmail + ( + 'Microsoft Hotmail', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>(hotmail|live)\.com(\.au)?)$', re.I), + { + 'port': 587, + 'smtp_host': 'smtp-mail.outlook.com', + 'secure': True, + 'secure_mode': SecureMailMode.STARTTLS, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Microsoft Outlook + ( + 'Microsoft Outlook', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>(smtp\.)?outlook\.com(\.au)?)$', re.I), + { + 'port': 587, + 'smtp_host': 'smtp.outlook.com', + 'secure': True, + 'secure_mode': SecureMailMode.STARTTLS, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Microsoft Office 365 (Email Server) + # You must specify an authenticated sender address in the from= settings + # and a valid email in the to= to deliver your emails to + ( + 'Microsoft Office 365', + re.compile( + r'^[^@]+@(?P<domain>(smtp\.)?office365\.com)$', re.I), + { + 'port': 587, + 'smtp_host': 'smtp.office365.com', + 'secure': True, + 'secure_mode': SecureMailMode.STARTTLS, + }, + ), + + # Yahoo Mail + ( + 'Yahoo Mail', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>yahoo\.(ca|com))$', re.I), + { + 'port': 465, + 'smtp_host': 'smtp.mail.yahoo.com', + 'secure': True, + 'secure_mode': SecureMailMode.STARTTLS, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Fast Mail (Series 1) + ( + 'Fast Mail', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>fastmail\.(com|cn|co\.uk|com\.au|de|es|fm|fr|im|' + r'in|jp|mx|net|nl|org|se|to|tw|uk|us))$', re.I), + { + 'port': 465, + 'smtp_host': 'smtp.fastmail.com', + 'secure': True, + 'secure_mode': SecureMailMode.SSL, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Fast Mail (Series 2) + ( + 'Fast Mail Extended Addresses', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>123mail\.org|airpost\.net|eml\.cc|fmail\.co\.uk|' + r'fmgirl\.com|fmguy\.com|mailbolt\.com|mailcan\.com|' + r'mailhaven\.com|mailmight\.com|ml1\.net|mm\.st|myfastmail\.com|' + r'proinbox\.com|promessage\.com|rushpost\.com|sent\.(as|at|com)|' + r'speedymail\.org|warpmail\.net|xsmail\.com|150mail\.com|' + r'150ml\.com|16mail\.com|2-mail\.com|4email\.net|50mail\.com|' + r'allmail\.net|bestmail\.us|cluemail\.com|elitemail\.org|' + r'emailcorner\.net|emailengine\.(net|org)|emailgroups\.net|' + r'emailplus\.org|emailuser\.net|f-m\.fm|fast-email\.com|' + r'fast-mail\.org|fastem\.com|fastemail\.us|fastemailer\.com|' + r'fastest\.cc|fastimap\.com|fastmailbox\.net|fastmessaging\.com|' + r'fea\.st|fmailbox\.com|ftml\.net|h-mail\.us|hailmail\.net|' + r'imap-mail\.com|imap\.cc|imapmail\.org|inoutbox\.com|' + r'internet-e-mail\.com|internet-mail\.org|internetemails\.net|' + r'internetmailing\.net|jetemail\.net|justemail\.net|' + r'letterboxes\.org|mail-central\.com|mail-page\.com|' + r'mailandftp\.com|mailas\.com|mailc\.net|mailforce\.net|' + r'mailftp\.com|mailingaddress\.org|mailite\.com|mailnew\.com|' + r'mailsent\.net|mailservice\.ms|mailup\.net|mailworks\.org|' + r'mymacmail\.com|nospammail\.net|ownmail\.net|petml\.com|' + r'postinbox\.com|postpro\.net|realemail\.net|reallyfast\.biz|' + r'reallyfast\.info|speedpost\.net|ssl-mail\.com|swift-mail\.com|' + r'the-fastest\.net|the-quickest\.com|theinternetemail\.com|' + r'veryfast\.biz|veryspeedy\.net|yepmail\.net)$', re.I), + { + 'port': 465, + 'smtp_host': 'smtp.fastmail.com', + 'secure': True, + 'secure_mode': SecureMailMode.SSL, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Zoho Mail (Free) + ( + 'Zoho Mail', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>zoho(mail)?\.com)$', re.I), + { + 'port': 587, + 'smtp_host': 'smtp.zoho.com', + 'secure': True, + 'secure_mode': SecureMailMode.STARTTLS, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # SendGrid (Email Server) + # You must specify an authenticated sender address in the from= settings + # and a valid email in the to= to deliver your emails to + ( + 'SendGrid', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>(\.smtp)?sendgrid\.(com|net))$', re.I), + { + 'port': 465, + 'smtp_host': 'smtp.sendgrid.net', + 'secure': True, + 'secure_mode': SecureMailMode.SSL, + 'login_type': (WebBaseLogin.USERID, ) + }, + ), + + # 163.com + ( + '163.com', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>163\.com)$', re.I), + { + 'port': 465, + 'smtp_host': 'smtp.163.com', + 'secure': True, + 'secure_mode': SecureMailMode.SSL, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Foxmail.com + ( + 'Foxmail.com', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>(foxmail|qq)\.com)$', re.I), + { + 'port': 587, + 'smtp_host': 'smtp.qq.com', + 'secure': True, + 'secure_mode': SecureMailMode.STARTTLS, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Comcast.net + ( + 'Comcast.net', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>(comcast)\.net)$', re.I), + { + 'port': 465, + 'smtp_host': 'smtp.comcast.net', + 'secure': True, + 'secure_mode': SecureMailMode.SSL, + 'login_type': (WebBaseLogin.EMAIL, ) + }, + ), + + # Catch All + ( + 'Custom', + re.compile( + r'^((?P<label>[^+]+)\+)?(?P<id>[^@]+)@' + r'(?P<domain>.+)$', re.I), + { + # Setting smtp_host to None is a way of + # auto-detecting it based on other parameters + # specified. There is no reason to ever modify + # this Catch All + 'smtp_host': None, + }, + ), +) diff --git a/libs/apprise/plugins/emby.py b/libs/apprise/plugins/emby.py index 5824932e8..23d781ab9 100644 --- a/libs/apprise/plugins/emby.py +++ b/libs/apprise/plugins/emby.py @@ -36,7 +36,7 @@ from .base import NotifyBase from ..url import PrivacyMode -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..common import NotifyType from .. import __version__ as VERSION from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/fcm/__init__.py b/libs/apprise/plugins/fcm/__init__.py index e5db817e2..b04d7c372 100644 --- a/libs/apprise/plugins/fcm/__init__.py +++ b/libs/apprise/plugins/fcm/__init__.py @@ -52,10 +52,8 @@ from json import dumps from ..base import NotifyBase from ...common import NotifyType -from ...utils import validate_regex -from ...utils import parse_list -from ...utils import parse_bool -from ...utils import dict_full_update +from ...utils.parse import validate_regex, parse_list, parse_bool +from ...utils.logic import dict_full_update from ...common import NotifyImageSize from ...apprise_attachment import AppriseAttachment from ...locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/fcm/color.py b/libs/apprise/plugins/fcm/color.py index 20149eedd..5d646599f 100644 --- a/libs/apprise/plugins/fcm/color.py +++ b/libs/apprise/plugins/fcm/color.py @@ -34,7 +34,7 @@ # https://firebase.google.com/docs/reference/fcm/rest/v1/\ # projects.messages#androidnotification import re -from ...utils import parse_bool +from ...utils.parse import parse_bool from ...common import NotifyType from ...asset import AppriseAsset diff --git a/libs/apprise/plugins/feishu.py b/libs/apprise/plugins/feishu.py index 9b3c74ea4..db9bc4cd6 100644 --- a/libs/apprise/plugins/feishu.py +++ b/libs/apprise/plugins/feishu.py @@ -38,7 +38,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/flock.py b/libs/apprise/plugins/flock.py index 99ce3582b..2cbac98b8 100644 --- a/libs/apprise/plugins/flock.py +++ b/libs/apprise/plugins/flock.py @@ -48,9 +48,7 @@ from ..common import NotifyType from ..common import NotifyFormat from ..common import NotifyImageSize -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_list, parse_bool, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/gnome.py b/libs/apprise/plugins/gnome.py index 0a4133731..2d5aab432 100644 --- a/libs/apprise/plugins/gnome.py +++ b/libs/apprise/plugins/gnome.py @@ -29,7 +29,7 @@ from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..locale import gettext_lazy as _ # Default our global support flag diff --git a/libs/apprise/plugins/google_chat.py b/libs/apprise/plugins/google_chat.py index f12e24029..4bada830c 100644 --- a/libs/apprise/plugins/google_chat.py +++ b/libs/apprise/plugins/google_chat.py @@ -61,7 +61,7 @@ from .base import NotifyBase from ..common import NotifyFormat from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/gotify.py b/libs/apprise/plugins/gotify.py index 1be2d0052..c6ad8c751 100644 --- a/libs/apprise/plugins/gotify.py +++ b/libs/apprise/plugins/gotify.py @@ -36,7 +36,7 @@ from .base import NotifyBase from ..common import NotifyType, NotifyFormat -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/growl.py b/libs/apprise/plugins/growl.py index e6f6237e3..9ecd6a4b6 100644 --- a/libs/apprise/plugins/growl.py +++ b/libs/apprise/plugins/growl.py @@ -30,7 +30,7 @@ from ..url import PrivacyMode from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..locale import gettext_lazy as _ # Default our global support flag diff --git a/libs/apprise/plugins/home_assistant.py b/libs/apprise/plugins/home_assistant.py index c59b58a9a..b3f2bb72a 100644 --- a/libs/apprise/plugins/home_assistant.py +++ b/libs/apprise/plugins/home_assistant.py @@ -37,7 +37,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/httpsms.py b/libs/apprise/plugins/httpsms.py index b4da6c627..55fac8570 100644 --- a/libs/apprise/plugins/httpsms.py +++ b/libs/apprise/plugins/httpsms.py @@ -33,9 +33,7 @@ import json from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import validate_regex +from ..utils.parse import is_phone_no, parse_phone_no, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/ifttt.py b/libs/apprise/plugins/ifttt.py index 64d9cc31b..b791a2c51 100644 --- a/libs/apprise/plugins/ifttt.py +++ b/libs/apprise/plugins/ifttt.py @@ -46,8 +46,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/join.py b/libs/apprise/plugins/join.py index 239f9682f..6a3489daf 100644 --- a/libs/apprise/plugins/join.py +++ b/libs/apprise/plugins/join.py @@ -42,9 +42,7 @@ from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_list, parse_bool, validate_regex from ..locale import gettext_lazy as _ # Extend HTTP Error Messages diff --git a/libs/apprise/plugins/kavenegar.py b/libs/apprise/plugins/kavenegar.py index ea3bd8ed3..cff4b0a0c 100644 --- a/libs/apprise/plugins/kavenegar.py +++ b/libs/apprise/plugins/kavenegar.py @@ -40,9 +40,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import validate_regex +from ..utils.parse import is_phone_no, parse_phone_no, validate_regex from ..locale import gettext_lazy as _ # Extend HTTP Error Messages diff --git a/libs/apprise/plugins/kumulos.py b/libs/apprise/plugins/kumulos.py index 941f163db..cea7ed0eb 100644 --- a/libs/apprise/plugins/kumulos.py +++ b/libs/apprise/plugins/kumulos.py @@ -41,7 +41,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ # Extend HTTP Error Messages diff --git a/libs/apprise/plugins/lametric.py b/libs/apprise/plugins/lametric.py index b6124a91f..cab3b4484 100644 --- a/libs/apprise/plugins/lametric.py +++ b/libs/apprise/plugins/lametric.py @@ -92,10 +92,8 @@ from json import dumps from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex from ..locale import gettext_lazy as _ -from ..utils import is_hostname -from ..utils import is_ipaddr +from ..utils.parse import validate_regex, is_hostname, is_ipaddr # A URL Parser to detect App ID LAMETRIC_APP_ID_DETECTOR_RE = re.compile( diff --git a/libs/apprise/plugins/line.py b/libs/apprise/plugins/line.py index c177e26f8..fae90a2fe 100644 --- a/libs/apprise/plugins/line.py +++ b/libs/apprise/plugins/line.py @@ -37,9 +37,7 @@ from ..url import PrivacyMode from ..common import NotifyType from ..common import NotifyImageSize -from ..utils import validate_regex -from ..utils import parse_list -from ..utils import parse_bool +from ..utils.parse import validate_regex, parse_list, parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/lunasea.py b/libs/apprise/plugins/lunasea.py index 97291fc9e..db14f06f7 100644 --- a/libs/apprise/plugins/lunasea.py +++ b/libs/apprise/plugins/lunasea.py @@ -36,10 +36,8 @@ from .base import NotifyBase from ..common import NotifyType from ..common import NotifyImageSize -from ..utils import parse_list -from ..utils import is_hostname -from ..utils import is_ipaddr -from ..utils import parse_bool +from ..utils.parse import ( + parse_list, is_hostname, is_ipaddr, parse_bool) from ..locale import gettext_lazy as _ from ..url import PrivacyMode diff --git a/libs/apprise/plugins/macosx.py b/libs/apprise/plugins/macosx.py index 153a88a21..e30414cbe 100644 --- a/libs/apprise/plugins/macosx.py +++ b/libs/apprise/plugins/macosx.py @@ -33,7 +33,7 @@ from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..locale import gettext_lazy as _ # Default our global support flag diff --git a/libs/apprise/plugins/mailgun.py b/libs/apprise/plugins/mailgun.py index b68183957..682f19e42 100644 --- a/libs/apprise/plugins/mailgun.py +++ b/libs/apprise/plugins/mailgun.py @@ -59,10 +59,8 @@ from .base import NotifyBase from ..common import NotifyType from ..common import NotifyFormat -from ..utils import parse_emails -from ..utils import parse_bool -from ..utils import is_email -from ..utils import validate_regex +from ..utils.parse import ( + parse_emails, parse_bool, is_email, validate_regex) from ..logger import logger from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/mastodon.py b/libs/apprise/plugins/mastodon.py index 85379ba0a..955835b19 100644 --- a/libs/apprise/plugins/mastodon.py +++ b/libs/apprise/plugins/mastodon.py @@ -38,9 +38,7 @@ from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import NotifyType -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_list, parse_bool, validate_regex from ..locale import gettext_lazy as _ from ..attachment.base import AttachBase diff --git a/libs/apprise/plugins/matrix.py b/libs/apprise/plugins/matrix.py index bb9c6dbb2..552bfba66 100644 --- a/libs/apprise/plugins/matrix.py +++ b/libs/apprise/plugins/matrix.py @@ -32,6 +32,7 @@ # import re import requests +import uuid from markdown import markdown from json import dumps from json import loads @@ -39,14 +40,13 @@ from .base import NotifyBase from ..url import PrivacyMode +from ..exception import AppriseException from ..common import NotifyType from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import PersistentStoreMode -from ..utils import parse_bool -from ..utils import parse_list -from ..utils import is_hostname -from ..utils import validate_regex +from ..utils.parse import ( + parse_bool, parse_list, is_hostname, validate_regex) from ..locale import gettext_lazy as _ # Define default path @@ -56,6 +56,13 @@ MATRIX_V3_MEDIA_PATH = '/_matrix/media/v3' MATRIX_V2_MEDIA_PATH = '/_matrix/media/r0' + +class MatrixDiscoveryException(AppriseException): + """ + Apprise Matrix Exception Class + """ + + # Extend HTTP Error Messages MATRIX_HTTP_ERROR_MAP = { 403: 'Unauthorized - Invalid Token.', @@ -165,9 +172,6 @@ class NotifyMatrix(NotifyBase): # Throttle a wee-bit to avoid thrashing request_rate_per_sec = 0.5 - # Our Matrix API Version - matrix_api_version = '3' - # How many retry attempts we'll make in the event the server asks us to # throttle back. default_retries = 2 @@ -183,15 +187,24 @@ class NotifyMatrix(NotifyBase): # Keep our cache for 20 days default_cache_expiry_sec = 60 * 60 * 24 * 20 + # Used for server discovery + discovery_base_key = '__discovery_base' + discovery_identity_key = '__discovery_identity' + + # Defines how long we cache our discovery for + discovery_cache_length_sec = 86400 + # Define object templates templates = ( # Targets are ignored when using t2bot mode; only a token is required '{schema}://{token}', '{schema}://{user}@{token}', - # Disabled webhook + # Matrix Server '{schema}://{user}:{password}@{host}/{targets}', '{schema}://{user}:{password}@{host}:{port}/{targets}', + '{schema}://{token}@{host}/{targets}', + '{schema}://{token}@{host}:{port}/{targets}', # Webhook mode '{schema}://{user}:{token}@{host}/{targets}', @@ -256,6 +269,11 @@ class NotifyMatrix(NotifyBase): 'default': False, 'map_to': 'include_image', }, + 'discovery': { + 'name': _('Server Discovery'), + 'type': 'bool', + 'default': True, + }, 'mode': { 'name': _('Webhook Mode'), 'type': 'choice:string', @@ -283,7 +301,7 @@ class NotifyMatrix(NotifyBase): }) def __init__(self, targets=None, mode=None, msgtype=None, version=None, - include_image=False, **kwargs): + include_image=None, discovery=None, **kwargs): """ Initialize Matrix Object """ @@ -305,7 +323,12 @@ def __init__(self, targets=None, mode=None, msgtype=None, version=None, self.transaction_id = 0 # Place an image inline with the message body - self.include_image = include_image + self.include_image = self.template_args['image']['default'] \ + if include_image is None else include_image + + # Prepare Delegate Server Lookup Check + self.discovery = self.template_args['discovery']['default'] \ + if discovery is None else discovery # Setup our mode self.mode = self.template_args['mode']['default'] \ @@ -358,6 +381,10 @@ def __init__(self, targets=None, mode=None, msgtype=None, version=None, self.logger.warning(msg) raise TypeError(msg) + if self.mode != MatrixWebhookMode.DISABLED: + # Discovery only works when we're not using webhooks + self.discovery = False + # # Initialize from cache if present # @@ -586,6 +613,10 @@ def _send_server_notification(self, body, title='', Perform Direct Matrix Server Notification (no webhook) """ + if self.access_token is None and self.password and not self.user: + self.access_token = self.password + self.transaction_id = uuid.uuid4() + if self.access_token is None: # We need to register if not self._login(): @@ -715,7 +746,8 @@ def _send_server_notification(self, body, title='', # Increment the transaction ID to avoid future messages being # recognized as retransmissions and ignored - if self.version == MatrixVersion.V3: + if self.version == MatrixVersion.V3 \ + and self.access_token != self.password: self.transaction_id += 1 self.store.set( 'transaction_id', self.transaction_id, @@ -864,32 +896,33 @@ def _login(self): # Login not required; silently skip-over return True - if not (self.user and self.password): + if (self.user and self.password): + # Prepare our Authentication Payload + if self.version == MatrixVersion.V3: + payload = { + 'type': 'm.login.password', + 'identifier': { + 'type': 'm.id.user', + 'user': self.user, + }, + 'password': self.password, + } + + else: + payload = { + 'type': 'm.login.password', + 'user': self.user, + 'password': self.password, + } + + else: # It's not possible to register since we need these 2 values to # make the action possible. self.logger.warning( 'Failed to login to Matrix server: ' - 'user/pass combo is missing.') + 'token or user/pass combo is missing.') return False - # Prepare our Authentication Payload - if self.version == MatrixVersion.V3: - payload = { - 'type': 'm.login.password', - 'identifier': { - 'type': 'm.id.user', - 'user': self.user, - }, - 'password': self.password, - } - - else: - payload = { - 'type': 'm.login.password', - 'user': self.user, - 'password': self.password, - } - # Build our URL postokay, response = self._fetch('/login', payload=payload) if not (postokay and isinstance(response, dict)): @@ -1180,14 +1213,16 @@ def _room_id(self, room): return None - def _fetch(self, path, payload=None, params=None, attachment=None, - method='POST'): + def _fetch(self, path, payload=None, params={}, attachment=None, + method='POST', url_override=None): """ Wrapper to request.post() to manage it's response better and make the send() function cleaner and easier to maintain. This function returns True if the _post was successful and False if it wasn't. + + this function returns the status code if url_override is used """ # Define our headers @@ -1200,14 +1235,20 @@ def _fetch(self, path, payload=None, params=None, attachment=None, if self.access_token is not None: headers["Authorization"] = 'Bearer %s' % self.access_token - default_port = 443 if self.secure else 80 + # Server Discovery / Well-known URI + if url_override: + url = url_override - url = \ - '{schema}://{hostname}{port}'.format( - schema='https' if self.secure else 'http', - hostname=self.host, - port='' if self.port is None - or self.port == default_port else f':{self.port}') + else: + try: + url = self.base_url + + except MatrixDiscoveryException: + # Discovery failed; we're done + return (False, {}) + + # Default return status code + status_code = requests.codes.internal_server_error if path == '/upload': # FUTURE if self.version == MatrixVersion.V3: @@ -1217,14 +1258,14 @@ def _fetch(self, path, payload=None, params=None, attachment=None, # FUTURE url += MATRIX_V2_MEDIA_PATH + path url += MATRIX_V2_MEDIA_PATH + path - params = {'filename': attachment.name} + params.update({'filename': attachment.name}) with open(attachment.path, 'rb') as fp: payload = fp.read() # Update our content type headers['Content-Type'] = attachment.mimetype - else: + elif not url_override: if self.version == MatrixVersion.V3: url += MATRIX_V3_API_PATH + path @@ -1246,7 +1287,9 @@ def _fetch(self, path, payload=None, params=None, attachment=None, # Decrement our throttle retry count retries -= 1 - self.logger.debug('Matrix POST URL: %s (cert_verify=%r)' % ( + self.logger.debug('Matrix %s URL: %s (cert_verify=%r)' % ( + 'POST' if method == 'POST' else ( + requests.put if method == 'PUT' else 'GET'), url, self.verify_certificate, )) self.logger.debug('Matrix Payload: %s' % str(payload)) @@ -1258,18 +1301,21 @@ def _fetch(self, path, payload=None, params=None, attachment=None, r = fn( url, data=dumps(payload) if not attachment else payload, - params=params, + params=None if not params else params, headers=headers, verify=self.verify_certificate, timeout=self.request_timeout, ) + # Store status code + status_code = r.status_code + self.logger.debug( 'Matrix Response: code=%d, %s' % ( r.status_code, str(r.content))) response = loads(r.content) - if r.status_code == 429: + if r.status_code == requests.codes.too_many_requests: wait = self.default_wait_ms / 1000 try: wait = response['retry_after_ms'] / 1000 @@ -1310,7 +1356,8 @@ def _fetch(self, path, payload=None, params=None, attachment=None, 'Response Details:\r\n{}'.format(r.content)) # Return; we're done - return (False, response) + return ( + False if not url_override else status_code, response) except (AttributeError, TypeError, ValueError): # This gets thrown if we can't parse our JSON Response @@ -1320,27 +1367,27 @@ def _fetch(self, path, payload=None, params=None, attachment=None, self.logger.warning('Invalid response from Matrix server.') self.logger.debug( 'Response Details:\r\n{}'.format(r.content)) - return (False, {}) + return (False if not url_override else status_code, {}) - except requests.RequestException as e: + except (requests.TooManyRedirects, requests.RequestException) as e: self.logger.warning( 'A Connection error occurred while registering with Matrix' ' server.') - self.logger.debug('Socket Exception: %s' % str(e)) + self.logger.debug('Socket Exception: %s', str(e)) # Return; we're done - return (False, response) + return (False if not url_override else status_code, response) except (OSError, IOError) as e: self.logger.warning( 'An I/O error occurred while reading {}.'.format( attachment.name if attachment else 'unknown file')) - self.logger.debug('I/O Exception: %s' % str(e)) - return (False, {}) + self.logger.debug('I/O Exception: %s', str(e)) + return (False if not url_override else status_code, {}) - return (True, response) + return (True if not url_override else status_code, response) # If we get here, we ran out of retries - return (False, {}) + return (False if not url_override else status_code, {}) def __del__(self): """ @@ -1355,6 +1402,10 @@ def __del__(self): # re-use our credentials with return + if self.access_token is not None \ + and self.access_token == self.password and not self.user: + return + try: self._logout() @@ -1426,6 +1477,7 @@ def url(self, privacy=False, *args, **kwargs): 'mode': self.mode, 'version': self.version, 'msgtype': self.msgtype, + 'discovery': 'yes' if self.discovery else 'no', } # Extend our parameters @@ -1442,9 +1494,10 @@ def url(self, privacy=False, *args, **kwargs): safe=''), ) - elif self.user: - auth = '{user}@'.format( - user=NotifyMatrix.quote(self.user, safe=''), + elif self.user or self.password: + auth = '{value}@'.format( + value=NotifyMatrix.quote( + self.user if self.user else self.password, safe=''), ) default_port = 443 if self.secure else 80 @@ -1495,6 +1548,10 @@ def parse_url(url): results['include_image'] = parse_bool(results['qsd'].get( 'image', NotifyMatrix.template_args['image']['default'])) + # Boolean to perform a server discovery + results['discovery'] = parse_bool(results['qsd'].get( + 'discovery', NotifyMatrix.template_args['discovery']['default'])) + # Get our mode results['mode'] = results['qsd'].get('mode') @@ -1522,6 +1579,11 @@ def parse_url(url): if 'token' in results['qsd'] and len(results['qsd']['token']): results['password'] = NotifyMatrix.unquote(results['qsd']['token']) + elif not results['password'] and results['user']: + # swap + results['password'] = results['user'] + results['user'] = None + # Support the use of the version= or v= keyword if 'version' in results['qsd'] and len(results['qsd']['version']): results['version'] = \ @@ -1554,3 +1616,200 @@ def parse_native_url(url): else '{}&{}'.format(result.group('params'), mode))) return None + + def server_discovery(self): + """ + Home Server Discovery as documented here: + https://spec.matrix.org/v1.11/client-server-api/#well-known-uri + """ + + if not (self.discovery and self.secure): + # Nothing further to do with insecure server setups + return '' + + # Get our content from cache + base_url, identity_url = ( + self.store.get(self.discovery_base_key), + self.store.get(self.discovery_identity_key), + ) + + if not (base_url is None and identity_url is None): + # We can use our cached value and return early + return base_url + + # 1. Extract the server name from the user’s Matrix ID by splitting + # the Matrix ID at the first colon. + verify_url = f'https://{self.host}/.well-known/matrix/client' + code, wk_response = self._fetch( + None, method='GET', url_override=verify_url) + + # Output may look as follows: + # { + # "m.homeserver": { + # "base_url": "https://matrix.example.com" + # }, + # "m.identity_server": { + # "base_url": "https://nuxref.com" + # } + # } + + if code == requests.codes.not_found: + # This is an acceptable response; we're done + self.logger.debug( + 'Matrix Well-Known Base URI not found at %s', verify_url) + + # Set our keys out for fast recall later on + self.store.set( + self.discovery_base_key, '', + expires=self.discovery_cache_length_sec) + self.store.set( + self.discovery_identity_key, '', + expires=self.discovery_cache_length_sec) + return '' + + elif code != requests.codes.ok: + # We're done early as we couldn't load the results + msg = 'Matrix Well-Known Base URI Discovery Failed' + self.logger.warning( + '%s - %s returned error code: %d', msg, verify_url, code) + raise MatrixDiscoveryException(msg, error_code=code) + + if not wk_response: + # This is an acceptable response; we simply do nothing + self.logger.debug( + 'Matrix Well-Known Base URI not defined %s', verify_url) + + # Set our keys out for fast recall later on + self.store.set( + self.discovery_base_key, '', + expires=self.discovery_cache_length_sec) + self.store.set( + self.discovery_identity_key, '', + expires=self.discovery_cache_length_sec) + return '' + + # + # Parse our m.homeserver information + # + try: + base_url = wk_response['m.homeserver']['base_url'].rstrip('/') + results = NotifyBase.parse_url(base_url, verify_host=True) + + except (AttributeError, TypeError, KeyError): + # AttributeError: result wasn't a string (rstrip failed) + # TypeError : wk_response wasn't a dictionary + # KeyError : wk_response not to standards + results = None + + if not results: + msg = 'Matrix Well-Known Base URI Discovery Failed' + self.logger.warning( + '%s - m.homeserver payload is missing or invalid: %s', + msg, str(wk_response)) + raise MatrixDiscoveryException(msg) + + # + # Our .well-known extraction was successful; now we need to verify + # that the version information resolves. + # + verify_url = f'{base_url}/_matrix/client/versions' + # Post our content + code, response = self._fetch( + None, method='GET', url_override=verify_url) + if code != requests.codes.ok: + # We're done early as we couldn't load the results + msg = 'Matrix Well-Known Base URI Discovery Verification Failed' + self.logger.warning( + '%s - %s returned error code: %d', msg, verify_url, code) + raise MatrixDiscoveryException(msg, error_code=code) + + # + # Phase 2: Handle m.identity_server IF defined + # + if 'm.identity_server' in wk_response: + try: + identity_url = \ + wk_response['m.identity_server']['base_url'].rstrip('/') + results = NotifyBase.parse_url(identity_url, verify_host=True) + + except (AttributeError, TypeError, KeyError): + # AttributeError: result wasn't a string (rstrip failed) + # TypeError : wk_response wasn't a dictionary + # KeyError : wk_response not to standards + results = None + + if not results: + msg = 'Matrix Well-Known Identity URI Discovery Failed' + self.logger.warning( + '%s - m.identity_server payload is missing or invalid: %s', + msg, str(wk_response)) + raise MatrixDiscoveryException(msg) + + # + # Verify identity server found + # + verify_url = f'{identity_url}/_matrix/identity/v2' + + # Post our content + code, response = self._fetch( + None, method='GET', url_override=verify_url) + if code != requests.codes.ok: + # We're done early as we couldn't load the results + msg = 'Matrix Well-Known Identity URI Discovery Failed' + self.logger.warning( + '%s - %s returned error code: %d', msg, verify_url, code) + raise MatrixDiscoveryException(msg, error_code=code) + + # Update our cache + self.store.set( + self.discovery_identity_key, identity_url, + # Add 2 seconds to prevent this key from expiring before base + expires=self.discovery_cache_length_sec + 2) + else: + # No identity server + self.store.set( + self.discovery_identity_key, '', + # Add 2 seconds to prevent this key from expiring before base + expires=self.discovery_cache_length_sec + 2) + + # Update our cache + self.store.set( + self.discovery_base_key, base_url, + expires=self.discovery_cache_length_sec) + + return base_url + + @property + def base_url(self): + """ + Returns the base_url if known + """ + try: + base_url = self.server_discovery() + if base_url: + # We can use our cached value and return early + return base_url + + except MatrixDiscoveryException: + self.store.clear( + self.discovery_base_key, self.discovery_identity_key) + raise + + # If we get hear, we need to build our URL dynamically based on what + # was provided to us during the plugins initialization + default_port = 443 if self.secure else 80 + + return '{schema}://{hostname}{port}'.format( + schema='https' if self.secure else 'http', + hostname=self.host, + port='' if self.port is None + or self.port == default_port else f':{self.port}') + + @property + def identity_url(self): + """ + Returns the identity_url if known + """ + base_url = self.base_url + identity_url = self.store.get(self.discovery_identity_key) + return base_url if not identity_url else identity_url diff --git a/libs/apprise/plugins/mattermost.py b/libs/apprise/plugins/mattermost.py index a9a3ee62b..e2f82612e 100644 --- a/libs/apprise/plugins/mattermost.py +++ b/libs/apprise/plugins/mattermost.py @@ -36,15 +36,14 @@ # - swap http with mmost # - drop /hooks/ reference +import re import requests from json import dumps from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_bool -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_bool, parse_list, validate_regex from ..locale import gettext_lazy as _ # Some Reference Locations: @@ -72,9 +71,6 @@ class NotifyMattermost(NotifyBase): # A URL that takes you to the setup/help of the specific protocol setup_url = 'https://github.com/caronc/apprise/wiki/Notify_mattermost' - # The default Mattermost port - default_port = 8065 - # Allows the user to specify the NotifyImageSize object image_size = NotifyImageSize.XY_72 @@ -174,9 +170,6 @@ def __init__(self, token, fullpath=None, channels=None, # Optional Channels (strip off any channel prefix entries if present) self.channels = [x.lstrip('#') for x in parse_list(channels)] - if not self.port: - self.port = self.default_port - # Place a thumbnail image inline with the message body self.include_image = include_image @@ -318,7 +311,7 @@ def url(self, privacy=False, *args, **kwargs): params['channel'] = ','.join( [NotifyMattermost.quote(x, safe='') for x in self.channels]) - default_port = 443 if self.secure else self.default_port + default_port = 443 if self.secure else 80 default_schema = self.secure_protocol if self.secure else self.protocol # Determine if there is a botname present @@ -336,8 +329,8 @@ def url(self, privacy=False, *args, **kwargs): # never encode hostname since we're expecting it to be a valid # one hostname=self.host, - port='' if not self.port or self.port == default_port - else ':{}'.format(self.port), + port='' if self.port is None or self.port == default_port + else ':{}'.format(self.port), fullpath='/' if not self.fullpath else '{}/'.format( NotifyMattermost.quote(self.fullpath, safe='/')), token=self.pprint(self.token, privacy, safe=''), @@ -390,3 +383,42 @@ def parse_url(url): 'image', NotifyMattermost.template_args['image']['default'])) return results + + @staticmethod + def parse_native_url(url): + """ + Support parsing the webhook straight from URL + https://HOST:443/workflows/WORKFLOWID/triggers/manual/paths/invoke + https://mattermost.HOST/hooks/TOKEN + """ + + # Match our workflows webhook URL and re-assemble + result = re.match( + r'^http(?P<secure>s?)://(?P<host>mattermost\.[A-Z0-9_.-]+)' + r'(:(?P<port>[1-9][0-9]{0,5}))?' + r'/hooks/' + r'(?P<token>[A-Z0-9_-]+)/?' + r'(?P<params>\?.+)?$', url, re.I) + + if result: + default_port = \ + int(result.group('port')) if result.group('port') else ( + 443 if result.group('secure') else 80) + + default_schema = \ + NotifyMattermost.secure_protocol \ + if result.group('secure') else NotifyMattermost.protocol + + # Construct our URL + return NotifyMattermost.parse_url( + '{schema}://{host}{port}/{token}' + '/{params}'.format( + schema=default_schema, + host=result.group('host'), + port='' if not result.group('port') + or int(result.group('port')) == default_port + else f':{default_port}', + token=result.group('token'), + params='' if not result.group('params') + else result.group('params'))) + return None diff --git a/libs/apprise/plugins/messagebird.py b/libs/apprise/plugins/messagebird.py index 053c59303..661ee1c4e 100644 --- a/libs/apprise/plugins/messagebird.py +++ b/libs/apprise/plugins/messagebird.py @@ -36,9 +36,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import validate_regex +from ..utils.parse import is_phone_no, parse_phone_no, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/misskey.py b/libs/apprise/plugins/misskey.py index 21d0250df..cd7292c46 100644 --- a/libs/apprise/plugins/misskey.py +++ b/libs/apprise/plugins/misskey.py @@ -49,7 +49,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ @@ -64,8 +64,6 @@ class MisskeyVisibility: FOLLOWERS = 'followers' - PRIVATE = 'private' - SPECIFIED = 'specified' @@ -74,7 +72,6 @@ class MisskeyVisibility: MisskeyVisibility.PUBLIC, MisskeyVisibility.HOME, MisskeyVisibility.FOLLOWERS, - MisskeyVisibility.PRIVATE, MisskeyVisibility.SPECIFIED, ) diff --git a/libs/apprise/plugins/mqtt.py b/libs/apprise/plugins/mqtt.py index 4b21bf288..bb003cdd9 100644 --- a/libs/apprise/plugins/mqtt.py +++ b/libs/apprise/plugins/mqtt.py @@ -41,8 +41,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import parse_list -from ..utils import parse_bool +from ..utils.parse import parse_list, parse_bool from ..locale import gettext_lazy as _ # Default our global support flag @@ -89,7 +88,7 @@ class NotifyMQTT(NotifyBase): requirements = { # Define our required packaging in order to work - 'packages_required': 'paho-mqtt < 2.0.0' + 'packages_required': 'paho-mqtt != 2.0.*' } # The default descriptive name associated with the Notification diff --git a/libs/apprise/plugins/msg91.py b/libs/apprise/plugins/msg91.py index cf5fea9b6..694ae9867 100644 --- a/libs/apprise/plugins/msg91.py +++ b/libs/apprise/plugins/msg91.py @@ -40,9 +40,8 @@ from json import dumps from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no, parse_bool -from ..utils import validate_regex +from ..utils.parse import ( + is_phone_no, parse_phone_no, parse_bool, validate_regex) from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/msteams.py b/libs/apprise/plugins/msteams.py index 83f85c79b..fa0f13307 100644 --- a/libs/apprise/plugins/msteams.py +++ b/libs/apprise/plugins/msteams.py @@ -85,10 +85,8 @@ from ..common import NotifyImageSize from ..common import NotifyType from ..common import NotifyFormat -from ..utils import parse_bool -from ..utils import validate_regex -from ..utils import apply_template -from ..utils import TemplateType +from ..utils.parse import parse_bool, validate_regex +from ..utils.templates import apply_template, TemplateType from ..apprise_attachment import AppriseAttachment from ..locale import gettext_lazy as _ @@ -118,6 +116,9 @@ class NotifyMSTeams(NotifyBase): notify_url_v2 = 'https://{team}.webhook.office.com/webhookb2/' \ '{token_a}/IncomingWebhook/{token_b}/{token_c}' + notify_url_v3 = 'https://{team}.webhook.office.com/webhookb2/' \ + '{token_a}/IncomingWebhook/{token_b}/{token_c}/{token_d}' + # Allows the user to specify the NotifyImageSize object image_size = NotifyImageSize.XY_72 @@ -176,6 +177,15 @@ class NotifyMSTeams(NotifyBase): 'required': True, 'regex': (r'^[a-z0-9-]+$', 'i'), }, + # Token required as part of the API request + # /........./........./........./DDDDDDDDDDDDDDDDD + 'token_d': { + 'name': _('Token D'), + 'type': 'string', + 'private': True, + 'required': False, + 'regex': (r'^V2[a-zA-Z0-9-_]+$', 'i'), + }, }) # Define our template arguments @@ -189,7 +199,7 @@ class NotifyMSTeams(NotifyBase): 'version': { 'name': _('Version'), 'type': 'choice:int', - 'values': (1, 2), + 'values': (1, 2, 3), 'default': 2, }, 'template': { @@ -207,8 +217,9 @@ class NotifyMSTeams(NotifyBase): }, } - def __init__(self, token_a, token_b, token_c, team=None, version=None, - include_image=True, template=None, tokens=None, **kwargs): + def __init__(self, token_a, token_b, token_c, token_d=None, team=None, + version=None, include_image=True, template=None, tokens=None, + **kwargs): """ Initialize Microsoft Teams Object @@ -271,6 +282,9 @@ def __init__(self, token_a, token_b, token_c, team=None, version=None, self.logger.warning(msg) raise TypeError(msg) + self.token_d = validate_regex( + token_d, *self.template_tokens['token_d']['regex']) + # Place a thumbnail image inline with the message body self.include_image = include_image @@ -294,12 +308,11 @@ def __init__(self, token_a, token_b, token_c, team=None, version=None, raise TypeError(msg) self.logger.deprecate( - "Microsoft is depricating their MSTeams webhooks on " + "Microsoft is deprecating their MSTeams webhooks on " "December 31, 2024. It is advised that you switch to " "Microsoft Power Automate (already supported by Apprise as " "workflows://. For more information visit: " "https://github.com/caronc/apprise/wiki/Notify_workflows") - return def gen_payload(self, body, title='', notify_type=NotifyType.INFO, **kwargs): @@ -403,17 +416,28 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): 'Content-Type': 'application/json', } - notify_url = self.notify_url_v2.format( - team=self.team, - token_a=self.token_a, - token_b=self.token_b, - token_c=self.token_c, - ) if self.version > 1 else \ - self.notify_url_v1.format( + if self.version == 1: + notify_url = self.notify_url_v1.format( token_a=self.token_a, token_b=self.token_b, token_c=self.token_c) + if self.version == 2: + notify_url = self.notify_url_v2.format( + team=self.team, + token_a=self.token_a, + token_b=self.token_b, + token_c=self.token_c, + ) + if self.version == 3: + notify_url = self.notify_url_v3.format( + team=self.team, + token_a=self.token_a, + token_b=self.token_b, + token_c=self.token_c, + token_d=self.token_d, + ) + # Generate our payload if it's possible payload = self.gen_payload( body=body, title=title, notify_type=notify_type, **kwargs) @@ -503,8 +527,20 @@ def url(self, privacy=False, *args, **kwargs): # Store any template entries if specified params.update({':{}'.format(k): v for k, v in self.tokens.items()}) - if self.version > 1: - return '{schema}://{team}/{token_a}/{token_b}/{token_c}/'\ + result = None + + if self.version == 1: + result = '{schema}://{token_a}/{token_b}/{token_c}/'\ + '?{params}'.format( + schema=self.secure_protocol, + token_a=self.pprint(self.token_a, privacy, safe='@'), + token_b=self.pprint(self.token_b, privacy, safe=''), + token_c=self.pprint(self.token_c, privacy, safe=''), + params=NotifyMSTeams.urlencode(params), + ) + + if self.version == 2: + result = '{schema}://{team}/{token_a}/{token_b}/{token_c}/'\ '?{params}'.format( schema=self.secure_protocol, team=NotifyMSTeams.quote(self.team, safe=''), @@ -514,15 +550,18 @@ def url(self, privacy=False, *args, **kwargs): params=NotifyMSTeams.urlencode(params), ) - else: # Version 1 - return '{schema}://{token_a}/{token_b}/{token_c}/'\ - '?{params}'.format( + if self.version == 3: + result = '{schema}://{team}/{token_a}/{token_b}/{token_c}/'\ + '{token_d}/?{params}'.format( schema=self.secure_protocol, - token_a=self.pprint(self.token_a, privacy, safe='@'), + team=NotifyMSTeams.quote(self.team, safe=''), + token_a=self.pprint(self.token_a, privacy, safe=''), token_b=self.pprint(self.token_b, privacy, safe=''), token_c=self.pprint(self.token_c, privacy, safe=''), + token_d=self.pprint(self.token_d, privacy, safe=''), params=NotifyMSTeams.urlencode(params), ) + return result @staticmethod def parse_url(url): @@ -561,6 +600,8 @@ def parse_url(url): else NotifyMSTeams.unquote(entries.pop(0)) results['token_c'] = None if not entries \ else NotifyMSTeams.unquote(entries.pop(0)) + results['token_d'] = None if not entries \ + else NotifyMSTeams.unquote(entries.pop(0)) # Get Image results['include_image'] = \ @@ -582,8 +623,13 @@ def parse_url(url): NotifyMSTeams.unquote(results['qsd']['version']) else: + version = 1 + if results.get('team'): + version = 2 + if results.get('token_d'): + version = 3 # Set our version if not otherwise set - results['version'] = 1 if not results.get('team') else 2 + results['version'] = version # Store our tokens results['tokens'] = results['qsd:'] @@ -598,11 +644,38 @@ def parse_native_url(url): New Hook Support: https://team-name.office.com/webhook/ABCD/IncomingWebhook/DEFG/HIJK + + Newer Hook Support: + https://team-name.office.com/webhook/ABCD/IncomingWebhook/DEFG/HIJK/V2LMNOP """ # We don't need to do incredibly details token matching as the purpose # of this is just to detect that were dealing with an msteams url # token parsing will occur once we initialize the function + result = re.match( + r'^https?://(?P<team>[^.]+)(?P<v2a>\.webhook)?\.office\.com/' + r'webhook(?P<v2b>b2)?/' + r'(?P<token_a>[A-Z0-9-]+@[A-Z0-9-]+)/' + r'IncomingWebhook/' + r'(?P<token_b>[A-Z0-9]+)/' + r'(?P<token_c>[A-Z0-9-]+)/' + r'(?P<token_d>V2[A-Z0-9-_]+)/?' + r'(?P<params>\?.+)?$', url, re.I) + + if result: + # Version 3 URL + return NotifyMSTeams.parse_url( + '{schema}://{team}/{token_a}/{token_b}/{token_c}/{token_d}' + '/{params}'.format( + schema=NotifyMSTeams.secure_protocol, + team=result.group('team'), + token_a=result.group('token_a'), + token_b=result.group('token_b'), + token_c=result.group('token_c'), + token_d=result.group('token_d'), + params='' if not result.group('params') + else result.group('params'))) + result = re.match( r'^https?://(?P<team>[^.]+)(?P<v2a>\.webhook)?\.office\.com/' r'webhook(?P<v2b>b2)?/' diff --git a/libs/apprise/plugins/nextcloud.py b/libs/apprise/plugins/nextcloud.py index 7afe2d9af..a0f28aff4 100644 --- a/libs/apprise/plugins/nextcloud.py +++ b/libs/apprise/plugins/nextcloud.py @@ -31,7 +31,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import parse_list +from ..utils.parse import parse_list from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/nextcloudtalk.py b/libs/apprise/plugins/nextcloudtalk.py index 7ba953c3d..9c72be500 100644 --- a/libs/apprise/plugins/nextcloudtalk.py +++ b/libs/apprise/plugins/nextcloudtalk.py @@ -32,7 +32,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import parse_list +from ..utils.parse import parse_list from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/notica.py b/libs/apprise/plugins/notica.py index 9c5778af2..e08f48568 100644 --- a/libs/apprise/plugins/notica.py +++ b/libs/apprise/plugins/notica.py @@ -46,7 +46,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/notifiarr.py b/libs/apprise/plugins/notifiarr.py index dcb940a2b..ffb29b361 100644 --- a/libs/apprise/plugins/notifiarr.py +++ b/libs/apprise/plugins/notifiarr.py @@ -35,8 +35,7 @@ from ..common import NotifyType from ..locale import gettext_lazy as _ from ..common import NotifyImageSize -from ..utils import parse_list, parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_list, parse_bool, validate_regex from .discord import USER_ROLE_DETECTION_RE # Used to break path apart into list of channels diff --git a/libs/apprise/plugins/notifico.py b/libs/apprise/plugins/notifico.py index db88bf6b2..b343d4331 100644 --- a/libs/apprise/plugins/notifico.py +++ b/libs/apprise/plugins/notifico.py @@ -46,8 +46,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_bool, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/ntfy.py b/libs/apprise/plugins/ntfy.py index 76ee2118b..8ad5c70dc 100644 --- a/libs/apprise/plugins/ntfy.py +++ b/libs/apprise/plugins/ntfy.py @@ -46,11 +46,8 @@ from ..common import NotifyType from ..common import NotifyImageSize from ..locale import gettext_lazy as _ -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import is_hostname -from ..utils import is_ipaddr -from ..utils import validate_regex +from ..utils.parse import ( + parse_list, parse_bool, is_hostname, is_ipaddr, validate_regex) from ..url import PrivacyMode from ..attachment.base import AttachBase from ..attachment.memory import AttachMemory diff --git a/libs/apprise/plugins/office365.py b/libs/apprise/plugins/office365.py index 21a1d6fa0..2f0f4ca88 100644 --- a/libs/apprise/plugins/office365.py +++ b/libs/apprise/plugins/office365.py @@ -33,45 +33,25 @@ # Information on sending an email: # https://docs.microsoft.com/en-us/graph/api/user-sendmail\ # ?view=graph-rest-1.0&tabs=http - -# Steps to get your Microsoft Client ID, Client Secret, and Tenant ID: -# 1. You should have valid Microsoft personal account. Go to Azure Portal -# 2. Go to -> Microsoft Active Directory --> App Registrations -# 3. Click new -> give any name (your choice) in Name field -> select -# personal Microsoft accounts only --> Register -# 4. Now you have your client_id & Tenant id. -# 5. To create client_secret , go to active directory -> -# Certificate & Tokens -> New client secret -# **This is auto-generated string which may have '@' and '?' -# characters in it. You should encode these to prevent -# from having any issues.** -# 6. Now need to set permission Active directory -> API permissions -> -# Add permission (search mail) , add relevant permission. -# 7. Set the redirect uri (Web) to: -# https://login.microsoftonline.com/common/oauth2/nativeclient -# -# ...and click register. # -# This needs to be inserted into the "Redirect URI" text box as simply -# checking the check box next to this link seems to be insufficient. -# This is the default redirect uri used by this library, but you can use -# any other if you want. +# Note: One must set up Application Permissions (not Delegated Permissions) +# - Scopes required: Mail.Send +# - For Large Attachments: Mail.ReadWrite +# - For Email Lookups: User.Read.All # -# 8. Now you're good to go - import requests +import json +from uuid import uuid4 from datetime import datetime from datetime import timedelta -from json import loads -from json import dumps from .base import NotifyBase +from .. import exception from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType -from ..utils import is_email -from ..utils import parse_emails -from ..utils import validate_regex +from ..utils.parse import is_email, parse_emails, validate_regex from ..locale import gettext_lazy as _ +from ..common import PersistentStoreMode class NotifyOffice365(NotifyBase): @@ -86,7 +66,7 @@ class NotifyOffice365(NotifyBase): service_url = 'https://office.com/' # The default protocol - secure_protocol = 'o365' + secure_protocol = ('azure', 'o365') # Allow 300 requests per minute. # 60/300 = 0.2 @@ -101,6 +81,20 @@ class NotifyOffice365(NotifyBase): # Authentication URL auth_url = 'https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token' + # Support attachments + attachment_support = True + + # Our default is to no not use persistent storage beyond in-memory + # reference + storage_mode = PersistentStoreMode.AUTO + + # the maximum size an attachment can be for it to be allowed to be + # uploaded inline with the current email going out (one http post) + # Anything larger than this and a second PUT request is required to + # the outlook server to post the content through reference. + # Currently (as of 2024.10.06) this was documented to be 3MB + outlook_attachment_inline_max = 3145728 + # Use all the direct application permissions you have configured for your # app. The endpoint should issue a token for the ones associated with the # resource you want to use. @@ -113,8 +107,9 @@ class NotifyOffice365(NotifyBase): # Define object templates templates = ( - '{schema}://{tenant}:{email}/{client_id}/{secret}', - '{schema}://{tenant}:{email}/{client_id}/{secret}/{targets}', + # Send as user (only supported method) + '{schema}://{source}/{tenant}/{client_id}/{secret}', + '{schema}://{source}/{tenant}/{client_id}/{secret}/{targets}', ) # Define our template tokens @@ -126,8 +121,8 @@ class NotifyOffice365(NotifyBase): 'private': True, 'regex': (r'^[a-z0-9-]+$', 'i'), }, - 'email': { - 'name': _('Account Email'), + 'source': { + 'name': _('Account Email or Object ID'), 'type': 'string', 'required': True, }, @@ -176,7 +171,7 @@ class NotifyOffice365(NotifyBase): }, }) - def __init__(self, tenant, email, client_id, secret, + def __init__(self, tenant, client_id, secret, source=None, targets=None, cc=None, bcc=None, **kwargs): """ Initialize Office 365 Object @@ -192,15 +187,8 @@ def __init__(self, tenant, email, client_id, secret, self.logger.warning(msg) raise TypeError(msg) - result = is_email(email) - if not result: - msg = 'An invalid Office 365 Email Account ID' \ - '({}) was specified.'.format(email) - self.logger.warning(msg) - raise TypeError(msg) - - # Otherwise store our the email address - self.email = result['full_email'] + # Store our email/ObjectID Source + self.source = source # Client Key (associated with generated OAuth2 Login) self.client_id = validate_regex( @@ -247,8 +235,14 @@ def __init__(self, tenant, email, client_id, secret, .format(recipient)) else: - # If our target email list is empty we want to add ourselves to it - self.targets.append((False, self.email)) + result = is_email(self.source) + if not result: + self.logger.warning('No Target Office 365 Email Detected') + + else: + # If our target email list is empty we want to add ourselves to + # it + self.targets.append((False, self.source)) # Validate recipients (cc:) and drop bad ones: for recipient in parse_emails(cc): @@ -288,9 +282,23 @@ def __init__(self, tenant, email, client_id, secret, # Presume that our token has expired 'now' self.token_expiry = datetime.now() + # Our email source; we detect this if the source is an ObjectID + # If it is unknown we set this to None + # User is the email associated with the account + self.from_email = self.store.get('from') + result = is_email(self.source) + if result: + self.from_email = result['full_email'] + self.from_name = \ + result['name'] or self.store.get('name') + + else: + self.from_name = self.store.get('name') + return - def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + def send(self, body, title='', notify_type=NotifyType.INFO, attach=None, + **kwargs): """ Perform Office 365 Notification """ @@ -304,31 +312,143 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): 'There are no Email recipients to notify') return False + if self.from_email is None: + if not self.authenticate(): + # We could not authenticate ourselves; we're done + return False + + # Acquire our from_email + url = "https://graph.microsoft.com/v1.0/users/{}".format( + self.source) + postokay, response = self._fetch(url=url, method='GET') + if not postokay: + self.logger.warning( + 'Could not acquire From email address; ensure ' + '"User.Read.All" Application scope is set!') + + else: # Acquire our from_email (if possible) + from_email = \ + response.get("mail") or response.get("userPrincipalName") + result = is_email(from_email) + if not result: + self.logger.warning( + 'Could not get From email from the Azure endpoint.') + + # Prevent re-occuring upstream fetches for info that isn't + # there + self.from_email = False + + else: + # Store our email for future reference + self.from_email = result['full_email'] + self.store.set('from', result['full_email']) + + self.from_name = response.get("displayName") + if self.from_name: + self.store.set('name', self.from_name) + # Setup our Content Type content_type = \ 'HTML' if self.notify_format == NotifyFormat.HTML else 'Text' # Prepare our payload payload = { - 'Message': { - 'Subject': title, - 'Body': { - 'ContentType': content_type, - 'Content': body, + 'message': { + 'subject': title, + 'body': { + 'contentType': content_type, + 'content': body, }, }, - 'SaveToSentItems': 'false' + # Below takes a string (not bool) of either 'true' or 'false' + 'saveToSentItems': 'true' } + if self.from_email: + # Apply from email if it is known + payload.update({ + 'message': { + 'from': { + "emailAddress": { + "address": self.from_email, + "name": self.from_name or self.app_id, + } + }, + } + }) + # Create a copy of the email list emails = list(self.targets) # Define our URL to post to - url = '{graph_url}/v1.0/users/{email}/sendmail'.format( - email=self.email, + url = '{graph_url}/v1.0/users/{userid}/sendMail'.format( graph_url=self.graph_url, + userid=self.source, ) + # Prepare our Draft URL + draft_url = \ + '{graph_url}/v1.0/users/{userid}/messages' \ + .format( + graph_url=self.graph_url, + userid=self.source, + ) + + small_attachments = [] + large_attachments = [] + + # draft emails + drafts = [] + + if attach and self.attachment_support: + for no, attachment in enumerate(attach, start=1): + # Perform some simple error checking + if not attachment: + # We could not access the attachment + self.logger.error( + 'Could not access Office 365 attachment {}.'.format( + attachment.url(privacy=True))) + return False + + if len(attachment) > self.outlook_attachment_inline_max: + # Messages larger then xMB need to be uploaded after; a + # draft email must be prepared; below is our session + large_attachments.append({ + 'obj': attachment, + 'name': attachment.name + if attachment.name else f'file{no:03}.dat', + }) + continue + + try: + # Prepare our Attachment in Base64 + small_attachments.append({ + "@odata.type": "#microsoft.graph.fileAttachment", + # Name of the attachment (as it should appear in email) + "name": attachment.name + if attachment.name else f'file{no:03}.dat', + # MIME type of the attachment + "contentType": "attachment.mimetype", + # Base64 Content + "contentBytes": attachment.base64(), + + }) + + except exception.AppriseException: + # We could not access the attachment + self.logger.error( + 'Could not access Office 365 attachment {}.'.format( + attachment.url(privacy=True))) + return False + + self.logger.debug( + 'Appending Office 365 attachment {}'.format( + attachment.url(privacy=True))) + + if small_attachments: + # Store Attachments + payload['message']['attachments'] = small_attachments + while len(emails): # authenticate ourselves if we aren't already; but this function # also tracks if our token we have is still valid and will @@ -347,63 +467,197 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): bcc = (self.bcc - set([to_addr])) # Prepare our email - payload['Message']['ToRecipients'] = [{ - 'EmailAddress': { - 'Address': to_addr + payload['message']['toRecipients'] = [{ + 'emailAddress': { + 'address': to_addr } }] if to_name: # Apply our To Name - payload['Message']['ToRecipients'][0]['EmailAddress']['Name'] \ + payload['message']['toRecipients'][0]['emailAddress']['name'] \ = to_name - self.logger.debug('Email To: {}'.format(to_addr)) + self.logger.debug('{}Email To: {}'.format( + 'Draft' if large_attachments else '', to_addr)) if cc: # Prepare our CC list - payload['Message']['CcRecipients'] = [] + payload['message']['ccRecipients'] = [] for addr in cc: - _payload = {'Address': addr} + _payload = {'address': addr} if self.names.get(addr): - _payload['Name'] = self.names[addr] + _payload['name'] = self.names[addr] # Store our address in our payload - payload['Message']['CcRecipients']\ - .append({'EmailAddress': _payload}) + payload['message']['ccRecipients']\ + .append({'emailAddress': _payload}) - self.logger.debug('Email Cc: {}'.format(', '.join( - ['{}{}'.format( - '' if self.names.get(e) - else '{}: '.format(self.names[e]), e) for e in cc]))) + self.logger.debug('{}Email Cc: {}'.format( + 'Draft' if large_attachments else '', ', '.join( + ['{}{}'.format( + '' if self.names.get(e) + else '{}: '.format( + self.names[e]), e) for e in cc]))) if bcc: # Prepare our CC list - payload['Message']['BccRecipients'] = [] + payload['message']['bccRecipients'] = [] for addr in bcc: - _payload = {'Address': addr} + _payload = {'address': addr} if self.names.get(addr): - _payload['Name'] = self.names[addr] + _payload['name'] = self.names[addr] # Store our address in our payload - payload['Message']['BccRecipients']\ - .append({'EmailAddress': _payload}) + payload['message']['bccRecipients']\ + .append({'emailAddress': _payload}) - self.logger.debug('Email Bcc: {}'.format(', '.join( - ['{}{}'.format( - '' if self.names.get(e) - else '{}: '.format(self.names[e]), e) for e in bcc]))) + self.logger.debug('{}Email Bcc: {}'.format( + 'Draft' if large_attachments else '', ', '.join( + ['{}{}'.format( + '' if self.names.get(e) + else '{}: '.format( + self.names[e]), e) for e in bcc]))) - # Perform upstream fetch + # Perform upstream post postokay, response = self._fetch( - url=url, payload=dumps(payload), - content_type='application/json') + url=url if not large_attachments + else draft_url, payload=payload) # Test if we were okay if not postokay: has_error = True + elif large_attachments: + # We have large attachments now to upload and associate with + # our message. We need to prepare a draft message; acquire + # the message-id associated with it and then attach the file + # via this means. + + # Acquire our Draft ID to work with + message_id = response.get("id") + if not message_id: + self.logger.warning( + 'Email Draft ID could not be retrieved') + has_error = True + continue + + self.logger.debug('Email Draft ID: {}'.format(message_id)) + # In future, the below could probably be called via async + has_attach_error = False + for attachment in large_attachments: + if not self.upload_attachment( + attachment['obj'], message_id, attachment['name']): + self.logger.warning( + 'Could not prepare attachment session for %s', + attachment['name']) + + has_error = True + has_attach_error = True + # Take early exit + break + + if has_attach_error: + continue + + # Send off our draft + attach_url = \ + "https://graph.microsoft.com/v1.0/users/" \ + "{}/messages/{}/send" + + attach_url = attach_url.format( + self.source, + message_id, + ) + + # Trigger our send + postokay, response = self._fetch(url=url) + if not postokay: + self.logger.warning( + 'Could not send drafted email id: {} ', message_id) + has_error = True + continue + + # Memory management + del small_attachments + del large_attachments + del drafts + return not has_error + def upload_attachment(self, attachment, message_id, name=None): + """ + Uploads an attachment to a session + """ + + # Perform some simple error checking + if not attachment: + # We could not access the attachment + self.logger.error( + 'Could not access Office 365 attachment {}.'.format( + attachment.url(privacy=True))) + return False + + # Our Session URL + url = \ + '{graph_url}/v1.0/users/{userid}/message/{message_id}' \ + .format( + graph_url=self.graph_url, + userid=self.source, + message_id=message_id, + ) + '/attachments/createUploadSession' + + file_size = len(attachment) + + payload = { + "AttachmentItem": { + "attachmentType": "file", + "name": name if name else ( + attachment.name + if attachment.name else '{}.dat'.format(str(uuid4()))), + # MIME type of the attachment + "contentType": attachment.mimetype, + "size": file_size, + } + } + + if not self.authenticate(): + # We could not authenticate ourselves; we're done + return False + + # Get our Upload URL + postokay, response = self._fetch(url, payload) + if not postokay: + return False + + upload_url = response.get('uploadUrl') + if not upload_url: + return False + + start_byte = 0 + postokay = False + response = None + + for chunk in attachment.chunk(): + end_byte = start_byte + len(chunk) - 1 + + # Define headers for this chunk + headers = { + 'User-Agent': self.app_id, + 'Content-Length': str(len(chunk)), + 'Content-Range': + f'bytes {start_byte}-{end_byte}/{file_size}' + } + + # Upload the chunk + postokay, response = self._fetch( + upload_url, chunk, headers=headers, content_type=None, + method='PUT') + if not postokay: + return False + + # Return our Upload URL + return postokay + def authenticate(self): """ Logs into and acquires us an authentication token to work with @@ -420,12 +674,12 @@ def authenticate(self): # Prepare our payload payload = { + 'grant_type': 'client_credentials', 'client_id': self.client_id, 'client_secret': self.secret, 'scope': '{graph_url}/{scope}'.format( graph_url=self.graph_url, scope=self.scope), - 'grant_type': 'client_credentials', } # Prepare our URL @@ -453,7 +707,9 @@ def authenticate(self): # "correlation_id": "fb3d2015-bc17-4bb9-bb85-30c5cf1aaaa7" # } - postokay, response = self._fetch(url=url, payload=payload) + postokay, response = self._fetch( + url=url, payload=payload, + content_type='application/x-www-form-urlencoded') if not postokay: return False @@ -480,18 +736,19 @@ def authenticate(self): # We're authenticated return True if self.token else False - def _fetch(self, url, payload, - content_type='application/x-www-form-urlencoded'): + def _fetch(self, url, payload=None, headers=None, + content_type='application/json', method='POST'): """ Wrapper to request object """ # Prepare our headers: - headers = { - 'User-Agent': self.app_id, - 'Content-Type': content_type, - } + if not headers: + headers = { + 'User-Agent': self.app_id, + 'Content-Type': content_type, + } if self.token: # Are we authenticated? @@ -501,36 +758,84 @@ def _fetch(self, url, payload, content = {} # Some Debug Logging - self.logger.debug('Office 365 POST URL: {} (cert_verify={})'.format( - url, self.verify_certificate)) + self.logger.debug('Office 365 %s URL: {} (cert_verify={})'.format( + url, self.verify_certificate), method) self.logger.debug('Office 365 Payload: {}' .format(payload)) # Always call throttle before any remote server i/o is made self.throttle() # fetch function + req = requests.post if method == 'POST' else ( + requests.put if method == 'PUT' else requests.get) + try: - r = requests.post( + r = req( url, - data=payload, + data=json.dumps(payload) + if content_type and content_type.endswith('/json') + else payload, headers=headers, verify=self.verify_certificate, timeout=self.request_timeout, ) if r.status_code not in ( - requests.codes.ok, requests.codes.accepted): + requests.codes.ok, requests.codes.created, + requests.codes.accepted): # We had a problem status_str = \ NotifyOffice365.http_response_code_lookup(r.status_code) self.logger.warning( - 'Failed to send Office 365 POST to {}: ' + 'Failed to send Office 365 %s to {}: ' '{}error={}.'.format( url, ', ' if status_str else '', - r.status_code)) + r.status_code), method) + + # A Response could look like this if a Scope element was not + # found: + # { + # "error": { + # "code": "MissingClaimType", + # "message":"The token is missing the claim type \'oid\'.", + # "innerError": { + # "oAuthEventOperationId":" 7abe20-339f-4659-9381-38f52", + # "oAuthEventcV": "xsOSpAHSHVm3Tp4SNH5oIA.1.1", + # "errorUrl": "https://url", + # "requestId": "2328ea-ec9e-43a8-80f4-164c", + # "date":"2024-12-01T02:03:13" + # }} + # } + + # Error 403; the below is returned if he User.Read.All + # Application scope is not set and a lookup is + # attempted. + # { + # "error": { + # "code": "Authorization_RequestDenied", + # "message": + # "Insufficient privileges to complete the operation.", + # "innerError": { + # "date": "2024-12-06T00:15:57", + # "request-id": + # "48fdb3e7-2f1a-4f45-a5a0-99b8b851278b", + # "client-request-id": "48f-2f1a-4f45-a5a0-99b8" + # } + # } + # } + + # Another response type (error 415): + # { + # "error": { + # "code": "RequestBodyRead", + # "message": "A missing or empty content type header was \ + # found when trying to read a message. The content \ + # type header is required.", + # } + # } self.logger.debug( 'Response Details:\r\n{}'.format(r.content)) @@ -539,7 +844,7 @@ def _fetch(self, url, payload, return (False, content) try: - content = loads(r.content) + content = json.loads(r.content) except (AttributeError, TypeError, ValueError): # ValueError = r.content is Unparsable @@ -549,8 +854,8 @@ def _fetch(self, url, payload, except requests.RequestException as e: self.logger.warning( - 'Exception received when sending Office 365 POST to {}: '. - format(url)) + 'Exception received when sending Office 365 %s to {}: '. + format(url), method) self.logger.debug('Socket Exception: %s' % str(e)) # Mark our failure @@ -566,7 +871,7 @@ def url_identifier(self): here. """ return ( - self.secure_protocol, self.email, self.tenant, self.client_id, + self.secure_protocol[0], self.source, self.tenant, self.client_id, self.secret, ) @@ -575,7 +880,7 @@ def url(self, privacy=False, *args, **kwargs): Returns the URL built dynamically based on specified arguments. """ - # Our URL parameters + # Extend our parameters params = self.url_parameters(privacy=privacy, *args, **kwargs) if self.cc: @@ -592,13 +897,13 @@ def url(self, privacy=False, *args, **kwargs): '' if not self.names.get(e) else '{}:'.format(self.names[e]), e) for e in self.bcc]) - return '{schema}://{tenant}:{email}/{client_id}/{secret}' \ + return '{schema}://{source}/{tenant}/{client_id}/{secret}' \ '/{targets}/?{params}'.format( - schema=self.secure_protocol, + schema=self.secure_protocol[0], tenant=self.pprint(self.tenant, privacy, safe=''), # email does not need to be escaped because it should # already be a valid host and username at this point - email=self.email, + source=self.source, client_id=self.pprint(self.client_id, privacy, safe=''), secret=self.pprint( self.secret, privacy, mode=PrivacyMode.Secret, @@ -606,7 +911,7 @@ def url(self, privacy=False, *args, **kwargs): targets='/'.join( [NotifyOffice365.quote('{}{}'.format( '' if not e[0] else '{}:'.format(e[0]), e[1]), - safe='') for e in self.targets]), + safe='@') for e in self.targets]), params=NotifyOffice365.urlencode(params)) def __len__(self): @@ -635,16 +940,52 @@ def parse_url(url): # of the secret key (since it can contain slashes in it) entries = NotifyOffice365.split_path(results['fullpath']) - try: + # Initialize our tenant + results['tenant'] = None + + # Initialize our email + results['email'] = None + + # From Email + if 'from' in results['qsd'] and \ + len(results['qsd']['from']): + # Extract the sending account's information + results['source'] = \ + NotifyOffice365.unquote(results['qsd']['from']) + + # If tenant is occupied, then the user defined makes up our source + elif results['user']: + results['source'] = '{}@{}'.format( + NotifyOffice365.unquote(results['user']), + NotifyOffice365.unquote(results['host']), + ) + + else: + # Object ID instead of email + results['source'] = NotifyOffice365.unquote(results['host']) + + # Tenant + if 'tenant' in results['qsd'] and len(results['qsd']['tenant']): + # Extract the Tenant from the argument + results['tenant'] = \ + NotifyOffice365.unquote(results['qsd']['tenant']) + + elif entries: + results['tenant'] = NotifyOffice365.unquote(entries.pop(0)) + + # OAuth2 ID + if 'oauth_id' in results['qsd'] and len(results['qsd']['oauth_id']): + # Extract the API Key from an argument + results['client_id'] = \ + NotifyOffice365.unquote(results['qsd']['oauth_id']) + + elif entries: # Get our client_id is the first entry on the path results['client_id'] = NotifyOffice365.unquote(entries.pop(0)) - except IndexError: - # no problem, we may get the client_id another way through - # arguments... - pass - + # # Prepare our target listing + # results['targets'] = list() while entries: # Pop the last entry @@ -662,36 +1003,6 @@ def parse_url(url): # We're done break - # Initialize our tenant - results['tenant'] = None - - # Assemble our secret key which is a combination of the host followed - # by all entries in the full path that follow up until the first email - results['secret'] = '/'.join( - [NotifyOffice365.unquote(x) for x in entries]) - - # Assemble our client id from the user@hostname - if results['password']: - results['email'] = '{}@{}'.format( - NotifyOffice365.unquote(results['password']), - NotifyOffice365.unquote(results['host']), - ) - # Update our tenant - results['tenant'] = NotifyOffice365.unquote(results['user']) - - else: - # No tenant specified.. - results['email'] = '{}@{}'.format( - NotifyOffice365.unquote(results['user']), - NotifyOffice365.unquote(results['host']), - ) - - # OAuth2 ID - if 'oauth_id' in results['qsd'] and len(results['qsd']['oauth_id']): - # Extract the API Key from an argument - results['client_id'] = \ - NotifyOffice365.unquote(results['qsd']['oauth_id']) - # OAuth2 Secret if 'oauth_secret' in results['qsd'] and \ len(results['qsd']['oauth_secret']): @@ -699,19 +1010,12 @@ def parse_url(url): results['secret'] = \ NotifyOffice365.unquote(results['qsd']['oauth_secret']) - # Tenant - if 'from' in results['qsd'] and \ - len(results['qsd']['from']): - # Extract the sending account's information - results['email'] = \ - NotifyOffice365.unquote(results['qsd']['from']) - - # Tenant - if 'tenant' in results['qsd'] and \ - len(results['qsd']['tenant']): - # Extract the Tenant from the argument - results['tenant'] = \ - NotifyOffice365.unquote(results['qsd']['tenant']) + else: + # Assemble our secret key which is a combination of the host + # followed by all entries in the full path that follow up until + # the first email + results['secret'] = '/'.join( + [NotifyOffice365.unquote(x) for x in entries]) # Support the 'to' variable so that we can support targets this way too # The 'to' makes it easier to use yaml configuration diff --git a/libs/apprise/plugins/one_signal.py b/libs/apprise/plugins/one_signal.py index 0bac77ee2..faebdf66c 100644 --- a/libs/apprise/plugins/one_signal.py +++ b/libs/apprise/plugins/one_signal.py @@ -40,12 +40,8 @@ from .base import NotifyBase from ..common import NotifyType from ..common import NotifyImageSize -from ..utils import decode_b64_dict -from ..utils import encode_b64_dict -from ..utils import validate_regex -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import is_email +from ..utils.base64 import decode_b64_dict, encode_b64_dict +from ..utils.parse import validate_regex, parse_list, parse_bool, is_email from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/opsgenie.py b/libs/apprise/plugins/opsgenie.py index 228ba7557..1c4c3b244 100644 --- a/libs/apprise/plugins/opsgenie.py +++ b/libs/apprise/plugins/opsgenie.py @@ -53,10 +53,7 @@ from .base import NotifyBase from ..common import NotifyType, NOTIFY_TYPES from ..common import PersistentStoreMode -from ..utils import validate_regex -from ..utils import is_uuid -from ..utils import parse_list -from ..utils import parse_bool +from ..utils.parse import validate_regex, is_uuid, parse_list, parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/pagerduty.py b/libs/apprise/plugins/pagerduty.py index 51bd38887..3c876e2be 100644 --- a/libs/apprise/plugins/pagerduty.py +++ b/libs/apprise/plugins/pagerduty.py @@ -38,8 +38,7 @@ from ..url import PrivacyMode from ..common import NotifyType from ..common import NotifyImageSize -from ..utils import validate_regex -from ..utils import parse_bool +from ..utils.parse import validate_regex, parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/pagertree.py b/libs/apprise/plugins/pagertree.py index 7d82f677c..57434f61f 100644 --- a/libs/apprise/plugins/pagertree.py +++ b/libs/apprise/plugins/pagertree.py @@ -33,8 +33,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/parseplatform.py b/libs/apprise/plugins/parseplatform.py index 808c3099c..f6a6248d7 100644 --- a/libs/apprise/plugins/parseplatform.py +++ b/libs/apprise/plugins/parseplatform.py @@ -32,7 +32,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ # Used to break path apart into list of targets diff --git a/libs/apprise/plugins/plivo.py b/libs/apprise/plugins/plivo.py new file mode 100644 index 000000000..893c0e94b --- /dev/null +++ b/libs/apprise/plugins/plivo.py @@ -0,0 +1,403 @@ +# -*- coding: utf-8 -*- +# BSD 3-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2023, Chris Caron <lead2gold@gmail.com> +# +# 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. + +# Create an account https://messagebird.com if you don't already have one +# +# Get your auth_id and auth token from the dashboard here: +# - https://console.plivo.com/dashboard/ +# + +import requests + +from json import dumps +from .base import NotifyBase +from ..common import NotifyType +from ..utils.parse import ( + parse_bool, is_phone_no, parse_phone_no, validate_regex) +from ..locale import gettext_lazy as _ + + +class NotifyPlivo(NotifyBase): + """ + A wrapper for Plivo Notifications + """ + + # The default descriptive name associated with the Notification + service_name = 'Plivo' + + # The services URL + service_url = 'https://plivo.com' + + # The default protocol + secure_protocol = 'plivo' + + # A URL that takes you to the setup/help of the specific protocol + setup_url = 'https://github.com/caronc/apprise/wiki/Notify_plivo' + + # Plivo uses the http protocol with JSON requests + notify_url = 'https://api.plivo.com/v1/Account/{auth_id}/Message/' + + # The maximum number of messages that can be sent in a single batch + default_batch_size = 20 + + # The maximum length of the body + body_maxlen = 140 + + # A title can not be used for SMS Messages. Setting this to zero will + # cause any title (if defined) to get placed into the message body. + title_maxlen = 0 + + # Define object templates + templates = ( + '{schema}://{auth_id}@{token}/{source}', + '{schema}://{auth_id}@{token}/{source}/{targets}', + ) + + # Define our template tokens + template_tokens = dict(NotifyBase.template_tokens, **{ + 'auth_id': { + 'name': _('Auth ID'), + 'type': 'string', + 'required': True, + 'regex': (r'^[a-z0-9]{20,30}$', 'i'), + }, + 'token': { + 'name': _('Auth Token'), + 'type': 'string', + 'required': True, + 'regex': (r'^[a-z0-9]{30,50}$', 'i'), + }, + 'source': { + 'name': _('Source Phone No'), + 'type': 'string', + 'prefix': '+', + 'required': True, + 'regex': (r'^[0-9\s)(+-]+$', 'i'), + }, + 'target_phone': { + 'name': _('Target Phone No'), + 'type': 'string', + 'prefix': '+', + 'regex': (r'^[0-9\s)(+-]+$', 'i'), + 'map_to': 'targets', + }, + 'targets': { + 'name': _('Targets'), + 'type': 'list:string', + } + }) + + # Define our template arguments + template_args = dict(NotifyBase.template_args, **{ + 'to': { + 'alias_of': 'targets', + }, + 'from': { + 'alias_of': 'source', + }, + 'token': { + 'alias_of': 'token', + }, + 'id': { + 'alias_of': 'auth_id', + }, + 'batch': { + 'name': _('Batch Mode'), + 'type': 'bool', + 'default': False, + }, + }) + + def __init__(self, auth_id, token, source, targets=None, batch=None, + **kwargs): + """ + Initialize Plivo Object + """ + super(NotifyPlivo, self).__init__(**kwargs) + + self.auth_id = validate_regex( + auth_id, *self.template_tokens['auth_id']['regex']) + if not self.auth_id: + msg = 'The Plivo authentication ID specified ({}) is ' \ + 'invalid.'.format(auth_id) + self.logger.warning(msg) + raise TypeError(msg) + + self.token = validate_regex( + token, *self.template_tokens['token']['regex']) + if not self.token: + msg = 'The Plivo authentication token specified ({}) is ' \ + 'invalid.'.format(token) + self.logger.warning(msg) + raise TypeError(msg) + + result = is_phone_no(source) + if not result: + msg = 'The Plivo source specified ({}) is invalid.'\ + .format(source) + self.logger.warning(msg) + raise TypeError(msg) + + # Store our source; enforce E.164 format + self.source = f'+{result["full"]}' + + # Parse our targets + self.targets = list() + + if targets: + for target in parse_phone_no(targets): + # Validate targets and drop bad ones: + result = is_phone_no(target) + if result: + # store valid phone number; enforce E.164 format + self.targets.append(f'+{result["full"]}') + continue + + self.logger.warning( + 'Dropped invalid phone # ' + '({}) specified.'.format(target), + ) + else: + # No sources specified, use our own phone no + self.targets.append(self.source) + + # Set batch + self.batch = batch if batch is not None \ + else self.template_args['batch']['default'] + + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + """ + Perform Plivo Notification + """ + + if not self.targets: + # There were no services to notify + self.logger.warning( + 'There were no Plivo targets to notify.') + return False + + # Initialize our has_error flag + has_error = False + + # Prepare our headers + headers = { + 'User-Agent': self.app_id, + 'Content-Type': 'application/json', + } + + # Prepare our authentication + auth = (self.auth_id, self.token) + + # Prepare our payload + payload = { + 'src': self.source, + 'dst': None, + 'text': body, + } + + # Send in batches if identified to do so + batch_size = 1 if not self.batch else self.default_batch_size + + for index in range(0, len(self.targets), batch_size): + # Prepare our phone no (< delimits more then one) + payload['recipients'] = \ + ','.join(self.targets[index:index + batch_size]) + + # Some Debug Logging + self.logger.debug( + 'Plivo POST URL: {} (cert_verify={})'.format( + self.notify_url, self.verify_certificate)) + self.logger.debug('Plivo Payload: {}' .format(payload)) + + # Always call throttle before any remote server i/o is made + self.throttle() + try: + r = requests.post( + self.notify_url, + data=dumps(payload), + headers=headers, + auth=auth, + verify=self.verify_certificate, + timeout=self.request_timeout, + ) + + if r.status_code not in ( + requests.codes.ok, requests.codes.accepted): + # We had a problem + status_str = \ + NotifyPlivo.http_response_code_lookup( + r.status_code) + + self.logger.warning( + 'Failed to send {} Plivo notification{}: ' + '{}{}error={}.'.format( + len(self.targets[index:index + batch_size]), + ' to {}'.format(self.targets[index]) + if batch_size == 1 else '(s)', + status_str, + ', ' if status_str else '', + r.status_code)) + + self.logger.debug( + 'Response Details:\r\n{}'.format(r.content)) + + # Mark our failure + has_error = True + continue + + else: + self.logger.info( + 'Send {} Plivo notification{}'.format( + len(self.targets[index:index + batch_size]), + ' to {}'.format(self.targets[index]) + if batch_size == 1 else '(s)', + )) + + except requests.RequestException as e: + self.logger.warning( + 'A Connection error occured sending Plivo:%s ' % ( + self.targets) + 'notification.' + ) + self.logger.debug('Socket Exception: %s' % str(e)) + + # Mark our failure + has_error = True + continue + + return not has_error + + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return ( + self.secure_protocol if self.secure else self.protocol, + self.auth_id, self.token, self.source, + ) + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Define any arguments set + params = { + 'batch': 'yes' if self.batch else 'no', + } + + # Extend our parameters + params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) + + return '{schema}://{auth_id}@{token}/{source}/' \ + '{targets}/?{params}'.format( + schema=self.secure_protocol, + auth_id=self.pprint(self.auth_id, privacy, safe=''), + token=self.pprint(self.token, privacy, safe=''), + source=self.source, + targets='/'.join( + [NotifyPlivo.quote(x, safe='+') for x in self.targets]), + params=NotifyPlivo.urlencode(params)) + + def __len__(self): + """ + Returns the number of targets associated with this notification + """ + # + # Factor batch into calculation + # + return len(self.targets) if self.targets else 1 + + @staticmethod + def parse_url(url): + """ + Parses the URL and returns enough arguments that can allow + us to substantiate this object. + + """ + + results = NotifyBase.parse_url(url, verify_host=False) + if not results: + # We're done early as we couldn't load the results + return results + + # The Auth ID is in the username field + if 'id' in results['qsd'] and len(results['qsd']['id']): + results['auth_id'] = NotifyPlivo.unquote(results['qsd']['id']) + + else: + results['auth_id'] = NotifyPlivo.unquote(results['user']) + + # Get our entries; split_path() looks after unquoting content for us + # by default + results['targets'] = NotifyPlivo.split_path(results['fullpath']) + if 'token' in results['qsd'] and len(results['qsd']['token']): + # Store token + results['token'] = NotifyPlivo.unquote(results['qsd']['token']) + + # go ahead and put the host entry in the targets list + if results['host']: + results['targets'].insert( + 0, NotifyPlivo.unquote(results['host'])) + + else: + # The hostname is our authentication key + results['token'] = NotifyPlivo.unquote(results['host']) + + if 'from' in results['qsd'] and len(results['qsd']['from']): + results['source'] = \ + NotifyPlivo.unquote(results['qsd']['from']) + + else: + try: + # The first path entry is the source/originator + results['source'] = results['targets'].pop(0) + + except IndexError: + # No source specified... + results['source'] = None + pass + + # Support the 'to' variable so that we can support targets this way too + # The 'to' makes it easier to use yaml configuration + if 'to' in results['qsd'] and len(results['qsd']['to']): + results['targets'] += \ + NotifyPlivo.parse_phone_no(results['qsd']['to']) + + # Get Batch Mode Flag + results['batch'] = \ + parse_bool(results['qsd'].get( + 'batch', NotifyPlivo.template_args['batch']['default'])) + + return results diff --git a/libs/apprise/plugins/popcorn_notify.py b/libs/apprise/plugins/popcorn_notify.py index 16d34ab09..d0fc4a665 100644 --- a/libs/apprise/plugins/popcorn_notify.py +++ b/libs/apprise/plugins/popcorn_notify.py @@ -30,11 +30,8 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import is_email -from ..utils import is_phone_no -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import ( + is_email, is_phone_no, parse_list, parse_bool, validate_regex) from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/prowl.py b/libs/apprise/plugins/prowl.py index 55c4c6be2..e0e9bd4df 100644 --- a/libs/apprise/plugins/prowl.py +++ b/libs/apprise/plugins/prowl.py @@ -30,7 +30,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/pushbullet.py b/libs/apprise/plugins/pushbullet.py index 2b88bbeda..f017c36ce 100644 --- a/libs/apprise/plugins/pushbullet.py +++ b/libs/apprise/plugins/pushbullet.py @@ -31,10 +31,8 @@ from json import loads from .base import NotifyBase -from ..utils import is_email from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import is_email, parse_list, validate_regex from ..locale import gettext_lazy as _ from ..attachment.base import AttachBase diff --git a/libs/apprise/plugins/pushdeer.py b/libs/apprise/plugins/pushdeer.py index 226e3f210..d71a15faa 100644 --- a/libs/apprise/plugins/pushdeer.py +++ b/libs/apprise/plugins/pushdeer.py @@ -30,7 +30,7 @@ from ..common import NotifyType from .base import NotifyBase -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ # Syntax: diff --git a/libs/apprise/plugins/pushed.py b/libs/apprise/plugins/pushed.py index c0727ad15..205c8b4ba 100644 --- a/libs/apprise/plugins/pushed.py +++ b/libs/apprise/plugins/pushed.py @@ -34,8 +34,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ # Used to detect and parse channels diff --git a/libs/apprise/plugins/pushjet.py b/libs/apprise/plugins/pushjet.py index bc368b109..d8a38f470 100644 --- a/libs/apprise/plugins/pushjet.py +++ b/libs/apprise/plugins/pushjet.py @@ -32,7 +32,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/pushme.py b/libs/apprise/plugins/pushme.py index 54d4032de..384b557f5 100644 --- a/libs/apprise/plugins/pushme.py +++ b/libs/apprise/plugins/pushme.py @@ -31,8 +31,7 @@ from .base import NotifyBase from ..common import NotifyType from ..common import NotifyFormat -from ..utils import validate_regex -from ..utils import parse_bool +from ..utils.parse import validate_regex, parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/pushover.py b/libs/apprise/plugins/pushover.py index 07881884a..c8fcb58f5 100644 --- a/libs/apprise/plugins/pushover.py +++ b/libs/apprise/plugins/pushover.py @@ -34,8 +34,7 @@ from ..common import NotifyType from ..common import NotifyFormat from ..conversion import convert_between -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ from ..attachment.base import AttachBase diff --git a/libs/apprise/plugins/pushsafer.py b/libs/apprise/plugins/pushsafer.py index dd5a6c82c..cd7999a06 100644 --- a/libs/apprise/plugins/pushsafer.py +++ b/libs/apprise/plugins/pushsafer.py @@ -32,8 +32,7 @@ from .base import NotifyBase from .. import exception from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/pushy.py b/libs/apprise/plugins/pushy.py index d0995df3b..10517a7cc 100644 --- a/libs/apprise/plugins/pushy.py +++ b/libs/apprise/plugins/pushy.py @@ -34,8 +34,7 @@ from json import dumps, loads from .base import NotifyBase from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ # Used to detect a Device and Topic diff --git a/libs/apprise/plugins/reddit.py b/libs/apprise/plugins/reddit.py index 1c261be9c..73a93144f 100644 --- a/libs/apprise/plugins/reddit.py +++ b/libs/apprise/plugins/reddit.py @@ -57,9 +57,7 @@ from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_list, parse_bool, validate_regex from ..locale import gettext_lazy as _ from .. import __title__, __version__ diff --git a/libs/apprise/plugins/revolt.py b/libs/apprise/plugins/revolt.py index 2edbed330..ebafbf5ab 100644 --- a/libs/apprise/plugins/revolt.py +++ b/libs/apprise/plugins/revolt.py @@ -46,8 +46,7 @@ from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import NotifyType -from ..utils import validate_regex -from ..utils import parse_list +from ..utils.parse import validate_regex, parse_list from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/rocketchat.py b/libs/apprise/plugins/rocketchat.py index 7850c3d05..1c0049d3e 100644 --- a/libs/apprise/plugins/rocketchat.py +++ b/libs/apprise/plugins/rocketchat.py @@ -37,8 +37,7 @@ from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import NotifyType -from ..utils import parse_list -from ..utils import parse_bool +from ..utils.parse import parse_list, parse_bool from ..locale import gettext_lazy as _ IS_CHANNEL = re.compile(r'^#(?P<name>[A-Za-z0-9_-]+)$') diff --git a/libs/apprise/plugins/rsyslog.py b/libs/apprise/plugins/rsyslog.py index 195a2f3ca..530cf51e8 100644 --- a/libs/apprise/plugins/rsyslog.py +++ b/libs/apprise/plugins/rsyslog.py @@ -31,7 +31,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/ryver.py b/libs/apprise/plugins/ryver.py index c792c3d78..ae003f439 100644 --- a/libs/apprise/plugins/ryver.py +++ b/libs/apprise/plugins/ryver.py @@ -41,8 +41,7 @@ from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_bool, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/sendgrid.py b/libs/apprise/plugins/sendgrid.py index b4f92e9f4..65d71044b 100644 --- a/libs/apprise/plugins/sendgrid.py +++ b/libs/apprise/plugins/sendgrid.py @@ -53,9 +53,7 @@ from .. import exception from ..common import NotifyFormat from ..common import NotifyType -from ..utils import parse_list -from ..utils import is_email -from ..utils import validate_regex +from ..utils.parse import parse_list, is_email, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/serverchan.py b/libs/apprise/plugins/serverchan.py index db1571417..b62280316 100644 --- a/libs/apprise/plugins/serverchan.py +++ b/libs/apprise/plugins/serverchan.py @@ -31,7 +31,7 @@ from ..common import NotifyType from .base import NotifyBase -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/ses.py b/libs/apprise/plugins/ses.py index 30e59702d..5292650a1 100644 --- a/libs/apprise/plugins/ses.py +++ b/libs/apprise/plugins/ses.py @@ -99,10 +99,8 @@ from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType -from ..utils import parse_emails -from ..utils import validate_regex +from ..utils.parse import parse_emails, validate_regex, is_email from ..locale import gettext_lazy as _ -from ..utils import is_email # Our Regin Identifier # support us-gov-west-1 syntax as well diff --git a/libs/apprise/plugins/seven.py b/libs/apprise/plugins/seven.py new file mode 100644 index 000000000..2977448f5 --- /dev/null +++ b/libs/apprise/plugins/seven.py @@ -0,0 +1,290 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. +# Create an account https://www.seven.io if you don't already have one +# +# Get your (apikey) from here: +# - https://help.seven.io/en/api-key-access +# +import requests +import json +from .base import NotifyBase +from ..common import NotifyType +from ..utils.parse import is_phone_no, parse_phone_no +from ..locale import gettext_lazy as _ + + +class NotifySeven(NotifyBase): + """ + A wrapper for seven Notifications + """ + + # The default descriptive name associated with the Notification + service_name = 'seven' + + # The services URL + service_url = 'https://www.seven.io' + + # The default protocol + secure_protocol = 'seven' + + # A URL that takes you to the setup/help of the specific protocol + setup_url = 'https://github.com/caronc/apprise/wiki/Notify_seven' + + # Seven uses the http protocol with JSON requests + notify_url = 'https://gateway.seven.io/api/sms' + + # The maximum length of the body + body_maxlen = 160 + + # A title can not be used for SMS Messages. Setting this to zero will + # cause any title (if defined) to get placed into the message body. + title_maxlen = 0 + + # Define object templates + templates = ( + '{schema}://{apikey}/{targets}', + ) + + # Define our template tokens + template_tokens = dict(NotifyBase.template_tokens, **{ + 'apikey': { + 'name': _('API Key'), + 'type': 'string', + 'required': True, + 'private': True, + }, + 'target_phone': { + 'name': _('Target Phone No'), + 'type': 'string', + 'prefix': '+', + 'regex': (r'^[0-9\s)(+-]+$', 'i'), + 'map_to': 'targets', + }, + 'targets': { + 'name': _('Targets'), + 'type': 'list:string', + } + }) + + # Define our template arguments + template_args = dict(NotifyBase.template_args, **{ + 'to': { + 'alias_of': 'targets', + }, + }) + + def __init__(self, apikey, targets=None, **kwargs): + """ + Initialize Seven Object + """ + super().__init__(**kwargs) + # API Key (associated with project) + self.apikey = apikey + if not self.apikey: + msg = 'An invalid seven API Key ' \ + '({}) was specified.'.format(apikey) + self.logger.warning(msg) + raise TypeError(msg) + + # Parse our targets + self.targets = list() + + for target in parse_phone_no(targets): + # Validate targets and drop bad ones: + result = is_phone_no(target) + if not result: + self.logger.warning( + 'Dropped invalid phone # ' + '({}) specified.'.format(target), + ) + continue + # store valid phone number + self.targets.append(result['full']) + return + + @property + def url_identifier(self): + """ + Returns all of the identifiers that make this URL unique from + another simliar one. Targets or end points should never be identified + here. + """ + return (self.secure_protocol, self.apikey) + + def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): + """ + Perform seven Notification + """ + + if len(self.targets) == 0: + # There were no services to notify + self.logger.warning('There were no seven targets to notify.') + return False + + # error tracking (used for function return) + has_error = False + + # Prepare our headers + headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'SentWith': 'Apprise', + 'X-Api-Key': self.apikey, + } + + # Prepare our payload + payload = { + 'to': None, + 'text': body, + } + # Create a copy of the targets list + targets = list(self.targets) + while len(targets): + # Get our target to notify + target = targets.pop(0) + # Prepare our user + payload['to'] = '+{}'.format(target) + # Some Debug Logging + self.logger.debug( + 'seven POST URL: {} (cert_verify={})'.format( + self.notify_url, self.verify_certificate)) + self.logger.debug('seven Payload: {}' .format(payload)) + # Always call throttle before any remote server i/o is made + self.throttle() + try: + r = requests.post( + self.notify_url, + data=json.dumps(payload), + headers=headers, + verify=self.verify_certificate, + timeout=self.request_timeout, + ) + # Sample output of a successful transmission + # { + # "success": "100", + # "total_price": 0.075, + # "balance": 46.748, + # "debug": "false", + # "sms_type": "direct", + # "messages": [ + # { + # "id": "77229135982", + # "sender": "492022839080", + # "recipient": "4917661254799", + # "text": "x", + # "encoding": "gsm", + # "label": null, + # "parts": 1, + # "udh": null, + # "is_binary": false, + # "price": 0.075, + # "success": true, + # "error": null, + # "error_text": null + # } + # ] + # } + if r.status_code not in ( + requests.codes.ok, requests.codes.created): + # We had a problem + status_str = \ + NotifySeven.http_response_code_lookup( + r.status_code) + self.logger.warning( + 'Failed to send seven notification to {}: ' + '{}{}error={}.'.format( + ','.join(target), + status_str, + ', ' if status_str else '', + r.status_code)) + self.logger.debug( + 'Response Details:\r\n{}'.format(r.content)) + # Mark our failure + has_error = True + continue + else: + self.logger.info( + 'Sent seven notification to {}.'.format(target)) + except requests.RequestException as e: + self.logger.warning( + 'A Connection error occurred sending seven:%s ' % ( + target) + 'notification.' + ) + self.logger.debug('Socket Exception: %s' % str(e)) + # Mark our failure + has_error = True + continue + return not has_error + + def url(self, privacy=False, *args, **kwargs): + """ + Returns the URL built dynamically based on specified arguments. + """ + + # Our URL parameters + params = self.url_parameters(privacy=privacy, *args, **kwargs) + return '{schema}://{apikey}/{targets}/?{params}'.format( + schema=self.secure_protocol, + apikey=self.pprint(self.apikey, privacy, safe=''), + targets='/'.join( + [NotifySeven.quote(x, safe='') for x in self.targets]), + params=NotifySeven.urlencode(params)) + + def __len__(self): + """ + Returns the number of targets associated with this notification + """ + targets = len(self.targets) + return targets if targets > 0 else 1 + + @staticmethod + def parse_url(url): + """ + Parses the URL and returns enough arguments that can allow + us to re-instantiate this object. + """ + + results = NotifyBase.parse_url(url, verify_host=False) + if not results: + # We're done early as we couldn't load the results + return results + + # Get our entries; split_path() looks after unquoting content for us + # by default + results['targets'] = NotifySeven.split_path(results['fullpath']) + + # The hostname is our authentication key + results['apikey'] = NotifySeven.unquote(results['host']) + + # Support the 'to' variable so that we can support targets this way too + # The 'to' makes it easier to use yaml configuration + if 'to' in results['qsd'] and len(results['qsd']['to']): + results['targets'] += \ + NotifySeven.parse_phone_no(results['qsd']['to']) + + return results diff --git a/libs/apprise/plugins/sfr.py b/libs/apprise/plugins/sfr.py index 27ea0fb0b..9a0181afa 100644 --- a/libs/apprise/plugins/sfr.py +++ b/libs/apprise/plugins/sfr.py @@ -47,8 +47,7 @@ from .base import NotifyBase from ..common import NotifyType from ..locale import gettext_lazy as _ -from ..utils import is_phone_no -from ..utils import parse_phone_no +from ..utils.parse import is_phone_no, parse_phone_no from ..url import PrivacyMode diff --git a/libs/apprise/plugins/signal_api.py b/libs/apprise/plugins/signal_api.py index 9a0191237..72c340f06 100644 --- a/libs/apprise/plugins/signal_api.py +++ b/libs/apprise/plugins/signal_api.py @@ -33,9 +33,7 @@ from .base import NotifyBase from ..common import NotifyType from .. import exception -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import parse_bool +from ..utils.parse import is_phone_no, parse_phone_no, parse_bool from ..url import PrivacyMode from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/simplepush.py b/libs/apprise/plugins/simplepush.py index 023fcf9d5..3c269a9af 100644 --- a/libs/apprise/plugins/simplepush.py +++ b/libs/apprise/plugins/simplepush.py @@ -33,7 +33,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ from base64 import urlsafe_b64encode @@ -177,7 +177,25 @@ def _encrypt(self, content): padder = padding.PKCS7(algorithms.AES.block_size).padder() content = padder.update(content.encode()) + padder.finalize() - + # + # Encryption Notice + # + + # CBC mode doesn't provide integrity guarantees. Unless the message + # authentication for IV and the ciphertext are applied, it will be + # vulnerable to a padding oracle attack + + # It is important to identify that both the Apprise package and team + # recognizes this AES-CBC-128 weakness but requires that it exists due + # to it being the SimplePush Requirement as documented on their + # website here https://simplepush.io/features. + + # In the event the website link above does not exist/work, a screen + # capture of the reference to the requirement for this encryption + # can also be found on the Apprise SimplePush Wiki: + # https://github.com/caronc/apprise/wiki/Notify_simplepush\ + # #lock-aes-cbc-128-encryption-weakness + # encryptor = Cipher( algorithms.AES(self._key), modes.CBC(self._iv), diff --git a/libs/apprise/plugins/sinch.py b/libs/apprise/plugins/sinch.py index 51cdea32b..bc267afb2 100644 --- a/libs/apprise/plugins/sinch.py +++ b/libs/apprise/plugins/sinch.py @@ -42,9 +42,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import validate_regex +from ..utils.parse import is_phone_no, parse_phone_no, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/slack.py b/libs/apprise/plugins/slack.py index 11d78e4c1..afe5a2596 100644 --- a/libs/apprise/plugins/slack.py +++ b/libs/apprise/plugins/slack.py @@ -82,10 +82,8 @@ from ..common import NotifyImageSize from ..common import NotifyType from ..common import NotifyFormat -from ..utils import is_email -from ..utils import parse_bool -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import ( + is_email, parse_bool, parse_list, validate_regex) from ..locale import gettext_lazy as _ # Extend HTTP Error Messages diff --git a/libs/apprise/plugins/smseagle.py b/libs/apprise/plugins/smseagle.py index 159433106..65ff0ffcc 100644 --- a/libs/apprise/plugins/smseagle.py +++ b/libs/apprise/plugins/smseagle.py @@ -34,10 +34,8 @@ from .base import NotifyBase from ..common import NotifyType from .. import exception -from ..utils import validate_regex -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import parse_bool +from ..utils.parse import ( + validate_regex, is_phone_no, parse_phone_no, parse_bool) from ..url import PrivacyMode from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/smsmanager.py b/libs/apprise/plugins/smsmanager.py index a4552ad4b..fb8ab068b 100644 --- a/libs/apprise/plugins/smsmanager.py +++ b/libs/apprise/plugins/smsmanager.py @@ -37,10 +37,8 @@ import requests from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import ( + is_phone_no, parse_phone_no, parse_bool, validate_regex) from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/smtp2go.py b/libs/apprise/plugins/smtp2go.py index a19e523fc..1c5919030 100644 --- a/libs/apprise/plugins/smtp2go.py +++ b/libs/apprise/plugins/smtp2go.py @@ -52,10 +52,8 @@ from .. import exception from ..common import NotifyType from ..common import NotifyFormat -from ..utils import parse_emails -from ..utils import parse_bool -from ..utils import is_email -from ..utils import validate_regex +from ..utils.parse import ( + parse_emails, parse_bool, is_email, validate_regex) from ..locale import gettext_lazy as _ SMTP2GO_HTTP_ERROR_MAP = { diff --git a/libs/apprise/plugins/sns.py b/libs/apprise/plugins/sns.py index 9deb9f7b0..bd5444920 100644 --- a/libs/apprise/plugins/sns.py +++ b/libs/apprise/plugins/sns.py @@ -39,9 +39,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import is_phone_no, parse_list, validate_regex from ..locale import gettext_lazy as _ # Topic Detection diff --git a/libs/apprise/plugins/sparkpost.py b/libs/apprise/plugins/sparkpost.py index 4e4233cad..8c34c1d2b 100644 --- a/libs/apprise/plugins/sparkpost.py +++ b/libs/apprise/plugins/sparkpost.py @@ -61,11 +61,9 @@ from .. import exception from ..common import NotifyType from ..common import NotifyFormat -from ..utils import is_email from email.utils import formataddr -from ..utils import validate_regex -from ..utils import parse_emails -from ..utils import parse_bool +from ..utils.parse import ( + validate_regex, parse_emails, parse_bool, is_email) from ..locale import gettext_lazy as _ # Provide some known codes SparkPost uses and what they translate to: diff --git a/libs/apprise/plugins/splunk.py b/libs/apprise/plugins/splunk.py index 3c39e7a4b..3379bcfb5 100644 --- a/libs/apprise/plugins/splunk.py +++ b/libs/apprise/plugins/splunk.py @@ -40,7 +40,7 @@ from .base import NotifyBase from ..common import NotifyType, NOTIFY_TYPES -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/streamlabs.py b/libs/apprise/plugins/streamlabs.py index ba48c170e..849437fba 100644 --- a/libs/apprise/plugins/streamlabs.py +++ b/libs/apprise/plugins/streamlabs.py @@ -40,7 +40,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/syslog.py b/libs/apprise/plugins/syslog.py index f0be5d4f6..df0a31db7 100644 --- a/libs/apprise/plugins/syslog.py +++ b/libs/apprise/plugins/syslog.py @@ -30,7 +30,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/techuluspush.py b/libs/apprise/plugins/techuluspush.py index 629650148..6d0f45d4d 100644 --- a/libs/apprise/plugins/techuluspush.py +++ b/libs/apprise/plugins/techuluspush.py @@ -55,7 +55,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ # Token required as part of the API request diff --git a/libs/apprise/plugins/telegram.py b/libs/apprise/plugins/telegram.py index fba4b6609..30429ca36 100644 --- a/libs/apprise/plugins/telegram.py +++ b/libs/apprise/plugins/telegram.py @@ -64,9 +64,7 @@ from ..common import NotifyImageSize from ..common import NotifyFormat from ..common import PersistentStoreMode -from ..utils import parse_bool -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_bool, parse_list, validate_regex from ..locale import gettext_lazy as _ from ..attachment.base import AttachBase diff --git a/libs/apprise/plugins/threema.py b/libs/apprise/plugins/threema.py index 55293a1cb..8639c5caa 100644 --- a/libs/apprise/plugins/threema.py +++ b/libs/apprise/plugins/threema.py @@ -37,11 +37,8 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import validate_regex -from ..utils import is_email +from ..utils.parse import is_phone_no, validate_regex, is_email, parse_list from ..url import PrivacyMode -from ..utils import parse_list from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/twilio.py b/libs/apprise/plugins/twilio.py index d8666199c..e6a9bcd96 100644 --- a/libs/apprise/plugins/twilio.py +++ b/libs/apprise/plugins/twilio.py @@ -50,9 +50,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import validate_regex +from ..utils.parse import is_phone_no, parse_phone_no, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/twist.py b/libs/apprise/plugins/twist.py index 66f70f525..1d5881ec5 100644 --- a/libs/apprise/plugins/twist.py +++ b/libs/apprise/plugins/twist.py @@ -39,8 +39,7 @@ from ..url import PrivacyMode from ..common import NotifyFormat from ..common import NotifyType -from ..utils import parse_list -from ..utils import is_email +from ..utils.parse import parse_list, is_email from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/twitter.py b/libs/apprise/plugins/twitter.py index 6d352ea66..497feba04 100644 --- a/libs/apprise/plugins/twitter.py +++ b/libs/apprise/plugins/twitter.py @@ -39,9 +39,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import parse_list -from ..utils import parse_bool -from ..utils import validate_regex +from ..utils.parse import parse_list, parse_bool, validate_regex from ..locale import gettext_lazy as _ from ..attachment.base import AttachBase diff --git a/libs/apprise/plugins/voipms.py b/libs/apprise/plugins/voipms.py index 6a5d4d5a8..b4624c484 100644 --- a/libs/apprise/plugins/voipms.py +++ b/libs/apprise/plugins/voipms.py @@ -39,15 +39,13 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import is_email -from ..utils import parse_phone_no +from ..utils.parse import is_phone_no, is_email, parse_phone_no from ..locale import gettext_lazy as _ class NotifyVoipms(NotifyBase): """ - A wrapper for Voipms Notifications + A wrapper for VoIPms Notifications """ # The default descriptive name associated with the Notification @@ -62,12 +60,15 @@ class NotifyVoipms(NotifyBase): # A URL that takes you to the setup/help of the specific protocol setup_url = 'https://github.com/caronc/apprise/wiki/Notify_voipms' - # Voipms uses the http protocol with JSON requests + # VoIPms uses the http protocol with JSON requests notify_url = 'https://voip.ms/api/v1/rest.php' # The maximum length of the body body_maxlen = 160 + # The supported country code by VoIP.ms + voip_ms_country_code = '1' + # A title can not be used for SMS Messages. Setting this to zero will # cause any title (if defined) to get placed into the message body. title_maxlen = 0 @@ -122,12 +123,11 @@ class NotifyVoipms(NotifyBase): def __init__(self, email, source=None, targets=None, **kwargs): """ - Initialize Voipms Object + Initialize VoIPms Object """ super().__init__(**kwargs) # Validate our params here. - if self.password is None: msg = 'Password has to be specified.' self.logger.warning(msg) @@ -136,7 +136,7 @@ def __init__(self, email, source=None, targets=None, **kwargs): # User is the email associated with the account result = is_email(email) if not result: - msg = 'An invalid Voipms user email: ' \ + msg = 'An invalid VoIPms user email: ' \ '({}) was specified.'.format(email) self.logger.warning(msg) raise TypeError(msg) @@ -145,15 +145,16 @@ def __init__(self, email, source=None, targets=None, **kwargs): # Validate our source Phone # result = is_phone_no(source) if not result: - msg = 'An invalid Voipms source phone # ' \ + msg = 'An invalid VoIPms source phone # ' \ '({}) was specified.'.format(source) self.logger.warning(msg) raise TypeError(msg) # Source Phone # only supports +1 country code # Allow 7 digit phones (presume they're local with +1 country code) - if result['country'] and result['country'] != '1': - msg = 'Voipms only supports +1 country code ' \ + if result['country'] \ + and result['country'] != self.voip_ms_country_code: + msg = 'VoIPms only supports +1 country code ' \ '({}) was specified.'.format(source) self.logger.warning(msg) raise TypeError(msg) @@ -170,9 +171,10 @@ def __init__(self, email, source=None, targets=None, **kwargs): result = is_phone_no(target) # Target Phone # only supports +1 country code - if result['country'] != '1': + if result['country'] \ + and result['country'] != self.voip_ms_country_code: self.logger.warning( - 'Dropped invalid phone # ' + 'Ignoring invalid phone # ' '({}) specified.'.format(target), ) continue @@ -188,12 +190,12 @@ def __init__(self, email, source=None, targets=None, **kwargs): def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): """ - Perform Voipms Notification + Perform VoIPms Notification """ if len(self.targets) == 0: # There were no services to notify - self.logger.warning('There were no Voipms targets to notify.') + self.logger.warning('There were no VoIPms targets to notify.') return False # error tracking (used for function return) @@ -228,9 +230,9 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): payload['dst'] = target # Some Debug Logging - self.logger.debug('Voipms GET URL: {} (cert_verify={})'.format( + self.logger.debug('VoIPms GET URL: {} (cert_verify={})'.format( self.notify_url, self.verify_certificate)) - self.logger.debug('Voipms Payload: {}' .format(payload)) + self.logger.debug('VoIPms Payload: {}' .format(payload)) # Always call throttle before any remote server i/o is made self.throttle() @@ -262,7 +264,7 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): r.status_code) self.logger.warning( - 'Failed to send Voipms notification to {}: ' + 'Failed to send VoIPms SMS notification to {}: ' '{}{}error={}.'.format( target, status_str, @@ -276,12 +278,12 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): has_error = True continue - # Voipms sends 200 OK even if there is an error + # VoIPms sends 200 OK even if there is an error # check if status in response and if it is not success if response is not None and response['status'] != 'success': self.logger.warning( - 'Failed to send Voipms notification to {}: ' + 'Failed to send VoIPms SMS notification to {}: ' 'status: {}, message: {}'.format( target, response['status'], response['message']) ) @@ -291,12 +293,12 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): continue else: self.logger.info( - 'Sent Voipms notification to %s' % target) + 'Sent VoIPms SMS notification to %s' % target) except requests.RequestException as e: self.logger.warning( - 'A Connection error occurred sending Voipms:%s ' - 'notification.' % target + 'A Connection error occurred sending VoIPms:%s ' + 'SMS notification.' % target ) self.logger.debug('Socket Exception: %s' % str(e)) @@ -331,9 +333,11 @@ def url(self, privacy=False, *args, **kwargs): schema=self.secure_protocol, email=self.email, password=self.pprint(self.password, privacy, safe=''), - from_phone='1' + self.pprint(self.source, privacy, safe=''), + from_phone=self.voip_ms_country_code + + self.pprint(self.source, privacy, safe=''), targets='/'.join( - ['1' + NotifyVoipms.quote(x, safe='') for x in self.targets]), + [self.voip_ms_country_code + NotifyVoipms.quote(x, safe='') + for x in self.targets]), params=NotifyVoipms.urlencode(params)) def __len__(self): diff --git a/libs/apprise/plugins/vonage.py b/libs/apprise/plugins/vonage.py index 3a9b23417..f57e80a8a 100644 --- a/libs/apprise/plugins/vonage.py +++ b/libs/apprise/plugins/vonage.py @@ -36,9 +36,7 @@ from .base import NotifyBase from ..url import PrivacyMode from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import validate_regex +from ..utils.parse import is_phone_no, parse_phone_no, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/webexteams.py b/libs/apprise/plugins/webexteams.py index ccee386b5..bc75378b6 100644 --- a/libs/apprise/plugins/webexteams.py +++ b/libs/apprise/plugins/webexteams.py @@ -66,7 +66,7 @@ from .base import NotifyBase from ..common import NotifyType from ..common import NotifyFormat -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ # Extend HTTP Error Messages diff --git a/libs/apprise/plugins/wecombot.py b/libs/apprise/plugins/wecombot.py index 03282cd9f..ba639401c 100644 --- a/libs/apprise/plugins/wecombot.py +++ b/libs/apprise/plugins/wecombot.py @@ -61,7 +61,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import validate_regex +from ..utils.parse import validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/whatsapp.py b/libs/apprise/plugins/whatsapp.py index e0322b80d..34f1be216 100644 --- a/libs/apprise/plugins/whatsapp.py +++ b/libs/apprise/plugins/whatsapp.py @@ -46,9 +46,7 @@ from json import loads, dumps from .base import NotifyBase from ..common import NotifyType -from ..utils import is_phone_no -from ..utils import parse_phone_no -from ..utils import validate_regex +from ..utils.parse import is_phone_no, parse_phone_no, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/windows.py b/libs/apprise/plugins/windows.py index fd9454b28..a9621fdc3 100644 --- a/libs/apprise/plugins/windows.py +++ b/libs/apprise/plugins/windows.py @@ -31,7 +31,7 @@ from .base import NotifyBase from ..common import NotifyImageSize from ..common import NotifyType -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..locale import gettext_lazy as _ # Default our global support flag diff --git a/libs/apprise/plugins/workflows.py b/libs/apprise/plugins/workflows.py index e047a9f5c..87b6b1b27 100644 --- a/libs/apprise/plugins/workflows.py +++ b/libs/apprise/plugins/workflows.py @@ -59,10 +59,8 @@ from ..common import NotifyImageSize from ..common import NotifyType from ..common import NotifyFormat -from ..utils import parse_bool -from ..utils import validate_regex -from ..utils import apply_template -from ..utils import TemplateType +from ..utils.parse import parse_bool, validate_regex +from ..utils.templates import apply_template, TemplateType from ..apprise_attachment import AppriseAttachment from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/wxpusher.py b/libs/apprise/plugins/wxpusher.py index e7c9bd672..96a571c42 100644 --- a/libs/apprise/plugins/wxpusher.py +++ b/libs/apprise/plugins/wxpusher.py @@ -42,8 +42,7 @@ from ..url import PrivacyMode from ..common import NotifyType from ..common import NotifyFormat -from ..utils import parse_list -from ..utils import validate_regex +from ..utils.parse import parse_list, validate_regex from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/xbmc.py b/libs/apprise/plugins/xbmc.py index 61e7b1e2e..6b9a77961 100644 --- a/libs/apprise/plugins/xbmc.py +++ b/libs/apprise/plugins/xbmc.py @@ -33,7 +33,7 @@ from ..url import PrivacyMode from ..common import NotifyType from ..common import NotifyImageSize -from ..utils import parse_bool +from ..utils.parse import parse_bool from ..locale import gettext_lazy as _ diff --git a/libs/apprise/plugins/zulip.py b/libs/apprise/plugins/zulip.py index 34c6d813e..be35d500a 100644 --- a/libs/apprise/plugins/zulip.py +++ b/libs/apprise/plugins/zulip.py @@ -63,10 +63,7 @@ from .base import NotifyBase from ..common import NotifyType -from ..utils import parse_list -from ..utils import validate_regex -from ..utils import is_email -from ..utils import remove_suffix +from ..utils.parse import (parse_list, validate_regex, is_email) from ..locale import gettext_lazy as _ # A Valid Bot Name @@ -192,7 +189,10 @@ def __init__(self, botname, organization, token, targets=None, **kwargs): # The botname botname = match.group('name') - botname = remove_suffix(botname, '-bot') + suffix = '-bot' + # Eliminate suffix if found + botname = \ + botname[:-len(suffix)] if botname.endswith(suffix) else botname self.botname = botname except (TypeError, AttributeError): diff --git a/libs/apprise/url.py b/libs/apprise/url.py index e3c9c17d8..ce8fa5116 100644 --- a/libs/apprise/url.py +++ b/libs/apprise/url.py @@ -39,11 +39,8 @@ from .locale import gettext_lazy as _ from .asset import AppriseAsset -from .utils import urlencode -from .utils import parse_url -from .utils import parse_bool -from .utils import parse_list -from .utils import parse_phone_no +from .utils.parse import ( + urlencode, parse_url, parse_bool, parse_list, parse_phone_no) # Used to break a path list into parts PATHSPLIT_LIST_DELIM = re.compile(r'[ \t\r\n,\\/]+') diff --git a/libs/apprise/utils/__init__.py b/libs/apprise/utils/__init__.py new file mode 100644 index 000000000..e91e2fbb8 --- /dev/null +++ b/libs/apprise/utils/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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/libs/apprise/utils/base64.py b/libs/apprise/utils/base64.py new file mode 100644 index 000000000..78e5427b9 --- /dev/null +++ b/libs/apprise/utils/base64.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. +import copy +import json +import binascii +import typing +import base64 + + +def decode_b64_dict(di: dict) -> dict: + """ + decodes base64 dictionary previously encoded + + string entries prefixed with `b64:` are targeted + """ + di = copy.deepcopy(di) + for k, v in di.items(): + if not isinstance(v, str) or not v.startswith("b64:"): + continue + + try: + parsed_v = base64.b64decode(v[4:]) + parsed_v = json.loads(parsed_v) + + except (ValueError, TypeError, binascii.Error, + json.decoder.JSONDecodeError): + # ValueError: the length of altchars is not 2. + # TypeError: invalid input + # binascii.Error: not base64 (bad padding) + # json.decoder.JSONDecodeError: Bad JSON object + + parsed_v = v + di[k] = parsed_v + return di + + +def encode_b64_dict(di: dict, encoding='utf-8') -> typing.Tuple[dict, bool]: + """ + Encodes dictionary entries containing binary types (int, float) into base64 + + Final product is always string based values + """ + di = copy.deepcopy(di) + needs_decoding = False + for k, v in di.items(): + if isinstance(v, str): + continue + + try: + encoded = base64.urlsafe_b64encode(json.dumps(v).encode(encoding)) + encoded = "b64:{}".format(encoded.decode(encoding)) + needs_decoding = True + + except (ValueError, TypeError): + # ValueError: + # - the length of altchars is not 2. + # TypeError: + # - json not searializable or + # - bytes object not passed into urlsafe_b64encode() + encoded = str(v) + + di[k] = encoded + return di, needs_decoding diff --git a/libs/apprise/utils/cwe312.py b/libs/apprise/utils/cwe312.py new file mode 100644 index 000000000..6a6f9e191 --- /dev/null +++ b/libs/apprise/utils/cwe312.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. +import re +from .parse import (parse_url, is_hostname) + + +def cwe312_word(word, force=False, advanced=True, threshold=5): + """ + This function was written to help mask secure/private information that may + or may not be found within Apprise. The idea is to provide a presentable + word response that the user who prepared it would understand, yet not + reveal any private information for any potential intruder + + For more detail see CWE-312 @ + https://cwe.mitre.org/data/definitions/312.html + + The `force` is an optional argument used to keep the string formatting + consistent and in one place. If set, the content passed in is presumed + to be containing secret information and will be updated accordingly. + + If advanced is set to `True` then content is additionally checked for + upper/lower/ascii/numerical variances. If an obscurity threshold is + reached, then content is considered secret + """ + + class Variance: + """ + A Simple List of Possible Character Variances + """ + # An Upper Case Character (ABCDEF... etc) + ALPHA_UPPER = '+' + # An Lower Case Character (abcdef... etc) + ALPHA_LOWER = '-' + # A Special Character ($%^;... etc) + SPECIAL = 's' + # A Numerical Character (1234... etc) + NUMERIC = 'n' + + if not (isinstance(word, str) and word.strip()): + # not a password if it's not something we even support + return word + + # Formatting + word = word.strip() + if force: + # We're forcing the representation to be a secret + # We do this for consistency + return '{}...{}'.format(word[0:1], word[-1:]) + + elif len(word) > 1 and \ + not is_hostname(word, ipv4=True, ipv6=True, underscore=False): + # Verify if it is a hostname or not + return '{}...{}'.format(word[0:1], word[-1:]) + + elif len(word) >= 16: + # an IP will be 15 characters so we don't want to use a smaller + # value then 16 (e.g 101.102.103.104) + # we can assume very long words are passwords otherwise + return '{}...{}'.format(word[0:1], word[-1:]) + + if advanced: + # + # Mark word a secret based on it's obscurity + # + + # Our variances will increase depending on these variables: + last_variance = None + obscurity = 0 + + for c in word: + # Detect our variance + if c.isdigit(): + variance = Variance.NUMERIC + elif c.isalpha() and c.isupper(): + variance = Variance.ALPHA_UPPER + elif c.isalpha() and c.islower(): + variance = Variance.ALPHA_LOWER + else: + variance = Variance.SPECIAL + + if last_variance != variance or variance == Variance.SPECIAL: + obscurity += 1 + + if obscurity >= threshold: + return '{}...{}'.format(word[0:1], word[-1:]) + + last_variance = variance + + # Otherwise we're good; return our word + return word + + +def cwe312_url(url): + """ + This function was written to help mask secure/private information that may + or may not be found on an Apprise URL. The idea is to not disrupt the + structure of the previous URL too much, yet still protect the users + private information from being logged directly to screen. + + For more detail see CWE-312 @ + https://cwe.mitre.org/data/definitions/312.html + + For example, consider the URL: http://user:password@localhost/ + + When passed into this function, the return value would be: + http://user:****@localhost/ + + Since apprise allows you to put private information everywhere in it's + custom URLs, it uses this function to manipulate the content before + returning to any kind of logger. + + The idea is that the URL can still be interpreted by the person who + constructed them, but not to an intruder. + """ + # Parse our URL + results = parse_url(url) + if not results: + # Nothing was returned (invalid data was fed in); return our + # information as it was fed to us (without changing it) + return url + + # Update our URL with values + results['password'] = cwe312_word(results['password'], force=True) + if not results['schema'].startswith('http'): + results['user'] = cwe312_word(results['user']) + results['host'] = cwe312_word(results['host']) + + else: + results['host'] = cwe312_word(results['host'], advanced=False) + results['user'] = cwe312_word(results['user'], advanced=False) + + # Apply our full path scan in all cases + results['fullpath'] = '/' + \ + '/'.join([cwe312_word(x) + for x in re.split( + r'[\\/]+', + results['fullpath'].lstrip('/'))]) \ + if results['fullpath'] else '' + + # + # Now re-assemble our URL for display purposes + # + + # Determine Authentication + auth = '' + if results['user'] and results['password']: + auth = '{user}:{password}@'.format( + user=results['user'], + password=results['password'], + ) + elif results['user']: + auth = '{user}@'.format( + user=results['user'], + ) + + params = '' + if results['qsd']: + params = '?{}'.format( + "&".join(["{}={}".format(k, cwe312_word(v, force=( + k in ('password', 'secret', 'pass', 'token', 'key', + 'id', 'apikey', 'to')))) + for k, v in results['qsd'].items()])) + + return '{schema}://{auth}{hostname}{port}{fullpath}{params}'.format( + schema=results['schema'], + auth=auth, + # never encode hostname since we're expecting it to be a valid one + hostname=results['host'], + port='' if not results['port'] else ':{}'.format(results['port']), + fullpath=results['fullpath'] if results['fullpath'] else '', + params=params, + ) diff --git a/libs/apprise/utils/disk.py b/libs/apprise/utils/disk.py new file mode 100644 index 000000000..9d826aaa6 --- /dev/null +++ b/libs/apprise/utils/disk.py @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. +import re +import os +import platform +from os.path import expanduser +from ..logger import logger + +# Pre-Escape content since we reference it so much +ESCAPED_PATH_SEPARATOR = re.escape('\\/') +ESCAPED_WIN_PATH_SEPARATOR = re.escape('\\') +ESCAPED_NUX_PATH_SEPARATOR = re.escape('/') + +TIDY_WIN_PATH_RE = re.compile( + r'(^[%s]{2}|[^%s\s][%s]|[\s][%s]{2}])([%s]+)' % ( + ESCAPED_WIN_PATH_SEPARATOR, + ESCAPED_WIN_PATH_SEPARATOR, + ESCAPED_WIN_PATH_SEPARATOR, + ESCAPED_WIN_PATH_SEPARATOR, + ESCAPED_WIN_PATH_SEPARATOR, + ), +) +TIDY_WIN_TRIM_RE = re.compile( + r'^(.+[^:][^%s])[\s%s]*$' % ( + ESCAPED_WIN_PATH_SEPARATOR, + ESCAPED_WIN_PATH_SEPARATOR, + ), +) + +TIDY_NUX_PATH_RE = re.compile( + r'([%s])([%s]+)' % ( + ESCAPED_NUX_PATH_SEPARATOR, + ESCAPED_NUX_PATH_SEPARATOR, + ), +) + +# A simple path decoder we can re-use which looks after +# ensuring our file info is expanded correctly when provided +# a path. +__PATH_DECODER = os.path.expandvars if \ + platform.system() == 'Windows' else os.path.expanduser + + +def path_decode(path): + """ + Returns the fully decoded path based on the operating system + """ + return os.path.abspath(__PATH_DECODER(path)) + + +def tidy_path(path): + """take a filename and or directory and attempts to tidy it up by removing + trailing slashes and correcting any formatting issues. + + For example: ////absolute//path// becomes: + /absolute/path + + """ + # Windows + path = TIDY_WIN_PATH_RE.sub('\\1', path.strip()) + # Linux + path = TIDY_NUX_PATH_RE.sub('\\1', path) + + # Windows Based (final) Trim + path = expanduser(TIDY_WIN_TRIM_RE.sub('\\1', path)) + return path + + +def dir_size(path, max_depth=3, missing_okay=True, _depth=0, _errors=None): + """ + Scans a provided path an returns it's size (in bytes) of path provided + """ + + if _errors is None: + _errors = set() + + if _depth > max_depth: + _errors.add(path) + return (0, _errors) + + total = 0 + try: + with os.scandir(path) as it: + for entry in it: + try: + if entry.is_file(follow_symlinks=False): + total += entry.stat(follow_symlinks=False).st_size + + elif entry.is_dir(follow_symlinks=False): + (totals, _) = dir_size( + entry.path, + max_depth=max_depth, + _depth=_depth + 1, + _errors=_errors) + total += totals + + except FileNotFoundError: + # no worries; Nothing to do + continue + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + _errors.add(entry.path) + logger.warning( + 'dir_size detetcted inaccessible path: %s', + os.fsdecode(entry.path)) + logger.debug('dir_size Exception: %s' % str(e)) + continue + + except FileNotFoundError: + if not missing_okay: + # Conditional error situation + _errors.add(path) + + except (OSError, IOError) as e: + # Permission error of some kind or disk problem... + # There is nothing we can do at this point + _errors.add(path) + logger.warning( + 'dir_size detetcted inaccessible path: %s', + os.fsdecode(path)) + logger.debug('dir_size Exception: %s' % str(e)) + + return (total, _errors) + + +def bytes_to_str(value): + """ + Covert an integer (in bytes) into it's string representation with + acompanied unit value (such as B, KB, MB, GB, TB, etc) + """ + unit = 'B' + try: + value = float(value) + + except (ValueError, TypeError): + return None + + if value >= 1024.0: + value = value / 1024.0 + unit = 'KB' + if value >= 1024.0: + value = value / 1024.0 + unit = 'MB' + if value >= 1024.0: + value = value / 1024.0 + unit = 'GB' + if value >= 1024.0: + value = value / 1024.0 + unit = 'TB' + + return '%.2f%s' % (round(value, 2), unit) diff --git a/libs/apprise/utils/logic.py b/libs/apprise/utils/logic.py new file mode 100644 index 000000000..4d560bdb0 --- /dev/null +++ b/libs/apprise/utils/logic.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. +from itertools import chain +from .. import common +from .parse import parse_list + + +def is_exclusive_match(logic, data, match_all=common.MATCH_ALL_TAG, + match_always=common.MATCH_ALWAYS_TAG): + """ + + The data variable should always be a set of strings that the logic can be + compared against. It should be a set. If it isn't already, then it will + be converted as such. These identify the tags themselves. + + Our logic should be a list as well: + - top level entries are treated as an 'or' + - second level (or more) entries are treated as 'and' + + examples: + logic="tagA, tagB" = tagA or tagB + logic=['tagA', 'tagB'] = tagA or tagB + logic=[('tagA', 'tagC'), 'tagB'] = (tagA and tagC) or tagB + logic=[('tagB', 'tagC')] = tagB and tagC + + If `match_always` is not set to None, then its value is added as an 'or' + to all specified logic searches. + """ + + if isinstance(logic, str): + # Update our logic to support our delimiters + logic = set(parse_list(logic)) + + if not logic: + # If there is no logic to apply then we're done early; we only match + # if there is also no data to match against + return not data + + if not isinstance(logic, (list, tuple, set)): + # garbage input + return False + + if match_always: + # Add our match_always to our logic searching if secified + logic = chain(logic, [match_always]) + + # Track what we match against; but by default we do not match + # against anything + matched = False + + # Every entry here will be or'ed with the next + for entry in logic: + if not isinstance(entry, (str, list, tuple, set)): + # Garbage entry in our logic found + return False + + # treat these entries as though all elements found + # must exist in the notification service + entries = set(parse_list(entry)) + if not entries: + # We got a bogus set of tags to parse + # If there is no logic to apply then we're done early; we only + # match if there is also no data to match against + return not data + + if len(entries.intersection(data.union({match_all}))) == len(entries): + # our set contains all of the entries found + # in our notification data set + matched = True + break + + # else: keep looking + + # Return True if we matched against our logic (or simply none was + # specified). + return matched + + +def dict_full_update(dict1, dict2): + """ + Takes 2 dictionaries (dict1 and dict2) that contain sub-dictionaries and + gracefully merges them into dict1. + + This is similar to: dict1.update(dict2) except that internal dictionaries + are also recursively applied. + """ + def _merge(dict1, dict2): + for k in dict2: + if k in dict1 and isinstance(dict1[k], dict) \ + and isinstance(dict2[k], dict): + _merge(dict1[k], dict2[k]) + else: + dict1[k] = dict2[k] + + _merge(dict1, dict2) + return diff --git a/libs/apprise/utils/module.py b/libs/apprise/utils/module.py new file mode 100644 index 000000000..55a2904f3 --- /dev/null +++ b/libs/apprise/utils/module.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. +import sys +import importlib.util +from ..logger import logger + + +def import_module(path, name): + """ + Load our module based on path + """ + spec = importlib.util.spec_from_file_location(name, path) + try: + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + + spec.loader.exec_module(module) + + except Exception as e: + # module isn't loadable + try: + del sys.modules[name] + + except KeyError: + # nothing to clean up + pass + + module = None + + logger.debug( + 'Module exception raised from %s (name=%s) %s', + path, name, str(e)) + + return module diff --git a/libs/apprise/utils.py b/libs/apprise/utils/parse.py similarity index 67% rename from libs/apprise/utils.py rename to libs/apprise/utils/parse.py index b33ad63a5..1d506d2ad 100644 --- a/libs/apprise/utils.py +++ b/libs/apprise/utils/parse.py @@ -25,71 +25,15 @@ # 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. -import copy import re -import sys -import json -import contextlib -import os -import binascii -import locale -import platform -import typing -import base64 -from itertools import chain -from os.path import expanduser from functools import reduce -from . import common -from .logger import logger from urllib.parse import unquote from urllib.parse import quote from urllib.parse import urlparse from urllib.parse import urlencode as _urlencode -import importlib.util - -# A simple path decoder we can re-use which looks after -# ensuring our file info is expanded correctly when provided -# a path. -__PATH_DECODER = os.path.expandvars if \ - platform.system() == 'Windows' else os.path.expanduser - - -def path_decode(path): - """ - Returns the fully decoded path based on the operating system - """ - return os.path.abspath(__PATH_DECODER(path)) - - -def import_module(path, name): - """ - Load our module based on path - """ - spec = importlib.util.spec_from_file_location(name, path) - try: - module = importlib.util.module_from_spec(spec) - sys.modules[name] = module - - spec.loader.exec_module(module) - - except Exception as e: - # module isn't loadable - try: - del sys.modules[name] - - except KeyError: - # nothing to clean up - pass - - module = None - - logger.debug( - 'Module exception raised from %s (name=%s) %s', - path, name, str(e)) - - return module +from .disk import tidy_path # URL Indexing Table for returns via parse_url() @@ -111,41 +55,6 @@ def import_module(path, name): # String Delimiters without the whitespace STRING_DELIMITERS_NO_WS = r'[\[\]\;,]+' -# Pre-Escape content since we reference it so much -ESCAPED_PATH_SEPARATOR = re.escape('\\/') -ESCAPED_WIN_PATH_SEPARATOR = re.escape('\\') -ESCAPED_NUX_PATH_SEPARATOR = re.escape('/') - -TIDY_WIN_PATH_RE = re.compile( - r'(^[%s]{2}|[^%s\s][%s]|[\s][%s]{2}])([%s]+)' % ( - ESCAPED_WIN_PATH_SEPARATOR, - ESCAPED_WIN_PATH_SEPARATOR, - ESCAPED_WIN_PATH_SEPARATOR, - ESCAPED_WIN_PATH_SEPARATOR, - ESCAPED_WIN_PATH_SEPARATOR, - ), -) -TIDY_WIN_TRIM_RE = re.compile( - r'^(.+[^:][^%s])[\s%s]*$' % ( - ESCAPED_WIN_PATH_SEPARATOR, - ESCAPED_WIN_PATH_SEPARATOR, - ), -) - -TIDY_NUX_PATH_RE = re.compile( - r'([%s])([%s]+)' % ( - ESCAPED_NUX_PATH_SEPARATOR, - ESCAPED_NUX_PATH_SEPARATOR, - ), -) - -TIDY_NUX_TRIM_RE = re.compile( - r'([^%s])[\s%s]+$' % ( - ESCAPED_NUX_PATH_SEPARATOR, - ESCAPED_NUX_PATH_SEPARATOR, - ), -) - # The handling of custom arguments passed in the URL; we treat any # argument (which would otherwise appear in the qsd area of our parse_url() # function differently if they start with a +, - or : value @@ -231,35 +140,6 @@ def import_module(path, name): REGEX_VALIDATE_LOOKUP = {} -class Singleton(type): - """ - Our Singleton MetaClass - """ - _instances = {} - - def __call__(cls, *args, **kwargs): - """ - instantiate our singleton meta entry - """ - if cls not in cls._instances: - # we have not every built an instance before. Build one now. - cls._instances[cls] = super().__call__(*args, **kwargs) - return cls._instances[cls] - - -class TemplateType: - """ - Defines the different template types we can perform parsing on - """ - # RAW does nothing at all to the content being parsed - # data is taken at it's absolute value - RAW = 'raw' - - # Data is presumed to be of type JSON and is therefore escaped - # if required to do so (such as single quotes) - JSON = 'json' - - def is_ipaddr(addr, ipv4=True, ipv6=True): """ Validates against IPV4 and IPV6 IP Addresses @@ -327,7 +207,7 @@ def is_hostname(hostname, ipv4=True, ipv6=True, underscore=True): labels = hostname.split(".") # ipv4 check - if len(labels) == 4 and re.match(r'[0-9.]+', hostname): + if len(labels) == 4 and re.match(r'^[0-9.]+$', hostname): return is_ipaddr(hostname, ipv4=ipv4, ipv6=False) # - RFC 1123 permits hostname labels to start with digits @@ -546,24 +426,6 @@ def is_email(address): return False -def tidy_path(path): - """take a filename and or directory and attempts to tidy it up by removing - trailing slashes and correcting any formatting issues. - - For example: ////absolute//path// becomes: - /absolute/path - - """ - # Windows - path = TIDY_WIN_PATH_RE.sub('\\1', path.strip()) - # Linux - path = TIDY_NUX_PATH_RE.sub('\\1', path) - - # Windows Based (final) Trim - path = expanduser(TIDY_WIN_TRIM_RE.sub('\\1', path)) - return path - - def parse_qsd(qs, simple=False, plus_to_space=False, sanitize=True): """ Query String Dictionary Builder @@ -1058,37 +920,6 @@ def parse_emails(*args, store_unparseable=True, **kwargs): return result -def parse_urls(*args, store_unparseable=True, **kwargs): - """ - Takes a string containing URLs separated by comma's and/or spaces and - returns a list. - """ - - result = [] - for arg in args: - if isinstance(arg, str) and arg: - _result = URL_DETECTION_RE.findall(arg) - if _result: - result += _result - - elif not _result and store_unparseable: - # we had content passed into us that was lost because it was - # so poorly formatted that it didn't even come close to - # meeting the regular expression we defined. We intentially - # keep it as part of our result set so that parsing done - # at a higher level can at least report this to the end user - # and hopefully give them some indication as to what they - # may have done wrong. - result += \ - [x for x in filter(bool, re.split(STRING_DELIMITERS, arg))] - - elif isinstance(arg, (set, list, tuple)): - # Use recursion to handle the list of URLs - result += parse_urls(*arg, store_unparseable=store_unparseable) - - return result - - def url_assembly(**kwargs): """ This function reverses the parse_url() function by taking in the provided @@ -1158,6 +989,37 @@ def urlencode(query, doseq=False, safe='', encoding=None, errors=None): errors=errors) +def parse_urls(*args, store_unparseable=True, **kwargs): + """ + Takes a string containing URLs separated by comma's and/or spaces and + returns a list. + """ + + result = [] + for arg in args: + if isinstance(arg, str) and arg: + _result = URL_DETECTION_RE.findall(arg) + if _result: + result += _result + + elif not _result and store_unparseable: + # we had content passed into us that was lost because it was + # so poorly formatted that it didn't even come close to + # meeting the regular expression we defined. We intentially + # keep it as part of our result set so that parsing done + # at a higher level can at least report this to the end user + # and hopefully give them some indication as to what they + # may have done wrong. + result += \ + [x for x in filter(bool, re.split(STRING_DELIMITERS, arg))] + + elif isinstance(arg, (set, list, tuple)): + # Use recursion to handle the list of URLs + result += parse_urls(*arg, store_unparseable=store_unparseable) + + return result + + def parse_list(*args, cast=None, allow_whitespace=True): """ Take a string list and break it into a delimited @@ -1203,77 +1065,6 @@ def parse_list(*args, cast=None, allow_whitespace=True): [x.strip() for x in filter(bool, list(set(result))) if x.strip()]) -def is_exclusive_match(logic, data, match_all=common.MATCH_ALL_TAG, - match_always=common.MATCH_ALWAYS_TAG): - """ - - The data variable should always be a set of strings that the logic can be - compared against. It should be a set. If it isn't already, then it will - be converted as such. These identify the tags themselves. - - Our logic should be a list as well: - - top level entries are treated as an 'or' - - second level (or more) entries are treated as 'and' - - examples: - logic="tagA, tagB" = tagA or tagB - logic=['tagA', 'tagB'] = tagA or tagB - logic=[('tagA', 'tagC'), 'tagB'] = (tagA and tagC) or tagB - logic=[('tagB', 'tagC')] = tagB and tagC - - If `match_always` is not set to None, then its value is added as an 'or' - to all specified logic searches. - """ - - if isinstance(logic, str): - # Update our logic to support our delimiters - logic = set(parse_list(logic)) - - if not logic: - # If there is no logic to apply then we're done early; we only match - # if there is also no data to match against - return not data - - if not isinstance(logic, (list, tuple, set)): - # garbage input - return False - - if match_always: - # Add our match_always to our logic searching if secified - logic = chain(logic, [match_always]) - - # Track what we match against; but by default we do not match - # against anything - matched = False - - # Every entry here will be or'ed with the next - for entry in logic: - if not isinstance(entry, (str, list, tuple, set)): - # Garbage entry in our logic found - return False - - # treat these entries as though all elements found - # must exist in the notification service - entries = set(parse_list(entry)) - if not entries: - # We got a bogus set of tags to parse - # If there is no logic to apply then we're done early; we only - # match if there is also no data to match against - return not data - - if len(entries.intersection(data.union({match_all}))) == len(entries): - # our set contains all of the entries found - # in our notification data set - matched = True - break - - # else: keep looking - - # Return True if we matched against our logic (or simply none was - # specified). - return matched - - def validate_regex(value, regex=r'[^\s]+', flags=re.I, strip=True, fmt=None): """ A lot of the tokens, secrets, api keys, etc all have some regular @@ -1348,416 +1139,3 @@ def validate_regex(value, regex=r'[^\s]+', flags=re.I, strip=True, fmt=None): # Return our response return value.strip() if strip else value - - -def cwe312_word(word, force=False, advanced=True, threshold=5): - """ - This function was written to help mask secure/private information that may - or may not be found within Apprise. The idea is to provide a presentable - word response that the user who prepared it would understand, yet not - reveal any private information for any potential intruder - - For more detail see CWE-312 @ - https://cwe.mitre.org/data/definitions/312.html - - The `force` is an optional argument used to keep the string formatting - consistent and in one place. If set, the content passed in is presumed - to be containing secret information and will be updated accordingly. - - If advanced is set to `True` then content is additionally checked for - upper/lower/ascii/numerical variances. If an obscurity threshold is - reached, then content is considered secret - """ - - class Variance: - """ - A Simple List of Possible Character Variances - """ - # An Upper Case Character (ABCDEF... etc) - ALPHA_UPPER = '+' - # An Lower Case Character (abcdef... etc) - ALPHA_LOWER = '-' - # A Special Character ($%^;... etc) - SPECIAL = 's' - # A Numerical Character (1234... etc) - NUMERIC = 'n' - - if not (isinstance(word, str) and word.strip()): - # not a password if it's not something we even support - return word - - # Formatting - word = word.strip() - if force: - # We're forcing the representation to be a secret - # We do this for consistency - return '{}...{}'.format(word[0:1], word[-1:]) - - elif len(word) > 1 and \ - not is_hostname(word, ipv4=True, ipv6=True, underscore=False): - # Verify if it is a hostname or not - return '{}...{}'.format(word[0:1], word[-1:]) - - elif len(word) >= 16: - # an IP will be 15 characters so we don't want to use a smaller - # value then 16 (e.g 101.102.103.104) - # we can assume very long words are passwords otherwise - return '{}...{}'.format(word[0:1], word[-1:]) - - if advanced: - # - # Mark word a secret based on it's obscurity - # - - # Our variances will increase depending on these variables: - last_variance = None - obscurity = 0 - - for c in word: - # Detect our variance - if c.isdigit(): - variance = Variance.NUMERIC - elif c.isalpha() and c.isupper(): - variance = Variance.ALPHA_UPPER - elif c.isalpha() and c.islower(): - variance = Variance.ALPHA_LOWER - else: - variance = Variance.SPECIAL - - if last_variance != variance or variance == Variance.SPECIAL: - obscurity += 1 - - if obscurity >= threshold: - return '{}...{}'.format(word[0:1], word[-1:]) - - last_variance = variance - - # Otherwise we're good; return our word - return word - - -def cwe312_url(url): - """ - This function was written to help mask secure/private information that may - or may not be found on an Apprise URL. The idea is to not disrupt the - structure of the previous URL too much, yet still protect the users - private information from being logged directly to screen. - - For more detail see CWE-312 @ - https://cwe.mitre.org/data/definitions/312.html - - For example, consider the URL: http://user:password@localhost/ - - When passed into this function, the return value would be: - http://user:****@localhost/ - - Since apprise allows you to put private information everywhere in it's - custom URLs, it uses this function to manipulate the content before - returning to any kind of logger. - - The idea is that the URL can still be interpreted by the person who - constructed them, but not to an intruder. - """ - # Parse our URL - results = parse_url(url) - if not results: - # Nothing was returned (invalid data was fed in); return our - # information as it was fed to us (without changing it) - return url - - # Update our URL with values - results['password'] = cwe312_word(results['password'], force=True) - if not results['schema'].startswith('http'): - results['user'] = cwe312_word(results['user']) - results['host'] = cwe312_word(results['host']) - - else: - results['host'] = cwe312_word(results['host'], advanced=False) - results['user'] = cwe312_word(results['user'], advanced=False) - - # Apply our full path scan in all cases - results['fullpath'] = '/' + \ - '/'.join([cwe312_word(x) - for x in re.split( - r'[\\/]+', - results['fullpath'].lstrip('/'))]) \ - if results['fullpath'] else '' - - # - # Now re-assemble our URL for display purposes - # - - # Determine Authentication - auth = '' - if results['user'] and results['password']: - auth = '{user}:{password}@'.format( - user=results['user'], - password=results['password'], - ) - elif results['user']: - auth = '{user}@'.format( - user=results['user'], - ) - - params = '' - if results['qsd']: - params = '?{}'.format( - "&".join(["{}={}".format(k, cwe312_word(v, force=( - k in ('password', 'secret', 'pass', 'token', 'key', - 'id', 'apikey', 'to')))) - for k, v in results['qsd'].items()])) - - return '{schema}://{auth}{hostname}{port}{fullpath}{params}'.format( - schema=results['schema'], - auth=auth, - # never encode hostname since we're expecting it to be a valid one - hostname=results['host'], - port='' if not results['port'] else ':{}'.format(results['port']), - fullpath=results['fullpath'] if results['fullpath'] else '', - params=params, - ) - - -@contextlib.contextmanager -def environ(*remove, **update): - """ - Temporarily updates the ``os.environ`` dictionary in-place. - - The ``os.environ`` dictionary is updated in-place so that the modification - is sure to work in all situations. - - :param remove: Environment variable(s) to remove. - :param update: Dictionary of environment variables and values to - add/update. - """ - - # Create a backup of our environment for restoration purposes - env_orig = os.environ.copy() - loc_orig = locale.getlocale() - try: - os.environ.update(update) - [os.environ.pop(k, None) for k in remove] - yield - - finally: - # Restore our snapshot - os.environ = env_orig.copy() - try: - # Restore locale - locale.setlocale(locale.LC_ALL, loc_orig) - - except locale.Error: - # Handle this case - pass - - -def apply_template(template, app_mode=TemplateType.RAW, **kwargs): - """ - Takes a template in a str format and applies all of the keywords - and their values to it. - - The app$mode is used to dictact any pre-processing that needs to take place - to the escaped string prior to it being placed. The idea here is for - elements to be placed in a JSON response for example should be escaped - early in their string format. - - The template must contain keywords wrapped in in double - squirly braces like {{keyword}}. These are matched to the respected - kwargs passed into this function. - - If there is no match found, content is not swapped. - - """ - - def _escape_raw(content): - # No escaping necessary - return content - - def _escape_json(content): - # remove surounding quotes - return json.dumps(content)[1:-1] - - # Our escape function - fn = _escape_json if app_mode == TemplateType.JSON else _escape_raw - - lookup = [re.escape(x) for x in kwargs.keys()] - - # Compile this into a list - mask_r = re.compile( - re.escape('{{') + r'\s*(' + '|'.join(lookup) + r')\s*' - + re.escape('}}'), re.IGNORECASE) - - # we index 2 characters off the head and 2 characters from the tail - # to drop the '{{' and '}}' surrounding our match so that we can - # re-index it back into our list - return mask_r.sub(lambda x: fn(kwargs[x.group()[2:-2].strip()]), template) - - -def remove_suffix(value, suffix): - """ - Removes a suffix from the end of a string. - """ - return value[:-len(suffix)] if value.endswith(suffix) else value - - -def dict_full_update(dict1, dict2): - """ - Takes 2 dictionaries (dict1 and dict2) that contain sub-dictionaries and - gracefully merges them into dict1. - - This is similar to: dict1.update(dict2) except that internal dictionaries - are also recursively applied. - """ - def _merge(dict1, dict2): - for k in dict2: - if k in dict1 and isinstance(dict1[k], dict) \ - and isinstance(dict2[k], dict): - _merge(dict1[k], dict2[k]) - else: - dict1[k] = dict2[k] - - _merge(dict1, dict2) - return - - -def dir_size(path, max_depth=3, missing_okay=True, _depth=0, _errors=None): - """ - Scans a provided path an returns it's size (in bytes) of path provided - """ - - if _errors is None: - _errors = set() - - if _depth > max_depth: - _errors.add(path) - return (0, _errors) - - total = 0 - try: - with os.scandir(path) as it: - for entry in it: - try: - if entry.is_file(follow_symlinks=False): - total += entry.stat(follow_symlinks=False).st_size - - elif entry.is_dir(follow_symlinks=False): - (totals, _) = dir_size( - entry.path, - max_depth=max_depth, - _depth=_depth + 1, - _errors=_errors) - total += totals - - except FileNotFoundError: - # no worries; Nothing to do - continue - - except (OSError, IOError) as e: - # Permission error of some kind or disk problem... - # There is nothing we can do at this point - _errors.add(entry.path) - logger.warning( - 'dir_size detetcted inaccessible path: %s', - os.fsdecode(entry.path)) - logger.debug('dir_size Exception: %s' % str(e)) - continue - - except FileNotFoundError: - if not missing_okay: - # Conditional error situation - _errors.add(path) - - except (OSError, IOError) as e: - # Permission error of some kind or disk problem... - # There is nothing we can do at this point - _errors.add(path) - logger.warning( - 'dir_size detetcted inaccessible path: %s', - os.fsdecode(path)) - logger.debug('dir_size Exception: %s' % str(e)) - - return (total, _errors) - - -def bytes_to_str(value): - """ - Covert an integer (in bytes) into it's string representation with - acompanied unit value (such as B, KB, MB, GB, TB, etc) - """ - unit = 'B' - try: - value = float(value) - - except (ValueError, TypeError): - return None - - if value >= 1024.0: - value = value / 1024.0 - unit = 'KB' - if value >= 1024.0: - value = value / 1024.0 - unit = 'MB' - if value >= 1024.0: - value = value / 1024.0 - unit = 'GB' - if value >= 1024.0: - value = value / 1024.0 - unit = 'TB' - - return '%.2f%s' % (round(value, 2), unit) - - -def decode_b64_dict(di: dict) -> dict: - """ - decodes base64 dictionary previously encoded - - string entries prefixed with `b64:` are targeted - """ - di = copy.deepcopy(di) - for k, v in di.items(): - if not isinstance(v, str) or not v.startswith("b64:"): - continue - - try: - parsed_v = base64.b64decode(v[4:]) - parsed_v = json.loads(parsed_v) - - except (ValueError, TypeError, binascii.Error, - json.decoder.JSONDecodeError): - # ValueError: the length of altchars is not 2. - # TypeError: invalid input - # binascii.Error: not base64 (bad padding) - # json.decoder.JSONDecodeError: Bad JSON object - - parsed_v = v - di[k] = parsed_v - return di - - -def encode_b64_dict(di: dict, encoding='utf-8') -> typing.Tuple[dict, bool]: - """ - Encodes dictionary entries containing binary types (int, float) into base64 - - Final product is always string based values - """ - di = copy.deepcopy(di) - needs_decoding = False - for k, v in di.items(): - if isinstance(v, str): - continue - - try: - encoded = base64.urlsafe_b64encode(json.dumps(v).encode(encoding)) - encoded = "b64:{}".format(encoded.decode(encoding)) - needs_decoding = True - - except (ValueError, TypeError): - # ValueError: - # - the length of altchars is not 2. - # TypeError: - # - json not searializable or - # - bytes object not passed into urlsafe_b64encode() - encoded = str(v) - - di[k] = encoded - return di, needs_decoding diff --git a/libs/apprise/utils/pgp.py b/libs/apprise/utils/pgp.py new file mode 100644 index 000000000..504e38b15 --- /dev/null +++ b/libs/apprise/utils/pgp.py @@ -0,0 +1,354 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. + +import os +import hashlib +from datetime import datetime +from datetime import timedelta +from datetime import timezone + +from ..apprise_attachment import AppriseAttachment +from ..asset import AppriseAsset +from ..logger import logger +from ..exception import ApprisePluginException + +try: + import pgpy + # Pretty Good Privacy (PGP) Support enabled + PGP_SUPPORT = True + +except ImportError: + # Pretty Good Privacy (PGP) Support disabled + PGP_SUPPORT = False + + +class ApprisePGPException(ApprisePluginException): + """ + Thrown when there is an error with the Pretty Good Privacy Controller + """ + def __init__(self, message, error_code=602): + super().__init__(message, error_code=error_code) + + +class ApprisePGPController: + """ + Pretty Good Privacy Controller Tool for the Apprise Library + """ + + # There is no reason a PGP Public Key should exceed 8K in size + # If it is more than this, then it is not accepted + max_pgp_public_key_size = 8000 + + def __init__(self, path, pub_keyfile=None, email=None, asset=None, + **kwargs): + """ + Path should be the directory keys can be written and read from such as + <notifyobject>.store.path + + Optionally additionally specify a keyfile to explicitly open + """ + + # PGP hash + self.__key_lookup = {} + + # Directory we can work with + self.path = path + + # Our email + self.email = email + + # Prepare our Asset Object + self.asset = \ + asset if isinstance(asset, AppriseAsset) else AppriseAsset() + + if pub_keyfile: + # Create ourselves an Attachment to work with; this grants us the + # ability to pull this key from a remote site or anything else + # supported by the Attachment object + self._pub_keyfile = AppriseAttachment(asset=self.asset) + + # Add our definition to our pgp_key reference + self._pub_keyfile.add(pub_keyfile) + + # Enforce maximum file size + self._pub_keyfile[0].max_file_size = self.max_pgp_public_key_size + + else: + self._pub_keyfile = None + + def keygen(self, email=None, name=None, force=False): + """ + Generates a set of keys based on email configured. + """ + + try: + # Create a new RSA key pair with 2048-bit strength + key = pgpy.PGPKey.new( + pgpy.constants.PubKeyAlgorithm.RSAEncryptOrSign, 2048) + + except NameError: + # PGPy not installed + logger.debug('PGPy not installed; keygen disabled') + return False + + if self._pub_keyfile is not None or not self.path: + logger.trace( + 'PGP keygen disabled, reason=%s', + 'keyfile-defined' if self._pub_keyfile is not None + else 'no-write-path') + return False + + if not name: + name = self.asset.app_id + + if not email: + email = self.email + + # Prepare our UID + uid = pgpy.PGPUID.new(name, email=email) + + # Filenames + file_prefix = email.split('@')[0].lower() + + pub_path = os.path.join(self.path, f'{file_prefix}-pub.asc') + prv_path = os.path.join(self.path, f'{file_prefix}-prv.asc') + + if os.path.isfile(pub_path) and not force: + logger.debug( + 'PGP generation skipped; Public Key already exists: %s', + pub_path) + return True + + # Persistent Storage Key + lookup_key = hashlib.sha1( + os.path.abspath(pub_path).encode('utf-8')).hexdigest() + if lookup_key in self.__key_lookup: + # Ensure our key no longer exists + del self.__key_lookup[lookup_key] + + # Add the user ID to the key + key.add_uid(uid, usage={ + pgpy.constants.KeyFlags.Sign, + pgpy.constants.KeyFlags.EncryptCommunications}, + hashes=[pgpy.constants.HashAlgorithm.SHA256], + ciphers=[pgpy.constants.SymmetricKeyAlgorithm.AES256], + compression=[pgpy.constants.CompressionAlgorithm.ZLIB]) + + try: + # Write our keys to disk + with open(pub_path, 'w') as f: + f.write(str(key.pubkey)) + + except OSError as e: + logger.warning('Error writing PGP file %s', pub_path) + logger.debug(f'I/O Exception: {e}') + + # Cleanup + try: + os.unlink(pub_path) + logger.trace('Removed %s', pub_path) + + except OSError: + pass + + try: + with open(prv_path, 'w') as f: + f.write(str(key)) + + except OSError as e: + logger.warning('Error writing PGP file %s', prv_path) + logger.debug(f'I/O Exception: {e}') + + try: + os.unlink(pub_path) + logger.trace('Removed %s', pub_path) + + except OSError: + pass + + try: + os.unlink(prv_path) + logger.trace('Removed %s', prv_path) + + except OSError: + pass + + return False + + logger.info( + 'Wrote PGP Keys for %s/%s', + os.path.dirname(pub_path), + os.path.basename(pub_path)) + return True + + def public_keyfile(self, *emails): + """ + Returns the first match of a useable public key based emails provided + """ + + if not PGP_SUPPORT: + msg = 'PGP Support unavailable; install PGPy library' + logger.warning(msg) + raise ApprisePGPException(msg) + + if self._pub_keyfile is not None: + # If our code reaches here, then we fetch our public key + pgp_key = self._pub_keyfile[0] + if not pgp_key: + # We could not access the attachment + logger.error( + 'Could not access PGP Public Key {}.'.format( + pgp_key.url(privacy=True))) + return False + + return pgp_key.path + + elif not self.path: + # No path + return None + + fnames = [ + 'pgp-public.asc', + 'pgp-pub.asc', + 'public.asc', + 'pub.asc', + ] + + if self.email: + # Include our email in the list + emails = [self.email] + [*emails] + + for email in emails: + _entry = email.split('@')[0].lower() + fnames.insert(0, f'{_entry}-pub.asc') + + # Lowercase email (Highest Priority) + _entry = email.lower() + fnames.insert(0, f'{_entry}-pub.asc') + + return next( + (os.path.join(self.path, fname) + for fname in fnames + if os.path.isfile(os.path.join(self.path, fname))), + None) + + def public_key(self, *emails, autogen=None): + """ + Opens a spcified pgp public file and returns the key from it which + is used to encrypt the message + """ + path = self.public_keyfile(*emails) + if not path: + if (autogen if autogen is not None else self.asset.pgp_autogen) \ + and self.keygen(*emails): + path = self.public_keyfile(*emails) + if path: + # We should get a hit now + return self.public_key(*emails) + + logger.warning('No PGP Public Key could be loaded') + return None + + # Persistent Storage Key + key = hashlib.sha1( + os.path.abspath(path).encode('utf-8')).hexdigest() + if key in self.__key_lookup: + # Take an early exit + return self.__key_lookup[key]['public_key'] + + try: + with open(path, 'r') as key_file: + public_key, _ = pgpy.PGPKey.from_blob(key_file.read()) + + except NameError: + # PGPy not installed + logger.debug( + 'PGPy not installed; skipping PGP support: %s', path) + return None + + except FileNotFoundError: + # Generate keys + logger.debug('PGP Public Key file not found: %s', path) + return None + + except OSError as e: + logger.warning('Error accessing PGP Public Key file %s', path) + logger.debug(f'I/O Exception: {e}') + return None + + self.__key_lookup[key] = { + 'public_key': public_key, + 'expires': + datetime.now(timezone.utc) + timedelta(seconds=86400) + } + return public_key + + # Encrypt message using the recipient's public key + def encrypt(self, message, *emails): + """ + If provided a path to a pgp-key, content is encrypted + """ + + # Acquire our key + public_key = self.public_key(*emails) + if not public_key: + # Encryption not possible + return False + + try: + message_object = pgpy.PGPMessage.new(message) + encrypted_message = public_key.encrypt(message_object) + return str(encrypted_message) + + except pgpy.errors.PGPError: + # Encryption not Possible + logger.debug( + 'PGP Public Key Corruption; encryption not possible') + + except NameError: + # PGPy not installed + logger.debug('PGPy not installed; Skipping PGP encryption') + + return None + + def prune(self): + """ + Prunes old entries from the public_key index + """ + self.__key_lookup = { + key: value for key, value in self.__key_lookup.items() + if value['expires'] > datetime.now(timezone.utc)} + + @property + def pub_keyfile(self): + """ + Returns the Public Keyfile Path if set otherwise it returns None + This property returns False if a keyfile was provided, but was invalid + """ + return None if self._pub_keyfile is None else ( + False if not self._pub_keyfile[0] else self._pub_keyfile[0].path) diff --git a/libs/apprise/utils/singleton.py b/libs/apprise/utils/singleton.py new file mode 100644 index 000000000..1151a292c --- /dev/null +++ b/libs/apprise/utils/singleton.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. + + +class Singleton(type): + """ + Our Singleton MetaClass + """ + _instances = {} + + def __call__(cls, *args, **kwargs): + """ + instantiate our singleton meta entry + """ + if cls not in cls._instances: + # we have not every built an instance before. Build one now. + cls._instances[cls] = super().__call__(*args, **kwargs) + return cls._instances[cls] diff --git a/libs/apprise/utils/templates.py b/libs/apprise/utils/templates.py new file mode 100644 index 000000000..5e259234d --- /dev/null +++ b/libs/apprise/utils/templates.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# BSD 2-Clause License +# +# Apprise - Push Notification Library. +# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# +# 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. +# +# 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. +import re +import json + + +class TemplateType: + """ + Defines the different template types we can perform parsing on + """ + # RAW does nothing at all to the content being parsed + # data is taken at it's absolute value + RAW = 'raw' + + # Data is presumed to be of type JSON and is therefore escaped + # if required to do so (such as single quotes) + JSON = 'json' + + +def apply_template(template, app_mode=TemplateType.RAW, **kwargs): + """ + Takes a template in a str format and applies all of the keywords + and their values to it. + + The app$mode is used to dictact any pre-processing that needs to take place + to the escaped string prior to it being placed. The idea here is for + elements to be placed in a JSON response for example should be escaped + early in their string format. + + The template must contain keywords wrapped in in double + squirly braces like {{keyword}}. These are matched to the respected + kwargs passed into this function. + + If there is no match found, content is not swapped. + + """ + + def _escape_raw(content): + # No escaping necessary + return content + + def _escape_json(content): + # remove surounding quotes + return json.dumps(content)[1:-1] + + # Our escape function + fn = _escape_json if app_mode == TemplateType.JSON else _escape_raw + + lookup = [re.escape(x) for x in kwargs.keys()] + + # Compile this into a list + mask_r = re.compile( + re.escape('{{') + r'\s*(' + '|'.join(lookup) + r')\s*' + + re.escape('}}'), re.IGNORECASE) + + # we index 2 characters off the head and 2 characters from the tail + # to drop the '{{' and '}}' surrounding our match so that we can + # re-index it back into our list + return mask_r.sub(lambda x: fn(kwargs[x.group()[2:-2].strip()]), template) diff --git a/libs/attr/__init__.py b/libs/attr/__init__.py index 51b1c2559..5c6e0650b 100644 --- a/libs/attr/__init__.py +++ b/libs/attr/__init__.py @@ -5,20 +5,21 @@ """ from functools import partial -from typing import Callable +from typing import Callable, Literal, Protocol from . import converters, exceptions, filters, setters, validators from ._cmp import cmp_using -from ._compat import Protocol from ._config import get_run_validators, set_run_validators -from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types +from ._funcs import asdict, assoc, astuple, has, resolve_types from ._make import ( NOTHING, Attribute, Converter, Factory, + _Nothing, attrib, attrs, + evolve, fields, fields_dict, make_class, @@ -37,12 +38,15 @@ class AttrsInstance(Protocol): pass +NothingType = Literal[_Nothing.NOTHING] + __all__ = [ + "NOTHING", "Attribute", "AttrsInstance", "Converter", "Factory", - "NOTHING", + "NothingType", "asdict", "assoc", "astuple", @@ -85,10 +89,7 @@ def __getattr__(name: str) -> str: msg = f"module {mod_name} has no attribute {name}" raise AttributeError(msg) - try: - from importlib.metadata import metadata - except ImportError: - from importlib_metadata import metadata + from importlib.metadata import metadata meta = metadata("attrs") diff --git a/libs/attr/__init__.pyi b/libs/attr/__init__.pyi index 6ae0a83de..133e50105 100644 --- a/libs/attr/__init__.pyi +++ b/libs/attr/__init__.pyi @@ -5,6 +5,7 @@ from typing import ( Any, Callable, Generic, + Literal, Mapping, Protocol, Sequence, @@ -37,9 +38,9 @@ from attrs import ( ) if sys.version_info >= (3, 10): - from typing import TypeGuard + from typing import TypeGuard, TypeAlias else: - from typing_extensions import TypeGuard + from typing_extensions import TypeGuard, TypeAlias if sys.version_info >= (3, 11): from typing import dataclass_transform @@ -72,33 +73,24 @@ class _Nothing(enum.Enum): NOTHING = enum.auto() NOTHING = _Nothing.NOTHING +NothingType: TypeAlias = Literal[_Nothing.NOTHING] # NOTE: Factory lies about its return type to make this possible: # `x: List[int] # = Factory(list)` # Work around mypy issue #4554 in the common case by using an overload. -if sys.version_info >= (3, 8): - from typing import Literal - @overload - def Factory(factory: Callable[[], _T]) -> _T: ... - @overload - def Factory( - factory: Callable[[Any], _T], - takes_self: Literal[True], - ) -> _T: ... - @overload - def Factory( - factory: Callable[[], _T], - takes_self: Literal[False], - ) -> _T: ... -else: - @overload - def Factory(factory: Callable[[], _T]) -> _T: ... - @overload - def Factory( - factory: Union[Callable[[Any], _T], Callable[[], _T]], - takes_self: bool = ..., - ) -> _T: ... +@overload +def Factory(factory: Callable[[], _T]) -> _T: ... +@overload +def Factory( + factory: Callable[[Any], _T], + takes_self: Literal[True], +) -> _T: ... +@overload +def Factory( + factory: Callable[[], _T], + takes_self: Literal[False], +) -> _T: ... In = TypeVar("In") Out = TypeVar("Out") @@ -139,7 +131,7 @@ class Attribute(Generic[_T]): order: _EqOrderType hash: bool | None init: bool - converter: _ConverterType | Converter[Any, _T] | None + converter: Converter | None metadata: dict[Any, Any] type: type[_T] | None kw_only: bool @@ -203,7 +195,10 @@ def attrib( init: bool = ..., metadata: Mapping[Any, Any] | None = ..., type: type[_T] | None = ..., - converter: _ConverterType | Converter[Any, _T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., factory: Callable[[], _T] | None = ..., kw_only: bool = ..., eq: _EqOrderType | None = ..., @@ -223,7 +218,10 @@ def attrib( init: bool = ..., metadata: Mapping[Any, Any] | None = ..., type: type[_T] | None = ..., - converter: _ConverterType | Converter[Any, _T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., factory: Callable[[], _T] | None = ..., kw_only: bool = ..., eq: _EqOrderType | None = ..., @@ -243,7 +241,10 @@ def attrib( init: bool = ..., metadata: Mapping[Any, Any] | None = ..., type: object = ..., - converter: _ConverterType | Converter[Any, _T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., factory: Callable[[], _T] | None = ..., kw_only: bool = ..., eq: _EqOrderType | None = ..., diff --git a/libs/attr/_compat.py b/libs/attr/_compat.py index 104eeb07e..22fcd7838 100644 --- a/libs/attr/_compat.py +++ b/libs/attr/_compat.py @@ -10,7 +10,6 @@ PYPY = platform.python_implementation() == "PyPy" -PY_3_8_PLUS = sys.version_info[:2] >= (3, 8) PY_3_9_PLUS = sys.version_info[:2] >= (3, 9) PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) @@ -19,14 +18,6 @@ PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) -if sys.version_info < (3, 8): - try: - from typing_extensions import Protocol - except ImportError: # pragma: no cover - Protocol = object -else: - from typing import Protocol # noqa: F401 - if PY_3_14_PLUS: # pragma: no cover import annotationlib diff --git a/libs/attr/_config.py b/libs/attr/_config.py index 9c245b146..4b257726f 100644 --- a/libs/attr/_config.py +++ b/libs/attr/_config.py @@ -1,6 +1,6 @@ # SPDX-License-Identifier: MIT -__all__ = ["set_run_validators", "get_run_validators"] +__all__ = ["get_run_validators", "set_run_validators"] _run_validators = True diff --git a/libs/attr/_funcs.py b/libs/attr/_funcs.py index 355cef442..c39fb8aa5 100644 --- a/libs/attr/_funcs.py +++ b/libs/attr/_funcs.py @@ -394,60 +394,6 @@ def assoc(inst, **changes): return new -def evolve(*args, **changes): - """ - Create a new instance, based on the first positional argument with - *changes* applied. - - Args: - - inst: - Instance of a class with *attrs* attributes. *inst* must be passed - as a positional argument. - - changes: - Keyword changes in the new copy. - - Returns: - A copy of inst with *changes* incorporated. - - Raises: - TypeError: - If *attr_name* couldn't be found in the class ``__init__``. - - attrs.exceptions.NotAnAttrsClassError: - If *cls* is not an *attrs* class. - - .. versionadded:: 17.1.0 - .. deprecated:: 23.1.0 - It is now deprecated to pass the instance using the keyword argument - *inst*. It will raise a warning until at least April 2024, after which - it will become an error. Always pass the instance as a positional - argument. - .. versionchanged:: 24.1.0 - *inst* can't be passed as a keyword argument anymore. - """ - try: - (inst,) = args - except ValueError: - msg = ( - f"evolve() takes 1 positional argument, but {len(args)} were given" - ) - raise TypeError(msg) from None - - cls = inst.__class__ - attrs = fields(cls) - for a in attrs: - if not a.init: - continue - attr_name = a.name # To deal with private attributes. - init_name = a.alias - if init_name not in changes: - changes[init_name] = getattr(inst, attr_name) - - return cls(**changes) - - def resolve_types( cls, globalns=None, localns=None, attribs=None, include_extras=True ): diff --git a/libs/attr/_make.py b/libs/attr/_make.py index bf00c5f8c..f00fec48c 100644 --- a/libs/attr/_make.py +++ b/libs/attr/_make.py @@ -20,9 +20,9 @@ # having the thread-local in the globals here. from . import _compat, _config, setters from ._compat import ( - PY_3_8_PLUS, PY_3_10_PLUS, PY_3_11_PLUS, + PY_3_13_PLUS, _AnnotationExtractor, _get_annotations, get_generic_base, @@ -80,6 +80,8 @@ def __bool__(self): NOTHING = _Nothing.NOTHING """ Sentinel to indicate the lack of a value when `None` is ambiguous. + +When using in 3rd party code, use `attrs.NothingType` for type annotations. """ @@ -544,18 +546,82 @@ def _frozen_setattrs(self, name, value): "__cause__", "__context__", "__traceback__", + "__suppress_context__", + "__notes__", ): BaseException.__setattr__(self, name, value) return - raise FrozenInstanceError() + raise FrozenInstanceError def _frozen_delattrs(self, name): """ Attached to frozen classes as __delattr__. """ - raise FrozenInstanceError() + if isinstance(self, BaseException) and name in ("__notes__",): + BaseException.__delattr__(self, name) + return + + raise FrozenInstanceError + + +def evolve(*args, **changes): + """ + Create a new instance, based on the first positional argument with + *changes* applied. + + .. tip:: + + On Python 3.13 and later, you can also use `copy.replace` instead. + + Args: + + inst: + Instance of a class with *attrs* attributes. *inst* must be passed + as a positional argument. + + changes: + Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + TypeError: + If *attr_name* couldn't be found in the class ``__init__``. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 17.1.0 + .. deprecated:: 23.1.0 + It is now deprecated to pass the instance using the keyword argument + *inst*. It will raise a warning until at least April 2024, after which + it will become an error. Always pass the instance as a positional + argument. + .. versionchanged:: 24.1.0 + *inst* can't be passed as a keyword argument anymore. + """ + try: + (inst,) = args + except ValueError: + msg = ( + f"evolve() takes 1 positional argument, but {len(args)} were given" + ) + raise TypeError(msg) from None + + cls = inst.__class__ + attrs = fields(cls) + for a in attrs: + if not a.init: + continue + attr_name = a.name # To deal with private attributes. + init_name = a.alias + if init_name not in changes: + changes[init_name] = getattr(inst, attr_name) + + return cls(**changes) class _ClassBuilder: @@ -573,15 +639,15 @@ class _ClassBuilder: "_cls_dict", "_delete_attribs", "_frozen", - "_has_pre_init", - "_pre_init_has_args", + "_has_custom_setattr", "_has_post_init", + "_has_pre_init", "_is_exc", "_on_setattr", + "_pre_init_has_args", "_slots", "_weakref_slot", "_wrote_own_setattr", - "_has_custom_setattr", ) def __init__( @@ -790,16 +856,11 @@ def _create_slots_class(self): ): names += ("__weakref__",) - if PY_3_8_PLUS: - cached_properties = { - name: cached_property.func - for name, cached_property in cd.items() - if isinstance(cached_property, functools.cached_property) - } - else: - # `functools.cached_property` was introduced in 3.8. - # So can't be used before this. - cached_properties = {} + cached_properties = { + name: cached_property.func + for name, cached_property in cd.items() + if isinstance(cached_property, functools.cached_property) + } # Collect methods with a `__class__` reference that are shadowed in the new class. # To know to update them. @@ -977,6 +1038,12 @@ def add_init(self): return self + def add_replace(self): + self._cls_dict["__replace__"] = self._add_method_dunders( + lambda self, **changes: evolve(self, **changes) + ) + return self + def add_match_args(self): self._cls_dict["__match_args__"] = tuple( field.name @@ -1379,6 +1446,9 @@ def wrap(cls): msg = "Invalid value for cache_hash. To use hash caching, init must be True." raise TypeError(msg) + if PY_3_13_PLUS and not _has_own_attribute(cls, "__replace__"): + builder.add_replace() + if ( PY_3_10_PLUS and match_args @@ -1532,8 +1602,6 @@ def _make_eq(cls, attrs): " return NotImplemented", ] - # We can't just do a big self.x = other.x and... clause due to - # irregularities like nan == nan is false but (nan,) == (nan,) is true. globs = {} if attrs: lines.append(" return (") @@ -2023,7 +2091,7 @@ def _attrs_to_init_script( has_factory = isinstance(a.default, Factory) maybe_self = "self" if has_factory and a.default.takes_self else "" - if a.converter and not isinstance(a.converter, Converter): + if a.converter is not None and not isinstance(a.converter, Converter): converter = Converter(a.converter) else: converter = a.converter @@ -2213,7 +2281,7 @@ def _attrs_to_init_script( # If pre init method has arguments, pass same arguments as `__init__`. lines[0] = f"self.__attrs_pre_init__({pre_init_args})" - # Python 3.7 doesn't allow backslashes in f strings. + # Python <3.12 doesn't allow backslashes in f-strings. NL = "\n " return ( f"""def {method_name}(self, {args}): @@ -2278,7 +2346,9 @@ class Attribute: For the full version history of the fields, see `attr.ib`. """ - __slots__ = ( + # These slots must NOT be reordered because we use them later for + # instantiation. + __slots__ = ( # noqa: RUF023 "name", "default", "validator", @@ -2354,7 +2424,7 @@ def __init__( bound_setattr("alias", alias) def __setattr__(self, name, value): - raise FrozenInstanceError() + raise FrozenInstanceError @classmethod def from_counting_attr(cls, name, ca, type=None): @@ -2392,7 +2462,7 @@ def evolve(self, **changes): Copy *self* and apply *changes*. This works similarly to `attrs.evolve` but that function does not work - with {class}`Attribute`. + with :class:`attrs.Attribute`. It is mainly meant to be used for `transform-fields`. @@ -2472,22 +2542,22 @@ class _CountingAttr: """ __slots__ = ( - "counter", "_default", - "repr", + "_validator", + "alias", + "converter", + "counter", "eq", "eq_key", - "order", - "order_key", "hash", "init", - "metadata", - "_validator", - "converter", - "type", "kw_only", + "metadata", "on_setattr", - "alias", + "order", + "order_key", + "repr", + "type", ) __attrs_attrs__ = ( *tuple( @@ -2603,7 +2673,7 @@ def default(self, meth): .. versionadded:: 17.1.0 """ if self._default is not NOTHING: - raise DefaultAlreadySetError() + raise DefaultAlreadySetError self._default = Factory(meth, takes_self=True) @@ -2693,12 +2763,12 @@ class Converter: """ __slots__ = ( - "converter", - "takes_self", - "takes_field", + "__call__", "_first_param_type", "_global_name", - "__call__", + "converter", + "takes_field", + "takes_self", ) def __init__(self, converter, *, takes_self=False, takes_field=False): @@ -2798,10 +2868,19 @@ def make_class( r""" A quick way to create a new class called *name* with *attrs*. + .. note:: + + ``make_class()`` is a thin wrapper around `attr.s`, not `attrs.define` + which means that it doesn't come with some of the improved defaults. + + For example, if you want the same ``on_setattr`` behavior as in + `attrs.define`, you have to pass the hooks yourself: ``make_class(..., + on_setattr=setters.pipe(setters.convert, setters.validate)`` + Args: name (str): The name for the new class. - attrs( list | dict): + attrs (list | dict): A list of names or a dictionary of mappings of names to `attr.ib`\ s / `attrs.field`\ s. @@ -2932,11 +3011,25 @@ def pipe(*converters): .. versionadded:: 20.1.0 """ - def pipe_converter(val, inst, field): - for c in converters: - val = c(val, inst, field) if isinstance(c, Converter) else c(val) + return_instance = any(isinstance(c, Converter) for c in converters) + + if return_instance: + + def pipe_converter(val, inst, field): + for c in converters: + val = ( + c(val, inst, field) if isinstance(c, Converter) else c(val) + ) + + return val + + else: + + def pipe_converter(val): + for c in converters: + val = c(val) - return val + return val if not converters: # If the converter list is empty, pipe_converter is the identity. @@ -2957,4 +3050,6 @@ def pipe_converter(val, inst, field): if rt: pipe_converter.__annotations__["return"] = rt - return Converter(pipe_converter, takes_self=True, takes_field=True) + if return_instance: + return Converter(pipe_converter, takes_self=True, takes_field=True) + return pipe_converter diff --git a/libs/attr/_next_gen.py b/libs/attr/_next_gen.py index dbb65cc97..9290664b2 100644 --- a/libs/attr/_next_gen.py +++ b/libs/attr/_next_gen.py @@ -5,7 +5,6 @@ default values. """ - from functools import partial from . import setters @@ -77,7 +76,7 @@ def define( sensible ``__ne__`` by default, so it *should* be enough to only implement ``__eq__`` in most cases). - Passing True or False` to *init*, *repr*, *eq*, *cmp*, or *hash* + Passing True or False` to *init*, *repr*, *eq*, or *hash* overrides whatever *auto_detect* would determine. auto_exc (bool): @@ -152,10 +151,6 @@ def define( .. seealso:: `comparison` - cmp (bool | None): - Setting *cmp* is equivalent to setting *eq* and *order* to the same - value. Must not be mixed with *eq* or *order*. - unsafe_hash (bool | None): If None (default), the ``__hash__`` method is generated according how *eq* and *frozen* are set. @@ -321,6 +316,9 @@ def define( If a class has an *inherited* classmethod called ``__attrs_init_subclass__``, it is executed after the class is created. .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + .. versionadded:: 24.3.0 + Unless already present, a ``__replace__`` method is automatically + created for `copy.replace` (Python 3.13+ only). .. note:: @@ -505,12 +503,6 @@ def field( .. seealso:: `comparison` - cmp(bool | ~typing.Callable): - Setting *cmp* is equivalent to setting *eq* and *order* to the same - value. Must not be mixed with *eq* or *order*. - - .. seealso:: `comparison` - hash (bool | None): Include this attribute in the generated ``__hash__`` method. If None (default), mirror *eq*'s value. This is the correct behavior diff --git a/libs/attr/converters.py b/libs/attr/converters.py index 92383110a..0a79deef0 100644 --- a/libs/attr/converters.py +++ b/libs/attr/converters.py @@ -4,11 +4,10 @@ Commonly useful converters. """ - import typing from ._compat import _AnnotationExtractor -from ._make import NOTHING, Factory, pipe +from ._make import NOTHING, Converter, Factory, pipe __all__ = [ @@ -34,10 +33,19 @@ def optional(converter): .. versionadded:: 17.1.0 """ - def optional_converter(val): - if val is None: - return None - return converter(val) + if isinstance(converter, Converter): + + def optional_converter(val, inst, field): + if val is None: + return None + return converter(val, inst, field) + + else: + + def optional_converter(val): + if val is None: + return None + return converter(val) xtr = _AnnotationExtractor(converter) @@ -49,6 +57,9 @@ def optional_converter(val): if rt: optional_converter.__annotations__["return"] = typing.Optional[rt] + if isinstance(converter, Converter): + return Converter(optional_converter, takes_self=True, takes_field=True) + return optional_converter diff --git a/libs/attr/converters.pyi b/libs/attr/converters.pyi index 9ef478f21..12bd0c4f1 100644 --- a/libs/attr/converters.pyi +++ b/libs/attr/converters.pyi @@ -1,13 +1,19 @@ -from typing import Callable, TypeVar, overload +from typing import Callable, Any, overload -from attrs import _ConverterType - -_T = TypeVar("_T") +from attrs import _ConverterType, _CallableConverterType +@overload +def pipe(*validators: _CallableConverterType) -> _CallableConverterType: ... +@overload def pipe(*validators: _ConverterType) -> _ConverterType: ... +@overload +def optional(converter: _CallableConverterType) -> _CallableConverterType: ... +@overload def optional(converter: _ConverterType) -> _ConverterType: ... @overload -def default_if_none(default: _T) -> _ConverterType: ... +def default_if_none(default: Any) -> _CallableConverterType: ... @overload -def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType: ... -def to_bool(val: str) -> bool: ... +def default_if_none( + *, factory: Callable[[], Any] +) -> _CallableConverterType: ... +def to_bool(val: str | int | bool) -> bool: ... diff --git a/libs/attr/setters.py b/libs/attr/setters.py index a9ce01698..78b08398a 100644 --- a/libs/attr/setters.py +++ b/libs/attr/setters.py @@ -32,7 +32,7 @@ def frozen(_, __, ___): .. versionadded:: 20.1.0 """ - raise FrozenAttributeError() + raise FrozenAttributeError def validate(instance, attrib, new_value): diff --git a/libs/attr/validators.py b/libs/attr/validators.py index 8a56717df..e7b755250 100644 --- a/libs/attr/validators.py +++ b/libs/attr/validators.py @@ -4,7 +4,6 @@ Commonly useful validators. """ - import operator import re @@ -173,7 +172,7 @@ def matches_re(regex, flags=0, func=None): if func not in valid_funcs: msg = "'func' must be one of {}.".format( ", ".join( - sorted(e and e.__name__ or "None" for e in set(valid_funcs)) + sorted((e and e.__name__) or "None" for e in set(valid_funcs)) ) ) raise ValueError(msg) diff --git a/libs/attr/validators.pyi b/libs/attr/validators.pyi index a314110e6..a0fdda7c8 100644 --- a/libs/attr/validators.pyi +++ b/libs/attr/validators.pyi @@ -1,3 +1,4 @@ +from types import UnionType from typing import ( Any, AnyStr, @@ -36,14 +37,16 @@ def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... @overload def instance_of( - type: tuple[type[_T1], type[_T2]] + type: tuple[type[_T1], type[_T2]], ) -> _ValidatorType[_T1 | _T2]: ... @overload def instance_of( - type: tuple[type[_T1], type[_T2], type[_T3]] + type: tuple[type[_T1], type[_T2], type[_T3]], ) -> _ValidatorType[_T1 | _T2 | _T3]: ... @overload def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... +@overload +def instance_of(type: UnionType) -> _ValidatorType[Any]: ... def optional( validator: ( _ValidatorType[_T] diff --git a/libs/attrs-24.2.0.dist-info/RECORD b/libs/attrs-24.2.0.dist-info/RECORD deleted file mode 100644 index 3a10fcaff..000000000 --- a/libs/attrs-24.2.0.dist-info/RECORD +++ /dev/null @@ -1,37 +0,0 @@ -attr/__init__.py,sha256=l8Ewh5KZE7CCY0i1iDfSCnFiUTIkBVoqsXjX9EZnIVA,2087 -attr/__init__.pyi,sha256=aTVHBPX6krCGvbQvOl_UKqEzmi2HFsaIVm2WKmAiqVs,11434 -attr/_cmp.py,sha256=3umHiBtgsEYtvNP_8XrQwTCdFoZIX4DEur76N-2a3X8,4123 -attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 -attr/_compat.py,sha256=n2Uk3c-ywv0PkFfGlvqR7SzDXp4NOhWmNV_ZK6YfWoM,2958 -attr/_config.py,sha256=z81Vt-GeT_2taxs1XZfmHx9TWlSxjPb6eZH1LTGsS54,843 -attr/_funcs.py,sha256=SGDmNlED1TM3tgO9Ap2mfRfVI24XEAcrNQs7o2eBXHQ,17386 -attr/_make.py,sha256=BjENJz5eJoojJVbCoupWjXLLEZJ7VID89lisLbQUlmQ,91479 -attr/_next_gen.py,sha256=dhGb96VFg4kXBkS9Zdz1A2uxVJ99q_RT1hw3kLA9-uI,24630 -attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 -attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 -attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 -attr/converters.py,sha256=vNa58pZi9V6uxBzl4t1QrHbQfkT4iRFAodyXe7lcgg0,3506 -attr/converters.pyi,sha256=mpDoVFO3Cpx8xYSSV0iZFl7IAHuoNBglxKfxHvLj_sY,410 -attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 -attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 -attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 -attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 -attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attr/setters.py,sha256=faMQeiBo_nbXYnPaQ1pq8PXeA7Zr-uNsVsPMiKCmxhc,1619 -attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 -attr/validators.py,sha256=985eTP6RHyon61YEauMJgyNy1rEOhJWiSXMJgRxPtrQ,20045 -attr/validators.pyi,sha256=LjKf7AoXZfvGSfT3LRs61Qfln94konYyMUPoJJjOxK4,2502 -attrs-24.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -attrs-24.2.0.dist-info/METADATA,sha256=3Jgk4lr9Y1SAqAcwOLPN_mpW0wc6VOGm-yHt1LsPIHw,11524 -attrs-24.2.0.dist-info/RECORD,, -attrs-24.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attrs-24.2.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 -attrs-24.2.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 -attrs/__init__.py,sha256=5FHo-EMFOX-g4ialSK4fwOjuoHzLISJDZCwoOl02Ty8,1071 -attrs/__init__.pyi,sha256=o3l92VsD9kHz8sldEtb_tllBTs3TeL-vIBMTxo2Zc_4,7703 -attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 -attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 -attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 -attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 -attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/libs/attrs-24.2.0.dist-info/INSTALLER b/libs/attrs-24.3.0.dist-info/INSTALLER similarity index 100% rename from libs/attrs-24.2.0.dist-info/INSTALLER rename to libs/attrs-24.3.0.dist-info/INSTALLER diff --git a/libs/attrs-24.2.0.dist-info/METADATA b/libs/attrs-24.3.0.dist-info/METADATA similarity index 78% rename from libs/attrs-24.2.0.dist-info/METADATA rename to libs/attrs-24.3.0.dist-info/METADATA index a85b37863..e994a6cae 100644 --- a/libs/attrs-24.2.0.dist-info/METADATA +++ b/libs/attrs-24.3.0.dist-info/METADATA @@ -1,6 +1,6 @@ -Metadata-Version: 2.3 +Metadata-Version: 2.4 Name: attrs -Version: 24.2.0 +Version: 24.3.0 Summary: Classes Without Boilerplate Project-URL: Documentation, https://www.attrs.org/ Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html @@ -12,8 +12,6 @@ License-Expression: MIT License-File: LICENSE Keywords: attribute,boilerplate,class Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 @@ -23,33 +21,32 @@ Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Typing :: Typed -Requires-Python: >=3.7 -Requires-Dist: importlib-metadata; python_version < '3.8' +Requires-Python: >=3.8 Provides-Extra: benchmark Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark' Requires-Dist: hypothesis; extra == 'benchmark' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'benchmark' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark' Requires-Dist: pympler; extra == 'benchmark' Requires-Dist: pytest-codspeed; extra == 'benchmark' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'benchmark' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'benchmark' Requires-Dist: pytest-xdist[psutil]; extra == 'benchmark' Requires-Dist: pytest>=4.3.0; extra == 'benchmark' Provides-Extra: cov Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov' Requires-Dist: coverage[toml]>=5.3; extra == 'cov' Requires-Dist: hypothesis; extra == 'cov' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'cov' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov' Requires-Dist: pympler; extra == 'cov' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'cov' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'cov' Requires-Dist: pytest-xdist[psutil]; extra == 'cov' Requires-Dist: pytest>=4.3.0; extra == 'cov' Provides-Extra: dev Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev' Requires-Dist: hypothesis; extra == 'dev' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'dev' -Requires-Dist: pre-commit; extra == 'dev' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev' +Requires-Dist: pre-commit-uv; extra == 'dev' Requires-Dist: pympler; extra == 'dev' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'dev' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'dev' Requires-Dist: pytest-xdist[psutil]; extra == 'dev' Requires-Dist: pytest>=4.3.0; extra == 'dev' Provides-Extra: docs @@ -63,14 +60,14 @@ Requires-Dist: towncrier<24.7; extra == 'docs' Provides-Extra: tests Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests' Requires-Dist: hypothesis; extra == 'tests' -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests' Requires-Dist: pympler; extra == 'tests' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests' Requires-Dist: pytest-xdist[psutil]; extra == 'tests' Requires-Dist: pytest>=4.3.0; extra == 'tests' Provides-Extra: tests-mypy -Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests-mypy' -Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests-mypy' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.10') and extra == 'tests-mypy' Description-Content-Type: text/markdown <p align="center"> @@ -99,12 +96,14 @@ Especially those generously supporting us at the *The Organization* tier and hig import pathlib, tomllib for sponsor in tomllib.loads(pathlib.Path("pyproject.toml").read_text())["tool"]["sponcon"]["sponsors"]: - print(f'<a href="{sponsor["url"]}"><img title="{sponsor["title"]}" src="https://www.attrs.org/en/24.2.0/_static/sponsors/{sponsor["img"]}" width="190" /></a>') + print(f'<a href="{sponsor["url"]}"><img title="{sponsor["title"]}" src="https://www.attrs.org/en/24.3.0/_static/sponsors/{sponsor["img"]}" width="190" /></a>') ]]] --> -<a href="https://www.variomedia.de/"><img title="Variomedia AG" src="https://www.attrs.org/en/24.2.0/_static/sponsors/Variomedia.svg" width="190" /></a> -<a href="https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek"><img title="Tidelift" src="https://www.attrs.org/en/24.2.0/_static/sponsors/Tidelift.svg" width="190" /></a> -<a href="https://klaviyo.com/"><img title="Klaviyo" src="https://www.attrs.org/en/24.2.0/_static/sponsors/Klaviyo.svg" width="190" /></a> -<a href="https://filepreviews.io/"><img title="FilePreviews" src="https://www.attrs.org/en/24.2.0/_static/sponsors/FilePreviews.svg" width="190" /></a> +<a href="https://www.variomedia.de/"><img title="Variomedia AG" src="https://www.attrs.org/en/24.3.0/_static/sponsors/Variomedia.svg" width="190" /></a> +<a href="https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek"><img title="Tidelift" src="https://www.attrs.org/en/24.3.0/_static/sponsors/Tidelift.svg" width="190" /></a> +<a href="https://klaviyo.com/"><img title="Klaviyo" src="https://www.attrs.org/en/24.3.0/_static/sponsors/Klaviyo.svg" width="190" /></a> +<a href="https://www.emsys-renewables.com/"><img title="emsys renewables" src="https://www.attrs.org/en/24.3.0/_static/sponsors/emsys-renewables.svg" width="190" /></a> +<a href="https://filepreviews.io/"><img title="FilePreviews" src="https://www.attrs.org/en/24.3.0/_static/sponsors/FilePreviews.svg" width="190" /></a> +<a href="https://polar.sh/"><img title="Polar" src="https://www.attrs.org/en/24.3.0/_static/sponsors/Polar.svg" width="190" /></a> <!-- [[[end]]] --> </p> @@ -213,27 +212,32 @@ For more details, please refer to our [comparison page](https://www.attrs.org/en ### *attrs* for Enterprise -Available as part of the Tidelift Subscription. +Available as part of the [Tidelift Subscription](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. -[Learn more](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). ## Release Information -### Deprecations +### Backwards-incompatible Changes -- Given the amount of warnings raised in the broader ecosystem, we've decided to only soft-deprecate the *hash* argument to `@define` / `@attr.s`. - Please don't use it in new code, but we don't intend to remove it anymore. - [#1330](https://github.com/python-attrs/attrs/issues/1330) +- Python 3.7 has been dropped. + [#1340](https://github.com/python-attrs/attrs/issues/1340) ### Changes -- `attrs.converters.pipe()` (and its syntactic sugar of passing a list for `attrs.field()`'s / `attr.ib()`'s *converter* argument) works again when passing `attrs.setters.convert` to *on_setattr* (which is default for `attrs.define`). - [#1328](https://github.com/python-attrs/attrs/issues/1328) -- Restored support for PEP [649](https://peps.python.org/pep-0649/) / [749](https://peps.python.org/pep-0749/)-implementing Pythons -- currently 3.14-dev. - [#1329](https://github.com/python-attrs/attrs/issues/1329) +- Introduce `attrs.NothingType`, for annotating types consistent with `attrs.NOTHING`. + [#1358](https://github.com/python-attrs/attrs/issues/1358) +- Allow mutating `__suppress_context__` and `__notes__` on frozen exceptions. + [#1365](https://github.com/python-attrs/attrs/issues/1365) +- `attrs.converters.optional()` works again when taking `attrs.converters.pipe()` or another Converter as its argument. + [#1372](https://github.com/python-attrs/attrs/issues/1372) +- *attrs* instances now support [`copy.replace()`](https://docs.python.org/3/library/copy.html#copy.replace). + [#1383](https://github.com/python-attrs/attrs/issues/1383) +- `attrs.validators.instance_of()`'s type hints now allow for union types. + For example: `instance_of(str | int)` + [#1385](https://github.com/python-attrs/attrs/issues/1385) diff --git a/libs/attrs-24.3.0.dist-info/RECORD b/libs/attrs-24.3.0.dist-info/RECORD new file mode 100644 index 000000000..6d302303f --- /dev/null +++ b/libs/attrs-24.3.0.dist-info/RECORD @@ -0,0 +1,37 @@ +attr/__init__.py,sha256=fOYIvt1eGSqQre4uCS3sJWKZ0mwAuC8UD6qba5OS9_U,2057 +attr/__init__.pyi,sha256=QIXnnHPoucmDWkbpNsWTP-cgJ1bn8le7DjyRa_wYdew,11281 +attr/_cmp.py,sha256=3umHiBtgsEYtvNP_8XrQwTCdFoZIX4DEur76N-2a3X8,4123 +attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 +attr/_compat.py,sha256=4hlXbWhdDjQCDK6FKF1EgnZ3POiHgtpp54qE0nxaGHg,2704 +attr/_config.py,sha256=dGq3xR6fgZEF6UBt_L0T-eUHIB4i43kRmH0P28sJVw8,843 +attr/_funcs.py,sha256=5-tUKJtp3h5El55EcDl6GWXFp68fT8D8U7uCRN6497I,15854 +attr/_make.py,sha256=orKSf6C-B1eZfpat4lbAtxvmSyE_yxlG8zY9115ufWk,94157 +attr/_next_gen.py,sha256=7FRkbtl_N017SuBhf_Vw3mw2c2pGZhtCGOzadgz7tp4,24395 +attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 +attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 +attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 +attr/converters.py,sha256=GlDeOzPeTFgeBBLbj9G57Ez5lAk68uhSALRYJ_exe84,3861 +attr/converters.pyi,sha256=orU2bff-VjQa2kMDyvnMQV73oJT2WRyQuw4ZR1ym1bE,643 +attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 +attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 +attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 +attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/setters.py,sha256=5-dcT63GQK35ONEzSgfXCkbB7pPkaR-qv15mm4PVSzQ,1617 +attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 +attr/validators.py,sha256=WaB1HLAHHqRHWsrv_K9H-sJ7ESil3H3Cmv2d8TtVZx4,20046 +attr/validators.pyi,sha256=s2WhKPqskxbsckJfKk8zOuuB088GfgpyxcCYSNFLqNU,2603 +attrs-24.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-24.3.0.dist-info/METADATA,sha256=f9hhECeAUyS7iewHPRuMLDy1tpJ6vyy8R_TKUnCmiA8,11654 +attrs-24.3.0.dist-info/RECORD,, +attrs-24.3.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs-24.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +attrs-24.3.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 +attrs/__init__.py,sha256=qeQJZ4O08yczSn840v9bYOaZyRE81WsVi-QCrY3krCU,1107 +attrs/__init__.pyi,sha256=nZmInocjM7tHV4AQw0vxO_fo6oJjL_PonlV9zKKW8DY,7931 +attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 +attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 +attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 +attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 +attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/libs/attrs-24.2.0.dist-info/REQUESTED b/libs/attrs-24.3.0.dist-info/REQUESTED similarity index 100% rename from libs/attrs-24.2.0.dist-info/REQUESTED rename to libs/attrs-24.3.0.dist-info/REQUESTED diff --git a/libs/attrs-24.2.0.dist-info/WHEEL b/libs/attrs-24.3.0.dist-info/WHEEL similarity index 67% rename from libs/attrs-24.2.0.dist-info/WHEEL rename to libs/attrs-24.3.0.dist-info/WHEEL index cdd68a497..12228d414 100644 --- a/libs/attrs-24.2.0.dist-info/WHEEL +++ b/libs/attrs-24.3.0.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.25.0 +Generator: hatchling 1.27.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/attrs-24.2.0.dist-info/licenses/LICENSE b/libs/attrs-24.3.0.dist-info/licenses/LICENSE similarity index 100% rename from libs/attrs-24.2.0.dist-info/licenses/LICENSE rename to libs/attrs-24.3.0.dist-info/licenses/LICENSE diff --git a/libs/attrs/__init__.py b/libs/attrs/__init__.py index 963b1972d..e8023ff6c 100644 --- a/libs/attrs/__init__.py +++ b/libs/attrs/__init__.py @@ -6,6 +6,7 @@ AttrsInstance, Converter, Factory, + NothingType, _make_getattr, assoc, cmp_using, @@ -27,6 +28,12 @@ __all__ = [ + "NOTHING", + "Attribute", + "AttrsInstance", + "Converter", + "Factory", + "NothingType", "__author__", "__copyright__", "__description__", @@ -40,24 +47,19 @@ "asdict", "assoc", "astuple", - "Attribute", - "AttrsInstance", "cmp_using", - "Converter", "converters", "define", "evolve", "exceptions", - "Factory", "field", - "fields_dict", "fields", + "fields_dict", "filters", "frozen", "has", "make_class", "mutable", - "NOTHING", "resolve_types", "setters", "validate", diff --git a/libs/attrs/__init__.pyi b/libs/attrs/__init__.pyi index b2670de21..648fa7a34 100644 --- a/libs/attrs/__init__.pyi +++ b/libs/attrs/__init__.pyi @@ -40,6 +40,7 @@ from attr import setters as setters from attr import validate as validate from attr import validators as validators from attr import attrib, asdict as asdict, astuple as astuple +from attr import NothingType as NothingType if sys.version_info >= (3, 11): from typing import dataclass_transform @@ -51,7 +52,8 @@ _C = TypeVar("_C", bound=type) _EqOrderType = bool | Callable[[Any], Any] _ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] -_ConverterType = Callable[[Any], Any] +_CallableConverterType = Callable[[Any], Any] +_ConverterType = _CallableConverterType | Converter[Any, Any] _ReprType = Callable[[Any], str] _ReprArgType = bool | _ReprType _OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] @@ -94,7 +96,10 @@ def field( hash: bool | None = ..., init: bool = ..., metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType | Converter[Any, _T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., factory: Callable[[], _T] | None = ..., kw_only: bool = ..., eq: _EqOrderType | None = ..., @@ -114,7 +119,10 @@ def field( hash: bool | None = ..., init: bool = ..., metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType | Converter[Any, _T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., factory: Callable[[], _T] | None = ..., kw_only: bool = ..., eq: _EqOrderType | None = ..., @@ -134,7 +142,10 @@ def field( hash: bool | None = ..., init: bool = ..., metadata: Mapping[Any, Any] | None = ..., - converter: _ConverterType | Converter[Any, _T] | None = ..., + converter: _ConverterType + | list[_ConverterType] + | tuple[_ConverterType] + | None = ..., factory: Callable[[], _T] | None = ..., kw_only: bool = ..., eq: _EqOrderType | None = ..., diff --git a/libs/blinker-1.8.2.dist-info/METADATA b/libs/blinker-1.8.2.dist-info/METADATA index efa45f598..265a62023 100644 --- a/libs/blinker-1.8.2.dist-info/METADATA +++ b/libs/blinker-1.8.2.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: blinker Version: 1.8.2 Summary: Fast, simple object-to-object and broadcast signaling diff --git a/libs/blinker-1.8.2.dist-info/RECORD b/libs/blinker-1.8.2.dist-info/RECORD index 9aa4e59bf..d847313ba 100644 --- a/libs/blinker-1.8.2.dist-info/RECORD +++ b/libs/blinker-1.8.2.dist-info/RECORD @@ -1,9 +1,9 @@ blinker-1.8.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 blinker-1.8.2.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 -blinker-1.8.2.dist-info/METADATA,sha256=3tEx40hm9IEofyFqDPJsDPE9MAIEhtifapoSp7FqzuA,1633 +blinker-1.8.2.dist-info/METADATA,sha256=85eZNsH1XXOq69piDlG96OppJLB4BvbSv-FwtkUx1Hw,1633 blinker-1.8.2.dist-info/RECORD,, blinker-1.8.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -blinker-1.8.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +blinker-1.8.2.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 blinker/__init__.py,sha256=ymyJY_PoTgBzaPgdr4dq-RRsGh7D-sYQIGMNp8Rx4qc,1577 blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675 blinker/base.py,sha256=nIZJEtXQ8LLZZJrwVp2wQcdfCzDixvAHR9VpSWiyVcQ,22574 diff --git a/libs/blinker-1.8.2.dist-info/WHEEL b/libs/blinker-1.8.2.dist-info/WHEEL index 3b5e64b5e..e3c6feefa 100644 --- a/libs/blinker-1.8.2.dist-info/WHEEL +++ b/libs/blinker-1.8.2.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: flit 3.9.0 +Generator: flit 3.10.1 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/certifi-2024.8.30.dist-info/INSTALLER b/libs/certifi-2024.12.14.dist-info/INSTALLER similarity index 100% rename from libs/certifi-2024.8.30.dist-info/INSTALLER rename to libs/certifi-2024.12.14.dist-info/INSTALLER diff --git a/libs/certifi-2024.8.30.dist-info/LICENSE b/libs/certifi-2024.12.14.dist-info/LICENSE similarity index 100% rename from libs/certifi-2024.8.30.dist-info/LICENSE rename to libs/certifi-2024.12.14.dist-info/LICENSE diff --git a/libs/certifi-2024.8.30.dist-info/METADATA b/libs/certifi-2024.12.14.dist-info/METADATA similarity index 96% rename from libs/certifi-2024.8.30.dist-info/METADATA rename to libs/certifi-2024.12.14.dist-info/METADATA index 0a3a772a1..c4809863b 100644 --- a/libs/certifi-2024.8.30.dist-info/METADATA +++ b/libs/certifi-2024.12.14.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: certifi -Version: 2024.8.30 +Version: 2024.12.14 Summary: Python package for providing Mozilla's CA Bundle. Home-page: https://github.com/certifi/python-certifi Author: Kenneth Reitz @@ -21,6 +21,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Requires-Python: >=3.6 License-File: LICENSE diff --git a/libs/certifi-2024.12.14.dist-info/RECORD b/libs/certifi-2024.12.14.dist-info/RECORD new file mode 100644 index 000000000..e783f377c --- /dev/null +++ b/libs/certifi-2024.12.14.dist-info/RECORD @@ -0,0 +1,12 @@ +certifi-2024.12.14.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2024.12.14.dist-info/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 +certifi-2024.12.14.dist-info/METADATA,sha256=z71eRGTFszr4qsHenZ_vG2Fd5bV9PBWmJgShthc8IkY,2274 +certifi-2024.12.14.dist-info/RECORD,, +certifi-2024.12.14.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +certifi-2024.12.14.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +certifi-2024.12.14.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=LqjNcwt1sYSS3uhPXrf6jJzVCuHtNVpuirg5rb7mVm8,94 +certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 +certifi/cacert.pem,sha256=gHiXJU84Oif0XkT0llbzeKurIUHt5DpK08JCCll90j8,294769 +certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426 +certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/certifi-2024.8.30.dist-info/REQUESTED b/libs/certifi-2024.12.14.dist-info/REQUESTED similarity index 100% rename from libs/certifi-2024.8.30.dist-info/REQUESTED rename to libs/certifi-2024.12.14.dist-info/REQUESTED diff --git a/libs/certifi-2024.8.30.dist-info/WHEEL b/libs/certifi-2024.12.14.dist-info/WHEEL similarity index 100% rename from libs/certifi-2024.8.30.dist-info/WHEEL rename to libs/certifi-2024.12.14.dist-info/WHEEL diff --git a/libs/certifi-2024.8.30.dist-info/top_level.txt b/libs/certifi-2024.12.14.dist-info/top_level.txt similarity index 100% rename from libs/certifi-2024.8.30.dist-info/top_level.txt rename to libs/certifi-2024.12.14.dist-info/top_level.txt diff --git a/libs/certifi-2024.8.30.dist-info/RECORD b/libs/certifi-2024.8.30.dist-info/RECORD deleted file mode 100644 index 66dcdfaaf..000000000 --- a/libs/certifi-2024.8.30.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -certifi-2024.8.30.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2024.8.30.dist-info/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -certifi-2024.8.30.dist-info/METADATA,sha256=GhBHRVUN6a4ZdUgE_N5wmukJfyuoE-QyIl8Y3ifNQBM,2222 -certifi-2024.8.30.dist-info/RECORD,, -certifi-2024.8.30.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -certifi-2024.8.30.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -certifi-2024.8.30.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=p_GYZrjUwPBUhpLlCZoGb0miKBKSqDAyZC5DvIuqbHQ,94 -certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 -certifi/cacert.pem,sha256=lO3rZukXdPyuk6BWUJFOKQliWaXH6HGh9l1GGrUgG0c,299427 -certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426 -certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/certifi/__init__.py b/libs/certifi/__init__.py index f61d77fa3..ee8686bec 100644 --- a/libs/certifi/__init__.py +++ b/libs/certifi/__init__.py @@ -1,4 +1,4 @@ from .core import contents, where __all__ = ["contents", "where"] -__version__ = "2024.08.30" +__version__ = "2024.12.14" diff --git a/libs/certifi/cacert.pem b/libs/certifi/cacert.pem index 3c165a1b8..f2d66010a 100644 --- a/libs/certifi/cacert.pem +++ b/libs/certifi/cacert.pem @@ -763,35 +763,6 @@ uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- -# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. -# Label: "SecureSign RootCA11" -# Serial: 1 -# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 -# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 -# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - # Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. # Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. # Label: "Microsec e-Szigno Root CA 2009" @@ -3100,50 +3071,6 @@ LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG mpv0 -----END CERTIFICATE----- -# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only -# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only -# Label: "Entrust Root Certification Authority - G4" -# Serial: 289383649854506086828220374796556676440 -# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 -# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 -# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw -gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL -Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg -MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw -BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 -MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 -c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ -bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ -2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E -T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j -5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM -C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T -DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX -wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A -2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm -nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl -N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj -c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS -5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS -Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr -hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ -B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI -AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw -H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ -b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk -2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol -IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk -5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY -n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- - # Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation # Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation # Label: "Microsoft ECC Root Certificate Authority 2017" @@ -3485,6 +3412,46 @@ DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + # Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz # Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz # Label: "ANF Secure Server Root CA" @@ -4214,46 +4181,6 @@ ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR -----END CERTIFICATE----- -# Issuer: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. -# Subject: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. -# Label: "Security Communication RootCA3" -# Serial: 16247922307909811815 -# MD5 Fingerprint: 1c:9a:16:ff:9e:5c:e0:4d:8a:14:01:f4:35:5d:29:26 -# SHA1 Fingerprint: c3:03:c8:22:74:92:e5:61:a2:9c:5f:79:91:2b:1e:44:13:91:30:3a -# SHA256 Fingerprint: 24:a5:5c:2a:b0:51:44:2d:06:17:76:65:41:23:9a:4a:d0:32:d7:c5:51:75:aa:34:ff:de:2f:bc:4f:5c:52:94 ------BEGIN CERTIFICATE----- -MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNV -BAYTAkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScw -JQYDVQQDEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2 -MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UEAxMeU2VjdXJpdHkg -Q29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4r -CmDvu20rhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzA -lrenfna84xtSGc4RHwsENPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MG -TfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF7 -9+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGmnpjKIG58u4iFW/vAEGK7 -8vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtYXLVqAvO4 -g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3we -GVPKp7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst -+3A7caoreyYn8xrC3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M -0V9hvqG8OmpI6iZVIhZdXw3/JzOfGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQ -T9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0VcwCBEF/VfR2ccCAwEAAaNCMEAw -HQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS -YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PA -FNr0Y/Dq9HHuTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd -9XbXv8S2gVj/yP9kaWJ5rW4OH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQI -UYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASxYfQAW0q3nHE3GYV5v4GwxxMOdnE+ -OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZXSEIx2C/pHF7uNke -gr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml+LLf -iAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUV -nuiZIesnKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD -2NCcnWXL0CsnMQMeNuE9dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI// -1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm6Vwdp6POXiUyK+OVrCoHzrQoeIY8Laad -TdJ0MN1kURXbg4NR16/9M51NZg== ------END CERTIFICATE----- - # Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. # Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. # Label: "Security Communication ECC RootCA1" diff --git a/libs/charset_normalizer-3.4.0.dist-info/RECORD b/libs/charset_normalizer-3.4.0.dist-info/RECORD deleted file mode 100644 index 8a6b94942..000000000 --- a/libs/charset_normalizer-3.4.0.dist-info/RECORD +++ /dev/null @@ -1,22 +0,0 @@ -../../bin/normalizer,sha256=DGK3Yd9Fs5jr7E7dCqKi353EqQgSyiH9aYN4XCZJnjk,256 -charset_normalizer-3.4.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -charset_normalizer-3.4.0.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 -charset_normalizer-3.4.0.dist-info/METADATA,sha256=WGbEW9ehh2spNJxo1M6sEGGZWmsQ-oj2DsMjV29zoms,34159 -charset_normalizer-3.4.0.dist-info/RECORD,, -charset_normalizer-3.4.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer-3.4.0.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -charset_normalizer-3.4.0.dist-info/entry_points.txt,sha256=ADSTKrkXZ3hhdOVFi6DcUEHQRS0xfxDIE_pEz4wLIXA,65 -charset_normalizer-3.4.0.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 -charset_normalizer/__init__.py,sha256=UzI3xC8PhmcLRMzSgPb6minTmRq0kWznnCBJ8ZCc2XI,1577 -charset_normalizer/__main__.py,sha256=JxY8bleaENOFlLRb9HfoeZCzAMnn2A1oGR5Xm2eyqg0,73 -charset_normalizer/api.py,sha256=kMyNUqrfBZU22PP0pYKrSldtYUGA24wsGlXGLAKra7c,22559 -charset_normalizer/cd.py,sha256=xwZliZcTQFA3jU0c00PRiu9MNxXTFxQkFLWmMW24ZzI,12560 -charset_normalizer/cli/__init__.py,sha256=D5ERp8P62llm2FuoMzydZ7d9rs8cvvLXqE-1_6oViPc,100 -charset_normalizer/cli/__main__.py,sha256=zX9sV_ApU1d96Wb0cS04vulstdB4F0Eh7kLn-gevfw4,10411 -charset_normalizer/constant.py,sha256=uwoW87NicWZDTLviX7le0wdoYBbhBQDA4n1JtJo77ts,40499 -charset_normalizer/legacy.py,sha256=XJjkT0hejMH8qfAKz1ts8OUiBT18t2FJP3tJgLwUWwc,2327 -charset_normalizer/md.py,sha256=SIIZcENrslI7h3v4GigbFN61fRyE_wiCN1z9Ii3fBRo,20138 -charset_normalizer/models.py,sha256=oAMAcBSEY7CngbUXJp34Wc4Rl9NKJJjGmUwW3EPtk6g,12425 -charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer/utils.py,sha256=teiosMqzKjXyAHXnGdjSBOgnBZwx-SkBbCLrx0UXy8M,11894 -charset_normalizer/version.py,sha256=AX66S4ytQFdd6F5jbVU2OPMqYwFS5M3BkMvyX-3BKF8,79 diff --git a/libs/charset_normalizer-3.4.0.dist-info/WHEEL b/libs/charset_normalizer-3.4.0.dist-info/WHEEL deleted file mode 100644 index ba48cbcf9..000000000 --- a/libs/charset_normalizer-3.4.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.3) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/charset_normalizer-3.4.0.dist-info/entry_points.txt b/libs/charset_normalizer-3.4.0.dist-info/entry_points.txt deleted file mode 100644 index 65619e73e..000000000 --- a/libs/charset_normalizer-3.4.0.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -normalizer = charset_normalizer.cli:cli_detect diff --git a/libs/charset_normalizer-3.4.0.dist-info/INSTALLER b/libs/charset_normalizer-3.4.1.dist-info/INSTALLER similarity index 100% rename from libs/charset_normalizer-3.4.0.dist-info/INSTALLER rename to libs/charset_normalizer-3.4.1.dist-info/INSTALLER diff --git a/libs/charset_normalizer-3.4.0.dist-info/LICENSE b/libs/charset_normalizer-3.4.1.dist-info/LICENSE similarity index 95% rename from libs/charset_normalizer-3.4.0.dist-info/LICENSE rename to libs/charset_normalizer-3.4.1.dist-info/LICENSE index ad82355b8..9725772c7 100644 --- a/libs/charset_normalizer-3.4.0.dist-info/LICENSE +++ b/libs/charset_normalizer-3.4.1.dist-info/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 TAHRI Ahmed R. +Copyright (c) 2025 TAHRI Ahmed R. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ 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. \ No newline at end of file +SOFTWARE. diff --git a/libs/charset_normalizer-3.4.0.dist-info/METADATA b/libs/charset_normalizer-3.4.1.dist-info/METADATA similarity index 93% rename from libs/charset_normalizer-3.4.0.dist-info/METADATA rename to libs/charset_normalizer-3.4.1.dist-info/METADATA index b19096b11..634e1d662 100644 --- a/libs/charset_normalizer-3.4.0.dist-info/METADATA +++ b/libs/charset_normalizer-3.4.1.dist-info/METADATA @@ -1,18 +1,18 @@ Metadata-Version: 2.1 Name: charset-normalizer -Version: 3.4.0 +Version: 3.4.1 Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. -Home-page: https://github.com/Ousret/charset_normalizer -Author: Ahmed TAHRI -Author-email: tahri.ahmed@proton.me +Author-email: "Ahmed R. TAHRI" <tahri.ahmed@proton.me> +Maintainer-email: "Ahmed R. TAHRI" <tahri.ahmed@proton.me> License: MIT -Project-URL: Bug Reports, https://github.com/Ousret/charset_normalizer/issues -Project-URL: Documentation, https://charset-normalizer.readthedocs.io/en/latest +Project-URL: Changelog, https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md +Project-URL: Documentation, https://charset-normalizer.readthedocs.io/ +Project-URL: Code, https://github.com/jawah/charset_normalizer +Project-URL: Issue tracker, https://github.com/jawah/charset_normalizer/issues Keywords: encoding,charset,charset-detector,detector,normalization,unicode,chardet,detect Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License Classifier: Intended Audience :: Developers -Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 @@ -23,11 +23,13 @@ Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Text Processing :: Linguistic Classifier: Topic :: Utilities Classifier: Typing :: Typed -Requires-Python: >=3.7.0 +Requires-Python: >=3.7 Description-Content-Type: text/markdown License-File: LICENSE Provides-Extra: unicode_backport @@ -49,7 +51,7 @@ Provides-Extra: unicode_backport <p align="center"> <sup><i>Featured Packages</i></sup><br> <a href="https://github.com/jawah/niquests"> - <img alt="Static Badge" src="https://img.shields.io/badge/Niquests-HTTP_1.1%2C%202%2C_and_3_Client-cyan"> + <img alt="Static Badge" src="https://img.shields.io/badge/Niquests-Best_HTTP_Client-cyan"> </a> <a href="https://github.com/jawah/wassima"> <img alt="Static Badge" src="https://img.shields.io/badge/Wassima-Certifi_Killer-cyan"> @@ -89,8 +91,7 @@ This project offers you an alternative to **Universal Charset Encoding Detector* <img src="https://i.imgflip.com/373iay.gif" alt="Reading Normalized Text" width="226"/><img src="https://media.tenor.com/images/c0180f70732a18b4965448d33adba3d0/tenor.gif" alt="Cat Reading Text" width="200"/> </p> -*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*<br> -Did you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html) +*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*<br> ## ⚡ Performance @@ -98,21 +99,23 @@ This package offer better performance than its counterpart Chardet. Here are som | Package | Accuracy | Mean per file (ms) | File per sec (est) | |-----------------------------------------------|:--------:|:------------------:|:------------------:| -| [chardet](https://github.com/chardet/chardet) | 86 % | 200 ms | 5 file/sec | +| [chardet](https://github.com/chardet/chardet) | 86 % | 63 ms | 16 file/sec | | charset-normalizer | **98 %** | **10 ms** | 100 file/sec | | Package | 99th percentile | 95th percentile | 50th percentile | |-----------------------------------------------|:---------------:|:---------------:|:---------------:| -| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms | +| [chardet](https://github.com/chardet/chardet) | 265 ms | 71 ms | 7 ms | | charset-normalizer | 100 ms | 50 ms | 5 ms | +_updated as of december 2024 using CPython 3.12_ + Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. > Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. > And yes, these results might change at any time. The dataset can be updated to include more files. > The actual delays heavily depends on your CPU capabilities. The factors should remain the same. > Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability -> (eg. Supported Encoding) Challenge-them if you want. +> (e.g. Supported Encoding) Challenge-them if you want. ## ✨ Installation @@ -229,11 +232,11 @@ reliable alternative using a completely different method. Also! I never back dow I **don't care** about the **originating charset** encoding, because **two different tables** can produce **two identical rendered string.** -What I want is to get readable text, the best I can. +What I want is to get readable text, the best I can. In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 -Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. +Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair Unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. ## 🍰 How @@ -245,7 +248,7 @@ Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is **Wait a minute**, what is noise/mess and coherence according to **YOU ?** *Noise :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then -**I established** some ground rules about **what is obvious** when **it seems like** a mess. +**I established** some ground rules about **what is obvious** when **it seems like** a mess (aka. defining noise in rendered text). I know that my interpretation of what is noise is probably incomplete, feel free to contribute in order to improve or rewrite it. @@ -290,10 +293,33 @@ tools. [1]: https://tidelift.com/subscription/pkg/pypi-charset-normalizer?utm_source=pypi-charset-normalizer&utm_medium=readme +[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/7297/badge)](https://www.bestpractices.dev/projects/7297) + # Changelog All notable changes to charset-normalizer will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [3.4.1](https://github.com/Ousret/charset_normalizer/compare/3.4.0...3.4.1) (2024-12-24) + +### Changed +- Project metadata are now stored using `pyproject.toml` instead of `setup.cfg` using setuptools as the build backend. +- Enforce annotation delayed loading for a simpler and consistent types in the project. +- Optional mypyc compilation upgraded to version 1.14 for Python >= 3.8 + +### Added +- pre-commit configuration. +- noxfile. + +### Removed +- `build-requirements.txt` as per using `pyproject.toml` native build configuration. +- `bin/integration.py` and `bin/serve.py` in favor of downstream integration test (see noxfile). +- `setup.cfg` in favor of `pyproject.toml` metadata configuration. +- Unused `utils.range_scan` function. + +### Fixed +- Converting content to Unicode bytes may insert `utf_8` instead of preferred `utf-8`. (#572) +- Deprecation warning "'count' is passed as positional argument" when converting to Unicode bytes on Python 3.13+ + ## [3.4.0](https://github.com/Ousret/charset_normalizer/compare/3.3.2...3.4.0) (2024-10-08) ### Added @@ -473,7 +499,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [2.0.12](https://github.com/Ousret/charset_normalizer/compare/2.0.11...2.0.12) (2022-02-12) ### Fixed -- ASCII miss-detection on rare cases (PR #170) +- ASCII miss-detection on rare cases (PR #170) ## [2.0.11](https://github.com/Ousret/charset_normalizer/compare/2.0.10...2.0.11) (2022-01-30) @@ -505,7 +531,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - MD improvement on trailing data and long foreign (non-pure latin) data (PR #124) - Efficiency improvements in cd/alphabet_languages from [@adbar](https://github.com/adbar) (PR #122) - call sum() without an intermediary list following PEP 289 recommendations from [@adbar](https://github.com/adbar) (PR #129) -- Code style as refactored by Sourcery-AI (PR #131) +- Code style as refactored by Sourcery-AI (PR #131) - Minor adjustment on the MD around european words (PR #133) - Remove and replace SRTs from assets / tests (PR #139) - Initialize the library logger with a `NullHandler` by default from [@nmaynes](https://github.com/nmaynes) (PR #135) @@ -578,7 +604,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [2.0.2](https://github.com/Ousret/charset_normalizer/compare/2.0.1...2.0.2) (2021-07-15) ### Fixed -- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) +- Empty/Too small JSON payload miss-detection fixed. Report from [@tseaver](https://github.com/tseaver) (PR #59) ### Changed - Don't inject unicodedata2 into sys.modules from [@akx](https://github.com/akx) (PR #57) @@ -674,7 +700,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). MIT License -Copyright (c) 2019 TAHRI Ahmed R. +Copyright (c) 2025 TAHRI Ahmed R. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/libs/charset_normalizer-3.4.1.dist-info/RECORD b/libs/charset_normalizer-3.4.1.dist-info/RECORD new file mode 100644 index 000000000..ae16f9d4d --- /dev/null +++ b/libs/charset_normalizer-3.4.1.dist-info/RECORD @@ -0,0 +1,22 @@ +../../bin/normalizer,sha256=Vv3oTbfvf6GgVzVVme_3IY_EKie63nPd9qEo8uySQzo,249 +charset_normalizer-3.4.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-3.4.1.dist-info/LICENSE,sha256=bQ1Bv-FwrGx9wkjJpj4lTQ-0WmDVCoJX0K-SxuJJuIc,1071 +charset_normalizer-3.4.1.dist-info/METADATA,sha256=JlKQNNPteOYEvM_2q-rE7UJqWkHQ5pnGGlkdLqMoMhw,35313 +charset_normalizer-3.4.1.dist-info/RECORD,, +charset_normalizer-3.4.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer-3.4.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +charset_normalizer-3.4.1.dist-info/entry_points.txt,sha256=8C-Y3iXIfyXQ83Tpir2B8t-XLJYpxF5xbb38d_js-h4,65 +charset_normalizer-3.4.1.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=OKRxRv2Zhnqk00tqkN0c1BtJjm165fWXLydE52IKuHc,1590 +charset_normalizer/__main__.py,sha256=yzYxMR-IhKRHYwcSlavEv8oGdwxsR89mr2X09qXGdps,109 +charset_normalizer/api.py,sha256=qBRz8mJ_R5E713R6TOyqHEdnmyxbEDnCSHvx32ubDGg,22617 +charset_normalizer/cd.py,sha256=WKTo1HDb-H9HfCDc3Bfwq5jzS25Ziy9SE2a74SgTq88,12522 +charset_normalizer/cli/__init__.py,sha256=D8I86lFk2-py45JvqxniTirSj_sFyE6sjaY_0-G1shc,136 +charset_normalizer/cli/__main__.py,sha256=VGC9klOoi6_R2z8rmyrc936kv7u2A1udjjHtlmNPDTM,10410 +charset_normalizer/constant.py,sha256=4VuTcZNLew1j_8ixA-Rt_VVqNWD4pwgHOHMCMlr0964,40477 +charset_normalizer/legacy.py,sha256=yhNXsPHkBfqPXKRb-sPXNj3Bscp9-mFGcYOkJ62tg9c,2328 +charset_normalizer/md.py,sha256=iyXXQGWl54nnLQLueMWTmUtlivO0-rTBgVkmJxIIAGU,20036 +charset_normalizer/models.py,sha256=lKXhOnIPtiakbK3i__J9wpOfzx3JDTKj7Dn3Rg0VaRI,12394 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=T5UHo8AS7NVMmgruWoZyqEf0WrZVcQpgUNetRoborSk,12002 +charset_normalizer/version.py,sha256=Ambcj3O8FfvdLfDLc8dkaxZx97O1IM_R4_aKGD_TDdE,115 diff --git a/libs/charset_normalizer-3.4.0.dist-info/REQUESTED b/libs/charset_normalizer-3.4.1.dist-info/REQUESTED similarity index 100% rename from libs/charset_normalizer-3.4.0.dist-info/REQUESTED rename to libs/charset_normalizer-3.4.1.dist-info/REQUESTED diff --git a/libs/python_engineio-4.10.1.dist-info/WHEEL b/libs/charset_normalizer-3.4.1.dist-info/WHEEL similarity index 65% rename from libs/python_engineio-4.10.1.dist-info/WHEEL rename to libs/charset_normalizer-3.4.1.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/python_engineio-4.10.1.dist-info/WHEEL +++ b/libs/charset_normalizer-3.4.1.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/charset_normalizer-3.4.1.dist-info/entry_points.txt b/libs/charset_normalizer-3.4.1.dist-info/entry_points.txt new file mode 100644 index 000000000..ec9201252 --- /dev/null +++ b/libs/charset_normalizer-3.4.1.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +normalizer = charset_normalizer:cli.cli_detect diff --git a/libs/charset_normalizer-3.4.0.dist-info/top_level.txt b/libs/charset_normalizer-3.4.1.dist-info/top_level.txt similarity index 100% rename from libs/charset_normalizer-3.4.0.dist-info/top_level.txt rename to libs/charset_normalizer-3.4.1.dist-info/top_level.txt diff --git a/libs/charset_normalizer/__init__.py b/libs/charset_normalizer/__init__.py index 55991fc38..0d3a37990 100644 --- a/libs/charset_normalizer/__init__.py +++ b/libs/charset_normalizer/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Charset-Normalizer ~~~~~~~~~~~~~~ @@ -19,6 +18,9 @@ :copyright: (c) 2021 by Ahmed TAHRI :license: MIT, see LICENSE for more details. """ + +from __future__ import annotations + import logging from .api import from_bytes, from_fp, from_path, is_binary diff --git a/libs/charset_normalizer/__main__.py b/libs/charset_normalizer/__main__.py index beae2ef77..e0e76f7bf 100644 --- a/libs/charset_normalizer/__main__.py +++ b/libs/charset_normalizer/__main__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from .cli import cli_detect if __name__ == "__main__": diff --git a/libs/charset_normalizer/api.py b/libs/charset_normalizer/api.py index e3f2283b9..2c8c0618c 100644 --- a/libs/charset_normalizer/api.py +++ b/libs/charset_normalizer/api.py @@ -1,6 +1,8 @@ +from __future__ import annotations + import logging from os import PathLike -from typing import BinaryIO, List, Optional, Set, Union +from typing import BinaryIO from .cd import ( coherence_ratio, @@ -21,8 +23,6 @@ should_strip_sig_or_bom, ) -# Will most likely be controversial -# logging.addLevelName(TRACE, "TRACE") logger = logging.getLogger("charset_normalizer") explain_handler = logging.StreamHandler() explain_handler.setFormatter( @@ -31,12 +31,12 @@ def from_bytes( - sequences: Union[bytes, bytearray], + sequences: bytes | bytearray, steps: int = 5, chunk_size: int = 512, threshold: float = 0.2, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, preemptive_behaviour: bool = True, explain: bool = False, language_threshold: float = 0.1, @@ -62,7 +62,7 @@ def from_bytes( if not isinstance(sequences, (bytearray, bytes)): raise TypeError( - "Expected object of type bytes or bytearray, got: {0}".format( + "Expected object of type bytes or bytearray, got: {}".format( type(sequences) ) ) @@ -76,7 +76,7 @@ def from_bytes( if length == 0: logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") - if explain: + if explain: # Defensive: ensure exit path clean handler logger.removeHandler(explain_handler) logger.setLevel(previous_logger_level or logging.WARNING) return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) @@ -135,9 +135,9 @@ def from_bytes( ), ) - prioritized_encodings: List[str] = [] + prioritized_encodings: list[str] = [] - specified_encoding: Optional[str] = ( + specified_encoding: str | None = ( any_specified_encoding(sequences) if preemptive_behaviour else None ) @@ -149,13 +149,13 @@ def from_bytes( specified_encoding, ) - tested: Set[str] = set() - tested_but_hard_failure: List[str] = [] - tested_but_soft_failure: List[str] = [] + tested: set[str] = set() + tested_but_hard_failure: list[str] = [] + tested_but_soft_failure: list[str] = [] - fallback_ascii: Optional[CharsetMatch] = None - fallback_u8: Optional[CharsetMatch] = None - fallback_specified: Optional[CharsetMatch] = None + fallback_ascii: CharsetMatch | None = None + fallback_u8: CharsetMatch | None = None + fallback_specified: CharsetMatch | None = None results: CharsetMatches = CharsetMatches() @@ -189,7 +189,7 @@ def from_bytes( tested.add(encoding_iana) - decoded_payload: Optional[str] = None + decoded_payload: str | None = None bom_or_sig_available: bool = sig_encoding == encoding_iana strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( encoding_iana @@ -292,7 +292,7 @@ def from_bytes( early_stop_count: int = 0 lazy_str_hard_failure = False - md_chunks: List[str] = [] + md_chunks: list[str] = [] md_ratios = [] try: @@ -397,7 +397,7 @@ def from_bytes( ) if not is_multi_byte_decoder: - target_languages: List[str] = encoding_languages(encoding_iana) + target_languages: list[str] = encoding_languages(encoding_iana) else: target_languages = mb_encoding_languages(encoding_iana) @@ -462,7 +462,7 @@ def from_bytes( "Encoding detection: %s is most likely the one.", current_match.encoding, ) - if explain: + if explain: # Defensive: ensure exit path clean handler logger.removeHandler(explain_handler) logger.setLevel(previous_logger_level) return CharsetMatches([current_match]) @@ -480,7 +480,7 @@ def from_bytes( "Encoding detection: %s is most likely the one.", probable_result.encoding, ) - if explain: + if explain: # Defensive: ensure exit path clean handler logger.removeHandler(explain_handler) logger.setLevel(previous_logger_level) @@ -492,7 +492,7 @@ def from_bytes( "the beginning of the sequence.", encoding_iana, ) - if explain: + if explain: # Defensive: ensure exit path clean handler logger.removeHandler(explain_handler) logger.setLevel(previous_logger_level) return CharsetMatches([results[encoding_iana]]) @@ -546,8 +546,8 @@ def from_fp( steps: int = 5, chunk_size: int = 512, threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, preemptive_behaviour: bool = True, explain: bool = False, language_threshold: float = 0.1, @@ -572,12 +572,12 @@ def from_fp( def from_path( - path: Union[str, bytes, PathLike], # type: ignore[type-arg] + path: str | bytes | PathLike, # type: ignore[type-arg] steps: int = 5, chunk_size: int = 512, threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, preemptive_behaviour: bool = True, explain: bool = False, language_threshold: float = 0.1, @@ -603,12 +603,12 @@ def from_path( def is_binary( - fp_or_path_or_payload: Union[PathLike, str, BinaryIO, bytes], # type: ignore[type-arg] + fp_or_path_or_payload: PathLike | str | BinaryIO | bytes, # type: ignore[type-arg] steps: int = 5, chunk_size: int = 512, threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, + cp_isolation: list[str] | None = None, + cp_exclusion: list[str] | None = None, preemptive_behaviour: bool = True, explain: bool = False, language_threshold: float = 0.1, diff --git a/libs/charset_normalizer/cd.py b/libs/charset_normalizer/cd.py index 4ea6760c4..71a3ed519 100644 --- a/libs/charset_normalizer/cd.py +++ b/libs/charset_normalizer/cd.py @@ -1,8 +1,10 @@ +from __future__ import annotations + import importlib from codecs import IncrementalDecoder from collections import Counter from functools import lru_cache -from typing import Counter as TypeCounter, Dict, List, Optional, Tuple +from typing import Counter as TypeCounter from .constant import ( FREQUENCIES, @@ -22,26 +24,24 @@ ) -def encoding_unicode_range(iana_name: str) -> List[str]: +def encoding_unicode_range(iana_name: str) -> list[str]: """ Return associated unicode ranges in a single byte code page. """ if is_multi_byte_encoding(iana_name): - raise IOError("Function not supported on multi-byte code page") + raise OSError("Function not supported on multi-byte code page") - decoder = importlib.import_module( - "encodings.{}".format(iana_name) - ).IncrementalDecoder + decoder = importlib.import_module(f"encodings.{iana_name}").IncrementalDecoder p: IncrementalDecoder = decoder(errors="ignore") - seen_ranges: Dict[str, int] = {} + seen_ranges: dict[str, int] = {} character_count: int = 0 for i in range(0x40, 0xFF): chunk: str = p.decode(bytes([i])) if chunk: - character_range: Optional[str] = unicode_range(chunk) + character_range: str | None = unicode_range(chunk) if character_range is None: continue @@ -61,11 +61,11 @@ def encoding_unicode_range(iana_name: str) -> List[str]: ) -def unicode_range_languages(primary_range: str) -> List[str]: +def unicode_range_languages(primary_range: str) -> list[str]: """ Return inferred languages used with a unicode range. """ - languages: List[str] = [] + languages: list[str] = [] for language, characters in FREQUENCIES.items(): for character in characters: @@ -77,13 +77,13 @@ def unicode_range_languages(primary_range: str) -> List[str]: @lru_cache() -def encoding_languages(iana_name: str) -> List[str]: +def encoding_languages(iana_name: str) -> list[str]: """ Single-byte encoding language association. Some code page are heavily linked to particular language(s). This function does the correspondence. """ - unicode_ranges: List[str] = encoding_unicode_range(iana_name) - primary_range: Optional[str] = None + unicode_ranges: list[str] = encoding_unicode_range(iana_name) + primary_range: str | None = None for specified_range in unicode_ranges: if "Latin" not in specified_range: @@ -97,7 +97,7 @@ def encoding_languages(iana_name: str) -> List[str]: @lru_cache() -def mb_encoding_languages(iana_name: str) -> List[str]: +def mb_encoding_languages(iana_name: str) -> list[str]: """ Multi-byte encoding language association. Some code page are heavily linked to particular language(s). This function does the correspondence. @@ -118,7 +118,7 @@ def mb_encoding_languages(iana_name: str) -> List[str]: @lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) -def get_target_features(language: str) -> Tuple[bool, bool]: +def get_target_features(language: str) -> tuple[bool, bool]: """ Determine main aspects from a supported language if it contains accents and if is pure Latin. """ @@ -135,12 +135,12 @@ def get_target_features(language: str) -> Tuple[bool, bool]: def alphabet_languages( - characters: List[str], ignore_non_latin: bool = False -) -> List[str]: + characters: list[str], ignore_non_latin: bool = False +) -> list[str]: """ Return associated languages associated to given characters. """ - languages: List[Tuple[str, float]] = [] + languages: list[tuple[str, float]] = [] source_have_accents = any(is_accentuated(character) for character in characters) @@ -170,7 +170,7 @@ def alphabet_languages( def characters_popularity_compare( - language: str, ordered_characters: List[str] + language: str, ordered_characters: list[str] ) -> float: """ Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. @@ -178,7 +178,7 @@ def characters_popularity_compare( Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) """ if language not in FREQUENCIES: - raise ValueError("{} not available".format(language)) + raise ValueError(f"{language} not available") character_approved_count: int = 0 FREQUENCIES_language_set = set(FREQUENCIES[language]) @@ -214,14 +214,14 @@ def characters_popularity_compare( character_approved_count += 1 continue - characters_before_source: List[str] = FREQUENCIES[language][ + characters_before_source: list[str] = FREQUENCIES[language][ 0:character_rank_in_language ] - characters_after_source: List[str] = FREQUENCIES[language][ + characters_after_source: list[str] = FREQUENCIES[language][ character_rank_in_language: ] - characters_before: List[str] = ordered_characters[0:character_rank] - characters_after: List[str] = ordered_characters[character_rank:] + characters_before: list[str] = ordered_characters[0:character_rank] + characters_after: list[str] = ordered_characters[character_rank:] before_match_count: int = len( set(characters_before) & set(characters_before_source) @@ -249,24 +249,24 @@ def characters_popularity_compare( return character_approved_count / len(ordered_characters) -def alpha_unicode_split(decoded_sequence: str) -> List[str]: +def alpha_unicode_split(decoded_sequence: str) -> list[str]: """ Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; One containing the latin letters and the other hebrew. """ - layers: Dict[str, str] = {} + layers: dict[str, str] = {} for character in decoded_sequence: if character.isalpha() is False: continue - character_range: Optional[str] = unicode_range(character) + character_range: str | None = unicode_range(character) if character_range is None: continue - layer_target_range: Optional[str] = None + layer_target_range: str | None = None for discovered_range in layers: if ( @@ -288,12 +288,12 @@ def alpha_unicode_split(decoded_sequence: str) -> List[str]: return list(layers.values()) -def merge_coherence_ratios(results: List[CoherenceMatches]) -> CoherenceMatches: +def merge_coherence_ratios(results: list[CoherenceMatches]) -> CoherenceMatches: """ This function merge results previously given by the function coherence_ratio. The return type is the same as coherence_ratio. """ - per_language_ratios: Dict[str, List[float]] = {} + per_language_ratios: dict[str, list[float]] = {} for result in results: for sub_result in result: language, ratio = sub_result @@ -321,7 +321,7 @@ def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: We shall NOT return "English—" in CoherenceMatches because it is an alternative of "English". This function only keeps the best match and remove the em-dash in it. """ - index_results: Dict[str, List[float]] = dict() + index_results: dict[str, list[float]] = dict() for result in results: language, ratio = result @@ -345,14 +345,14 @@ def filter_alt_coherence_matches(results: CoherenceMatches) -> CoherenceMatches: @lru_cache(maxsize=2048) def coherence_ratio( - decoded_sequence: str, threshold: float = 0.1, lg_inclusion: Optional[str] = None + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: str | None = None ) -> CoherenceMatches: """ Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. A layer = Character extraction by alphabets/ranges. """ - results: List[Tuple[str, float]] = [] + results: list[tuple[str, float]] = [] ignore_non_latin: bool = False sufficient_match_count: int = 0 @@ -371,7 +371,7 @@ def coherence_ratio( if character_count <= TOO_SMALL_SEQUENCE: continue - popular_character_ordered: List[str] = [c for c, o in most_common] + popular_character_ordered: list[str] = [c for c, o in most_common] for language in lg_inclusion_list or alphabet_languages( popular_character_ordered, ignore_non_latin diff --git a/libs/charset_normalizer/cli/__init__.py b/libs/charset_normalizer/cli/__init__.py index d95fedfe5..543a5a4de 100644 --- a/libs/charset_normalizer/cli/__init__.py +++ b/libs/charset_normalizer/cli/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from .__main__ import cli_detect, query_yes_no __all__ = ( diff --git a/libs/charset_normalizer/cli/__main__.py b/libs/charset_normalizer/cli/__main__.py index e7edd0fc8..64a290f2f 100644 --- a/libs/charset_normalizer/cli/__main__.py +++ b/libs/charset_normalizer/cli/__main__.py @@ -1,9 +1,10 @@ +from __future__ import annotations + import argparse import sys from json import dumps from os.path import abspath, basename, dirname, join, realpath from platform import python_version -from typing import List, Optional from unicodedata import unidata_version import charset_normalizer.md as md_module @@ -45,7 +46,7 @@ def query_yes_no(question: str, default: str = "yes") -> bool: sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") -def cli_detect(argv: Optional[List[str]] = None) -> int: +def cli_detect(argv: list[str] | None = None) -> int: """ CLI assistant using ARGV and ArgumentParser :param argv: @@ -124,7 +125,7 @@ def cli_detect(argv: Optional[List[str]] = None) -> int: default=0.2, type=float, dest="threshold", - help="Define a custom maximum amount of chaos allowed in decoded content. 0. <= chaos <= 1.", + help="Define a custom maximum amount of noise allowed in decoded content. 0. <= noise <= 1.", ) parser.add_argument( "--version", @@ -259,7 +260,7 @@ def cli_detect(argv: Optional[List[str]] = None) -> int: dir_path = dirname(realpath(my_file.name)) file_name = basename(realpath(my_file.name)) - o_: List[str] = file_name.split(".") + o_: list[str] = file_name.split(".") if args.replace is False: o_.insert(-1, best_guess.encoding) @@ -284,7 +285,7 @@ def cli_detect(argv: Optional[List[str]] = None) -> int: with open(x_[0].unicode_path, "wb") as fp: fp.write(best_guess.output()) - except IOError as e: + except OSError as e: print(str(e), file=sys.stderr) if my_file.closed is False: my_file.close() diff --git a/libs/charset_normalizer/constant.py b/libs/charset_normalizer/constant.py index f8f2a811f..1fb9508d2 100644 --- a/libs/charset_normalizer/constant.py +++ b/libs/charset_normalizer/constant.py @@ -1,11 +1,12 @@ -# -*- coding: utf-8 -*- +from __future__ import annotations + from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE from encodings.aliases import aliases -from re import IGNORECASE, compile as re_compile -from typing import Dict, List, Set, Union +from re import IGNORECASE +from re import compile as re_compile # Contain for each eligible encoding a list of/item bytes SIG/BOM -ENCODING_MARKS: Dict[str, Union[bytes, List[bytes]]] = { +ENCODING_MARKS: dict[str, bytes | list[bytes]] = { "utf_8": BOM_UTF8, "utf_7": [ b"\x2b\x2f\x76\x38", @@ -25,7 +26,7 @@ UTF8_MAXIMAL_ALLOCATION: int = 1_112_064 # Up-to-date Unicode ucd/15.0.0 -UNICODE_RANGES_COMBINED: Dict[str, range] = { +UNICODE_RANGES_COMBINED: dict[str, range] = { "Control character": range(32), "Basic Latin": range(32, 128), "Latin-1 Supplement": range(128, 256), @@ -357,7 +358,7 @@ } -UNICODE_SECONDARY_RANGE_KEYWORD: List[str] = [ +UNICODE_SECONDARY_RANGE_KEYWORD: list[str] = [ "Supplement", "Extended", "Extensions", @@ -392,7 +393,7 @@ "koi8_u", ] -IANA_SUPPORTED: List[str] = sorted( +IANA_SUPPORTED: list[str] = sorted( filter( lambda x: x.endswith("_codec") is False and x not in {"rot_13", "tactis", "mbcs"}, @@ -403,7 +404,7 @@ IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) # pre-computed code page that are similar using the function cp_similarity. -IANA_SUPPORTED_SIMILAR: Dict[str, List[str]] = { +IANA_SUPPORTED_SIMILAR: dict[str, list[str]] = { "cp037": ["cp1026", "cp1140", "cp273", "cp500"], "cp1026": ["cp037", "cp1140", "cp273", "cp500"], "cp1125": ["cp866"], @@ -492,7 +493,7 @@ } -CHARDET_CORRESPONDENCE: Dict[str, str] = { +CHARDET_CORRESPONDENCE: dict[str, str] = { "iso2022_kr": "ISO-2022-KR", "iso2022_jp": "ISO-2022-JP", "euc_kr": "EUC-KR", @@ -528,7 +529,7 @@ } -COMMON_SAFE_ASCII_CHARACTERS: Set[str] = { +COMMON_SAFE_ASCII_CHARACTERS: set[str] = { "<", ">", "=", @@ -549,8 +550,8 @@ } -KO_NAMES: Set[str] = {"johab", "cp949", "euc_kr"} -ZH_NAMES: Set[str] = {"big5", "cp950", "big5hkscs", "hz"} +KO_NAMES: set[str] = {"johab", "cp949", "euc_kr"} +ZH_NAMES: set[str] = {"big5", "cp950", "big5hkscs", "hz"} # Logging LEVEL below DEBUG TRACE: int = 5 @@ -558,7 +559,7 @@ # Language label that contain the em dash "—" # character are to be considered alternative seq to origin -FREQUENCIES: Dict[str, List[str]] = { +FREQUENCIES: dict[str, list[str]] = { "English": [ "e", "a", diff --git a/libs/charset_normalizer/legacy.py b/libs/charset_normalizer/legacy.py index 3f6d49079..a2f534514 100644 --- a/libs/charset_normalizer/legacy.py +++ b/libs/charset_normalizer/legacy.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Optional +from typing import TYPE_CHECKING, Any from warnings import warn from .api import from_bytes @@ -11,9 +11,9 @@ from typing_extensions import TypedDict class ResultDict(TypedDict): - encoding: Optional[str] + encoding: str | None language: str - confidence: Optional[float] + confidence: float | None def detect( @@ -37,8 +37,9 @@ def detect( if not isinstance(byte_str, (bytearray, bytes)): raise TypeError( # pragma: nocover - "Expected object of type bytes or bytearray, got: " - "{0}".format(type(byte_str)) + "Expected object of type bytes or bytearray, got: " "{}".format( + type(byte_str) + ) ) if isinstance(byte_str, bytearray): diff --git a/libs/charset_normalizer/md.py b/libs/charset_normalizer/md.py index d834db0e4..9ed59a868 100644 --- a/libs/charset_normalizer/md.py +++ b/libs/charset_normalizer/md.py @@ -1,6 +1,7 @@ +from __future__ import annotations + from functools import lru_cache from logging import getLogger -from typing import List, Optional from .constant import ( COMMON_SAFE_ASCII_CHARACTERS, @@ -68,7 +69,7 @@ def __init__(self) -> None: self._symbol_count: int = 0 self._character_count: int = 0 - self._last_printable_char: Optional[str] = None + self._last_printable_char: str | None = None self._frenzy_symbol_in_word: bool = False def eligible(self, character: str) -> bool: @@ -92,7 +93,7 @@ def feed(self, character: str) -> None: self._last_printable_char = character - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._punctuation_count = 0 self._character_count = 0 self._symbol_count = 0 @@ -123,7 +124,7 @@ def feed(self, character: str) -> None: if is_accentuated(character): self._accentuated_count += 1 - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._character_count = 0 self._accentuated_count = 0 @@ -149,7 +150,7 @@ def feed(self, character: str) -> None: self._unprintable_count += 1 self._character_count += 1 - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._unprintable_count = 0 @property @@ -165,7 +166,7 @@ def __init__(self) -> None: self._successive_count: int = 0 self._character_count: int = 0 - self._last_latin_character: Optional[str] = None + self._last_latin_character: str | None = None def eligible(self, character: str) -> bool: return character.isalpha() and is_latin(character) @@ -184,7 +185,7 @@ def feed(self, character: str) -> None: self._successive_count += 1 self._last_latin_character = character - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._successive_count = 0 self._character_count = 0 self._last_latin_character = None @@ -201,7 +202,7 @@ class SuspiciousRange(MessDetectorPlugin): def __init__(self) -> None: self._suspicious_successive_range_count: int = 0 self._character_count: int = 0 - self._last_printable_seen: Optional[str] = None + self._last_printable_seen: str | None = None def eligible(self, character: str) -> bool: return character.isprintable() @@ -221,15 +222,15 @@ def feed(self, character: str) -> None: self._last_printable_seen = character return - unicode_range_a: Optional[str] = unicode_range(self._last_printable_seen) - unicode_range_b: Optional[str] = unicode_range(character) + unicode_range_a: str | None = unicode_range(self._last_printable_seen) + unicode_range_b: str | None = unicode_range(character) if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): self._suspicious_successive_range_count += 1 self._last_printable_seen = character - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._character_count = 0 self._suspicious_successive_range_count = 0 self._last_printable_seen = None @@ -346,7 +347,7 @@ def feed(self, character: str) -> None: self._is_current_word_bad = True self._buffer += character - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._buffer = "" self._is_current_word_bad = False self._foreign_long_watch = False @@ -384,7 +385,7 @@ def feed(self, character: str) -> None: if is_cjk(character): self._cjk_character_count += 1 - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._wrong_stop_count = 0 self._cjk_character_count = 0 @@ -406,7 +407,7 @@ def __init__(self) -> None: self._character_count: int = 0 - self._last_alpha_seen: Optional[str] = None + self._last_alpha_seen: str | None = None self._current_ascii_only: bool = True def eligible(self, character: str) -> bool: @@ -454,7 +455,7 @@ def feed(self, character: str) -> None: self._character_count_since_last_sep += 1 self._last_alpha_seen = character - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._character_count = 0 self._character_count_since_last_sep = 0 self._successive_upper_lower_count = 0 @@ -476,7 +477,7 @@ def __init__(self) -> None: self._character_count: int = 0 self._isolated_form_count: int = 0 - def reset(self) -> None: # pragma: no cover + def reset(self) -> None: # Abstract self._character_count = 0 self._isolated_form_count = 0 @@ -501,7 +502,7 @@ def ratio(self) -> float: @lru_cache(maxsize=1024) def is_suspiciously_successive_range( - unicode_range_a: Optional[str], unicode_range_b: Optional[str] + unicode_range_a: str | None, unicode_range_b: str | None ) -> bool: """ Determine if two Unicode range seen next to each other can be considered as suspicious. @@ -525,9 +526,10 @@ def is_suspiciously_successive_range( ): return False - keywords_range_a, keywords_range_b = unicode_range_a.split( - " " - ), unicode_range_b.split(" ") + keywords_range_a, keywords_range_b = ( + unicode_range_a.split(" "), + unicode_range_b.split(" "), + ) for el in keywords_range_a: if el in UNICODE_SECONDARY_RANGE_KEYWORD: @@ -580,7 +582,7 @@ def mess_ratio( Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. """ - detectors: List[MessDetectorPlugin] = [ + detectors: list[MessDetectorPlugin] = [ md_class() for md_class in MessDetectorPlugin.__subclasses__() ] @@ -622,7 +624,7 @@ def mess_ratio( logger.log(TRACE, f"Starting with: {decoded_sequence[:16]}") logger.log(TRACE, f"Ending with: {decoded_sequence[-16::]}") - for dt in detectors: # pragma: nocover + for dt in detectors: logger.log(TRACE, f"{dt.__class__}: {dt.ratio}") return round(mean_mess_ratio, 3) diff --git a/libs/charset_normalizer/models.py b/libs/charset_normalizer/models.py index 6f6b86b38..1042758f8 100644 --- a/libs/charset_normalizer/models.py +++ b/libs/charset_normalizer/models.py @@ -1,8 +1,10 @@ +from __future__ import annotations + from encodings.aliases import aliases from hashlib import sha256 from json import dumps from re import sub -from typing import Any, Dict, Iterator, List, Optional, Tuple, Union +from typing import Any, Iterator, List, Tuple from .constant import RE_POSSIBLE_ENCODING_INDICATION, TOO_BIG_SEQUENCE from .utils import iana_name, is_multi_byte_encoding, unicode_range @@ -15,9 +17,9 @@ def __init__( guessed_encoding: str, mean_mess_ratio: float, has_sig_or_bom: bool, - languages: "CoherenceMatches", - decoded_payload: Optional[str] = None, - preemptive_declaration: Optional[str] = None, + languages: CoherenceMatches, + decoded_payload: str | None = None, + preemptive_declaration: str | None = None, ): self._payload: bytes = payload @@ -25,17 +27,17 @@ def __init__( self._mean_mess_ratio: float = mean_mess_ratio self._languages: CoherenceMatches = languages self._has_sig_or_bom: bool = has_sig_or_bom - self._unicode_ranges: Optional[List[str]] = None + self._unicode_ranges: list[str] | None = None - self._leaves: List[CharsetMatch] = [] + self._leaves: list[CharsetMatch] = [] self._mean_coherence_ratio: float = 0.0 - self._output_payload: Optional[bytes] = None - self._output_encoding: Optional[str] = None + self._output_payload: bytes | None = None + self._output_encoding: str | None = None - self._string: Optional[str] = decoded_payload + self._string: str | None = decoded_payload - self._preemptive_declaration: Optional[str] = preemptive_declaration + self._preemptive_declaration: str | None = preemptive_declaration def __eq__(self, other: object) -> bool: if not isinstance(other, CharsetMatch): @@ -77,9 +79,9 @@ def __str__(self) -> str: return self._string def __repr__(self) -> str: - return "<CharsetMatch '{}' bytes({})>".format(self.encoding, self.fingerprint) + return f"<CharsetMatch '{self.encoding}' bytes({self.fingerprint})>" - def add_submatch(self, other: "CharsetMatch") -> None: + def add_submatch(self, other: CharsetMatch) -> None: if not isinstance(other, CharsetMatch) or other == self: raise ValueError( "Unable to add instance <{}> as a submatch of a CharsetMatch".format( @@ -95,11 +97,11 @@ def encoding(self) -> str: return self._encoding @property - def encoding_aliases(self) -> List[str]: + def encoding_aliases(self) -> list[str]: """ Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. """ - also_known_as: List[str] = [] + also_known_as: list[str] = [] for u, p in aliases.items(): if self.encoding == u: also_known_as.append(p) @@ -116,7 +118,7 @@ def byte_order_mark(self) -> bool: return self._has_sig_or_bom @property - def languages(self) -> List[str]: + def languages(self) -> list[str]: """ Return the complete list of possible languages found in decoded sequence. Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. @@ -177,7 +179,7 @@ def raw(self) -> bytes: return self._payload @property - def submatch(self) -> List["CharsetMatch"]: + def submatch(self) -> list[CharsetMatch]: return self._leaves @property @@ -185,19 +187,17 @@ def has_submatch(self) -> bool: return len(self._leaves) > 0 @property - def alphabets(self) -> List[str]: + def alphabets(self) -> list[str]: if self._unicode_ranges is not None: return self._unicode_ranges # list detected ranges - detected_ranges: List[Optional[str]] = [ - unicode_range(char) for char in str(self) - ] + detected_ranges: list[str | None] = [unicode_range(char) for char in str(self)] # filter and sort self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) return self._unicode_ranges @property - def could_be_from_charset(self) -> List[str]: + def could_be_from_charset(self) -> list[str]: """ The complete list of encoding that output the exact SAME str result and therefore could be the originating encoding. @@ -221,10 +221,11 @@ def output(self, encoding: str = "utf_8") -> bytes: patched_header = sub( RE_POSSIBLE_ENCODING_INDICATION, lambda m: m.string[m.span()[0] : m.span()[1]].replace( - m.groups()[0], iana_name(self._output_encoding) # type: ignore[arg-type] + m.groups()[0], + iana_name(self._output_encoding).replace("_", "-"), # type: ignore[arg-type] ), decoded_string[:8192], - 1, + count=1, ) decoded_string = patched_header + decoded_string[8192:] @@ -247,13 +248,13 @@ class CharsetMatches: Act like a list(iterable) but does not implements all related methods. """ - def __init__(self, results: Optional[List[CharsetMatch]] = None): - self._results: List[CharsetMatch] = sorted(results) if results else [] + def __init__(self, results: list[CharsetMatch] | None = None): + self._results: list[CharsetMatch] = sorted(results) if results else [] def __iter__(self) -> Iterator[CharsetMatch]: yield from self._results - def __getitem__(self, item: Union[int, str]) -> CharsetMatch: + def __getitem__(self, item: int | str) -> CharsetMatch: """ Retrieve a single item either by its position or encoding name (alias may be used here). Raise KeyError upon invalid index or encoding not present in results. @@ -293,7 +294,7 @@ def append(self, item: CharsetMatch) -> None: self._results.append(item) self._results = sorted(self._results) - def best(self) -> Optional["CharsetMatch"]: + def best(self) -> CharsetMatch | None: """ Simply return the first match. Strict equivalent to matches[0]. """ @@ -301,7 +302,7 @@ def best(self) -> Optional["CharsetMatch"]: return None return self._results[0] - def first(self) -> Optional["CharsetMatch"]: + def first(self) -> CharsetMatch | None: """ Redundant method, call the method best(). Kept for BC reasons. """ @@ -316,31 +317,31 @@ class CliDetectionResult: def __init__( self, path: str, - encoding: Optional[str], - encoding_aliases: List[str], - alternative_encodings: List[str], + encoding: str | None, + encoding_aliases: list[str], + alternative_encodings: list[str], language: str, - alphabets: List[str], + alphabets: list[str], has_sig_or_bom: bool, chaos: float, coherence: float, - unicode_path: Optional[str], + unicode_path: str | None, is_preferred: bool, ): self.path: str = path - self.unicode_path: Optional[str] = unicode_path - self.encoding: Optional[str] = encoding - self.encoding_aliases: List[str] = encoding_aliases - self.alternative_encodings: List[str] = alternative_encodings + self.unicode_path: str | None = unicode_path + self.encoding: str | None = encoding + self.encoding_aliases: list[str] = encoding_aliases + self.alternative_encodings: list[str] = alternative_encodings self.language: str = language - self.alphabets: List[str] = alphabets + self.alphabets: list[str] = alphabets self.has_sig_or_bom: bool = has_sig_or_bom self.chaos: float = chaos self.coherence: float = coherence self.is_preferred: bool = is_preferred @property - def __dict__(self) -> Dict[str, Any]: # type: ignore + def __dict__(self) -> dict[str, Any]: # type: ignore return { "path": self.path, "encoding": self.encoding, diff --git a/libs/charset_normalizer/utils.py b/libs/charset_normalizer/utils.py index e5cbbf4c0..0175e0a96 100644 --- a/libs/charset_normalizer/utils.py +++ b/libs/charset_normalizer/utils.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import importlib import logging import unicodedata @@ -5,9 +7,11 @@ from encodings.aliases import aliases from functools import lru_cache from re import findall -from typing import Generator, List, Optional, Set, Tuple, Union +from typing import Generator -from _multibytecodec import MultibyteIncrementalDecoder +from _multibytecodec import ( # type: ignore[import-not-found,import] + MultibyteIncrementalDecoder, +) from .constant import ( ENCODING_MARKS, @@ -23,7 +27,7 @@ def is_accentuated(character: str) -> bool: try: description: str = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return ( "WITH GRAVE" in description @@ -43,13 +47,13 @@ def remove_accent(character: str) -> str: if not decomposed: return character - codes: List[str] = decomposed.split(" ") + codes: list[str] = decomposed.split(" ") return chr(int(codes[0], 16)) @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def unicode_range(character: str) -> Optional[str]: +def unicode_range(character: str) -> str | None: """ Retrieve the Unicode range official name from a single character. """ @@ -66,7 +70,7 @@ def unicode_range(character: str) -> Optional[str]: def is_latin(character: str) -> bool: try: description: str = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return "LATIN" in description @@ -78,7 +82,7 @@ def is_punctuation(character: str) -> bool: if "P" in character_category: return True - character_range: Optional[str] = unicode_range(character) + character_range: str | None = unicode_range(character) if character_range is None: return False @@ -93,7 +97,7 @@ def is_symbol(character: str) -> bool: if "S" in character_category or "N" in character_category: return True - character_range: Optional[str] = unicode_range(character) + character_range: str | None = unicode_range(character) if character_range is None: return False @@ -103,7 +107,7 @@ def is_symbol(character: str) -> bool: @lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) def is_emoticon(character: str) -> bool: - character_range: Optional[str] = unicode_range(character) + character_range: str | None = unicode_range(character) if character_range is None: return False @@ -130,7 +134,7 @@ def is_case_variable(character: str) -> bool: def is_cjk(character: str) -> bool: try: character_name = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return "CJK" in character_name @@ -140,7 +144,7 @@ def is_cjk(character: str) -> bool: def is_hiragana(character: str) -> bool: try: character_name = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return "HIRAGANA" in character_name @@ -150,7 +154,7 @@ def is_hiragana(character: str) -> bool: def is_katakana(character: str) -> bool: try: character_name = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return "KATAKANA" in character_name @@ -160,7 +164,7 @@ def is_katakana(character: str) -> bool: def is_hangul(character: str) -> bool: try: character_name = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return "HANGUL" in character_name @@ -170,7 +174,7 @@ def is_hangul(character: str) -> bool: def is_thai(character: str) -> bool: try: character_name = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return "THAI" in character_name @@ -180,7 +184,7 @@ def is_thai(character: str) -> bool: def is_arabic(character: str) -> bool: try: character_name = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return "ARABIC" in character_name @@ -190,7 +194,7 @@ def is_arabic(character: str) -> bool: def is_arabic_isolated_form(character: str) -> bool: try: character_name = unicodedata.name(character) - except ValueError: + except ValueError: # Defensive: unicode database outdated? return False return "ARABIC" in character_name and "ISOLATED FORM" in character_name @@ -206,13 +210,13 @@ def is_unprintable(character: str) -> bool: return ( character.isspace() is False # includes \n \t \r \v and character.isprintable() is False - and character != "\x1A" # Why? Its the ASCII substitute character. + and character != "\x1a" # Why? Its the ASCII substitute character. and character != "\ufeff" # bug discovered in Python, # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. ) -def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> Optional[str]: +def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> str | None: """ Extract using ASCII-only decoder any specified encoding in the first n-bytes. """ @@ -221,7 +225,7 @@ def any_specified_encoding(sequence: bytes, search_zone: int = 8192) -> Optional seq_len: int = len(sequence) - results: List[str] = findall( + results: list[str] = findall( RE_POSSIBLE_ENCODING_INDICATION, sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), ) @@ -260,18 +264,18 @@ def is_multi_byte_encoding(name: str) -> bool: "utf_32_be", "utf_7", } or issubclass( - importlib.import_module("encodings.{}".format(name)).IncrementalDecoder, + importlib.import_module(f"encodings.{name}").IncrementalDecoder, MultibyteIncrementalDecoder, ) -def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]: +def identify_sig_or_bom(sequence: bytes) -> tuple[str | None, bytes]: """ Identify and extract SIG/BOM in given sequence. """ for iana_encoding in ENCODING_MARKS: - marks: Union[bytes, List[bytes]] = ENCODING_MARKS[iana_encoding] + marks: bytes | list[bytes] = ENCODING_MARKS[iana_encoding] if isinstance(marks, bytes): marks = [marks] @@ -288,6 +292,7 @@ def should_strip_sig_or_bom(iana_encoding: str) -> bool: def iana_name(cp_name: str, strict: bool = True) -> str: + """Returns the Python normalized encoding name (Not the IANA official name).""" cp_name = cp_name.lower().replace("-", "_") encoding_alias: str @@ -298,35 +303,17 @@ def iana_name(cp_name: str, strict: bool = True) -> str: return encoding_iana if strict: - raise ValueError("Unable to retrieve IANA for '{}'".format(cp_name)) + raise ValueError(f"Unable to retrieve IANA for '{cp_name}'") return cp_name -def range_scan(decoded_sequence: str) -> List[str]: - ranges: Set[str] = set() - - for character in decoded_sequence: - character_range: Optional[str] = unicode_range(character) - - if character_range is None: - continue - - ranges.add(character_range) - - return list(ranges) - - def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): return 0.0 - decoder_a = importlib.import_module( - "encodings.{}".format(iana_name_a) - ).IncrementalDecoder - decoder_b = importlib.import_module( - "encodings.{}".format(iana_name_b) - ).IncrementalDecoder + decoder_a = importlib.import_module(f"encodings.{iana_name_a}").IncrementalDecoder + decoder_b = importlib.import_module(f"encodings.{iana_name_b}").IncrementalDecoder id_a: IncrementalDecoder = decoder_a(errors="ignore") id_b: IncrementalDecoder = decoder_b(errors="ignore") @@ -374,7 +361,7 @@ def cut_sequence_chunks( strip_sig_or_bom: bool, sig_payload: bytes, is_multi_byte_decoder: bool, - decoded_payload: Optional[str] = None, + decoded_payload: str | None = None, ) -> Generator[str, None, None]: if decoded_payload and is_multi_byte_decoder is False: for i in offsets: diff --git a/libs/charset_normalizer/version.py b/libs/charset_normalizer/version.py index 699990ee2..f85e8929e 100644 --- a/libs/charset_normalizer/version.py +++ b/libs/charset_normalizer/version.py @@ -2,5 +2,7 @@ Expose version """ -__version__ = "3.4.0" +from __future__ import annotations + +__version__ = "3.4.1" VERSION = __version__.split(".") diff --git a/libs/click-8.1.7.dist-info/METADATA b/libs/click-8.1.7.dist-info/METADATA deleted file mode 100644 index 7a6bbb24b..000000000 --- a/libs/click-8.1.7.dist-info/METADATA +++ /dev/null @@ -1,103 +0,0 @@ -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/libs/click-8.1.7.dist-info/RECORD b/libs/click-8.1.7.dist-info/RECORD deleted file mode 100644 index d7da66e33..000000000 --- a/libs/click-8.1.7.dist-info/RECORD +++ /dev/null @@ -1,24 +0,0 @@ -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/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -click-8.1.7.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -click-8.1.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 -click/__init__.py,sha256=YDDbjm406dTOA0V8bTtdGnhN7zj5j-_dFRewZF_pLvw,3138 -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/libs/click-8.1.7.dist-info/WHEEL b/libs/click-8.1.7.dist-info/WHEEL deleted file mode 100644 index ba48cbcf9..000000000 --- a/libs/click-8.1.7.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.3) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/click-8.1.7.dist-info/top_level.txt b/libs/click-8.1.7.dist-info/top_level.txt deleted file mode 100644 index dca9a9096..000000000 --- a/libs/click-8.1.7.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -click diff --git a/libs/click-8.1.7.dist-info/INSTALLER b/libs/click-8.1.8.dist-info/INSTALLER similarity index 100% rename from libs/click-8.1.7.dist-info/INSTALLER rename to libs/click-8.1.8.dist-info/INSTALLER diff --git a/libs/click-8.1.7.dist-info/LICENSE.rst b/libs/click-8.1.8.dist-info/LICENSE.txt similarity index 100% rename from libs/click-8.1.7.dist-info/LICENSE.rst rename to libs/click-8.1.8.dist-info/LICENSE.txt diff --git a/libs/click-8.1.8.dist-info/METADATA b/libs/click-8.1.8.dist-info/METADATA new file mode 100644 index 000000000..366d1a7e4 --- /dev/null +++ b/libs/click-8.1.8.dist-info/METADATA @@ -0,0 +1,74 @@ +Metadata-Version: 2.3 +Name: click +Version: 8.1.8 +Summary: Composable command line interface toolkit +Maintainer-email: Pallets <contact@palletsprojects.com> +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +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 +Classifier: Typing :: Typed +Requires-Dist: colorama; platform_system == 'Windows' +Requires-Dist: importlib-metadata; python_version < '3.8' +Project-URL: Changes, https://click.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/click/ + +# $ 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 + + +## A Simple Example + +```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() +``` + +``` +$ 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 + diff --git a/libs/click-8.1.8.dist-info/RECORD b/libs/click-8.1.8.dist-info/RECORD new file mode 100644 index 000000000..6989c69d5 --- /dev/null +++ b/libs/click-8.1.8.dist-info/RECORD @@ -0,0 +1,23 @@ +click-8.1.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.1.8.dist-info/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click-8.1.8.dist-info/METADATA,sha256=WJtQ6uGS2ybLfvUE4vC0XIhIBr4yFGwjrMBR2fiCQ-Q,2263 +click-8.1.8.dist-info/RECORD,, +click-8.1.8.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click-8.1.8.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +click/__init__.py,sha256=j1DJeCbga4ribkv5uyvIAzI0oFN13fW9mevDKShFelo,3188 +click/_compat.py,sha256=IGKh_J5QdfKELitnRfTGHneejWxoCw_NX9tfMbdcg3w,18730 +click/_termui_impl.py,sha256=a5z7I9gOFeMmu7Gb6_RPyQ8GPuVP1EeblixcWSPSQPk,24783 +click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 +click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 +click/core.py,sha256=Q1nEVdctZwvIPOlt4vfHko0TYnHCeE40UEEul8Wpyvs,114748 +click/decorators.py,sha256=7t6F-QWowtLh6F_6l-4YV4Y4yNTcqFQEu9i37zIz68s,18925 +click/exceptions.py,sha256=V7zDT6emqJ8iNl0kF1P5kpFmLMWQ1T1L7aNNKM4YR0w,9600 +click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 +click/globals.py,sha256=cuJ6Bbo073lgEEmhjr394PeM-QFmXM-Ci-wmfsd7H5g,1954 +click/parser.py,sha256=h4sndcpF5OHrZQN8vD8IWb5OByvW7ABbhRToxovrqS8,19067 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=TR0dXEGcvWb9Eo3aaQEXGhnvNS3FF4H4QcuLnvAvYo4,18636 +click/termui.py,sha256=dLxiS70UOvIYBda_nEEZaPAFOVDVmRs1sEPMuLDowQo,28310 +click/testing.py,sha256=3RA8anCf7TZ8-5RAF5it2Te-aWXBAL5VLasQnMiC2ZQ,16282 +click/types.py,sha256=BD5Qqq4h-8kawBmOIzJlmq4xzThAf4wCvaOLZSBDNx0,36422 +click/utils.py,sha256=ce-IrO9ilII76LGkU354pOdHbepM8UftfNH7SfMU_28,20330 diff --git a/libs/click-8.1.7.dist-info/REQUESTED b/libs/click-8.1.8.dist-info/REQUESTED similarity index 100% rename from libs/click-8.1.7.dist-info/REQUESTED rename to libs/click-8.1.8.dist-info/REQUESTED diff --git a/libs/jinja2-3.1.4.dist-info/WHEEL b/libs/click-8.1.8.dist-info/WHEEL similarity index 71% rename from libs/jinja2-3.1.4.dist-info/WHEEL rename to libs/click-8.1.8.dist-info/WHEEL index 3b5e64b5e..e3c6feefa 100644 --- a/libs/jinja2-3.1.4.dist-info/WHEEL +++ b/libs/click-8.1.8.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: flit 3.9.0 +Generator: flit 3.10.1 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/click/__init__.py b/libs/click/__init__.py index 9a1dab048..2610d0e14 100644 --- a/libs/click/__init__.py +++ b/libs/click/__init__.py @@ -4,6 +4,7 @@ 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 @@ -18,6 +19,7 @@ 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 HelpOption as HelpOption from .decorators import make_pass_decorator as make_pass_decorator from .decorators import option as option from .decorators import pass_context as pass_context @@ -70,4 +72,4 @@ from .utils import get_text_stream as get_text_stream from .utils import open_file as open_file -__version__ = "8.1.7" +__version__ = "8.1.8" diff --git a/libs/click/_compat.py b/libs/click/_compat.py index 23f886659..9153d150c 100644 --- a/libs/click/_compat.py +++ b/libs/click/_compat.py @@ -516,7 +516,7 @@ def _get_argv_encoding() -> str: _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() - def auto_wrap_for_ansi( # noqa: F811 + def auto_wrap_for_ansi( stream: t.TextIO, color: t.Optional[bool] = None ) -> t.TextIO: """Support ANSI color and style codes on Windows by wrapping a diff --git a/libs/click/_termui_impl.py b/libs/click/_termui_impl.py index f74465775..ad9f8f6c9 100644 --- a/libs/click/_termui_impl.py +++ b/libs/click/_termui_impl.py @@ -3,6 +3,7 @@ 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 @@ -11,6 +12,7 @@ import typing as t from gettext import gettext as _ from io import StringIO +from shutil import which from types import TracebackType from ._compat import _default_text_stdout @@ -371,31 +373,42 @@ def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: 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 _tempfilepager(generator, pager_cmd, color): + return + elif _pipepager(generator, pager_cmd, color): + return 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) + if (WIN or sys.platform.startswith("os2")) and _tempfilepager( + generator, "more", color + ): + return + if _pipepager(generator, "less", color): + return 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) + if _pipepager(generator, "more", color): + return return _nullpager(stdout, generator, color) finally: os.unlink(filename) -def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> None: +def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> bool: """Page through text by feeding it to another program. Invoking a pager through this might support colors. + + Returns True if the command was found, False otherwise and thus another + pager should be attempted. """ + cmd_absolute = which(cmd) + if cmd_absolute is None: + return False + import subprocess env = dict(os.environ) @@ -411,19 +424,25 @@ def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> 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) + c = subprocess.Popen( + [cmd_absolute], + shell=True, + stdin=subprocess.PIPE, + env=env, + errors="replace", + text=True, + ) + assert c.stdin is not None try: for text in generator: if not color: text = strip_ansi(text) - stdin.write(text.encode(encoding, "replace")) + c.stdin.write(text) except (OSError, KeyboardInterrupt): pass else: - stdin.close() + c.stdin.close() # Less doesn't respect ^C, but catches it for its own UI purposes (aborting # search or other commands inside less). @@ -441,11 +460,25 @@ def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> else: break + return True + def _tempfilepager( - generator: t.Iterable[str], cmd: str, color: t.Optional[bool] -) -> None: - """Page through text by invoking a program on a temporary file.""" + generator: t.Iterable[str], + cmd: str, + color: t.Optional[bool], +) -> bool: + """Page through text by invoking a program on a temporary file. + + Returns True if the command was found, False otherwise and thus another + pager should be attempted. + """ + # Which is necessary for Windows, it is also recommended in the Popen docs. + cmd_absolute = which(cmd) + if cmd_absolute is None: + return False + + import subprocess import tempfile fd, filename = tempfile.mkstemp() @@ -457,11 +490,16 @@ def _tempfilepager( with open_stream(filename, "wb")[0] as f: f.write(text.encode(encoding)) try: - os.system(f'{cmd} "{filename}"') + subprocess.call([cmd_absolute, filename]) + except OSError: + # Command not found + pass finally: os.close(fd) os.unlink(filename) + return True + def _nullpager( stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] @@ -496,7 +534,7 @@ def get_editor(self) -> str: if WIN: return "notepad" for editor in "sensible-editor", "vim", "nano": - if os.system(f"which {editor} >/dev/null 2>&1") == 0: + if which(editor) is not None: return editor return "vi" @@ -595,22 +633,33 @@ def _unquote_file(url: str) -> str: null.close() elif WIN: if locate: - url = _unquote_file(url.replace('"', "")) - args = f'explorer /select,"{url}"' + url = _unquote_file(url) + args = ["explorer", f"/select,{url}"] else: - url = url.replace('"', "") - wait_str = "/WAIT" if wait else "" - args = f'start {wait_str} "" "{url}"' - return os.system(args) + args = ["start"] + if wait: + args.append("/WAIT") + args.append("") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 elif CYGWIN: if locate: - url = os.path.dirname(_unquote_file(url).replace('"', "")) - args = f'cygstart "{url}"' + url = _unquote_file(url) + args = ["cygstart", os.path.dirname(url)] else: - url = url.replace('"', "") - wait_str = "-w" if wait else "" - args = f'cygstart {wait_str} "{url}"' - return os.system(args) + args = ["cygstart"] + if wait: + args.append("-w") + args.append(url) + try: + return subprocess.call(args) + except OSError: + # Command not found + return 127 try: if locate: @@ -698,8 +747,8 @@ def getchar(echo: bool) -> str: return rv else: - import tty import termios + import tty @contextlib.contextmanager def raw_terminal() -> t.Iterator[int]: diff --git a/libs/click/core.py b/libs/click/core.py index cc65e896b..e6305011a 100644 --- a/libs/click/core.py +++ b/libs/click/core.py @@ -39,6 +39,8 @@ if t.TYPE_CHECKING: import typing_extensions as te + + from .decorators import HelpOption from .shell_completion import CompletionItem F = t.TypeVar("F", bound=t.Callable[..., t.Any]) @@ -115,9 +117,16 @@ 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. + """Returns all declared parameters in the order they should be processed. + + The declared parameters are re-shuffled depending on the order in which + they were invoked, as well as the eagerness of each parameters. + + The invocation order takes precedence over the declaration order. I.e. the + order in which the user provided them to the CLI is respected. + + This behavior and its effect on callback evaluation is detailed at: + https://click.palletsprojects.com/en/stable/advanced/#callback-evaluation-order """ def sort_key(item: "Parameter") -> t.Tuple[bool, float]: @@ -383,9 +392,9 @@ def __init__( #: 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 + 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 @@ -624,7 +633,7 @@ def find_root(self) -> "Context": 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 + node: t.Optional[Context] = self while node is not None: if isinstance(node.obj, object_type): @@ -646,14 +655,12 @@ def ensure_object(self, object_type: t.Type[V]) -> V: @t.overload def lookup_default( self, name: str, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... + ) -> 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]]]: - ... + ) -> 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`. @@ -713,24 +720,22 @@ def _make_sub_context(self, command: "Command") -> "Context": @t.overload def invoke( - __self, # noqa: B902 + __self, __callback: "t.Callable[..., V]", *args: t.Any, **kwargs: t.Any, - ) -> V: - ... + ) -> V: ... @t.overload def invoke( - __self, # noqa: B902 + __self, __callback: "Command", *args: t.Any, **kwargs: t.Any, - ) -> t.Any: - ... + ) -> t.Any: ... def invoke( - __self, # noqa: B902 + __self, __callback: t.Union["Command", "t.Callable[..., V]"], *args: t.Any, **kwargs: t.Any, @@ -782,9 +787,7 @@ def invoke( with ctx: return __callback(*args, **kwargs) - def forward( - __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 - ) -> t.Any: + def forward(__self, __cmd: "Command", *args: t.Any, **kwargs: t.Any) -> 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. @@ -936,7 +939,10 @@ def make_context( extra[key] = value ctx = self.context_class( - self, info_name=info_name, parent=parent, **extra # type: ignore + self, # type: ignore[arg-type] + info_name=info_name, + parent=parent, + **extra, ) with ctx.scope(cleanup=False): @@ -971,7 +977,7 @@ def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionIte """ from click.shell_completion import CompletionItem - results: t.List["CompletionItem"] = [] + results: t.List[CompletionItem] = [] while ctx.parent is not None: ctx = ctx.parent @@ -993,8 +999,7 @@ def main( complete_var: t.Optional[str] = None, standalone_mode: "te.Literal[True]" = True, **extra: t.Any, - ) -> "te.NoReturn": - ... + ) -> "te.NoReturn": ... @t.overload def main( @@ -1004,8 +1009,7 @@ def main( complete_var: t.Optional[str] = None, standalone_mode: bool = ..., **extra: t.Any, - ) -> t.Any: - ... + ) -> t.Any: ... def main( self, @@ -1221,12 +1225,13 @@ def __init__( #: 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.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._help_option: t.Optional[HelpOption] = None self.no_args_is_help = no_args_is_help self.hidden = hidden self.deprecated = deprecated @@ -1289,25 +1294,29 @@ def get_help_option_names(self, ctx: Context) -> t.List[str]: return list(all_names) def get_help_option(self, ctx: Context) -> t.Optional["Option"]: - """Returns the help option object.""" + """Returns the help option object. + + Unless ``add_help_option`` is ``False``. + + .. versionchanged:: 8.1.8 + The help option is now cached to avoid creating it multiple times. + """ 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."), - ) + # Cache the help option object in private _help_option attribute to + # avoid creating it multiple times. Not doing this will break the + # callback odering by iter_params_for_processing(), which relies on + # object comparison. + if self._help_option is None: + # Avoid circular import. + from .decorators import HelpOption + + self._help_option = HelpOption(help_options) + + return self._help_option def make_parser(self, ctx: Context) -> OptionParser: """Creates the underlying option parser for this command.""" @@ -1444,7 +1453,7 @@ def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionIte """ from click.shell_completion import CompletionItem - results: t.List["CompletionItem"] = [] + results: t.List[CompletionItem] = [] if incomplete and not incomplete[0].isalnum(): for param in self.get_params(ctx): @@ -1604,7 +1613,7 @@ def function(__value, *args, **kwargs): # type: ignore return f(inner, *args, **kwargs) self._result_callback = rv = update_wrapper(t.cast(F, function), f) - return rv + return rv # type: ignore[return-value] return decorator @@ -1843,14 +1852,12 @@ def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: self.commands[name] = cmd @t.overload - def command(self, __func: t.Callable[..., t.Any]) -> Command: - ... + 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]: - ... + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: ... def command( self, *args: t.Any, **kwargs: t.Any @@ -1894,14 +1901,12 @@ def decorator(f: t.Callable[..., t.Any]) -> Command: return decorator @t.overload - def group(self, __func: t.Callable[..., t.Any]) -> "Group": - ... + 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"]: - ... + ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: ... def group( self, *args: t.Any, **kwargs: t.Any @@ -2227,14 +2232,12 @@ def make_metavar(self) -> str: @t.overload def get_default( self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... + ) -> t.Optional[t.Any]: ... @t.overload def get_default( self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: ... def get_default( self, ctx: Context, call: bool = True @@ -2681,7 +2684,9 @@ def _parse_decls( if name is None: if not expose_value: return None, opts, secondary_opts - raise TypeError("Could not determine name for option") + raise TypeError( + f"Could not determine name for option with declarations {decls!r}" + ) if not opts and not secondary_opts: raise TypeError( @@ -2810,10 +2815,12 @@ def _write_opts(opts: t.Sequence[str]) -> str: # 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] + (self.opts if default_value else self.secondary_opts)[0] )[1] elif self.is_bool_flag and not self.secondary_opts and not default_value: default_string = "" + elif default_value == "": + default_string = '""' else: default_string = str(default_value) @@ -2842,14 +2849,12 @@ def _write_opts(opts: t.Sequence[str]) -> str: @t.overload def get_default( self, ctx: Context, call: "te.Literal[True]" = True - ) -> t.Optional[t.Any]: - ... + ) -> t.Optional[t.Any]: ... @t.overload def get_default( self, ctx: Context, call: bool = ... - ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: - ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: ... def get_default( self, ctx: Context, call: bool = True @@ -3021,7 +3026,7 @@ def _parse_decls( if not decls: if not expose_value: return None, [], [] - raise TypeError("Could not determine name for argument") + raise TypeError("Argument is marked as exposed, but does not have a name.") if len(decls) == 1: name = arg = decls[0] name = name.replace("-", "_").lower() diff --git a/libs/click/decorators.py b/libs/click/decorators.py index d9bba9502..bcf8906e7 100644 --- a/libs/click/decorators.py +++ b/libs/click/decorators.py @@ -93,7 +93,7 @@ def new_func(*args: "P.args", **kwargs: "P.kwargs") -> "R": return update_wrapper(new_func, f) - return decorator # type: ignore[return-value] + return decorator def pass_meta_key( @@ -126,7 +126,7 @@ def new_func(*args: "P.args", **kwargs: "P.kwargs") -> R: f"Decorator that passes {doc_description} as the first argument" " to the decorated function." ) - return decorator # type: ignore[return-value] + return decorator CmdType = t.TypeVar("CmdType", bound=Command) @@ -134,8 +134,7 @@ def new_func(*args: "P.args", **kwargs: "P.kwargs") -> R: # variant: no call, directly as decorator for a function. @t.overload -def command(name: _AnyCallable) -> Command: - ... +def command(name: _AnyCallable) -> Command: ... # variant: with positional name and with positional or keyword cls argument: @@ -145,8 +144,7 @@ def command( name: t.Optional[str], cls: t.Type[CmdType], **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: - ... +) -> t.Callable[[_AnyCallable], CmdType]: ... # variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) @@ -156,16 +154,14 @@ def command( *, cls: t.Type[CmdType], **attrs: t.Any, -) -> t.Callable[[_AnyCallable], CmdType]: - ... +) -> 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]: - ... +) -> t.Callable[[_AnyCallable], Command]: ... def command( @@ -255,8 +251,7 @@ def decorator(f: _AnyCallable) -> CmdType: # variant: no call, directly as decorator for a function. @t.overload -def group(name: _AnyCallable) -> Group: - ... +def group(name: _AnyCallable) -> Group: ... # variant: with positional name and with positional or keyword cls argument: @@ -266,8 +261,7 @@ def group( name: t.Optional[str], cls: t.Type[GrpType], **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: - ... +) -> t.Callable[[_AnyCallable], GrpType]: ... # variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) @@ -277,16 +271,14 @@ def group( *, cls: t.Type[GrpType], **attrs: t.Any, -) -> t.Callable[[_AnyCallable], GrpType]: - ... +) -> 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]: - ... +) -> t.Callable[[_AnyCallable], Group]: ... def group( @@ -495,7 +487,7 @@ def callback(ctx: Context, param: Parameter, value: bool) -> None: metadata: t.Optional[types.ModuleType] try: - from importlib import metadata # type: ignore + from importlib import metadata except ImportError: # Python < 3.8 import importlib_metadata as metadata # type: ignore @@ -530,32 +522,41 @@ def callback(ctx: Context, param: Parameter, value: bool) -> None: 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 +class HelpOption(Option): + """Pre-configured ``--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. + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + **kwargs: t.Any, + ) -> None: + if not param_decls: + param_decls = ("--help",) - :param param_decls: One or more option names. Defaults to the single - value ``"--help"``. - :param kwargs: Extra arguments are passed to :func:`option`. - """ + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs.setdefault("callback", self.show_help) - def callback(ctx: Context, param: Parameter, value: bool) -> None: - if not value or ctx.resilient_parsing: - return + super().__init__(param_decls, **kwargs) - echo(ctx.get_help(), color=ctx.color) - ctx.exit() + @staticmethod + def show_help(ctx: Context, param: Parameter, value: bool) -> None: + """Callback that print the help page on ``<stdout>`` and exits.""" + if value and not ctx.resilient_parsing: + 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 +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Decorator for the pre-configured ``--help`` option defined above. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + kwargs.setdefault("cls", HelpOption) return option(*param_decls, **kwargs) diff --git a/libs/click/exceptions.py b/libs/click/exceptions.py index fe68a3613..0b8315166 100644 --- a/libs/click/exceptions.py +++ b/libs/click/exceptions.py @@ -3,6 +3,7 @@ from gettext import ngettext from ._compat import get_text_stderr +from .globals import resolve_color_default from .utils import echo from .utils import format_filename @@ -13,7 +14,7 @@ def _join_param_hints( - param_hint: t.Optional[t.Union[t.Sequence[str], str]] + 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) @@ -29,6 +30,9 @@ class ClickException(Exception): def __init__(self, message: str) -> None: super().__init__(message) + # The context will be removed by the time we print the message, so cache + # the color settings here to be used later on (in `show`) + self.show_color: t.Optional[bool] = resolve_color_default() self.message = message def format_message(self) -> str: @@ -41,7 +45,11 @@ 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) + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=self.show_color, + ) class UsageError(ClickException): @@ -58,7 +66,7 @@ class UsageError(ClickException): 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 + 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: diff --git a/libs/click/globals.py b/libs/click/globals.py index 480058f10..191e712db 100644 --- a/libs/click/globals.py +++ b/libs/click/globals.py @@ -3,19 +3,18 @@ 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": - ... +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 = ...) -> t.Optional["Context"]: ... def get_current_context(silent: bool = False) -> t.Optional["Context"]: diff --git a/libs/click/parser.py b/libs/click/parser.py index 5fa7adfac..600b8436d 100644 --- a/libs/click/parser.py +++ b/libs/click/parser.py @@ -17,6 +17,7 @@ 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 @@ -33,6 +34,7 @@ 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 @@ -247,7 +249,7 @@ 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"] = [] + self.order: t.List[CoreParameter] = [] class OptionParser: diff --git a/libs/click/shell_completion.py b/libs/click/shell_completion.py index dc9e00b9b..07d0f09ba 100644 --- a/libs/click/shell_completion.py +++ b/libs/click/shell_completion.py @@ -303,12 +303,19 @@ class BashComplete(ShellComplete): @staticmethod def _check_version() -> None: + import shutil import subprocess - output = subprocess.run( - ["bash", "-c", 'echo "${BASH_VERSION}"'], stdout=subprocess.PIPE - ) - match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + bash_exe = shutil.which("bash") + + if bash_exe is None: + match = None + else: + output = subprocess.run( + [bash_exe, "--norc", "-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() diff --git a/libs/click/termui.py b/libs/click/termui.py index db7a4b286..c084f1965 100644 --- a/libs/click/termui.py +++ b/libs/click/termui.py @@ -173,7 +173,7 @@ def prompt_func(text: str) -> str: 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 + echo(_("Error: {e.message}").format(e=e), err=err) continue if not confirmation_prompt: return result diff --git a/libs/click/testing.py b/libs/click/testing.py index e0df0d2a6..772b2159c 100644 --- a/libs/click/testing.py +++ b/libs/click/testing.py @@ -8,6 +8,7 @@ import typing as t from types import TracebackType +from . import _compat from . import formatting from . import termui from . import utils @@ -311,10 +312,12 @@ def should_strip_ansi( old_hidden_prompt_func = termui.hidden_prompt_func old__getchar_func = termui._getchar old_should_strip_ansi = utils.should_strip_ansi # type: ignore + old__compat_should_strip_ansi = _compat.should_strip_ansi termui.visible_prompt_func = visible_input termui.hidden_prompt_func = hidden_input termui._getchar = _getchar utils.should_strip_ansi = should_strip_ansi # type: ignore + _compat.should_strip_ansi = should_strip_ansi old_env = {} try: @@ -344,6 +347,7 @@ def should_strip_ansi( termui.hidden_prompt_func = old_hidden_prompt_func termui._getchar = old__getchar_func utils.should_strip_ansi = old_should_strip_ansi # type: ignore + _compat.should_strip_ansi = old__compat_should_strip_ansi formatting.FORCED_WIDTH = old_forced_width def invoke( @@ -475,5 +479,5 @@ def isolated_filesystem( if temp_dir is None: try: shutil.rmtree(dt) - except OSError: # noqa: B014 + except OSError: pass diff --git a/libs/click/types.py b/libs/click/types.py index 2b1d1797f..a70fd58ce 100644 --- a/libs/click/types.py +++ b/libs/click/types.py @@ -15,6 +15,7 @@ if t.TYPE_CHECKING: import typing_extensions as te + from .core import Context from .core import Parameter from .shell_completion import CompletionItem @@ -658,12 +659,15 @@ class File(ParamType): 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. + 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. + + .. versionchanged:: 2.0 + Added the ``atomic`` parameter. """ name = "filename" @@ -737,7 +741,7 @@ def convert( ctx.call_on_close(safecall(f.flush)) return f - except OSError as e: # noqa: B014 + except OSError as e: self.fail(f"'{format_filename(value)}': {e.strerror}", param, ctx) def shell_complete( @@ -891,7 +895,7 @@ def convert( ) if not self.dir_okay and stat.S_ISDIR(st.st_mode): self.fail( - _("{name} '{filename}' is a directory.").format( + _("{name} {filename!r} is a directory.").format( name=self.name.title(), filename=format_filename(value) ), param, diff --git a/libs/click/utils.py b/libs/click/utils.py index d536434f0..836c6f21a 100644 --- a/libs/click/utils.py +++ b/libs/click/utils.py @@ -156,7 +156,7 @@ def open(self) -> t.IO[t.Any]: rv, self.should_close = open_stream( self.name, self.mode, self.encoding, self.errors, atomic=self.atomic ) - except OSError as e: # noqa: E402 + except OSError as e: from .exceptions import FileError raise FileError(self.name, hint=e.strerror) from e @@ -311,7 +311,7 @@ def echo( out = strip_ansi(out) elif WIN: if auto_wrap_for_ansi is not None: - file = auto_wrap_for_ansi(file) # type: ignore + file = auto_wrap_for_ansi(file, color) # type: ignore elif not color: out = strip_ansi(out) @@ -353,7 +353,7 @@ def get_text_stream( def open_file( - filename: str, + filename: t.Union[str, "os.PathLike[str]"], mode: str = "r", encoding: t.Optional[str] = None, errors: t.Optional[str] = "strict", @@ -374,7 +374,7 @@ def open_file( with open_file(filename) as f: ... - :param filename: The name of the file to open, or ``'-'`` for + :param filename: The name or Path 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 @@ -410,7 +410,7 @@ def format_filename( 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`` + 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 diff --git a/libs/engineio/async_client.py b/libs/engineio/async_client.py index a39085793..7db3879e7 100644 --- a/libs/engineio/async_client.py +++ b/libs/engineio/async_client.py @@ -37,7 +37,7 @@ async def _handler(): # pragma: no cover for task in tasks: task.cancel() await asyncio.gather(*tasks, return_exceptions=True) - asyncio.get_event_loop().stop() + asyncio.get_running_loop().stop() asyncio.ensure_future(_handler()) @@ -75,6 +75,9 @@ class AsyncClient(base_client.BaseClient): :param websocket_extra_options: Dictionary containing additional keyword arguments passed to ``aiohttp.ws_connect()``. + :param timestamp_requests: If ``True`` a timestamp is added to the query + string of Socket.IO requests as a cache-busting + measure. Set to ``False`` to disable. """ def is_asyncio_based(self): return True @@ -106,7 +109,7 @@ async def connect(self, url, headers=None, transports=None, if self.handle_sigint and not async_signal_handler_set and \ threading.current_thread() == threading.main_thread(): try: - asyncio.get_event_loop().add_signal_handler( + asyncio.get_running_loop().add_signal_handler( signal.SIGINT, async_signal_handler) except NotImplementedError: # pragma: no cover self.logger.warning('Signal handler is unsupported') @@ -149,7 +152,7 @@ async def send(self, data): """ await self._send_packet(packet.Packet(packet.MESSAGE, data=data)) - async def disconnect(self, abort=False): + async def disconnect(self, abort=False, reason=None): """Disconnect from the server. :param abort: If set to ``True``, do not wait for background tasks @@ -161,7 +164,9 @@ async def disconnect(self, abort=False): await self._send_packet(packet.Packet(packet.CLOSE)) await self.queue.put(None) self.state = 'disconnecting' - await self._trigger_event('disconnect', run_async=False) + await self._trigger_event('disconnect', + reason or self.reason.CLIENT_DISCONNECT, + run_async=False) if self.current_transport == 'websocket': await self.ws.close() if not abort: @@ -409,7 +414,8 @@ async def _receive_packet(self, pkt): elif pkt.packet_type == packet.PING: await self._send_packet(packet.Packet(packet.PONG, pkt.data)) elif pkt.packet_type == packet.CLOSE: - await self.disconnect(abort=True) + await self.disconnect(abort=True, + reason=self.reason.SERVER_DISCONNECT) elif pkt.packet_type == packet.NOOP: pass else: @@ -462,7 +468,16 @@ async def _trigger_event(self, event, *args, **kwargs): return task else: try: - ret = await self.handlers[event](*args) + try: + ret = await self.handlers[event](*args) + except TypeError: + if event == 'disconnect' and \ + len(args) == 1: # pragma: no branch + # legacy disconnect events do not have a reason + # argument + return await self.handlers[event]() + else: # pragma: no cover + raise except asyncio.CancelledError: # pragma: no cover pass except: @@ -482,7 +497,16 @@ async def async_handler(): return task else: try: - ret = self.handlers[event](*args) + try: + ret = self.handlers[event](*args) + except TypeError: + if event == 'disconnect' and \ + len(args) == 1: # pragma: no branch + # legacy disconnect events do not have a reason + # argument + ret = self.handlers[event]() + else: # pragma: no cover + raise except: self.logger.exception(event + ' handler error') if event == 'connect': @@ -524,7 +548,8 @@ async def _read_loop_polling(self): self.logger.info('Waiting for write loop task to end') await self.write_loop_task if self.state == 'connected': - await self._trigger_event('disconnect', run_async=False) + await self._trigger_event( + 'disconnect', self.reason.TRANSPORT_ERROR, run_async=False) try: base_client.connected_clients.remove(self) except ValueError: # pragma: no cover @@ -578,7 +603,8 @@ async def _read_loop_websocket(self): self.logger.info('Waiting for write loop task to end') await self.write_loop_task if self.state == 'connected': - await self._trigger_event('disconnect', run_async=False) + await self._trigger_event( + 'disconnect', self.reason.TRANSPORT_ERROR, run_async=False) try: base_client.connected_clients.remove(self) except ValueError: # pragma: no cover diff --git a/libs/engineio/async_drivers/_websocket_wsgi.py b/libs/engineio/async_drivers/_websocket_wsgi.py index f30f8cae9..aca30dcf7 100644 --- a/libs/engineio/async_drivers/_websocket_wsgi.py +++ b/libs/engineio/async_drivers/_websocket_wsgi.py @@ -25,7 +25,7 @@ def send(self, message): try: return self.ws.send(message) except simple_websocket.ConnectionClosed: - raise IOError() + raise OSError() def wait(self): try: diff --git a/libs/engineio/async_drivers/aiohttp.py b/libs/engineio/async_drivers/aiohttp.py index a68d3094c..7c3440f03 100644 --- a/libs/engineio/async_drivers/aiohttp.py +++ b/libs/engineio/async_drivers/aiohttp.py @@ -57,7 +57,7 @@ def translate_request(request): key = 'HTTP_%s' % hdr_name.replace('-', '_') if key in environ: - hdr_value = '%s,%s' % (environ[key], hdr_value) + hdr_value = f'{environ[key]},{hdr_value}' environ[key] = hdr_value @@ -79,7 +79,7 @@ def make_response(status, headers, payload, environ): headers=headers) -class WebSocket(object): # pragma: no cover +class WebSocket: # pragma: no cover """ This wrapper class provides a aiohttp WebSocket interface that is somewhat compatible with eventlet's implementation. @@ -114,7 +114,7 @@ async def wait(self): msg = await self._sock.receive() if not isinstance(msg.data, bytes) and \ not isinstance(msg.data, str): - raise IOError() + raise OSError() return msg.data diff --git a/libs/engineio/async_drivers/asgi.py b/libs/engineio/async_drivers/asgi.py index bd502261d..866033bba 100644 --- a/libs/engineio/async_drivers/asgi.py +++ b/libs/engineio/async_drivers/asgi.py @@ -135,7 +135,7 @@ def _ensure_trailing_slash(self, path): async def translate_request(scope, receive, send): - class AwaitablePayload(object): # pragma: no cover + class AwaitablePayload: # pragma: no cover def __init__(self, payload): self.payload = payload or b'' @@ -161,9 +161,15 @@ async def read(self, length=None): else: return {} - raw_uri = scope['path'].encode('utf-8') + raw_uri = scope['path'] + query_string = '' if 'query_string' in scope and scope['query_string']: - raw_uri += b'?' + scope['query_string'] + try: + query_string = scope['query_string'].decode('utf-8') + except UnicodeDecodeError: + pass + else: + raw_uri += '?' + query_string environ = { 'wsgi.input': AwaitablePayload(payload), 'wsgi.errors': sys.stderr, @@ -175,8 +181,8 @@ async def read(self, length=None): 'SERVER_SOFTWARE': 'asgi', 'REQUEST_METHOD': scope.get('method', 'GET'), 'PATH_INFO': scope['path'], - 'QUERY_STRING': scope.get('query_string', b'').decode('utf-8'), - 'RAW_URI': raw_uri.decode('utf-8'), + 'QUERY_STRING': query_string, + 'RAW_URI': raw_uri, 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'REMOTE_ADDR': '127.0.0.1', @@ -189,8 +195,12 @@ async def read(self, length=None): } for hdr_name, hdr_value in scope['headers']: - hdr_name = hdr_name.upper().decode('utf-8') - hdr_value = hdr_value.decode('utf-8') + try: + hdr_name = hdr_name.upper().decode('utf-8') + hdr_value = hdr_value.decode('utf-8') + except UnicodeDecodeError: + # skip header if it cannot be decoded + continue if hdr_name == 'CONTENT-TYPE': environ['CONTENT_TYPE'] = hdr_value continue @@ -200,7 +210,7 @@ async def read(self, length=None): key = 'HTTP_%s' % hdr_name.replace('-', '_') if key in environ: - hdr_value = '%s,%s' % (environ[key], hdr_value) + hdr_value = f'{environ[key]},{hdr_value}' environ[key] = hdr_value @@ -231,7 +241,7 @@ async def make_response(status, headers, payload, environ): 'body': payload}) -class WebSocket(object): # pragma: no cover +class WebSocket: # pragma: no cover """ This wrapper class provides an asgi WebSocket interface that is somewhat compatible with eventlet's implementation. @@ -269,7 +279,7 @@ async def send(self, message): async def wait(self): event = await self.asgi_receive() if event['type'] != 'websocket.receive': - raise IOError() + raise OSError() return event.get('bytes') or event.get('text') diff --git a/libs/engineio/async_drivers/eventlet.py b/libs/engineio/async_drivers/eventlet.py index b27eb1445..6361c4de0 100644 --- a/libs/engineio/async_drivers/eventlet.py +++ b/libs/engineio/async_drivers/eventlet.py @@ -1,5 +1,3 @@ -from __future__ import absolute_import - from eventlet.green.threading import Event from eventlet import queue, sleep, spawn from eventlet.websocket import WebSocketWSGI as _WebSocketWSGI diff --git a/libs/engineio/async_drivers/gevent_uwsgi.py b/libs/engineio/async_drivers/gevent_uwsgi.py index 34683edfb..b5ccefc84 100644 --- a/libs/engineio/async_drivers/gevent_uwsgi.py +++ b/libs/engineio/async_drivers/gevent_uwsgi.py @@ -18,7 +18,7 @@ def _run(self): return self.run() -class uWSGIWebSocket(object): # pragma: no cover +class uWSGIWebSocket: # pragma: no cover """ This wrapper class provides a uWSGI WebSocket interface that is compatible with eventlet's implementation. @@ -115,7 +115,7 @@ def wait(self): if self._req_ctx is not None: try: msg = uwsgi.websocket_recv(request_context=self._req_ctx) - except IOError: # connection closed + except OSError: # connection closed self.close() return None return self._decode_received(msg) @@ -138,7 +138,7 @@ def wait(self): for msg in msgs: try: self._send(msg) - except IOError: + except OSError: self.close() return None # maybe there is something to receive, if not, at least @@ -146,7 +146,7 @@ def wait(self): while True: try: msg = uwsgi.websocket_recv_nb() - except IOError: # connection closed + except OSError: # connection closed self.close() return None if msg: # message available diff --git a/libs/engineio/async_drivers/sanic.py b/libs/engineio/async_drivers/sanic.py index fe351aead..4d6a5b8e1 100644 --- a/libs/engineio/async_drivers/sanic.py +++ b/libs/engineio/async_drivers/sanic.py @@ -6,7 +6,6 @@ try: from sanic.server.protocols.websocket_protocol import WebSocketProtocol except ImportError: - print('yay') from sanic.websocket import WebSocketProtocol except ImportError: HTTPResponse = None @@ -33,7 +32,7 @@ def translate_request(request): # pragma: no cover """This function takes the arguments passed to the request handler and uses them to generate a WSGI compatible environ dictionary. """ - class AwaitablePayload(object): + class AwaitablePayload: def __init__(self, payload): self.payload = payload or b'' @@ -78,7 +77,7 @@ async def read(self, length=None): key = 'HTTP_%s' % hdr_name.replace('-', '_') if key in environ: - hdr_value = '%s,%s' % (environ[key], hdr_value) + hdr_value = f'{environ[key]},{hdr_value}' environ[key] = hdr_value @@ -107,7 +106,7 @@ def make_response(status, headers, payload, environ): # pragma: no cover status=int(status.split()[0]), headers=headers_dict) -class WebSocket(object): # pragma: no cover +class WebSocket: # pragma: no cover """ This wrapper class provides a sanic WebSocket interface that is somewhat compatible with eventlet's implementation. @@ -136,7 +135,7 @@ async def wait(self): data = await self._sock.recv() if not isinstance(data, bytes) and \ not isinstance(data, str): - raise IOError() + raise OSError() return data diff --git a/libs/engineio/async_drivers/tornado.py b/libs/engineio/async_drivers/tornado.py index 2c70135af..abb1e2b54 100644 --- a/libs/engineio/async_drivers/tornado.py +++ b/libs/engineio/async_drivers/tornado.py @@ -64,7 +64,7 @@ def translate_request(handler): """This function takes the arguments passed to the request handler and uses them to generate a WSGI compatible environ dictionary. """ - class AwaitablePayload(object): + class AwaitablePayload: def __init__(self, payload): self.payload = payload or b'' @@ -142,7 +142,7 @@ def make_response(status, headers, payload, environ): tornado_handler.finish() -class WebSocket(object): # pragma: no cover +class WebSocket: # pragma: no cover """ This wrapper class provides a tornado WebSocket interface that is somewhat compatible with eventlet's implementation. @@ -170,7 +170,7 @@ async def wait(self): msg = await self.tornado_handler.get_next_message() if not isinstance(msg, bytes) and \ not isinstance(msg, str): - raise IOError() + raise OSError() return msg diff --git a/libs/engineio/async_server.py b/libs/engineio/async_server.py index 661205023..4bf28f23d 100644 --- a/libs/engineio/async_server.py +++ b/libs/engineio/async_server.py @@ -89,7 +89,7 @@ def async_modes(self): def attach(self, app, engineio_path='engine.io'): """Attach the Engine.IO server to an application.""" engineio_path = engineio_path.strip('/') - self._async['create_route'](app, self, '/{}/'.format(engineio_path)) + self._async['create_route'](app, self, f'/{engineio_path}/') async def send(self, sid, data): """Send a message to a client. @@ -162,7 +162,7 @@ def on_message(sid, msg): async with eio.session(sid) as session: print('received message from ', session['username']) """ - class _session_context_manager(object): + class _session_context_manager: def __init__(self, server, sid): self.server = server self.sid = sid @@ -192,12 +192,15 @@ async def disconnect(self, sid=None): # the socket was already closed or gone pass else: - await socket.close() + await socket.close(reason=self.reason.SERVER_DISCONNECT) if sid in self.sockets: # pragma: no cover del self.sockets[sid] else: - await asyncio.wait([asyncio.create_task(client.close()) - for client in self.sockets.values()]) + await asyncio.wait([ + asyncio.create_task(client.close( + reason=self.reason.SERVER_DISCONNECT)) + for client in self.sockets.values() + ]) self.sockets = {} async def handle_request(self, *args, **kwargs): @@ -284,33 +287,41 @@ async def handle_request(self, *args, **kwargs): r = self._bad_request('Invalid websocket upgrade') else: if sid not in self.sockets: - self._log_error_once('Invalid session ' + sid, 'bad-sid') - r = self._bad_request('Invalid session ' + sid) + self._log_error_once(f'Invalid session {sid}', 'bad-sid') + r = self._bad_request(f'Invalid session {sid}') else: - socket = self._get_socket(sid) - if self.transport(sid) != transport and \ - transport != upgrade_header: - self._log_error_once( - 'Invalid transport for session ' + sid, - 'bad-transport') - r = self._bad_request('Invalid transport') + try: + socket = self._get_socket(sid) + except KeyError as e: # pragma: no cover + self._log_error_once(f'{e} {sid}', 'bad-sid') + r = self._bad_request(f'{e} {sid}') else: - try: - packets = await socket.handle_get_request(environ) - if isinstance(packets, list): - r = self._ok(packets, jsonp_index=jsonp_index) - else: - r = packets - except exceptions.EngineIOError: - if sid in self.sockets: # pragma: no cover - await self.disconnect(sid) - r = self._bad_request() - if sid in self.sockets and self.sockets[sid].closed: - del self.sockets[sid] + if self.transport(sid) != transport and \ + transport != upgrade_header: + self._log_error_once( + f'Invalid transport for session {sid}', + 'bad-transport') + r = self._bad_request('Invalid transport') + else: + try: + packets = await socket.handle_get_request( + environ) + if isinstance(packets, list): + r = self._ok(packets, + jsonp_index=jsonp_index) + else: + r = packets + except exceptions.EngineIOError: + if sid in self.sockets: # pragma: no cover + await self.disconnect(sid) + r = self._bad_request() + if sid in self.sockets and \ + self.sockets[sid].closed: + del self.sockets[sid] elif method == 'POST': if sid is None or sid not in self.sockets: - self._log_error_once('Invalid session ' + sid, 'bad-sid') - r = self._bad_request('Invalid session ' + sid) + self._log_error_once(f'Invalid session {sid}', 'bad-sid') + r = self._bad_request(f'Invalid session {sid}') else: socket = self._get_socket(sid) try: @@ -440,11 +451,14 @@ async def _handle_connect(self, environ, transport, jsonp_index=None): s = async_socket.AsyncSocket(self, sid) self.sockets[sid] = s - pkt = packet.Packet( - packet.OPEN, {'sid': sid, - 'upgrades': self._upgrades(sid, transport), - 'pingTimeout': int(self.ping_timeout * 1000), - 'pingInterval': int(self.ping_interval * 1000)}) + pkt = packet.Packet(packet.OPEN, { + 'sid': sid, + 'upgrades': self._upgrades(sid, transport), + 'pingTimeout': int(self.ping_timeout * 1000), + 'pingInterval': int( + self.ping_interval + self.ping_interval_grace_period) * 1000, + 'maxPayload': self.max_http_buffer_size, + }) await s.send(pkt) s.schedule_ping() @@ -491,7 +505,16 @@ async def _trigger_event(self, event, *args, **kwargs): if asyncio.iscoroutinefunction(self.handlers[event]): async def run_async_handler(): try: - return await self.handlers[event](*args) + try: + return await self.handlers[event](*args) + except TypeError: + if event == 'disconnect' and \ + len(args) == 2: # pragma: no branch + # legacy disconnect events do not have a reason + # argument + return await self.handlers[event](args[0]) + else: # pragma: no cover + raise except asyncio.CancelledError: # pragma: no cover pass except: @@ -510,7 +533,16 @@ async def run_async_handler(): else: async def run_sync_handler(): try: - return self.handlers[event](*args) + try: + return self.handlers[event](*args) + except TypeError: + if event == 'disconnect' and \ + len(args) == 2: # pragma: no branch + # legacy disconnect events do not have a reason + # argument + return self.handlers[event](args[0]) + else: # pragma: no cover + raise except: self.logger.exception(event + ' handler error') if event == 'connect': @@ -528,6 +560,7 @@ async def run_sync_handler(): async def _service_task(self): # pragma: no cover """Monitor connected clients and clean up those that time out.""" + loop = asyncio.get_running_loop() self.service_task_event = self.create_event() while not self.service_task_event.is_set(): if len(self.sockets) == 0: @@ -569,7 +602,7 @@ async def _service_task(self): # pragma: no cover self.logger.info('service task canceled') break except: - if asyncio.get_event_loop().is_closed(): + if loop.is_closed(): self.logger.info('event loop is closed, exiting service ' 'task') break diff --git a/libs/engineio/async_socket.py b/libs/engineio/async_socket.py index 75776ef67..cfdbe1a2d 100644 --- a/libs/engineio/async_socket.py +++ b/libs/engineio/async_socket.py @@ -47,7 +47,8 @@ async def receive(self, pkt): elif pkt.packet_type == packet.UPGRADE: await self.send(packet.Packet(packet.NOOP)) elif pkt.packet_type == packet.CLOSE: - await self.close(wait=False, abort=True) + await self.close(wait=False, abort=True, + reason=self.server.reason.CLIENT_DISCONNECT) else: raise exceptions.UnknownPacketError() @@ -62,7 +63,8 @@ async def check_ping_timeout(self): # Passing abort=False here will cause close() to write a # CLOSE packet. This has the effect of updating half-open sockets # to their correct state of disconnected - await self.close(wait=False, abort=False) + await self.close(wait=False, abort=False, + reason=self.server.reason.PING_TIMEOUT) return False return True @@ -95,7 +97,8 @@ async def handle_get_request(self, environ): packets = await self.poll() except exceptions.QueueEmpty: exc = sys.exc_info() - await self.close(wait=False) + await self.close(wait=False, + reason=self.server.reason.TRANSPORT_ERROR) raise exc[1].with_traceback(exc[2]) return packets @@ -110,11 +113,14 @@ async def handle_post_request(self, environ): for pkt in p.packets: await self.receive(pkt) - async def close(self, wait=True, abort=False): + async def close(self, wait=True, abort=False, reason=None): """Close the socket connection.""" if not self.closed and not self.closing: self.closing = True - await self.server._trigger_event('disconnect', self.sid) + await self.server._trigger_event( + 'disconnect', self.sid, + reason or self.server.reason.SERVER_DISCONNECT, + run_async=False) if not abort: await self.send(packet.Packet(packet.CLOSE)) self.closed = True @@ -134,7 +140,7 @@ async def _send_ping(self): async def _upgrade_websocket(self, environ): """Upgrade the connection from polling to websocket.""" if self.upgraded: - raise IOError('Socket has been upgraded already') + raise OSError('Socket has been upgraded already') if self.server._async['websocket'] is None: # the selected async mode does not support websocket return self.server._bad_request() @@ -156,7 +162,7 @@ async def websocket_wait(): try: pkt = await websocket_wait() - except IOError: # pragma: no cover + except OSError: # pragma: no cover return decoded_pkt = packet.Packet(encoded_packet=pkt) if decoded_pkt.packet_type != packet.PING or \ @@ -170,7 +176,7 @@ async def websocket_wait(): try: pkt = await websocket_wait() - except IOError: # pragma: no cover + except OSError: # pragma: no cover self.upgrading = False return decoded_pkt = packet.Packet(encoded_packet=pkt) @@ -251,4 +257,5 @@ async def writer(): await self.queue.put(None) # unlock the writer task so it can exit await asyncio.wait_for(writer_task, timeout=None) - await self.close(wait=False, abort=True) + await self.close(wait=False, abort=True, + reason=self.server.reason.TRANSPORT_CLOSE) diff --git a/libs/engineio/base_client.py b/libs/engineio/base_client.py index 6381be20c..912baf720 100644 --- a/libs/engineio/base_client.py +++ b/libs/engineio/base_client.py @@ -30,9 +30,18 @@ def signal_handler(sig, frame): class BaseClient: event_names = ['connect', 'disconnect', 'message'] + class reason: + """Disconnection reasons.""" + #: Client-initiated disconnection. + CLIENT_DISCONNECT = 'client disconnect' + #: Server-initiated disconnection. + SERVER_DISCONNECT = 'server disconnect' + #: Transport error. + TRANSPORT_ERROR = 'transport error' + def __init__(self, logger=False, json=None, request_timeout=5, http_session=None, ssl_verify=True, handle_sigint=True, - websocket_extra_options=None): + websocket_extra_options=None, timestamp_requests=True): global original_signal_handler if handle_sigint and original_signal_handler is None and \ threading.current_thread() == threading.main_thread(): @@ -56,6 +65,7 @@ def __init__(self, logger=False, json=None, request_timeout=5, self.state = 'disconnected' self.ssl_verify = ssl_verify self.websocket_extra_options = websocket_extra_options or {} + self.timestamp_requests = timestamp_requests if json is not None: packet.Packet.json = json @@ -143,4 +153,6 @@ def _get_engineio_url(self, url, engineio_path, transport): def _get_url_timestamp(self): """Generate the Engine.IO query string timestamp.""" + if not self.timestamp_requests: + return '' return '&t=' + str(time.time()) diff --git a/libs/engineio/base_server.py b/libs/engineio/base_server.py index c32cb1416..bfb4165be 100644 --- a/libs/engineio/base_server.py +++ b/libs/engineio/base_server.py @@ -19,6 +19,19 @@ class BaseServer: _default_monitor_clients = True sequence_number = 0 + class reason: + """Disconnection reasons.""" + #: Server-initiated disconnection. + SERVER_DISCONNECT = 'server disconnect' + #: Client-initiated disconnection. + CLIENT_DISCONNECT = 'client disconnect' + #: Ping timeout. + PING_TIMEOUT = 'ping timeout' + #: Transport close. + TRANSPORT_CLOSE = 'transport close' + #: Transport error. + TRANSPORT_ERROR = 'transport error' + def __init__(self, async_mode=None, ping_interval=25, ping_timeout=20, max_http_buffer_size=1000000, allow_upgrades=True, http_compression=True, compression_threshold=1024, diff --git a/libs/engineio/base_socket.py b/libs/engineio/base_socket.py index 6d42bfec5..6b5d7dc8a 100644 --- a/libs/engineio/base_socket.py +++ b/libs/engineio/base_socket.py @@ -1,4 +1,3 @@ - class BaseSocket: upgrade_protocols = ['websocket'] diff --git a/libs/engineio/client.py b/libs/engineio/client.py index a2571842b..987c3998d 100644 --- a/libs/engineio/client.py +++ b/libs/engineio/client.py @@ -55,6 +55,9 @@ class Client(base_client.BaseClient): :param websocket_extra_options: Dictionary containing additional keyword arguments passed to ``websocket.create_connection()``. + :param timestamp_requests: If ``True`` a timestamp is added to the query + string of Socket.IO requests as a cache-busting + measure. Set to ``False`` to disable. """ def connect(self, url, headers=None, transports=None, engineio_path='engine.io'): @@ -110,7 +113,7 @@ def send(self, data): """ self._send_packet(packet.Packet(packet.MESSAGE, data=data)) - def disconnect(self, abort=False): + def disconnect(self, abort=False, reason=None): """Disconnect from the server. :param abort: If set to ``True``, do not wait for background tasks @@ -120,7 +123,9 @@ def disconnect(self, abort=False): self._send_packet(packet.Packet(packet.CLOSE)) self.queue.put(None) self.state = 'disconnecting' - self._trigger_event('disconnect', run_async=False) + self._trigger_event('disconnect', + reason or self.reason.CLIENT_DISCONNECT, + run_async=False) if self.current_transport == 'websocket': self.ws.close() if not abort: @@ -251,7 +256,7 @@ def _connect_websocket(self, url, headers, engineio_path): extra_options = {} if self.http: # cookies - cookies = '; '.join(["{}={}".format(cookie.name, cookie.value) + cookies = '; '.join([f"{cookie.name}={cookie.value}" for cookie in self.http.cookies]) for header, value in headers.items(): if header.lower() == 'cookie': @@ -325,7 +330,7 @@ def _connect_websocket(self, url, headers, engineio_path): try: ws = websocket.create_connection( websocket_url + self._get_url_timestamp(), **extra_options) - except (ConnectionError, IOError, websocket.WebSocketException): + except (ConnectionError, OSError, websocket.WebSocketException): if upgrade: self.logger.warning( 'WebSocket upgrade failed: connection error') @@ -404,7 +409,7 @@ def _receive_packet(self, pkt): elif pkt.packet_type == packet.PING: self._send_packet(packet.Packet(packet.PONG, pkt.data)) elif pkt.packet_type == packet.CLOSE: - self.disconnect(abort=True) + self.disconnect(abort=True, reason=self.reason.SERVER_DISCONNECT) elif pkt.packet_type == packet.NOOP: pass else: @@ -444,7 +449,16 @@ def _trigger_event(self, event, *args, **kwargs): return self.start_background_task(self.handlers[event], *args) else: try: - return self.handlers[event](*args) + try: + return self.handlers[event](*args) + except TypeError: + if event == 'disconnect' and \ + len(args) == 1: # pragma: no branch + # legacy disconnect events do not have a reason + # argument + return self.handlers[event]() + else: # pragma: no cover + raise except: self.logger.exception(event + ' handler error') @@ -480,7 +494,8 @@ def _read_loop_polling(self): self.logger.info('Waiting for write loop task to end') self.write_loop_task.join() if self.state == 'connected': - self._trigger_event('disconnect', run_async=False) + self._trigger_event('disconnect', self.reason.TRANSPORT_ERROR, + run_async=False) try: base_client.connected_clients.remove(self) except ValueError: # pragma: no cover @@ -530,7 +545,8 @@ def _read_loop_websocket(self): self.logger.info('Waiting for write loop task to end') self.write_loop_task.join() if self.state == 'connected': - self._trigger_event('disconnect', run_async=False) + self._trigger_event('disconnect', self.reason.TRANSPORT_ERROR, + run_async=False) try: base_client.connected_clients.remove(self) except ValueError: # pragma: no cover diff --git a/libs/engineio/middleware.py b/libs/engineio/middleware.py index e198737f5..0e34fb04b 100644 --- a/libs/engineio/middleware.py +++ b/libs/engineio/middleware.py @@ -2,7 +2,7 @@ from engineio.static_files import get_static_file -class WSGIApp(object): +class WSGIApp: """WSGI application middleware for Engine.IO. This middleware dispatches traffic to an Engine.IO application. It can @@ -50,7 +50,7 @@ def __call__(self, environ, start_response): # directly into the environment. To give eventlet's WebSocket # module access to this socket when running under gunicorn, here we # copy the socket to the eventlet format. - class Input(object): + class Input: def __init__(self, socket): self.socket = socket diff --git a/libs/engineio/packet.py b/libs/engineio/packet.py index 8e8135ccf..7edc7a332 100644 --- a/libs/engineio/packet.py +++ b/libs/engineio/packet.py @@ -7,7 +7,7 @@ binary_types = (bytes, bytearray) -class Packet(object): +class Packet: """Engine.IO packet.""" json = _json diff --git a/libs/engineio/payload.py b/libs/engineio/payload.py index f0e9e343d..775241ba7 100644 --- a/libs/engineio/payload.py +++ b/libs/engineio/payload.py @@ -3,7 +3,7 @@ from . import packet -class Payload(object): +class Payload: """Engine.IO payload.""" max_decode_packets = 16 diff --git a/libs/engineio/server.py b/libs/engineio/server.py index 578780bc6..f1b136713 100644 --- a/libs/engineio/server.py +++ b/libs/engineio/server.py @@ -148,7 +148,7 @@ def on_message(sid, msg): with eio.session(sid) as session: print('received message from ', session['username']) """ - class _session_context_manager(object): + class _session_context_manager: def __init__(self, server, sid): self.server = server self.sid = sid @@ -176,12 +176,12 @@ def disconnect(self, sid=None): # the socket was already closed or gone pass else: - socket.close() + socket.close(reason=self.reason.SERVER_DISCONNECT) if sid in self.sockets: # pragma: no cover del self.sockets[sid] else: for client in self.sockets.copy().values(): - client.close() + client.close(reason=self.reason.SERVER_DISCONNECT) self.sockets = {} def handle_request(self, environ, start_response): @@ -266,35 +266,41 @@ def handle_request(self, environ, start_response): r = self._bad_request('Invalid websocket upgrade') else: if sid not in self.sockets: - self._log_error_once('Invalid session ' + sid, 'bad-sid') - r = self._bad_request('Invalid session') + self._log_error_once(f'Invalid session {sid}', 'bad-sid') + r = self._bad_request(f'Invalid session {sid}') else: - socket = self._get_socket(sid) - if self.transport(sid) != transport and \ - transport != upgrade_header: - self._log_error_once( - 'Invalid transport for session ' + sid, - 'bad-transport') - r = self._bad_request('Invalid transport') + try: + socket = self._get_socket(sid) + except KeyError as e: # pragma: no cover + self._log_error_once(f'{e} {sid}', 'bad-sid') + r = self._bad_request(f'{e} {sid}') else: - try: - packets = socket.handle_get_request( - environ, start_response) - if isinstance(packets, list): - r = self._ok(packets, jsonp_index=jsonp_index) - else: - r = packets - except exceptions.EngineIOError: - if sid in self.sockets: # pragma: no cover - self.disconnect(sid) - r = self._bad_request() - if sid in self.sockets and self.sockets[sid].closed: - del self.sockets[sid] + if self.transport(sid) != transport and \ + transport != upgrade_header: + self._log_error_once( + f'Invalid transport for session {sid}', + 'bad-transport') + r = self._bad_request('Invalid transport') + else: + try: + packets = socket.handle_get_request( + environ, start_response) + if isinstance(packets, list): + r = self._ok(packets, + jsonp_index=jsonp_index) + else: + r = packets + except exceptions.EngineIOError: + if sid in self.sockets: # pragma: no cover + self.disconnect(sid) + r = self._bad_request() + if sid in self.sockets and \ + self.sockets[sid].closed: + del self.sockets[sid] elif method == 'POST': if sid is None or sid not in self.sockets: - self._log_error_once( - 'Invalid session ' + (sid or 'None'), 'bad-sid') - r = self._bad_request('Invalid session') + self._log_error_once(f'Invalid session {sid}', 'bad-sid') + r = self._bad_request(f'Invalid session {sid}') else: socket = self._get_socket(sid) try: @@ -390,7 +396,9 @@ def _handle_connect(self, environ, start_response, transport, 'upgrades': self._upgrades(sid, transport), 'pingTimeout': int(self.ping_timeout * 1000), 'pingInterval': int( - self.ping_interval + self.ping_interval_grace_period) * 1000}) + self.ping_interval + self.ping_interval_grace_period) * 1000, + 'maxPayload': self.max_http_buffer_size, + }) s.send(pkt) s.schedule_ping() @@ -438,7 +446,16 @@ def _trigger_event(self, event, *args, **kwargs): if event in self.handlers: def run_handler(): try: - return self.handlers[event](*args) + try: + return self.handlers[event](*args) + except TypeError: + if event == 'disconnect' and \ + len(args) == 2: # pragma: no branch + # legacy disconnect events do not have a reason + # argument + return self.handlers[event](args[0]) + else: # pragma: no cover + raise except: self.logger.exception(event + ' handler error') if event == 'connect': diff --git a/libs/engineio/socket.py b/libs/engineio/socket.py index de8fd354d..006a9b089 100644 --- a/libs/engineio/socket.py +++ b/libs/engineio/socket.py @@ -48,7 +48,8 @@ def receive(self, pkt): elif pkt.packet_type == packet.UPGRADE: self.send(packet.Packet(packet.NOOP)) elif pkt.packet_type == packet.CLOSE: - self.close(wait=False, abort=True) + self.close(wait=False, abort=True, + reason=self.server.reason.CLIENT_DISCONNECT) else: raise exceptions.UnknownPacketError() @@ -63,7 +64,8 @@ def check_ping_timeout(self): # Passing abort=False here will cause close() to write a # CLOSE packet. This has the effect of updating half-open sockets # to their correct state of disconnected - self.close(wait=False, abort=False) + self.close(wait=False, abort=False, + reason=self.server.reason.PING_TIMEOUT) return False return True @@ -97,7 +99,7 @@ def handle_get_request(self, environ, start_response): packets = self.poll() except exceptions.QueueEmpty: exc = sys.exc_info() - self.close(wait=False) + self.close(wait=False, reason=self.server.reason.TRANSPORT_ERROR) raise exc[1].with_traceback(exc[2]) return packets @@ -112,11 +114,14 @@ def handle_post_request(self, environ): for pkt in p.packets: self.receive(pkt) - def close(self, wait=True, abort=False): + def close(self, wait=True, abort=False, reason=None): """Close the socket connection.""" if not self.closed and not self.closing: self.closing = True - self.server._trigger_event('disconnect', self.sid, run_async=False) + self.server._trigger_event( + 'disconnect', self.sid, + reason or self.server.reason.SERVER_DISCONNECT, + run_async=False) if not abort: self.send(packet.Packet(packet.CLOSE)) self.closed = True @@ -137,7 +142,7 @@ def _send_ping(self): def _upgrade_websocket(self, environ, start_response): """Upgrade the connection from polling to websocket.""" if self.upgraded: - raise IOError('Socket has been upgraded already') + raise OSError('Socket has been upgraded already') if self.server._async['websocket'] is None: # the selected async mode does not support websocket return self.server._bad_request() diff --git a/libs/fcache-0.5.2.dist-info/METADATA b/libs/fcache-0.5.2.dist-info/METADATA index eb081d3ff..62a0a761b 100644 --- a/libs/fcache-0.5.2.dist-info/METADATA +++ b/libs/fcache-0.5.2.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.3 +Metadata-Version: 2.4 Name: fcache Version: 0.5.2 Summary: a dictionary-like, file-based cache module for Python diff --git a/libs/fcache-0.5.2.dist-info/RECORD b/libs/fcache-0.5.2.dist-info/RECORD index a9ea25c8d..aef3b9395 100644 --- a/libs/fcache-0.5.2.dist-info/RECORD +++ b/libs/fcache-0.5.2.dist-info/RECORD @@ -1,8 +1,8 @@ fcache-0.5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -fcache-0.5.2.dist-info/METADATA,sha256=4uw9_Kh21oj4TsAnmtokJwjAXI3M5uTlqbmoLqx7BtQ,2840 +fcache-0.5.2.dist-info/METADATA,sha256=xwdG1gRS2RjB0eDNq7ZWCneWblSA4l59P324z6kC9hE,2840 fcache-0.5.2.dist-info/RECORD,, fcache-0.5.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -fcache-0.5.2.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +fcache-0.5.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 fcache-0.5.2.dist-info/licenses/AUTHORS.rst,sha256=z5OBAQvrU1cODlriE7s3MA3AK1JRqcz_c5lxaagXIec,398 fcache-0.5.2.dist-info/licenses/LICENSE.txt,sha256=UK1ituPhetE5O947l7Iz53IihKh1ZtmBBjUbCCas8-Y,1056 fcache/__init__.py,sha256=isJrmDBLRag7Zc2UK9ZovWGOv7ji1Oh-zJtJMNJFkXw,22 diff --git a/libs/fcache-0.5.2.dist-info/WHEEL b/libs/fcache-0.5.2.dist-info/WHEEL index cdd68a497..12228d414 100644 --- a/libs/fcache-0.5.2.dist-info/WHEEL +++ b/libs/fcache-0.5.2.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.25.0 +Generator: hatchling 1.27.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/ffsubsync-0.4.26.dist-info/INSTALLER b/libs/ffsubsync-0.4.27.dist-info/INSTALLER similarity index 100% rename from libs/ffsubsync-0.4.26.dist-info/INSTALLER rename to libs/ffsubsync-0.4.27.dist-info/INSTALLER diff --git a/libs/ffsubsync-0.4.26.dist-info/LICENSE b/libs/ffsubsync-0.4.27.dist-info/LICENSE similarity index 100% rename from libs/ffsubsync-0.4.26.dist-info/LICENSE rename to libs/ffsubsync-0.4.27.dist-info/LICENSE diff --git a/libs/ffsubsync-0.4.26.dist-info/METADATA b/libs/ffsubsync-0.4.27.dist-info/METADATA similarity index 99% rename from libs/ffsubsync-0.4.26.dist-info/METADATA rename to libs/ffsubsync-0.4.27.dist-info/METADATA index 6a14ad2c8..b1437b481 100644 --- a/libs/ffsubsync-0.4.26.dist-info/METADATA +++ b/libs/ffsubsync-0.4.27.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: ffsubsync -Version: 0.4.26 +Version: 0.4.27 Summary: Language-agnostic synchronization of subtitles with video. Home-page: https://github.com/smacke/ffsubsync Author: Stephen Macke @@ -28,6 +28,7 @@ Requires-Dist: ffmpeg-python Requires-Dist: future (>=0.18.2) Requires-Dist: numpy (>=1.12.0) Requires-Dist: rich +Requires-Dist: setuptools Requires-Dist: six Requires-Dist: srt (>=3.0.0) Requires-Dist: tqdm diff --git a/libs/ffsubsync-0.4.26.dist-info/RECORD b/libs/ffsubsync-0.4.27.dist-info/RECORD similarity index 64% rename from libs/ffsubsync-0.4.26.dist-info/RECORD rename to libs/ffsubsync-0.4.27.dist-info/RECORD index 2609b3f5a..c4e5060e5 100644 --- a/libs/ffsubsync-0.4.26.dist-info/RECORD +++ b/libs/ffsubsync-0.4.27.dist-info/RECORD @@ -1,26 +1,26 @@ ../../bin/ffs,sha256=DxvuHhnq32-Y1GV_I7TgwLKfOdmvGmt3YEor11O66T0,231 ../../bin/ffsubsync,sha256=DxvuHhnq32-Y1GV_I7TgwLKfOdmvGmt3YEor11O66T0,231 ../../bin/subsync,sha256=DxvuHhnq32-Y1GV_I7TgwLKfOdmvGmt3YEor11O66T0,231 -ffsubsync-0.4.26.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -ffsubsync-0.4.26.dist-info/LICENSE,sha256=DojZETNKKMCxh_kvQYZwyPFvuoM9pkllyQDqVdT9Ja4,1053 -ffsubsync-0.4.26.dist-info/METADATA,sha256=bbhDMkNjRqLOWJlYrsWCEc4SkJY7ApsJgIBG5wtI6c0,10126 -ffsubsync-0.4.26.dist-info/RECORD,, -ffsubsync-0.4.26.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -ffsubsync-0.4.26.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110 -ffsubsync-0.4.26.dist-info/entry_points.txt,sha256=x5tYAy_9mGKvB6HtyypAE7bMClVIVPxcxcTozISatsg,91 -ffsubsync-0.4.26.dist-info/top_level.txt,sha256=rD4Pc_QfEQZsZ-i6QXAdnbhVWanzT9edNbD7htPRjWs,10 +ffsubsync-0.4.27.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +ffsubsync-0.4.27.dist-info/LICENSE,sha256=DojZETNKKMCxh_kvQYZwyPFvuoM9pkllyQDqVdT9Ja4,1053 +ffsubsync-0.4.27.dist-info/METADATA,sha256=mrI29TjVdai0IUimAOLBYpyQKLS_1whpy3I_xFdAs8k,10152 +ffsubsync-0.4.27.dist-info/RECORD,, +ffsubsync-0.4.27.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +ffsubsync-0.4.27.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110 +ffsubsync-0.4.27.dist-info/entry_points.txt,sha256=x5tYAy_9mGKvB6HtyypAE7bMClVIVPxcxcTozISatsg,91 +ffsubsync-0.4.27.dist-info/top_level.txt,sha256=rD4Pc_QfEQZsZ-i6QXAdnbhVWanzT9edNbD7htPRjWs,10 ffsubsync/__init__.py,sha256=ZvmoQa78CTLOAugFvZ2Ui4CpqSIbvcAEbDSNUjLNwt0,601 -ffsubsync/_version.py,sha256=DegFaqHChjouMMImtFhJMNrc55PoFbJNI-P5xU4R58U,498 +ffsubsync/_version.py,sha256=7rAxsJ78XcG31MGnkympk8M2vM1ccLVn2oD4GXdH0kc,498 ffsubsync/aligners.py,sha256=uaWmoCax0t8C6njy9paPkhgG4luPk8VIDm97WrZMzWU,5738 ffsubsync/constants.py,sha256=SYqge3UW2ZQsGk_bi_wgg010SJCBhu6akR9R9fatv_0,1324 ffsubsync/ffmpeg_utils.py,sha256=QeWpxoZ4Lm1IyLptl-pc1DZjn2zgLocZ0wyie86Popc,3161 ffsubsync/ffsubsync.py,sha256=8b0bj4z25AdPIglVtoshWwPI90RV9F3H_YYcFgo9hng,26017 ffsubsync/ffsubsync_gui.py,sha256=0cC9shk5q6KShAMzpo9ERbh2xVTyJNY7T4IOPqrE5p8,3617 ffsubsync/file_utils.py,sha256=B5iTlmTuolE2JwhbFkJY8KqPvtwtHPNrAKsADtPgAQM,893 -ffsubsync/generic_subtitles.py,sha256=5w27NE6PP1i6EihWG70VdMIP0EmK_dYXd3dCwtpkFBs,6204 +ffsubsync/generic_subtitles.py,sha256=eq9M4p0sWIse_Ci46qSclOIiaxLmV5M4bM5XXh7y3u8,6218 ffsubsync/golden_section_search.py,sha256=hJjjORLTzN01Yaz2H95_3RFHxmPoJGAg3yPSdg_7IKI,1831 ffsubsync/sklearn_shim.py,sha256=KcnfAfCUMUDEWYiDooTZrAvWZSYsrRZhBZZn787NrrU,14569 ffsubsync/speech_transformers.py,sha256=msv1V5DIbkF3NSli2as0pJuSZQMgg1t2aWk867IS-pg,19267 -ffsubsync/subtitle_parser.py,sha256=Fttx6Qg_jpA33mbcRoYCp1RxpxEMPGfPWMx_HEPCN2c,6476 +ffsubsync/subtitle_parser.py,sha256=Edy5OYTyGxNgluFlz09qKLp96p2PvY9nlXoHqgdZNiU,6483 ffsubsync/subtitle_transformers.py,sha256=qxD-FDRLDHUdXBXtr25Y8eXVLlV_XPv8tt5UQUMekGE,4547 ffsubsync/version.py,sha256=GCDvVUjTaRo3LJ6PsWPopYN5eY6rjRFl3MdlxeH2nsI,1232 diff --git a/libs/ffsubsync-0.4.26.dist-info/REQUESTED b/libs/ffsubsync-0.4.27.dist-info/REQUESTED similarity index 100% rename from libs/ffsubsync-0.4.26.dist-info/REQUESTED rename to libs/ffsubsync-0.4.27.dist-info/REQUESTED diff --git a/libs/ffsubsync-0.4.26.dist-info/WHEEL b/libs/ffsubsync-0.4.27.dist-info/WHEEL similarity index 100% rename from libs/ffsubsync-0.4.26.dist-info/WHEEL rename to libs/ffsubsync-0.4.27.dist-info/WHEEL diff --git a/libs/ffsubsync-0.4.26.dist-info/entry_points.txt b/libs/ffsubsync-0.4.27.dist-info/entry_points.txt similarity index 100% rename from libs/ffsubsync-0.4.26.dist-info/entry_points.txt rename to libs/ffsubsync-0.4.27.dist-info/entry_points.txt diff --git a/libs/ffsubsync-0.4.26.dist-info/top_level.txt b/libs/ffsubsync-0.4.27.dist-info/top_level.txt similarity index 100% rename from libs/ffsubsync-0.4.26.dist-info/top_level.txt rename to libs/ffsubsync-0.4.27.dist-info/top_level.txt diff --git a/libs/ffsubsync/_version.py b/libs/ffsubsync/_version.py index e854c2ba1..4b43a6da3 100644 --- a/libs/ffsubsync/_version.py +++ b/libs/ffsubsync/_version.py @@ -8,11 +8,11 @@ version_json = ''' { - "date": "2024-10-15T19:36:49-0700", + "date": "2024-12-23T23:09:43-0800", "dirty": false, "error": null, - "full-revisionid": "bafd232a38769951c14c05669a69b2e8c150e1ae", - "version": "0.4.26" + "full-revisionid": "70ab16ffce283c86a1b66d8e35db351fbfbf2d19", + "version": "0.4.27" } ''' # END VERSION_JSON diff --git a/libs/ffsubsync/generic_subtitles.py b/libs/ffsubsync/generic_subtitles.py index 3e4b1ed0f..2dcf433ae 100644 --- a/libs/ffsubsync/generic_subtitles.py +++ b/libs/ffsubsync/generic_subtitles.py @@ -139,7 +139,7 @@ def write_file(self, fname: str) -> None: else: out_format = os.path.splitext(fname)[-1][1:] subs = list(self.gen_raw_resolved_subs()) - if self._sub_format in ("ssa", "ass"): + if self._sub_format in ("ssa", "ass", "vtt"): ssaf = pysubs2.SSAFile() ssaf.events = subs if self._styles is not None: @@ -149,7 +149,7 @@ def write_file(self, fname: str) -> None: if self._fonts_opaque is not None: ssaf.fonts_opaque = self._fonts_opaque to_write = ssaf.to_string(out_format) - elif self._sub_format == "srt" and out_format in ("ssa", "ass"): + elif self._sub_format == "srt" and out_format in ("ssa", "ass", "vtt"): to_write = pysubs2.SSAFile.from_string(srt.compose(subs)).to_string( out_format ) diff --git a/libs/ffsubsync/subtitle_parser.py b/libs/ffsubsync/subtitle_parser.py index b42d9bb9e..677bc184f 100644 --- a/libs/ffsubsync/subtitle_parser.py +++ b/libs/ffsubsync/subtitle_parser.py @@ -116,7 +116,7 @@ def fit(self, fname: str, *_) -> "GenericSubtitleParser": parsed_subs = srt.parse( decoded_subs, ignore_errors=not self._strict ) - elif self.sub_format in ("ass", "ssa", "sub"): + elif self.sub_format in ("ass", "ssa", "sub", "vtt"): parsed_subs = pysubs2.SSAFile.from_string(decoded_subs) else: raise NotImplementedError( diff --git a/libs/flask-3.0.3.dist-info/METADATA b/libs/flask-3.0.3.dist-info/METADATA index 5a0210724..f6c57113c 100644 --- a/libs/flask-3.0.3.dist-info/METADATA +++ b/libs/flask-3.0.3.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: Flask Version: 3.0.3 Summary: A simple framework for building complex web applications. diff --git a/libs/flask-3.0.3.dist-info/RECORD b/libs/flask-3.0.3.dist-info/RECORD index a3c5345b8..3d0eb0680 100644 --- a/libs/flask-3.0.3.dist-info/RECORD +++ b/libs/flask-3.0.3.dist-info/RECORD @@ -1,10 +1,10 @@ ../../bin/flask,sha256=mkfqP1bdu7Q1Kux98Y6YmUcCGO8FyMAkRMD3_v5My8s,231 flask-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 flask-3.0.3.dist-info/LICENSE.txt,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -flask-3.0.3.dist-info/METADATA,sha256=exPahy4aahjV-mYqd9qb5HNP8haB_IxTuaotoSvCtag,3177 +flask-3.0.3.dist-info/METADATA,sha256=-GseG-fPuzoaGGjjQphGgkch9Xj7zOaXM01CsgSsBWk,3177 flask-3.0.3.dist-info/RECORD,, flask-3.0.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -flask-3.0.3.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +flask-3.0.3.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 flask-3.0.3.dist-info/entry_points.txt,sha256=bBP7hTOS5fz9zLtC7sPofBZAlMkEvBxu7KqS6l5lvc4,40 flask/__init__.py,sha256=6xMqdVA0FIQ2U1KVaGX3lzNCdXPzoHPaa0hvQCNcfSk,2625 flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 diff --git a/libs/flask-3.0.3.dist-info/WHEEL b/libs/flask-3.0.3.dist-info/WHEEL index 3b5e64b5e..e3c6feefa 100644 --- a/libs/flask-3.0.3.dist-info/WHEEL +++ b/libs/flask-3.0.3.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: flit 3.9.0 +Generator: flit 3.10.1 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/flask_socketio/__init__.py b/libs/flask_socketio/__init__.py index e651da4b0..219f30cd6 100644 --- a/libs/flask_socketio/__init__.py +++ b/libs/flask_socketio/__init__.py @@ -33,15 +33,13 @@ class _SocketIOMiddleware(socketio.WSGIApp): """ def __init__(self, socketio_app, flask_app, socketio_path='socket.io'): self.flask_app = flask_app - super(_SocketIOMiddleware, self).__init__(socketio_app, - flask_app.wsgi_app, - socketio_path=socketio_path) + super().__init__(socketio_app, flask_app.wsgi_app, + socketio_path=socketio_path) def __call__(self, environ, start_response): environ = environ.copy() environ['flask.app'] = self.flask_app - return super(_SocketIOMiddleware, self).__call__(environ, - start_response) + return super().__call__(environ, start_response) class _ManagedSession(dict, SessionMixin): @@ -51,7 +49,7 @@ class _ManagedSession(dict, SessionMixin): pass -class SocketIO(object): +class SocketIO: """Create a Flask-SocketIO server. :param app: The flask application instance. If the application instance @@ -167,6 +165,7 @@ class SocketIO(object): fatal errors are logged even when ``engineio_logger`` is ``False``. """ + reason = socketio.Server.reason def __init__(self, app=None, **kwargs): self.server = None @@ -204,7 +203,7 @@ def init_app(self, app, **kwargs): if url: if url.startswith(('redis://', "rediss://")): queue_class = socketio.RedisManager - elif url.startswith(('kafka://')): + elif url.startswith('kafka://'): queue_class = socketio.KafkaManager elif url.startswith('zmq'): queue_class = socketio.ZmqManager @@ -220,7 +219,7 @@ def init_app(self, app, **kwargs): # changes when it is invoked inside or outside the app context # so here to prevent any ambiguities we replace it with wrappers # that ensure that the app context is always present - class FlaskSafeJSON(object): + class FlaskSafeJSON: @staticmethod def dumps(*args, **kwargs): with app.app_context(): @@ -697,17 +696,15 @@ def run_server(): from gevent import pywsgi try: from geventwebsocket.handler import WebSocketHandler - websocket = True + gevent_websocket = True except ImportError: - app.logger.warning( - 'WebSocket transport not available. Install ' - 'gevent-websocket for improved performance.') - websocket = False + # WebSocket support will come from the simple-websocket package + gevent_websocket = False log = 'default' if not log_output: log = None - if websocket: + if gevent_websocket: self.wsgi_server = pywsgi.WSGIServer( (host, port), app, handler_class=WebSocketHandler, log=log, **kwargs) diff --git a/libs/flask_socketio/namespace.py b/libs/flask_socketio/namespace.py index 8c447f5fc..541fa793e 100644 --- a/libs/flask_socketio/namespace.py +++ b/libs/flask_socketio/namespace.py @@ -3,7 +3,7 @@ class Namespace(_Namespace): def __init__(self, namespace=None): - super(Namespace, self).__init__(namespace) + super().__init__(namespace) self.socketio = None def _set_socketio(self, socketio): @@ -22,8 +22,16 @@ def trigger_event(self, event, *args): # there is no handler for this event, so we ignore it return handler = getattr(self, handler_name) - return self.socketio._handle_event(handler, event, self.namespace, - *args) + try: + return self.socketio._handle_event(handler, event, self.namespace, + *args) + except TypeError: + if event == 'disconnect': + # legacy disconnect events do not have the reason argument + return self.socketio._handle_event( + handler, event, self.namespace, *args[:-1]) + else: + raise def emit(self, event, data=None, room=None, include_self=True, namespace=None, callback=None): diff --git a/libs/flask_socketio/test_client.py b/libs/flask_socketio/test_client.py index 0603d77c7..312bac1d3 100644 --- a/libs/flask_socketio/test_client.py +++ b/libs/flask_socketio/test_client.py @@ -5,7 +5,7 @@ from werkzeug.test import EnvironBuilder -class SocketIOTestClient(object): +class SocketIOTestClient: """ This class is useful for testing a Flask-SocketIO server. It works in a similar way to the Flask Test Client, but adapted to the Socket.IO server. diff --git a/libs/inflect-7.4.0.dist-info/RECORD b/libs/inflect-7.4.0.dist-info/RECORD index 197ff1657..82e7c9ff4 100644 --- a/libs/inflect-7.4.0.dist-info/RECORD +++ b/libs/inflect-7.4.0.dist-info/RECORD @@ -3,7 +3,7 @@ inflect-7.4.0.dist-info/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR inflect-7.4.0.dist-info/METADATA,sha256=MV9Pl_30VbIbBxTU6A6sw-H9g6caHnyx2OYY2ZP0Spg,21265 inflect-7.4.0.dist-info/RECORD,, inflect-7.4.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -inflect-7.4.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +inflect-7.4.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 inflect-7.4.0.dist-info/top_level.txt,sha256=m52ujdp10CqT6jh1XQxZT6kEntcnv-7Tl7UiGNTzWZA,8 inflect/__init__.py,sha256=BsJ4xVkg2TcttXL0zl43ZAR55IOmj54XSddEuxyD2bc,103635 inflect/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/inflect-7.4.0.dist-info/WHEEL b/libs/inflect-7.4.0.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/inflect-7.4.0.dist-info/WHEEL +++ b/libs/inflect-7.4.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/jinja2-3.1.4.dist-info/RECORD b/libs/jinja2-3.1.4.dist-info/RECORD deleted file mode 100644 index 2c1de103a..000000000 --- a/libs/jinja2-3.1.4.dist-info/RECORD +++ /dev/null @@ -1,33 +0,0 @@ -jinja2-3.1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -jinja2-3.1.4.dist-info/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -jinja2-3.1.4.dist-info/METADATA,sha256=R_brzpPQVBvpGcsm-WbrtgotO7suQ1D0F-qkhTzeEfY,2640 -jinja2-3.1.4.dist-info/RECORD,, -jinja2-3.1.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2-3.1.4.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -jinja2-3.1.4.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 -jinja2/__init__.py,sha256=wIl45IM20KGw-kfr7jJhaBxxX5g4-kihlBYjxopX7Pw,1928 -jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 -jinja2/async_utils.py,sha256=JXKWCAXmTx0iZB4-hAsF50vgjxw_RJTjiLOlGGTBso0,2477 -jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 -jinja2/compiler.py,sha256=dpV-n6_iQUP4uSwlXwGUavJmwjvXdyxKzJ-AonFjPBk,72271 -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=xhFkmxO0CESA76Ki5tz4XWq9yzGu-t0p93JCCVBVNps,61538 -jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 -jinja2/ext.py,sha256=igsBH7c6C0byHaOtMbE-ugpt4GjLGgR-ywskyXtKgq8,31877 -jinja2/filters.py,sha256=bKeqjFjjz88TkHVLSyyMIEB75CzAN6b3Airgx0phJDg,54611 -jinja2/idtracking.py,sha256=GfNmadir4oDALVxzn3DL9YInhJDr69ebXeA2ygfuCGA,10704 -jinja2/lexer.py,sha256=xnWWXhPndHFsoqzpc5VTjheDE9JuKk9MUo9DZkrM8Os,29754 -jinja2/loaders.py,sha256=ru0GIWHo5KiHJi7_MoI_LvGDoBBvP6rd0hiC1ReaTwk,23167 -jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 -jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 -jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 -jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 -jinja2/parser.py,sha256=DV1iF1FR2Rsaj_5zl8rmx7j6Bj4S8iLHoYsvJ0bfEis,39890 -jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -jinja2/runtime.py,sha256=POXT3tKNKJRENx2CymwUsOOXH2JwGPjW702njB5__cQ,33435 -jinja2/sandbox.py,sha256=TJjBNS9qRJ2ZgBMWdAgRBpyDLOHea2kT-2mk4PrjYx0,14616 -jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 -jinja2/utils.py,sha256=nV7IpWLvRCMyHW1irBAK8CIPAnOFfkb2ukggDBjbBEY,23952 -jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/libs/jinja2-3.1.4.dist-info/INSTALLER b/libs/jinja2-3.1.5.dist-info/INSTALLER similarity index 100% rename from libs/jinja2-3.1.4.dist-info/INSTALLER rename to libs/jinja2-3.1.5.dist-info/INSTALLER diff --git a/libs/jinja2-3.1.4.dist-info/LICENSE.txt b/libs/jinja2-3.1.5.dist-info/LICENSE.txt similarity index 100% rename from libs/jinja2-3.1.4.dist-info/LICENSE.txt rename to libs/jinja2-3.1.5.dist-info/LICENSE.txt diff --git a/libs/jinja2-3.1.4.dist-info/METADATA b/libs/jinja2-3.1.5.dist-info/METADATA similarity index 88% rename from libs/jinja2-3.1.4.dist-info/METADATA rename to libs/jinja2-3.1.5.dist-info/METADATA index 265cc32e1..6d0348d9d 100644 --- a/libs/jinja2-3.1.4.dist-info/METADATA +++ b/libs/jinja2-3.1.5.dist-info/METADATA @@ -1,6 +1,6 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: Jinja2 -Version: 3.1.4 +Version: 3.1.5 Summary: A very fast and expressive template engine. Maintainer-email: Pallets <contact@palletsprojects.com> Requires-Python: >=3.7 @@ -52,18 +52,17 @@ restricting functionality too much. ## In A Nutshell -.. code-block:: jinja - - {% extends "base.html" %} - {% block title %}Members{% endblock %} - {% block content %} - <ul> - {% for user in users %} - <li><a href="{{ user.url }}">{{ user.username }}</a></li> - {% endfor %} - </ul> - {% endblock %} - +```jinja +{% extends "base.html" %} +{% block title %}Members{% endblock %} +{% block content %} + <ul> + {% for user in users %} + <li><a href="{{ user.url }}">{{ user.username }}</a></li> + {% endfor %} + </ul> +{% endblock %} +``` ## Donate diff --git a/libs/jinja2-3.1.5.dist-info/RECORD b/libs/jinja2-3.1.5.dist-info/RECORD new file mode 100644 index 000000000..35ef2e15e --- /dev/null +++ b/libs/jinja2-3.1.5.dist-info/RECORD @@ -0,0 +1,33 @@ +jinja2-3.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2-3.1.5.dist-info/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +jinja2-3.1.5.dist-info/METADATA,sha256=PJNSUFNBwoqGA2vce2XSP8M_p2EYqAHYI7hoWLABtFo,2593 +jinja2-3.1.5.dist-info/RECORD,, +jinja2-3.1.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2-3.1.5.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 +jinja2-3.1.5.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 +jinja2/__init__.py,sha256=zpt8UHzpS2eB1c04kn1LkKkaXLXXcKd33klq7UJGIgg,1928 +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 +jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 +jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 +jinja2/filters.py,sha256=cvRI2pqXNMzw8ba41VOBpgu_wu1r-l1_QxwD6yVoJ5g,55025 +jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 +jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 +jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 +jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 +jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 +jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 +jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 +jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 +jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 +jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/libs/jinja2-3.1.4.dist-info/REQUESTED b/libs/jinja2-3.1.5.dist-info/REQUESTED similarity index 100% rename from libs/jinja2-3.1.4.dist-info/REQUESTED rename to libs/jinja2-3.1.5.dist-info/REQUESTED diff --git a/libs/jinja2-3.1.5.dist-info/WHEEL b/libs/jinja2-3.1.5.dist-info/WHEEL new file mode 100644 index 000000000..e3c6feefa --- /dev/null +++ b/libs/jinja2-3.1.5.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.10.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/libs/jinja2-3.1.4.dist-info/entry_points.txt b/libs/jinja2-3.1.5.dist-info/entry_points.txt similarity index 100% rename from libs/jinja2-3.1.4.dist-info/entry_points.txt rename to libs/jinja2-3.1.5.dist-info/entry_points.txt diff --git a/libs/jinja2/__init__.py b/libs/jinja2/__init__.py index 2f0b5b286..d669f295b 100644 --- a/libs/jinja2/__init__.py +++ b/libs/jinja2/__init__.py @@ -35,4 +35,4 @@ from .utils import pass_eval_context as pass_eval_context from .utils import select_autoescape as select_autoescape -__version__ = "3.1.4" +__version__ = "3.1.5" diff --git a/libs/jinja2/async_utils.py b/libs/jinja2/async_utils.py index e65219e49..f0c140205 100644 --- a/libs/jinja2/async_utils.py +++ b/libs/jinja2/async_utils.py @@ -6,6 +6,9 @@ from .utils import _PassArg from .utils import pass_eval_context +if t.TYPE_CHECKING: + import typing_extensions as te + V = t.TypeVar("V") @@ -64,18 +67,30 @@ async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": if inspect.isawaitable(value): return await t.cast("t.Awaitable[V]", value) - return t.cast("V", value) + return value + + +class _IteratorToAsyncIterator(t.Generic[V]): + def __init__(self, iterator: "t.Iterator[V]"): + self._iterator = iterator + + def __aiter__(self) -> "te.Self": + return self + + async def __anext__(self) -> V: + try: + return next(self._iterator) + except StopIteration as e: + raise StopAsyncIteration(e.value) from e -async def auto_aiter( +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 + return iterable.__aiter__() else: - for item in iterable: - yield item + return _IteratorToAsyncIterator(iter(iterable)) async def auto_to_list( diff --git a/libs/jinja2/compiler.py b/libs/jinja2/compiler.py index 274071750..a4ff6a1b1 100644 --- a/libs/jinja2/compiler.py +++ b/libs/jinja2/compiler.py @@ -55,7 +55,7 @@ def new_func( return f(self, node, frame, **kwargs) - return update_wrapper(t.cast(F, new_func), f) + return update_wrapper(new_func, f) # type: ignore[return-value] def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: @@ -216,7 +216,7 @@ def __init__( # or compile time. self.soft_frame = False - def copy(self) -> "Frame": + def copy(self) -> "te.Self": """Create a copy of the current one.""" rv = object.__new__(self.__class__) rv.__dict__.update(self.__dict__) @@ -229,7 +229,7 @@ def inner(self, isolated: bool = False) -> "Frame": return Frame(self.eval_ctx, level=self.symbols.level + 1) return Frame(self.eval_ctx, self) - def soft(self) -> "Frame": + def soft(self) -> "te.Self": """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. @@ -811,7 +811,7 @@ def pop_assign_tracking(self, frame: Frame) -> None: self.writeline("_block_vars.update({") else: self.writeline("context.vars.update({") - for idx, name in enumerate(vars): + for idx, name in enumerate(sorted(vars)): if idx: self.write(", ") ref = frame.symbols.ref(name) @@ -821,7 +821,7 @@ def pop_assign_tracking(self, frame: Frame) -> None: if len(public_names) == 1: self.writeline(f"context.exported_vars.add({public_names[0]!r})") else: - names_str = ", ".join(map(repr, public_names)) + names_str = ", ".join(map(repr, sorted(public_names))) self.writeline(f"context.exported_vars.update(({names_str}))") # -- Statement Visitors @@ -902,12 +902,15 @@ def visit_Template( 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.writeline("agen = parent_template.root_render_func(context)") + self.writeline("try:") + self.indent() + self.writeline("async for event in agen:") self.indent() self.writeline("yield event") self.outdent() + self.outdent() + self.writeline("finally: await agen.aclose()") self.outdent(1 + (not self.has_known_extends)) # at this point we now have the blocks collected and can visit them too. @@ -977,14 +980,20 @@ def visit_Block(self, node: nodes.Block, frame: Frame) -> None: f"yield from context.blocks[{node.name!r}][0]({context})", node ) else: + self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") + self.writeline("try:") + self.indent() self.writeline( - f"{self.choose_async()}for event in" - f" context.blocks[{node.name!r}][0]({context}):", + f"{self.choose_async()}for event in gen:", node, ) self.indent() self.simple_write("event", frame) self.outdent() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) self.outdent(level) @@ -1057,26 +1066,33 @@ def visit_Include(self, node: nodes.Include, frame: Frame) -> None: self.writeline("else:") self.indent() - skip_event_yield = False + def loop_body() -> None: + self.indent() + self.simple_write("event", frame) + self.outdent() + if node.with_context: self.writeline( - f"{self.choose_async()}for event in template.root_render_func(" + f"gen = template.root_render_func(" "template.new_context(context.get_all(), True," - f" {self.dump_local_context(frame)})):" + f" {self.dump_local_context(frame)}))" + ) + self.writeline("try:") + self.indent() + self.writeline(f"{self.choose_async()}for event in gen:") + loop_body() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" ) elif self.environment.is_async: self.writeline( "for event in (await template._get_default_module_async())" "._body_stream:" ) + loop_body() 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() @@ -1125,9 +1141,14 @@ def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: ) self.writeline(f"if {frame.symbols.ref(alias)} is missing:") self.indent() + # The position will contain the template name, and will be formatted + # into a string that will be compiled into an f-string. Curly braces + # in the name must be replaced with escapes so that they will not be + # executed as part of the f-string. + position = self.position(node).replace("{", "{{").replace("}", "}}") message = ( "the template {included_template.__name__!r}" - f" (imported on {self.position(node)})" + f" (imported on {position})" f" does not export the requested name {name!r}" ) self.writeline( @@ -1560,6 +1581,29 @@ def visit_Output(self, node: nodes.Output, frame: Frame) -> None: def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: self.push_assign_tracking() + + # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, + # it is only valid if it references a Namespace object. Emit a check for + # that for each ref here, before assignment code is emitted. This can't + # be done in visit_NSRef as the ref could be in the middle of a tuple. + seen_refs: t.Set[str] = set() + + for nsref in node.find_all(nodes.NSRef): + if nsref.name in seen_refs: + # Only emit the check for each reference once, in case the same + # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. + continue + + seen_refs.add(nsref.name) + ref = frame.symbols.ref(nsref.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.newline(node) self.visit(node.target, frame) self.write(" = ") @@ -1616,17 +1660,11 @@ def visit_Name(self, node: nodes.Name, frame: Frame) -> None: 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 + # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. + # visit_Assign emits code to validate that each ref is to a Namespace + # object only. That can't be emitted here as the ref could be in the + # middle of a tuple assignment. 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: diff --git a/libs/jinja2/debug.py b/libs/jinja2/debug.py index 7ed7e9297..eeeeee78b 100644 --- a/libs/jinja2/debug.py +++ b/libs/jinja2/debug.py @@ -152,7 +152,7 @@ def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any available at that point in the template. """ # Start with the current template context. - ctx: "t.Optional[Context]" = real_locals.get("context") + ctx: t.Optional[Context] = real_locals.get("context") if ctx is not None: data: t.Dict[str, t.Any] = ctx.get_all().copy() diff --git a/libs/jinja2/environment.py b/libs/jinja2/environment.py index 1d3be0bed..0fc6e5be8 100644 --- a/libs/jinja2/environment.py +++ b/libs/jinja2/environment.py @@ -123,7 +123,7 @@ def load_extensions( return result -def _environment_config_check(environment: "Environment") -> "Environment": +def _environment_config_check(environment: _env_bound) -> _env_bound: """Perform a sanity check on the environment.""" assert issubclass( environment.undefined, Undefined @@ -406,8 +406,8 @@ def overlay( cache_size: int = missing, auto_reload: bool = missing, bytecode_cache: t.Optional["BytecodeCache"] = missing, - enable_async: bool = False, - ) -> "Environment": + enable_async: bool = missing, + ) -> "te.Self": """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 @@ -419,8 +419,11 @@ def overlay( copied over so modifications on the original environment may not shine through. + .. versionchanged:: 3.1.5 + ``enable_async`` is applied correctly. + .. versionchanged:: 3.1.2 - Added the ``newline_sequence``,, ``keep_trailing_newline``, + Added the ``newline_sequence``, ``keep_trailing_newline``, and ``enable_async`` parameters to match ``__init__``. """ args = dict(locals()) @@ -706,7 +709,7 @@ def _compile(self, source: str, filename: str) -> CodeType: return compile(source, filename, "exec") @typing.overload - def compile( # type: ignore + def compile( self, source: t.Union[str, nodes.Template], name: t.Optional[str] = None, @@ -1248,7 +1251,7 @@ def _from_namespace( namespace: t.MutableMapping[str, t.Any], globals: t.MutableMapping[str, t.Any], ) -> "Template": - t: "Template" = object.__new__(cls) + t: Template = object.__new__(cls) t.environment = environment t.globals = globals t.name = namespace["name"] @@ -1282,19 +1285,7 @@ def render(self, *args: t.Any, **kwargs: t.Any) -> str: if self.environment.is_async: import asyncio - close = False - - try: - loop = asyncio.get_running_loop() - except RuntimeError: - loop = asyncio.new_event_loop() - close = True - - try: - return loop.run_until_complete(self.render_async(*args, **kwargs)) - finally: - if close: - loop.close() + return asyncio.run(self.render_async(*args, **kwargs)) ctx = self.new_context(dict(*args, **kwargs)) @@ -1358,7 +1349,7 @@ async def to_list() -> t.List[str]: async def generate_async( self, *args: t.Any, **kwargs: t.Any - ) -> t.AsyncIterator[str]: + ) -> t.AsyncGenerator[str, object]: """An async version of :meth:`generate`. Works very similarly but returns an async iterator instead. """ @@ -1370,8 +1361,14 @@ async def generate_async( ctx = self.new_context(dict(*args, **kwargs)) try: - async for event in self.root_render_func(ctx): # type: ignore - yield event + agen = self.root_render_func(ctx) + try: + async for event in agen: # type: ignore + yield event + finally: + # we can't use async with aclosing(...) because that's only + # in 3.10+ + await agen.aclose() # type: ignore except Exception: yield self.environment.handle_exception() diff --git a/libs/jinja2/ext.py b/libs/jinja2/ext.py index 8d0810cd4..c7af8d45f 100644 --- a/libs/jinja2/ext.py +++ b/libs/jinja2/ext.py @@ -89,7 +89,7 @@ def __init_subclass__(cls) -> None: def __init__(self, environment: Environment) -> None: self.environment = environment - def bind(self, environment: Environment) -> "Extension": + def bind(self, environment: Environment) -> "te.Self": """Create a copy of this extension bound to another environment.""" rv = object.__new__(self.__class__) rv.__dict__.update(self.__dict__) diff --git a/libs/jinja2/filters.py b/libs/jinja2/filters.py index acd11976e..e5b5a00c5 100644 --- a/libs/jinja2/filters.py +++ b/libs/jinja2/filters.py @@ -438,7 +438,7 @@ def do_sort( @pass_environment -def do_unique( +def sync_do_unique( environment: "Environment", value: "t.Iterable[V]", case_sensitive: bool = False, @@ -470,6 +470,18 @@ def do_unique( yield item +@async_variant(sync_do_unique) # type: ignore +async def do_unique( + environment: "Environment", + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", + case_sensitive: bool = False, + attribute: t.Optional[t.Union[str, int]] = None, +) -> "t.Iterator[V]": + return sync_do_unique( + environment, await auto_to_list(value), case_sensitive, attribute + ) + + def _min_or_max( environment: "Environment", value: "t.Iterable[V]", @@ -987,7 +999,7 @@ def do_int(value: t.Any, default: int = 0, base: int = 10) -> int: # this quirk is necessary so that "42.23"|int gives 42. try: return int(float(value)) - except (TypeError, ValueError): + except (TypeError, ValueError, OverflowError): return default @@ -1116,7 +1128,7 @@ def do_batch( {%- endfor %} </table> """ - tmp: "t.List[V]" = [] + tmp: t.List[V] = [] for item in value: if len(tmp) == linecount: @@ -1629,8 +1641,8 @@ def sync_do_selectattr( .. code-block:: python - (u for user in users if user.is_active) - (u for user in users if test_none(user.email)) + (user for user in users if user.is_active) + (user for user in users if test_none(user.email)) .. versionadded:: 2.7 """ @@ -1667,8 +1679,8 @@ def sync_do_rejectattr( .. code-block:: python - (u for user in users if not user.is_active) - (u for user in users if not test_none(user.email)) + (user for user in users if not user.is_active) + (user for user in users if not test_none(user.email)) .. versionadded:: 2.7 """ @@ -1768,7 +1780,7 @@ def transfunc(x: V) -> V: args = args[1 + off :] def func(item: t.Any) -> t.Any: - return context.environment.call_test(name, item, args, kwargs) + return context.environment.call_test(name, item, args, kwargs, context) except LookupError: func = bool # type: ignore diff --git a/libs/jinja2/idtracking.py b/libs/jinja2/idtracking.py index 995ebaa0c..e6dd8cd11 100644 --- a/libs/jinja2/idtracking.py +++ b/libs/jinja2/idtracking.py @@ -3,6 +3,9 @@ from . import nodes from .visitor import NodeVisitor +if t.TYPE_CHECKING: + import typing_extensions as te + VAR_LOAD_PARAMETER = "param" VAR_LOAD_RESOLVE = "resolve" VAR_LOAD_ALIAS = "alias" @@ -83,7 +86,7 @@ def ref(self, name: str) -> str: ) return rv - def copy(self) -> "Symbols": + def copy(self) -> "te.Self": rv = object.__new__(self.__class__) rv.__dict__.update(self.__dict__) rv.refs = self.refs.copy() @@ -118,23 +121,20 @@ def load(self, name: str) -> None: self._define_ref(name, load=(VAR_LOAD_RESOLVE, name)) def branch_update(self, branch_symbols: t.Sequence["Symbols"]) -> None: - stores: t.Dict[str, int] = {} + stores: t.Set[str] = set() + for branch in branch_symbols: - for target in branch.stores: - if target in self.stores: - continue - stores[target] = stores.get(target, 0) + 1 + stores.update(branch.stores) + + stores.difference_update(self.stores) for sym in branch_symbols: self.refs.update(sym.refs) self.loads.update(sym.loads) self.stores.update(sym.stores) - for name, branch_count in stores.items(): - if branch_count == len(branch_symbols): - continue - - target = self.find_ref(name) # type: ignore + for name in stores: + target = self.find_ref(name) assert target is not None, "should not happen" if self.parent is not None: @@ -146,7 +146,7 @@ def branch_update(self, branch_symbols: t.Sequence["Symbols"]) -> None: def dump_stores(self) -> t.Dict[str, str]: rv: t.Dict[str, str] = {} - node: t.Optional["Symbols"] = self + node: t.Optional[Symbols] = self while node is not None: for name in sorted(node.stores): @@ -159,7 +159,7 @@ def dump_stores(self) -> t.Dict[str, str]: def dump_param_targets(self) -> t.Set[str]: rv = set() - node: t.Optional["Symbols"] = self + node: t.Optional[Symbols] = self while node is not None: for target, (instr, _) in self.loads.items(): diff --git a/libs/jinja2/lexer.py b/libs/jinja2/lexer.py index 62b0471a3..9b1c96979 100644 --- a/libs/jinja2/lexer.py +++ b/libs/jinja2/lexer.py @@ -262,7 +262,7 @@ def __init__( self.message = message self.error_class = cls - def __call__(self, lineno: int, filename: str) -> "te.NoReturn": + def __call__(self, lineno: int, filename: t.Optional[str]) -> "te.NoReturn": raise self.error_class(self.message, lineno, filename) @@ -329,7 +329,7 @@ def __init__( filename: t.Optional[str], ): self._iter = iter(generator) - self._pushed: "te.Deque[Token]" = deque() + self._pushed: te.Deque[Token] = deque() self.name = name self.filename = filename self.closed = False @@ -757,7 +757,7 @@ def tokeniter( for idx, token in enumerate(tokens): # failure group - if token.__class__ is Failure: + if isinstance(token, Failure): raise token(lineno, filename) # bygroup is a bit more complex, in that case we # yield for the current token the first named @@ -778,7 +778,7 @@ def tokeniter( data = groups[idx] if data or token not in ignore_if_empty: - yield lineno, token, data + yield lineno, token, data # type: ignore[misc] lineno += data.count("\n") + newlines_stripped newlines_stripped = 0 diff --git a/libs/jinja2/loaders.py b/libs/jinja2/loaders.py index 9eaf647ba..3913ee51e 100644 --- a/libs/jinja2/loaders.py +++ b/libs/jinja2/loaders.py @@ -204,7 +204,12 @@ def get_source( if os.path.isfile(filename): break else: - raise TemplateNotFound(template) + plural = "path" if len(self.searchpath) == 1 else "paths" + paths_str = ", ".join(repr(p) for p in self.searchpath) + raise TemplateNotFound( + template, + f"{template!r} not found in search {plural}: {paths_str}", + ) with open(filename, encoding=self.encoding) as f: contents = f.read() @@ -238,6 +243,30 @@ def list_templates(self) -> t.List[str]: return sorted(found) +if sys.version_info >= (3, 13): + + def _get_zipimporter_files(z: t.Any) -> t.Dict[str, object]: + try: + get_files = z._get_files + except AttributeError as e: + raise TypeError( + "This zip import does not have the required" + " metadata to list templates." + ) from e + return get_files() +else: + + def _get_zipimporter_files(z: t.Any) -> t.Dict[str, object]: + try: + files = z._files + except AttributeError as e: + raise TypeError( + "This zip import does not have the required" + " metadata to list templates." + ) from e + return files # type: ignore[no-any-return] + + class PackageLoader(BaseLoader): """Load templates from a directory in a Python package. @@ -298,7 +327,6 @@ def __init__( assert loader is not None, "A loader was not found for the package." self._loader = loader self._archive = None - template_root = None if isinstance(loader, zipimport.zipimporter): self._archive = loader.archive @@ -315,18 +343,23 @@ def __init__( elif spec.origin is not None: roots.append(os.path.dirname(spec.origin)) + if not roots: + raise ValueError( + f"The {package_name!r} package was not installed in a" + " way that PackageLoader understands." + ) + for root in roots: root = os.path.join(root, package_path) if os.path.isdir(root): template_root = root break - - if template_root is None: - raise ValueError( - f"The {package_name!r} package was not installed in a" - " way that PackageLoader understands." - ) + else: + raise ValueError( + f"PackageLoader could not find a {package_path!r} directory" + f" in the {package_name!r} package." + ) self._template_root = template_root @@ -382,11 +415,7 @@ def list_templates(self) -> t.List[str]: for name in filenames ) else: - if not hasattr(self._loader, "_files"): - raise TypeError( - "This zip import does not have the required" - " metadata to list templates." - ) + files = _get_zipimporter_files(self._loader) # Package is a zip file. prefix = ( @@ -395,7 +424,7 @@ def list_templates(self) -> t.List[str]: ) offset = len(prefix) - for name in self._loader._files.keys(): + for name in files: # Find names under the templates directory that aren't directories. if name.startswith(prefix) and name[-1] != os.path.sep: results.append(name[offset:].replace(os.path.sep, "/")) @@ -410,7 +439,7 @@ class DictLoader(BaseLoader): >>> loader = DictLoader({'index.html': 'source here'}) - Because auto reloading is rarely useful this is disabled per default. + Because auto reloading is rarely useful this is disabled by default. """ def __init__(self, mapping: t.Mapping[str, str]) -> None: @@ -593,10 +622,7 @@ class ModuleLoader(BaseLoader): Example usage: - >>> loader = ChoiceLoader([ - ... ModuleLoader('/path/to/compiled/templates'), - ... FileSystemLoader('/path/to/templates') - ... ]) + >>> loader = ModuleLoader('/path/to/compiled/templates') Templates can be precompiled with :meth:`Environment.compile_templates`. """ diff --git a/libs/jinja2/parser.py b/libs/jinja2/parser.py index 0ec997fb4..f4117754a 100644 --- a/libs/jinja2/parser.py +++ b/libs/jinja2/parser.py @@ -64,7 +64,7 @@ def __init__( self.filename = filename self.closed = False self.extensions: t.Dict[ - str, t.Callable[["Parser"], t.Union[nodes.Node, t.List[nodes.Node]]] + str, t.Callable[[Parser], t.Union[nodes.Node, t.List[nodes.Node]]] ] = {} for extension in environment.iter_extensions(): for tag in extension.tags: @@ -487,21 +487,18 @@ def parse_assign_target( """ target: nodes.Expr - if with_namespace and self.stream.look().type == "dot": - token = self.stream.expect("name") - next(self.stream) # dot - attr = self.stream.expect("name") - target = nodes.NSRef(token.value, attr.value, lineno=token.lineno) - elif name_only: + if name_only: token = self.stream.expect("name") target = nodes.Name(token.value, "store", lineno=token.lineno) else: if with_tuple: target = self.parse_tuple( - simplified=True, extra_end_rules=extra_end_rules + simplified=True, + extra_end_rules=extra_end_rules, + with_namespace=with_namespace, ) else: - target = self.parse_primary() + target = self.parse_primary(with_namespace=with_namespace) target.set_ctx("store") @@ -643,17 +640,25 @@ def parse_unary(self, with_filter: bool = True) -> nodes.Expr: node = self.parse_filter_expr(node) return node - def parse_primary(self) -> nodes.Expr: + def parse_primary(self, with_namespace: bool = False) -> nodes.Expr: + """Parse a name or literal value. If ``with_namespace`` is enabled, also + parse namespace attr refs, for use in assignments.""" token = self.stream.current node: nodes.Expr if token.type == "name": + next(self.stream) if token.value in ("true", "false", "True", "False"): node = nodes.Const(token.value in ("true", "True"), lineno=token.lineno) elif token.value in ("none", "None"): node = nodes.Const(None, lineno=token.lineno) + elif with_namespace and self.stream.current.type == "dot": + # If namespace attributes are allowed at this point, and the next + # token is a dot, produce a namespace reference. + next(self.stream) + attr = self.stream.expect("name") + node = nodes.NSRef(token.value, attr.value, lineno=token.lineno) else: node = nodes.Name(token.value, "load", lineno=token.lineno) - next(self.stream) elif token.type == "string": next(self.stream) buf = [token.value] @@ -683,6 +688,7 @@ def parse_tuple( with_condexpr: bool = True, extra_end_rules: t.Optional[t.Tuple[str, ...]] = None, explicit_parentheses: bool = False, + with_namespace: bool = False, ) -> t.Union[nodes.Tuple, nodes.Expr]: """Works like `parse_expression` but if multiple expressions are delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created. @@ -690,8 +696,9 @@ def parse_tuple( if no commas where found. The default parsing mode is a full tuple. If `simplified` is `True` - only names and literals are parsed. The `no_condexpr` parameter is - forwarded to :meth:`parse_expression`. + only names and literals are parsed; ``with_namespace`` allows namespace + attr refs as well. The `no_condexpr` parameter is forwarded to + :meth:`parse_expression`. Because tuples do not require delimiters and may end in a bogus comma an extra hint is needed that marks the end of a tuple. For example @@ -704,13 +711,14 @@ def parse_tuple( """ lineno = self.stream.current.lineno if simplified: - parse = self.parse_primary - elif with_condexpr: - parse = self.parse_expression + + def parse() -> nodes.Expr: + return self.parse_primary(with_namespace=with_namespace) + else: def parse() -> nodes.Expr: - return self.parse_expression(with_condexpr=False) + return self.parse_expression(with_condexpr=with_condexpr) args: t.List[nodes.Expr] = [] is_tuple = False diff --git a/libs/jinja2/runtime.py b/libs/jinja2/runtime.py index 4325c8deb..09119e2ae 100644 --- a/libs/jinja2/runtime.py +++ b/libs/jinja2/runtime.py @@ -172,7 +172,7 @@ def __init__( ): self.parent = parent self.vars: t.Dict[str, t.Any] = {} - self.environment: "Environment" = environment + self.environment: Environment = environment self.eval_ctx = EvalContext(self.environment, name) self.exported_vars: t.Set[str] = set() self.name = name @@ -367,7 +367,7 @@ def super(self) -> t.Union["BlockReference", "Undefined"]: @internalcode async def _async_call(self) -> str: - rv = concat( + rv = self._context.environment.concat( # type: ignore [x async for x in self._stack[self._depth](self._context)] # type: ignore ) @@ -381,7 +381,9 @@ def __call__(self) -> str: if self._context.environment.is_async: return self._async_call() # type: ignore - rv = concat(self._stack[self._depth](self._context)) + rv = self._context.environment.concat( # type: ignore + self._stack[self._depth](self._context) + ) if self._context.eval_ctx.autoescape: return Markup(rv) @@ -792,8 +794,8 @@ def __repr__(self) -> str: class Undefined: - """The default undefined type. This undefined type can be printed and - iterated over, but every other access will raise an :exc:`UndefinedError`: + """The default undefined type. This can be printed, iterated, and treated as + a boolean. Any other operation will raise an :exc:`UndefinedError`. >>> foo = Undefined(name='foo') >>> str(foo) @@ -858,7 +860,11 @@ def _fail_with_undefined_error( @internalcode def __getattr__(self, name: str) -> t.Any: - if name[:2] == "__": + # Raise AttributeError on requests for names that appear to be unimplemented + # dunder methods to keep Python's internal protocol probing behaviors working + # properly in cases where another exception type could cause unexpected or + # difficult-to-diagnose failures. + if name[:2] == "__" and name[-2:] == "__": raise AttributeError(name) return self._fail_with_undefined_error() @@ -982,10 +988,20 @@ class ChainableUndefined(Undefined): def __html__(self) -> str: return str(self) - def __getattr__(self, _: str) -> "ChainableUndefined": + def __getattr__(self, name: str) -> "ChainableUndefined": + # Raise AttributeError on requests for names that appear to be unimplemented + # dunder methods to avoid confusing Python with truthy non-method objects that + # do not implement the protocol being probed for. e.g., copy.copy(Undefined()) + # fails spectacularly if getattr(Undefined(), '__setstate__') returns an + # Undefined object instead of raising AttributeError to signal that it does not + # support that style of object initialization. + if name[:2] == "__" and name[-2:] == "__": + raise AttributeError(name) + return self - __getitem__ = __getattr__ # type: ignore + def __getitem__(self, _name: str) -> "ChainableUndefined": # type: ignore[override] + return self class DebugUndefined(Undefined): @@ -1044,13 +1060,3 @@ class StrictUndefined(Undefined): __iter__ = __str__ = __len__ = Undefined._fail_with_undefined_error __eq__ = __ne__ = __bool__ = __hash__ = Undefined._fail_with_undefined_error __contains__ = Undefined._fail_with_undefined_error - - -# Remove slots attributes, after the metaclass is applied they are -# unneeded and contain wrong data for subclasses. -del ( - Undefined.__slots__, - ChainableUndefined.__slots__, - DebugUndefined.__slots__, - StrictUndefined.__slots__, -) diff --git a/libs/jinja2/sandbox.py b/libs/jinja2/sandbox.py index 0b4fc12d3..9c9dae22f 100644 --- a/libs/jinja2/sandbox.py +++ b/libs/jinja2/sandbox.py @@ -5,11 +5,12 @@ import operator import types import typing as t +from _string import formatter_field_name_split # type: ignore from collections import abc from collections import deque +from functools import update_wrapper from string import Formatter -from _string import formatter_field_name_split # type: ignore from markupsafe import EscapeFormatter from markupsafe import Markup @@ -60,7 +61,9 @@ ), ( abc.MutableSequence, - frozenset(["append", "reverse", "insert", "sort", "extend", "remove"]), + frozenset( + ["append", "clear", "pop", "reverse", "insert", "sort", "extend", "remove"] + ), ), ( deque, @@ -81,20 +84,6 @@ ) -def inspect_format_method(callable: t.Callable[..., t.Any]) -> t.Optional[str]: - if not isinstance( - callable, (types.MethodType, types.BuiltinMethodType) - ) or callable.__name__ not in ("format", "format_map"): - return None - - obj = callable.__self__ - - if isinstance(obj, str): - return obj - - return None - - def safe_range(*args: int) -> range: """A range that can't generate ranges with a length of more than MAX_RANGE items. @@ -314,6 +303,9 @@ def getitem( except AttributeError: pass else: + fmt = self.wrap_str_format(value) + if fmt is not None: + return fmt if self.is_safe_attribute(obj, argument, value): return value return self.unsafe_undefined(obj, argument) @@ -331,6 +323,9 @@ def getattr(self, obj: t.Any, attribute: str) -> t.Union[t.Any, Undefined]: except (TypeError, LookupError): pass else: + fmt = self.wrap_str_format(value) + if fmt is not None: + return fmt if self.is_safe_attribute(obj, attribute, value): return value return self.unsafe_undefined(obj, attribute) @@ -346,34 +341,49 @@ def unsafe_undefined(self, obj: t.Any, attribute: str) -> Undefined: exc=SecurityError, ) - def format_string( - self, - s: str, - args: t.Tuple[t.Any, ...], - kwargs: t.Dict[str, t.Any], - format_func: t.Optional[t.Callable[..., t.Any]] = None, - ) -> str: - """If a format call is detected, then this is routed through this - method so that our safety sandbox can be used for it. + def wrap_str_format(self, value: t.Any) -> t.Optional[t.Callable[..., str]]: + """If the given value is a ``str.format`` or ``str.format_map`` method, + return a new function than handles sandboxing. This is done at access + rather than in :meth:`call`, so that calls made without ``call`` are + also sandboxed. """ + if not isinstance( + value, (types.MethodType, types.BuiltinMethodType) + ) or value.__name__ not in ("format", "format_map"): + return None + + f_self: t.Any = value.__self__ + + if not isinstance(f_self, str): + return None + + str_type: t.Type[str] = type(f_self) + is_format_map = value.__name__ == "format_map" formatter: SandboxedFormatter - if isinstance(s, Markup): - formatter = SandboxedEscapeFormatter(self, escape=s.escape) + + if isinstance(f_self, Markup): + formatter = SandboxedEscapeFormatter(self, escape=f_self.escape) else: formatter = SandboxedFormatter(self) - if format_func is not None and format_func.__name__ == "format_map": - if len(args) != 1 or kwargs: - raise TypeError( - "format_map() takes exactly one argument" - f" {len(args) + (kwargs is not None)} given" - ) + vformat = formatter.vformat + + def wrapper(*args: t.Any, **kwargs: t.Any) -> str: + if is_format_map: + if kwargs: + raise TypeError("format_map() takes no keyword arguments") + + if len(args) != 1: + raise TypeError( + f"format_map() takes exactly one argument ({len(args)} given)" + ) + + kwargs = args[0] + args = () - kwargs = args[0] - args = () + return str_type(vformat(f_self, args, kwargs)) - rv = formatter.vformat(s, args, kwargs) - return type(s)(rv) + return update_wrapper(wrapper, value) def call( __self, # noqa: B902 @@ -383,9 +393,6 @@ def call( **kwargs: t.Any, ) -> t.Any: """Call an object from sandboxed code.""" - fmt = inspect_format_method(__obj) - if fmt is not None: - return __self.format_string(fmt, args, kwargs, __obj) # the double prefixes are to avoid double keyword argument # errors when proxying the call. diff --git a/libs/jinja2/utils.py b/libs/jinja2/utils.py index 7fb76935a..7c922629a 100644 --- a/libs/jinja2/utils.py +++ b/libs/jinja2/utils.py @@ -18,8 +18,17 @@ F = t.TypeVar("F", bound=t.Callable[..., t.Any]) -# special singleton representing missing values for the runtime -missing: t.Any = type("MissingType", (), {"__repr__": lambda x: "missing"})() + +class _MissingType: + def __repr__(self) -> str: + return "missing" + + def __reduce__(self) -> str: + return "missing" + + +missing: t.Any = _MissingType() +"""Special singleton representing missing values for the runtime.""" internal_code: t.MutableSet[CodeType] = set() @@ -324,6 +333,8 @@ def trim_url(x: str) -> str: elif ( "@" in middle and not middle.startswith("www.") + # ignore values like `@a@b` + and not middle.startswith("@") and ":" not in middle and _email_re.match(middle) ): @@ -428,7 +439,7 @@ class LRUCache: def __init__(self, capacity: int) -> None: self.capacity = capacity self._mapping: t.Dict[t.Any, t.Any] = {} - self._queue: "te.Deque[t.Any]" = deque() + self._queue: te.Deque[t.Any] = deque() self._postinit() def _postinit(self) -> None: @@ -453,7 +464,7 @@ def __setstate__(self, d: t.Mapping[str, t.Any]) -> None: def __getnewargs__(self) -> t.Tuple[t.Any, ...]: return (self.capacity,) - def copy(self) -> "LRUCache": + def copy(self) -> "te.Self": """Return a shallow copy of the instance.""" rv = self.__class__(self.capacity) rv._mapping.update(self._mapping) diff --git a/libs/mako/__init__.py b/libs/mako/__init__.py index d7223f7c3..ba34f43bf 100644 --- a/libs/mako/__init__.py +++ b/libs/mako/__init__.py @@ -5,4 +5,4 @@ # the MIT License: http://www.opensource.org/licenses/mit-license.php -__version__ = "1.3.6" +__version__ = "1.3.8" diff --git a/libs/mako/parsetree.py b/libs/mako/parsetree.py index 04686ece1..ac9973686 100644 --- a/libs/mako/parsetree.py +++ b/libs/mako/parsetree.py @@ -322,7 +322,7 @@ def _parse_attributes(self, expressions, nonexpressions): for key in self.attributes: if key in expressions: expr = [] - for x in re.compile(r"(\${.+?})", re.S).split( + for x in re.compile(r"(\${(?:[^$]*?{.+|.+?)})", re.S).split( self.attributes[key] ): m = re.compile(r"^\${(.+?)}$", re.S).match(x) diff --git a/libs/pysubs2-1.7.3.dist-info/RECORD b/libs/pysubs2-1.7.3.dist-info/RECORD index 470e86d28..ada373655 100644 --- a/libs/pysubs2-1.7.3.dist-info/RECORD +++ b/libs/pysubs2-1.7.3.dist-info/RECORD @@ -4,7 +4,7 @@ pysubs2-1.7.3.dist-info/LICENSE.txt,sha256=WYgskvBrUBBDxuKH9JSV1u22g-UBTwHjeuJLl pysubs2-1.7.3.dist-info/METADATA,sha256=EG6RW41p_JlOJDC9p9clWaHINxR6uKDBcBh-9Va9Qno,3183 pysubs2-1.7.3.dist-info/RECORD,, pysubs2-1.7.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pysubs2-1.7.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +pysubs2-1.7.3.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 pysubs2-1.7.3.dist-info/entry_points.txt,sha256=mznmeaia9Ec19KsaIM8D4tt6V0HnOUlPhSg5nXiAfAE,49 pysubs2-1.7.3.dist-info/top_level.txt,sha256=i_V6JX-AWjMX15-Dzyc0RlrInU7Zun9PYfdB9brM95E,8 pysubs2/__init__.py,sha256=L71MMMS6zcAiGWdddhnc4COZmKLYX__igP0Tr5q-y3Q,783 diff --git a/libs/pysubs2-1.7.3.dist-info/WHEEL b/libs/pysubs2-1.7.3.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/pysubs2-1.7.3.dist-info/WHEEL +++ b/libs/pysubs2-1.7.3.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/python_engineio-4.10.1.dist-info/RECORD b/libs/python_engineio-4.10.1.dist-info/RECORD deleted file mode 100644 index b228532cf..000000000 --- a/libs/python_engineio-4.10.1.dist-info/RECORD +++ /dev/null @@ -1,33 +0,0 @@ -engineio/__init__.py,sha256=0R2PY1EXu3sicP7mkA0_QxEVGRlFlgvsxfhByqREE1A,481 -engineio/async_client.py,sha256=jC7T6r_ya9LV46q4OdIQ041-3uLlRr6aUt__YmHNPEM,27950 -engineio/async_drivers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -engineio/async_drivers/_websocket_wsgi.py,sha256=FGoRBGOUsEtlfklYNylR0o3oLOGmXIR8QzaCsGLgr3I,949 -engineio/async_drivers/aiohttp.py,sha256=zJdujjO6dSL_oKDDr4xfO4ID_Vd8faEp1AOIW4ogKME,3768 -engineio/async_drivers/asgi.py,sha256=mvCErNpYw1T7XE_1Ixb0YQN0YqJkKMpWqNV5_tZQYMg,11011 -engineio/async_drivers/eventlet.py,sha256=_ZgPg0HTx_yhSm5iBcd3ez01yMg3KRFmb2ycKD8o8pY,1775 -engineio/async_drivers/gevent.py,sha256=hnJHeWdDQE2jfoLCP5DnwVPzsQlcTLJUMA5EVf1UL-k,2962 -engineio/async_drivers/gevent_uwsgi.py,sha256=cnjCsnDHTa6rKgwDKD6rLvIw1Yun-g4c1QbujOC_bMY,5962 -engineio/async_drivers/sanic.py,sha256=SY0HIp5DUHF7B55tJCBB_8qDjrRTD_FyNQ2cIwRIGR8,4538 -engineio/async_drivers/threading.py,sha256=ywmG59d4H6OHZjKarBN97-9BHEsRxFEz9YN-E9QAu_I,463 -engineio/async_drivers/tornado.py,sha256=9bB7FvY47Snx_h4rsNwRk5wIINf2ju7hXWTAqF3intA,5909 -engineio/async_server.py,sha256=Z1mpQxbu--hAQCY78BStsTlyP3_XUJ9zm0R51ziPOHI,25792 -engineio/async_socket.py,sha256=P8OZW1N5y7jr2hW1qLLK2y_Clt7aHdv2ucYW69mbU4Q,10305 -engineio/base_client.py,sha256=Q_w0Stvy89wPHwWk7411dRxpGjxNPypm4xy_4XMPZ9M,4872 -engineio/base_server.py,sha256=Em2RRpbohulKjmYTWHnf_lALKvTT_jHr442Rr2g_BEQ,14013 -engineio/base_socket.py,sha256=Bw6TWv1pnlXcDdqT59C5CyTaBi7l-_mkykIUuZLjz-g,400 -engineio/client.py,sha256=m_eLSes3b-mE5MYajELquSktkAWceCNGZOtUU78as50,26285 -engineio/exceptions.py,sha256=FyuMb5qhX9CUYP3fEoe1m-faU96ApdQTSbblaaoo8LA,292 -engineio/json.py,sha256=SG5FTojqd1ix6u0dKXJsZVqqdYioZLO4S2GPL7BKl3U,405 -engineio/middleware.py,sha256=BF_qHAIZZnIbfiP256SD1CX3kzNWbSuto1cpih8oIFg,3766 -engineio/packet.py,sha256=ETMeLgdpZghXK9fth93IZO8pIft6Sg3d1QGpyTx4xBE,3189 -engineio/payload.py,sha256=2iLIFgIweTWkLok_UZ5zCgELmRSGyUUI5eeYcEerFSs,1547 -engineio/server.py,sha256=Ub21Jf-9mxSPPYmWJMnzuGZRz6fRQc6rdtqcBKHHd-M,21980 -engineio/socket.py,sha256=dasec3jXoV2eR1jmIrhEIfHzyUuuv8FwvxLB3DpyjeY,9996 -engineio/static_files.py,sha256=pwez9LQFaSQXMbtI0vLyD6UDiokQ4rNfmRYgVLKOthc,2064 -python_engineio-4.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_engineio-4.10.1.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 -python_engineio-4.10.1.dist-info/METADATA,sha256=DgLfc2h42WxGM1yarou6HGfgGUW1Bf89yglgjPb01qQ,2245 -python_engineio-4.10.1.dist-info/RECORD,, -python_engineio-4.10.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -python_engineio-4.10.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 -python_engineio-4.10.1.dist-info/top_level.txt,sha256=u8PmNisCZLwRYcWrNLe9wutQ2tt4zNi8IH362c-HWuA,9 diff --git a/libs/python_engineio-4.10.1.dist-info/INSTALLER b/libs/python_engineio-4.11.1.dist-info/INSTALLER similarity index 100% rename from libs/python_engineio-4.10.1.dist-info/INSTALLER rename to libs/python_engineio-4.11.1.dist-info/INSTALLER diff --git a/libs/python_engineio-4.10.1.dist-info/LICENSE b/libs/python_engineio-4.11.1.dist-info/LICENSE similarity index 100% rename from libs/python_engineio-4.10.1.dist-info/LICENSE rename to libs/python_engineio-4.11.1.dist-info/LICENSE diff --git a/libs/python_engineio-4.10.1.dist-info/METADATA b/libs/python_engineio-4.11.1.dist-info/METADATA similarity index 99% rename from libs/python_engineio-4.10.1.dist-info/METADATA rename to libs/python_engineio-4.11.1.dist-info/METADATA index e2b8bcdda..e5154fc5e 100644 --- a/libs/python_engineio-4.10.1.dist-info/METADATA +++ b/libs/python_engineio-4.11.1.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-engineio -Version: 4.10.1 +Version: 4.11.1 Summary: Engine.IO server and client for Python Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> Project-URL: Homepage, https://github.com/miguelgrinberg/python-engineio diff --git a/libs/python_engineio-4.11.1.dist-info/RECORD b/libs/python_engineio-4.11.1.dist-info/RECORD new file mode 100644 index 000000000..acc0a00d5 --- /dev/null +++ b/libs/python_engineio-4.11.1.dist-info/RECORD @@ -0,0 +1,33 @@ +engineio/__init__.py,sha256=0R2PY1EXu3sicP7mkA0_QxEVGRlFlgvsxfhByqREE1A,481 +engineio/async_client.py,sha256=ZrK9j_sUNKRwjqeT6W26d1TtjoGAp2nULhIbX_1iivs,29446 +engineio/async_drivers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +engineio/async_drivers/_websocket_wsgi.py,sha256=LuOEfKhbAw8SplB5PMpYKIUqfCPEadQEpqeiq_leOIA,949 +engineio/async_drivers/aiohttp.py,sha256=OBDGhaNXWHxQkwhzZT2vlTAOqWReGS6Sjk9u3BEh_Mc,3754 +engineio/async_drivers/asgi.py,sha256=mBu109j7R6esH-wI62jvTnfVAEjWvw2YNp0dZ74NyHg,11210 +engineio/async_drivers/eventlet.py,sha256=n1y4OjPdj4J2GIep5N56O29oa5NQgFJVcTBjyO1C-Gs,1735 +engineio/async_drivers/gevent.py,sha256=hnJHeWdDQE2jfoLCP5DnwVPzsQlcTLJUMA5EVf1UL-k,2962 +engineio/async_drivers/gevent_uwsgi.py,sha256=m6ay5dov9FDQl0fbeiKeE-Orh5LiF6zLlYQ64Oa3T5g,5954 +engineio/async_drivers/sanic.py,sha256=GYX8YWR1GbRm-GkMTAQkfkWbY12MOT1IV2DzH0Xx8Ns,4495 +engineio/async_drivers/threading.py,sha256=ywmG59d4H6OHZjKarBN97-9BHEsRxFEz9YN-E9QAu_I,463 +engineio/async_drivers/tornado.py,sha256=mbVHs1mECfzFSNv33uigkpTBtNPT0u49k5zaybewdIo,5893 +engineio/async_server.py,sha256=8Af_uwf8mKOCJGqVKa3QN0kz7_B2K1cdpSmsvkAoBR4,27412 +engineio/async_socket.py,sha256=nHY0DPPk0FtI9djUnQWtzZ3ce2OD184Tu-Dop7JLg9I,10715 +engineio/base_client.py,sha256=uEI6OglvhdIGD1DAZuptbn0KXQMk_o3w0AH4wJvPwZ0,5322 +engineio/base_server.py,sha256=H-aKQ9hMQjiIrjDaqbw_edw9yUVIbCQMzyIy9egLv-g,14458 +engineio/base_socket.py,sha256=sQqbNSfGhMQG3xzwar6IXMal28C7Q5TIAQRGp74Wt2o,399 +engineio/client.py,sha256=wfgB_MrpEh-v4dBt6W2eW6i0CRNEP0CIJ6d4Ap4CnZE,27227 +engineio/exceptions.py,sha256=FyuMb5qhX9CUYP3fEoe1m-faU96ApdQTSbblaaoo8LA,292 +engineio/json.py,sha256=SG5FTojqd1ix6u0dKXJsZVqqdYioZLO4S2GPL7BKl3U,405 +engineio/middleware.py,sha256=5NKBXz-ftuFErUB_V9IDvRHaSOsjhtW-NnuJtquB1nc,3750 +engineio/packet.py,sha256=Tejm9U5JcYs5LwZ_n_Xh0PIRv-U_JbHwGEivNXQN4eg,3181 +engineio/payload.py,sha256=GIWu0Vnay4WNZlDxHqVgP34tKTBXX58OArJ-mO5zD3E,1539 +engineio/server.py,sha256=4_xdtH0tyusigQurwOeDFrHtodthFTOIbOVZ-_ckh5U,22957 +engineio/socket.py,sha256=K5gSY5PTi6rZy4meP9CtTYsNlEU2JmsonYDDHfJVFI4,10280 +engineio/static_files.py,sha256=pwez9LQFaSQXMbtI0vLyD6UDiokQ4rNfmRYgVLKOthc,2064 +python_engineio-4.11.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_engineio-4.11.1.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 +python_engineio-4.11.1.dist-info/METADATA,sha256=s084updHO8IDR0sFrXIPk1jcFbr7p5ew-VW-UzAlqkk,2245 +python_engineio-4.11.1.dist-info/RECORD,, +python_engineio-4.11.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +python_engineio-4.11.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +python_engineio-4.11.1.dist-info/top_level.txt,sha256=u8PmNisCZLwRYcWrNLe9wutQ2tt4zNi8IH362c-HWuA,9 diff --git a/libs/python_engineio-4.10.1.dist-info/REQUESTED b/libs/python_engineio-4.11.1.dist-info/REQUESTED similarity index 100% rename from libs/python_engineio-4.10.1.dist-info/REQUESTED rename to libs/python_engineio-4.11.1.dist-info/REQUESTED diff --git a/libs/python_engineio-4.11.1.dist-info/WHEEL b/libs/python_engineio-4.11.1.dist-info/WHEEL new file mode 100644 index 000000000..9b78c4451 --- /dev/null +++ b/libs/python_engineio-4.11.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.3.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/python_engineio-4.10.1.dist-info/top_level.txt b/libs/python_engineio-4.11.1.dist-info/top_level.txt similarity index 100% rename from libs/python_engineio-4.10.1.dist-info/top_level.txt rename to libs/python_engineio-4.11.1.dist-info/top_level.txt diff --git a/libs/python_socketio-5.11.4.dist-info/RECORD b/libs/python_socketio-5.11.4.dist-info/RECORD deleted file mode 100644 index e2a2fbd5e..000000000 --- a/libs/python_socketio-5.11.4.dist-info/RECORD +++ /dev/null @@ -1,38 +0,0 @@ -python_socketio-5.11.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_socketio-5.11.4.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 -python_socketio-5.11.4.dist-info/METADATA,sha256=W0GWlV0MDN9PmQa-puWag4I4gCgRKRhvFK4g20hzpak,3213 -python_socketio-5.11.4.dist-info/RECORD,, -python_socketio-5.11.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -python_socketio-5.11.4.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 -python_socketio-5.11.4.dist-info/top_level.txt,sha256=xWd-HVUanhys_VzQQTRTRZBX8W448ayFytYf1Zffivs,9 -socketio/__init__.py,sha256=DXxtwPIqHFIqV4BGTgJ86OvCXD6Mth3PxBYhFoJ1_7g,1269 -socketio/admin.py,sha256=9B601337UMTh2NIFzVrlFyImmSEtegJoXYFDlEwGmYk,16473 -socketio/asgi.py,sha256=NaJtYhOswVVcwHU0zcMM5H5TrSzXq9K-CAYaeSNTZRY,2192 -socketio/async_admin.py,sha256=Swn4s154pc7QTWCWNEbSM2psAmhEuvgobIn1Vf7Y0y8,16850 -socketio/async_aiopika_manager.py,sha256=DaBUjGRYaNIsOsk2xNjWylUsz2egmTAFFUiQkV6mNmk,5193 -socketio/async_client.py,sha256=6MSlSIfIS8-bULGKgnjETfqLc3s4UsZsnTRo2H07zxM,26968 -socketio/async_manager.py,sha256=dSD2XVtWYwKHDWxAXSu4Xgqw6dXyy9P_6C8rwlguybM,4503 -socketio/async_namespace.py,sha256=JwAfxtiEYe3srnHeKq384FV1Jc3V_Zty8C_94YmSJUU,10632 -socketio/async_pubsub_manager.py,sha256=Dzt34zwWgxqGsB_61_hegSlTSZucciHX6aJrEPSuKos,11141 -socketio/async_redis_manager.py,sha256=UZXKunvbSk8neRVhGqigQF5S0WwLYTKV0BKondnV_yY,4299 -socketio/async_server.py,sha256=HBp6yT8NPTSOWMw_Nd5G7OQMXtFSjOsJvutI1MkyxaA,35506 -socketio/async_simple_client.py,sha256=Dj2h0iRR1qZ4BhOV6gpzvDM0K5XO4f-vdxmISiREzhQ,8908 -socketio/base_client.py,sha256=bW2zRm7pjAGlB37iV62363zOl1er3z8I4EroCgeA6PQ,11576 -socketio/base_manager.py,sha256=DJLH6IbJpaJ38jCrmIaUQVj8WUKZDYtfzjKIbQslLjw,5768 -socketio/base_namespace.py,sha256=PpBylO78iyOJ6st5IHQeeXTvD7XzUim5MNDzdKjISxU,978 -socketio/base_server.py,sha256=GS62Am34sQr43v5YDTujE8zt00oyP3XjLy9dtSGOAB0,10584 -socketio/client.py,sha256=s5tU1gsxjEhQyTUk0F2e600IEALp3PcCx8vIK9k-y0Q,25471 -socketio/exceptions.py,sha256=c8yKss_oJl-fkL52X_AagyJecL-9Mxlgb5xDRqSz5tA,975 -socketio/kafka_manager.py,sha256=OCUBlntnqAOlqZn7YxxM0E4rt6VLd_b-wJWrVWKRR-A,2419 -socketio/kombu_manager.py,sha256=qFzWOUlsIznNx2IYKMvA6GKrDcG0zle5_G9duanJ3Po,5747 -socketio/manager.py,sha256=RPYPcVBFAjN-fEtLfcsPlk6SOW_SBATvw0Tkq_PkGZw,3861 -socketio/middleware.py,sha256=P8wOgSzy3YKOcRVI-r3KNKsEejBz_f5p2wdV8ZqW12E,1591 -socketio/msgpack_packet.py,sha256=0K_XXM-OF3SdqOaLN_O5B4a1xHE6N_UhhiaRhQdseNw,514 -socketio/namespace.py,sha256=wMRAxxyq-4WWa7LEhQXHZn4Q4lSw5NM6G24WA-UZL5k,8886 -socketio/packet.py,sha256=j5zm_kcoIZQnWd9m2hQiF34p0nweGecQvMxr90W8Hrs,7077 -socketio/pubsub_manager.py,sha256=JCB9aaEBbEw8Or6XaosoSpO-f6p5iF_BnNJOCul7ps4,10442 -socketio/redis_manager.py,sha256=KExT3uzACK42g9OuHKvzI7YpfpGGLFMOwsWhgnPkx0Q,4442 -socketio/server.py,sha256=nOao7YVlRHyUeEei6xGCIMONI2VMEAixU5mGqSfc4M0,34291 -socketio/simple_client.py,sha256=tZiX2sAPY66OJTIJPk-PIGQjmnmUxu3RnpgJ0nc1-y8,8326 -socketio/tornado.py,sha256=R82JCqz-E1ibZAQX708h7FX3sguCHQ1OLYpnMag-LY8,295 -socketio/zmq_manager.py,sha256=JsRooJoH0dwOE0QsmDwePmwzsIN0VudsFWweCzScvMs,3545 diff --git a/libs/python_socketio-5.11.4.dist-info/WHEEL b/libs/python_socketio-5.11.4.dist-info/WHEEL deleted file mode 100644 index da25d7b42..000000000 --- a/libs/python_socketio-5.11.4.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.2.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/python_socketio-5.11.4.dist-info/INSTALLER b/libs/python_socketio-5.12.0.dist-info/INSTALLER similarity index 100% rename from libs/python_socketio-5.11.4.dist-info/INSTALLER rename to libs/python_socketio-5.12.0.dist-info/INSTALLER diff --git a/libs/python_socketio-5.11.4.dist-info/LICENSE b/libs/python_socketio-5.12.0.dist-info/LICENSE similarity index 100% rename from libs/python_socketio-5.11.4.dist-info/LICENSE rename to libs/python_socketio-5.12.0.dist-info/LICENSE diff --git a/libs/python_socketio-5.11.4.dist-info/METADATA b/libs/python_socketio-5.12.0.dist-info/METADATA similarity index 98% rename from libs/python_socketio-5.11.4.dist-info/METADATA rename to libs/python_socketio-5.12.0.dist-info/METADATA index 7437d2bab..aa74b1f04 100644 --- a/libs/python_socketio-5.11.4.dist-info/METADATA +++ b/libs/python_socketio-5.12.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-socketio -Version: 5.11.4 +Version: 5.12.0 Summary: Socket.IO server and client for Python Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> Project-URL: Homepage, https://github.com/miguelgrinberg/python-socketio @@ -14,7 +14,7 @@ Requires-Python: >=3.8 Description-Content-Type: text/markdown License-File: LICENSE Requires-Dist: bidict >=0.21.0 -Requires-Dist: python-engineio >=4.8.0 +Requires-Dist: python-engineio >=4.11.0 Provides-Extra: asyncio_client Requires-Dist: aiohttp >=3.4 ; extra == 'asyncio_client' Provides-Extra: client diff --git a/libs/python_socketio-5.12.0.dist-info/RECORD b/libs/python_socketio-5.12.0.dist-info/RECORD new file mode 100644 index 000000000..e60ba8aa1 --- /dev/null +++ b/libs/python_socketio-5.12.0.dist-info/RECORD @@ -0,0 +1,38 @@ +python_socketio-5.12.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_socketio-5.12.0.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 +python_socketio-5.12.0.dist-info/METADATA,sha256=GUvQG_s5fjr-pCKCBJ2ZH3qpojOoVNng2jAmQwLRB5o,3214 +python_socketio-5.12.0.dist-info/RECORD,, +python_socketio-5.12.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +python_socketio-5.12.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +python_socketio-5.12.0.dist-info/top_level.txt,sha256=xWd-HVUanhys_VzQQTRTRZBX8W448ayFytYf1Zffivs,9 +socketio/__init__.py,sha256=DXxtwPIqHFIqV4BGTgJ86OvCXD6Mth3PxBYhFoJ1_7g,1269 +socketio/admin.py,sha256=SiI8liDczb8scnp8HA2FwGSRNDLfHJbog1RUPN4lfeI,16463 +socketio/asgi.py,sha256=NaJtYhOswVVcwHU0zcMM5H5TrSzXq9K-CAYaeSNTZRY,2192 +socketio/async_admin.py,sha256=Swn4s154pc7QTWCWNEbSM2psAmhEuvgobIn1Vf7Y0y8,16850 +socketio/async_aiopika_manager.py,sha256=DaBUjGRYaNIsOsk2xNjWylUsz2egmTAFFUiQkV6mNmk,5193 +socketio/async_client.py,sha256=iVXDsHiU9aohwE2QkSwUOtU8GYivCZRapolJMCWeCPY,27810 +socketio/async_manager.py,sha256=dSD2XVtWYwKHDWxAXSu4Xgqw6dXyy9P_6C8rwlguybM,4503 +socketio/async_namespace.py,sha256=pSyJjIekWgydsmQHxmJvuc_NdI8SMGjGTAatLUtRvAk,12028 +socketio/async_pubsub_manager.py,sha256=Dzt34zwWgxqGsB_61_hegSlTSZucciHX6aJrEPSuKos,11141 +socketio/async_redis_manager.py,sha256=UZXKunvbSk8neRVhGqigQF5S0WwLYTKV0BKondnV_yY,4299 +socketio/async_server.py,sha256=YrZ69AN1i8hK-TMZGtRiD6UnoQk_zwl2amHYaKk_1uI,36382 +socketio/async_simple_client.py,sha256=Dj2h0iRR1qZ4BhOV6gpzvDM0K5XO4f-vdxmISiREzhQ,8908 +socketio/base_client.py,sha256=AKwZprl7qwgdOaQwV2drBNx9bB3PBCyABm6HKton-w4,11637 +socketio/base_manager.py,sha256=vmHGHlIUDJTCdp9MIFppqFJJuoN2M1MmEWTTyV35FeY,5727 +socketio/base_namespace.py,sha256=mXECdZZ7jPLphU9yH4U4yOayqjMh6OyWgZ71mOJzl5A,970 +socketio/base_server.py,sha256=JtHtmxFjtclcdORg7FIBoMtMxiaCFnuwulXrpLUSjUE,10637 +socketio/client.py,sha256=gE8NH3oZrdwTMQN1j-D3J_opGZlYCxPyMO6m3rjFDC0,26040 +socketio/exceptions.py,sha256=c8yKss_oJl-fkL52X_AagyJecL-9Mxlgb5xDRqSz5tA,975 +socketio/kafka_manager.py,sha256=BbpNbEus0DCFXaohBAXlKoV2IHU8RhbGzpkL9QcqQNM,2388 +socketio/kombu_manager.py,sha256=MhDhnbZoncW5_Y02Ojhu8qFUFdT7STZDnLPsMUARuik,5748 +socketio/manager.py,sha256=RPYPcVBFAjN-fEtLfcsPlk6SOW_SBATvw0Tkq_PkGZw,3861 +socketio/middleware.py,sha256=P8wOgSzy3YKOcRVI-r3KNKsEejBz_f5p2wdV8ZqW12E,1591 +socketio/msgpack_packet.py,sha256=0K_XXM-OF3SdqOaLN_O5B4a1xHE6N_UhhiaRhQdseNw,514 +socketio/namespace.py,sha256=80y8BN2FFlHK8JKF1TirWvvE4pn9FkGKk14IVFkCLEs,9488 +socketio/packet.py,sha256=nYvjUEIEUMHThZj--xrmRCZX9jN1V9BwFB2GzRpDLWU,7069 +socketio/pubsub_manager.py,sha256=JCB9aaEBbEw8Or6XaosoSpO-f6p5iF_BnNJOCul7ps4,10442 +socketio/redis_manager.py,sha256=DIvqRXjsSsmvXYBwuRvEap70IFyJILLaicj1X2Hssug,4403 +socketio/server.py,sha256=laukqFmlQK24bCmGtMP9KGGGUP8CqebTO4_SJeZrMGY,34788 +socketio/simple_client.py,sha256=tZiX2sAPY66OJTIJPk-PIGQjmnmUxu3RnpgJ0nc1-y8,8326 +socketio/tornado.py,sha256=R82JCqz-E1ibZAQX708h7FX3sguCHQ1OLYpnMag-LY8,295 +socketio/zmq_manager.py,sha256=PVlx175_MqKQ6j0sqGpqbqN2vW5zf4BzviotbBQpdEE,3544 diff --git a/libs/python_socketio-5.11.4.dist-info/REQUESTED b/libs/python_socketio-5.12.0.dist-info/REQUESTED similarity index 100% rename from libs/python_socketio-5.11.4.dist-info/REQUESTED rename to libs/python_socketio-5.12.0.dist-info/REQUESTED diff --git a/libs/python_socketio-5.12.0.dist-info/WHEEL b/libs/python_socketio-5.12.0.dist-info/WHEEL new file mode 100644 index 000000000..9b78c4451 --- /dev/null +++ b/libs/python_socketio-5.12.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.3.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/python_socketio-5.11.4.dist-info/top_level.txt b/libs/python_socketio-5.12.0.dist-info/top_level.txt similarity index 100% rename from libs/python_socketio-5.11.4.dist-info/top_level.txt rename to libs/python_socketio-5.12.0.dist-info/top_level.txt diff --git a/libs/rich-13.9.3.dist-info/INSTALLER b/libs/rich-13.9.4.dist-info/INSTALLER similarity index 100% rename from libs/rich-13.9.3.dist-info/INSTALLER rename to libs/rich-13.9.4.dist-info/INSTALLER diff --git a/libs/rich-13.9.3.dist-info/LICENSE b/libs/rich-13.9.4.dist-info/LICENSE similarity index 100% rename from libs/rich-13.9.3.dist-info/LICENSE rename to libs/rich-13.9.4.dist-info/LICENSE diff --git a/libs/rich-13.9.3.dist-info/METADATA b/libs/rich-13.9.4.dist-info/METADATA similarity index 99% rename from libs/rich-13.9.3.dist-info/METADATA rename to libs/rich-13.9.4.dist-info/METADATA index 75dd54c56..7f3ac7f81 100644 --- a/libs/rich-13.9.3.dist-info/METADATA +++ b/libs/rich-13.9.4.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: rich -Version: 13.9.3 +Version: 13.9.4 Summary: Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal Home-page: https://github.com/Textualize/rich License: MIT diff --git a/libs/rich-13.9.3.dist-info/RECORD b/libs/rich-13.9.4.dist-info/RECORD similarity index 92% rename from libs/rich-13.9.3.dist-info/RECORD rename to libs/rich-13.9.4.dist-info/RECORD index 1ffba4e7f..5ed3d366b 100644 --- a/libs/rich-13.9.3.dist-info/RECORD +++ b/libs/rich-13.9.4.dist-info/RECORD @@ -1,9 +1,9 @@ -rich-13.9.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -rich-13.9.3.dist-info/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056 -rich-13.9.3.dist-info/METADATA,sha256=EM8v3jLN43BfZK9latyDj32APbI6geXOQ_XQdPjigVQ,18274 -rich-13.9.3.dist-info/RECORD,, -rich-13.9.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rich-13.9.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 +rich-13.9.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +rich-13.9.4.dist-info/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056 +rich-13.9.4.dist-info/METADATA,sha256=dg29ATErmwW3hqOEbIsmWW2Y4ieh38w98r9l8MfIrGI,18274 +rich-13.9.4.dist-info/RECORD,, +rich-13.9.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +rich-13.9.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88 rich/__init__.py,sha256=lh2WcoIOJp5M5_lbAsSUMGv8oiJeumROazHH_AYMS8I,6066 rich/__main__.py,sha256=Wvh53rmOMyWeUeyqUHpn1PXsHlBc4TVcQnqrw46nf9Y,8333 rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209 @@ -31,7 +31,7 @@ rich/align.py,sha256=gxlfgvi4ah8ERmg8RpGFtWY1Z4WBuWm-6qSIUSFx4bQ,10421 rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921 rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263 rich/box.py,sha256=46rA0eBKLBcqNhCXmEKS4pN1dz36F0Vzi52hyVT-tyc,10783 -rich/cells.py,sha256=FqSod9dfvytgh9bds4iK7gz2KomzhDkvVRmuVF_m0Bk,4800 +rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130 rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211 rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 diff --git a/libs/rich-13.9.3.dist-info/REQUESTED b/libs/rich-13.9.4.dist-info/REQUESTED similarity index 100% rename from libs/rich-13.9.3.dist-info/REQUESTED rename to libs/rich-13.9.4.dist-info/REQUESTED diff --git a/libs/rich-13.9.3.dist-info/WHEEL b/libs/rich-13.9.4.dist-info/WHEEL similarity index 100% rename from libs/rich-13.9.3.dist-info/WHEEL rename to libs/rich-13.9.4.dist-info/WHEEL diff --git a/libs/rich/cells.py b/libs/rich/cells.py index 17793eb5e..a85462271 100644 --- a/libs/rich/cells.py +++ b/libs/rich/cells.py @@ -1,15 +1,33 @@ from __future__ import annotations -import re from functools import lru_cache from typing import Callable from ._cell_widths import CELL_WIDTHS -# Regex to match sequence of the most common character ranges -_is_single_cell_widths = re.compile( - "^[\u0020-\u007e\u00a0-\u02ff\u0370-\u0482\u2500-\u25FF]*$" -).match +# Ranges of unicode ordinals that produce a 1-cell wide character +# This is non-exhaustive, but covers most common Western characters +_SINGLE_CELL_UNICODE_RANGES: list[tuple[int, int]] = [ + (0x20, 0x7E), # Latin (excluding non-printable) + (0xA0, 0xAC), + (0xAE, 0x002FF), + (0x00370, 0x00482), # Greek / Cyrillic + (0x02500, 0x025FC), # Box drawing, box elements, geometric shapes + (0x02800, 0x028FF), # Braille +] + +# A set of characters that are a single cell wide +_SINGLE_CELLS = frozenset( + [ + character + for _start, _end in _SINGLE_CELL_UNICODE_RANGES + for character in map(chr, range(_start, _end + 1)) + ] +) + +# When called with a string this will return True if all +# characters are single-cell, otherwise False +_is_single_cell_widths: Callable[[str], bool] = _SINGLE_CELLS.issuperset @lru_cache(4096) @@ -25,9 +43,9 @@ def cached_cell_len(text: str) -> int: Returns: int: Get the number of cells required to display text. """ - _get_size = get_character_cell_size - total_size = sum(_get_size(character) for character in text) - return total_size + if _is_single_cell_widths(text): + return len(text) + return sum(map(get_character_cell_size, text)) def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: @@ -41,9 +59,9 @@ def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> in """ if len(text) < 512: return _cell_len(text) - _get_size = get_character_cell_size - total_size = sum(_get_size(character) for character in text) - return total_size + if _is_single_cell_widths(text): + return len(text) + return sum(map(get_character_cell_size, text)) @lru_cache(maxsize=4096) @@ -56,20 +74,7 @@ def get_character_cell_size(character: str) -> int: Returns: int: Number of cells (0, 1 or 2) occupied by that character. """ - return _get_codepoint_cell_size(ord(character)) - - -@lru_cache(maxsize=4096) -def _get_codepoint_cell_size(codepoint: int) -> int: - """Get the cell size of a character. - - Args: - codepoint (int): Codepoint of a character. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - + codepoint = ord(character) _table = CELL_WIDTHS lower_bound = 0 upper_bound = len(_table) - 1 diff --git a/libs/six-1.16.0.dist-info/RECORD b/libs/six-1.16.0.dist-info/RECORD deleted file mode 100644 index 647723bd6..000000000 --- a/libs/six-1.16.0.dist-info/RECORD +++ /dev/null @@ -1,8 +0,0 @@ -six-1.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -six-1.16.0.dist-info/LICENSE,sha256=i7hQxWWqOJ_cFvOkaWWtI9gq3_YPI5P8J2K2MYXo5sk,1066 -six-1.16.0.dist-info/METADATA,sha256=kPDXQK_4EnOsvj5WSqmoXuuxj_qJ0mvBycBHlVCBgec,1797 -six-1.16.0.dist-info/RECORD,, -six-1.16.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -six-1.16.0.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 -six-1.16.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4 -six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 diff --git a/libs/six-1.16.0.dist-info/INSTALLER b/libs/six-1.17.0.dist-info/INSTALLER similarity index 100% rename from libs/six-1.16.0.dist-info/INSTALLER rename to libs/six-1.17.0.dist-info/INSTALLER diff --git a/libs/six-1.16.0.dist-info/LICENSE b/libs/six-1.17.0.dist-info/LICENSE similarity index 96% rename from libs/six-1.16.0.dist-info/LICENSE rename to libs/six-1.17.0.dist-info/LICENSE index de6633112..1cc22a5aa 100644 --- a/libs/six-1.16.0.dist-info/LICENSE +++ b/libs/six-1.17.0.dist-info/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2010-2020 Benjamin Peterson +Copyright (c) 2010-2024 Benjamin Peterson 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 diff --git a/libs/six-1.16.0.dist-info/METADATA b/libs/six-1.17.0.dist-info/METADATA similarity index 91% rename from libs/six-1.16.0.dist-info/METADATA rename to libs/six-1.17.0.dist-info/METADATA index d572bfe77..cfde03c26 100644 --- a/libs/six-1.16.0.dist-info/METADATA +++ b/libs/six-1.17.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: six -Version: 1.16.0 +Version: 1.17.0 Summary: Python 2 and 3 compatibility utilities Home-page: https://github.com/benjaminp/six Author: Benjamin Peterson @@ -20,10 +20,6 @@ License-File: LICENSE :target: https://pypi.org/project/six/ :alt: six on PyPI -.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master - :target: https://travis-ci.org/benjaminp/six - :alt: six on TravisCI - .. image:: https://readthedocs.org/projects/six/badge/?version=latest :target: https://six.readthedocs.io/ :alt: six's documentation on Read the Docs diff --git a/libs/six-1.17.0.dist-info/RECORD b/libs/six-1.17.0.dist-info/RECORD new file mode 100644 index 000000000..e8890a328 --- /dev/null +++ b/libs/six-1.17.0.dist-info/RECORD @@ -0,0 +1,8 @@ +six-1.17.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +six-1.17.0.dist-info/LICENSE,sha256=Q3W6IOK5xsTnytKUCmKP2Q6VzD1Q7pKq51VxXYuh-9A,1066 +six-1.17.0.dist-info/METADATA,sha256=ViBCB4wnUlSfbYp8htvF3XCAiKe-bYBnLsewcQC3JGg,1658 +six-1.17.0.dist-info/RECORD,, +six-1.17.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +six-1.17.0.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 +six-1.17.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4 +six.py,sha256=xRyR9wPT1LNpbJI8tf7CE-BeddkhU5O--sfy-mo5BN8,34703 diff --git a/libs/six-1.16.0.dist-info/REQUESTED b/libs/six-1.17.0.dist-info/REQUESTED similarity index 100% rename from libs/six-1.16.0.dist-info/REQUESTED rename to libs/six-1.17.0.dist-info/REQUESTED diff --git a/libs/six-1.16.0.dist-info/WHEEL b/libs/six-1.17.0.dist-info/WHEEL similarity index 100% rename from libs/six-1.16.0.dist-info/WHEEL rename to libs/six-1.17.0.dist-info/WHEEL diff --git a/libs/six-1.16.0.dist-info/top_level.txt b/libs/six-1.17.0.dist-info/top_level.txt similarity index 100% rename from libs/six-1.16.0.dist-info/top_level.txt rename to libs/six-1.17.0.dist-info/top_level.txt diff --git a/libs/six.py b/libs/six.py index 4e15675d8..3de5969b1 100644 --- a/libs/six.py +++ b/libs/six.py @@ -1,4 +1,4 @@ -# Copyright (c) 2010-2020 Benjamin Peterson +# Copyright (c) 2010-2024 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -29,7 +29,7 @@ import types __author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.16.0" +__version__ = "1.17.0" # Useful for very coarse version differentiation. @@ -263,7 +263,7 @@ class _MovedItems(_LazyModule): MovedAttribute("reduce", "__builtin__", "functools"), MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserDict", "UserDict", "collections", "IterableUserDict", "UserDict"), MovedAttribute("UserList", "UserList", "collections"), MovedAttribute("UserString", "UserString", "collections"), MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), @@ -435,12 +435,17 @@ class Module_six_moves_urllib_request(_LazyModule): MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), MovedAttribute("urlretrieve", "urllib", "urllib.request"), MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"), MovedAttribute("parse_http_list", "urllib2", "urllib.request"), MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), ] +if sys.version_info[:2] < (3, 14): + _urllib_request_moved_attributes.extend( + [ + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + ] + ) for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) del attr diff --git a/libs/socketio/admin.py b/libs/socketio/admin.py index f317ea260..58c8aff99 100644 --- a/libs/socketio/admin.py +++ b/libs/socketio/admin.py @@ -16,7 +16,7 @@ def __init__(self): def push(self, type, count=1): timestamp = int(time.time()) * 1000 - key = '{};{}'.format(timestamp, type) + key = f'{timestamp};{type}' if key not in self.buffer: self.buffer[key] = { 'timestamp': timestamp, diff --git a/libs/socketio/async_client.py b/libs/socketio/async_client.py index 5fd8daafd..463073e7b 100644 --- a/libs/socketio/async_client.py +++ b/libs/socketio/async_client.py @@ -116,7 +116,7 @@ async def connect(self, url, headers={}, auth=None, transports=None, Example usage:: sio = socketio.AsyncClient() - sio.connect('http://localhost:5000') + await sio.connect('http://localhost:5000') """ if self.connected: raise exceptions.ConnectionError('Already connected') @@ -189,6 +189,9 @@ async def wait(self): await self.eio.wait() await self.sleep(1) # give the reconnect task time to start up if not self._reconnect_task: + if self.eio.state == 'connected': # pragma: no cover + # connected while sleeping above + continue break await self._reconnect_task if self.eio.state != 'connected': @@ -335,7 +338,6 @@ async def shutdown(self): await self.disconnect() elif self._reconnect_task: # pragma: no branch self._reconnect_abort.set() - print(self._reconnect_task) await self._reconnect_task def start_background_task(self, target, *args, **kwargs): @@ -386,7 +388,7 @@ async def _send_packet(self, pkt): async def _handle_connect(self, namespace, data): namespace = namespace or '/' if namespace not in self.namespaces: - self.logger.info('Namespace {} is connected'.format(namespace)) + self.logger.info(f'Namespace {namespace} is connected') self.namespaces[namespace] = (data or {}).get('sid', self.sid) await self._trigger_event('connect', namespace=namespace) self._connect_event.set() @@ -395,8 +397,9 @@ async def _handle_disconnect(self, namespace): if not self.connected: return namespace = namespace or '/' - await self._trigger_event('disconnect', namespace=namespace) - await self._trigger_event('__disconnect_final', namespace=namespace) + await self._trigger_event('disconnect', namespace, + self.reason.SERVER_DISCONNECT) + await self._trigger_event('__disconnect_final', namespace) if namespace in self.namespaces: del self.namespaces[namespace] if not self.namespaces: @@ -459,11 +462,27 @@ async def _trigger_event(self, event, namespace, *args): if handler: if asyncio.iscoroutinefunction(handler): try: - ret = await handler(*args) + try: + ret = await handler(*args) + except TypeError: + # the legacy disconnect event does not take a reason + # argument + if event == 'disconnect': + ret = await handler(*args[:-1]) + else: # pragma: no cover + raise except asyncio.CancelledError: # pragma: no cover ret = None else: - ret = handler(*args) + try: + ret = handler(*args) + except TypeError: + # the legacy disconnect event does not take a reason + # argument + if event == 'disconnect': + ret = handler(*args[:-1]) + else: # pragma: no cover + raise return ret # or else, forward the event to a namepsace handler if one exists @@ -563,22 +582,21 @@ async def _handle_eio_message(self, data): else: raise ValueError('Unknown packet type.') - async def _handle_eio_disconnect(self): + async def _handle_eio_disconnect(self, reason): """Handle the Engine.IO disconnection event.""" self.logger.info('Engine.IO connection dropped') will_reconnect = self.reconnection and self.eio.state == 'connected' if self.connected: for n in self.namespaces: - await self._trigger_event('disconnect', namespace=n) + await self._trigger_event('disconnect', n, reason) if not will_reconnect: - await self._trigger_event('__disconnect_final', - namespace=n) + await self._trigger_event('__disconnect_final', n) self.namespaces = {} self.connected = False self.callbacks = {} self._binary_packet = None self.sid = None - if will_reconnect: + if will_reconnect and not self._reconnect_task: self._reconnect_task = self.start_background_task( self._handle_reconnect) diff --git a/libs/socketio/async_namespace.py b/libs/socketio/async_namespace.py index 89442aeb1..42d650892 100644 --- a/libs/socketio/async_namespace.py +++ b/libs/socketio/async_namespace.py @@ -34,11 +34,27 @@ async def trigger_event(self, event, *args): handler = getattr(self, handler_name) if asyncio.iscoroutinefunction(handler) is True: try: - ret = await handler(*args) + try: + ret = await handler(*args) + except TypeError: + # legacy disconnect events do not have a reason + # argument + if event == 'disconnect': + ret = await handler(*args[:-1]) + else: # pragma: no cover + raise except asyncio.CancelledError: # pragma: no cover ret = None else: - ret = handler(*args) + try: + ret = handler(*args) + except TypeError: + # legacy disconnect events do not have a reason + # argument + if event == 'disconnect': + ret = handler(*args[:-1]) + else: # pragma: no cover + raise return ret async def emit(self, event, data=None, to=None, room=None, skip_sid=None, @@ -199,11 +215,27 @@ async def trigger_event(self, event, *args): handler = getattr(self, handler_name) if asyncio.iscoroutinefunction(handler) is True: try: - ret = await handler(*args) + try: + ret = await handler(*args) + except TypeError: + # legacy disconnect events do not have a reason + # argument + if event == 'disconnect': + ret = await handler(*args[:-1]) + else: # pragma: no cover + raise except asyncio.CancelledError: # pragma: no cover ret = None else: - ret = handler(*args) + try: + ret = handler(*args) + except TypeError: + # legacy disconnect events do not have a reason + # argument + if event == 'disconnect': + ret = handler(*args[:-1]) + else: # pragma: no cover + raise return ret async def emit(self, event, data=None, namespace=None, callback=None): diff --git a/libs/socketio/async_server.py b/libs/socketio/async_server.py index 1e523ff17..f10fb8aee 100644 --- a/libs/socketio/async_server.py +++ b/libs/socketio/async_server.py @@ -385,7 +385,7 @@ def on_message(sid, msg): async with eio.session(sid) as session: print('received message from ', session['username']) """ - class _session_context_manager(object): + class _session_context_manager: def __init__(self, server, sid, namespace): self.server = server self.sid = sid @@ -427,7 +427,8 @@ async def disconnect(self, sid, namespace=None, ignore_queue=False): eio_sid = self.manager.pre_disconnect(sid, namespace=namespace) await self._send_packet(eio_sid, self.packet_class( packet.DISCONNECT, namespace=namespace)) - await self._trigger_event('disconnect', namespace, sid) + await self._trigger_event('disconnect', namespace, sid, + self.reason.SERVER_DISCONNECT) await self.manager.disconnect(sid, namespace=namespace, ignore_queue=True) @@ -575,14 +576,15 @@ async def _handle_connect(self, eio_sid, namespace, data): await self._send_packet(eio_sid, self.packet_class( packet.CONNECT, {'sid': sid}, namespace=namespace)) - async def _handle_disconnect(self, eio_sid, namespace): + async def _handle_disconnect(self, eio_sid, namespace, reason=None): """Handle a client disconnect.""" namespace = namespace or '/' sid = self.manager.sid_from_eio_sid(eio_sid, namespace) if not self.manager.is_connected(sid, namespace): # pragma: no cover return self.manager.pre_disconnect(sid, namespace=namespace) - await self._trigger_event('disconnect', namespace, sid) + await self._trigger_event('disconnect', namespace, sid, + reason or self.reason.CLIENT_DISCONNECT) await self.manager.disconnect(sid, namespace, ignore_queue=True) async def _handle_event(self, eio_sid, namespace, id, data): @@ -634,11 +636,25 @@ async def _trigger_event(self, event, namespace, *args): if handler: if asyncio.iscoroutinefunction(handler): try: - ret = await handler(*args) + try: + ret = await handler(*args) + except TypeError: + # legacy disconnect events use only one argument + if event == 'disconnect': + ret = await handler(*args[:-1]) + else: # pragma: no cover + raise except asyncio.CancelledError: # pragma: no cover ret = None else: - ret = handler(*args) + try: + ret = handler(*args) + except TypeError: + # legacy disconnect events use only one argument + if event == 'disconnect': + ret = handler(*args[:-1]) + else: # pragma: no cover + raise return ret # or else, forward the event to a namespace handler if one exists handler, args = self._get_namespace_handler(namespace, args) @@ -671,7 +687,8 @@ async def _handle_eio_message(self, eio_sid, data): if pkt.packet_type == packet.CONNECT: await self._handle_connect(eio_sid, pkt.namespace, pkt.data) elif pkt.packet_type == packet.DISCONNECT: - await self._handle_disconnect(eio_sid, pkt.namespace) + await self._handle_disconnect(eio_sid, pkt.namespace, + self.reason.CLIENT_DISCONNECT) elif pkt.packet_type == packet.EVENT: await self._handle_event(eio_sid, pkt.namespace, pkt.id, pkt.data) @@ -686,10 +703,10 @@ async def _handle_eio_message(self, eio_sid, data): else: raise ValueError('Unknown packet type.') - async def _handle_eio_disconnect(self, eio_sid): + async def _handle_eio_disconnect(self, eio_sid, reason): """Handle Engine.IO disconnect event.""" for n in list(self.manager.get_namespaces()).copy(): - await self._handle_disconnect(eio_sid, n) + await self._handle_disconnect(eio_sid, n, reason) if eio_sid in self.environ: del self.environ[eio_sid] diff --git a/libs/socketio/base_client.py b/libs/socketio/base_client.py index 1becf914c..7bf442071 100644 --- a/libs/socketio/base_client.py +++ b/libs/socketio/base_client.py @@ -3,6 +3,8 @@ import signal import threading +import engineio + from . import base_namespace from . import packet @@ -31,6 +33,7 @@ def signal_handler(sig, frame): # pragma: no cover class BaseClient: reserved_events = ['connect', 'connect_error', 'disconnect', '__disconnect_final'] + reason = engineio.Client.reason def __init__(self, reconnection=True, reconnection_attempts=0, reconnection_delay=1, reconnection_delay_max=5, @@ -285,7 +288,7 @@ def _handle_eio_connect(self): # pragma: no cover def _handle_eio_message(self, data): # pragma: no cover raise NotImplementedError() - def _handle_eio_disconnect(self): # pragma: no cover + def _handle_eio_disconnect(self, reason): # pragma: no cover raise NotImplementedError() def _engineio_client_class(self): # pragma: no cover diff --git a/libs/socketio/base_manager.py b/libs/socketio/base_manager.py index ca4b0b957..dafa60ac2 100644 --- a/libs/socketio/base_manager.py +++ b/libs/socketio/base_manager.py @@ -37,8 +37,7 @@ def get_participants(self, namespace, room): participants.update(ns[r]._fwdm if r in ns else {}) else: participants = ns[room]._fwdm.copy() if room in ns else {} - for sid, eio_sid in participants.items(): - yield sid, eio_sid + yield from participants.items() def connect(self, eio_sid, namespace): """Register a client connection to a namespace.""" diff --git a/libs/socketio/base_namespace.py b/libs/socketio/base_namespace.py index 354f75acc..14b5d8fbf 100644 --- a/libs/socketio/base_namespace.py +++ b/libs/socketio/base_namespace.py @@ -1,4 +1,4 @@ -class BaseNamespace(object): +class BaseNamespace: def __init__(self, namespace=None): self.namespace = namespace or '/' diff --git a/libs/socketio/base_server.py b/libs/socketio/base_server.py index d5a353bcb..d134eba1f 100644 --- a/libs/socketio/base_server.py +++ b/libs/socketio/base_server.py @@ -1,5 +1,7 @@ import logging +import engineio + from . import manager from . import base_namespace from . import packet @@ -9,6 +11,7 @@ class BaseServer: reserved_events = ['connect', 'disconnect'] + reason = engineio.Server.reason def __init__(self, client_manager=None, logger=False, serializer='default', json=None, async_handlers=True, always_connect=False, diff --git a/libs/socketio/client.py b/libs/socketio/client.py index d7af40708..ade2dd6f1 100644 --- a/libs/socketio/client.py +++ b/libs/socketio/client.py @@ -180,7 +180,12 @@ def wait(self): self.eio.wait() self.sleep(1) # give the reconnect task time to start up if not self._reconnect_task: - break + if self.eio.state == 'connected': # pragma: no cover + # connected while sleeping above + continue + else: + # the reconnect task gave up + break self._reconnect_task.join() if self.eio.state != 'connected': break @@ -363,7 +368,7 @@ def _send_packet(self, pkt): def _handle_connect(self, namespace, data): namespace = namespace or '/' if namespace not in self.namespaces: - self.logger.info('Namespace {} is connected'.format(namespace)) + self.logger.info(f'Namespace {namespace} is connected') self.namespaces[namespace] = (data or {}).get('sid', self.sid) self._trigger_event('connect', namespace=namespace) self._connect_event.set() @@ -372,8 +377,9 @@ def _handle_disconnect(self, namespace): if not self.connected: return namespace = namespace or '/' - self._trigger_event('disconnect', namespace=namespace) - self._trigger_event('__disconnect_final', namespace=namespace) + self._trigger_event('disconnect', namespace, + self.reason.SERVER_DISCONNECT) + self._trigger_event('__disconnect_final', namespace) if namespace in self.namespaces: del self.namespaces[namespace] if not self.namespaces: @@ -431,7 +437,14 @@ def _trigger_event(self, event, namespace, *args): # first see if we have an explicit handler for the event handler, args = self._get_event_handler(event, namespace, args) if handler: - return handler(*args) + try: + return handler(*args) + except TypeError: + # the legacy disconnect event does not take a reason argument + if event == 'disconnect': + return handler(*args[:-1]) + else: # pragma: no cover + raise # or else, forward the event to a namespace handler if one exists handler, args = self._get_namespace_handler(namespace, args) @@ -520,21 +533,21 @@ def _handle_eio_message(self, data): else: raise ValueError('Unknown packet type.') - def _handle_eio_disconnect(self): + def _handle_eio_disconnect(self, reason): """Handle the Engine.IO disconnection event.""" self.logger.info('Engine.IO connection dropped') will_reconnect = self.reconnection and self.eio.state == 'connected' if self.connected: for n in self.namespaces: - self._trigger_event('disconnect', namespace=n) + self._trigger_event('disconnect', n, reason) if not will_reconnect: - self._trigger_event('__disconnect_final', namespace=n) + self._trigger_event('__disconnect_final', n) self.namespaces = {} self.connected = False self.callbacks = {} self._binary_packet = None self.sid = None - if will_reconnect: + if will_reconnect and not self._reconnect_task: self._reconnect_task = self.start_background_task( self._handle_reconnect) diff --git a/libs/socketio/kafka_manager.py b/libs/socketio/kafka_manager.py index 4d87d46fa..11b87ad81 100644 --- a/libs/socketio/kafka_manager.py +++ b/libs/socketio/kafka_manager.py @@ -57,8 +57,7 @@ def _publish(self, data): self.producer.flush() def _kafka_listen(self): - for message in self.consumer: - yield message + yield from self.consumer def _listen(self): for message in self._kafka_listen(): diff --git a/libs/socketio/kombu_manager.py b/libs/socketio/kombu_manager.py index 0a63bc262..09e260c98 100644 --- a/libs/socketio/kombu_manager.py +++ b/libs/socketio/kombu_manager.py @@ -86,7 +86,7 @@ def _exchange(self): return kombu.Exchange(self.channel, **options) def _queue(self): - queue_name = 'flask-socketio.' + str(uuid.uuid4()) + queue_name = 'python-socketio.' + str(uuid.uuid4()) options = {'durable': False, 'queue_arguments': {'x-expires': 300000}} options.update(self.queue_options) return kombu.Queue(queue_name, self._exchange(), **options) diff --git a/libs/socketio/namespace.py b/libs/socketio/namespace.py index 3bf4f95b0..60cab7831 100644 --- a/libs/socketio/namespace.py +++ b/libs/socketio/namespace.py @@ -23,7 +23,14 @@ def trigger_event(self, event, *args): """ handler_name = 'on_' + (event or '') if hasattr(self, handler_name): - return getattr(self, handler_name)(*args) + try: + return getattr(self, handler_name)(*args) + except TypeError: + # legacy disconnect events do not have a reason argument + if event == 'disconnect': + return getattr(self, handler_name)(*args[:-1]) + else: # pragma: no cover + raise def emit(self, event, data=None, to=None, room=None, skip_sid=None, namespace=None, callback=None, ignore_queue=False): @@ -154,7 +161,14 @@ def trigger_event(self, event, *args): """ handler_name = 'on_' + (event or '') if hasattr(self, handler_name): - return getattr(self, handler_name)(*args) + try: + return getattr(self, handler_name)(*args) + except TypeError: + # legacy disconnect events do not have a reason argument + if event == 'disconnect': + return getattr(self, handler_name)(*args[:-1]) + else: # pragma: no cover + raise def emit(self, event, data=None, namespace=None, callback=None): """Emit a custom event to the server. diff --git a/libs/socketio/packet.py b/libs/socketio/packet.py index ec1b364cc..f7ad87e65 100644 --- a/libs/socketio/packet.py +++ b/libs/socketio/packet.py @@ -7,7 +7,7 @@ 'BINARY_EVENT', 'BINARY_ACK'] -class Packet(object): +class Packet: """Socket.IO packet.""" # the format of the Socket.IO packet is as follows: diff --git a/libs/socketio/redis_manager.py b/libs/socketio/redis_manager.py index ae9fa2928..a16fb2c73 100644 --- a/libs/socketio/redis_manager.py +++ b/libs/socketio/redis_manager.py @@ -94,8 +94,7 @@ def _redis_listen_with_retries(self): self._redis_connect() self.pubsub.subscribe(self.channel) retry_sleep = 1 - for message in self.pubsub.listen(): - yield message + yield from self.pubsub.listen() except redis.exceptions.RedisError: logger.error('Cannot receive from redis... ' 'retrying in {} secs'.format(retry_sleep)) diff --git a/libs/socketio/server.py b/libs/socketio/server.py index a40dcd906..71c702de1 100644 --- a/libs/socketio/server.py +++ b/libs/socketio/server.py @@ -87,7 +87,7 @@ class Server(base_server.BaseServer): is greater than this value. The default is 1024 bytes. :param cookie: If set to a string, it is the name of the HTTP cookie the - server sends back tot he client containing the client + server sends back to the client containing the client session id. If set to a dictionary, the ``'name'`` key contains the cookie name and other keys define cookie attributes, where the value of each attribute can be a @@ -363,7 +363,7 @@ def on_message(sid, msg): with sio.session(sid) as session: print('received message from ', session['username']) """ - class _session_context_manager(object): + class _session_context_manager: def __init__(self, server, sid, namespace): self.server = server self.sid = sid @@ -403,7 +403,8 @@ def disconnect(self, sid, namespace=None, ignore_queue=False): eio_sid = self.manager.pre_disconnect(sid, namespace=namespace) self._send_packet(eio_sid, self.packet_class( packet.DISCONNECT, namespace=namespace)) - self._trigger_event('disconnect', namespace, sid) + self._trigger_event('disconnect', namespace, sid, + self.reason.SERVER_DISCONNECT) self.manager.disconnect(sid, namespace=namespace, ignore_queue=True) @@ -557,14 +558,15 @@ def _handle_connect(self, eio_sid, namespace, data): self._send_packet(eio_sid, self.packet_class( packet.CONNECT, {'sid': sid}, namespace=namespace)) - def _handle_disconnect(self, eio_sid, namespace): + def _handle_disconnect(self, eio_sid, namespace, reason=None): """Handle a client disconnect.""" namespace = namespace or '/' sid = self.manager.sid_from_eio_sid(eio_sid, namespace) if not self.manager.is_connected(sid, namespace): # pragma: no cover return self.manager.pre_disconnect(sid, namespace=namespace) - self._trigger_event('disconnect', namespace, sid) + self._trigger_event('disconnect', namespace, sid, + reason or self.reason.CLIENT_DISCONNECT) self.manager.disconnect(sid, namespace, ignore_queue=True) def _handle_event(self, eio_sid, namespace, id, data): @@ -611,7 +613,14 @@ def _trigger_event(self, event, namespace, *args): # first see if we have an explicit handler for the event handler, args = self._get_event_handler(event, namespace, args) if handler: - return handler(*args) + try: + return handler(*args) + except TypeError: + # legacy disconnect events use only one argument + if event == 'disconnect': + return handler(*args[:-1]) + else: # pragma: no cover + raise # or else, forward the event to a namespace handler if one exists handler, args = self._get_namespace_handler(namespace, args) if handler: @@ -642,7 +651,8 @@ def _handle_eio_message(self, eio_sid, data): if pkt.packet_type == packet.CONNECT: self._handle_connect(eio_sid, pkt.namespace, pkt.data) elif pkt.packet_type == packet.DISCONNECT: - self._handle_disconnect(eio_sid, pkt.namespace) + self._handle_disconnect(eio_sid, pkt.namespace, + self.reason.CLIENT_DISCONNECT) elif pkt.packet_type == packet.EVENT: self._handle_event(eio_sid, pkt.namespace, pkt.id, pkt.data) elif pkt.packet_type == packet.ACK: @@ -655,10 +665,10 @@ def _handle_eio_message(self, eio_sid, data): else: raise ValueError('Unknown packet type.') - def _handle_eio_disconnect(self, eio_sid): + def _handle_eio_disconnect(self, eio_sid, reason): """Handle Engine.IO disconnect event.""" for n in list(self.manager.get_namespaces()).copy(): - self._handle_disconnect(eio_sid, n) + self._handle_disconnect(eio_sid, n, reason) if eio_sid in self.environ: del self.environ[eio_sid] diff --git a/libs/socketio/zmq_manager.py b/libs/socketio/zmq_manager.py index 760fbc387..468dc268b 100644 --- a/libs/socketio/zmq_manager.py +++ b/libs/socketio/zmq_manager.py @@ -66,7 +66,7 @@ def __init__(self, url='zmq+tcp://localhost:5555+5556', sink.connect(sink_url) sub = zmq.Context().socket(zmq.SUB) - sub.setsockopt_string(zmq.SUBSCRIBE, u'') + sub.setsockopt_string(zmq.SUBSCRIBE, '') sub.connect(sub_url) self.sink = sink diff --git a/libs/tqdm-4.66.6.dist-info/WHEEL b/libs/tqdm-4.66.6.dist-info/WHEEL deleted file mode 100644 index da25d7b42..000000000 --- a/libs/tqdm-4.66.6.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.2.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/libs/tqdm-4.66.6.dist-info/INSTALLER b/libs/tqdm-4.67.1.dist-info/INSTALLER similarity index 100% rename from libs/tqdm-4.66.6.dist-info/INSTALLER rename to libs/tqdm-4.67.1.dist-info/INSTALLER diff --git a/libs/tqdm-4.66.6.dist-info/LICENCE b/libs/tqdm-4.67.1.dist-info/LICENCE similarity index 100% rename from libs/tqdm-4.66.6.dist-info/LICENCE rename to libs/tqdm-4.67.1.dist-info/LICENCE diff --git a/libs/tqdm-4.66.6.dist-info/METADATA b/libs/tqdm-4.67.1.dist-info/METADATA similarity index 99% rename from libs/tqdm-4.66.6.dist-info/METADATA rename to libs/tqdm-4.67.1.dist-info/METADATA index a39d2312a..074db371c 100644 --- a/libs/tqdm-4.66.6.dist-info/METADATA +++ b/libs/tqdm-4.67.1.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: tqdm -Version: 4.66.6 +Version: 4.67.1 Summary: Fast, Extensible Progress Meter Maintainer-email: tqdm developers <devs@tqdm.ml> License: MPL-2.0 AND MIT @@ -72,7 +72,10 @@ Provides-Extra: dev Requires-Dist: pytest>=6; extra == "dev" Requires-Dist: pytest-cov; extra == "dev" Requires-Dist: pytest-timeout; extra == "dev" -Requires-Dist: pytest-xdist; extra == "dev" +Requires-Dist: pytest-asyncio>=0.24; extra == "dev" +Requires-Dist: nbval; extra == "dev" +Provides-Extra: discord +Requires-Dist: requests; extra == "discord" Provides-Extra: notebook Requires-Dist: ipywidgets>=6; extra == "notebook" Provides-Extra: slack diff --git a/libs/tqdm-4.66.6.dist-info/RECORD b/libs/tqdm-4.67.1.dist-info/RECORD similarity index 76% rename from libs/tqdm-4.66.6.dist-info/RECORD rename to libs/tqdm-4.67.1.dist-info/RECORD index 5ed127ab2..a642fcb16 100644 --- a/libs/tqdm-4.66.6.dist-info/RECORD +++ b/libs/tqdm-4.67.1.dist-info/RECORD @@ -1,15 +1,15 @@ ../../bin/tqdm,sha256=sIQGANa0Ss4XAwHxESDSgOd-paMFKgM1S2k-LA3IZ0c,230 -tqdm-4.66.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -tqdm-4.66.6.dist-info/LICENCE,sha256=3DMlLoKQFeOxUAhvubOkD2rW-zLC9GEM6BL6Z301mGo,1985 -tqdm-4.66.6.dist-info/METADATA,sha256=fGOzO1tkAvMSMmuQrb-to3zpcAsLN7LlJ6f8-I0L1VI,57562 -tqdm-4.66.6.dist-info/RECORD,, -tqdm-4.66.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tqdm-4.66.6.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 -tqdm-4.66.6.dist-info/entry_points.txt,sha256=ReJCH7Ui3Zyh6M16E4OhsZ1oU7WtMXCfbtoyBhGO29Y,39 -tqdm-4.66.6.dist-info/top_level.txt,sha256=NLiUJNfmc9At15s7JURiwvqMEjUi9G5PMGRrmMYzNSM,5 +tqdm-4.67.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +tqdm-4.67.1.dist-info/LICENCE,sha256=3DMlLoKQFeOxUAhvubOkD2rW-zLC9GEM6BL6Z301mGo,1985 +tqdm-4.67.1.dist-info/METADATA,sha256=P1uY9jA_X9JjzwWuS73BFHAAlAR5QyzOs7zOEHBzu2k,57675 +tqdm-4.67.1.dist-info/RECORD,, +tqdm-4.67.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +tqdm-4.67.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +tqdm-4.67.1.dist-info/entry_points.txt,sha256=ReJCH7Ui3Zyh6M16E4OhsZ1oU7WtMXCfbtoyBhGO29Y,39 +tqdm-4.67.1.dist-info/top_level.txt,sha256=NLiUJNfmc9At15s7JURiwvqMEjUi9G5PMGRrmMYzNSM,5 tqdm/__init__.py,sha256=9mQNYSSqP99JasubEC1POJLMmhkkBH6cJZxPIR5G2pQ,1572 tqdm/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 -tqdm/_dist_ver.py,sha256=pjja9d_4fZAsKZvXK6PdorstRyGb6VfRnVMJpaotC_E,23 +tqdm/_dist_ver.py,sha256=m5AdYI-jB-v6P0VJ_70isH_p24EzSOGSwVvuAZmkmKY,23 tqdm/_main.py,sha256=9ySvgmi_2Sw4CAo5UDW0Q2dxfTryboEWGHohfCJz0sA,283 tqdm/_monitor.py,sha256=Uku-DPWgzJ7dO5CK08xKJK-E_F6qQ-JB3ksuXczSYR0,3699 tqdm/_tqdm.py,sha256=LfLCuJ6bpsVo9xilmtBXyEm1vGnUCFrliW85j3J-nD4,283 @@ -25,14 +25,14 @@ tqdm/completion.sh,sha256=j79KbSmpIj_E11jfTfBXrGnUTzKXVpQ1vGVQvsyDRl4,946 tqdm/contrib/__init__.py,sha256=OgSwVXm-vlDJ-2imtoQ9z8qdom4snMSRztH72KMA82A,2494 tqdm/contrib/bells.py,sha256=Yx1HqGCmHrESCAO700j5wE__JCleNODJxedh1ijPLD0,837 tqdm/contrib/concurrent.py,sha256=K1yjloKS5WRNFyjLRth0DmU5PAnDbF0A-GD27N-J4a8,3986 -tqdm/contrib/discord.py,sha256=CCr_Rj-kodhXhp2XT06p_Uy_lM3i-ZfUC-8Tf1pga9w,3893 +tqdm/contrib/discord.py,sha256=MtVIL1s_dxH21G4sL8FBgQ4Wei23ho9Ek5T-AommvNc,5243 tqdm/contrib/itertools.py,sha256=WdKKQU5eSzsqHu29SN_oH12huYZo0Jihqoi9-nVhwz4,774 tqdm/contrib/logging.py,sha256=NsYtnKttj2mMrGm58mEdo5a9DP_2vv8pZyrimSuWulA,3760 tqdm/contrib/slack.py,sha256=eP_Mr5sQonYniHxxQNGue3jk2JkIPmPWFZqIYxnOui0,4007 tqdm/contrib/telegram.py,sha256=vn_9SATMbbwn2PAbzSDyOX6av3eBB01QBug11P4H-Og,5008 tqdm/contrib/utils_worker.py,sha256=HJP5Mz1S1xyzEke2JaqJ2sYLHXADYoo2epT5AzQ38eA,1207 tqdm/dask.py,sha256=9Ei58eVqTossRLhAfWyUFCduXYKjmLmwkaXIy-CHYfs,1319 -tqdm/gui.py,sha256=4Oi-iBTGEG3uQUFuRKR1fkqwAamABQTO6sWQmJhI6vs,5795 +tqdm/gui.py,sha256=STIB3K8iDzDgkNUqWIpvcI_u0OGtbGNy5NwpALXhfWs,5479 tqdm/keras.py,sha256=op9sBkb6q6c6dw2wJ0SD2ZwpPK7yM1Vbg4l1Qiy3MIo,4373 tqdm/notebook.py,sha256=GtZ3IapLL1v8WNDaTSvPw0bJGTyfp71Vfz5HDnAzx1M,10895 tqdm/rich.py,sha256=YyMPkEHVyYUVUR3adJKbVX26iTmNKpNMf3DEqmm-m60,5021 diff --git a/libs/tqdm-4.66.6.dist-info/REQUESTED b/libs/tqdm-4.67.1.dist-info/REQUESTED similarity index 100% rename from libs/tqdm-4.66.6.dist-info/REQUESTED rename to libs/tqdm-4.67.1.dist-info/REQUESTED diff --git a/libs/tqdm-4.67.1.dist-info/WHEEL b/libs/tqdm-4.67.1.dist-info/WHEEL new file mode 100644 index 000000000..9b78c4451 --- /dev/null +++ b/libs/tqdm-4.67.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.3.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/tqdm-4.66.6.dist-info/entry_points.txt b/libs/tqdm-4.67.1.dist-info/entry_points.txt similarity index 100% rename from libs/tqdm-4.66.6.dist-info/entry_points.txt rename to libs/tqdm-4.67.1.dist-info/entry_points.txt diff --git a/libs/tqdm-4.66.6.dist-info/top_level.txt b/libs/tqdm-4.67.1.dist-info/top_level.txt similarity index 100% rename from libs/tqdm-4.66.6.dist-info/top_level.txt rename to libs/tqdm-4.67.1.dist-info/top_level.txt diff --git a/libs/tqdm/_dist_ver.py b/libs/tqdm/_dist_ver.py index dd70c503d..61af7d5bb 100644 --- a/libs/tqdm/_dist_ver.py +++ b/libs/tqdm/_dist_ver.py @@ -1 +1 @@ -__version__ = '4.66.6' +__version__ = '4.67.1' diff --git a/libs/tqdm/contrib/discord.py b/libs/tqdm/contrib/discord.py index fd663f981..574baa84b 100644 --- a/libs/tqdm/contrib/discord.py +++ b/libs/tqdm/contrib/discord.py @@ -8,49 +8,83 @@ ![screenshot](https://tqdm.github.io/img/screenshot-discord.png) """ -import logging from os import getenv +from warnings import warn -try: - from disco.client import Client, ClientConfig -except ImportError: - raise ImportError("Please `pip install disco-py`") +from requests import Session +from requests.utils import default_user_agent from ..auto import tqdm as tqdm_auto +from ..std import TqdmWarning +from ..version import __version__ from .utils_worker import MonoWorker -__author__ = {"github.com/": ["casperdcl"]} +__author__ = {"github.com/": ["casperdcl", "guigoruiz1"]} __all__ = ['DiscordIO', 'tqdm_discord', 'tdrange', 'tqdm', 'trange'] class DiscordIO(MonoWorker): """Non-blocking file-like IO using a Discord Bot.""" + API = "https://discord.com/api/v10" + UA = f"tqdm (https://tqdm.github.io, {__version__}) {default_user_agent()}" + def __init__(self, token, channel_id): """Creates a new message in the given `channel_id`.""" super().__init__() - config = ClientConfig() - config.token = token - client = Client(config) + self.token = token + self.channel_id = channel_id + self.session = Session() self.text = self.__class__.__name__ + self.message_id + + @property + def message_id(self): + if hasattr(self, '_message_id'): + return self._message_id try: - self.message = client.api.channels_messages_create(channel_id, self.text) + res = self.session.post( + f'{self.API}/channels/{self.channel_id}/messages', + headers={'Authorization': f'Bot {self.token}', 'User-Agent': self.UA}, + json={'content': f"`{self.text}`"}).json() except Exception as e: tqdm_auto.write(str(e)) - self.message = None + else: + if res.get('error_code') == 429: + warn("Creation rate limit: try increasing `mininterval`.", + TqdmWarning, stacklevel=2) + else: + self._message_id = res['id'] + return self._message_id def write(self, s): - """Replaces internal `message`'s text with `s`.""" + """Replaces internal `message_id`'s text with `s`.""" if not s: s = "..." s = s.replace('\r', '').strip() if s == self.text: - return # skip duplicate message - message = self.message - if message is None: + return # avoid duplicate message Bot error + message_id = self.message_id + if message_id is None: return self.text = s try: - future = self.submit(message.edit, '`' + s + '`') + future = self.submit( + self.session.patch, + f'{self.API}/channels/{self.channel_id}/messages/{message_id}', + headers={'Authorization': f'Bot {self.token}', 'User-Agent': self.UA}, + json={'content': f"`{self.text}`"}) + except Exception as e: + tqdm_auto.write(str(e)) + else: + return future + + def delete(self): + """Deletes internal `message_id`.""" + try: + future = self.submit( + self.session.delete, + f'{self.API}/channels/{self.channel_id}/messages/{self.message_id}', + headers={'Authorization': f'Bot {self.token}', 'User-Agent': self.UA}) except Exception as e: tqdm_auto.write(str(e)) else: @@ -75,22 +109,18 @@ def __init__(self, *args, **kwargs): """ Parameters ---------- - token : str, required. Discord token + token : str, required. Discord bot token [default: ${TQDM_DISCORD_TOKEN}]. channel_id : int, required. Discord channel ID [default: ${TQDM_DISCORD_CHANNEL_ID}]. - mininterval : float, optional. - Minimum of [default: 1.5] to avoid rate limit. See `tqdm.auto.tqdm.__init__` for other parameters. """ if not kwargs.get('disable'): kwargs = kwargs.copy() - logging.getLogger("HTTPClient").setLevel(logging.WARNING) self.dio = DiscordIO( - kwargs.pop('token', getenv("TQDM_DISCORD_TOKEN")), - kwargs.pop('channel_id', getenv("TQDM_DISCORD_CHANNEL_ID"))) - kwargs['mininterval'] = max(1.5, kwargs.get('mininterval', 1.5)) + kwargs.pop('token', getenv('TQDM_DISCORD_TOKEN')), + kwargs.pop('channel_id', getenv('TQDM_DISCORD_CHANNEL_ID'))) super().__init__(*args, **kwargs) def display(self, **kwargs): @@ -108,6 +138,13 @@ def clear(self, *args, **kwargs): if not self.disable: self.dio.write("") + def close(self): + if self.disable: + return + super().close() + if not (self.leave or (self.leave is None and self.pos == 0)): + self.dio.delete() + def tdrange(*args, **kwargs): """Shortcut for `tqdm.contrib.discord.tqdm(range(*args), **kwargs)`.""" diff --git a/libs/tqdm/gui.py b/libs/tqdm/gui.py index 1a806819e..cb52fb91a 100644 --- a/libs/tqdm/gui.py +++ b/libs/tqdm/gui.py @@ -122,6 +122,7 @@ def display(self, *_, **__): ax = self.ax line1 = self.line1 line2 = self.line2 + hspan = getattr(self, 'hspan', None) # instantaneous rate y = delta_it / delta_t # overall rate @@ -148,18 +149,10 @@ def display(self, *_, **__): if total: line1.set_data(xdata, ydata) line2.set_data(xdata, zdata) - try: - poly_lims = self.hspan.get_xy() - except AttributeError: - self.hspan = self.plt.axhspan(0, 0.001, xmin=0, xmax=0, color='g') - poly_lims = self.hspan.get_xy() - poly_lims[0, 1] = ymin - poly_lims[1, 1] = ymax - poly_lims[2] = [n / total, ymax] - poly_lims[3] = [poly_lims[2, 0], ymin] - if len(poly_lims) > 4: - poly_lims[4, 1] = ymin - self.hspan.set_xy(poly_lims) + if hspan: + hspan.set_xy((0, ymin)) + hspan.set_height(ymax - ymin) + hspan.set_width(n / total) else: t_ago = [cur_t - i for i in xdata] line1.set_data(t_ago, ydata) diff --git a/libs/urllib3-2.2.3.dist-info/METADATA b/libs/urllib3-2.2.3.dist-info/METADATA index 0b7645966..ba2fbba44 100644 --- a/libs/urllib3-2.2.3.dist-info/METADATA +++ b/libs/urllib3-2.2.3.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.3 +Metadata-Version: 2.4 Name: urllib3 Version: 2.2.3 Summary: HTTP library with thread-safe connection pooling, file post, and more. diff --git a/libs/urllib3-2.2.3.dist-info/RECORD b/libs/urllib3-2.2.3.dist-info/RECORD index a1f482b64..25833bd90 100644 --- a/libs/urllib3-2.2.3.dist-info/RECORD +++ b/libs/urllib3-2.2.3.dist-info/RECORD @@ -1,8 +1,8 @@ urllib3-2.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -urllib3-2.2.3.dist-info/METADATA,sha256=NpyLMYu-QoAmQK6pmmgoZRuq0HPt-lf_J9zIuCGMRNY,6485 +urllib3-2.2.3.dist-info/METADATA,sha256=T1CN4mjm6UV2ZV71tZfPSPDYimBCcm6nqJrZMGmH8S0,6485 urllib3-2.2.3.dist-info/RECORD,, urllib3-2.2.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -urllib3-2.2.3.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +urllib3-2.2.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 urllib3-2.2.3.dist-info/licenses/LICENSE.txt,sha256=Ew46ZNX91dCWp1JpRjSn2d8oRGnehuVzIQAmgEHj1oY,1093 urllib3/__init__.py,sha256=JMo1tg1nIV1AeJ2vENC_Txfl0e5h6Gzl9DGVk1rWRbo,6979 urllib3/_base_connection.py,sha256=tH0ZlOxWKika-S9NW-MuIlI_PLFQUUmSnoE_9MeywkM,5652 diff --git a/libs/urllib3-2.2.3.dist-info/WHEEL b/libs/urllib3-2.2.3.dist-info/WHEEL index cdd68a497..12228d414 100644 --- a/libs/urllib3-2.2.3.dist-info/WHEEL +++ b/libs/urllib3-2.2.3.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.25.0 +Generator: hatchling 1.27.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/version.txt b/libs/version.txt index 1ae8ab2e6..220a85d6b 100644 --- a/libs/version.txt +++ b/libs/version.txt @@ -1,35 +1,35 @@ # Bazarr dependencies -alembic==1.13.3 +alembic==1.14.0 aniso8601==9.0.1 -apprise==1.9.0 +apprise==1.9.1 apscheduler<=3.10.4 -attrs==24.2.0 -blinker==1.8.2 -charset-normalizer==3.4.0 +attrs==24.3.0 +blinker==1.9.0 +charset-normalizer==3.4.1 deep-translator==1.11.4 dogpile.cache==1.3.3 dynaconf==3.2.6 fese==0.3.0 -ffsubsync==0.4.26 +ffsubsync==0.4.27 flask-cors==5.0.0 flask-migrate==4.0.7 flask-restx==1.3.0 -Flask-SocketIO==5.4.1 +Flask-SocketIO==5.5.0 flask_sqlalchemy==3.1.1 -Flask==3.0.3 +Flask==3.1.0 ga4mp==2.0.4 guess_language-spirit==0.5.3 guessit==3.8.0 h11==0.14.0 -inflect==7.4.0 +inflect==7.5.0 jsonschema<=4.17.3 # newer version require other compiled dependency knowit<=0.5.3 # newer version doesn't support Python 3.8 anymore -Mako==1.3.6 +Mako==1.3.8 pycountry==24.6.1 pyrsistent==0.20.0 -pysubs2==1.7.3 -python-engineio==4.10.1 -python-socketio==5.11.4 +pysubs2==1.8.0 +python-engineio==4.11.1 +python-socketio==5.12.0 pytz==2024.2 pytz_deprecation_shim==0.1.0.post0 rarfile==4.2 @@ -41,7 +41,7 @@ simple-websocket==1.1.0 sqlalchemy==2.0.36 textdistance==4.6.3 unidecode==1.3.8 -waitress==3.0.0 +waitress==3.0.2 whichcraft==0.6.1 wsproto==1.2.0 @@ -63,22 +63,22 @@ soupsieve==2.3.2.post1 auditok<=0.1.5 # do not upgrade unless ffsubsync requirements.txt change ffmpeg-python==0.2.0 future==1.0.0 -rich==13.9.3 +rich==13.9.4 srt==3.5.3 -tqdm==4.66.6 +tqdm==4.67.1 typing_extensions==4.12.2 # Required-by: flask -click==8.1.7 +click==8.1.8 itsdangerous==2.2.0 -jinja2==3.1.4 -werkzeug==3.0.6 +jinja2==3.1.5 +werkzeug==3.1.3 # Required-by: guessit python-dateutil==2.9.0 importlib_resources==6.4.5 rebulk==3.2.0 -zipp==3.20.2 +zipp==3.21.0 # Required-by: jinja2 markupsafe<=2.1.5 # newer version doesn't support Python 3.8 anymore @@ -106,10 +106,10 @@ babelfish==0.6.1 beautifulsoup4==4.12.3 chardet==5.2.0 pysrt==1.1.2 -stevedore==5.3.0 +stevedore==5.4.0 # Required-by: subliminal_patch -cloudscraper==1.2.58 # newer version dropped captcha v1 support +cloudscraper<=1.2.58 # newer version dropped captcha v1 support decorator==5.1.1 dnspython<=2.6.1 # newer version doesn't support Python 3.8 anymore enzyme==0.5.2 @@ -121,23 +121,23 @@ pyjsparser==2.7.1 pyparsing<=3.1.4 # newer version doesn't support Python 3.8 anymore python-anticaptcha==1.0.0 retry==0.9.2 -six==1.16.0 +six==1.17.0 wcwidth==0.2.13 webencodings==0.5.1 # Required-by: subzero backports.functools-lru-cache==2.0.0 -fcache==0.5.2 +fcache==0.6.0 json_tricks==3.17.3 tld==0.13 platformdirs==4.3.6 # Required-by: requests -certifi==2024.8.30 +certifi==2024.12.14 idna==3.10 oauthlib==3.2.2 requests_toolbelt==1.0.0 -urllib3==2.2.3 +urllib3==2.3.0 # Required-by: rich colorama==0.4.6 diff --git a/libs/waitress-3.0.0.dist-info/RECORD b/libs/waitress-3.0.0.dist-info/RECORD index 5df5c85b3..e3399e0ca 100644 --- a/libs/waitress-3.0.0.dist-info/RECORD +++ b/libs/waitress-3.0.0.dist-info/RECORD @@ -4,7 +4,7 @@ waitress-3.0.0.dist-info/LICENSE.txt,sha256=PmcdsR32h1FswdtbPWXkqjg-rKPCDOo_r1Og waitress-3.0.0.dist-info/METADATA,sha256=LcIRiiQFPBQfYWZELvGinG7VDEEob2Rwxs50fHvzhfE,4205 waitress-3.0.0.dist-info/RECORD,, waitress-3.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -waitress-3.0.0.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +waitress-3.0.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 waitress-3.0.0.dist-info/entry_points.txt,sha256=tDR8epG2g4I70Lak9d-1qTHbCfBzZd5FDEScAkVuH_E,106 waitress-3.0.0.dist-info/top_level.txt,sha256=_kFnXYtDXvRWHSXprH53h56AM2jDfY-Y7sgIakVEImI,9 waitress/__init__.py,sha256=XucLsghawSMTlUAAZ6ToN5qKZyJNv3iolYYgx812a5o,1370 diff --git a/libs/waitress-3.0.0.dist-info/WHEEL b/libs/waitress-3.0.0.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/waitress-3.0.0.dist-info/WHEEL +++ b/libs/waitress-3.0.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/werkzeug-3.0.6.dist-info/METADATA b/libs/werkzeug-3.0.6.dist-info/METADATA index b7cfe0a10..f1c1cd698 100644 --- a/libs/werkzeug-3.0.6.dist-info/METADATA +++ b/libs/werkzeug-3.0.6.dist-info/METADATA @@ -1,4 +1,4 @@ -Metadata-Version: 2.1 +Metadata-Version: 2.3 Name: Werkzeug Version: 3.0.6 Summary: The comprehensive WSGI web application library. diff --git a/libs/werkzeug-3.0.6.dist-info/RECORD b/libs/werkzeug-3.0.6.dist-info/RECORD index 64d539c77..ef485e659 100644 --- a/libs/werkzeug-3.0.6.dist-info/RECORD +++ b/libs/werkzeug-3.0.6.dist-info/RECORD @@ -1,9 +1,9 @@ werkzeug-3.0.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 werkzeug-3.0.6.dist-info/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 -werkzeug-3.0.6.dist-info/METADATA,sha256=im31HsOnwlqXdpNMK9QeIqZNo8hRiVBl7pCusz3C8sU,3682 +werkzeug-3.0.6.dist-info/METADATA,sha256=pY6ipkBHFQjk6kAjpXsHAaeFxkdNV-s2VmyCrIb6_mQ,3682 werkzeug-3.0.6.dist-info/RECORD,, werkzeug-3.0.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -werkzeug-3.0.6.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +werkzeug-3.0.6.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82 werkzeug/__init__.py,sha256=HX_PSY5E2vtVlD3R4YblwBRCjg7j3Tlm3LASbYqOSkU,727 werkzeug/_internal.py,sha256=su1olkbHMkzt0VKcEkPLCha8sdVzXNBuqW6YVpp8GHg,5545 werkzeug/_reloader.py,sha256=QuMO-UwuD-cHsUpwSEUr7iYNbv_ziHFhgNDAiv25J80,15429 diff --git a/libs/werkzeug-3.0.6.dist-info/WHEEL b/libs/werkzeug-3.0.6.dist-info/WHEEL index 3b5e64b5e..e3c6feefa 100644 --- a/libs/werkzeug-3.0.6.dist-info/WHEEL +++ b/libs/werkzeug-3.0.6.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: flit 3.9.0 +Generator: flit 3.10.1 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/zipp-3.20.2.dist-info/RECORD b/libs/zipp-3.20.2.dist-info/RECORD index b53660496..1cb96b42f 100644 --- a/libs/zipp-3.20.2.dist-info/RECORD +++ b/libs/zipp-3.20.2.dist-info/RECORD @@ -3,7 +3,7 @@ zipp-3.20.2.dist-info/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E zipp-3.20.2.dist-info/METADATA,sha256=BY9j659m6ayOwffzL5nKNwcZW5S5Ms2LVHQJ4qspY1g,3682 zipp-3.20.2.dist-info/RECORD,, zipp-3.20.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -zipp-3.20.2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +zipp-3.20.2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 zipp-3.20.2.dist-info/top_level.txt,sha256=iAbdoSHfaGqBfVb2XuR9JqSQHCoOsOtG6y9C_LSpqFw,5 zipp/__init__.py,sha256=WFZd5W532NrC0tyPAEqzjk2xifPH7BePG0L2PPihoM0,11831 zipp/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/libs/zipp-3.20.2.dist-info/WHEEL b/libs/zipp-3.20.2.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/zipp-3.20.2.dist-info/WHEEL +++ b/libs/zipp-3.20.2.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any From ce64702e2a38154eebc45cfe7874c908e81348d6 Mon Sep 17 00:00:00 2001 From: morpheus65535 <louis_vezina@hotmail.com> Date: Thu, 16 Jan 2025 06:32:29 -0500 Subject: [PATCH 6/7] wip --- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 8 +- .../RECORD | 16 +- .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 libs/Flask_SocketIO-5.5.0.dist-info/RECORD | 10 - .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 4 +- libs/Flask_SocketIO-5.5.1.dist-info/RECORD | 10 + .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 libs/SQLAlchemy-2.0.36.dist-info/RECORD | 275 ------ .../INSTALLER | 0 .../LICENSE | 2 +- .../METADATA | 4 +- libs/SQLAlchemy-2.0.37.dist-info/RECORD | 275 ++++++ .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 .../INSTALLER | 0 .../LICENSE | 2 +- .../METADATA | 11 +- libs/aniso8601-10.0.0.dist-info/RECORD | 34 + .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 libs/aniso8601-9.0.1.dist-info/RECORD | 34 - libs/aniso8601/__init__.py | 4 +- libs/aniso8601/builders/__init__.py | 34 +- libs/aniso8601/builders/python.py | 39 +- libs/aniso8601/builders/tests/__init__.py | 2 +- libs/aniso8601/builders/tests/test_init.py | 2 +- libs/aniso8601/builders/tests/test_python.py | 19 +- libs/aniso8601/compat.py | 2 +- libs/aniso8601/date.py | 13 +- libs/aniso8601/decimalfraction.py | 2 +- libs/aniso8601/duration.py | 12 +- libs/aniso8601/exceptions.py | 2 +- libs/aniso8601/interval.py | 22 +- libs/aniso8601/resolution.py | 2 +- libs/aniso8601/tests/__init__.py | 2 +- libs/aniso8601/tests/compat.py | 2 +- libs/aniso8601/tests/test_compat.py | 2 +- libs/aniso8601/tests/test_date.py | 16 +- libs/aniso8601/tests/test_decimalfraction.py | 2 +- libs/aniso8601/tests/test_duration.py | 2 +- libs/aniso8601/tests/test_init.py | 2 +- libs/aniso8601/tests/test_interval.py | 2 +- libs/aniso8601/tests/test_time.py | 2 +- libs/aniso8601/tests/test_timezone.py | 2 +- libs/aniso8601/tests/test_utcoffset.py | 2 +- libs/aniso8601/time.py | 4 +- libs/aniso8601/timezone.py | 11 +- libs/aniso8601/utcoffset.py | 4 +- libs/apprise-1.9.1.dist-info/RECORD | 204 ---- .../INSTALLER | 0 .../LICENSE | 2 +- .../METADATA | 8 +- libs/apprise-1.9.2.dist-info/RECORD | 204 ++++ .../REQUESTED | 0 .../WHEEL | 0 .../entry_points.txt | 0 .../top_level.txt | 0 libs/apprise/__init__.py | 8 +- libs/apprise/apprise.py | 2 +- libs/apprise/apprise_attachment.py | 2 +- libs/apprise/apprise_config.py | 2 +- libs/apprise/asset.py | 2 +- libs/apprise/attachment/__init__.py | 2 +- libs/apprise/attachment/base.py | 2 +- libs/apprise/attachment/file.py | 2 +- libs/apprise/attachment/http.py | 2 +- libs/apprise/attachment/memory.py | 2 +- libs/apprise/cli.py | 4 +- libs/apprise/common.py | 2 +- libs/apprise/config/__init__.py | 2 +- libs/apprise/config/base.py | 2 +- libs/apprise/config/file.py | 2 +- libs/apprise/config/http.py | 2 +- libs/apprise/config/memory.py | 2 +- libs/apprise/conversion.py | 2 +- libs/apprise/decorators/__init__.py | 2 +- libs/apprise/decorators/base.py | 2 +- libs/apprise/decorators/notify.py | 2 +- libs/apprise/emojis.py | 2 +- libs/apprise/exception.py | 2 +- libs/apprise/locale.py | 2 +- libs/apprise/logger.py | 2 +- libs/apprise/manager.py | 2 +- libs/apprise/manager_attachment.py | 2 +- libs/apprise/manager_config.py | 2 +- libs/apprise/manager_plugins.py | 2 +- libs/apprise/persistent_store.py | 2 +- libs/apprise/plugins/__init__.py | 2 +- libs/apprise/plugins/africas_talking.py | 2 +- libs/apprise/plugins/apprise_api.py | 2 +- libs/apprise/plugins/aprs.py | 2 +- libs/apprise/plugins/bark.py | 2 +- libs/apprise/plugins/base.py | 2 +- libs/apprise/plugins/bulksms.py | 2 +- libs/apprise/plugins/bulkvs.py | 2 +- libs/apprise/plugins/burstsms.py | 2 +- .../plugins/{chantify.py => chanify.py} | 36 +- libs/apprise/plugins/clicksend.py | 2 +- libs/apprise/plugins/custom_form.py | 2 +- libs/apprise/plugins/custom_json.py | 2 +- libs/apprise/plugins/custom_xml.py | 2 +- libs/apprise/plugins/d7networks.py | 2 +- libs/apprise/plugins/dapnet.py | 2 +- libs/apprise/plugins/dbus.py | 2 +- libs/apprise/plugins/dingtalk.py | 2 +- libs/apprise/plugins/discord.py | 25 +- libs/apprise/plugins/email/__init__.py | 2 +- libs/apprise/plugins/email/base.py | 2 +- libs/apprise/plugins/email/common.py | 2 +- libs/apprise/plugins/email/templates.py | 2 +- libs/apprise/plugins/emby.py | 2 +- libs/apprise/plugins/enigma2.py | 2 +- libs/apprise/plugins/fcm/__init__.py | 2 +- libs/apprise/plugins/fcm/color.py | 2 +- libs/apprise/plugins/fcm/common.py | 2 +- libs/apprise/plugins/fcm/oauth.py | 2 +- libs/apprise/plugins/fcm/priority.py | 2 +- libs/apprise/plugins/feishu.py | 2 +- libs/apprise/plugins/flock.py | 2 +- libs/apprise/plugins/freemobile.py | 2 +- libs/apprise/plugins/gnome.py | 2 +- libs/apprise/plugins/google_chat.py | 2 +- libs/apprise/plugins/gotify.py | 2 +- libs/apprise/plugins/growl.py | 2 +- libs/apprise/plugins/guilded.py | 2 +- libs/apprise/plugins/home_assistant.py | 2 +- libs/apprise/plugins/httpsms.py | 2 +- libs/apprise/plugins/ifttt.py | 2 +- libs/apprise/plugins/join.py | 2 +- libs/apprise/plugins/kavenegar.py | 2 +- libs/apprise/plugins/kumulos.py | 2 +- libs/apprise/plugins/lametric.py | 2 +- libs/apprise/plugins/line.py | 2 +- libs/apprise/plugins/lunasea.py | 2 +- libs/apprise/plugins/macosx.py | 2 +- libs/apprise/plugins/mailgun.py | 2 +- libs/apprise/plugins/mastodon.py | 2 +- libs/apprise/plugins/matrix.py | 2 +- libs/apprise/plugins/mattermost.py | 2 +- libs/apprise/plugins/messagebird.py | 2 +- libs/apprise/plugins/misskey.py | 2 +- libs/apprise/plugins/mqtt.py | 2 +- libs/apprise/plugins/msg91.py | 2 +- libs/apprise/plugins/msteams.py | 4 +- libs/apprise/plugins/nextcloud.py | 2 +- libs/apprise/plugins/nextcloudtalk.py | 2 +- libs/apprise/plugins/notica.py | 2 +- libs/apprise/plugins/notifiarr.py | 2 +- libs/apprise/plugins/notifico.py | 2 +- libs/apprise/plugins/ntfy.py | 2 +- libs/apprise/plugins/office365.py | 4 +- libs/apprise/plugins/one_signal.py | 2 +- libs/apprise/plugins/opsgenie.py | 2 +- libs/apprise/plugins/pagerduty.py | 2 +- libs/apprise/plugins/pagertree.py | 2 +- libs/apprise/plugins/parseplatform.py | 2 +- libs/apprise/plugins/popcorn_notify.py | 2 +- libs/apprise/plugins/prowl.py | 2 +- libs/apprise/plugins/pushbullet.py | 2 +- libs/apprise/plugins/pushdeer.py | 2 +- libs/apprise/plugins/pushed.py | 2 +- libs/apprise/plugins/pushjet.py | 2 +- libs/apprise/plugins/pushme.py | 2 +- libs/apprise/plugins/pushover.py | 2 +- libs/apprise/plugins/pushsafer.py | 2 +- libs/apprise/plugins/pushy.py | 2 +- libs/apprise/plugins/reddit.py | 2 +- libs/apprise/plugins/revolt.py | 2 +- libs/apprise/plugins/rocketchat.py | 2 +- libs/apprise/plugins/rsyslog.py | 2 +- libs/apprise/plugins/ryver.py | 2 +- libs/apprise/plugins/sendgrid.py | 2 +- libs/apprise/plugins/serverchan.py | 2 +- libs/apprise/plugins/ses.py | 2 +- libs/apprise/plugins/seven.py | 2 +- libs/apprise/plugins/sfr.py | 2 +- libs/apprise/plugins/signal_api.py | 2 +- libs/apprise/plugins/simplepush.py | 2 +- libs/apprise/plugins/sinch.py | 2 +- libs/apprise/plugins/slack.py | 2 +- libs/apprise/plugins/smseagle.py | 2 +- libs/apprise/plugins/smsmanager.py | 2 +- libs/apprise/plugins/smtp2go.py | 2 +- libs/apprise/plugins/sns.py | 2 +- libs/apprise/plugins/sparkpost.py | 2 +- libs/apprise/plugins/splunk.py | 2 +- libs/apprise/plugins/streamlabs.py | 2 +- libs/apprise/plugins/synology.py | 2 +- libs/apprise/plugins/syslog.py | 2 +- libs/apprise/plugins/techuluspush.py | 2 +- libs/apprise/plugins/telegram.py | 2 +- libs/apprise/plugins/threema.py | 2 +- libs/apprise/plugins/twilio.py | 2 +- libs/apprise/plugins/twist.py | 2 +- libs/apprise/plugins/twitter.py | 2 +- libs/apprise/plugins/voipms.py | 2 +- libs/apprise/plugins/vonage.py | 2 +- libs/apprise/plugins/webexteams.py | 2 +- libs/apprise/plugins/wecombot.py | 2 +- libs/apprise/plugins/whatsapp.py | 2 +- libs/apprise/plugins/windows.py | 2 +- libs/apprise/plugins/workflows.py | 2 +- libs/apprise/plugins/wxpusher.py | 2 +- libs/apprise/plugins/xbmc.py | 2 +- libs/apprise/plugins/zulip.py | 2 +- libs/apprise/url.py | 2 +- libs/apprise/utils/__init__.py | 2 +- libs/apprise/utils/base64.py | 2 +- libs/apprise/utils/cwe312.py | 2 +- libs/apprise/utils/disk.py | 2 +- libs/apprise/utils/logic.py | 2 +- libs/apprise/utils/module.py | 2 +- libs/apprise/utils/parse.py | 18 +- libs/apprise/utils/pgp.py | 2 +- libs/apprise/utils/singleton.py | 2 +- libs/apprise/utils/templates.py | 2 +- libs/engineio/socket.py | 3 +- libs/flask_migrate/cli.py | 37 +- .../RECORD | 2 +- .../importlib_resources-6.4.5.dist-info/WHEEL | 2 +- libs/pygments-2.18.0.dist-info/RECORD | 336 ------- .../INSTALLER | 0 .../METADATA | 7 +- libs/pygments-2.19.1.dist-info/RECORD | 346 +++++++ .../REQUESTED | 0 .../WHEEL | 2 +- .../entry_points.txt | 0 .../licenses/AUTHORS | 8 + .../licenses/LICENSE | 0 libs/pygments/__init__.py | 4 +- libs/pygments/__main__.py | 2 +- libs/pygments/cmdline.py | 2 +- libs/pygments/console.py | 2 +- libs/pygments/filter.py | 2 +- libs/pygments/filters/__init__.py | 2 +- libs/pygments/formatter.py | 2 +- libs/pygments/formatters/__init__.py | 2 +- libs/pygments/formatters/_mapping.py | 0 libs/pygments/formatters/bbcode.py | 2 +- libs/pygments/formatters/groff.py | 2 +- libs/pygments/formatters/html.py | 16 +- libs/pygments/formatters/img.py | 5 +- libs/pygments/formatters/irc.py | 2 +- libs/pygments/formatters/latex.py | 2 +- libs/pygments/formatters/other.py | 2 +- libs/pygments/formatters/pangomarkup.py | 2 +- libs/pygments/formatters/rtf.py | 2 +- libs/pygments/formatters/svg.py | 2 +- libs/pygments/formatters/terminal.py | 2 +- libs/pygments/formatters/terminal256.py | 2 +- libs/pygments/lexer.py | 2 +- libs/pygments/lexers/__init__.py | 2 +- libs/pygments/lexers/_ada_builtins.py | 2 +- libs/pygments/lexers/_asy_builtins.py | 2 +- libs/pygments/lexers/_cl_builtins.py | 2 +- libs/pygments/lexers/_cocoa_builtins.py | 2 +- libs/pygments/lexers/_csound_builtins.py | 2 +- libs/pygments/lexers/_css_builtins.py | 2 +- libs/pygments/lexers/_googlesql_builtins.py | 918 ++++++++++++++++++ libs/pygments/lexers/_julia_builtins.py | 2 +- libs/pygments/lexers/_lasso_builtins.py | 2 +- libs/pygments/lexers/_lilypond_builtins.py | 2 +- libs/pygments/lexers/_lua_builtins.py | 2 +- libs/pygments/lexers/_luau_builtins.py | 2 +- libs/pygments/lexers/_mapping.py | 19 +- libs/pygments/lexers/_mql_builtins.py | 2 +- libs/pygments/lexers/_mysql_builtins.py | 2 +- libs/pygments/lexers/_openedge_builtins.py | 2 +- libs/pygments/lexers/_php_builtins.py | 2 +- libs/pygments/lexers/_postgres_builtins.py | 2 +- libs/pygments/lexers/_qlik_builtins.py | 2 +- libs/pygments/lexers/_scheme_builtins.py | 2 +- libs/pygments/lexers/_scilab_builtins.py | 2 +- libs/pygments/lexers/_sourcemod_builtins.py | 2 +- libs/pygments/lexers/_stan_builtins.py | 2 +- libs/pygments/lexers/_stata_builtins.py | 2 +- libs/pygments/lexers/_tsql_builtins.py | 2 +- libs/pygments/lexers/_usd_builtins.py | 2 +- libs/pygments/lexers/_vbscript_builtins.py | 2 +- libs/pygments/lexers/_vim_builtins.py | 2 +- libs/pygments/lexers/actionscript.py | 2 +- libs/pygments/lexers/ada.py | 2 +- libs/pygments/lexers/agile.py | 2 +- libs/pygments/lexers/algebra.py | 3 +- libs/pygments/lexers/ambient.py | 2 +- libs/pygments/lexers/amdgpu.py | 2 +- libs/pygments/lexers/ampl.py | 2 +- libs/pygments/lexers/apdlexer.py | 2 +- libs/pygments/lexers/apl.py | 2 +- libs/pygments/lexers/archetype.py | 2 +- libs/pygments/lexers/arrow.py | 2 +- libs/pygments/lexers/arturo.py | 2 +- libs/pygments/lexers/asc.py | 2 +- libs/pygments/lexers/asm.py | 41 +- libs/pygments/lexers/asn1.py | 2 +- libs/pygments/lexers/automation.py | 2 +- libs/pygments/lexers/bare.py | 2 +- libs/pygments/lexers/basic.py | 2 +- libs/pygments/lexers/bdd.py | 2 +- libs/pygments/lexers/berry.py | 2 +- libs/pygments/lexers/bibtex.py | 2 +- libs/pygments/lexers/blueprint.py | 2 +- libs/pygments/lexers/boa.py | 2 +- libs/pygments/lexers/bqn.py | 33 +- libs/pygments/lexers/business.py | 2 +- libs/pygments/lexers/c_cpp.py | 2 +- libs/pygments/lexers/c_like.py | 2 +- libs/pygments/lexers/capnproto.py | 2 +- libs/pygments/lexers/carbon.py | 2 +- libs/pygments/lexers/cddl.py | 2 +- libs/pygments/lexers/chapel.py | 2 +- libs/pygments/lexers/clean.py | 2 +- libs/pygments/lexers/codeql.py | 80 ++ libs/pygments/lexers/comal.py | 2 +- libs/pygments/lexers/compiled.py | 2 +- libs/pygments/lexers/configs.py | 15 +- libs/pygments/lexers/console.py | 2 +- libs/pygments/lexers/cplint.py | 2 +- libs/pygments/lexers/crystal.py | 2 +- libs/pygments/lexers/csound.py | 2 +- libs/pygments/lexers/css.py | 4 +- libs/pygments/lexers/d.py | 2 +- libs/pygments/lexers/dalvik.py | 2 +- libs/pygments/lexers/data.py | 2 +- libs/pygments/lexers/dax.py | 2 +- libs/pygments/lexers/devicetree.py | 2 +- libs/pygments/lexers/diff.py | 2 +- libs/pygments/lexers/dns.py | 2 +- libs/pygments/lexers/dotnet.py | 53 +- libs/pygments/lexers/dsls.py | 2 +- libs/pygments/lexers/dylan.py | 6 +- libs/pygments/lexers/ecl.py | 2 +- libs/pygments/lexers/eiffel.py | 2 +- libs/pygments/lexers/elm.py | 2 +- libs/pygments/lexers/elpi.py | 43 +- libs/pygments/lexers/email.py | 2 +- libs/pygments/lexers/erlang.py | 2 +- libs/pygments/lexers/esoteric.py | 2 +- libs/pygments/lexers/ezhil.py | 2 +- libs/pygments/lexers/factor.py | 2 +- libs/pygments/lexers/fantom.py | 2 +- libs/pygments/lexers/felix.py | 2 +- libs/pygments/lexers/fift.py | 2 +- libs/pygments/lexers/floscript.py | 2 +- libs/pygments/lexers/forth.py | 2 +- libs/pygments/lexers/fortran.py | 2 +- libs/pygments/lexers/foxpro.py | 2 +- libs/pygments/lexers/freefem.py | 2 +- libs/pygments/lexers/func.py | 2 +- libs/pygments/lexers/functional.py | 2 +- libs/pygments/lexers/futhark.py | 2 +- libs/pygments/lexers/gcodelexer.py | 2 +- libs/pygments/lexers/gdscript.py | 2 +- libs/pygments/lexers/gleam.py | 74 ++ libs/pygments/lexers/go.py | 2 +- libs/pygments/lexers/grammar_notation.py | 2 +- libs/pygments/lexers/graph.py | 2 +- libs/pygments/lexers/graphics.py | 2 +- libs/pygments/lexers/graphql.py | 2 +- libs/pygments/lexers/graphviz.py | 2 +- libs/pygments/lexers/gsql.py | 2 +- libs/pygments/lexers/hare.py | 73 ++ libs/pygments/lexers/haskell.py | 6 +- libs/pygments/lexers/haxe.py | 2 +- libs/pygments/lexers/hdl.py | 2 +- libs/pygments/lexers/hexdump.py | 2 +- libs/pygments/lexers/html.py | 50 +- libs/pygments/lexers/idl.py | 2 +- libs/pygments/lexers/igor.py | 4 +- libs/pygments/lexers/inferno.py | 2 +- libs/pygments/lexers/installers.py | 77 +- libs/pygments/lexers/int_fiction.py | 2 +- libs/pygments/lexers/iolang.py | 2 +- libs/pygments/lexers/j.py | 2 +- libs/pygments/lexers/javascript.py | 6 +- libs/pygments/lexers/jmespath.py | 2 +- libs/pygments/lexers/jslt.py | 2 +- libs/pygments/lexers/json5.py | 83 ++ libs/pygments/lexers/jsonnet.py | 2 +- libs/pygments/lexers/jsx.py | 103 +- libs/pygments/lexers/julia.py | 3 +- libs/pygments/lexers/jvm.py | 4 +- libs/pygments/lexers/kuin.py | 2 +- libs/pygments/lexers/kusto.py | 2 +- libs/pygments/lexers/ldap.py | 2 +- libs/pygments/lexers/lean.py | 2 +- libs/pygments/lexers/lilypond.py | 2 +- libs/pygments/lexers/lisp.py | 2 +- libs/pygments/lexers/macaulay2.py | 230 +++-- libs/pygments/lexers/make.py | 2 +- libs/pygments/lexers/maple.py | 291 ++++++ libs/pygments/lexers/markup.py | 2 +- libs/pygments/lexers/math.py | 2 +- libs/pygments/lexers/matlab.py | 9 +- libs/pygments/lexers/maxima.py | 2 +- libs/pygments/lexers/meson.py | 2 +- libs/pygments/lexers/mime.py | 2 +- libs/pygments/lexers/minecraft.py | 2 +- libs/pygments/lexers/mips.py | 2 +- libs/pygments/lexers/ml.py | 2 +- libs/pygments/lexers/modeling.py | 2 +- libs/pygments/lexers/modula2.py | 2 +- libs/pygments/lexers/mojo.py | 11 +- libs/pygments/lexers/monte.py | 2 +- libs/pygments/lexers/mosel.py | 2 +- libs/pygments/lexers/ncl.py | 2 +- libs/pygments/lexers/nimrod.py | 2 +- libs/pygments/lexers/nit.py | 2 +- libs/pygments/lexers/nix.py | 2 +- libs/pygments/lexers/numbair.py | 63 ++ libs/pygments/lexers/oberon.py | 2 +- libs/pygments/lexers/objective.py | 24 +- libs/pygments/lexers/ooc.py | 6 +- libs/pygments/lexers/openscad.py | 2 +- libs/pygments/lexers/other.py | 2 +- libs/pygments/lexers/parasail.py | 2 +- libs/pygments/lexers/parsers.py | 2 +- libs/pygments/lexers/pascal.py | 2 +- libs/pygments/lexers/pawn.py | 2 +- libs/pygments/lexers/pddl.py | 82 ++ libs/pygments/lexers/perl.py | 2 +- libs/pygments/lexers/phix.py | 2 +- libs/pygments/lexers/php.py | 2 +- libs/pygments/lexers/pointless.py | 2 +- libs/pygments/lexers/pony.py | 2 +- libs/pygments/lexers/praat.py | 2 +- libs/pygments/lexers/procfile.py | 2 +- libs/pygments/lexers/prolog.py | 2 +- libs/pygments/lexers/promql.py | 2 +- libs/pygments/lexers/prql.py | 2 +- libs/pygments/lexers/ptx.py | 2 +- libs/pygments/lexers/python.py | 51 +- libs/pygments/lexers/q.py | 2 +- libs/pygments/lexers/qlik.py | 2 +- libs/pygments/lexers/qvt.py | 2 +- libs/pygments/lexers/r.py | 12 +- libs/pygments/lexers/rdf.py | 6 +- libs/pygments/lexers/rebol.py | 2 +- libs/pygments/lexers/rego.py | 57 ++ libs/pygments/lexers/resource.py | 2 +- libs/pygments/lexers/ride.py | 2 +- libs/pygments/lexers/rita.py | 2 +- libs/pygments/lexers/rnc.py | 2 +- libs/pygments/lexers/roboconf.py | 2 +- libs/pygments/lexers/robotframework.py | 2 +- libs/pygments/lexers/ruby.py | 2 +- libs/pygments/lexers/rust.py | 2 +- libs/pygments/lexers/sas.py | 2 +- libs/pygments/lexers/savi.py | 2 +- libs/pygments/lexers/scdoc.py | 2 +- libs/pygments/lexers/scripting.py | 38 +- libs/pygments/lexers/sgf.py | 2 +- libs/pygments/lexers/shell.py | 6 +- libs/pygments/lexers/sieve.py | 2 +- libs/pygments/lexers/slash.py | 2 +- libs/pygments/lexers/smalltalk.py | 2 +- libs/pygments/lexers/smithy.py | 2 +- libs/pygments/lexers/smv.py | 2 +- libs/pygments/lexers/snobol.py | 2 +- libs/pygments/lexers/solidity.py | 2 +- libs/pygments/lexers/soong.py | 2 +- libs/pygments/lexers/sophia.py | 2 +- libs/pygments/lexers/special.py | 3 +- libs/pygments/lexers/spice.py | 2 +- libs/pygments/lexers/sql.py | 186 +++- libs/pygments/lexers/srcinfo.py | 2 +- libs/pygments/lexers/stata.py | 2 +- libs/pygments/lexers/supercollider.py | 2 +- libs/pygments/lexers/tablegen.py | 177 ++++ libs/pygments/lexers/tact.py | 2 +- libs/pygments/lexers/tal.py | 2 +- libs/pygments/lexers/tcl.py | 2 +- libs/pygments/lexers/teal.py | 2 +- libs/pygments/lexers/templates.py | 6 +- libs/pygments/lexers/teraterm.py | 2 +- libs/pygments/lexers/testing.py | 2 +- libs/pygments/lexers/text.py | 4 +- libs/pygments/lexers/textedit.py | 2 +- libs/pygments/lexers/textfmts.py | 2 +- libs/pygments/lexers/theorem.py | 2 +- libs/pygments/lexers/thingsdb.py | 2 +- libs/pygments/lexers/tlb.py | 2 +- libs/pygments/lexers/tls.py | 2 +- libs/pygments/lexers/tnt.py | 2 +- libs/pygments/lexers/trafficscript.py | 2 +- libs/pygments/lexers/typoscript.py | 2 +- libs/pygments/lexers/typst.py | 108 ++- libs/pygments/lexers/ul4.py | 2 +- libs/pygments/lexers/unicon.py | 2 +- libs/pygments/lexers/urbi.py | 2 +- libs/pygments/lexers/usd.py | 2 +- libs/pygments/lexers/varnish.py | 2 +- libs/pygments/lexers/verification.py | 2 +- libs/pygments/lexers/verifpal.py | 2 +- libs/pygments/lexers/vip.py | 2 +- libs/pygments/lexers/vyper.py | 4 +- libs/pygments/lexers/web.py | 2 +- libs/pygments/lexers/webassembly.py | 2 +- libs/pygments/lexers/webidl.py | 2 +- libs/pygments/lexers/webmisc.py | 2 +- libs/pygments/lexers/wgsl.py | 2 +- libs/pygments/lexers/whiley.py | 2 +- libs/pygments/lexers/wowtoc.py | 2 +- libs/pygments/lexers/wren.py | 2 +- libs/pygments/lexers/x10.py | 2 +- libs/pygments/lexers/xorg.py | 2 +- libs/pygments/lexers/yang.py | 2 +- libs/pygments/lexers/yara.py | 2 +- libs/pygments/lexers/zig.py | 2 +- libs/pygments/modeline.py | 2 +- libs/pygments/plugin.py | 2 +- libs/pygments/regexopt.py | 2 +- libs/pygments/scanner.py | 2 +- libs/pygments/sphinxext.py | 2 +- libs/pygments/style.py | 2 +- libs/pygments/styles/__init__.py | 2 +- libs/pygments/styles/abap.py | 2 +- libs/pygments/styles/algol.py | 2 +- libs/pygments/styles/algol_nu.py | 2 +- libs/pygments/styles/arduino.py | 2 +- libs/pygments/styles/autumn.py | 2 +- libs/pygments/styles/borland.py | 2 +- libs/pygments/styles/bw.py | 2 +- libs/pygments/styles/coffee.py | 2 +- libs/pygments/styles/colorful.py | 2 +- libs/pygments/styles/default.py | 2 +- libs/pygments/styles/dracula.py | 2 +- libs/pygments/styles/emacs.py | 2 +- libs/pygments/styles/friendly.py | 2 +- libs/pygments/styles/friendly_grayscale.py | 2 +- libs/pygments/styles/fruity.py | 2 +- libs/pygments/styles/gh_dark.py | 2 +- libs/pygments/styles/gruvbox.py | 2 +- libs/pygments/styles/igor.py | 2 +- libs/pygments/styles/inkpot.py | 2 +- libs/pygments/styles/lightbulb.py | 2 +- libs/pygments/styles/lilypond.py | 2 +- libs/pygments/styles/lovelace.py | 2 +- libs/pygments/styles/manni.py | 2 +- libs/pygments/styles/material.py | 2 +- libs/pygments/styles/monokai.py | 2 +- libs/pygments/styles/murphy.py | 2 +- libs/pygments/styles/native.py | 2 +- libs/pygments/styles/nord.py | 2 +- libs/pygments/styles/onedark.py | 2 +- libs/pygments/styles/paraiso_dark.py | 2 +- libs/pygments/styles/paraiso_light.py | 2 +- libs/pygments/styles/pastie.py | 2 +- libs/pygments/styles/perldoc.py | 2 +- libs/pygments/styles/rainbow_dash.py | 2 +- libs/pygments/styles/rrt.py | 5 +- libs/pygments/styles/sas.py | 2 +- libs/pygments/styles/solarized.py | 2 +- libs/pygments/styles/staroffice.py | 2 +- libs/pygments/styles/stata_dark.py | 2 +- libs/pygments/styles/stata_light.py | 2 +- libs/pygments/styles/tango.py | 2 +- libs/pygments/styles/trac.py | 2 +- libs/pygments/styles/vim.py | 2 +- libs/pygments/styles/vs.py | 2 +- libs/pygments/styles/xcode.py | 2 +- libs/pygments/styles/zenburn.py | 2 +- libs/pygments/token.py | 2 +- libs/pygments/unistring.py | 2 +- libs/pygments/util.py | 2 +- .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- .../RECORD | 16 +- .../REQUESTED | 0 .../WHEEL | 0 .../top_level.txt | 0 .../INSTALLER | 0 .../LICENSE | 0 .../METADATA | 2 +- .../RECORD | 18 +- .../REQUESTED | 0 .../WHEEL | 2 +- .../top_level.txt | 0 libs/socketio/admin.py | 94 +- libs/socketio/async_admin.py | 94 +- libs/sqlalchemy/__init__.py | 4 +- libs/sqlalchemy/connectors/__init__.py | 2 +- libs/sqlalchemy/connectors/aioodbc.py | 2 +- libs/sqlalchemy/connectors/asyncio.py | 2 +- libs/sqlalchemy/connectors/pyodbc.py | 2 +- libs/sqlalchemy/cyextension/__init__.py | 2 +- libs/sqlalchemy/dialects/__init__.py | 2 +- libs/sqlalchemy/dialects/_typing.py | 19 +- libs/sqlalchemy/dialects/mssql/__init__.py | 2 +- libs/sqlalchemy/dialects/mssql/aioodbc.py | 5 +- libs/sqlalchemy/dialects/mssql/base.py | 216 +++-- .../dialects/mssql/information_schema.py | 2 +- libs/sqlalchemy/dialects/mssql/json.py | 10 +- libs/sqlalchemy/dialects/mssql/provision.py | 2 +- libs/sqlalchemy/dialects/mssql/pymssql.py | 2 +- libs/sqlalchemy/dialects/mssql/pyodbc.py | 37 +- libs/sqlalchemy/dialects/mysql/__init__.py | 7 +- libs/sqlalchemy/dialects/mysql/aiomysql.py | 6 +- libs/sqlalchemy/dialects/mysql/asyncmy.py | 6 +- libs/sqlalchemy/dialects/mysql/base.py | 271 +++--- libs/sqlalchemy/dialects/mysql/cymysql.py | 2 +- libs/sqlalchemy/dialects/mysql/dml.py | 10 +- libs/sqlalchemy/dialects/mysql/enumerated.py | 7 +- libs/sqlalchemy/dialects/mysql/expression.py | 6 +- libs/sqlalchemy/dialects/mysql/json.py | 2 +- libs/sqlalchemy/dialects/mysql/mariadb.py | 31 +- .../dialects/mysql/mariadbconnector.py | 2 +- .../dialects/mysql/mysqlconnector.py | 2 +- libs/sqlalchemy/dialects/mysql/mysqldb.py | 10 +- libs/sqlalchemy/dialects/mysql/provision.py | 2 +- libs/sqlalchemy/dialects/mysql/pymysql.py | 3 +- libs/sqlalchemy/dialects/mysql/pyodbc.py | 17 +- libs/sqlalchemy/dialects/mysql/reflection.py | 2 +- .../dialects/mysql/reserved_words.py | 2 +- libs/sqlalchemy/dialects/mysql/types.py | 2 +- libs/sqlalchemy/dialects/oracle/__init__.py | 2 +- libs/sqlalchemy/dialects/oracle/base.py | 532 +++++----- libs/sqlalchemy/dialects/oracle/cx_oracle.py | 307 +++--- libs/sqlalchemy/dialects/oracle/dictionary.py | 2 +- libs/sqlalchemy/dialects/oracle/oracledb.py | 606 +++++++++++- libs/sqlalchemy/dialects/oracle/provision.py | 4 +- libs/sqlalchemy/dialects/oracle/types.py | 65 +- .../dialects/postgresql/__init__.py | 2 +- .../dialects/postgresql/_psycopg_common.py | 2 +- libs/sqlalchemy/dialects/postgresql/array.py | 40 +- .../sqlalchemy/dialects/postgresql/asyncpg.py | 25 +- libs/sqlalchemy/dialects/postgresql/base.py | 336 ++++--- libs/sqlalchemy/dialects/postgresql/dml.py | 51 +- libs/sqlalchemy/dialects/postgresql/ext.py | 41 +- libs/sqlalchemy/dialects/postgresql/hstore.py | 39 +- libs/sqlalchemy/dialects/postgresql/json.py | 41 +- .../dialects/postgresql/named_types.py | 28 +- .../dialects/postgresql/operators.py | 2 +- libs/sqlalchemy/dialects/postgresql/pg8000.py | 14 +- .../dialects/postgresql/pg_catalog.py | 2 +- .../dialects/postgresql/provision.py | 2 +- .../sqlalchemy/dialects/postgresql/psycopg.py | 21 +- .../dialects/postgresql/psycopg2.py | 48 +- .../dialects/postgresql/psycopg2cffi.py | 2 +- libs/sqlalchemy/dialects/postgresql/ranges.py | 4 +- libs/sqlalchemy/dialects/postgresql/types.py | 10 +- libs/sqlalchemy/dialects/sqlite/__init__.py | 2 +- libs/sqlalchemy/dialects/sqlite/aiosqlite.py | 5 +- libs/sqlalchemy/dialects/sqlite/base.py | 263 +++-- libs/sqlalchemy/dialects/sqlite/dml.py | 51 +- libs/sqlalchemy/dialects/sqlite/json.py | 2 +- libs/sqlalchemy/dialects/sqlite/provision.py | 2 +- .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 12 +- libs/sqlalchemy/dialects/sqlite/pysqlite.py | 59 +- libs/sqlalchemy/engine/__init__.py | 2 +- libs/sqlalchemy/engine/_py_processors.py | 2 +- libs/sqlalchemy/engine/_py_row.py | 2 +- libs/sqlalchemy/engine/_py_util.py | 2 +- libs/sqlalchemy/engine/base.py | 42 +- libs/sqlalchemy/engine/characteristics.py | 2 +- libs/sqlalchemy/engine/create.py | 9 +- libs/sqlalchemy/engine/cursor.py | 27 +- libs/sqlalchemy/engine/default.py | 18 +- libs/sqlalchemy/engine/events.py | 56 +- libs/sqlalchemy/engine/interfaces.py | 87 +- libs/sqlalchemy/engine/mock.py | 6 +- libs/sqlalchemy/engine/processors.py | 2 +- libs/sqlalchemy/engine/reflection.py | 13 +- libs/sqlalchemy/engine/result.py | 12 +- libs/sqlalchemy/engine/row.py | 7 +- libs/sqlalchemy/engine/strategies.py | 2 +- libs/sqlalchemy/engine/url.py | 30 +- libs/sqlalchemy/engine/util.py | 2 +- libs/sqlalchemy/event/__init__.py | 2 +- libs/sqlalchemy/event/api.py | 23 +- libs/sqlalchemy/event/attr.py | 2 +- libs/sqlalchemy/event/base.py | 2 +- libs/sqlalchemy/event/legacy.py | 2 +- libs/sqlalchemy/event/registry.py | 8 +- libs/sqlalchemy/events.py | 2 +- libs/sqlalchemy/exc.py | 6 +- libs/sqlalchemy/ext/__init__.py | 2 +- libs/sqlalchemy/ext/associationproxy.py | 10 +- libs/sqlalchemy/ext/asyncio/__init__.py | 2 +- libs/sqlalchemy/ext/asyncio/base.py | 6 +- libs/sqlalchemy/ext/asyncio/engine.py | 25 +- libs/sqlalchemy/ext/asyncio/exc.py | 2 +- libs/sqlalchemy/ext/asyncio/result.py | 2 +- libs/sqlalchemy/ext/asyncio/scoping.py | 24 +- libs/sqlalchemy/ext/asyncio/session.py | 51 +- libs/sqlalchemy/ext/automap.py | 22 +- libs/sqlalchemy/ext/baked.py | 16 +- libs/sqlalchemy/ext/compiler.py | 120 ++- libs/sqlalchemy/ext/declarative/__init__.py | 2 +- libs/sqlalchemy/ext/declarative/extensions.py | 64 +- libs/sqlalchemy/ext/horizontal_shard.py | 17 +- libs/sqlalchemy/ext/hybrid.py | 81 +- libs/sqlalchemy/ext/indexable.py | 56 +- libs/sqlalchemy/ext/instrumentation.py | 2 +- libs/sqlalchemy/ext/mutable.py | 62 +- libs/sqlalchemy/ext/mypy/__init__.py | 2 +- libs/sqlalchemy/ext/mypy/apply.py | 6 +- libs/sqlalchemy/ext/mypy/decl_class.py | 2 +- libs/sqlalchemy/ext/mypy/infer.py | 6 +- libs/sqlalchemy/ext/mypy/names.py | 2 +- libs/sqlalchemy/ext/mypy/plugin.py | 2 +- libs/sqlalchemy/ext/mypy/util.py | 2 +- libs/sqlalchemy/ext/orderinglist.py | 35 +- libs/sqlalchemy/ext/serializer.py | 12 +- libs/sqlalchemy/future/__init__.py | 2 +- libs/sqlalchemy/future/engine.py | 2 +- libs/sqlalchemy/inspection.py | 2 +- libs/sqlalchemy/log.py | 2 +- libs/sqlalchemy/orm/__init__.py | 2 +- libs/sqlalchemy/orm/_orm_constructors.py | 89 +- libs/sqlalchemy/orm/_typing.py | 2 +- libs/sqlalchemy/orm/attributes.py | 4 +- libs/sqlalchemy/orm/base.py | 2 +- libs/sqlalchemy/orm/bulk_persistence.py | 2 +- libs/sqlalchemy/orm/clsregistry.py | 2 +- libs/sqlalchemy/orm/collections.py | 25 +- libs/sqlalchemy/orm/context.py | 10 +- libs/sqlalchemy/orm/decl_api.py | 130 ++- libs/sqlalchemy/orm/decl_base.py | 14 +- libs/sqlalchemy/orm/dependency.py | 2 +- libs/sqlalchemy/orm/descriptor_props.py | 7 +- libs/sqlalchemy/orm/dynamic.py | 2 +- libs/sqlalchemy/orm/evaluator.py | 2 +- libs/sqlalchemy/orm/events.py | 114 ++- libs/sqlalchemy/orm/exc.py | 2 +- libs/sqlalchemy/orm/identity.py | 2 +- libs/sqlalchemy/orm/instrumentation.py | 2 +- libs/sqlalchemy/orm/interfaces.py | 54 +- libs/sqlalchemy/orm/loading.py | 2 +- libs/sqlalchemy/orm/mapped_collection.py | 2 +- libs/sqlalchemy/orm/mapper.py | 42 +- libs/sqlalchemy/orm/path_registry.py | 2 +- libs/sqlalchemy/orm/persistence.py | 2 +- libs/sqlalchemy/orm/properties.py | 63 +- libs/sqlalchemy/orm/query.py | 305 +++--- libs/sqlalchemy/orm/relationships.py | 44 +- libs/sqlalchemy/orm/scoping.py | 16 +- libs/sqlalchemy/orm/session.py | 45 +- libs/sqlalchemy/orm/state.py | 2 +- libs/sqlalchemy/orm/state_changes.py | 2 +- libs/sqlalchemy/orm/strategies.py | 2 +- libs/sqlalchemy/orm/strategy_options.py | 77 +- libs/sqlalchemy/orm/sync.py | 2 +- libs/sqlalchemy/orm/unitofwork.py | 2 +- libs/sqlalchemy/orm/util.py | 104 +- libs/sqlalchemy/orm/writeonly.py | 2 +- libs/sqlalchemy/pool/__init__.py | 2 +- libs/sqlalchemy/pool/base.py | 2 +- libs/sqlalchemy/pool/events.py | 8 +- libs/sqlalchemy/pool/impl.py | 2 +- libs/sqlalchemy/schema.py | 2 +- libs/sqlalchemy/sql/__init__.py | 2 +- libs/sqlalchemy/sql/_dml_constructors.py | 20 +- libs/sqlalchemy/sql/_elements_constructors.py | 290 +++--- libs/sqlalchemy/sql/_orm_types.py | 2 +- libs/sqlalchemy/sql/_py_util.py | 2 +- .../sql/_selectable_constructors.py | 40 +- libs/sqlalchemy/sql/_typing.py | 2 +- libs/sqlalchemy/sql/annotation.py | 2 +- libs/sqlalchemy/sql/base.py | 23 +- libs/sqlalchemy/sql/cache_key.py | 2 +- libs/sqlalchemy/sql/coercions.py | 14 +- libs/sqlalchemy/sql/compiler.py | 13 +- libs/sqlalchemy/sql/crud.py | 2 +- libs/sqlalchemy/sql/ddl.py | 72 +- libs/sqlalchemy/sql/default_comparator.py | 2 +- libs/sqlalchemy/sql/dml.py | 32 +- libs/sqlalchemy/sql/elements.py | 192 ++-- libs/sqlalchemy/sql/events.py | 31 +- libs/sqlalchemy/sql/expression.py | 2 +- libs/sqlalchemy/sql/functions.py | 51 +- libs/sqlalchemy/sql/lambdas.py | 18 +- libs/sqlalchemy/sql/naming.py | 2 +- libs/sqlalchemy/sql/operators.py | 202 ++-- libs/sqlalchemy/sql/roles.py | 2 +- libs/sqlalchemy/sql/schema.py | 246 +++-- libs/sqlalchemy/sql/selectable.py | 443 +++++---- libs/sqlalchemy/sql/sqltypes.py | 220 +++-- libs/sqlalchemy/sql/traversals.py | 2 +- libs/sqlalchemy/sql/type_api.py | 64 +- libs/sqlalchemy/sql/util.py | 41 +- libs/sqlalchemy/sql/visitors.py | 6 +- libs/sqlalchemy/testing/__init__.py | 2 +- libs/sqlalchemy/testing/assertions.py | 2 +- libs/sqlalchemy/testing/assertsql.py | 2 +- libs/sqlalchemy/testing/asyncio.py | 2 +- libs/sqlalchemy/testing/config.py | 18 +- libs/sqlalchemy/testing/engines.py | 28 +- libs/sqlalchemy/testing/entities.py | 2 +- libs/sqlalchemy/testing/exclusions.py | 2 +- libs/sqlalchemy/testing/fixtures/__init__.py | 2 +- libs/sqlalchemy/testing/fixtures/base.py | 2 +- libs/sqlalchemy/testing/fixtures/mypy.py | 2 +- libs/sqlalchemy/testing/fixtures/orm.py | 2 +- libs/sqlalchemy/testing/fixtures/sql.py | 2 +- libs/sqlalchemy/testing/pickleable.py | 2 +- libs/sqlalchemy/testing/plugin/__init__.py | 2 +- libs/sqlalchemy/testing/plugin/bootstrap.py | 2 +- libs/sqlalchemy/testing/plugin/plugin_base.py | 2 +- .../sqlalchemy/testing/plugin/pytestplugin.py | 2 +- libs/sqlalchemy/testing/profiling.py | 2 +- libs/sqlalchemy/testing/provision.py | 12 +- libs/sqlalchemy/testing/requirements.py | 28 +- libs/sqlalchemy/testing/schema.py | 2 +- libs/sqlalchemy/testing/suite/__init__.py | 2 +- libs/sqlalchemy/testing/suite/test_cte.py | 2 +- libs/sqlalchemy/testing/suite/test_ddl.py | 2 +- .../testing/suite/test_deprecations.py | 2 +- libs/sqlalchemy/testing/suite/test_dialect.py | 2 +- libs/sqlalchemy/testing/suite/test_insert.py | 2 +- .../testing/suite/test_reflection.py | 2 +- libs/sqlalchemy/testing/suite/test_results.py | 2 +- .../sqlalchemy/testing/suite/test_rowcount.py | 2 +- libs/sqlalchemy/testing/suite/test_select.py | 2 +- .../sqlalchemy/testing/suite/test_sequence.py | 2 +- libs/sqlalchemy/testing/suite/test_types.py | 2 +- .../testing/suite/test_unicode_ddl.py | 2 +- .../testing/suite/test_update_delete.py | 2 +- libs/sqlalchemy/testing/util.py | 17 +- libs/sqlalchemy/testing/warnings.py | 2 +- libs/sqlalchemy/types.py | 2 +- libs/sqlalchemy/util/__init__.py | 2 +- libs/sqlalchemy/util/_collections.py | 6 +- libs/sqlalchemy/util/_concurrency_py3k.py | 2 +- libs/sqlalchemy/util/_has_cy.py | 2 +- libs/sqlalchemy/util/_py_collections.py | 2 +- libs/sqlalchemy/util/compat.py | 2 +- libs/sqlalchemy/util/concurrency.py | 2 +- libs/sqlalchemy/util/deprecations.py | 6 +- libs/sqlalchemy/util/langhelpers.py | 14 +- libs/sqlalchemy/util/preloaded.py | 2 +- libs/sqlalchemy/util/queue.py | 2 +- libs/sqlalchemy/util/tool_support.py | 2 +- libs/sqlalchemy/util/topological.py | 2 +- libs/sqlalchemy/util/typing.py | 256 +++-- libs/version.txt | 18 +- 847 files changed, 9234 insertions(+), 5205 deletions(-) rename libs/{Flask_Migrate-4.0.7.dist-info => Flask_Migrate-4.1.0.dist-info}/INSTALLER (100%) rename libs/{Flask_Migrate-4.0.7.dist-info => Flask_Migrate-4.1.0.dist-info}/LICENSE (100%) rename libs/{Flask_Migrate-4.0.7.dist-info => Flask_Migrate-4.1.0.dist-info}/METADATA (93%) rename libs/{Flask_Migrate-4.0.7.dist-info => Flask_Migrate-4.1.0.dist-info}/RECORD (76%) rename libs/{Flask_Migrate-4.0.7.dist-info => Flask_Migrate-4.1.0.dist-info}/REQUESTED (100%) rename libs/{Flask_SocketIO-5.5.0.dist-info => Flask_Migrate-4.1.0.dist-info}/WHEEL (100%) rename libs/{Flask_Migrate-4.0.7.dist-info => Flask_Migrate-4.1.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/Flask_SocketIO-5.5.0.dist-info/RECORD rename libs/{Flask_SocketIO-5.5.0.dist-info => Flask_SocketIO-5.5.1.dist-info}/INSTALLER (100%) rename libs/{Flask_SocketIO-5.5.0.dist-info => Flask_SocketIO-5.5.1.dist-info}/LICENSE (100%) rename libs/{Flask_SocketIO-5.5.0.dist-info => Flask_SocketIO-5.5.1.dist-info}/METADATA (97%) create mode 100644 libs/Flask_SocketIO-5.5.1.dist-info/RECORD rename libs/{Flask_SocketIO-5.5.0.dist-info => Flask_SocketIO-5.5.1.dist-info}/REQUESTED (100%) rename libs/{python_engineio-4.11.1.dist-info => Flask_SocketIO-5.5.1.dist-info}/WHEEL (100%) rename libs/{Flask_SocketIO-5.5.0.dist-info => Flask_SocketIO-5.5.1.dist-info}/top_level.txt (100%) delete mode 100644 libs/SQLAlchemy-2.0.36.dist-info/RECORD rename libs/{SQLAlchemy-2.0.36.dist-info => SQLAlchemy-2.0.37.dist-info}/INSTALLER (100%) rename libs/{SQLAlchemy-2.0.36.dist-info => SQLAlchemy-2.0.37.dist-info}/LICENSE (94%) rename libs/{SQLAlchemy-2.0.36.dist-info => SQLAlchemy-2.0.37.dist-info}/METADATA (99%) create mode 100644 libs/SQLAlchemy-2.0.37.dist-info/RECORD rename libs/{SQLAlchemy-2.0.36.dist-info => SQLAlchemy-2.0.37.dist-info}/REQUESTED (100%) rename libs/{SQLAlchemy-2.0.36.dist-info => SQLAlchemy-2.0.37.dist-info}/WHEEL (71%) rename libs/{SQLAlchemy-2.0.36.dist-info => SQLAlchemy-2.0.37.dist-info}/top_level.txt (100%) rename libs/{aniso8601-9.0.1.dist-info => aniso8601-10.0.0.dist-info}/INSTALLER (100%) rename libs/{aniso8601-9.0.1.dist-info => aniso8601-10.0.0.dist-info}/LICENSE (97%) rename libs/{aniso8601-9.0.1.dist-info => aniso8601-10.0.0.dist-info}/METADATA (98%) create mode 100644 libs/aniso8601-10.0.0.dist-info/RECORD rename libs/{aniso8601-9.0.1.dist-info => aniso8601-10.0.0.dist-info}/REQUESTED (100%) rename libs/{aniso8601-9.0.1.dist-info => aniso8601-10.0.0.dist-info}/WHEEL (100%) rename libs/{aniso8601-9.0.1.dist-info => aniso8601-10.0.0.dist-info}/top_level.txt (100%) delete mode 100644 libs/aniso8601-9.0.1.dist-info/RECORD delete mode 100644 libs/apprise-1.9.1.dist-info/RECORD rename libs/{apprise-1.9.1.dist-info => apprise-1.9.2.dist-info}/INSTALLER (100%) rename libs/{apprise-1.9.1.dist-info => apprise-1.9.2.dist-info}/LICENSE (95%) rename libs/{apprise-1.9.1.dist-info => apprise-1.9.2.dist-info}/METADATA (97%) create mode 100644 libs/apprise-1.9.2.dist-info/RECORD rename libs/{apprise-1.9.1.dist-info => apprise-1.9.2.dist-info}/REQUESTED (100%) rename libs/{apprise-1.9.1.dist-info => apprise-1.9.2.dist-info}/WHEEL (100%) rename libs/{apprise-1.9.1.dist-info => apprise-1.9.2.dist-info}/entry_points.txt (100%) rename libs/{apprise-1.9.1.dist-info => apprise-1.9.2.dist-info}/top_level.txt (100%) rename libs/apprise/plugins/{chantify.py => chanify.py} (86%) delete mode 100644 libs/pygments-2.18.0.dist-info/RECORD rename libs/{pygments-2.18.0.dist-info => pygments-2.19.1.dist-info}/INSTALLER (100%) rename libs/{pygments-2.18.0.dist-info => pygments-2.19.1.dist-info}/METADATA (94%) create mode 100644 libs/pygments-2.19.1.dist-info/RECORD rename libs/{pygments-2.18.0.dist-info => pygments-2.19.1.dist-info}/REQUESTED (100%) rename libs/{pygments-2.18.0.dist-info => pygments-2.19.1.dist-info}/WHEEL (67%) rename libs/{pygments-2.18.0.dist-info => pygments-2.19.1.dist-info}/entry_points.txt (100%) rename libs/{pygments-2.18.0.dist-info => pygments-2.19.1.dist-info}/licenses/AUTHORS (97%) rename libs/{pygments-2.18.0.dist-info => pygments-2.19.1.dist-info}/licenses/LICENSE (100%) mode change 100755 => 100644 libs/pygments/formatters/_mapping.py create mode 100644 libs/pygments/lexers/_googlesql_builtins.py create mode 100644 libs/pygments/lexers/codeql.py create mode 100644 libs/pygments/lexers/gleam.py mode change 100755 => 100644 libs/pygments/lexers/gsql.py create mode 100644 libs/pygments/lexers/hare.py create mode 100644 libs/pygments/lexers/json5.py create mode 100644 libs/pygments/lexers/maple.py create mode 100644 libs/pygments/lexers/numbair.py create mode 100644 libs/pygments/lexers/pddl.py create mode 100644 libs/pygments/lexers/rego.py create mode 100644 libs/pygments/lexers/tablegen.py rename libs/{python_engineio-4.11.1.dist-info => python_engineio-4.11.2.dist-info}/INSTALLER (100%) rename libs/{python_engineio-4.11.1.dist-info => python_engineio-4.11.2.dist-info}/LICENSE (100%) rename libs/{python_engineio-4.11.1.dist-info => python_engineio-4.11.2.dist-info}/METADATA (99%) rename libs/{python_engineio-4.11.1.dist-info => python_engineio-4.11.2.dist-info}/RECORD (80%) rename libs/{python_engineio-4.11.1.dist-info => python_engineio-4.11.2.dist-info}/REQUESTED (100%) rename libs/{python_socketio-5.12.0.dist-info => python_engineio-4.11.2.dist-info}/WHEEL (100%) rename libs/{python_engineio-4.11.1.dist-info => python_engineio-4.11.2.dist-info}/top_level.txt (100%) rename libs/{python_socketio-5.12.0.dist-info => python_socketio-5.12.1.dist-info}/INSTALLER (100%) rename libs/{python_socketio-5.12.0.dist-info => python_socketio-5.12.1.dist-info}/LICENSE (100%) rename libs/{python_socketio-5.12.0.dist-info => python_socketio-5.12.1.dist-info}/METADATA (99%) rename libs/{python_socketio-5.12.0.dist-info => python_socketio-5.12.1.dist-info}/RECORD (80%) rename libs/{python_socketio-5.12.0.dist-info => python_socketio-5.12.1.dist-info}/REQUESTED (100%) rename libs/{Flask_Migrate-4.0.7.dist-info => python_socketio-5.12.1.dist-info}/WHEEL (65%) rename libs/{python_socketio-5.12.0.dist-info => python_socketio-5.12.1.dist-info}/top_level.txt (100%) diff --git a/libs/Flask_Migrate-4.0.7.dist-info/INSTALLER b/libs/Flask_Migrate-4.1.0.dist-info/INSTALLER similarity index 100% rename from libs/Flask_Migrate-4.0.7.dist-info/INSTALLER rename to libs/Flask_Migrate-4.1.0.dist-info/INSTALLER diff --git a/libs/Flask_Migrate-4.0.7.dist-info/LICENSE b/libs/Flask_Migrate-4.1.0.dist-info/LICENSE similarity index 100% rename from libs/Flask_Migrate-4.0.7.dist-info/LICENSE rename to libs/Flask_Migrate-4.1.0.dist-info/LICENSE diff --git a/libs/Flask_Migrate-4.0.7.dist-info/METADATA b/libs/Flask_Migrate-4.1.0.dist-info/METADATA similarity index 93% rename from libs/Flask_Migrate-4.0.7.dist-info/METADATA rename to libs/Flask_Migrate-4.1.0.dist-info/METADATA index c0c67b93e..ef8ede367 100644 --- a/libs/Flask_Migrate-4.0.7.dist-info/METADATA +++ b/libs/Flask_Migrate-4.1.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: Flask-Migrate -Version: 4.0.7 +Version: 4.1.0 Summary: SQLAlchemy database migrations for Flask applications using Alembic. Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> License: MIT @@ -17,6 +17,12 @@ License-File: LICENSE Requires-Dist: Flask >=0.9 Requires-Dist: Flask-SQLAlchemy >=1.0 Requires-Dist: alembic >=1.9.0 +Provides-Extra: dev +Requires-Dist: tox ; extra == 'dev' +Requires-Dist: flake8 ; extra == 'dev' +Requires-Dist: pytest ; extra == 'dev' +Provides-Extra: docs +Requires-Dist: sphinx ; extra == 'docs' Flask-Migrate ============= diff --git a/libs/Flask_Migrate-4.0.7.dist-info/RECORD b/libs/Flask_Migrate-4.1.0.dist-info/RECORD similarity index 76% rename from libs/Flask_Migrate-4.0.7.dist-info/RECORD rename to libs/Flask_Migrate-4.1.0.dist-info/RECORD index c5f8dfe55..d634fa09a 100644 --- a/libs/Flask_Migrate-4.0.7.dist-info/RECORD +++ b/libs/Flask_Migrate-4.1.0.dist-info/RECORD @@ -1,12 +1,12 @@ -Flask_Migrate-4.0.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_Migrate-4.0.7.dist-info/LICENSE,sha256=kfkXGlJQvKy3Y__6tAJ8ynIp1HQfeROXhL8jZU1d-DI,1082 -Flask_Migrate-4.0.7.dist-info/METADATA,sha256=3WW5StkAdKx66iP12BXfTzoUsSB4rqEGxVs3qoollRg,3101 -Flask_Migrate-4.0.7.dist-info/RECORD,, -Flask_Migrate-4.0.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_Migrate-4.0.7.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 -Flask_Migrate-4.0.7.dist-info/top_level.txt,sha256=jLoPgiMG6oR4ugNteXn3IHskVVIyIXVStZOVq-AWLdU,14 +Flask_Migrate-4.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Migrate-4.1.0.dist-info/LICENSE,sha256=kfkXGlJQvKy3Y__6tAJ8ynIp1HQfeROXhL8jZU1d-DI,1082 +Flask_Migrate-4.1.0.dist-info/METADATA,sha256=Oc_YNcJGhss0camLTDR64sz2RuLXAppze2rvHDzS8_0,3296 +Flask_Migrate-4.1.0.dist-info/RECORD,, +Flask_Migrate-4.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_Migrate-4.1.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +Flask_Migrate-4.1.0.dist-info/top_level.txt,sha256=jLoPgiMG6oR4ugNteXn3IHskVVIyIXVStZOVq-AWLdU,14 flask_migrate/__init__.py,sha256=JMySGA55Y8Gxy3HviWu7qq5rPUNQBWc2NID2OicpDyw,10082 -flask_migrate/cli.py,sha256=v1fOqjpUI8ZniSt0NAxdaU4gFMoZys5yLAofwmBdMHU,10689 +flask_migrate/cli.py,sha256=IxrxBSC82S5sPfWac8Qg83_FVsRvqTYtCG7HRyMW8RU,11097 flask_migrate/templates/aioflask-multidb/README,sha256=Ek4cJqTaxneVjtkue--BXMlfpfp3MmJRjqoZvnSizww,43 flask_migrate/templates/aioflask-multidb/alembic.ini.mako,sha256=SjYEmJKzz6K8QfuZWtLJAJWcCKOdRbfUhsVlpgv8ock,857 flask_migrate/templates/aioflask-multidb/env.py,sha256=UcjeqkAbyUjTkuQFmCFPG7QOvqhco8-uGp8QEbto0T8,6573 diff --git a/libs/Flask_Migrate-4.0.7.dist-info/REQUESTED b/libs/Flask_Migrate-4.1.0.dist-info/REQUESTED similarity index 100% rename from libs/Flask_Migrate-4.0.7.dist-info/REQUESTED rename to libs/Flask_Migrate-4.1.0.dist-info/REQUESTED diff --git a/libs/Flask_SocketIO-5.5.0.dist-info/WHEEL b/libs/Flask_Migrate-4.1.0.dist-info/WHEEL similarity index 100% rename from libs/Flask_SocketIO-5.5.0.dist-info/WHEEL rename to libs/Flask_Migrate-4.1.0.dist-info/WHEEL diff --git a/libs/Flask_Migrate-4.0.7.dist-info/top_level.txt b/libs/Flask_Migrate-4.1.0.dist-info/top_level.txt similarity index 100% rename from libs/Flask_Migrate-4.0.7.dist-info/top_level.txt rename to libs/Flask_Migrate-4.1.0.dist-info/top_level.txt diff --git a/libs/Flask_SocketIO-5.5.0.dist-info/RECORD b/libs/Flask_SocketIO-5.5.0.dist-info/RECORD deleted file mode 100644 index a86a348d1..000000000 --- a/libs/Flask_SocketIO-5.5.0.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -Flask_SocketIO-5.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -Flask_SocketIO-5.5.0.dist-info/LICENSE,sha256=aNCWbkgKjS_T1cJtACyZbvCM36KxWnfQ0LWTuavuYKQ,1082 -Flask_SocketIO-5.5.0.dist-info/METADATA,sha256=LRFQve-hu_8O4YwU7xPb2BDoRKp88hPIzyUmOogxHBg,2637 -Flask_SocketIO-5.5.0.dist-info/RECORD,, -Flask_SocketIO-5.5.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -Flask_SocketIO-5.5.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 -Flask_SocketIO-5.5.0.dist-info/top_level.txt,sha256=C1ugzQBJ3HHUJsWGzyt70XRVOX-y4CUAR8MWKjwJOQ8,15 -flask_socketio/__init__.py,sha256=5hN0LE0hfGMUDcX4FheZrtXERJ1IBEPagv0pgeqdtlU,54904 -flask_socketio/namespace.py,sha256=UkVryJvFYgnCMKWSF35GVfGdyh2cXRDyRbfmEPPchVA,2329 -flask_socketio/test_client.py,sha256=rClk02TSRqgidH8IyeohspKVKdpRx7gcZBjg1YUtZpA,11026 diff --git a/libs/Flask_SocketIO-5.5.0.dist-info/INSTALLER b/libs/Flask_SocketIO-5.5.1.dist-info/INSTALLER similarity index 100% rename from libs/Flask_SocketIO-5.5.0.dist-info/INSTALLER rename to libs/Flask_SocketIO-5.5.1.dist-info/INSTALLER diff --git a/libs/Flask_SocketIO-5.5.0.dist-info/LICENSE b/libs/Flask_SocketIO-5.5.1.dist-info/LICENSE similarity index 100% rename from libs/Flask_SocketIO-5.5.0.dist-info/LICENSE rename to libs/Flask_SocketIO-5.5.1.dist-info/LICENSE diff --git a/libs/Flask_SocketIO-5.5.0.dist-info/METADATA b/libs/Flask_SocketIO-5.5.1.dist-info/METADATA similarity index 97% rename from libs/Flask_SocketIO-5.5.0.dist-info/METADATA rename to libs/Flask_SocketIO-5.5.1.dist-info/METADATA index 98bc5fd62..8676b6140 100644 --- a/libs/Flask_SocketIO-5.5.0.dist-info/METADATA +++ b/libs/Flask_SocketIO-5.5.1.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: Flask-SocketIO -Version: 5.5.0 +Version: 5.5.1 Summary: Socket.IO integration for Flask applications Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> Project-URL: Homepage, https://github.com/miguelgrinberg/flask-socketio @@ -14,7 +14,7 @@ Requires-Python: >=3.6 Description-Content-Type: text/markdown License-File: LICENSE Requires-Dist: Flask >=0.9 -Requires-Dist: python-socketio >=5.0.2 +Requires-Dist: python-socketio >=5.12.0 Provides-Extra: docs Requires-Dist: sphinx ; extra == 'docs' diff --git a/libs/Flask_SocketIO-5.5.1.dist-info/RECORD b/libs/Flask_SocketIO-5.5.1.dist-info/RECORD new file mode 100644 index 000000000..2b50d3dda --- /dev/null +++ b/libs/Flask_SocketIO-5.5.1.dist-info/RECORD @@ -0,0 +1,10 @@ +Flask_SocketIO-5.5.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_SocketIO-5.5.1.dist-info/LICENSE,sha256=aNCWbkgKjS_T1cJtACyZbvCM36KxWnfQ0LWTuavuYKQ,1082 +Flask_SocketIO-5.5.1.dist-info/METADATA,sha256=6NSCK70GFvnCHNKwcr6lmffkRAKLd9dOnGq6TbAJlfs,2638 +Flask_SocketIO-5.5.1.dist-info/RECORD,, +Flask_SocketIO-5.5.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_SocketIO-5.5.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +Flask_SocketIO-5.5.1.dist-info/top_level.txt,sha256=C1ugzQBJ3HHUJsWGzyt70XRVOX-y4CUAR8MWKjwJOQ8,15 +flask_socketio/__init__.py,sha256=5hN0LE0hfGMUDcX4FheZrtXERJ1IBEPagv0pgeqdtlU,54904 +flask_socketio/namespace.py,sha256=UkVryJvFYgnCMKWSF35GVfGdyh2cXRDyRbfmEPPchVA,2329 +flask_socketio/test_client.py,sha256=rClk02TSRqgidH8IyeohspKVKdpRx7gcZBjg1YUtZpA,11026 diff --git a/libs/Flask_SocketIO-5.5.0.dist-info/REQUESTED b/libs/Flask_SocketIO-5.5.1.dist-info/REQUESTED similarity index 100% rename from libs/Flask_SocketIO-5.5.0.dist-info/REQUESTED rename to libs/Flask_SocketIO-5.5.1.dist-info/REQUESTED diff --git a/libs/python_engineio-4.11.1.dist-info/WHEEL b/libs/Flask_SocketIO-5.5.1.dist-info/WHEEL similarity index 100% rename from libs/python_engineio-4.11.1.dist-info/WHEEL rename to libs/Flask_SocketIO-5.5.1.dist-info/WHEEL diff --git a/libs/Flask_SocketIO-5.5.0.dist-info/top_level.txt b/libs/Flask_SocketIO-5.5.1.dist-info/top_level.txt similarity index 100% rename from libs/Flask_SocketIO-5.5.0.dist-info/top_level.txt rename to libs/Flask_SocketIO-5.5.1.dist-info/top_level.txt diff --git a/libs/SQLAlchemy-2.0.36.dist-info/RECORD b/libs/SQLAlchemy-2.0.36.dist-info/RECORD deleted file mode 100644 index 5444bcc7c..000000000 --- a/libs/SQLAlchemy-2.0.36.dist-info/RECORD +++ /dev/null @@ -1,275 +0,0 @@ -SQLAlchemy-2.0.36.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -SQLAlchemy-2.0.36.dist-info/LICENSE,sha256=PA9Zq4h9BB3mpOUv_j6e212VIt6Qn66abNettue-MpM,1100 -SQLAlchemy-2.0.36.dist-info/METADATA,sha256=EZH514FydYtyOhgoZk_OF1ZQEtI4eTAEddlnUlRjzac,9692 -SQLAlchemy-2.0.36.dist-info/RECORD,, -SQLAlchemy-2.0.36.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -SQLAlchemy-2.0.36.dist-info/WHEEL,sha256=8MbRJsGMYV6Ym1_SoG8YuJPvArpN2Z2wVWusEpp3feg,108 -SQLAlchemy-2.0.36.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 -sqlalchemy/__init__.py,sha256=J2PsdiJiNW93Etxk6YN8o_C3TcpR1_DckU71r4LBcGE,13033 -sqlalchemy/connectors/__init__.py,sha256=PzXPqZqi3BzEnrs1eW0DcsR4lyknAzhhN9rWcQ97hb4,476 -sqlalchemy/connectors/aioodbc.py,sha256=GSTiNMO9h0qjPxgqaxDwWZ8HvhWMFNVR6MJQnN1oc40,5288 -sqlalchemy/connectors/asyncio.py,sha256=Hq2bkXmG6-KO_RfCrwMqx4oGH-uH1Z1WWKqPWNjz8p4,6138 -sqlalchemy/connectors/pyodbc.py,sha256=t7AjyxIOnaWg3CrlUEpBs4Y5l0HFdNt3P_cSSKhbi0Y,8501 -sqlalchemy/cyextension/__init__.py,sha256=GzhhN8cjMnDTE0qerlUlpbrNmFPHQWCZ4Gk74OAxl04,244 -sqlalchemy/cyextension/collections.cpython-38-darwin.so,sha256=JPCislATQznenBRmWIX9Ihqvfx99z04UDes848VPCfY,233760 -sqlalchemy/cyextension/collections.pyx,sha256=L7DZ3DGKpgw2MT2ZZRRxCnrcyE5pU1NAFowWgAzQPEc,12571 -sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so,sha256=vDvIl2ML414S5ZnbquknvGUbR52dNAfhltV86WMXnUA,94672 -sqlalchemy/cyextension/immutabledict.pxd,sha256=3x3-rXG5eRQ7bBnktZ-OJ9-6ft8zToPmTDOd92iXpB0,291 -sqlalchemy/cyextension/immutabledict.pyx,sha256=KfDTYbTfebstE8xuqAtuXsHNAK0_b5q_ymUiinUe_xs,3535 -sqlalchemy/cyextension/processors.cpython-38-darwin.so,sha256=tl0ZZ_a97ftC1o6YcDdPwZRpvRgiAqiy3rz9SUo3a54,75976 -sqlalchemy/cyextension/processors.pyx,sha256=R1rHsGLEaGeBq5VeCydjClzYlivERIJ9B-XLOJlf2MQ,1792 -sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so,sha256=cD-2VsfKRoe6o5w_iBR7bHGxAyqCF4pqMqeLjhqzu8o,78080 -sqlalchemy/cyextension/resultproxy.pyx,sha256=eWLdyBXiBy_CLQrF5ScfWJm7X0NeelscSXedtj1zv9Q,2725 -sqlalchemy/cyextension/util.cpython-38-darwin.so,sha256=1ExFkSKS8idn9jWSlRTCI4v92JKAOrGZuS_Aoexd9fo,93064 -sqlalchemy/cyextension/util.pyx,sha256=B85orxa9LddLuQEaDoVSq1XmAXIbLKxrxpvuB8ogV_o,2530 -sqlalchemy/dialects/__init__.py,sha256=Kos9Gf5JZg1Vg6GWaCqEbD6e0r1jCwCmcnJIfcxDdcY,1770 -sqlalchemy/dialects/_typing.py,sha256=hyv0nKucX2gI8ispB1IsvaUgrEPn9zEcq9hS7kfstEw,888 -sqlalchemy/dialects/mssql/__init__.py,sha256=r5t8wFRNtBQoiUWh0WfIEWzXZW6f3D0uDt6NZTW_7Cc,1880 -sqlalchemy/dialects/mssql/aioodbc.py,sha256=UQd9ecSMIML713TDnLAviuBVJle7P7i1FtqGZZePk2Y,2022 -sqlalchemy/dialects/mssql/base.py,sha256=msl_N_a_z8ali7Nthx55AGoV7b5wakCWvWu560BvH9o,132423 -sqlalchemy/dialects/mssql/information_schema.py,sha256=HswjDc6y0mPXCf_x6VyylHlBdBa4PSY6Evxmmlch700,8084 -sqlalchemy/dialects/mssql/json.py,sha256=evUACW2O62TAPq8B7QIPagz7jfc664ql9ms68JqiYzg,4816 -sqlalchemy/dialects/mssql/provision.py,sha256=ZAtt6Div9NLIngMs8kyloxfphw0KDNMsnRCAVd7-esE,5593 -sqlalchemy/dialects/mssql/pymssql.py,sha256=LAv43q4vBCB85OsAwHQItaQUYTYIO0QJ-jvzaBrswmY,4097 -sqlalchemy/dialects/mssql/pyodbc.py,sha256=vwM-vBlmRwrqxOc73P0sFOrBSwn24wzc5IkEOpalbXQ,27056 -sqlalchemy/dialects/mysql/__init__.py,sha256=bxbi4hkysUK2OOVvr1F49akUj1cky27kKb07tgFzI9U,2153 -sqlalchemy/dialects/mysql/aiomysql.py,sha256=-oMZnCqNsSki8mlQRTWIwiQPT1OVdZIuANkb90q8LAs,9999 -sqlalchemy/dialects/mysql/asyncmy.py,sha256=YpuuOh8VknEeqHqUXQGfQ3jhfO3Xb-vZv78Jq5cscJ0,10067 -sqlalchemy/dialects/mysql/base.py,sha256=giGlZNGrKsNMoSkbzY0PGgfamKjA9rOkSq1o5vKvno4,122755 -sqlalchemy/dialects/mysql/cymysql.py,sha256=eXT1ry0w_qRxjiO24M980c-8PZ9qSsbhqBHntjEiKB0,2300 -sqlalchemy/dialects/mysql/dml.py,sha256=HXJMAvimJsqvhj3UZO4vW_6LkF5RqaKbHvklAjor7yU,7645 -sqlalchemy/dialects/mysql/enumerated.py,sha256=ipEPPQqoXfFwcywNdcLlZCEzHBtnitHRah1Gn6nItcg,8448 -sqlalchemy/dialects/mysql/expression.py,sha256=lsmQCHKwfPezUnt27d2kR6ohk4IRFCA64KBS16kx5dc,4097 -sqlalchemy/dialects/mysql/json.py,sha256=l6MEZ0qp8FgiRrIQvOMhyEJq0q6OqiEnvDTx5Cbt9uQ,2269 -sqlalchemy/dialects/mysql/mariadb.py,sha256=kTfBLioLKk4JFFst4TY_iWqPtnvvQXFHknLfm89H2N8,853 -sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=_S1aV93kyP52Nvj7HR9weThML4oUvSLsLqiVFdoLR2o,8623 -sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=oq3mtsNOMldUjs32JbJG2u3Hy3DObyVzUUMYfOkwkHg,5729 -sqlalchemy/dialects/mysql/mysqldb.py,sha256=qUBbA6STeYGozutyTxHCo5p1W3p59QFFS2FwCgPrjBA,9503 -sqlalchemy/dialects/mysql/provision.py,sha256=Jnk8UO9_Apd2odR2IQFLrscCfAmYxuBKcB8giS3bBog,3575 -sqlalchemy/dialects/mysql/pymysql.py,sha256=GUnSHd2M2uKjmN46Hheymtm26g7phEgwYOXrX0zLY8M,4083 -sqlalchemy/dialects/mysql/pyodbc.py,sha256=072crI4qVyPhajYvHnsfFeSrNjLFVPIjBQKo5uyz5yk,4297 -sqlalchemy/dialects/mysql/reflection.py,sha256=3u34YwT1JJh3uThGZJZ3FKdnUcT7v08QB-tAl1r7VRk,22834 -sqlalchemy/dialects/mysql/reserved_words.py,sha256=ucKX2p2c3UnMq2ayZuOHuf73eXhu7SKsOsTlIN1Q83I,9258 -sqlalchemy/dialects/mysql/types.py,sha256=L5cTCsMT1pTedszNEM3jSxFNZEMcHQLprYCZ0vmfsnA,24343 -sqlalchemy/dialects/oracle/__init__.py,sha256=p4-2gw7TT0bX_MoJXTGD4i8WHctYsK9kCRbkpzykBrc,1493 -sqlalchemy/dialects/oracle/base.py,sha256=zLMZedrr6j1LvJz4qYnoSjikI5RZY92YFeQHiZ_YvW0,119676 -sqlalchemy/dialects/oracle/cx_oracle.py,sha256=q8Nyj15UZCE2TWOmxuWp5ZsxiCiGMzqfd_9UkmjIja0,55235 -sqlalchemy/dialects/oracle/dictionary.py,sha256=7WMrbPkqo8ZdGjaEZyQr-5f2pajSOF1OTGb8P97z8-g,19519 -sqlalchemy/dialects/oracle/oracledb.py,sha256=fZRKGqNIwW9LG4i8yDOXABrucbfzn_yC86Od-BJ3PcM,13619 -sqlalchemy/dialects/oracle/provision.py,sha256=O9ZpF4OG6Cx4mMzLRfZwhs8dZjrJETWR402n9c7726A,8304 -sqlalchemy/dialects/oracle/types.py,sha256=QK3hJvWzKnnCe3oD3rItwEEIwcoBze8qGg7VFOvVlIk,8231 -sqlalchemy/dialects/postgresql/__init__.py,sha256=wwnNAq4wDQzrlPRzDNB06ayuq3L2HNO99nzeEvq-YcU,3892 -sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=7TudtgsPiSB8O5kX8W8KxcNYR8t5h_UHb86b_ChL0P8,5696 -sqlalchemy/dialects/postgresql/array.py,sha256=bWcame7ntmI_Kx6gmBX0-chwADFdLHeCvaDQ4iX8id8,13734 -sqlalchemy/dialects/postgresql/asyncpg.py,sha256=9P0Itn9eeSBu67kGSsHuzx8xd4YYwRKdiZ5m7bF5onU,41074 -sqlalchemy/dialects/postgresql/base.py,sha256=dGPsaV3Esw6-AwE3QcgHF0Fray3Yw5-gLLgCvgdxvS0,179083 -sqlalchemy/dialects/postgresql/dml.py,sha256=Pc69Le6qzmUHHb1FT5zeUSD31dWm6SBgdCAGW89cs3s,11212 -sqlalchemy/dialects/postgresql/ext.py,sha256=1bZ--iNh2O9ym7l2gXZX48yP3yMO4dqb9RpYro2Mj2Q,16262 -sqlalchemy/dialects/postgresql/hstore.py,sha256=otAx-RTDfpi_tcXkMuQV0JOIXtYgevgnsikLKKOkI6U,11541 -sqlalchemy/dialects/postgresql/json.py,sha256=53rQWon9cUXd1yCjIvUpJjWwNyRSy3U7Kz0HV70ftrc,11618 -sqlalchemy/dialects/postgresql/named_types.py,sha256=3IV1ufo7zJjKmX4VtGDEnoXE6xEqLJAtGG82IiqHXwY,17594 -sqlalchemy/dialects/postgresql/operators.py,sha256=NsAaWun_tL3d_be0fs9YL6T4LPKK6crnmFxxIJHgyeY,2808 -sqlalchemy/dialects/postgresql/pg8000.py,sha256=3yoekiWSF-xnaWMqG76XrYPMqerg-42TdmfsW_ivK9E,18640 -sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=hY3NXEUHxTWD4umhd2aowNu3laC-61Q_qQ_pReyXTUM,9254 -sqlalchemy/dialects/postgresql/provision.py,sha256=t6TZj0XaWG9zrpCjNr0oJRjAC_WQzaNdp3kaKJIbS8I,5770 -sqlalchemy/dialects/postgresql/psycopg.py,sha256=Uwf45f9fInOtaExiEdwiP9xzRo7hw0XyZTkRtgdom44,23168 -sqlalchemy/dialects/postgresql/psycopg2.py,sha256=kwEnflz5bAqJcuO_20eYiCtha_a4m_tg5_lppdDnaeU,31998 -sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=M7wAYSL6Pvt-4nbfacAHGyyw4XMKJ_bQZ1tc1pBtIdg,1756 -sqlalchemy/dialects/postgresql/ranges.py,sha256=6CgV7qkxEMJ9AQsiibo_XBLJYzGh-2ZxpG83sRaesVY,32949 -sqlalchemy/dialects/postgresql/types.py,sha256=Jfxqw9JaKNOq29JRWBublywgb3lLMyzx8YZI7CXpS2s,7300 -sqlalchemy/dialects/sqlite/__init__.py,sha256=lp9DIggNn349M-7IYhUA8et8--e8FRExWD2V_r1LJk4,1182 -sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=g3qGV6jmiXabWyb3282g_Nmxtj1jThxGSe9C9yalb-U,12345 -sqlalchemy/dialects/sqlite/base.py,sha256=LcnW6hzxqTtPlDBOInHumvuDt8a31THA5Jnm4vFvdFI,97811 -sqlalchemy/dialects/sqlite/dml.py,sha256=9GE55WvwoktKy2fHeT-Wbc9xPHgsbh5oBfd_fckMH5Q,8443 -sqlalchemy/dialects/sqlite/json.py,sha256=Eoplbb_4dYlfrtmQaI8Xddd2suAIHA-IdbDQYM-LIhs,2777 -sqlalchemy/dialects/sqlite/provision.py,sha256=UCpmwxf4IWlrpb2eLHGbPTpCFVbdI_KAh2mKtjiLYao,5632 -sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=OL2S_05DK9kllZj6DOz7QtEl7jI7syxjW6woS725ii4,5356 -sqlalchemy/dialects/sqlite/pysqlite.py,sha256=aDp47n0J509kl2hDchoaBKXEQVZtkux54DwfKytUAe4,28068 -sqlalchemy/dialects/type_migration_guidelines.txt,sha256=-uHNdmYFGB7bzUNT6i8M5nb4j6j9YUKAtW4lcBZqsMg,8239 -sqlalchemy/engine/__init__.py,sha256=Stb2oV6l8w65JvqEo6J4qtKoApcmOpXy3AAxQud4C1o,2818 -sqlalchemy/engine/_py_processors.py,sha256=j9i_lcYYQOYJMcsDerPxI0sVFBIlX5sqoYMdMJlgWPI,3744 -sqlalchemy/engine/_py_row.py,sha256=wSqoUFzLOJ1f89kgDb6sJm9LUrF5LMFpXPcK1vUsKcs,3787 -sqlalchemy/engine/_py_util.py,sha256=f2DI3AN1kv6EplelowesCVpwS8hSXNufRkZoQmJtSH8,2484 -sqlalchemy/engine/base.py,sha256=frWSMmt3dlentYH4QNN3cijdGzp8NbunColUZwWsWgI,122958 -sqlalchemy/engine/characteristics.py,sha256=N3kbvw_ApMh86wb5yAGnxtPYD4YRhYMWion1H_aVZBI,4765 -sqlalchemy/engine/create.py,sha256=mYJtOG2ZKM8sgyfjpGpamW15RDU7JXi5s6iibbJHMIs,33206 -sqlalchemy/engine/cursor.py,sha256=cFq61yrw76k-QR_xNUBWuL-Zeyb14ltG-6jo2Q2iuuw,76392 -sqlalchemy/engine/default.py,sha256=2wwKKdsagb3QTajRSEw8Hl-EnQ-LmRxy822xOGyenHc,84648 -sqlalchemy/engine/events.py,sha256=c0unNFFiHzTAvkUtXoJaxzMFMDwurBkHiiUhuN8qluc,37381 -sqlalchemy/engine/interfaces.py,sha256=fcVHOmnMo7JZLHzgSKoK3QsdVHH7kJ_AmrDvwW9Ka3k,112936 -sqlalchemy/engine/mock.py,sha256=yvpxgFmRw5G4QsHeF-ZwQGHKES-HqQOucTxFtN1uzdk,4179 -sqlalchemy/engine/processors.py,sha256=XyfINKbo-2fjN-mW55YybvFyQMOil50_kVqsunahkNs,2379 -sqlalchemy/engine/reflection.py,sha256=gwGs8y7x6py5z-ZWx3hQqQrwpHepMCTJyQcFwWJjPlw,75364 -sqlalchemy/engine/result.py,sha256=NZEskTMAcDzK-vjE96Fw8VvBL58s5Y6rt9vXcmZdM4w,77651 -sqlalchemy/engine/row.py,sha256=9AAQo9zYDL88GcZ3bjcQTwMT-YIcuGTSMAyTfmBJ_yM,12032 -sqlalchemy/engine/strategies.py,sha256=DqFSWaXJPL-29Omot9O0aOcuGL8KmCGyOvnPGDkAJoE,442 -sqlalchemy/engine/url.py,sha256=8eWkUaIUyDExOcJ2D4xJXRcn4OY1GQJ3Q2duSX6UGAg,30784 -sqlalchemy/engine/util.py,sha256=bNirO8k1S8yOW61uNH-a9QrWtAJ9VGFgbiR0lk1lUQU,5682 -sqlalchemy/event/__init__.py,sha256=KBrp622xojnC3FFquxa2JsMamwAbfkvzfv6Op0NKiYc,997 -sqlalchemy/event/api.py,sha256=DtDVgjKSorOfp9MGJ7fgMWrj4seC_hkwF4D8CW1RFZU,8226 -sqlalchemy/event/attr.py,sha256=X8QeHGK4ioSYht1vkhc11f606_mq_t91jMNIT314ubs,20751 -sqlalchemy/event/base.py,sha256=270OShTD17-bSFUFnPtKdVnB0NFJZ2AouYPo1wT0aJw,15127 -sqlalchemy/event/legacy.py,sha256=teMPs00fO-4g8a_z2omcVKkYce5wj_1uvJO2n2MIeuo,8227 -sqlalchemy/event/registry.py,sha256=nfTSSyhjZZXc5wseWB4sXn-YibSc0LKX8mg17XlWmAo,10835 -sqlalchemy/events.py,sha256=k-ZD38aSPD29LYhED7CBqttp5MDVVx_YSaWC2-cu9ec,525 -sqlalchemy/exc.py,sha256=M_8-O1hd8i6gbyx-TapV400p_Lxq2QqTGMXUAO-YgCc,23976 -sqlalchemy/ext/__init__.py,sha256=S1fGKAbycnQDV01gs-JWGaFQ9GCD4QHwKcU2wnugg_o,322 -sqlalchemy/ext/associationproxy.py,sha256=ZGc_ssGf7FC6eKrja1iTvnWEKLkFZQA8CiVAjR8iVRw,66062 -sqlalchemy/ext/asyncio/__init__.py,sha256=1OqSxEyIUn7RWLGyO12F-jAUIvk1I6DXlVy80-Gvkds,1317 -sqlalchemy/ext/asyncio/base.py,sha256=fl7wxZD9KjgFiCtG3WXrYjHEvanamcsodCqq9pH9lOk,8905 -sqlalchemy/ext/asyncio/engine.py,sha256=S_IRWX4QAjj2veLSu4Y3gKBIXkKQt7_2StJAK2_KUDY,48190 -sqlalchemy/ext/asyncio/exc.py,sha256=8sII7VMXzs2TrhizhFQMzSfcroRtiesq8o3UwLfXSgQ,639 -sqlalchemy/ext/asyncio/result.py,sha256=3rbVIY_wySi50JwaK3Kf2qa3c5Fc8W84FtUpt-9i9Vk,30477 -sqlalchemy/ext/asyncio/scoping.py,sha256=UxHAFxtWKqA7TEozyN2h7MJyzSspTCrS-1SlgQLTExo,52608 -sqlalchemy/ext/asyncio/session.py,sha256=QpXnqspwYnT28znD1EdpUIaVjQOO1BirtS0BJeBxeZk,63087 -sqlalchemy/ext/automap.py,sha256=r0mUSyogNyqdBL4m9AA1NXbLiTLQmtvyQymsssNEipo,61581 -sqlalchemy/ext/baked.py,sha256=H6T1il7GY84BhzPFj49UECSpZh_eBuiHomA-QIsYOYQ,17807 -sqlalchemy/ext/compiler.py,sha256=6X6sZCAo9v-PQfLbwBSYQUK0-XH2xTE5Jm0Zg6Ka6eM,20877 -sqlalchemy/ext/declarative/__init__.py,sha256=20psLdFQbbOWfpdXHZ0CTY6I1k4UqXvKemNVu1LvPOI,1818 -sqlalchemy/ext/declarative/extensions.py,sha256=uCjN1GisQt54AjqYnKYzJdUjnGd2pZBW47WWdPlS7FE,19547 -sqlalchemy/ext/horizontal_shard.py,sha256=wuwAPnHymln0unSBnyx-cpX0AfESKSsypaSQTYCvzDk,16750 -sqlalchemy/ext/hybrid.py,sha256=IYkCaPZ29gm2cPKPg0cWMkLCEqMykD8-JJTvgacGbmc,52458 -sqlalchemy/ext/indexable.py,sha256=UkTelbydKCdKelzbv3HWFFavoET9WocKaGRPGEOVfN8,11032 -sqlalchemy/ext/instrumentation.py,sha256=sg8ghDjdHSODFXh_jAmpgemnNX1rxCeeXEG3-PMdrNk,15707 -sqlalchemy/ext/mutable.py,sha256=L5ZkHBGYhMaqO75Xtyrk2DBR44RDk0g6Rz2HzHH0F8Q,37355 -sqlalchemy/ext/mypy/__init__.py,sha256=0WebDIZmqBD0OTq5JLtd_PmfF9JGxe4d4Qv3Ml3PKUg,241 -sqlalchemy/ext/mypy/apply.py,sha256=Aek_-XA1eXihT4attxhfE43yBKtCgsxBSb--qgZKUqc,10550 -sqlalchemy/ext/mypy/decl_class.py,sha256=1vVJRII2apnLTUbc5HkJS6Z2GueaUv_eKvhbqh7Wik4,17384 -sqlalchemy/ext/mypy/infer.py,sha256=KVnmLFEVS33Al8pUKI7MJbJQu3KeveBUMl78EluBORw,19369 -sqlalchemy/ext/mypy/names.py,sha256=Q3ef8XQBgVm9WUwlItqlYCXDNi_kbV5DdLEgbtEMEI8,10479 -sqlalchemy/ext/mypy/plugin.py,sha256=74ML8LI9xar0V86oCxnPFv5FQGEEfUzK64vOay4BKFs,9750 -sqlalchemy/ext/mypy/util.py,sha256=DKRaurkXHI2lAMAAcEO5GLXbX_m2Xqy7l_juh8Byf5U,9960 -sqlalchemy/ext/orderinglist.py,sha256=TGYbsGH72wEZcFNQDYDsZg9OSPuzf__P8YX8_2HtYUo,14384 -sqlalchemy/ext/serializer.py,sha256=D0g4jMZkRk0Gjr0L-FZe81SR63h0Zs-9JzuWtT_SD7k,6140 -sqlalchemy/future/__init__.py,sha256=q2mw-gxk_xoxJLEvRoyMha3vO1xSRHrslcExOHZwmPA,512 -sqlalchemy/future/engine.py,sha256=AgIw6vMsef8W6tynOTkxsjd6o_OQDwGjLdbpoMD8ue8,495 -sqlalchemy/inspection.py,sha256=MF-LE358wZDUEl1IH8-Uwt2HI65EsQpQW5o5udHkZwA,5063 -sqlalchemy/log.py,sha256=8x9UR3nj0uFm6or6bQF-JWb4fYv2zOeQjG_w-0wOJFA,8607 -sqlalchemy/orm/__init__.py,sha256=ZYys5nL3RFUDCMOLFDBrRI52F6er3S1U1OY9TeORuKs,8463 -sqlalchemy/orm/_orm_constructors.py,sha256=8EQfYsDL2k_ev0eK-wxMl3algouczN38Gu43CrRlAlo,103434 -sqlalchemy/orm/_typing.py,sha256=DVBfpHmDVK4x1zxaGJPY2GoTrAsyR6uexv20Lzf1afc,4973 -sqlalchemy/orm/attributes.py,sha256=lorOHBJvJJYndOuafWJhHBbQ1pR6FAyimhqz-mErBRQ,92534 -sqlalchemy/orm/base.py,sha256=FXkYTSCDUJFQSB5pcyPt2wG-dRctf5P6ySjyjVxQsX0,27502 -sqlalchemy/orm/bulk_persistence.py,sha256=1FC23bRJKjpfbp2D5hYuV1qOVIKGSswu9XPXbbSJ5Mo,72663 -sqlalchemy/orm/clsregistry.py,sha256=IjoDZwWpjG42ji59L4M1EZvjBEoXPZykzENDtKWxU8A,17974 -sqlalchemy/orm/collections.py,sha256=WEKuUCRgLhDhJEIBhZ21UrE0pBOyRm2zxD20GvbgA9g,52243 -sqlalchemy/orm/context.py,sha256=FMPyw07OA9OXWQ32RQx52AEa2xTLSkqdYgx9R_yN1x0,112955 -sqlalchemy/orm/decl_api.py,sha256=_WPKQ_vSE5k2TLtNmkaxxYmvbhZvkRMrrvCeDxdqDQE,63998 -sqlalchemy/orm/decl_base.py,sha256=8R7go5sULTYNRlhYiEjXIJkQ34oPp7DY_fC2nS5D5is,83343 -sqlalchemy/orm/dependency.py,sha256=hgjksUWhgbmgHK5GdJdiDCBgDAIGQXIrY-Tj79tbL2k,47631 -sqlalchemy/orm/descriptor_props.py,sha256=dR_h4Gvdtpcdp4sj_ZOR4P5Nng2J2vhsvFHouRLlntc,37244 -sqlalchemy/orm/dynamic.py,sha256=rWAZ-nfAkREuNjt8e_FRdqYrvHDdbODn1CcfyP8Y18k,9816 -sqlalchemy/orm/evaluator.py,sha256=tRETz4dNZ71VsEA8nG0hpefByB-W0zBt02IxcSR5H2g,12353 -sqlalchemy/orm/events.py,sha256=1PiGT7JMUWTDAb3X1T79P02BMVDmcWEpatz1FwpLqoA,127777 -sqlalchemy/orm/exc.py,sha256=IP40P-wOeXhkYk0YizuTC3wqm6W9cPTaQU08f5MMaQ0,7413 -sqlalchemy/orm/identity.py,sha256=jHdCxCpCyda_8mFOfGmN_Pr0XZdKiU-2hFZshlNxbHs,9249 -sqlalchemy/orm/instrumentation.py,sha256=M-kZmkUvHUxtf-0mCA8RIM5QmMH1hWlYR_pKMwaidjA,24321 -sqlalchemy/orm/interfaces.py,sha256=7Lni4Cue41b1CsmN4VbeUyWwzuNMcKtkrpihc9U-WIw,48690 -sqlalchemy/orm/loading.py,sha256=9RacpzFOWbuKgPRWHFmyIvD4fYCLAnkpwBFASyQ2CoI,58277 -sqlalchemy/orm/mapped_collection.py,sha256=zK3d3iozORzDruBUrAmkVC0RR3Orj5szk-TSQ24xzIU,19682 -sqlalchemy/orm/mapper.py,sha256=W-srpoEc3UIYv_6qTXTd_dG_TVeQcToG77VGrXt85PM,171738 -sqlalchemy/orm/path_registry.py,sha256=sJZMv_WPqUpHfQtKWaX3WYFeKBcNJ8C3wOM2mkBGkTE,25920 -sqlalchemy/orm/persistence.py,sha256=dzyB2JOXNwQgaCbN8kh0sEz00WFePr48qf8NWVCUZH8,61701 -sqlalchemy/orm/properties.py,sha256=eDPFzxYUgdM3uWjHywnb1XW-i0tVKKyx7A2MCD31GQU,29306 -sqlalchemy/orm/query.py,sha256=Cf0e94-u1XyoXJoOAmr4iFvtCwNY98kxUYyMPenaWTE,117708 -sqlalchemy/orm/relationships.py,sha256=dS5SY0v1MiD7iCNnAQlHaI6prUQhL5EkXT7ijc8FR8E,128644 -sqlalchemy/orm/scoping.py,sha256=rJVc7_Lic4V00HZ-UvYFWkVpXqdrMayRmIs4fIwH1UA,78688 -sqlalchemy/orm/session.py,sha256=CZJTQ-wPwIy0c3AMFxgJnBgaft6eEf4JzcCLcaaCSjg,195979 -sqlalchemy/orm/state.py,sha256=327-F4TG29s6mLC8oWRiO2PuvYIUZzY1MqUPjtUy7M4,37670 -sqlalchemy/orm/state_changes.py,sha256=qKYg7NxwrDkuUY3EPygAztym6oAVUFcP2wXn7QD3Mz4,6815 -sqlalchemy/orm/strategies.py,sha256=-tsBRsmEqkaxAAIn4t2F-U5SrRIPoPCyzpqFYGTAwNs,119866 -sqlalchemy/orm/strategy_options.py,sha256=oeDl_rMDNAC_90N7ytsni-psXWAeQMhABQFyKBSmai0,85353 -sqlalchemy/orm/sync.py,sha256=g7iZfSge1HgxMk9SKRgUgtHEbpbZ1kP_CBqOIdTOXqc,5779 -sqlalchemy/orm/unitofwork.py,sha256=fiVaqcymbDDHRa1NjS90N9Z466nd5pkJOEi1dHO6QLY,27033 -sqlalchemy/orm/util.py,sha256=5SC4MOVU0cPObexDjpMvXvetueiU5pze42raL94gj24,81021 -sqlalchemy/orm/writeonly.py,sha256=SYu2sAaHZONk2pW4PmtE871LG-O0P_bjidvKzY1H_zI,22305 -sqlalchemy/pool/__init__.py,sha256=qiDdq4r4FFAoDrK6ncugF_i6usi_X1LeJt-CuBHey0s,1804 -sqlalchemy/pool/base.py,sha256=WF4az4ZKuzQGuKeSJeyexaYjmWZUvYdC6KIi8zTGodw,52236 -sqlalchemy/pool/events.py,sha256=xGjkIUZl490ZDtCHqnQF9ZCwe2Jv93eGXmnQxftB11E,13147 -sqlalchemy/pool/impl.py,sha256=JwpALSkH-pCoO_6oENbkHYY00Jx9nlttyoI61LivRNc,18944 -sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -sqlalchemy/schema.py,sha256=dKiWmgHYjcKQ4TiiD6vD0UMmIsD8u0Fsor1M9AAeGUs,3194 -sqlalchemy/sql/__init__.py,sha256=UNa9EUiYWoPayf-FzNcwVgQvpsBdInPZfpJesAStN9o,5820 -sqlalchemy/sql/_dml_constructors.py,sha256=YdBJex0MCVACv4q2nl_ii3uhxzwU6aDB8zAsratX5UQ,3867 -sqlalchemy/sql/_elements_constructors.py,sha256=833Flez92odZkE2Vy6SXK8LcoO1AwkfVzOnATJLWFsA,63168 -sqlalchemy/sql/_orm_types.py,sha256=T-vjcry4C1y0GToFKVxQCnmly_-Zsq4IO4SHN6bvUF4,625 -sqlalchemy/sql/_py_util.py,sha256=hiM9ePbRSGs60bAMxPFuJCIC_p9SQ1VzqXGiPchiYwE,2173 -sqlalchemy/sql/_selectable_constructors.py,sha256=wjE6HrLm9cR7bxvZXT8sFLUqT6t_J9G1XyQCnYmBDl0,18780 -sqlalchemy/sql/_typing.py,sha256=oqwrYHVMtK-AuKGH9c4SgfiOEJUt5vjkzSEzzscMHkM,12771 -sqlalchemy/sql/annotation.py,sha256=aqbbVz9kfbCT3_66CZ9GEirVN197Cukoqt8rq48FgkQ,18245 -sqlalchemy/sql/base.py,sha256=M1b-Tg49ikUW2mnZv0aI38oASG6dgeo4jBNWDgJgAg8,73925 -sqlalchemy/sql/cache_key.py,sha256=0Db8mR8IrpBgdzXs4TGTt98LOpL3c7KABd72MAPKUQQ,33668 -sqlalchemy/sql/coercions.py,sha256=hAEou9Ycyswzu8yz_Q7QkwL2_c3nctzBJQS2oDEr4iE,40664 -sqlalchemy/sql/compiler.py,sha256=hrTptbOKIgVIHapywj4Lk5OMwpXvHS-KGg3odFwlo-I,274687 -sqlalchemy/sql/crud.py,sha256=HBX4QPtW_PYYJmIKfNr-wE8IdEr963N24WXzFBUZOo0,56514 -sqlalchemy/sql/ddl.py,sha256=lKqvOigbcYrDG0euxd5F4tu9HbBi1kmp3eFPc45HH-8,45636 -sqlalchemy/sql/default_comparator.py,sha256=utXWsZVGEjflhFfCT4ywa6RnhORc1Rryo87Hga71Rps,16707 -sqlalchemy/sql/dml.py,sha256=pn0Lm1ofC5qVZzwGWFW73lPCiNba8OsTeemurJgwRyg,65614 -sqlalchemy/sql/elements.py,sha256=YfccXzQc9DlgF8q15kDf-zKBUY_vpIe0FGaVDBPoic4,176544 -sqlalchemy/sql/events.py,sha256=iC_Q1Htm1Aobt5tOYxWfHHqNpoytrULORmUKcusH_-E,18290 -sqlalchemy/sql/expression.py,sha256=VMX-dLpsZYnVRJpYNDozDUgaj7iQ0HuewUKVefD57PE,7586 -sqlalchemy/sql/functions.py,sha256=kMMYplvuIHFAPwxBI03SizwaLcYEHzysecWk-R1V-JM,63762 -sqlalchemy/sql/lambdas.py,sha256=DP0Qz7Ypo8QhzMwygGHYgRhwJMx-rNezO1euouH3iYU,49292 -sqlalchemy/sql/naming.py,sha256=ZHs1qSV3ou8TYmZ92uvU3sfdklUQlIz4uhe330n05SU,6858 -sqlalchemy/sql/operators.py,sha256=himArRqBzrljob3Zfhi_ZS-Jleg1u6YFp0g3d7Co6IM,76106 -sqlalchemy/sql/roles.py,sha256=pOsVn_OZD7mF2gJByHf24Rjopt0_Hu3dUCEOK5t4KS8,7662 -sqlalchemy/sql/schema.py,sha256=iFleWHkxi-3mKGiK_N1TzUqxnNwOpypB4bWDuAVQe8c,229717 -sqlalchemy/sql/selectable.py,sha256=cgyV0AsPy4CXAFdhMiTCkbgaHiFilW9sclzxlHJKH3o,236460 -sqlalchemy/sql/sqltypes.py,sha256=5_N9MhprQFWYc3yjcXgFC_DmvkQU-Jz-Ok9nIMYp2Q4,127469 -sqlalchemy/sql/traversals.py,sha256=3ScTC1fh1-y8Y478h_2Azmd2xdQdWPWkDve4YgrwMf8,33664 -sqlalchemy/sql/type_api.py,sha256=SN16_oNZG6G65cvG6ABPcptz_YV5vfB2fknwJZxrkOs,84464 -sqlalchemy/sql/util.py,sha256=qGHQF-tPCj-m1FBerzT7weCanGcXU7dK5m-W7NHio-4,48077 -sqlalchemy/sql/visitors.py,sha256=71wdVvhhZL4nJvVwFAs6ssaW-qZgNRSmKjpAcOzF_TA,36317 -sqlalchemy/testing/__init__.py,sha256=zgitAYzsCWT_U48ZiifXHHLJFo8nZBYmI-5TueA4_lE,3160 -sqlalchemy/testing/assertions.py,sha256=gL0rA7CCZJbcVgvWOPV91tTZTRwQc1_Ta0-ykBn83Ew,31439 -sqlalchemy/testing/assertsql.py,sha256=IgQG7l94WaiRP8nTbilJh1ZHZl125g7GPq-S5kmQZN0,16817 -sqlalchemy/testing/asyncio.py,sha256=kM8uuOqDBagZF0r9xvGmsiirUVLUQ_KBzjUFU67W-b8,3830 -sqlalchemy/testing/config.py,sha256=AqyH1qub_gDqX0BvlL-JBQe7N-t2wo8655FtwblUNOY,12090 -sqlalchemy/testing/engines.py,sha256=HFJceEBD3Q_TTFQMTtIV5wGWO_a7oUgoKtUF_z636SM,13481 -sqlalchemy/testing/entities.py,sha256=IphFegPKbff3Un47jY6bi7_MQXy6qkx_50jX2tHZJR4,3354 -sqlalchemy/testing/exclusions.py,sha256=T8B01hmm8WVs-EKcUOQRzabahPqblWJfOidi6bHJ6GA,12460 -sqlalchemy/testing/fixtures/__init__.py,sha256=dMClrIoxqlYIFpk2ia4RZpkbfxsS_3EBigr9QsPJ66g,1198 -sqlalchemy/testing/fixtures/base.py,sha256=9r_J2ksiTzClpUxW0TczICHrWR7Ny8PV8IsBz6TsGFI,12256 -sqlalchemy/testing/fixtures/mypy.py,sha256=gdxiwNFIzDlNGSOdvM3gbwDceVCC9t8oM5kKbwyhGBk,11973 -sqlalchemy/testing/fixtures/orm.py,sha256=8EFbnaBbXX_Bf4FcCzBUaAHgyVpsLGBHX16SGLqE3Fg,6095 -sqlalchemy/testing/fixtures/sql.py,sha256=KZMjco9_3dsuspmkew5Ejp88Wlr9PsSBB1qeJGFxQAk,15900 -sqlalchemy/testing/pickleable.py,sha256=U9mIqk-zaxq9Xfy7HErP7UrKgTov-A3QFnhZh-NiOjI,2833 -sqlalchemy/testing/plugin/__init__.py,sha256=79F--BIY_NTBzVRIlJGgAY5LNJJ3cD19XvrAo4X0W9A,247 -sqlalchemy/testing/plugin/bootstrap.py,sha256=oYScMbEW4pCnWlPEAq1insFruCXFQeEVBwo__i4McpU,1685 -sqlalchemy/testing/plugin/plugin_base.py,sha256=BgNzWNEmgpK4CwhyblQQKnH-7FDKVi_Uul5vw8fFjBU,21578 -sqlalchemy/testing/plugin/pytestplugin.py,sha256=6jkQHH2VQMD75k2As9CuWXmEy9jrscoFRhCNg6-PaTw,27656 -sqlalchemy/testing/profiling.py,sha256=PbuPhRFbauFilUONeY3tV_Y_5lBkD7iCa8VVyH2Sk9Y,10148 -sqlalchemy/testing/provision.py,sha256=3qFor_sN1FFlS7odUGkKqLUxGmQZC9XM67I9vQ_zeXo,14626 -sqlalchemy/testing/requirements.py,sha256=Z__o-1Rj9B7dI8E_l3qsKTvsg0rK198vB0A1p7A5dcM,52832 -sqlalchemy/testing/schema.py,sha256=lr4GkGrGwagaHMuSGzWdzkMaj3HnS7dgfLLWfxt__-U,6513 -sqlalchemy/testing/suite/__init__.py,sha256=Y5DRNG0Yl1u3ypt9zVF0Z9suPZeuO_UQGLl-wRgvTjU,722 -sqlalchemy/testing/suite/test_cte.py,sha256=6zBC3W2OwX1Xs-HedzchcKN2S7EaLNkgkvV_JSZ_Pq0,6451 -sqlalchemy/testing/suite/test_ddl.py,sha256=1Npkf0C_4UNxphthAGjG078n0vPEgnSIHpDu5MfokxQ,12031 -sqlalchemy/testing/suite/test_deprecations.py,sha256=BcJxZTcjYqeOAENVElCg3hVvU6fkGEW3KGBMfnW8bng,5337 -sqlalchemy/testing/suite/test_dialect.py,sha256=EH4ZQWbnGdtjmx5amZtTyhYmrkXJCvW1SQoLahoE7uk,22923 -sqlalchemy/testing/suite/test_insert.py,sha256=9azifj6-OCD7s8h_tAO1uPw100ibQv8YoKc_VA3hn3c,18824 -sqlalchemy/testing/suite/test_reflection.py,sha256=7sML8-owubSQeEM7Ve6LbnB8uIVlNV00WWepKwII2a8,109648 -sqlalchemy/testing/suite/test_results.py,sha256=X720GafdA4p75SOGS93j-dXkt6QDEnnJbU2bh18VCcg,16914 -sqlalchemy/testing/suite/test_rowcount.py,sha256=3KDTlRgjpQ1OVfp__1cv8Hvq4CsDKzmrhJQ_WIJWoJg,7900 -sqlalchemy/testing/suite/test_select.py,sha256=ulRZQJlzkwwcewEyisuBEXVWFR0Wshz9MEDxYYiYLwQ,61732 -sqlalchemy/testing/suite/test_sequence.py,sha256=66bCoy4xo99GBSaX6Hxb88foANAykLGRz1YEKbvpfuA,9923 -sqlalchemy/testing/suite/test_types.py,sha256=K4MGHvnTtgqeksoQOBCZRVQYC7HoYO6Z6rVt5vj2t9o,67805 -sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=c3_eIxLyORuSOhNDP0jWKxPyUf3SwMFpdalxtquwqlM,6141 -sqlalchemy/testing/suite/test_update_delete.py,sha256=yTiM2unnfOK9rK8ZkqeTTU_MkT-RsKFLmdYliniZfAY,3994 -sqlalchemy/testing/util.py,sha256=qldXKw8gRJ4I2x3uXsBssYMqwatmcMFMTOveRQCmfDU,14469 -sqlalchemy/testing/warnings.py,sha256=fJ-QJUY2zY2PPxZJKv9medW-BKKbCNbA4Ns_V3YwFXM,1546 -sqlalchemy/types.py,sha256=cQFM-hFRmaf1GErun1qqgEs6QxufvzMuwKqj9tuMPpE,3168 -sqlalchemy/util/__init__.py,sha256=5D5Mquvx3SOmud0QErKzzGvBTkqMdhrrd_sXijOILeo,8312 -sqlalchemy/util/_collections.py,sha256=aZoSAVOXnHBoYEsxDOi0O9odg9wqLbGb7PGjaWQKiyY,20078 -sqlalchemy/util/_concurrency_py3k.py,sha256=zb0Bow2Y_QjTdaACEviBEEaFvqDuVvpJfmwCjaw8xNE,9170 -sqlalchemy/util/_has_cy.py,sha256=wCQmeSjT3jaH_oxfCEtGk-1g0gbSpt5MCK5UcWdMWqk,1247 -sqlalchemy/util/_py_collections.py,sha256=U6L5AoyLdgSv7cdqB4xxQbw1rpeJjyOZVXffgxgga8I,16714 -sqlalchemy/util/compat.py,sha256=cnucBQOKspo58vjRpQXUBrHGguHOSFvftpD-I8vfUy0,8760 -sqlalchemy/util/concurrency.py,sha256=9lT_cMoO1fZNdY8QTUZ22oeSf-L5I-79Ke7chcBNPA0,3304 -sqlalchemy/util/deprecations.py,sha256=YBwvvYhSB8LhasIZRKvg_-WNoVhPUcaYI1ZrnjDn868,11971 -sqlalchemy/util/langhelpers.py,sha256=uIK3szZuq9aMnO-vEpSlNekNWv4I-E391e56bkTnUm0,65090 -sqlalchemy/util/preloaded.py,sha256=az7NmLJLsqs0mtM9uBkIu10-841RYDq8wOyqJ7xXvqE,5904 -sqlalchemy/util/queue.py,sha256=CaeSEaYZ57YwtmLdNdOIjT5PK_LCuwMFiO0mpp39ybM,10185 -sqlalchemy/util/tool_support.py,sha256=9braZyidaiNrZVsWtGmkSmus50-byhuYrlAqvhjcmnA,6135 -sqlalchemy/util/topological.py,sha256=N3M3Le7KzGHCmqPGg0ZBqixTDGwmFLhOZvBtc4rHL_g,3458 -sqlalchemy/util/typing.py,sha256=lFcGo1dJbZIZ9drAnvef-PzP0cX4LMxMSwgk3lJBb0g,18182 diff --git a/libs/SQLAlchemy-2.0.36.dist-info/INSTALLER b/libs/SQLAlchemy-2.0.37.dist-info/INSTALLER similarity index 100% rename from libs/SQLAlchemy-2.0.36.dist-info/INSTALLER rename to libs/SQLAlchemy-2.0.37.dist-info/INSTALLER diff --git a/libs/SQLAlchemy-2.0.36.dist-info/LICENSE b/libs/SQLAlchemy-2.0.37.dist-info/LICENSE similarity index 94% rename from libs/SQLAlchemy-2.0.36.dist-info/LICENSE rename to libs/SQLAlchemy-2.0.37.dist-info/LICENSE index 967cdc5dc..dfe1a4d81 100644 --- a/libs/SQLAlchemy-2.0.36.dist-info/LICENSE +++ b/libs/SQLAlchemy-2.0.37.dist-info/LICENSE @@ -1,4 +1,4 @@ -Copyright 2005-2024 SQLAlchemy authors and contributors <see AUTHORS file>. +Copyright 2005-2025 SQLAlchemy authors and contributors <see AUTHORS file>. 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 diff --git a/libs/SQLAlchemy-2.0.36.dist-info/METADATA b/libs/SQLAlchemy-2.0.37.dist-info/METADATA similarity index 99% rename from libs/SQLAlchemy-2.0.36.dist-info/METADATA rename to libs/SQLAlchemy-2.0.37.dist-info/METADATA index 0c802c4dc..e548f29da 100644 --- a/libs/SQLAlchemy-2.0.36.dist-info/METADATA +++ b/libs/SQLAlchemy-2.0.37.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: SQLAlchemy -Version: 2.0.36 +Version: 2.0.37 Summary: Database Abstraction Library Home-page: https://www.sqlalchemy.org Author: Mike Bayer @@ -28,7 +28,7 @@ Requires-Python: >=3.7 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: typing-extensions >=4.6.0 -Requires-Dist: greenlet !=0.4.17 ; python_version < "3.13" and (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: greenlet !=0.4.17 ; python_version < "3.14" and (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' diff --git a/libs/SQLAlchemy-2.0.37.dist-info/RECORD b/libs/SQLAlchemy-2.0.37.dist-info/RECORD new file mode 100644 index 000000000..d9bb0e04f --- /dev/null +++ b/libs/SQLAlchemy-2.0.37.dist-info/RECORD @@ -0,0 +1,275 @@ +SQLAlchemy-2.0.37.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +SQLAlchemy-2.0.37.dist-info/LICENSE,sha256=mCFyC1jUpWW2EyEAeorUOraZGjlZ5mzV203Z6uacffw,1100 +SQLAlchemy-2.0.37.dist-info/METADATA,sha256=UywKCGKcABKNtpI-G6qnmmxpFaI6iJcHIDeLUQ2RvWQ,9692 +SQLAlchemy-2.0.37.dist-info/RECORD,, +SQLAlchemy-2.0.37.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +SQLAlchemy-2.0.37.dist-info/WHEEL,sha256=j8_MCNBI7KgztMI2VCVmNiYcEly_P_7tu-qcbaOXbrw,108 +SQLAlchemy-2.0.37.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 +sqlalchemy/__init__.py,sha256=m8AoRzqL1l_3uFAeJ_vwtlAfXkboxLKJ3oL1RqFnXbM,13033 +sqlalchemy/connectors/__init__.py,sha256=YeSHsOB0YhdM6jZUvHFQFwKqNXO02MlklmGW0yCywjI,476 +sqlalchemy/connectors/aioodbc.py,sha256=KT9xi2xQ4AJgDiGPTV5h_5qi9dummmenKAvWelwza3w,5288 +sqlalchemy/connectors/asyncio.py,sha256=00claZADdFUh2iQmlpqoLhLTBxK0i79Mwd9WZqUtleM,6138 +sqlalchemy/connectors/pyodbc.py,sha256=GsW9bD0H30OMTbGDx9SdaTT_ujgpxP7TM4rfhIzD4mo,8501 +sqlalchemy/cyextension/__init__.py,sha256=4npVIjitKfUs0NQ6f3UdQBDq4ipJ0_ZNB2mpKqtc5ik,244 +sqlalchemy/cyextension/collections.cpython-38-darwin.so,sha256=sEF81qKQrUMYUNYDc5rR0o9KN5ntUi5sU3VFXT_Gbs4,233760 +sqlalchemy/cyextension/collections.pyx,sha256=L7DZ3DGKpgw2MT2ZZRRxCnrcyE5pU1NAFowWgAzQPEc,12571 +sqlalchemy/cyextension/immutabledict.cpython-38-darwin.so,sha256=zPUP2rtm01kkegS3n-rYzu7VgmZNo1hQS65vgIUme4U,94672 +sqlalchemy/cyextension/immutabledict.pxd,sha256=3x3-rXG5eRQ7bBnktZ-OJ9-6ft8zToPmTDOd92iXpB0,291 +sqlalchemy/cyextension/immutabledict.pyx,sha256=KfDTYbTfebstE8xuqAtuXsHNAK0_b5q_ymUiinUe_xs,3535 +sqlalchemy/cyextension/processors.cpython-38-darwin.so,sha256=ZXviRx-dUBLWF5Z2xb2ImYGZR2s1VEEX0rvOvBihfYk,75864 +sqlalchemy/cyextension/processors.pyx,sha256=R1rHsGLEaGeBq5VeCydjClzYlivERIJ9B-XLOJlf2MQ,1792 +sqlalchemy/cyextension/resultproxy.cpython-38-darwin.so,sha256=uA4vRLlgWg8sEjeTXmJ5v4DAxpCubWTNMJGDRgtlgzY,78016 +sqlalchemy/cyextension/resultproxy.pyx,sha256=eWLdyBXiBy_CLQrF5ScfWJm7X0NeelscSXedtj1zv9Q,2725 +sqlalchemy/cyextension/util.cpython-38-darwin.so,sha256=BA75sGnaj5sISpo7_70Id7LycML4iHxagdVolVa8Mf4,93008 +sqlalchemy/cyextension/util.pyx,sha256=B85orxa9LddLuQEaDoVSq1XmAXIbLKxrxpvuB8ogV_o,2530 +sqlalchemy/dialects/__init__.py,sha256=4jxiSgI_fVCNXcz42gQYKEp0k07RAHyQN4ZpjaNsFUI,1770 +sqlalchemy/dialects/_typing.py,sha256=8YwrkOa8IvmBojwwegbL5mL_0UAuzdqYiKHKANpvHMw,971 +sqlalchemy/dialects/mssql/__init__.py,sha256=6t_aNpgbMLdPE9gpHYTf9o6QfVavncztRLbr21l2NaY,1880 +sqlalchemy/dialects/mssql/aioodbc.py,sha256=4CmhwIkZrabpG-r7_ogRVajD-nhRZSFJ0Swz2d0jIHM,2021 +sqlalchemy/dialects/mssql/base.py,sha256=2UCotpN3WBPgMddhXVP6Epc-srvNrYHCnK4kcEbjW6w,132713 +sqlalchemy/dialects/mssql/information_schema.py,sha256=v5MZz1FN72THEwF_u3Eh_2vnWdFE13RYydOioMMcuvU,8084 +sqlalchemy/dialects/mssql/json.py,sha256=F53pibuOVRzgDtjoclOI7LnkKXNVsaVfJyBH1XAhyDo,4756 +sqlalchemy/dialects/mssql/provision.py,sha256=P1tqxZ4f6Oeqn2gNi7dXl82LRLCg1-OB4eWiZc6CHek,5593 +sqlalchemy/dialects/mssql/pymssql.py,sha256=C7yAs3Pw81W1KTVNc6_0sHQuYlJ5iH82vKByY4TkB1g,4097 +sqlalchemy/dialects/mssql/pyodbc.py,sha256=CnO7KDWxbxb7AoZhp_PMDBvVSMuzwq1h4Cav2IWFWDo,27173 +sqlalchemy/dialects/mysql/__init__.py,sha256=ropOMUWrAcL-Q7h-9jQ_tb3ISAFIsNRQ8YVXvn0URl0,2206 +sqlalchemy/dialects/mysql/aiomysql.py,sha256=yrujoFtAG0QvtVlgbGBUMg3kXeXlIH62tvyYTCMUfnE,10013 +sqlalchemy/dialects/mysql/asyncmy.py,sha256=rmVSf86VYxgAUROIKfVtvS-grG9aPBiLY_Gu0KJMjuo,10081 +sqlalchemy/dialects/mysql/base.py,sha256=LkGJ6G1U2xygOawOtQYBfTipGh8MuiE1kNxaD7S9UIY,123432 +sqlalchemy/dialects/mysql/cymysql.py,sha256=KwxSsF4a6uUd6yblhSns8uj4hgmhv4hFInTZNdmRixA,2300 +sqlalchemy/dialects/mysql/dml.py,sha256=VjnTobe_SBNF2RN6tvqa5LOn-9x4teVUyzUedZkOmdc,7768 +sqlalchemy/dialects/mysql/enumerated.py,sha256=qI5gnBYhxk9dhPeUfGiijp0qT2Puazdp27-ba_38uWQ,8447 +sqlalchemy/dialects/mysql/expression.py,sha256=3PEKPwYIZ8mVXkjUgHaj_efPBYuBNWZSnfUcJuoZddA,4121 +sqlalchemy/dialects/mysql/json.py,sha256=W31DojiRypifXKVh3PJSWP7IHqFoeKwzLl-0CJH6QRI,2269 +sqlalchemy/dialects/mysql/mariadb.py,sha256=g4v4WQuXHn556Nn6k-RgvPrmfCql1R46fIEk6UEx0U8,1450 +sqlalchemy/dialects/mysql/mariadbconnector.py,sha256=t4m6kfYBoURjNXRxlEsRajjvArNDc4lmaFGxHQh7VTo,8623 +sqlalchemy/dialects/mysql/mysqlconnector.py,sha256=gdNOGdRqvnCbLZpKjpubu_0tGRQ5Tn_2TZvbp3v9rX0,5729 +sqlalchemy/dialects/mysql/mysqldb.py,sha256=5ME7B0WI9G8tw5482YBejDg38uVMXR2oUasNDOCsAqQ,9526 +sqlalchemy/dialects/mysql/provision.py,sha256=5LCeInPvyEbGuzxSs9rnnLYkMsFpW3IJ8lC-sjTfKnk,3575 +sqlalchemy/dialects/mysql/pymysql.py,sha256=osp0em1s3Cip5Vpcj-PeaH7btHEInorO-qs351muw3Q,4082 +sqlalchemy/dialects/mysql/pyodbc.py,sha256=ZiFNJQq2qiOTzTZLmNJQ938EnS1ItVsNDa3fvNEDqnI,4298 +sqlalchemy/dialects/mysql/reflection.py,sha256=eGV9taua0nZS_HsHyAy6zjcHEHFPXmFdux-bUmtOeWs,22834 +sqlalchemy/dialects/mysql/reserved_words.py,sha256=C9npWSuhsxoVCqETxCQ1zE_UEgy4gfiHw9zI5dPkjWI,9258 +sqlalchemy/dialects/mysql/types.py,sha256=w68OASMw04xkyAc0_GtXkuEhhVqlR6LTwaOch4KaAFQ,24343 +sqlalchemy/dialects/oracle/__init__.py,sha256=rp9qPRNQAk1Yq_Zhe7SsUH8EvFgNOAh8XOF17Lkxpyo,1493 +sqlalchemy/dialects/oracle/base.py,sha256=_JF4OwXmXjAsXj8wXq2m8M2vtMjoxdlOwg1hfcgn3bc,123096 +sqlalchemy/dialects/oracle/cx_oracle.py,sha256=ohENTgLxGUfobRH3K8KdeZgBRPG1rX3vY-ph9blj-2g,56612 +sqlalchemy/dialects/oracle/dictionary.py,sha256=J7tGVE0KyUPZKpPLOary3HdDq1DWd29arF5udLgv8_o,19519 +sqlalchemy/dialects/oracle/oracledb.py,sha256=veqto1AUIbSxRmpUQin0ysMV8Y6sWAkzXt7W8IIl118,33771 +sqlalchemy/dialects/oracle/provision.py,sha256=ga1gNQZlXZKk7DYuYegllUejJxZXRKDGa7dbi_S_poc,8313 +sqlalchemy/dialects/oracle/types.py,sha256=axN6Yidx9tGRIUAbDpBrhMWXE-C8jSllFpTghpGOOzU,9058 +sqlalchemy/dialects/postgresql/__init__.py,sha256=kD8W-SV5e2CesvWg2MQAtncXuZFwGPfR_UODvmRXE08,3892 +sqlalchemy/dialects/postgresql/_psycopg_common.py,sha256=szME-lCjVwqnW9-USA6e8ke8N_bN3IbqnIm_oZruvqc,5696 +sqlalchemy/dialects/postgresql/array.py,sha256=28kndSQwgvNWlO4z6MUh5WYAtNSgkgBa6qSEQCIflks,13856 +sqlalchemy/dialects/postgresql/asyncpg.py,sha256=ysIDXcGT3OG2lu0YdiIn-_pzfL0uDe-tmHs70fOWVVE,41283 +sqlalchemy/dialects/postgresql/base.py,sha256=otAswEHqeRhbN9_AGMxnwDo6r872ECkiJ5FMetXfS0k,179452 +sqlalchemy/dialects/postgresql/dml.py,sha256=2SmyMeYveAgm7OnT_CJvwad2nh8BP37yT6gFs8dBYN8,12126 +sqlalchemy/dialects/postgresql/ext.py,sha256=MtN4IU5sRYvoY-E8PTltJ1CuIGb-aCwY2pHMPJcTboA,16318 +sqlalchemy/dialects/postgresql/hstore.py,sha256=wR4gmvfQWPssHwYTXEsPJTb4LkBS6x4e4XXE6smtDH4,11934 +sqlalchemy/dialects/postgresql/json.py,sha256=9sHFGTRFyNbLsANrVYookw9NOJwIPTsEBRNIOUOzOGw,11612 +sqlalchemy/dialects/postgresql/named_types.py,sha256=TEWaBCjuHM2WJoQNrQErQ6f_bUkWypGJfW71wzVJXWc,17572 +sqlalchemy/dialects/postgresql/operators.py,sha256=ay3ckNsWtqDjxDseTdKMGGqYVzST6lmfhbbYHG_bxCw,2808 +sqlalchemy/dialects/postgresql/pg8000.py,sha256=RAykzZuO3Anr6AsyK2JYr7CPb2pru6WtkrX2phCyCGU,18638 +sqlalchemy/dialects/postgresql/pg_catalog.py,sha256=lgJMn7aDuJI2XeHddLkge5NFy6oB2-aDSn8A47QpwAU,9254 +sqlalchemy/dialects/postgresql/provision.py,sha256=7pg9-nOnaK5XBzqByXNPuvi3rxtnRa3dJxdSPVq4eeA,5770 +sqlalchemy/dialects/postgresql/psycopg.py,sha256=k7zXsJj35aOXCrhsbMxwTQX5JWegrqirFJ1Hgbq-GjQ,23326 +sqlalchemy/dialects/postgresql/psycopg2.py,sha256=1KXw9RzsQEAXJazCBywdP5CwLu-HsCSDAD_Khc_rPTM,32032 +sqlalchemy/dialects/postgresql/psycopg2cffi.py,sha256=nKilJfvO9mJwk5NRw5iZDekKY5vi379tvdUJ2vn5eyQ,1756 +sqlalchemy/dialects/postgresql/ranges.py,sha256=fnaj4YgCQGO-G_S4k5ea8bYMH7SzggKJdUX5qfaNp4Y,32978 +sqlalchemy/dialects/postgresql/types.py,sha256=sjb-m-h49lbLBFh0P30G8BWgf_aKNiNyVwWEktugwRw,7286 +sqlalchemy/dialects/sqlite/__init__.py,sha256=6Xcz3nPsl8lqCcZ4-VzPRmkMrkKgAp2buKsClZelU7c,1182 +sqlalchemy/dialects/sqlite/aiosqlite.py,sha256=FWS-Nn2jnpITQKGd4xOZCYEW-l1C_erQ3IdDJC855t8,12348 +sqlalchemy/dialects/sqlite/base.py,sha256=PvwPzukomHAkufUzSqgfJcbKC2ZJAkJbVnW2BQB2T58,98271 +sqlalchemy/dialects/sqlite/dml.py,sha256=4N8qh06RuMphLoQgWw7wv5nXIrka57jIFvK2x9xTZqg,9138 +sqlalchemy/dialects/sqlite/json.py,sha256=A62xPyLRZxl2hvgTMM92jd_7jlw9UE_4Y6Udqt-8g04,2777 +sqlalchemy/dialects/sqlite/provision.py,sha256=iLJyeQSy8pfr9lwEu4_d4O_CI4OavAtkNeRi3qqys1U,5632 +sqlalchemy/dialects/sqlite/pysqlcipher.py,sha256=di8rYryfL0KAn3pRGepmunHyIRGy-4Hhr-2q_ehPzss,5371 +sqlalchemy/dialects/sqlite/pysqlite.py,sha256=rg7F1S2UOhUu6Y1xNVaqF8VbA-FsRY_Y_XpGTpkKpGs,28087 +sqlalchemy/dialects/type_migration_guidelines.txt,sha256=-uHNdmYFGB7bzUNT6i8M5nb4j6j9YUKAtW4lcBZqsMg,8239 +sqlalchemy/engine/__init__.py,sha256=EF4haWCPu95WtWx1GzcHRJ_bBmtJMznno3I2TQ-ZIHE,2818 +sqlalchemy/engine/_py_processors.py,sha256=7QxgkVOd5h1Qd22qFh-pPZdM7RBRzNjj8lWAMWrilcI,3744 +sqlalchemy/engine/_py_row.py,sha256=yNdrZe36yw6mO7x0OEbG0dGojH7CQkNReIwn9LMUPUs,3787 +sqlalchemy/engine/_py_util.py,sha256=LdpbNRQIrJo3EkmiwNkM5bxGUf4uWuL5uS_u-zHadWc,2484 +sqlalchemy/engine/base.py,sha256=9kCWrDp3ECOlQ7BHK_efYAILo3-emcPSk4F8AFRgN7E,122901 +sqlalchemy/engine/characteristics.py,sha256=PepmGApo1sL01dS1qtSbmHplu9ZCdtuSegiGI7L7NZY,4765 +sqlalchemy/engine/create.py,sha256=4gFkqV7fgJbI1906DC4zDgFFX1-xJQ96GIHIrQuc-w4,33217 +sqlalchemy/engine/cursor.py,sha256=6KIZqlwWMUMv02w_el4uNYFMYcfc7eWbkAxW27UyDLE,76305 +sqlalchemy/engine/default.py,sha256=SHM6boxcDNk7MW_Eyd0zCb557Eqf8KTdX1iTUbS0DLw,84705 +sqlalchemy/engine/events.py,sha256=4_e6Ip32ar2Eb27R4ipamiKC-7Tpg4lVz3txabhT5Rc,37400 +sqlalchemy/engine/interfaces.py,sha256=fGmcrBt8yT78ty0R3e3XUvsPh7XYDU_b1JW3QhK_MwY,113029 +sqlalchemy/engine/mock.py,sha256=_aXG1xzj_TO5UWdz8IthPj1ZJ8IlhsKw6D9mmFN_frQ,4181 +sqlalchemy/engine/processors.py,sha256=XK32bULBkuVVRa703u4-SrTCDi_a18Dxq1M09QFBEPw,2379 +sqlalchemy/engine/reflection.py,sha256=_v9zCy3h28hN4KKIUTc5_7KJv7argSgi8A011b_iCdc,75383 +sqlalchemy/engine/result.py,sha256=rgny4qFLmpj80GSdFK35Dpgc3Qk2tc3eJPpahGWVR-M,77622 +sqlalchemy/engine/row.py,sha256=BPtAwsceiRxB9ANpDNM24uQ1M_Zs0xFkSXoKR_I8xyY,12031 +sqlalchemy/engine/strategies.py,sha256=-0rieXY-iXgV83OrJZr-wozFFQn3amKKHchQ6kL-r7A,442 +sqlalchemy/engine/url.py,sha256=gaEeSEJCD0nVEb8J02rIMASrd5L2wYdq5ZXJaj7szVI,31069 +sqlalchemy/engine/util.py,sha256=4OmXwFlmnq6_vBlfUBHnz5LrI_8bT3TwgynX4wcJfnw,5682 +sqlalchemy/event/__init__.py,sha256=ZjVxFGbt9neH5AC4GFiUN5IG2O4j6Z9v2LdmyagJi9w,997 +sqlalchemy/event/api.py,sha256=NetgcQfbURaZzoxus7_801YDG_LJ7PYqaC3T1lws114,8111 +sqlalchemy/event/attr.py,sha256=YhPXVBPj63Cfyn0nS6h8Ljq0SEbD3mtAZn9HYlzGbtw,20751 +sqlalchemy/event/base.py,sha256=OevVb82IrUoVgFRrjH4b5GquS5pjFHOgzWAxPwwTKMY,15127 +sqlalchemy/event/legacy.py,sha256=lGafKAOF6PY8Bz0AqhN9Q6n-lpXqFLwdv-0T6-UBpow,8227 +sqlalchemy/event/registry.py,sha256=MNEMyR8HZhzQFgxk4Jk_Em6nXTihmGXiSIwPdUnalPM,11144 +sqlalchemy/events.py,sha256=VBRvtckn9JS3tfUfi6UstqUrvQ15J2xamcDByFysIrI,525 +sqlalchemy/exc.py,sha256=AjFBCrOl_V4vQdGegn72Y951RSRMPL6T5qjxnFTGFbM,23978 +sqlalchemy/ext/__init__.py,sha256=BkTNuOg454MpCY9QA3FLK8td7KQhD1W74fOEXxnWibE,322 +sqlalchemy/ext/associationproxy.py,sha256=VhOFB1vB8hmDYQP90_VdpPI9IFzP3NENkG_eDKziVoI,66062 +sqlalchemy/ext/asyncio/__init__.py,sha256=kTIfpwsHWhqZ-VMOBZFBq66kt1XeF0hNuwOToEDe4_Y,1317 +sqlalchemy/ext/asyncio/base.py,sha256=2YQ-nKaHbAm--7q6vbxbznzdwT8oPwetwAarKyu2O8E,8930 +sqlalchemy/ext/asyncio/engine.py,sha256=fe_RZrO-5DiiEgMZ3g-Lti-fdaR7z_Q8gDfPUf-30EY,48198 +sqlalchemy/ext/asyncio/exc.py,sha256=npijuILDXH2p4Q5RzhHzutKwZ5CjtqTcP-U0h9TZUmk,639 +sqlalchemy/ext/asyncio/result.py,sha256=zhhXe13vMT7OfdfGXapgtn4crtiqqctRLb3ka4mmGXY,30477 +sqlalchemy/ext/asyncio/scoping.py,sha256=4f7MX3zUd-4rA8A5wd7j0_GlqCSUxdOPfYd7BBIxkJI,52587 +sqlalchemy/ext/asyncio/session.py,sha256=2wxu06UtJGyf-be2edMFkcK4eLMh8xuGmsAlGRj0YPM,63166 +sqlalchemy/ext/automap.py,sha256=n88mktqvExwjqfsDu3yLIA4wbOIWUpQ1S35Uw3X6ffQ,61675 +sqlalchemy/ext/baked.py,sha256=w3SeRoqnPkIhPL2nRAxfVhyir2ypsiW4kmtmUGKs8qo,17753 +sqlalchemy/ext/compiler.py,sha256=f7o4qhUUldpsx4F1sQoUvdVaT2BhiemqNBCF4r_uQUo,20889 +sqlalchemy/ext/declarative/__init__.py,sha256=SuVflXOGDxx2sB2QSTqNEvqS0fyhOkh3-sy2lRsSOLA,1818 +sqlalchemy/ext/declarative/extensions.py,sha256=yHUPcztU-5E1JrNyELDFWKchAnaYK6Y9-dLcqyc1nUI,19531 +sqlalchemy/ext/horizontal_shard.py,sha256=vouIehpQAuwT0HXyWyynTL3m_gcBuLcB-X8lDB0uQ8U,16691 +sqlalchemy/ext/hybrid.py,sha256=DkvNGtiQYzlEBvs1rYEDXhM8vJEXXh_6DMigsHH9w4k,52531 +sqlalchemy/ext/indexable.py,sha256=_dTOgCS96jURcQd9L-hnUMIJDe9KUMyd9gfH57vs078,11065 +sqlalchemy/ext/instrumentation.py,sha256=iCp89rvfK7buW0jJyzKTBDKyMsd06oTRJDItOk4OVSw,15707 +sqlalchemy/ext/mutable.py,sha256=7Zyh2kQq2gm3J_JwsddinIXk7qUuKWbPzRZOmTultEk,37560 +sqlalchemy/ext/mypy/__init__.py,sha256=yVNtoBDNeTl1sqRoA_fSY3o1g6M8NxqUVvAHPRLmFTw,241 +sqlalchemy/ext/mypy/apply.py,sha256=v_Svc1WiBz9yBXqBVBKoCuPGN286TfVmuuCVZPlbyzo,10591 +sqlalchemy/ext/mypy/decl_class.py,sha256=Nuca4ofHkASAkdqEQlULYB7iLm_KID7Mp384seDhVGg,17384 +sqlalchemy/ext/mypy/infer.py,sha256=29vgn22Hi8E8oIZL6UJCBl6oipiPSAQjxccCEkVb410,19367 +sqlalchemy/ext/mypy/names.py,sha256=hn889DD1nlF0f3drsKi5KSGTG-JefJ2UJrrIQ4L8QWA,10479 +sqlalchemy/ext/mypy/plugin.py,sha256=9YHBp0Bwo92DbDZIUWwIr0hwXPcE4XvHs0-xshvSwUw,9750 +sqlalchemy/ext/mypy/util.py,sha256=CuW2fJ-g9YtkjcypzmrPRaFc-rAvQTzW5A2-w5VTANg,9960 +sqlalchemy/ext/orderinglist.py,sha256=MROa19cm4RZkWXuUuqc1029r7g4HrAJRc17fTHeThvI,14431 +sqlalchemy/ext/serializer.py,sha256=_z95wZMTn3G3sCGN52gwzD4CuKjrhGMr5Eu8g9MxQNg,6169 +sqlalchemy/future/__init__.py,sha256=R1h8VBwMiIUdP3QHv_tFNby557425FJOAGhUoXGvCmc,512 +sqlalchemy/future/engine.py,sha256=2nJFBQAXAE8pqe1cs-D3JjC6wUX2ya2h2e_tniuaBq0,495 +sqlalchemy/inspection.py,sha256=qKEKG37N1OjxpQeVzob1q9VwWjBbjI1x0movJG7fYJ4,5063 +sqlalchemy/log.py,sha256=e_ztNUfZM08FmTWeXN9-doD5YKW44nXxgKCUxxNs6Ow,8607 +sqlalchemy/orm/__init__.py,sha256=BICvTXpLaTNe2AiUaxnZHWzjL5miT9fd_IU-ip3OFNk,8463 +sqlalchemy/orm/_orm_constructors.py,sha256=NiAagQ1060QYS9n5y_gzPvHQQz44EN1dVtamGVtde6E,103626 +sqlalchemy/orm/_typing.py,sha256=vaYRl4_K3n-sjc9u0Rb4eWWpBOoOi92--OHqaGogRvA,4973 +sqlalchemy/orm/attributes.py,sha256=e_U0A4TGWAzL3yXVvk9YVhIRjKM4RTsIE2PNRLn8LbU,92534 +sqlalchemy/orm/base.py,sha256=oCgscNoRrqHwYvc1Iz8ZFhoVXhalu45g9z0m_7_ldaE,27502 +sqlalchemy/orm/bulk_persistence.py,sha256=Ciea9MhJ6ZbAi-uGy5-Kj6lodO9bfRqPq8GSf2qFshE,72663 +sqlalchemy/orm/clsregistry.py,sha256=syn6bB-Ylx-juh5GDCmNrPZ58C-z6sdwRkbZFeKysQU,17974 +sqlalchemy/orm/collections.py,sha256=XxZC8d9UX9E2R-WlNH198OPWRPmpLuYt0Y26LrdbuHc,52252 +sqlalchemy/orm/context.py,sha256=eyh7xTo3SyxIHl8_NBUqJ_GpJ0kZtmnTt32Z67cfqgs,112973 +sqlalchemy/orm/decl_api.py,sha256=SJ25fQjjKyWZDQbq5S69eiybpOzns0LkRziP10iW5-E,64969 +sqlalchemy/orm/decl_base.py,sha256=ZlZmyNVOsCPA_pThMeXuWmAhlJwlvTxdGXhnARsKxhk,83288 +sqlalchemy/orm/dependency.py,sha256=4NMhoogevOiX1Wm5B1_yY2u9MHYlIjJNNoEVRE0yLwA,47631 +sqlalchemy/orm/descriptor_props.py,sha256=LgfdiO_U5uznq5ImenfbWGV5T47bH4b_ztbzB4B7FsU,37231 +sqlalchemy/orm/dynamic.py,sha256=Z4GpcVL8rM8gi0bytQOZXw-_kKi-sExbRWGjU30dK3g,9816 +sqlalchemy/orm/evaluator.py,sha256=PKrUW1zEOvmv1XEgc_hBdYqNcyk4zjWr_rJhCEQBFIc,12353 +sqlalchemy/orm/events.py,sha256=OZtTCpI-DVaE6CY16e42GUVpci1U1GjdNO76xU-Tj5Y,127781 +sqlalchemy/orm/exc.py,sha256=zJgAIofYsWKjktqO5MFxze95GlJASziEOJJx-P5_wOU,7413 +sqlalchemy/orm/identity.py,sha256=5NFtF9ZPZWAOmtOqCPyVX2-_pQq9A5XeN2ns3Wirpv8,9249 +sqlalchemy/orm/instrumentation.py,sha256=WhElvvOWOn3Fuc-Asc5HmcKDX6EzFtBleLJKPZEc5A0,24321 +sqlalchemy/orm/interfaces.py,sha256=W6ADDLOixmm4tnSnUP_I9HFLj9MCO2bODk_WTNjkZGA,48797 +sqlalchemy/orm/loading.py,sha256=6Rd1hWtBPm7SfCUpjPQrcoUg_DSCcfhO8Qhz7SScjRE,58277 +sqlalchemy/orm/mapped_collection.py,sha256=FAqaTlOUCYqdws2KR_fW0T8mMWIrLuAxJGU5f4W1aGs,19682 +sqlalchemy/orm/mapper.py,sha256=-gkJKHeAJmIFT153WFIIySduyyLGbT5plCgSfnsa0I0,171668 +sqlalchemy/orm/path_registry.py,sha256=-aAEhGkDf_2ZUXmHQICQNOa4Z5xhTlhlYLag7eoVpxE,25920 +sqlalchemy/orm/persistence.py,sha256=Uz45Cwxi7FnNiSk2crbh3TzV7b9kb85vmcvOwy5NVmw,61701 +sqlalchemy/orm/properties.py,sha256=vbx_YiSjj3tI94-G-_ghbyWYcIIJQQeGG1P-0RC8Jv4,29065 +sqlalchemy/orm/query.py,sha256=GI_go9ErXYK1BteCmIh5E9iv-jfMJkRBVIlw0XmnYyk,118540 +sqlalchemy/orm/relationships.py,sha256=C40n_-oliMgJJ0FHfwsi1-dm963CrYeKJ5HEYjLdg_o,128899 +sqlalchemy/orm/scoping.py,sha256=-SNRAewfMJ4x4Um8X-yv0k1Thz8E1_kCBmbmG1l1auo,78617 +sqlalchemy/orm/session.py,sha256=1fzksIcb9DtKcwqkS1KkZngkrEYGUHmoNW_o6l8IXQ4,196114 +sqlalchemy/orm/state.py,sha256=1vtlz674sGFmwZ8Ih9TdrslA-0nhU2G52WgV-FoG2j0,37670 +sqlalchemy/orm/state_changes.py,sha256=XJLYYhTZu7nA6uD7xupbLZ9XSzqLYwrDJgW0ZAWvVGE,6815 +sqlalchemy/orm/strategies.py,sha256=qziXv4z2bJeF2qFSj6wogc9BLlxuOnT8nOcEvocVf88,119866 +sqlalchemy/orm/strategy_options.py,sha256=wMYd4E_nRb5ei8Fr3jWeSewNY2k1-AfqtYRGOLiHOFA,85043 +sqlalchemy/orm/sync.py,sha256=RdoxnhvgNjn3Lhtoq4QjvXpj8qfOz__wyibh0FMON0A,5779 +sqlalchemy/orm/unitofwork.py,sha256=hkSIcVonoSt0WWHk019bCDEw0g2o2fg4m4yqoTGyAoo,27033 +sqlalchemy/orm/util.py,sha256=rtClCjtg0eSSC8k-L30W0v6BauJaJuh9Nf-MSqofWuQ,80831 +sqlalchemy/orm/writeonly.py,sha256=R-MVxYDw0ZQ795H21yBtgGSZXWUzSovcb_SO1mv5hoI,22305 +sqlalchemy/pool/__init__.py,sha256=niqzCv2uOZT07DOiV2inlmjrW3lZyqDXGCjnOl1IqJ4,1804 +sqlalchemy/pool/base.py,sha256=mT-PHTlVUGcYRVsMB9LQwNgndjhOTOorWX5-hNRi2FM,52236 +sqlalchemy/pool/events.py,sha256=wdFfvat0fSrVF84Zzsz5E3HnVY0bhL7MPsGME-b2qa8,13149 +sqlalchemy/pool/impl.py,sha256=MLSh83SGNNtZZgZvA-5tvTIT8Dz7U95Bgt8HO_oR1Ps,18944 +sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +sqlalchemy/schema.py,sha256=yt4dcuMAKMleUHVidsAVAsm-JPpASFZXP2xM3pmzYHY,3194 +sqlalchemy/sql/__init__.py,sha256=Y-bZ25Zf-bxqsF2zUkpRGTjFuozNNVQHxUJV3Qmaq2M,5820 +sqlalchemy/sql/_dml_constructors.py,sha256=JF_XucNTfAk6Vz9fYiPWOgpIGtUkDj6VPILysLcrVhk,3795 +sqlalchemy/sql/_elements_constructors.py,sha256=eoQhkoRH0qox171ZSODyxxhj_HZEhO64rSowaN-I-v4,62630 +sqlalchemy/sql/_orm_types.py,sha256=0zeMit-V4rYZe-bB9X3xugnjFnPXH0gmeqkJou9Fows,625 +sqlalchemy/sql/_py_util.py,sha256=4KFXNvBq3hhfrr-A1J1uBml3b3CGguIf1dat9gsEHqE,2173 +sqlalchemy/sql/_selectable_constructors.py,sha256=fwVBsDHHWhngodBG205nvhM-Tb3uR1srbCnN3mPgrjA,18785 +sqlalchemy/sql/_typing.py,sha256=zYKlxXnUW_KIkGuBmBnzj-vFG1QON8_F9JN1dl9KSiM,12771 +sqlalchemy/sql/annotation.py,sha256=qHUEwbdmMD3Ybr0ez-Dyiw9l9UB_RUMHWAUIeO_r3gE,18245 +sqlalchemy/sql/base.py,sha256=kfmVNRimU5z6X6OKqMLMs1bDCFQ47BeyF_MZc23nkjY,73848 +sqlalchemy/sql/cache_key.py,sha256=ET2OIQ6jZK2FSxsdnCvhLCrNJ2Fp3zipQ-gvINgAjhQ,33668 +sqlalchemy/sql/coercions.py,sha256=lRciS5agnpVvx_vHYxJV-aN6QOVb_O4yCnMZ0s07GUE,40750 +sqlalchemy/sql/compiler.py,sha256=eT_zrKvApimVfycvcTdubQK8-QAzGHm5xWKdhOgnWUY,274965 +sqlalchemy/sql/crud.py,sha256=vFegNw5557ayS4kv761zh0bx0yikEKh1ovMrhErHelg,56514 +sqlalchemy/sql/ddl.py,sha256=rfb7gDvLmn_ktgH2xiXLRTczqnMOED1eakXuGuRPklg,45641 +sqlalchemy/sql/default_comparator.py,sha256=uXLr8B-X6KbybwTjLjZ2hN-WZAvqoMhZ-DDHJX7rAUw,16707 +sqlalchemy/sql/dml.py,sha256=oTW8PB-55qf6crAkbxh2JD-TvkT3MO1zqkKDrt5-2c8,65611 +sqlalchemy/sql/elements.py,sha256=RYq5N-IEPnhcDKtokeaCDIGZiUex8oDgwRLCDqjkk_g,176482 +sqlalchemy/sql/events.py,sha256=iWjc_nm1vClDBLg4ZhDnY75CkBdnlDPSPe0MGBSmbiM,18312 +sqlalchemy/sql/expression.py,sha256=rw5tAm8vbd5Vm4MofTZ0ZcXsphz4z9xO_exy-gem6TM,7586 +sqlalchemy/sql/functions.py,sha256=tbBxIeAqLV3kc1YDxyt68mxw0fFy6e93ctRUZSuuf3I,63858 +sqlalchemy/sql/lambdas.py,sha256=h9sPCETBgAanLtVHQsRPHeY-hTEjM5nscq3m4bDstwM,49196 +sqlalchemy/sql/naming.py,sha256=BU0ZdSzXXKHTPhoaKMWJ3gPMoeZSJJe9-3YDYflmjJw,6858 +sqlalchemy/sql/operators.py,sha256=h5bgu31gukGdsYsN_0-1C7IGAdSCFpBxuRjOUnu1Two,76792 +sqlalchemy/sql/roles.py,sha256=drAeWbevjgFAKNcMrH_EuJ-9sSvcq4aeXwAqMXXZGYw,7662 +sqlalchemy/sql/schema.py,sha256=WKKwxkC9oNRHN-B4s35NkWcr5dvavccKf-_1t35Do8A,229896 +sqlalchemy/sql/selectable.py,sha256=5Za7eh4USrgVwJgQGVX1bb2w1qXcy-hGzGpWNPbhf68,237610 +sqlalchemy/sql/sqltypes.py,sha256=yXHvZXfZJmaRvMoX4_jXqazAev33pk0Ltwl5c-D5Ha4,128609 +sqlalchemy/sql/traversals.py,sha256=7GALHt5mFceUv2SMUikIdAb9SUcSbACqhwoei5rPkxc,33664 +sqlalchemy/sql/type_api.py,sha256=wdi3nmOBRdhG6L1z21V_PwQGB8CIRouMdNKoIzJA4Zo,84440 +sqlalchemy/sql/util.py,sha256=G-2ZI6rZ7XxVu5YXaVvLrApeAk5VwSG4C--lqtglgGE,48086 +sqlalchemy/sql/visitors.py,sha256=URpw-GxxUkwjEDbD2xXJGyFJavG5lN6ISoY34JlYRS8,36319 +sqlalchemy/testing/__init__.py,sha256=GgUEqxUNCxg-92_GgBDnljUHsdCxaGPMG1TWy5tjwgk,3160 +sqlalchemy/testing/assertions.py,sha256=RFTkxGq-kDvn3JSUuT_6bU1y0vtoI6pE6ryZgV2YEx4,31439 +sqlalchemy/testing/assertsql.py,sha256=cmhtZrgPBjrqIfzFz3VBWxVNvxWoRllvmoWcUCoqsio,16817 +sqlalchemy/testing/asyncio.py,sha256=QsMzDWARFRrpLoWhuYqzYQPTUZ80fymlKrqOoDkmCmQ,3830 +sqlalchemy/testing/config.py,sha256=HySdB5_FgCW1iHAJVxYo-4wq5gUAEi0N8E93IC6M86Q,12058 +sqlalchemy/testing/engines.py,sha256=c1gFXfpo5S1dvNjGIL03mbW2eVYtUD_9M_ZEfQO2ArM,13414 +sqlalchemy/testing/entities.py,sha256=KdgTVPSALhi9KkAXj2giOYl62ld-1yZziIDBSV8E3vw,3354 +sqlalchemy/testing/exclusions.py,sha256=jzVrBXqyQlyMgvfChMjJOd0ZtReKgkJ4Ik-0mkWe6KM,12460 +sqlalchemy/testing/fixtures/__init__.py,sha256=e5YtfSlkKDRuyIZhEKBCycMX5BOO4MZ-0d97l1JDhJE,1198 +sqlalchemy/testing/fixtures/base.py,sha256=y5iEEdUZIft06fvAOXwKU73ciIFTO5AVgDDGzYD9nOY,12256 +sqlalchemy/testing/fixtures/mypy.py,sha256=9fuJ90F9LBki26dVEVOEtRVXG2koaK803k4nukTnA8o,11973 +sqlalchemy/testing/fixtures/orm.py,sha256=3JJoYdI2tj5-LL7AN8bVa79NV3Guo4d9p6IgheHkWGc,6095 +sqlalchemy/testing/fixtures/sql.py,sha256=ht-OD6fMZ0inxucRzRZG4kEMNicqY8oJdlKbZzHhAJc,15900 +sqlalchemy/testing/pickleable.py,sha256=G3L0xL9OtbX7wThfreRjWd0GW7q0kUKcTUuCN5ETGno,2833 +sqlalchemy/testing/plugin/__init__.py,sha256=vRfF7M763cGm9tLQDWK6TyBNHc80J1nX2fmGGxN14wY,247 +sqlalchemy/testing/plugin/bootstrap.py,sha256=VYnVSMb-u30hGY6xGn6iG-LqiF0CubT90AJPFY_6UiY,1685 +sqlalchemy/testing/plugin/plugin_base.py,sha256=TBWdg2XgXB6QgUUFdKLv1O9-SXMitjHLm2rNNIzXZhQ,21578 +sqlalchemy/testing/plugin/pytestplugin.py,sha256=0rRCp7RlnhJBg3gJEq0t0kJ-BCTQ34bqBE_lEQk5U3U,27656 +sqlalchemy/testing/profiling.py,sha256=SWhWiZImJvDsNn0rQyNki70xdNxZL53ZI98ihxiykbQ,10148 +sqlalchemy/testing/provision.py,sha256=6r2FTnm-t7u8MMbWo7eMhAH3qkL0w0WlmE29MUSEIu4,14702 +sqlalchemy/testing/requirements.py,sha256=MVuTKtZjeTZaYlrAU8XFIB1bhJA_AedqL_q7NwVEGiw,52956 +sqlalchemy/testing/schema.py,sha256=IImFumAdpzOyoKAs0WnaGakq8D3sSU4snD9W4LVOV3s,6513 +sqlalchemy/testing/suite/__init__.py,sha256=S8TLwTiif8xX67qlZUo5I9fl9UjZAFGSzvlptp2WoWc,722 +sqlalchemy/testing/suite/test_cte.py,sha256=d3OWDBNhnAwlyAz_QhFk-vKSWaAI3mADVnqdtTWOuwI,6451 +sqlalchemy/testing/suite/test_ddl.py,sha256=MItp-votCzvahlRqHRagte2Omyq9XUOFdFsgzCb6_-g,12031 +sqlalchemy/testing/suite/test_deprecations.py,sha256=7C6IbxRmq7wg_DLq56f1V5RCS9iVrAv3epJZQTB-dOo,5337 +sqlalchemy/testing/suite/test_dialect.py,sha256=eGJFZCwKmLrIl66ZlkLLZf5Fq6bzWI174gQsJt2bY2c,22923 +sqlalchemy/testing/suite/test_insert.py,sha256=pR0VWMQ9JJPbnANE6634PzR0VFmWMF8im6OTahc4vsQ,18824 +sqlalchemy/testing/suite/test_reflection.py,sha256=EJvTjRDimw9k90zlI5VCkmCzf7Tv5VF9y4O3D8SZMFU,109648 +sqlalchemy/testing/suite/test_results.py,sha256=9FFBNLeXcNRIC9FHfEjFKwfV6w2Bb58ulml_M8Zdokg,16914 +sqlalchemy/testing/suite/test_rowcount.py,sha256=UVyHHQsU0TxkzV_dqCOKR1aROvIq7frKYMVjwUqLWfE,7900 +sqlalchemy/testing/suite/test_select.py,sha256=S81w-Dox6W29Tjmi6LIBJ4HuB5E8dDAzmePDm0PKTYo,61732 +sqlalchemy/testing/suite/test_sequence.py,sha256=DMqyJkL1o4GClrNjzoy7GDn_jPNPTZNvk9t5e-MVXeo,9923 +sqlalchemy/testing/suite/test_types.py,sha256=gPA6t-90Icnpj2ZzITwbqka1DB-rNOoh6_xS9dC-4HU,67805 +sqlalchemy/testing/suite/test_unicode_ddl.py,sha256=0zVc2e3zbCQag_xL4b0i7F062HblHwV46JHLMweYtcE,6141 +sqlalchemy/testing/suite/test_update_delete.py,sha256=_OxH0wggHUqPImalGEPI48RiRx6mO985Om1PtRYOCzA,3994 +sqlalchemy/testing/util.py,sha256=KsUInolFBXUPIXVZKAdb_8rQrW8yW8OCtiA3GXuYRvA,14571 +sqlalchemy/testing/warnings.py,sha256=sj4vfTtjodcfoX6FPH_Zykb4fomjmgqIYj81QPpSwH8,1546 +sqlalchemy/types.py,sha256=m3I9h6xoyT7cjeUx5XCzmaE-GHT2sJVwECiuSJl75Ss,3168 +sqlalchemy/util/__init__.py,sha256=tYWkZV6PYVfEW32zt48FCLH12VyV_kaNUa3KBAOYpSM,8312 +sqlalchemy/util/_collections.py,sha256=RbP4UixqNtRBUrl_QqYDiadVmELSVxxXm2drhvQaIKo,20078 +sqlalchemy/util/_concurrency_py3k.py,sha256=UtPDkb67OOVWYvBqYaQgENg0k_jOA2mQOE04XmrbYq0,9170 +sqlalchemy/util/_has_cy.py,sha256=3oh7s5iQtW9qcI8zYunCfGAKG6fzo2DIpzP5p1BnE8Q,1247 +sqlalchemy/util/_py_collections.py,sha256=irOg3nkzxmtdYfIS46un2cp0JqSiACI7WGQBg-BaEXU,16714 +sqlalchemy/util/compat.py,sha256=TdDfvL21VnBEdSUnjcx-F8XhmVFg9Mvyr67a4omWZAM,8760 +sqlalchemy/util/concurrency.py,sha256=eQVS3YDH3GwB3Uw5pbzmqEBSYTK90EbnE5mQ05fHERg,3304 +sqlalchemy/util/deprecations.py,sha256=L7D4GqeIozpjO8iVybf7jL9dDlgfTbAaQH4TQAX74qE,12012 +sqlalchemy/util/langhelpers.py,sha256=G67avnsStFbslILlbCHmsyAMnShS7RYftFr9a8uFDL8,65140 +sqlalchemy/util/preloaded.py,sha256=RMarsuhtMW8ZuvqLSuR0kwbp45VRlzKpJMLUe7p__qY,5904 +sqlalchemy/util/queue.py,sha256=w1ufhuiC7lzyiZDhciRtRz1uyxU72jRI7SWhhL-p600,10185 +sqlalchemy/util/tool_support.py,sha256=e7lWu6o1QlKq4e6c9PyDsuyFyiWe79vO72UQ_YX2pUA,6135 +sqlalchemy/util/topological.py,sha256=HcJgdCeU0XFIskgIBnTaHXfRXaulaEJRYRwKv4yPNek,3458 +sqlalchemy/util/typing.py,sha256=C4jF7QTNo0w0bjvcIqSSTOvoy8FttuZtyTzjiyoIzQQ,20920 diff --git a/libs/SQLAlchemy-2.0.36.dist-info/REQUESTED b/libs/SQLAlchemy-2.0.37.dist-info/REQUESTED similarity index 100% rename from libs/SQLAlchemy-2.0.36.dist-info/REQUESTED rename to libs/SQLAlchemy-2.0.37.dist-info/REQUESTED diff --git a/libs/SQLAlchemy-2.0.36.dist-info/WHEEL b/libs/SQLAlchemy-2.0.37.dist-info/WHEEL similarity index 71% rename from libs/SQLAlchemy-2.0.36.dist-info/WHEEL rename to libs/SQLAlchemy-2.0.37.dist-info/WHEEL index be75fa70d..42e750dfb 100644 --- a/libs/SQLAlchemy-2.0.36.dist-info/WHEEL +++ b/libs/SQLAlchemy-2.0.37.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: false Tag: cp38-cp38-macosx_12_0_x86_64 diff --git a/libs/SQLAlchemy-2.0.36.dist-info/top_level.txt b/libs/SQLAlchemy-2.0.37.dist-info/top_level.txt similarity index 100% rename from libs/SQLAlchemy-2.0.36.dist-info/top_level.txt rename to libs/SQLAlchemy-2.0.37.dist-info/top_level.txt diff --git a/libs/aniso8601-9.0.1.dist-info/INSTALLER b/libs/aniso8601-10.0.0.dist-info/INSTALLER similarity index 100% rename from libs/aniso8601-9.0.1.dist-info/INSTALLER rename to libs/aniso8601-10.0.0.dist-info/INSTALLER diff --git a/libs/aniso8601-9.0.1.dist-info/LICENSE b/libs/aniso8601-10.0.0.dist-info/LICENSE similarity index 97% rename from libs/aniso8601-9.0.1.dist-info/LICENSE rename to libs/aniso8601-10.0.0.dist-info/LICENSE index 40b077445..a065b6e50 100644 --- a/libs/aniso8601-9.0.1.dist-info/LICENSE +++ b/libs/aniso8601-10.0.0.dist-info/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2021, Brandon Nielsen +Copyright (c) 2025, Brandon Nielsen All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/libs/aniso8601-9.0.1.dist-info/METADATA b/libs/aniso8601-10.0.0.dist-info/METADATA similarity index 98% rename from libs/aniso8601-9.0.1.dist-info/METADATA rename to libs/aniso8601-10.0.0.dist-info/METADATA index a926a412b..01ae66972 100644 --- a/libs/aniso8601-9.0.1.dist-info/METADATA +++ b/libs/aniso8601-10.0.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: aniso8601 -Version: 9.0.1 +Version: 10.0.0 Summary: A library for parsing ISO 8601 strings. Home-page: https://bitbucket.org/nielsenb/aniso8601 Author: Brandon Nielsen @@ -17,12 +17,11 @@ 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.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -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 :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Topic :: Software Development :: Libraries :: Python Modules Description-Content-Type: text/x-rst License-File: LICENSE diff --git a/libs/aniso8601-10.0.0.dist-info/RECORD b/libs/aniso8601-10.0.0.dist-info/RECORD new file mode 100644 index 000000000..0133ce0c2 --- /dev/null +++ b/libs/aniso8601-10.0.0.dist-info/RECORD @@ -0,0 +1,34 @@ +aniso8601-10.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aniso8601-10.0.0.dist-info/LICENSE,sha256=w8yguadP0pZovZm13PAnTVO-kE3md4kW3IUnCPQHsPA,1501 +aniso8601-10.0.0.dist-info/METADATA,sha256=X3OCmIqObDsY5xQ0FnwtcbDWZ6ryJ70ADDbImMVzdck,23371 +aniso8601-10.0.0.dist-info/RECORD,, +aniso8601-10.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +aniso8601-10.0.0.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 +aniso8601-10.0.0.dist-info/top_level.txt,sha256=MVQomyeED8nGIH7PUQdMzxgLppIB48oYHtcmL17ETB0,10 +aniso8601/__init__.py,sha256=LwoL2Wj0kdYdHS3YqvGPH6SJ1HQWpsN9jKsAMHlAdwE,705 +aniso8601/builders/__init__.py,sha256=jXJ75D-QRhB8huW2GyShjh_I4Z83ua4Qgzn1DQiX-1M,17975 +aniso8601/builders/python.py,sha256=U0Tvqt4vPVcH9epfkbz_o4550yr_4_Q8SvoUdj9JAvs,22072 +aniso8601/builders/tests/__init__.py,sha256=qjC0jrTWf2UUlZtXE3AKcMFSLC2kQPOvAI36t5gc8q0,209 +aniso8601/builders/tests/test_init.py,sha256=pyES5pMJUWy16KK4MLsfzRmPRcQvj6_vxcM8yzeZxOc,29997 +aniso8601/builders/tests/test_python.py,sha256=dhkaGiE0ToMPBhUmhOAeM32aC2SDu6Rj6d4YniV2M7A,62032 +aniso8601/compat.py,sha256=CvNkC-tCr3hzv1i9VOzgiPaS2EUxCfxtfo8SkJ2Juyc,571 +aniso8601/date.py,sha256=D3Kffr6Ln_z0fNTP5KAQa0R0T00VdmZgIS_O-pVmxnI,4496 +aniso8601/decimalfraction.py,sha256=NBUies6Gp1NrVkSU_9MwJNu28OhUIeWXNpkTRcClGYA,333 +aniso8601/duration.py,sha256=XEMm8t3Vipw3YsCgXf17XA10dHmUCQuJo4-PX4z8U7I,9550 +aniso8601/exceptions.py,sha256=uCQIrrIpCJV-n3WDUuhB3wMdgmHuu1UqOXrE9ct3xPY,1313 +aniso8601/interval.py,sha256=ruz49D2BoyoyYggM2oLrz0HSB8CIPxdl4LZCvwq3kCg,10752 +aniso8601/resolution.py,sha256=RJGfir0k6IiR3L1ZCrPvjhsQliVT_ZOcaeKqJqH6JHM,684 +aniso8601/tests/__init__.py,sha256=qjC0jrTWf2UUlZtXE3AKcMFSLC2kQPOvAI36t5gc8q0,209 +aniso8601/tests/compat.py,sha256=J4Ocl6zpo7WmA_pItOc2KUH8xZU156L9fTbCBBFX9xY,346 +aniso8601/tests/test_compat.py,sha256=55qZ_Uu7XRQo8hXNDUjy-IB3WaTqATnVtMlAJP4TGr4,763 +aniso8601/tests/test_date.py,sha256=bJy2ve-iFmWlBCWDidfK2lB-7OBMjeATfK3SBFSet4U,9266 +aniso8601/tests/test_decimalfraction.py,sha256=bvPPSuWnS2XfD10wBUjg5nFFbI1kfBshR2Wkmfggu6I,578 +aniso8601/tests/test_duration.py,sha256=QRLpd_bdgEzHjcLkLMFMWnGF4bN_YxPDdtwACtBekc4,44952 +aniso8601/tests/test_init.py,sha256=1GF0Yms8adNM3Ax13w2ncSz6toHhK3pRkPYoNaRcPVk,1689 +aniso8601/tests/test_interval.py,sha256=GjeU8HrIT-klpselgsgMcF1KfuV7sDKLlyVU5S4XMCQ,60457 +aniso8601/tests/test_time.py,sha256=SS0jXkEl5bYFSe1qFPpjZ0GNXycgBMH16Uc885ujR7I,19147 +aniso8601/tests/test_timezone.py,sha256=EJk2cTsHddhe2Pqtzl250gKF8XoXynEAngNctk23b48,4649 +aniso8601/tests/test_utcoffset.py,sha256=wQ7ivBqax2KP340tlC0DBxM7DTK9SNy_Zq_13FqeaKM,1926 +aniso8601/time.py,sha256=CZRisJz6u7fBfMthZvNcUuVFSL_GCYi9WEjXsbrnDF8,5687 +aniso8601/timezone.py,sha256=xpukG_AuvyMNGs57y4bf40eHRcpe3b1fKC8x-H8Epo8,2124 +aniso8601/utcoffset.py,sha256=dm7-eFl6WQFPpDamcTVl46aEjmGObpWJdSZJ-QzblfU,2421 diff --git a/libs/aniso8601-9.0.1.dist-info/REQUESTED b/libs/aniso8601-10.0.0.dist-info/REQUESTED similarity index 100% rename from libs/aniso8601-9.0.1.dist-info/REQUESTED rename to libs/aniso8601-10.0.0.dist-info/REQUESTED diff --git a/libs/aniso8601-9.0.1.dist-info/WHEEL b/libs/aniso8601-10.0.0.dist-info/WHEEL similarity index 100% rename from libs/aniso8601-9.0.1.dist-info/WHEEL rename to libs/aniso8601-10.0.0.dist-info/WHEEL diff --git a/libs/aniso8601-9.0.1.dist-info/top_level.txt b/libs/aniso8601-10.0.0.dist-info/top_level.txt similarity index 100% rename from libs/aniso8601-9.0.1.dist-info/top_level.txt rename to libs/aniso8601-10.0.0.dist-info/top_level.txt diff --git a/libs/aniso8601-9.0.1.dist-info/RECORD b/libs/aniso8601-9.0.1.dist-info/RECORD deleted file mode 100644 index 7a3fac144..000000000 --- a/libs/aniso8601-9.0.1.dist-info/RECORD +++ /dev/null @@ -1,34 +0,0 @@ -aniso8601-9.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aniso8601-9.0.1.dist-info/LICENSE,sha256=Z_-MGC_A4Nc1cViNi8B5tOSmJKknTE4mqSPeIxDTvSk,1501 -aniso8601-9.0.1.dist-info/METADATA,sha256=2Esk-53vD4ruSRkC_RMTnKscxUh9nWSEj9MeS6lTlDU,23416 -aniso8601-9.0.1.dist-info/RECORD,, -aniso8601-9.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aniso8601-9.0.1.dist-info/WHEEL,sha256=P2T-6epvtXQ2cBOE_U1K4_noqlJFN3tj15djMgEu4NM,110 -aniso8601-9.0.1.dist-info/top_level.txt,sha256=MVQomyeED8nGIH7PUQdMzxgLppIB48oYHtcmL17ETB0,10 -aniso8601/__init__.py,sha256=tHN7Nq-3I79PLzKkBuWun_UKgolnDrn7ISO8s1HlMdo,704 -aniso8601/builders/__init__.py,sha256=sJanTP5Lo0lRxpLa5VKVBS9u6ZP8R1VRgozx5uSUMUU,17958 -aniso8601/builders/python.py,sha256=I0RhPY2syncaMwYRVJxM6ct-O_5MHnNFY3dcF6wvy0Y,22122 -aniso8601/builders/tests/__init__.py,sha256=XWM00Wzg9EZkSKyy3IW18Z8TiXfCbJS-XJNFVuylvuU,209 -aniso8601/builders/tests/test_init.py,sha256=wnDhjyb5iBt9l_zTXT96uqXus-igSqn5Kn_rqX_NSHA,29997 -aniso8601/builders/tests/test_python.py,sha256=pNr3lwfBKVSUQKc5BPmwCiCTpP_063WpOM-canDz4J8,61593 -aniso8601/compat.py,sha256=2exJsHW2DAxt_D2_mGj5mv0HCSMFeAAkPyFAM-ZFrA0,571 -aniso8601/date.py,sha256=IDn_kqeZshllwr4pICUNZhjbqSVVlYTyHmBOgp2MlNE,4475 -aniso8601/decimalfraction.py,sha256=EtwqSZJTtsQlu05m2guolhii5N1yN4dVv0v1zCZhiyk,333 -aniso8601/duration.py,sha256=6AAl9A-WM2Io898peIz9xbwOvxcLc6WYGUdkYuQlTU8,9583 -aniso8601/exceptions.py,sha256=-zrdcKocZhzhl71HhgVKXWF481XDWO3UhinbcycCzPU,1313 -aniso8601/interval.py,sha256=7e5wICHdF2gTeFluPxBrzaA4-_5b78QzXC62DSnNzlM,10763 -aniso8601/resolution.py,sha256=ee7GxL865D0dJL70TsXScz4Kzo_dwMORNvfuyCXdsgI,684 -aniso8601/tests/__init__.py,sha256=XWM00Wzg9EZkSKyy3IW18Z8TiXfCbJS-XJNFVuylvuU,209 -aniso8601/tests/compat.py,sha256=9HJqKvl0PIFBjePUgT-1eMGkA9tlESX0wNDkPvV7GOk,346 -aniso8601/tests/test_compat.py,sha256=2oFOFLKTfOJIMbLjkeVhrkxSDMjE0wM-NB86SJ6st5g,763 -aniso8601/tests/test_date.py,sha256=3AWmIHTS2sxm9_ZUYcI2w9ALJOYnHkkYEwlD1VW90iQ,8960 -aniso8601/tests/test_decimalfraction.py,sha256=T4R_SY24DW30YuQkyofxvAmngTuXtsmwd77pF25QAlc,578 -aniso8601/tests/test_duration.py,sha256=ZqUxodLrDBZ1GZWutFXjktAFHYS1hidxLclIGZP7aSA,44952 -aniso8601/tests/test_init.py,sha256=GazCeGTv-OFocCx9Cck04b-c1cWiiRnqhGwoGgm4Y1Q,1689 -aniso8601/tests/test_interval.py,sha256=lTg-E1vW1xmgwiWfHHwJDJ25AogSR-1p-0L4O2gQKQw,60457 -aniso8601/tests/test_time.py,sha256=HLutGVdg2_HHU51U2eEEZ9UNwljrQBPU_PtX8JrdVV0,19147 -aniso8601/tests/test_timezone.py,sha256=Shw7-fcUJZAbH7diCx37iXZ4VZEH45lqIgMJvoQQhtQ,4649 -aniso8601/tests/test_utcoffset.py,sha256=fRNuiz3WPMrHtrdMGK3HOuZRYd68hR-VNldbwVG-cDA,1926 -aniso8601/time.py,sha256=9IRsCERfEl_SnBBUIOR8E43XFD7Y2EqhowjiCcfinb0,5688 -aniso8601/timezone.py,sha256=5_LRd_pYd08i2hmXsn_1tTUxKOI4caSvxci-VByHCWU,2134 -aniso8601/utcoffset.py,sha256=8Gh8WNk_q9ELLEFZLMPbMESH-yqcoNFjul7VcpHq_1Q,2423 diff --git a/libs/aniso8601/__init__.py b/libs/aniso8601/__init__.py index 033d30b9d..c85d218b3 100644 --- a/libs/aniso8601/__init__.py +++ b/libs/aniso8601/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -23,4 +23,4 @@ parse_time, ) -__version__ = "9.0.1" +__version__ = "10.0.0" diff --git a/libs/aniso8601/builders/__init__.py b/libs/aniso8601/builders/__init__.py index 834c72a6b..280a00e66 100644 --- a/libs/aniso8601/builders/__init__.py +++ b/libs/aniso8601/builders/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -137,7 +137,7 @@ class BaseTimeBuilder(object): 0, 24, HoursOutOfBoundsError, - "Hour must be between 0..24 with " "24 representing midnight.", + "Hour must be between 0..24 with 24 representing midnight.", range_check, ) TIME_MM_LIMIT = Limit( @@ -153,7 +153,7 @@ class BaseTimeBuilder(object): 0, 60, SecondsOutOfBoundsError, - "Second must be between 0..60 with " "60 representing a leap second.", + "Second must be between 0..60 with 60 representing a leap second.", range_check, ) TZ_HH_LIMIT = Limit( @@ -453,7 +453,7 @@ def range_check_timezone( @classmethod def _build_object(cls, parsetuple): # Given a TupleBuilder tuple, build the correct object - if type(parsetuple) is DateTuple: + if isinstance(parsetuple, DateTuple): return cls.build_date( YYYY=parsetuple.YYYY, MM=parsetuple.MM, @@ -463,15 +463,15 @@ def _build_object(cls, parsetuple): DDD=parsetuple.DDD, ) - if type(parsetuple) is TimeTuple: + if isinstance(parsetuple, TimeTuple): return cls.build_time( hh=parsetuple.hh, mm=parsetuple.mm, ss=parsetuple.ss, tz=parsetuple.tz ) - if type(parsetuple) is DatetimeTuple: + if isinstance(parsetuple, DatetimeTuple): return cls.build_datetime(parsetuple.date, parsetuple.time) - if type(parsetuple) is DurationTuple: + if isinstance(parsetuple, DurationTuple): return cls.build_duration( PnY=parsetuple.PnY, PnM=parsetuple.PnM, @@ -482,12 +482,12 @@ def _build_object(cls, parsetuple): TnS=parsetuple.TnS, ) - if type(parsetuple) is IntervalTuple: + if isinstance(parsetuple, IntervalTuple): return cls.build_interval( start=parsetuple.start, end=parsetuple.end, duration=parsetuple.duration ) - if type(parsetuple) is RepeatingIntervalTuple: + if isinstance(parsetuple, RepeatingIntervalTuple): return cls.build_repeating_interval( R=parsetuple.R, Rnn=parsetuple.Rnn, interval=parsetuple.interval ) @@ -502,10 +502,10 @@ def _build_object(cls, parsetuple): @classmethod def _is_interval_end_concise(cls, endtuple): - if type(endtuple) is TimeTuple: + if isinstance(endtuple, TimeTuple): return True - if type(endtuple) is DatetimeTuple: + if isinstance(endtuple, DatetimeTuple): enddatetuple = endtuple.date else: enddatetuple = endtuple @@ -523,16 +523,16 @@ def _combine_concise_interval_tuples(cls, starttuple, conciseendtuple): endtimetuple = None enddatetuple = None - if type(starttuple) is DateTuple: + if isinstance(starttuple, DateTuple): startdatetuple = starttuple else: # Start is a datetime starttimetuple = starttuple.time startdatetuple = starttuple.date - if type(conciseendtuple) is DateTuple: + if isinstance(conciseendtuple, DateTuple): enddatetuple = conciseendtuple - elif type(conciseendtuple) is DatetimeTuple: + elif isinstance(conciseendtuple, DatetimeTuple): enddatetuple = conciseendtuple.date endtimetuple = conciseendtuple.time else: @@ -559,6 +559,9 @@ def _combine_concise_interval_tuples(cls, starttuple, conciseendtuple): DDD=enddatetuple.DDD, ) + if endtimetuple is None: + return newenddatetuple + if (starttimetuple is not None and starttimetuple.tz is not None) and ( endtimetuple is not None and endtimetuple.tz != starttimetuple.tz ): @@ -570,9 +573,6 @@ def _combine_concise_interval_tuples(cls, starttuple, conciseendtuple): tz=starttimetuple.tz, ) - if enddatetuple is not None and endtimetuple is None: - return newenddatetuple - if enddatetuple is not None and endtimetuple is not None: return TupleBuilder.build_datetime(newenddatetuple, endtimetuple) diff --git a/libs/aniso8601/builders/python.py b/libs/aniso8601/builders/python.py index 8956740e7..b60382e1b 100644 --- a/libs/aniso8601/builders/python.py +++ b/libs/aniso8601/builders/python.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -12,10 +12,8 @@ from aniso8601.builders import ( BaseTimeBuilder, - DatetimeTuple, DateTuple, Limit, - TimeTuple, TupleBuilder, cast, range_check, @@ -23,9 +21,6 @@ from aniso8601.exceptions import ( DayOutOfBoundsError, HoursOutOfBoundsError, - ISOFormatError, - LeapSecondError, - MidnightBoundsError, MinutesOutOfBoundsError, MonthOutOfBoundsError, SecondsOutOfBoundsError, @@ -85,7 +80,7 @@ def fractional_range_check(conversion, valuestr, limit): value = cast(valuestr, castfunc, thrownmessage=limit.casterrorstring) - if type(value) is FractionalComponent: + if isinstance(value, FractionalComponent): tocheck = float(valuestr) else: tocheck = int(valuestr) @@ -128,7 +123,7 @@ class PythonTimeBuilder(BaseTimeBuilder): 0, 24, HoursOutOfBoundsError, - "Hour must be between 0..24 with " "24 representing midnight.", + "Hour must be between 0..24 with 24 representing midnight.", partial(fractional_range_check, MICROSECONDS_PER_HOUR), ) TIME_MM_LIMIT = Limit( @@ -144,7 +139,7 @@ class PythonTimeBuilder(BaseTimeBuilder): 0, 60, SecondsOutOfBoundsError, - "Second must be between 0..60 with " "60 representing a leap second.", + "Second must be between 0..60 with 60 representing a leap second.", partial(fractional_range_check, MICROSECONDS_PER_SECOND), ) DURATION_PNY_LIMIT = Limit( @@ -248,19 +243,19 @@ def build_time(cls, hh=None, mm=None, ss=None, tz=None): hh, mm, ss, tz = cls.range_check_time(hh, mm, ss, tz) - if type(hh) is FractionalComponent: + if isinstance(hh, FractionalComponent): hours = hh.principal microseconds = hh.microsecondremainder elif hh is not None: hours = hh - if type(mm) is FractionalComponent: + if isinstance(mm, FractionalComponent): minutes = mm.principal microseconds = mm.microsecondremainder elif mm is not None: minutes = mm - if type(ss) is FractionalComponent: + if isinstance(ss, FractionalComponent): seconds = ss.principal microseconds = ss.microsecondremainder elif ss is not None: @@ -349,7 +344,7 @@ def build_interval(cls, start=None, end=None, duration=None): endobject = cls._build_object(end) # Range check - if type(end) is DateTuple and datetimerequired is True: + if isinstance(end, DateTuple) and datetimerequired is True: # <end> is a date, and <duration> requires datetime resolution return ( endobject, @@ -362,7 +357,7 @@ def build_interval(cls, start=None, end=None, duration=None): startobject = cls._build_object(start) # Range check - if type(start) is DateTuple and datetimerequired is True: + if isinstance(start, DateTuple) and datetimerequired is True: # <start> is a date, and <duration> requires datetime resolution return ( startobject, @@ -448,7 +443,7 @@ def range_check_duration( ) if PnY is not None: - if type(PnY) is FractionalComponent: + if isinstance(PnY, FractionalComponent): years = PnY.principal microseconds = PnY.microsecondremainder else: @@ -458,7 +453,7 @@ def range_check_duration( raise YearOutOfBoundsError("Duration exceeds maximum timedelta size.") if PnM is not None: - if type(PnM) is FractionalComponent: + if isinstance(PnM, FractionalComponent): months = PnM.principal microseconds = PnM.microsecondremainder else: @@ -468,7 +463,7 @@ def range_check_duration( raise MonthOutOfBoundsError("Duration exceeds maximum timedelta size.") if PnW is not None: - if type(PnW) is FractionalComponent: + if isinstance(PnW, FractionalComponent): weeks = PnW.principal microseconds = PnW.microsecondremainder else: @@ -478,7 +473,7 @@ def range_check_duration( raise WeekOutOfBoundsError("Duration exceeds maximum timedelta size.") if PnD is not None: - if type(PnD) is FractionalComponent: + if isinstance(PnD, FractionalComponent): days = PnD.principal microseconds = PnD.microsecondremainder else: @@ -488,7 +483,7 @@ def range_check_duration( raise DayOutOfBoundsError("Duration exceeds maximum timedelta size.") if TnH is not None: - if type(TnH) is FractionalComponent: + if isinstance(TnH, FractionalComponent): hours = TnH.principal microseconds = TnH.microsecondremainder else: @@ -498,7 +493,7 @@ def range_check_duration( raise HoursOutOfBoundsError("Duration exceeds maximum timedelta size.") if TnM is not None: - if type(TnM) is FractionalComponent: + if isinstance(TnM, FractionalComponent): minutes = TnM.principal microseconds = TnM.microsecondremainder else: @@ -510,7 +505,7 @@ def range_check_duration( ) if TnS is not None: - if type(TnS) is FractionalComponent: + if isinstance(TnS, FractionalComponent): seconds = TnS.principal microseconds = TnS.microsecondremainder else: @@ -586,7 +581,7 @@ def range_check_interval(cls, start=None, end=None, duration=None): endobject = cls._build_object(end) # Range check - if type(end) is DateTuple: + if isinstance(end, DateTuple): enddatetime = cls.build_datetime(end, TupleBuilder.build_time()) if enddatetime - datetime.datetime.min < durationobject: diff --git a/libs/aniso8601/builders/tests/__init__.py b/libs/aniso8601/builders/tests/__init__.py index 1a94e017a..5cfededc9 100644 --- a/libs/aniso8601/builders/tests/__init__.py +++ b/libs/aniso8601/builders/tests/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/builders/tests/test_init.py b/libs/aniso8601/builders/tests/test_init.py index 7c9f092c7..0a6ed1aa5 100644 --- a/libs/aniso8601/builders/tests/test_init.py +++ b/libs/aniso8601/builders/tests/test_init.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/builders/tests/test_python.py b/libs/aniso8601/builders/tests/test_python.py index 11111a163..ccbed27d1 100644 --- a/libs/aniso8601/builders/tests/test_python.py +++ b/libs/aniso8601/builders/tests/test_python.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -52,7 +52,9 @@ def test_year_range_check(self): None, ) - self.assertEqual(year_range_check("1", yearlimit), 1000) + self.assertEqual(year_range_check("19", yearlimit), 1900) + self.assertEqual(year_range_check("1234", yearlimit), 1234) + self.assertEqual(year_range_check("1985", yearlimit), 1985) def test_fractional_range_check(self): limit = Limit( @@ -117,7 +119,7 @@ def test_build_date(self): ), ( { - "YYYY": "1900", + "YYYY": "19", "MM": None, "DD": None, "Www": None, @@ -126,6 +128,17 @@ def test_build_date(self): }, datetime.date(1900, 1, 1), ), + ( + { + "YYYY": "10", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + datetime.date(1000, 1, 1), + ), ( { "YYYY": "1981", diff --git a/libs/aniso8601/compat.py b/libs/aniso8601/compat.py index 25af5794a..00cd3f9bb 100644 --- a/libs/aniso8601/compat.py +++ b/libs/aniso8601/compat.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/date.py b/libs/aniso8601/date.py index ea0cf9c59..42128483c 100644 --- a/libs/aniso8601/date.py +++ b/libs/aniso8601/date.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -60,7 +60,8 @@ def parse_date(isodatestr, builder=PythonTimeBuilder): # Given a string in any ISO 8601 date format, return a datetime.date # object that corresponds to the given date. Valid string formats are: # - # Y[YYY] + # YY + # YYYY # YYYY-MM-DD # YYYYMMDD # YYYY-MM @@ -75,11 +76,12 @@ def parse_date(isodatestr, builder=PythonTimeBuilder): if isodatestr.startswith("+") or isodatestr.startswith("-"): raise NotImplementedError( - "ISO 8601 extended year representation " "not supported." + "ISO 8601 extended year representation not supported." ) if len(isodatestr) == 0 or isodatestr.count("-") > 2: raise ISOFormatError('"{0}" is not a valid ISO 8601 date.'.format(isodatestr)) + yearstr = None monthstr = None daystr = None @@ -87,8 +89,9 @@ def parse_date(isodatestr, builder=PythonTimeBuilder): weekdaystr = None ordinaldaystr = None - if len(isodatestr) <= 4: - # Y[YYY] + if len(isodatestr) in (2, 4): + # YY + # YYYY yearstr = isodatestr elif "W" in isodatestr: if len(isodatestr) == 10: diff --git a/libs/aniso8601/decimalfraction.py b/libs/aniso8601/decimalfraction.py index 3086ee794..204d8a3fa 100644 --- a/libs/aniso8601/decimalfraction.py +++ b/libs/aniso8601/decimalfraction.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/duration.py b/libs/aniso8601/duration.py index cdc0f8f7f..8509dcefc 100644 --- a/libs/aniso8601/duration.py +++ b/libs/aniso8601/duration.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -85,14 +85,14 @@ def _parse_duration_prescribed(isodurationstr): # Make sure the end character is valid # https://bitbucket.org/nielsenb/aniso8601/issues/9/durations-with-trailing-garbage-are-parsed if isodurationstr[-1] not in ["Y", "M", "D", "H", "S", "W"]: - raise ISOFormatError("ISO 8601 duration must end with a valid " "character.") + raise ISOFormatError("ISO 8601 duration must end with a valid character.") # Make sure only the lowest order element has decimal precision durationstr = normalize(isodurationstr) if durationstr.count(".") > 1: raise ISOFormatError( - "ISO 8601 allows only lowest order element to " "have a decimal fraction." + "ISO 8601 allows only lowest order element to have a decimal fraction." ) seperatoridx = durationstr.find(".") @@ -104,7 +104,7 @@ def _parse_duration_prescribed(isodurationstr): # then one, the string is invalid if remaining.isdigit() is False: raise ISOFormatError( - "ISO 8601 duration must end with " "a single valid character." + "ISO 8601 duration must end with a single valid character." ) # Do not allow W in combination with other designators @@ -169,7 +169,7 @@ def _parse_duration_prescribed_notime(isodurationstr): for componentstr in [yearstr, monthstr, daystr, weekstr]: if componentstr is not None: if "." in componentstr: - intstr, fractionalstr = componentstr.split(".", 1) + intstr = componentstr.split(".", 1)[0] if intstr.isdigit() is False: raise ISOFormatError( @@ -227,7 +227,7 @@ def _parse_duration_prescribed_time(isodurationstr): for componentstr in [hourstr, minutestr, secondstr]: if componentstr is not None: if "." in componentstr: - intstr, fractionalstr = componentstr.split(".", 1) + intstr = componentstr.split(".", 1)[0] if intstr.isdigit() is False: raise ISOFormatError( diff --git a/libs/aniso8601/exceptions.py b/libs/aniso8601/exceptions.py index c14b44421..0e94dc6bd 100644 --- a/libs/aniso8601/exceptions.py +++ b/libs/aniso8601/exceptions.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/interval.py b/libs/aniso8601/interval.py index cd0184c6b..ee9bd5f3e 100644 --- a/libs/aniso8601/interval.py +++ b/libs/aniso8601/interval.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -62,7 +62,7 @@ def _get_interval_resolution(intervaltuple): def _get_interval_component_resolution(componenttuple): - if type(componenttuple) is DateTuple: + if isinstance(componenttuple, DateTuple): if componenttuple.DDD is not None: # YYYY-DDD # YYYYDDD @@ -89,7 +89,8 @@ def _get_interval_component_resolution(componenttuple): # Y[YYY] return IntervalResolution.Year - elif type(componenttuple) is DatetimeTuple: + + if isinstance(componenttuple, DatetimeTuple): # Datetime if componenttuple.time.ss is not None: return IntervalResolution.Seconds @@ -193,7 +194,7 @@ def parse_repeating_interval( raise ISOFormatError("Repeating interval string is empty.") if isointervalstr[0] != "R": - raise ISOFormatError("ISO 8601 repeating interval must start " "with an R.") + raise ISOFormatError("ISO 8601 repeating interval must start with an R.") if intervaldelimiter not in isointervalstr: raise ISOFormatError( @@ -249,7 +250,8 @@ def _parse_interval( endtuple = parse_date(secondpart, builder=TupleBuilder) return builder.build_interval(end=endtuple, duration=duration) - elif secondpart[0] == "P": + + if secondpart[0] == "P": # <start>/<duration> # We need to figure out if <start> is a date, or a datetime duration = parse_duration(secondpart, builder=TupleBuilder) @@ -288,7 +290,7 @@ def _parse_interval_end(endstr, starttuple, datetimedelimiter): concise = False - if type(starttuple) is DateTuple: + if isinstance(starttuple, DateTuple): startdatetuple = starttuple else: # Start is a datetime @@ -304,9 +306,9 @@ def _parse_interval_end(endstr, starttuple, datetimedelimiter): if timestr is not None: endtimetuple = parse_time(timestr, builder=TupleBuilder) - # End is just a time - if datestr is None: - return endtimetuple + # End is just a time + if datestr is None: + return endtimetuple # Handle backwards concise representation if datestr.count("-") == 1: @@ -326,7 +328,7 @@ def _parse_interval_end(endstr, starttuple, datetimedelimiter): # Separators required because concise elements may be missing digits if monthstr is not None: concisedatestr += "-" + monthstr - elif startdatetuple.MM is not None: + else: concisedatestr += "-" + startdatetuple.MM concisedatestr += "-" + daystr diff --git a/libs/aniso8601/resolution.py b/libs/aniso8601/resolution.py index eca2d4e7e..e7c617bac 100644 --- a/libs/aniso8601/resolution.py +++ b/libs/aniso8601/resolution.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/__init__.py b/libs/aniso8601/tests/__init__.py index 1a94e017a..5cfededc9 100644 --- a/libs/aniso8601/tests/__init__.py +++ b/libs/aniso8601/tests/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/compat.py b/libs/aniso8601/tests/compat.py index 6c5266589..f693bf97f 100644 --- a/libs/aniso8601/tests/compat.py +++ b/libs/aniso8601/tests/compat.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/test_compat.py b/libs/aniso8601/tests/test_compat.py index 2f7988331..927af1244 100644 --- a/libs/aniso8601/tests/test_compat.py +++ b/libs/aniso8601/tests/test_compat.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/test_date.py b/libs/aniso8601/tests/test_date.py index 54e3076eb..d4c5b518e 100644 --- a/libs/aniso8601/tests/test_date.py +++ b/libs/aniso8601/tests/test_date.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -122,6 +122,17 @@ def test_parse_date(self): "DDD": None, }, ), + ( + "10", + { + "YYYY": "10", + "MM": None, + "DD": None, + "Www": None, + "D": None, + "DDD": None, + }, + ), ( "1981-04-05", { @@ -265,7 +276,8 @@ def test_parse_date_badtype(self): def test_parse_date_badstr(self): testtuples = ( - "W53", + "1", + "123" "W53", "2004-W", "2014-01-230", "2014-012-23", diff --git a/libs/aniso8601/tests/test_decimalfraction.py b/libs/aniso8601/tests/test_decimalfraction.py index dc52f2406..feb757407 100644 --- a/libs/aniso8601/tests/test_decimalfraction.py +++ b/libs/aniso8601/tests/test_decimalfraction.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/test_duration.py b/libs/aniso8601/tests/test_duration.py index 0d7d40a4d..e6338d78a 100644 --- a/libs/aniso8601/tests/test_duration.py +++ b/libs/aniso8601/tests/test_duration.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/test_init.py b/libs/aniso8601/tests/test_init.py index d5604c6b9..b4dd61249 100644 --- a/libs/aniso8601/tests/test_init.py +++ b/libs/aniso8601/tests/test_init.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/test_interval.py b/libs/aniso8601/tests/test_interval.py index f01d15112..91e7cae5c 100644 --- a/libs/aniso8601/tests/test_interval.py +++ b/libs/aniso8601/tests/test_interval.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/test_time.py b/libs/aniso8601/tests/test_time.py index dcee5e03f..df7a8100b 100644 --- a/libs/aniso8601/tests/test_time.py +++ b/libs/aniso8601/tests/test_time.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/test_timezone.py b/libs/aniso8601/tests/test_timezone.py index 5df9671f1..c761869c6 100644 --- a/libs/aniso8601/tests/test_timezone.py +++ b/libs/aniso8601/tests/test_timezone.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/tests/test_utcoffset.py b/libs/aniso8601/tests/test_utcoffset.py index 11fa4f7d9..9b05c6fae 100644 --- a/libs/aniso8601/tests/test_utcoffset.py +++ b/libs/aniso8601/tests/test_utcoffset.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms diff --git a/libs/aniso8601/time.py b/libs/aniso8601/time.py index 31fab048e..1d782ca36 100644 --- a/libs/aniso8601/time.py +++ b/libs/aniso8601/time.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -54,7 +54,7 @@ def get_time_resolution(isotimestr): def get_datetime_resolution(isodatetimestr, delimiter="T"): # <date>T<time> # - # Time part cannot be omittted so return time resolution + # Time part cannot be omitted so return time resolution isotimetuple = parse_datetime( isodatetimestr, delimiter=delimiter, builder=TupleBuilder ).time diff --git a/libs/aniso8601/timezone.py b/libs/aniso8601/timezone.py index 3b66105bd..3442f2bac 100644 --- a/libs/aniso8601/timezone.py +++ b/libs/aniso8601/timezone.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -18,27 +18,28 @@ def parse_timezone(tzstr, builder=PythonTimeBuilder): if len(tzstr) == 1 and tzstr[0] == "Z": return builder.build_timezone(negative=False, Z=True, name=tzstr) - elif len(tzstr) == 6: + + if len(tzstr) == 6: # ±hh:mm hourstr = tzstr[1:3] minutestr = tzstr[4:6] if tzstr[0] == "-" and hourstr == "00" and minutestr == "00": - raise ISOFormatError("Negative ISO 8601 time offset must not " "be 0.") + raise ISOFormatError("Negative ISO 8601 time offset must not be 0.") elif len(tzstr) == 5: # ±hhmm hourstr = tzstr[1:3] minutestr = tzstr[3:5] if tzstr[0] == "-" and hourstr == "00" and minutestr == "00": - raise ISOFormatError("Negative ISO 8601 time offset must not " "be 0.") + raise ISOFormatError("Negative ISO 8601 time offset must not be 0.") elif len(tzstr) == 3: # ±hh hourstr = tzstr[1:3] minutestr = None if tzstr[0] == "-" and hourstr == "00": - raise ISOFormatError("Negative ISO 8601 time offset must not " "be 0.") + raise ISOFormatError("Negative ISO 8601 time offset must not be 0.") else: raise ISOFormatError('"{0}" is not a valid ISO 8601 time offset.'.format(tzstr)) diff --git a/libs/aniso8601/utcoffset.py b/libs/aniso8601/utcoffset.py index 11872a01e..97f12edd9 100644 --- a/libs/aniso8601/utcoffset.py +++ b/libs/aniso8601/utcoffset.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2021, Brandon Nielsen +# Copyright (c) 2025, Brandon Nielsen # All rights reserved. # # This software may be modified and distributed under the terms @@ -51,7 +51,7 @@ def __repr__(self): if correcteddays == 0: return "-{0}:{1:02}:{2:02} UTC".format(hours, minutes, seconds) - elif correcteddays == 1: + if correcteddays == 1: return "-1 day, {0}:{1:02}:{2:02} UTC".format(hours, minutes, seconds) return "-{0} days, {1}:{2:02}:{3:02} UTC".format( diff --git a/libs/apprise-1.9.1.dist-info/RECORD b/libs/apprise-1.9.1.dist-info/RECORD deleted file mode 100644 index 871ad1223..000000000 --- a/libs/apprise-1.9.1.dist-info/RECORD +++ /dev/null @@ -1,204 +0,0 @@ -../../bin/apprise,sha256=ZJ-e4qqxNLtdW_DAvpuPPX5iROIiQd8I6nvg7vtAv-g,233 -apprise-1.9.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -apprise-1.9.1.dist-info/LICENSE,sha256=gt7qKBxRhVcdmXCYVtrWP6DtYjD0DzONet600dkU994,1343 -apprise-1.9.1.dist-info/METADATA,sha256=UayxDNlv8dJVozBLd5Nvj_q6vZfELt5ycUOJCoyk8bo,52950 -apprise-1.9.1.dist-info/RECORD,, -apprise-1.9.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise-1.9.1.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 -apprise-1.9.1.dist-info/entry_points.txt,sha256=71YypBuNdjAKiaLsiMG40HEfLHxkU4Mi7o_S0s0d8wI,45 -apprise-1.9.1.dist-info/top_level.txt,sha256=JrCRn-_rXw5LMKXkIgMSE4E0t1Ks9TYrBH54Pflwjkk,8 -apprise/__init__.py,sha256=RxGvVVtaXg0sEAhIEraiFg1L61jM6k_YLG8DTa97yPo,3887 -apprise/apprise.py,sha256=kB1Oc5hHGnVx_vLX8TafMUq4bopxYnBiaxkCb8QpC7M,32838 -apprise/apprise.pyi,sha256=_4TBKvT-QVj3s6PuTh3YX-BbQMeJTdBGdVpubLMY4_k,2203 -apprise/apprise_attachment.py,sha256=Dz4ZIEueRsGVyulyI1ulugdSXIcDKCATn990UukxaNU,12363 -apprise/apprise_attachment.pyi,sha256=R9-0dVqWpeaFrVpcREwPhGy3qHWztG5jEjYIOsbE5dM,1145 -apprise/apprise_config.py,sha256=wCSvFW57LkeyvG-WGnLlfUSU9s8hl3P0L8V3Q4Q8wP8,16890 -apprise/apprise_config.pyi,sha256=_mUlCnncqAq8sL01WxQTgZjnb2ic9kZXvtqZmVl-fc8,1568 -apprise/asset.py,sha256=U5FXcQFCXP5R7MnxcxdLXzEZ7IidLHBzQjUyc5l1Y0U,15103 -apprise/asset.pyi,sha256=NYLXXYbScgRkspP27XGpRRM_uliPu1OCdWdZBPPvLng,979 -apprise/assets/NotifyXML-1.0.xsd,sha256=292qQ_IUl5EWDhPyzm9UTT0C2rVvJkyGar8jiODkJs8,986 -apprise/assets/NotifyXML-1.1.xsd,sha256=bjR3CGG4AEXoJjYkGCbDttKHSkPP1FlIWO02E7G59g4,1758 -apprise/assets/themes/default/apprise-failure-128x128.ico,sha256=Mt0ptfHJaN3Wsv5UCNDn9_3lyEDHxVDv1JdaDEI_xCA,67646 -apprise/assets/themes/default/apprise-failure-128x128.png,sha256=66ps8TDPxVH3g9PlObJqF-0x952CjnqQyN3zvpRcOT8,16135 -apprise/assets/themes/default/apprise-failure-256x256.png,sha256=bQBsKKCsKfR9EqgYOZrcVcVa5y8qG58PN2mEqO5eNRI,41931 -apprise/assets/themes/default/apprise-failure-32x32.png,sha256=vH0pZffIDCvkejpr3fJHGXW__8Yc3R_p0bacX6t6l18,2437 -apprise/assets/themes/default/apprise-failure-72x72.png,sha256=EP5A8DHRDr9srgupFSwOoyQ308bNJ8aL192J_L4K-ec,7600 -apprise/assets/themes/default/apprise-info-128x128.ico,sha256=F5_CirmXueRCRI5Z_Crf6TS6jVIXTJlRD83zw1oJ66g,67646 -apprise/assets/themes/default/apprise-info-128x128.png,sha256=bBqRZAgQey-gkmJrnFhPbzjILSrljE59mRkgj3raMQo,16671 -apprise/assets/themes/default/apprise-info-256x256.png,sha256=B5r_O4d9MHCmSWZwfbqQgZSp-ZetTdiBSwKcMTF1aFA,43331 -apprise/assets/themes/default/apprise-info-32x32.png,sha256=lt3NZ95TzkiCNVNlurrB2fE2nriMa1wftl7nrNXmb6c,2485 -apprise/assets/themes/default/apprise-info-72x72.png,sha256=kDnsZpqNUZGqs9t1ECUup7FOfXUIL-rupnQCYJp9So4,7875 -apprise/assets/themes/default/apprise-logo.png,sha256=85ttALudKkLmiqilJT7mUQLUXRFmM1AK89rnwLm313s,160907 -apprise/assets/themes/default/apprise-success-128x128.ico,sha256=uCopPwdQjxgfohKazHaDzYs9y4oiaOpL048PYC6WRlg,67646 -apprise/assets/themes/default/apprise-success-128x128.png,sha256=nvDuU_QqhGlw6cMtdj7Mv-gPgqCEx-0DaaXn1KBLVYg,17446 -apprise/assets/themes/default/apprise-success-256x256.png,sha256=vXfKuxY3n0eeXHKdb9hTxICxOEn7HjAQ4IZpX0HSLzc,48729 -apprise/assets/themes/default/apprise-success-32x32.png,sha256=Jg9pFJh3YPI-LiPBebyJ7Z4Vt7BRecaE8AsRjQVIkME,2471 -apprise/assets/themes/default/apprise-success-72x72.png,sha256=FQbgvIhqKOhEK0yvrhaSpai0R7hrkTt_-GaC2KUgCCk,7858 -apprise/assets/themes/default/apprise-warning-128x128.ico,sha256=6XaQPOx0oWK_xbhr4Yhb7qNazCWwSs9lk2SYR2MHTrQ,67646 -apprise/assets/themes/default/apprise-warning-128x128.png,sha256=pf5c4Ph7jWH7gf39dJoieSj8TzAsY3TXI-sGISGVIW4,16784 -apprise/assets/themes/default/apprise-warning-256x256.png,sha256=SY-xlaiXaj420iEYKC2_fJxU-yj2SuaQg6xfPNi83bw,43708 -apprise/assets/themes/default/apprise-warning-32x32.png,sha256=97R2ywNvcwczhBoWEIgajVtWjgT8fLs4FCCz4wu0dwc,2472 -apprise/assets/themes/default/apprise-warning-72x72.png,sha256=L8moEInkO_OLxoOcuvN7rmrGZo64iJeH20o-24MQghE,7913 -apprise/attachment/__init__.py,sha256=9jSiGEbLllS-0Vbpgxo4MCpZfIJ-saezWWgQ1PofZ9I,1678 -apprise/attachment/base.py,sha256=cSMzn0afNynXTnqTnyMgue__8ya_OPo5azMwTYOKS2k,16509 -apprise/attachment/base.pyi,sha256=w0XG_QKauiMLJ7eQ4S57IiLIURZHm_Snw7l6-ih9GP8,961 -apprise/attachment/file.py,sha256=t_osFOH0QD6KuuywZfKN61aQdAjxTFff5BgFNBzWoY0,4976 -apprise/attachment/http.py,sha256=o9341E3G8SZGQ1uDkN6Rto1WeKXHRibkraocOiUvm8Y,13758 -apprise/attachment/memory.py,sha256=TlDRGqoelOhaFkKW6bMDm8mw7gJLYMNHH4aDAL2MvHg,6999 -apprise/cli.py,sha256=upLvnKnD_Lo4EMv-S-LJQ-ZP6AoUxJSR7S6U17XEXrc,35327 -apprise/common.py,sha256=B_4Nwo8HejUDnqdeya6Vvn-y6pkFXBpeHJy9uejEujc,6524 -apprise/common.pyi,sha256=luF3QRiClDCk8Z23rI6FCGYsVmodOt_JYfYyzGogdNM,447 -apprise/config/__init__.py,sha256=oDxdoqG2NEYu_bbpLsLaM3L9WKY3gNn5gjIwb2h3LU4,1679 -apprise/config/base.py,sha256=QSGJt7-gmK7gI_chB2YukBEU5vsiaCjz7wUG50SU2a4,53129 -apprise/config/base.pyi,sha256=cngfobwH6v2vxYbQrObDi5Z-t5wcquWF-wR0kBCr3Eg,54 -apprise/config/file.py,sha256=A54MYobIVIQqbrhYmC26foMKnDN83Hz7U_go9gL802A,6245 -apprise/config/http.py,sha256=CjQtv_OQJykMxD4ssiwbFI3P8CeQiPdYV_ZIiL_XqMw,9440 -apprise/config/memory.py,sha256=8VICU-WLux8KnW6i9sf9fgmns90J-MfVYI3pvTiyTno,2816 -apprise/conversion.py,sha256=7q00QmrT0TCWu49j6TnPc0l_vfCIWCdDT3KiSq3SLJc,6350 -apprise/decorators/__init__.py,sha256=e_PDAm0kQNzwDPx-NJZLPfLMd2VAABvNZtxx_iDviRM,1487 -apprise/decorators/base.py,sha256=HgqmvjqRel421G0SW-6H0zGYAC-o4E2nj9-w_ifu-50,8084 -apprise/decorators/notify.py,sha256=FzIa7m-G5KnVVa__rjyn990zt2lqE8sdHW-XY79lbAU,5097 -apprise/emojis.py,sha256=ONF0t8dY9f2XlEkLUG79-ybKVAj2GqbPj2-Be97vAoI,87738 -apprise/exception.py,sha256=5E-jQ6qA0hQHVnE9sjVLRuj4d0QgGJQ5HdtCui215XU,2337 -apprise/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise/i18n/en/LC_MESSAGES/apprise.mo,sha256=aOLjg1I4K-9KQEqyFhs7wW13jUPjxY4X7EN2XvYR8Qw,3959 -apprise/locale.py,sha256=4uSr4Nj_rz6ISMMAfRVRk58wZVLKOofJgk2x0_E8NkQ,8994 -apprise/logger.py,sha256=131hqhed8cUj9x_mfXDEvwA2YbcYDFAYiWVK1HgxRVY,6921 -apprise/manager.py,sha256=ZgpusHA3yAyUf57qxOtBDcw4IICMKBNTveCAEqSm7wk,27352 -apprise/manager_attachment.py,sha256=EkrcKtKjbxTXXyDaKyiu4XSfDu9wKFSdJD7TOTpyOUc,2200 -apprise/manager_config.py,sha256=sCIOlBTH13bQ1cuhQVpUq2vyKWBArA8YRyPnXIB1iWQ,2205 -apprise/manager_plugins.py,sha256=Xbg5-xr-06zMIDoWviz-zKcbzusHj0iBBMchKPpUOkg,2211 -apprise/persistent_store.py,sha256=Kn-iwudFQiUerlLdSquTLoGMEgFTYXcrHyK4tU4RMEE,56446 -apprise/plugins/__init__.py,sha256=CvH8porbgIJTuDqK6E3Ejy_7n_yOOsI4baRZF3TYDMU,18695 -apprise/plugins/africas_talking.py,sha256=0Mcc7FhxPTBDhWxoF5Etfzyw0Dfkn4vApEmAWw3oq4U,16028 -apprise/plugins/apprise_api.py,sha256=OGpwoNkujgg1MvlEYlz0yYiJYdvISnR5R9L_3v_I5yw,16802 -apprise/plugins/aprs.py,sha256=72sfop7ulQ8g5JIa1KfBvWpj-dSV9pv0CtT2ZQToT7A,25779 -apprise/plugins/bark.py,sha256=MaWLHKHs6dCaMjKLy9wEx62ec6n1i9pD_0u3ZaHVzWw,17079 -apprise/plugins/base.py,sha256=A9octO0MKqDH195PVPXoARqqTLozqxcvcUKGqput3o8,32784 -apprise/plugins/base.pyi,sha256=aKlZXRYUgG8lz_ZgGkYYJ_GKhuf18youTmMU-FlG7z8,21 -apprise/plugins/bulksms.py,sha256=3IrRv7N2c2jTbJ2uwKPOi0_5DF9Gu3zgWdbO8FI665g,16346 -apprise/plugins/bulkvs.py,sha256=hi620_T4rPOTqMDJdqtsQqvihL6r4I1OQD6ag1F5fOY,13549 -apprise/plugins/burstsms.py,sha256=VLHaPfJJ1lLt7uFi1oJdbE3-j6z4mNBX1ObY3ottAIM,15797 -apprise/plugins/chantify.py,sha256=9xjBwOY4syj94g25_2ndfPjHgJbcxqTjST8epqtqLmI,6947 -apprise/plugins/clicksend.py,sha256=-ifaogTKQ7L4JtOOrdxk3WS7WOm92oNNVYmx4w1v9aU,11671 -apprise/plugins/custom_form.py,sha256=BV1adXR5NMcB5JMuylUXYIiRqy2cm8P5kRoM86EGpXY,18443 -apprise/plugins/custom_json.py,sha256=9v9r8EEA6tPEt5sfLubpLNVbgFT1jkomT383monPeYA,14312 -apprise/plugins/custom_xml.py,sha256=ihl0uYOTYO9e80RashRj2lIiIYtjAb9PPywKNy4xOi8,17569 -apprise/plugins/d7networks.py,sha256=42YgB9ukIqrGQWH68vsl0Ci-2qqVO4Bop2M4Bo_ejt0,15267 -apprise/plugins/dapnet.py,sha256=xFbPpFp64zxalW0zw9MV-gTyPUGgqG1HUtogPUtuNro,13858 -apprise/plugins/dbus.py,sha256=MXPGaWI9EEpOlncO1t9KBVUn3W6OfAqJKXhmWQzRNoc,14491 -apprise/plugins/dingtalk.py,sha256=gmKuqDXt7nmLtKltY7myJguFTTmz_vnDYOkecAmoLaM,12273 -apprise/plugins/discord.py,sha256=INdWWHcY5LmcamN4bvJCGbYjJ0vX_VfIZ-SqduYoVX0,26346 -apprise/plugins/email/__init__.py,sha256=pUp4xX_1_LC6ITIkj7lCNFiFgb8UfmLxpevnW-xKcSs,2101 -apprise/plugins/email/base.py,sha256=V-Gbu3eD2efvu7poTRajsa6SPOFz6HyGaQbbz56p9XA,38373 -apprise/plugins/email/common.py,sha256=jzuFhKMeyoTCfRtbKu3zi4v-c51Ewr66fE0lfUfh2Tg,2569 -apprise/plugins/email/templates.py,sha256=js9M2lkvay_-lbxRPCVyvP7xraSe2HV082aUaXV8wpA,9376 -apprise/plugins/emby.py,sha256=HHyXbT2Ld23-tEkMjfFgHyOSToPwnU0epWVNd3AQj2Y,24427 -apprise/plugins/enigma2.py,sha256=s3cKfNUGVe7_IcRCvdPMZ4hv_A5g7dcOvW6-aKz6-dI,11931 -apprise/plugins/fcm/__init__.py,sha256=CX-aZVcFw6nUcC7sWXHbSnU9fp_nR0IxDZyOyGlq8uQ,21936 -apprise/plugins/fcm/color.py,sha256=2DfMOAXkLU07XzT8XIYKZ5yXBw77MiMXueVaDSlWWQU,4591 -apprise/plugins/fcm/common.py,sha256=978uBUoNdtopCtylipGiKQdsQ8FTONxkFBp7uJMZHc8,1718 -apprise/plugins/fcm/oauth.py,sha256=Vvbd0-rd5BPIjAneG3rILU153JIzfSZ0kaDov6hm96M,11197 -apprise/plugins/fcm/priority.py,sha256=0WuRW1y1HVnybgjlTeCZPHzt7j8SwWnC7faNcjioAOc,8163 -apprise/plugins/feishu.py,sha256=AoTytULz_b1mzEh9tE9BahAZcveUu12bSrHbXOLBfdo,7540 -apprise/plugins/flock.py,sha256=JGjLeIagtCP79DLtHb9V9ESy7AusHLbV8rBdHrri3QU,12984 -apprise/plugins/freemobile.py,sha256=Wefq8No34MKfLewanvvOlREFZhjWFTcLxJDpD2_R7Eo,6974 -apprise/plugins/gnome.py,sha256=p87RCNgjMmDN7SFOwX_xuMGha7SIz9lVQelXJ0OlvMY,9227 -apprise/plugins/google_chat.py,sha256=XJCienlBBFc63KFc8ajlIQ5VKOoJZZNB5hG2G0y3r2g,12973 -apprise/plugins/gotify.py,sha256=OZapVd5E71xRsF7Ktpe4U70uwImjocW_li92WLXxecg,11028 -apprise/plugins/growl.py,sha256=QSmVkVTHEdve8fCb8tOK9FVQmV5cy4l2rbU4Vxkl0Qo,14446 -apprise/plugins/guilded.py,sha256=lhE6gK7laQNYEubD9lBGRemFK-IHis_u2tNekbUoGgM,3707 -apprise/plugins/home_assistant.py,sha256=1eEYQNpabnMvnYbn0xcQoUjl4jLQqGNoVYtMu094JX4,11276 -apprise/plugins/httpsms.py,sha256=o53aEDp-7DWa82h8D2By55DLz_dfZOsW9_jXtcHzxkU,11386 -apprise/plugins/ifttt.py,sha256=_oBxKsAQcPrSGAJ-KaV19P8HjXABZqE3q4PI5ooTyaY,13685 -apprise/plugins/join.py,sha256=JvMIesIOWf6Tbe8penPbqccleQ1rJeUU7g0lopGJlQQ,13818 -apprise/plugins/kavenegar.py,sha256=ES69k9nNUQuMf5IqwWQ55hmkJODShYh1b_v-H8phXew,12870 -apprise/plugins/kumulos.py,sha256=r1WFh4RrYSCwa5S30x4oRyniJhf8GKa0Nn_C3uzbBcg,8505 -apprise/plugins/lametric.py,sha256=wWMwryKwewIBUsOBybFeWPYrvjDQBNc67jaU59oktQ0,38449 -apprise/plugins/line.py,sha256=Py5GU-uNj-9rzq8NcVG-_5Hpo1nKBbhD8z1D8s_Xo9I,10908 -apprise/plugins/lunasea.py,sha256=4m7f8kn1hwkQ4HaiOttC4kPtyJYrhtQ3lBrrC9Q5OrU,15089 -apprise/plugins/macosx.py,sha256=BMPB3muOKen_EkRcxKdIF4Iz_4kY7NW7e0Ruau61iiY,8439 -apprise/plugins/mailgun.py,sha256=adcMibdGEHIIW-fhIsSwJC2dWfmiXhKq9_oHfC4ZHpM,25868 -apprise/plugins/mastodon.py,sha256=2Bf6dNbXStvB8DPFp-9nxGTG78qxtm-h3o-24AhgQLg,35610 -apprise/plugins/matrix.py,sha256=vVvm-gmpAHt-2aUA2BlDOwNa-2ovGSkmVf1G5JUWAUo,63276 -apprise/plugins/mattermost.py,sha256=uLZfzDAMhkkFcdMK7qsKvTxsYt7EjcLC_8lcXRDBmZ4,14813 -apprise/plugins/messagebird.py,sha256=XRUWILix-Gjo3tc4aUlnb0pyuhi6kUXkXcHPqgbHscA,12498 -apprise/plugins/misskey.py,sha256=UMEluu2KmGb7lHcjn6vFwacjFHVOSN-9WLXmy5qZrO0,9909 -apprise/plugins/mqtt.py,sha256=XRMwYPEVYeb8beBeqNTFa732L7ES2FHYcQ1mX7-D6Sc,20630 -apprise/plugins/msg91.py,sha256=sLFJrMckUfRjySwXbQ_Pu6YDCRB6MqICBotnOY_jFFU,12937 -apprise/plugins/msteams.py,sha256=3azwj5kLkPpOiLi2R6gmIsT03wNCbfKX8cPSv2XkMUg,26653 -apprise/plugins/nextcloud.py,sha256=YLdiR9I23iVxdP7kgpLblim7DN2JGh1bfGJvY5_BNZI,13134 -apprise/plugins/nextcloudtalk.py,sha256=krD8kr9J2g0XLADHa8aPdoIyj01UBJ7MhWJ2jlb2IfQ,11386 -apprise/plugins/notica.py,sha256=yR4IMVxzgzQ0I0BveVkLPl6q0ma_0kUwWnkDAafPSpM,13400 -apprise/plugins/notifiarr.py,sha256=LZuvq7lmKXekJHcKrodXopgfJWg_yqhtk-9nt9k-X6g,15516 -apprise/plugins/notifico.py,sha256=BUkras-ZeZg1i1sg-jlwC4KHRqL43tDVhaHT6Cj55uc,12309 -apprise/plugins/ntfy.py,sha256=O0hVLLvx9GUPgtJIJxZ5TpAmHfe31iCbqJ5sDABhljk,30163 -apprise/plugins/office365.py,sha256=8gLy1ITiG92RAQSKGlWwZtudMHjFTbSGzgTXPxHr93s,36877 -apprise/plugins/one_signal.py,sha256=oqFjJG-JwYgggCk7qJll6ODGVYcOn5aFNt_JZHfDVhk,22555 -apprise/plugins/opsgenie.py,sha256=CgSC7ELgvkqchhHDhbRMcuT7mjyZMKdGhyfBgg8Lz64,28428 -apprise/plugins/pagerduty.py,sha256=8sGPW7xAaoUdUdWF4HD9X3f0g6CyXpvYV440lL3klps,18196 -apprise/plugins/pagertree.py,sha256=VaKfof2NE_zVxsQpzgkmClofhRZDFIeqXJyefxSLQGc,14110 -apprise/plugins/parseplatform.py,sha256=txtC-xATfL2VAa-7aEGCiaoT50vWisfgz35A0NzDiR0,10709 -apprise/plugins/plivo.py,sha256=wYDlwG6XstiDO82N8uRLdAUGiq_hj0_q3Vle4g1NjyY,13840 -apprise/plugins/popcorn_notify.py,sha256=dJxDapVSzQh9-ENmb6RI8_278hi6zC0ceKMKypzmKek,10793 -apprise/plugins/prowl.py,sha256=2axHoKN2HCy4T8ByG85eX70rO2-TC8s-JSevQiQOmaw,10075 -apprise/plugins/pushbullet.py,sha256=Gh3NvSk4-SEaECtrjCtSyEDIIfq1XSq1rrjSvYv1DJU,15695 -apprise/plugins/pushdeer.py,sha256=B5ghGWNQdkdR_SYwFpFe6ZIhDpck4B5e1F8Y30lx6NA,7290 -apprise/plugins/pushed.py,sha256=KkvkIIZd_mkOPjPnfUK3YeGT_AlYK8aw8Q4J0pcIdHA,12540 -apprise/plugins/pushjet.py,sha256=H0R92-tqdeYiLsPQ7sam9lDXvJr3KxChH9_txIvegsM,9344 -apprise/plugins/pushme.py,sha256=jB0G2oDU9kw7l4feF8Vr9sqUZT_of_Y8KdBxzoFVN5I,7389 -apprise/plugins/pushover.py,sha256=uSgHUsnWn8AGbLCL0ZhKUXh6kHD1HGTNUMPeAYZLfWU,21477 -apprise/plugins/pushsafer.py,sha256=1vOL0I-_MD6pDwIEcz7Em1_nF70Af94Br8TNjiFRIBo,27166 -apprise/plugins/pushy.py,sha256=BussLKjyUcVZmJkOj1seNGHfm3P_dsI5mW2uu5wUtvY,12752 -apprise/plugins/reddit.py,sha256=TBGdBXUeV5CW3LrVFtb5OhNS9k5HWc40Umf_TpcjLlc,26102 -apprise/plugins/revolt.py,sha256=Ks8OEmsEUNNYcJuSKqc45yDe7phobkBlRg4MbBezH8Y,14759 -apprise/plugins/rocketchat.py,sha256=32yTz_bq7MniGYpbQAyhvp7nrKiwB3_UdAeOqdUo6CY,26293 -apprise/plugins/rsyslog.py,sha256=TQG0JhcYxDzLNaP-3OxnnaYuxMinoNyx0c3QAKsDVqM,12364 -apprise/plugins/ryver.py,sha256=dxV8518h45BDDpn4rpe4D3xwMhiuKPvreRrOfJhpAOQ,12097 -apprise/plugins/sendgrid.py,sha256=IMlQftYmA9xtUUcmd4p7wY1KAdg3c1_jlWnOWWbSCjw,18087 -apprise/plugins/serverchan.py,sha256=39IWtP_1qBlTvrRiGtGaJ87Z8cikYFdErKPz4_8AMhg,6054 -apprise/plugins/ses.py,sha256=qlKtvbhnAYGgT0N9b5_s0Ppys5LnfwnNjrSKpmHU8HM,34032 -apprise/plugins/seven.py,sha256=yw7yNHCAfSqrnDYoiuCIKRUSEZbMau1b7EAWBBftht8,10422 -apprise/plugins/sfr.py,sha256=wEV4CPLUPhlCSRTDBLywdTgEI5FL-_7QxnLciixuc_Y,15192 -apprise/plugins/signal_api.py,sha256=6N7P1cWxnjfba1wObwnAp968GTm1zx-r-BMevFWJi64,17061 -apprise/plugins/simplepush.py,sha256=9Wl-67UeNUR8-Wg53F82jbtvwApIEieHZOLNN2_d_L8,12049 -apprise/plugins/sinch.py,sha256=PwJ5ntzPFu4RRtP8aJC76OrQx8p0y7ccZXmLYhdDxvU,17153 -apprise/plugins/slack.py,sha256=-rkv6AemHeZW9cluaw-oouG09AK39SVxorhkxcdAJQg,44304 -apprise/plugins/smseagle.py,sha256=Jt9MBVQcbEyzyA59GYeUepAIPpnjpK4pE3NOUXwU3mE,24483 -apprise/plugins/smsmanager.py,sha256=aRlYTKpktu8VH6ZxOF9FNzGTqEe1MGNEyazi3vTLVQ8,14353 -apprise/plugins/smtp2go.py,sha256=fiHS0o2VxU6cQpxfEiZoqOf7EQPKrw9wL2LL0SyG1vw,19984 -apprise/plugins/sns.py,sha256=g1MU8t04pW9LxKFKgjEovzHMGKshst-uhr2_YrPmkC0,24488 -apprise/plugins/sparkpost.py,sha256=_mTyvFOfQx12QWOXumaABTaQ09DGSGx6HN-dUgcBc9w,28113 -apprise/plugins/splunk.py,sha256=AgZSR8IX_TZywEbLoH_L7cCFtcU764cqoxzy0ktv47Y,16607 -apprise/plugins/streamlabs.py,sha256=DwuaI0I3lV4UrMrscJBESVg4WoXk7FRDFV2JDWKSXh4,16306 -apprise/plugins/synology.py,sha256=VLoZU-UZnO2wxIbsc9UhN34zJ7H7ZRmjrcm_xTZsx2Q,11525 -apprise/plugins/syslog.py,sha256=czReqzBuJjjsBs103DMJ_niDmLC-Y8gwmmHfmENHmDQ,10785 -apprise/plugins/techuluspush.py,sha256=atMvgOdOUEdKhETWK1NSOjO7Fy6LwDtgAZmP_Ul7DV0,7528 -apprise/plugins/telegram.py,sha256=b8VoM5i56DrFNCoSltar5NX1TJivxtRhyNyQhdW2UXQ,38487 -apprise/plugins/threema.py,sha256=UH_WXZg4ftDN1JoWRMotsbD4CU3LtailDbILgnK01OY,12110 -apprise/plugins/twilio.py,sha256=iPmHSaI2FDVJxlbrMJOYFlmoO5yRSk4nk9LJdJ5AcnA,18468 -apprise/plugins/twist.py,sha256=ZxojFBgq4swlrF2UbZPpT5Zb1GrOBASa5hb71YwPIv0,29197 -apprise/plugins/twitter.py,sha256=bh5s7jOw3u-DA01ovsb95a_rWgmpmvCkX1T1Jw5DiGw,30612 -apprise/plugins/voipms.py,sha256=FGO3AO8Bidg-AjZqobOapWtU98ZTQTLJz4W4g8QWqoQ,13114 -apprise/plugins/vonage.py,sha256=kNjkCp7gt46BiS59K2TH0pPsiRpNt_PGb39Axe0PJJY,13680 -apprise/plugins/webexteams.py,sha256=V3SlKZVfL8zNvIha_BUKWEJEC3qrgoVazHP4MKJtits,9441 -apprise/plugins/wecombot.py,sha256=-ygeUlSF_uTZOfJH-3Zr9r2hM0eQ_DG4ISsPxHL_YjY,9061 -apprise/plugins/whatsapp.py,sha256=J-OlOhGhGljpfBBAfcY0L5aW6ykaKOoyrxIjZAHiaeg,20180 -apprise/plugins/windows.py,sha256=50gdOp36pmFI6wPkPfGFeow8BqtIZlWkuJRK3p6ogcc,8731 -apprise/plugins/workflows.py,sha256=uTSZwgUEUrM22JUcivy32c8mqIMMBLxK5j6UP8396Po,19850 -apprise/plugins/wxpusher.py,sha256=ZR3Yxe5zVDtMkjUOzRRbr3KeOyVL8KkPEgR00bwaNvs,12688 -apprise/plugins/xbmc.py,sha256=7ByWHUSjeuhfSeRZ6oCNMmDobqzKU1_o7ROwf4offR0,12742 -apprise/plugins/zulip.py,sha256=P62A7-cNqAlDryIlpJs0O72FW2baUYHeucjRxVnghx8,14360 -apprise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -apprise/url.py,sha256=otU2AADtGUpEXw00dFNCMxTMgXPjY4ygOm1AuXyXuv8,35026 -apprise/url.pyi,sha256=WLaRREH7FzZ5x3-qkDkupojWGFC4uFwJ1EDt02lVs8c,520 -apprise/utils/__init__.py,sha256=8TgDzOFje6b9ybinURyyIOk_fqF6C2AtLbd_kh_Lubs,1430 -apprise/utils/base64.py,sha256=LehdJII_pMfv1f0l7wUWaBW2K3KU9oSSDgrKnMkMcMU,3167 -apprise/utils/cwe312.py,sha256=9YRbjAaBuKIb-Rp0fHXcCnnritoIKZxfb5sjTeYZshY,7375 -apprise/utils/disk.py,sha256=43-QOYDq_m48EbBSg646jjv9DcBh-aadQF7VUGXkUHw,5801 -apprise/utils/logic.py,sha256=YyUlpqcpFESK6cqmxG-aAs5m5Bjnkj884dxDaxN6Fjg,4573 -apprise/utils/module.py,sha256=G3l6DYi5uTXAtf3Tg9urhsb5zlI3vGm9uUafflNHxSU,2117 -apprise/utils/parse.py,sha256=k5MOZWR3gqn5MF2oATlwRUQSkEiHLmrcAIQ7sbC-H98,39386 -apprise/utils/pgp.py,sha256=cKYCJww5EQNP7E78BhwpbgBeCOjYmaU74-4dYNf_Vkk,11489 -apprise/utils/singleton.py,sha256=6OEIIkpRQCjYHlSWt_WWIwLOrlBCMz7tYhbUXx-lHSQ,1844 -apprise/utils/templates.py,sha256=5fifEhuLJwCFyQ5F7Z9BuqXG5UhOiqA6pxDd2GvI7Tw,3252 diff --git a/libs/apprise-1.9.1.dist-info/INSTALLER b/libs/apprise-1.9.2.dist-info/INSTALLER similarity index 100% rename from libs/apprise-1.9.1.dist-info/INSTALLER rename to libs/apprise-1.9.2.dist-info/INSTALLER diff --git a/libs/apprise-1.9.1.dist-info/LICENSE b/libs/apprise-1.9.2.dist-info/LICENSE similarity index 95% rename from libs/apprise-1.9.1.dist-info/LICENSE rename to libs/apprise-1.9.2.dist-info/LICENSE index f9154fefe..1bb88d1df 100644 --- a/libs/apprise-1.9.1.dist-info/LICENSE +++ b/libs/apprise-1.9.2.dist-info/LICENSE @@ -1,6 +1,6 @@ BSD 2-Clause License -Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/libs/apprise-1.9.1.dist-info/METADATA b/libs/apprise-1.9.2.dist-info/METADATA similarity index 97% rename from libs/apprise-1.9.1.dist-info/METADATA rename to libs/apprise-1.9.2.dist-info/METADATA index 212d8da2b..d6ebb290d 100644 --- a/libs/apprise-1.9.1.dist-info/METADATA +++ b/libs/apprise-1.9.2.dist-info/METADATA @@ -1,12 +1,12 @@ Metadata-Version: 2.1 Name: apprise -Version: 1.9.1 +Version: 1.9.2 Summary: Push Notifications that work with just about every platform! Home-page: https://github.com/caronc/apprise Author: Chris Caron Author-email: lead2gold@gmail.com -License: BSD -Keywords: Africas Talking Alerts Apprise API Automated Packet Reporting System AWS BulkSMS BulkVS Burst SMS Chantify Chat CLI ClickSend D7Networks Dapnet DBus DingTalk Discord Email Emby Enigma2 FCM Feishu Flock Form Free Mobile Gnome Google Chat Gotify Growl Guilded Home Assistant httpSMS IFTTT Join JSON Kavenegar KODI Kumulos LaMetric Line LunaSea MacOSX Mailgun Mastodon Matrix Mattermost MessageBird Microsoft Misskey MQTT MSG91 MSTeams Nextcloud NextcloudTalk Notica Notifiarr Notifico Ntfy Office365 OneSignal Opsgenie PagerDuty PagerTree ParsePlatform Plivo PopcornNotify Power Automate Prowl PushBullet Pushed Pushjet PushMe Push Notifications Pushover PushSafer Pushy PushDeer Reddit Revolt Rocket.Chat RSyslog Ryver SendGrid ServerChan Seven SES SFR Signal SimplePush Sinch Slack SMSEagle SMS Manager SMTP2Go SNS SparkPost Splunk Streamlabs Stride Synology Chat Syslog Techulus Telegram Threema Gateway Twilio Twist Twitter VictorOps Voipms Vonage Webex WeCom Bot WhatsApp Windows Workflows WxPusher XBMC XML Zulip +License: BSD 2-Clause +Keywords: Africas Talking Alerts Apprise API Automated Packet Reporting System AWS BulkSMS BulkVS Burst SMS Chanify Chat CLI ClickSend D7Networks Dapnet DBus DingTalk Discord Email Emby Enigma2 FCM Feishu Flock Form Free Mobile Gnome Google Chat Gotify Growl Guilded Home Assistant httpSMS IFTTT Join JSON Kavenegar KODI Kumulos LaMetric Line LunaSea MacOSX Mailgun Mastodon Matrix Mattermost MessageBird Microsoft Misskey MQTT MSG91 MSTeams Nextcloud NextcloudTalk Notica Notifiarr Notifico Ntfy Office365 OneSignal Opsgenie PagerDuty PagerTree ParsePlatform Plivo PopcornNotify Power Automate Prowl PushBullet Pushed Pushjet PushMe Push Notifications Pushover PushSafer Pushy PushDeer Reddit Revolt Rocket.Chat RSyslog Ryver SendGrid ServerChan Seven SES SFR Signal SimplePush Sinch Slack SMSEagle SMS Manager SMTP2Go SNS SparkPost Splunk Streamlabs Stride Synology Chat Syslog Techulus Telegram Threema Gateway Twilio Twist Twitter VictorOps Voipms Vonage Webex WeCom Bot WhatsApp Windows Workflows WxPusher XBMC XML Zulip Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators @@ -99,7 +99,7 @@ The table below identifies the services this tool supports and some example serv | [Apprise API](https://github.com/caronc/apprise/wiki/Notify_apprise_api) | apprise:// or apprises:// | (TCP) 80 or 443 | apprise://hostname/Token | [AWS SES](https://github.com/caronc/apprise/wiki/Notify_ses) | ses:// | (TCP) 443 | ses://user@domain/AccessKeyID/AccessSecretKey/RegionName<br/>ses://user@domain/AccessKeyID/AccessSecretKey/RegionName/email1/email2/emailN | [Bark](https://github.com/caronc/apprise/wiki/Notify_bark) | bark:// | (TCP) 80 or 443 | bark://hostname<br />bark://hostname/device_key<br />bark://hostname/device_key1/device_key2/device_keyN<br/>barks://hostname<br />barks://hostname/device_key<br />barks://hostname/device_key1/device_key2/device_keyN -| [Chantify](https://github.com/caronc/apprise/wiki/Notify_chantify) | chantify:// | (TCP) 443 | chantify://token +| [Chanify](https://github.com/caronc/apprise/wiki/Notify_chanify) | chantify:// | (TCP) 443 | chantify://token | [Discord](https://github.com/caronc/apprise/wiki/Notify_discord) | discord:// | (TCP) 443 | discord://webhook_id/webhook_token<br />discord://avatar@webhook_id/webhook_token | [Emby](https://github.com/caronc/apprise/wiki/Notify_emby) | emby:// or embys:// | (TCP) 8096 | emby://user@hostname/<br />emby://user:password@hostname | [Enigma2](https://github.com/caronc/apprise/wiki/Notify_enigma2) | enigma2:// or enigma2s:// | (TCP) 80 or 443 | enigma2://hostname diff --git a/libs/apprise-1.9.2.dist-info/RECORD b/libs/apprise-1.9.2.dist-info/RECORD new file mode 100644 index 000000000..e4cc8e8ca --- /dev/null +++ b/libs/apprise-1.9.2.dist-info/RECORD @@ -0,0 +1,204 @@ +../../bin/apprise,sha256=ZJ-e4qqxNLtdW_DAvpuPPX5iROIiQd8I6nvg7vtAv-g,233 +apprise-1.9.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +apprise-1.9.2.dist-info/LICENSE,sha256=14Xm5_sr7ckw9aeWP1S8s2BdDw0zmZ-84BYbRG_25qk,1343 +apprise-1.9.2.dist-info/METADATA,sha256=x_o_QTrKa9ZvriOzP0u2ATsgIbK7WAQU_TEwI2Q58g4,52956 +apprise-1.9.2.dist-info/RECORD,, +apprise-1.9.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise-1.9.2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +apprise-1.9.2.dist-info/entry_points.txt,sha256=71YypBuNdjAKiaLsiMG40HEfLHxkU4Mi7o_S0s0d8wI,45 +apprise-1.9.2.dist-info/top_level.txt,sha256=JrCRn-_rXw5LMKXkIgMSE4E0t1Ks9TYrBH54Pflwjkk,8 +apprise/__init__.py,sha256=fNkCsrDHTksln2E4fuFuLCiUgT1fQiikqXecAVAJgts,3896 +apprise/apprise.py,sha256=zAvoPxYgXU5anlFUxvcSyc24W1YXxfNMVx7_nJWGSFM,32838 +apprise/apprise.pyi,sha256=_4TBKvT-QVj3s6PuTh3YX-BbQMeJTdBGdVpubLMY4_k,2203 +apprise/apprise_attachment.py,sha256=8alD6gXQoF1QLyTdJlzMXJ7m5gDA50vLBGMfJXQjVOM,12363 +apprise/apprise_attachment.pyi,sha256=R9-0dVqWpeaFrVpcREwPhGy3qHWztG5jEjYIOsbE5dM,1145 +apprise/apprise_config.py,sha256=8bXKAeWMMJULeXd9APz9QeSc4sBvdfiw4xE18-3AtW0,16890 +apprise/apprise_config.pyi,sha256=_mUlCnncqAq8sL01WxQTgZjnb2ic9kZXvtqZmVl-fc8,1568 +apprise/asset.py,sha256=ZFJW4IbiBGxdqvasCT9GVXyo1GyI0DGOuRU7znXF8Ag,15103 +apprise/asset.pyi,sha256=NYLXXYbScgRkspP27XGpRRM_uliPu1OCdWdZBPPvLng,979 +apprise/assets/NotifyXML-1.0.xsd,sha256=292qQ_IUl5EWDhPyzm9UTT0C2rVvJkyGar8jiODkJs8,986 +apprise/assets/NotifyXML-1.1.xsd,sha256=bjR3CGG4AEXoJjYkGCbDttKHSkPP1FlIWO02E7G59g4,1758 +apprise/assets/themes/default/apprise-failure-128x128.ico,sha256=Mt0ptfHJaN3Wsv5UCNDn9_3lyEDHxVDv1JdaDEI_xCA,67646 +apprise/assets/themes/default/apprise-failure-128x128.png,sha256=66ps8TDPxVH3g9PlObJqF-0x952CjnqQyN3zvpRcOT8,16135 +apprise/assets/themes/default/apprise-failure-256x256.png,sha256=bQBsKKCsKfR9EqgYOZrcVcVa5y8qG58PN2mEqO5eNRI,41931 +apprise/assets/themes/default/apprise-failure-32x32.png,sha256=vH0pZffIDCvkejpr3fJHGXW__8Yc3R_p0bacX6t6l18,2437 +apprise/assets/themes/default/apprise-failure-72x72.png,sha256=EP5A8DHRDr9srgupFSwOoyQ308bNJ8aL192J_L4K-ec,7600 +apprise/assets/themes/default/apprise-info-128x128.ico,sha256=F5_CirmXueRCRI5Z_Crf6TS6jVIXTJlRD83zw1oJ66g,67646 +apprise/assets/themes/default/apprise-info-128x128.png,sha256=bBqRZAgQey-gkmJrnFhPbzjILSrljE59mRkgj3raMQo,16671 +apprise/assets/themes/default/apprise-info-256x256.png,sha256=B5r_O4d9MHCmSWZwfbqQgZSp-ZetTdiBSwKcMTF1aFA,43331 +apprise/assets/themes/default/apprise-info-32x32.png,sha256=lt3NZ95TzkiCNVNlurrB2fE2nriMa1wftl7nrNXmb6c,2485 +apprise/assets/themes/default/apprise-info-72x72.png,sha256=kDnsZpqNUZGqs9t1ECUup7FOfXUIL-rupnQCYJp9So4,7875 +apprise/assets/themes/default/apprise-logo.png,sha256=85ttALudKkLmiqilJT7mUQLUXRFmM1AK89rnwLm313s,160907 +apprise/assets/themes/default/apprise-success-128x128.ico,sha256=uCopPwdQjxgfohKazHaDzYs9y4oiaOpL048PYC6WRlg,67646 +apprise/assets/themes/default/apprise-success-128x128.png,sha256=nvDuU_QqhGlw6cMtdj7Mv-gPgqCEx-0DaaXn1KBLVYg,17446 +apprise/assets/themes/default/apprise-success-256x256.png,sha256=vXfKuxY3n0eeXHKdb9hTxICxOEn7HjAQ4IZpX0HSLzc,48729 +apprise/assets/themes/default/apprise-success-32x32.png,sha256=Jg9pFJh3YPI-LiPBebyJ7Z4Vt7BRecaE8AsRjQVIkME,2471 +apprise/assets/themes/default/apprise-success-72x72.png,sha256=FQbgvIhqKOhEK0yvrhaSpai0R7hrkTt_-GaC2KUgCCk,7858 +apprise/assets/themes/default/apprise-warning-128x128.ico,sha256=6XaQPOx0oWK_xbhr4Yhb7qNazCWwSs9lk2SYR2MHTrQ,67646 +apprise/assets/themes/default/apprise-warning-128x128.png,sha256=pf5c4Ph7jWH7gf39dJoieSj8TzAsY3TXI-sGISGVIW4,16784 +apprise/assets/themes/default/apprise-warning-256x256.png,sha256=SY-xlaiXaj420iEYKC2_fJxU-yj2SuaQg6xfPNi83bw,43708 +apprise/assets/themes/default/apprise-warning-32x32.png,sha256=97R2ywNvcwczhBoWEIgajVtWjgT8fLs4FCCz4wu0dwc,2472 +apprise/assets/themes/default/apprise-warning-72x72.png,sha256=L8moEInkO_OLxoOcuvN7rmrGZo64iJeH20o-24MQghE,7913 +apprise/attachment/__init__.py,sha256=5g3VxLUO59xulyvRaTwztWWzold525uH3tEbEnb18go,1678 +apprise/attachment/base.py,sha256=ZDOcpORGcMEBlWuto98tIjPqJU74frlKiWQXB1GHJTI,16509 +apprise/attachment/base.pyi,sha256=w0XG_QKauiMLJ7eQ4S57IiLIURZHm_Snw7l6-ih9GP8,961 +apprise/attachment/file.py,sha256=dxgCKdIqW3qf0Ioe2rNcDEZxx7MGduTt0qDLIpORZ4A,4976 +apprise/attachment/http.py,sha256=MHjzgfyH-LSxuGennIh3H2vj7te_yqJfSg4-7jmpnqQ,13758 +apprise/attachment/memory.py,sha256=6z8ZqLlpQOm7hyZjNHv_ydAAGIdPhvJ9fnC3JQYS8Gw,6999 +apprise/cli.py,sha256=Hd5pndYCfGC0UzFqLQp6yO9UZdd2l2ehe2LZxqMjZng,35327 +apprise/common.py,sha256=Xdd6qyGQhnpXN_JunCTMRzV1iOQbXOFE7XhIVuasfCc,6524 +apprise/common.pyi,sha256=luF3QRiClDCk8Z23rI6FCGYsVmodOt_JYfYyzGogdNM,447 +apprise/config/__init__.py,sha256=oFL3nzr4dD4z7L_3n7_WTrc5avmaKfCsWq2zqCR8f2g,1679 +apprise/config/base.py,sha256=inMITk2xSHRzduIY63G9qfgwFAUHUXkbW1DfKaLEp_g,53129 +apprise/config/base.pyi,sha256=cngfobwH6v2vxYbQrObDi5Z-t5wcquWF-wR0kBCr3Eg,54 +apprise/config/file.py,sha256=kanHNPbCuOgEVnXn-Hl4MOA4356o7oDlF35VUl5zUsc,6245 +apprise/config/http.py,sha256=pgJyVkWA3y19eGGWRuWdYszF5iFEc8ighw4HJ8I6ohA,9440 +apprise/config/memory.py,sha256=x9Orap8oe1lp2LWqvHPQnEzmdkC7teYEXI6XfO896lQ,2816 +apprise/conversion.py,sha256=jL08RvFkWXJ_9zMR_tpMSJYWaiGQbZA7ybMp5ElLwZw,6350 +apprise/decorators/__init__.py,sha256=1S2yIQDvI6WWG7VQiqEQbWKfu-olntsFAjPYhHkqAqk,1487 +apprise/decorators/base.py,sha256=qYw-QbvxwOKoOuutdn-b_jfy4uONuCFwUywbkhY2NEs,8084 +apprise/decorators/notify.py,sha256=UIZOPjcPpIP3A1PVylyj_HdPAY6AuNW-UgXjvpJ2Mg8,5097 +apprise/emojis.py,sha256=i3Tkj_FQKRgStZKBpt8xMkitTPwJBYjeGY9OXqH2an8,87738 +apprise/exception.py,sha256=A41ILE-cy6hhF5V1LoxKvSwu-fV2H3CuBO1T1JWe4so,2337 +apprise/i18n/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise/i18n/en/LC_MESSAGES/apprise.mo,sha256=aOLjg1I4K-9KQEqyFhs7wW13jUPjxY4X7EN2XvYR8Qw,3959 +apprise/locale.py,sha256=cDboaRDd011-7Wtd1D3y8wEWNCcz5IvFr1FSe-FHGAE,8994 +apprise/logger.py,sha256=aQM5_IABNvLieni87vzmpzbSU0MHcZUh9dbk0yURjY4,6921 +apprise/manager.py,sha256=HiKToGceJZWGwidUrgYjFSehhb-JpBkHLvpuTZfMxNA,27352 +apprise/manager_attachment.py,sha256=9VlNSuxT9dl773Sa8ESx-9owY4R7EI7hYRICfzvdkhA,2200 +apprise/manager_config.py,sha256=GOl781nYG3P6AgcEDAbge3mR4KFz06z-1OKyyglL5Og,2205 +apprise/manager_plugins.py,sha256=yh1CEm8KkdBjFMqzfJbEL9BkN3vSb14iNZHCvRf8LLw,2211 +apprise/persistent_store.py,sha256=nYRa1ajYVvwTpoPKHYhvxEog6iB4gOZgaBQVLjy3H_I,56446 +apprise/plugins/__init__.py,sha256=TMYQsbofZ5S4rRWYNfE86uMNiGIzpWw-jC7e6JqECMg,18695 +apprise/plugins/africas_talking.py,sha256=jTlKxm9YQhzvd0PigQv6Qs9_aAvZ3W-ECKPf_w7X2Vc,16028 +apprise/plugins/apprise_api.py,sha256=QFjg0_Gev3OMXfhoZJdPKyrlBzeyWjlEvezpL4ZdY44,16802 +apprise/plugins/aprs.py,sha256=G7_1gaUW9SKDID1Vv2Y4b5BUu1lhWh-18m8AhzNeKL4,25779 +apprise/plugins/bark.py,sha256=4V4qBjJRFczDJTuG2R1phGjnnUNfbO2cWx2YpZX5eiI,17079 +apprise/plugins/base.py,sha256=zdRrzKIfpe0zTDVv5rw6Q4KBnIhkidnjhacu86Ntgp8,32784 +apprise/plugins/base.pyi,sha256=aKlZXRYUgG8lz_ZgGkYYJ_GKhuf18youTmMU-FlG7z8,21 +apprise/plugins/bulksms.py,sha256=ydVHseuxMcsylatrM0zYJQDmEmaO4zK3mJyKm5gHOcM,16346 +apprise/plugins/bulkvs.py,sha256=kc6AWcc8MTeFmXZQtYkL4qlL8sfsoYQLev1SqHhRYys,13549 +apprise/plugins/burstsms.py,sha256=VjD0VFNpO6DXqs8yJQ7Ft3TC7ucXageHFEYCqTMszGY,15797 +apprise/plugins/chanify.py,sha256=MHhBTh5X0gwsdbEhQX-rp1A-jPrpeGjt5t-0d6cxm8I,6930 +apprise/plugins/clicksend.py,sha256=5oi1WMGfzhDm823heb9M-0kWr_4fZkp37s6YJVfWHdU,11671 +apprise/plugins/custom_form.py,sha256=V4sKjLZKGzCda9lC48GXO3eIFy1XQebKa5Xulq6txT0,18443 +apprise/plugins/custom_json.py,sha256=kQ5e2tDDGBUC_3sI2lW93pavK5c0alh89PEw6cg9KSU,14312 +apprise/plugins/custom_xml.py,sha256=1HXKLtTX4DrOvcV3AIKiQixYoWatysfo4KXZMKK6YjY,17569 +apprise/plugins/d7networks.py,sha256=ys7JZBdcqbNfkHJwGY_On3CyMHaMh3PsC6G15wd3ELo,15267 +apprise/plugins/dapnet.py,sha256=VLwR0XtR9Sj8kX0C9e4lBKpKrR7O4dSCTXtWJe4QnFw,13858 +apprise/plugins/dbus.py,sha256=6XIVCzfbVbakQNXwXFi--meDviTtNB9Vm5Ly7B03DV0,14491 +apprise/plugins/dingtalk.py,sha256=0OPh1aa5vdmQEIjON85BDpItavR2eLu6ugR0eeNzH38,12273 +apprise/plugins/discord.py,sha256=gi5COi8tE4ao4JZEwjodTnL-f1FlYQvR4fSLdJPKLic,26702 +apprise/plugins/email/__init__.py,sha256=Iajljg0rqGJMiWWHHVXJVm91glLeQEtBXQniE4xGcP0,2101 +apprise/plugins/email/base.py,sha256=44eo1Te7-Li4VgcNhEyzMLXGHITrYU2xBuZ3NEf23bw,38373 +apprise/plugins/email/common.py,sha256=UIg9ce2-CMj9SrI2HBBIbrWyWZNMUzmzsfOd1QclT-E,2569 +apprise/plugins/email/templates.py,sha256=DE_XonwemouEl-1qoUlXn4vCBTdZ2M5K9xnndMsw9JE,9376 +apprise/plugins/emby.py,sha256=iq2EGPoaxZv6OTHiRe8ATlrSmJTTzrIAFS_G5fM_nQc,24427 +apprise/plugins/enigma2.py,sha256=8lhjMJpP692nguMPxcxqwVE9bVJsOQOoE9IrWGd7JeE,11931 +apprise/plugins/fcm/__init__.py,sha256=yvJyuNa7p9q476cwR5GZwz0M5OO2pgmdSRoadUoUoOI,21936 +apprise/plugins/fcm/color.py,sha256=ALQCrxBo9LxvDboS6uOqmM6KyBHOqnHs8qGK__aEYK4,4591 +apprise/plugins/fcm/common.py,sha256=Dj0pMxMrmO0LUz8uHefDthJdYAIqO2hTRc6fefPwqiI,1718 +apprise/plugins/fcm/oauth.py,sha256=t21Dfbzi6bx1J-F4oqkXRrfVS-fW3iHrqwAN9sEPNN8,11197 +apprise/plugins/fcm/priority.py,sha256=eJa-3DSjfLuKJ7N0gJZ34QVRLB9hT_EqOE9yaplPcOA,8163 +apprise/plugins/feishu.py,sha256=c6u4jnJSkNckZzx0yngobpb36viLFAvjUZAW7RTXkcY,7540 +apprise/plugins/flock.py,sha256=fnXvAaEGo-bO3kdZJaEjeMJ0b-ROZH8IpYl4hXfbZBo,12984 +apprise/plugins/freemobile.py,sha256=wOwYVihSfK0OxuuEFsS2VaRM-CFytU7W42-7nM1LyRI,6974 +apprise/plugins/gnome.py,sha256=pey5eXFtFKzXtIE90jWT9SzYZtYNLAXYYXmJKZZnmbc,9227 +apprise/plugins/google_chat.py,sha256=-S1AyzjoOJNdqsu_KiLKOTnatT5nA8KOE530WLGEPg0,12973 +apprise/plugins/gotify.py,sha256=Rit01QDkyldDpGQEMlP-WmsK6xUbcLFxvW9uQi1rw04,11028 +apprise/plugins/growl.py,sha256=HzqSnp8z-n36uNiMnhKf4Ej91DLfJGyXNtOWYzfJH-Q,14446 +apprise/plugins/guilded.py,sha256=M_tUu56FniUx87SnaT4nU7UqbcwofTwy7p5n2r6FRnU,3707 +apprise/plugins/home_assistant.py,sha256=4v53BkIqh389bJEGh_3eMz_tK64HkzmBPiCwqgohnKA,11276 +apprise/plugins/httpsms.py,sha256=ILqURAj_nMIkvP359U25M1u5lhJ2iqnrDKjC_FvcB6U,11386 +apprise/plugins/ifttt.py,sha256=WPiiOGLPMwW8O88A9y2s7dnk06enC9_Z7HMIrOc0hZI,13685 +apprise/plugins/join.py,sha256=Tt7nNysedcEjNXZ7tX9XInoo0aVW0qY_e9JZtAtnWBs,13818 +apprise/plugins/kavenegar.py,sha256=mK9NXlrO1MzzKb3gNSWyPregtb1BXdx5RVapMgmlr2w,12870 +apprise/plugins/kumulos.py,sha256=PWLq75hYnoRHLIEZSDsVpgHv5PJmtVy3flJ599EYubI,8505 +apprise/plugins/lametric.py,sha256=exYazJnlzRbdy1SXceHKRUfF1PJno1EOBgkAC9vfhYY,38449 +apprise/plugins/line.py,sha256=js-B-tlXNacF_jfrZT3k8Sr6nWom-GldGjymFTB2oJ8,10908 +apprise/plugins/lunasea.py,sha256=vpD6x5Hc_0Ix5q8mIZtimZWKlONpgg1aAJYrQOoy-dk,15089 +apprise/plugins/macosx.py,sha256=vkpdYUehyqfBn2kWm0qnYzhfDEMgh19SyYof8A6Y8AU,8439 +apprise/plugins/mailgun.py,sha256=4FqH2_Y6VluXkwss3EHgtBBOmVjX0drGhN6g1reU6Os,25868 +apprise/plugins/mastodon.py,sha256=iXtZ3UdPFuMKy3O-sxWRfDqTetdacAhGnz4RAUgbJj4,35610 +apprise/plugins/matrix.py,sha256=OcS0r-PQNlWd8bR5uWeb-9COJAxf0rKqeoZfrTvFM50,63276 +apprise/plugins/mattermost.py,sha256=fHfSxf0qyFZY5M4TUcFL2n-NDs_FbW63jNrSSGK4uk0,14813 +apprise/plugins/messagebird.py,sha256=d6KseASKCkQesMtrSZDp9RnMpPwFjQTq3_woDpcsIUM,12498 +apprise/plugins/misskey.py,sha256=_loWj8kKIPsf9X52Zb7rYx7DDt-rZ1ii5DCQyPfPrLY,9909 +apprise/plugins/mqtt.py,sha256=AaV700N3rHHQ7uYbz_Veao7qxgXsuOMGEDu7AaiXZ6E,20630 +apprise/plugins/msg91.py,sha256=G6ne6G5Rlw-Q7rUQf80nQ0wbdgJ-hdU1-p5SL_XHijg,12937 +apprise/plugins/msteams.py,sha256=sTeLbj2q7OdHTJJTKZFQtu436NeuAlKLJ8zQwW43K5I,26653 +apprise/plugins/nextcloud.py,sha256=lrk1zhfcf-y7VllhNbBvSEmuyoKJ6wh3Q4bzfKRoF3w,13134 +apprise/plugins/nextcloudtalk.py,sha256=xlqvWvYtPgbRQsabkKhuM_xNhfbyvkYXySiD8El0JNk,11386 +apprise/plugins/notica.py,sha256=f4tN9KbErS1S1g5kGBQ2JocliP3qqmbyNYD3vG2keC8,13400 +apprise/plugins/notifiarr.py,sha256=6Y0lhM5sLLDCS7O3Wok6nTNbBDuCduRIDmhqVG8gCRI,15516 +apprise/plugins/notifico.py,sha256=4YKZJE5_JL0prsOHRdLkICUOQ62SSuq-jmYEpSy8WKk,12309 +apprise/plugins/ntfy.py,sha256=hbWADksgJG0GkU8zeIuTbELKX-KwhrdgwLBc97svfOY,30163 +apprise/plugins/office365.py,sha256=zlwaVBGetYvhwRCqtAUOe1qB1EoGxfTet3wFk6oYGQs,36877 +apprise/plugins/one_signal.py,sha256=CQ99QuB35UQ1yBFpGw2IcBljxh8mO0f-ZPmk-X3eMqE,22555 +apprise/plugins/opsgenie.py,sha256=zHRVWV2diEQRyH-2rDi6RSo1DjeyQns27xrRdU1fIVk,28428 +apprise/plugins/pagerduty.py,sha256=oAHVdBlZJ_dyCvwjjOIBuDLBWDFTkRM_8osnVslkA3c,18196 +apprise/plugins/pagertree.py,sha256=MJS6BeJaV3k-9w9BdZKFlcKXUHRRUQHfPvo4CubMySE,14110 +apprise/plugins/parseplatform.py,sha256=G_lL3M0dZpsjXpQ8DmIN2KktulSYYSm99Ijwk88rdFs,10709 +apprise/plugins/plivo.py,sha256=wYDlwG6XstiDO82N8uRLdAUGiq_hj0_q3Vle4g1NjyY,13840 +apprise/plugins/popcorn_notify.py,sha256=aI7ad-tPogvfxE8fvs9hU7aDEsLo7pPHzlg-GDu6vG4,10793 +apprise/plugins/prowl.py,sha256=5XH3Usgm-Uv-0yGmd4_J4h7LanhFZdRfHs-6c7pya_s,10075 +apprise/plugins/pushbullet.py,sha256=tEEQCBmuDYSw3fdqb6jcie-Du8hS5PnggehKO_Cb70U,15695 +apprise/plugins/pushdeer.py,sha256=xgmOIYcSbSfh1GKnFtZQW9f0XiurUg7X_gUwZLSV4zo,7290 +apprise/plugins/pushed.py,sha256=5snmqDvqoqUW5tSmbgEJMbrlcsafnaz1bYYGC8jscLU,12540 +apprise/plugins/pushjet.py,sha256=-p0i-f3zqoTVeluuu78DldzocCRl2F2DM-4ht5dHuCQ,9344 +apprise/plugins/pushme.py,sha256=1BF_RVPruaGAnQuEEEVYLke8sgMGljCwdWEspm7yE8M,7389 +apprise/plugins/pushover.py,sha256=9jzq2p0juF_GLg8vRS5bquoegqxhRbDLsotRh9fIwDM,21477 +apprise/plugins/pushsafer.py,sha256=IHu2JUpxTkpaOgvk3JhmODR-WB7nXOx7iL3t9doGRPw,27166 +apprise/plugins/pushy.py,sha256=HYTQRhvholpy6B0o9qY4F-AwDlCZ-UGN9A-z2HZMQco,12752 +apprise/plugins/reddit.py,sha256=agf0UZNPygPh5PsF6PvCwwYXu2KjFajRnomiGEa1Xuk,26102 +apprise/plugins/revolt.py,sha256=89tjfWBz27KVs63xbxmfSeJ7zc3fNUp-FROTC1PVX-4,14759 +apprise/plugins/rocketchat.py,sha256=jDgyRuaOb0QV9r8XLZK1i8jzjGIxLs--ygK7fXy4yDo,26293 +apprise/plugins/rsyslog.py,sha256=_dx033ZPJYsfbDfArDAiQwDpH78Wy7iUA2_y0JBXNeQ,12364 +apprise/plugins/ryver.py,sha256=z1-NpFE4EHKrBwdpe65dSOrI3WUSWgL4rwqu8sfAPDw,12097 +apprise/plugins/sendgrid.py,sha256=AVzVthR6OW9Qf-476Xtj59b2KESrxRdCsEamgaLOvKQ,18087 +apprise/plugins/serverchan.py,sha256=pWcw1ChbsLDHRjaDRGguSSMwFGj5-WnNWqRJVGcLUQU,6054 +apprise/plugins/ses.py,sha256=xDDN0vcgMlQ_XPVMcRMC_by6bzPY3TOj3Yz0ajHyK9I,34032 +apprise/plugins/seven.py,sha256=VxSHLS1LITYfblm2qDEyjPothgIzrgVvs18JDUSI5XE,10422 +apprise/plugins/sfr.py,sha256=pYi4UkIeXjAGPoW8Tevv5IspO7hSmRP0te9O_1y4nXE,15192 +apprise/plugins/signal_api.py,sha256=LgkwVA07_juOk-b6XPWxPOCwZjEovGFgcLbfZ-rdowM,17061 +apprise/plugins/simplepush.py,sha256=rsl9B-dfVIZ4sOLHJTbSoja6u1etRuiwRqrVvqFR4EE,12049 +apprise/plugins/sinch.py,sha256=ogAlYlig5NGsiLPVrwBwCg3ZOf_ATa3B0aDiNxayBS0,17153 +apprise/plugins/slack.py,sha256=_7x3Djr5T7P76HSEjhuDZR6FChfMo1FKgts95f9eMTY,44304 +apprise/plugins/smseagle.py,sha256=f7nPIIBZA6DA9eYWAVZXy6-KAQMMkPfG7XP0vY3jqoY,24483 +apprise/plugins/smsmanager.py,sha256=vDL1H7rGbWWTap-7klWjcDesAf7J2CkmI2H4CiErD6Q,14353 +apprise/plugins/smtp2go.py,sha256=G4V6DscnL2ePefgRNnDZvCYBAbnE_8TTeOPP8NDV7bc,19984 +apprise/plugins/sns.py,sha256=OL-NA_Edx_0_dq78jV_29P_iHvKb2sTZ4X7jTxw730Q,24488 +apprise/plugins/sparkpost.py,sha256=CQoMAslrPJVa6Bmx_boWKAbGpH1MfsKzcZA6duRhN_U,28113 +apprise/plugins/splunk.py,sha256=HbbW0TXp7Gne9JGkylZE7Sw15nAk0mR3rLEhnNJikMc,16607 +apprise/plugins/streamlabs.py,sha256=c9YoB9t_gzKW4UfP3aSZsCvsEvxF7j9ybSiwdvPCfCo,16306 +apprise/plugins/synology.py,sha256=xfRY9ecjgENX0oZxg79_EeeXLnmcjJyhjAY2NcCGmVU,11525 +apprise/plugins/syslog.py,sha256=WNCwRJKBpTrky130EwcTzoIuzMMG5lPYxb3qCSGmDCY,10785 +apprise/plugins/techuluspush.py,sha256=gpsFzuQcuexSGpV9FZAO2s9JRDo8OXxvZkbeX1EvZvE,7528 +apprise/plugins/telegram.py,sha256=wf0W45ohxpdbC2-jv7fDMr02R6OD4B7ygPMiD7VeTOs,38487 +apprise/plugins/threema.py,sha256=n-gOBIpUCVZnICL8CtWwLhKlWDsTMZt8-fL8VlRUzcg,12110 +apprise/plugins/twilio.py,sha256=tLb6prAJbStWafIOxCMNZc6ere2f6cypXcusVPn_5Pc,18468 +apprise/plugins/twist.py,sha256=M4pGZcbE_DpblZG_vhCZD48YkCWdV5O0nv2fZPKRiwg,29197 +apprise/plugins/twitter.py,sha256=QtP2PMZPyBSFzUupq5Egsh0VCopvVson8CAGMl6dALk,30612 +apprise/plugins/voipms.py,sha256=N6fdKjiAXox2R_y0eDEn2BZ72jxW1i3U4yzUFgZcQQQ,13114 +apprise/plugins/vonage.py,sha256=VmA78rJEPdeFpZ5xwalK7ynH9I1CGTqr3D7nhV4e9d4,13680 +apprise/plugins/webexteams.py,sha256=k5vlb4jvI3_D2xty03W1rQhgotzW_gy6XZPfIKfa2tw,9441 +apprise/plugins/wecombot.py,sha256=9oc2KXuhLHUknmckkQpXl2HKrEEwWVf0Gr23FSDpezM,9061 +apprise/plugins/whatsapp.py,sha256=JA7hZsnEcN7azUq_mTQwRdGp5F508RhxMH6BT49Vz6g,20180 +apprise/plugins/windows.py,sha256=stTRSJnowyJGW3ALg3NucOES2iZzeBoCB9a6344ev0M,8731 +apprise/plugins/workflows.py,sha256=tM11grGORuAfdjcp_Zw3_cfUTh_1kjdJcjry81UEc3c,19850 +apprise/plugins/wxpusher.py,sha256=4sJjz8AzhQfLh7wutctG1oiBpVSI3JwH9-g3oq3D2t0,12688 +apprise/plugins/xbmc.py,sha256=yoLCiSYk9MQ5q4rNliMRYb8zcNrwF5bsI4jCP_rvPso,12742 +apprise/plugins/zulip.py,sha256=SPD-DUA5cU1QGGnkrqesW732hisTjnAZQp1V_1vJhgE,14360 +apprise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +apprise/url.py,sha256=lOo1pjN33LKIWMiubw0wClWmstNj9fl5NOctCAp9HJk,35026 +apprise/url.pyi,sha256=WLaRREH7FzZ5x3-qkDkupojWGFC4uFwJ1EDt02lVs8c,520 +apprise/utils/__init__.py,sha256=VNCibX3QQp5esDkefhDCEDjA2Ajx0mWt-lWXf0yElqc,1430 +apprise/utils/base64.py,sha256=AVY45VxRMr-RnYQJXSbjWhzpiVSTv8qJ2VXZPHwaZPM,3167 +apprise/utils/cwe312.py,sha256=dcFsa86lvPfxOQIlcx1C_b0IYNjLEWQ_CGSh_wcuZZE,7375 +apprise/utils/disk.py,sha256=EdWn6awOYhl7dej8T5xw8ZrnRRn7IcyOu7AYqog53Kw,5801 +apprise/utils/logic.py,sha256=ZGYBpOQwSOY6veaEtx4ADcpmGG_wlZCtO7vjBgKN-jo,4573 +apprise/utils/module.py,sha256=bJuSGXdbydoBkSslFjE1SP9la6lVJ4tBSsNU5gLhXgo,2117 +apprise/utils/parse.py,sha256=dUcgRJrmhfcnnNGLN2bubqDgH_vQMFqlhoHWYgOgUts,39574 +apprise/utils/pgp.py,sha256=gJO4d7CDzL8URjwwHGXoNBY9MRFz5F38p_KokB8Zbrk,11489 +apprise/utils/singleton.py,sha256=lh3pt2NnnnGMPtX1Por3Cu7kSl1Gv6K1NzNpYGCrC5A,1844 +apprise/utils/templates.py,sha256=xh2le2hsAjs7u0DtpR60XHVqMETb09ElOKs2bzIAwlk,3252 diff --git a/libs/apprise-1.9.1.dist-info/REQUESTED b/libs/apprise-1.9.2.dist-info/REQUESTED similarity index 100% rename from libs/apprise-1.9.1.dist-info/REQUESTED rename to libs/apprise-1.9.2.dist-info/REQUESTED diff --git a/libs/apprise-1.9.1.dist-info/WHEEL b/libs/apprise-1.9.2.dist-info/WHEEL similarity index 100% rename from libs/apprise-1.9.1.dist-info/WHEEL rename to libs/apprise-1.9.2.dist-info/WHEEL diff --git a/libs/apprise-1.9.1.dist-info/entry_points.txt b/libs/apprise-1.9.2.dist-info/entry_points.txt similarity index 100% rename from libs/apprise-1.9.1.dist-info/entry_points.txt rename to libs/apprise-1.9.2.dist-info/entry_points.txt diff --git a/libs/apprise-1.9.1.dist-info/top_level.txt b/libs/apprise-1.9.2.dist-info/top_level.txt similarity index 100% rename from libs/apprise-1.9.1.dist-info/top_level.txt rename to libs/apprise-1.9.2.dist-info/top_level.txt diff --git a/libs/apprise/__init__.py b/libs/apprise/__init__.py index c231d5e3d..e9f496539 100644 --- a/libs/apprise/__init__.py +++ b/libs/apprise/__init__.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -27,10 +27,10 @@ # POSSIBILITY OF SUCH DAMAGE. __title__ = 'Apprise' -__version__ = '1.9.1' +__version__ = '1.9.2' __author__ = 'Chris Caron' -__license__ = 'BSD' -__copywrite__ = 'Copyright (C) 2024 Chris Caron <lead2gold@gmail.com>' +__license__ = 'BSD 2-Clause' +__copywrite__ = 'Copyright (C) 2025 Chris Caron <lead2gold@gmail.com>' __email__ = 'lead2gold@gmail.com' __status__ = 'Production' diff --git a/libs/apprise/apprise.py b/libs/apprise/apprise.py index 16125009a..9af55b5fa 100644 --- a/libs/apprise/apprise.py +++ b/libs/apprise/apprise.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/apprise_attachment.py b/libs/apprise/apprise_attachment.py index 7b491eef1..855b42d44 100644 --- a/libs/apprise/apprise_attachment.py +++ b/libs/apprise/apprise_attachment.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/apprise_config.py b/libs/apprise/apprise_config.py index c96b69f24..5262b5be4 100644 --- a/libs/apprise/apprise_config.py +++ b/libs/apprise/apprise_config.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/asset.py b/libs/apprise/asset.py index d952e9415..aef90f08f 100644 --- a/libs/apprise/asset.py +++ b/libs/apprise/asset.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/attachment/__init__.py b/libs/apprise/attachment/__init__.py index c2aef1eec..1f09941dc 100644 --- a/libs/apprise/attachment/__init__.py +++ b/libs/apprise/attachment/__init__.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/attachment/base.py b/libs/apprise/attachment/base.py index b3743e036..0161cab08 100644 --- a/libs/apprise/attachment/base.py +++ b/libs/apprise/attachment/base.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/attachment/file.py b/libs/apprise/attachment/file.py index f0aeb72b6..20f01ce40 100644 --- a/libs/apprise/attachment/file.py +++ b/libs/apprise/attachment/file.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/attachment/http.py b/libs/apprise/attachment/http.py index 870f7cc2b..0c7ccc5db 100644 --- a/libs/apprise/attachment/http.py +++ b/libs/apprise/attachment/http.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/attachment/memory.py b/libs/apprise/attachment/memory.py index c7d5dca24..fe6e33fce 100644 --- a/libs/apprise/attachment/memory.py +++ b/libs/apprise/attachment/memory.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/cli.py b/libs/apprise/cli.py index 4072a645b..121fc95f4 100644 --- a/libs/apprise/cli.py +++ b/libs/apprise/cli.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -311,7 +311,7 @@ def format_help(self, ctx, formatter): else: # pragma: no cover # Note: no branch is set intentionally since this is not - # tested since in 2024.08.13 when this was set up + # tested since in 2025.08.13 when this was set up # it never entered this area of the code. But we # know it works because we repeat this process with # our sub-options below diff --git a/libs/apprise/common.py b/libs/apprise/common.py index a8e9cd34e..9b8e993c2 100644 --- a/libs/apprise/common.py +++ b/libs/apprise/common.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/config/__init__.py b/libs/apprise/config/__init__.py index 24957e88e..edcc55079 100644 --- a/libs/apprise/config/__init__.py +++ b/libs/apprise/config/__init__.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/config/base.py b/libs/apprise/config/base.py index 03a4423a9..5aa64312b 100644 --- a/libs/apprise/config/base.py +++ b/libs/apprise/config/base.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/config/file.py b/libs/apprise/config/file.py index 89224e2ea..3edd6d9a9 100644 --- a/libs/apprise/config/file.py +++ b/libs/apprise/config/file.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/config/http.py b/libs/apprise/config/http.py index 2e2ba299b..b9c83510a 100644 --- a/libs/apprise/config/http.py +++ b/libs/apprise/config/http.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/config/memory.py b/libs/apprise/config/memory.py index 181d76236..b2d70096e 100644 --- a/libs/apprise/config/memory.py +++ b/libs/apprise/config/memory.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/conversion.py b/libs/apprise/conversion.py index 366fe8e3e..7f691eae4 100644 --- a/libs/apprise/conversion.py +++ b/libs/apprise/conversion.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/decorators/__init__.py b/libs/apprise/decorators/__init__.py index db9a15a01..bba1b3b06 100644 --- a/libs/apprise/decorators/__init__.py +++ b/libs/apprise/decorators/__init__.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/decorators/base.py b/libs/apprise/decorators/base.py index e7cf7b666..82b90f18d 100644 --- a/libs/apprise/decorators/base.py +++ b/libs/apprise/decorators/base.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/decorators/notify.py b/libs/apprise/decorators/notify.py index 892c3adfe..41e49de85 100644 --- a/libs/apprise/decorators/notify.py +++ b/libs/apprise/decorators/notify.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/emojis.py b/libs/apprise/emojis.py index d8a824813..6b9f2dec0 100644 --- a/libs/apprise/emojis.py +++ b/libs/apprise/emojis.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/exception.py b/libs/apprise/exception.py index a11f28248..216e5cc74 100644 --- a/libs/apprise/exception.py +++ b/libs/apprise/exception.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/locale.py b/libs/apprise/locale.py index e900ce5bc..f113cf560 100644 --- a/libs/apprise/locale.py +++ b/libs/apprise/locale.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/logger.py b/libs/apprise/logger.py index d9efe47c9..c8c9d6710 100644 --- a/libs/apprise/logger.py +++ b/libs/apprise/logger.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/manager.py b/libs/apprise/manager.py index afc9c1a32..d44357be4 100644 --- a/libs/apprise/manager.py +++ b/libs/apprise/manager.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/manager_attachment.py b/libs/apprise/manager_attachment.py index d1288a943..ffd31ebc9 100644 --- a/libs/apprise/manager_attachment.py +++ b/libs/apprise/manager_attachment.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/manager_config.py b/libs/apprise/manager_config.py index 69a6bedb9..d7b0fe083 100644 --- a/libs/apprise/manager_config.py +++ b/libs/apprise/manager_config.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/manager_plugins.py b/libs/apprise/manager_plugins.py index 74ed370ea..0eb5465e7 100644 --- a/libs/apprise/manager_plugins.py +++ b/libs/apprise/manager_plugins.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/persistent_store.py b/libs/apprise/persistent_store.py index 6151beb5e..8299d6f45 100644 --- a/libs/apprise/persistent_store.py +++ b/libs/apprise/persistent_store.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2024 Chris Caron <lead2gold@gmail.com> +# Copyright (C) 2025 Chris Caron <lead2gold@gmail.com> # All rights reserved. # # This code is licensed under the MIT License. diff --git a/libs/apprise/plugins/__init__.py b/libs/apprise/plugins/__init__.py index 62ddeaa5f..87c840e20 100644 --- a/libs/apprise/plugins/__init__.py +++ b/libs/apprise/plugins/__init__.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/africas_talking.py b/libs/apprise/plugins/africas_talking.py index 98b2a208e..597587648 100644 --- a/libs/apprise/plugins/africas_talking.py +++ b/libs/apprise/plugins/africas_talking.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/apprise_api.py b/libs/apprise/plugins/apprise_api.py index bd1177930..a26162036 100644 --- a/libs/apprise/plugins/apprise_api.py +++ b/libs/apprise/plugins/apprise_api.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/aprs.py b/libs/apprise/plugins/aprs.py index d3c9dc1a2..bf50af9bb 100644 --- a/libs/apprise/plugins/aprs.py +++ b/libs/apprise/plugins/aprs.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/bark.py b/libs/apprise/plugins/bark.py index 0e415a290..0122598d4 100644 --- a/libs/apprise/plugins/bark.py +++ b/libs/apprise/plugins/bark.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/base.py b/libs/apprise/plugins/base.py index b7f774423..a50cdf071 100644 --- a/libs/apprise/plugins/base.py +++ b/libs/apprise/plugins/base.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/bulksms.py b/libs/apprise/plugins/bulksms.py index ce0daef49..c5608fa68 100644 --- a/libs/apprise/plugins/bulksms.py +++ b/libs/apprise/plugins/bulksms.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/bulkvs.py b/libs/apprise/plugins/bulkvs.py index 14a1369ed..835887a90 100644 --- a/libs/apprise/plugins/bulkvs.py +++ b/libs/apprise/plugins/bulkvs.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/burstsms.py b/libs/apprise/plugins/burstsms.py index 898f98641..0cebddabb 100644 --- a/libs/apprise/plugins/burstsms.py +++ b/libs/apprise/plugins/burstsms.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/chantify.py b/libs/apprise/plugins/chanify.py similarity index 86% rename from libs/apprise/plugins/chantify.py rename to libs/apprise/plugins/chanify.py index e9be66161..caf314942 100644 --- a/libs/apprise/plugins/chantify.py +++ b/libs/apprise/plugins/chanify.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -26,7 +26,7 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -# Chantify +# Chanify # 1. Visit https://chanify.net/ # The API URL will look something like this: @@ -41,22 +41,22 @@ from ..locale import gettext_lazy as _ -class NotifyChantify(NotifyBase): +class NotifyChanify(NotifyBase): """ - A wrapper for Chantify Notifications + A wrapper for Chanify Notifications """ # The default descriptive name associated with the Notification - service_name = _('Chantify') + service_name = _('Chanify') # The services URL service_url = 'https://chanify.net/' # The default secure protocol - secure_protocol = 'chantify' + secure_protocol = 'chanify' # A URL that takes you to the setup/help of the specific protocol - setup_url = 'https://github.com/caronc/apprise/wiki/Notify_chantify' + setup_url = 'https://github.com/caronc/apprise/wiki/Notify_chanify' # Notification URL notify_url = 'https://api.chanify.net/v1/sender/{token}/' @@ -91,14 +91,14 @@ class NotifyChantify(NotifyBase): def __init__(self, token, **kwargs): """ - Initialize Chantify Object + Initialize Chanify Object """ super().__init__(**kwargs) self.token = validate_regex( token, *self.template_tokens['token']['regex']) if not self.token: - msg = 'The Chantify token specified ({}) is invalid.'\ + msg = 'The Chanify token specified ({}) is invalid.'\ .format(token) self.logger.warning(msg) raise TypeError(msg) @@ -121,9 +121,9 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): 'text': body } - self.logger.debug('Chantify GET URL: %s (cert_verify=%r)' % ( + self.logger.debug('Chanify GET URL: %s (cert_verify=%r)' % ( self.notify_url, self.verify_certificate)) - self.logger.debug('Chantify Payload: %s' % str(payload)) + self.logger.debug('Chanify Payload: %s' % str(payload)) # Always call throttle before any remote server i/o is made self.throttle() @@ -139,10 +139,10 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): if r.status_code != requests.codes.ok: # We had a problem status_str = \ - NotifyChantify.http_response_code_lookup(r.status_code) + NotifyChanify.http_response_code_lookup(r.status_code) self.logger.warning( - 'Failed to send Chantify notification: ' + 'Failed to send Chanify notification: ' '{}{}error={}.'.format( status_str, ', ' if status_str else '', @@ -154,11 +154,11 @@ def send(self, body, title='', notify_type=NotifyType.INFO, **kwargs): return False else: - self.logger.info('Sent Chantify notification.') + self.logger.info('Sent Chanify notification.') except requests.RequestException as e: self.logger.warning( - 'A Connection error occurred sending Chantify ' + 'A Connection error occurred sending Chanify ' 'notification.') self.logger.debug('Socket Exception: %s' % str(e)) @@ -178,7 +178,7 @@ def url(self, privacy=False, *args, **kwargs): return '{schema}://{token}/?{params}'.format( schema=self.secure_protocol, token=self.pprint(self.token, privacy, safe=''), - params=NotifyChantify.urlencode(params), + params=NotifyChanify.urlencode(params), ) @property @@ -207,9 +207,9 @@ def parse_url(url): # Allow over-ride if 'token' in results['qsd'] and len(results['qsd']['token']): - results['token'] = NotifyChantify.unquote(results['qsd']['token']) + results['token'] = NotifyChanify.unquote(results['qsd']['token']) else: - results['token'] = NotifyChantify.unquote(results['host']) + results['token'] = NotifyChanify.unquote(results['host']) return results diff --git a/libs/apprise/plugins/clicksend.py b/libs/apprise/plugins/clicksend.py index 92a2405e0..f37bd283a 100644 --- a/libs/apprise/plugins/clicksend.py +++ b/libs/apprise/plugins/clicksend.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/custom_form.py b/libs/apprise/plugins/custom_form.py index e9ffcbbb4..0a1ef96a4 100644 --- a/libs/apprise/plugins/custom_form.py +++ b/libs/apprise/plugins/custom_form.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/custom_json.py b/libs/apprise/plugins/custom_json.py index 03585c9ef..bd232f6e9 100644 --- a/libs/apprise/plugins/custom_json.py +++ b/libs/apprise/plugins/custom_json.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/custom_xml.py b/libs/apprise/plugins/custom_xml.py index 8bfff3ece..ba062f110 100644 --- a/libs/apprise/plugins/custom_xml.py +++ b/libs/apprise/plugins/custom_xml.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/d7networks.py b/libs/apprise/plugins/d7networks.py index 8b35458d5..cdc7e815e 100644 --- a/libs/apprise/plugins/d7networks.py +++ b/libs/apprise/plugins/d7networks.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/dapnet.py b/libs/apprise/plugins/dapnet.py index 2d25759eb..f117095c8 100644 --- a/libs/apprise/plugins/dapnet.py +++ b/libs/apprise/plugins/dapnet.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/dbus.py b/libs/apprise/plugins/dbus.py index 5d99c7e0e..31aa9210f 100644 --- a/libs/apprise/plugins/dbus.py +++ b/libs/apprise/plugins/dbus.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/dingtalk.py b/libs/apprise/plugins/dingtalk.py index 2380d2e0a..84de85db0 100644 --- a/libs/apprise/plugins/dingtalk.py +++ b/libs/apprise/plugins/dingtalk.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/discord.py b/libs/apprise/plugins/discord.py index d2eb7541d..14974cb87 100644 --- a/libs/apprise/plugins/discord.py +++ b/libs/apprise/plugins/discord.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -596,15 +596,21 @@ def url(self, privacy=False, *args, **kwargs): if self.thread_id: params['thread'] = self.thread_id + # Ensure our botname is set + botname = f'{self.user}@' if self.user else '' + # Extend our parameters params.update(self.url_parameters(privacy=privacy, *args, **kwargs)) - return '{schema}://{webhook_id}/{webhook_token}/?{params}'.format( - schema=self.secure_protocol, - webhook_id=self.pprint(self.webhook_id, privacy, safe=''), - webhook_token=self.pprint(self.webhook_token, privacy, safe=''), - params=NotifyDiscord.urlencode(params), - ) + return '{schema}://{botname}{webhook_id}/{webhook_token}/?{params}' \ + .format( + schema=self.secure_protocol, + botname=botname, + webhook_id=self.pprint(self.webhook_id, privacy, safe=''), + webhook_token=self.pprint( + self.webhook_token, privacy, safe=''), + params=NotifyDiscord.urlencode(params), + ) @property def url_identifier(self): @@ -668,6 +674,11 @@ def parse_url(url): results['include_image'] = parse_bool(results['qsd'].get( 'image', NotifyDiscord.template_args['image']['default'])) + if 'botname' in results['qsd']: + # Alias to User + results['user'] = \ + NotifyDiscord.unquote(results['qsd']['botname']) + # Extract avatar url if it was specified if 'avatar_url' in results['qsd']: results['avatar_url'] = \ diff --git a/libs/apprise/plugins/email/__init__.py b/libs/apprise/plugins/email/__init__.py index 31afabcab..d2d7e6be7 100644 --- a/libs/apprise/plugins/email/__init__.py +++ b/libs/apprise/plugins/email/__init__.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/email/base.py b/libs/apprise/plugins/email/base.py index 7f29fa26c..ce89cb3d7 100644 --- a/libs/apprise/plugins/email/base.py +++ b/libs/apprise/plugins/email/base.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/email/common.py b/libs/apprise/plugins/email/common.py index f14ef8811..e6a29deb8 100644 --- a/libs/apprise/plugins/email/common.py +++ b/libs/apprise/plugins/email/common.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/email/templates.py b/libs/apprise/plugins/email/templates.py index 0d87ff95a..ac3135736 100644 --- a/libs/apprise/plugins/email/templates.py +++ b/libs/apprise/plugins/email/templates.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/emby.py b/libs/apprise/plugins/emby.py index 23d781ab9..479eaf23f 100644 --- a/libs/apprise/plugins/emby.py +++ b/libs/apprise/plugins/emby.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/enigma2.py b/libs/apprise/plugins/enigma2.py index a79d3b57e..0c3df9874 100644 --- a/libs/apprise/plugins/enigma2.py +++ b/libs/apprise/plugins/enigma2.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/fcm/__init__.py b/libs/apprise/plugins/fcm/__init__.py index b04d7c372..de6ede07a 100644 --- a/libs/apprise/plugins/fcm/__init__.py +++ b/libs/apprise/plugins/fcm/__init__.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/fcm/color.py b/libs/apprise/plugins/fcm/color.py index 5d646599f..1904330a2 100644 --- a/libs/apprise/plugins/fcm/color.py +++ b/libs/apprise/plugins/fcm/color.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/fcm/common.py b/libs/apprise/plugins/fcm/common.py index 9f139226a..18560680d 100644 --- a/libs/apprise/plugins/fcm/common.py +++ b/libs/apprise/plugins/fcm/common.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/fcm/oauth.py b/libs/apprise/plugins/fcm/oauth.py index fbde3ccf7..444c7d237 100644 --- a/libs/apprise/plugins/fcm/oauth.py +++ b/libs/apprise/plugins/fcm/oauth.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/fcm/priority.py b/libs/apprise/plugins/fcm/priority.py index 8564d3460..2768d396f 100644 --- a/libs/apprise/plugins/fcm/priority.py +++ b/libs/apprise/plugins/fcm/priority.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/feishu.py b/libs/apprise/plugins/feishu.py index db9bc4cd6..0e75bec2c 100644 --- a/libs/apprise/plugins/feishu.py +++ b/libs/apprise/plugins/feishu.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/flock.py b/libs/apprise/plugins/flock.py index 2cbac98b8..223648e1d 100644 --- a/libs/apprise/plugins/flock.py +++ b/libs/apprise/plugins/flock.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/freemobile.py b/libs/apprise/plugins/freemobile.py index 5208d5664..827c837fd 100644 --- a/libs/apprise/plugins/freemobile.py +++ b/libs/apprise/plugins/freemobile.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/gnome.py b/libs/apprise/plugins/gnome.py index 2d5aab432..ae148aefa 100644 --- a/libs/apprise/plugins/gnome.py +++ b/libs/apprise/plugins/gnome.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/google_chat.py b/libs/apprise/plugins/google_chat.py index 4bada830c..013fa6839 100644 --- a/libs/apprise/plugins/google_chat.py +++ b/libs/apprise/plugins/google_chat.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/gotify.py b/libs/apprise/plugins/gotify.py index c6ad8c751..c06333ffc 100644 --- a/libs/apprise/plugins/gotify.py +++ b/libs/apprise/plugins/gotify.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/growl.py b/libs/apprise/plugins/growl.py index 9ecd6a4b6..7cca60dc5 100644 --- a/libs/apprise/plugins/growl.py +++ b/libs/apprise/plugins/growl.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/guilded.py b/libs/apprise/plugins/guilded.py index 0ee07018e..29cd492bf 100644 --- a/libs/apprise/plugins/guilded.py +++ b/libs/apprise/plugins/guilded.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/home_assistant.py b/libs/apprise/plugins/home_assistant.py index b3f2bb72a..c580e04ed 100644 --- a/libs/apprise/plugins/home_assistant.py +++ b/libs/apprise/plugins/home_assistant.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/httpsms.py b/libs/apprise/plugins/httpsms.py index 55fac8570..959258027 100644 --- a/libs/apprise/plugins/httpsms.py +++ b/libs/apprise/plugins/httpsms.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/ifttt.py b/libs/apprise/plugins/ifttt.py index b791a2c51..e169fb39e 100644 --- a/libs/apprise/plugins/ifttt.py +++ b/libs/apprise/plugins/ifttt.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/join.py b/libs/apprise/plugins/join.py index 6a3489daf..35d851875 100644 --- a/libs/apprise/plugins/join.py +++ b/libs/apprise/plugins/join.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/kavenegar.py b/libs/apprise/plugins/kavenegar.py index cff4b0a0c..bab3584f9 100644 --- a/libs/apprise/plugins/kavenegar.py +++ b/libs/apprise/plugins/kavenegar.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/kumulos.py b/libs/apprise/plugins/kumulos.py index cea7ed0eb..8d50ecc17 100644 --- a/libs/apprise/plugins/kumulos.py +++ b/libs/apprise/plugins/kumulos.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/lametric.py b/libs/apprise/plugins/lametric.py index cab3b4484..73888410d 100644 --- a/libs/apprise/plugins/lametric.py +++ b/libs/apprise/plugins/lametric.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/line.py b/libs/apprise/plugins/line.py index fae90a2fe..bcca3e13c 100644 --- a/libs/apprise/plugins/line.py +++ b/libs/apprise/plugins/line.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/lunasea.py b/libs/apprise/plugins/lunasea.py index db14f06f7..09a7ab541 100644 --- a/libs/apprise/plugins/lunasea.py +++ b/libs/apprise/plugins/lunasea.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/macosx.py b/libs/apprise/plugins/macosx.py index e30414cbe..6107d33e7 100644 --- a/libs/apprise/plugins/macosx.py +++ b/libs/apprise/plugins/macosx.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/mailgun.py b/libs/apprise/plugins/mailgun.py index 682f19e42..a7d5258e3 100644 --- a/libs/apprise/plugins/mailgun.py +++ b/libs/apprise/plugins/mailgun.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/mastodon.py b/libs/apprise/plugins/mastodon.py index 955835b19..5206fd371 100644 --- a/libs/apprise/plugins/mastodon.py +++ b/libs/apprise/plugins/mastodon.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/matrix.py b/libs/apprise/plugins/matrix.py index 552bfba66..ffc4e3e9c 100644 --- a/libs/apprise/plugins/matrix.py +++ b/libs/apprise/plugins/matrix.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/mattermost.py b/libs/apprise/plugins/mattermost.py index e2f82612e..bf2bd171d 100644 --- a/libs/apprise/plugins/mattermost.py +++ b/libs/apprise/plugins/mattermost.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/messagebird.py b/libs/apprise/plugins/messagebird.py index 661ee1c4e..62be76aba 100644 --- a/libs/apprise/plugins/messagebird.py +++ b/libs/apprise/plugins/messagebird.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/misskey.py b/libs/apprise/plugins/misskey.py index cd7292c46..6a9090261 100644 --- a/libs/apprise/plugins/misskey.py +++ b/libs/apprise/plugins/misskey.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/mqtt.py b/libs/apprise/plugins/mqtt.py index bb003cdd9..a48295f3a 100644 --- a/libs/apprise/plugins/mqtt.py +++ b/libs/apprise/plugins/mqtt.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/msg91.py b/libs/apprise/plugins/msg91.py index 694ae9867..5b3cc46bb 100644 --- a/libs/apprise/plugins/msg91.py +++ b/libs/apprise/plugins/msg91.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/msteams.py b/libs/apprise/plugins/msteams.py index fa0f13307..ce3b90c46 100644 --- a/libs/apprise/plugins/msteams.py +++ b/libs/apprise/plugins/msteams.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -309,7 +309,7 @@ def __init__(self, token_a, token_b, token_c, token_d=None, team=None, self.logger.deprecate( "Microsoft is deprecating their MSTeams webhooks on " - "December 31, 2024. It is advised that you switch to " + "December 31, 2025. It is advised that you switch to " "Microsoft Power Automate (already supported by Apprise as " "workflows://. For more information visit: " "https://github.com/caronc/apprise/wiki/Notify_workflows") diff --git a/libs/apprise/plugins/nextcloud.py b/libs/apprise/plugins/nextcloud.py index a0f28aff4..1e86585fe 100644 --- a/libs/apprise/plugins/nextcloud.py +++ b/libs/apprise/plugins/nextcloud.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/nextcloudtalk.py b/libs/apprise/plugins/nextcloudtalk.py index 9c72be500..3d5fc4d53 100644 --- a/libs/apprise/plugins/nextcloudtalk.py +++ b/libs/apprise/plugins/nextcloudtalk.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/notica.py b/libs/apprise/plugins/notica.py index e08f48568..7e860ca07 100644 --- a/libs/apprise/plugins/notica.py +++ b/libs/apprise/plugins/notica.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/notifiarr.py b/libs/apprise/plugins/notifiarr.py index ffb29b361..cd01a53f2 100644 --- a/libs/apprise/plugins/notifiarr.py +++ b/libs/apprise/plugins/notifiarr.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/notifico.py b/libs/apprise/plugins/notifico.py index b343d4331..df7088ce3 100644 --- a/libs/apprise/plugins/notifico.py +++ b/libs/apprise/plugins/notifico.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/ntfy.py b/libs/apprise/plugins/ntfy.py index 8ad5c70dc..58d8db6dc 100644 --- a/libs/apprise/plugins/ntfy.py +++ b/libs/apprise/plugins/ntfy.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/office365.py b/libs/apprise/plugins/office365.py index 2f0f4ca88..c0069f919 100644 --- a/libs/apprise/plugins/office365.py +++ b/libs/apprise/plugins/office365.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -92,7 +92,7 @@ class NotifyOffice365(NotifyBase): # uploaded inline with the current email going out (one http post) # Anything larger than this and a second PUT request is required to # the outlook server to post the content through reference. - # Currently (as of 2024.10.06) this was documented to be 3MB + # Currently (as of 2025.10.06) this was documented to be 3MB outlook_attachment_inline_max = 3145728 # Use all the direct application permissions you have configured for your diff --git a/libs/apprise/plugins/one_signal.py b/libs/apprise/plugins/one_signal.py index faebdf66c..b32899cec 100644 --- a/libs/apprise/plugins/one_signal.py +++ b/libs/apprise/plugins/one_signal.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/opsgenie.py b/libs/apprise/plugins/opsgenie.py index 1c4c3b244..013c1ded5 100644 --- a/libs/apprise/plugins/opsgenie.py +++ b/libs/apprise/plugins/opsgenie.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pagerduty.py b/libs/apprise/plugins/pagerduty.py index 3c876e2be..054fab9c0 100644 --- a/libs/apprise/plugins/pagerduty.py +++ b/libs/apprise/plugins/pagerduty.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pagertree.py b/libs/apprise/plugins/pagertree.py index 57434f61f..faca547da 100644 --- a/libs/apprise/plugins/pagertree.py +++ b/libs/apprise/plugins/pagertree.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/parseplatform.py b/libs/apprise/plugins/parseplatform.py index f6a6248d7..d5f0b22b3 100644 --- a/libs/apprise/plugins/parseplatform.py +++ b/libs/apprise/plugins/parseplatform.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/popcorn_notify.py b/libs/apprise/plugins/popcorn_notify.py index d0fc4a665..3318a554e 100644 --- a/libs/apprise/plugins/popcorn_notify.py +++ b/libs/apprise/plugins/popcorn_notify.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/prowl.py b/libs/apprise/plugins/prowl.py index e0e9bd4df..358cdb3ee 100644 --- a/libs/apprise/plugins/prowl.py +++ b/libs/apprise/plugins/prowl.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pushbullet.py b/libs/apprise/plugins/pushbullet.py index f017c36ce..ee0bcf7f7 100644 --- a/libs/apprise/plugins/pushbullet.py +++ b/libs/apprise/plugins/pushbullet.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pushdeer.py b/libs/apprise/plugins/pushdeer.py index d71a15faa..26bf9b881 100644 --- a/libs/apprise/plugins/pushdeer.py +++ b/libs/apprise/plugins/pushdeer.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pushed.py b/libs/apprise/plugins/pushed.py index 205c8b4ba..c7646a091 100644 --- a/libs/apprise/plugins/pushed.py +++ b/libs/apprise/plugins/pushed.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pushjet.py b/libs/apprise/plugins/pushjet.py index d8a38f470..54d381eee 100644 --- a/libs/apprise/plugins/pushjet.py +++ b/libs/apprise/plugins/pushjet.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pushme.py b/libs/apprise/plugins/pushme.py index 384b557f5..6799a2873 100644 --- a/libs/apprise/plugins/pushme.py +++ b/libs/apprise/plugins/pushme.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pushover.py b/libs/apprise/plugins/pushover.py index c8fcb58f5..b51c506a5 100644 --- a/libs/apprise/plugins/pushover.py +++ b/libs/apprise/plugins/pushover.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pushsafer.py b/libs/apprise/plugins/pushsafer.py index cd7999a06..12717b662 100644 --- a/libs/apprise/plugins/pushsafer.py +++ b/libs/apprise/plugins/pushsafer.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/pushy.py b/libs/apprise/plugins/pushy.py index 10517a7cc..21cc5e4bd 100644 --- a/libs/apprise/plugins/pushy.py +++ b/libs/apprise/plugins/pushy.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/reddit.py b/libs/apprise/plugins/reddit.py index 73a93144f..213376132 100644 --- a/libs/apprise/plugins/reddit.py +++ b/libs/apprise/plugins/reddit.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/revolt.py b/libs/apprise/plugins/revolt.py index ebafbf5ab..59836a38f 100644 --- a/libs/apprise/plugins/revolt.py +++ b/libs/apprise/plugins/revolt.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/rocketchat.py b/libs/apprise/plugins/rocketchat.py index 1c0049d3e..35e167834 100644 --- a/libs/apprise/plugins/rocketchat.py +++ b/libs/apprise/plugins/rocketchat.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/rsyslog.py b/libs/apprise/plugins/rsyslog.py index 530cf51e8..cadf11cc7 100644 --- a/libs/apprise/plugins/rsyslog.py +++ b/libs/apprise/plugins/rsyslog.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/ryver.py b/libs/apprise/plugins/ryver.py index ae003f439..a23059b60 100644 --- a/libs/apprise/plugins/ryver.py +++ b/libs/apprise/plugins/ryver.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/sendgrid.py b/libs/apprise/plugins/sendgrid.py index 65d71044b..f02a326d8 100644 --- a/libs/apprise/plugins/sendgrid.py +++ b/libs/apprise/plugins/sendgrid.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/serverchan.py b/libs/apprise/plugins/serverchan.py index b62280316..252f58e7b 100644 --- a/libs/apprise/plugins/serverchan.py +++ b/libs/apprise/plugins/serverchan.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/ses.py b/libs/apprise/plugins/ses.py index 5292650a1..00c890c52 100644 --- a/libs/apprise/plugins/ses.py +++ b/libs/apprise/plugins/ses.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/seven.py b/libs/apprise/plugins/seven.py index 2977448f5..2536647f4 100644 --- a/libs/apprise/plugins/seven.py +++ b/libs/apprise/plugins/seven.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/sfr.py b/libs/apprise/plugins/sfr.py index 9a0181afa..2c8e7ece2 100644 --- a/libs/apprise/plugins/sfr.py +++ b/libs/apprise/plugins/sfr.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/signal_api.py b/libs/apprise/plugins/signal_api.py index 72c340f06..92860d0d6 100644 --- a/libs/apprise/plugins/signal_api.py +++ b/libs/apprise/plugins/signal_api.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/simplepush.py b/libs/apprise/plugins/simplepush.py index 3c269a9af..343621841 100644 --- a/libs/apprise/plugins/simplepush.py +++ b/libs/apprise/plugins/simplepush.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/sinch.py b/libs/apprise/plugins/sinch.py index bc267afb2..6a07c0b40 100644 --- a/libs/apprise/plugins/sinch.py +++ b/libs/apprise/plugins/sinch.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/slack.py b/libs/apprise/plugins/slack.py index afe5a2596..9fa6092e0 100644 --- a/libs/apprise/plugins/slack.py +++ b/libs/apprise/plugins/slack.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/smseagle.py b/libs/apprise/plugins/smseagle.py index 65ff0ffcc..6c545674c 100644 --- a/libs/apprise/plugins/smseagle.py +++ b/libs/apprise/plugins/smseagle.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/smsmanager.py b/libs/apprise/plugins/smsmanager.py index fb8ab068b..16bf130fc 100644 --- a/libs/apprise/plugins/smsmanager.py +++ b/libs/apprise/plugins/smsmanager.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/smtp2go.py b/libs/apprise/plugins/smtp2go.py index 1c5919030..23b31bfd9 100644 --- a/libs/apprise/plugins/smtp2go.py +++ b/libs/apprise/plugins/smtp2go.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/sns.py b/libs/apprise/plugins/sns.py index bd5444920..bdea2b4df 100644 --- a/libs/apprise/plugins/sns.py +++ b/libs/apprise/plugins/sns.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/sparkpost.py b/libs/apprise/plugins/sparkpost.py index 8c34c1d2b..039942fb9 100644 --- a/libs/apprise/plugins/sparkpost.py +++ b/libs/apprise/plugins/sparkpost.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/splunk.py b/libs/apprise/plugins/splunk.py index 3379bcfb5..d9374255b 100644 --- a/libs/apprise/plugins/splunk.py +++ b/libs/apprise/plugins/splunk.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/streamlabs.py b/libs/apprise/plugins/streamlabs.py index 849437fba..49bbb5b95 100644 --- a/libs/apprise/plugins/streamlabs.py +++ b/libs/apprise/plugins/streamlabs.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/synology.py b/libs/apprise/plugins/synology.py index d29440b45..63161c52a 100644 --- a/libs/apprise/plugins/synology.py +++ b/libs/apprise/plugins/synology.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/syslog.py b/libs/apprise/plugins/syslog.py index df0a31db7..fc6af06ae 100644 --- a/libs/apprise/plugins/syslog.py +++ b/libs/apprise/plugins/syslog.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/techuluspush.py b/libs/apprise/plugins/techuluspush.py index 6d0f45d4d..61b31105c 100644 --- a/libs/apprise/plugins/techuluspush.py +++ b/libs/apprise/plugins/techuluspush.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/telegram.py b/libs/apprise/plugins/telegram.py index 30429ca36..d6c29aeba 100644 --- a/libs/apprise/plugins/telegram.py +++ b/libs/apprise/plugins/telegram.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/threema.py b/libs/apprise/plugins/threema.py index 8639c5caa..9230ddb07 100644 --- a/libs/apprise/plugins/threema.py +++ b/libs/apprise/plugins/threema.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/twilio.py b/libs/apprise/plugins/twilio.py index e6a9bcd96..42daa1fba 100644 --- a/libs/apprise/plugins/twilio.py +++ b/libs/apprise/plugins/twilio.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/twist.py b/libs/apprise/plugins/twist.py index 1d5881ec5..9e7512fcb 100644 --- a/libs/apprise/plugins/twist.py +++ b/libs/apprise/plugins/twist.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/twitter.py b/libs/apprise/plugins/twitter.py index 497feba04..e16cedc1e 100644 --- a/libs/apprise/plugins/twitter.py +++ b/libs/apprise/plugins/twitter.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/voipms.py b/libs/apprise/plugins/voipms.py index b4624c484..bf3ce8319 100644 --- a/libs/apprise/plugins/voipms.py +++ b/libs/apprise/plugins/voipms.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/vonage.py b/libs/apprise/plugins/vonage.py index f57e80a8a..58989280c 100644 --- a/libs/apprise/plugins/vonage.py +++ b/libs/apprise/plugins/vonage.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/webexteams.py b/libs/apprise/plugins/webexteams.py index bc75378b6..39d40262c 100644 --- a/libs/apprise/plugins/webexteams.py +++ b/libs/apprise/plugins/webexteams.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/wecombot.py b/libs/apprise/plugins/wecombot.py index ba639401c..957cad155 100644 --- a/libs/apprise/plugins/wecombot.py +++ b/libs/apprise/plugins/wecombot.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/whatsapp.py b/libs/apprise/plugins/whatsapp.py index 34f1be216..851ccb7d8 100644 --- a/libs/apprise/plugins/whatsapp.py +++ b/libs/apprise/plugins/whatsapp.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/windows.py b/libs/apprise/plugins/windows.py index a9621fdc3..dae1a7d2f 100644 --- a/libs/apprise/plugins/windows.py +++ b/libs/apprise/plugins/windows.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/workflows.py b/libs/apprise/plugins/workflows.py index 87b6b1b27..2ddc50e3b 100644 --- a/libs/apprise/plugins/workflows.py +++ b/libs/apprise/plugins/workflows.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/wxpusher.py b/libs/apprise/plugins/wxpusher.py index 96a571c42..aca528f7e 100644 --- a/libs/apprise/plugins/wxpusher.py +++ b/libs/apprise/plugins/wxpusher.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/xbmc.py b/libs/apprise/plugins/xbmc.py index 6b9a77961..8325cccd1 100644 --- a/libs/apprise/plugins/xbmc.py +++ b/libs/apprise/plugins/xbmc.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/plugins/zulip.py b/libs/apprise/plugins/zulip.py index be35d500a..cff2886a1 100644 --- a/libs/apprise/plugins/zulip.py +++ b/libs/apprise/plugins/zulip.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/url.py b/libs/apprise/url.py index ce8fa5116..f67af013e 100644 --- a/libs/apprise/url.py +++ b/libs/apprise/url.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/__init__.py b/libs/apprise/utils/__init__.py index e91e2fbb8..f176cbccc 100644 --- a/libs/apprise/utils/__init__.py +++ b/libs/apprise/utils/__init__.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/base64.py b/libs/apprise/utils/base64.py index 78e5427b9..e5a8a568a 100644 --- a/libs/apprise/utils/base64.py +++ b/libs/apprise/utils/base64.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/cwe312.py b/libs/apprise/utils/cwe312.py index 6a6f9e191..25eb4b1b0 100644 --- a/libs/apprise/utils/cwe312.py +++ b/libs/apprise/utils/cwe312.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/disk.py b/libs/apprise/utils/disk.py index 9d826aaa6..fd8855811 100644 --- a/libs/apprise/utils/disk.py +++ b/libs/apprise/utils/disk.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/logic.py b/libs/apprise/utils/logic.py index 4d560bdb0..0070cd3c2 100644 --- a/libs/apprise/utils/logic.py +++ b/libs/apprise/utils/logic.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/module.py b/libs/apprise/utils/module.py index 55a2904f3..a09756bec 100644 --- a/libs/apprise/utils/module.py +++ b/libs/apprise/utils/module.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/parse.py b/libs/apprise/utils/parse.py index 1d506d2ad..c1e612d66 100644 --- a/libs/apprise/utils/parse.py +++ b/libs/apprise/utils/parse.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -920,25 +920,31 @@ def parse_emails(*args, store_unparseable=True, **kwargs): return result -def url_assembly(**kwargs): +def url_assembly(encode=False, **kwargs): """ This function reverses the parse_url() function by taking in the provided result set and re-assembling a URL """ + def _no_encode(content, *args, **kwargs): + # dummy function that does nothing to content + return content + + _quote = quote if encode else _no_encode + # Determine Authentication auth = '' if kwargs.get('user') is not None and \ kwargs.get('password') is not None: auth = '{user}:{password}@'.format( - user=quote(kwargs.get('user'), safe=''), - password=quote(kwargs.get('password'), safe=''), + user=_quote(kwargs.get('user'), safe=''), + password=_quote(kwargs.get('password'), safe=''), ) elif kwargs.get('user') is not None: auth = '{user}@'.format( - user=quote(kwargs.get('user'), safe=''), + user=_quote(kwargs.get('user'), safe=''), ) return '{schema}://{auth}{hostname}{port}{fullpath}{params}'.format( @@ -948,7 +954,7 @@ def url_assembly(**kwargs): hostname='' if not kwargs.get('host') else kwargs.get('host', ''), port='' if not kwargs.get('port') else ':{}'.format(kwargs.get('port')), - fullpath=quote(kwargs.get('fullpath', ''), safe='/'), + fullpath=_quote(kwargs.get('fullpath', ''), safe='/'), params='' if not kwargs.get('qsd') else '?{}'.format(urlencode(kwargs.get('qsd'))), ) diff --git a/libs/apprise/utils/pgp.py b/libs/apprise/utils/pgp.py index 504e38b15..5a2088172 100644 --- a/libs/apprise/utils/pgp.py +++ b/libs/apprise/utils/pgp.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/singleton.py b/libs/apprise/utils/singleton.py index 1151a292c..d3d6ee26b 100644 --- a/libs/apprise/utils/singleton.py +++ b/libs/apprise/utils/singleton.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/apprise/utils/templates.py b/libs/apprise/utils/templates.py index 5e259234d..8a630f491 100644 --- a/libs/apprise/utils/templates.py +++ b/libs/apprise/utils/templates.py @@ -2,7 +2,7 @@ # BSD 2-Clause License # # Apprise - Push Notification Library. -# Copyright (c) 2024, Chris Caron <lead2gold@gmail.com> +# Copyright (c) 2025, Chris Caron <lead2gold@gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/libs/engineio/socket.py b/libs/engineio/socket.py index 006a9b089..26bb94b51 100644 --- a/libs/engineio/socket.py +++ b/libs/engineio/socket.py @@ -250,6 +250,7 @@ def writer(): self.queue.put(None) # unlock the writer task so that it can exit writer_task.join() - self.close(wait=False, abort=True) + self.close(wait=False, abort=True, + reason=self.server.reason.TRANSPORT_CLOSE) return [] diff --git a/libs/flask_migrate/cli.py b/libs/flask_migrate/cli.py index 73a31ba6d..4fabece25 100644 --- a/libs/flask_migrate/cli.py +++ b/libs/flask_migrate/cli.py @@ -19,11 +19,14 @@ @click.group() +@click.option('-d', '--directory', default=None, + help=('Migration script directory (default is "migrations")')) @click.option('-x', '--x-arg', multiple=True, help='Additional arguments consumed by custom env.py scripts') @with_appcontext -def db(x_arg): +def db(directory, x_arg): """Perform database migrations.""" + g.directory = directory g.x_arg = x_arg # these will be picked up by Migrate.get_config() @@ -47,7 +50,7 @@ def list_templates(): @with_appcontext def init(directory, multidb, template, package): """Creates a new migration repository.""" - _init(directory, multidb, template, package) + _init(directory or g.directory, multidb, template, package) @db.command() @@ -76,8 +79,8 @@ def init(directory, multidb, template, package): def revision(directory, message, autogenerate, sql, head, splice, branch_label, version_path, rev_id): """Create a new revision file.""" - _revision(directory, message, autogenerate, sql, head, splice, - branch_label, version_path, rev_id) + _revision(directory or g.directory, message, autogenerate, sql, head, + splice, branch_label, version_path, rev_id) @db.command() @@ -106,8 +109,8 @@ def migrate(directory, message, sql, head, splice, branch_label, version_path, rev_id, x_arg): """Autogenerate a new revision file (Alias for 'revision --autogenerate')""" - _migrate(directory, message, sql, head, splice, branch_label, version_path, - rev_id, x_arg) + _migrate(directory or g.directory, message, sql, head, splice, + branch_label, version_path, rev_id, x_arg or g.x_arg) @db.command() @@ -117,7 +120,7 @@ def migrate(directory, message, sql, head, splice, branch_label, version_path, @with_appcontext def edit(directory, revision): """Edit a revision file""" - _edit(directory, revision) + _edit(directory or g.directory, revision) @db.command() @@ -133,7 +136,7 @@ def edit(directory, revision): @with_appcontext def merge(directory, message, branch_label, rev_id, revisions): """Merge two revisions together, creating a new revision file""" - _merge(directory, revisions, message, branch_label, rev_id) + _merge(directory or g.directory, revisions, message, branch_label, rev_id) @db.command() @@ -151,7 +154,7 @@ def merge(directory, message, branch_label, rev_id, revisions): @with_appcontext def upgrade(directory, sql, tag, x_arg, revision): """Upgrade to a later version""" - _upgrade(directory, revision, sql, tag, x_arg) + _upgrade(directory or g.directory, revision, sql, tag, x_arg or g.x_arg) @db.command() @@ -169,7 +172,7 @@ def upgrade(directory, sql, tag, x_arg, revision): @with_appcontext def downgrade(directory, sql, tag, x_arg, revision): """Revert to a previous version""" - _downgrade(directory, revision, sql, tag, x_arg) + _downgrade(directory or g.directory, revision, sql, tag, x_arg or g.x_arg) @db.command() @@ -179,7 +182,7 @@ def downgrade(directory, sql, tag, x_arg, revision): @with_appcontext def show(directory, revision): """Show the revision denoted by the given symbol.""" - _show(directory, revision) + _show(directory or g.directory, revision) @db.command() @@ -194,7 +197,7 @@ def show(directory, revision): @with_appcontext def history(directory, rev_range, verbose, indicate_current): """List changeset scripts in chronological order.""" - _history(directory, rev_range, verbose, indicate_current) + _history(directory or g.directory, rev_range, verbose, indicate_current) @db.command() @@ -206,7 +209,7 @@ def history(directory, rev_range, verbose, indicate_current): @with_appcontext def heads(directory, verbose, resolve_dependencies): """Show current available heads in the script directory""" - _heads(directory, verbose, resolve_dependencies) + _heads(directory or g.directory, verbose, resolve_dependencies) @db.command() @@ -216,7 +219,7 @@ def heads(directory, verbose, resolve_dependencies): @with_appcontext def branches(directory, verbose): """Show current branch points""" - _branches(directory, verbose) + _branches(directory or g.directory, verbose) @db.command() @@ -226,7 +229,7 @@ def branches(directory, verbose): @with_appcontext def current(directory, verbose): """Display the current revision for each database.""" - _current(directory, verbose) + _current(directory or g.directory, verbose) @db.command() @@ -246,7 +249,7 @@ def current(directory, verbose): def stamp(directory, sql, tag, revision, purge): """'stamp' the revision table with the given revision; don't run any migrations""" - _stamp(directory, revision, sql, tag, purge) + _stamp(directory or g.directory, revision, sql, tag, purge) @db.command() @@ -255,4 +258,4 @@ def stamp(directory, sql, tag, revision, purge): @with_appcontext def check(directory): """Check if there are any new operations to migrate""" - _check(directory) + _check(directory or g.directory) diff --git a/libs/importlib_resources-6.4.5.dist-info/RECORD b/libs/importlib_resources-6.4.5.dist-info/RECORD index cb14396a2..2883b0ad3 100644 --- a/libs/importlib_resources-6.4.5.dist-info/RECORD +++ b/libs/importlib_resources-6.4.5.dist-info/RECORD @@ -3,7 +3,7 @@ importlib_resources-6.4.5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6Ef importlib_resources-6.4.5.dist-info/METADATA,sha256=iwGfOzcc9jUBSuQa6zQeXla0el4YCZlAoj5uRIm7fyg,3975 importlib_resources-6.4.5.dist-info/RECORD,, importlib_resources-6.4.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -importlib_resources-6.4.5.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91 +importlib_resources-6.4.5.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 importlib_resources-6.4.5.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20 importlib_resources/__init__.py,sha256=3J-261Qqzg-1kBenMVsOsvJo19EbUmYqjHkrZWiFHOM,703 importlib_resources/_adapters.py,sha256=vprJGbUeHbajX6XCuMP6J3lMrqCi-P_MTlziJUR7jfk,4482 diff --git a/libs/importlib_resources-6.4.5.dist-info/WHEEL b/libs/importlib_resources-6.4.5.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/importlib_resources-6.4.5.dist-info/WHEEL +++ b/libs/importlib_resources-6.4.5.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/pygments-2.18.0.dist-info/RECORD b/libs/pygments-2.18.0.dist-info/RECORD deleted file mode 100644 index 272a1e436..000000000 --- a/libs/pygments-2.18.0.dist-info/RECORD +++ /dev/null @@ -1,336 +0,0 @@ -../../bin/pygmentize,sha256=iP3M-_dI6wQP1Gtg8ZvtFWFDy3x82yIJIrmsdlQpEe0,238 -pygments-2.18.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pygments-2.18.0.dist-info/METADATA,sha256=WWViMDj3GoEuYl9sIbkmA7zv0m0H5sJTUXUSeY73bs8,2461 -pygments-2.18.0.dist-info/RECORD,, -pygments-2.18.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pygments-2.18.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 -pygments-2.18.0.dist-info/entry_points.txt,sha256=uUXw-XhMKBEX4pWcCtpuTTnPhL3h7OEE2jWi51VQsa8,53 -pygments-2.18.0.dist-info/licenses/AUTHORS,sha256=REECiHykNMqFuqEk366APNvWe6irSUOqok67E3Evtzw,10500 -pygments-2.18.0.dist-info/licenses/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331 -pygments/__init__.py,sha256=d9try3r146jyYauE2BNZ8aJEYfsJlVdS9Bqv-fZZ5Pw,2959 -pygments/__main__.py,sha256=Wgnr5lhKPtecgPavxdwRzAAaZoe-fCuq6LAEBbBBXd0,348 -pygments/cmdline.py,sha256=smQpJmIeqyPQ_xZ3Z9-O5FYDxTfngGg8icWV3hIcIIk,23536 -pygments/console.py,sha256=yhP9UsLAVmWKVQf2446JJewkA7AiXeeTf4Ieg3Oi2fU,1718 -pygments/filter.py,sha256=_ADNPCskD8_GmodHi6_LoVgPU3Zh336aBCT5cOeTMs0,1910 -pygments/filters/__init__.py,sha256=IuhzMxGWWMN9tYBZuO2VD602_Ai24ONZXc1cDKtFHPk,40344 -pygments/formatter.py,sha256=oPaCNqrEy_aGBGt-7zwzm9KpYs6v5tyfCd5nua233D4,4366 -pygments/formatters/__init__.py,sha256=C8E9WC8QpfxpCQSarFf_3KTaz21xEzw5N4ETSiv15zE,5349 -pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 -pygments/formatters/bbcode.py,sha256=EG993T9F65-VaRmq39A3vbmX-x8DyQh1hN4nAzqV6xg,3296 -pygments/formatters/groff.py,sha256=kEt7COeP_Cy5lqWUTO7w31bMyx56cpKG9ZPkN4RSMy4,5082 -pygments/formatters/html.py,sha256=bUbdrazRL2ONmkHWw1m2e6DHEIzwvJUogfiL_YhQT-U,35633 -pygments/formatters/img.py,sha256=V5fZUT6SKFnLJAxen7zVJw12EyXJyyLuOsiObTaGKCQ,23263 -pygments/formatters/irc.py,sha256=z1fWHg4G4sS8OMqY2N9b4k7k8bzJaKTkxo7Me8JQZGI,4945 -pygments/formatters/latex.py,sha256=Y2Nqn6a_QDxrlRju4_SYLQywJVsGBRtsHJ8Sup1hA4A,19258 -pygments/formatters/other.py,sha256=V2hrUtWYSS_klWzx1-h03aTxTkeBS4LEiVqy9ByPlKg,4986 -pygments/formatters/pangomarkup.py,sha256=JtIpELl-WIaZeoTJhfLbR7SkXmOhAp6I66lfRTPlxOA,2206 -pygments/formatters/rtf.py,sha256=Ffx6wgAqXr8iy4DhUkRiZlNiZ5QCe39fxPFvFScCOQ0,11921 -pygments/formatters/svg.py,sha256=JCIpG3y9p83APRD0vOSGU6rdsukv9rbZr81QpMIQlMw,7138 -pygments/formatters/terminal.py,sha256=B7X3InVYlDu142nk2wUkJcDtbKMLT1PA-Tfk49UE0j8,4626 -pygments/formatters/terminal256.py,sha256=B8t9Y8WJTgO2LWBGMXcRz2VfKySHLR-ZhGNuGQnDn98,11717 -pygments/lexer.py,sha256=9WU0ZHRI3mmVGymUCTgdVYNM3RRPUo-x_ijCGD1r8ho,35109 -pygments/lexers/__init__.py,sha256=svzhbvkX4ny7I2ALRRxd1yKzfRaUaGrY2Z0wrCNnd74,12067 -pygments/lexers/_ada_builtins.py,sha256=hnh_MphEm4skkHsAGGlVSp9-IG1IvA-Kkkplc54-WPI,1543 -pygments/lexers/_asy_builtins.py,sha256=nwBhZjbOkPUFReF22JgCde_AR6oaUBr1TEwIJDgxtec,27287 -pygments/lexers/_cl_builtins.py,sha256=gwESyMaPG0eSdwgr9uNUuEMmjX43Z5Nav5z9pDGnhMA,13994 -pygments/lexers/_cocoa_builtins.py,sha256=wa8Z6xRSVHiETfxU2WOuY4O9VN9ogH8PoVw4IpnTIYA,105173 -pygments/lexers/_csound_builtins.py,sha256=vr4PKbi_2T5iSdWLfqARILPB0Z-Wc_CPGjNaHvQhySQ,18414 -pygments/lexers/_css_builtins.py,sha256=5O6M8QQQ5518sqLorWlafT_eoN6mIbkT6OogR7gAq6M,12446 -pygments/lexers/_julia_builtins.py,sha256=f_mAv1J9t-4kA85bUlf5iazlZrjBj8X39LMrg6bOBAc,11883 -pygments/lexers/_lasso_builtins.py,sha256=a7MYoYE1yAgwyl7pHFpSZazz6VQLRI5pLCV8nn1xcvk,134510 -pygments/lexers/_lilypond_builtins.py,sha256=HOmm1nxJwnJIMKJ0IcCdZeAWF1a2-g2_0_lmGbxqNmg,108094 -pygments/lexers/_lua_builtins.py,sha256=8EUwcejkeZ4CpFxSoo2DON1UwFnJhbYRpF7Q22xiQ-8,8108 -pygments/lexers/_luau_builtins.py,sha256=eX-OzjU9gT4gvoVwCttALJMZxk2repLtc7mqHY54xWs,955 -pygments/lexers/_mapping.py,sha256=nPWeLyQslZd_A4ehzIefyWxmvcaTtqSCW6RMb47m9Xs,69089 -pygments/lexers/_mql_builtins.py,sha256=_1MtbSYIUf4B1Yl9hGVm-N4jdj7lcxmx3yFoiWzO3vM,24713 -pygments/lexers/_mysql_builtins.py,sha256=A5OlN4LrN-Ig1rfsUoLAaS80B_vYTG4Fj9bwiq_qGuc,25838 -pygments/lexers/_openedge_builtins.py,sha256=fTAp0gK3PEBDg47Rrdygxql73_C-AdHg8EGJ_Ld8p0U,49398 -pygments/lexers/_php_builtins.py,sha256=MikQttLCEbHulmTMT1LzJpRhDzUvuzRl0Yh-iKYyn1M,107922 -pygments/lexers/_postgres_builtins.py,sha256=-e9B90henKpkQDqEQGkS0sIeKGlg-l5VdDPWuSw5TtY,13343 -pygments/lexers/_qlik_builtins.py,sha256=ccaWjko7s6PNJnthww0eksfBH4kkrYy1qkWSwA7wk6o,12595 -pygments/lexers/_scheme_builtins.py,sha256=uQVSWBP5oCjD6YoV37xY3Ep4ao8fIVd8oSBlqqBn0og,32564 -pygments/lexers/_scilab_builtins.py,sha256=6kTzoifN-Dmbg7nlJJD1_ar3lEq6Uq5sdWCjV0A1R9A,52411 -pygments/lexers/_sourcemod_builtins.py,sha256=GxGZ9MWhiyrNktPoc57VdwxAA6sguWyFM_v09GcW3nc,26777 -pygments/lexers/_stan_builtins.py,sha256=aICL2mRN0xyWWknCUGVSS6s0HoK_rk91OmiYXSn2dMw,13445 -pygments/lexers/_stata_builtins.py,sha256=1JS2rARgtMan7763FA_zZ7UFT7t8YsGNJo47kLt4e2E,27227 -pygments/lexers/_tsql_builtins.py,sha256=ZVzbdvOcC-kbs1lXcaTAT3-XwgMJuPbYQtAc6jxb9ZY,15460 -pygments/lexers/_usd_builtins.py,sha256=dZRmB_M4Z-aVZFPG5FU-5Su6bPZOvJmCcNxYIF80MXo,1658 -pygments/lexers/_vbscript_builtins.py,sha256=ZVJrzBsxkQKPHVkrBNmWSHaWJcKYaPa9oiCTckzrqKA,4225 -pygments/lexers/_vim_builtins.py,sha256=vN66emQdRrvXF--5n2XOP1_8OI5VO96rxXlKABI4eAA,57066 -pygments/lexers/actionscript.py,sha256=o-fGli0AVanHyaN-nYkedrYgdE49umtHCduObXtfK_s,11727 -pygments/lexers/ada.py,sha256=O0T9BR80xzRn7MAYlf3BDJsQxDIS6x14x6sjLkK4gmo,5353 -pygments/lexers/agile.py,sha256=sWWEMQnlDt99eVuZyjd5uvnuebxCJ4ad2-UXAqti1iQ,896 -pygments/lexers/algebra.py,sha256=CdDxjCBPoETdvmErRu5TG67jy0KQhCmOVsO6nYH2Ym4,9912 -pygments/lexers/ambient.py,sha256=pVJWRy2554RUhQjxwF4JFMPkWbgt-bmqXPvsMu_rWb0,2605 -pygments/lexers/amdgpu.py,sha256=_LuGGZoY9bqDYf4OaPldxEvbhKvP_xqOy3T4gAKHbdg,1723 -pygments/lexers/ampl.py,sha256=q84rYyzGP1qmriMeZVt5Cl8ohugv1tp1hNdfWBYmU50,4176 -pygments/lexers/apdlexer.py,sha256=o0mYCKG9to1Foq7VAQmYQzn7WS7Qt1YH6zSApqv32wM,30800 -pygments/lexers/apl.py,sha256=YChhnBp5WIzKP2FZGDIBpqztQDS58hPz0Wi7mXcQgpA,3404 -pygments/lexers/archetype.py,sha256=8UDdDTxLyIyNCfGnH_dU90St96Jsnl9t2XshWW7dXm4,11538 -pygments/lexers/arrow.py,sha256=MfJlUb169MPfelyrH0jXCWkHfSLTljBCrknYQyAbpUA,3564 -pygments/lexers/arturo.py,sha256=PsV5SMa5h2RHgj161xJJDJX-0ubZ2Eyzt8bxzYeOC8g,11414 -pygments/lexers/asc.py,sha256=ZiLshADiwSba6srjtwibovBVX4hqXqquYK7_AAf4Ofw,1693 -pygments/lexers/asm.py,sha256=9QSICK9VKJLfjxMkEtkkrEGzbB2q6SZd9egDMlGWW1s,41934 -pygments/lexers/asn1.py,sha256=S7psbkDQTLFZd1jDK8KaWVkyi-wHiz7AFf2b1WN7YrQ,4262 -pygments/lexers/automation.py,sha256=Lv4-0vpmwFOX6dbsQHfKG9m7yOyrI6F7km16Z3O9ZTw,19831 -pygments/lexers/bare.py,sha256=s934nvvtAeG8avdi-Q04ZVQebjpo8xbZdhMH_FNnev0,3020 -pygments/lexers/basic.py,sha256=oHx7F-C6gW7AULTU_zfA8zowbmmxcdoyniYZIiaVd6o,27989 -pygments/lexers/bdd.py,sha256=I0tooXMevZw1eND_hrdAWtJ3n3nXgUDKDM5IoYJHRUg,1641 -pygments/lexers/berry.py,sha256=sLmGllDvhPB51Pe_M9BFx10QkqDGejcVZQxCVwEUIeA,3209 -pygments/lexers/bibtex.py,sha256=13JE6k9k1TUYTKit0zND246zLQ0xyL52lvMkrYopP14,4811 -pygments/lexers/blueprint.py,sha256=FZ2WkBuqlOBu0GH0rqjnNSHG_qdAu3jGt97Oen19feA,6188 -pygments/lexers/boa.py,sha256=T_VWCvNM-wt9IjPW4FV7u8NFngpx14dr9ZN7RdOLLVQ,3921 -pygments/lexers/bqn.py,sha256=ze1whgy0AsdgoEc1yHgk_4f2LihqOHjCVPUojA4BehE,3337 -pygments/lexers/business.py,sha256=j1h6DphSHRFwPB5shVQfrPsajprPItPKjHxqzQfdZTo,28345 -pygments/lexers/c_cpp.py,sha256=8e-rRebFzZgYSd52bXFShriP8jFVlCf0L2F0vI-9Rmg,18059 -pygments/lexers/c_like.py,sha256=JCHZRIboeGb0VE-bknxnoxd8oWQhr8T0qhS2i8vTlMI,32021 -pygments/lexers/capnproto.py,sha256=MJmnE8MYtWPUEqXh2_zBgG9FgQAD-10so6ORwpqHZRo,2174 -pygments/lexers/carbon.py,sha256=oYL5HLBgNOJIkLti5kjFFdwGIbtidKflCKk2tdHKgos,3211 -pygments/lexers/cddl.py,sha256=qaeINyt59SyAbxAMZHY0zcDGgxTEFPElG6DP3aa5nZA,5076 -pygments/lexers/chapel.py,sha256=XBFfoaOiLbfUvaNvnp_iQs_qLRpg41LUmAugtg-XGug,5156 -pygments/lexers/clean.py,sha256=vUMnhYzD3uvSc7Wdyzo7PZllAGt0dzXqhthY82qhL9c,6418 -pygments/lexers/comal.py,sha256=G_d_FHFU-wJFihoMPmZMLGF_Bl__HO0i1gC9InQ9rbE,3179 -pygments/lexers/compiled.py,sha256=nufWnAfB85AiZPELv0yzijrROD2wz9SEc54e9n_dmGk,1426 -pygments/lexers/configs.py,sha256=vNh6sytziBn-1qkqDwy_OFYTKxUH4kFsJ65Hc8Yx2Oc,50534 -pygments/lexers/console.py,sha256=39fVAcHxYtO7cy2_epBq30ShxDJxhgc09jd5J7dOAzE,4180 -pygments/lexers/cplint.py,sha256=0lqEPgDIFQuO7Q189JjG5whWlAw_YcTlWG9-aA6eli8,1389 -pygments/lexers/crystal.py,sha256=5UlYigeTeFRrfhHQiSN0DxqkWo2ibnhtcCErB5bTJdg,15754 -pygments/lexers/csound.py,sha256=ZX2bs4NykljvsrI5QXgQZXGH2IyP6ztFfT1v6gq3UnQ,16998 -pygments/lexers/css.py,sha256=571dDjM2lWepEn3ybYec0I5b3h54azXF7xJO2ZNyRLA,25366 -pygments/lexers/d.py,sha256=-mKlYHZMYsUV2BhW8C43AFnh97zeKJgyej7XSQbOA_I,9920 -pygments/lexers/dalvik.py,sha256=PIEJoUcYD7lij6eCg9wZgMFhUyazyQ8oFxHrpzmQFMk,4606 -pygments/lexers/data.py,sha256=l1fmUUlwiBccMAKX06phQ1tKr27mDpzwhnytwqxTbM0,27026 -pygments/lexers/dax.py,sha256=blHXcUy-QL9X25rLQDDW5DUceThB3sSa_4mOtCT1bkE,8098 -pygments/lexers/devicetree.py,sha256=K1jqVm8B-2K8rRzMElMNYWNUaUKbCIt62dVRQVjINI0,4019 -pygments/lexers/diff.py,sha256=_dlEodnJh3Y61GgP3AvRNpbC0LD-0nuOSd7PBDaOK-I,5382 -pygments/lexers/dns.py,sha256=do6plOeMEqasazJTfGpjYYTWLqvGKsTVNAd3SldgG_8,3891 -pygments/lexers/dotnet.py,sha256=apkKKord2c6opVFhiaK-vRrQxsJRRnFfhijPLKiMYS4,37958 -pygments/lexers/dsls.py,sha256=ea7bLN68qYqwx1yeRJvfn1YJP343rawhdO9NuDMRjnM,36746 -pygments/lexers/dylan.py,sha256=kcx1IB9pqjQyy4PXpu4YeiS64I8XSkE5dJ3ulWDWzMg,10391 -pygments/lexers/ecl.py,sha256=qmFlYH19sYDOli4aTjajecw_zRlvjmzq_VUeGfcEUk8,6371 -pygments/lexers/eiffel.py,sha256=8fpkGHe6drmZvcKOJkS0jz87H61JsQc3_999IM4Mg1c,2690 -pygments/lexers/elm.py,sha256=Dvh8YtUEbcnCC15pCmMGIuZFGenLsg_rS4X97GOyJiA,3152 -pygments/lexers/elpi.py,sha256=1JMrWjlWYdle82RJSZ0rTtTOCt9kLktyVJOumeK2dMc,6535 -pygments/lexers/email.py,sha256=vR1gKbuso2-oiJG5QXYUROYjaOGw8tYD9CmdbY68lAg,4804 -pygments/lexers/erlang.py,sha256=3xVUmnbvgbQN4QM5WGvIoQMFS9jJptBCRM3MP4KxsZo,19147 -pygments/lexers/esoteric.py,sha256=N9HJNvtxh5ktL_I8t_8vFJ6Ms-atOkplnE39GGe8wNg,10500 -pygments/lexers/ezhil.py,sha256=BfutGlZYc9b9uW5Qy4BIsNKWowdikL9mWijA-D_xK1M,3272 -pygments/lexers/factor.py,sha256=yxEbxsEFcReEaajn5S7bvaacuG2me1RRY5Fb2hYDW2M,19530 -pygments/lexers/fantom.py,sha256=meOft3jMJ98kNGetDPVvzu9nvVFC08udETA18j51TQ4,10231 -pygments/lexers/felix.py,sha256=o3E1v8qe9vyQjS9YK_LVPKwraosmfqqypRpOx7J-ikI,9655 -pygments/lexers/fift.py,sha256=ZTjrY--aKiHlg24KFpKUAq-wn8ULL_8G_E7N3TPMnKg,1644 -pygments/lexers/floscript.py,sha256=LYiIZfZ2HT05T3xR00J9_q5S6nxkEw-2v5GkcuS9kfI,2667 -pygments/lexers/forth.py,sha256=xyeyN7nMFszsaKYDG2oxLuhfjrZcBVKdRIKL6htxvSQ,7193 -pygments/lexers/fortran.py,sha256=llxa3itGDZfNWcmsQO55DjmWgvfvgohnEdt1T4m3AHo,10382 -pygments/lexers/foxpro.py,sha256=KW39vSlXkigjRqx6E7s7L895l4auXk9T9iyWB3XbjY4,26295 -pygments/lexers/freefem.py,sha256=gO8XOaVcwydnhWP8t2Cgl2YeQ4C75dbGDsQs3ko3SQo,26913 -pygments/lexers/func.py,sha256=2yYrp5etRM94BT0nkxxlcC2xAJ4PBOP8mV4i6flNmJo,3700 -pygments/lexers/functional.py,sha256=RJSf7XrVmsGQRYbbHKhWlJtfI5PZ6stlH8Va8WMdpLo,693 -pygments/lexers/futhark.py,sha256=QPbnZ_MvzMTQmYMTJbdJIvW8w7hQySJCViOTDH0Pv6I,3743 -pygments/lexers/gcodelexer.py,sha256=QE3tz5_Wu0c1GsjiVU-nbLi4ZcvGvRKjTUdT3VFbErA,874 -pygments/lexers/gdscript.py,sha256=eBdkj-lmw2TVTf7cvJYsFHVzEZ0C7kyZyVHHuelJ18A,7566 -pygments/lexers/go.py,sha256=dZY74RhlgVS7sZwEiqYm21AOOZ-NqrDXUHBz5aTkdDw,3783 -pygments/lexers/grammar_notation.py,sha256=vg1BvwySit-7LB8Y_5AQkgkj0AzIGAM0mHtaq_fbuYs,8043 -pygments/lexers/graph.py,sha256=kUfbhtuS9ysgfhUdFBnT86w_JK35I-ROzOZ3IQV7sTU,4108 -pygments/lexers/graphics.py,sha256=PXcPVmfAOROL1ocKa6ft6J3HfKgZQ9HvZ2k7AcSPl70,39145 -pygments/lexers/graphql.py,sha256=um1AZrLHx9qpZ6NFVBX_kRAFbM7TQV9l13ep7dCpKcY,5601 -pygments/lexers/graphviz.py,sha256=P-Xy34waH0BYD-Ccp1XmE9832I5MzO-_mwHsRrA5n0U,1934 -pygments/lexers/gsql.py,sha256=8y3ymaD6uFx-IrFJRy0D6i9wruaUETd_ceAsugtaxIw,3990 -pygments/lexers/haskell.py,sha256=e7WpOTNyaIj7Sr8B-JjGeGbSlACLVEa6vOM-XfWMrK0,33239 -pygments/lexers/haxe.py,sha256=hHGZkJt4JWpLHMTb0s6a01yQNxfnXgTPvnP-eyNp6YE,30974 -pygments/lexers/hdl.py,sha256=Vr-kHDFjxhQSE1TW4zttZ2zZHDCuXzpNcQL3tCjjjOI,22738 -pygments/lexers/hexdump.py,sha256=5F4mjn6fgyA1CaWFoYk4Ww-pHS02a_7zpoRr70WPm8A,3653 -pygments/lexers/html.py,sha256=dPeQnP4Qf8z6TZjL642FHTMMHRwCUccGVAAD90ORzXk,20574 -pygments/lexers/idl.py,sha256=UnYt9-IWBk37Kr0YvCCtU2D5TXWSIqPSmeglq7Wd-V4,15449 -pygments/lexers/igor.py,sha256=KvamBRiJOU67TDqHGB_PixR19IR1c9Fq0oLScXFPlmw,31626 -pygments/lexers/inferno.py,sha256=kSrMfu_3AofmBZ2uCH_YFD-0a95XRjmOKk7L_hB6CIA,3135 -pygments/lexers/installers.py,sha256=IVyOtXNeV3AVFv-18TjGbMF2xPgiI-kVejAo_EszuNA,13297 -pygments/lexers/int_fiction.py,sha256=LSf2BROdA4Mz_rgpsKLICJebljE3nQsh_K0hJvfVlaQ,56544 -pygments/lexers/iolang.py,sha256=XL_JsHAZRziGN8Sk08NZmSo5irAWU27yVy7czpU9GtQ,1905 -pygments/lexers/j.py,sha256=_fomKXuUh8FANTUl-HxE_x9WYRnKJGpAiQUMeVJUolo,4853 -pygments/lexers/javascript.py,sha256=m6VcUOwTUcpdZoJNaAIXE_zHq8NZBkQVqYZMRPXI1VE,63101 -pygments/lexers/jmespath.py,sha256=GBHuBxeDVdeUN03KuvFK4UIY3e79gYT0FkiDMWKgygw,2082 -pygments/lexers/jslt.py,sha256=p_0Qba5bPcyxERl2xsmFKet7_P0R5R0ist_3GFrN2us,3700 -pygments/lexers/jsonnet.py,sha256=bqXv1lRpxoIx8X-_Y1PIwOl-jgnEPtilCUL4wT2-2xE,5636 -pygments/lexers/jsx.py,sha256=qlRxi85Fh0kPvD5Viff9_Xm-gjfmEEKm3AsVDWTgM5o,2233 -pygments/lexers/julia.py,sha256=DLaYCAF4AN8nsgRzJY-MWlHEZtDuNZ4FznIFijJatGM,11679 -pygments/lexers/jvm.py,sha256=OFw18wPlecJDJjt16N3gMQVy_xmnxjcDCXlu4_NXTYQ,72666 -pygments/lexers/kuin.py,sha256=axJ3_tqZKu40OgkUP27qsyDEkM_TeZGQcKFXlYOrtMI,11405 -pygments/lexers/kusto.py,sha256=Q-UC6DQB4vuxtVsQcMZEp56CxXpIlJXeuP-WDEV-Eww,3477 -pygments/lexers/ldap.py,sha256=_ua5KpHLgDiTCKFVZ4OJkoBUh84FXGqeDX29UELMYzg,6551 -pygments/lexers/lean.py,sha256=bk6LaVc_PsSEhspNLzRMKkG6KyFWup7nhS7Kx1XXQ34,8570 -pygments/lexers/lilypond.py,sha256=gE6Z5xs7uocSCfaDOghkowKGblZX8zIE_v9eLZ651UQ,9752 -pygments/lexers/lisp.py,sha256=79Upl-OrKzZ-8443lyPRJHagOSwDGkxywKqJwXF66FA,157668 -pygments/lexers/macaulay2.py,sha256=iRTPn040k600ZQiY4IpPL-Byt027wBBhFMWn9QjgROc,32844 -pygments/lexers/make.py,sha256=5-2Mq3muMg9Yq5yfmXNI7UH-ApYh9VePrIvKsJTpNHg,7831 -pygments/lexers/markup.py,sha256=tgFazIqyrufzmAgd3FL-4-WMbwbc8ve5P7tJGvPWnOs,65088 -pygments/lexers/math.py,sha256=lI6LVR-OqL5XB46Nu41YE00QA1WKssPp1TFzH-NoV50,695 -pygments/lexers/matlab.py,sha256=gXzVaLWkjqmwqNJgxpyNbfqy8X2yDs9QyJaGQcXBu94,132962 -pygments/lexers/maxima.py,sha256=Qfe8sTugA5UhGuRzEKjspbH-w6YVlREdAAmGyKp5HZc,2715 -pygments/lexers/meson.py,sha256=FmmaxUNRV55nxQm6oQ2sXhhZZyNSms68V7Uxj7F9TuQ,4336 -pygments/lexers/mime.py,sha256=nwyBkz2_gJ-jUmxWpcNvpGYftazfk4V9adzcPashGeg,7582 -pygments/lexers/minecraft.py,sha256=GKPEYWI6HHvpOdEh4GTphfAM4mx8dOA6VFOsA0-1aAk,13696 -pygments/lexers/mips.py,sha256=YtvYhgqSdYtfy69FK5I7EiOPC2VSKdqq5_ZgPHD1wbE,4656 -pygments/lexers/ml.py,sha256=hZvMkwBzbgWYX4ndtUI_m9xAjjGmxyqPbwJe7FcAeoY,35390 -pygments/lexers/modeling.py,sha256=EebFhvTaBw279EkIcRDvIsGIo33A8TTgtvn__Ypun7A,13683 -pygments/lexers/modula2.py,sha256=2rHAQBCVnLu0mdaq8ERDPuHwF0wNh2r5SKl_vUJMea4,53072 -pygments/lexers/mojo.py,sha256=z9CDFFnBfI9G9gHRsYOtcCtKWbXKdLgRdvoKRVAoWTA,24181 -pygments/lexers/monte.py,sha256=DTy0svJRg7P7j7EwDPN5aG7l98Bm7STANyJSwOytv5c,6289 -pygments/lexers/mosel.py,sha256=cErB67hM5hw1qZYPKuHmOfrJu8H8uDk8B378hnCyI6M,9297 -pygments/lexers/ncl.py,sha256=zyV63ZeQnoV__OY6284jW8GENuzsXgY-_d6HxDz7m0w,63999 -pygments/lexers/nimrod.py,sha256=lBDewJqj_VNdsKQJ-8qQ--_ZFNbQZETraP8u92b62xU,6413 -pygments/lexers/nit.py,sha256=M91yluzYKftVIr2HsWdianN4gPirwBLybF287xiVb-o,2725 -pygments/lexers/nix.py,sha256=oUlbwP0ktviAB6lMtrzVwrzsgw09BPN0OS5NM6IMK40,4421 -pygments/lexers/oberon.py,sha256=QmaSlH1Magq2Kn6DlzZtowxTRWVTivoWPLsVj5ywHY8,4210 -pygments/lexers/objective.py,sha256=W3ikK5MZiP2nF8gpGO0wSA5LM3TGE6Z1GHkLFQXq0aI,23240 -pygments/lexers/ooc.py,sha256=xpKo2xGSael8ymrTyXhfyL7630zBx_Gatb4fEZ9qn14,2981 -pygments/lexers/openscad.py,sha256=u-Ow27qJeR3l6N-8gSzJ4ZsvviBvCylCbMnc3pCgb_s,3700 -pygments/lexers/other.py,sha256=U4tWdbxxxa-__MU48rejsw6n-OyZHf3ikk0O7dG4jxo,1763 -pygments/lexers/parasail.py,sha256=9KkwIh9KuvGjI_cgFuzlTOTZEgyPcLnz1ikKOM48x48,2719 -pygments/lexers/parsers.py,sha256=mZAfSp6U1KwcfnjzBUojmO_G1dlYMG8KEnaWqr4d5Ko,26596 -pygments/lexers/pascal.py,sha256=k1vWSa2xiclhbHYK9bcEj6pUgBR-RT2oLTagK9zn5YA,30989 -pygments/lexers/pawn.py,sha256=eYfJfp9ibWIJL0R5CGzg94vZI0nxlRI5bkbzzWuc3vM,8253 -pygments/lexers/perl.py,sha256=uVou8njqVI4tzGM2iX6P3OPud4FipZK-Zi2uFAhcOBA,39192 -pygments/lexers/phix.py,sha256=q-P5CcxMRvOGHuFAY5wAPUFWUY9IsGNj8gC7K5g28lE,23249 -pygments/lexers/php.py,sha256=UkF4jrSzj7HsTwrkPF42xTm-kOF3jT-yvc7CzicfwMI,13061 -pygments/lexers/pointless.py,sha256=pdrIHwcAcCJGfwHxFGHoJ_KkQXwPH2OKJbnlqIEugtU,1974 -pygments/lexers/pony.py,sha256=FIrwgNLoN1shYp_JQk9TzzWy_GzWp1Fikc8niAUA8Zc,3279 -pygments/lexers/praat.py,sha256=KZP6jV2BaJXeNEtGzCvGW7EO8tbNomTGuW3vqQ0BIoA,12676 -pygments/lexers/procfile.py,sha256=hdl66BmCMFYjVkD2Do41OsKL9qoo5cOFty6u1il1f7s,1155 -pygments/lexers/prolog.py,sha256=7ThE10pBk1juL1S87a_IBucCtEirJ4SdMHWv60hLw4s,12866 -pygments/lexers/promql.py,sha256=T6Vth5trlmxvEUZFlwaNmQIMqc6gks16Xjv6VLlNiD8,4738 -pygments/lexers/prql.py,sha256=yGEiiPGYoRS_BpWarVwu7iQV3ZY301w928fk_kIVXjo,8747 -pygments/lexers/ptx.py,sha256=bvZwgSRXvlP5FhYEeIJR08tqrdJzG4iz_l-GfaYGmXU,4501 -pygments/lexers/python.py,sha256=KEHRWLVhykUPwl10uBIev1RnQ5h5qGgcjVP-mtsY1rQ,53639 -pygments/lexers/q.py,sha256=j5sI-L_KvvtNVnghW7fDVTkPUpGeS8RMVetadtZkSZQ,6936 -pygments/lexers/qlik.py,sha256=BcEHm92Js-FoekcsuGx-Wp8B379PonGqV-CLEKqd7hA,3693 -pygments/lexers/qvt.py,sha256=kAu8NJpjGktB9Z4wJAMoQbGc8LafMV1b6z-R9XEyqA4,6103 -pygments/lexers/r.py,sha256=5AFY4SAj7RmscCdU4WYuI-XTnPBgryGkPKxvTkw3UDk,6342 -pygments/lexers/rdf.py,sha256=GigtsRZmYwMjFzebvH1LV6ops_gi5OqxDCfZ_xBZ1Lc,16042 -pygments/lexers/rebol.py,sha256=gacBQsL85pcTpjJS1UUKDrlmFanRnnPJYphjQDSmYiw,18259 -pygments/lexers/resource.py,sha256=Mve3WMK62BrefqaJzwnHai23DIPvg-qdu0vQumJPhzA,2927 -pygments/lexers/ride.py,sha256=qUAqA8gIMecQj3FOemfeYOtQ_iGC_mVkawdE6oUNopc,5035 -pygments/lexers/rita.py,sha256=2fP6PGLEPZVhUOWaU00sC36r2QWnZVi07QQ2BhLY1bE,1127 -pygments/lexers/rnc.py,sha256=E-4DyG21UILNE5UPpUSl43UmbaDA9JPEnrjFlPembuA,1972 -pygments/lexers/roboconf.py,sha256=0J7CIBT5CE0A18sjOJV4M3J2tAvGs_WC2M2GTYSmshE,2074 -pygments/lexers/robotframework.py,sha256=Nh5SSW_bchdqtioQo6bt3q4ULuL4dsoYau5_Pu-ah-I,18448 -pygments/lexers/ruby.py,sha256=vTykyjbAPIG-mRBnNKNgNGeAXwsv7MB8xWOkzrhpsWg,22753 -pygments/lexers/rust.py,sha256=B_H41x0dgnatX9zRLNAVOdPiEgFpENIXFYW7Jfsv8GQ,8260 -pygments/lexers/sas.py,sha256=FDX4GAE1Pcr5vmwCSSUx5Ym7qOPzQzxXiDnqqQzwnQ8,9456 -pygments/lexers/savi.py,sha256=eUiiyyRMQTXJacqlreYj8RgjZGPSTlpiJ9Ctll9cjjA,4878 -pygments/lexers/scdoc.py,sha256=9YOBIrmKLIC30ceVtfG4Qy5HHNWfzqb9Fw1-L3poZZQ,2524 -pygments/lexers/scripting.py,sha256=3mDK3eT62VIq-cmAo3js6wDxOYemfYtGQXccbGbMh-I,81062 -pygments/lexers/sgf.py,sha256=wfWiRnyh8Z9fl6oN0SGrDDcdrXSozvmTEDqHK0AOIiw,1985 -pygments/lexers/shell.py,sha256=kpL7It9fUab8bCQSKAPJiJuzWsgA6Tv5zo6TnmRdkiU,36234 -pygments/lexers/sieve.py,sha256=ymmZ8ZubRoVtBcgOr0UW_Dg5siMpJqgpZXC6LmE7RJo,2514 -pygments/lexers/slash.py,sha256=hc5BWEaTGxyGhIwaRaQAayXbr53Q6H3ZwHTC5o5R-WY,8484 -pygments/lexers/smalltalk.py,sha256=GxnNoY4eYE2-reCp4OL0d4DHBtHsZJTymRZY31Fq1lM,7204 -pygments/lexers/smithy.py,sha256=PjLWFlb-qYnEfkTOkLkpSBxkfG6gXCXsU-Pf42FKE0g,2659 -pygments/lexers/smv.py,sha256=w-WL-lSg0NKJKTEzZH94QeHQbMQlbxoId-vUP1nAbJk,2805 -pygments/lexers/snobol.py,sha256=vEBdaH4C9F6ctEKmMuWMmK_WKyCC40yi6q4HbXUZavo,2778 -pygments/lexers/solidity.py,sha256=Bc3mELp5mXvZNgr3vRzAqjKRtC6SPNhfmsaD6RdJGyc,3163 -pygments/lexers/soong.py,sha256=YpDy1HvoABJU26xq2-y0xs8BKIZyO3635VrYKOizhQ0,2339 -pygments/lexers/sophia.py,sha256=SxKzCczr5WU19adkc-NbnPCcY5ecN5Fx97zRsFhk7Rk,3376 -pygments/lexers/special.py,sha256=6-K1Ik28Dle15Ol_b1UANMcRIX7EcTo_Fbf3Wr-zp-k,3554 -pygments/lexers/spice.py,sha256=QKbDr0PSRObjF3knMghglx8zFVp2Hjrq8zSAn6XVWlc,2790 -pygments/lexers/sql.py,sha256=ESU6S2vX1jucKfOhe1tW8hKVluFTZYTvClB1AnGI9Kk,42594 -pygments/lexers/srcinfo.py,sha256=Lv2ptfstgzOtzY2MGqCUcDadyntJrCQMTP-rOie2iuU,1746 -pygments/lexers/stata.py,sha256=sxOLP7jb6UReJCjxUHJYAbgAJV7M_LNOGywLwkPWXTE,6415 -pygments/lexers/supercollider.py,sha256=dYszvpnKfaLGdmIEnruntz9VTccLmUYwzbbLvZfOPC4,3697 -pygments/lexers/tact.py,sha256=5KVnr9VxJeh_RKmbgOwR09X-5n7Th8Yb-Zk_0XTQovo,10809 -pygments/lexers/tal.py,sha256=VF3YLB4xvQB52W4GW9ZVNkDqkyPXASlHALhOJupw2SI,2904 -pygments/lexers/tcl.py,sha256=mepJbvCnYmZR1-dKK9Cfkt9m08bwTg7fOs96k2csfGg,5512 -pygments/lexers/teal.py,sha256=gCEC8QyKyq3aQk6E8E98fwD3vJrVZs58XsGjJ6GTL_4,3522 -pygments/lexers/templates.py,sha256=ASVTvkCvKfD7Ay5eETo7vs2Izc4ISP-UBUhpds_O1Yo,75719 -pygments/lexers/teraterm.py,sha256=3gwNILGwryBxytCTzS6qVGcZBFRfOX7svC11w4EpgSY,9718 -pygments/lexers/testing.py,sha256=5pQIJ7ZNeT02-GM0krZOXo8Pc3s6IbYbS46w0KjHaKE,10810 -pygments/lexers/text.py,sha256=EF6zAFvul6KpvQMPJrRw1FIr5ALAP8aScZ9VRqutid0,1048 -pygments/lexers/textedit.py,sha256=Kf8ALySo9XQ_UY6X9quOLA782ZwHvBHL17expjthZQI,7760 -pygments/lexers/textfmts.py,sha256=0_1KYSlbmLTZmFpX5iXktRKJ8OyVO9QmAFDg__rXGUk,15524 -pygments/lexers/theorem.py,sha256=z09aU_G5UI9DpsWf6jm-XPWcuUSKwJrAsLYqLgQuS8c,17855 -pygments/lexers/thingsdb.py,sha256=cLu1oiOV0R1mR9oZWX2wD03G0s7MWhkvguZ70FPgkaM,6017 -pygments/lexers/tlb.py,sha256=meibbT7CuzX9aFdel3o9uJDM9s4BsWHrHSd8SxyUl3Y,1450 -pygments/lexers/tls.py,sha256=o6vcxSNMeQmq9jIRY5Muyt2ETwLomqWK983LnENX9vU,1540 -pygments/lexers/tnt.py,sha256=okaq1-TxloDyopXy9pu6Ts5TbkfOqqynNzTbObH8JE0,10456 -pygments/lexers/trafficscript.py,sha256=U7l9JD39m5YHtmO50vR-5pilR1QBMxO2RdqWe-wkUyY,1506 -pygments/lexers/typoscript.py,sha256=dohTsxka3AAjgRfRYSyqO4WLxa_kcscDMf8SHxPWUKY,8332 -pygments/lexers/typst.py,sha256=lou5GsSvL-FuBVyDMT8Tg8jOXl4V3RW2exEPqUbmfXE,4337 -pygments/lexers/ul4.py,sha256=DyVoCHqF9AxIDJzFuBLcBgDbkXQzqhEmtcAkc4umnXA,10499 -pygments/lexers/unicon.py,sha256=TH8FGcxImq4Ioq20cKHfTN3abwD-1YaImuf_MC1s7rk,18625 -pygments/lexers/urbi.py,sha256=KreG90URYP6Xq-Cq5yLqkntpSmksjyJLrMo2ume7dM8,6082 -pygments/lexers/usd.py,sha256=p_wZfBLvMILyTTohmkxxJPWTce89zb_TMHFZcZY5mw0,3304 -pygments/lexers/varnish.py,sha256=YfIyQPkChcQ4VzcbDvGX7FLuemL2m9vB4w8hiyRKVfE,7473 -pygments/lexers/verification.py,sha256=iZR-iWX_SWCAYZ3YqIWjhcTmQdmtiEomay18Gz8HdVw,3934 -pygments/lexers/verifpal.py,sha256=dKEqh3m32VjEF_Bn0Ies8-Q0RkTfaKfJd06a9snQqmE,2661 -pygments/lexers/vip.py,sha256=nHw6Yq4msTQaJqnDEEmnH6O4KfxCwxPEnMPfHJQr8uE,5711 -pygments/lexers/vyper.py,sha256=I6Sr2i3ObogDbhElepwGzvnIH__htWF6cys3PqbimmM,5590 -pygments/lexers/web.py,sha256=a5Da6fOZsK8ft4lj86ADqZnBFgV3jNw7oZCd_nepWXI,913 -pygments/lexers/webassembly.py,sha256=sXB1c9mVobzv5F8rEmRi4re3UgTD_iGxHR3rf0zQieY,5698 -pygments/lexers/webidl.py,sha256=9eutoEoxDJk6MEbcQIpM79EkQalU2-DDKbZQQKDYsrg,10516 -pygments/lexers/webmisc.py,sha256=3CxiToHU2w3cHqyOizoWlP0rZAsrASowZQWZIu5XC-Q,40564 -pygments/lexers/wgsl.py,sha256=PrBbAe9TxRiJXQhm7kiwLsiKFm3y0X4I66whtWGOIAs,11880 -pygments/lexers/whiley.py,sha256=iH-TV5itY3LNcr1072PapDpMX2ys2RIKthe98F3BXhg,4017 -pygments/lexers/wowtoc.py,sha256=K1-o9Ui3vr7yMUWNoipFZmQUzTrvzRkvm6Z0_S4FDk8,4076 -pygments/lexers/wren.py,sha256=TOQXYQk-Vl0XLJ4_TZcsSaBiJMqE8KKi5Xu8A-nrrmM,3229 -pygments/lexers/x10.py,sha256=lHNR_3TM82-nl5FynZByOZ-YlX_jFz3relStlHriDIk,1943 -pygments/lexers/xorg.py,sha256=UriOYGMw2YiogLg7a1pVHQ_byUE1rkYybIw252-yL-I,925 -pygments/lexers/yang.py,sha256=kzRAGm1AELRrc3NF6xN4Axc-M2DTzf90zqd0vyLIMWI,4499 -pygments/lexers/yara.py,sha256=IhbIy7H8A__Y023fNwLgXzSW5H0SI0uHyzt2cXY75AI,2427 -pygments/lexers/zig.py,sha256=nnm8oDDjYCLGB_JhWHobZ9hP1U_JIXJdyyetxyAJ2WQ,3976 -pygments/modeline.py,sha256=gtRYZBS-CKOCDXHhGZqApboHBaZwGH8gznN3O6nuxj4,1005 -pygments/plugin.py,sha256=ioeJ3QeoJ-UQhZpY9JL7vbxsTVuwwM7BCu-Jb8nN0AU,1891 -pygments/regexopt.py,sha256=Hky4EB13rIXEHQUNkwmCrYqtIlnXDehNR3MztafZ43w,3072 -pygments/scanner.py,sha256=NDy3ofK_fHRFK4hIDvxpamG871aewqcsIb6sgTi7Fhk,3092 -pygments/sphinxext.py,sha256=gQAWnR6_1SM6OwUypWg1DlXrmmF9o3ZzbxsaXDsiRVg,7898 -pygments/style.py,sha256=dCFnKszVtsMeSW20uHC4pU3yuYgVPuJggm64-2Ylmo4,6408 -pygments/styles/__init__.py,sha256=v0aGLoaoKnp4_MGp4w-cmUvMoHYHMemiz_e_IPMLpbg,2006 -pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312 -pygments/styles/abap.py,sha256=9rx_hWD_GptC9nhoXVVc3p8ysYJ9wQfcReqgzyic2OM,749 -pygments/styles/algol.py,sha256=zeOLl6K37RauOH7chM5o_MC7UyTo81kk6sEOn5Joy8o,2262 -pygments/styles/algol_nu.py,sha256=XGmfWujpWLfNJ4AL7BJX0Xyr3wp3vUEV7x7eYj4Z5y4,2283 -pygments/styles/arduino.py,sha256=7IEZ8-xN_h8FjvuJFZiuVmZKC69gD57zgWussXjPsco,4557 -pygments/styles/autumn.py,sha256=76KNB7kJfZIOqcH0nZ0y6kh8xWWQc_-agkIJFWbCdf4,2195 -pygments/styles/borland.py,sha256=Gv5bXGIKuMGr0Oi4rbOrmEhZzdwHNLA20iQcuHg9yGQ,1611 -pygments/styles/bw.py,sha256=zJUiRQGS9OIE7H82M--9A8_jiqWTUPmjf0ZfWz0eSNY,1406 -pygments/styles/coffee.py,sha256=vdWBg6Oaj6T_TvfDSX1Ex6C8jOMggi1ZukUdMErPioE,2308 -pygments/styles/colorful.py,sha256=x6Oka6AQiGm-PtzuF5AdHUUZk61ZZXhvjOjHdsuFsTE,2832 -pygments/styles/default.py,sha256=YVxaKrvLvV9PD3I_7J6OE9gIYZE0O4fRWVr2qY9YWMg,2588 -pygments/styles/dracula.py,sha256=qcgo21Tvi-_KyjXvHHWQus19kNYJbtOvDZbYDcMXBno,2182 -pygments/styles/emacs.py,sha256=FknUJ19Pkh3iRLtVwUwxDOGwvVcJ8ZWPegGbCbTLlq4,2535 -pygments/styles/friendly.py,sha256=wbmM_eI7io4ZiU7s04dbLu8MyBHi0nwkSCvA4PjhA10,2604 -pygments/styles/friendly_grayscale.py,sha256=4VH0U_dWcANmzD5YvTfNGBAHt1NMa64Gxqvh2cMB5fY,2828 -pygments/styles/fruity.py,sha256=lZKB5CspS2-7XiCS0HUR1Rw_p8bf7H5auyYXdH0RviA,1324 -pygments/styles/gh_dark.py,sha256=q4ydCJLNNemg3FrShh3OeX3LLkI_ix6ZwAzsZ_U7bIA,3590 -pygments/styles/gruvbox.py,sha256=kNlwHRuiNt6nFiV73HjEM9R7CpaYVzCyL19PWoKdVAA,3387 -pygments/styles/igor.py,sha256=pxC51nXipMCi3K2lYzuTJI3VkwPTqF7xSu5co_PiU0s,737 -pygments/styles/inkpot.py,sha256=jRs2u3nQsLhUOX3Fkl4eaNurasOtlEy3wKCMPWcPpFE,2404 -pygments/styles/lightbulb.py,sha256=RJcQHPcC3SfqOtyWOzOXGysd5iyirTkkR6cqxch9LRQ,3172 -pygments/styles/lilypond.py,sha256=faTOHQ9NCV-yWV3AxhnQ6wMvakoxQ8oBZw5BTDQOYGo,2066 -pygments/styles/lovelace.py,sha256=y-5nl4TavhUCYrTHU_ysTNQDh40dUeqiGrAQuPmF1xc,3178 -pygments/styles/manni.py,sha256=-zRQEJnjkXJpGmMMlJSOMNGho6VAsDimCvW79aqntG4,2443 -pygments/styles/material.py,sha256=28SYTw9qOuQS42Qsy8lDUNBvJzbliNH8Crq0e5N2sIc,4201 -pygments/styles/monokai.py,sha256=TvyWTqvy6oZxKNARKT7mgt2LgmNKLy2DL8Tphj6kjWk,5184 -pygments/styles/murphy.py,sha256=txf8iMJaPpynJRtnZJILTAagWhZ7Vdxn9DGcn8TE_q4,2805 -pygments/styles/native.py,sha256=0Ke0kSPZ3ARlI6ncLQzLiYGM660OpcuhNJfzHwJyVLU,2043 -pygments/styles/nord.py,sha256=Ee-EgGAEhW8Yi2CNxx2URZm2AGFADHurN9BwFIDBcd4,5391 -pygments/styles/onedark.py,sha256=SpfxQcze3C4s8R1DIxBn_YmuZC65X8UoShN8Dzuyuxs,1719 -pygments/styles/paraiso_dark.py,sha256=4IBihUb0MsjbT1CXpmIYx2kxwDZRXh4wPRgxXXzbuvM,5662 -pygments/styles/paraiso_light.py,sha256=6_LiKp3-cjlNW3q82poUZJktJQBhoUVROB0UgbgCPRs,5668 -pygments/styles/pastie.py,sha256=Y1FWBgt6FDcZxpbiaAgj2x7_4gx-d_fSSwdhSnfcFRU,2525 -pygments/styles/perldoc.py,sha256=n280hEgwbxNgHWnY5tvpwvBWoeKokUP3xYeSMnUDu0s,2230 -pygments/styles/rainbow_dash.py,sha256=FHP8Es63TK_81EkyhlDTMZbZ-IqTKG3FkACbwMdJKVc,2390 -pygments/styles/rrt.py,sha256=-PdgNtub-w6B04dL_BZxoztjMl42JdtekA_OLO-QXDw,964 -pygments/styles/sas.py,sha256=wFRC1zzCjIaUoxp7F2F4PsQlrLgi0Lhl73EBhBa6MZU,1440 -pygments/styles/solarized.py,sha256=sxXpKTLLJqbOZSaikQr9xK2YC39aMd7s1cVZk0WncnY,4247 -pygments/styles/staroffice.py,sha256=Q8lR_zkR-YTqdyNNETypBdIjCGx4lQhUitdC56DKntY,831 -pygments/styles/stata_dark.py,sha256=6HrS2rre1SjqCnhvFU_fZ0k657owP1tQO5UdY7xQk-k,1257 -pygments/styles/stata_light.py,sha256=AleMjdPmr3OqBLdBrLyYRs_Qnnr2s27zWuh88CPtYY8,1289 -pygments/styles/tango.py,sha256=N68BibRMXHmNTIt2-gH2krdqErgKmKaWiv3l5mO_yG4,7137 -pygments/styles/trac.py,sha256=FVuEbNlIthXD2ajLaWBewGTvyx9tQtmleg-7Cigwnj4,1981 -pygments/styles/vim.py,sha256=RxqkvCriR3QwCxZsSjTwFUzNBmFEcWKWbn5H9w7hwDE,2019 -pygments/styles/vs.py,sha256=cG9_3FVzYiirGa8uesnwH4q1L6ZRb9nlwy_W1SAZ19w,1130 -pygments/styles/xcode.py,sha256=4A2br07F5Q7X8dUkqu14oHLGT5zsuOiv-e0V0UYCCu4,1504 -pygments/styles/zenburn.py,sha256=EyWeyFH9wRLSHc2S4v-rgFIro_b8H9Ia-gaRE2PJgCs,2203 -pygments/token.py,sha256=qZwT7LSPy5YBY3JgDjut642CCy7JdQzAfmqD9NmT5j0,6226 -pygments/unistring.py,sha256=p5c1i-HhoIhWemy9CUsaN9o39oomYHNxXll0Xfw6tEA,63208 -pygments/util.py,sha256=2tj2nS1X9_OpcuSjf8dOET2bDVZhs8cEKd_uT6-Fgg8,10031 diff --git a/libs/pygments-2.18.0.dist-info/INSTALLER b/libs/pygments-2.19.1.dist-info/INSTALLER similarity index 100% rename from libs/pygments-2.18.0.dist-info/INSTALLER rename to libs/pygments-2.19.1.dist-info/INSTALLER diff --git a/libs/pygments-2.18.0.dist-info/METADATA b/libs/pygments-2.19.1.dist-info/METADATA similarity index 94% rename from libs/pygments-2.18.0.dist-info/METADATA rename to libs/pygments-2.19.1.dist-info/METADATA index 3b102e1c8..8671c6d8f 100644 --- a/libs/pygments-2.18.0.dist-info/METADATA +++ b/libs/pygments-2.19.1.dist-info/METADATA @@ -1,6 +1,6 @@ -Metadata-Version: 2.3 +Metadata-Version: 2.4 Name: Pygments -Version: 2.18.0 +Version: 2.19.1 Summary: Pygments is a syntax highlighting package written in Python. Project-URL: Homepage, https://pygments.org Project-URL: Documentation, https://pygments.org/docs @@ -27,6 +27,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Text Processing :: Filters @@ -53,5 +54,5 @@ are: formats that PIL supports and ANSI sequences * it is usable as a command-line tool and as a library -Copyright 2006-2024 by the Pygments team, see ``AUTHORS``. +Copyright 2006-2025 by the Pygments team, see ``AUTHORS``. Licensed under the BSD, see ``LICENSE`` for details. diff --git a/libs/pygments-2.19.1.dist-info/RECORD b/libs/pygments-2.19.1.dist-info/RECORD new file mode 100644 index 000000000..4801085a7 --- /dev/null +++ b/libs/pygments-2.19.1.dist-info/RECORD @@ -0,0 +1,346 @@ +../../bin/pygmentize,sha256=iP3M-_dI6wQP1Gtg8ZvtFWFDy3x82yIJIrmsdlQpEe0,238 +pygments-2.19.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pygments-2.19.1.dist-info/METADATA,sha256=QGjhRksrfp_I-eQNvdNKViqR538H_0l-x473HqO-rxM,2512 +pygments-2.19.1.dist-info/RECORD,, +pygments-2.19.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pygments-2.19.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +pygments-2.19.1.dist-info/entry_points.txt,sha256=uUXw-XhMKBEX4pWcCtpuTTnPhL3h7OEE2jWi51VQsa8,53 +pygments-2.19.1.dist-info/licenses/AUTHORS,sha256=BmDjGKbyFYAq3Icxq4XQxl_yfPzKP10oWX8wZHYZW9k,10824 +pygments-2.19.1.dist-info/licenses/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331 +pygments/__init__.py,sha256=H0XmVJ1Fe9qSEDBU1j1wZLT-Tfu7blFbDiFSfpwU63c,2959 +pygments/__main__.py,sha256=p8AJyoyCOMYGvzWHdnq0_A9qaaVqaj02nIu3xhJp1_4,348 +pygments/cmdline.py,sha256=4pL9Kpn2PUEKPobgrsQgg-vCx2NjsrapKzQ6LxQR7Q0,23536 +pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718 +pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910 +pygments/filters/__init__.py,sha256=B00KqPCQh5E0XhzaDK74Qa1E4fDSTlD6b0Pvr1v-vEQ,40344 +pygments/formatter.py,sha256=H_4J-moKkKfRWUOW9J0u7hhw6n1LiO-2Xu1q2B0sE5w,4366 +pygments/formatters/__init__.py,sha256=7OuvmoYLyoPzoOQV_brHG8GSKYB_wjFSkAQng6x2y9g,5349 +pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 +pygments/formatters/bbcode.py,sha256=s0Ka35OKuIchoSgEAGf6rj0rl2a9ym9L31JVNSRbZFQ,3296 +pygments/formatters/groff.py,sha256=pLcIHj4jJS_lRAVFnyJODKDu1Xlyl9_AEIdOtbl3DT0,5082 +pygments/formatters/html.py,sha256=FrHJ69FUliEyPY0zTfab0C1gPf7LXsKgeRlhwkniqIs,35953 +pygments/formatters/img.py,sha256=aRpFo8mBmWTL3sBUjRCWkeS3rc6FZrSFC4EksDrl53g,23301 +pygments/formatters/irc.py,sha256=R0Js0TYWySlI2yE9sW6tN4d4X-x3k9ZmudsijGPnLmU,4945 +pygments/formatters/latex.py,sha256=BRYtbLeW_YD1kwhhnFInhJIKylurnri8CF1lP069KWE,19258 +pygments/formatters/other.py,sha256=8pYW27sU_7XicLUqOEt2yWSO0h1IEUM3TIv34KODLwo,4986 +pygments/formatters/pangomarkup.py,sha256=pcFvEC7K1Me0EjGeOZth4oCnEY85bfqc77XzZASEPpY,2206 +pygments/formatters/rtf.py,sha256=kcKMCxTXu-2-hpgEftlGJRm7Ss-yA_Sy8OsHH_qzykA,11921 +pygments/formatters/svg.py,sha256=R6A2ME6JsMQWFiyn8wcKwFUOD6vsu-HLwiIztLu-77E,7138 +pygments/formatters/terminal.py,sha256=J_F_dFXwR9LHWvatIDnwqRYJyjVmSo1Zx8K_XDh6SyM,4626 +pygments/formatters/terminal256.py,sha256=7GQFLE5cfmeu53CAzANO74-kBk2BFkXfn5phmZjYkhM,11717 +pygments/lexer.py,sha256=ib-F_0GxHkwGpb6vWP0DeLMLc7EYgjo3hWFKN5IgOq0,35109 +pygments/lexers/__init__.py,sha256=6YhzxGKlWk38P6JpIJUQ1rVvV0DEZjEmdYsdMQ58hSk,12067 +pygments/lexers/_ada_builtins.py,sha256=CA_OnShtdc7wWh9oYcRlcrkDAQwYUKl6w7tdSbALQd4,1543 +pygments/lexers/_asy_builtins.py,sha256=cd9M00YH19w5ZL7aqucmC3nwpJGTS04U-01NLy5E2_4,27287 +pygments/lexers/_cl_builtins.py,sha256=kQeUIyZjP4kX0frkICDcKxBYQCLqzIDXa5WV5cevhDo,13994 +pygments/lexers/_cocoa_builtins.py,sha256=Ka1lLJe7JfWtdho4IFIB82X9yBvrbfHCCmEG-peXXhQ,105173 +pygments/lexers/_csound_builtins.py,sha256=qnQYKeI26ZHim316uqy_hDiRiCoHo2RHjD3sYBALyXs,18414 +pygments/lexers/_css_builtins.py,sha256=aD-dhLFXVd1Atn_bZd7gEdQn7Mhe60_VHpvZ340WzDI,12446 +pygments/lexers/_googlesql_builtins.py,sha256=IkrOk-T2v1yzbGzUEEQh5_Cf4uC_cmL_uuhwDpZlTug,16132 +pygments/lexers/_julia_builtins.py,sha256=N2WdSw5zgI2fhDat_i4YeVqurRTC_P8x71ez00SCN6U,11883 +pygments/lexers/_lasso_builtins.py,sha256=8q1gbsrMJeaeUhxIYKhaOxC9j_B-NBpq_XFj2Ze41X0,134510 +pygments/lexers/_lilypond_builtins.py,sha256=XTbGL1z1oKMoqWLEktG33jx5GdGTI9CpeO5NheEi4Y0,108094 +pygments/lexers/_lua_builtins.py,sha256=PhFdZV5-Tzz2j_q4lvG9lr84ELGfL41BhnrSDNNTaG4,8108 +pygments/lexers/_luau_builtins.py,sha256=-IDrU04kUVfjXwSQzMMpXmMYhNsQxZVVZk8cuAA0Lo0,955 +pygments/lexers/_mapping.py,sha256=9fv7xYOUAOr6LzfdFS4MDbPu78o4OQQH-2nsI1bNZf4,70438 +pygments/lexers/_mql_builtins.py,sha256=ybRQjlb7Cul0sDstnzxJl3h0qS6Ieqsr811fqrxyumU,24713 +pygments/lexers/_mysql_builtins.py,sha256=y0kAWZVAs0z2dTFJJV42OZpILgRnd8T3zSlBFv-g_oA,25838 +pygments/lexers/_openedge_builtins.py,sha256=Sz4j9-CPWIaxMa-2fZgY66j7igcu1ob1GR2UtI8zAkg,49398 +pygments/lexers/_php_builtins.py,sha256=Jd4BZpjMDELPi4EVoSxK1-8BFTc63HUwYfm1rLrGj0M,107922 +pygments/lexers/_postgres_builtins.py,sha256=Pqh4z0RBRbnW6rCQtWUdzWCJxNyqpJ7_0HOktxHDxk4,13343 +pygments/lexers/_qlik_builtins.py,sha256=xuJy9c9uZDXv6h8z582P5PrxqkxTZ_nS8gPl9OD9VN8,12595 +pygments/lexers/_scheme_builtins.py,sha256=2hNtJOJmP21lUsikpqMJ2gAmLT3Rwn_KEeqhXwCjgfk,32564 +pygments/lexers/_scilab_builtins.py,sha256=oZYPB1XPdIEz3pII11pFDe6extRRyWGA7pY06X8KZ8w,52411 +pygments/lexers/_sourcemod_builtins.py,sha256=H8AFLsNDdEpymIWOpDwbDJGCP1w-x-1gSlzPDioMF4o,26777 +pygments/lexers/_stan_builtins.py,sha256=dwi1hllM_NsaCv-aXJy7lEi57X5Hh5gSD97aCQyT9KM,13445 +pygments/lexers/_stata_builtins.py,sha256=Hqrr6j77zWU3cGGpBPohwexZci43YA4_sVYE4E1sNow,27227 +pygments/lexers/_tsql_builtins.py,sha256=Pi2RhTXcLE3glI9oxNhyVsOMn-fK_1TRxJ-EsYP5LcI,15460 +pygments/lexers/_usd_builtins.py,sha256=c9hbU1cwqBUCFIhNfu_Dob8ywv1rlPhi9w2OTj3kR8s,1658 +pygments/lexers/_vbscript_builtins.py,sha256=MqJ2ABywD21aSRtWYZRG64CCbGstC1kfsiHGJmZzxiw,4225 +pygments/lexers/_vim_builtins.py,sha256=bA4mH8t1mPPQfEiUCKEqRO1O0rL2DUG0Ux1Bt8ZSu0E,57066 +pygments/lexers/actionscript.py,sha256=JBngCe5UhYT_0dLD2j7PnPO0xRRJhmypEuQ-C5in8pY,11727 +pygments/lexers/ada.py,sha256=58k5ra1vGS4iLpW3h1ItY9ftzF3WevaeAAXzAYTiYkQ,5353 +pygments/lexers/agile.py,sha256=DN-7AVIqtG1MshA94rtSGYI_884hVHgzq405wD0_dl8,896 +pygments/lexers/algebra.py,sha256=yGTu9Tt-cQzAISQYIC5MS5a3z4QmL-tGcXnd_pkWGbk,9952 +pygments/lexers/ambient.py,sha256=UnzKpIlfSm3iitHvMd7XTMSY8TjZYYhKOC3AiARS_cE,2605 +pygments/lexers/amdgpu.py,sha256=S8qjn2UMLhBFm3Yn_c06XAGf8cl5x_ZeluelWG_-JAw,1723 +pygments/lexers/ampl.py,sha256=ZBRfDXm760gR1a1gqItnsHuoO3JdUcTBjJ5tFY9UtPA,4176 +pygments/lexers/apdlexer.py,sha256=Zr5-jgjxC8PKzRlEeclakZXPHci7FHBZghQ6wwiuT7A,30800 +pygments/lexers/apl.py,sha256=PTQMp-bxT5P-DbrEvFha10HBTcsDJ5srL3I1s9ljz58,3404 +pygments/lexers/archetype.py,sha256=pQVlP1Fb5OA8nn7QwmFaaaOSvvpoIsQVw43FVCQCve4,11538 +pygments/lexers/arrow.py,sha256=2PKdbWq3xQLF1KoDbWvSxpjwKRrznnDiArTflRGZzBo,3564 +pygments/lexers/arturo.py,sha256=U5MtRNHJtnBn4ZOeWmW6MKlVRG7SX6KhTRamDqzn9tA,11414 +pygments/lexers/asc.py,sha256=-DgZl9jccBDHPlDmjCsrEqx0-Q7ap7XVdNKtxLNWG1w,1693 +pygments/lexers/asm.py,sha256=xm2Y5mcT-sF3oQvair4SWs9EWTyndoaUoSsDy5v6shI,41967 +pygments/lexers/asn1.py,sha256=BlcloIX2bu6Q7BxGcksuhYFHGsXLVKyB4B9mFd4Pj6E,4262 +pygments/lexers/automation.py,sha256=Q61qon8EwpfakMh_2MS2E2zUUT16rG3UNIKPYjITeTs,19831 +pygments/lexers/bare.py,sha256=tWoei86JJX1k-ADhaXd5TgX6ItDTici9yFWpkTPhnfM,3020 +pygments/lexers/basic.py,sha256=qpVe5h8Fa7NJo1EihN-4R_UZpHO6my2Ssgkb-BktkKs,27989 +pygments/lexers/bdd.py,sha256=yysefcOFAEyk9kJ2y4EXmzJTecgLYUHlWixt_3YzPMU,1641 +pygments/lexers/berry.py,sha256=zxGowFb8HMIyN15-m8nmWnW6bPRR4esKtSEVugc9uXM,3209 +pygments/lexers/bibtex.py,sha256=yuNoPxwrJf9DCGUT17hxfDzbq_HtCLkQkRbBtiTVmeQ,4811 +pygments/lexers/blueprint.py,sha256=NzvWHMxCLDWt8hc6gB5jokltxVJgNa7Jwh4c61ng388,6188 +pygments/lexers/boa.py,sha256=dOot1XWNZThPIio2UyAX67K6EpISjSRCFjotD7dcnwE,3921 +pygments/lexers/bqn.py,sha256=nJiwrPKKbRF-qdai5tfqipwBkkko2P3weiZAjHUMimY,3671 +pygments/lexers/business.py,sha256=lRtekOJfsDkb12AGbuz10-G67OJrVJgCBtihTQ8_aoY,28345 +pygments/lexers/c_cpp.py,sha256=D7ZIswaHASlGBgoTlwnSqTQHf8_JyvvSt2L2q1W-F6g,18059 +pygments/lexers/c_like.py,sha256=FTGp17ds6X2rDZOHup2hH6BEn3gKK4nLm9pydNEhm0E,32021 +pygments/lexers/capnproto.py,sha256=XQJAh1WS-0ulqbTn9TdzR6gEgWLcuBqb4sj3jNsrhsY,2174 +pygments/lexers/carbon.py,sha256=av12YuTGZGpOa1Cmxp3lppx3LfSJUWbvOu0ixmUVll0,3211 +pygments/lexers/cddl.py,sha256=MKa70IwABgjBjYu15_Q9v8rsu2sr1a-i2jkiaPTI6sM,5076 +pygments/lexers/chapel.py,sha256=0n_fL3ehLC4pw4YKnmq9jxIXOJcxGPka1Wr1t1zsXPc,5156 +pygments/lexers/clean.py,sha256=dkDPAwF5BTALPeuKFoRKOSD3RfsKcGWbaRo6_G8LHng,6418 +pygments/lexers/codeql.py,sha256=ebvghn2zbrnETV4buVozMDmRCVKSdGiIN8ycLlHpGsE,2576 +pygments/lexers/comal.py,sha256=TC3NzcJ58ew5jw7qwK0kJ-okTA47psZje0yAIS39HR4,3179 +pygments/lexers/compiled.py,sha256=Slfo1sjWqcPawUwf0dIIZLBCL5pkOIoAX2S8Lxs02Mc,1426 +pygments/lexers/configs.py,sha256=wW8pY0Sa5a10pnAeTLGf48HhixQTVageIyHEf1aYMCc,50913 +pygments/lexers/console.py,sha256=-jAG120dupvV3kG3zC70brLJvSLwTFqMubBQuj_GVnU,4180 +pygments/lexers/cplint.py,sha256=DkbyE5EKydLgf6BRr1FhQrK-IeQPL7Zmjk0DVdlRFnQ,1389 +pygments/lexers/crystal.py,sha256=xU-RnpIkpjrquoxtOuOcP8fcesSJl4xhU7kO9m42LZY,15754 +pygments/lexers/csound.py,sha256=ioSw4Q04wdwjUAbnTZ1qLhUq1vxdWFxhh3QtEl5RAJc,16998 +pygments/lexers/css.py,sha256=JN1RBYsee-jrpHWrSmhN3TKc4TkOBn-_BEGpgTCzcqE,25376 +pygments/lexers/d.py,sha256=piOy0EJeiAwPHugiM3gVv0z7HNh3u2gZQoCUSASRbY4,9920 +pygments/lexers/dalvik.py,sha256=deFg2JPBktJ9mEGb9EgxNkmd6vaMjJFQVzUHo8NKIa8,4606 +pygments/lexers/data.py,sha256=o0x0SmB5ms_CPUPljEEEenOON4IQWn86DkwFjkJYCOg,27026 +pygments/lexers/dax.py,sha256=ASi73qmr7OA7cVZXF2GTYGt01Ly1vY8CgD_Pnpm8k-4,8098 +pygments/lexers/devicetree.py,sha256=RecSQCidt8DRE1QFCPUbwwR0hiRlNtsFihdGldeUn3k,4019 +pygments/lexers/diff.py,sha256=F6vxZ64wm5Nag_97de1H_3F700ZwCVnYjKvtT5jilww,5382 +pygments/lexers/dns.py,sha256=Hh5hJ7MXfrq36KgfyIRwK3X8o1LdR98IKERcV4eZ7HY,3891 +pygments/lexers/dotnet.py,sha256=NDE0kOmpe96GLO-zwNLazmj77E9ORGmKpa4ZMCXDXxQ,39441 +pygments/lexers/dsls.py,sha256=GnHKhGL5GxsRFnqC7-65NTPZLOZdmnllNrGP86x_fQE,36746 +pygments/lexers/dylan.py,sha256=7zZ1EbHWXeVHqTD36AqykKqo3fhuIh4sM-whcxUaH_Y,10409 +pygments/lexers/ecl.py,sha256=vhmpa2LBrHxsPkYcf3kPZ1ItVaLRDTebi186wY0xGZA,6371 +pygments/lexers/eiffel.py,sha256=5ydYIEFcgcMoEj4BlK31hZ0aJb8OX0RdAvuCNdlxwqw,2690 +pygments/lexers/elm.py,sha256=uRCddU8jK5vVkH6Y66y8KOsDJprIfrOgeYq3hv1PxAM,3152 +pygments/lexers/elpi.py,sha256=O9j_WKBPyvNFjCRuPciVpW4etVSnILm_T79BhCPZYmo,6877 +pygments/lexers/email.py,sha256=ZZL6yvwCRl1CEQyysuOu0lbabp5tjMutS7f3efFKGR4,4804 +pygments/lexers/erlang.py,sha256=bU11eVHvooLwmVknzN6Xkb2DMk7HbenqdNlYSzhThDM,19147 +pygments/lexers/esoteric.py,sha256=Jfp8UUKyKYsqLaqXRZT3GSM9dzkF65zduwfnH1GoGhU,10500 +pygments/lexers/ezhil.py,sha256=22r-xjvvBVpExTqCI-HycAwunDb1p5gY4tIfDmM0vDw,3272 +pygments/lexers/factor.py,sha256=urZ4En4uKFCLXdEkXLWg9EYUFGHQTTDCwNXtyq-ngok,19530 +pygments/lexers/fantom.py,sha256=JJ13-NwykD-iIESnuzCefCYeQDO95cHMJA8TasF4gHA,10231 +pygments/lexers/felix.py,sha256=F-v0si4zPtRelqzDQWXI1-tarCE-BvawziODxRU7378,9655 +pygments/lexers/fift.py,sha256=rOCwp3v5ocK5YOWvt7Td3Md--97_8e-7Sonx52uS8mA,1644 +pygments/lexers/floscript.py,sha256=aHh82k52jMuDuzl9LatrcSANJiXTCyjGU3SO53bwbb0,2667 +pygments/lexers/forth.py,sha256=ZMtsHdNbnS_0IdSYlfAlfTSPEr0MEsRo-YZriQNueTQ,7193 +pygments/lexers/fortran.py,sha256=1PE5dTxf4Df6LUeXFcmNtyeXWsC8tSiK5dYwPHIJeeQ,10382 +pygments/lexers/foxpro.py,sha256=CBkW62Fuibz3yfyelZCaEO8GGdFJWsuRhqwtsSeBwLM,26295 +pygments/lexers/freefem.py,sha256=LFBQk-m1-nNCgrl-VDH3QwnVWurvb7W29i06LoT207A,26913 +pygments/lexers/func.py,sha256=OR2rkM7gf9fKvad5WcFQln-_U_pb-RUCM9eQatToF4A,3700 +pygments/lexers/functional.py,sha256=fYT2AGZ642cRkIAId0rnXFBsx1c8LLEDRN_VuCEkUyM,693 +pygments/lexers/futhark.py,sha256=Vf1i4t-tR3zqaktVjhTzFNg_ts_9CcyA4ZDfDizbCmk,3743 +pygments/lexers/gcodelexer.py,sha256=4Xs9ax4-JZGupW_qSnHon39wQGpb-tNA3xorMKg841E,874 +pygments/lexers/gdscript.py,sha256=Ws7JKxy0M0IyZ_1iMfRvJPrizEwmeCNLDoeMIFaM-CU,7566 +pygments/lexers/gleam.py,sha256=XIlTcq6cB743pCqbNYo8PocSkjZyDPR6hHgdaJNJ1Vc,2392 +pygments/lexers/go.py,sha256=4LezefgyuqZWHzLZHieUkKTi-ssY6aHJxx7Z-LFaLK0,3783 +pygments/lexers/grammar_notation.py,sha256=LvzhRQHgwZzq9oceukZS_hwnKK58ee7Z5d0cwXOR734,8043 +pygments/lexers/graph.py,sha256=WFqoPA1c_hHYrV0i_F7-eUw3Co4_HmZY3GJ-TyDr670,4108 +pygments/lexers/graphics.py,sha256=tmF9NNALnvPnax8ywYC3pLOla45YXtp9UA0H-5EiTQY,39145 +pygments/lexers/graphql.py,sha256=O_zcrGrBaDaKTlUoJGRruxqk7CJi-NR92Y0Cs-KkCvw,5601 +pygments/lexers/graphviz.py,sha256=mzdXOMpwz9_V-be1eTAMyhkKCBl6UxCIXuq6C2yrtsw,1934 +pygments/lexers/gsql.py,sha256=VPZk9sb26-DumRkWfEaSTeoc0lx5xt5n-6eDDLezMtc,3990 +pygments/lexers/hare.py,sha256=PGCOuILktJsmtTpCZZKkMFtObfJuBpei8HM8HHuq1Tw,2649 +pygments/lexers/haskell.py,sha256=MYr74-PAC8kGJRX-dZmvZsHTc7a2u6yFS2B19LfDD7g,33262 +pygments/lexers/haxe.py,sha256=WHCy_nrXHnfLITfbdp3Ji3lqQU4HAsTUpXsLCp2_4sk,30974 +pygments/lexers/hdl.py,sha256=MOWxhmAuE4Ei0CKDqqaON7T8tl43geancrNYM136Z0U,22738 +pygments/lexers/hexdump.py,sha256=1lj9oJ-KiZXSVYvTMfGmEAQzNEW08WlMcC2I5aYvHK4,3653 +pygments/lexers/html.py,sha256=MxYTI4EeT7QxoGleCAyQq-8n_Sgly6tD95H5zanCNmk,21977 +pygments/lexers/idl.py,sha256=rcihUAGhfuGEaSW6pgFq6NzplT_pv0DagUoefg4zAmk,15449 +pygments/lexers/igor.py,sha256=wVefbUjb3ftaW3LCKGtX1JgLgiY4EmRor5gVOn8vQA8,31633 +pygments/lexers/inferno.py,sha256=ChE_5y5SLH_75Uv7D2dKWQMk2dlN6z1gY1IDjlJZ8rU,3135 +pygments/lexers/installers.py,sha256=ZHliit4Pxz1tYKOIjKkDXI5djTkpzYUMVIPR1xvUrL8,14435 +pygments/lexers/int_fiction.py,sha256=0ZzIa1sZDUQsltd1oHuS-BoNiOF8zKQfcVuDyK1Ttv8,56544 +pygments/lexers/iolang.py,sha256=L6dNDCLH0kxkIUi00fI4Z14QnRu79UcNDrgv02c5Zw8,1905 +pygments/lexers/j.py,sha256=DqNdwQGFLiZW3mCNLRg81gpmsy4Hgcai_9NP3LbWhNU,4853 +pygments/lexers/javascript.py,sha256=TGKQLSrCprCKfhLLGAq_0EOdvqvJKX9pOdKo7tCRurQ,63243 +pygments/lexers/jmespath.py,sha256=R5yA5LJ2nTIaDwnFIpSNGAThd0sAYFccwawA9xBptlg,2082 +pygments/lexers/jslt.py,sha256=OeYQf8O2_9FCaf9W6Q3a7rPdAFLthePCtVSgCrOTcl8,3700 +pygments/lexers/json5.py,sha256=8JZbc8EiTEZdKaIdQg3hXEh0mHWSzPlwd473a0nUuT0,2502 +pygments/lexers/jsonnet.py,sha256=bx2G6J4tJqGrJV1PyZrIWzWHXcoefCX-4lIxxtbn2gw,5636 +pygments/lexers/jsx.py,sha256=wGsoGSB40qAJrVfXwRPtan7OcK0O87RVsHHk0m6gogk,2693 +pygments/lexers/julia.py,sha256=0ZDJ9X83V5GqJzA6T6p0TTN8WHy2JAjvu-FSBXvfXdc,11710 +pygments/lexers/jvm.py,sha256=Yt1iQ3QodXRY-x_HUOGedhyuBBHn5jYH-I8NzOzHTlE,72667 +pygments/lexers/kuin.py,sha256=3dKKJVJlskgrvMKv2tY9NOsFfDjyo-3MLcJ1lFKdXSg,11405 +pygments/lexers/kusto.py,sha256=kaxkoPpEBDsBTCvCOkZZx7oGfv0jk_UNIRIRbfVAsBE,3477 +pygments/lexers/ldap.py,sha256=77vF4t_19x9V522cxRCM5d3HW8Ne3giYsFsMPVYYBw4,6551 +pygments/lexers/lean.py,sha256=7HWRgxFsxS1N9XKqw0vfKwaxl27s5YiVYtZeRUoTHFo,8570 +pygments/lexers/lilypond.py,sha256=yd2Tuv67um6EyCIr-VwBnlPhTHxMaQsBJ4nGgO5fjIk,9752 +pygments/lexers/lisp.py,sha256=EHUy1g4pzEsYPE-zGj2rAXm3YATE1j9dCQOr5-JPSkU,157668 +pygments/lexers/macaulay2.py,sha256=zkV-vxjQYa0Jj9TGfFP1iMgpTZ4ApQuAAIdJVGWb2is,33366 +pygments/lexers/make.py,sha256=YMI5DBCrxWca-pz9cVXcyfuHLcikPx9R_3pW_98Myqo,7831 +pygments/lexers/maple.py,sha256=Rs0dEmOMD3C1YQPd0mntN-vzReq4XfHegH6xV4lvJWo,7960 +pygments/lexers/markup.py,sha256=zWtxsyIx_1OxQzS6wLe8bEqglePv4RqvJjbia8AvV5c,65088 +pygments/lexers/math.py,sha256=P3ZK1ePd8ZnLdlmHezo2irCA8T2-nlHBoSaBoT5mEVI,695 +pygments/lexers/matlab.py,sha256=F9KO4qowIhfP8oVhCRRzE_1sqg4zmQbsB2NZH193PiM,133027 +pygments/lexers/maxima.py,sha256=a0h9Ggs9JEovTrzbJT-BLVbOqI29yPnaMZlkU5f_FeY,2715 +pygments/lexers/meson.py,sha256=BMrsDo6BH2lzTFw7JDwQ9SDNMTrRkXCNRDVf4aFHdsI,4336 +pygments/lexers/mime.py,sha256=yGrf3h37LK4b6ERBpFiL_qzn3JgOfGR5KLagnbWFl6c,7582 +pygments/lexers/minecraft.py,sha256=Nu88snDDPzM0D-742fFdUriczL-EE911pAd4_I4-pAw,13696 +pygments/lexers/mips.py,sha256=STKiZT67b3QERXXn7XKVxlPBu7vwbPC5EyCpuf3Jfbw,4656 +pygments/lexers/ml.py,sha256=t8sCv4BjvuBq6AihKKUwStEONIgdXCC2RMtO0RopNbM,35390 +pygments/lexers/modeling.py,sha256=M7B58bGB-Zwd1EmPxKqtRvg7TgNCyem3MVUHv0_H2SQ,13683 +pygments/lexers/modula2.py,sha256=NtpXBRoUCeHfflgB39LknSkCwhBHBKv2Er_pinjVsNE,53072 +pygments/lexers/mojo.py,sha256=8JRVoftN1E-W2woG0K-4n8PQXTUM9iY6Sl5sWb2uGNg,24233 +pygments/lexers/monte.py,sha256=baWU6zlXloenw9MO1MtEVGE9i3CfiXAYhqU621MIjRk,6289 +pygments/lexers/mosel.py,sha256=gjRdedhA1jTjoYoM1Gpaoog_I9o7TRbYMHk97N1TXwg,9297 +pygments/lexers/ncl.py,sha256=zJ6ahlitit4S0pBXc7Wu96PB7xOn59MwfR2HdY5_C60,63999 +pygments/lexers/nimrod.py,sha256=Q1NSqEkLC5wWt7xJyKC-vzWw_Iw2SfDNP_pyMFBuIfA,6413 +pygments/lexers/nit.py,sha256=p_hVD8GzMRl3CABVKHtYgnXFUQk0i5F2FbWFA6WXm6s,2725 +pygments/lexers/nix.py,sha256=NOrv20gdq-2A7eZ6c2gElPHv1Xx2pvv20-qOymL9GMg,4421 +pygments/lexers/numbair.py,sha256=fxkp2CXeXWKBMewfi1H4JSYkmm4kU58wZ2Sh9BDYAWQ,1758 +pygments/lexers/oberon.py,sha256=jw403qUUs7zpTHAs5CbLjb8qiuwtxLk0spDIYqGZwAw,4210 +pygments/lexers/objective.py,sha256=Fo1WB3JMj8sNeYnvB84H4_qwhOt4WNJtJWjVEOwrJGk,23297 +pygments/lexers/ooc.py,sha256=kD1XaJZaihDF_s-Vyu1Bx68S_9zFt2rhox7NF8LpOZM,3002 +pygments/lexers/openscad.py,sha256=h9I1k8kiuQmhX5vZm6VDSr2fa5Finy0sN8ZDIE-jx1c,3700 +pygments/lexers/other.py,sha256=WLVyqPsvm9oSXIbZwbfyJloS6HGgoFW5nVTaU1uQpTw,1763 +pygments/lexers/parasail.py,sha256=DWMGhtyQgGTXbIgQl_mID6CKqi-Dhbvs_dTkmvrZXfE,2719 +pygments/lexers/parsers.py,sha256=feNgxroPoWRf0NEsON2mtmKDUfslIQppukw6ndEsQ3M,26596 +pygments/lexers/pascal.py,sha256=N2tRAjlXnTxggAzzk2tOOAVzeC2MBzrXy97_HQl5n44,30989 +pygments/lexers/pawn.py,sha256=LWUYQYsebMMt2d5oxX1HYWvBqbakR1h7Av_z8Vw94Wg,8253 +pygments/lexers/pddl.py,sha256=Mk4_BzlROJCd0xR4KKRRSrbj0F7LLQcBRjmsmtWmrCg,2989 +pygments/lexers/perl.py,sha256=9BXn3tyHMA49NvzbM9E2czSCHjeU7bvaPLUcoZrhz-4,39192 +pygments/lexers/phix.py,sha256=hZqychqo5sFMBDESzDPXg1DYHQe_9sn294UfbjihaFk,23249 +pygments/lexers/php.py,sha256=l4hzQrlm0525i5dSw9Vmjcai3TzbPT6DkjzxPg9l6Zc,13061 +pygments/lexers/pointless.py,sha256=WSDjqQyGrNIGmTCdaMxl4zk7OZTlJAMzeUZ02kfgcTI,1974 +pygments/lexers/pony.py,sha256=EXrMkacqMZblI7v4AvBRQe-3Py8__bx5FOgjCLdfXxQ,3279 +pygments/lexers/praat.py,sha256=4UFK-nbC6WkZBhJgcQqEGqq9CocJkW7AmT_OJQbjWzk,12676 +pygments/lexers/procfile.py,sha256=05W2fyofLTP-FbEdSXD1eles-PPqVNfF6RWXjQdW2us,1155 +pygments/lexers/prolog.py,sha256=9Kc5YNUFqkfWu2sYoyzC3RX65abf1bm7oHr86z1s4kQ,12866 +pygments/lexers/promql.py,sha256=n-0vo-o8-ZasqP3Va4ujs562UfZSLfZF-RzT71yL0Tk,4738 +pygments/lexers/prql.py,sha256=PFReuvhbv4K5aeu6lvDfw4m-3hULkB3r43bKAy948os,8747 +pygments/lexers/ptx.py,sha256=KSHAvbiNVUntKilQ6EPYoLFocmJpRsBy_7fW6_Nrs1Y,4501 +pygments/lexers/python.py,sha256=WZe7fBAHKZ_BxPg8qIU26UGhk8qwUYyENJ3IyPW64mc,53805 +pygments/lexers/q.py,sha256=WQFUh3JrpK2j-VGW_Ytn3uJ5frUNmQIFnLtMVGRA9DI,6936 +pygments/lexers/qlik.py,sha256=2wqwdfIjrAz6RNBsP4MyeLX8Z7QpIGzxtf1CvaOlr_g,3693 +pygments/lexers/qvt.py,sha256=XMBnsWRrvCDf989OuDeb-KpszAkeETiACyaghZeL1ns,6103 +pygments/lexers/r.py,sha256=B6WgrD9SY1UTCV1fQBSlZbezPfpYsARn3FQIHcFYOiM,6474 +pygments/lexers/rdf.py,sha256=qUzxLna9v071bHhZAjdsBi8dKaJNk_h9g1ZRUAYCfoo,16056 +pygments/lexers/rebol.py,sha256=4u3N4kzui55HapopXDu3Kt0jczxDZ4buzwR7Mt4tQiM,18259 +pygments/lexers/rego.py,sha256=Rx5Gphbktr9ojg5DbqlyxHeQqqtF7g8W-oF0rmloDNY,1748 +pygments/lexers/resource.py,sha256=ioEzgWksB5HCjoz85XNkQPSd7n5kL0SZiuPkJP1hunQ,2927 +pygments/lexers/ride.py,sha256=kCWdxuR3PclVi4wiA0uUx4CYEFwuTqoMsKjhSW4X3yg,5035 +pygments/lexers/rita.py,sha256=Mj1QNxx1sWAZYC02kw8piVckaiw9B0MqQtiIiDFH0pA,1127 +pygments/lexers/rnc.py,sha256=g7ZD334PMGUqy_Ij64laSN1vJerwHqVkegfMCa3E-y8,1972 +pygments/lexers/roboconf.py,sha256=HbYuK5CqmQdd63SRY2nle01r7-p7mil0SnoauYDmEOY,2074 +pygments/lexers/robotframework.py,sha256=c4U1B9Q9ITBCTohqJTZOvkfyeVbenN4xhzSWIoZh5eU,18448 +pygments/lexers/ruby.py,sha256=uG617E5abBZcECRCqkhIfc-IbZcRb5cGuUZq_xpax90,22753 +pygments/lexers/rust.py,sha256=ZY-9vtsreBP0NfDd0WCouLSp_9MChAL8U8Abe-m9PB8,8260 +pygments/lexers/sas.py,sha256=C1Uz2s9DU6_s2kL-cB_PAGPtpyK5THlmhNmCumC1l48,9456 +pygments/lexers/savi.py,sha256=jrmruK0GnXktgBTWXW3oN3TXtofn3HBbkMlHnR84cko,4878 +pygments/lexers/scdoc.py,sha256=DXRmFDmYuc7h3gPAAVhfcL1OEbNBK5RdPpJqQzF3ZTk,2524 +pygments/lexers/scripting.py,sha256=jnJv_AFDyDrpzEPGNat5K6xzUBsEAiBr6N2_yLMt8LQ,81724 +pygments/lexers/sgf.py,sha256=w6C513ENaO2YCnqrduK7k03NaMDf-pgygvfzq2NaSRk,1985 +pygments/lexers/shell.py,sha256=dCS1zwkf5KwTog4__MnMC7h3Xmwv4_d3fnEV29tSwXI,36381 +pygments/lexers/sieve.py,sha256=eob-L84yf2jmhdNyYZUlbUJozdcd6GXcHW68lmAe8WE,2514 +pygments/lexers/slash.py,sha256=I-cRepmaxhL1SgYvD1hHX3gNBFI8NPszdU7hn1o5JlA,8484 +pygments/lexers/smalltalk.py,sha256=ue2PmqDK2sw0j75WdseiiENJBdZ1OwysH2Op1QN1r24,7204 +pygments/lexers/smithy.py,sha256=VREWoeuz7ANap_Uiopn7rs0Tnsfc-xBisDJKRGQY_y8,2659 +pygments/lexers/smv.py,sha256=He_VBSMbWONMWZmkrB5RYR0cfHVnMyKIXz68IFYl-a8,2805 +pygments/lexers/snobol.py,sha256=qDzb41xQQWMNmjB2MtZs23pFoFgZ2gbRZhK_Ir03r7I,2778 +pygments/lexers/solidity.py,sha256=Tixfnwku4Yezj6nNm8xVaw7EdV1qgAgdwahdTFP0St8,3163 +pygments/lexers/soong.py,sha256=Vm18vV4g6T8UPgjjY2yTRlSXGDpZowmuqQUBFfm4A9A,2339 +pygments/lexers/sophia.py,sha256=2YtYIT8iwAoW0B7TZuuoG_ZILhJV-2A7oBGat-98naE,3376 +pygments/lexers/special.py,sha256=8JuR2Vex8X-RWnC36S0HXTHWp2qmZclc90-TrLUWyaY,3585 +pygments/lexers/spice.py,sha256=m4nK0q4Sq_OFQez7kGWfki0No4ZV24YrONfHVj1Piqs,2790 +pygments/lexers/sql.py,sha256=2QvawM04xY96nvWadmHgHPDhOFbHGaFAQ_01rbNX_mc,48919 +pygments/lexers/srcinfo.py,sha256=B8vDs-sJogG3mWa5Hp_7JfHHUMyYRwGvKv6cKbFQXLM,1746 +pygments/lexers/stata.py,sha256=Zr9BC52D5O_3BbdW0N-tzoUmy0NTguL2sC-saXRVM-c,6415 +pygments/lexers/supercollider.py,sha256=_H5wDrn0DiGnlhB_cz6Rt_lo2TvqjSm0o6NPTd9R4Ko,3697 +pygments/lexers/tablegen.py,sha256=1JjedXYY18BNiY9JtNGLOtGfiwduNDZpQLBGTeQ6jAw,3987 +pygments/lexers/tact.py,sha256=X_lsxjFUMaC1TmYysXJq9tmAGifRnil83Bt1zA86Xdo,10809 +pygments/lexers/tal.py,sha256=xS9PlaWQOPj8MVr56fUNq31vUQKRWoLTlyWj9ZHm8AM,2904 +pygments/lexers/tcl.py,sha256=lK97ju4nikkt-oGOzIeyFEM98yq4dZSI8uEmYsq0R6c,5512 +pygments/lexers/teal.py,sha256=t3dqy_Arwv8_yExbX_xiFxv1TqJLPv4vh1MVKjKwS4Y,3522 +pygments/lexers/templates.py,sha256=BVdjYeoacIUuFyHTG39j4PxeNCe5E1oUURjH1rITrI4,75731 +pygments/lexers/teraterm.py,sha256=ciwztagW5Drg2gr17Qykrh6GwMsKy7e4xdQshX95GyQ,9718 +pygments/lexers/testing.py,sha256=YZgDgUEaLEYKSKEqpDsUi3Bn-Db_D42IlyiSsr1oX8U,10810 +pygments/lexers/text.py,sha256=nOCQPssIlKdVWU3PKxZiBPkf_KFM2V48IOssSyqhFY8,1068 +pygments/lexers/textedit.py,sha256=ttT4Ph-hIdgFLG6maRy_GskkziTFK0Wcg28yU0s6lek,7760 +pygments/lexers/textfmts.py,sha256=mi9KLEq4mrzDJbEc8G3VM-mSki_Tylkzodu47yH6z84,15524 +pygments/lexers/theorem.py,sha256=51ppBAEdhJmwU_lC916zMyjEoKLXqf89VAE_Lr0PNCc,17855 +pygments/lexers/thingsdb.py,sha256=x_fHNkLA-hIJyeIs6rg_X8n5OLYvFqaSu1FhI3apI5Y,6017 +pygments/lexers/tlb.py,sha256=ue2gqm45BI512lM13O8skAky9zAb7pLMrxZ8pbt5zRU,1450 +pygments/lexers/tls.py,sha256=_uQUVuMRDOhN-XUyGR5DIlVCk1CUZ1fIOSN4_WQYPKk,1540 +pygments/lexers/tnt.py,sha256=pK4LgoKON7u1xF66JYFncAPSbD8DZaeI_WTZ9HqEFlY,10456 +pygments/lexers/trafficscript.py,sha256=X3B8kgxS54ecuok9ic6Hkp-UMn5DvOmCK0p70Tz27Cw,1506 +pygments/lexers/typoscript.py,sha256=mBuePiVZUoAORPKsHwrx6fBWiy3fAIqG-2O67QmMiFI,8332 +pygments/lexers/typst.py,sha256=zIJBEhUXtWp5OiyAmvFA5m8d1EQG-ocwrJ677dvTUAk,7167 +pygments/lexers/ul4.py,sha256=rCaw0J9j3cdql9lX_HTilg65k9-9S118zOA6TAYfxaM,10499 +pygments/lexers/unicon.py,sha256=RAqoCnAAJBYOAGdR8ng0g6FtB39bGemLRlIqv5mcg9E,18625 +pygments/lexers/urbi.py,sha256=ajNP70NJg32jNnFDZsLvr_-4TToSGqRGkFyAPIJLfCU,6082 +pygments/lexers/usd.py,sha256=2eEGouolodYS402P_gtBrn4lLzpg1z8uHwPCKqjUb_k,3304 +pygments/lexers/varnish.py,sha256=dSh0Ku9SrjmlB29Fi_mWdWavN7M0cMKeepR4a34sOyI,7473 +pygments/lexers/verification.py,sha256=Qu433Q_h3EK3uS4bJoLRFZK0kIVwzX5AFKsa4Z-qnxA,3934 +pygments/lexers/verifpal.py,sha256=buyOOzCo_dGnoC40h0tthylHVVpgDt8qXu4olLvYy_4,2661 +pygments/lexers/vip.py,sha256=2lEV4cLV9p4E37wctBL7zkZ4ZU4p3HVsiLJFzB1bie0,5711 +pygments/lexers/vyper.py,sha256=Zq6sQIUBk6mBdpgOVgu3A6swGoBne0kDlRyjZznm2BY,5615 +pygments/lexers/web.py,sha256=4W9a7vcskrGJnxt4KmoE3SZydWB1qLq7lP2XS85J_m8,913 +pygments/lexers/webassembly.py,sha256=zgcMouzLawcbeFr6w_SOvGoUR68ZtqnnsbOcWEVleLk,5698 +pygments/lexers/webidl.py,sha256=ODtVmw4gVzI8HQWxuEckP6KMwm8WP2G2lSZEjagDXts,10516 +pygments/lexers/webmisc.py,sha256=-_-INDVdk47e2jlj-9bFcuLtntqVorBqIjlnwPfZFdI,40564 +pygments/lexers/wgsl.py,sha256=9igd9dzixGIgNewruv9mPnFms-c9BahkZcCCrZygv84,11880 +pygments/lexers/whiley.py,sha256=lMr750lA4MZsB4xqzVsIRtVMJIC3_dArhFYTHvOPwvA,4017 +pygments/lexers/wowtoc.py,sha256=8xxvf0xGeYtf4PE7KtkHZ_ly9xY_XXHrpCitdKE42Ro,4076 +pygments/lexers/wren.py,sha256=goGXnAMKKa13LLL40ybT3aMGPrk3gCRwZQFYAkKB_w0,3229 +pygments/lexers/x10.py,sha256=Q-AmgdF2E-N7mtOPpZ07CsxrTVnikyqC4uRRv6H75sk,1943 +pygments/lexers/xorg.py,sha256=9ttrBd3_Y2nXANsqtMposSgblYmMYqWXQ-Iz5RH9RsU,925 +pygments/lexers/yang.py,sha256=13CWbSaNr9giOHz4o0SXSklh0bfWt0ah14jJGpTvcn0,4499 +pygments/lexers/yara.py,sha256=jUSv78KTDfguCoAoAZKbYzQERkkyxBBWv5dInVrkDxo,2427 +pygments/lexers/zig.py,sha256=f-80MVOSp1KnczAMokQLVM-_wAEOD16EcGFnaCNlsN0,3976 +pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005 +pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891 +pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072 +pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092 +pygments/sphinxext.py,sha256=VEe_oHNgLoEGMHc2ROfbee2mF2PPREFyE6_m_JN5FvQ,7898 +pygments/style.py,sha256=Cpw9dCAyW3_JAwFRXOJXmtKb5ZwO2_5KSmlq6q4fZw4,6408 +pygments/styles/__init__.py,sha256=f9KCQXN4uKbe8aI8-L3qTC-_XPfT563FwTg6VTGVfwI,2006 +pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312 +pygments/styles/abap.py,sha256=64Uwr8uPdEdcT-tE-Y2VveTXfH3SkqH9qdMgY49YHQI,749 +pygments/styles/algol.py,sha256=fCuk8ITTehvbJSufiaKlgnFsKbl-xFxxR82xhltc-cQ,2262 +pygments/styles/algol_nu.py,sha256=Gv9WfHJvYegGcUk1zcufQgsdXPNjCUNk8sAHyrSGGh4,2283 +pygments/styles/arduino.py,sha256=NoUB8xk7M1HGPoLfuySOLU0sVwoTuLcZqllXl2EO_iE,4557 +pygments/styles/autumn.py,sha256=fLLfjHXjxCl6crBAxEsBLH372ALMkFacA2bG6KFbJi4,2195 +pygments/styles/borland.py,sha256=_0ySKp4KGCSgtYjPe8uzD6gQhlmAIR4T43i-FoRYNOM,1611 +pygments/styles/bw.py,sha256=vhk8Xoj64fLPdA9IQU6mUVsYMel255jR-FDU7BjIHtI,1406 +pygments/styles/coffee.py,sha256=NqLt-fc7LONma1BGggbceVRY9uDE70WBuZXqK4zwaco,2308 +pygments/styles/colorful.py,sha256=mYcSbehtH7itH_QV9NqJp4Wna1X4lrwl2wkVXS2u-5A,2832 +pygments/styles/default.py,sha256=RTgG2zKWWUxPTDCFxhTnyZI_WZBIVgu5XsUpNvFisCA,2588 +pygments/styles/dracula.py,sha256=vRJmixBoSKV9o8NVQhXGViQqchhIYugfikLmvX0DoBw,2182 +pygments/styles/emacs.py,sha256=TiOG9oc83qToMCRMnJrXtWYqnzAqYycRz_50OoCKtxc,2535 +pygments/styles/friendly.py,sha256=oAi-l9anQTs9STDmUzXGDlOegatEOH4hpD0j6o6dZGM,2604 +pygments/styles/friendly_grayscale.py,sha256=a7Cqkzt6-uTiXvj6GoYBXzRvX5_zviCjjRB04Kf_-Q0,2828 +pygments/styles/fruity.py,sha256=GfSUTG0stlJr5Ow_saCaxbI2IB4-34Dp2TuRTpfUJBs,1324 +pygments/styles/gh_dark.py,sha256=ruNX3d4rf22rx-8HnwvGbNbXRQpXCNcHU1HNq6N4uNg,3590 +pygments/styles/gruvbox.py,sha256=KrFoHEoVnZW6XM9udyXncPomeGyZgIDsNWOH3kCrxFQ,3387 +pygments/styles/igor.py,sha256=fYYPhM0dRCvcDTMVrMVO5oFKnYm-8YVlsuVBoczFLtY,737 +pygments/styles/inkpot.py,sha256=jggSeX9NV15eOL2oJaVmZ6vmV7LWRzXJQRUqcWEqGRs,2404 +pygments/styles/lightbulb.py,sha256=Y8u1qdvlHfBqI2jJex55SkvVatVo_FjEUzE6h-X7m-0,3172 +pygments/styles/lilypond.py,sha256=Y6fp_sEL-zESmxAaMxzjtrKk90cuDC_DalNdC8wj0nw,2066 +pygments/styles/lovelace.py,sha256=cA9uhmbnzY04MccsiYSgMY7fvb4WMRbegWBUrGvXh1M,3178 +pygments/styles/manni.py,sha256=g9FyO7plTwfMm2cU4iiKgdlkMlvQLG6l2Lwkgz5ITS4,2443 +pygments/styles/material.py,sha256=LDmgomAbgtJDZhbv446_zIwgYh50UAqEEtgYNUns1rQ,4201 +pygments/styles/monokai.py,sha256=lrxTJpkBarV9gTLkBQryZ6oNSjekAVheJueKJP5iEYA,5184 +pygments/styles/murphy.py,sha256=-AKZiLkpiWej-otjHMsYCE-I-_IzCOLJY-_GBdKRZRw,2805 +pygments/styles/native.py,sha256=l6tezGSQTB8p_SyOXJ0PWI7KzCeEdtsPmVc4Yn4_CwU,2043 +pygments/styles/nord.py,sha256=GDt3WAaqaWsiCeqpIBPxd8TEUX708fGfwaA7S0w0oy0,5391 +pygments/styles/onedark.py,sha256=k80cZEppCEF-HLoxy_FEA0QmQDZze68nHVMNGyUVa28,1719 +pygments/styles/paraiso_dark.py,sha256=Jkrg4nUKIVNF8U4fPNV_Smq_g9NFbb9eiUrjYpVgQZg,5662 +pygments/styles/paraiso_light.py,sha256=MxN964ZEpze3wF0ss-igaa2I7E684MHe-Zq0rWPH3wo,5668 +pygments/styles/pastie.py,sha256=ZvAs9UpBNYFC-5PFrCRGYnm3FoPKb-eKR-ozbWZP-4g,2525 +pygments/styles/perldoc.py,sha256=HSxB93e4UpQkZspReQ34FeJbZ-59ksGvdaH-hToehi8,2230 +pygments/styles/rainbow_dash.py,sha256=4ugL18Or7aNtaLfPfCLFRiFy0Gu2RA4a9G2LQUE9SrM,2390 +pygments/styles/rrt.py,sha256=fgzfpC0PC_SCcLOMCNEIQTjPUMOncRe7SR10GfSRbXY,1006 +pygments/styles/sas.py,sha256=yzoXmbfQ2ND1WWq93b4vVGYkQSZHPqb4ymes9YYRT3w,1440 +pygments/styles/solarized.py,sha256=qupILFZn02WspnAF5SPYb-W8guo9xnUtjb1HeLw3XgE,4247 +pygments/styles/staroffice.py,sha256=CLbBeMoxay21Xyu3Af2p4xUXyG1_6ydCbvs5RJKYe5w,831 +pygments/styles/stata_dark.py,sha256=vX8SwHV__sG92F4CKribG08MJfSVq98dgs7gEA_n9yc,1257 +pygments/styles/stata_light.py,sha256=uV3GE-ylvffQ0yN3py1YAVqBB5wflIKZbceyK1Lqvrc,1289 +pygments/styles/tango.py,sha256=O2wcM4hHuU1Yt071M9CK7JPtiiSCqyxtT9tbiQICV28,7137 +pygments/styles/trac.py,sha256=9kMv1ZZyMKACWlx2fQVjRP0I2pgcRYCNrd7iGGZg9qk,1981 +pygments/styles/vim.py,sha256=J7_TqvrGkTX_XuTHW0In5wqPLAUPRWyr1122XueZWmM,2019 +pygments/styles/vs.py,sha256=s7YnzbIPuFU3LIke27mc4lAQSn2R3vbbHc1baMGSU_U,1130 +pygments/styles/xcode.py,sha256=PbQdzgGaA4a9LAU1i58alY9kM4IFlQX5jHQwOYmf_Rk,1504 +pygments/styles/zenburn.py,sha256=suZEKzBTCYdhf2cxNwcY7UATJK1tq5eYhGdBcXdf6MU,2203 +pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226 +pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208 +pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031 diff --git a/libs/pygments-2.18.0.dist-info/REQUESTED b/libs/pygments-2.19.1.dist-info/REQUESTED similarity index 100% rename from libs/pygments-2.18.0.dist-info/REQUESTED rename to libs/pygments-2.19.1.dist-info/REQUESTED diff --git a/libs/pygments-2.18.0.dist-info/WHEEL b/libs/pygments-2.19.1.dist-info/WHEEL similarity index 67% rename from libs/pygments-2.18.0.dist-info/WHEEL rename to libs/pygments-2.19.1.dist-info/WHEEL index cdd68a497..12228d414 100644 --- a/libs/pygments-2.18.0.dist-info/WHEEL +++ b/libs/pygments-2.19.1.dist-info/WHEEL @@ -1,4 +1,4 @@ Wheel-Version: 1.0 -Generator: hatchling 1.25.0 +Generator: hatchling 1.27.0 Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/pygments-2.18.0.dist-info/entry_points.txt b/libs/pygments-2.19.1.dist-info/entry_points.txt similarity index 100% rename from libs/pygments-2.18.0.dist-info/entry_points.txt rename to libs/pygments-2.19.1.dist-info/entry_points.txt diff --git a/libs/pygments-2.18.0.dist-info/licenses/AUTHORS b/libs/pygments-2.19.1.dist-info/licenses/AUTHORS similarity index 97% rename from libs/pygments-2.18.0.dist-info/licenses/AUTHORS rename to libs/pygments-2.19.1.dist-info/licenses/AUTHORS index 4ec64ba1e..811c66ae1 100644 --- a/libs/pygments-2.18.0.dist-info/licenses/AUTHORS +++ b/libs/pygments-2.19.1.dist-info/licenses/AUTHORS @@ -42,14 +42,17 @@ Other contributors, listed alphabetically, are: * Frits van Bommel -- assembler lexers * Pierre Bourdon -- bugfixes * Martijn Braam -- Kernel log lexer, BARE lexer +* JD Browne, Google LLC -- GoogleSQL lexer * Matthias Bussonnier -- ANSI style handling for terminal-256 formatter * chebee7i -- Python traceback lexer improvements * Hiram Chirino -- Scaml and Jade lexers * Mauricio Caceres -- SAS and Stata lexers. * Michael Camilleri, John Gabriele, sogaiu -- Janet lexer +* Daren Chandisingh -- Gleam lexer * Ian Cooper -- VGL lexer * David Corbett -- Inform, Jasmin, JSGF, Snowball, and TADS 3 lexers * Leaf Corcoran -- MoonScript lexer +* Fraser Cormack -- TableGen lexer * Gabriel Corona -- ASN.1 lexer * Christopher Creutzig -- MuPAD lexer * Daniël W. Crompton -- Pike lexer @@ -69,6 +72,7 @@ Other contributors, listed alphabetically, are: * Paweł Fertyk -- GDScript lexer, HTML formatter improvements * Michael Ficarra -- CPSA lexer * James H. Fisher -- PostScript lexer +* Amanda Fitch, Google LLC -- GoogleSQL lexer * William S. Fulton -- SWIG lexer * Carlos Galdino -- Elixir and Elixir Console lexers * Michael Galloy -- IDL lexer @@ -139,6 +143,7 @@ Other contributors, listed alphabetically, are: * Jon Larimer, Google Inc. -- Smali lexer * Olov Lassus -- Dart lexer * Matt Layman -- TAP lexer +* Dan Lazin, Google LLC -- GoogleSQL lexer * Kristian Lyngstøl -- Varnish lexers * Sylvestre Ledru -- Scilab lexer * Chee Sing Lee -- Flatline lexer @@ -252,6 +257,7 @@ Other contributors, listed alphabetically, are: * Matthias Vallentin -- Bro lexer * Benoît Vinot -- AMPL lexer * Linh Vu Hong -- RSL lexer +* Taavi Väänänen -- Debian control lexer * Immanuel Washington -- Smithy lexer * Nathan Weizenbaum -- Haml and Sass lexers * Nathan Whetsell -- Csound lexers @@ -263,6 +269,7 @@ Other contributors, listed alphabetically, are: * Enrique Zamudio -- Ceylon lexer * Alex Zimin -- Nemerle lexer * Rob Zimmerman -- Kal lexer +* Evgenii Zheltonozhskii -- Maple lexer * Vincent Zurczak -- Roboconf lexer * Hubert Gruniaux -- C and C++ lexer improvements * Thomas Symalla -- AMDGPU Lexer @@ -279,5 +286,6 @@ Other contributors, listed alphabetically, are: * Nikolay Antipov -- OpenSCAD lexer * Markus Meyer, Nextron Systems -- YARA lexer * Hannes Römer -- Mojo lexer +* Jan Frederik Schaefer -- PDDL lexer Many thanks for all contributions! diff --git a/libs/pygments-2.18.0.dist-info/licenses/LICENSE b/libs/pygments-2.19.1.dist-info/licenses/LICENSE similarity index 100% rename from libs/pygments-2.18.0.dist-info/licenses/LICENSE rename to libs/pygments-2.19.1.dist-info/licenses/LICENSE diff --git a/libs/pygments/__init__.py b/libs/pygments/__init__.py index e5a669ccb..d33a15630 100644 --- a/libs/pygments/__init__.py +++ b/libs/pygments/__init__.py @@ -21,12 +21,12 @@ .. _Pygments master branch: https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ from io import StringIO, BytesIO -__version__ = '2.18.0' +__version__ = '2.19.1' __docformat__ = 'restructuredtext' __all__ = ['lex', 'format', 'highlight'] diff --git a/libs/pygments/__main__.py b/libs/pygments/__main__.py index a24353174..4890a6c76 100644 --- a/libs/pygments/__main__.py +++ b/libs/pygments/__main__.py @@ -4,7 +4,7 @@ Main entry point for ``python -m pygments``. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/cmdline.py b/libs/pygments/cmdline.py index df1c3b7a4..2878fd55a 100644 --- a/libs/pygments/cmdline.py +++ b/libs/pygments/cmdline.py @@ -4,7 +4,7 @@ Command line interface. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/console.py b/libs/pygments/console.py index 4c1a06219..ee1ac27a2 100644 --- a/libs/pygments/console.py +++ b/libs/pygments/console.py @@ -4,7 +4,7 @@ Format colored console output. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/filter.py b/libs/pygments/filter.py index aa6f76041..5efff438d 100644 --- a/libs/pygments/filter.py +++ b/libs/pygments/filter.py @@ -4,7 +4,7 @@ Module that implements the default filter. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/filters/__init__.py b/libs/pygments/filters/__init__.py index 86e8dacf3..2fed761a0 100644 --- a/libs/pygments/filters/__init__.py +++ b/libs/pygments/filters/__init__.py @@ -5,7 +5,7 @@ Module containing filter lookup functions and default filters. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatter.py b/libs/pygments/formatter.py index cad3b388c..a20d3039d 100644 --- a/libs/pygments/formatter.py +++ b/libs/pygments/formatter.py @@ -4,7 +4,7 @@ Base formatter class. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/__init__.py b/libs/pygments/formatters/__init__.py index 014de975f..b24931cd1 100644 --- a/libs/pygments/formatters/__init__.py +++ b/libs/pygments/formatters/__init__.py @@ -4,7 +4,7 @@ Pygments formatters. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/_mapping.py b/libs/pygments/formatters/_mapping.py old mode 100755 new mode 100644 diff --git a/libs/pygments/formatters/bbcode.py b/libs/pygments/formatters/bbcode.py index 955408106..339edf9dc 100644 --- a/libs/pygments/formatters/bbcode.py +++ b/libs/pygments/formatters/bbcode.py @@ -4,7 +4,7 @@ BBcode formatter. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/groff.py b/libs/pygments/formatters/groff.py index a9e071128..028fec4ea 100644 --- a/libs/pygments/formatters/groff.py +++ b/libs/pygments/formatters/groff.py @@ -4,7 +4,7 @@ Formatter for groff output. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/html.py b/libs/pygments/formatters/html.py index 3330c1d58..4ef183681 100644 --- a/libs/pygments/formatters/html.py +++ b/libs/pygments/formatters/html.py @@ -4,7 +4,7 @@ Formatter for HTML output. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -44,7 +44,15 @@ def webify(color): if color.startswith('calc') or color.startswith('var'): return color else: - return '#' + color + # Check if the color can be shortened from 6 to 3 characters + color = color.upper() + if (len(color) == 6 and + ( color[0] == color[1] + and color[2] == color[3] + and color[4] == color[5])): + return f'#{color[0]}{color[2]}{color[4]}' + else: + return f'#{color}' def _get_ttype_class(ttype): @@ -62,7 +70,7 @@ def _get_ttype_class(ttype): CSSFILE_TEMPLATE = '''\ /* generated by Pygments <https://pygments.org/> -Copyright 2006-2024 by the Pygments team. +Copyright 2006-2025 by the Pygments team. Licensed under the BSD license, see LICENSE for details. */ %(styledefs)s @@ -73,7 +81,7 @@ def _get_ttype_class(ttype): "http://www.w3.org/TR/html4/strict.dtd"> <!-- generated by Pygments <https://pygments.org/> -Copyright 2006-2024 by the Pygments team. +Copyright 2006-2025 by the Pygments team. Licensed under the BSD license, see LICENSE for details. --> <html> diff --git a/libs/pygments/formatters/img.py b/libs/pygments/formatters/img.py index d5c97d47b..de4e9ffab 100644 --- a/libs/pygments/formatters/img.py +++ b/libs/pygments/formatters/img.py @@ -4,7 +4,7 @@ Formatter for Pixmap output. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import os @@ -132,7 +132,8 @@ def _create_mac(self): '/Library/Fonts/', '/System/Library/Fonts/'): font_map.update( (os.path.splitext(f)[0].lower(), os.path.join(font_dir, f)) - for f in os.listdir(font_dir) + for _, _, files in os.walk(font_dir) + for f in files if f.lower().endswith(('ttf', 'ttc'))) for name in STYLES['NORMAL']: diff --git a/libs/pygments/formatters/irc.py b/libs/pygments/formatters/irc.py index a1e3979be..d6ca0699c 100644 --- a/libs/pygments/formatters/irc.py +++ b/libs/pygments/formatters/irc.py @@ -4,7 +4,7 @@ Formatter for IRC output - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/latex.py b/libs/pygments/formatters/latex.py index 2f7971e8d..f14234a64 100644 --- a/libs/pygments/formatters/latex.py +++ b/libs/pygments/formatters/latex.py @@ -4,7 +4,7 @@ Formatter for LaTeX fancyvrb output. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/other.py b/libs/pygments/formatters/other.py index 56e8f033c..6b0eecacb 100644 --- a/libs/pygments/formatters/other.py +++ b/libs/pygments/formatters/other.py @@ -4,7 +4,7 @@ Other formatters: NullFormatter, RawTokenFormatter. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/pangomarkup.py b/libs/pygments/formatters/pangomarkup.py index 550dabb41..812520944 100644 --- a/libs/pygments/formatters/pangomarkup.py +++ b/libs/pygments/formatters/pangomarkup.py @@ -4,7 +4,7 @@ Formatter for Pango markup output. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/rtf.py b/libs/pygments/formatters/rtf.py index 7f8b7e4cd..fe0968db7 100644 --- a/libs/pygments/formatters/rtf.py +++ b/libs/pygments/formatters/rtf.py @@ -4,7 +4,7 @@ A formatter that generates RTF files. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/svg.py b/libs/pygments/formatters/svg.py index 74019b696..7a8ec9ad2 100644 --- a/libs/pygments/formatters/svg.py +++ b/libs/pygments/formatters/svg.py @@ -4,7 +4,7 @@ Formatter for SVG output. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/terminal.py b/libs/pygments/formatters/terminal.py index 5c3880517..511c20087 100644 --- a/libs/pygments/formatters/terminal.py +++ b/libs/pygments/formatters/terminal.py @@ -4,7 +4,7 @@ Formatter for terminal output with ANSI sequences. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/formatters/terminal256.py b/libs/pygments/formatters/terminal256.py index 6402d8c46..2504b4ae6 100644 --- a/libs/pygments/formatters/terminal256.py +++ b/libs/pygments/formatters/terminal256.py @@ -10,7 +10,7 @@ Formatter version 1. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexer.py b/libs/pygments/lexer.py index 3061964a7..453d675a3 100644 --- a/libs/pygments/lexer.py +++ b/libs/pygments/lexer.py @@ -4,7 +4,7 @@ Base lexer classes. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/__init__.py b/libs/pygments/lexers/__init__.py index a2eaf71f2..da5100095 100644 --- a/libs/pygments/lexers/__init__.py +++ b/libs/pygments/lexers/__init__.py @@ -4,7 +4,7 @@ Pygments lexers. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_ada_builtins.py b/libs/pygments/lexers/_ada_builtins.py index 6b6a7c556..a2491fb38 100644 --- a/libs/pygments/lexers/_ada_builtins.py +++ b/libs/pygments/lexers/_ada_builtins.py @@ -4,7 +4,7 @@ Ada builtins. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_asy_builtins.py b/libs/pygments/lexers/_asy_builtins.py index be73baf2d..976e1bc62 100644 --- a/libs/pygments/lexers/_asy_builtins.py +++ b/libs/pygments/lexers/_asy_builtins.py @@ -9,7 +9,7 @@ TODO: perl/python script in Asymptote SVN similar to asy-list.pl but only for function and variable names. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_cl_builtins.py b/libs/pygments/lexers/_cl_builtins.py index 1e02451ca..6e4516d68 100644 --- a/libs/pygments/lexers/_cl_builtins.py +++ b/libs/pygments/lexers/_cl_builtins.py @@ -4,7 +4,7 @@ ANSI Common Lisp builtins. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_cocoa_builtins.py b/libs/pygments/lexers/_cocoa_builtins.py index f45b85a28..ef0a9682f 100644 --- a/libs/pygments/lexers/_cocoa_builtins.py +++ b/libs/pygments/lexers/_cocoa_builtins.py @@ -7,7 +7,7 @@ File may be also used as standalone generator for above. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_csound_builtins.py b/libs/pygments/lexers/_csound_builtins.py index e1ea1a015..3431819ed 100644 --- a/libs/pygments/lexers/_csound_builtins.py +++ b/libs/pygments/lexers/_csound_builtins.py @@ -2,7 +2,7 @@ pygments.lexers._csound_builtins ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_css_builtins.py b/libs/pygments/lexers/_css_builtins.py index 60fa564b4..72953195a 100644 --- a/libs/pygments/lexers/_css_builtins.py +++ b/libs/pygments/lexers/_css_builtins.py @@ -4,7 +4,7 @@ This file is autogenerated by scripts/get_css_properties.py - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_googlesql_builtins.py b/libs/pygments/lexers/_googlesql_builtins.py new file mode 100644 index 000000000..13ef3a2b0 --- /dev/null +++ b/libs/pygments/lexers/_googlesql_builtins.py @@ -0,0 +1,918 @@ +""" + pygments.lexers._googlesql_builtins + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Autogenerated data files for the GoogleSQL lexer. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +constants = [ + 'FALSE', + 'NULL', + 'TRUE', + 'UNKNOWN', +] + +# Everything below this line is auto-generated from the GoogleSQL source code. +# ---------------------------------------------------------------------------- + +functionnames = [ + 'ABS', + 'ACOS', + 'ACOSH', + 'AEAD.DECRYPT_BYTES', + 'AEAD.DECRYPT_STRING', + 'AEAD.ENCRYPT', + 'AEAD.ENVELOPE_DECRYPT_BYTES', + 'AEAD.ENVELOPE_DECRYPT_STRING', + 'AEAD.ENVELOPE_ENCRYPT', + 'ALL_DIFFERENT', + 'ANON_AVG', + 'ANON_COUNT', + 'ANON_COUNT', + 'ANON_PERCENTILE_CONT', + 'ANON_QUANTILES', + 'ANON_STDDEV_POP', + 'ANON_SUM', + 'ANON_VAR_POP', + 'ANY_VALUE', + 'APPROX_COSINE_DISTANCE', + 'APPROX_COUNT_DISTINCT', + 'APPROX_DOT_PRODUCT', + 'APPROX_EUCLIDEAN_DISTANCE', + 'APPROX_QUANTILES', + 'APPROX_TOP_COUNT', + 'APPROX_TOP_SUM', + 'ARRAY[KEY()]', + 'ARRAY[SAFE_KEY()]', + 'ARRAY_AGG', + 'ARRAY_AVG', + 'ARRAY_CONCAT', + 'ARRAY_CONCAT_AGG', + 'ARRAY_FILTER', + 'ARRAY_FIND', + 'ARRAY_FIND_ALL', + 'ARRAY_FIRST', + 'ARRAY_FIRST_N', + 'ARRAY_INCLUDES', + 'ARRAY_INCLUDES_ALL', + 'ARRAY_INCLUDES_ANY', + 'ARRAY_IS_DISTINCT', + 'ARRAY_LAST', + 'ARRAY_LAST_N', + 'ARRAY_LENGTH', + 'ARRAY_MAX', + 'ARRAY_MIN', + 'ARRAY_OFFSET', + 'ARRAY_OFFSETS', + 'ARRAY_REMOVE_FIRST_N', + 'ARRAY_REMOVE_LAST_N', + 'ARRAY_REVERSE', + 'ARRAY_SLICE', + 'ARRAY_SUM', + 'ARRAY_TO_STRING', + 'ARRAY_TRANSFORM', + 'ARRAY_ZIP', + 'ASCII', + 'ASIN', + 'ASINH', + 'ATAN', + 'ATAN2', + 'ATANH', + 'AVG', + 'BIT_AND', + 'BIT_COUNT', + 'BIT_OR', + 'BIT_XOR', + 'BOOL', + 'BOOL_ARRAY', + 'BYTE_LENGTH', + 'CASE', + 'CAST', + 'CBRT', + 'CEIL', + 'CEILING', + 'CHARACTER_LENGTH', + 'CHAR_LENGTH', + 'CHR', + 'COALESCE', + 'CODE_POINTS_TO_BYTES', + 'CODE_POINTS_TO_STRING', + 'COLLATE', + 'CONCAT', + 'CORR', + 'COS', + 'COSH', + 'COSINE_DISTANCE', + 'COT', + 'COTH', + 'COUNT', + 'COUNT(*)', + 'COUNTIF', + 'COVAR_POP', + 'COVAR_SAMP', + 'CSC', + 'CSCH', + 'CUME_DIST', + 'CURRENT_DATE', + 'CURRENT_DATETIME', + 'CURRENT_TIME', + 'CURRENT_TIMESTAMP', + 'D3A_COUNT.EXTRACT', + 'D3A_COUNT.INIT', + 'D3A_COUNT.MERGE', + 'D3A_COUNT.MERGE_PARTIAL', + 'D3A_COUNT.TO_HLL', + 'DATE', + 'DATETIME', + 'DATETIME_ADD', + 'DATETIME_BUCKET', + 'DATETIME_DIFF', + 'DATETIME_SUB', + 'DATETIME_TRUNC', + 'DATE_ADD', + 'DATE_BUCKET', + 'DATE_DIFF', + 'DATE_FROM_UNIX_DATE', + 'DATE_SUB', + 'DATE_TRUNC', + 'DENSE_RANK', + 'DESTINATION_NODE_ID', + 'DETERMINISTIC_DECRYPT_BYTES', + 'DETERMINISTIC_DECRYPT_STRING', + 'DETERMINISTIC_ENCRYPT', + 'DIV', + 'DOT_PRODUCT', + 'EDGES', + 'EDIT_DISTANCE', + 'ELEMENTWISE_AVG', + 'ELEMENTWISE_SUM', + 'ELEMENT_DEFINITION_NAME', + 'ELEMENT_ID', + 'ENDS_WITH', + 'ENUM_VALUE_DESCRIPTOR_PROTO', + 'ERROR', + 'EUCLIDEAN_DISTANCE', + 'EXP', + 'EXTRACT', + 'EXTRACT_FOR_DP_APPROX_COUNT_DISTINCT', + 'FARM_FINGERPRINT', + 'FILTER_FIELDS', + 'FIRST_VALUE', + 'FLATTEN', + 'FLOAT32', + 'FLOAT32_ARRAY', + 'FLOAT64', + 'FLOAT64_ARRAY', + 'FLOOR', + 'FORMAT', + 'FORMAT_DATE', + 'FORMAT_DATETIME', + 'FORMAT_TIME', + 'FORMAT_TIMESTAMP', + 'FROM_BASE32', + 'FROM_BASE64', + 'FROM_HEX', + 'GENERATE_ARRAY', + 'GENERATE_DATE_ARRAY', + 'GENERATE_RANGE_ARRAY', + 'GENERATE_TIMESTAMP_ARRAY', + 'GENERATE_UUID', + 'GREATEST', + 'GROUPING', + 'HLL_COUNT.EXTRACT', + 'HLL_COUNT.INIT', + 'HLL_COUNT.MERGE', + 'HLL_COUNT.MERGE_PARTIAL', + 'IEEE_DIVIDE', + 'IF', + 'IFERROR', + 'IFNULL', + 'IN UNNEST', + 'INITCAP', + 'INIT_FOR_DP_APPROX_COUNT_DISTINCT', + 'INSTR', + 'INT64', + 'INT64_ARRAY', + 'IS DESTINATION OF', + 'IS DISTINCT FROM', + 'IS NOT DISTINCT FROM', + 'IS SOURCE OF', + 'ISERROR', + 'IS_ACYCLIC', + 'IS_INF', + 'IS_NAN', + 'IS_SIMPLE', + 'IS_TRAIL', + 'JSON_ARRAY', + 'JSON_ARRAY_APPEND', + 'JSON_ARRAY_INSERT', + 'JSON_CONTAINS', + 'JSON_EXTRACT', + 'JSON_EXTRACT_ARRAY', + 'JSON_EXTRACT_SCALAR', + 'JSON_EXTRACT_STRING_ARRAY', + 'JSON_KEYS', + 'JSON_OBJECT', + 'JSON_QUERY', + 'JSON_QUERY_ARRAY', + 'JSON_REMOVE', + 'JSON_SET', + 'JSON_STRIP_NULLS', + 'JSON_TYPE', + 'JSON_VALUE', + 'JSON_VALUE_ARRAY', + 'JUSTIFY_DAYS', + 'JUSTIFY_HOURS', + 'JUSTIFY_INTERVAL', + 'KEYS.ADD_KEY_FROM_RAW_BYTES', + 'KEYS.KEYSET_CHAIN', + 'KEYS.KEYSET_FROM_JSON', + 'KEYS.KEYSET_LENGTH', + 'KEYS.KEYSET_TO_JSON', + 'KEYS.NEW_KEYSET', + 'KEYS.NEW_WRAPPED_KEYSET', + 'KEYS.REWRAP_KEYSET', + 'KEYS.ROTATE_KEYSET', + 'KEYS.ROTATE_WRAPPED_KEYSET', + 'KLL_QUANTILES.EXTRACT_FLOAT64', + 'KLL_QUANTILES.EXTRACT_INT64', + 'KLL_QUANTILES.EXTRACT_POINT_FLOAT64', + 'KLL_QUANTILES.EXTRACT_POINT_INT64', + 'KLL_QUANTILES.INIT_FLOAT64', + 'KLL_QUANTILES.INIT_INT64', + 'KLL_QUANTILES.MERGE_FLOAT64', + 'KLL_QUANTILES.MERGE_INT64', + 'KLL_QUANTILES.MERGE_PARTIAL', + 'KLL_QUANTILES.MERGE_POINT_FLOAT64', + 'KLL_QUANTILES.MERGE_POINT_INT64', + 'L1_NORM', + 'L2_NORM', + 'LABELS', + 'LAG', + 'LAST_DAY', + 'LAST_VALUE', + 'LAX_BOOL', + 'LAX_BOOL_ARRAY', + 'LAX_FLOAT32', + 'LAX_FLOAT32_ARRAY', + 'LAX_FLOAT64', + 'LAX_FLOAT64_ARRAY', + 'LAX_INT64', + 'LAX_INT64_ARRAY', + 'LAX_STRING', + 'LAX_STRING_ARRAY', + 'LEAD', + 'LEAST', + 'LEFT', + 'LENGTH', + 'LIKE ALL', + 'LIKE ALL UNNEST', + 'LIKE ANY', + 'LIKE ANY UNNEST', + 'LN', + 'LOG', + 'LOG10', + 'LOGICAL_AND', + 'LOGICAL_OR', + 'LOWER', + 'LPAD', + 'LTRIM', + 'MAKE_INTERVAL', + 'MANHATTAN_DISTANCE', + 'MAP_CARDINALITY', + 'MAP_CONTAINS_KEY', + 'MAP_DELETE', + 'MAP_EMPTY', + 'MAP_ENTRIES_SORTED', + 'MAP_ENTRIES_UNSORTED', + 'MAP_FILTER', + 'MAP_FROM_ARRAY', + 'MAP_GET', + 'MAP_INSERT', + 'MAP_INSERT_OR_REPLACE', + 'MAP_KEYS_SORTED', + 'MAP_KEYS_UNSORTED', + 'MAP_REPLACE', + 'MAP_VALUES_SORTED', + 'MAP_VALUES_SORTED_BY_KEY', + 'MAP_VALUES_UNSORTED', + 'MAX', + 'MD5', + 'MERGE_PARTIAL_FOR_DP_APPROX_COUNT_DISTINCT', + 'MIN', + 'MOD', + 'NET.HOST', + 'NET.IPV4_FROM_INT64', + 'NET.IPV4_TO_INT64', + 'NET.IP_FROM_STRING', + 'NET.IP_NET_MASK', + 'NET.IP_TO_STRING', + 'NET.IP_TRUNC', + 'NET.PUBLIC_SUFFIX', + 'NET.REG_DOMAIN', + 'NET.SAFE_IP_FROM_STRING', + 'NEW_UUID', + 'NODES', + 'NORMALIZE', + 'NORMALIZE_AND_CASEFOLD', + 'NOT LIKE ALL', + 'NOT LIKE ALL UNNEST', + 'NOT LIKE ANY', + 'NOT LIKE ANY UNNEST', + 'NTH_VALUE', + 'NTILE', + 'NULLIF', + 'NULLIFERROR', + 'NULLIFZERO', + 'OCTET_LENGTH', + 'OFFSET', + 'ORDINAL', + 'PARSE_BIGNUMERIC', + 'PARSE_DATE', + 'PARSE_DATETIME', + 'PARSE_JSON', + 'PARSE_NUMERIC', + 'PARSE_TIME', + 'PARSE_TIMESTAMP', + 'PATH', + 'PATH_FIRST', + 'PATH_LAST', + 'PATH_LENGTH', + 'PERCENTILE_CONT', + 'PERCENTILE_DISC', + 'PERCENT_RANK', + 'PI', + 'PIVOT', + 'PI_BIGNUMERIC', + 'PI_NUMERIC', + 'POW', + 'POWER', + 'PROPERTY_EXISTS', + 'PROPERTY_NAMES', + 'PROTO_MAP_CONTAINS_KEY', + 'PROTO_MODIFY_MAP', + 'RAND', + 'RANGE', + 'RANGE_BUCKET', + 'RANGE_CONTAINS', + 'RANGE_END', + 'RANGE_INTERSECT', + 'RANGE_IS_END_UNBOUNDED', + 'RANGE_IS_START_UNBOUNDED', + 'RANGE_OVERLAPS', + 'RANGE_START', + 'RANK', + 'REGEXP_CONTAINS', + 'REGEXP_EXTRACT', + 'REGEXP_EXTRACT_ALL', + 'REGEXP_INSTR', + 'REGEXP_REPLACE', + 'REGEXP_SUBSTR', + 'REPEAT', + 'REPLACE', + 'REVERSE', + 'RIGHT', + 'ROUND', + 'ROW_NUMBER', + 'RPAD', + 'RTRIM', + 'S2_CELLIDFROMPOINT', + 'S2_COVERINGCELLIDS', + 'SAFE_ADD', + 'SAFE_CONVERT_BYTES_TO_STRING', + 'SAFE_DIVIDE', + 'SAFE_MULTIPLY', + 'SAFE_NEGATE', + 'SAFE_OFFSET', + 'SAFE_ORDINAL', + 'SAFE_SUBTRACT', + 'SAFE_TO_JSON', + 'SAME', + 'SEC', + 'SECH', + 'SESSION_USER', + 'SHA1', + 'SHA256', + 'SHA512', + 'SIGN', + 'SIN', + 'SINH', + 'SOUNDEX', + 'SOURCE_NODE_ID', + 'SPLIT', + 'SPLIT_SUBSTR', + 'SQRT', + 'STARTS_WITH', + 'STDDEV', + 'STDDEV_POP', + 'STDDEV_SAMP', + 'STRING', + 'STRING_AGG', + 'STRING_ARRAY', + 'STRPOS', + 'ST_ANGLE', + 'ST_AREA', + 'ST_ASBINARY', + 'ST_ASGEOJSON', + 'ST_ASKML', + 'ST_ASTEXT', + 'ST_AZIMUTH', + 'ST_BOUNDARY', + 'ST_BOUNDINGBOX', + 'ST_BUFFER', + 'ST_BUFFERWITHTOLERANCE', + 'ST_CENTROID', + 'ST_CENTROID_AGG', + 'ST_CLOSESTPOINT', + 'ST_CLUSTERDBSCAN', + 'ST_CONTAINS', + 'ST_CONVEXHULL', + 'ST_COVEREDBY', + 'ST_COVERS', + 'ST_DIFFERENCE', + 'ST_DIMENSION', + 'ST_DISJOINT', + 'ST_DISTANCE', + 'ST_DUMP', + 'ST_DUMPPOINTS', + 'ST_DWITHIN', + 'ST_ENDPOINT', + 'ST_EQUALS', + 'ST_EXTENT', + 'ST_EXTERIORRING', + 'ST_GEOGFROM', + 'ST_GEOGFROMGEOJSON', + 'ST_GEOGFROMKML', + 'ST_GEOGFROMTEXT', + 'ST_GEOGFROMWKB', + 'ST_GEOGPOINT', + 'ST_GEOGPOINTFROMGEOHASH', + 'ST_GEOHASH', + 'ST_GEOMETRYTYPE', + 'ST_HAUSDORFFDISTANCE', + 'ST_HAUSDORFFDWITHIN', + 'ST_INTERIORRINGS', + 'ST_INTERSECTION', + 'ST_INTERSECTS', + 'ST_INTERSECTSBOX', + 'ST_ISCLOSED', + 'ST_ISCOLLECTION', + 'ST_ISEMPTY', + 'ST_ISRING', + 'ST_LENGTH', + 'ST_LINEINTERPOLATEPOINT', + 'ST_LINELOCATEPOINT', + 'ST_LINESUBSTRING', + 'ST_MAKELINE', + 'ST_MAKEPOLYGON', + 'ST_MAKEPOLYGONORIENTED', + 'ST_MAXDISTANCE', + 'ST_NEAREST_NEIGHBORS', + 'ST_NPOINTS', + 'ST_NUMGEOMETRIES', + 'ST_NUMPOINTS', + 'ST_PERIMETER', + 'ST_POINTN', + 'ST_SIMPLIFY', + 'ST_SNAPTOGRID', + 'ST_STARTPOINT', + 'ST_TOUCHES', + 'ST_UNARYUNION', + 'ST_UNION', + 'ST_UNION_AGG', + 'ST_WITHIN', + 'ST_X', + 'ST_Y', + 'SUBSTR', + 'SUBSTRING', + 'SUM', + 'TAN', + 'TANH', + 'TIME', + 'TIMESTAMP', + 'TIMESTAMP_ADD', + 'TIMESTAMP_BUCKET', + 'TIMESTAMP_DIFF', + 'TIMESTAMP_FROM_UNIX_MICROS', + 'TIMESTAMP_FROM_UNIX_MILLIS', + 'TIMESTAMP_FROM_UNIX_SECONDS', + 'TIMESTAMP_MICROS', + 'TIMESTAMP_MILLIS', + 'TIMESTAMP_SECONDS', + 'TIMESTAMP_SUB', + 'TIMESTAMP_TRUNC', + 'TIME_ADD', + 'TIME_DIFF', + 'TIME_SUB', + 'TIME_TRUNC', + 'TO_BASE32', + 'TO_BASE64', + 'TO_CODE_POINTS', + 'TO_HEX', + 'TO_JSON', + 'TO_JSON_STRING', + 'TRANSLATE', + 'TRIM', + 'TRUNC', + 'TYPEOF', + 'UNICODE', + 'UNIX_DATE', + 'UNIX_MICROS', + 'UNIX_MILLIS', + 'UNIX_SECONDS', + 'UNNEST', + 'UNPIVOT', + 'UPPER', + 'VARIANCE', + 'VAR_POP', + 'VAR_SAMP', + 'ZEROIFNULL', +] + +keywords = [ + 'ABORT', + 'ACCESS', + 'ACTION', + 'ACYCLIC', + 'ADD', + 'AFTER', + 'AGGREGATE', + 'ALL', + 'ALTER', + 'ALWAYS', + 'ANALYZE', + 'AND', + 'ANY', + 'APPROX', + 'ARE', + 'AS', + 'ASC', + 'ASCENDING', + 'ASSERT', + 'ASSERT_ROWS_MODIFIED', + 'AT', + 'BATCH', + 'BEGIN', + 'BETWEEN', + 'BIGDECIMAL', + 'BREAK', + 'BY', + 'CALL', + 'CASCADE', + 'CASE', + 'CAST', + 'CHECK', + 'CLAMPED', + 'CLONE', + 'CLUSTER', + 'COLLATE', + 'COLUMN', + 'COLUMNS', + 'COMMIT', + 'CONFLICT', + 'CONNECTION', + 'CONSTANT', + 'CONSTRAINT', + 'CONTAINS', + 'CONTINUE', + 'COPY', + 'CORRESPONDING', + 'CREATE', + 'CROSS', + 'CUBE', + 'CURRENT', + 'CYCLE', + 'DATA', + 'DATABASE', + 'DAY', + 'DAYOFWEEK', + 'DAYOFYEAR', + 'DECIMAL', + 'DECLARE', + 'DEFAULT', + 'DEFINE', + 'DEFINER', + 'DELETE', + 'DELETION', + 'DEPTH', + 'DESC', + 'DESCENDING', + 'DESCRIBE', + 'DESCRIPTOR', + 'DESTINATION', + 'DETERMINISTIC', + 'DISTINCT', + 'DO', + 'DROP', + 'EDGE', + 'ELSE', + 'ELSEIF', + 'END', + 'ENFORCED', + 'ERROR', + 'ESCAPE', + 'EXCEPT', + 'EXCEPTION', + 'EXCLUDE', + 'EXECUTE', + 'EXISTS', + 'EXPLAIN', + 'EXPORT', + 'EXTEND', + 'EXTERNAL', + 'EXTRACT', + 'FALSE', + 'FETCH', + 'FIELD', + 'FILES', + 'FILL', + 'FILTER', + 'FIRST', + 'FOLLOWING', + 'FOR', + 'FOREIGN', + 'FORK', + 'FORMAT', + 'FRIDAY', + 'FROM', + 'FULL', + 'FUNCTION', + 'GENERATED', + 'GRANT', + 'GRAPH', + 'GRAPH_TABLE', + 'GROUP', + 'GROUPING', + 'GROUPS', + 'GROUP_ROWS', + 'HAS', + 'HASH', + 'HAVING', + 'HIDDEN', + 'HOUR', + 'IDENTITY', + 'IF', + 'IGNORE', + 'IMMEDIATE', + 'IMMUTABLE', + 'IMPORT', + 'IN', + 'INCLUDE', + 'INCREMENT', + 'INDEX', + 'INNER', + 'INOUT', + 'INPUT', + 'INSERT', + 'INTERLEAVE', + 'INTERSECT', + 'INTO', + 'INVOKER', + 'IS', + 'ISOLATION', + 'ISOWEEK ', + 'ISOYEAR', + 'ITERATE', + 'JOIN', + 'KEY', + 'LABEL', + 'LABELED', + 'LANGUAGE', + 'LAST', + 'LATERAL', + 'LEAVE', + 'LEFT', + 'LET', + 'LEVEL', + 'LIKE', + 'LIMIT', + 'LOAD', + 'LOG', + 'LOOKUP', + 'LOOP', + 'MACRO', + 'MATCH', + 'MATCHED', + 'MATCH_RECOGNIZE', + 'MATERIALIZED', + 'MAX', + 'MAXVALUE', + 'MEASURES', + 'MERGE', + 'MESSAGE', + 'METADATA', + 'MICROSECOND', + 'MILLISECOND', + 'MIN', + 'MINUTE', + 'MINVALUE', + 'MODEL', + 'MODULE', + 'MONDAY', + 'MONTH', + 'NAME', + 'NANOSECOND', + 'NATURAL', + 'NEW', + 'NEXT', + 'NO', + 'NODE', + 'NOT', + 'NOTHING', + 'NULL', + 'NULLS', + 'NULL_FILTERED', + 'OF', + 'OFFSET', + 'ON', + 'ONEOF_CASE', + 'ONLY', + 'OPTIONAL', + 'OPTIONS', + 'OR', + 'ORDER', + 'OUT', + 'OUTER', + 'OUTPUT', + 'OVER', + 'OVERWRITE', + 'PARENT', + 'PARTITION', + 'PARTITIONS', + 'PAST', + 'PATH', + 'PATHS', + 'PATTERN', + 'PERCENT', + 'PIVOT', + 'POLICIES', + 'POLICY', + 'PRECEDING', + 'PRIMARY', + 'PRIVATE', + 'PRIVILEGE', + 'PRIVILEGES', + 'PROCEDURE', + 'PROJECT', + 'PROPERTIES', + 'PROPERTY', + 'PUBLIC', + 'QUALIFY', + 'QUARTER', + 'RAISE', + 'RAW', + 'READ', + 'RECURSIVE', + 'REFERENCES', + 'REMOTE', + 'REMOVE', + 'RENAME', + 'REPEAT', + 'REPEATABLE', + 'REPLACE', + 'REPLACE_FIELDS', + 'REPLICA', + 'REPORT', + 'RESPECT', + 'RESTRICT', + 'RESTRICTION', + 'RETURN', + 'RETURNS', + 'REVOKE', + 'RIGHT', + 'ROLLBACK', + 'ROLLUP', + 'ROW', + 'ROWS', + 'RUN', + 'SAFE_CAST', + 'SATURDAY', + 'SCHEMA', + 'SEARCH', + 'SECOND ', + 'SECURITY', + 'SELECT', + 'SEQUENCE', + 'SET', + 'SETS', + 'SHORTEST', + 'SHOW', + 'SIMPLE', + 'SKIP', + 'SNAPSHOT', + 'SOME', + 'SOURCE', + 'SQL', + 'STABLE', + 'START', + 'STATIC_DESCRIBE', + 'STORED', + 'STORING', + 'STRICT', + 'SUNDAY', + 'SYSTEM', + 'SYSTEM_TIME', + 'TABLE', + 'TABLES', + 'TABLESAMPLE', + 'TARGET', + 'TEMP', + 'TEMPORARY', + 'THEN', + 'THURSDAY', + 'TO', + 'TRAIL', + 'TRANSACTION', + 'TRANSFORM', + 'TREAT', + 'TRUE', + 'TRUNCATE', + 'TUESDAY', + 'TYPE', + 'UNBOUNDED', + 'UNDROP', + 'UNION', + 'UNIQUE', + 'UNKNOWN', + 'UNNEST', + 'UNPIVOT', + 'UNTIL', + 'UPDATE', + 'USING', + 'VALUE', + 'VALUES', + 'VECTOR', + 'VIEW', + 'VIEWS', + 'VOLATILE', + 'WALK', + 'WEDNESDAY', + 'WEEK', + 'WEIGHT', + 'WHEN', + 'WHERE', + 'WHILE', + 'WINDOW', + 'WITH', + 'WITHIN', + 'WRITE', + 'YEAR', + 'ZONE', +] + +operators = [ + '!=', + '&', + '*', + '+', + '-', + '/', + '<', + '<<', + '<=', + '=', + '>', + '>=', + '>>', + '^', + '|', + '||', + '~', +] + +types = [ + 'ARRAY', + 'BIGNUMERIC', + 'BOOL', + 'BYTES', + 'DATE', + 'DATETIME', + 'DOUBLE', + 'ENUM', + 'EXTENDED', + 'FLOAT', + 'GEOGRAPHY', + 'GRAPH_ELEMENT', + 'GRAPH_PATH', + 'INT32', + 'INT64', + 'INTERVAL', + 'JSON', + 'MAP', + 'MEASURE', + 'NUMERIC', + 'PROTO', + 'RANGE', + 'STRING', + 'STRUCT', + 'TIME', + 'TIMESTAMP', + 'TIMESTAMP_PICOS', + 'TOKENLIST', + 'UINT32', + 'UINT64', + 'UUID', +] diff --git a/libs/pygments/lexers/_julia_builtins.py b/libs/pygments/lexers/_julia_builtins.py index c73a2e0ec..2849afe58 100644 --- a/libs/pygments/lexers/_julia_builtins.py +++ b/libs/pygments/lexers/_julia_builtins.py @@ -4,7 +4,7 @@ Julia builtins. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_lasso_builtins.py b/libs/pygments/lexers/_lasso_builtins.py index f4d417e67..a559847e3 100644 --- a/libs/pygments/lexers/_lasso_builtins.py +++ b/libs/pygments/lexers/_lasso_builtins.py @@ -4,7 +4,7 @@ Built-in Lasso types, traits, methods, and members. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_lilypond_builtins.py b/libs/pygments/lexers/_lilypond_builtins.py index 948c7625a..b00dbbfd4 100644 --- a/libs/pygments/lexers/_lilypond_builtins.py +++ b/libs/pygments/lexers/_lilypond_builtins.py @@ -4,7 +4,7 @@ LilyPond builtins. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_lua_builtins.py b/libs/pygments/lexers/_lua_builtins.py index b46fe4f02..e0977a0a4 100644 --- a/libs/pygments/lexers/_lua_builtins.py +++ b/libs/pygments/lexers/_lua_builtins.py @@ -10,7 +10,7 @@ Run with `python -I` to regenerate. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_luau_builtins.py b/libs/pygments/lexers/_luau_builtins.py index 3b7dd1520..9e06b07b9 100644 --- a/libs/pygments/lexers/_luau_builtins.py +++ b/libs/pygments/lexers/_luau_builtins.py @@ -4,7 +4,7 @@ Includes the builtins for Luau and Roblox. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_mapping.py b/libs/pygments/lexers/_mapping.py index 0a62565d5..cfc534d40 100644 --- a/libs/pygments/lexers/_mapping.py +++ b/libs/pygments/lexers/_mapping.py @@ -93,6 +93,7 @@ 'ClojureScriptLexer': ('pygments.lexers.jvm', 'ClojureScript', ('clojurescript', 'cljs'), ('*.cljs',), ('text/x-clojurescript', 'application/x-clojurescript')), 'CobolFreeformatLexer': ('pygments.lexers.business', 'COBOLFree', ('cobolfree',), ('*.cbl', '*.CBL'), ()), 'CobolLexer': ('pygments.lexers.business', 'COBOL', ('cobol',), ('*.cob', '*.COB', '*.cpy', '*.CPY'), ('text/x-cobol',)), + 'CodeQLLexer': ('pygments.lexers.codeql', 'CodeQL', ('codeql', 'ql'), ('*.ql', '*.qll'), ()), 'CoffeeScriptLexer': ('pygments.lexers.javascript', 'CoffeeScript', ('coffeescript', 'coffee-script', 'coffee'), ('*.coffee',), ('text/coffeescript',)), 'ColdfusionCFCLexer': ('pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()), 'ColdfusionHtmlLexer': ('pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)), @@ -127,6 +128,7 @@ 'Dasm16Lexer': ('pygments.lexers.asm', 'DASM16', ('dasm16',), ('*.dasm16', '*.dasm'), ('text/x-dasm16',)), 'DaxLexer': ('pygments.lexers.dax', 'Dax', ('dax',), ('*.dax',), ()), 'DebianControlLexer': ('pygments.lexers.installers', 'Debian Control file', ('debcontrol', 'control'), ('control',), ()), + 'DebianSourcesLexer': ('pygments.lexers.installers', 'Debian Sources file', ('debian.sources',), ('*.sources',), ()), 'DelphiLexer': ('pygments.lexers.pascal', 'Delphi', ('delphi', 'pas', 'pascal', 'objectpascal'), ('*.pas', '*.dpr'), ('text/x-pascal',)), 'DesktopLexer': ('pygments.lexers.configs', 'Desktop file', ('desktop',), ('*.desktop',), ('application/x-desktop',)), 'DevicetreeLexer': ('pygments.lexers.devicetree', 'Devicetree', ('devicetree', 'dts'), ('*.dts', '*.dtsi'), ('text/x-c',)), @@ -155,9 +157,9 @@ 'ErbLexer': ('pygments.lexers.templates', 'ERB', ('erb',), (), ('application/x-ruby-templating',)), 'ErlangLexer': ('pygments.lexers.erlang', 'Erlang', ('erlang',), ('*.erl', '*.hrl', '*.es', '*.escript'), ('text/x-erlang',)), 'ErlangShellLexer': ('pygments.lexers.erlang', 'Erlang erl session', ('erl',), ('*.erl-sh',), ('text/x-erl-shellsession',)), - 'EvoqueHtmlLexer': ('pygments.lexers.templates', 'HTML+Evoque', ('html+evoque',), ('*.html',), ('text/html+evoque',)), + 'EvoqueHtmlLexer': ('pygments.lexers.templates', 'HTML+Evoque', ('html+evoque',), (), ('text/html+evoque',)), 'EvoqueLexer': ('pygments.lexers.templates', 'Evoque', ('evoque',), ('*.evoque',), ('application/x-evoque',)), - 'EvoqueXmlLexer': ('pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), ('*.xml',), ('application/xml+evoque',)), + 'EvoqueXmlLexer': ('pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), (), ('application/xml+evoque',)), 'ExeclineLexer': ('pygments.lexers.shell', 'execline', ('execline',), ('*.exec',), ()), 'EzhilLexer': ('pygments.lexers.ezhil', 'Ezhil', ('ezhil',), ('*.n',), ('text/x-ezhil',)), 'FSharpLexer': ('pygments.lexers.dotnet', 'F#', ('fsharp', 'f#'), ('*.fs', '*.fsi', '*.fsx'), ('text/x-fsharp',)), @@ -189,10 +191,12 @@ 'GenshiTextLexer': ('pygments.lexers.templates', 'Genshi Text', ('genshitext',), (), ('application/x-genshi-text', 'text/x-genshi')), 'GettextLexer': ('pygments.lexers.textfmts', 'Gettext Catalog', ('pot', 'po'), ('*.pot', '*.po'), ('application/x-gettext', 'text/x-gettext', 'text/gettext')), 'GherkinLexer': ('pygments.lexers.testing', 'Gherkin', ('gherkin', 'cucumber'), ('*.feature',), ('text/x-gherkin',)), + 'GleamLexer': ('pygments.lexers.gleam', 'Gleam', ('gleam',), ('*.gleam',), ('text/x-gleam',)), 'GnuplotLexer': ('pygments.lexers.graphics', 'Gnuplot', ('gnuplot',), ('*.plot', '*.plt'), ('text/x-gnuplot',)), 'GoLexer': ('pygments.lexers.go', 'Go', ('go', 'golang'), ('*.go',), ('text/x-gosrc',)), 'GoloLexer': ('pygments.lexers.jvm', 'Golo', ('golo',), ('*.golo',), ()), 'GoodDataCLLexer': ('pygments.lexers.business', 'GoodData-CL', ('gooddata-cl',), ('*.gdc',), ('text/x-gooddata-cl',)), + 'GoogleSqlLexer': ('pygments.lexers.sql', 'GoogleSQL', ('googlesql', 'zetasql'), ('*.googlesql', '*.googlesql.sql'), ('text/x-google-sql', 'text/x-google-sql-aux')), 'GosuLexer': ('pygments.lexers.jvm', 'Gosu', ('gosu',), ('*.gs', '*.gsx', '*.gsp', '*.vark'), ('text/x-gosu',)), 'GosuTemplateLexer': ('pygments.lexers.jvm', 'Gosu Template', ('gst',), ('*.gst',), ('text/x-gosu-template',)), 'GraphQLLexer': ('pygments.lexers.graphql', 'GraphQL', ('graphql',), ('*.graphql',), ()), @@ -204,6 +208,7 @@ 'HamlLexer': ('pygments.lexers.html', 'Haml', ('haml',), ('*.haml',), ('text/x-haml',)), 'HandlebarsHtmlLexer': ('pygments.lexers.templates', 'HTML+Handlebars', ('html+handlebars',), ('*.handlebars', '*.hbs'), ('text/html+handlebars', 'text/x-handlebars-template')), 'HandlebarsLexer': ('pygments.lexers.templates', 'Handlebars', ('handlebars',), (), ()), + 'HareLexer': ('pygments.lexers.hare', 'Hare', ('hare',), ('*.ha',), ('text/x-hare',)), 'HaskellLexer': ('pygments.lexers.haskell', 'Haskell', ('haskell', 'hs'), ('*.hs',), ('text/x-haskell',)), 'HaxeLexer': ('pygments.lexers.haxe', 'Haxe', ('haxe', 'hxsl', 'hx'), ('*.hx', '*.hxsl'), ('text/haxe', 'text/x-haxe', 'text/x-hx')), 'HexdumpLexer': ('pygments.lexers.hexdump', 'Hexdump', ('hexdump',), (), ()), @@ -246,6 +251,7 @@ 'JavascriptUL4Lexer': ('pygments.lexers.ul4', 'Javascript+UL4', ('js+ul4',), ('*.jsul4',), ()), 'JclLexer': ('pygments.lexers.scripting', 'JCL', ('jcl',), ('*.jcl',), ('text/x-jcl',)), 'JsgfLexer': ('pygments.lexers.grammar_notation', 'JSGF', ('jsgf',), ('*.jsgf',), ('application/jsgf', 'application/x-jsgf', 'text/jsgf')), + 'Json5Lexer': ('pygments.lexers.json5', 'JSON5', ('json5',), ('*.json5',), ()), 'JsonBareObjectLexer': ('pygments.lexers.data', 'JSONBareObject', (), (), ()), 'JsonLdLexer': ('pygments.lexers.data', 'JSON-LD', ('jsonld', 'json-ld'), ('*.jsonld',), ('application/ld+json',)), 'JsonLexer': ('pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', '*.jsonl', '*.ndjson', 'Pipfile.lock'), ('application/json', 'application/json-object', 'application/x-ndjson', 'application/jsonl', 'application/json-seq')), @@ -303,6 +309,7 @@ 'MakoJavascriptLexer': ('pygments.lexers.templates', 'JavaScript+Mako', ('javascript+mako', 'js+mako'), (), ('application/x-javascript+mako', 'text/x-javascript+mako', 'text/javascript+mako')), 'MakoLexer': ('pygments.lexers.templates', 'Mako', ('mako',), ('*.mao',), ('application/x-mako',)), 'MakoXmlLexer': ('pygments.lexers.templates', 'XML+Mako', ('xml+mako',), (), ('application/xml+mako',)), + 'MapleLexer': ('pygments.lexers.maple', 'Maple', ('maple',), ('*.mpl', '*.mi', '*.mm'), ('text/x-maple',)), 'MaqlLexer': ('pygments.lexers.business', 'MAQL', ('maql',), ('*.maql',), ('text/x-gooddata-maql', 'application/x-gooddata-maql')), 'MarkdownLexer': ('pygments.lexers.markup', 'Markdown', ('markdown', 'md'), ('*.md', '*.markdown'), ('text/x-markdown',)), 'MaskLexer': ('pygments.lexers.javascript', 'Mask', ('mask',), ('*.mask',), ('text/x-mask',)), @@ -354,6 +361,7 @@ 'NotmuchLexer': ('pygments.lexers.textfmts', 'Notmuch', ('notmuch',), (), ()), 'NuSMVLexer': ('pygments.lexers.smv', 'NuSMV', ('nusmv',), ('*.smv',), ()), 'NumPyLexer': ('pygments.lexers.python', 'NumPy', ('numpy',), (), ()), + 'NumbaIRLexer': ('pygments.lexers.numbair', 'Numba_IR', ('numba_ir', 'numbair'), ('*.numba_ir',), ('text/x-numba_ir', 'text/x-numbair')), 'ObjdumpLexer': ('pygments.lexers.asm', 'objdump', ('objdump',), ('*.objdump',), ('text/x-objdump',)), 'ObjectiveCLexer': ('pygments.lexers.objective', 'Objective-C', ('objective-c', 'objectivec', 'obj-c', 'objc'), ('*.m', '*.h'), ('text/x-objective-c',)), 'ObjectiveCppLexer': ('pygments.lexers.objective', 'Objective-C++', ('objective-c++', 'objectivec++', 'obj-c++', 'objc++'), ('*.mm', '*.hh'), ('text/x-objective-c++',)), @@ -372,6 +380,7 @@ 'PanLexer': ('pygments.lexers.dsls', 'Pan', ('pan',), ('*.pan',), ()), 'ParaSailLexer': ('pygments.lexers.parasail', 'ParaSail', ('parasail',), ('*.psi', '*.psl'), ('text/x-parasail',)), 'PawnLexer': ('pygments.lexers.pawn', 'Pawn', ('pawn',), ('*.p', '*.pwn', '*.inc'), ('text/x-pawn',)), + 'PddlLexer': ('pygments.lexers.pddl', 'PDDL', ('pddl',), ('*.pddl',), ()), 'PegLexer': ('pygments.lexers.grammar_notation', 'PEG', ('peg',), ('*.peg',), ('text/x-peg',)), 'Perl6Lexer': ('pygments.lexers.perl', 'Perl6', ('perl6', 'pl6', 'raku'), ('*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6', '*.6pm', '*.p6m', '*.pm6', '*.t', '*.raku', '*.rakumod', '*.rakutest', '*.rakudoc'), ('text/x-perl6', 'application/x-perl6')), 'PerlLexer': ('pygments.lexers.perl', 'Perl', ('perl', 'pl'), ('*.pl', '*.pm', '*.t', '*.perl'), ('text/x-perl', 'application/x-perl')), @@ -407,7 +416,7 @@ 'Python2Lexer': ('pygments.lexers.python', 'Python 2.x', ('python2', 'py2'), (), ('text/x-python2', 'application/x-python2')), 'Python2TracebackLexer': ('pygments.lexers.python', 'Python 2.x Traceback', ('py2tb',), ('*.py2tb',), ('text/x-python2-traceback',)), 'PythonConsoleLexer': ('pygments.lexers.python', 'Python console session', ('pycon', 'python-console'), (), ('text/x-python-doctest',)), - 'PythonLexer': ('pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), + 'PythonLexer': ('pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark', 'pyi'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), 'PythonTracebackLexer': ('pygments.lexers.python', 'Python Traceback', ('pytb', 'py3tb'), ('*.pytb', '*.py3tb'), ('text/x-python-traceback', 'text/x-python3-traceback')), 'PythonUL4Lexer': ('pygments.lexers.ul4', 'Python+UL4', ('py+ul4',), ('*.pyul4',), ()), 'QBasicLexer': ('pygments.lexers.basic', 'QBasic', ('qbasic', 'basic'), ('*.BAS', '*.bas'), ('text/basic',)), @@ -434,6 +443,7 @@ 'RedLexer': ('pygments.lexers.rebol', 'Red', ('red', 'red/system'), ('*.red', '*.reds'), ('text/x-red', 'text/x-red-system')), 'RedcodeLexer': ('pygments.lexers.esoteric', 'Redcode', ('redcode',), ('*.cw',), ()), 'RegeditLexer': ('pygments.lexers.configs', 'reg', ('registry',), ('*.reg',), ('text/x-windows-registry',)), + 'RegoLexer': ('pygments.lexers.rego', 'Rego', ('rego',), ('*.rego',), ('text/x-rego',)), 'ResourceLexer': ('pygments.lexers.resource', 'ResourceBundle', ('resourcebundle', 'resource'), (), ()), 'RexxLexer': ('pygments.lexers.scripting', 'Rexx', ('rexx', 'arexx'), ('*.rexx', '*.rex', '*.rx', '*.arexx'), ('text/x-rexx',)), 'RhtmlLexer': ('pygments.lexers.templates', 'RHTML', ('rhtml', 'html+erb', 'html+ruby'), ('*.rhtml',), ('text/html+ruby',)), @@ -501,6 +511,7 @@ 'TAPLexer': ('pygments.lexers.testing', 'TAP', ('tap',), ('*.tap',), ()), 'TNTLexer': ('pygments.lexers.tnt', 'Typographic Number Theory', ('tnt',), ('*.tnt',), ()), 'TOMLLexer': ('pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ('application/toml',)), + 'TableGenLexer': ('pygments.lexers.tablegen', 'TableGen', ('tablegen', 'td'), ('*.td',), ()), 'TactLexer': ('pygments.lexers.tact', 'Tact', ('tact',), ('*.tact',), ()), 'Tads3Lexer': ('pygments.lexers.int_fiction', 'TADS 3', ('tads3',), ('*.t',), ()), 'TalLexer': ('pygments.lexers.tal', 'Tal', ('tal', 'uxntal'), ('*.tal',), ('text/x-uxntal',)), @@ -524,6 +535,7 @@ 'TodotxtLexer': ('pygments.lexers.textfmts', 'Todotxt', ('todotxt',), ('todo.txt', '*.todotxt'), ('text/x-todo',)), 'TransactSqlLexer': ('pygments.lexers.sql', 'Transact-SQL', ('tsql', 't-sql'), ('*.sql',), ('text/x-tsql',)), 'TreetopLexer': ('pygments.lexers.parsers', 'Treetop', ('treetop',), ('*.treetop', '*.tt'), ()), + 'TsxLexer': ('pygments.lexers.jsx', 'TSX', ('tsx',), ('*.tsx',), ('text/typescript-tsx',)), 'TurtleLexer': ('pygments.lexers.rdf', 'Turtle', ('turtle',), ('*.ttl',), ('text/turtle', 'application/x-turtle')), 'TwigHtmlLexer': ('pygments.lexers.templates', 'HTML+Twig', ('html+twig',), ('*.twig',), ('text/html+twig',)), 'TwigLexer': ('pygments.lexers.templates', 'Twig', ('twig',), (), ('application/x-twig',)), @@ -556,6 +568,7 @@ 'VimLexer': ('pygments.lexers.textedit', 'VimL', ('vim',), ('*.vim', '.vimrc', '.exrc', '.gvimrc', '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc'), ('text/x-vim',)), 'VisualPrologGrammarLexer': ('pygments.lexers.vip', 'Visual Prolog Grammar', ('visualprologgrammar',), ('*.vipgrm',), ()), 'VisualPrologLexer': ('pygments.lexers.vip', 'Visual Prolog', ('visualprolog',), ('*.pro', '*.cl', '*.i', '*.pack', '*.ph'), ()), + 'VueLexer': ('pygments.lexers.html', 'Vue', ('vue',), ('*.vue',), ()), 'VyperLexer': ('pygments.lexers.vyper', 'Vyper', ('vyper',), ('*.vy',), ()), 'WDiffLexer': ('pygments.lexers.diff', 'WDiff', ('wdiff',), ('*.wdiff',), ()), 'WatLexer': ('pygments.lexers.webassembly', 'WebAssembly', ('wast', 'wat'), ('*.wat', '*.wast'), ()), diff --git a/libs/pygments/lexers/_mql_builtins.py b/libs/pygments/lexers/_mql_builtins.py index ca5bfe45a..181c25d55 100644 --- a/libs/pygments/lexers/_mql_builtins.py +++ b/libs/pygments/lexers/_mql_builtins.py @@ -4,7 +4,7 @@ Builtins for the MqlLexer. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ types = ( diff --git a/libs/pygments/lexers/_mysql_builtins.py b/libs/pygments/lexers/_mysql_builtins.py index 95bbe1739..d4a9099ed 100644 --- a/libs/pygments/lexers/_mysql_builtins.py +++ b/libs/pygments/lexers/_mysql_builtins.py @@ -6,7 +6,7 @@ Run with `python -I` to update. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_openedge_builtins.py b/libs/pygments/lexers/_openedge_builtins.py index c5e9c3474..33a1333e4 100644 --- a/libs/pygments/lexers/_openedge_builtins.py +++ b/libs/pygments/lexers/_openedge_builtins.py @@ -4,7 +4,7 @@ Builtin list for the OpenEdgeLexer. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_php_builtins.py b/libs/pygments/lexers/_php_builtins.py index a1f0232a1..19825fa2d 100644 --- a/libs/pygments/lexers/_php_builtins.py +++ b/libs/pygments/lexers/_php_builtins.py @@ -7,7 +7,7 @@ Run with `python -I` to regenerate. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_postgres_builtins.py b/libs/pygments/lexers/_postgres_builtins.py index f29235598..80bc728e9 100644 --- a/libs/pygments/lexers/_postgres_builtins.py +++ b/libs/pygments/lexers/_postgres_builtins.py @@ -6,7 +6,7 @@ Run with `python -I` to update itself. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_qlik_builtins.py b/libs/pygments/lexers/_qlik_builtins.py index f3af5230f..c2fe0cf4b 100644 --- a/libs/pygments/lexers/_qlik_builtins.py +++ b/libs/pygments/lexers/_qlik_builtins.py @@ -4,7 +4,7 @@ Qlik builtins. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_scheme_builtins.py b/libs/pygments/lexers/_scheme_builtins.py index d93b9fd3b..c35a533d1 100644 --- a/libs/pygments/lexers/_scheme_builtins.py +++ b/libs/pygments/lexers/_scheme_builtins.py @@ -4,7 +4,7 @@ Scheme builtins. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_scilab_builtins.py b/libs/pygments/lexers/_scilab_builtins.py index c4992938d..af49b46a8 100644 --- a/libs/pygments/lexers/_scilab_builtins.py +++ b/libs/pygments/lexers/_scilab_builtins.py @@ -4,7 +4,7 @@ Builtin list for the ScilabLexer. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_sourcemod_builtins.py b/libs/pygments/lexers/_sourcemod_builtins.py index 613ce7084..c98478c6f 100644 --- a/libs/pygments/lexers/_sourcemod_builtins.py +++ b/libs/pygments/lexers/_sourcemod_builtins.py @@ -8,7 +8,7 @@ Run with `python -I` to regenerate. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_stan_builtins.py b/libs/pygments/lexers/_stan_builtins.py index afe314370..8db10c32a 100644 --- a/libs/pygments/lexers/_stan_builtins.py +++ b/libs/pygments/lexers/_stan_builtins.py @@ -5,7 +5,7 @@ This file contains the names of functions for Stan used by ``pygments.lexers.math.StanLexer. This is for Stan language version 2.29.0. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_stata_builtins.py b/libs/pygments/lexers/_stata_builtins.py index c806f50be..6a36f0429 100644 --- a/libs/pygments/lexers/_stata_builtins.py +++ b/libs/pygments/lexers/_stata_builtins.py @@ -4,7 +4,7 @@ Builtins for Stata - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_tsql_builtins.py b/libs/pygments/lexers/_tsql_builtins.py index 1fc792bb8..6fa1a1f19 100644 --- a/libs/pygments/lexers/_tsql_builtins.py +++ b/libs/pygments/lexers/_tsql_builtins.py @@ -4,7 +4,7 @@ These are manually translated lists from https://msdn.microsoft.com. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_usd_builtins.py b/libs/pygments/lexers/_usd_builtins.py index ff83574af..b0530a209 100644 --- a/libs/pygments/lexers/_usd_builtins.py +++ b/libs/pygments/lexers/_usd_builtins.py @@ -4,7 +4,7 @@ A collection of known USD-related keywords, attributes, and types. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_vbscript_builtins.py b/libs/pygments/lexers/_vbscript_builtins.py index fba2218e2..b1ae0ef02 100644 --- a/libs/pygments/lexers/_vbscript_builtins.py +++ b/libs/pygments/lexers/_vbscript_builtins.py @@ -5,7 +5,7 @@ These are manually translated lists from http://www.indusoft.com/pdf/VBScript%20Reference.pdf. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/_vim_builtins.py b/libs/pygments/lexers/_vim_builtins.py index e1171ebbc..abbbf993a 100644 --- a/libs/pygments/lexers/_vim_builtins.py +++ b/libs/pygments/lexers/_vim_builtins.py @@ -4,7 +4,7 @@ This file is autogenerated by scripts/get_vimkw.py - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/actionscript.py b/libs/pygments/lexers/actionscript.py index a23a2087e..3a6ba4291 100644 --- a/libs/pygments/lexers/actionscript.py +++ b/libs/pygments/lexers/actionscript.py @@ -4,7 +4,7 @@ Lexers for ActionScript and MXML. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ada.py b/libs/pygments/lexers/ada.py index ec99c8f3a..cb286ca7c 100644 --- a/libs/pygments/lexers/ada.py +++ b/libs/pygments/lexers/ada.py @@ -4,7 +4,7 @@ Lexers for Ada family languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/agile.py b/libs/pygments/lexers/agile.py index 097beebb6..cb22a13bf 100644 --- a/libs/pygments/lexers/agile.py +++ b/libs/pygments/lexers/agile.py @@ -4,7 +4,7 @@ Just export lexer classes previously contained in this module. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/algebra.py b/libs/pygments/lexers/algebra.py index 98e1e66d6..a899cfea8 100644 --- a/libs/pygments/lexers/algebra.py +++ b/libs/pygments/lexers/algebra.py @@ -4,7 +4,7 @@ Lexers for computer algebra systems. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -97,6 +97,7 @@ class GAPConsoleLexer(Lexer): filenames = ['*.tst'] url = 'https://www.gap-system.org' version_added = '2.14' + _example = "gap-repl/euclidean.tst" def get_tokens_unprocessed(self, text): gaplexer = GAPLexer(**self.options) diff --git a/libs/pygments/lexers/ambient.py b/libs/pygments/lexers/ambient.py index 4441fd574..3862eb0d9 100644 --- a/libs/pygments/lexers/ambient.py +++ b/libs/pygments/lexers/ambient.py @@ -4,7 +4,7 @@ Lexers for AmbientTalk language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/amdgpu.py b/libs/pygments/lexers/amdgpu.py index 6e4324533..c97ad617e 100644 --- a/libs/pygments/lexers/amdgpu.py +++ b/libs/pygments/lexers/amdgpu.py @@ -4,7 +4,7 @@ Lexers for the AMDGPU ISA assembly. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ampl.py b/libs/pygments/lexers/ampl.py index ce3a77467..bc4082b1b 100644 --- a/libs/pygments/lexers/ampl.py +++ b/libs/pygments/lexers/ampl.py @@ -4,7 +4,7 @@ Lexers for the AMPL language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/apdlexer.py b/libs/pygments/lexers/apdlexer.py index 352288d64..98beedfbe 100644 --- a/libs/pygments/lexers/apdlexer.py +++ b/libs/pygments/lexers/apdlexer.py @@ -4,7 +4,7 @@ Lexers for ANSYS Parametric Design Language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/apl.py b/libs/pygments/lexers/apl.py index d95aff36d..a2ee3f475 100644 --- a/libs/pygments/lexers/apl.py +++ b/libs/pygments/lexers/apl.py @@ -4,7 +4,7 @@ Lexers for APL. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/archetype.py b/libs/pygments/lexers/archetype.py index b019c4f63..47f34af9e 100644 --- a/libs/pygments/lexers/archetype.py +++ b/libs/pygments/lexers/archetype.py @@ -9,7 +9,7 @@ Contributed by Thomas Beale <https://github.com/wolandscat>, <https://bitbucket.org/thomas_beale>. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/arrow.py b/libs/pygments/lexers/arrow.py index 853247630..e686cf1b6 100644 --- a/libs/pygments/lexers/arrow.py +++ b/libs/pygments/lexers/arrow.py @@ -4,7 +4,7 @@ Lexer for Arrow. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/arturo.py b/libs/pygments/lexers/arturo.py index 87c97378e..82fc08983 100644 --- a/libs/pygments/lexers/arturo.py +++ b/libs/pygments/lexers/arturo.py @@ -4,7 +4,7 @@ Lexer for the Arturo language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/asc.py b/libs/pygments/lexers/asc.py index 971f2093e..243c996af 100644 --- a/libs/pygments/lexers/asc.py +++ b/libs/pygments/lexers/asc.py @@ -4,7 +4,7 @@ Lexer for various ASCII armored files. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re diff --git a/libs/pygments/lexers/asm.py b/libs/pygments/lexers/asm.py index a049370bd..74f4a5a8e 100644 --- a/libs/pygments/lexers/asm.py +++ b/libs/pygments/lexers/asm.py @@ -4,7 +4,7 @@ Lexers for assembly languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -390,7 +390,7 @@ class LlvmLexer(RegexLexer): (r'!\d+', Name.Variable.Anonymous), (r'c?' + string, String), - (r'0[xX][a-fA-F0-9]+', Number), + (r'0[xX][KLMHR]?[a-fA-F0-9]+', Number), (r'-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?', Number), (r'[=<>{}\[\]()*.,!]|x\b', Punctuation) @@ -465,24 +465,25 @@ class LlvmLexer(RegexLexer): 'singleImpl', 'singleImplName', 'sitofp', 'sizeM1', 'sizeM1BitWidth', 'sle', 'slt', 'source_filename', 'speculatable', 'speculative_load_hardening', 'spir_func', - 'spir_kernel', 'srem', 'sret', 'ssp', 'sspreq', 'sspstrong', - 'store', 'strictfp', 'sub', 'summaries', 'summary', 'swiftcc', - 'swifterror', 'swiftself', 'switch', 'syncscope', 'tail', - 'tailcc', 'target', 'thread_local', 'to', 'token', 'triple', - 'true', 'trunc', 'type', 'typeCheckedLoadConstVCalls', - 'typeCheckedLoadVCalls', 'typeid', 'typeidCompatibleVTable', - 'typeIdInfo', 'typeTestAssumeConstVCalls', - 'typeTestAssumeVCalls', 'typeTestRes', 'typeTests', 'udiv', - 'ueq', 'uge', 'ugt', 'uitofp', 'ule', 'ult', 'umax', 'umin', - 'undef', 'une', 'uniformRetVal', 'uniqueRetVal', 'unknown', - 'unnamed_addr', 'uno', 'unordered', 'unreachable', 'unsat', - 'unwind', 'urem', 'uselistorder', 'uselistorder_bb', 'uwtable', - 'va_arg', 'varFlags', 'variable', 'vcall_visibility', - 'vFuncId', 'virtFunc', 'virtualConstProp', 'void', 'volatile', - 'vscale', 'vTableFuncs', 'weak', 'weak_odr', 'webkit_jscc', - 'win64cc', 'within', 'wpdRes', 'wpdResolutions', 'writeonly', - 'x', 'x86_64_sysvcc', 'x86_fastcallcc', 'x86_intrcc', - 'x86_mmx', 'x86_regcallcc', 'x86_stdcallcc', 'x86_thiscallcc', + 'spir_kernel', 'splat', 'srem', 'sret', 'ssp', 'sspreq', + 'sspstrong', 'store', 'strictfp', 'sub', 'summaries', + 'summary', 'swiftcc', 'swifterror', 'swiftself', 'switch', + 'syncscope', 'tail', 'tailcc', 'target', 'thread_local', 'to', + 'token', 'triple', 'true', 'trunc', 'type', + 'typeCheckedLoadConstVCalls', 'typeCheckedLoadVCalls', + 'typeid', 'typeidCompatibleVTable', 'typeIdInfo', + 'typeTestAssumeConstVCalls', 'typeTestAssumeVCalls', + 'typeTestRes', 'typeTests', 'udiv', 'ueq', 'uge', 'ugt', + 'uitofp', 'ule', 'ult', 'umax', 'umin', 'undef', 'une', + 'uniformRetVal', 'uniqueRetVal', 'unknown', 'unnamed_addr', + 'uno', 'unordered', 'unreachable', 'unsat', 'unwind', 'urem', + 'uselistorder', 'uselistorder_bb', 'uwtable', 'va_arg', + 'varFlags', 'variable', 'vcall_visibility', 'vFuncId', + 'virtFunc', 'virtualConstProp', 'void', 'volatile', 'vscale', + 'vTableFuncs', 'weak', 'weak_odr', 'webkit_jscc', 'win64cc', + 'within', 'wpdRes', 'wpdResolutions', 'writeonly', 'x', + 'x86_64_sysvcc', 'x86_fastcallcc', 'x86_intrcc', 'x86_mmx', + 'x86_regcallcc', 'x86_stdcallcc', 'x86_thiscallcc', 'x86_vectorcallcc', 'xchg', 'xor', 'zeroext', 'zeroinitializer', 'zext', 'immarg', 'willreturn'), suffix=r'\b'), Keyword), diff --git a/libs/pygments/lexers/asn1.py b/libs/pygments/lexers/asn1.py index 8aa23646d..6c7861bdb 100644 --- a/libs/pygments/lexers/asn1.py +++ b/libs/pygments/lexers/asn1.py @@ -4,7 +4,7 @@ Pygments lexers for ASN.1. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/automation.py b/libs/pygments/lexers/automation.py index e64aa9ae8..4e9c67811 100644 --- a/libs/pygments/lexers/automation.py +++ b/libs/pygments/lexers/automation.py @@ -4,7 +4,7 @@ Lexers for automation scripting languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/bare.py b/libs/pygments/lexers/bare.py index 9049ea846..d7167dc41 100644 --- a/libs/pygments/lexers/bare.py +++ b/libs/pygments/lexers/bare.py @@ -4,7 +4,7 @@ Lexer for the BARE schema. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/basic.py b/libs/pygments/lexers/basic.py index 9cfdf4622..7c9123de7 100644 --- a/libs/pygments/lexers/basic.py +++ b/libs/pygments/lexers/basic.py @@ -4,7 +4,7 @@ Lexers for BASIC like languages (other than VB.net). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/bdd.py b/libs/pygments/lexers/bdd.py index 01688d572..6ddb6056d 100644 --- a/libs/pygments/lexers/bdd.py +++ b/libs/pygments/lexers/bdd.py @@ -4,7 +4,7 @@ Lexer for BDD(Behavior-driven development). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/berry.py b/libs/pygments/lexers/berry.py index 873b72347..5f772b1ad 100644 --- a/libs/pygments/lexers/berry.py +++ b/libs/pygments/lexers/berry.py @@ -4,7 +4,7 @@ Lexer for Berry. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/bibtex.py b/libs/pygments/lexers/bibtex.py index 15e4e04fc..32cc40ae7 100644 --- a/libs/pygments/lexers/bibtex.py +++ b/libs/pygments/lexers/bibtex.py @@ -4,7 +4,7 @@ Lexers for BibTeX bibliography data and styles - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/blueprint.py b/libs/pygments/lexers/blueprint.py index b199c42fd..59f9c42a4 100644 --- a/libs/pygments/lexers/blueprint.py +++ b/libs/pygments/lexers/blueprint.py @@ -4,7 +4,7 @@ Lexer for the Blueprint UI markup language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/boa.py b/libs/pygments/lexers/boa.py index 211f9fd0a..6f4e8cdaf 100644 --- a/libs/pygments/lexers/boa.py +++ b/libs/pygments/lexers/boa.py @@ -4,7 +4,7 @@ Lexers for the Boa language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/bqn.py b/libs/pygments/lexers/bqn.py index b0794ee03..083f69b61 100644 --- a/libs/pygments/lexers/bqn.py +++ b/libs/pygments/lexers/bqn.py @@ -4,7 +4,7 @@ Lexer for BQN. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -26,6 +26,10 @@ class BQNLexer(RegexLexer): mimetypes = [] version_added = '2.16' + # An inter_word_char. Necessary because \w matches all alphanumeric + # Unicode characters, including ones (e.g., 𝕊) that BQN treats special. + _iwc = r'((?=[^𝕎𝕏𝔽𝔾𝕊𝕨𝕩𝕗𝕘𝕤𝕣])\w)' + tokens = { 'root': [ # Whitespace @@ -57,34 +61,35 @@ class BQNLexer(RegexLexer): # =================== # Since this token type is important in BQN, it is not included in # the punctuation token type but rather in the following one - (r'[\(\)]', String.Regex), + (r'[\(\)]', String.Regex), # # Numbers # ======= # Includes the numeric literals and the Nothing character - (r'¯?([0-9]+\.?[0-9]+|[0-9]+)([Ee][¯]?[0-9]+)?|¯|∞|π|·', Number), + (r'¯?[0-9](([0-9]|_)*\.?([0-9]|_)+|([0-9]|_)*)([Ee][¯]?([0-9]|_)+)?|¯|∞|π|·', Number), # # Variables # ========= - (r'\b[a-z]\w*\b', Name.Variable), - # - # 1-Modifiers - # =========== - (r'[˙˜˘¨⌜⁼´˝`𝕣]', Name.Attribute), - (r'\b_[a-zA-Z0-9]+\b', Name.Attribute), + (r'[a-z]' + _iwc + r'*', Name.Variable), # # 2-Modifiers # =========== + # Needs to come before the 1-modifiers due to _𝕣 and _𝕣_ (r'[∘○⊸⟜⌾⊘◶⎉⚇⍟⎊]', Name.Property), - (r'\b_[a-zA-Z0-9]+_\b', Name.Property), + (r'_(𝕣|[a-zA-Z0-9]+)_', Name.Property), + # + # 1-Modifiers + # =========== + (r'[˙˜˘¨⌜⁼´˝`𝕣]', Name.Attribute), + (r'_(𝕣|[a-zA-Z0-9]+)', Name.Attribute), # # Functions # ========= # The monadic or dyadic function primitives and function # operands and arguments, along with function self-reference - (r'[+\-×÷\*√⌊⌈∧∨¬|≤<>≥=≠≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!𝕎𝕏𝔽𝔾𝕊]', + (r'[+\-×÷\⋆√⌊⌈∧∨¬|≤<>≥=≠≡≢⊣⊢⥊∾≍⋈↑↓↕«»⌽⍉/⍋⍒⊏⊑⊐⊒∊⍷⊔!𝕎𝕏𝔽𝔾𝕊]', Operator), - (r'[A-Z]\w*|•\w+\b', Operator), + (r'[A-Z]' + _iwc + r'*|•' + _iwc + r'+', Operator), # # Constant # ======== @@ -102,8 +107,6 @@ class BQNLexer(RegexLexer): # ================ (r'[;:?𝕨𝕩𝕗𝕘𝕤]', Name.Entity), # - + ], } - - diff --git a/libs/pygments/lexers/business.py b/libs/pygments/lexers/business.py index 3d81df54d..73adb8709 100644 --- a/libs/pygments/lexers/business.py +++ b/libs/pygments/lexers/business.py @@ -4,7 +4,7 @@ Lexers for "business-oriented" languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/c_cpp.py b/libs/pygments/lexers/c_cpp.py index 0f83b7193..399f2bc4f 100644 --- a/libs/pygments/lexers/c_cpp.py +++ b/libs/pygments/lexers/c_cpp.py @@ -4,7 +4,7 @@ Lexers for C/C++ languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/c_like.py b/libs/pygments/lexers/c_like.py index f5073c74a..1ba269e82 100644 --- a/libs/pygments/lexers/c_like.py +++ b/libs/pygments/lexers/c_like.py @@ -4,7 +4,7 @@ Lexers for other C-like languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/capnproto.py b/libs/pygments/lexers/capnproto.py index 48e3c51b4..333760e15 100644 --- a/libs/pygments/lexers/capnproto.py +++ b/libs/pygments/lexers/capnproto.py @@ -4,7 +4,7 @@ Lexers for the Cap'n Proto schema language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/carbon.py b/libs/pygments/lexers/carbon.py index c4e71d9c7..702b37bc8 100644 --- a/libs/pygments/lexers/carbon.py +++ b/libs/pygments/lexers/carbon.py @@ -4,7 +4,7 @@ Lexers for the Carbon programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re diff --git a/libs/pygments/lexers/cddl.py b/libs/pygments/lexers/cddl.py index 18e3b03e7..fa0c85f10 100644 --- a/libs/pygments/lexers/cddl.py +++ b/libs/pygments/lexers/cddl.py @@ -8,7 +8,7 @@ More information: https://datatracker.ietf.org/doc/rfc8610/ - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/chapel.py b/libs/pygments/lexers/chapel.py index 8caea3506..955a1579a 100644 --- a/libs/pygments/lexers/chapel.py +++ b/libs/pygments/lexers/chapel.py @@ -4,7 +4,7 @@ Lexer for the Chapel language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/clean.py b/libs/pygments/lexers/clean.py index 119110be9..f96e74373 100644 --- a/libs/pygments/lexers/clean.py +++ b/libs/pygments/lexers/clean.py @@ -4,7 +4,7 @@ Lexer for the Clean language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/codeql.py b/libs/pygments/lexers/codeql.py new file mode 100644 index 000000000..3d06bec6c --- /dev/null +++ b/libs/pygments/lexers/codeql.py @@ -0,0 +1,80 @@ +""" + pygments.lexers.codeql + ~~~~~~~~~~~~~~~~~~~~~~ + + Lexer for CodeQL query language. + + The grammar is originating from: + https://github.com/github/vscode-codeql/blob/main/syntaxes/README.md + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +__all__ = ['CodeQLLexer'] + +import re + +from pygments.lexer import RegexLexer, words +from pygments.token import Comment, Operator, Keyword, Name, String, \ + Number, Punctuation, Whitespace + +class CodeQLLexer(RegexLexer): + name = 'CodeQL' + aliases = ['codeql', 'ql'] + filenames = ['*.ql', '*.qll'] + mimetypes = [] + url = 'https://github.com/github/codeql' + version_added = '2.19' + + flags = re.MULTILINE | re.UNICODE + + tokens = { + 'root': [ + # Whitespace and comments + (r'\s+', Whitespace), + (r'//.*?\n', Comment.Single), + (r'/\*', Comment.Multiline, 'multiline-comments'), + + # Keywords + (words(( + 'module', 'import', 'class', 'extends', 'implements', + 'predicate', 'select', 'where', 'from', 'as', 'and', 'or', 'not', + 'in', 'if', 'then', 'else', 'exists', 'forall', 'instanceof', + 'private', 'predicate', 'abstract', 'cached', 'external', + 'final', 'library', 'override', 'query' + ), suffix=r'\b'), Keyword.Builtin), + + # Special Keywords + (words(('this'), # class related keywords + prefix=r'\b', suffix=r'\b\??:?'), Name.Builtin.Pseudo), + + # Types + (words(( + 'boolean', 'date', 'float', 'int', 'string' + ), suffix=r'\b'), Keyword.Type), + + # Literals + (r'"(\\\\|\\[^\\]|[^"\\])*"', String), + (r'[0-9]+\.[0-9]+', Number.Float), + (r'[0-9]+', Number.Integer), + + # Operators + (r'<=|>=|<|>|=|!=|\+|-|\*|/', Operator), + + # Punctuation + (r'[.,;:\[\]{}()]+', Punctuation), + + # Identifiers + (r'@[a-zA-Z_]\w*', Name.Variable), # Variables with @ prefix + (r'[A-Z][a-zA-Z0-9_]*', Name.Class), # Types and classes + (r'[a-z][a-zA-Z0-9_]*', Name.Variable), # Variables and predicates + ], + 'multiline-comments': [ + (r'[^*/]+', Comment.Multiline), + (r'/\*', Comment.Multiline, '#push'), + (r'\*/', Comment.Multiline, '#pop'), + (r'[*/]', Comment.Multiline), + ], + + } \ No newline at end of file diff --git a/libs/pygments/lexers/comal.py b/libs/pygments/lexers/comal.py index 4344ba32e..3c89a59ea 100644 --- a/libs/pygments/lexers/comal.py +++ b/libs/pygments/lexers/comal.py @@ -4,7 +4,7 @@ Lexer for COMAL-80. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/compiled.py b/libs/pygments/lexers/compiled.py index 57e52df0c..5e0cc188c 100644 --- a/libs/pygments/lexers/compiled.py +++ b/libs/pygments/lexers/compiled.py @@ -4,7 +4,7 @@ Just export lexer classes previously contained in this module. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/configs.py b/libs/pygments/lexers/configs.py index 4b52873c6..5e7f47b6d 100644 --- a/libs/pygments/lexers/configs.py +++ b/libs/pygments/lexers/configs.py @@ -4,7 +4,7 @@ Lexers for configuration file formats. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -44,15 +44,24 @@ class IniLexer(RegexLexer): (r'\s+', Whitespace), (r'[;#].*', Comment.Single), (r'(\[.*?\])([ \t]*)$', bygroups(Keyword, Whitespace)), - (r'(.*?)([  \t]*)([=:])([ \t]*)([^;#\n]*)(\\)(\s+)', + (r'''(.*?)([ \t]*)([=:])([ \t]*)(["'])''', + bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String), + "quoted_value"), + (r'(.*?)([ \t]*)([=:])([ \t]*)([^;#\n]*)(\\)(\s+)', bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String, Text, Whitespace), "value"), - (r'(.*?)([ \t]*)([=:])([  \t]*)([^ ;#\n]*(?: +[^ ;#\n]+)*)', + (r'(.*?)([ \t]*)([=:])([ \t]*)([^ ;#\n]*(?: +[^ ;#\n]+)*)', bygroups(Name.Attribute, Whitespace, Operator, Whitespace, String)), # standalone option, supported by some INI parsers (r'(.+?)$', Name.Attribute), ], + 'quoted_value': [ + (r'''([^"'\n]*)(["'])(\s*)''', + bygroups(String, String, Whitespace), "#pop"), + (r'[;#].*', Comment.Single), + (r'$', String, "#pop"), + ], 'value': [ # line continuation (r'\s+', Whitespace), (r'(\s*)(.*)(\\)([ \t]*)', diff --git a/libs/pygments/lexers/console.py b/libs/pygments/lexers/console.py index b9f24745e..d66cbaa95 100644 --- a/libs/pygments/lexers/console.py +++ b/libs/pygments/lexers/console.py @@ -4,7 +4,7 @@ Lexers for misc console output. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/cplint.py b/libs/pygments/lexers/cplint.py index 39b0a96e3..f8424252e 100644 --- a/libs/pygments/lexers/cplint.py +++ b/libs/pygments/lexers/cplint.py @@ -4,7 +4,7 @@ Lexer for the cplint language - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/crystal.py b/libs/pygments/lexers/crystal.py index 6656815ab..f5da4f84c 100644 --- a/libs/pygments/lexers/crystal.py +++ b/libs/pygments/lexers/crystal.py @@ -4,7 +4,7 @@ Lexer for Crystal. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/csound.py b/libs/pygments/lexers/csound.py index 415fac3ef..403b66f96 100644 --- a/libs/pygments/lexers/csound.py +++ b/libs/pygments/lexers/csound.py @@ -4,7 +4,7 @@ Lexers for Csound languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/css.py b/libs/pygments/lexers/css.py index fb7936b82..97897db65 100644 --- a/libs/pygments/lexers/css.py +++ b/libs/pygments/lexers/css.py @@ -4,7 +4,7 @@ Lexers for CSS and related stylesheet formats. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -96,7 +96,7 @@ 'padding-box', 'page', 'pan-down', 'pan-left', 'pan-right', 'pan-up', 'pan-x', 'pan-y', 'paused', 'petite-caps', 'pixelated', 'pointer', 'preserve-3d', 'progress', 'proximity', 'relative', 'repeat', - 'repeat no-repeat', 'repeat-x', 'repeat-y', 'reverse', 'ridge', 'right', + 'repeat no-repeat', 'repeat-x', 'repeat-y', 'reverse', 'revert', 'ridge', 'right', 'round', 'row', 'row-resize', 'row-reverse', 'rtl', 'ruby', 'ruby-base', 'ruby-base-container', 'ruby-text', 'ruby-text-container', 'run-in', 'running', 's-resize', 'sans-serif', 'saturation', 'scale-down', 'screen', diff --git a/libs/pygments/lexers/d.py b/libs/pygments/lexers/d.py index 58c53b713..a0b56e9ca 100644 --- a/libs/pygments/lexers/d.py +++ b/libs/pygments/lexers/d.py @@ -4,7 +4,7 @@ Lexers for D languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/dalvik.py b/libs/pygments/lexers/dalvik.py index df854f1fa..1ac332bfa 100644 --- a/libs/pygments/lexers/dalvik.py +++ b/libs/pygments/lexers/dalvik.py @@ -4,7 +4,7 @@ Pygments lexers for Dalvik VM-related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/data.py b/libs/pygments/lexers/data.py index 8f384bc35..f43203252 100644 --- a/libs/pygments/lexers/data.py +++ b/libs/pygments/lexers/data.py @@ -4,7 +4,7 @@ Lexers for data file format. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/dax.py b/libs/pygments/lexers/dax.py index aec4c4f66..9c333947e 100644 --- a/libs/pygments/lexers/dax.py +++ b/libs/pygments/lexers/dax.py @@ -4,7 +4,7 @@ Lexer for LilyPond. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/devicetree.py b/libs/pygments/lexers/devicetree.py index 903eda93d..a9b0b7aa4 100644 --- a/libs/pygments/lexers/devicetree.py +++ b/libs/pygments/lexers/devicetree.py @@ -4,7 +4,7 @@ Lexers for Devicetree language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/diff.py b/libs/pygments/lexers/diff.py index 4b260da87..ed7007f5b 100644 --- a/libs/pygments/lexers/diff.py +++ b/libs/pygments/lexers/diff.py @@ -4,7 +4,7 @@ Lexers for diff/patch formats. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/dns.py b/libs/pygments/lexers/dns.py index d0f98d032..3fb91f571 100644 --- a/libs/pygments/lexers/dns.py +++ b/libs/pygments/lexers/dns.py @@ -4,7 +4,7 @@ Pygments lexers for DNS - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/dotnet.py b/libs/pygments/lexers/dotnet.py index 17097c75d..2254a8b2e 100644 --- a/libs/pygments/lexers/dotnet.py +++ b/libs/pygments/lexers/dotnet.py @@ -4,7 +4,7 @@ Lexers for .net languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re @@ -74,6 +74,7 @@ class CSharpLexer(RegexLexer): for levelname, cs_ident in levels.items(): tokens[levelname] = { 'root': [ + include('numbers'), # method names (r'^([ \t]*)((?:' + cs_ident + r'(?:\[\])?\s+)+?)' # return type r'(' + cs_ident + ')' # method name @@ -106,18 +107,29 @@ class CSharpLexer(RegexLexer): Comment.Preproc, Whitespace)), (r'\b(extern)(\s+)(alias)\b', bygroups(Keyword, Whitespace, Keyword)), - (r'(abstract|as|async|await|base|break|by|case|catch|' - r'checked|const|continue|default|delegate|' - r'do|else|enum|event|explicit|extern|false|finally|' - r'fixed|for|foreach|goto|if|implicit|in|interface|' - r'internal|is|let|lock|new|null|on|operator|' - r'out|override|params|private|protected|public|readonly|' - r'ref|return|sealed|sizeof|stackalloc|static|' - r'switch|this|throw|true|try|typeof|' - r'unchecked|unsafe|virtual|void|while|' - r'get|set|new|partial|yield|add|remove|value|alias|ascending|' - r'descending|from|group|into|orderby|select|thenby|where|' - r'join|equals)\b', Keyword), + (words(( + 'abstract', 'as', 'async', 'await', 'base', 'break', 'by', + 'case', 'catch', 'checked', 'const', 'continue', 'default', + 'delegate', 'do', 'else', 'enum', 'event', 'explicit', + 'extern', 'false', 'finally', 'fixed', 'for', 'foreach', + 'goto', 'if', 'implicit', 'in', 'interface', 'internal', + 'is', 'let', 'lock', 'new', 'null', 'on', 'operator', + 'out', 'override', 'params', 'private', 'protected', + 'public', 'readonly', 'ref', 'return', 'sealed', 'sizeof', + 'stackalloc', 'static', 'switch', 'this', 'throw', 'true', + 'try', 'typeof', 'unchecked', 'unsafe', 'virtual', 'void', + 'while', 'get', 'set', 'new', 'partial', 'yield', 'add', + 'remove', 'value', 'alias', 'ascending', 'descending', + 'from', 'group', 'into', 'orderby', 'select', 'thenby', + 'where', 'join', 'equals', 'record', 'allows', + 'and', 'init', 'managed', 'nameof', 'nint', 'not', + 'notnull', 'nuint', 'or', 'scoped', 'unmanaged', 'when', + 'with' + ), suffix=r'\b'), Keyword), + # version 1: assumes that 'file' is the only contextual keyword + # that is a class modifier + (r'(file)(\s+)(record|class|abstract|enum|new|sealed|static)\b', + bygroups(Keyword, Whitespace, Keyword)), (r'(global)(::)', bygroups(Keyword, Punctuation)), (r'(bool|byte|char|decimal|double|dynamic|float|int|long|object|' r'sbyte|short|string|uint|ulong|ushort|var)\b\??', Keyword.Type), @@ -125,6 +137,21 @@ class CSharpLexer(RegexLexer): (r'(namespace|using)(\s+)', bygroups(Keyword, Whitespace), 'namespace'), (cs_ident, Name), ], + 'numbers_int': [ + (r"0[xX][0-9a-fA-F]+(([uU][lL]?)|[lL][uU]?)?", Number.Hex), + (r"0[bB][01]+(([uU][lL]?)|[lL][uU]?)?", Number.Bin), + (r"[0-9]+(([uU][lL]?)|[lL][uU]?)?", Number.Integer), + ], + 'numbers_float': [ + (r"([0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fFdDmM]?)|" + r"(\.[0-9]+([eE][+-]?[0-9]+)?[fFdDmM]?)|" + r"([0-9]+([eE][+-]?[0-9]+)[fFdDmM]?)|" + r"([0-9]+[fFdDmM])", Number.Float), + ], + 'numbers': [ + include('numbers_float'), + include('numbers_int'), + ], 'class': [ (cs_ident, Name.Class, '#pop'), default('#pop'), diff --git a/libs/pygments/lexers/dsls.py b/libs/pygments/lexers/dsls.py index 35dfda9a3..d30c11249 100644 --- a/libs/pygments/lexers/dsls.py +++ b/libs/pygments/lexers/dsls.py @@ -4,7 +4,7 @@ Lexers for various domain-specific languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/dylan.py b/libs/pygments/lexers/dylan.py index 8cd0d624d..2109bd52c 100644 --- a/libs/pygments/lexers/dylan.py +++ b/libs/pygments/lexers/dylan.py @@ -4,7 +4,7 @@ Lexers for the Dylan language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -242,7 +242,7 @@ class DylanConsoleLexer(Lexer): """ For Dylan interactive console output. - This is based on a copy of the RubyConsoleLexer. + This is based on a copy of the ``RubyConsoleLexer``. """ name = 'Dylan session' aliases = ['dylan-console', 'dylan-repl'] @@ -250,7 +250,7 @@ class DylanConsoleLexer(Lexer): mimetypes = ['text/x-dylan-console'] url = 'http://www.opendylan.org/' version_added = '1.6' - _example = 'dylan-console/console' + _example = 'dylan-console/console.dylan-console' _prompt_re = re.compile(r'\?| ') diff --git a/libs/pygments/lexers/ecl.py b/libs/pygments/lexers/ecl.py index e7b4aaa7d..f1ee3bf17 100644 --- a/libs/pygments/lexers/ecl.py +++ b/libs/pygments/lexers/ecl.py @@ -4,7 +4,7 @@ Lexers for the ECL language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/eiffel.py b/libs/pygments/lexers/eiffel.py index a3adb3e62..691c71873 100644 --- a/libs/pygments/lexers/eiffel.py +++ b/libs/pygments/lexers/eiffel.py @@ -4,7 +4,7 @@ Lexer for the Eiffel language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/elm.py b/libs/pygments/lexers/elm.py index 0a8939ba2..cebbbf002 100644 --- a/libs/pygments/lexers/elm.py +++ b/libs/pygments/lexers/elm.py @@ -4,7 +4,7 @@ Lexer for the Elm programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/elpi.py b/libs/pygments/lexers/elpi.py index 5efaffa87..5e4b1e5a0 100644 --- a/libs/pygments/lexers/elpi.py +++ b/libs/pygments/lexers/elpi.py @@ -4,16 +4,17 @@ Lexer for the `Elpi <http://github.com/LPCIC/elpi>`_ programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ -from pygments.lexer import RegexLexer, bygroups, include +from pygments.lexer import RegexLexer, bygroups, include, using from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ Number, Punctuation __all__ = ['ElpiLexer'] +from pygments.lexers.theorem import CoqLexer class ElpiLexer(RegexLexer): """ @@ -51,7 +52,7 @@ class ElpiLexer(RegexLexer): (r"(:before|:after|:if|:name)(\s*)(\")", bygroups(Keyword.Mode, Text.Whitespace, String.Double), 'elpi-string'), - (r"(:index)(\s*\()", bygroups(Keyword.Mode, Text.Whitespace), + (r"(:index)(\s*)(\()", bygroups(Keyword.Mode, Text.Whitespace, Punctuation), 'elpi-indexing-expr'), (rf"\b(external pred|pred)(\s+)({const_sym_re})", bygroups(Keyword.Declaration, Text.Whitespace, Name.Function), @@ -65,6 +66,9 @@ class ElpiLexer(RegexLexer): (rf"\b(typeabbrev)(\s+)({const_sym_re})", bygroups(Keyword.Declaration, Text.Whitespace, Name.Function), 'elpi-type'), + (r"\b(typeabbrev)(\s+)(\([^)]+\))", + bygroups(Keyword.Declaration, Text.Whitespace, Name.Function), + 'elpi-type'), (r"\b(accumulate)(\s+)(\")", bygroups(Keyword.Declaration, Text.Whitespace, String.Double), 'elpi-string'), @@ -79,7 +83,7 @@ class ElpiLexer(RegexLexer): 'elpi-chr-rule-start'), (rf"(?=[A-Z_]){constant_re}", Name.Variable), - (rf"(?=[a-z_]){constant_re}\\", Name.Variable), + (rf"(?=[a-z_])({constant_re}|_)\\", Name.Variable), (r"_", Name.Variable), (rf"({symbol_re}|!|=>|;)", Keyword.Declaration), (constant_re, Text), @@ -89,23 +93,19 @@ class ElpiLexer(RegexLexer): (r'\'', String.Double, 'elpi-tick'), (r'\{\{', Punctuation, 'elpi-quote'), (r'\{[^\{]', Text, 'elpi-spill'), - (r"\(", Text, 'elpi-in-parens'), + (r"\(", Punctuation, 'elpi-in-parens'), (r'\d[\d_]*', Number.Integer), (r'-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)', Number.Float), (r"[\+\*\-/\^\.]", Operator), ], '_elpi-comment': [ (r'%[^\n]*\n', Comment), - (r'/\*', Comment, 'elpi-multiline-comment'), + (r'/(?:\\\n)?[*](?:[^*]|[*](?!(?:\\\n)?/))*[*](?:\\\n)?/', Comment), (r"\s+", Text.Whitespace), ], - 'elpi-multiline-comment': [ - (r'\*/', Comment, '#pop'), - (r'.', Comment) - ], 'elpi-indexing-expr':[ (r'[0-9 _]+', Number.Integer), - (r'\)', Text, '#pop'), + (r'\)', Punctuation, '#pop'), ], 'elpi-type': [ (r"(ctype\s+)(\")", bygroups(Keyword.Type, String.Double), 'elpi-string'), @@ -116,13 +116,13 @@ class ElpiLexer(RegexLexer): include('_elpi-comment'), ], 'elpi-chr-rule-start': [ - (r"\{", Text, 'elpi-chr-rule'), + (r"\{", Punctuation, 'elpi-chr-rule'), include('_elpi-comment'), ], 'elpi-chr-rule': [ (r"\brule\b", Keyword.Declaration), (r"\\", Keyword.Declaration), - (r"\}", Text, '#pop:2'), + (r"\}", Punctuation, '#pop:2'), include('elpi'), ], 'elpi-pred-item': [ @@ -152,11 +152,15 @@ class ElpiLexer(RegexLexer): (r'"', String.Double, '#pop'), ], 'elpi-quote': [ - (r'\{\{', Punctuation, '#push'), (r'\}\}', Punctuation, '#pop'), - (rf"(lp:)((?=[A-Z_]){constant_re})", bygroups(Keyword, Name.Variable)), - (r"[^l\}]+", Text), - (r"l|\}", Text), + (r"\s+", Text.Whitespace), + (r"(lp:)(\{\{)", bygroups(Number, Punctuation), 'elpi-quote-exit'), + (rf"(lp:)((?=[A-Z_]){constant_re})", bygroups(Number, Name.Variable)), + (r"((?!lp:|\}\}).)+", using(CoqLexer)), + ], + 'elpi-quote-exit': [ + include('elpi'), + (r'\}\}', Punctuation, '#pop'), ], 'elpi-spill': [ (r'\{[^\{]', Text, '#push'), @@ -164,9 +168,8 @@ class ElpiLexer(RegexLexer): include('elpi'), ], 'elpi-in-parens': [ - (r"\(", Operator, '#push'), - (r"\)", Operator, '#pop'), + (r"\(", Punctuation, '#push'), include('elpi'), + (r"\)", Punctuation, '#pop'), ], - } diff --git a/libs/pygments/lexers/email.py b/libs/pygments/lexers/email.py index c0726e8b8..ea071c800 100644 --- a/libs/pygments/lexers/email.py +++ b/libs/pygments/lexers/email.py @@ -4,7 +4,7 @@ Lexer for the raw E-mail. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/erlang.py b/libs/pygments/lexers/erlang.py index 119018232..120f5049f 100644 --- a/libs/pygments/lexers/erlang.py +++ b/libs/pygments/lexers/erlang.py @@ -4,7 +4,7 @@ Lexers for Erlang. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/esoteric.py b/libs/pygments/lexers/esoteric.py index e9fab0e46..fe3825c35 100644 --- a/libs/pygments/lexers/esoteric.py +++ b/libs/pygments/lexers/esoteric.py @@ -4,7 +4,7 @@ Lexers for esoteric languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ezhil.py b/libs/pygments/lexers/ezhil.py index 697d90c69..aeb71ab0c 100644 --- a/libs/pygments/lexers/ezhil.py +++ b/libs/pygments/lexers/ezhil.py @@ -4,7 +4,7 @@ Pygments lexers for Ezhil language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/factor.py b/libs/pygments/lexers/factor.py index 297433ce4..2ec3f9be2 100644 --- a/libs/pygments/lexers/factor.py +++ b/libs/pygments/lexers/factor.py @@ -4,7 +4,7 @@ Lexers for the Factor language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/fantom.py b/libs/pygments/lexers/fantom.py index a5ca59c3d..7228554ba 100644 --- a/libs/pygments/lexers/fantom.py +++ b/libs/pygments/lexers/fantom.py @@ -4,7 +4,7 @@ Lexer for the Fantom language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/felix.py b/libs/pygments/lexers/felix.py index 681070e87..a42ac0805 100644 --- a/libs/pygments/lexers/felix.py +++ b/libs/pygments/lexers/felix.py @@ -4,7 +4,7 @@ Lexer for the Felix language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/fift.py b/libs/pygments/lexers/fift.py index 02fdf4812..1263236c9 100644 --- a/libs/pygments/lexers/fift.py +++ b/libs/pygments/lexers/fift.py @@ -4,7 +4,7 @@ Lexers for fift. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/floscript.py b/libs/pygments/lexers/floscript.py index 864560914..9c7eaab5a 100644 --- a/libs/pygments/lexers/floscript.py +++ b/libs/pygments/lexers/floscript.py @@ -4,7 +4,7 @@ Lexer for FloScript - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/forth.py b/libs/pygments/lexers/forth.py index 1cf707218..51f75affb 100644 --- a/libs/pygments/lexers/forth.py +++ b/libs/pygments/lexers/forth.py @@ -4,7 +4,7 @@ Lexer for the Forth language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/fortran.py b/libs/pygments/lexers/fortran.py index 1a2b7f950..a6230f024 100644 --- a/libs/pygments/lexers/fortran.py +++ b/libs/pygments/lexers/fortran.py @@ -4,7 +4,7 @@ Lexers for Fortran languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/foxpro.py b/libs/pygments/lexers/foxpro.py index dd6fd1821..3e7c05697 100644 --- a/libs/pygments/lexers/foxpro.py +++ b/libs/pygments/lexers/foxpro.py @@ -4,7 +4,7 @@ Simple lexer for Microsoft Visual FoxPro source code. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/freefem.py b/libs/pygments/lexers/freefem.py index ce8e25453..87b066b1a 100644 --- a/libs/pygments/lexers/freefem.py +++ b/libs/pygments/lexers/freefem.py @@ -4,7 +4,7 @@ Lexer for FreeFem++ language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/func.py b/libs/pygments/lexers/func.py index 373056957..d8c912a3e 100644 --- a/libs/pygments/lexers/func.py +++ b/libs/pygments/lexers/func.py @@ -4,7 +4,7 @@ Lexers for FunC. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/functional.py b/libs/pygments/lexers/functional.py index 1f51ac9e0..6a051d8fd 100644 --- a/libs/pygments/lexers/functional.py +++ b/libs/pygments/lexers/functional.py @@ -4,7 +4,7 @@ Just export lexer classes previously contained in this module. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/futhark.py b/libs/pygments/lexers/futhark.py index 2b5bb5901..dd2efe83e 100644 --- a/libs/pygments/lexers/futhark.py +++ b/libs/pygments/lexers/futhark.py @@ -4,7 +4,7 @@ Lexer for the Futhark language - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/gcodelexer.py b/libs/pygments/lexers/gcodelexer.py index 1747d416d..9e968bd6b 100644 --- a/libs/pygments/lexers/gcodelexer.py +++ b/libs/pygments/lexers/gcodelexer.py @@ -4,7 +4,7 @@ Lexers for the G Code Language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/gdscript.py b/libs/pygments/lexers/gdscript.py index a6b8ad4e1..6dfe58976 100644 --- a/libs/pygments/lexers/gdscript.py +++ b/libs/pygments/lexers/gdscript.py @@ -7,7 +7,7 @@ Modified by Daniel J. Ramirez <djrmuv@gmail.com> based on the original python.py. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/gleam.py b/libs/pygments/lexers/gleam.py new file mode 100644 index 000000000..19047e13e --- /dev/null +++ b/libs/pygments/lexers/gleam.py @@ -0,0 +1,74 @@ +""" + pygments.lexers.gleam + ~~~~~~~~~~~~~~~~~~~~~ + + Lexer for the Gleam programming language. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, words, bygroups +from pygments.token import Comment, Operator, Keyword, Name, String, \ + Number, Punctuation, Whitespace + +__all__ = ['GleamLexer'] + + +class GleamLexer(RegexLexer): + """ + Lexer for the Gleam programming language (version 1.0.0). + """ + + name = 'Gleam' + url = 'https://gleam.run/' + filenames = ['*.gleam'] + aliases = ['gleam'] + mimetypes = ['text/x-gleam'] + version_added = '2.19' + + keywords = words(( + 'as', 'assert', 'auto', 'case', 'const', 'delegate', 'derive', 'echo', + 'else', 'fn', 'if', 'implement', 'import', 'let', 'macro', 'opaque', + 'panic', 'pub', 'test', 'todo', 'type', 'use', + ), suffix=r'\b') + + tokens = { + 'root': [ + # Comments + (r'(///.*?)(\n)', bygroups(String.Doc, Whitespace)), + (r'(//.*?)(\n)', bygroups(Comment.Single, Whitespace)), + + # Keywords + (keywords, Keyword), + (r'([a-zA-Z_]+)(\.)', bygroups(Keyword, Punctuation)), + + # Punctuation + (r'[()\[\]{}:;,@]+', Punctuation), + (r'(#|!=|!|==|\|>|\|\||\||\->|<\-|&&|<<|>>|\.\.|\.|=)', Punctuation), + + # Operators + (r'(<>|\+\.?|\-\.?|\*\.?|/\.?|%\.?|<=\.?|>=\.?|<\.?|>\.?|=)', Operator), + + # Strings + (r'"(\\"|[^"])*"', String), + + # Identifiers + (r'\b(let)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Variable)), + (r'\b(fn)(\s+)(\w+)', bygroups(Keyword, Whitespace, Name.Function)), + (r'[a-zA-Z_/]\w*', Name), + + # numbers + (r'(\d+(_\d+)*\.(?!\.)(\d+(_\d+)*)?|\.\d+(_\d+)*)([eEf][+-]?[0-9]+)?', Number.Float), + (r'\d+(_\d+)*[eEf][+-]?[0-9]+', Number.Float), + (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*(\.([a-fA-F0-9]+(_[a-fA-F0-9]+)*)?)?p[+-]?\d+', Number.Float), + (r'0[bB][01]+(_[01]+)*', Number.Bin), + (r'0[oO][0-7]+(_[0-7]+)*', Number.Oct), + (r'0[xX][a-fA-F0-9]+(_[a-fA-F0-9]+)*', Number.Hex), + (r'\d+(_\d+)*', Number.Integer), + + # Whitespace + (r'\s+', Whitespace), + + ], + } diff --git a/libs/pygments/lexers/go.py b/libs/pygments/lexers/go.py index 4d8326ad1..77a0fbce9 100644 --- a/libs/pygments/lexers/go.py +++ b/libs/pygments/lexers/go.py @@ -4,7 +4,7 @@ Lexers for the Google Go language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/grammar_notation.py b/libs/pygments/lexers/grammar_notation.py index cb2814376..45274fd14 100644 --- a/libs/pygments/lexers/grammar_notation.py +++ b/libs/pygments/lexers/grammar_notation.py @@ -4,7 +4,7 @@ Lexers for grammar notations like BNF. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/graph.py b/libs/pygments/lexers/graph.py index 840d5e9e6..01d75743a 100644 --- a/libs/pygments/lexers/graph.py +++ b/libs/pygments/lexers/graph.py @@ -4,7 +4,7 @@ Lexers for graph query languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/graphics.py b/libs/pygments/lexers/graphics.py index c5a144d0c..400be4fd8 100644 --- a/libs/pygments/lexers/graphics.py +++ b/libs/pygments/lexers/graphics.py @@ -4,7 +4,7 @@ Lexers for computer graphics and plotting related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/graphql.py b/libs/pygments/lexers/graphql.py index 2bcb383e9..7de5b6e7c 100644 --- a/libs/pygments/lexers/graphql.py +++ b/libs/pygments/lexers/graphql.py @@ -8,7 +8,7 @@ More information: https://graphql.org/ - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/graphviz.py b/libs/pygments/lexers/graphviz.py index f58e1ffaa..6b4841554 100644 --- a/libs/pygments/lexers/graphviz.py +++ b/libs/pygments/lexers/graphviz.py @@ -4,7 +4,7 @@ Lexer for the DOT language (graphviz). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/gsql.py b/libs/pygments/lexers/gsql.py old mode 100755 new mode 100644 index 5f55af3a2..9ff187889 --- a/libs/pygments/lexers/gsql.py +++ b/libs/pygments/lexers/gsql.py @@ -4,7 +4,7 @@ Lexers for TigerGraph GSQL graph query language - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/hare.py b/libs/pygments/lexers/hare.py new file mode 100644 index 000000000..56548d5e5 --- /dev/null +++ b/libs/pygments/lexers/hare.py @@ -0,0 +1,73 @@ +""" + pygments.lexers.hare + ~~~~~~~~~~~~~~~~~~~~ + + Lexers for the Hare language. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, include, words +from pygments.token import Comment, Operator, Keyword, Name, String, \ + Number, Punctuation, Whitespace + +__all__ = ['HareLexer'] + +class HareLexer(RegexLexer): + """ + Lexer for the Hare programming language. + """ + name = 'Hare' + url = 'https://harelang.org/' + aliases = ['hare'] + filenames = ['*.ha'] + mimetypes = ['text/x-hare'] + version_added = '2.19' + + _ws = r'(?:\s|//.*?\n|/[*].*?[*]/)+' + _ws1 = r'\s*(?:/[*].*?[*]/\s*)?' + + tokens = { + 'whitespace': [ + (r'^use.*;', Comment.Preproc), + (r'@[a-z]+', Comment.Preproc), + (r'\n', Whitespace), + (r'\s+', Whitespace), + (r'//.*?$', Comment.Single), + ], + 'statements': [ + (r'"', String, 'string'), + (r'`[^`]*`', String), + (r"'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char), + (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*', Number.Float), + (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float), + (r'0x[0-9a-fA-F]+[LlUu]*', Number.Hex), + (r'0o[0-7]+[LlUu]*', Number.Oct), + (r'\d+[zui]?(\d+)?', Number.Integer), + (r'[~!%^&*+=|?:<>/-]', Operator), + (words(('as', 'is', '=>', '..', '...')), Operator), + (r'[()\[\],.{};]+', Punctuation), + (words(('abort', 'align', 'alloc', 'append', 'assert', 'case', + 'const', 'def', 'defer', 'delete', 'else', 'enum', 'export', + 'fn', 'for', 'free', 'if', 'let', 'len', 'match', 'offset', + 'return', 'static', 'struct', 'switch', 'type', 'union', + 'yield', 'vastart', 'vaarg', 'vaend'), + suffix=r'\b'), Keyword), + (r'(bool|int|uint|uintptr|u8|u16|u32|u64|i8|i16|i32|i64|f32|f64|null|done|never|void|nullable|rune|size|valist)\b', + Keyword.Type), + (r'(true|false|null)\b', Name.Builtin), + (r'[a-zA-Z_]\w*', Name), + ], + 'string': [ + (r'"', String, '#pop'), + (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|' + r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape), + (r'[^\\"\n]+', String), # all other characters + (r'\\', String), # stray backslash + ], + 'root': [ + include('whitespace'), + include('statements'), + ], + } diff --git a/libs/pygments/lexers/haskell.py b/libs/pygments/lexers/haskell.py index 4983abc8c..0a9f2c15a 100644 --- a/libs/pygments/lexers/haskell.py +++ b/libs/pygments/lexers/haskell.py @@ -4,7 +4,7 @@ Lexers for Haskell and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -302,9 +302,9 @@ class AgdaLexer(RegexLexer): 'abstract', 'codata', 'coinductive', 'constructor', 'data', 'do', 'eta-equality', 'field', 'forall', 'hiding', 'in', 'inductive', 'infix', 'infixl', 'infixr', 'instance', 'interleaved', 'let', 'macro', 'mutual', - 'no-eta-equality', 'open', 'overlap', 'pattern', 'postulate', 'primitive', + 'no-eta-equality', 'opaque', 'open', 'overlap', 'pattern', 'postulate', 'primitive', 'private', 'quote', 'quoteTerm', 'record', 'renaming', 'rewrite', - 'syntax', 'tactic', 'unquote', 'unquoteDecl', 'unquoteDef', 'using', + 'syntax', 'tactic', 'unfolding', 'unquote', 'unquoteDecl', 'unquoteDef', 'using', 'variable', 'where', 'with', ) diff --git a/libs/pygments/lexers/haxe.py b/libs/pygments/lexers/haxe.py index d9bf654cc..66bd2a350 100644 --- a/libs/pygments/lexers/haxe.py +++ b/libs/pygments/lexers/haxe.py @@ -4,7 +4,7 @@ Lexers for Haxe and related stuff. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/hdl.py b/libs/pygments/lexers/hdl.py index 57e560f9d..d22b66ff6 100644 --- a/libs/pygments/lexers/hdl.py +++ b/libs/pygments/lexers/hdl.py @@ -4,7 +4,7 @@ Lexers for hardware descriptor languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/hexdump.py b/libs/pygments/lexers/hexdump.py index 28d3429ca..4da4edb6a 100644 --- a/libs/pygments/lexers/hexdump.py +++ b/libs/pygments/lexers/hexdump.py @@ -4,7 +4,7 @@ Lexers for hexadecimal dumps. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/html.py b/libs/pygments/lexers/html.py index c4217a219..66ba6609f 100644 --- a/libs/pygments/lexers/html.py +++ b/libs/pygments/lexers/html.py @@ -4,14 +4,14 @@ Lexers for HTML, XML and related markup. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re from pygments.lexer import RegexLexer, ExtendedRegexLexer, include, bygroups, \ - default, using + default, using, inherit, this from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ Punctuation, Whitespace from pygments.util import looks_like_xml, html_doctype_matches @@ -22,7 +22,7 @@ from pygments.lexers.ruby import RubyLexer __all__ = ['HtmlLexer', 'DtdLexer', 'XmlLexer', 'XsltLexer', 'HamlLexer', - 'ScamlLexer', 'PugLexer', 'UrlEncodedLexer'] + 'ScamlLexer', 'PugLexer', 'VueLexer', 'UrlEncodedLexer'] class HtmlLexer(RegexLexer): @@ -624,3 +624,47 @@ class UrlEncodedLexer(RegexLexer): ('([^&=]*)(=)([^=&]*)(&?)', bygroups(Name.Tag, Operator, String, Punctuation)), ], } + + +class VueLexer(HtmlLexer): + """ + For Vue Single-File Component. + """ + + name = 'Vue' + url = 'https://vuejs.org/api/sfc-spec.html' + aliases = ['vue'] + filenames = ['*.vue'] + mimetypes = [] + version_added = '2.19' + + flags = re.IGNORECASE | re.DOTALL + tokens = { + 'root': [ + (r'(\{\{)(.*?)(\}\})', bygroups(Comment.Preproc, + using(JavascriptLexer), Comment.Preproc)), + ('[^<&{]+', Text), + inherit, + ], + 'tag': [ + (r'\s+', Text), + (r'((?:[@:]|v-)(?:[.\w:-]|\[[^\]]*?\])+\s*)(=)(\s*)', + bygroups(using(this, state=['name']), Operator, Text), + 'attr-directive'), + (r'([\w:-]+\s*)(=)(\s*)', bygroups(Name.Attribute, Operator, Text), + 'attr'), + (r'[\w:-]+', Name.Attribute), + (r'(/?)(\s*)(>)', bygroups(Punctuation, Text, Punctuation), '#pop'), + ], + 'name': [ + (r'[\w-]+', Name.Attribute), + (r'[:@.]', Punctuation), + (r'(\[)([^\]]*?)(\])', bygroups(Comment.Preproc, + using(JavascriptLexer), Comment.Preproc)), + ], + 'attr-directive': [ + (r'(["\'])(.*?)(\1)', bygroups(String, + using(JavascriptLexer), String), '#pop'), + (r'[^\s>]+', using(JavascriptLexer), '#pop'), + ], + } diff --git a/libs/pygments/lexers/idl.py b/libs/pygments/lexers/idl.py index fab3c1721..21b8d3130 100644 --- a/libs/pygments/lexers/idl.py +++ b/libs/pygments/lexers/idl.py @@ -4,7 +4,7 @@ Lexers for IDL. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/igor.py b/libs/pygments/lexers/igor.py index 84ec32fd2..136c5b892 100644 --- a/libs/pygments/lexers/igor.py +++ b/libs/pygments/lexers/igor.py @@ -4,7 +4,7 @@ Lexers for Igor Pro. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -38,7 +38,7 @@ class IgorLexer(RegexLexer): types = ( 'variable', 'string', 'constant', 'strconstant', 'NVAR', 'SVAR', 'WAVE', 'STRUCT', 'dfref', 'funcref', 'char', 'uchar', 'int16', 'uint16', 'int32', - 'uint32', 'int64', 'uint64', 'float', 'double' + 'uint32', 'int64', 'uint64', 'float', 'double', 'int' ) keywords = ( 'override', 'ThreadSafe', 'MultiThread', 'static', 'Proc', diff --git a/libs/pygments/lexers/inferno.py b/libs/pygments/lexers/inferno.py index 3513df2af..b5caf55a0 100644 --- a/libs/pygments/lexers/inferno.py +++ b/libs/pygments/lexers/inferno.py @@ -4,7 +4,7 @@ Lexers for Inferno os and all the related stuff. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/installers.py b/libs/pygments/lexers/installers.py index 2a9c5daa1..3f12a25b2 100644 --- a/libs/pygments/lexers/installers.py +++ b/libs/pygments/lexers/installers.py @@ -4,7 +4,7 @@ Lexers for installer/packager DSLs and formats. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -14,7 +14,8 @@ from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ Punctuation, Generic, Number, Whitespace -__all__ = ['NSISLexer', 'RPMSpecLexer', 'SourcesListLexer', +__all__ = ['NSISLexer', 'RPMSpecLexer', + 'DebianSourcesLexer', 'SourcesListLexer', 'DebianControlLexer'] @@ -217,6 +218,30 @@ class RPMSpecLexer(RegexLexer): } +class DebianSourcesLexer(RegexLexer): + """ + Lexer that highlights debian.sources files. + """ + + name = 'Debian Sources file' + aliases = ['debian.sources'] + filenames = ['*.sources'] + version_added = '2.19' + url = 'https://manpages.debian.org/bookworm/apt/sources.list.5.en.html#THE_DEB_AND_DEB-SRC_TYPES:_GENERAL_FORMAT' + + tokens = { + 'root': [ + (r'^(Signed-By)(:)(\s*)', bygroups(Keyword, Punctuation, Whitespace), 'signed-by'), + (r'^([a-zA-Z\-0-9\.]*?)(:)(\s*)(.*?)$', + bygroups(Keyword, Punctuation, Whitespace, String)), + ], + 'signed-by': [ + (r' -----END PGP PUBLIC KEY BLOCK-----\n', Text, '#pop'), + (r'.+\n', Text), + ], + } + + class SourcesListLexer(RegexLexer): """ Lexer that highlights debian sources.list files. @@ -278,25 +303,26 @@ class DebianControlLexer(RegexLexer): tokens = { 'root': [ (r'^(Description)', Keyword, 'description'), - (r'^(Maintainer|Uploaders)(:\s*)', bygroups(Keyword, Text), + (r'^(Maintainer|Uploaders|Changed-By)(:)(\s*)', + bygroups(Keyword, Punctuation, Whitespace), 'maintainer'), - (r'^((?:Build-|Pre-)?Depends(?:-Indep|-Arch)?)(:\s*)', - bygroups(Keyword, Text), 'depends'), - (r'^(Recommends|Suggests|Enhances)(:\s*)', bygroups(Keyword, Text), - 'depends'), - (r'^((?:Python-)?Version)(:\s*)(\S+)$', - bygroups(Keyword, Text, Number)), - (r'^((?:Installed-)?Size)(:\s*)(\S+)$', - bygroups(Keyword, Text, Number)), - (r'^(MD5Sum|SHA1|SHA256)(:\s*)(\S+)$', - bygroups(Keyword, Text, Number)), - (r'^([a-zA-Z\-0-9\.]*?)(:\s*)(.*?)$', - bygroups(Keyword, Whitespace, String)), + (r'^((?:Build-|Pre-)?Depends(?:-Indep|-Arch)?)(:)(\s*)', + bygroups(Keyword, Punctuation, Whitespace), 'package_list'), + (r'^(Recommends|Suggests|Enhances|Breaks|Replaces|Provides|Conflicts)(:)(\s*)', + bygroups(Keyword, Punctuation, Whitespace), 'package_list'), + (r'^((?:Python-)?Version)(:)(\s*)(\S+)$', + bygroups(Keyword, Punctuation, Whitespace, Number)), + (r'^((?:Installed-)?Size)(:)(\s*)(\S+)$', + bygroups(Keyword, Punctuation, Whitespace, Number)), + (r'^(MD5Sum|SHA1|SHA256)(:)(\s*)(\S+)$', + bygroups(Keyword, Punctuation, Whitespace, Number)), + (r'^([a-zA-Z\-0-9\.]*?)(:)(\s*)(.*?)$', + bygroups(Keyword, Punctuation, Whitespace, String)), ], 'maintainer': [ (r'<[^>]+>$', Generic.Strong, '#pop'), (r'<[^>]+>', Generic.Strong), - (r',\n?', Text), + (r',\n?', Whitespace), (r'[^,<]+$', Text, '#pop'), (r'[^,<]+', Text), ], @@ -307,19 +333,20 @@ class DebianControlLexer(RegexLexer): (r' .*\n', Text), default('#pop'), ], - 'depends': [ - (r'(\$)(\{)(\w+\s*:\s*\w+)(\})', - bygroups(Operator, Text, Name.Entity, Text)), - (r'\(', Text, 'depend_vers'), + 'package_list': [ + (r'(\$)(\{)(\w+)(\s*)(:)(\s*)(\w+)(\})', + bygroups(Operator, Punctuation, Name.Entity, Whitespace, + Punctuation, Whitespace, Text, Punctuation)), + (r'\(', Punctuation, 'package_list_vers'), (r'\|', Operator), - (r',\n', Text), - (r'\n', Text, '#pop'), + (r'\n\s', Whitespace), + (r'\n', Whitespace, '#pop'), (r'[,\s]', Text), (r'[+.a-zA-Z0-9-]+', Name.Function), (r'\[.*?\]', Name.Entity), ], - 'depend_vers': [ - (r'\)', Text, '#pop'), - (r'([><=]+)(\s*)([^)]+)', bygroups(Operator, Text, Number)), + 'package_list_vers': [ + (r'\)', Punctuation, '#pop'), + (r'([><=]+)(\s*)([^)]+)', bygroups(Operator, Whitespace, Number)), ] } diff --git a/libs/pygments/lexers/int_fiction.py b/libs/pygments/lexers/int_fiction.py index a7bc66756..b142c5449 100644 --- a/libs/pygments/lexers/int_fiction.py +++ b/libs/pygments/lexers/int_fiction.py @@ -4,7 +4,7 @@ Lexers for interactive fiction languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/iolang.py b/libs/pygments/lexers/iolang.py index 119ce6b21..0269384fa 100644 --- a/libs/pygments/lexers/iolang.py +++ b/libs/pygments/lexers/iolang.py @@ -4,7 +4,7 @@ Lexers for the Io language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/j.py b/libs/pygments/lexers/j.py index 959e8ca50..1eb418e1c 100644 --- a/libs/pygments/lexers/j.py +++ b/libs/pygments/lexers/j.py @@ -4,7 +4,7 @@ Lexer for the J programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/javascript.py b/libs/pygments/lexers/javascript.py index ea7bd10ca..d361b6e71 100644 --- a/libs/pygments/lexers/javascript.py +++ b/libs/pygments/lexers/javascript.py @@ -4,7 +4,7 @@ Lexers for JavaScript and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -119,6 +119,8 @@ class JavascriptLexer(RegexLexer): (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double), (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single), (r'`', String.Backtick, 'interp'), + # private identifier + (r'#[a-zA-Z_]\w*', Name), ], 'interp': [ (r'`', String.Backtick, '#pop'), @@ -168,6 +170,8 @@ class TypeScriptLexer(JavascriptLexer): # Match stuff like: Decorators (r'@' + JS_IDENT, Keyword.Declaration), inherit, + # private identifier + (r'#[a-zA-Z_]\w*', Name), ], } diff --git a/libs/pygments/lexers/jmespath.py b/libs/pygments/lexers/jmespath.py index e7bfc3e45..67374c28c 100644 --- a/libs/pygments/lexers/jmespath.py +++ b/libs/pygments/lexers/jmespath.py @@ -4,7 +4,7 @@ Lexers for the JMESPath language - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/jslt.py b/libs/pygments/lexers/jslt.py index 297c3c6b5..f2cc5df5f 100644 --- a/libs/pygments/lexers/jslt.py +++ b/libs/pygments/lexers/jslt.py @@ -4,7 +4,7 @@ Lexers for the JSLT language - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/json5.py b/libs/pygments/lexers/json5.py new file mode 100644 index 000000000..35d769c31 --- /dev/null +++ b/libs/pygments/lexers/json5.py @@ -0,0 +1,83 @@ +""" + pygments.lexers.json5 + ~~~~~~~~~~~~~~~~~~~~~ + + Lexer for Json5 file format. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import include, RegexLexer, words +from pygments.token import Comment, Keyword, Name, Number, Punctuation, \ + String, Whitespace + +__all__ = ['Json5Lexer'] + + +def string_rules(quote_mark): + return [ + (rf"[^{quote_mark}\\]+", String), + (r"\\.", String.Escape), + (r"\\", Punctuation), + (quote_mark, String, '#pop'), + ] + + +def quoted_field_name(quote_mark): + return [ + (rf'([^{quote_mark}\\]|\\.)*{quote_mark}', + Name.Variable, ('#pop', 'object_value')) + ] + + +class Json5Lexer(RegexLexer): + """Lexer for JSON5 data structures.""" + + name = 'JSON5' + aliases = ['json5'] + filenames = ['*.json5'] + url = "https://json5.org" + version_added = '2.19' + tokens = { + '_comments': [ + (r'(//|#).*\n', Comment.Single), + (r'/\*\*([^/]|/(?!\*))*\*/', String.Doc), + (r'/\*([^/]|/(?!\*))*\*/', Comment), + ], + 'root': [ + include('_comments'), + (r"'", String, 'singlestring'), + (r'"', String, 'doublestring'), + (r'[+-]?0[xX][0-9a-fA-F]+', Number.Hex), + (r'[+-.]?[0-9]+[.]?[0-9]?([eE][-]?[0-9]+)?', Number.Float), + (r'\{', Punctuation, 'object'), + (r'\[', Punctuation, 'array'), + (words(['false', 'Infinity', '+Infinity', '-Infinity', 'NaN', + 'null', 'true',], suffix=r'\b'), Keyword), + (r'\s+', Whitespace), + (r':', Punctuation), + ], + 'singlestring': string_rules("'"), + 'doublestring': string_rules('"'), + 'array': [ + (r',', Punctuation), + (r'\]', Punctuation, '#pop'), + include('root'), + ], + 'object': [ + (r'\s+', Whitespace), + (r'\}', Punctuation, '#pop'), + (r'\b([^:]+)', Name.Variable, 'object_value'), + (r'"', Name.Variable, 'double_field_name'), + (r"'", Name.Variable, 'single_field_name'), + include('_comments'), + ], + 'double_field_name': quoted_field_name('"'), + 'single_field_name': quoted_field_name("'"), + 'object_value': [ + (r',', Punctuation, '#pop'), + (r'\}', Punctuation, '#pop:2'), + include('root'), + ], + } diff --git a/libs/pygments/lexers/jsonnet.py b/libs/pygments/lexers/jsonnet.py index aeaf53dc8..f9aa5953f 100644 --- a/libs/pygments/lexers/jsonnet.py +++ b/libs/pygments/lexers/jsonnet.py @@ -4,7 +4,7 @@ Lexer for Jsonnet data templating language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/jsx.py b/libs/pygments/lexers/jsx.py index b2eece6f6..6124d8c00 100644 --- a/libs/pygments/lexers/jsx.py +++ b/libs/pygments/lexers/jsx.py @@ -2,20 +2,58 @@ pygments.lexers.jsx ~~~~~~~~~~~~~~~~~~~ - Lexers for JSX (React). + Lexers for JSX (React) and TSX (TypeScript flavor). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re from pygments.lexer import bygroups, default, include, inherit -from pygments.lexers.javascript import JavascriptLexer +from pygments.lexers.javascript import JavascriptLexer, TypeScriptLexer from pygments.token import Name, Operator, Punctuation, String, Text, \ Whitespace -__all__ = ['JsxLexer'] +__all__ = ['JsxLexer', 'TsxLexer'] + +_JSX_RULES = { + "jsx": [ + (r"</?>", Punctuation), # JSXFragment <>|</> + (r"(<)(\w+)(\.?)", bygroups(Punctuation, Name.Tag, Punctuation), "tag"), + ( + r"(</)(\w+)(>)", + bygroups(Punctuation, Name.Tag, Punctuation), + ), + ( + r"(</)(\w+)", + bygroups(Punctuation, Name.Tag), + "fragment", + ), # Same for React.Context + ], + "tag": [ + (r"\s+", Whitespace), + (r"([\w-]+)(\s*)(=)(\s*)", bygroups(Name.Attribute, Whitespace, Operator, Whitespace), "attr"), + (r"[{}]+", Punctuation), + (r"[\w\.]+", Name.Attribute), + (r"(/?)(\s*)(>)", bygroups(Punctuation, Text, Punctuation), "#pop"), + ], + "fragment": [ + (r"(.)(\w+)", bygroups(Punctuation, Name.Attribute)), + (r"(>)", bygroups(Punctuation), "#pop"), + ], + "attr": [ + (r"\{", Punctuation, "expression"), + (r'".*?"', String, "#pop"), + (r"'.*?'", String, "#pop"), + default("#pop"), + ], + "expression": [ + (r"\{", Punctuation, "#push"), + (r"\}", Punctuation, "#pop"), + include("root"), + ], +} class JsxLexer(JavascriptLexer): @@ -37,39 +75,26 @@ class JsxLexer(JavascriptLexer): include("jsx"), inherit, ], - "jsx": [ - (r"</?>", Punctuation), # JSXFragment <>|</> - (r"(<)(\w+)(\.?)", bygroups(Punctuation, Name.Tag, Punctuation), "tag"), - ( - r"(</)(\w+)(>)", - bygroups(Punctuation, Name.Tag, Punctuation), - ), - ( - r"(</)(\w+)", - bygroups(Punctuation, Name.Tag), - "fragment", - ), # Same for React.Context - ], - "tag": [ - (r"\s+", Whitespace), - (r"([\w-]+)(\s*)(=)(\s*)", bygroups(Name.Attribute, Whitespace, Operator, Whitespace), "attr"), - (r"[{}]+", Punctuation), - (r"[\w\.]+", Name.Attribute), - (r"(/?)(\s*)(>)", bygroups(Punctuation, Text, Punctuation), "#pop"), - ], - "fragment": [ - (r"(.)(\w+)", bygroups(Punctuation, Name.Attribute)), - (r"(>)", bygroups(Punctuation), "#pop"), - ], - "attr": [ - (r"\{", Punctuation, "expression"), - (r'".*?"', String, "#pop"), - (r"'.*?'", String, "#pop"), - default("#pop"), - ], - "expression": [ - (r"\{", Punctuation, "#push"), - (r"\}", Punctuation, "#pop"), - include("root"), + **_JSX_RULES} + + +class TsxLexer(TypeScriptLexer): + """For TypeScript with embedded JSX + """ + + name = "TSX" + aliases = ["tsx"] + filenames = ["*.tsx"] + mimetypes = ["text/typescript-tsx"] + url = "https://www.typescriptlang.org/docs/handbook/jsx.html" + version_added = '2.19' + + flags = re.MULTILINE | re.DOTALL + + # Use same tokens as `TypescriptLexer`, but with tags and attributes support + tokens = { + "root": [ + include("jsx"), + inherit, ], - } + **_JSX_RULES} diff --git a/libs/pygments/lexers/julia.py b/libs/pygments/lexers/julia.py index faacaa55c..77d8bafcd 100644 --- a/libs/pygments/lexers/julia.py +++ b/libs/pygments/lexers/julia.py @@ -4,7 +4,7 @@ Lexers for the Julia language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -251,6 +251,7 @@ class JuliaConsoleLexer(Lexer): aliases = ['jlcon', 'julia-repl'] url = 'https://julialang.org/' version_added = '1.6' + _example = "jlcon/console" def get_tokens_unprocessed(self, text): jllexer = JuliaLexer(**self.options) diff --git a/libs/pygments/lexers/jvm.py b/libs/pygments/lexers/jvm.py index d631c5c36..3ca257a95 100644 --- a/libs/pygments/lexers/jvm.py +++ b/libs/pygments/lexers/jvm.py @@ -4,7 +4,7 @@ Pygments lexers for JVM languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -50,7 +50,7 @@ class JavaLexer(RegexLexer): r'if|goto|instanceof|new|return|switch|this|throw|try|while)\b', Keyword), # method names - (r'((?:(?:[^\W\d]|\$)[\w.\[\]$<>]*\s+)+?)' # return arguments + (r'((?:(?:[^\W\d]|\$)[\w.\[\]$<>?]*\s+)+?)' # return arguments r'((?:[^\W\d]|\$)[\w$]*)' # method name r'(\s*)(\()', # signature start bygroups(using(this), Name.Function, Whitespace, Punctuation)), diff --git a/libs/pygments/lexers/kuin.py b/libs/pygments/lexers/kuin.py index 228a4b3c9..686a1c7ec 100644 --- a/libs/pygments/lexers/kuin.py +++ b/libs/pygments/lexers/kuin.py @@ -4,7 +4,7 @@ Lexers for the Kuin language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/kusto.py b/libs/pygments/lexers/kusto.py index 7b146861c..ce32d5eee 100644 --- a/libs/pygments/lexers/kusto.py +++ b/libs/pygments/lexers/kusto.py @@ -4,7 +4,7 @@ Lexers for Kusto Query Language (KQL). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ldap.py b/libs/pygments/lexers/ldap.py index 17d14b017..65473da67 100644 --- a/libs/pygments/lexers/ldap.py +++ b/libs/pygments/lexers/ldap.py @@ -4,7 +4,7 @@ Pygments lexers for LDAP. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/lean.py b/libs/pygments/lexers/lean.py index b44d2a042..76af11fe9 100644 --- a/libs/pygments/lexers/lean.py +++ b/libs/pygments/lexers/lean.py @@ -4,7 +4,7 @@ Lexers for the Lean theorem prover. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/lilypond.py b/libs/pygments/lexers/lilypond.py index d42906ccc..03c34ae59 100644 --- a/libs/pygments/lexers/lilypond.py +++ b/libs/pygments/lexers/lilypond.py @@ -4,7 +4,7 @@ Lexer for LilyPond. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/lisp.py b/libs/pygments/lexers/lisp.py index e6cc5875f..2c970d939 100644 --- a/libs/pygments/lexers/lisp.py +++ b/libs/pygments/lexers/lisp.py @@ -4,7 +4,7 @@ Lexers for Lispy languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/macaulay2.py b/libs/pygments/lexers/macaulay2.py index 6ea03ae23..77b841d83 100644 --- a/libs/pygments/lexers/macaulay2.py +++ b/libs/pygments/lexers/macaulay2.py @@ -4,7 +4,7 @@ Lexer for Macaulay2. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -13,9 +13,11 @@ __all__ = ['Macaulay2Lexer'] -# Auto-generated for Macaulay2-1.23. Do not modify this file manually. +# Auto-generated for Macaulay2-1.24.11. Do not modify this file manually. M2KEYWORDS = ( + "SPACE", + "TEST", "and", "break", "catch", @@ -37,10 +39,10 @@ "or", "return", "shield", - "SPACE", "step", "symbol", "then", + "threadLocal", "threadVariable", "throw", "time", @@ -53,52 +55,52 @@ ) M2DATATYPES = ( + "ANCHOR", "Adjacent", "AffineVariety", "Analyzer", - "ANCHOR", "AngleBarList", "Array", "AssociativeExpression", "AtomicInt", - "Bag", - "BasicList", - "BettiTally", - "BinaryOperation", "BLOCKQUOTE", "BODY", "BOLD", - "Boolean", "BR", "BUTTON", - "CacheFunction", - "CacheTable", + "Bag", + "BasicList", + "BettiTally", + "BinaryOperation", + "Boolean", "CC", "CDATA", + "CODE", + "COMMENT", + "CacheFunction", + "CacheTable", "ChainComplex", "ChainComplexMap", - "CODE", "CoherentSheaf", "Command", - "COMMENT", "CompiledFunction", "CompiledFunctionBody", "CompiledFunctionClosure", "ComplexField", "Constant", - "Database", "DD", + "DIV", + "DL", + "DT", + "Database", "Descent", "Describe", "Dictionary", "DirectSum", - "DIV", "Divide", - "DL", "DocumentTag", - "DT", - "Eliminate", "EM", + "Eliminate", "EngineRing", "Equation", "ExampleItem", @@ -117,7 +119,6 @@ "GradedModuleMap", "GroebnerBasis", "GroebnerBasisOptions", - "HashTable", "HEAD", "HEADER1", "HEADER2", @@ -125,20 +126,23 @@ "HEADER4", "HEADER5", "HEADER6", - "HeaderType", - "Holder", "HR", "HREF", "HTML", + "HashTable", + "HeaderType", + "Holder", "Hybrid", "Hypertext", "HypertextContainer", "HypertextParagraph", "HypertextVoid", - "Ideal", "IMG", - "ImmutableType", "INDENT", + "INPUT", + "ITALIC", + "Ideal", + "ImmutableType", "IndeterminateNumber", "IndexedVariable", "IndexedVariableTable", @@ -146,9 +150,7 @@ "InexactFieldFamily", "InexactNumber", "InfiniteNumber", - "INPUT", "IntermediateMarkUpType", - "ITALIC", "Iterator", "KBD", "Keyword", @@ -156,17 +158,17 @@ "LATER", "LI", "LINK", - "List", "LITERAL", + "List", "LocalDictionary", "LowerBound", + "MENU", + "META", "Manipulator", "MapExpression", "MarkUpType", "Matrix", "MatrixExpression", - "MENU", - "META", "MethodFunction", "MethodFunctionBinary", "MethodFunctionSingle", @@ -190,14 +192,14 @@ "Option", "OptionTable", "OrderedMonoid", - "Package", "PARA", + "PRE", + "Package", "Parenthesize", "Parser", "Partition", "PolynomialRing", "Power", - "PRE", "Product", "ProductOrder", "Program", @@ -205,8 +207,11 @@ "ProjectiveHilbertPolynomial", "ProjectiveVariety", "Pseudocode", + "PseudocodeClosure", "QQ", "QuotientRing", + "RR", + "RRi", "RealField", "Resolution", "Ring", @@ -214,10 +219,15 @@ "RingFamily", "RingMap", "RowExpression", - "RR", - "RRi", "SAMP", "SCRIPT", + "SMALL", + "SPAN", + "STRONG", + "STYLE", + "SUB", + "SUBSECTION", + "SUP", "ScriptedFunctor", "SelfInitializingType", "Sequence", @@ -225,39 +235,32 @@ "SheafExpression", "SheafMap", "SheafOfRings", - "SMALL", - "SPAN", "SparseMonomialVectorExpression", "SparseVectorExpression", "String", - "STRONG", - "STYLE", - "SUB", "Subscript", - "SUBSECTION", "Sum", "SumOfTwists", - "SUP", "Superscript", "Symbol", "SymbolBody", "TABLE", - "Table", - "Tally", - "Task", "TD", - "TensorProduct", - "TestInput", "TEX", "TH", - "Thing", - "Time", "TITLE", "TO", "TO2", "TOH", "TR", "TT", + "Table", + "Tally", + "Task", + "TensorProduct", + "TestInput", + "Thing", + "Time", "Type", "UL", "URL", @@ -269,11 +272,35 @@ "VirtualTally", "VisibleList", "WrapperType", - "ZeroExpression", - "ZZ" + "ZZ", + "ZeroExpression" ) M2FUNCTIONS = ( + "BesselJ", + "BesselY", + "Beta", + "Digamma", + "EXAMPLE", + "End", + "Fano", + "GCstats", + "GF", + "Gamma", + "Grassmannian", + "Hom", + "LLL", + "LUdecomposition", + "M2CODE", + "NNParser", + "Proj", + "QQParser", + "QRDecomposition", + "SVD", + "SYNOPSIS", + "Schubert", + "Spec", + "ZZParser", "about", "abs", "accumulate", @@ -285,7 +312,6 @@ "addDependencyTask", "addEndFunction", "addHook", - "addStartFunction", "addStartTask", "adjoint", "agm", @@ -316,10 +342,10 @@ "assert", "associatedGradedRing", "associatedPrimes", + "atEndOfFile", "atan", "atan2", "atanh", - "atEndOfFile", "autoload", "baseFilename", "baseName", @@ -327,9 +353,6 @@ "basis", "beginDocumentation", "benchmark", - "BesselJ", - "BesselY", - "Beta", "betti", "between", "binomial", @@ -342,9 +365,10 @@ "centerString", "chainComplex", "changeBase", + "changeDirectory", "char", - "characters", "charAnalyzer", + "characters", "check", "checkDegrees", "chi", @@ -362,15 +386,15 @@ "cokernel", "collectGarbage", "columnAdd", - "columnate", "columnMult", "columnPermute", "columnRankProfile", "columnSwap", + "columnate", "combine", "commandInterpreter", - "commonest", "commonRing", + "commonest", "comodule", "compareExchange", "complement", @@ -431,7 +455,6 @@ "dictionary", "diff", "difference", - "Digamma", "dim", "directSum", "disassemble", @@ -451,7 +474,6 @@ "eint", "elements", "eliminate", - "End", "endPackage", "entries", "erase", @@ -461,7 +483,6 @@ "euler", "eulers", "even", - "EXAMPLE", "examples", "exchange", "exec", @@ -476,7 +497,6 @@ "extend", "exteriorPower", "factor", - "Fano", "fileExecutable", "fileExists", "fileLength", @@ -509,14 +529,12 @@ "fromDual", "functionBody", "futureParser", - "Gamma", "gb", "gbRemove", "gbSnapshot", "gcd", "gcdCoefficients", "gcdLLL", - "GCstats", "genera", "generateAssertions", "generator", @@ -527,16 +545,16 @@ "gens", "genus", "get", - "getc", "getChangeMatrix", - "getenv", "getGlobalSymbol", + "getIOThreadMode", "getNetFile", "getNonUnit", "getPrimeWithRootOfUnity", "getSymbol", "getWWW", - "GF", + "getc", + "getenv", "globalAssign", "globalAssignFunction", "globalAssignment", @@ -546,11 +564,11 @@ "gramm", "graphIdeal", "graphRing", - "Grassmannian", "groebnerBasis", "groupID", "hash", "hashTable", + "headlines", "heft", "height", "hermite", @@ -558,7 +576,6 @@ "hilbertPolynomial", "hilbertSeries", "hold", - "Hom", "homogenize", "homology", "homomorphism", @@ -586,11 +603,11 @@ "input", "insert", "installAssignmentMethod", - "installedPackages", "installHilbertFunction", "installMethod", "installMinprimes", "installPackage", + "installedPackages", "instance", "instances", "integralClosure", @@ -607,15 +624,14 @@ "inverseSystem", "irreducibleCharacteristicSeries", "irreducibleDecomposition", - "isAffineRing", "isANumber", + "isAffineRing", "isBorel", - "isc", "isCanceled", "isCommutative", "isConstant", - "isDirectory", "isDirectSum", + "isDirectory", "isEmpty", "isField", "isFinite", @@ -629,10 +645,10 @@ "isInputFile", "isIsomorphic", "isIsomorphism", + "isLLL", "isLiftable", "isLinearType", "isListener", - "isLLL", "isMember", "isModule", "isMonomialIdeal", @@ -655,6 +671,7 @@ "isRegularFile", "isRing", "isSkewCommutative", + "isSmooth", "isSorted", "isSquareFree", "isStandardGradedPolynomialRing", @@ -665,8 +682,10 @@ "isSurjective", "isTable", "isUnit", + "isVeryAmple", "isWellDefined", "isWeylAlgebra", + "isc", "iterator", "jacobian", "jacobianDual", @@ -695,7 +714,6 @@ "linkFile", "listForm", "listSymbols", - "LLL", "lngamma", "load", "loadPackage", @@ -706,8 +724,6 @@ "log1p", "lookup", "lookupCount", - "LUdecomposition", - "M2CODE", "makeDirectory", "makeDocumentTag", "makePackageIndex", @@ -730,6 +746,8 @@ "methods", "midpoint", "min", + "minPosition", + "minPres", "mingens", "mingle", "minimalBetti", @@ -739,8 +757,6 @@ "minimize", "minimizeFilename", "minors", - "minPosition", - "minPres", "minprimes", "minus", "mkdir", @@ -750,8 +766,8 @@ "monoid", "monomialCurveIdeal", "monomialIdeal", - "monomials", "monomialSubideal", + "monomials", "moveFile", "multidegree", "multidoc", @@ -771,24 +787,23 @@ "newPackage", "newRing", "next", - "nextkey", "nextPrime", - "NNParser", + "nextkey", "nonspaceAnalyzer", "norm", "normalCone", "notImplemented", - "nullhomotopy", "nullParser", "nullSpace", + "nullhomotopy", + "numColumns", + "numRows", "number", "numcols", - "numColumns", "numerator", "numeric", "numericInterval", "numgens", - "numRows", "numrows", "odd", "oeis", @@ -802,9 +817,9 @@ "openListener", "openOut", "openOutAppend", + "optP", "optionalSignParser", "options", - "optP", "orP", "override", "pack", @@ -813,6 +828,7 @@ "pad", "pager", "pairs", + "parallelApply", "parent", "part", "partition", @@ -841,23 +857,20 @@ "primaryComponent", "primaryDecomposition", "print", - "printerr", "printString", + "printerr", "processID", "product", "profile", - "Proj", "projectiveHilbertPolynomial", "promote", "protect", "prune", - "pseudocode", "pseudoRemainder", + "pseudocode", "pullback", "pushForward", "pushout", - "QQParser", - "QRDecomposition", "quotient", "quotientRemainder", "radical", @@ -869,21 +882,21 @@ "rays", "read", "readDirectory", - "readlink", "readPackage", + "readlink", "realPart", "realpath", "recursionDepth", - "reducedRowEchelonForm", "reduceHilbert", + "reducedRowEchelonForm", "reductionNumber", "reesAlgebra", "reesAlgebraIdeal", "reesIdeal", + "regSeqInIdeal", "regex", "regexQuote", "registerFinalizer", - "regSeqInIdeal", "regularity", "regularizedBeta", "regularizedGamma", @@ -926,13 +939,15 @@ "scanValues", "schedule", "schreyerOrder", - "Schubert", "searchPath", "sec", "sech", "seeParsing", "select", "selectInSubring", + "selectKeys", + "selectPairs", + "selectValues", "selectVariables", "separate", "separateRegexp", @@ -947,6 +962,8 @@ "setRandomSeed", "setup", "setupEmacs", + "setupLift", + "setupPromote", "sheaf", "sheafHom", "sheafMap", @@ -967,7 +984,6 @@ "sortColumns", "source", "span", - "Spec", "specialFiber", "specialFiberIdeal", "splice", @@ -993,7 +1009,6 @@ "sum", "super", "support", - "SVD", "switch", "sylvesterMatrix", "symbolBody", @@ -1004,7 +1019,6 @@ "symmetricKernel", "symmetricPower", "synonym", - "SYNOPSIS", "syz", "syzygyScheme", "table", @@ -1021,7 +1035,6 @@ "tensorAssociativity", "terminalParser", "terms", - "TEST", "testHunekeQuestion", "tests", "tex", @@ -1035,14 +1048,14 @@ "toField", "toList", "toLower", - "top", - "topCoefficients", - "topComponents", "toRR", "toRRi", "toSequence", "toString", "toUpper", + "top", + "topCoefficients", + "topComponents", "trace", "transpose", "trim", @@ -1056,6 +1069,7 @@ "uniform", "uninstallAllPackages", "uninstallPackage", + "union", "unique", "uniquePermutations", "unsequence", @@ -1082,12 +1096,12 @@ "wrap", "youngest", "zero", - "zeta", - "ZZParser" + "zeta" ) M2CONSTANTS = ( "A1BrouwerDegrees", + "AbstractSimplicialComplexes", "AbstractToricVarieties", "Acknowledgement", "AdditionalPaths", @@ -1153,6 +1167,7 @@ "CharacteristicClasses", "CheckDocumentation", "Chordal", + "cite", "Classic", "clearAll", "clearOutput", @@ -1397,6 +1412,7 @@ "LongPolynomial", "M0nbar", "Macaulay2Doc", + "Maintainer", "MakeDocumentation", "MakeHTML", "MakeInfo", @@ -1432,6 +1448,9 @@ "MonomialOrder", "Monomials", "MonomialSize", + "Msolve", + "MultigradedBGG", + "MultigradedImplicitization", "MultiGradedRationalMap", "MultiplicitySequence", "MultiplierIdeals", @@ -1465,6 +1484,7 @@ "NumericalImplicitization", "NumericalLinearAlgebra", "NumericalSchubertCalculus", + "NumericalSemigroups", "NumericSolutions", "numTBBThreads", "OIGroebnerBases", @@ -1497,6 +1517,7 @@ "path", "PencilsOfQuadrics", "Permanents", + "Permutations", "PHCpack", "PhylogeneticTrees", "pi", @@ -1606,6 +1627,8 @@ "SchurComplexes", "SchurFunctors", "SchurRings", + "SchurVeronese", + "SCMAlgebras", "scriptCommandLine", "SCSCP", "SectionRing", @@ -1682,6 +1705,7 @@ "Text", "ThinSincereQuivers", "ThreadedGB", + "Threads", "Threshold", "Topcom", "topLevelMode", @@ -1701,6 +1725,7 @@ "Trim", "Triplets", "Tropical", + "TropicalToric", "true", "Truncate", "Truncations", @@ -1737,6 +1762,7 @@ "viewHelp", "VirtualResolutions", "Visualize", + "VNumber", "WebApp", "Weights", "WeylAlgebra", diff --git a/libs/pygments/lexers/make.py b/libs/pygments/lexers/make.py index 463e46e75..3940a0090 100644 --- a/libs/pygments/lexers/make.py +++ b/libs/pygments/lexers/make.py @@ -4,7 +4,7 @@ Lexers for Makefiles and similar. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/maple.py b/libs/pygments/lexers/maple.py new file mode 100644 index 000000000..c744e7e1a --- /dev/null +++ b/libs/pygments/lexers/maple.py @@ -0,0 +1,291 @@ +""" + pygments.lexers.maple + ~~~~~~~~~~~~~~~~~~~~~ + + Lexers for Maple. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import words, bygroups, ExtendedRegexLexer +from pygments.token import Comment, Name, String, Whitespace, Operator, Punctuation, Number, Keyword + +__all__ = ['MapleLexer'] + + +class MapleLexer(ExtendedRegexLexer): + """ + Lexer for Maple. + """ + + name = 'Maple' + aliases = ['maple'] + filenames = ['*.mpl', '*.mi', '*.mm'] + mimetypes = ['text/x-maple'] + url = 'https://www.maplesoft.com/products/Maple/' + version_added = '2.19' + + keywords = ('and', + 'assuming', + 'break', + 'by', + 'catch', + 'description', + 'do', + 'done', + 'elif', + 'else', + 'end', + 'error', + 'export', + 'fi', + 'finally', + 'for', + 'from', + 'global', + 'if', + 'implies', + 'in', + 'intersect', + 'local', + 'minus', + 'mod', + 'module', + 'next', + 'not', + 'od', + 'option', + 'options', + 'or', + 'proc', + 'quit', + 'read', + 'return', + 'save', + 'stop', + 'subset', + 'then', + 'to', + 'try', + 'union', + 'use', + 'uses', + 'while', + 'xor') + + builtins = ('abs', + 'add', + 'addressof', + 'anames', + 'and', + 'andmap', + 'andseq', + 'appendto', + 'Array', + 'array', + 'ArrayOptions', + 'assemble', + 'ASSERT', + 'assign', + 'assigned', + 'attributes', + 'cat', + 'ceil', + 'coeff', + 'coeffs', + 'conjugate', + 'convert', + 'CopySign', + 'DEBUG', + 'debugopts', + 'Default0', + 'DefaultOverflow', + 'DefaultUnderflow', + 'degree', + 'denom', + 'diff', + 'disassemble', + 'divide', + 'done', + 'entries', + 'EqualEntries', + 'eval', + 'evalb', + 'evalf', + 'evalhf', + 'evalindets', + 'evaln', + 'expand', + 'exports', + 'factorial', + 'floor', + 'frac', + 'frem', + 'FromInert', + 'frontend', + 'gc', + 'genpoly', + 'has', + 'hastype', + 'hfarray', + 'icontent', + 'igcd', + 'ilcm', + 'ilog10', + 'Im', + 'implies', + 'indets', + 'indices', + 'intersect', + 'iolib', + 'iquo', + 'irem', + 'iroot', + 'iroot', + 'isqrt', + 'kernelopts', + 'lcoeff', + 'ldegree', + 'length', + 'lexorder', + 'lhs', + 'lowerbound', + 'lprint', + 'macro', + 'map', + 'max', + 'maxnorm', + 'member', + 'membertype', + 'min', + 'minus', + 'mod', + 'modp', + 'modp1', + 'modp2', + 'mods', + 'mul', + 'NextAfter', + 'nops', + 'normal', + 'not', + 'numboccur', + 'numelems', + 'numer', + 'NumericClass', + 'NumericEvent', + 'NumericEventHandler', + 'NumericStatus', + 'op', + 'or', + 'order', + 'OrderedNE', + 'ormap', + 'orseq', + 'parse', + 'piecewise', + 'pointto', + 'print', + 'quit', + 'Re', + 'readlib', + 'Record', + 'remove', + 'rhs', + 'round', + 'rtable', + 'rtable_elems', + 'rtable_eval', + 'rtable_indfns', + 'rtable_num_elems', + 'rtable_options', + 'rtable_redim', + 'rtable_scanblock', + 'rtable_set_indfn', + 'rtable_split_unit', + 'savelib', + 'Scale10', + 'Scale2', + 'SDMPolynom', + 'searchtext', + 'SearchText', + 'select', + 'selectremove', + 'seq', + 'series', + 'setattribute', + 'SFloatExponent', + 'SFloatMantissa', + 'sign', + 'sort', + 'ssystem', + 'stop', + 'String', + 'subs', + 'subset', + 'subsindets', + 'subsop', + 'substring', + 'system', + 'table', + 'taylor', + 'tcoeff', + 'time', + 'timelimit', + 'ToInert', + 'traperror', + 'trunc', + 'type', + 'typematch', + 'unames', + 'unassign', + 'union', + 'Unordered', + 'upperbound', + 'userinfo', + 'writeto', + 'xor', + 'xormap', + 'xorseq') + + def delayed_callback(self, match, ctx): + yield match.start(1), Punctuation, match.group(1) # quote + + ctx.pos = match.start(2) + orig_end = ctx.end + ctx.end = match.end(2) + + yield from self.get_tokens_unprocessed(context=ctx) + yield match.end(2), Punctuation, match.group(1) # quote + + ctx.pos = match.end() + ctx.end = orig_end + + tokens = { + 'root': [ + (r'#.*\n', Comment.Single), + (r'\(\*', Comment.Multiline, 'comment'), + (r'"(\\.|.|\s)*?"', String), + (r"('+)((.|\n)*?)\1", delayed_callback), + (r'`(\\`|.)*?`', Name), + (words(keywords, prefix=r'\b', suffix=r'\b'), Keyword), + (words(builtins, prefix=r'\b', suffix=r'\b'), Name.Builtin), + (r'[a-zA-Z_][a-zA-Z0-9_]*', Name), + (r'(:=|\*\*|@@|<=|>=|<>|->|::|\.\.|&\+|[\+\-\*\.\^\$/@&,:=<>%~])', Operator), + (r'[;^!@$\(\)\[\]{}|_\\#?]+', Punctuation), + (r'(\d+)(\.\.)', bygroups(Number.Integer, Punctuation)), + (r'(\d*\.\d+|\d+\.\d*)([eE][+-]?\d+)?', Number.Float), + (r'\d+', Number.Integer), + (r'\s+', Whitespace), + ], + 'comment': [ + (r'.*\(\*', Comment.Multiline, '#push'), + (r'.*\*\)', Comment.Multiline, '#pop'), + (r'.*\n', Comment.Multiline), + ] + } + + def analyse_text(text): + if ':=' in text: + return 0.1 \ No newline at end of file diff --git a/libs/pygments/lexers/markup.py b/libs/pygments/lexers/markup.py index 5d5ff2c9f..acc270b15 100644 --- a/libs/pygments/lexers/markup.py +++ b/libs/pygments/lexers/markup.py @@ -4,7 +4,7 @@ Lexers for non-HTML markup languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/math.py b/libs/pygments/lexers/math.py index 66fd898ba..b225ffcf9 100644 --- a/libs/pygments/lexers/math.py +++ b/libs/pygments/lexers/math.py @@ -4,7 +4,7 @@ Just export lexers that were contained in this module. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/matlab.py b/libs/pygments/lexers/matlab.py index 7005a3f28..8eeffc9d2 100644 --- a/libs/pygments/lexers/matlab.py +++ b/libs/pygments/lexers/matlab.py @@ -4,7 +4,7 @@ Lexers for Matlab and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -31,7 +31,7 @@ class MatlabLexer(RegexLexer): url = 'https://www.mathworks.com/products/matlab.html' version_added = '0.10' - _operators = r'-|==|~=|<=|>=|<|>|&&|&|~|\|\|?|\.\*|\*|\+|\.\^|\.\\|\./|/|\\' + _operators = r'-|==|~=|<=|>=|<|>|&&|&|~|\|\|?|\.\*|\*|\+|\.\^|\^|\.\\|\./|/|\\' tokens = { 'expressions': [ @@ -2747,6 +2747,7 @@ class MatlabSessionLexer(Lexer): aliases = ['matlabsession'] url = 'https://www.mathworks.com/products/matlab.html' version_added = '0.10' + _example = "matlabsession/matlabsession_sample.txt" def get_tokens_unprocessed(self, text): mlexer = MatlabLexer(**self.options) @@ -3174,7 +3175,7 @@ class OctaveLexer(RegexLexer): # operators in Octave but not Matlab requiring escape for re: (r'\*=|\+=|\^=|\/=|\\=|\*\*|\+\+|\.\*\*', Operator), # operators requiring escape for re: - (r'\.\*|\*|\+|\.\^|\.\\|\.\/|\/|\\', Operator), + (r'\.\*|\*|\+|\.\^|\^|\.\\|\.\/|\/|\\', Operator), # punctuation: @@ -3259,7 +3260,7 @@ class ScilabLexer(RegexLexer): # operators: (r'-|==|~=|<|>|<=|>=|&&|&|~|\|\|?', Operator), # operators requiring escape for re: - (r'\.\*|\*|\+|\.\^|\.\\|\.\/|\/|\\', Operator), + (r'\.\*|\*|\+|\.\^|\^|\.\\|\.\/|\/|\\', Operator), # punctuation: (r'[\[\](){}@.,=:;]+', Punctuation), diff --git a/libs/pygments/lexers/maxima.py b/libs/pygments/lexers/maxima.py index 305b7552f..a98308837 100644 --- a/libs/pygments/lexers/maxima.py +++ b/libs/pygments/lexers/maxima.py @@ -6,7 +6,7 @@ Derived from pygments/lexers/algebra.py. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/meson.py b/libs/pygments/lexers/meson.py index 8127b1691..6f2c6da37 100644 --- a/libs/pygments/lexers/meson.py +++ b/libs/pygments/lexers/meson.py @@ -4,7 +4,7 @@ Pygments lexer for the Meson build system - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/mime.py b/libs/pygments/lexers/mime.py index 4b309dd00..45f27f428 100644 --- a/libs/pygments/lexers/mime.py +++ b/libs/pygments/lexers/mime.py @@ -4,7 +4,7 @@ Lexer for Multipurpose Internet Mail Extensions (MIME) data. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/minecraft.py b/libs/pygments/lexers/minecraft.py index 99de0d5be..fe5e9f87c 100644 --- a/libs/pygments/lexers/minecraft.py +++ b/libs/pygments/lexers/minecraft.py @@ -15,7 +15,7 @@ official: https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/ community example: https://www.mcbe-dev.net/addons/data-driven/manifest.html - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/mips.py b/libs/pygments/lexers/mips.py index 8f249e18a..531f1b876 100644 --- a/libs/pygments/lexers/mips.py +++ b/libs/pygments/lexers/mips.py @@ -4,7 +4,7 @@ Lexers for MIPS assembly. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ml.py b/libs/pygments/lexers/ml.py index ff50c6f0c..48a08da1c 100644 --- a/libs/pygments/lexers/ml.py +++ b/libs/pygments/lexers/ml.py @@ -4,7 +4,7 @@ Lexers for ML family languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/modeling.py b/libs/pygments/lexers/modeling.py index b5393e748..d681e7f3b 100644 --- a/libs/pygments/lexers/modeling.py +++ b/libs/pygments/lexers/modeling.py @@ -4,7 +4,7 @@ Lexers for modeling languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/modula2.py b/libs/pygments/lexers/modula2.py index 8f5a72a35..713f4722f 100644 --- a/libs/pygments/lexers/modula2.py +++ b/libs/pygments/lexers/modula2.py @@ -4,7 +4,7 @@ Multi-Dialect Lexer for Modula-2. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/mojo.py b/libs/pygments/lexers/mojo.py index 0191dce0a..4df18c4f9 100644 --- a/libs/pygments/lexers/mojo.py +++ b/libs/pygments/lexers/mojo.py @@ -4,7 +4,7 @@ Lexers for Mojo and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -699,6 +699,9 @@ def fstring_rules(ttype): } def analyse_text(text): - return ( - shebang_matches(text, r"mojo?") or "import " in text[:1000] - ) # TODO supported? + # TODO supported? + if shebang_matches(text, r"mojo?"): + return 1.0 + if "import " in text[:1000]: + return 0.9 + return 0 diff --git a/libs/pygments/lexers/monte.py b/libs/pygments/lexers/monte.py index 74a2d036c..c01d2dc6c 100644 --- a/libs/pygments/lexers/monte.py +++ b/libs/pygments/lexers/monte.py @@ -4,7 +4,7 @@ Lexer for the Monte programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/mosel.py b/libs/pygments/lexers/mosel.py index 0032c8f59..426c9a145 100644 --- a/libs/pygments/lexers/mosel.py +++ b/libs/pygments/lexers/mosel.py @@ -5,7 +5,7 @@ Lexers for the mosel language. http://www.fico.com/en/products/fico-xpress-optimization - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ncl.py b/libs/pygments/lexers/ncl.py index 499ef9411..d2f476087 100644 --- a/libs/pygments/lexers/ncl.py +++ b/libs/pygments/lexers/ncl.py @@ -4,7 +4,7 @@ Lexers for NCAR Command Language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/nimrod.py b/libs/pygments/lexers/nimrod.py index b8be9797b..365a8dcca 100644 --- a/libs/pygments/lexers/nimrod.py +++ b/libs/pygments/lexers/nimrod.py @@ -4,7 +4,7 @@ Lexer for the Nim language (formerly known as Nimrod). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/nit.py b/libs/pygments/lexers/nit.py index 51b0a2147..2d2122c1f 100644 --- a/libs/pygments/lexers/nit.py +++ b/libs/pygments/lexers/nit.py @@ -4,7 +4,7 @@ Lexer for the Nit language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/nix.py b/libs/pygments/lexers/nix.py index f763835b5..3fa88c65a 100644 --- a/libs/pygments/lexers/nix.py +++ b/libs/pygments/lexers/nix.py @@ -4,7 +4,7 @@ Lexers for the NixOS Nix language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/numbair.py b/libs/pygments/lexers/numbair.py new file mode 100644 index 000000000..435863e13 --- /dev/null +++ b/libs/pygments/lexers/numbair.py @@ -0,0 +1,63 @@ +""" + pygments.lexers.numbair + ~~~~~~~~~~~~~~~~~~~~~~~ + + Lexer for other Numba Intermediate Representation. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, include, bygroups, words +from pygments.token import Whitespace, Name, String, Punctuation, Keyword, \ + Operator, Number + +__all__ = ["NumbaIRLexer"] + +class NumbaIRLexer(RegexLexer): + """ + Lexer for Numba IR + """ + name = 'Numba_IR' + url = "https://numba.readthedocs.io/en/stable/developer/architecture.html#stage-2-generate-the-numba-ir" + aliases = ['numba_ir', 'numbair'] + filenames = ['*.numba_ir'] + mimetypes = ['text/x-numba_ir', 'text/x-numbair'] + version_added = '2.19' + + identifier = r'\$[a-zA-Z0-9._]+' + fun_or_var = r'([a-zA-Z_]+[a-zA-Z0-9]*)' + + tokens = { + 'root' : [ + (r'(label)(\ [0-9]+)(:)$', + bygroups(Keyword, Name.Label, Punctuation)), + + (r'=', Operator), + include('whitespace'), + include('keyword'), + + (identifier, Name.Variable), + (fun_or_var + r'(\()', + bygroups(Name.Function, Punctuation)), + (fun_or_var + r'(\=)', + bygroups(Name.Attribute, Punctuation)), + (fun_or_var, Name.Constant), + (r'[0-9]+', Number), + + # <built-in function some> + (r'<[^>\n]*>', String), + + (r'[=<>{}\[\]()*.,!\':]|x\b', Punctuation) + ], + + 'keyword':[ + (words(( + 'del', 'jump', 'call', 'branch', + ), suffix=' '), Keyword), + ], + + 'whitespace': [ + (r'(\n|\s)+', Whitespace), + ], + } diff --git a/libs/pygments/lexers/oberon.py b/libs/pygments/lexers/oberon.py index 8edf34b8e..61f3c2d28 100644 --- a/libs/pygments/lexers/oberon.py +++ b/libs/pygments/lexers/oberon.py @@ -4,7 +4,7 @@ Lexers for Oberon family languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/objective.py b/libs/pygments/lexers/objective.py index a5ee98d2c..899c2c44c 100644 --- a/libs/pygments/lexers/objective.py +++ b/libs/pygments/lexers/objective.py @@ -4,7 +4,7 @@ Lexers for Objective-C family languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -13,7 +13,7 @@ from pygments.lexer import RegexLexer, include, bygroups, using, this, words, \ inherit, default from pygments.token import Text, Keyword, Name, String, Operator, \ - Number, Punctuation, Literal, Comment + Number, Punctuation, Literal, Comment, Whitespace from pygments.lexers.c_cpp import CLexer, CppLexer @@ -296,7 +296,7 @@ class SwiftLexer(RegexLexer): 'root': [ # Whitespace and Comments (r'\n', Text), - (r'\s+', Text), + (r'\s+', Whitespace), (r'//', Comment.Single, 'comment-single'), (r'/\*', Comment.Multiline, 'comment-multi'), (r'#(if|elseif|else|endif|available)\b', Comment.Preproc, 'preproc'), @@ -437,11 +437,11 @@ class SwiftLexer(RegexLexer): r'|#(?:file|line|column|function))\b', Keyword.Constant), (r'import\b', Keyword.Declaration, 'module'), (r'(class|enum|extension|struct|protocol)(\s+)([a-zA-Z_]\w*)', - bygroups(Keyword.Declaration, Text, Name.Class)), + bygroups(Keyword.Declaration, Whitespace, Name.Class)), (r'(func)(\s+)([a-zA-Z_]\w*)', - bygroups(Keyword.Declaration, Text, Name.Function)), + bygroups(Keyword.Declaration, Whitespace, Name.Function)), (r'(var|let)(\s+)([a-zA-Z_]\w*)', bygroups(Keyword.Declaration, - Text, Name.Variable)), + Whitespace, Name.Variable)), (words(( 'actor', 'associatedtype', 'class', 'deinit', 'enum', 'extension', 'func', 'import', 'init', 'internal', 'let', 'operator', 'private', 'protocol', 'public', @@ -455,24 +455,24 @@ class SwiftLexer(RegexLexer): # Nested 'comment-single': [ - (r'\n', Text, '#pop'), + (r'\n', Whitespace, '#pop'), include('comment'), - (r'[^\n]', Comment.Single) + (r'[^\n]+', Comment.Single) ], 'comment-multi': [ include('comment'), - (r'[^*/]', Comment.Multiline), + (r'[^*/]+', Comment.Multiline), (r'/\*', Comment.Multiline, '#push'), (r'\*/', Comment.Multiline, '#pop'), - (r'[*/]', Comment.Multiline) + (r'[*/]+', Comment.Multiline) ], 'module': [ - (r'\n', Text, '#pop'), + (r'\n', Whitespace, '#pop'), (r'[a-zA-Z_]\w*', Name.Class), include('root') ], 'preproc': [ - (r'\n', Text, '#pop'), + (r'\n', Whitespace, '#pop'), include('keywords'), (r'[A-Za-z]\w*', Comment.Preproc), include('root') diff --git a/libs/pygments/lexers/ooc.py b/libs/pygments/lexers/ooc.py index 881a57aff..8a990801a 100644 --- a/libs/pygments/lexers/ooc.py +++ b/libs/pygments/lexers/ooc.py @@ -4,7 +4,7 @@ Lexers for the Ooc language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -20,7 +20,7 @@ class OocLexer(RegexLexer): For Ooc source code """ name = 'Ooc' - url = 'http://ooc-lang.org/' + url = 'https://ooc-lang.github.io/' aliases = ['ooc'] filenames = ['*.ooc'] mimetypes = ['text/x-ooc'] @@ -42,7 +42,7 @@ class OocLexer(RegexLexer): (r'(func)((?:[ \t]|\\\n)+)(~[a-z_]\w*)', bygroups(Keyword, Text, Name.Function)), (r'\bfunc\b', Keyword), - # Note: %= and ^= not listed on http://ooc-lang.org/syntax + # Note: %= not listed on https://ooc-lang.github.io/docs/lang/operators/ (r'//.*', Comment), (r'(?s)/\*.*?\*/', Comment.Multiline), (r'(==?|\+=?|-[=>]?|\*=?|/=?|:=|!=?|%=?|\?|>{1,3}=?|<{1,3}=?|\.\.|' diff --git a/libs/pygments/lexers/openscad.py b/libs/pygments/lexers/openscad.py index 97fb92a03..b06de227c 100644 --- a/libs/pygments/lexers/openscad.py +++ b/libs/pygments/lexers/openscad.py @@ -4,7 +4,7 @@ Lexers for the OpenSCAD languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/other.py b/libs/pygments/lexers/other.py index 838104c50..2b7dfb4ab 100644 --- a/libs/pygments/lexers/other.py +++ b/libs/pygments/lexers/other.py @@ -4,7 +4,7 @@ Just export lexer classes previously contained in this module. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/parasail.py b/libs/pygments/lexers/parasail.py index c525ff0b7..150d6a9c4 100644 --- a/libs/pygments/lexers/parasail.py +++ b/libs/pygments/lexers/parasail.py @@ -4,7 +4,7 @@ Lexer for ParaSail. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/parsers.py b/libs/pygments/lexers/parsers.py index 2e0ae0cca..7a4ed9d1d 100644 --- a/libs/pygments/lexers/parsers.py +++ b/libs/pygments/lexers/parsers.py @@ -4,7 +4,7 @@ Lexers for parser generators. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/pascal.py b/libs/pygments/lexers/pascal.py index bb5e1e75e..5f40dcc86 100644 --- a/libs/pygments/lexers/pascal.py +++ b/libs/pygments/lexers/pascal.py @@ -4,7 +4,7 @@ Lexers for Pascal family languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/pawn.py b/libs/pygments/lexers/pawn.py index 484e8dcb9..99d9c963d 100644 --- a/libs/pygments/lexers/pawn.py +++ b/libs/pygments/lexers/pawn.py @@ -4,7 +4,7 @@ Lexers for the Pawn languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/pddl.py b/libs/pygments/lexers/pddl.py new file mode 100644 index 000000000..77aa75362 --- /dev/null +++ b/libs/pygments/lexers/pddl.py @@ -0,0 +1,82 @@ +""" + pygments.lexers.pddl + ~~~~~~~~~~~~~~~~~~~~ + + Lexer for the Planning Domain Definition Language. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + + +from pygments.lexer import RegexLexer, words, include +from pygments.token import Punctuation, Keyword, Whitespace, Name, Comment, \ + Operator, Number + + +__all__ = ['PddlLexer'] + + +class PddlLexer(RegexLexer): + """ + A PDDL lexer. + + It should support up to PDDL 3.1. + """ + + name = 'PDDL' + aliases = ['pddl'] + filenames = ['*.pddl'] + # there doesn't really seem to be a PDDL homepage. + url = 'https://en.wikipedia.org/wiki/Planning_Domain_Definition_Language' + version_added = '2.19' + + tokens = { + 'root': [ + (r'\s+', Whitespace), + (r';.*$', Comment.Singleline), + include('keywords'), + include('builtins'), + (r'[()]', Punctuation), + (r'[=/*+><-]', Operator), + (r'[a-zA-Z][a-zA-Z0-9_-]*', Name), + (r'\?[a-zA-Z][a-zA-Z0-9_-]*', Name.Variable), + (r'[0-9]+\.[0-9]+', Number.Float), + (r'[0-9]+', Number.Integer), + ], + 'keywords': [ + (words(( + ':requirements', ':types', ':constants', + ':predicates', ':functions', ':action', ':agent', + ':parameters', ':precondition', ':effect', + ':durative-action', ':duration', ':condition', + ':derived', ':domain', ':objects', ':init', + ':goal', ':metric', ':length', ':serial', ':parallel', + # the following are requirements + ':strips', ':typing', ':negative-preconditions', + ':disjunctive-preconditions', ':equality', + ':existential-preconditions', ':universal-preconditions', + ':conditional-effects', ':fluents', ':numeric-fluents', + ':object-fluents', ':adl', ':durative-actions', + ':continuous-effects', ':derived-predicates', + ':time-intial-literals', ':preferences', + ':constraints', ':action-costs', ':multi-agent', + ':unfactored-privacy', ':factored-privacy', + ':non-deterministic' + ), suffix=r'\b'), Keyword) + ], + 'builtins': [ + (words(( + 'define', 'domain', 'object', 'either', 'and', + 'forall', 'preference', 'imply', 'or', 'exists', + 'not', 'when', 'assign', 'scale-up', 'scale-down', + 'increase', 'decrease', 'at', 'over', 'start', + 'end', 'all', 'problem', 'always', 'sometime', + 'within', 'at-most-once', 'sometime-after', + 'sometime-before', 'always-within', 'hold-during', + 'hold-after', 'minimize', 'maximize', + 'total-time', 'is-violated'), suffix=r'\b'), + Name.Builtin) + ] + } + diff --git a/libs/pygments/lexers/perl.py b/libs/pygments/lexers/perl.py index 3ec19445c..33f91f580 100644 --- a/libs/pygments/lexers/perl.py +++ b/libs/pygments/lexers/perl.py @@ -4,7 +4,7 @@ Lexers for Perl, Raku and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/phix.py b/libs/pygments/lexers/phix.py index 29082e05c..f0b03775e 100644 --- a/libs/pygments/lexers/phix.py +++ b/libs/pygments/lexers/phix.py @@ -4,7 +4,7 @@ Lexers for Phix. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/php.py b/libs/pygments/lexers/php.py index 4f00c6f48..82d4aeb3d 100644 --- a/libs/pygments/lexers/php.py +++ b/libs/pygments/lexers/php.py @@ -4,7 +4,7 @@ Lexers for PHP and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/pointless.py b/libs/pygments/lexers/pointless.py index 4e330e3da..adedb757d 100644 --- a/libs/pygments/lexers/pointless.py +++ b/libs/pygments/lexers/pointless.py @@ -4,7 +4,7 @@ Lexers for Pointless. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/pony.py b/libs/pygments/lexers/pony.py index f7fc769db..055423a46 100644 --- a/libs/pygments/lexers/pony.py +++ b/libs/pygments/lexers/pony.py @@ -4,7 +4,7 @@ Lexers for Pony and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/praat.py b/libs/pygments/lexers/praat.py index e10cac489..054f5b61e 100644 --- a/libs/pygments/lexers/praat.py +++ b/libs/pygments/lexers/praat.py @@ -4,7 +4,7 @@ Lexer for Praat - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/procfile.py b/libs/pygments/lexers/procfile.py index 3b42b3164..32619804f 100644 --- a/libs/pygments/lexers/procfile.py +++ b/libs/pygments/lexers/procfile.py @@ -4,7 +4,7 @@ Lexer for Procfile file format. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/prolog.py b/libs/pygments/lexers/prolog.py index 7578889d1..7bf951c1c 100644 --- a/libs/pygments/lexers/prolog.py +++ b/libs/pygments/lexers/prolog.py @@ -4,7 +4,7 @@ Lexers for Prolog and Prolog-like languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/promql.py b/libs/pygments/lexers/promql.py index 7996c3d07..cad3c254a 100644 --- a/libs/pygments/lexers/promql.py +++ b/libs/pygments/lexers/promql.py @@ -4,7 +4,7 @@ Lexer for Prometheus Query Language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/prql.py b/libs/pygments/lexers/prql.py index 1f22eb29d..ee95d2d47 100644 --- a/libs/pygments/lexers/prql.py +++ b/libs/pygments/lexers/prql.py @@ -4,7 +4,7 @@ Lexer for the PRQL query language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ptx.py b/libs/pygments/lexers/ptx.py index 405e7f7e2..784ca13a6 100644 --- a/libs/pygments/lexers/ptx.py +++ b/libs/pygments/lexers/ptx.py @@ -4,7 +4,7 @@ Lexer for other PTX language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/python.py b/libs/pygments/lexers/python.py index 287305c75..805f6ff2a 100644 --- a/libs/pygments/lexers/python.py +++ b/libs/pygments/lexers/python.py @@ -4,7 +4,7 @@ Lexers for Python and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -33,7 +33,7 @@ class PythonLexer(RegexLexer): name = 'Python' url = 'https://www.python.org' - aliases = ['python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark'] + aliases = ['python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark', 'pyi'] filenames = [ '*.py', '*.pyw', @@ -109,11 +109,11 @@ def fstring_rules(ttype): (r'\\', Text), include('keywords'), include('soft-keywords'), - (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'funcname'), - (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'classname'), - (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text), + (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'funcname'), + (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'classname'), + (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace), 'fromimport'), - (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text), + (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace), 'import'), include('expr'), ], @@ -329,14 +329,14 @@ def fstring_rules(ttype): (uni_name, Name.Class, '#pop'), ], 'import': [ - (r'(\s+)(as)(\s+)', bygroups(Text, Keyword, Text)), + (r'(\s+)(as)(\s+)', bygroups(Whitespace, Keyword, Whitespace)), (r'\.', Name.Namespace), (uni_name, Name.Namespace), - (r'(\s*)(,)(\s*)', bygroups(Text, Operator, Text)), + (r'(\s*)(,)(\s*)', bygroups(Whitespace, Operator, Whitespace)), default('#pop') # all else: go back ], 'fromimport': [ - (r'(\s+)(import)\b', bygroups(Text, Keyword.Namespace), '#pop'), + (r'(\s+)(import)\b', bygroups(Whitespace, Keyword.Namespace), '#pop'), (r'\.', Name.Namespace), # if None occurs here, it's "raise x from None", since None can # never be a module name @@ -459,11 +459,11 @@ def innerstring_rules(ttype): (r'(in|is|and|or|not)\b', Operator.Word), (r'!=|==|<<|>>|[-~+/*%=<>&^|.]', Operator), include('keywords'), - (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'funcname'), - (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Text), 'classname'), - (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text), + (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'funcname'), + (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'classname'), + (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace), 'fromimport'), - (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Text), + (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace), 'import'), include('builtins'), include('magicfuncs'), @@ -635,6 +635,7 @@ def innerstring_rules(ttype): def analyse_text(text): return shebang_matches(text, r'pythonw?2(\.\d)?') + class _PythonConsoleLexerBase(RegexLexer): name = 'Python console session' aliases = ['pycon', 'python-console'] @@ -671,6 +672,7 @@ class _PythonConsoleLexerBase(RegexLexer): ], } + class PythonConsoleLexer(DelegatingLexer): """ For Python console output or doctests, such as: @@ -719,6 +721,7 @@ def __init__(self, **options): super().__init__(pylexer, _PythonConsoleLexerBase, Other.Code, **options) super().__init__(tblexer, _ReplaceInnerCode, Other.Traceback, **options) + class PythonTracebackLexer(RegexLexer): """ For Python 3.x tracebacks, with support for chained exceptions. @@ -851,16 +854,16 @@ class CythonLexer(RegexLexer): bygroups(Punctuation, Keyword.Type, Punctuation)), (r'!=|==|<<|>>|[-~+/*%=<>&^|.?]', Operator), (r'(from)(\d+)(<=)(\s+)(<)(\d+)(:)', - bygroups(Keyword, Number.Integer, Operator, Name, Operator, + bygroups(Keyword, Number.Integer, Operator, Whitespace, Operator, Name, Punctuation)), include('keywords'), - (r'(def|property)(\s+)', bygroups(Keyword, Text), 'funcname'), - (r'(cp?def)(\s+)', bygroups(Keyword, Text), 'cdef'), + (r'(def|property)(\s+)', bygroups(Keyword, Whitespace), 'funcname'), + (r'(cp?def)(\s+)', bygroups(Keyword, Whitespace), 'cdef'), # (should actually start a block with only cdefs) (r'(cdef)(:)', bygroups(Keyword, Punctuation)), - (r'(class|struct)(\s+)', bygroups(Keyword, Text), 'classname'), - (r'(from)(\s+)', bygroups(Keyword, Text), 'fromimport'), - (r'(c?import)(\s+)', bygroups(Keyword, Text), 'import'), + (r'(class|struct)(\s+)', bygroups(Keyword, Whitespace), 'classname'), + (r'(from)(\s+)', bygroups(Keyword, Whitespace), 'fromimport'), + (r'(c?import)(\s+)', bygroups(Keyword, Whitespace), 'import'), include('builtins'), include('backtick'), ('(?:[rR]|[uU][rR]|[rR][uU])"""', String, 'tdqs'), @@ -938,9 +941,9 @@ class CythonLexer(RegexLexer): (r'(public|readonly|extern|api|inline)\b', Keyword.Reserved), (r'(struct|enum|union|class)\b', Keyword), (r'([a-zA-Z_]\w*)(\s*)(?=[(:#=]|$)', - bygroups(Name.Function, Text), '#pop'), + bygroups(Name.Function, Whitespace), '#pop'), (r'([a-zA-Z_]\w*)(\s*)(,)', - bygroups(Name.Function, Text, Punctuation)), + bygroups(Name.Function, Whitespace, Punctuation)), (r'from\b', Keyword, '#pop'), (r'as\b', Keyword), (r':', Punctuation, '#pop'), @@ -952,13 +955,13 @@ class CythonLexer(RegexLexer): (r'[a-zA-Z_]\w*', Name.Class, '#pop') ], 'import': [ - (r'(\s+)(as)(\s+)', bygroups(Text, Keyword, Text)), + (r'(\s+)(as)(\s+)', bygroups(Whitespace, Keyword, Whitespace)), (r'[a-zA-Z_][\w.]*', Name.Namespace), - (r'(\s*)(,)(\s*)', bygroups(Text, Operator, Text)), + (r'(\s*)(,)(\s*)', bygroups(Whitespace, Operator, Whitespace)), default('#pop') # all else: go back ], 'fromimport': [ - (r'(\s+)(c?import)\b', bygroups(Text, Keyword), '#pop'), + (r'(\s+)(c?import)\b', bygroups(Whitespace, Keyword), '#pop'), (r'[a-zA-Z_.][\w.]*', Name.Namespace), # ``cdef foo from "header"``, or ``for foo from 0 < i < 10`` default('#pop'), diff --git a/libs/pygments/lexers/q.py b/libs/pygments/lexers/q.py index 6ab121c88..bfa8017e6 100644 --- a/libs/pygments/lexers/q.py +++ b/libs/pygments/lexers/q.py @@ -4,7 +4,7 @@ Lexer for the Q programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/qlik.py b/libs/pygments/lexers/qlik.py index b9b8721a2..a29f89f35 100644 --- a/libs/pygments/lexers/qlik.py +++ b/libs/pygments/lexers/qlik.py @@ -4,7 +4,7 @@ Lexer for the qlik scripting language - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/qvt.py b/libs/pygments/lexers/qvt.py index c3012100c..302d1b6ed 100644 --- a/libs/pygments/lexers/qvt.py +++ b/libs/pygments/lexers/qvt.py @@ -4,7 +4,7 @@ Lexer for QVT Operational language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/r.py b/libs/pygments/lexers/r.py index 8d7e4a8df..d3f65ba2d 100644 --- a/libs/pygments/lexers/r.py +++ b/libs/pygments/lexers/r.py @@ -4,7 +4,7 @@ Lexers for the R/S languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -30,6 +30,7 @@ class RConsoleLexer(Lexer): filenames = ['*.Rout'] url = 'https://www.r-project.org' version_added = '' + _example = "rconsole/r-console-transcript.Rout" def get_tokens_unprocessed(self, text): slexer = SLexer(**self.options) @@ -87,6 +88,9 @@ class SLexer(RegexLexer): 'valid_name': [ (valid_name, Name), ], + 'function_name': [ + (rf'({valid_name})\s*(?=\()', Name.Function), + ], 'punctuation': [ (r'\[{1,2}|\]{1,2}|\(|\)|;|,', Punctuation), ], @@ -96,7 +100,7 @@ class SLexer(RegexLexer): Keyword.Reserved), ], 'operators': [ - (r'<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\?', Operator), + (r'<<?-|->>?|-|==|<=|>=|\|>|<|>|&&?|!=|\|\|?|\?', Operator), (r'\*|\+|\^|/|!|%[^%]*%|=|~|\$|@|:{1,3}', Operator), ], 'builtin_symbols': [ @@ -120,15 +124,15 @@ class SLexer(RegexLexer): (r'\'', String, 'string_squote'), (r'\"', String, 'string_dquote'), include('builtin_symbols'), + include('keywords'), + include('function_name'), include('valid_name'), include('numbers'), - include('keywords'), include('punctuation'), include('operators'), ], 'root': [ # calls: - (rf'({valid_name})\s*(?=\()', Name.Function), include('statements'), # blocks: (r'\{|\}', Punctuation), diff --git a/libs/pygments/lexers/rdf.py b/libs/pygments/lexers/rdf.py index 1a0571be7..4930c1b38 100644 --- a/libs/pygments/lexers/rdf.py +++ b/libs/pygments/lexers/rdf.py @@ -4,7 +4,7 @@ Lexers for semantic web and RDF query languages and markup. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -280,7 +280,7 @@ class TurtleLexer(RegexLexer): ], 'triple-double-quoted-string': [ (r'"""', String, 'end-of-string'), - (r'[^\\]+', String), + (r'[^\\]+(?=""")', String), (r'\\', String, 'string-escape'), ], 'single-double-quoted-string': [ @@ -290,7 +290,7 @@ class TurtleLexer(RegexLexer): ], 'triple-single-quoted-string': [ (r"'''", String, 'end-of-string'), - (r'[^\\]+', String), + (r"[^\\]+(?=''')", String), (r'\\', String, 'string-escape'), ], 'single-single-quoted-string': [ diff --git a/libs/pygments/lexers/rebol.py b/libs/pygments/lexers/rebol.py index 94656f4f2..4b37a7494 100644 --- a/libs/pygments/lexers/rebol.py +++ b/libs/pygments/lexers/rebol.py @@ -4,7 +4,7 @@ Lexers for the REBOL and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/rego.py b/libs/pygments/lexers/rego.py new file mode 100644 index 000000000..6f2e3e9e6 --- /dev/null +++ b/libs/pygments/lexers/rego.py @@ -0,0 +1,57 @@ +""" + pygments.lexers.rego + ~~~~~~~~~~~~~~~~~~~~ + + Lexers for the Rego policy languages. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, words +from pygments.token import Comment, Operator, Keyword, Name, String, Number, Punctuation, Whitespace + +class RegoLexer(RegexLexer): + """ + For Rego source. + """ + name = 'Rego' + url = 'https://www.openpolicyagent.org/docs/latest/policy-language/' + filenames = ['*.rego'] + aliases = ['rego'] + mimetypes = ['text/x-rego'] + version_added = '2.19' + + reserved_words = ( + 'as', 'contains', 'data', 'default', 'else', 'every', 'false', + 'if', 'in', 'import', 'package', 'not', 'null', + 'some', 'true', 'with' + ) + + builtins = ( + # https://www.openpolicyagent.org/docs/latest/philosophy/#the-opa-document-model + 'data', # Global variable for accessing base and virtual documents + 'input', # Represents synchronously pushed base documents + ) + + tokens = { + 'root': [ + (r'\n', Whitespace), + (r'\s+', Whitespace), + (r'#.*?$', Comment.Single), + (words(reserved_words, suffix=r'\b'), Keyword), + (words(builtins, suffix=r'\b'), Name.Builtin), + (r'[a-zA-Z_][a-zA-Z0-9_]*', Name), + (r'"(\\\\|\\"|[^"])*"', String.Double), + (r'`[^`]*`', String.Backtick), + (r'-?\d+(\.\d+)?', Number), + (r'(==|!=|<=|>=|:=)', Operator), # Compound operators + (r'[=<>+\-*/%&|]', Operator), # Single-character operators + (r'[\[\]{}(),.:;]', Punctuation), + ] + } + +__all__ = ['RegoLexer'] + + + diff --git a/libs/pygments/lexers/resource.py b/libs/pygments/lexers/resource.py index f2e965cd1..9593c2124 100644 --- a/libs/pygments/lexers/resource.py +++ b/libs/pygments/lexers/resource.py @@ -4,7 +4,7 @@ Lexer for resource definition files. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ride.py b/libs/pygments/lexers/ride.py index 1c3ba928b..4d60c29cb 100644 --- a/libs/pygments/lexers/ride.py +++ b/libs/pygments/lexers/ride.py @@ -4,7 +4,7 @@ Lexer for the Ride programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/rita.py b/libs/pygments/lexers/rita.py index 53da9be26..536aafffd 100644 --- a/libs/pygments/lexers/rita.py +++ b/libs/pygments/lexers/rita.py @@ -4,7 +4,7 @@ Lexers for RITA language - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/rnc.py b/libs/pygments/lexers/rnc.py index af157d63b..b7a06bb91 100644 --- a/libs/pygments/lexers/rnc.py +++ b/libs/pygments/lexers/rnc.py @@ -4,7 +4,7 @@ Lexer for Relax-NG Compact syntax - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/roboconf.py b/libs/pygments/lexers/roboconf.py index 7e0b10544..31adba9f4 100644 --- a/libs/pygments/lexers/roboconf.py +++ b/libs/pygments/lexers/roboconf.py @@ -4,7 +4,7 @@ Lexers for Roboconf DSL. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/robotframework.py b/libs/pygments/lexers/robotframework.py index 544944194..f92d56750 100644 --- a/libs/pygments/lexers/robotframework.py +++ b/libs/pygments/lexers/robotframework.py @@ -4,7 +4,7 @@ Lexer for Robot Framework. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/ruby.py b/libs/pygments/lexers/ruby.py index 134ff779f..72aaeb5fe 100644 --- a/libs/pygments/lexers/ruby.py +++ b/libs/pygments/lexers/ruby.py @@ -4,7 +4,7 @@ Lexers for Ruby and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/rust.py b/libs/pygments/lexers/rust.py index 04e15c8c7..634104755 100644 --- a/libs/pygments/lexers/rust.py +++ b/libs/pygments/lexers/rust.py @@ -4,7 +4,7 @@ Lexers for the Rust language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/sas.py b/libs/pygments/lexers/sas.py index c3039090e..1b2ad432d 100644 --- a/libs/pygments/lexers/sas.py +++ b/libs/pygments/lexers/sas.py @@ -4,7 +4,7 @@ Lexer for SAS. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/savi.py b/libs/pygments/lexers/savi.py index f65818f37..1e443ae30 100644 --- a/libs/pygments/lexers/savi.py +++ b/libs/pygments/lexers/savi.py @@ -4,7 +4,7 @@ Lexer for Savi. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/scdoc.py b/libs/pygments/lexers/scdoc.py index fecdd9c92..8e850d02e 100644 --- a/libs/pygments/lexers/scdoc.py +++ b/libs/pygments/lexers/scdoc.py @@ -4,7 +4,7 @@ Lexer for scdoc, a simple man page generator. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/scripting.py b/libs/pygments/lexers/scripting.py index d38387e07..17deae9bb 100644 --- a/libs/pygments/lexers/scripting.py +++ b/libs/pygments/lexers/scripting.py @@ -4,7 +4,7 @@ Lexer for scripting and embedded languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -21,6 +21,10 @@ 'EasytrieveLexer', 'JclLexer', 'MiniScriptLexer'] +def all_lua_builtins(): + from pygments.lexers._lua_builtins import MODULES + return [w for values in MODULES.values() for w in values] + class LuaLexer(RegexLexer): """ For Lua source code. @@ -66,7 +70,7 @@ class LuaLexer(RegexLexer): 'ws': [ (_comment_multiline, Comment.Multiline), (_comment_single, Comment.Single), - (_space, Text), + (_space, Whitespace), ], 'base': [ include('ws'), @@ -82,7 +86,7 @@ class LuaLexer(RegexLexer): (r'::', Punctuation, 'label'), (r'\.{3}', Punctuation), (r'[=<>|~&+\-*/%#^]+|\.\.', Operator), - (r'[\[\]{}().,:;]', Punctuation), + (r'[\[\]{}().,:;]+', Punctuation), (r'(and|or|not)\b', Operator.Word), ('(break|do|else|elseif|end|for|if|in|repeat|return|then|until|' @@ -93,12 +97,24 @@ class LuaLexer(RegexLexer): (r'(function)\b', Keyword.Reserved, 'funcname'), - (r'[A-Za-z_]\w*(\.[A-Za-z_]\w*)?', Name), + (words(all_lua_builtins(), suffix=r"\b"), Name.Builtin), + (fr'[A-Za-z_]\w*(?={_s}*[.:])', Name.Variable, 'varname'), + (fr'[A-Za-z_]\w*(?={_s}*\()', Name.Function), + (r'[A-Za-z_]\w*', Name.Variable), ("'", String.Single, combined('stringescape', 'sqs')), ('"', String.Double, combined('stringescape', 'dqs')) ], + 'varname': [ + include('ws'), + (r'\.\.', Operator, '#pop'), + (r'[.:]', Punctuation), + (rf'{_name}(?={_s}*[.:])', Name.Property), + (rf'{_name}(?={_s}*\()', Name.Function, '#pop'), + (_name, Name.Property, '#pop'), + ], + 'funcname': [ include('ws'), (r'[.:]', Punctuation), @@ -151,16 +167,15 @@ def __init__(self, **options): def get_tokens_unprocessed(self, text): for index, token, value in \ RegexLexer.get_tokens_unprocessed(self, text): - if token is Name: - if value in self._functions: - yield index, Name.Builtin, value - continue - elif '.' in value: + if token is Name.Builtin and value not in self._functions: + if '.' in value: a, b = value.split('.') yield index, Name, a yield index + len(a), Punctuation, '.' yield index + len(a) + 1, Name, b - continue + else: + yield index, Name, value + continue yield index, token, value def _luau_make_expression(should_pop, _s): @@ -521,7 +536,8 @@ class MoonScriptLexer(LuaLexer): (r'(self)\b', Name.Builtin.Pseudo), (r'@@?([a-zA-Z_]\w*)?', Name.Variable.Class), (r'[A-Z]\w*', Name.Class), # proper name - (r'[A-Za-z_]\w*(\.[A-Za-z_]\w*)?', Name), + (words(all_lua_builtins(), suffix=r"\b"), Name.Builtin), + (r'[A-Za-z_]\w*', Name), ("'", String.Single, combined('stringescape', 'sqs')), ('"', String.Double, combined('stringescape', 'dqs')) ], diff --git a/libs/pygments/lexers/sgf.py b/libs/pygments/lexers/sgf.py index 21861e4a2..f0e56cba5 100644 --- a/libs/pygments/lexers/sgf.py +++ b/libs/pygments/lexers/sgf.py @@ -4,7 +4,7 @@ Lexer for Smart Game Format (sgf) file format. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/shell.py b/libs/pygments/lexers/shell.py index cfab8591c..744767a1d 100644 --- a/libs/pygments/lexers/shell.py +++ b/libs/pygments/lexers/shell.py @@ -4,7 +4,7 @@ Lexers for various shells. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -232,6 +232,7 @@ class BashSessionLexer(ShellSessionBaseLexer): mimetypes = ['application/x-shell-session', 'application/x-sh-session'] url = 'https://en.wikipedia.org/wiki/Unix_shell' version_added = '1.1' + _example = "console/example.sh-session" _innerLexerCls = BashLexer _ps1rgx = re.compile( @@ -542,6 +543,7 @@ class MSDOSSessionLexer(ShellSessionBaseLexer): mimetypes = [] url = 'https://en.wikipedia.org/wiki/MS-DOS' version_added = '2.1' + _example = "doscon/session" _innerLexerCls = BatchLexer _ps1rgx = re.compile(r'^([^>]*>)(.*\n?)') @@ -628,6 +630,7 @@ class TcshSessionLexer(ShellSessionBaseLexer): mimetypes = [] url = 'https://www.tcsh.org' version_added = '2.1' + _example = "tcshcon/session" _innerLexerCls = TcshLexer _ps1rgx = re.compile(r'^([^>]+>)(.*\n?)') @@ -760,6 +763,7 @@ class PowerShellSessionLexer(ShellSessionBaseLexer): mimetypes = [] url = 'https://learn.microsoft.com/en-us/powershell' version_added = '2.1' + _example = "pwsh-session/session" _innerLexerCls = PowerShellLexer _bare_continuation = True diff --git a/libs/pygments/lexers/sieve.py b/libs/pygments/lexers/sieve.py index 19d9d549d..fc48980c4 100644 --- a/libs/pygments/lexers/sieve.py +++ b/libs/pygments/lexers/sieve.py @@ -13,7 +13,7 @@ https://tools.ietf.org/html/rfc5429 https://tools.ietf.org/html/rfc8580 - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/slash.py b/libs/pygments/lexers/slash.py index 5ff20592e..1c439d0db 100644 --- a/libs/pygments/lexers/slash.py +++ b/libs/pygments/lexers/slash.py @@ -4,7 +4,7 @@ Lexer for the Slash programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/smalltalk.py b/libs/pygments/lexers/smalltalk.py index df46aa2b9..674b7b4b3 100644 --- a/libs/pygments/lexers/smalltalk.py +++ b/libs/pygments/lexers/smalltalk.py @@ -4,7 +4,7 @@ Lexers for Smalltalk and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/smithy.py b/libs/pygments/lexers/smithy.py index 3835258ab..bd479aec4 100644 --- a/libs/pygments/lexers/smithy.py +++ b/libs/pygments/lexers/smithy.py @@ -4,7 +4,7 @@ Lexers for the Smithy IDL. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/smv.py b/libs/pygments/lexers/smv.py index 5bccf22d3..bf97b52a5 100644 --- a/libs/pygments/lexers/smv.py +++ b/libs/pygments/lexers/smv.py @@ -4,7 +4,7 @@ Lexers for the SMV languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/snobol.py b/libs/pygments/lexers/snobol.py index c8c1d03d2..bab51e9b1 100644 --- a/libs/pygments/lexers/snobol.py +++ b/libs/pygments/lexers/snobol.py @@ -4,7 +4,7 @@ Lexers for the SNOBOL language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/solidity.py b/libs/pygments/lexers/solidity.py index b3ad9241d..3182a148a 100644 --- a/libs/pygments/lexers/solidity.py +++ b/libs/pygments/lexers/solidity.py @@ -4,7 +4,7 @@ Lexers for Solidity. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/soong.py b/libs/pygments/lexers/soong.py index b47d87fb3..bbf204dd2 100644 --- a/libs/pygments/lexers/soong.py +++ b/libs/pygments/lexers/soong.py @@ -4,7 +4,7 @@ Lexers for Soong (Android.bp Blueprint) files. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/sophia.py b/libs/pygments/lexers/sophia.py index 89dbee79e..37fcec5c3 100644 --- a/libs/pygments/lexers/sophia.py +++ b/libs/pygments/lexers/sophia.py @@ -6,7 +6,7 @@ Derived from pygments/lexers/reason.py. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/special.py b/libs/pygments/lexers/special.py index 22ad1e6ce..524946fc3 100644 --- a/libs/pygments/lexers/special.py +++ b/libs/pygments/lexers/special.py @@ -4,7 +4,7 @@ Special lexers. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -46,6 +46,7 @@ class OutputLexer(Lexer): aliases = ['output'] url = "" version_added = '2.10' + _example = "output/output" def get_tokens_unprocessed(self, text): yield 0, Generic.Output, text diff --git a/libs/pygments/lexers/spice.py b/libs/pygments/lexers/spice.py index ec7cd9785..9d2b1a1a8 100644 --- a/libs/pygments/lexers/spice.py +++ b/libs/pygments/lexers/spice.py @@ -4,7 +4,7 @@ Lexers for the Spice programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/sql.py b/libs/pygments/lexers/sql.py index 31b45fbb7..c3a11f40a 100644 --- a/libs/pygments/lexers/sql.py +++ b/libs/pygments/lexers/sql.py @@ -36,10 +36,11 @@ The ``tests/examplefiles`` contains a few test files with data to be parsed by these lexers. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ +import collections import re from pygments.lexer import Lexer, RegexLexer, do_insertions, bygroups, words @@ -56,12 +57,13 @@ MYSQL_KEYWORDS, \ MYSQL_OPTIMIZER_HINTS +from pygments.lexers import _googlesql_builtins from pygments.lexers import _tsql_builtins -__all__ = ['PostgresLexer', 'PlPgsqlLexer', 'PostgresConsoleLexer', - 'PostgresExplainLexer', 'SqlLexer', 'TransactSqlLexer', - 'MySqlLexer', 'SqliteConsoleLexer', 'RqlLexer'] +__all__ = ['GoogleSqlLexer', 'PostgresLexer', 'PlPgsqlLexer', + 'PostgresConsoleLexer', 'PostgresExplainLexer', 'SqlLexer', + 'TransactSqlLexer', 'MySqlLexer', 'SqliteConsoleLexer', 'RqlLexer'] line_re = re.compile('.*?\n') sqlite_prompt_re = re.compile(r'^(?:sqlite| ...)>(?= )') @@ -77,6 +79,12 @@ tsql_declare_re = re.compile(r'\bdeclare\s+@', re.IGNORECASE) tsql_variable_re = re.compile(r'@[a-zA-Z_]\w*\b') +# Identifiers for analyse_text() +googlesql_identifiers = ( + _googlesql_builtins.functionnames + + _googlesql_builtins.keywords + + _googlesql_builtins.types) + def language_callback(lexer, match): """Parse the content of a $-string using a lexer @@ -310,6 +318,7 @@ class PostgresConsoleLexer(Lexer): mimetypes = ['text/x-postgresql-psql'] url = 'https://www.postgresql.org' version_added = '1.5' + _example = "psql/psql_session.txt" def get_tokens_unprocessed(self, data): sql = PsqlRegexLexer(**self.options) @@ -386,7 +395,7 @@ class PostgresExplainLexer(RegexLexer): tokens = { 'root': [ - (r'(:|\(|\)|ms|kB|->|\.\.|\,)', Punctuation), + (r'(:|\(|\)|ms|kB|->|\.\.|\,|\/)', Punctuation), (r'(\s+)', Whitespace), # This match estimated cost and effectively measured counters with ANALYZE @@ -395,9 +404,9 @@ class PostgresExplainLexer(RegexLexer): (r'(actual)( )(=?)', bygroups(Name.Class, Whitespace, Punctuation), 'instrumentation'), # Misc keywords - (words(('actual', 'Memory Usage', 'Memory', 'Buckets', 'Batches', + (words(('actual', 'Memory Usage', 'Disk Usage', 'Memory', 'Buckets', 'Batches', 'originally', 'row', 'rows', 'Hits', 'Misses', - 'Evictions', 'Overflows'), suffix=r'\b'), + 'Evictions', 'Overflows', 'Planned Partitions'), suffix=r'\b'), Comment.Single), (r'(hit|read|dirtied|written|write|time|calls)(=)', bygroups(Comment.Single, Operator)), @@ -712,7 +721,7 @@ class TransactSqlLexer(RegexLexer): tokens = { 'root': [ (r'\s+', Whitespace), - (r'--.*?$\n?', Comment.Single), + (r'--.*[$|\n]?', Comment.Single), (r'/\*', Comment.Multiline, 'multiline-comments'), (words(_tsql_builtins.OPERATORS), Operator), (words(_tsql_builtins.OPERATOR_WORDS, suffix=r'\b'), Operator.Word), @@ -963,6 +972,166 @@ def analyse_text(text): return rating +class GoogleSqlLexer(RegexLexer): + """ + GoogleSQL is Google's standard SQL dialect, formerly known as ZetaSQL. + + The list of keywords includes reserved words for future use. + """ + + name = 'GoogleSQL' + aliases = ['googlesql', 'zetasql'] + filenames = ['*.googlesql', '*.googlesql.sql'] + mimetypes = ['text/x-google-sql', 'text/x-google-sql-aux'] + url = 'https://cloud.google.com/bigquery/googlesql' + version_added = '2.19' + + flags = re.IGNORECASE + tokens = { + 'root': [ + (r'\s+', Whitespace), + + # Comments + (r'(?:#|--\s+).*', Comment.Single), + (r'/\*', Comment.Multiline, 'multiline-comment'), + + # Hexadecimal literals + (r"x'([0-9a-f]{2})+'", Number.Hex), + (r'0x[0-9a-f]+', Number.Hex), + + # Binary literals + (r"b'[01]+'", Number.Bin), + (r'0b[01]+', Number.Bin), + + # Numeric literals + (r'[0-9]+\.[0-9]*(e[+-]?[0-9]+)?', Number.Float), # Mandatory integer, optional fraction and exponent + (r'[0-9]*\.[0-9]+(e[+-]?[0-9]+)?', Number.Float), # Mandatory fraction, optional integer and exponent + (r'[0-9]+e[+-]?[0-9]+', Number.Float), # Exponents with integer significands are still floats + (r'[0-9]+(?=[^0-9a-z$_\u0080-\uffff])', Number.Integer), # Integers that are not in a schema object name + + # Date literals + (r"\{\s*d\s*(?P<quote>['\"])\s*\d{2}(\d{2})?.?\d{2}.?\d{2}\s*(?P=quote)\s*\}", + Literal.Date), + + # Time literals + (r"\{\s*t\s*(?P<quote>['\"])\s*(?:\d+\s+)?\d{1,2}.?\d{1,2}.?\d{1,2}(\.\d*)?\s*(?P=quote)\s*\}", + Literal.Date), + + # Timestamp literals + ( + r"\{\s*ts\s*(?P<quote>['\"])\s*" + r"\d{2}(?:\d{2})?.?\d{2}.?\d{2}" # Date part + r"\s+" # Whitespace between date and time + r"\d{1,2}.?\d{1,2}.?\d{1,2}(\.\d*)?" # Time part + r"\s*(?P=quote)\s*\}", + Literal.Date + ), + + # String literals + (r"'", String.Single, 'single-quoted-string'), + (r'"', String.Double, 'double-quoted-string'), + + # Variables + (r'@@(?:global\.|persist\.|persist_only\.|session\.)?[a-z_]+', Name.Variable), + (r'@[a-z0-9_$.]+', Name.Variable), + (r"@'", Name.Variable, 'single-quoted-variable'), + (r'@"', Name.Variable, 'double-quoted-variable'), + (r"@`", Name.Variable, 'backtick-quoted-variable'), + (r'\?', Name.Variable), # For demonstrating prepared statements + + # Exceptions; these words tokenize differently in different contexts. + (r'\b(set)(?!\s*\()', Keyword), + (r'\b(character)(\s+)(set)\b', bygroups(Keyword, Whitespace, Keyword)), + + # Constants, types, keywords, functions, operators + (words(_googlesql_builtins.constants, prefix=r'\b', suffix=r'\b'), Name.Constant), + (words(_googlesql_builtins.types, prefix=r'\b', suffix=r'\b'), Keyword.Type), + (words(_googlesql_builtins.keywords, prefix=r'\b', suffix=r'\b'), Keyword), + (words(_googlesql_builtins.functionnames, prefix=r'\b', suffix=r'\b(\s*)(\()'), + bygroups(Name.Function, Whitespace, Punctuation)), + (words(_googlesql_builtins.operators, prefix=r'\b', suffix=r'\b'), Operator), + + # Schema object names + # + # Note: Although the first regex supports unquoted all-numeric + # identifiers, this will not be a problem in practice because + # numeric literals have already been handled above. + # + ('[0-9a-z$_\u0080-\uffff]+', Name), + (r'`', Name.Quoted, 'schema-object-name'), + + # Punctuation + (r'[(),.;]', Punctuation), + ], + + # Multiline comment substates + # --------------------------- + + 'multiline-comment': [ + (r'[^*]+', Comment.Multiline), + (r'\*/', Comment.Multiline, '#pop'), + (r'\*', Comment.Multiline), + ], + + # String substates + # ---------------- + + 'single-quoted-string': [ + (r"[^'\\]+", String.Single), + (r"''", String.Escape), + (r"""\\[0'"bnrtZ\\%_]""", String.Escape), + (r"'", String.Single, '#pop'), + ], + + 'double-quoted-string': [ + (r'[^"\\]+', String.Double), + (r'""', String.Escape), + (r"""\\[0'"bnrtZ\\%_]""", String.Escape), + (r'"', String.Double, '#pop'), + ], + + # Variable substates + # ------------------ + + 'single-quoted-variable': [ + (r"[^']+", Name.Variable), + (r"''", Name.Variable), + (r"'", Name.Variable, '#pop'), + ], + + 'double-quoted-variable': [ + (r'[^"]+', Name.Variable), + (r'""', Name.Variable), + (r'"', Name.Variable, '#pop'), + ], + + 'backtick-quoted-variable': [ + (r'[^`]+', Name.Variable), + (r'``', Name.Variable), + (r'`', Name.Variable, '#pop'), + ], + + # Schema object name substates + # ---------------------------- + # + # "Name.Quoted" and "Name.Quoted.Escape" are non-standard but + # formatters will style them as "Name" by default but add + # additional styles based on the token name. This gives users + # flexibility to add custom styles as desired. + # + 'schema-object-name': [ + (r'[^`]+', Name.Quoted), + (r'``', Name.Quoted.Escape), + (r'`', Name.Quoted, '#pop'), + ], + } + + def analyse_text(text): + tokens = collections.Counter(text.split()) + return 0.001 * sum(count for t, count in tokens.items() + if t in googlesql_identifiers) + + class SqliteConsoleLexer(Lexer): """ Lexer for example sessions using sqlite3. @@ -974,6 +1143,7 @@ class SqliteConsoleLexer(Lexer): mimetypes = ['text/x-sqlite3-console'] url = 'https://www.sqlite.org' version_added = '0.11' + _example = "sqlite3/sqlite3.sqlite3-console" def get_tokens_unprocessed(self, data): sql = SqlLexer(**self.options) diff --git a/libs/pygments/lexers/srcinfo.py b/libs/pygments/lexers/srcinfo.py index abba0c3dc..daf654ea9 100644 --- a/libs/pygments/lexers/srcinfo.py +++ b/libs/pygments/lexers/srcinfo.py @@ -7,7 +7,7 @@ The description of the format can be found in the wiki: https://wiki.archlinux.org/title/.SRCINFO - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/stata.py b/libs/pygments/lexers/stata.py index 5fca5b743..dc93cb4e0 100644 --- a/libs/pygments/lexers/stata.py +++ b/libs/pygments/lexers/stata.py @@ -4,7 +4,7 @@ Lexer for Stata - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/supercollider.py b/libs/pygments/lexers/supercollider.py index b4a719cfd..0f19d2af3 100644 --- a/libs/pygments/lexers/supercollider.py +++ b/libs/pygments/lexers/supercollider.py @@ -4,7 +4,7 @@ Lexer for SuperCollider - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/tablegen.py b/libs/pygments/lexers/tablegen.py new file mode 100644 index 000000000..5bcb3eef6 --- /dev/null +++ b/libs/pygments/lexers/tablegen.py @@ -0,0 +1,177 @@ +""" + pygments.lexers.tablegen + ~~~~~~~~~~~~~~~~~~~~~~~~ + + Lexer for LLVM's TableGen DSL. + + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, include, words, using +from pygments.lexers.c_cpp import CppLexer +from pygments.token import Comment, Keyword, Name, Number, Operator, \ + Punctuation, String, Text, Whitespace, Error + +__all__ = ['TableGenLexer'] + +KEYWORDS = ( + 'assert', + 'class', + 'code', + 'def', + 'dump', + 'else', + 'foreach', + 'defm', + 'defset', + 'defvar', + 'field', + 'if', + 'in', + 'include', + 'let', + 'multiclass', + 'then', +) + +KEYWORDS_CONST = ( + 'false', + 'true', +) +KEYWORDS_TYPE = ( + 'bit', + 'bits', + 'dag', + 'int', + 'list', + 'string', +) + +BANG_OPERATORS = ( + 'add', + 'and', + 'cast', + 'con', + 'cond', + 'dag', + 'div', + 'empty', + 'eq', + 'exists', + 'filter', + 'find', + 'foldl', + 'foreach', + 'ge', + 'getdagarg', + 'getdagname', + 'getdagop', + 'gt', + 'head', + 'if', + 'interleave', + 'isa', + 'le', + 'listconcat', + 'listremove', + 'listsplat', + 'logtwo', + 'lt', + 'mul', + 'ne', + 'not', + 'or', + 'range', + 'repr', + 'setdagarg', + 'setdagname', + 'setdagop', + 'shl', + 'size', + 'sra', + 'srl', + 'strconcat', + 'sub', + 'subst', + 'substr', + 'tail', + 'tolower', + 'toupper', + 'xor', +) + +class TableGenLexer(RegexLexer): + """ + Lexer for TableGen + """ + + name = 'TableGen' + url = 'https://llvm.org/docs/TableGen/ProgRef.html' + aliases = ['tablegen', 'td'] + filenames = ['*.td'] + + version_added = '2.19' + + tokens = { + 'root': [ + (r'\s+', Whitespace), + + (r'/\*', Comment.Multiline, 'comment'), + (r'//.*?$', Comment.SingleLine), + (r'#(define|ifdef|ifndef|else|endif)', Comment.Preproc), + + # Binary/hex numbers. Note that these take priority over names, + # which may begin with numbers. + (r'0b[10]+', Number.Bin), + (r'0x[0-9a-fA-F]+', Number.Hex), + + # Keywords + (words(KEYWORDS, suffix=r'\b'), Keyword), + (words(KEYWORDS_CONST, suffix=r'\b'), Keyword.Constant), + (words(KEYWORDS_TYPE, suffix=r'\b'), Keyword.Type), + + # Bang operators + (words(BANG_OPERATORS, prefix=r'\!', suffix=r'\b'), Operator), + # Unknown bang operators are an error + (r'![a-zA-Z]+', Error), + + # Names and identifiers + (r'[0-9]*[a-zA-Z_][a-zA-Z_0-9]*', Name), + (r'\$[a-zA-Z_][a-zA-Z_0-9]*', Name.Variable), + + # Place numbers after keywords. Names/identifiers may begin with + # numbers, and we want to parse 1X as one name token as opposed to + # a number and a name. + (r'[-\+]?[0-9]+', Number.Integer), + + # String literals + (r'"', String, 'dqs'), + (r'\[\{', Text, 'codeblock'), + + # Misc. punctuation + (r'[-+\[\]{}()<>\.,;:=?#]+', Punctuation), + ], + 'comment': [ + (r'[^*/]+', Comment.Multiline), + (r'/\*', Comment.Multiline, '#push'), + (r'\*/', Comment.Multiline, '#pop'), + (r'[*/]', Comment.Multiline) + ], + 'strings': [ + (r'\\[\\\'"tn]', String.Escape), + (r'[^\\"]+', String), + ], + # Double-quoted string, a la C + 'dqs': [ + (r'"', String, '#pop'), + include('strings'), + ], + # No escaping inside a code block - everything is literal + # Assume that the code inside a code block is C++. This isn't always + # true in TableGen, but is the far most common scenario. + 'codeblock': [ + (r'\}\]', Text, '#pop'), + (r'([^}]+|\}[^]])*', using(CppLexer)), + ], + } diff --git a/libs/pygments/lexers/tact.py b/libs/pygments/lexers/tact.py index 8ede906f2..9199a5b14 100644 --- a/libs/pygments/lexers/tact.py +++ b/libs/pygments/lexers/tact.py @@ -4,7 +4,7 @@ Lexers for Tact. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/tal.py b/libs/pygments/lexers/tal.py index 86249b85d..33c1bdc93 100644 --- a/libs/pygments/lexers/tal.py +++ b/libs/pygments/lexers/tal.py @@ -6,7 +6,7 @@ .. versionadded:: 2.12 - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/tcl.py b/libs/pygments/lexers/tcl.py index 436438c17..f156efa6a 100644 --- a/libs/pygments/lexers/tcl.py +++ b/libs/pygments/lexers/tcl.py @@ -4,7 +4,7 @@ Lexers for Tcl and related languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/teal.py b/libs/pygments/lexers/teal.py index 1862fba24..54ee268cd 100644 --- a/libs/pygments/lexers/teal.py +++ b/libs/pygments/lexers/teal.py @@ -4,7 +4,7 @@ Lexer for TEAL. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/templates.py b/libs/pygments/lexers/templates.py index 4084fbd50..ff796d3d0 100644 --- a/libs/pygments/lexers/templates.py +++ b/libs/pygments/lexers/templates.py @@ -4,7 +4,7 @@ Lexers for various template engines' markup. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -1501,7 +1501,7 @@ class EvoqueHtmlLexer(DelegatingLexer): """ name = 'HTML+Evoque' aliases = ['html+evoque'] - filenames = ['*.html'] + alias_filenames = ['*.html'] mimetypes = ['text/html+evoque'] url = 'https://gizmojo.org/templating' version_added = '1.1' @@ -1520,7 +1520,7 @@ class EvoqueXmlLexer(DelegatingLexer): """ name = 'XML+Evoque' aliases = ['xml+evoque'] - filenames = ['*.xml'] + alias_filenames = ['*.xml'] mimetypes = ['application/xml+evoque'] url = 'https://gizmojo.org/templating' version_added = '1.1' diff --git a/libs/pygments/lexers/teraterm.py b/libs/pygments/lexers/teraterm.py index 9a88337bf..a2c2980d4 100644 --- a/libs/pygments/lexers/teraterm.py +++ b/libs/pygments/lexers/teraterm.py @@ -4,7 +4,7 @@ Lexer for Tera Term macro files. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/testing.py b/libs/pygments/lexers/testing.py index 7df7fa780..e6c59269f 100644 --- a/libs/pygments/lexers/testing.py +++ b/libs/pygments/lexers/testing.py @@ -4,7 +4,7 @@ Lexers for testing languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/text.py b/libs/pygments/lexers/text.py index 17e2056b7..f5524783e 100644 --- a/libs/pygments/lexers/text.py +++ b/libs/pygments/lexers/text.py @@ -4,7 +4,7 @@ Lexers for non-source code file types. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -16,7 +16,7 @@ from pygments.lexers.textedit import VimLexer from pygments.lexers.markup import BBCodeLexer, MoinWikiLexer, RstLexer, \ TexLexer, GroffLexer -from pygments.lexers.installers import DebianControlLexer, SourcesListLexer +from pygments.lexers.installers import DebianControlLexer, DebianSourcesLexer, SourcesListLexer from pygments.lexers.make import MakefileLexer, BaseMakefileLexer, CMakeLexer from pygments.lexers.haxe import HxmlLexer from pygments.lexers.sgf import SmartGameFormatLexer diff --git a/libs/pygments/lexers/textedit.py b/libs/pygments/lexers/textedit.py index 0e1f2b2be..ea6a0a976 100644 --- a/libs/pygments/lexers/textedit.py +++ b/libs/pygments/lexers/textedit.py @@ -4,7 +4,7 @@ Lexers for languages related to text processing. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/textfmts.py b/libs/pygments/lexers/textfmts.py index f2a9253f9..6dd4e581b 100644 --- a/libs/pygments/lexers/textfmts.py +++ b/libs/pygments/lexers/textfmts.py @@ -4,7 +4,7 @@ Lexers for various text formats. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/theorem.py b/libs/pygments/lexers/theorem.py index 79f0606c0..9e3f150d4 100644 --- a/libs/pygments/lexers/theorem.py +++ b/libs/pygments/lexers/theorem.py @@ -6,7 +6,7 @@ See also :mod:`pygments.lexers.lean` - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/thingsdb.py b/libs/pygments/lexers/thingsdb.py index 733665308..ee859c995 100644 --- a/libs/pygments/lexers/thingsdb.py +++ b/libs/pygments/lexers/thingsdb.py @@ -4,7 +4,7 @@ Lexers for the ThingsDB language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/tlb.py b/libs/pygments/lexers/tlb.py index 45d0743f1..e652eac33 100644 --- a/libs/pygments/lexers/tlb.py +++ b/libs/pygments/lexers/tlb.py @@ -4,7 +4,7 @@ Lexers for TL-b. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/tls.py b/libs/pygments/lexers/tls.py index f7027bb02..a3079a22a 100644 --- a/libs/pygments/lexers/tls.py +++ b/libs/pygments/lexers/tls.py @@ -4,7 +4,7 @@ Lexers for the TLS presentation language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re diff --git a/libs/pygments/lexers/tnt.py b/libs/pygments/lexers/tnt.py index bb444fdf8..1ae2ed84a 100644 --- a/libs/pygments/lexers/tnt.py +++ b/libs/pygments/lexers/tnt.py @@ -4,7 +4,7 @@ Lexer for Typographic Number Theory. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/trafficscript.py b/libs/pygments/lexers/trafficscript.py index 9480ddc02..8c801c4cb 100644 --- a/libs/pygments/lexers/trafficscript.py +++ b/libs/pygments/lexers/trafficscript.py @@ -4,7 +4,7 @@ Lexer for RiverBed's TrafficScript (RTS) language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/typoscript.py b/libs/pygments/lexers/typoscript.py index 0f3977252..d71d5c355 100644 --- a/libs/pygments/lexers/typoscript.py +++ b/libs/pygments/lexers/typoscript.py @@ -13,7 +13,7 @@ `TypoScriptHtmlDataLexer` Lexer that highlights markers, constants and registers within html tags. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/typst.py b/libs/pygments/lexers/typst.py index 5daa6766f..21f8efd30 100644 --- a/libs/pygments/lexers/typst.py +++ b/libs/pygments/lexers/typst.py @@ -4,13 +4,14 @@ Lexers for Typst language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ from pygments.lexer import RegexLexer, words, bygroups, include from pygments.token import Comment, Keyword, Name, String, Punctuation, \ Whitespace, Generic, Operator, Number, Text +from pygments.util import get_choice_opt __all__ = ['TypstLexer'] @@ -18,6 +19,12 @@ class TypstLexer(RegexLexer): """ For Typst code. + + Additional options accepted: + + `start` + Specifies the starting state of the lexer (one of 'markup', 'math', + 'code'). The default is 'markup'. """ name = 'Typst' @@ -27,49 +34,75 @@ class TypstLexer(RegexLexer): url = 'https://typst.app' version_added = '2.18' + MATH_SHORTHANDS = ( + '[|', '|]', '||', '*', ':=', '::=', '...', '\'', '-', '=:', '!=', '>>', + '>=', '>>>', '<<', '<=', '<<<', '->', '|->', '=>', '|=>', '==>', + '-->', '~~>', '~>', '>->', '->>', '<-', '<==', '<--', '<~~', '<~', + '<-<','<<-','<->','<=>','<==>','<-->', '>', '<', '~', ':', '|' + ) + tokens = { 'root': [ include('markup'), ], - 'common': [ - (r'[ \t]+', Whitespace), - (r'((?!=[*_$`\-+0-9/<@\\#\[]|https?://).)+', Text), + # common cases going from math/markup into code mode + 'into_code': [ + (words(('#let', '#set', '#show'), suffix=r'\b'), Keyword.Declaration, 'inline_code'), + (words(('#import', '#include'), suffix=r'\b'), Keyword.Namespace, 'inline_code'), + (words(('#if', '#for', '#while', '#export'), suffix=r'\b'), Keyword.Reserved, 'inline_code'), + (r'#\{', Punctuation, 'code'), + (r'#\(', Punctuation, 'code'), + (r'(#[a-zA-Z_][a-zA-Z0-9_-]*)(\[)', bygroups(Name.Function, Punctuation), 'markup'), + (r'(#[a-zA-Z_][a-zA-Z0-9_-]*)(\()', bygroups(Name.Function, Punctuation), 'code'), + (words(('#true', '#false', '#none', '#auto'), suffix=r'\b'), Keyword.Constant), + (r'#[a-zA-Z_][a-zA-Z0-9_]*', Name.Variable), + (r'#0x[0-9a-fA-F]+', Number.Hex), + (r'#0b[01]+', Number.Bin), + (r'#0o[0-7]+', Number.Oct), + (r'#[0-9]+[\.e][0-9]+', Number.Float), + (r'#[0-9]+', Number.Integer), ], 'markup': [ include('comment'), (r'^\s*=+.*$', Generic.Heading), (r'[*][^*]*[*]', Generic.Strong), (r'_[^_]*_', Generic.Emph), - (r'\$', Punctuation, 'maths'), + (r'\$', Punctuation, 'math'), (r'`[^`]*`', String.Backtick), # inline code - (r'^\s*-', Punctuation), # unnumbered list - (r'^\s*\+', Punctuation), # numbered list - (r'^\s*[0-9.]+', Punctuation), # numbered list variant - (r'^(\s*/\s+)([^:]+)(:)', bygroups(Punctuation, Name.Variable, Punctuation)), # definitions + (r'^(\s*)(-)(\s+)', bygroups(Whitespace, Punctuation, Whitespace)), # unnumbered list + (r'^(\s*)(\+)(\s+)', bygroups(Whitespace, Punctuation, Whitespace)), # numbered list + (r'^(\s*)([0-9]+\.)', bygroups(Whitespace, Punctuation)), # numbered list variant + (r'^(\s*)(/)(\s+)([^:]+)(:)', bygroups(Whitespace, Punctuation, Whitespace, Name.Variable, Punctuation)), # definitions (r'<[a-zA-Z_][a-zA-Z0-9_-]*>', Name.Label), # label (r'@[a-zA-Z_][a-zA-Z0-9_-]*', Name.Label), # reference (r'\\#', Text), # escaped - (words(('#let', '#set', '#show'), suffix=r'\b'), Keyword.Declaration, 'inline_code'), - (r'(#[a-zA-Z_][a-zA-Z0-9_]*)(\[)', bygroups(Name.Function, Punctuation), 'markup'), - (r'(#[a-zA-Z_][a-zA-Z0-9_]*)(\()', bygroups(Name.Function, Punctuation), 'inline_code'), - (r'#[a-zA-Z_][a-zA-Z0-9_]*', Name.Variable), + include('into_code'), (r'```(?:.|\n)*?```', String.Backtick), # code block (r'https?://[0-9a-zA-Z~/%#&=\',;.+?]*', Generic.Emph), # links - (words((r'---', r'\\', r'~', r'--', r'...'), suffix=r'\b'), Punctuation), # special chars shorthand + (words(('---', '\\', '~', '--', '...'), suffix=r'\B'), Punctuation), # special chars shorthand (r'\\\[', Punctuation), # escaped (r'\\\]', Punctuation), # escaped (r'\[', Punctuation, '#push'), (r'\]', Punctuation, '#pop'), - include('common'), + (r'[ \t]+\n?|\n', Whitespace), + (r'((?![*_$`<@\\#\] ]|https?://).)+', Text), ], - 'maths': [ + 'math': [ include('comment'), - (words(('_', '^', '+', '-', '/', '*', '->', '<-', '!=', '=='), - suffix=r'\b'), Operator), - (words((r'\\', '$='), suffix=r'\b'), Operator), # maths markup operators + (words(('\\_', '\\^', '\\&')), Text), # escapes + (words(('_', '^', '&', ';')), Punctuation), + (words(('+', '/', '=') + MATH_SHORTHANDS), Operator), + (r'\\', Punctuation), # line break (r'\\\$', Punctuation), # escaped (r'\$', Punctuation, '#pop'), # end of math mode - include('code'), + include('into_code'), + (r'([a-zA-Z][a-zA-Z0-9-]*)(\s*)(\()', bygroups(Name.Function, Whitespace, Punctuation)), + (r'([a-zA-Z][a-zA-Z0-9-]*)(:)', bygroups(Name.Variable, Punctuation)), # named arguments in math functions + (r'([a-zA-Z][a-zA-Z0-9-]*)', Name.Variable), # both variables and symbols (_ isn't supported for variables) + (r'[0-9]+(\.[0-9]+)?', Number), + (r'\.{1,3}|\(|\)|,|\{|\}', Punctuation), + (r'"[^"]*"', String.Double), + (r'[ \t\n]+', Whitespace), ], 'comment': [ (r'//.*$', Comment.Single), @@ -81,24 +114,47 @@ class TypstLexer(RegexLexer): (r'\(|\{', Punctuation, 'code'), (r'\)|\}', Punctuation, '#pop'), (r'"[^"]*"', String.Double), - (r'[=,]', Operator), + (r',|\.{1,2}', Punctuation), + (r'=', Operator), (words(('and', 'or', 'not'), suffix=r'\b'), Operator.Word), (r'=>|<=|==|!=|>|<|-=|\+=|\*=|/=|\+|-|\\|\*', Operator), # comparisons - (r'([a-zA-Z_][a-zA-Z0-9_]*)(:)', bygroups(Name.Variable, Punctuation), '#push'), - (r'([a-zA-Z_][a-zA-Z0-9_]*)(\()', bygroups(Name.Function, Punctuation), '#push'), + (r'([a-zA-Z_][a-zA-Z0-9_-]*)(:)', bygroups(Name.Variable, Punctuation)), + (r'([a-zA-Z_][a-zA-Z0-9_-]*)(\()', bygroups(Name.Function, Punctuation), 'code'), (words(('as', 'break', 'export', 'continue', 'else', 'for', 'if', - 'import', 'in', 'include', 'return', 'while'), suffix=r'\b'), + 'in', 'return', 'while'), suffix=r'\b'), Keyword.Reserved), + (words(('import', 'include'), suffix=r'\b'), Keyword.Namespace), (words(('auto', 'none', 'true', 'false'), suffix=r'\b'), Keyword.Constant), (r'([0-9.]+)(mm|pt|cm|in|em|fr|%)', bygroups(Number, Keyword.Reserved)), + (r'0x[0-9a-fA-F]+', Number.Hex), + (r'0b[01]+', Number.Bin), + (r'0o[0-7]+', Number.Oct), + (r'[0-9]+[\.e][0-9]+', Number.Float), + (r'[0-9]+', Number.Integer), (words(('let', 'set', 'show'), suffix=r'\b'), Keyword.Declaration), # FIXME: make this work ## (r'(import|include)( *)(")([^"])(")', ## bygroups(Keyword.Reserved, Text, Punctuation, String.Double, Punctuation)), - include('common'), + (r'([a-zA-Z_][a-zA-Z0-9_-]*)', Name.Variable), + (r'[ \t\n]+', Whitespace), + (r':', Punctuation), # from imports like "import a: b" or "show: text.with(..)" ], 'inline_code': [ - (r';$', Punctuation, '#pop'), + (r';\b', Punctuation, '#pop'), + (r'\n', Whitespace, '#pop'), include('code'), ], } + + def __init__(self, **options): + self.start_state = get_choice_opt( + options, 'start', ['markup', 'code', 'math'], 'markup', True) + + RegexLexer.__init__(self, **options) + + def get_tokens_unprocessed(self, text): + stack = ['root'] + if self.start_state != 'markup': # markup is equivalent to root + stack.append(self.start_state) + + yield from RegexLexer.get_tokens_unprocessed(self, text, stack) diff --git a/libs/pygments/lexers/ul4.py b/libs/pygments/lexers/ul4.py index 467d3381c..552832cae 100644 --- a/libs/pygments/lexers/ul4.py +++ b/libs/pygments/lexers/ul4.py @@ -4,7 +4,7 @@ Lexer for the UL4 templating language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/unicon.py b/libs/pygments/lexers/unicon.py index dcf129d49..1077661a3 100644 --- a/libs/pygments/lexers/unicon.py +++ b/libs/pygments/lexers/unicon.py @@ -4,7 +4,7 @@ Lexers for the Icon and Unicon languages, including ucode VM. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/urbi.py b/libs/pygments/lexers/urbi.py index 3a81385c5..93cfcedc1 100644 --- a/libs/pygments/lexers/urbi.py +++ b/libs/pygments/lexers/urbi.py @@ -4,7 +4,7 @@ Lexers for UrbiScript language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/usd.py b/libs/pygments/lexers/usd.py index 083125961..468a37369 100644 --- a/libs/pygments/lexers/usd.py +++ b/libs/pygments/lexers/usd.py @@ -4,7 +4,7 @@ The module that parses Pixar's Universal Scene Description file format. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/varnish.py b/libs/pygments/lexers/varnish.py index db17d8006..5c3de7994 100644 --- a/libs/pygments/lexers/varnish.py +++ b/libs/pygments/lexers/varnish.py @@ -4,7 +4,7 @@ Lexers for Varnish configuration - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/verification.py b/libs/pygments/lexers/verification.py index 2d396b0e6..ac0675797 100644 --- a/libs/pygments/lexers/verification.py +++ b/libs/pygments/lexers/verification.py @@ -4,7 +4,7 @@ Lexer for Intermediate Verification Languages (IVLs). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/verifpal.py b/libs/pygments/lexers/verifpal.py index dad5cb545..e226339dc 100644 --- a/libs/pygments/lexers/verifpal.py +++ b/libs/pygments/lexers/verifpal.py @@ -4,7 +4,7 @@ Lexers for Verifpal languages. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/vip.py b/libs/pygments/lexers/vip.py index cabb678b3..22395e1e9 100644 --- a/libs/pygments/lexers/vip.py +++ b/libs/pygments/lexers/vip.py @@ -4,7 +4,7 @@ Lexers for Visual Prolog & Grammar files. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/vyper.py b/libs/pygments/lexers/vyper.py index 415502890..002ffeddc 100644 --- a/libs/pygments/lexers/vyper.py +++ b/libs/pygments/lexers/vyper.py @@ -4,7 +4,7 @@ Lexer for the Vyper Smart Contract language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ @@ -61,7 +61,7 @@ class VyperLexer(RegexLexer): # Keywords (words(('def', 'event', 'pass', 'return', 'for', 'while', 'if', 'elif', 'else', 'assert', 'raise', 'import', 'in', 'struct', 'implements', - 'interface', 'from', 'indexed', 'log'), + 'interface', 'from', 'indexed', 'log', 'extcall', 'staticcall'), prefix=r'\b', suffix=r'\b'), Keyword), # Visibility and State Mutability diff --git a/libs/pygments/lexers/web.py b/libs/pygments/lexers/web.py index 1c052abef..3d359662d 100644 --- a/libs/pygments/lexers/web.py +++ b/libs/pygments/lexers/web.py @@ -4,7 +4,7 @@ Just export previously exported lexers. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/webassembly.py b/libs/pygments/lexers/webassembly.py index db3ce5e3f..78cd4ca31 100644 --- a/libs/pygments/lexers/webassembly.py +++ b/libs/pygments/lexers/webassembly.py @@ -8,7 +8,7 @@ and https://webassembly.github.io/spec/core/text/. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/webidl.py b/libs/pygments/lexers/webidl.py index 22a4d61dc..3bbd12efd 100644 --- a/libs/pygments/lexers/webidl.py +++ b/libs/pygments/lexers/webidl.py @@ -4,7 +4,7 @@ Lexers for Web IDL, including some extensions. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/webmisc.py b/libs/pygments/lexers/webmisc.py index 815c7a313..347592d91 100644 --- a/libs/pygments/lexers/webmisc.py +++ b/libs/pygments/lexers/webmisc.py @@ -4,7 +4,7 @@ Lexers for misc. web stuff. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/wgsl.py b/libs/pygments/lexers/wgsl.py index 145e0c0b3..8fe950d9f 100644 --- a/libs/pygments/lexers/wgsl.py +++ b/libs/pygments/lexers/wgsl.py @@ -4,7 +4,7 @@ Lexer for the WebGPU Shading Language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/whiley.py b/libs/pygments/lexers/whiley.py index d6e2ea27c..ea98eb2d7 100644 --- a/libs/pygments/lexers/whiley.py +++ b/libs/pygments/lexers/whiley.py @@ -4,7 +4,7 @@ Lexers for the Whiley language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/wowtoc.py b/libs/pygments/lexers/wowtoc.py index 60abb83ef..2b18757d7 100644 --- a/libs/pygments/lexers/wowtoc.py +++ b/libs/pygments/lexers/wowtoc.py @@ -6,7 +6,7 @@ TOC files describe game addons. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/wren.py b/libs/pygments/lexers/wren.py index 4dc521874..ec2cd54c9 100644 --- a/libs/pygments/lexers/wren.py +++ b/libs/pygments/lexers/wren.py @@ -4,7 +4,7 @@ Lexer for Wren. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/x10.py b/libs/pygments/lexers/x10.py index 638808aa5..4b5d097c5 100644 --- a/libs/pygments/lexers/x10.py +++ b/libs/pygments/lexers/x10.py @@ -4,7 +4,7 @@ Lexers for the X10 programming language. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/xorg.py b/libs/pygments/lexers/xorg.py index a57bd130f..37251e490 100644 --- a/libs/pygments/lexers/xorg.py +++ b/libs/pygments/lexers/xorg.py @@ -4,7 +4,7 @@ Lexers for Xorg configs. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/yang.py b/libs/pygments/lexers/yang.py index 624ebf5ad..e7f395125 100644 --- a/libs/pygments/lexers/yang.py +++ b/libs/pygments/lexers/yang.py @@ -4,7 +4,7 @@ Lexer for the YANG 1.1 modeling language. See :rfc:`7950`. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/yara.py b/libs/pygments/lexers/yara.py index f0445d88f..29694f5a1 100644 --- a/libs/pygments/lexers/yara.py +++ b/libs/pygments/lexers/yara.py @@ -4,7 +4,7 @@ Lexers for YARA. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/lexers/zig.py b/libs/pygments/lexers/zig.py index 86b4adc9c..2b0168acf 100644 --- a/libs/pygments/lexers/zig.py +++ b/libs/pygments/lexers/zig.py @@ -4,7 +4,7 @@ Lexers for Zig. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/modeline.py b/libs/pygments/modeline.py index e4d9fe167..c310f0edb 100644 --- a/libs/pygments/modeline.py +++ b/libs/pygments/modeline.py @@ -4,7 +4,7 @@ A simple modeline parser (based on pymodeline). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/plugin.py b/libs/pygments/plugin.py index 2e462f2c2..498db4238 100644 --- a/libs/pygments/plugin.py +++ b/libs/pygments/plugin.py @@ -29,7 +29,7 @@ yourfilter = yourfilter:YourFilter - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ from importlib.metadata import entry_points diff --git a/libs/pygments/regexopt.py b/libs/pygments/regexopt.py index c44eedbf2..cc8d2c31b 100644 --- a/libs/pygments/regexopt.py +++ b/libs/pygments/regexopt.py @@ -5,7 +5,7 @@ An algorithm that generates optimized regexes for matching long lists of literal strings. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/scanner.py b/libs/pygments/scanner.py index 112da3491..3c8c84873 100644 --- a/libs/pygments/scanner.py +++ b/libs/pygments/scanner.py @@ -11,7 +11,7 @@ Have a look at the `DelphiLexer` to get an idea of how to use this scanner. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ import re diff --git a/libs/pygments/sphinxext.py b/libs/pygments/sphinxext.py index a742897c0..c215399ba 100644 --- a/libs/pygments/sphinxext.py +++ b/libs/pygments/sphinxext.py @@ -5,7 +5,7 @@ Sphinx extension to generate automatic documentation of lexers, formatters and filters. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/style.py b/libs/pygments/style.py index 449522c5a..ac36cad7b 100644 --- a/libs/pygments/style.py +++ b/libs/pygments/style.py @@ -4,7 +4,7 @@ Basic style object. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/__init__.py b/libs/pygments/styles/__init__.py index d80f2a399..5d45d8b23 100644 --- a/libs/pygments/styles/__init__.py +++ b/libs/pygments/styles/__init__.py @@ -4,7 +4,7 @@ Contains built-in styles. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/abap.py b/libs/pygments/styles/abap.py index 9438cf6e3..584a4e649 100644 --- a/libs/pygments/styles/abap.py +++ b/libs/pygments/styles/abap.py @@ -4,7 +4,7 @@ ABAP workbench like style. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/algol.py b/libs/pygments/styles/algol.py index e54e4b125..86cafce23 100644 --- a/libs/pygments/styles/algol.py +++ b/libs/pygments/styles/algol.py @@ -25,7 +25,7 @@ [1] `Revised Report on the Algorithmic Language Algol-60 <http://www.masswerk.at/algol60/report.htm>` - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/algol_nu.py b/libs/pygments/styles/algol_nu.py index d786a842f..d28da8f1b 100644 --- a/libs/pygments/styles/algol_nu.py +++ b/libs/pygments/styles/algol_nu.py @@ -25,7 +25,7 @@ [1] `Revised Report on the Algorithmic Language Algol-60 <http://www.masswerk.at/algol60/report.htm>` - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/arduino.py b/libs/pygments/styles/arduino.py index 3aa6d1241..dcb325217 100644 --- a/libs/pygments/styles/arduino.py +++ b/libs/pygments/styles/arduino.py @@ -4,7 +4,7 @@ Arduino® Syntax highlighting style. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/autumn.py b/libs/pygments/styles/autumn.py index 5ba15a78b..8229ad175 100644 --- a/libs/pygments/styles/autumn.py +++ b/libs/pygments/styles/autumn.py @@ -4,7 +4,7 @@ A colorful style, inspired by the terminal highlighting style. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/borland.py b/libs/pygments/styles/borland.py index 6bcc6fb37..bfceaea0f 100644 --- a/libs/pygments/styles/borland.py +++ b/libs/pygments/styles/borland.py @@ -4,7 +4,7 @@ Style similar to the style used in the Borland IDEs. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/bw.py b/libs/pygments/styles/bw.py index aadcf5dfd..30cd78763 100644 --- a/libs/pygments/styles/bw.py +++ b/libs/pygments/styles/bw.py @@ -4,7 +4,7 @@ Simple black/white only style. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/coffee.py b/libs/pygments/styles/coffee.py index bb4055c53..66f504d87 100644 --- a/libs/pygments/styles/coffee.py +++ b/libs/pygments/styles/coffee.py @@ -4,7 +4,7 @@ A warm and cozy theme based off gruvbox - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/colorful.py b/libs/pygments/styles/colorful.py index a9656bdf0..012d943ac 100644 --- a/libs/pygments/styles/colorful.py +++ b/libs/pygments/styles/colorful.py @@ -4,7 +4,7 @@ A colorful style, inspired by CodeRay. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/default.py b/libs/pygments/styles/default.py index a46d8e1e3..30f882e96 100644 --- a/libs/pygments/styles/default.py +++ b/libs/pygments/styles/default.py @@ -4,7 +4,7 @@ The default highlighting style. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/dracula.py b/libs/pygments/styles/dracula.py index 71ecff267..805e6630a 100644 --- a/libs/pygments/styles/dracula.py +++ b/libs/pygments/styles/dracula.py @@ -7,7 +7,7 @@ Based on the Dracula Theme for pygments by Chris Bracco. See https://github.com/dracula/pygments/tree/fee9ed5613d1086bc01b9d0a5a0e9867a009f571 - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/emacs.py b/libs/pygments/styles/emacs.py index 6d67492a8..729486344 100644 --- a/libs/pygments/styles/emacs.py +++ b/libs/pygments/styles/emacs.py @@ -4,7 +4,7 @@ A highlighting style for Pygments, inspired by Emacs. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/friendly.py b/libs/pygments/styles/friendly.py index ba5759b61..e1950f087 100644 --- a/libs/pygments/styles/friendly.py +++ b/libs/pygments/styles/friendly.py @@ -4,7 +4,7 @@ A modern style based on the VIM pyte theme. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/friendly_grayscale.py b/libs/pygments/styles/friendly_grayscale.py index c2acdeb2c..23dfaa59c 100644 --- a/libs/pygments/styles/friendly_grayscale.py +++ b/libs/pygments/styles/friendly_grayscale.py @@ -7,7 +7,7 @@ using the luminosity value calculated by http://www.workwithcolor.com/color-converter-01.htm - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/fruity.py b/libs/pygments/styles/fruity.py index 5d9b67b65..64c8f96eb 100644 --- a/libs/pygments/styles/fruity.py +++ b/libs/pygments/styles/fruity.py @@ -4,7 +4,7 @@ pygments version of my "fruity" vim theme. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/gh_dark.py b/libs/pygments/styles/gh_dark.py index 4bed6d2c7..3bfd30003 100644 --- a/libs/pygments/styles/gh_dark.py +++ b/libs/pygments/styles/gh_dark.py @@ -5,7 +5,7 @@ Github's Dark-Colorscheme based theme for Pygments Colors extracted from https://github.com/primer/primitives - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/gruvbox.py b/libs/pygments/styles/gruvbox.py index 97bd511e3..235639118 100644 --- a/libs/pygments/styles/gruvbox.py +++ b/libs/pygments/styles/gruvbox.py @@ -5,7 +5,7 @@ pygments version of the "gruvbox" vim theme. https://github.com/morhetz/gruvbox - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/igor.py b/libs/pygments/styles/igor.py index 48f76e04e..467b281d0 100644 --- a/libs/pygments/styles/igor.py +++ b/libs/pygments/styles/igor.py @@ -4,7 +4,7 @@ Igor Pro default style. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/inkpot.py b/libs/pygments/styles/inkpot.py index b6f93014f..39902c27c 100644 --- a/libs/pygments/styles/inkpot.py +++ b/libs/pygments/styles/inkpot.py @@ -4,7 +4,7 @@ A highlighting style for Pygments, inspired by the Inkpot theme for VIM. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/lightbulb.py b/libs/pygments/styles/lightbulb.py index 4e5658a9f..8bcd21aaf 100644 --- a/libs/pygments/styles/lightbulb.py +++ b/libs/pygments/styles/lightbulb.py @@ -4,7 +4,7 @@ A minimal dark theme based on the Lightbulb theme for VSCode. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/lilypond.py b/libs/pygments/styles/lilypond.py index 5e46f3dc6..b538798f1 100644 --- a/libs/pygments/styles/lilypond.py +++ b/libs/pygments/styles/lilypond.py @@ -4,7 +4,7 @@ LilyPond-specific style. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/lovelace.py b/libs/pygments/styles/lovelace.py index 1fdb14905..6e255cd66 100644 --- a/libs/pygments/styles/lovelace.py +++ b/libs/pygments/styles/lovelace.py @@ -8,7 +8,7 @@ A desaturated, somewhat subdued style created for the Lovelace interactive learning environment. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/manni.py b/libs/pygments/styles/manni.py index f39810b68..df1822a21 100644 --- a/libs/pygments/styles/manni.py +++ b/libs/pygments/styles/manni.py @@ -7,7 +7,7 @@ This is a port of the style used in the `php port`_ of pygments by Manni. The style is called 'default' there. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/material.py b/libs/pygments/styles/material.py index 720b403b0..633ef380f 100644 --- a/libs/pygments/styles/material.py +++ b/libs/pygments/styles/material.py @@ -6,7 +6,7 @@ https://github.com/material-theme/vsc-material-theme - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/monokai.py b/libs/pygments/styles/monokai.py index fb6b1ebf8..4a6ac0cab 100644 --- a/libs/pygments/styles/monokai.py +++ b/libs/pygments/styles/monokai.py @@ -6,7 +6,7 @@ http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/ - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/murphy.py b/libs/pygments/styles/murphy.py index 0d9128ce9..1299fd5b6 100644 --- a/libs/pygments/styles/murphy.py +++ b/libs/pygments/styles/murphy.py @@ -4,7 +4,7 @@ Murphy's style from CodeRay. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/native.py b/libs/pygments/styles/native.py index d76360c5d..c9f818dd5 100644 --- a/libs/pygments/styles/native.py +++ b/libs/pygments/styles/native.py @@ -4,7 +4,7 @@ pygments version of my "native" vim theme. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/nord.py b/libs/pygments/styles/nord.py index c208335d3..5481e9681 100644 --- a/libs/pygments/styles/nord.py +++ b/libs/pygments/styles/nord.py @@ -5,7 +5,7 @@ pygments version of the "nord" theme by Arctic Ice Studio https://www.nordtheme.com/ - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/onedark.py b/libs/pygments/styles/onedark.py index 335135485..75c4b17a4 100644 --- a/libs/pygments/styles/onedark.py +++ b/libs/pygments/styles/onedark.py @@ -7,7 +7,7 @@ Inspired by one-dark-ui for the code editor Atom (https://atom.io/themes/one-dark-ui). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/paraiso_dark.py b/libs/pygments/styles/paraiso_dark.py index 88968bff8..9983e60d0 100644 --- a/libs/pygments/styles/paraiso_dark.py +++ b/libs/pygments/styles/paraiso_dark.py @@ -8,7 +8,7 @@ Created with Base16 Builder by Chris Kempson (https://github.com/chriskempson/base16-builder). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/paraiso_light.py b/libs/pygments/styles/paraiso_light.py index 35e2c2d13..903ad88d6 100644 --- a/libs/pygments/styles/paraiso_light.py +++ b/libs/pygments/styles/paraiso_light.py @@ -8,7 +8,7 @@ Created with Base16 Builder by Chris Kempson (https://github.com/chriskempson/base16-builder). - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/pastie.py b/libs/pygments/styles/pastie.py index 844f539ef..819968e1a 100644 --- a/libs/pygments/styles/pastie.py +++ b/libs/pygments/styles/pastie.py @@ -6,7 +6,7 @@ .. _pastie: http://pastie.caboo.se/ - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/perldoc.py b/libs/pygments/styles/perldoc.py index 3fe361713..e76697a9a 100644 --- a/libs/pygments/styles/perldoc.py +++ b/libs/pygments/styles/perldoc.py @@ -6,7 +6,7 @@ .. _perldoc: http://perldoc.perl.org/ - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/rainbow_dash.py b/libs/pygments/styles/rainbow_dash.py index aa9e445bc..f98d5ef08 100644 --- a/libs/pygments/styles/rainbow_dash.py +++ b/libs/pygments/styles/rainbow_dash.py @@ -6,7 +6,7 @@ .. _theme: http://sanssecours.github.io/Rainbow-Dash.tmbundle - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/rrt.py b/libs/pygments/styles/rrt.py index 4aa23304f..1e87d2625 100644 --- a/libs/pygments/styles/rrt.py +++ b/libs/pygments/styles/rrt.py @@ -4,12 +4,12 @@ pygments "rrt" theme, based on Zap and Emacs defaults. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ from pygments.style import Style -from pygments.token import Token, Comment, Name, Keyword, String, Number +from pygments.token import Token, Comment, Name, Keyword, String, Number, Operator __all__ = ['RrtStyle'] @@ -32,6 +32,7 @@ class RrtStyle(Style): Name.Variable: '#eedd82', Name.Constant: '#7fffd4', Keyword: '#ff0000', + Operator.Word: '#ff0000', Comment.Preproc: '#e5e5e5', String: '#87ceeb', Keyword.Type: '#ee82ee', diff --git a/libs/pygments/styles/sas.py b/libs/pygments/styles/sas.py index faee0ec10..549a0cc9f 100644 --- a/libs/pygments/styles/sas.py +++ b/libs/pygments/styles/sas.py @@ -6,7 +6,7 @@ meant to be a complete style. It's merely meant to mimic SAS' program editor syntax highlighting. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/solarized.py b/libs/pygments/styles/solarized.py index 214a491c7..c05170245 100644 --- a/libs/pygments/styles/solarized.py +++ b/libs/pygments/styles/solarized.py @@ -7,7 +7,7 @@ A Pygments style for the Solarized themes (licensed under MIT). See: https://github.com/altercation/solarized - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/staroffice.py b/libs/pygments/styles/staroffice.py index dfe2dc0f4..a21aa4157 100644 --- a/libs/pygments/styles/staroffice.py +++ b/libs/pygments/styles/staroffice.py @@ -4,7 +4,7 @@ Style similar to StarOffice style, also in OpenOffice and LibreOffice. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/stata_dark.py b/libs/pygments/styles/stata_dark.py index f6b9decbf..315c5c6ab 100644 --- a/libs/pygments/styles/stata_dark.py +++ b/libs/pygments/styles/stata_dark.py @@ -6,7 +6,7 @@ meant to be a complete style, just for Stata's file formats. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/stata_light.py b/libs/pygments/styles/stata_light.py index a5bd1fe31..95d72e2f3 100644 --- a/libs/pygments/styles/stata_light.py +++ b/libs/pygments/styles/stata_light.py @@ -5,7 +5,7 @@ Light Style inspired by Stata's do-file editor. Note this is not meant to be a complete style, just for Stata's file formats. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/tango.py b/libs/pygments/styles/tango.py index fcbab7b37..986e3ffe6 100644 --- a/libs/pygments/styles/tango.py +++ b/libs/pygments/styles/tango.py @@ -32,7 +32,7 @@ have been chosen to have the same style. Similarly, keywords (Keyword.*), and Operator.Word (and, or, in) have been assigned the same style. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/trac.py b/libs/pygments/styles/trac.py index 44dc8cc2d..2dbffa468 100644 --- a/libs/pygments/styles/trac.py +++ b/libs/pygments/styles/trac.py @@ -4,7 +4,7 @@ Port of the default trac highlighter design. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/vim.py b/libs/pygments/styles/vim.py index 98eda4f20..6b53d0080 100644 --- a/libs/pygments/styles/vim.py +++ b/libs/pygments/styles/vim.py @@ -4,7 +4,7 @@ A highlighting style for Pygments, inspired by vim. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/vs.py b/libs/pygments/styles/vs.py index acfd77fcc..9ac18c781 100644 --- a/libs/pygments/styles/vs.py +++ b/libs/pygments/styles/vs.py @@ -4,7 +4,7 @@ Simple style with MS Visual Studio colors. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/xcode.py b/libs/pygments/styles/xcode.py index acf2293f9..9ef7c8f18 100644 --- a/libs/pygments/styles/xcode.py +++ b/libs/pygments/styles/xcode.py @@ -4,7 +4,7 @@ Style similar to the `Xcode` default theme. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/styles/zenburn.py b/libs/pygments/styles/zenburn.py index e10ccd923..4d0e0567f 100644 --- a/libs/pygments/styles/zenburn.py +++ b/libs/pygments/styles/zenburn.py @@ -7,7 +7,7 @@ See: https://kippura.org/zenburnpage/ https://github.com/jnurmine/Zenburn - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/token.py b/libs/pygments/token.py index f78018a7a..2f3b97e09 100644 --- a/libs/pygments/token.py +++ b/libs/pygments/token.py @@ -4,7 +4,7 @@ Basic token types and the standard tokens. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/unistring.py b/libs/pygments/unistring.py index e2c3523e4..e3bd2e727 100644 --- a/libs/pygments/unistring.py +++ b/libs/pygments/unistring.py @@ -7,7 +7,7 @@ Inspired by chartypes_create.py from the MoinMoin project. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/pygments/util.py b/libs/pygments/util.py index 83cf10492..71c5710ae 100644 --- a/libs/pygments/util.py +++ b/libs/pygments/util.py @@ -4,7 +4,7 @@ Utility functions. - :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS. + :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS. :license: BSD, see LICENSE for details. """ diff --git a/libs/python_engineio-4.11.1.dist-info/INSTALLER b/libs/python_engineio-4.11.2.dist-info/INSTALLER similarity index 100% rename from libs/python_engineio-4.11.1.dist-info/INSTALLER rename to libs/python_engineio-4.11.2.dist-info/INSTALLER diff --git a/libs/python_engineio-4.11.1.dist-info/LICENSE b/libs/python_engineio-4.11.2.dist-info/LICENSE similarity index 100% rename from libs/python_engineio-4.11.1.dist-info/LICENSE rename to libs/python_engineio-4.11.2.dist-info/LICENSE diff --git a/libs/python_engineio-4.11.1.dist-info/METADATA b/libs/python_engineio-4.11.2.dist-info/METADATA similarity index 99% rename from libs/python_engineio-4.11.1.dist-info/METADATA rename to libs/python_engineio-4.11.2.dist-info/METADATA index e5154fc5e..a3824ff02 100644 --- a/libs/python_engineio-4.11.1.dist-info/METADATA +++ b/libs/python_engineio-4.11.2.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-engineio -Version: 4.11.1 +Version: 4.11.2 Summary: Engine.IO server and client for Python Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> Project-URL: Homepage, https://github.com/miguelgrinberg/python-engineio diff --git a/libs/python_engineio-4.11.1.dist-info/RECORD b/libs/python_engineio-4.11.2.dist-info/RECORD similarity index 80% rename from libs/python_engineio-4.11.1.dist-info/RECORD rename to libs/python_engineio-4.11.2.dist-info/RECORD index acc0a00d5..b1e0f8498 100644 --- a/libs/python_engineio-4.11.1.dist-info/RECORD +++ b/libs/python_engineio-4.11.2.dist-info/RECORD @@ -22,12 +22,12 @@ engineio/middleware.py,sha256=5NKBXz-ftuFErUB_V9IDvRHaSOsjhtW-NnuJtquB1nc,3750 engineio/packet.py,sha256=Tejm9U5JcYs5LwZ_n_Xh0PIRv-U_JbHwGEivNXQN4eg,3181 engineio/payload.py,sha256=GIWu0Vnay4WNZlDxHqVgP34tKTBXX58OArJ-mO5zD3E,1539 engineio/server.py,sha256=4_xdtH0tyusigQurwOeDFrHtodthFTOIbOVZ-_ckh5U,22957 -engineio/socket.py,sha256=K5gSY5PTi6rZy4meP9CtTYsNlEU2JmsonYDDHfJVFI4,10280 +engineio/socket.py,sha256=Oaw1E7ZDyOCaS7KV151g1u9rqOf1JJHh5gttEU0cSeA,10342 engineio/static_files.py,sha256=pwez9LQFaSQXMbtI0vLyD6UDiokQ4rNfmRYgVLKOthc,2064 -python_engineio-4.11.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_engineio-4.11.1.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 -python_engineio-4.11.1.dist-info/METADATA,sha256=s084updHO8IDR0sFrXIPk1jcFbr7p5ew-VW-UzAlqkk,2245 -python_engineio-4.11.1.dist-info/RECORD,, -python_engineio-4.11.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -python_engineio-4.11.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 -python_engineio-4.11.1.dist-info/top_level.txt,sha256=u8PmNisCZLwRYcWrNLe9wutQ2tt4zNi8IH362c-HWuA,9 +python_engineio-4.11.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_engineio-4.11.2.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 +python_engineio-4.11.2.dist-info/METADATA,sha256=tImIZtOOZaiNHwHvjddXlIDSqfFM4-0vO5k8KLh6sNc,2245 +python_engineio-4.11.2.dist-info/RECORD,, +python_engineio-4.11.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +python_engineio-4.11.2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +python_engineio-4.11.2.dist-info/top_level.txt,sha256=u8PmNisCZLwRYcWrNLe9wutQ2tt4zNi8IH362c-HWuA,9 diff --git a/libs/python_engineio-4.11.1.dist-info/REQUESTED b/libs/python_engineio-4.11.2.dist-info/REQUESTED similarity index 100% rename from libs/python_engineio-4.11.1.dist-info/REQUESTED rename to libs/python_engineio-4.11.2.dist-info/REQUESTED diff --git a/libs/python_socketio-5.12.0.dist-info/WHEEL b/libs/python_engineio-4.11.2.dist-info/WHEEL similarity index 100% rename from libs/python_socketio-5.12.0.dist-info/WHEEL rename to libs/python_engineio-4.11.2.dist-info/WHEEL diff --git a/libs/python_engineio-4.11.1.dist-info/top_level.txt b/libs/python_engineio-4.11.2.dist-info/top_level.txt similarity index 100% rename from libs/python_engineio-4.11.1.dist-info/top_level.txt rename to libs/python_engineio-4.11.2.dist-info/top_level.txt diff --git a/libs/python_socketio-5.12.0.dist-info/INSTALLER b/libs/python_socketio-5.12.1.dist-info/INSTALLER similarity index 100% rename from libs/python_socketio-5.12.0.dist-info/INSTALLER rename to libs/python_socketio-5.12.1.dist-info/INSTALLER diff --git a/libs/python_socketio-5.12.0.dist-info/LICENSE b/libs/python_socketio-5.12.1.dist-info/LICENSE similarity index 100% rename from libs/python_socketio-5.12.0.dist-info/LICENSE rename to libs/python_socketio-5.12.1.dist-info/LICENSE diff --git a/libs/python_socketio-5.12.0.dist-info/METADATA b/libs/python_socketio-5.12.1.dist-info/METADATA similarity index 99% rename from libs/python_socketio-5.12.0.dist-info/METADATA rename to libs/python_socketio-5.12.1.dist-info/METADATA index aa74b1f04..e8a8c1629 100644 --- a/libs/python_socketio-5.12.0.dist-info/METADATA +++ b/libs/python_socketio-5.12.1.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: python-socketio -Version: 5.12.0 +Version: 5.12.1 Summary: Socket.IO server and client for Python Author-email: Miguel Grinberg <miguel.grinberg@gmail.com> Project-URL: Homepage, https://github.com/miguelgrinberg/python-socketio diff --git a/libs/python_socketio-5.12.0.dist-info/RECORD b/libs/python_socketio-5.12.1.dist-info/RECORD similarity index 80% rename from libs/python_socketio-5.12.0.dist-info/RECORD rename to libs/python_socketio-5.12.1.dist-info/RECORD index e60ba8aa1..6fa92b146 100644 --- a/libs/python_socketio-5.12.0.dist-info/RECORD +++ b/libs/python_socketio-5.12.1.dist-info/RECORD @@ -1,14 +1,14 @@ -python_socketio-5.12.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -python_socketio-5.12.0.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 -python_socketio-5.12.0.dist-info/METADATA,sha256=GUvQG_s5fjr-pCKCBJ2ZH3qpojOoVNng2jAmQwLRB5o,3214 -python_socketio-5.12.0.dist-info/RECORD,, -python_socketio-5.12.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -python_socketio-5.12.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 -python_socketio-5.12.0.dist-info/top_level.txt,sha256=xWd-HVUanhys_VzQQTRTRZBX8W448ayFytYf1Zffivs,9 +python_socketio-5.12.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +python_socketio-5.12.1.dist-info/LICENSE,sha256=yel9Pbwfu82094CLKCzWRtuIev9PUxP-a76NTDFAWpw,1082 +python_socketio-5.12.1.dist-info/METADATA,sha256=2h-FRqPqvswTtXqBiB6c_AJhDU4QI-npJXv-R-oeihA,3214 +python_socketio-5.12.1.dist-info/RECORD,, +python_socketio-5.12.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +python_socketio-5.12.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +python_socketio-5.12.1.dist-info/top_level.txt,sha256=xWd-HVUanhys_VzQQTRTRZBX8W448ayFytYf1Zffivs,9 socketio/__init__.py,sha256=DXxtwPIqHFIqV4BGTgJ86OvCXD6Mth3PxBYhFoJ1_7g,1269 -socketio/admin.py,sha256=SiI8liDczb8scnp8HA2FwGSRNDLfHJbog1RUPN4lfeI,16463 +socketio/admin.py,sha256=pfZ7ZtcZ9-aeaFZkOR4mFhsNPcy9WjZs4_5Os6xc9tA,15966 socketio/asgi.py,sha256=NaJtYhOswVVcwHU0zcMM5H5TrSzXq9K-CAYaeSNTZRY,2192 -socketio/async_admin.py,sha256=Swn4s154pc7QTWCWNEbSM2psAmhEuvgobIn1Vf7Y0y8,16850 +socketio/async_admin.py,sha256=opwgGfkREXb_T25FL7At6hkC3hTfY33bDooyNi1Dgvw,16317 socketio/async_aiopika_manager.py,sha256=DaBUjGRYaNIsOsk2xNjWylUsz2egmTAFFUiQkV6mNmk,5193 socketio/async_client.py,sha256=iVXDsHiU9aohwE2QkSwUOtU8GYivCZRapolJMCWeCPY,27810 socketio/async_manager.py,sha256=dSD2XVtWYwKHDWxAXSu4Xgqw6dXyy9P_6C8rwlguybM,4503 diff --git a/libs/python_socketio-5.12.0.dist-info/REQUESTED b/libs/python_socketio-5.12.1.dist-info/REQUESTED similarity index 100% rename from libs/python_socketio-5.12.0.dist-info/REQUESTED rename to libs/python_socketio-5.12.1.dist-info/REQUESTED diff --git a/libs/Flask_Migrate-4.0.7.dist-info/WHEEL b/libs/python_socketio-5.12.1.dist-info/WHEEL similarity index 65% rename from libs/Flask_Migrate-4.0.7.dist-info/WHEEL rename to libs/python_socketio-5.12.1.dist-info/WHEEL index da25d7b42..9b78c4451 100644 --- a/libs/Flask_Migrate-4.0.7.dist-info/WHEEL +++ b/libs/python_socketio-5.12.1.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: setuptools (75.2.0) +Generator: setuptools (75.3.0) Root-Is-Purelib: true Tag: py3-none-any diff --git a/libs/python_socketio-5.12.0.dist-info/top_level.txt b/libs/python_socketio-5.12.1.dist-info/top_level.txt similarity index 100% rename from libs/python_socketio-5.12.0.dist-info/top_level.txt rename to libs/python_socketio-5.12.1.dist-info/top_level.txt diff --git a/libs/socketio/admin.py b/libs/socketio/admin.py index 58c8aff99..12b905ea6 100644 --- a/libs/socketio/admin.py +++ b/libs/socketio/admin.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timezone import functools import os import socket @@ -77,13 +77,9 @@ def instrument(self): # track socket connection times self.sio.manager._timestamps = {} - # report socket.io connections - self.sio.manager.__connect = self.sio.manager.connect - self.sio.manager.connect = self._connect - - # report socket.io disconnection - self.sio.manager.__disconnect = self.sio.manager.disconnect - self.sio.manager.disconnect = self._disconnect + # report socket.io connections, disconnections and received events + self.sio.__trigger_event = self.sio._trigger_event + self.sio._trigger_event = self._trigger_event # report join rooms self.sio.manager.__basic_enter_room = \ @@ -99,10 +95,6 @@ def instrument(self): self.sio.manager.__emit = self.sio.manager.emit self.sio.manager.emit = self._emit - # report receive events - self.sio.__handle_event_internal = self.sio._handle_event_internal - self.sio._handle_event_internal = self._handle_event_internal - # report engine.io connections self.sio.eio.on('connect', self._handle_eio_connect) self.sio.eio.on('disconnect', self._handle_eio_disconnect) @@ -128,14 +120,12 @@ def instrument(self): def uninstrument(self): # pragma: no cover if self.mode == 'development': - self.sio.manager.connect = self.sio.manager.__connect - self.sio.manager.disconnect = self.sio.manager.__disconnect + self.sio._trigger_event = self.sio.__trigger_event self.sio.manager.basic_enter_room = \ self.sio.manager.__basic_enter_room self.sio.manager.basic_leave_room = \ self.sio.manager.__basic_leave_room self.sio.manager.emit = self.sio.manager.__emit - self.sio._handle_event_internal = self.sio.__handle_event_internal self.sio.eio._ok = self.sio.eio.__ok from engineio.socket import Socket @@ -205,26 +195,34 @@ def shutdown(self): self.stop_stats_event.set() self.stats_task.join() - def _connect(self, eio_sid, namespace): - sid = self.sio.manager.__connect(eio_sid, namespace) + def _trigger_event(self, event, namespace, *args): t = time.time() - self.sio.manager._timestamps[sid] = t - serialized_socket = self.serialize_socket(sid, namespace, eio_sid) - self.sio.emit('socket_connected', ( - serialized_socket, - datetime.utcfromtimestamp(t).isoformat() + 'Z', - ), namespace=self.admin_namespace) - return sid - - def _disconnect(self, sid, namespace, **kwargs): - del self.sio.manager._timestamps[sid] - self.sio.emit('socket_disconnected', ( - namespace, - sid, - 'N/A', - datetime.utcnow().isoformat() + 'Z', - ), namespace=self.admin_namespace) - return self.sio.manager.__disconnect(sid, namespace, **kwargs) + sid = args[0] + if event == 'connect': + eio_sid = self.sio.manager.eio_sid_from_sid(sid, namespace) + self.sio.manager._timestamps[sid] = t + serialized_socket = self.serialize_socket(sid, namespace, eio_sid) + self.sio.emit('socket_connected', ( + serialized_socket, + datetime.fromtimestamp(t, timezone.utc).isoformat(), + ), namespace=self.admin_namespace) + elif event == 'disconnect': + del self.sio.manager._timestamps[sid] + reason = args[1] + self.sio.emit('socket_disconnected', ( + namespace, + sid, + reason, + datetime.fromtimestamp(t, timezone.utc).isoformat(), + ), namespace=self.admin_namespace) + else: + self.sio.emit('event_received', ( + namespace, + sid, + (event, *args[1:]), + datetime.fromtimestamp(t, timezone.utc).isoformat(), + ), namespace=self.admin_namespace) + return self.sio.__trigger_event(event, namespace, *args) def _check_for_upgrade(self, eio_sid, sid, namespace): # pragma: no cover for _ in range(5): @@ -248,7 +246,7 @@ def _basic_enter_room(self, sid, namespace, room, eio_sid=None): namespace, room, sid, - datetime.utcnow().isoformat() + 'Z', + datetime.now(timezone.utc).isoformat(), ), namespace=self.admin_namespace) return ret @@ -258,7 +256,7 @@ def _basic_leave_room(self, sid, namespace, room): namespace, room, sid, - datetime.utcnow().isoformat() + 'Z', + datetime.now(timezone.utc).isoformat(), ), namespace=self.admin_namespace) return self.sio.manager.__basic_leave_room(sid, namespace, room) @@ -269,7 +267,7 @@ def _emit(self, event, data, namespace, room=None, skip_sid=None, **kwargs) if namespace != self.admin_namespace: event_data = [event] + list(data) if isinstance(data, tuple) \ - else [data] + else [event, data] if not isinstance(skip_sid, list): # pragma: no branch skip_sid = [skip_sid] for sid, _ in self.sio.manager.get_participants(namespace, room): @@ -278,22 +276,10 @@ def _emit(self, event, data, namespace, room=None, skip_sid=None, namespace, sid, event_data, - datetime.utcnow().isoformat() + 'Z', + datetime.now(timezone.utc).isoformat(), ), namespace=self.admin_namespace) return ret - def _handle_event_internal(self, server, sid, eio_sid, data, namespace, - id): - ret = self.sio.__handle_event_internal(server, sid, eio_sid, data, - namespace, id) - self.sio.emit('event_received', ( - namespace, - sid, - data, - datetime.utcnow().isoformat() + 'Z', - ), namespace=self.admin_namespace) - return ret - def _handle_eio_connect(self, eio_sid, environ): if self.stop_stats_event is None: self.stop_stats_event = self.sio.eio.create_event() @@ -303,9 +289,9 @@ def _handle_eio_connect(self, eio_sid, environ): self.event_buffer.push('rawConnection') return self.sio._handle_eio_connect(eio_sid, environ) - def _handle_eio_disconnect(self, eio_sid): + def _handle_eio_disconnect(self, eio_sid, reason): self.event_buffer.push('rawDisconnection') - return self.sio._handle_eio_disconnect(eio_sid) + return self.sio._handle_eio_disconnect(eio_sid, reason) def _eio_http_response(self, packets=None, headers=None, jsonp_index=None): ret = self.sio.eio.__ok(packets=packets, headers=headers, @@ -349,7 +335,7 @@ def _eio_send_ping(socket, self): # pragma: no cover eio_sid) self.sio.emit('socket_connected', ( serialized_socket, - datetime.utcfromtimestamp(t).isoformat() + 'Z', + datetime.fromtimestamp(t, timezone.utc).isoformat(), ), namespace=self.admin_namespace) return socket.__send_ping() @@ -398,7 +384,7 @@ def serialize_socket(self, sid, namespace, eio_sid=None): 'secure': environ.get('wsgi.url_scheme', '') == 'https', 'url': environ.get('PATH_INFO', ''), 'issued': tm * 1000, - 'time': datetime.utcfromtimestamp(tm).isoformat() + 'Z' + 'time': datetime.fromtimestamp(tm, timezone.utc).isoformat() if tm else '', }, 'rooms': self.sio.manager.get_rooms(sid, namespace), diff --git a/libs/socketio/async_admin.py b/libs/socketio/async_admin.py index 162c56607..b052d8fe2 100644 --- a/libs/socketio/async_admin.py +++ b/libs/socketio/async_admin.py @@ -1,5 +1,5 @@ import asyncio -from datetime import datetime +from datetime import datetime, timezone import functools import os import socket @@ -58,13 +58,9 @@ def instrument(self): # track socket connection times self.sio.manager._timestamps = {} - # report socket.io connections - self.sio.manager.__connect = self.sio.manager.connect - self.sio.manager.connect = self._connect - - # report socket.io disconnection - self.sio.manager.__disconnect = self.sio.manager.disconnect - self.sio.manager.disconnect = self._disconnect + # report socket.io connections, disconnections and received events + self.sio.__trigger_event = self.sio._trigger_event + self.sio._trigger_event = self._trigger_event # report join rooms self.sio.manager.__basic_enter_room = \ @@ -80,10 +76,6 @@ def instrument(self): self.sio.manager.__emit = self.sio.manager.emit self.sio.manager.emit = self._emit - # report receive events - self.sio.__handle_event_internal = self.sio._handle_event_internal - self.sio._handle_event_internal = self._handle_event_internal - # report engine.io connections self.sio.eio.on('connect', self._handle_eio_connect) self.sio.eio.on('disconnect', self._handle_eio_disconnect) @@ -109,14 +101,12 @@ def instrument(self): def uninstrument(self): # pragma: no cover if self.mode == 'development': - self.sio.manager.connect = self.sio.manager.__connect - self.sio.manager.disconnect = self.sio.manager.__disconnect + self.sio._trigger_event = self.sio.__trigger_event self.sio.manager.basic_enter_room = \ self.sio.manager.__basic_enter_room self.sio.manager.basic_leave_room = \ self.sio.manager.__basic_leave_room self.sio.manager.emit = self.sio.manager.__emit - self.sio._handle_event_internal = self.sio.__handle_event_internal self.sio.eio._ok = self.sio.eio.__ok from engineio.async_socket import AsyncSocket @@ -193,26 +183,34 @@ async def shutdown(self): self.stop_stats_event.set() await asyncio.gather(self.stats_task) - async def _connect(self, eio_sid, namespace): - sid = await self.sio.manager.__connect(eio_sid, namespace) + async def _trigger_event(self, event, namespace, *args): t = time.time() - self.sio.manager._timestamps[sid] = t - serialized_socket = self.serialize_socket(sid, namespace, eio_sid) - await self.sio.emit('socket_connected', ( - serialized_socket, - datetime.utcfromtimestamp(t).isoformat() + 'Z', - ), namespace=self.admin_namespace) - return sid - - async def _disconnect(self, sid, namespace, **kwargs): - del self.sio.manager._timestamps[sid] - await self.sio.emit('socket_disconnected', ( - namespace, - sid, - 'N/A', - datetime.utcnow().isoformat() + 'Z', - ), namespace=self.admin_namespace) - return await self.sio.manager.__disconnect(sid, namespace, **kwargs) + sid = args[0] + if event == 'connect': + eio_sid = self.sio.manager.eio_sid_from_sid(sid, namespace) + self.sio.manager._timestamps[sid] = t + serialized_socket = self.serialize_socket(sid, namespace, eio_sid) + await self.sio.emit('socket_connected', ( + serialized_socket, + datetime.fromtimestamp(t, timezone.utc).isoformat(), + ), namespace=self.admin_namespace) + elif event == 'disconnect': + del self.sio.manager._timestamps[sid] + reason = args[1] + await self.sio.emit('socket_disconnected', ( + namespace, + sid, + reason, + datetime.fromtimestamp(t, timezone.utc).isoformat(), + ), namespace=self.admin_namespace) + else: + await self.sio.emit('event_received', ( + namespace, + sid, + (event, *args[1:]), + datetime.fromtimestamp(t, timezone.utc).isoformat(), + ), namespace=self.admin_namespace) + return await self.sio.__trigger_event(event, namespace, *args) async def _check_for_upgrade(self, eio_sid, sid, namespace): # pragma: no cover @@ -237,7 +235,7 @@ def _basic_enter_room(self, sid, namespace, room, eio_sid=None): namespace, room, sid, - datetime.utcnow().isoformat() + 'Z', + datetime.now(timezone.utc).isoformat(), ))) return ret @@ -247,7 +245,7 @@ def _basic_leave_room(self, sid, namespace, room): namespace, room, sid, - datetime.utcnow().isoformat() + 'Z', + datetime.now(timezone.utc).isoformat(), ))) return self.sio.manager.__basic_leave_room(sid, namespace, room) @@ -258,7 +256,7 @@ async def _emit(self, event, data, namespace, room=None, skip_sid=None, callback=callback, **kwargs) if namespace != self.admin_namespace: event_data = [event] + list(data) if isinstance(data, tuple) \ - else [data] + else [event, data] if not isinstance(skip_sid, list): # pragma: no branch skip_sid = [skip_sid] for sid, _ in self.sio.manager.get_participants(namespace, room): @@ -267,22 +265,10 @@ async def _emit(self, event, data, namespace, room=None, skip_sid=None, namespace, sid, event_data, - datetime.utcnow().isoformat() + 'Z', + datetime.now(timezone.utc).isoformat(), ), namespace=self.admin_namespace) return ret - async def _handle_event_internal(self, server, sid, eio_sid, data, - namespace, id): - ret = await self.sio.__handle_event_internal(server, sid, eio_sid, - data, namespace, id) - await self.sio.emit('event_received', ( - namespace, - sid, - data, - datetime.utcnow().isoformat() + 'Z', - ), namespace=self.admin_namespace) - return ret - async def _handle_eio_connect(self, eio_sid, environ): if self.stop_stats_event is None: self.stop_stats_event = self.sio.eio.create_event() @@ -292,9 +278,9 @@ async def _handle_eio_connect(self, eio_sid, environ): self.event_buffer.push('rawConnection') return await self.sio._handle_eio_connect(eio_sid, environ) - async def _handle_eio_disconnect(self, eio_sid): + async def _handle_eio_disconnect(self, eio_sid, reason): self.event_buffer.push('rawDisconnection') - return await self.sio._handle_eio_disconnect(eio_sid) + return await self.sio._handle_eio_disconnect(eio_sid, reason) def _eio_http_response(self, packets=None, headers=None, jsonp_index=None): ret = self.sio.eio.__ok(packets=packets, headers=headers, @@ -338,7 +324,7 @@ async def _eio_send_ping(socket, self): # pragma: no cover eio_sid) await self.sio.emit('socket_connected', ( serialized_socket, - datetime.utcfromtimestamp(t).isoformat() + 'Z', + datetime.fromtimestamp(t, timezone.utc).isoformat(), ), namespace=self.admin_namespace) return await socket.__send_ping() @@ -391,7 +377,7 @@ def serialize_socket(self, sid, namespace, eio_sid=None): 'secure': environ.get('wsgi.url_scheme', '') == 'https', 'url': environ.get('PATH_INFO', ''), 'issued': tm * 1000, - 'time': datetime.utcfromtimestamp(tm).isoformat() + 'Z' + 'time': datetime.fromtimestamp(tm, timezone.utc).isoformat() if tm else '', }, 'rooms': self.sio.manager.get_rooms(sid, namespace), diff --git a/libs/sqlalchemy/__init__.py b/libs/sqlalchemy/__init__.py index f94278fe9..c74afd901 100644 --- a/libs/sqlalchemy/__init__.py +++ b/libs/sqlalchemy/__init__.py @@ -1,5 +1,5 @@ # __init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -269,7 +269,7 @@ from .types import VARBINARY as VARBINARY from .types import VARCHAR as VARCHAR -__version__ = "2.0.36" +__version__ = "2.0.37" def __go(lcls: Any) -> None: diff --git a/libs/sqlalchemy/connectors/__init__.py b/libs/sqlalchemy/connectors/__init__.py index f1cae0b3c..43cd1035c 100644 --- a/libs/sqlalchemy/connectors/__init__.py +++ b/libs/sqlalchemy/connectors/__init__.py @@ -1,5 +1,5 @@ # connectors/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/connectors/aioodbc.py b/libs/sqlalchemy/connectors/aioodbc.py index 3b5c3b497..39b2a8a23 100644 --- a/libs/sqlalchemy/connectors/aioodbc.py +++ b/libs/sqlalchemy/connectors/aioodbc.py @@ -1,5 +1,5 @@ # connectors/aioodbc.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/connectors/asyncio.py b/libs/sqlalchemy/connectors/asyncio.py index 9b19bef78..c4f0d7154 100644 --- a/libs/sqlalchemy/connectors/asyncio.py +++ b/libs/sqlalchemy/connectors/asyncio.py @@ -1,5 +1,5 @@ # connectors/asyncio.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/connectors/pyodbc.py b/libs/sqlalchemy/connectors/pyodbc.py index f204d80a8..92b7c3a41 100644 --- a/libs/sqlalchemy/connectors/pyodbc.py +++ b/libs/sqlalchemy/connectors/pyodbc.py @@ -1,5 +1,5 @@ # connectors/pyodbc.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/cyextension/__init__.py b/libs/sqlalchemy/cyextension/__init__.py index 88a4d9039..cb8dc2c6e 100644 --- a/libs/sqlalchemy/cyextension/__init__.py +++ b/libs/sqlalchemy/cyextension/__init__.py @@ -1,5 +1,5 @@ # cyextension/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/__init__.py b/libs/sqlalchemy/dialects/__init__.py index 7d5cc1c9c..31ce6d64b 100644 --- a/libs/sqlalchemy/dialects/__init__.py +++ b/libs/sqlalchemy/dialects/__init__.py @@ -1,5 +1,5 @@ # dialects/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/_typing.py b/libs/sqlalchemy/dialects/_typing.py index 9ee6e4bca..4dd40d722 100644 --- a/libs/sqlalchemy/dialects/_typing.py +++ b/libs/sqlalchemy/dialects/_typing.py @@ -1,5 +1,5 @@ # dialects/_typing.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -12,14 +12,19 @@ from typing import Optional from typing import Union -from ..sql._typing import _DDLColumnArgument -from ..sql.elements import DQLDMLClauseElement +from ..sql import roles +from ..sql.base import ColumnCollection +from ..sql.schema import Column from ..sql.schema import ColumnCollectionConstraint from ..sql.schema import Index _OnConflictConstraintT = Union[str, ColumnCollectionConstraint, Index, None] -_OnConflictIndexElementsT = Optional[Iterable[_DDLColumnArgument]] -_OnConflictIndexWhereT = Optional[DQLDMLClauseElement] -_OnConflictSetT = Optional[Mapping[Any, Any]] -_OnConflictWhereT = Union[DQLDMLClauseElement, str, None] +_OnConflictIndexElementsT = Optional[ + Iterable[Union[Column[Any], str, roles.DDLConstraintColumnRole]] +] +_OnConflictIndexWhereT = Optional[roles.WhereHavingRole] +_OnConflictSetT = Optional[ + Union[Mapping[Any, Any], ColumnCollection[Any, Any]] +] +_OnConflictWhereT = Optional[roles.WhereHavingRole] diff --git a/libs/sqlalchemy/dialects/mssql/__init__.py b/libs/sqlalchemy/dialects/mssql/__init__.py index 19ab7c422..20140fddd 100644 --- a/libs/sqlalchemy/dialects/mssql/__init__.py +++ b/libs/sqlalchemy/dialects/mssql/__init__.py @@ -1,5 +1,5 @@ # dialects/mssql/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mssql/aioodbc.py b/libs/sqlalchemy/dialects/mssql/aioodbc.py index 65945d975..522ad1d6b 100644 --- a/libs/sqlalchemy/dialects/mssql/aioodbc.py +++ b/libs/sqlalchemy/dialects/mssql/aioodbc.py @@ -1,5 +1,5 @@ # dialects/mssql/aioodbc.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -32,13 +32,12 @@ styles are otherwise equivalent to those documented in the pyodbc section:: from sqlalchemy.ext.asyncio import create_async_engine + engine = create_async_engine( "mssql+aioodbc://scott:tiger@mssql2017:1433/test?" "driver=ODBC+Driver+18+for+SQL+Server&TrustServerCertificate=yes" ) - - """ from __future__ import annotations diff --git a/libs/sqlalchemy/dialects/mssql/base.py b/libs/sqlalchemy/dialects/mssql/base.py index 07dbe401d..916809e76 100644 --- a/libs/sqlalchemy/dialects/mssql/base.py +++ b/libs/sqlalchemy/dialects/mssql/base.py @@ -1,5 +1,5 @@ # dialects/mssql/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -39,9 +39,12 @@ from sqlalchemy import Table, MetaData, Column, Integer m = MetaData() - t = Table('t', m, - Column('id', Integer, primary_key=True), - Column('x', Integer)) + t = Table( + "t", + m, + Column("id", Integer, primary_key=True), + Column("x", Integer), + ) m.create_all(engine) The above example will generate DDL as: @@ -59,9 +62,12 @@ on the first integer primary key column:: m = MetaData() - t = Table('t', m, - Column('id', Integer, primary_key=True, autoincrement=False), - Column('x', Integer)) + t = Table( + "t", + m, + Column("id", Integer, primary_key=True, autoincrement=False), + Column("x", Integer), + ) m.create_all(engine) To add the ``IDENTITY`` keyword to a non-primary key column, specify @@ -71,9 +77,12 @@ is set to ``False`` on any integer primary key column:: m = MetaData() - t = Table('t', m, - Column('id', Integer, primary_key=True, autoincrement=False), - Column('x', Integer, autoincrement=True)) + t = Table( + "t", + m, + Column("id", Integer, primary_key=True, autoincrement=False), + Column("x", Integer, autoincrement=True), + ) m.create_all(engine) .. versionchanged:: 1.4 Added :class:`_schema.Identity` construct @@ -136,14 +145,12 @@ from sqlalchemy import Table, Integer, Column, Identity test = Table( - 'test', metadata, + "test", + metadata, Column( - 'id', - Integer, - primary_key=True, - Identity(start=100, increment=10) + "id", Integer, primary_key=True, Identity(start=100, increment=10) ), - Column('name', String(20)) + Column("name", String(20)), ) The CREATE TABLE for the above :class:`_schema.Table` object would be: @@ -153,7 +160,7 @@ CREATE TABLE test ( id INTEGER NOT NULL IDENTITY(100,10) PRIMARY KEY, name VARCHAR(20) NULL, - ) + ) .. note:: @@ -186,6 +193,7 @@ Base = declarative_base() + class TestTable(Base): __tablename__ = "test" id = Column( @@ -211,8 +219,9 @@ class TestTable(Base): from sqlalchemy import TypeDecorator + class NumericAsInteger(TypeDecorator): - '''normalize floating point return values into ints''' + "normalize floating point return values into ints" impl = Numeric(10, 0, asdecimal=False) cache_ok = True @@ -222,6 +231,7 @@ def process_result_value(self, value, dialect): value = int(value) return value + class TestTable(Base): __tablename__ = "test" id = Column( @@ -270,11 +280,11 @@ class TestTable(Base): fetched in order to receive the value. Given a table as:: t = Table( - 't', + "t", metadata, - Column('id', Integer, primary_key=True), - Column('x', Integer), - implicit_returning=False + Column("id", Integer, primary_key=True), + Column("x", Integer), + implicit_returning=False, ) an INSERT will look like: @@ -300,12 +310,13 @@ class TestTable(Base): execution. Given this example:: m = MetaData() - t = Table('t', m, Column('id', Integer, primary_key=True), - Column('x', Integer)) + t = Table( + "t", m, Column("id", Integer, primary_key=True), Column("x", Integer) + ) m.create_all(engine) with engine.begin() as conn: - conn.execute(t.insert(), {'id': 1, 'x':1}, {'id':2, 'x':2}) + conn.execute(t.insert(), {"id": 1, "x": 1}, {"id": 2, "x": 2}) The above column will be created with IDENTITY, however the INSERT statement we emit is specifying explicit values. In the echo output we can see @@ -341,7 +352,11 @@ class TestTable(Base): >>> from sqlalchemy import Sequence >>> from sqlalchemy.schema import CreateSequence >>> from sqlalchemy.dialects import mssql - >>> print(CreateSequence(Sequence("my_seq", start=1)).compile(dialect=mssql.dialect())) + >>> print( + ... CreateSequence(Sequence("my_seq", start=1)).compile( + ... dialect=mssql.dialect() + ... ) + ... ) {printsql}CREATE SEQUENCE my_seq START WITH 1 For integer primary key generation, SQL Server's ``IDENTITY`` construct should @@ -375,12 +390,12 @@ class TestTable(Base): To build a SQL Server VARCHAR or NVARCHAR with MAX length, use None:: my_table = Table( - 'my_table', metadata, - Column('my_data', VARCHAR(None)), - Column('my_n_data', NVARCHAR(None)) + "my_table", + metadata, + Column("my_data", VARCHAR(None)), + Column("my_n_data", NVARCHAR(None)), ) - Collation Support ----------------- @@ -388,10 +403,13 @@ class TestTable(Base): specified by the string argument "collation":: from sqlalchemy import VARCHAR - Column('login', VARCHAR(32, collation='Latin1_General_CI_AS')) + + Column("login", VARCHAR(32, collation="Latin1_General_CI_AS")) When such a column is associated with a :class:`_schema.Table`, the -CREATE TABLE statement for this column will yield:: +CREATE TABLE statement for this column will yield: + +.. sourcecode:: sql login VARCHAR(32) COLLATE Latin1_General_CI_AS NULL @@ -411,7 +429,9 @@ class TestTable(Base): select(some_table).limit(5) -will render similarly to:: +will render similarly to: + +.. sourcecode:: sql SELECT TOP 5 col1, col2.. FROM table @@ -421,7 +441,9 @@ class TestTable(Base): select(some_table).order_by(some_table.c.col3).limit(5).offset(10) -will render similarly to:: +will render similarly to: + +.. sourcecode:: sql SELECT anon_1.col1, anon_1.col2 FROM (SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY col3) AS @@ -474,16 +496,13 @@ class TestTable(Base): To set isolation level using :func:`_sa.create_engine`:: engine = create_engine( - "mssql+pyodbc://scott:tiger@ms_2008", - isolation_level="REPEATABLE READ" + "mssql+pyodbc://scott:tiger@ms_2008", isolation_level="REPEATABLE READ" ) To set using per-connection execution options:: connection = engine.connect() - connection = connection.execution_options( - isolation_level="READ COMMITTED" - ) + connection = connection.execution_options(isolation_level="READ COMMITTED") Valid values for ``isolation_level`` include: @@ -533,7 +552,6 @@ class TestTable(Base): mssql_engine = create_engine( "mssql+pyodbc://scott:tiger^5HHH@mssql2017:1433/test?driver=ODBC+Driver+17+for+SQL+Server", - # disable default reset-on-return scheme pool_reset_on_return=None, ) @@ -562,13 +580,17 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): ----------- MSSQL has support for three levels of column nullability. The default nullability allows nulls and is explicit in the CREATE TABLE -construct:: +construct: + +.. sourcecode:: sql name VARCHAR(20) NULL If ``nullable=None`` is specified then no specification is made. In other words the database's configured default is used. This will -render:: +render: + +.. sourcecode:: sql name VARCHAR(20) @@ -624,8 +646,9 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): * The flag can be set to either ``True`` or ``False`` when the dialect is created, typically via :func:`_sa.create_engine`:: - eng = create_engine("mssql+pymssql://user:pass@host/db", - deprecate_large_types=True) + eng = create_engine( + "mssql+pymssql://user:pass@host/db", deprecate_large_types=True + ) * Complete control over whether the "old" or "new" types are rendered is available in all SQLAlchemy versions by using the UPPERCASE type objects @@ -647,9 +670,10 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): :class:`_schema.Table`:: Table( - "some_table", metadata, + "some_table", + metadata, Column("q", String(50)), - schema="mydatabase.dbo" + schema="mydatabase.dbo", ) When performing operations such as table or component reflection, a schema @@ -661,9 +685,10 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): special characters. Given an argument as below:: Table( - "some_table", metadata, + "some_table", + metadata, Column("q", String(50)), - schema="MyDataBase.dbo" + schema="MyDataBase.dbo", ) The above schema would be rendered as ``[MyDataBase].dbo``, and also in @@ -676,21 +701,22 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): "database" will be None:: Table( - "some_table", metadata, + "some_table", + metadata, Column("q", String(50)), - schema="[MyDataBase.dbo]" + schema="[MyDataBase.dbo]", ) To individually specify both database and owner name with special characters or embedded dots, use two sets of brackets:: Table( - "some_table", metadata, + "some_table", + metadata, Column("q", String(50)), - schema="[MyDataBase.Period].[MyOwner.Dot]" + schema="[MyDataBase.Period].[MyOwner.Dot]", ) - .. versionchanged:: 1.2 the SQL Server dialect now treats brackets as identifier delimiters splitting the schema into separate database and owner tokens, to allow dots within either name itself. @@ -705,10 +731,11 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): SELECT statement; given a table:: account_table = Table( - 'account', metadata, - Column('id', Integer, primary_key=True), - Column('info', String(100)), - schema="customer_schema" + "account", + metadata, + Column("id", Integer, primary_key=True), + Column("info", String(100)), + schema="customer_schema", ) this legacy mode of rendering would assume that "customer_schema.account" @@ -751,37 +778,55 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): To generate a clustered primary key use:: - Table('my_table', metadata, - Column('x', ...), - Column('y', ...), - PrimaryKeyConstraint("x", "y", mssql_clustered=True)) + Table( + "my_table", + metadata, + Column("x", ...), + Column("y", ...), + PrimaryKeyConstraint("x", "y", mssql_clustered=True), + ) -which will render the table, for example, as:: +which will render the table, for example, as: - CREATE TABLE my_table (x INTEGER NOT NULL, y INTEGER NOT NULL, - PRIMARY KEY CLUSTERED (x, y)) +.. sourcecode:: sql + + CREATE TABLE my_table ( + x INTEGER NOT NULL, + y INTEGER NOT NULL, + PRIMARY KEY CLUSTERED (x, y) + ) Similarly, we can generate a clustered unique constraint using:: - Table('my_table', metadata, - Column('x', ...), - Column('y', ...), - PrimaryKeyConstraint("x"), - UniqueConstraint("y", mssql_clustered=True), - ) + Table( + "my_table", + metadata, + Column("x", ...), + Column("y", ...), + PrimaryKeyConstraint("x"), + UniqueConstraint("y", mssql_clustered=True), + ) To explicitly request a non-clustered primary key (for example, when a separate clustered index is desired), use:: - Table('my_table', metadata, - Column('x', ...), - Column('y', ...), - PrimaryKeyConstraint("x", "y", mssql_clustered=False)) + Table( + "my_table", + metadata, + Column("x", ...), + Column("y", ...), + PrimaryKeyConstraint("x", "y", mssql_clustered=False), + ) -which will render the table, for example, as:: +which will render the table, for example, as: + +.. sourcecode:: sql - CREATE TABLE my_table (x INTEGER NOT NULL, y INTEGER NOT NULL, - PRIMARY KEY NONCLUSTERED (x, y)) + CREATE TABLE my_table ( + x INTEGER NOT NULL, + y INTEGER NOT NULL, + PRIMARY KEY NONCLUSTERED (x, y) + ) Columnstore Index Support ------------------------- @@ -819,7 +864,7 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): The ``mssql_include`` option renders INCLUDE(colname) for the given string names:: - Index("my_index", table.c.x, mssql_include=['y']) + Index("my_index", table.c.x, mssql_include=["y"]) would render the index as ``CREATE INDEX my_index ON table (x) INCLUDE (y)`` @@ -874,18 +919,19 @@ def _reset_mssql(dbapi_connection, connection_record, reset_state): specify ``implicit_returning=False`` for each :class:`_schema.Table` which has triggers:: - Table('mytable', metadata, - Column('id', Integer, primary_key=True), + Table( + "mytable", + metadata, + Column("id", Integer, primary_key=True), # ..., - implicit_returning=False + implicit_returning=False, ) Declarative form:: class MyClass(Base): # ... - __table_args__ = {'implicit_returning':False} - + __table_args__ = {"implicit_returning": False} .. _mssql_rowcount_versioning: @@ -919,7 +965,9 @@ class MyClass(Base): applications to have long held locks and frequent deadlocks. Enabling snapshot isolation for the database as a whole is recommended for modern levels of concurrency support. This is accomplished via the -following ALTER DATABASE commands executed at the SQL prompt:: +following ALTER DATABASE commands executed at the SQL prompt: + +.. sourcecode:: sql ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON diff --git a/libs/sqlalchemy/dialects/mssql/information_schema.py b/libs/sqlalchemy/dialects/mssql/information_schema.py index 0c5f2372d..b60bb158b 100644 --- a/libs/sqlalchemy/dialects/mssql/information_schema.py +++ b/libs/sqlalchemy/dialects/mssql/information_schema.py @@ -1,5 +1,5 @@ # dialects/mssql/information_schema.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mssql/json.py b/libs/sqlalchemy/dialects/mssql/json.py index 18bea09d0..a2d3ce814 100644 --- a/libs/sqlalchemy/dialects/mssql/json.py +++ b/libs/sqlalchemy/dialects/mssql/json.py @@ -1,5 +1,5 @@ # dialects/mssql/json.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -54,9 +54,7 @@ class JSON(sqltypes.JSON): dictionary or list, the :meth:`_types.JSON.Comparator.as_json` accessor should be used:: - stmt = select( - data_table.c.data["some key"].as_json() - ).where( + stmt = select(data_table.c.data["some key"].as_json()).where( data_table.c.data["some key"].as_json() == {"sub": "structure"} ) @@ -67,9 +65,7 @@ class JSON(sqltypes.JSON): :meth:`_types.JSON.Comparator.as_integer`, :meth:`_types.JSON.Comparator.as_float`:: - stmt = select( - data_table.c.data["some key"].as_string() - ).where( + stmt = select(data_table.c.data["some key"].as_string()).where( data_table.c.data["some key"].as_string() == "some string" ) diff --git a/libs/sqlalchemy/dialects/mssql/provision.py b/libs/sqlalchemy/dialects/mssql/provision.py index 1c684b1df..10165856e 100644 --- a/libs/sqlalchemy/dialects/mssql/provision.py +++ b/libs/sqlalchemy/dialects/mssql/provision.py @@ -1,5 +1,5 @@ # dialects/mssql/provision.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mssql/pymssql.py b/libs/sqlalchemy/dialects/mssql/pymssql.py index c4207987b..301a98eb4 100644 --- a/libs/sqlalchemy/dialects/mssql/pymssql.py +++ b/libs/sqlalchemy/dialects/mssql/pymssql.py @@ -1,5 +1,5 @@ # dialects/mssql/pymssql.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mssql/pyodbc.py b/libs/sqlalchemy/dialects/mssql/pyodbc.py index 76ea046de..cbf0adbfe 100644 --- a/libs/sqlalchemy/dialects/mssql/pyodbc.py +++ b/libs/sqlalchemy/dialects/mssql/pyodbc.py @@ -1,5 +1,5 @@ # dialects/mssql/pyodbc.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -30,7 +30,9 @@ engine = create_engine("mssql+pyodbc://scott:tiger@some_dsn") -Which above, will pass the following connection string to PyODBC:: +Which above, will pass the following connection string to PyODBC: + +.. sourcecode:: text DSN=some_dsn;UID=scott;PWD=tiger @@ -49,7 +51,9 @@ query parameters of the URL. As these names usually have spaces in them, the name must be URL encoded which means using plus signs for spaces:: - engine = create_engine("mssql+pyodbc://scott:tiger@myhost:port/databasename?driver=ODBC+Driver+17+for+SQL+Server") + engine = create_engine( + "mssql+pyodbc://scott:tiger@myhost:port/databasename?driver=ODBC+Driver+17+for+SQL+Server" + ) The ``driver`` keyword is significant to the pyodbc dialect and must be specified in lowercase. @@ -69,6 +73,7 @@ The equivalent URL can be constructed using :class:`_sa.engine.URL`:: from sqlalchemy.engine import URL + connection_url = URL.create( "mssql+pyodbc", username="scott", @@ -83,7 +88,6 @@ }, ) - Pass through exact Pyodbc string ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -94,8 +98,11 @@ can help make this easier:: from sqlalchemy.engine import URL + connection_string = "DRIVER={SQL Server Native Client 10.0};SERVER=dagger;DATABASE=test;UID=user;PWD=password" - connection_url = URL.create("mssql+pyodbc", query={"odbc_connect": connection_string}) + connection_url = URL.create( + "mssql+pyodbc", query={"odbc_connect": connection_string} + ) engine = create_engine(connection_url) @@ -127,7 +134,8 @@ from sqlalchemy.engine.url import URL from azure import identity - SQL_COPT_SS_ACCESS_TOKEN = 1256 # Connection option for access tokens, as defined in msodbcsql.h + # Connection option for access tokens, as defined in msodbcsql.h + SQL_COPT_SS_ACCESS_TOKEN = 1256 TOKEN_URL = "https://database.windows.net/" # The token URL for any Azure SQL database connection_string = "mssql+pyodbc://@my-server.database.windows.net/myDb?driver=ODBC+Driver+17+for+SQL+Server" @@ -136,14 +144,19 @@ azure_credentials = identity.DefaultAzureCredential() + @event.listens_for(engine, "do_connect") def provide_token(dialect, conn_rec, cargs, cparams): # remove the "Trusted_Connection" parameter that SQLAlchemy adds cargs[0] = cargs[0].replace(";Trusted_Connection=Yes", "") # create token credential - raw_token = azure_credentials.get_token(TOKEN_URL).token.encode("utf-16-le") - token_struct = struct.pack(f"<I{len(raw_token)}s", len(raw_token), raw_token) + raw_token = azure_credentials.get_token(TOKEN_URL).token.encode( + "utf-16-le" + ) + token_struct = struct.pack( + f"<I{len(raw_token)}s", len(raw_token), raw_token + ) # apply it to keyword arguments cparams["attrs_before"] = {SQL_COPT_SS_ACCESS_TOKEN: token_struct} @@ -176,7 +189,9 @@ def provide_token(dialect, conn_rec, cargs, cparams): This specific case can be handled by passing ``ignore_no_transaction_on_rollback=True`` to the SQL Server dialect via the :func:`_sa.create_engine` function as follows:: - engine = create_engine(connection_url, ignore_no_transaction_on_rollback=True) + engine = create_engine( + connection_url, ignore_no_transaction_on_rollback=True + ) Using the above parameter, the dialect will catch ``ProgrammingError`` exceptions raised during ``connection.rollback()`` and emit a warning @@ -236,7 +251,6 @@ def provide_token(dialect, conn_rec, cargs, cparams): }, ) - Pyodbc Pooling / connection close behavior ------------------------------------------ @@ -301,7 +315,8 @@ def provide_token(dialect, conn_rec, cargs, cparams): engine = create_engine( "mssql+pyodbc://scott:tiger@mssql2017:1433/test?driver=ODBC+Driver+17+for+SQL+Server", - fast_executemany=True) + fast_executemany=True, + ) .. versionchanged:: 2.0.9 - the ``fast_executemany`` parameter now has its intended effect of this PyODBC feature taking effect for all INSERT diff --git a/libs/sqlalchemy/dialects/mysql/__init__.py b/libs/sqlalchemy/dialects/mysql/__init__.py index 60bac8744..9174c5441 100644 --- a/libs/sqlalchemy/dialects/mysql/__init__.py +++ b/libs/sqlalchemy/dialects/mysql/__init__.py @@ -1,5 +1,5 @@ # dialects/mysql/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -53,7 +53,8 @@ from .dml import Insert from .dml import insert from .expression import match -from ...util import compat +from .mariadb import INET4 +from .mariadb import INET6 # default dialect base.dialect = dialect = mysqldb.dialect @@ -71,6 +72,8 @@ "DOUBLE", "ENUM", "FLOAT", + "INET4", + "INET6", "INTEGER", "INTEGER", "JSON", diff --git a/libs/sqlalchemy/dialects/mysql/aiomysql.py b/libs/sqlalchemy/dialects/mysql/aiomysql.py index 45e226b94..bd5e7de6b 100644 --- a/libs/sqlalchemy/dialects/mysql/aiomysql.py +++ b/libs/sqlalchemy/dialects/mysql/aiomysql.py @@ -1,5 +1,5 @@ # dialects/mysql/aiomysql.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors <see AUTHORS +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors <see AUTHORS # file> # # This module is part of SQLAlchemy and is released under @@ -23,8 +23,10 @@ :func:`_asyncio.create_async_engine` engine creation function:: from sqlalchemy.ext.asyncio import create_async_engine - engine = create_async_engine("mysql+aiomysql://user:pass@hostname/dbname?charset=utf8mb4") + engine = create_async_engine( + "mysql+aiomysql://user:pass@hostname/dbname?charset=utf8mb4" + ) """ # noqa from collections import deque diff --git a/libs/sqlalchemy/dialects/mysql/asyncmy.py b/libs/sqlalchemy/dialects/mysql/asyncmy.py index 474eb626d..9ec54e694 100644 --- a/libs/sqlalchemy/dialects/mysql/asyncmy.py +++ b/libs/sqlalchemy/dialects/mysql/asyncmy.py @@ -1,5 +1,5 @@ # dialects/mysql/asyncmy.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors <see AUTHORS +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors <see AUTHORS # file> # # This module is part of SQLAlchemy and is released under @@ -21,8 +21,10 @@ :func:`_asyncio.create_async_engine` engine creation function:: from sqlalchemy.ext.asyncio import create_async_engine - engine = create_async_engine("mysql+asyncmy://user:pass@hostname/dbname?charset=utf8mb4") + engine = create_async_engine( + "mysql+asyncmy://user:pass@hostname/dbname?charset=utf8mb4" + ) """ # noqa from collections import deque diff --git a/libs/sqlalchemy/dialects/mysql/base.py b/libs/sqlalchemy/dialects/mysql/base.py index b41ec15ba..db887269c 100644 --- a/libs/sqlalchemy/dialects/mysql/base.py +++ b/libs/sqlalchemy/dialects/mysql/base.py @@ -1,5 +1,5 @@ # dialects/mysql/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -34,7 +34,9 @@ To connect to a MariaDB database, no changes to the database URL are required:: - engine = create_engine("mysql+pymysql://user:pass@some_mariadb/dbname?charset=utf8mb4") + engine = create_engine( + "mysql+pymysql://user:pass@some_mariadb/dbname?charset=utf8mb4" + ) Upon first connect, the SQLAlchemy dialect employs a server version detection scheme that determines if the @@ -52,7 +54,9 @@ and is not compatible with a MySQL database. To use this mode of operation, replace the "mysql" token in the above URL with "mariadb":: - engine = create_engine("mariadb+pymysql://user:pass@some_mariadb/dbname?charset=utf8mb4") + engine = create_engine( + "mariadb+pymysql://user:pass@some_mariadb/dbname?charset=utf8mb4" + ) The above engine, upon first connect, will raise an error if the server version detection detects that the backing database is not MariaDB. @@ -98,7 +102,7 @@ a connection will be discarded and replaced with a new one if it has been present in the pool for a fixed number of seconds:: - engine = create_engine('mysql+mysqldb://...', pool_recycle=3600) + engine = create_engine("mysql+mysqldb://...", pool_recycle=3600) For more comprehensive disconnect detection of pooled connections, including accommodation of server restarts and network issues, a pre-ping approach may @@ -122,12 +126,14 @@ ``ENGINE`` of ``InnoDB``, ``CHARSET`` of ``utf8mb4``, and ``KEY_BLOCK_SIZE`` of ``1024``:: - Table('mytable', metadata, - Column('data', String(32)), - mysql_engine='InnoDB', - mysql_charset='utf8mb4', - mysql_key_block_size="1024" - ) + Table( + "mytable", + metadata, + Column("data", String(32)), + mysql_engine="InnoDB", + mysql_charset="utf8mb4", + mysql_key_block_size="1024", + ) When supporting :ref:`mysql_mariadb_only_mode` mode, similar keys against the "mariadb" prefix must be included as well. The values can of course @@ -136,19 +142,17 @@ # support both "mysql" and "mariadb-only" engine URLs - Table('mytable', metadata, - Column('data', String(32)), - - mysql_engine='InnoDB', - mariadb_engine='InnoDB', - - mysql_charset='utf8mb4', - mariadb_charset='utf8', - - mysql_key_block_size="1024" - mariadb_key_block_size="1024" - - ) + Table( + "mytable", + metadata, + Column("data", String(32)), + mysql_engine="InnoDB", + mariadb_engine="InnoDB", + mysql_charset="utf8mb4", + mariadb_charset="utf8", + mysql_key_block_size="1024", + mariadb_key_block_size="1024", + ) The MySQL / MariaDB dialects will normally transfer any keyword specified as ``mysql_keyword_name`` to be rendered as ``KEYWORD_NAME`` in the @@ -214,16 +218,14 @@ To set isolation level using :func:`_sa.create_engine`:: engine = create_engine( - "mysql+mysqldb://scott:tiger@localhost/test", - isolation_level="READ UNCOMMITTED" - ) + "mysql+mysqldb://scott:tiger@localhost/test", + isolation_level="READ UNCOMMITTED", + ) To set using per-connection execution options:: connection = engine.connect() - connection = connection.execution_options( - isolation_level="READ COMMITTED" - ) + connection = connection.execution_options(isolation_level="READ COMMITTED") Valid values for ``isolation_level`` include: @@ -255,8 +257,8 @@ the first :class:`.Integer` primary key column which is not marked as a foreign key:: - >>> t = Table('mytable', metadata, - ... Column('mytable_id', Integer, primary_key=True) + >>> t = Table( + ... "mytable", metadata, Column("mytable_id", Integer, primary_key=True) ... ) >>> t.create() CREATE TABLE mytable ( @@ -270,10 +272,12 @@ can also be used to enable auto-increment on a secondary column in a multi-column key for some storage engines:: - Table('mytable', metadata, - Column('gid', Integer, primary_key=True, autoincrement=False), - Column('id', Integer, primary_key=True) - ) + Table( + "mytable", + metadata, + Column("gid", Integer, primary_key=True, autoincrement=False), + Column("id", Integer, primary_key=True), + ) .. _mysql_ss_cursors: @@ -291,7 +295,9 @@ option:: with engine.connect() as conn: - result = conn.execution_options(stream_results=True).execute(text("select * from table")) + result = conn.execution_options(stream_results=True).execute( + text("select * from table") + ) Note that some kinds of SQL statements may not be supported with server side cursors; generally, only SQL statements that return rows should be @@ -319,7 +325,8 @@ in the URL, such as:: e = create_engine( - "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4") + "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4" + ) This charset is the **client character set** for the connection. Some MySQL DBAPIs will default this to a value such as ``latin1``, and some @@ -339,7 +346,8 @@ DBAPI, as in:: e = create_engine( - "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4") + "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4" + ) All modern DBAPIs should support the ``utf8mb4`` charset. @@ -361,7 +369,9 @@ MySQL versions 5.6, 5.7 and later (not MariaDB at the time of this writing) now emit a warning when attempting to pass binary data to the database, while a character set encoding is also in place, when the binary data itself is not -valid for that encoding:: +valid for that encoding: + +.. sourcecode:: text default.py:509: Warning: (1300, "Invalid utf8mb4 character string: 'F9876A'") @@ -371,7 +381,9 @@ interpret the binary string as a unicode object even if a datatype such as :class:`.LargeBinary` is in use. To resolve this, the SQL statement requires a binary "character set introducer" be present before any non-NULL value -that renders like this:: +that renders like this: + +.. sourcecode:: sql INSERT INTO table (data) VALUES (_binary %s) @@ -381,12 +393,13 @@ # mysqlclient engine = create_engine( - "mysql+mysqldb://scott:tiger@localhost/test?charset=utf8mb4&binary_prefix=true") + "mysql+mysqldb://scott:tiger@localhost/test?charset=utf8mb4&binary_prefix=true" + ) # PyMySQL engine = create_engine( - "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4&binary_prefix=true") - + "mysql+pymysql://scott:tiger@localhost/test?charset=utf8mb4&binary_prefix=true" + ) The ``binary_prefix`` flag may or may not be supported by other MySQL drivers. @@ -429,7 +442,10 @@ from sqlalchemy import create_engine, event - eng = create_engine("mysql+mysqldb://scott:tiger@localhost/test", echo='debug') + eng = create_engine( + "mysql+mysqldb://scott:tiger@localhost/test", echo="debug" + ) + # `insert=True` will ensure this is the very first listener to run @event.listens_for(eng, "connect", insert=True) @@ -437,6 +453,7 @@ def connect(dbapi_connection, connection_record): cursor = dbapi_connection.cursor() cursor.execute("SET sql_mode = 'STRICT_ALL_TABLES'") + conn = eng.connect() In the example illustrated above, the "connect" event will invoke the "SET" @@ -453,8 +470,8 @@ def connect(dbapi_connection, connection_record): Many of the MySQL / MariaDB SQL extensions are handled through SQLAlchemy's generic function and operator support:: - table.select(table.c.password==func.md5('plaintext')) - table.select(table.c.username.op('regexp')('^[a-d]')) + table.select(table.c.password == func.md5("plaintext")) + table.select(table.c.username.op("regexp")("^[a-d]")) And of course any valid SQL statement can be executed as a string as well. @@ -467,11 +484,18 @@ def connect(dbapi_connection, connection_record): * SELECT pragma, use :meth:`_expression.Select.prefix_with` and :meth:`_query.Query.prefix_with`:: - select(...).prefix_with(['HIGH_PRIORITY', 'SQL_SMALL_RESULT']) + select(...).prefix_with(["HIGH_PRIORITY", "SQL_SMALL_RESULT"]) * UPDATE with LIMIT:: - update(..., mysql_limit=10, mariadb_limit=10) + update(...).with_dialect_options(mysql_limit=10, mariadb_limit=10) + +* DELETE + with LIMIT:: + + delete(...).with_dialect_options(mysql_limit=10, mariadb_limit=10) + + .. versionadded:: 2.0.37 Added delete with limit * optimizer hints, use :meth:`_expression.Select.prefix_with` and :meth:`_query.Query.prefix_with`:: @@ -483,14 +507,16 @@ def connect(dbapi_connection, connection_record): select(...).with_hint(some_table, "USE INDEX xyz") -* MATCH operator support:: +* MATCH + operator support:: + + from sqlalchemy.dialects.mysql import match - from sqlalchemy.dialects.mysql import match - select(...).where(match(col1, col2, against="some expr").in_boolean_mode()) + select(...).where(match(col1, col2, against="some expr").in_boolean_mode()) - .. seealso:: + .. seealso:: - :class:`_mysql.match` + :class:`_mysql.match` INSERT/DELETE...RETURNING ------------------------- @@ -507,17 +533,15 @@ def connect(dbapi_connection, connection_record): # INSERT..RETURNING result = connection.execute( - table.insert(). - values(name='foo'). - returning(table.c.col1, table.c.col2) + table.insert().values(name="foo").returning(table.c.col1, table.c.col2) ) print(result.all()) # DELETE..RETURNING result = connection.execute( - table.delete(). - where(table.c.name=='foo'). - returning(table.c.col1, table.c.col2) + table.delete() + .where(table.c.name == "foo") + .returning(table.c.col1, table.c.col2) ) print(result.all()) @@ -544,12 +568,11 @@ def connect(dbapi_connection, connection_record): >>> from sqlalchemy.dialects.mysql import insert >>> insert_stmt = insert(my_table).values( - ... id='some_existing_id', - ... data='inserted value') + ... id="some_existing_id", data="inserted value" + ... ) >>> on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update( - ... data=insert_stmt.inserted.data, - ... status='U' + ... data=insert_stmt.inserted.data, status="U" ... ) >>> print(on_duplicate_key_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%s, %s) @@ -574,8 +597,8 @@ def connect(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> insert_stmt = insert(my_table).values( - ... id='some_existing_id', - ... data='inserted value') + ... id="some_existing_id", data="inserted value" + ... ) >>> on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update( ... data="some data", @@ -638,13 +661,11 @@ def connect(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> stmt = insert(my_table).values( - ... id='some_id', - ... data='inserted value', - ... author='jlh') + ... id="some_id", data="inserted value", author="jlh" + ... ) >>> do_update_stmt = stmt.on_duplicate_key_update( - ... data="updated value", - ... author=stmt.inserted.author + ... data="updated value", author=stmt.inserted.author ... ) >>> print(do_update_stmt) @@ -689,13 +710,13 @@ def connect(dbapi_connection, connection_record): become part of the index. SQLAlchemy provides this feature via the ``mysql_length`` and/or ``mariadb_length`` parameters:: - Index('my_index', my_table.c.data, mysql_length=10, mariadb_length=10) + Index("my_index", my_table.c.data, mysql_length=10, mariadb_length=10) - Index('a_b_idx', my_table.c.a, my_table.c.b, mysql_length={'a': 4, - 'b': 9}) + Index("a_b_idx", my_table.c.a, my_table.c.b, mysql_length={"a": 4, "b": 9}) - Index('a_b_idx', my_table.c.a, my_table.c.b, mariadb_length={'a': 4, - 'b': 9}) + Index( + "a_b_idx", my_table.c.a, my_table.c.b, mariadb_length={"a": 4, "b": 9} + ) Prefix lengths are given in characters for nonbinary string types and in bytes for binary string types. The value passed to the keyword argument *must* be @@ -712,7 +733,7 @@ def connect(dbapi_connection, connection_record): an index. SQLAlchemy provides this feature via the ``mysql_prefix`` parameter on :class:`.Index`:: - Index('my_index', my_table.c.data, mysql_prefix='FULLTEXT') + Index("my_index", my_table.c.data, mysql_prefix="FULLTEXT") The value passed to the keyword argument will be simply passed through to the underlying CREATE INDEX, so it *must* be a valid index prefix for your MySQL @@ -729,11 +750,13 @@ def connect(dbapi_connection, connection_record): an index or primary key constraint. SQLAlchemy provides this feature via the ``mysql_using`` parameter on :class:`.Index`:: - Index('my_index', my_table.c.data, mysql_using='hash', mariadb_using='hash') + Index( + "my_index", my_table.c.data, mysql_using="hash", mariadb_using="hash" + ) As well as the ``mysql_using`` parameter on :class:`.PrimaryKeyConstraint`:: - PrimaryKeyConstraint("data", mysql_using='hash', mariadb_using='hash') + PrimaryKeyConstraint("data", mysql_using="hash", mariadb_using="hash") The value passed to the keyword argument will be simply passed through to the underlying CREATE INDEX or PRIMARY KEY clause, so it *must* be a valid index @@ -752,9 +775,12 @@ def connect(dbapi_connection, connection_record): is available using the keyword argument ``mysql_with_parser``:: Index( - 'my_index', my_table.c.data, - mysql_prefix='FULLTEXT', mysql_with_parser="ngram", - mariadb_prefix='FULLTEXT', mariadb_with_parser="ngram", + "my_index", + my_table.c.data, + mysql_prefix="FULLTEXT", + mysql_with_parser="ngram", + mariadb_prefix="FULLTEXT", + mariadb_with_parser="ngram", ) .. versionadded:: 1.3 @@ -781,6 +807,7 @@ def connect(dbapi_connection, connection_record): from sqlalchemy.ext.compiler import compiles from sqlalchemy.schema import ForeignKeyConstraint + @compiles(ForeignKeyConstraint, "mysql", "mariadb") def process(element, compiler, **kw): element.deferrable = element.initially = None @@ -802,10 +829,12 @@ def process(element, compiler, **kw): reflection will not include foreign keys. For these tables, you may supply a :class:`~sqlalchemy.ForeignKeyConstraint` at reflection time:: - Table('mytable', metadata, - ForeignKeyConstraint(['other_id'], ['othertable.other_id']), - autoload_with=engine - ) + Table( + "mytable", + metadata, + ForeignKeyConstraint(["other_id"], ["othertable.other_id"]), + autoload_with=engine, + ) .. seealso:: @@ -877,13 +906,15 @@ def process(element, compiler, **kw): mytable = Table( "mytable", metadata, - Column('id', Integer, primary_key=True), - Column('data', String(50)), + Column("id", Integer, primary_key=True), + Column("data", String(50)), Column( - 'last_updated', + "last_updated", TIMESTAMP, - server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") - ) + server_default=text( + "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" + ), + ), ) The same instructions apply to use of the :class:`_types.DateTime` and @@ -894,34 +925,37 @@ def process(element, compiler, **kw): mytable = Table( "mytable", metadata, - Column('id', Integer, primary_key=True), - Column('data', String(50)), + Column("id", Integer, primary_key=True), + Column("data", String(50)), Column( - 'last_updated', + "last_updated", DateTime, - server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") - ) + server_default=text( + "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" + ), + ), ) - Even though the :paramref:`_schema.Column.server_onupdate` feature does not generate this DDL, it still may be desirable to signal to the ORM that this updated value should be fetched. This syntax looks like the following:: from sqlalchemy.schema import FetchedValue + class MyClass(Base): - __tablename__ = 'mytable' + __tablename__ = "mytable" id = Column(Integer, primary_key=True) data = Column(String(50)) last_updated = Column( TIMESTAMP, - server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"), - server_onupdate=FetchedValue() + server_default=text( + "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" + ), + server_onupdate=FetchedValue(), ) - .. _mysql_timestamp_null: TIMESTAMP Columns and NULL @@ -931,7 +965,9 @@ class MyClass(Base): TIMESTAMP datatype implicitly includes a default value of CURRENT_TIMESTAMP, even though this is not stated, and additionally sets the column as NOT NULL, the opposite behavior vs. that of all -other datatypes:: +other datatypes: + +.. sourcecode:: text mysql> CREATE TABLE ts_test ( -> a INTEGER, @@ -976,19 +1012,24 @@ class MyClass(Base): from sqlalchemy.dialects.mysql import TIMESTAMP m = MetaData() - t = Table('ts_test', m, - Column('a', Integer), - Column('b', Integer, nullable=False), - Column('c', TIMESTAMP), - Column('d', TIMESTAMP, nullable=False) - ) + t = Table( + "ts_test", + m, + Column("a", Integer), + Column("b", Integer, nullable=False), + Column("c", TIMESTAMP), + Column("d", TIMESTAMP, nullable=False), + ) from sqlalchemy import create_engine + e = create_engine("mysql+mysqldb://scott:tiger@localhost/test", echo=True) m.create_all(e) -output:: +output: + +.. sourcecode:: sql CREATE TABLE ts_test ( a INTEGER, @@ -1362,6 +1403,8 @@ def visit_on_duplicate_key_update(self, on_duplicate, **kw): for column in (col for col in cols if col.key in on_duplicate.update): val = on_duplicate.update[column.key] + # TODO: this coercion should be up front. we can't cache + # SQL constructs with non-bound literals buried in them if coercions._is_literal(val): val = elements.BindParameter(None, val, type_=column.type) value_text = self.process(val.self_group(), use_schema=False) @@ -1677,8 +1720,15 @@ def limit_clause(self, select, **kw): def update_limit_clause(self, update_stmt): limit = update_stmt.kwargs.get("%s_limit" % self.dialect.name, None) - if limit: - return "LIMIT %s" % limit + if limit is not None: + return f"LIMIT {int(limit)}" + else: + return None + + def delete_limit_clause(self, delete_stmt): + limit = delete_stmt.kwargs.get("%s_limit" % self.dialect.name, None) + if limit is not None: + return f"LIMIT {int(limit)}" else: return None @@ -2502,6 +2552,7 @@ class MySQLDialect(default.DefaultDialect): construct_arguments = [ (sa_schema.Table, {"*": None}), (sql.Update, {"limit": None}), + (sql.Delete, {"limit": None}), (sa_schema.PrimaryKeyConstraint, {"using": None}), ( sa_schema.Index, diff --git a/libs/sqlalchemy/dialects/mysql/cymysql.py b/libs/sqlalchemy/dialects/mysql/cymysql.py index f199aa4e8..5c00ada9f 100644 --- a/libs/sqlalchemy/dialects/mysql/cymysql.py +++ b/libs/sqlalchemy/dialects/mysql/cymysql.py @@ -1,5 +1,5 @@ # dialects/mysql/cymysql.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mysql/dml.py b/libs/sqlalchemy/dialects/mysql/dml.py index e4005c267..cceb0818f 100644 --- a/libs/sqlalchemy/dialects/mysql/dml.py +++ b/libs/sqlalchemy/dialects/mysql/dml.py @@ -1,5 +1,5 @@ # dialects/mysql/dml.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -7,6 +7,7 @@ from __future__ import annotations from typing import Any +from typing import Dict from typing import List from typing import Mapping from typing import Optional @@ -141,7 +142,11 @@ def on_duplicate_key_update(self, *args: _UpdateArg, **kw: Any) -> Self: in :ref:`tutorial_parameter_ordered_updates`:: insert().on_duplicate_key_update( - [("name", "some name"), ("value", "some value")]) + [ + ("name", "some name"), + ("value", "some value"), + ] + ) .. versionchanged:: 1.3 parameters can be specified as a dictionary or list of 2-tuples; the latter form provides for parameter @@ -181,6 +186,7 @@ class OnDuplicateClause(ClauseElement): _parameter_ordering: Optional[List[str]] = None + update: Dict[str, Any] stringify_dialect = "mysql" def __init__( diff --git a/libs/sqlalchemy/dialects/mysql/enumerated.py b/libs/sqlalchemy/dialects/mysql/enumerated.py index 96499d7be..6745cae55 100644 --- a/libs/sqlalchemy/dialects/mysql/enumerated.py +++ b/libs/sqlalchemy/dialects/mysql/enumerated.py @@ -1,5 +1,5 @@ # dialects/mysql/enumerated.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -28,7 +28,7 @@ def __init__(self, *enums, **kw): E.g.:: - Column('myenum', ENUM("foo", "bar", "baz")) + Column("myenum", ENUM("foo", "bar", "baz")) :param enums: The range of valid values for this ENUM. Values in enums are not quoted, they will be escaped and surrounded by single @@ -102,8 +102,7 @@ def __init__(self, *values, **kw): E.g.:: - Column('myset', SET("foo", "bar", "baz")) - + Column("myset", SET("foo", "bar", "baz")) The list of potential values is required in the case that this set will be used to generate DDL for a table, or if the diff --git a/libs/sqlalchemy/dialects/mysql/expression.py b/libs/sqlalchemy/dialects/mysql/expression.py index b81b58afc..b60a08885 100644 --- a/libs/sqlalchemy/dialects/mysql/expression.py +++ b/libs/sqlalchemy/dialects/mysql/expression.py @@ -1,5 +1,5 @@ # dialects/mysql/expression.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -38,7 +38,9 @@ class match(Generative, elements.BinaryExpression): .order_by(desc(match_expr)) ) - Would produce SQL resembling:: + Would produce SQL resembling: + + .. sourcecode:: sql SELECT id, firstname, lastname FROM user diff --git a/libs/sqlalchemy/dialects/mysql/json.py b/libs/sqlalchemy/dialects/mysql/json.py index ebe4a34d2..8912af366 100644 --- a/libs/sqlalchemy/dialects/mysql/json.py +++ b/libs/sqlalchemy/dialects/mysql/json.py @@ -1,5 +1,5 @@ # dialects/mysql/json.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mysql/mariadb.py b/libs/sqlalchemy/dialects/mysql/mariadb.py index 10a05f9cb..ac2cfbd1b 100644 --- a/libs/sqlalchemy/dialects/mysql/mariadb.py +++ b/libs/sqlalchemy/dialects/mysql/mariadb.py @@ -1,5 +1,5 @@ # dialects/mysql/mariadb.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -7,6 +7,34 @@ # mypy: ignore-errors from .base import MariaDBIdentifierPreparer from .base import MySQLDialect +from .base import MySQLTypeCompiler +from ...sql import sqltypes + + +class INET4(sqltypes.TypeEngine[str]): + """INET4 column type for MariaDB + + .. versionadded:: 2.0.37 + """ + + __visit_name__ = "INET4" + + +class INET6(sqltypes.TypeEngine[str]): + """INET6 column type for MariaDB + + .. versionadded:: 2.0.37 + """ + + __visit_name__ = "INET6" + + +class MariaDBTypeCompiler(MySQLTypeCompiler): + def visit_INET4(self, type_, **kwargs) -> str: + return "INET4" + + def visit_INET6(self, type_, **kwargs) -> str: + return "INET6" class MariaDBDialect(MySQLDialect): @@ -14,6 +42,7 @@ class MariaDBDialect(MySQLDialect): supports_statement_cache = True name = "mariadb" preparer = MariaDBIdentifierPreparer + type_compiler_cls = MariaDBTypeCompiler def loader(driver): diff --git a/libs/sqlalchemy/dialects/mysql/mariadbconnector.py b/libs/sqlalchemy/dialects/mysql/mariadbconnector.py index 1730c1a6f..2d2ad1997 100644 --- a/libs/sqlalchemy/dialects/mysql/mariadbconnector.py +++ b/libs/sqlalchemy/dialects/mysql/mariadbconnector.py @@ -1,5 +1,5 @@ # dialects/mysql/mariadbconnector.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mysql/mysqlconnector.py b/libs/sqlalchemy/dialects/mysql/mysqlconnector.py index 8f4b41741..e88f8fd71 100644 --- a/libs/sqlalchemy/dialects/mysql/mysqlconnector.py +++ b/libs/sqlalchemy/dialects/mysql/mysqlconnector.py @@ -1,5 +1,5 @@ # dialects/mysql/mysqlconnector.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mysql/mysqldb.py b/libs/sqlalchemy/dialects/mysql/mysqldb.py index 0baf10f70..3cf56c1fd 100644 --- a/libs/sqlalchemy/dialects/mysql/mysqldb.py +++ b/libs/sqlalchemy/dialects/mysql/mysqldb.py @@ -1,5 +1,5 @@ # dialects/mysql/mysqldb.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -48,9 +48,9 @@ "ssl": { "ca": "/home/gord/client-ssl/ca.pem", "cert": "/home/gord/client-ssl/client-cert.pem", - "key": "/home/gord/client-ssl/client-key.pem" + "key": "/home/gord/client-ssl/client-key.pem", } - } + }, ) For convenience, the following keys may also be specified inline within the URL @@ -74,7 +74,9 @@ ----------------------------------- Google Cloud SQL now recommends use of the MySQLdb dialect. Connect -using a URL like the following:: +using a URL like the following: + +.. sourcecode:: text mysql+mysqldb://root@/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename> diff --git a/libs/sqlalchemy/dialects/mysql/provision.py b/libs/sqlalchemy/dialects/mysql/provision.py index 836ffa1df..7807af409 100644 --- a/libs/sqlalchemy/dialects/mysql/provision.py +++ b/libs/sqlalchemy/dialects/mysql/provision.py @@ -1,5 +1,5 @@ # dialects/mysql/provision.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mysql/pymysql.py b/libs/sqlalchemy/dialects/mysql/pymysql.py index 830e4416c..67cb4cdd7 100644 --- a/libs/sqlalchemy/dialects/mysql/pymysql.py +++ b/libs/sqlalchemy/dialects/mysql/pymysql.py @@ -1,5 +1,5 @@ # dialects/mysql/pymysql.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -41,7 +41,6 @@ "&ssl_check_hostname=false" ) - MySQL-Python Compatibility -------------------------- diff --git a/libs/sqlalchemy/dialects/mysql/pyodbc.py b/libs/sqlalchemy/dialects/mysql/pyodbc.py index 428c8dfd3..6d44bd383 100644 --- a/libs/sqlalchemy/dialects/mysql/pyodbc.py +++ b/libs/sqlalchemy/dialects/mysql/pyodbc.py @@ -1,5 +1,5 @@ # dialects/mysql/pyodbc.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -30,14 +30,15 @@ Pass through exact pyodbc connection string:: import urllib + connection_string = ( - 'DRIVER=MySQL ODBC 8.0 ANSI Driver;' - 'SERVER=localhost;' - 'PORT=3307;' - 'DATABASE=mydb;' - 'UID=root;' - 'PWD=(whatever);' - 'charset=utf8mb4;' + "DRIVER=MySQL ODBC 8.0 ANSI Driver;" + "SERVER=localhost;" + "PORT=3307;" + "DATABASE=mydb;" + "UID=root;" + "PWD=(whatever);" + "charset=utf8mb4;" ) params = urllib.parse.quote_plus(connection_string) connection_uri = "mysql+pyodbc:///?odbc_connect=%s" % params diff --git a/libs/sqlalchemy/dialects/mysql/reflection.py b/libs/sqlalchemy/dialects/mysql/reflection.py index d7622c546..3998be977 100644 --- a/libs/sqlalchemy/dialects/mysql/reflection.py +++ b/libs/sqlalchemy/dialects/mysql/reflection.py @@ -1,5 +1,5 @@ # dialects/mysql/reflection.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mysql/reserved_words.py b/libs/sqlalchemy/dialects/mysql/reserved_words.py index 04764c17e..34fecf427 100644 --- a/libs/sqlalchemy/dialects/mysql/reserved_words.py +++ b/libs/sqlalchemy/dialects/mysql/reserved_words.py @@ -1,5 +1,5 @@ # dialects/mysql/reserved_words.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/mysql/types.py b/libs/sqlalchemy/dialects/mysql/types.py index 734f6ae37..0c05aacb7 100644 --- a/libs/sqlalchemy/dialects/mysql/types.py +++ b/libs/sqlalchemy/dialects/mysql/types.py @@ -1,5 +1,5 @@ # dialects/mysql/types.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/oracle/__init__.py b/libs/sqlalchemy/dialects/oracle/__init__.py index d855122ee..7ceb743d6 100644 --- a/libs/sqlalchemy/dialects/oracle/__init__.py +++ b/libs/sqlalchemy/dialects/oracle/__init__.py @@ -1,5 +1,5 @@ # dialects/oracle/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/oracle/base.py b/libs/sqlalchemy/dialects/oracle/base.py index abf3645c7..019b76bc0 100644 --- a/libs/sqlalchemy/dialects/oracle/base.py +++ b/libs/sqlalchemy/dialects/oracle/base.py @@ -1,5 +1,5 @@ # dialects/oracle/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -9,7 +9,7 @@ r""" .. dialect:: oracle - :name: Oracle + :name: Oracle Database :normal_support: 11+ :best_effort: 9+ @@ -17,21 +17,24 @@ Auto Increment Behavior ----------------------- -SQLAlchemy Table objects which include integer primary keys are usually -assumed to have "autoincrementing" behavior, meaning they can generate their -own primary key values upon INSERT. For use within Oracle, two options are -available, which are the use of IDENTITY columns (Oracle 12 and above only) -or the association of a SEQUENCE with the column. +SQLAlchemy Table objects which include integer primary keys are usually assumed +to have "autoincrementing" behavior, meaning they can generate their own +primary key values upon INSERT. For use within Oracle Database, two options are +available, which are the use of IDENTITY columns (Oracle Database 12 and above +only) or the association of a SEQUENCE with the column. -Specifying GENERATED AS IDENTITY (Oracle 12 and above) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Specifying GENERATED AS IDENTITY (Oracle Database 12 and above) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Starting from version 12 Oracle can make use of identity columns using -the :class:`_sql.Identity` to specify the autoincrementing behavior:: +Starting from version 12, Oracle Database can make use of identity columns +using the :class:`_sql.Identity` to specify the autoincrementing behavior:: - t = Table('mytable', metadata, - Column('id', Integer, Identity(start=3), primary_key=True), - Column(...), ... + t = Table( + "mytable", + metadata, + Column("id", Integer, Identity(start=3), primary_key=True), + Column(...), + ..., ) The CREATE TABLE for the above :class:`_schema.Table` object would be: @@ -46,34 +49,38 @@ The :class:`_schema.Identity` object support many options to control the "autoincrementing" behavior of the column, like the starting value, the -incrementing value, etc. -In addition to the standard options, Oracle supports setting -:paramref:`_schema.Identity.always` to ``None`` to use the default -generated mode, rendering GENERATED AS IDENTITY in the DDL. It also supports +incrementing value, etc. In addition to the standard options, Oracle Database +supports setting :paramref:`_schema.Identity.always` to ``None`` to use the +default generated mode, rendering GENERATED AS IDENTITY in the DDL. It also supports setting :paramref:`_schema.Identity.on_null` to ``True`` to specify ON NULL in conjunction with a 'BY DEFAULT' identity column. -Using a SEQUENCE (all Oracle versions) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Older version of Oracle had no "autoincrement" -feature, SQLAlchemy relies upon sequences to produce these values. With the -older Oracle versions, *a sequence must always be explicitly specified to -enable autoincrement*. This is divergent with the majority of documentation -examples which assume the usage of an autoincrement-capable database. To -specify sequences, use the sqlalchemy.schema.Sequence object which is passed -to a Column construct:: - - t = Table('mytable', metadata, - Column('id', Integer, Sequence('id_seq', start=1), primary_key=True), - Column(...), ... +Using a SEQUENCE (all Oracle Database versions) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Older version of Oracle Database had no "autoincrement" feature: SQLAlchemy +relies upon sequences to produce these values. With the older Oracle Database +versions, *a sequence must always be explicitly specified to enable +autoincrement*. This is divergent with the majority of documentation examples +which assume the usage of an autoincrement-capable database. To specify +sequences, use the sqlalchemy.schema.Sequence object which is passed to a +Column construct:: + + t = Table( + "mytable", + metadata, + Column("id", Integer, Sequence("id_seq", start=1), primary_key=True), + Column(...), + ..., ) This step is also required when using table reflection, i.e. autoload_with=engine:: - t = Table('mytable', metadata, - Column('id', Integer, Sequence('id_seq', start=1), primary_key=True), - autoload_with=engine + t = Table( + "mytable", + metadata, + Column("id", Integer, Sequence("id_seq", start=1), primary_key=True), + autoload_with=engine, ) .. versionchanged:: 1.4 Added :class:`_schema.Identity` construct @@ -85,21 +92,18 @@ Transaction Isolation Level / Autocommit ---------------------------------------- -The Oracle database supports "READ COMMITTED" and "SERIALIZABLE" modes of -isolation. The AUTOCOMMIT isolation level is also supported by the cx_Oracle -dialect. +Oracle Database supports "READ COMMITTED" and "SERIALIZABLE" modes of +isolation. The AUTOCOMMIT isolation level is also supported by the +python-oracledb and cx_Oracle dialects. To set using per-connection execution options:: connection = engine.connect() - connection = connection.execution_options( - isolation_level="AUTOCOMMIT" - ) + connection = connection.execution_options(isolation_level="AUTOCOMMIT") -For ``READ COMMITTED`` and ``SERIALIZABLE``, the Oracle dialect sets the -level at the session level using ``ALTER SESSION``, which is reverted back -to its default setting when the connection is returned to the connection -pool. +For ``READ COMMITTED`` and ``SERIALIZABLE``, the Oracle Database dialects sets +the level at the session level using ``ALTER SESSION``, which is reverted back +to its default setting when the connection is returned to the connection pool. Valid values for ``isolation_level`` include: @@ -109,28 +113,28 @@ .. note:: The implementation for the :meth:`_engine.Connection.get_isolation_level` method as implemented by the - Oracle dialect necessarily forces the start of a transaction using the - Oracle LOCAL_TRANSACTION_ID function; otherwise no level is normally - readable. + Oracle Database dialects necessarily force the start of a transaction using the + Oracle Database DBMS_TRANSACTION.LOCAL_TRANSACTION_ID function; otherwise no + level is normally readable. Additionally, the :meth:`_engine.Connection.get_isolation_level` method will raise an exception if the ``v$transaction`` view is not available due to - permissions or other reasons, which is a common occurrence in Oracle + permissions or other reasons, which is a common occurrence in Oracle Database installations. - The cx_Oracle dialect attempts to call the + The python-oracledb and cx_Oracle dialects attempt to call the :meth:`_engine.Connection.get_isolation_level` method when the dialect makes its first connection to the database in order to acquire the "default"isolation level. This default level is necessary so that the level can be reset on a connection after it has been temporarily modified using - :meth:`_engine.Connection.execution_options` method. In the common event + :meth:`_engine.Connection.execution_options` method. In the common event that the :meth:`_engine.Connection.get_isolation_level` method raises an exception due to ``v$transaction`` not being readable as well as any other database-related failure, the level is assumed to be "READ COMMITTED". No warning is emitted for this initial first-connect condition as it is expected to be a common restriction on Oracle databases. -.. versionadded:: 1.3.16 added support for AUTOCOMMIT to the cx_oracle dialect +.. versionadded:: 1.3.16 added support for AUTOCOMMIT to the cx_Oracle dialect as well as the notion of a default isolation level .. versionadded:: 1.3.21 Added support for SERIALIZABLE as well as live @@ -148,56 +152,57 @@ Identifier Casing ----------------- -In Oracle, the data dictionary represents all case insensitive identifier -names using UPPERCASE text. SQLAlchemy on the other hand considers an -all-lower case identifier name to be case insensitive. The Oracle dialect -converts all case insensitive identifiers to and from those two formats during -schema level communication, such as reflection of tables and indexes. Using -an UPPERCASE name on the SQLAlchemy side indicates a case sensitive +In Oracle Database, the data dictionary represents all case insensitive +identifier names using UPPERCASE text. SQLAlchemy on the other hand considers +an all-lower case identifier name to be case insensitive. The Oracle Database +dialects convert all case insensitive identifiers to and from those two formats +during schema level communication, such as reflection of tables and indexes. +Using an UPPERCASE name on the SQLAlchemy side indicates a case sensitive identifier, and SQLAlchemy will quote the name - this will cause mismatches -against data dictionary data received from Oracle, so unless identifier names -have been truly created as case sensitive (i.e. using quoted names), all -lowercase names should be used on the SQLAlchemy side. +against data dictionary data received from Oracle Database, so unless +identifier names have been truly created as case sensitive (i.e. using quoted +names), all lowercase names should be used on the SQLAlchemy side. .. _oracle_max_identifier_lengths: -Max Identifier Lengths ----------------------- +Maximum Identifier Lengths +-------------------------- -Oracle has changed the default max identifier length as of Oracle Server -version 12.2. Prior to this version, the length was 30, and for 12.2 and -greater it is now 128. This change impacts SQLAlchemy in the area of -generated SQL label names as well as the generation of constraint names, -particularly in the case where the constraint naming convention feature -described at :ref:`constraint_naming_conventions` is being used. - -To assist with this change and others, Oracle includes the concept of a -"compatibility" version, which is a version number that is independent of the -actual server version in order to assist with migration of Oracle databases, -and may be configured within the Oracle server itself. This compatibility -version is retrieved using the query ``SELECT value FROM v$parameter WHERE -name = 'compatible';``. The SQLAlchemy Oracle dialect, when tasked with -determining the default max identifier length, will attempt to use this query -upon first connect in order to determine the effective compatibility version of -the server, which determines what the maximum allowed identifier length is for -the server. If the table is not available, the server version information is -used instead. - -As of SQLAlchemy 1.4, the default max identifier length for the Oracle dialect -is 128 characters. Upon first connect, the compatibility version is detected -and if it is less than Oracle version 12.2, the max identifier length is -changed to be 30 characters. In all cases, setting the +SQLAlchemy is sensitive to the maximum identifier length supported by Oracle +Database. This affects generated SQL label names as well as the generation of +constraint names, particularly in the case where the constraint naming +convention feature described at :ref:`constraint_naming_conventions` is being +used. + +Oracle Database 12.2 increased the default maximum identifier length from 30 to +128. As of SQLAlchemy 1.4, the default maximum identifier length for the Oracle +dialects is 128 characters. Upon first connection, the maximum length actually +supported by the database is obtained. In all cases, setting the :paramref:`_sa.create_engine.max_identifier_length` parameter will bypass this change and the value given will be used as is:: engine = create_engine( - "oracle+cx_oracle://scott:tiger@oracle122", - max_identifier_length=30) + "oracle+oracledb://scott:tiger@localhost:1521?service_name=freepdb1", + max_identifier_length=30, + ) + +If :paramref:`_sa.create_engine.max_identifier_length` is not set, the oracledb +dialect internally uses the ``max_identifier_length`` attribute available on +driver connections since python-oracledb version 2.5. When using an older +driver version, or using the cx_Oracle dialect, SQLAlchemy will instead attempt +to use the query ``SELECT value FROM v$parameter WHERE name = 'compatible'`` +upon first connect in order to determine the effective compatibility version of +the database. The "compatibility" version is a version number that is +independent of the actual database version. It is used to assist database +migration. It is configured by an Oracle Database initialization parameter. The +compatibility version then determines the maximum allowed identifier length for +the database. If the V$ view is not available, the database version information +is used instead. The maximum identifier length comes into play both when generating anonymized SQL labels in SELECT statements, but more crucially when generating constraint names from a naming convention. It is this area that has created the need for -SQLAlchemy to change this default conservatively. For example, the following +SQLAlchemy to change this default conservatively. For example, the following naming convention produces two very different constraint names based on the identifier length:: @@ -229,68 +234,71 @@ oracle_dialect = oracle.dialect(max_identifier_length=30) print(CreateIndex(ix).compile(dialect=oracle_dialect)) -With an identifier length of 30, the above CREATE INDEX looks like:: +With an identifier length of 30, the above CREATE INDEX looks like: + +.. sourcecode:: sql CREATE INDEX ix_some_column_name_1s_70cd ON t (some_column_name_1, some_column_name_2, some_column_name_3) -However with length=128, it becomes:: +However with length of 128, it becomes:: + +.. sourcecode:: sql CREATE INDEX ix_some_column_name_1some_column_name_2some_column_name_3 ON t (some_column_name_1, some_column_name_2, some_column_name_3) -Applications which have run versions of SQLAlchemy prior to 1.4 on an Oracle -server version 12.2 or greater are therefore subject to the scenario of a +Applications which have run versions of SQLAlchemy prior to 1.4 on Oracle +Database version 12.2 or greater are therefore subject to the scenario of a database migration that wishes to "DROP CONSTRAINT" on a name that was previously generated with the shorter length. This migration will fail when the identifier length is changed without the name of the index or constraint first being adjusted. Such applications are strongly advised to make use of -:paramref:`_sa.create_engine.max_identifier_length` -in order to maintain control -of the generation of truncated names, and to fully review and test all database -migrations in a staging environment when changing this value to ensure that the -impact of this change has been mitigated. +:paramref:`_sa.create_engine.max_identifier_length` in order to maintain +control of the generation of truncated names, and to fully review and test all +database migrations in a staging environment when changing this value to ensure +that the impact of this change has been mitigated. -.. versionchanged:: 1.4 the default max_identifier_length for Oracle is 128 - characters, which is adjusted down to 30 upon first connect if an older - version of Oracle server (compatibility version < 12.2) is detected. +.. versionchanged:: 1.4 the default max_identifier_length for Oracle Database + is 128 characters, which is adjusted down to 30 upon first connect if the + Oracle Database, or its compatibility setting, are lower than version 12.2. LIMIT/OFFSET/FETCH Support -------------------------- -Methods like :meth:`_sql.Select.limit` and :meth:`_sql.Select.offset` make -use of ``FETCH FIRST N ROW / OFFSET N ROWS`` syntax assuming -Oracle 12c or above, and assuming the SELECT statement is not embedded within -a compound statement like UNION. This syntax is also available directly by using -the :meth:`_sql.Select.fetch` method. - -.. versionchanged:: 2.0 the Oracle dialect now uses - ``FETCH FIRST N ROW / OFFSET N ROWS`` for all - :meth:`_sql.Select.limit` and :meth:`_sql.Select.offset` usage including - within the ORM and legacy :class:`_orm.Query`. To force the legacy - behavior using window functions, specify the ``enable_offset_fetch=False`` - dialect parameter to :func:`_sa.create_engine`. - -The use of ``FETCH FIRST / OFFSET`` may be disabled on any Oracle version -by passing ``enable_offset_fetch=False`` to :func:`_sa.create_engine`, which -will force the use of "legacy" mode that makes use of window functions. +Methods like :meth:`_sql.Select.limit` and :meth:`_sql.Select.offset` make use +of ``FETCH FIRST N ROW / OFFSET N ROWS`` syntax assuming Oracle Database 12c or +above, and assuming the SELECT statement is not embedded within a compound +statement like UNION. This syntax is also available directly by using the +:meth:`_sql.Select.fetch` method. + +.. versionchanged:: 2.0 the Oracle Database dialects now use ``FETCH FIRST N + ROW / OFFSET N ROWS`` for all :meth:`_sql.Select.limit` and + :meth:`_sql.Select.offset` usage including within the ORM and legacy + :class:`_orm.Query`. To force the legacy behavior using window functions, + specify the ``enable_offset_fetch=False`` dialect parameter to + :func:`_sa.create_engine`. + +The use of ``FETCH FIRST / OFFSET`` may be disabled on any Oracle Database +version by passing ``enable_offset_fetch=False`` to :func:`_sa.create_engine`, +which will force the use of "legacy" mode that makes use of window functions. This mode is also selected automatically when using a version of Oracle -prior to 12c. +Database prior to 12c. -When using legacy mode, or when a :class:`.Select` statement -with limit/offset is embedded in a compound statement, an emulated approach for -LIMIT / OFFSET based on window functions is used, which involves creation of a -subquery using ``ROW_NUMBER`` that is prone to performance issues as well as -SQL construction issues for complex statements. However, this approach is -supported by all Oracle versions. See notes below. +When using legacy mode, or when a :class:`.Select` statement with limit/offset +is embedded in a compound statement, an emulated approach for LIMIT / OFFSET +based on window functions is used, which involves creation of a subquery using +``ROW_NUMBER`` that is prone to performance issues as well as SQL construction +issues for complex statements. However, this approach is supported by all +Oracle Database versions. See notes below. Notes on LIMIT / OFFSET emulation (when fetch() method cannot be used) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If using :meth:`_sql.Select.limit` and :meth:`_sql.Select.offset`, or with the ORM the :meth:`_orm.Query.limit` and :meth:`_orm.Query.offset` methods on an -Oracle version prior to 12c, the following notes apply: +Oracle Database version prior to 12c, the following notes apply: * SQLAlchemy currently makes use of ROWNUM to achieve LIMIT/OFFSET; the exact methodology is taken from @@ -301,10 +309,11 @@ to :func:`_sa.create_engine`. .. versionchanged:: 1.4 - The Oracle dialect renders limit/offset integer values using a "post - compile" scheme which renders the integer directly before passing the - statement to the cursor for execution. The ``use_binds_for_limits`` flag - no longer has an effect. + + The Oracle Database dialect renders limit/offset integer values using a + "post compile" scheme which renders the integer directly before passing + the statement to the cursor for execution. The ``use_binds_for_limits`` + flag no longer has an effect. .. seealso:: @@ -315,21 +324,21 @@ RETURNING Support ----------------- -The Oracle database supports RETURNING fully for INSERT, UPDATE and DELETE -statements that are invoked with a single collection of bound parameters -(that is, a ``cursor.execute()`` style statement; SQLAlchemy does not generally +Oracle Database supports RETURNING fully for INSERT, UPDATE and DELETE +statements that are invoked with a single collection of bound parameters (that +is, a ``cursor.execute()`` style statement; SQLAlchemy does not generally support RETURNING with :term:`executemany` statements). Multiple rows may be returned as well. -.. versionchanged:: 2.0 the Oracle backend has full support for RETURNING - on parity with other backends. +.. versionchanged:: 2.0 the Oracle Database backend has full support for + RETURNING on parity with other backends. ON UPDATE CASCADE ----------------- -Oracle doesn't have native ON UPDATE CASCADE functionality. A trigger based -solution is available at +Oracle Database doesn't have native ON UPDATE CASCADE functionality. A trigger +based solution is available at https://web.archive.org/web/20090317041251/https://asktom.oracle.com/tkyte/update_cascade/index.html When using the SQLAlchemy ORM, the ORM has limited ability to manually issue @@ -337,14 +346,14 @@ "deferrable=True, initially='deferred'" keyword arguments, and specify "passive_updates=False" on each relationship(). -Oracle 8 Compatibility ----------------------- +Oracle Database 8 Compatibility +------------------------------- -.. warning:: The status of Oracle 8 compatibility is not known for SQLAlchemy - 2.0. +.. warning:: The status of Oracle Database 8 compatibility is not known for + SQLAlchemy 2.0. -When Oracle 8 is detected, the dialect internally configures itself to the -following behaviors: +When Oracle Database 8 is detected, the dialect internally configures itself to +the following behaviors: * the use_ansi flag is set to False. This has the effect of converting all JOIN phrases into the WHERE clause, and in the case of LEFT OUTER JOIN @@ -366,14 +375,15 @@ accessed over DBLINK, by passing the flag ``oracle_resolve_synonyms=True`` as a keyword argument to the :class:`_schema.Table` construct:: - some_table = Table('some_table', autoload_with=some_engine, - oracle_resolve_synonyms=True) + some_table = Table( + "some_table", autoload_with=some_engine, oracle_resolve_synonyms=True + ) -When this flag is set, the given name (such as ``some_table`` above) will -be searched not just in the ``ALL_TABLES`` view, but also within the +When this flag is set, the given name (such as ``some_table`` above) will be +searched not just in the ``ALL_TABLES`` view, but also within the ``ALL_SYNONYMS`` view to see if this name is actually a synonym to another -name. If the synonym is located and refers to a DBLINK, the oracle dialect -knows how to locate the table's information using DBLINK syntax(e.g. +name. If the synonym is located and refers to a DBLINK, the Oracle Database +dialects know how to locate the table's information using DBLINK syntax(e.g. ``@dblink``). ``oracle_resolve_synonyms`` is accepted wherever reflection arguments are @@ -387,8 +397,8 @@ Constraint Reflection --------------------- -The Oracle dialect can return information about foreign key, unique, and -CHECK constraints, as well as indexes on tables. +The Oracle Database dialects can return information about foreign key, unique, +and CHECK constraints, as well as indexes on tables. Raw information regarding these constraints can be acquired using :meth:`_reflection.Inspector.get_foreign_keys`, @@ -396,7 +406,7 @@ :meth:`_reflection.Inspector.get_check_constraints`, and :meth:`_reflection.Inspector.get_indexes`. -.. versionchanged:: 1.2 The Oracle dialect can now reflect UNIQUE and +.. versionchanged:: 1.2 The Oracle Database dialect can now reflect UNIQUE and CHECK constraints. When using reflection at the :class:`_schema.Table` level, the @@ -406,29 +416,29 @@ Note the following caveats: * When using the :meth:`_reflection.Inspector.get_check_constraints` method, - Oracle - builds a special "IS NOT NULL" constraint for columns that specify - "NOT NULL". This constraint is **not** returned by default; to include - the "IS NOT NULL" constraints, pass the flag ``include_all=True``:: + Oracle Database builds a special "IS NOT NULL" constraint for columns that + specify "NOT NULL". This constraint is **not** returned by default; to + include the "IS NOT NULL" constraints, pass the flag ``include_all=True``:: from sqlalchemy import create_engine, inspect - engine = create_engine("oracle+cx_oracle://s:t@dsn") + engine = create_engine( + "oracle+oracledb://scott:tiger@localhost:1521?service_name=freepdb1" + ) inspector = inspect(engine) all_check_constraints = inspector.get_check_constraints( - "some_table", include_all=True) + "some_table", include_all=True + ) -* in most cases, when reflecting a :class:`_schema.Table`, - a UNIQUE constraint will - **not** be available as a :class:`.UniqueConstraint` object, as Oracle - mirrors unique constraints with a UNIQUE index in most cases (the exception - seems to be when two or more unique constraints represent the same columns); - the :class:`_schema.Table` will instead represent these using - :class:`.Index` - with the ``unique=True`` flag set. +* in most cases, when reflecting a :class:`_schema.Table`, a UNIQUE constraint + will **not** be available as a :class:`.UniqueConstraint` object, as Oracle + Database mirrors unique constraints with a UNIQUE index in most cases (the + exception seems to be when two or more unique constraints represent the same + columns); the :class:`_schema.Table` will instead represent these using + :class:`.Index` with the ``unique=True`` flag set. -* Oracle creates an implicit index for the primary key of a table; this index - is **excluded** from all index results. +* Oracle Database creates an implicit index for the primary key of a table; + this index is **excluded** from all index results. * the list of columns reflected for an index will not include column names that start with SYS_NC. @@ -448,50 +458,112 @@ # exclude SYSAUX and SOME_TABLESPACE, but not SYSTEM e = create_engine( - "oracle+cx_oracle://scott:tiger@xe", - exclude_tablespaces=["SYSAUX", "SOME_TABLESPACE"]) + "oracle+oracledb://scott:tiger@localhost:1521/?service_name=freepdb1", + exclude_tablespaces=["SYSAUX", "SOME_TABLESPACE"], + ) + +.. _oracle_float_support: + +FLOAT / DOUBLE Support and Behaviors +------------------------------------ + +The SQLAlchemy :class:`.Float` and :class:`.Double` datatypes are generic +datatypes that resolve to the "least surprising" datatype for a given backend. +For Oracle Database, this means they resolve to the ``FLOAT`` and ``DOUBLE`` +types:: + + >>> from sqlalchemy import cast, literal, Float + >>> from sqlalchemy.dialects import oracle + >>> float_datatype = Float() + >>> print(cast(literal(5.0), float_datatype).compile(dialect=oracle.dialect())) + CAST(:param_1 AS FLOAT) + +Oracle's ``FLOAT`` / ``DOUBLE`` datatypes are aliases for ``NUMBER``. Oracle +Database stores ``NUMBER`` values with full precision, not floating point +precision, which means that ``FLOAT`` / ``DOUBLE`` do not actually behave like +native FP values. Oracle Database instead offers special datatypes +``BINARY_FLOAT`` and ``BINARY_DOUBLE`` to deliver real 4- and 8- byte FP +values. + +SQLAlchemy supports these datatypes directly using :class:`.BINARY_FLOAT` and +:class:`.BINARY_DOUBLE`. To use the :class:`.Float` or :class:`.Double` +datatypes in a database agnostic way, while allowing Oracle backends to utilize +one of these types, use the :meth:`.TypeEngine.with_variant` method to set up a +variant:: + + >>> from sqlalchemy import cast, literal, Float + >>> from sqlalchemy.dialects import oracle + >>> float_datatype = Float().with_variant(oracle.BINARY_FLOAT(), "oracle") + >>> print(cast(literal(5.0), float_datatype).compile(dialect=oracle.dialect())) + CAST(:param_1 AS BINARY_FLOAT) + +E.g. to use this datatype in a :class:`.Table` definition:: + + my_table = Table( + "my_table", + metadata, + Column( + "fp_data", Float().with_variant(oracle.BINARY_FLOAT(), "oracle") + ), + ) DateTime Compatibility ---------------------- -Oracle has no datatype known as ``DATETIME``, it instead has only ``DATE``, -which can actually store a date and time value. For this reason, the Oracle -dialect provides a type :class:`_oracle.DATE` which is a subclass of -:class:`.DateTime`. This type has no special behavior, and is only -present as a "marker" for this type; additionally, when a database column -is reflected and the type is reported as ``DATE``, the time-supporting +Oracle Database has no datatype known as ``DATETIME``, it instead has only +``DATE``, which can actually store a date and time value. For this reason, the +Oracle Database dialects provide a type :class:`_oracle.DATE` which is a +subclass of :class:`.DateTime`. This type has no special behavior, and is only +present as a "marker" for this type; additionally, when a database column is +reflected and the type is reported as ``DATE``, the time-supporting :class:`_oracle.DATE` type is used. .. _oracle_table_options: -Oracle Table Options --------------------- +Oracle Database Table Options +----------------------------- -The CREATE TABLE phrase supports the following options with Oracle -in conjunction with the :class:`_schema.Table` construct: +The CREATE TABLE phrase supports the following options with Oracle Database +dialects in conjunction with the :class:`_schema.Table` construct: * ``ON COMMIT``:: Table( - "some_table", metadata, ..., - prefixes=['GLOBAL TEMPORARY'], oracle_on_commit='PRESERVE ROWS') + "some_table", + metadata, + ..., + prefixes=["GLOBAL TEMPORARY"], + oracle_on_commit="PRESERVE ROWS", + ) + +* + ``COMPRESS``:: -* ``COMPRESS``:: + Table( + "mytable", metadata, Column("data", String(32)), oracle_compress=True + ) - Table('mytable', metadata, Column('data', String(32)), - oracle_compress=True) + Table("mytable", metadata, Column("data", String(32)), oracle_compress=6) - Table('mytable', metadata, Column('data', String(32)), - oracle_compress=6) + The ``oracle_compress`` parameter accepts either an integer compression + level, or ``True`` to use the default compression level. - The ``oracle_compress`` parameter accepts either an integer compression - level, or ``True`` to use the default compression level. +* + ``TABLESPACE``:: + + Table("mytable", metadata, ..., oracle_tablespace="EXAMPLE_TABLESPACE") + + The ``oracle_tablespace`` parameter specifies the tablespace in which the + table is to be created. This is useful when you want to create a table in a + tablespace other than the default tablespace of the user. + + .. versionadded:: 2.0.37 .. _oracle_index_options: -Oracle Specific Index Options ------------------------------ +Oracle Database Specific Index Options +-------------------------------------- Bitmap Indexes ~~~~~~~~~~~~~~ @@ -499,7 +571,7 @@ You can specify the ``oracle_bitmap`` parameter to create a bitmap index instead of a B-tree index:: - Index('my_index', my_table.c.data, oracle_bitmap=True) + Index("my_index", my_table.c.data, oracle_bitmap=True) Bitmap indexes cannot be unique and cannot be compressed. SQLAlchemy will not check for such limitations, only the database will. @@ -507,14 +579,19 @@ Index compression ~~~~~~~~~~~~~~~~~ -Oracle has a more efficient storage mode for indexes containing lots of -repeated values. Use the ``oracle_compress`` parameter to turn on key +Oracle Database has a more efficient storage mode for indexes containing lots +of repeated values. Use the ``oracle_compress`` parameter to turn on key compression:: - Index('my_index', my_table.c.data, oracle_compress=True) + Index("my_index", my_table.c.data, oracle_compress=True) - Index('my_index', my_table.c.data1, my_table.c.data2, unique=True, - oracle_compress=1) + Index( + "my_index", + my_table.c.data1, + my_table.c.data2, + unique=True, + oracle_compress=1, + ) The ``oracle_compress`` parameter accepts either an integer specifying the number of prefix columns to compress, or ``True`` to use the default (all @@ -706,16 +783,16 @@ def _generate_numeric( # https://www.oracletutorial.com/oracle-basics/oracle-float/ estimated_binary_precision = int(precision / 0.30103) raise exc.ArgumentError( - "Oracle FLOAT types use 'binary precision', which does " - "not convert cleanly from decimal 'precision'. Please " - "specify " - f"this type with a separate Oracle variant, such as " - f"{type_.__class__.__name__}(precision={precision})." + "Oracle Database FLOAT types use 'binary precision', " + "which does not convert cleanly from decimal " + "'precision'. Please specify " + "this type with a separate Oracle Database variant, such " + f"as {type_.__class__.__name__}(precision={precision})." f"with_variant(oracle.FLOAT" f"(binary_precision=" f"{estimated_binary_precision}), 'oracle'), so that the " - "Oracle specific 'binary_precision' may be specified " - "accurately." + "Oracle Database specific 'binary_precision' may be " + "specified accurately." ) else: precision = binary_precision @@ -837,7 +914,7 @@ def function_argspec(self, fn, **kw): def visit_function(self, func, **kw): text = super().visit_function(func, **kw) - if kw.get("asfrom", False): + if kw.get("asfrom", False) and func.name.lower() != "table": text = "TABLE (%s)" % text return text @@ -944,13 +1021,13 @@ def returning_clause( and not self.dialect._supports_update_returning_computed_cols ): util.warn( - "Computed columns don't work with Oracle UPDATE " + "Computed columns don't work with Oracle Database UPDATE " "statements that use RETURNING; the value of the column " "*before* the UPDATE takes place is returned. It is " - "advised to not use RETURNING with an Oracle computed " - "column. Consider setting implicit_returning to False on " - "the Table object in order to avoid implicit RETURNING " - "clauses from being generated for this Table." + "advised to not use RETURNING with an Oracle Database " + "computed column. Consider setting implicit_returning " + "to False on the Table object in order to avoid implicit " + "RETURNING clauses from being generated for this Table." ) if column.type._has_column_expression: col_expr = column.type.column_expression(column) @@ -974,7 +1051,7 @@ def returning_clause( raise exc.InvalidRequestError( "Using explicit outparam() objects with " "UpdateBase.returning() in the same Core DML statement " - "is not supported in the Oracle dialect." + "is not supported in the Oracle Database dialects." ) self._oracle_returning = True @@ -995,7 +1072,7 @@ def returning_clause( return "RETURNING " + ", ".join(columns) + " INTO " + ", ".join(binds) def _row_limit_clause(self, select, **kw): - """ORacle 12c supports OFFSET/FETCH operators + """Oracle Database 12c supports OFFSET/FETCH operators Use it instead subquery with row_number """ @@ -1279,7 +1356,7 @@ def define_constraint_cascades(self, constraint): # https://web.archive.org/web/20090317041251/https://asktom.oracle.com/tkyte/update_cascade/index.html if constraint.onupdate is not None: util.warn( - "Oracle does not contain native UPDATE CASCADE " + "Oracle Database does not contain native UPDATE CASCADE " "functionality - onupdates will not be rendered for foreign " "keys. Consider using deferrable=True, initially='deferred' " "or triggers." @@ -1333,7 +1410,10 @@ def post_create_table(self, table): table_opts.append("\n COMPRESS") else: table_opts.append("\n COMPRESS FOR %s" % (opts["compress"])) - + if opts["tablespace"]: + table_opts.append( + "\n TABLESPACE %s" % self.preparer.quote(opts["tablespace"]) + ) return "".join(table_opts) def get_identity_options(self, identity_options): @@ -1351,8 +1431,9 @@ def visit_computed_column(self, generated, **kw): ) if generated.persisted is True: raise exc.CompileError( - "Oracle computed columns do not support 'stored' persistence; " - "set the 'persisted' flag to None or False for Oracle support." + "Oracle Database computed columns do not support 'stored' " + "persistence; set the 'persisted' flag to None or False for " + "Oracle Database support." ) elif generated.persisted is False: text += " VIRTUAL" @@ -1457,7 +1538,12 @@ class OracleDialect(default.DefaultDialect): construct_arguments = [ ( sa_schema.Table, - {"resolve_synonyms": False, "on_commit": None, "compress": False}, + { + "resolve_synonyms": False, + "on_commit": None, + "compress": False, + "tablespace": None, + }, ), (sa_schema.Index, {"bitmap": False, "compress": False}), ] @@ -1465,8 +1551,8 @@ class OracleDialect(default.DefaultDialect): @util.deprecated_params( use_binds_for_limits=( "1.4", - "The ``use_binds_for_limits`` Oracle dialect parameter is " - "deprecated. The dialect now renders LIMIT /OFFSET integers " + "The ``use_binds_for_limits`` Oracle Database dialect parameter " + "is deprecated. The dialect now renders LIMIT / OFFSET integers " "inline in all cases using a post-compilation hook, so that the " "value is still represented by a 'bound parameter' on the Core " "Expression side.", @@ -2069,6 +2155,7 @@ def _table_options_query( if self._supports_table_compress_for else sql.null().label("compress_for") ), + dictionary.all_tables.c.tablespace_name, ).where(dictionary.all_tables.c.owner == owner) if has_filter_names: query = query.where( @@ -2160,11 +2247,12 @@ def get_multi_table_options( connection, query, dblink, returns_long=False, params=params ) - for table, compression, compress_for in result: + for table, compression, compress_for, tablespace in result: + data = default() if compression == "ENABLED": - data = {"oracle_compress": compress_for} - else: - data = default() + data["oracle_compress"] = compress_for + if tablespace: + data["oracle_tablespace"] = tablespace options[(schema, self.normalize_name(table))] = data if ObjectKind.VIEW in kind and ObjectScope.DEFAULT in scope: # add the views (no temporary views) diff --git a/libs/sqlalchemy/dialects/oracle/cx_oracle.py b/libs/sqlalchemy/dialects/oracle/cx_oracle.py index ed9b02d3f..0514ebbcd 100644 --- a/libs/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/libs/sqlalchemy/dialects/oracle/cx_oracle.py @@ -1,5 +1,5 @@ # dialects/oracle/cx_oracle.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -7,13 +7,18 @@ # mypy: ignore-errors -r""" -.. dialect:: oracle+cx_oracle +r""".. dialect:: oracle+cx_oracle :name: cx-Oracle :dbapi: cx_oracle :connectstring: oracle+cx_oracle://user:pass@hostname:port[/dbname][?service_name=<service>[&key=value&key=value...]] :url: https://oracle.github.io/python-cx_Oracle/ +Description +----------- + +cx_Oracle was the original driver for Oracle Database. It was superseded by +python-oracledb which should be used instead. + DSN vs. Hostname connections ----------------------------- @@ -23,27 +28,41 @@ Hostname Connections with Easy Connect Syntax ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Given a hostname, port and service name of the target Oracle Database, for -example from Oracle's `Easy Connect syntax -<https://cx-oracle.readthedocs.io/en/latest/user_guide/connection_handling.html#easy-connect-syntax-for-connection-strings>`_, -then connect in SQLAlchemy using the ``service_name`` query string parameter:: +Given a hostname, port and service name of the target database, for example +from Oracle Database's Easy Connect syntax then connect in SQLAlchemy using the +``service_name`` query string parameter:: - engine = create_engine("oracle+cx_oracle://scott:tiger@hostname:port/?service_name=myservice&encoding=UTF-8&nencoding=UTF-8") + engine = create_engine( + "oracle+cx_oracle://scott:tiger@hostname:port?service_name=myservice&encoding=UTF-8&nencoding=UTF-8" + ) -The `full Easy Connect syntax -<https://www.oracle.com/pls/topic/lookup?ctx=dblatest&id=GUID-B0437826-43C1-49EC-A94D-B650B6A4A6EE>`_ -is not supported. Instead, use a ``tnsnames.ora`` file and connect using a -DSN. +Note that the default driver value for encoding and nencoding was changed to +“UTF-8” in cx_Oracle 8.0 so these parameters can be omitted when using that +version, or later. -Connections with tnsnames.ora or Oracle Cloud -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To use a full Easy Connect string, pass it as the ``dsn`` key value in a +:paramref:`_sa.create_engine.connect_args` dictionary:: + + import cx_Oracle + + e = create_engine( + "oracle+cx_oracle://@", + connect_args={ + "user": "scott", + "password": "tiger", + "dsn": "hostname:port/myservice?transport_connect_timeout=30&expire_time=60", + }, + ) + +Connections with tnsnames.ora or to Oracle Autonomous Database +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Alternatively, if no port, database name, or service name is provided, the +dialect will use an Oracle Database DSN "connection string". This takes the +"hostname" portion of the URL as the data source name. For example, if the +``tnsnames.ora`` file contains a TNS Alias of ``myalias`` as below: -Alternatively, if no port, database name, or ``service_name`` is provided, the -dialect will use an Oracle DSN "connection string". This takes the "hostname" -portion of the URL as the data source name. For example, if the -``tnsnames.ora`` file contains a `Net Service Name -<https://cx-oracle.readthedocs.io/en/latest/user_guide/connection_handling.html#net-service-names-for-connection-strings>`_ -of ``myalias`` as below:: +.. sourcecode:: text myalias = (DESCRIPTION = @@ -58,19 +77,22 @@ hostname portion of the URL, without specifying a port, database name or ``service_name``:: - engine = create_engine("oracle+cx_oracle://scott:tiger@myalias/?encoding=UTF-8&nencoding=UTF-8") + engine = create_engine("oracle+cx_oracle://scott:tiger@myalias") -Users of Oracle Cloud should use this syntax and also configure the cloud +Users of Oracle Autonomous Database should use this syntax. If the database is +configured for mutural TLS ("mTLS"), then you must also configure the cloud wallet as shown in cx_Oracle documentation `Connecting to Autononmous Databases <https://cx-oracle.readthedocs.io/en/latest/user_guide/connection_handling.html#autonomousdb>`_. SID Connections ^^^^^^^^^^^^^^^ -To use Oracle's obsolete SID connection syntax, the SID can be passed in a -"database name" portion of the URL as below:: +To use Oracle Database's obsolete System Identifier connection syntax, the SID +can be passed in a "database name" portion of the URL:: - engine = create_engine("oracle+cx_oracle://scott:tiger@hostname:1521/dbname?encoding=UTF-8&nencoding=UTF-8") + engine = create_engine( + "oracle+cx_oracle://scott:tiger@hostname:port/dbname" + ) Above, the DSN passed to cx_Oracle is created by ``cx_Oracle.makedsn()`` as follows:: @@ -79,17 +101,23 @@ >>> cx_Oracle.makedsn("hostname", 1521, sid="dbname") '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=1521))(CONNECT_DATA=(SID=dbname)))' +Note that although the SQLAlchemy syntax ``hostname:port/dbname`` looks like +Oracle's Easy Connect syntax it is different. It uses a SID in place of the +service name required by Easy Connect. The Easy Connect syntax does not +support SIDs. + Passing cx_Oracle connect arguments ----------------------------------- -Additional connection arguments can usually be passed via the URL -query string; particular symbols like ``cx_Oracle.SYSDBA`` are intercepted -and converted to the correct symbol:: +Additional connection arguments can usually be passed via the URL query string; +particular symbols like ``SYSDBA`` are intercepted and converted to the correct +symbol:: e = create_engine( - "oracle+cx_oracle://user:pass@dsn?encoding=UTF-8&nencoding=UTF-8&mode=SYSDBA&events=true") + "oracle+cx_oracle://user:pass@dsn?encoding=UTF-8&nencoding=UTF-8&mode=SYSDBA&events=true" + ) -.. versionchanged:: 1.3 the cx_oracle dialect now accepts all argument names +.. versionchanged:: 1.3 the cx_Oracle dialect now accepts all argument names within the URL string itself, to be passed to the cx_Oracle DBAPI. As was the case earlier but not correctly documented, the :paramref:`_sa.create_engine.connect_args` parameter also accepts all @@ -100,19 +128,20 @@ Any cx_Oracle parameter value and/or constant may be passed, such as:: import cx_Oracle + e = create_engine( "oracle+cx_oracle://user:pass@dsn", connect_args={ "encoding": "UTF-8", "nencoding": "UTF-8", "mode": cx_Oracle.SYSDBA, - "events": True - } + "events": True, + }, ) -Note that the default value for ``encoding`` and ``nencoding`` was changed to -"UTF-8" in cx_Oracle 8.0 so these parameters can be omitted when using that -version, or later. +Note that the default driver value for ``encoding`` and ``nencoding`` was +changed to "UTF-8" in cx_Oracle 8.0 so these parameters can be omitted when +using that version, or later. Options consumed by the SQLAlchemy cx_Oracle dialect outside of the driver -------------------------------------------------------------------------- @@ -122,7 +151,8 @@ , such as:: e = create_engine( - "oracle+cx_oracle://user:pass@dsn", coerce_to_decimal=False) + "oracle+cx_oracle://user:pass@dsn", coerce_to_decimal=False + ) The parameters accepted by the cx_oracle dialect are as follows: @@ -130,8 +160,7 @@ to ``None``, indicating that the driver default should be used (typically the value is 100). This setting controls how many rows are buffered when fetching rows, and can have a significant effect on performance when - modified. The setting is used for both ``cx_Oracle`` as well as - ``oracledb``. + modified. .. versionchanged:: 2.0.26 - changed the default value from 50 to None, to use the default value of the driver itself. @@ -147,10 +176,16 @@ Using cx_Oracle SessionPool --------------------------- -The cx_Oracle library provides its own connection pool implementation that may -be used in place of SQLAlchemy's pooling functionality. This can be achieved -by using the :paramref:`_sa.create_engine.creator` parameter to provide a -function that returns a new connection, along with setting +The cx_Oracle driver provides its own connection pool implementation that may +be used in place of SQLAlchemy's pooling functionality. The driver pool +supports Oracle Database features such dead connection detection, connection +draining for planned database downtime, support for Oracle Application +Continuity and Transparent Application Continuity, and gives support for +Database Resident Connection Pooling (DRCP). + +Using the driver pool can be achieved by using the +:paramref:`_sa.create_engine.creator` parameter to provide a function that +returns a new connection, along with setting :paramref:`_sa.create_engine.pool_class` to ``NullPool`` to disable SQLAlchemy's pooling:: @@ -159,32 +194,41 @@ from sqlalchemy.pool import NullPool pool = cx_Oracle.SessionPool( - user="scott", password="tiger", dsn="orclpdb", - min=2, max=5, increment=1, threaded=True, - encoding="UTF-8", nencoding="UTF-8" + user="scott", + password="tiger", + dsn="orclpdb", + min=1, + max=4, + increment=1, + threaded=True, + encoding="UTF-8", + nencoding="UTF-8", ) - engine = create_engine("oracle+cx_oracle://", creator=pool.acquire, poolclass=NullPool) + engine = create_engine( + "oracle+cx_oracle://", creator=pool.acquire, poolclass=NullPool + ) The above engine may then be used normally where cx_Oracle's pool handles connection pooling:: with engine.connect() as conn: - print(conn.scalar("select 1 FROM dual")) - + print(conn.scalar("select 1 from dual")) As well as providing a scalable solution for multi-user applications, the cx_Oracle session pool supports some Oracle features such as DRCP and `Application Continuity <https://cx-oracle.readthedocs.io/en/latest/user_guide/ha.html#application-continuity-ac>`_. +Note that the pool creation parameters ``threaded``, ``encoding`` and +``nencoding`` were deprecated in later cx_Oracle releases. + Using Oracle Database Resident Connection Pooling (DRCP) -------------------------------------------------------- -When using Oracle's `DRCP -<https://www.oracle.com/pls/topic/lookup?ctx=dblatest&id=GUID-015CA8C1-2386-4626-855D-CC546DDC1086>`_, -the best practice is to pass a connection class and "purity" when acquiring a -connection from the SessionPool. Refer to the `cx_Oracle DRCP documentation +When using Oracle Database's DRCP, the best practice is to pass a connection +class and "purity" when acquiring a connection from the SessionPool. Refer to +the `cx_Oracle DRCP documentation <https://cx-oracle.readthedocs.io/en/latest/user_guide/connection_handling.html#database-resident-connection-pooling-drcp>`_. This can be achieved by wrapping ``pool.acquire()``:: @@ -194,21 +238,33 @@ from sqlalchemy.pool import NullPool pool = cx_Oracle.SessionPool( - user="scott", password="tiger", dsn="orclpdb", - min=2, max=5, increment=1, threaded=True, - encoding="UTF-8", nencoding="UTF-8" + user="scott", + password="tiger", + dsn="orclpdb", + min=2, + max=5, + increment=1, + threaded=True, + encoding="UTF-8", + nencoding="UTF-8", ) + def creator(): - return pool.acquire(cclass="MYCLASS", purity=cx_Oracle.ATTR_PURITY_SELF) + return pool.acquire( + cclass="MYCLASS", purity=cx_Oracle.ATTR_PURITY_SELF + ) + - engine = create_engine("oracle+cx_oracle://", creator=creator, poolclass=NullPool) + engine = create_engine( + "oracle+cx_oracle://", creator=creator, poolclass=NullPool + ) The above engine may then be used normally where cx_Oracle handles session pooling and Oracle Database additionally uses DRCP:: with engine.connect() as conn: - print(conn.scalar("select 1 FROM dual")) + print(conn.scalar("select 1 from dual")) .. _cx_oracle_unicode: @@ -216,24 +272,28 @@ def creator(): ------- As is the case for all DBAPIs under Python 3, all strings are inherently -Unicode strings. In all cases however, the driver requires an explicit +Unicode strings. In all cases however, the driver requires an explicit encoding configuration. Ensuring the Correct Client Encoding ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The long accepted standard for establishing client encoding for nearly all -Oracle related software is via the `NLS_LANG <https://www.oracle.com/database/technologies/faq-nls-lang.html>`_ -environment variable. cx_Oracle like most other Oracle drivers will use -this environment variable as the source of its encoding configuration. The -format of this variable is idiosyncratic; a typical value would be -``AMERICAN_AMERICA.AL32UTF8``. - -The cx_Oracle driver also supports a programmatic alternative which is to -pass the ``encoding`` and ``nencoding`` parameters directly to its -``.connect()`` function. These can be present in the URL as follows:: - - engine = create_engine("oracle+cx_oracle://scott:tiger@orclpdb/?encoding=UTF-8&nencoding=UTF-8") +Oracle Database related software is via the `NLS_LANG +<https://www.oracle.com/database/technologies/faq-nls-lang.html>`_ environment +variable. Older versions of cx_Oracle use this environment variable as the +source of its encoding configuration. The format of this variable is +Territory_Country.CharacterSet; a typical value would be +``AMERICAN_AMERICA.AL32UTF8``. cx_Oracle version 8 and later use the character +set "UTF-8" by default, and ignore the character set component of NLS_LANG. + +The cx_Oracle driver also supported a programmatic alternative which is to pass +the ``encoding`` and ``nencoding`` parameters directly to its ``.connect()`` +function. These can be present in the URL as follows:: + + engine = create_engine( + "oracle+cx_oracle://scott:tiger@tnsalias?encoding=UTF-8&nencoding=UTF-8" + ) For the meaning of the ``encoding`` and ``nencoding`` parameters, please consult @@ -248,25 +308,24 @@ def creator(): Unicode-specific Column datatypes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The Core expression language handles unicode data by use of the :class:`.Unicode` -and :class:`.UnicodeText` -datatypes. These types correspond to the VARCHAR2 and CLOB Oracle datatypes by -default. When using these datatypes with Unicode data, it is expected that -the Oracle database is configured with a Unicode-aware character set, as well -as that the ``NLS_LANG`` environment variable is set appropriately, so that -the VARCHAR2 and CLOB datatypes can accommodate the data. +The Core expression language handles unicode data by use of the +:class:`.Unicode` and :class:`.UnicodeText` datatypes. These types correspond +to the VARCHAR2 and CLOB Oracle Database datatypes by default. When using +these datatypes with Unicode data, it is expected that the database is +configured with a Unicode-aware character set, as well as that the ``NLS_LANG`` +environment variable is set appropriately (this applies to older versions of +cx_Oracle), so that the VARCHAR2 and CLOB datatypes can accommodate the data. -In the case that the Oracle database is not configured with a Unicode character +In the case that Oracle Database is not configured with a Unicode character set, the two options are to use the :class:`_types.NCHAR` and :class:`_oracle.NCLOB` datatypes explicitly, or to pass the flag -``use_nchar_for_unicode=True`` to :func:`_sa.create_engine`, -which will cause the -SQLAlchemy dialect to use NCHAR/NCLOB for the :class:`.Unicode` / +``use_nchar_for_unicode=True`` to :func:`_sa.create_engine`, which will cause +the SQLAlchemy dialect to use NCHAR/NCLOB for the :class:`.Unicode` / :class:`.UnicodeText` datatypes instead of VARCHAR/CLOB. -.. versionchanged:: 1.3 The :class:`.Unicode` and :class:`.UnicodeText` - datatypes now correspond to the ``VARCHAR2`` and ``CLOB`` Oracle datatypes - unless the ``use_nchar_for_unicode=True`` is passed to the dialect +.. versionchanged:: 1.3 The :class:`.Unicode` and :class:`.UnicodeText` + datatypes now correspond to the ``VARCHAR2`` and ``CLOB`` Oracle Database + datatypes unless the ``use_nchar_for_unicode=True`` is passed to the dialect when :func:`_sa.create_engine` is called. @@ -275,7 +334,7 @@ def creator(): Encoding Errors ^^^^^^^^^^^^^^^ -For the unusual case that data in the Oracle database is present with a broken +For the unusual case that data in Oracle Database is present with a broken encoding, the dialect accepts a parameter ``encoding_errors`` which will be passed to Unicode decoding functions in order to affect how decoding errors are handled. The value is ultimately consumed by the Python `decode @@ -293,13 +352,13 @@ def creator(): ------------------------------------------------------------------------------- The cx_Oracle DBAPI has a deep and fundamental reliance upon the usage of the -DBAPI ``setinputsizes()`` call. The purpose of this call is to establish the +DBAPI ``setinputsizes()`` call. The purpose of this call is to establish the datatypes that are bound to a SQL statement for Python values being passed as parameters. While virtually no other DBAPI assigns any use to the ``setinputsizes()`` call, the cx_Oracle DBAPI relies upon it heavily in its -interactions with the Oracle client interface, and in some scenarios it is not -possible for SQLAlchemy to know exactly how data should be bound, as some -settings can cause profoundly different performance characteristics, while +interactions with the Oracle Database client interface, and in some scenarios +it is not possible for SQLAlchemy to know exactly how data should be bound, as +some settings can cause profoundly different performance characteristics, while altering the type coercion behavior at the same time. Users of the cx_Oracle dialect are **strongly encouraged** to read through @@ -328,13 +387,16 @@ def creator(): engine = create_engine("oracle+cx_oracle://scott:tiger@host/xe") + @event.listens_for(engine, "do_setinputsizes") def _log_setinputsizes(inputsizes, cursor, statement, parameters, context): for bindparam, dbapitype in inputsizes.items(): - log.info( - "Bound parameter name: %s SQLAlchemy type: %r " - "DBAPI object: %s", - bindparam.key, bindparam.type, dbapitype) + log.info( + "Bound parameter name: %s SQLAlchemy type: %r DBAPI object: %s", + bindparam.key, + bindparam.type, + dbapitype, + ) Example 2 - remove all bindings to CLOB ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -348,41 +410,42 @@ def _log_setinputsizes(inputsizes, cursor, statement, parameters, context): engine = create_engine("oracle+cx_oracle://scott:tiger@host/xe") + @event.listens_for(engine, "do_setinputsizes") def _remove_clob(inputsizes, cursor, statement, parameters, context): for bindparam, dbapitype in list(inputsizes.items()): if dbapitype is CLOB: del inputsizes[bindparam] -.. _cx_oracle_returning: - -RETURNING Support ------------------ - -The cx_Oracle dialect implements RETURNING using OUT parameters. -The dialect supports RETURNING fully. - .. _cx_oracle_lob: LOB Datatypes -------------- LOB datatypes refer to the "large object" datatypes such as CLOB, NCLOB and -BLOB. Modern versions of cx_Oracle and oracledb are optimized for these -datatypes to be delivered as a single buffer. As such, SQLAlchemy makes use of -these newer type handlers by default. +BLOB. Modern versions of cx_Oracle is optimized for these datatypes to be +delivered as a single buffer. As such, SQLAlchemy makes use of these newer type +handlers by default. To disable the use of newer type handlers and deliver LOB objects as classic buffered objects with a ``read()`` method, the parameter ``auto_convert_lobs=False`` may be passed to :func:`_sa.create_engine`, which takes place only engine-wide. -Two Phase Transactions Not Supported (use oracledb) ---------------------------------------------------- +.. _cx_oracle_returning: + +RETURNING Support +----------------- + +The cx_Oracle dialect implements RETURNING using OUT parameters. +The dialect supports RETURNING fully. + +Two Phase Transactions Not Supported +------------------------------------ Two phase transactions are **not supported** under cx_Oracle due to poor driver -support. The newer :ref:`oracledb` dialect however **does** support two phase -transactions and should be preferred. +support. The newer :ref:`oracledb` dialect however **does** support two phase +transactions. .. _cx_oracle_numeric: @@ -393,20 +456,21 @@ def _remove_clob(inputsizes, cursor, statement, parameters, context): ``Decimal`` objects or float objects. When a :class:`.Numeric` object, or a subclass such as :class:`.Float`, :class:`_oracle.DOUBLE_PRECISION` etc. is in use, the :paramref:`.Numeric.asdecimal` flag determines if values should be -coerced to ``Decimal`` upon return, or returned as float objects. To make -matters more complicated under Oracle, Oracle's ``NUMBER`` type can also -represent integer values if the "scale" is zero, so the Oracle-specific -:class:`_oracle.NUMBER` type takes this into account as well. +coerced to ``Decimal`` upon return, or returned as float objects. To make +matters more complicated under Oracle Database, the ``NUMBER`` type can also +represent integer values if the "scale" is zero, so the Oracle +Database-specific :class:`_oracle.NUMBER` type takes this into account as well. The cx_Oracle dialect makes extensive use of connection- and cursor-level "outputtypehandler" callables in order to coerce numeric values as requested. These callables are specific to the specific flavor of :class:`.Numeric` in -use, as well as if no SQLAlchemy typing objects are present. There are -observed scenarios where Oracle may sends incomplete or ambiguous information -about the numeric types being returned, such as a query where the numeric types -are buried under multiple levels of subquery. The type handlers do their best -to make the right decision in all cases, deferring to the underlying cx_Oracle -DBAPI for all those cases where the driver can make the best decision. +use, as well as if no SQLAlchemy typing objects are present. There are +observed scenarios where Oracle Database may send incomplete or ambiguous +information about the numeric types being returned, such as a query where the +numeric types are buried under multiple levels of subquery. The type handlers +do their best to make the right decision in all cases, deferring to the +underlying cx_Oracle DBAPI for all those cases where the driver can make the +best decision. When no typing objects are present, as when executing plain SQL strings, a default "outputtypehandler" is present which will generally return numeric @@ -1289,8 +1353,13 @@ def output_type_handler( cx_Oracle.CLOB, cx_Oracle.NCLOB, ): + typ = ( + cx_Oracle.DB_TYPE_VARCHAR + if default_type is cx_Oracle.CLOB + else cx_Oracle.DB_TYPE_NVARCHAR + ) return cursor.var( - cx_Oracle.DB_TYPE_NVARCHAR, + typ, _CX_ORACLE_MAGIC_LOB_SIZE, cursor.arraysize, **dialect._cursor_var_unicode_kwargs, diff --git a/libs/sqlalchemy/dialects/oracle/dictionary.py b/libs/sqlalchemy/dialects/oracle/dictionary.py index 63479b9fc..f785a66ef 100644 --- a/libs/sqlalchemy/dialects/oracle/dictionary.py +++ b/libs/sqlalchemy/dialects/oracle/dictionary.py @@ -1,5 +1,5 @@ # dialects/oracle/dictionary.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/oracle/oracledb.py b/libs/sqlalchemy/dialects/oracle/oracledb.py index 0667ed768..c09d2bae0 100644 --- a/libs/sqlalchemy/dialects/oracle/oracledb.py +++ b/libs/sqlalchemy/dialects/oracle/oracledb.py @@ -1,13 +1,12 @@ # dialects/oracle/oracledb.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under # the MIT License: https://www.opensource.org/licenses/mit-license.php # mypy: ignore-errors -r""" -.. dialect:: oracle+oracledb +r""".. dialect:: oracle+oracledb :name: python-oracledb :dbapi: oracledb :connectstring: oracle+oracledb://user:pass@hostname:port[/dbname][?service_name=<service>[&key=value&key=value...]] @@ -16,75 +15,581 @@ Description ----------- -python-oracledb is released by Oracle to supersede the cx_Oracle driver. -It is fully compatible with cx_Oracle and features both a "thin" client -mode that requires no dependencies, as well as a "thick" mode that uses -the Oracle Client Interface in the same way as cx_Oracle. +Python-oracledb is the Oracle Database driver for Python. It features a default +"thin" client mode that requires no dependencies, and an optional "thick" mode +that uses Oracle Client libraries. It supports SQLAlchemy features including +two phase transactions and Asyncio. -.. seealso:: - - :ref:`cx_oracle` - all of cx_Oracle's notes apply to the oracledb driver - as well, with the exception that oracledb supports two phase transactions. +Python-oracle is the renamed, updated cx_Oracle driver. Oracle is no longer +doing any releases in the cx_Oracle namespace. The SQLAlchemy ``oracledb`` dialect provides both a sync and an async implementation under the same dialect name. The proper version is selected depending on how the engine is created: * calling :func:`_sa.create_engine` with ``oracle+oracledb://...`` will - automatically select the sync version, e.g.:: + automatically select the sync version:: from sqlalchemy import create_engine - sync_engine = create_engine("oracle+oracledb://scott:tiger@localhost/?service_name=XEPDB1") -* calling :func:`_asyncio.create_async_engine` with - ``oracle+oracledb://...`` will automatically select the async version, - e.g.:: + sync_engine = create_engine( + "oracle+oracledb://scott:tiger@localhost?service_name=FREEPDB1" + ) + +* calling :func:`_asyncio.create_async_engine` with ``oracle+oracledb://...`` + will automatically select the async version:: from sqlalchemy.ext.asyncio import create_async_engine - asyncio_engine = create_async_engine("oracle+oracledb://scott:tiger@localhost/?service_name=XEPDB1") -The asyncio version of the dialect may also be specified explicitly using the -``oracledb_async`` suffix, as:: + asyncio_engine = create_async_engine( + "oracle+oracledb://scott:tiger@localhost?service_name=FREEPDB1" + ) - from sqlalchemy.ext.asyncio import create_async_engine - asyncio_engine = create_async_engine("oracle+oracledb_async://scott:tiger@localhost/?service_name=XEPDB1") + The asyncio version of the dialect may also be specified explicitly using the + ``oracledb_async`` suffix:: + + from sqlalchemy.ext.asyncio import create_async_engine + + asyncio_engine = create_async_engine( + "oracle+oracledb_async://scott:tiger@localhost?service_name=FREEPDB1" + ) .. versionadded:: 2.0.25 added support for the async version of oracledb. Thick mode support ------------------ -By default the ``python-oracledb`` is started in thin mode, that does not -require oracle client libraries to be installed in the system. The -``python-oracledb`` driver also support a "thick" mode, that behaves -similarly to ``cx_oracle`` and requires that Oracle Client Interface (OCI) -is installed. +By default, the python-oracledb driver runs in a "thin" mode that does not +require Oracle Client libraries to be installed. The driver also supports a +"thick" mode that uses Oracle Client libraries to get functionality such as +Oracle Application Continuity. + +To enable thick mode, call `oracledb.init_oracle_client() +<https://python-oracledb.readthedocs.io/en/latest/api_manual/module.html#oracledb.init_oracle_client>`_ +explicitly, or pass the parameter ``thick_mode=True`` to +:func:`_sa.create_engine`. To pass custom arguments to +``init_oracle_client()``, like the ``lib_dir`` path, a dict may be passed, for +example:: + + engine = sa.create_engine( + "oracle+oracledb://...", + thick_mode={ + "lib_dir": "/path/to/oracle/client/lib", + "config_dir": "/path/to/network_config_file_directory", + "driver_name": "my-app : 1.0.0", + }, + ) + +Note that passing a ``lib_dir`` path should only be done on macOS or +Windows. On Linux it does not behave as you might expect. -To enable this mode, the user may call ``oracledb.init_oracle_client`` -manually, or by passing the parameter ``thick_mode=True`` to -:func:`_sa.create_engine`. To pass custom arguments to ``init_oracle_client``, -like the ``lib_dir`` path, a dict may be passed to this parameter, as in:: +.. seealso:: - engine = sa.create_engine("oracle+oracledb://...", thick_mode={ - "lib_dir": "/path/to/oracle/client/lib", "driver_name": "my-app" - }) + python-oracledb documentation `Enabling python-oracledb Thick mode + <https://python-oracledb.readthedocs.io/en/latest/user_guide/initialization.html#enabling-python-oracledb-thick-mode>`_ + +Connecting to Oracle Database +----------------------------- + +python-oracledb provides several methods of indicating the target database. +The dialect translates from a series of different URL forms. + +Given the hostname, port and service name of the target database, you can +connect in SQLAlchemy using the ``service_name`` query string parameter:: + + engine = create_engine( + "oracle+oracledb://scott:tiger@hostname:port?service_name=myservice" + ) + +Connecting with Easy Connect strings +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can pass any valid python-oracledb connection string as the ``dsn`` key +value in a :paramref:`_sa.create_engine.connect_args` dictionary. See +python-oracledb documentation `Oracle Net Services Connection Strings +<https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#oracle-net-services-connection-strings>`_. + +For example to use an `Easy Connect string +<https://download.oracle.com/ocomdocs/global/Oracle-Net-Easy-Connect-Plus.pdf>`_ +with a timeout to prevent connection establishment from hanging if the network +transport to the database cannot be establishd in 30 seconds, and also setting +a keep-alive time of 60 seconds to stop idle network connections from being +terminated by a firewall:: + + e = create_engine( + "oracle+oracledb://@", + connect_args={ + "user": "scott", + "password": "tiger", + "dsn": "hostname:port/myservice?transport_connect_timeout=30&expire_time=60", + }, + ) + +The Easy Connect syntax has been enhanced during the life of Oracle Database. +Review the documentation for your database version. The current documentation +is at `Understanding the Easy Connect Naming Method +<https://www.oracle.com/pls/topic/lookup?ctx=dblatest&id=GUID-B0437826-43C1-49EC-A94D-B650B6A4A6EE>`_. + +The general syntax is similar to: + +.. sourcecode:: text + + [[protocol:]//]host[:port][/[service_name]][?parameter_name=value{¶meter_name=value}] + +Note that although the SQLAlchemy URL syntax ``hostname:port/dbname`` looks +like Oracle's Easy Connect syntax, it is different. SQLAlchemy's URL requires a +system identifier (SID) for the ``dbname`` component:: + + engine = create_engine("oracle+oracledb://scott:tiger@hostname:port/sid") + +Easy Connect syntax does not support SIDs. It uses services names, which are +the preferred choice for connecting to Oracle Database. + +Passing python-oracledb connect arguments +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Other python-oracledb driver `connection options +<https://python-oracledb.readthedocs.io/en/latest/api_manual/module.html#oracledb.connect>`_ +can be passed in ``connect_args``. For example:: + + e = create_engine( + "oracle+oracledb://@", + connect_args={ + "user": "scott", + "password": "tiger", + "dsn": "hostname:port/myservice", + "events": True, + "mode": oracledb.AUTH_MODE_SYSDBA, + }, + ) + +Connecting with tnsnames.ora TNS aliases +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If no port, database name, or service name is provided, the dialect will use an +Oracle Database DSN "connection string". This takes the "hostname" portion of +the URL as the data source name. For example, if the ``tnsnames.ora`` file +contains a `TNS Alias +<https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#tns-aliases-for-connection-strings>`_ +of ``myalias`` as below: + +.. sourcecode:: text + + myalias = + (DESCRIPTION = + (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.example.com)(PORT = 1521)) + (CONNECT_DATA = + (SERVER = DEDICATED) + (SERVICE_NAME = orclpdb1) + ) + ) + +The python-oracledb dialect connects to this database service when ``myalias`` is the +hostname portion of the URL, without specifying a port, database name or +``service_name``:: + + engine = create_engine("oracle+oracledb://scott:tiger@myalias") + +Connecting to Oracle Autonomous Database +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Users of Oracle Autonomous Database should use either use the TNS Alias URL +shown above, or pass the TNS Alias as the ``dsn`` key value in a +:paramref:`_sa.create_engine.connect_args` dictionary. + +If Oracle Autonomous Database is configured for mutual TLS ("mTLS") +connections, then additional configuration is required as shown in `Connecting +to Oracle Cloud Autonomous Databases +<https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#connecting-to-oracle-cloud-autonomous-databases>`_. In +summary, Thick mode users should configure file locations and set the wallet +path in ``sqlnet.ora`` appropriately:: + + e = create_engine( + "oracle+oracledb://@", + thick_mode={ + # directory containing tnsnames.ora and cwallet.so + "config_dir": "/opt/oracle/wallet_dir", + }, + connect_args={ + "user": "scott", + "password": "tiger", + "dsn": "mydb_high", + }, + ) + +Thin mode users of mTLS should pass the appropriate directories and PEM wallet +password when creating the engine, similar to:: + + e = create_engine( + "oracle+oracledb://@", + connect_args={ + "user": "scott", + "password": "tiger", + "dsn": "mydb_high", + "config_dir": "/opt/oracle/wallet_dir", # directory containing tnsnames.ora + "wallet_location": "/opt/oracle/wallet_dir", # directory containing ewallet.pem + "wallet_password": "top secret", # password for the PEM file + }, + ) + +Typically ``config_dir`` and ``wallet_location`` are the same directory, which +is where the Oracle Autonomous Database wallet zip file was extracted. Note +this directory should be protected. + +Connection Pooling +------------------ + +Applications with multiple concurrent users should use connection pooling. A +minimal sized connection pool is also beneficial for long-running, single-user +applications that do not frequently use a connection. + +The python-oracledb driver provides its own connection pool implementation that +may be used in place of SQLAlchemy's pooling functionality. The driver pool +gives support for high availability features such as dead connection detection, +connection draining for planned database downtime, support for Oracle +Application Continuity and Transparent Application Continuity, and gives +support for `Database Resident Connection Pooling (DRCP) +<https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#database-resident-connection-pooling-drcp>`_. + +To take advantage of python-oracledb's pool, use the +:paramref:`_sa.create_engine.creator` parameter to provide a function that +returns a new connection, along with setting +:paramref:`_sa.create_engine.pool_class` to ``NullPool`` to disable +SQLAlchemy's pooling:: + + import oracledb + from sqlalchemy import create_engine + from sqlalchemy import text + from sqlalchemy.pool import NullPool + + # Uncomment to use the optional python-oracledb Thick mode. + # Review the python-oracledb doc for the appropriate parameters + # oracledb.init_oracle_client(<your parameters>) + + pool = oracledb.create_pool( + user="scott", + password="tiger", + dsn="localhost:1521/freepdb1", + min=1, + max=4, + increment=1, + ) + engine = create_engine( + "oracle+oracledb://", creator=pool.acquire, poolclass=NullPool + ) + +The above engine may then be used normally. Internally, python-oracledb handles +connection pooling:: + + with engine.connect() as conn: + print(conn.scalar(text("select 1 from dual"))) + +Refer to the python-oracledb documentation for `oracledb.create_pool() +<https://python-oracledb.readthedocs.io/en/latest/api_manual/module.html#oracledb.create_pool>`_ +for the arguments that can be used when creating a connection pool. + +.. _drcp: + +Using Oracle Database Resident Connection Pooling (DRCP) +-------------------------------------------------------- + +When using Oracle Database's Database Resident Connection Pooling (DRCP), the +best practice is to specify a connection class and "purity". Refer to the +`python-oracledb documentation on DRCP +<https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#database-resident-connection-pooling-drcp>`_. +For example:: + + import oracledb + from sqlalchemy import create_engine + from sqlalchemy import text + from sqlalchemy.pool import NullPool + + # Uncomment to use the optional python-oracledb Thick mode. + # Review the python-oracledb doc for the appropriate parameters + # oracledb.init_oracle_client(<your parameters>) + + pool = oracledb.create_pool( + user="scott", + password="tiger", + dsn="localhost:1521/freepdb1", + min=1, + max=4, + increment=1, + cclass="MYCLASS", + purity=oracledb.PURITY_SELF, + ) + engine = create_engine( + "oracle+oracledb://", creator=pool.acquire, poolclass=NullPool + ) + +The above engine may then be used normally where python-oracledb handles +application connection pooling and Oracle Database additionally uses DRCP:: + + with engine.connect() as conn: + print(conn.scalar(text("select 1 from dual"))) + +If you wish to use different connection classes or purities for different +connections, then wrap ``pool.acquire()``:: + + import oracledb + from sqlalchemy import create_engine + from sqlalchemy import text + from sqlalchemy.pool import NullPool + + # Uncomment to use python-oracledb Thick mode. + # Review the python-oracledb doc for the appropriate parameters + # oracledb.init_oracle_client(<your parameters>) + + pool = oracledb.create_pool( + user="scott", + password="tiger", + dsn="localhost:1521/freepdb1", + min=1, + max=4, + increment=1, + cclass="MYCLASS", + purity=oracledb.PURITY_SELF, + ) + + + def creator(): + return pool.acquire(cclass="MYOTHERCLASS", purity=oracledb.PURITY_NEW) + + + engine = create_engine( + "oracle+oracledb://", creator=creator, poolclass=NullPool + ) + +Engine Options consumed by the SQLAlchemy oracledb dialect outside of the driver +-------------------------------------------------------------------------------- + +There are also options that are consumed by the SQLAlchemy oracledb dialect +itself. These options are always passed directly to :func:`_sa.create_engine`, +such as:: + + e = create_engine("oracle+oracledb://user:pass@tnsalias", arraysize=500) + +The parameters accepted by the oracledb dialect are as follows: + +* ``arraysize`` - set the driver cursor.arraysize value. It defaults to + ``None``, indicating that the driver default value of 100 should be used. + This setting controls how many rows are buffered when fetching rows, and can + have a significant effect on performance if increased for queries that return + large numbers of rows. + + .. versionchanged:: 2.0.26 - changed the default value from 50 to None, + to use the default value of the driver itself. + +* ``auto_convert_lobs`` - defaults to True; See :ref:`oracledb_lob`. + +* ``coerce_to_decimal`` - see :ref:`oracledb_numeric` for detail. + +* ``encoding_errors`` - see :ref:`oracledb_unicode_encoding_errors` for detail. + +.. _oracledb_unicode: + +Unicode +------- + +As is the case for all DBAPIs under Python 3, all strings are inherently +Unicode strings. + +Ensuring the Correct Client Encoding +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In python-oracledb, the encoding used for all character data is "UTF-8". + +Unicode-specific Column datatypes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Core expression language handles unicode data by use of the +:class:`.Unicode` and :class:`.UnicodeText` datatypes. These types correspond +to the VARCHAR2 and CLOB Oracle Database datatypes by default. When using +these datatypes with Unicode data, it is expected that the database is +configured with a Unicode-aware character set so that the VARCHAR2 and CLOB +datatypes can accommodate the data. + +In the case that Oracle Database is not configured with a Unicode character +set, the two options are to use the :class:`_types.NCHAR` and +:class:`_oracle.NCLOB` datatypes explicitly, or to pass the flag +``use_nchar_for_unicode=True`` to :func:`_sa.create_engine`, which will cause +the SQLAlchemy dialect to use NCHAR/NCLOB for the :class:`.Unicode` / +:class:`.UnicodeText` datatypes instead of VARCHAR/CLOB. + +.. versionchanged:: 1.3 The :class:`.Unicode` and :class:`.UnicodeText` + datatypes now correspond to the ``VARCHAR2`` and ``CLOB`` Oracle Database + datatypes unless the ``use_nchar_for_unicode=True`` is passed to the dialect + when :func:`_sa.create_engine` is called. -.. seealso:: - https://python-oracledb.readthedocs.io/en/latest/api_manual/module.html#oracledb.init_oracle_client +.. _oracledb_unicode_encoding_errors: -Two Phase Transactions Supported --------------------------------- +Encoding Errors +^^^^^^^^^^^^^^^ -Two phase transactions are fully supported under oracledb. Starting with -oracledb 2.3 two phase transactions are supported also in thin mode. APIs -for two phase transactions are provided at the Core level via -:meth:`_engine.Connection.begin_twophase` and :paramref:`_orm.Session.twophase` -for transparent ORM use. +For the unusual case that data in Oracle Database is present with a broken +encoding, the dialect accepts a parameter ``encoding_errors`` which will be +passed to Unicode decoding functions in order to affect how decoding errors are +handled. The value is ultimately consumed by the Python `decode +<https://docs.python.org/3/library/stdtypes.html#bytes.decode>`_ function, and +is passed both via python-oracledb's ``encodingErrors`` parameter consumed by +``Cursor.var()``, as well as SQLAlchemy's own decoding function, as the +python-oracledb dialect makes use of both under different circumstances. + +.. versionadded:: 1.3.11 + + +.. _oracledb_setinputsizes: + +Fine grained control over python-oracledb data binding with setinputsizes +------------------------------------------------------------------------- + +The python-oracle DBAPI has a deep and fundamental reliance upon the usage of +the DBAPI ``setinputsizes()`` call. The purpose of this call is to establish +the datatypes that are bound to a SQL statement for Python values being passed +as parameters. While virtually no other DBAPI assigns any use to the +``setinputsizes()`` call, the python-oracledb DBAPI relies upon it heavily in +its interactions with the Oracle Database, and in some scenarios it is not +possible for SQLAlchemy to know exactly how data should be bound, as some +settings can cause profoundly different performance characteristics, while +altering the type coercion behavior at the same time. + +Users of the oracledb dialect are **strongly encouraged** to read through +python-oracledb's list of built-in datatype symbols at `Database Types +<https://python-oracledb.readthedocs.io/en/latest/api_manual/module.html#database-types>`_ +Note that in some cases, significant performance degradation can occur when +using these types vs. not. + +On the SQLAlchemy side, the :meth:`.DialectEvents.do_setinputsizes` event can +be used both for runtime visibility (e.g. logging) of the setinputsizes step as +well as to fully control how ``setinputsizes()`` is used on a per-statement +basis. + +.. versionadded:: 1.2.9 Added :meth:`.DialectEvents.setinputsizes` + + +Example 1 - logging all setinputsizes calls +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following example illustrates how to log the intermediary values from a +SQLAlchemy perspective before they are converted to the raw ``setinputsizes()`` +parameter dictionary. The keys of the dictionary are :class:`.BindParameter` +objects which have a ``.key`` and a ``.type`` attribute:: + + from sqlalchemy import create_engine, event + + engine = create_engine( + "oracle+oracledb://scott:tiger@localhost:1521?service_name=freepdb1" + ) + + + @event.listens_for(engine, "do_setinputsizes") + def _log_setinputsizes(inputsizes, cursor, statement, parameters, context): + for bindparam, dbapitype in inputsizes.items(): + log.info( + "Bound parameter name: %s SQLAlchemy type: %r DBAPI object: %s", + bindparam.key, + bindparam.type, + dbapitype, + ) + +Example 2 - remove all bindings to CLOB +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For performance, fetching LOB datatypes from Oracle Database is set by default +for the ``Text`` type within SQLAlchemy. This setting can be modified as +follows:: + + + from sqlalchemy import create_engine, event + from oracledb import CLOB + + engine = create_engine( + "oracle+oracledb://scott:tiger@localhost:1521?service_name=freepdb1" + ) + + + @event.listens_for(engine, "do_setinputsizes") + def _remove_clob(inputsizes, cursor, statement, parameters, context): + for bindparam, dbapitype in list(inputsizes.items()): + if dbapitype is CLOB: + del inputsizes[bindparam] + +.. _oracledb_lob: + +LOB Datatypes +-------------- + +LOB datatypes refer to the "large object" datatypes such as CLOB, NCLOB and +BLOB. Oracle Database can efficiently return these datatypes as a single +buffer. SQLAlchemy makes use of type handlers to do this by default. + +To disable the use of the type handlers and deliver LOB objects as classic +buffered objects with a ``read()`` method, the parameter +``auto_convert_lobs=False`` may be passed to :func:`_sa.create_engine`. + +.. _oracledb_returning: + +RETURNING Support +----------------- + +The oracledb dialect implements RETURNING using OUT parameters. The dialect +supports RETURNING fully. + +Two Phase Transaction Support +----------------------------- + +Two phase transactions are fully supported with python-oracledb. (Thin mode +requires python-oracledb 2.3). APIs for two phase transactions are provided at +the Core level via :meth:`_engine.Connection.begin_twophase` and +:paramref:`_orm.Session.twophase` for transparent ORM use. .. versionchanged:: 2.0.32 added support for two phase transactions -.. versionadded:: 2.0.0 added support for oracledb driver. +.. _oracledb_numeric: + +Precision Numerics +------------------ + +SQLAlchemy's numeric types can handle receiving and returning values as Python +``Decimal`` objects or float objects. When a :class:`.Numeric` object, or a +subclass such as :class:`.Float`, :class:`_oracle.DOUBLE_PRECISION` etc. is in +use, the :paramref:`.Numeric.asdecimal` flag determines if values should be +coerced to ``Decimal`` upon return, or returned as float objects. To make +matters more complicated under Oracle Database, the ``NUMBER`` type can also +represent integer values if the "scale" is zero, so the Oracle +Database-specific :class:`_oracle.NUMBER` type takes this into account as well. + +The oracledb dialect makes extensive use of connection- and cursor-level +"outputtypehandler" callables in order to coerce numeric values as requested. +These callables are specific to the specific flavor of :class:`.Numeric` in +use, as well as if no SQLAlchemy typing objects are present. There are +observed scenarios where Oracle Database may send incomplete or ambiguous +information about the numeric types being returned, such as a query where the +numeric types are buried under multiple levels of subquery. The type handlers +do their best to make the right decision in all cases, deferring to the +underlying python-oracledb DBAPI for all those cases where the driver can make +the best decision. + +When no typing objects are present, as when executing plain SQL strings, a +default "outputtypehandler" is present which will generally return numeric +values which specify precision and scale as Python ``Decimal`` objects. To +disable this coercion to decimal for performance reasons, pass the flag +``coerce_to_decimal=False`` to :func:`_sa.create_engine`:: + + engine = create_engine( + "oracle+oracledb://scott:tiger@tnsalias", coerce_to_decimal=False + ) + +The ``coerce_to_decimal`` flag only impacts the results of plain string +SQL statements that are not otherwise associated with a :class:`.Numeric` +SQLAlchemy type (or a subclass of such). + +.. versionchanged:: 1.2 The numeric handling system for the oracle dialects has + been reworked to take advantage of newer driver features as well as better + integration of outputtypehandlers. + +.. versionadded:: 2.0.0 added support for the python-oracledb driver. """ # noqa from __future__ import annotations @@ -221,6 +726,13 @@ def do_recover_twophase(self, connection): for fi, gti, bq in connection.connection.tpc_recover() ] + def _check_max_identifier_length(self, connection): + if self.oracledb_ver >= (2, 5): + max_len = connection.connection.max_identifier_length + if max_len is not None: + return max_len + return super()._check_max_identifier_length(connection) + class AsyncAdapt_oracledb_cursor(AsyncAdapt_dbapi_cursor): _cursor: AsyncCursor @@ -251,7 +763,7 @@ def _aenter_cursor(self, cursor: AsyncCursor) -> AsyncCursor: self._adapt_connection._handle_exception(error) async def _execute_async(self, operation, parameters): - # override to not use mutex, oracledb already has mutex + # override to not use mutex, oracledb already has a mutex if parameters is None: result = await self._cursor.execute(operation) @@ -267,7 +779,7 @@ async def _executemany_async( operation, seq_of_parameters, ): - # override to not use mutex, oracledb already has mutex + # override to not use mutex, oracledb already has a mutex return await self._cursor.executemany(operation, seq_of_parameters) def __enter__(self): @@ -325,6 +837,10 @@ def stmtcachesize(self): def stmtcachesize(self, value): self._connection.stmtcachesize = value + @property + def max_identifier_length(self): + return self._connection.max_identifier_length + def cursor(self): return AsyncAdapt_oracledb_cursor(self) diff --git a/libs/sqlalchemy/dialects/oracle/provision.py b/libs/sqlalchemy/dialects/oracle/provision.py index b33c1525c..3587de9d0 100644 --- a/libs/sqlalchemy/dialects/oracle/provision.py +++ b/libs/sqlalchemy/dialects/oracle/provision.py @@ -1,5 +1,5 @@ # dialects/oracle/provision.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -89,7 +89,7 @@ def _oracle_drop_db(cfg, eng, ident): # cx_Oracle seems to occasionally leak open connections when a large # suite it run, even if we confirm we have zero references to # connection objects. - # while there is a "kill session" command in Oracle, + # while there is a "kill session" command in Oracle Database, # it unfortunately does not release the connection sufficiently. _ora_drop_ignore(conn, ident) _ora_drop_ignore(conn, "%s_ts1" % ident) diff --git a/libs/sqlalchemy/dialects/oracle/types.py b/libs/sqlalchemy/dialects/oracle/types.py index 36caaa05e..06aeaace2 100644 --- a/libs/sqlalchemy/dialects/oracle/types.py +++ b/libs/sqlalchemy/dialects/oracle/types.py @@ -1,5 +1,5 @@ # dialects/oracle/types.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -64,17 +64,18 @@ def _type_affinity(self): class FLOAT(sqltypes.FLOAT): - """Oracle FLOAT. + """Oracle Database FLOAT. This is the same as :class:`_sqltypes.FLOAT` except that - an Oracle-specific :paramref:`_oracle.FLOAT.binary_precision` + an Oracle Database -specific :paramref:`_oracle.FLOAT.binary_precision` parameter is accepted, and the :paramref:`_sqltypes.Float.precision` parameter is not accepted. - Oracle FLOAT types indicate precision in terms of "binary precision", which - defaults to 126. For a REAL type, the value is 63. This parameter does not - cleanly map to a specific number of decimal places but is roughly - equivalent to the desired number of decimal places divided by 0.3103. + Oracle Database FLOAT types indicate precision in terms of "binary + precision", which defaults to 126. For a REAL type, the value is 63. This + parameter does not cleanly map to a specific number of decimal places but + is roughly equivalent to the desired number of decimal places divided by + 0.3103. .. versionadded:: 2.0 @@ -91,10 +92,11 @@ def __init__( r""" Construct a FLOAT - :param binary_precision: Oracle binary precision value to be rendered - in DDL. This may be approximated to the number of decimal characters - using the formula "decimal precision = 0.30103 * binary precision". - The default value used by Oracle for FLOAT / DOUBLE PRECISION is 126. + :param binary_precision: Oracle Database binary precision value to be + rendered in DDL. This may be approximated to the number of decimal + characters using the formula "decimal precision = 0.30103 * binary + precision". The default value used by Oracle Database for FLOAT / + DOUBLE PRECISION is 126. :param asdecimal: See :paramref:`_sqltypes.Float.asdecimal` @@ -109,10 +111,36 @@ def __init__( class BINARY_DOUBLE(sqltypes.Double): + """Implement the Oracle ``BINARY_DOUBLE`` datatype. + + This datatype differs from the Oracle ``DOUBLE`` datatype in that it + delivers a true 8-byte FP value. The datatype may be combined with a + generic :class:`.Double` datatype using :meth:`.TypeEngine.with_variant`. + + .. seealso:: + + :ref:`oracle_float_support` + + + """ + __visit_name__ = "BINARY_DOUBLE" class BINARY_FLOAT(sqltypes.Float): + """Implement the Oracle ``BINARY_FLOAT`` datatype. + + This datatype differs from the Oracle ``FLOAT`` datatype in that it + delivers a true 4-byte FP value. The datatype may be combined with a + generic :class:`.Float` datatype using :meth:`.TypeEngine.with_variant`. + + .. seealso:: + + :ref:`oracle_float_support` + + + """ + __visit_name__ = "BINARY_FLOAT" @@ -163,10 +191,10 @@ def process(value): class DATE(_OracleDateLiteralRender, sqltypes.DateTime): - """Provide the oracle DATE type. + """Provide the Oracle Database DATE type. This type has no special Python behavior, except that it subclasses - :class:`_types.DateTime`; this is to suit the fact that the Oracle + :class:`_types.DateTime`; this is to suit the fact that the Oracle Database ``DATE`` type supports a time value. """ @@ -246,8 +274,8 @@ def process(value: dt.timedelta) -> str: class TIMESTAMP(sqltypes.TIMESTAMP): - """Oracle implementation of ``TIMESTAMP``, which supports additional - Oracle-specific modes + """Oracle Database implementation of ``TIMESTAMP``, which supports + additional Oracle Database-specific modes .. versionadded:: 2.0 @@ -257,10 +285,11 @@ def __init__(self, timezone: bool = False, local_timezone: bool = False): """Construct a new :class:`_oracle.TIMESTAMP`. :param timezone: boolean. Indicates that the TIMESTAMP type should - use Oracle's ``TIMESTAMP WITH TIME ZONE`` datatype. + use Oracle Database's ``TIMESTAMP WITH TIME ZONE`` datatype. :param local_timezone: boolean. Indicates that the TIMESTAMP type - should use Oracle's ``TIMESTAMP WITH LOCAL TIME ZONE`` datatype. + should use Oracle Database's ``TIMESTAMP WITH LOCAL TIME ZONE`` + datatype. """ @@ -273,7 +302,7 @@ def __init__(self, timezone: bool = False, local_timezone: bool = False): class ROWID(sqltypes.TypeEngine): - """Oracle ROWID type. + """Oracle Database ROWID type. When used in a cast() or similar, generates ROWID. diff --git a/libs/sqlalchemy/dialects/postgresql/__init__.py b/libs/sqlalchemy/dialects/postgresql/__init__.py index 325ea8869..88935e202 100644 --- a/libs/sqlalchemy/dialects/postgresql/__init__.py +++ b/libs/sqlalchemy/dialects/postgresql/__init__.py @@ -1,5 +1,5 @@ # dialects/postgresql/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/postgresql/_psycopg_common.py b/libs/sqlalchemy/dialects/postgresql/_psycopg_common.py index 46858c9f2..d827e054c 100644 --- a/libs/sqlalchemy/dialects/postgresql/_psycopg_common.py +++ b/libs/sqlalchemy/dialects/postgresql/_psycopg_common.py @@ -1,5 +1,5 @@ # dialects/postgresql/_psycopg_common.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/postgresql/array.py b/libs/sqlalchemy/dialects/postgresql/array.py index 1d63655ee..7708769cb 100644 --- a/libs/sqlalchemy/dialects/postgresql/array.py +++ b/libs/sqlalchemy/dialects/postgresql/array.py @@ -1,5 +1,5 @@ # dialects/postgresql/array.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -54,11 +54,13 @@ class array(expression.ExpressionClauseList[_T]): from sqlalchemy.dialects import postgresql from sqlalchemy import select, func - stmt = select(array([1,2]) + array([3,4,5])) + stmt = select(array([1, 2]) + array([3, 4, 5])) print(stmt.compile(dialect=postgresql.dialect())) - Produces the SQL:: + Produces the SQL: + + .. sourcecode:: sql SELECT ARRAY[%(param_1)s, %(param_2)s] || ARRAY[%(param_3)s, %(param_4)s, %(param_5)s]) AS anon_1 @@ -67,7 +69,7 @@ class array(expression.ExpressionClauseList[_T]): :class:`_types.ARRAY`. The "inner" type of the array is inferred from the values present, unless the ``type_`` keyword argument is passed:: - array(['foo', 'bar'], type_=CHAR) + array(["foo", "bar"], type_=CHAR) Multidimensional arrays are produced by nesting :class:`.array` constructs. The dimensionality of the final :class:`_types.ARRAY` @@ -76,16 +78,21 @@ class array(expression.ExpressionClauseList[_T]): type:: stmt = select( - array([ - array([1, 2]), array([3, 4]), array([column('q'), column('x')]) - ]) + array( + [array([1, 2]), array([3, 4]), array([column("q"), column("x")])] + ) ) print(stmt.compile(dialect=postgresql.dialect())) - Produces:: + Produces: - SELECT ARRAY[ARRAY[%(param_1)s, %(param_2)s], - ARRAY[%(param_3)s, %(param_4)s], ARRAY[q, x]] AS anon_1 + .. sourcecode:: sql + + SELECT ARRAY[ + ARRAY[%(param_1)s, %(param_2)s], + ARRAY[%(param_3)s, %(param_4)s], + ARRAY[q, x] + ] AS anon_1 .. versionadded:: 1.3.6 added support for multidimensional array literals @@ -93,7 +100,7 @@ class array(expression.ExpressionClauseList[_T]): :class:`_postgresql.ARRAY` - """ + """ # noqa: E501 __visit_name__ = "array" @@ -166,9 +173,11 @@ class ARRAY(sqltypes.ARRAY): from sqlalchemy.dialects import postgresql - mytable = Table("mytable", metadata, - Column("data", postgresql.ARRAY(Integer, dimensions=2)) - ) + mytable = Table( + "mytable", + metadata, + Column("data", postgresql.ARRAY(Integer, dimensions=2)), + ) The :class:`_postgresql.ARRAY` type provides all operations defined on the core :class:`_types.ARRAY` type, including support for "dimensions", @@ -204,6 +213,7 @@ class also from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy.ext.mutable import MutableList + class SomeOrmClass(Base): # ... @@ -236,7 +246,7 @@ def __init__( E.g.:: - Column('myarray', ARRAY(Integer)) + Column("myarray", ARRAY(Integer)) Arguments are: diff --git a/libs/sqlalchemy/dialects/postgresql/asyncpg.py b/libs/sqlalchemy/dialects/postgresql/asyncpg.py index 27bd07ab0..523c47abc 100644 --- a/libs/sqlalchemy/dialects/postgresql/asyncpg.py +++ b/libs/sqlalchemy/dialects/postgresql/asyncpg.py @@ -1,5 +1,5 @@ # dialects/postgresql/asyncpg.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors <see AUTHORS +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors <see AUTHORS # file> # # This module is part of SQLAlchemy and is released under @@ -23,7 +23,10 @@ :func:`_asyncio.create_async_engine` engine creation function:: from sqlalchemy.ext.asyncio import create_async_engine - engine = create_async_engine("postgresql+asyncpg://user:pass@hostname/dbname") + + engine = create_async_engine( + "postgresql+asyncpg://user:pass@hostname/dbname" + ) .. versionadded:: 1.4 @@ -78,11 +81,15 @@ argument):: - engine = create_async_engine("postgresql+asyncpg://user:pass@hostname/dbname?prepared_statement_cache_size=500") + engine = create_async_engine( + "postgresql+asyncpg://user:pass@hostname/dbname?prepared_statement_cache_size=500" + ) To disable the prepared statement cache, use a value of zero:: - engine = create_async_engine("postgresql+asyncpg://user:pass@hostname/dbname?prepared_statement_cache_size=0") + engine = create_async_engine( + "postgresql+asyncpg://user:pass@hostname/dbname?prepared_statement_cache_size=0" + ) .. versionadded:: 1.4.0b2 Added ``prepared_statement_cache_size`` for asyncpg. @@ -131,7 +138,7 @@ "postgresql+asyncpg://user:pass@somepgbouncer/dbname", poolclass=NullPool, connect_args={ - 'prepared_statement_name_func': lambda: f'__asyncpg_{uuid4()}__', + "prepared_statement_name_func": lambda: f"__asyncpg_{uuid4()}__", }, ) @@ -258,6 +265,10 @@ class AsyncpgInteger(sqltypes.Integer): render_bind_cast = True +class AsyncpgSmallInteger(sqltypes.SmallInteger): + render_bind_cast = True + + class AsyncpgBigInteger(sqltypes.BigInteger): render_bind_cast = True @@ -535,7 +546,8 @@ async def _prepare_and_execute(self, operation, parameters): status = prepared_stmt.get_statusmsg() reg = re.match( - r"(?:SELECT|UPDATE|DELETE|INSERT \d+) (\d+)", status + r"(?:SELECT|UPDATE|DELETE|INSERT \d+) (\d+)", + status or "", ) if reg: self.rowcount = int(reg.group(1)) @@ -1044,6 +1056,7 @@ class PGDialect_asyncpg(PGDialect): INTERVAL: AsyncPgInterval, sqltypes.Boolean: AsyncpgBoolean, sqltypes.Integer: AsyncpgInteger, + sqltypes.SmallInteger: AsyncpgSmallInteger, sqltypes.BigInteger: AsyncpgBigInteger, sqltypes.Numeric: AsyncpgNumeric, sqltypes.Float: AsyncpgFloat, diff --git a/libs/sqlalchemy/dialects/postgresql/base.py b/libs/sqlalchemy/dialects/postgresql/base.py index e5e7fceb1..9bfaa277c 100644 --- a/libs/sqlalchemy/dialects/postgresql/base.py +++ b/libs/sqlalchemy/dialects/postgresql/base.py @@ -1,5 +1,5 @@ # dialects/postgresql/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -31,7 +31,7 @@ metadata, Column( "id", Integer, Sequence("some_id_seq", start=1), primary_key=True - ) + ), ) When SQLAlchemy issues a single INSERT statement, to fulfill the contract of @@ -63,9 +63,9 @@ "data", metadata, Column( - 'id', Integer, Identity(start=42, cycle=True), primary_key=True + "id", Integer, Identity(start=42, cycle=True), primary_key=True ), - Column('data', String) + Column("data", String), ) The CREATE TABLE for the above :class:`_schema.Table` object would be: @@ -92,23 +92,21 @@ from sqlalchemy.ext.compiler import compiles - @compiles(CreateColumn, 'postgresql') + @compiles(CreateColumn, "postgresql") def use_identity(element, compiler, **kw): text = compiler.visit_create_column(element, **kw) - text = text.replace( - "SERIAL", "INT GENERATED BY DEFAULT AS IDENTITY" - ) + text = text.replace("SERIAL", "INT GENERATED BY DEFAULT AS IDENTITY") return text Using the above, a table such as:: t = Table( - 't', m, - Column('id', Integer, primary_key=True), - Column('data', String) + "t", m, Column("id", Integer, primary_key=True), Column("data", String) ) - Will generate on the backing database as:: + Will generate on the backing database as: + + .. sourcecode:: sql CREATE TABLE t ( id INT GENERATED BY DEFAULT AS IDENTITY, @@ -129,7 +127,9 @@ def use_identity(element, compiler, **kw): option:: with engine.connect() as conn: - result = conn.execution_options(stream_results=True).execute(text("select * from table")) + result = conn.execution_options(stream_results=True).execute( + text("select * from table") + ) Note that some kinds of SQL statements may not be supported with server side cursors; generally, only SQL statements that return rows should be @@ -168,17 +168,15 @@ def use_identity(element, compiler, **kw): engine = create_engine( "postgresql+pg8000://scott:tiger@localhost/test", - isolation_level = "REPEATABLE READ" + isolation_level="REPEATABLE READ", ) To set using per-connection execution options:: with engine.connect() as conn: - conn = conn.execution_options( - isolation_level="REPEATABLE READ" - ) + conn = conn.execution_options(isolation_level="REPEATABLE READ") with conn.begin(): - # ... work with transaction + ... # work with transaction There are also more options for isolation level configurations, such as "sub-engine" objects linked to a main :class:`_engine.Engine` which each apply @@ -221,10 +219,10 @@ def use_identity(element, compiler, **kw): conn = conn.execution_options( isolation_level="SERIALIZABLE", postgresql_readonly=True, - postgresql_deferrable=True + postgresql_deferrable=True, ) with conn.begin(): - # ... work with transaction + ... # work with transaction Note that some DBAPIs such as asyncpg only support "readonly" with SERIALIZABLE isolation. @@ -269,7 +267,6 @@ def use_identity(element, compiler, **kw): postgresql_engine = create_engine( "postgresql+pyscopg2://scott:tiger@hostname/dbname", - # disable default reset-on-return scheme pool_reset_on_return=None, ) @@ -316,6 +313,7 @@ def _reset_postgresql(dbapi_connection, connection_record, reset_state): engine = create_engine("postgresql+psycopg2://scott:tiger@host/dbname") + @event.listens_for(engine, "connect", insert=True) def set_search_path(dbapi_connection, connection_record): existing_autocommit = dbapi_connection.autocommit @@ -334,9 +332,6 @@ def set_search_path(dbapi_connection, connection_record): :ref:`schema_set_default_connections` - in the :ref:`metadata_toplevel` documentation - - - .. _postgresql_schema_reflection: Remote-Schema Table Introspection and PostgreSQL search_path @@ -360,7 +355,9 @@ def set_search_path(dbapi_connection, connection_record): to **determine the default schema for the current database connection**. It does this using the PostgreSQL ``current_schema()`` function, illustated below using a PostgreSQL client session (i.e. using -the ``psql`` tool):: +the ``psql`` tool): + +.. sourcecode:: sql test=> select current_schema(); current_schema @@ -374,7 +371,9 @@ def set_search_path(dbapi_connection, connection_record): However, if your database username **matches the name of a schema**, PostgreSQL's default is to then **use that name as the default schema**. Below, we log in using the username ``scott``. When we create a schema named ``scott``, **it -implicitly changes the default schema**:: +implicitly changes the default schema**: + +.. sourcecode:: sql test=> select current_schema(); current_schema @@ -393,7 +392,9 @@ def set_search_path(dbapi_connection, connection_record): The behavior of ``current_schema()`` is derived from the `PostgreSQL search path <https://www.postgresql.org/docs/current/static/ddl-schemas.html#DDL-SCHEMAS-PATH>`_ -variable ``search_path``, which in modern PostgreSQL versions defaults to this:: +variable ``search_path``, which in modern PostgreSQL versions defaults to this: + +.. sourcecode:: sql test=> show search_path; search_path @@ -419,7 +420,9 @@ def set_search_path(dbapi_connection, connection_record): returns a sample definition for a particular foreign key constraint, omitting the referenced schema name from that definition when the name is also in the PostgreSQL schema search path. The interaction below -illustrates this behavior:: +illustrates this behavior: + +.. sourcecode:: sql test=> CREATE TABLE test_schema.referred(id INTEGER PRIMARY KEY); CREATE TABLE @@ -446,13 +449,17 @@ def set_search_path(dbapi_connection, connection_record): the function. On the other hand, if we set the search path back to the typical default -of ``public``:: +of ``public``: + +.. sourcecode:: sql test=> SET search_path TO public; SET The same query against ``pg_get_constraintdef()`` now returns the fully -schema-qualified name for us:: +schema-qualified name for us: + +.. sourcecode:: sql test=> SELECT pg_catalog.pg_get_constraintdef(r.oid, true) FROM test-> pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n @@ -474,16 +481,14 @@ def set_search_path(dbapi_connection, connection_record): >>> with engine.connect() as conn: ... conn.execute(text("SET search_path TO test_schema, public")) ... metadata_obj = MetaData() - ... referring = Table('referring', metadata_obj, - ... autoload_with=conn) - ... + ... referring = Table("referring", metadata_obj, autoload_with=conn) <sqlalchemy.engine.result.CursorResult object at 0x101612ed0> The above process would deliver to the :attr:`_schema.MetaData.tables` collection ``referred`` table named **without** the schema:: - >>> metadata_obj.tables['referred'].schema is None + >>> metadata_obj.tables["referred"].schema is None True To alter the behavior of reflection such that the referred schema is @@ -495,15 +500,17 @@ def set_search_path(dbapi_connection, connection_record): >>> with engine.connect() as conn: ... conn.execute(text("SET search_path TO test_schema, public")) ... metadata_obj = MetaData() - ... referring = Table('referring', metadata_obj, - ... autoload_with=conn, - ... postgresql_ignore_search_path=True) - ... + ... referring = Table( + ... "referring", + ... metadata_obj, + ... autoload_with=conn, + ... postgresql_ignore_search_path=True, + ... ) <sqlalchemy.engine.result.CursorResult object at 0x1016126d0> We will now have ``test_schema.referred`` stored as schema-qualified:: - >>> metadata_obj.tables['test_schema.referred'].schema + >>> metadata_obj.tables["test_schema.referred"].schema 'test_schema' .. sidebar:: Best Practices for PostgreSQL Schema reflection @@ -537,18 +544,26 @@ def set_search_path(dbapi_connection, connection_record): use the :meth:`._UpdateBase.returning` method on a per-statement basis:: # INSERT..RETURNING - result = table.insert().returning(table.c.col1, table.c.col2).\ - values(name='foo') + result = ( + table.insert().returning(table.c.col1, table.c.col2).values(name="foo") + ) print(result.fetchall()) # UPDATE..RETURNING - result = table.update().returning(table.c.col1, table.c.col2).\ - where(table.c.name=='foo').values(name='bar') + result = ( + table.update() + .returning(table.c.col1, table.c.col2) + .where(table.c.name == "foo") + .values(name="bar") + ) print(result.fetchall()) # DELETE..RETURNING - result = table.delete().returning(table.c.col1, table.c.col2).\ - where(table.c.name=='foo') + result = ( + table.delete() + .returning(table.c.col1, table.c.col2) + .where(table.c.name == "foo") + ) print(result.fetchall()) .. _postgresql_insert_on_conflict: @@ -578,19 +593,16 @@ def set_search_path(dbapi_connection, connection_record): >>> from sqlalchemy.dialects.postgresql import insert >>> insert_stmt = insert(my_table).values( - ... id='some_existing_id', - ... data='inserted value') - >>> do_nothing_stmt = insert_stmt.on_conflict_do_nothing( - ... index_elements=['id'] + ... id="some_existing_id", data="inserted value" ... ) + >>> do_nothing_stmt = insert_stmt.on_conflict_do_nothing(index_elements=["id"]) >>> print(do_nothing_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT (id) DO NOTHING {stop} >>> do_update_stmt = insert_stmt.on_conflict_do_update( - ... constraint='pk_my_table', - ... set_=dict(data='updated value') + ... constraint="pk_my_table", set_=dict(data="updated value") ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) @@ -616,8 +628,7 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> do_update_stmt = insert_stmt.on_conflict_do_update( - ... index_elements=['id'], - ... set_=dict(data='updated value') + ... index_elements=["id"], set_=dict(data="updated value") ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) @@ -625,8 +636,7 @@ def set_search_path(dbapi_connection, connection_record): {stop} >>> do_update_stmt = insert_stmt.on_conflict_do_update( - ... index_elements=[my_table.c.id], - ... set_=dict(data='updated value') + ... index_elements=[my_table.c.id], set_=dict(data="updated value") ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) @@ -638,11 +648,11 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql - >>> stmt = insert(my_table).values(user_email='a@b.com', data='inserted data') + >>> stmt = insert(my_table).values(user_email="a@b.com", data="inserted data") >>> stmt = stmt.on_conflict_do_update( ... index_elements=[my_table.c.user_email], - ... index_where=my_table.c.user_email.like('%@gmail.com'), - ... set_=dict(data=stmt.excluded.data) + ... index_where=my_table.c.user_email.like("%@gmail.com"), + ... set_=dict(data=stmt.excluded.data), ... ) >>> print(stmt) {printsql}INSERT INTO my_table (data, user_email) @@ -656,8 +666,7 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> do_update_stmt = insert_stmt.on_conflict_do_update( - ... constraint='my_table_idx_1', - ... set_=dict(data='updated value') + ... constraint="my_table_idx_1", set_=dict(data="updated value") ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) @@ -665,8 +674,7 @@ def set_search_path(dbapi_connection, connection_record): {stop} >>> do_update_stmt = insert_stmt.on_conflict_do_update( - ... constraint='my_table_pk', - ... set_=dict(data='updated value') + ... constraint="my_table_pk", set_=dict(data="updated value") ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) @@ -688,8 +696,7 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> do_update_stmt = insert_stmt.on_conflict_do_update( - ... constraint=my_table.primary_key, - ... set_=dict(data='updated value') + ... constraint=my_table.primary_key, set_=dict(data="updated value") ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) @@ -707,10 +714,9 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql - >>> stmt = insert(my_table).values(id='some_id', data='inserted value') + >>> stmt = insert(my_table).values(id="some_id", data="inserted value") >>> do_update_stmt = stmt.on_conflict_do_update( - ... index_elements=['id'], - ... set_=dict(data='updated value') + ... index_elements=["id"], set_=dict(data="updated value") ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) @@ -739,13 +745,11 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> stmt = insert(my_table).values( - ... id='some_id', - ... data='inserted value', - ... author='jlh' + ... id="some_id", data="inserted value", author="jlh" ... ) >>> do_update_stmt = stmt.on_conflict_do_update( - ... index_elements=['id'], - ... set_=dict(data='updated value', author=stmt.excluded.author) + ... index_elements=["id"], + ... set_=dict(data="updated value", author=stmt.excluded.author), ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data, author) @@ -762,14 +766,12 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> stmt = insert(my_table).values( - ... id='some_id', - ... data='inserted value', - ... author='jlh' + ... id="some_id", data="inserted value", author="jlh" ... ) >>> on_update_stmt = stmt.on_conflict_do_update( - ... index_elements=['id'], - ... set_=dict(data='updated value', author=stmt.excluded.author), - ... where=(my_table.c.status == 2) + ... index_elements=["id"], + ... set_=dict(data="updated value", author=stmt.excluded.author), + ... where=(my_table.c.status == 2), ... ) >>> print(on_update_stmt) {printsql}INSERT INTO my_table (id, data, author) @@ -787,8 +789,8 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql - >>> stmt = insert(my_table).values(id='some_id', data='inserted value') - >>> stmt = stmt.on_conflict_do_nothing(index_elements=['id']) + >>> stmt = insert(my_table).values(id="some_id", data="inserted value") + >>> stmt = stmt.on_conflict_do_nothing(index_elements=["id"]) >>> print(stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT (id) DO NOTHING @@ -799,7 +801,7 @@ def set_search_path(dbapi_connection, connection_record): .. sourcecode:: pycon+sql - >>> stmt = insert(my_table).values(id='some_id', data='inserted value') + >>> stmt = insert(my_table).values(id="some_id", data="inserted value") >>> stmt = stmt.on_conflict_do_nothing() >>> print(stmt) {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) @@ -830,7 +832,9 @@ def set_search_path(dbapi_connection, connection_record): select(sometable.c.text.match("search string")) -would emit to the database:: +would emit to the database: + +.. sourcecode:: sql SELECT text @@ plainto_tsquery('search string') FROM table @@ -846,11 +850,11 @@ def set_search_path(dbapi_connection, connection_record): from sqlalchemy import func - select( - sometable.c.text.bool_op("@@")(func.to_tsquery("search string")) - ) + select(sometable.c.text.bool_op("@@")(func.to_tsquery("search string"))) - Which would emit:: + Which would emit: + + .. sourcecode:: sql SELECT text @@ to_tsquery('search string') FROM table @@ -864,9 +868,7 @@ def set_search_path(dbapi_connection, connection_record): For example, the query:: - select( - func.to_tsquery('cat').bool_op("@>")(func.to_tsquery('cat & rat')) - ) + select(func.to_tsquery("cat").bool_op("@>")(func.to_tsquery("cat & rat"))) would generate: @@ -879,9 +881,12 @@ def set_search_path(dbapi_connection, connection_record): from sqlalchemy.dialects.postgresql import TSVECTOR from sqlalchemy import select, cast + select(cast("some text", TSVECTOR)) -produces a statement equivalent to:: +produces a statement equivalent to: + +.. sourcecode:: sql SELECT CAST('some text' AS TSVECTOR) AS anon_1 @@ -909,10 +914,12 @@ def set_search_path(dbapi_connection, connection_record): specified using the ``postgresql_regconfig`` parameter, such as:: select(mytable.c.id).where( - mytable.c.title.match('somestring', postgresql_regconfig='english') + mytable.c.title.match("somestring", postgresql_regconfig="english") ) -Which would emit:: +Which would emit: + +.. sourcecode:: sql SELECT mytable.id FROM mytable WHERE mytable.title @@ plainto_tsquery('english', 'somestring') @@ -926,7 +933,9 @@ def set_search_path(dbapi_connection, connection_record): ) ) -produces a statement equivalent to:: +produces a statement equivalent to: + +.. sourcecode:: sql SELECT mytable.id FROM mytable WHERE to_tsvector('english', mytable.title) @@ @@ -950,16 +959,16 @@ def set_search_path(dbapi_connection, connection_record): syntaxes. It uses SQLAlchemy's hints mechanism:: # SELECT ... FROM ONLY ... - result = table.select().with_hint(table, 'ONLY', 'postgresql') + result = table.select().with_hint(table, "ONLY", "postgresql") print(result.fetchall()) # UPDATE ONLY ... - table.update(values=dict(foo='bar')).with_hint('ONLY', - dialect_name='postgresql') + table.update(values=dict(foo="bar")).with_hint( + "ONLY", dialect_name="postgresql" + ) # DELETE FROM ONLY ... - table.delete().with_hint('ONLY', dialect_name='postgresql') - + table.delete().with_hint("ONLY", dialect_name="postgresql") .. _postgresql_indexes: @@ -975,7 +984,7 @@ def set_search_path(dbapi_connection, connection_record): The ``postgresql_include`` option renders INCLUDE(colname) for the given string names:: - Index("my_index", table.c.x, postgresql_include=['y']) + Index("my_index", table.c.x, postgresql_include=["y"]) would render the index as ``CREATE INDEX my_index ON table (x) INCLUDE (y)`` @@ -992,7 +1001,7 @@ def set_search_path(dbapi_connection, connection_record): applied to a subset of rows. These can be specified on :class:`.Index` using the ``postgresql_where`` keyword argument:: - Index('my_index', my_table.c.id, postgresql_where=my_table.c.value > 10) + Index("my_index", my_table.c.id, postgresql_where=my_table.c.value > 10) .. _postgresql_operator_classes: @@ -1006,11 +1015,11 @@ def set_search_path(dbapi_connection, connection_record): ``postgresql_ops`` keyword argument:: Index( - 'my_index', my_table.c.id, my_table.c.data, - postgresql_ops={ - 'data': 'text_pattern_ops', - 'id': 'int4_ops' - }) + "my_index", + my_table.c.id, + my_table.c.data, + postgresql_ops={"data": "text_pattern_ops", "id": "int4_ops"}, + ) Note that the keys in the ``postgresql_ops`` dictionaries are the "key" name of the :class:`_schema.Column`, i.e. the name used to access it from @@ -1022,12 +1031,11 @@ def set_search_path(dbapi_connection, connection_record): that is identified in the dictionary by name, e.g.:: Index( - 'my_index', my_table.c.id, - func.lower(my_table.c.data).label('data_lower'), - postgresql_ops={ - 'data_lower': 'text_pattern_ops', - 'id': 'int4_ops' - }) + "my_index", + my_table.c.id, + func.lower(my_table.c.data).label("data_lower"), + postgresql_ops={"data_lower": "text_pattern_ops", "id": "int4_ops"}, + ) Operator classes are also supported by the :class:`_postgresql.ExcludeConstraint` construct using the @@ -1046,7 +1054,7 @@ def set_search_path(dbapi_connection, connection_record): https://www.postgresql.org/docs/current/static/indexes-types.html). These can be specified on :class:`.Index` using the ``postgresql_using`` keyword argument:: - Index('my_index', my_table.c.data, postgresql_using='gin') + Index("my_index", my_table.c.data, postgresql_using="gin") The value passed to the keyword argument will be simply passed through to the underlying CREATE INDEX command, so it *must* be a valid index type for your @@ -1062,13 +1070,13 @@ def set_search_path(dbapi_connection, connection_record): parameters can be specified on :class:`.Index` using the ``postgresql_with`` keyword argument:: - Index('my_index', my_table.c.data, postgresql_with={"fillfactor": 50}) + Index("my_index", my_table.c.data, postgresql_with={"fillfactor": 50}) PostgreSQL allows to define the tablespace in which to create the index. The tablespace can be specified on :class:`.Index` using the ``postgresql_tablespace`` keyword argument:: - Index('my_index', my_table.c.data, postgresql_tablespace='my_tablespace') + Index("my_index", my_table.c.data, postgresql_tablespace="my_tablespace") Note that the same option is available on :class:`_schema.Table` as well. @@ -1080,17 +1088,21 @@ def set_search_path(dbapi_connection, connection_record): The PostgreSQL index option CONCURRENTLY is supported by passing the flag ``postgresql_concurrently`` to the :class:`.Index` construct:: - tbl = Table('testtbl', m, Column('data', Integer)) + tbl = Table("testtbl", m, Column("data", Integer)) - idx1 = Index('test_idx1', tbl.c.data, postgresql_concurrently=True) + idx1 = Index("test_idx1", tbl.c.data, postgresql_concurrently=True) The above index construct will render DDL for CREATE INDEX, assuming -PostgreSQL 8.2 or higher is detected or for a connection-less dialect, as:: +PostgreSQL 8.2 or higher is detected or for a connection-less dialect, as: + +.. sourcecode:: sql CREATE INDEX CONCURRENTLY test_idx1 ON testtbl (data) For DROP INDEX, assuming PostgreSQL 9.2 or higher is detected or for -a connection-less dialect, it will emit:: +a connection-less dialect, it will emit: + +.. sourcecode:: sql DROP INDEX CONCURRENTLY test_idx1 @@ -1100,14 +1112,11 @@ def set_search_path(dbapi_connection, connection_record): construct, the DBAPI's "autocommit" mode must be used:: metadata = MetaData() - table = Table( - "foo", metadata, - Column("id", String)) - index = Index( - "foo_idx", table.c.id, postgresql_concurrently=True) + table = Table("foo", metadata, Column("id", String)) + index = Index("foo_idx", table.c.id, postgresql_concurrently=True) with engine.connect() as conn: - with conn.execution_options(isolation_level='AUTOCOMMIT'): + with conn.execution_options(isolation_level="AUTOCOMMIT"): table.create(conn) .. seealso:: @@ -1165,26 +1174,33 @@ def set_search_path(dbapi_connection, connection_record): * ``ON COMMIT``:: - Table("some_table", metadata, ..., postgresql_on_commit='PRESERVE ROWS') + Table("some_table", metadata, ..., postgresql_on_commit="PRESERVE ROWS") -* ``PARTITION BY``:: +* + ``PARTITION BY``:: - Table("some_table", metadata, ..., - postgresql_partition_by='LIST (part_column)') + Table( + "some_table", + metadata, + ..., + postgresql_partition_by="LIST (part_column)", + ) - .. versionadded:: 1.2.6 + .. versionadded:: 1.2.6 -* ``TABLESPACE``:: +* + ``TABLESPACE``:: - Table("some_table", metadata, ..., postgresql_tablespace='some_tablespace') + Table("some_table", metadata, ..., postgresql_tablespace="some_tablespace") The above option is also available on the :class:`.Index` construct. -* ``USING``:: +* + ``USING``:: - Table("some_table", metadata, ..., postgresql_using='heap') + Table("some_table", metadata, ..., postgresql_using="heap") - .. versionadded:: 2.0.26 + .. versionadded:: 2.0.26 * ``WITH OIDS``:: @@ -1225,7 +1241,7 @@ def update(): "user", ["user_id"], ["id"], - postgresql_not_valid=True + postgresql_not_valid=True, ) The keyword is ultimately accepted directly by the @@ -1236,7 +1252,9 @@ def update(): CheckConstraint("some_field IS NOT NULL", postgresql_not_valid=True) - ForeignKeyConstraint(["some_id"], ["some_table.some_id"], postgresql_not_valid=True) + ForeignKeyConstraint( + ["some_id"], ["some_table.some_id"], postgresql_not_valid=True + ) .. versionadded:: 1.4.32 @@ -1279,7 +1297,9 @@ def update(): .. sourcecode:: pycon+sql >>> from sqlalchemy import select, func - >>> stmt = select(func.json_each('{"a":"foo", "b":"bar"}').table_valued("key", "value")) + >>> stmt = select( + ... func.json_each('{"a":"foo", "b":"bar"}').table_valued("key", "value") + ... ) >>> print(stmt) {printsql}SELECT anon_1.key, anon_1.value FROM json_each(:json_each_1) AS anon_1 @@ -1291,8 +1311,7 @@ def update(): >>> from sqlalchemy import select, func, literal_column >>> stmt = select( ... func.json_populate_record( - ... literal_column("null::myrowtype"), - ... '{"a":1,"b":2}' + ... literal_column("null::myrowtype"), '{"a":1,"b":2}' ... ).table_valued("a", "b", name="x") ... ) >>> print(stmt) @@ -1310,9 +1329,13 @@ def update(): >>> from sqlalchemy import select, func, column, Integer, Text >>> stmt = select( - ... func.json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}').table_valued( - ... column("a", Integer), column("b", Text), column("d", Text), - ... ).render_derived(name="x", with_types=True) + ... func.json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}') + ... .table_valued( + ... column("a", Integer), + ... column("b", Text), + ... column("d", Text), + ... ) + ... .render_derived(name="x", with_types=True) ... ) >>> print(stmt) {printsql}SELECT x.a, x.b, x.d @@ -1329,9 +1352,9 @@ def update(): >>> from sqlalchemy import select, func >>> stmt = select( - ... func.generate_series(4, 1, -1). - ... table_valued("value", with_ordinality="ordinality"). - ... render_derived() + ... func.generate_series(4, 1, -1) + ... .table_valued("value", with_ordinality="ordinality") + ... .render_derived() ... ) >>> print(stmt) {printsql}SELECT anon_1.value, anon_1.ordinality @@ -1360,7 +1383,9 @@ def update(): .. sourcecode:: pycon+sql >>> from sqlalchemy import select, func - >>> stmt = select(func.json_array_elements('["one", "two"]').column_valued("x")) + >>> stmt = select( + ... func.json_array_elements('["one", "two"]').column_valued("x") + ... ) >>> print(stmt) {printsql}SELECT x FROM json_array_elements(:json_array_elements_1) AS x @@ -1384,7 +1409,7 @@ def update(): >>> from sqlalchemy import table, column, ARRAY, Integer >>> from sqlalchemy import select, func - >>> t = table("t", column('value', ARRAY(Integer))) + >>> t = table("t", column("value", ARRAY(Integer))) >>> stmt = select(func.unnest(t.c.value).column_valued("unnested_value")) >>> print(stmt) {printsql}SELECT unnested_value @@ -1406,10 +1431,10 @@ def update(): >>> from sqlalchemy import table, column, func, tuple_ >>> t = table("t", column("id"), column("fk")) - >>> stmt = t.select().where( - ... tuple_(t.c.id, t.c.fk) > (1,2) - ... ).where( - ... func.ROW(t.c.id, t.c.fk) < func.ROW(3, 7) + >>> stmt = ( + ... t.select() + ... .where(tuple_(t.c.id, t.c.fk) > (1, 2)) + ... .where(func.ROW(t.c.id, t.c.fk) < func.ROW(3, 7)) ... ) >>> print(stmt) {printsql}SELECT t.id, t.fk @@ -1438,7 +1463,7 @@ def update(): .. sourcecode:: pycon+sql >>> from sqlalchemy import table, column, func, select - >>> a = table( "a", column("id"), column("x"), column("y")) + >>> a = table("a", column("id"), column("x"), column("y")) >>> stmt = select(func.row_to_json(a.table_valued())) >>> print(stmt) {printsql}SELECT row_to_json(a) AS row_to_json_1 @@ -2060,6 +2085,8 @@ def visit_on_conflict_do_update(self, on_conflict, **kw): else: continue + # TODO: this coercion should be up front. we can't cache + # SQL constructs with non-bound literals buried in them if coercions._is_literal(value): value = elements.BindParameter(None, value, type_=c.type) @@ -4578,7 +4605,10 @@ def get_multi_indexes( dialect_options = {} if row["reloptions"]: dialect_options["postgresql_with"] = dict( - [option.split("=") for option in row["reloptions"]] + [ + option.split("=", 1) + for option in row["reloptions"] + ] ) # it *might* be nice to include that this is 'btree' in the # reflection info. But we don't want an Index object diff --git a/libs/sqlalchemy/dialects/postgresql/dml.py b/libs/sqlalchemy/dialects/postgresql/dml.py index 4404ecd37..1187b6bf5 100644 --- a/libs/sqlalchemy/dialects/postgresql/dml.py +++ b/libs/sqlalchemy/dialects/postgresql/dml.py @@ -1,5 +1,5 @@ # dialects/postgresql/dml.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -7,7 +7,10 @@ from __future__ import annotations from typing import Any +from typing import List from typing import Optional +from typing import Tuple +from typing import Union from . import ext from .._typing import _OnConflictConstraintT @@ -26,7 +29,9 @@ from ...sql.base import ReadOnlyColumnCollection from ...sql.dml import Insert as StandardInsert from ...sql.elements import ClauseElement +from ...sql.elements import ColumnElement from ...sql.elements import KeyedColumnElement +from ...sql.elements import TextClause from ...sql.expression import alias from ...util.typing import Self @@ -153,11 +158,10 @@ def on_conflict_do_update( :paramref:`.Insert.on_conflict_do_update.set_` dictionary. :param where: - Optional argument. If present, can be a literal SQL - string or an acceptable expression for a ``WHERE`` clause - that restricts the rows affected by ``DO UPDATE SET``. Rows - not meeting the ``WHERE`` condition will not be updated - (effectively a ``DO NOTHING`` for those rows). + Optional argument. An expression object representing a ``WHERE`` + clause that restricts the rows affected by ``DO UPDATE SET``. Rows not + meeting the ``WHERE`` condition will not be updated (effectively a + ``DO NOTHING`` for those rows). .. seealso:: @@ -212,8 +216,10 @@ class OnConflictClause(ClauseElement): stringify_dialect = "postgresql" constraint_target: Optional[str] - inferred_target_elements: _OnConflictIndexElementsT - inferred_target_whereclause: _OnConflictIndexWhereT + inferred_target_elements: Optional[List[Union[str, schema.Column[Any]]]] + inferred_target_whereclause: Optional[ + Union[ColumnElement[Any], TextClause] + ] def __init__( self, @@ -254,8 +260,24 @@ def __init__( if index_elements is not None: self.constraint_target = None - self.inferred_target_elements = index_elements - self.inferred_target_whereclause = index_where + self.inferred_target_elements = [ + coercions.expect(roles.DDLConstraintColumnRole, column) + for column in index_elements + ] + + self.inferred_target_whereclause = ( + coercions.expect( + ( + roles.StatementOptionRole + if isinstance(constraint, ext.ExcludeConstraint) + else roles.WhereHavingRole + ), + index_where, + ) + if index_where is not None + else None + ) + elif constraint is None: self.constraint_target = self.inferred_target_elements = ( self.inferred_target_whereclause @@ -269,6 +291,9 @@ class OnConflictDoNothing(OnConflictClause): class OnConflictDoUpdate(OnConflictClause): __visit_name__ = "on_conflict_do_update" + update_values_to_set: List[Tuple[Union[schema.Column[Any], str], Any]] + update_whereclause: Optional[ColumnElement[Any]] + def __init__( self, constraint: _OnConflictConstraintT = None, @@ -307,4 +332,8 @@ def __init__( (coercions.expect(roles.DMLColumnRole, key), value) for key, value in set_.items() ] - self.update_whereclause = where + self.update_whereclause = ( + coercions.expect(roles.WhereHavingRole, where) + if where is not None + else None + ) diff --git a/libs/sqlalchemy/dialects/postgresql/ext.py b/libs/sqlalchemy/dialects/postgresql/ext.py index 7fc08953f..94466ae0a 100644 --- a/libs/sqlalchemy/dialects/postgresql/ext.py +++ b/libs/sqlalchemy/dialects/postgresql/ext.py @@ -1,5 +1,5 @@ # dialects/postgresql/ext.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -35,22 +35,26 @@ class aggregate_order_by(expression.ColumnElement): E.g.:: from sqlalchemy.dialects.postgresql import aggregate_order_by + expr = func.array_agg(aggregate_order_by(table.c.a, table.c.b.desc())) stmt = select(expr) - would represent the expression:: + would represent the expression: + + .. sourcecode:: sql SELECT array_agg(a ORDER BY b DESC) FROM table; Similarly:: expr = func.string_agg( - table.c.a, - aggregate_order_by(literal_column("','"), table.c.a) + table.c.a, aggregate_order_by(literal_column("','"), table.c.a) ) stmt = select(expr) - Would represent:: + Would represent: + + .. sourcecode:: sql SELECT string_agg(a, ',' ORDER BY a) FROM table; @@ -131,10 +135,10 @@ def __init__(self, *elements, **kw): E.g.:: const = ExcludeConstraint( - (Column('period'), '&&'), - (Column('group'), '='), - where=(Column('group') != 'some group'), - ops={'group': 'my_operator_class'} + (Column("period"), "&&"), + (Column("group"), "="), + where=(Column("group") != "some group"), + ops={"group": "my_operator_class"}, ) The constraint is normally embedded into the :class:`_schema.Table` @@ -142,19 +146,20 @@ def __init__(self, *elements, **kw): directly, or added later using :meth:`.append_constraint`:: some_table = Table( - 'some_table', metadata, - Column('id', Integer, primary_key=True), - Column('period', TSRANGE()), - Column('group', String) + "some_table", + metadata, + Column("id", Integer, primary_key=True), + Column("period", TSRANGE()), + Column("group", String), ) some_table.append_constraint( ExcludeConstraint( - (some_table.c.period, '&&'), - (some_table.c.group, '='), - where=some_table.c.group != 'some group', - name='some_table_excl_const', - ops={'group': 'my_operator_class'} + (some_table.c.period, "&&"), + (some_table.c.group, "="), + where=some_table.c.group != "some group", + name="some_table_excl_const", + ops={"group": "my_operator_class"}, ) ) diff --git a/libs/sqlalchemy/dialects/postgresql/hstore.py b/libs/sqlalchemy/dialects/postgresql/hstore.py index 04c8cf160..0a915b17d 100644 --- a/libs/sqlalchemy/dialects/postgresql/hstore.py +++ b/libs/sqlalchemy/dialects/postgresql/hstore.py @@ -1,5 +1,5 @@ # dialects/postgresql/hstore.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -28,28 +28,29 @@ class HSTORE(sqltypes.Indexable, sqltypes.Concatenable, sqltypes.TypeEngine): The :class:`.HSTORE` type stores dictionaries containing strings, e.g.:: - data_table = Table('data_table', metadata, - Column('id', Integer, primary_key=True), - Column('data', HSTORE) + data_table = Table( + "data_table", + metadata, + Column("id", Integer, primary_key=True), + Column("data", HSTORE), ) with engine.connect() as conn: conn.execute( - data_table.insert(), - data = {"key1": "value1", "key2": "value2"} + data_table.insert(), data={"key1": "value1", "key2": "value2"} ) :class:`.HSTORE` provides for a wide range of operations, including: * Index operations:: - data_table.c.data['some key'] == 'some value' + data_table.c.data["some key"] == "some value" * Containment operations:: - data_table.c.data.has_key('some key') + data_table.c.data.has_key("some key") - data_table.c.data.has_all(['one', 'two', 'three']) + data_table.c.data.has_all(["one", "two", "three"]) * Concatenation:: @@ -72,17 +73,19 @@ class HSTORE(sqltypes.Indexable, sqltypes.Concatenable, sqltypes.TypeEngine): from sqlalchemy.ext.mutable import MutableDict + class MyClass(Base): - __tablename__ = 'data_table' + __tablename__ = "data_table" id = Column(Integer, primary_key=True) data = Column(MutableDict.as_mutable(HSTORE)) + my_object = session.query(MyClass).one() # in-place mutation, requires Mutable extension # in order for the ORM to detect - my_object.data['some_key'] = 'some value' + my_object.data["some_key"] = "some value" session.commit() @@ -96,7 +99,7 @@ class MyClass(Base): :class:`.hstore` - render the PostgreSQL ``hstore()`` function. - """ + """ # noqa: E501 __visit_name__ = "HSTORE" hashable = False @@ -192,6 +195,9 @@ def matrix(self): comparator_factory = Comparator def bind_processor(self, dialect): + # note that dialect-specific types like that of psycopg and + # psycopg2 will override this method to allow driver-level conversion + # instead, see _PsycopgHStore def process(value): if isinstance(value, dict): return _serialize_hstore(value) @@ -201,6 +207,9 @@ def process(value): return process def result_processor(self, dialect, coltype): + # note that dialect-specific types like that of psycopg and + # psycopg2 will override this method to allow driver-level conversion + # instead, see _PsycopgHStore def process(value): if value is not None: return _parse_hstore(value) @@ -221,12 +230,12 @@ class hstore(sqlfunc.GenericFunction): from sqlalchemy.dialects.postgresql import array, hstore - select(hstore('key1', 'value1')) + select(hstore("key1", "value1")) select( hstore( - array(['key1', 'key2', 'key3']), - array(['value1', 'value2', 'value3']) + array(["key1", "key2", "key3"]), + array(["value1", "value2", "value3"]), ) ) diff --git a/libs/sqlalchemy/dialects/postgresql/json.py b/libs/sqlalchemy/dialects/postgresql/json.py index 914d8423d..2f26b39e3 100644 --- a/libs/sqlalchemy/dialects/postgresql/json.py +++ b/libs/sqlalchemy/dialects/postgresql/json.py @@ -1,5 +1,5 @@ # dialects/postgresql/json.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -90,14 +90,14 @@ class JSON(sqltypes.JSON): * Index operations (the ``->`` operator):: - data_table.c.data['some key'] + data_table.c.data["some key"] data_table.c.data[5] + * Index operations returning text + (the ``->>`` operator):: - * Index operations returning text (the ``->>`` operator):: - - data_table.c.data['some key'].astext == 'some value' + data_table.c.data["some key"].astext == "some value" Note that equivalent functionality is available via the :attr:`.JSON.Comparator.as_string` accessor. @@ -105,18 +105,20 @@ class JSON(sqltypes.JSON): * Index operations with CAST (equivalent to ``CAST(col ->> ['some key'] AS <type>)``):: - data_table.c.data['some key'].astext.cast(Integer) == 5 + data_table.c.data["some key"].astext.cast(Integer) == 5 Note that equivalent functionality is available via the :attr:`.JSON.Comparator.as_integer` and similar accessors. * Path index operations (the ``#>`` operator):: - data_table.c.data[('key_1', 'key_2', 5, ..., 'key_n')] + data_table.c.data[("key_1", "key_2", 5, ..., "key_n")] * Path index operations returning text (the ``#>>`` operator):: - data_table.c.data[('key_1', 'key_2', 5, ..., 'key_n')].astext == 'some value' + data_table.c.data[ + ("key_1", "key_2", 5, ..., "key_n") + ].astext == "some value" Index operations return an expression object whose type defaults to :class:`_types.JSON` by default, @@ -128,10 +130,11 @@ class JSON(sqltypes.JSON): using psycopg2, the DBAPI only allows serializers at the per-cursor or per-connection level. E.g.:: - engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test", - json_serializer=my_serialize_fn, - json_deserializer=my_deserialize_fn - ) + engine = create_engine( + "postgresql+psycopg2://scott:tiger@localhost/test", + json_serializer=my_serialize_fn, + json_deserializer=my_deserialize_fn, + ) When using the psycopg2 dialect, the json_deserializer is registered against the database using ``psycopg2.extras.register_default_json``. @@ -156,6 +159,7 @@ def __init__(self, none_as_null=False, astext_type=None): be used to persist a NULL value:: from sqlalchemy import null + conn.execute(table.insert(), {"data": null()}) .. seealso:: @@ -181,7 +185,7 @@ def astext(self): E.g.:: - select(data_table.c.data['some key'].astext) + select(data_table.c.data["some key"].astext) .. seealso:: @@ -208,15 +212,16 @@ class JSONB(JSON): The :class:`_postgresql.JSONB` type stores arbitrary JSONB format data, e.g.:: - data_table = Table('data_table', metadata, - Column('id', Integer, primary_key=True), - Column('data', JSONB) + data_table = Table( + "data_table", + metadata, + Column("id", Integer, primary_key=True), + Column("data", JSONB), ) with engine.connect() as conn: conn.execute( - data_table.insert(), - data = {"key1": "value1", "key2": "value2"} + data_table.insert(), data={"key1": "value1", "key2": "value2"} ) The :class:`_postgresql.JSONB` type includes all operations provided by diff --git a/libs/sqlalchemy/dialects/postgresql/named_types.py b/libs/sqlalchemy/dialects/postgresql/named_types.py index 16e5c867e..e1b8e84ce 100644 --- a/libs/sqlalchemy/dialects/postgresql/named_types.py +++ b/libs/sqlalchemy/dialects/postgresql/named_types.py @@ -1,5 +1,5 @@ # dialects/postgresql/named_types.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -185,8 +185,10 @@ class ENUM(NamedType, type_api.NativeForEmulated, sqltypes.Enum): :meth:`_schema.Table.drop` methods are called:: - table = Table('sometable', metadata, - Column('some_enum', ENUM('a', 'b', 'c', name='myenum')) + table = Table( + "sometable", + metadata, + Column("some_enum", ENUM("a", "b", "c", name="myenum")), ) table.create(engine) # will emit CREATE ENUM and CREATE TABLE @@ -197,21 +199,17 @@ class ENUM(NamedType, type_api.NativeForEmulated, sqltypes.Enum): :class:`_postgresql.ENUM` independently, and associate it with the :class:`_schema.MetaData` object itself:: - my_enum = ENUM('a', 'b', 'c', name='myenum', metadata=metadata) + my_enum = ENUM("a", "b", "c", name="myenum", metadata=metadata) - t1 = Table('sometable_one', metadata, - Column('some_enum', myenum) - ) + t1 = Table("sometable_one", metadata, Column("some_enum", myenum)) - t2 = Table('sometable_two', metadata, - Column('some_enum', myenum) - ) + t2 = Table("sometable_two", metadata, Column("some_enum", myenum)) When this pattern is used, care must still be taken at the level of individual table creates. Emitting CREATE TABLE without also specifying ``checkfirst=True`` will still cause issues:: - t1.create(engine) # will fail: no such type 'myenum' + t1.create(engine) # will fail: no such type 'myenum' If we specify ``checkfirst=True``, the individual table-level create operation will check for the ``ENUM`` and create if not exists:: @@ -387,14 +385,12 @@ class DOMAIN(NamedType, sqltypes.SchemaType): A domain is essentially a data type with optional constraints that restrict the allowed set of values. E.g.:: - PositiveInt = DOMAIN( - "pos_int", Integer, check="VALUE > 0", not_null=True - ) + PositiveInt = DOMAIN("pos_int", Integer, check="VALUE > 0", not_null=True) UsPostalCode = DOMAIN( "us_postal_code", Text, - check="VALUE ~ '^\d{5}$' OR VALUE ~ '^\d{5}-\d{4}$'" + check="VALUE ~ '^\d{5}$' OR VALUE ~ '^\d{5}-\d{4}$'", ) See the `PostgreSQL documentation`__ for additional details @@ -403,7 +399,7 @@ class DOMAIN(NamedType, sqltypes.SchemaType): .. versionadded:: 2.0 - """ + """ # noqa: E501 DDLGenerator = DomainGenerator DDLDropper = DomainDropper diff --git a/libs/sqlalchemy/dialects/postgresql/operators.py b/libs/sqlalchemy/dialects/postgresql/operators.py index 53e175f9c..ebcafcba9 100644 --- a/libs/sqlalchemy/dialects/postgresql/operators.py +++ b/libs/sqlalchemy/dialects/postgresql/operators.py @@ -1,5 +1,5 @@ # dialects/postgresql/operators.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/postgresql/pg8000.py b/libs/sqlalchemy/dialects/postgresql/pg8000.py index 0151be025..bf113230e 100644 --- a/libs/sqlalchemy/dialects/postgresql/pg8000.py +++ b/libs/sqlalchemy/dialects/postgresql/pg8000.py @@ -1,5 +1,5 @@ # dialects/postgresql/pg8000.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors <see AUTHORS +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors <see AUTHORS # file> # # This module is part of SQLAlchemy and is released under @@ -27,19 +27,21 @@ the ``postgresql.conf`` file, which often defaults to ``SQL_ASCII``. Typically, this can be changed to ``utf-8``, as a more useful default:: - #client_encoding = sql_ascii # actually, defaults to database - # encoding + # client_encoding = sql_ascii # actually, defaults to database encoding client_encoding = utf8 The ``client_encoding`` can be overridden for a session by executing the SQL: -SET CLIENT_ENCODING TO 'utf8'; +.. sourcecode:: sql + + SET CLIENT_ENCODING TO 'utf8'; SQLAlchemy will execute this SQL on all new connections based on the value passed to :func:`_sa.create_engine` using the ``client_encoding`` parameter:: engine = create_engine( - "postgresql+pg8000://user:pass@host/dbname", client_encoding='utf8') + "postgresql+pg8000://user:pass@host/dbname", client_encoding="utf8" + ) .. _pg8000_ssl: @@ -50,6 +52,7 @@ :paramref:`_sa.create_engine.connect_args` dictionary:: import ssl + ssl_context = ssl.create_default_context() engine = sa.create_engine( "postgresql+pg8000://scott:tiger@192.168.0.199/test", @@ -61,6 +64,7 @@ necessary to disable hostname checking:: import ssl + ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE diff --git a/libs/sqlalchemy/dialects/postgresql/pg_catalog.py b/libs/sqlalchemy/dialects/postgresql/pg_catalog.py index 9b5562c13..78f390a21 100644 --- a/libs/sqlalchemy/dialects/postgresql/pg_catalog.py +++ b/libs/sqlalchemy/dialects/postgresql/pg_catalog.py @@ -1,5 +1,5 @@ # dialects/postgresql/pg_catalog.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/postgresql/provision.py b/libs/sqlalchemy/dialects/postgresql/provision.py index 38573c77a..c76f5f518 100644 --- a/libs/sqlalchemy/dialects/postgresql/provision.py +++ b/libs/sqlalchemy/dialects/postgresql/provision.py @@ -1,5 +1,5 @@ # dialects/postgresql/provision.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/postgresql/psycopg.py b/libs/sqlalchemy/dialects/postgresql/psycopg.py index 66a2c7746..0554048c2 100644 --- a/libs/sqlalchemy/dialects/postgresql/psycopg.py +++ b/libs/sqlalchemy/dialects/postgresql/psycopg.py @@ -1,5 +1,5 @@ # dialects/postgresql/psycopg.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -29,20 +29,29 @@ automatically select the sync version, e.g.:: from sqlalchemy import create_engine - sync_engine = create_engine("postgresql+psycopg://scott:tiger@localhost/test") + + sync_engine = create_engine( + "postgresql+psycopg://scott:tiger@localhost/test" + ) * calling :func:`_asyncio.create_async_engine` with ``postgresql+psycopg://...`` will automatically select the async version, e.g.:: from sqlalchemy.ext.asyncio import create_async_engine - asyncio_engine = create_async_engine("postgresql+psycopg://scott:tiger@localhost/test") + + asyncio_engine = create_async_engine( + "postgresql+psycopg://scott:tiger@localhost/test" + ) The asyncio version of the dialect may also be specified explicitly using the ``psycopg_async`` suffix, as:: from sqlalchemy.ext.asyncio import create_async_engine - asyncio_engine = create_async_engine("postgresql+psycopg_async://scott:tiger@localhost/test") + + asyncio_engine = create_async_engine( + "postgresql+psycopg_async://scott:tiger@localhost/test" + ) .. seealso:: @@ -397,10 +406,12 @@ def initialize(self, connection): # register the adapter for connections made subsequent to # this one + assert self._psycopg_adapters_map register_hstore(info, self._psycopg_adapters_map) # register the adapter for this connection - register_hstore(info, connection.connection) + assert connection.connection + register_hstore(info, connection.connection.driver_connection) @classmethod def import_dbapi(cls): diff --git a/libs/sqlalchemy/dialects/postgresql/psycopg2.py b/libs/sqlalchemy/dialects/postgresql/psycopg2.py index fc05aca90..eeb7604f7 100644 --- a/libs/sqlalchemy/dialects/postgresql/psycopg2.py +++ b/libs/sqlalchemy/dialects/postgresql/psycopg2.py @@ -1,5 +1,5 @@ # dialects/postgresql/psycopg2.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -88,7 +88,6 @@ "postgresql+psycopg2://scott:tiger@192.168.0.199:5432/test?sslmode=require" ) - Unix Domain Connections ------------------------ @@ -103,13 +102,17 @@ was built. This value can be overridden by passing a pathname to psycopg2, using ``host`` as an additional keyword argument:: - create_engine("postgresql+psycopg2://user:password@/dbname?host=/var/lib/postgresql") + create_engine( + "postgresql+psycopg2://user:password@/dbname?host=/var/lib/postgresql" + ) .. warning:: The format accepted here allows for a hostname in the main URL in addition to the "host" query string argument. **When using this URL format, the initial host is silently ignored**. That is, this URL:: - engine = create_engine("postgresql+psycopg2://user:password@myhost1/dbname?host=myhost2") + engine = create_engine( + "postgresql+psycopg2://user:password@myhost1/dbname?host=myhost2" + ) Above, the hostname ``myhost1`` is **silently ignored and discarded.** The host which is connected is the ``myhost2`` host. @@ -190,7 +193,7 @@ For this form, the URL can be passed without any elements other than the initial scheme:: - engine = create_engine('postgresql+psycopg2://') + engine = create_engine("postgresql+psycopg2://") In the above form, a blank "dsn" string is passed to the ``psycopg2.connect()`` function which in turn represents an empty DSN passed to libpq. @@ -264,8 +267,8 @@ engine = create_engine( "postgresql+psycopg2://scott:tiger@host/dbname", - executemany_mode='values_plus_batch') - + executemany_mode="values_plus_batch", + ) Possible options for ``executemany_mode`` include: @@ -311,8 +314,10 @@ engine = create_engine( "postgresql+psycopg2://scott:tiger@host/dbname", - executemany_mode='values_plus_batch', - insertmanyvalues_page_size=5000, executemany_batch_page_size=500) + executemany_mode="values_plus_batch", + insertmanyvalues_page_size=5000, + executemany_batch_page_size=500, + ) .. seealso:: @@ -338,7 +343,9 @@ passed in the database URL; this parameter is consumed by the underlying ``libpq`` PostgreSQL client library:: - engine = create_engine("postgresql+psycopg2://user:pass@host/dbname?client_encoding=utf8") + engine = create_engine( + "postgresql+psycopg2://user:pass@host/dbname?client_encoding=utf8" + ) Alternatively, the above ``client_encoding`` value may be passed using :paramref:`_sa.create_engine.connect_args` for programmatic establishment with @@ -346,7 +353,7 @@ engine = create_engine( "postgresql+psycopg2://user:pass@host/dbname", - connect_args={'client_encoding': 'utf8'} + connect_args={"client_encoding": "utf8"}, ) * For all PostgreSQL versions, psycopg2 supports a client-side encoding @@ -355,8 +362,7 @@ ``client_encoding`` parameter passed to :func:`_sa.create_engine`:: engine = create_engine( - "postgresql+psycopg2://user:pass@host/dbname", - client_encoding="utf8" + "postgresql+psycopg2://user:pass@host/dbname", client_encoding="utf8" ) .. tip:: The above ``client_encoding`` parameter admittedly is very similar @@ -375,11 +381,9 @@ # postgresql.conf file # client_encoding = sql_ascii # actually, defaults to database - # encoding + # encoding client_encoding = utf8 - - Transactions ------------ @@ -426,15 +430,15 @@ import logging - logging.getLogger('sqlalchemy.dialects.postgresql').setLevel(logging.INFO) + logging.getLogger("sqlalchemy.dialects.postgresql").setLevel(logging.INFO) Above, it is assumed that logging is configured externally. If this is not the case, configuration such as ``logging.basicConfig()`` must be utilized:: import logging - logging.basicConfig() # log messages to stdout - logging.getLogger('sqlalchemy.dialects.postgresql').setLevel(logging.INFO) + logging.basicConfig() # log messages to stdout + logging.getLogger("sqlalchemy.dialects.postgresql").setLevel(logging.INFO) .. seealso:: @@ -471,8 +475,10 @@ use of the hstore extension by setting ``use_native_hstore`` to ``False`` as follows:: - engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test", - use_native_hstore=False) + engine = create_engine( + "postgresql+psycopg2://scott:tiger@localhost/test", + use_native_hstore=False, + ) The ``HSTORE`` type is **still supported** when the ``psycopg2.extensions.register_hstore()`` extension is not used. It merely diff --git a/libs/sqlalchemy/dialects/postgresql/psycopg2cffi.py b/libs/sqlalchemy/dialects/postgresql/psycopg2cffi.py index 3cc3b69fb..55e176070 100644 --- a/libs/sqlalchemy/dialects/postgresql/psycopg2cffi.py +++ b/libs/sqlalchemy/dialects/postgresql/psycopg2cffi.py @@ -1,5 +1,5 @@ # dialects/postgresql/psycopg2cffi.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/postgresql/ranges.py b/libs/sqlalchemy/dialects/postgresql/ranges.py index b793ca49f..93253570c 100644 --- a/libs/sqlalchemy/dialects/postgresql/ranges.py +++ b/libs/sqlalchemy/dialects/postgresql/ranges.py @@ -1,5 +1,5 @@ # dialects/postgresql/ranges.py -# Copyright (C) 2013-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2013-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -360,6 +360,8 @@ def contains(self, value: Union[_T, Range[_T]]) -> bool: else: return self._contains_value(value) + __contains__ = contains + def overlaps(self, other: Range[_T]) -> bool: "Determine whether this range overlaps with `other`." diff --git a/libs/sqlalchemy/dialects/postgresql/types.py b/libs/sqlalchemy/dialects/postgresql/types.py index 2acf63bef..6fe4f576e 100644 --- a/libs/sqlalchemy/dialects/postgresql/types.py +++ b/libs/sqlalchemy/dialects/postgresql/types.py @@ -1,5 +1,5 @@ # dialects/postgresql/types.py -# Copyright (C) 2013-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2013-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -94,12 +94,11 @@ class MONEY(sqltypes.TypeEngine[str]): from sqlalchemy import Dialect from sqlalchemy import TypeDecorator + class NumericMoney(TypeDecorator): impl = MONEY - def process_result_value( - self, value: Any, dialect: Dialect - ) -> None: + def process_result_value(self, value: Any, dialect: Dialect) -> None: if value is not None: # adjust this for the currency and numeric m = re.match(r"\$([\d.]+)", value) @@ -114,6 +113,7 @@ def process_result_value( from sqlalchemy import cast from sqlalchemy import TypeDecorator + class NumericMoney(TypeDecorator): impl = MONEY @@ -122,7 +122,7 @@ def column_expression(self, column: Any): .. versionadded:: 1.2 - """ + """ # noqa: E501 __visit_name__ = "MONEY" diff --git a/libs/sqlalchemy/dialects/sqlite/__init__.py b/libs/sqlalchemy/dialects/sqlite/__init__.py index 45f088e21..7b381fa6f 100644 --- a/libs/sqlalchemy/dialects/sqlite/__init__.py +++ b/libs/sqlalchemy/dialects/sqlite/__init__.py @@ -1,5 +1,5 @@ # dialects/sqlite/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/sqlite/aiosqlite.py b/libs/sqlalchemy/dialects/sqlite/aiosqlite.py index 796a80cf0..c777bf445 100644 --- a/libs/sqlalchemy/dialects/sqlite/aiosqlite.py +++ b/libs/sqlalchemy/dialects/sqlite/aiosqlite.py @@ -1,5 +1,5 @@ # dialects/sqlite/aiosqlite.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -31,6 +31,7 @@ :func:`_asyncio.create_async_engine` engine creation function:: from sqlalchemy.ext.asyncio import create_async_engine + engine = create_async_engine("sqlite+aiosqlite:///filename") The URL passes through all arguments to the ``pysqlite`` driver, so all @@ -58,12 +59,14 @@ engine = create_async_engine("sqlite+aiosqlite:///myfile.db") + @event.listens_for(engine.sync_engine, "connect") def do_connect(dbapi_connection, connection_record): # disable aiosqlite's emitting of the BEGIN statement entirely. # also stops it from emitting COMMIT before any DDL. dbapi_connection.isolation_level = None + @event.listens_for(engine.sync_engine, "begin") def do_begin(conn): # emit our own BEGIN diff --git a/libs/sqlalchemy/dialects/sqlite/base.py b/libs/sqlalchemy/dialects/sqlite/base.py index 84bb8937e..e0c0f6e80 100644 --- a/libs/sqlalchemy/dialects/sqlite/base.py +++ b/libs/sqlalchemy/dialects/sqlite/base.py @@ -1,5 +1,5 @@ # dialects/sqlite/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -7,7 +7,7 @@ # mypy: ignore-errors -r""" +r''' .. dialect:: sqlite :name: SQLite :normal_support: 3.12+ @@ -69,9 +69,12 @@ when rendering DDL, add the flag ``sqlite_autoincrement=True`` to the Table construct:: - Table('sometable', metadata, - Column('id', Integer, primary_key=True), - sqlite_autoincrement=True) + Table( + "sometable", + metadata, + Column("id", Integer, primary_key=True), + sqlite_autoincrement=True, + ) Allowing autoincrement behavior SQLAlchemy types other than Integer/INTEGER ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -91,8 +94,13 @@ only using :meth:`.TypeEngine.with_variant`:: table = Table( - "my_table", metadata, - Column("id", BigInteger().with_variant(Integer, "sqlite"), primary_key=True) + "my_table", + metadata, + Column( + "id", + BigInteger().with_variant(Integer, "sqlite"), + primary_key=True, + ), ) Another is to use a subclass of :class:`.BigInteger` that overrides its DDL @@ -101,21 +109,23 @@ from sqlalchemy import BigInteger from sqlalchemy.ext.compiler import compiles + class SLBigInteger(BigInteger): pass - @compiles(SLBigInteger, 'sqlite') + + @compiles(SLBigInteger, "sqlite") def bi_c(element, compiler, **kw): return "INTEGER" + @compiles(SLBigInteger) def bi_c(element, compiler, **kw): return compiler.visit_BIGINT(element, **kw) table = Table( - "my_table", metadata, - Column("id", SLBigInteger(), primary_key=True) + "my_table", metadata, Column("id", SLBigInteger(), primary_key=True) ) .. seealso:: @@ -235,26 +245,24 @@ def bi_c(element, compiler, **kw): # INSERT..RETURNING result = connection.execute( - table.insert(). - values(name='foo'). - returning(table.c.col1, table.c.col2) + table.insert().values(name="foo").returning(table.c.col1, table.c.col2) ) print(result.all()) # UPDATE..RETURNING result = connection.execute( - table.update(). - where(table.c.name=='foo'). - values(name='bar'). - returning(table.c.col1, table.c.col2) + table.update() + .where(table.c.name == "foo") + .values(name="bar") + .returning(table.c.col1, table.c.col2) ) print(result.all()) # DELETE..RETURNING result = connection.execute( - table.delete(). - where(table.c.name=='foo'). - returning(table.c.col1, table.c.col2) + table.delete() + .where(table.c.name == "foo") + .returning(table.c.col1, table.c.col2) ) print(result.all()) @@ -317,6 +325,7 @@ def bi_c(element, compiler, **kw): from sqlalchemy.engine import Engine from sqlalchemy import event + @event.listens_for(Engine, "connect") def set_sqlite_pragma(dbapi_connection, connection_record): cursor = dbapi_connection.cursor() @@ -379,13 +388,16 @@ def set_sqlite_pragma(dbapi_connection, connection_record): that specifies the IGNORE algorithm:: some_table = Table( - 'some_table', metadata, - Column('id', Integer, primary_key=True), - Column('data', Integer), - UniqueConstraint('id', 'data', sqlite_on_conflict='IGNORE') + "some_table", + metadata, + Column("id", Integer, primary_key=True), + Column("data", Integer), + UniqueConstraint("id", "data", sqlite_on_conflict="IGNORE"), ) -The above renders CREATE TABLE DDL as:: +The above renders CREATE TABLE DDL as: + +.. sourcecode:: sql CREATE TABLE some_table ( id INTEGER NOT NULL, @@ -402,13 +414,17 @@ def set_sqlite_pragma(dbapi_connection, connection_record): UNIQUE constraint in the DDL:: some_table = Table( - 'some_table', metadata, - Column('id', Integer, primary_key=True), - Column('data', Integer, unique=True, - sqlite_on_conflict_unique='IGNORE') + "some_table", + metadata, + Column("id", Integer, primary_key=True), + Column( + "data", Integer, unique=True, sqlite_on_conflict_unique="IGNORE" + ), ) -rendering:: +rendering: + +.. sourcecode:: sql CREATE TABLE some_table ( id INTEGER NOT NULL, @@ -421,13 +437,17 @@ def set_sqlite_pragma(dbapi_connection, connection_record): ``sqlite_on_conflict_not_null`` is used:: some_table = Table( - 'some_table', metadata, - Column('id', Integer, primary_key=True), - Column('data', Integer, nullable=False, - sqlite_on_conflict_not_null='FAIL') + "some_table", + metadata, + Column("id", Integer, primary_key=True), + Column( + "data", Integer, nullable=False, sqlite_on_conflict_not_null="FAIL" + ), ) -this renders the column inline ON CONFLICT phrase:: +this renders the column inline ON CONFLICT phrase: + +.. sourcecode:: sql CREATE TABLE some_table ( id INTEGER NOT NULL, @@ -439,13 +459,20 @@ def set_sqlite_pragma(dbapi_connection, connection_record): Similarly, for an inline primary key, use ``sqlite_on_conflict_primary_key``:: some_table = Table( - 'some_table', metadata, - Column('id', Integer, primary_key=True, - sqlite_on_conflict_primary_key='FAIL') + "some_table", + metadata, + Column( + "id", + Integer, + primary_key=True, + sqlite_on_conflict_primary_key="FAIL", + ), ) SQLAlchemy renders the PRIMARY KEY constraint separately, so the conflict -resolution algorithm is applied to the constraint itself:: +resolution algorithm is applied to the constraint itself: + +.. sourcecode:: sql CREATE TABLE some_table ( id INTEGER NOT NULL, @@ -455,7 +482,7 @@ def set_sqlite_pragma(dbapi_connection, connection_record): .. _sqlite_on_conflict_insert: INSERT...ON CONFLICT (Upsert) ------------------------------------ +----------------------------- .. seealso:: This section describes the :term:`DML` version of "ON CONFLICT" for SQLite, which occurs within an INSERT statement. For "ON CONFLICT" as @@ -483,21 +510,18 @@ def set_sqlite_pragma(dbapi_connection, connection_record): >>> from sqlalchemy.dialects.sqlite import insert >>> insert_stmt = insert(my_table).values( - ... id='some_existing_id', - ... data='inserted value') + ... id="some_existing_id", data="inserted value" + ... ) >>> do_update_stmt = insert_stmt.on_conflict_do_update( - ... index_elements=['id'], - ... set_=dict(data='updated value') + ... index_elements=["id"], set_=dict(data="updated value") ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET data = ?{stop} - >>> do_nothing_stmt = insert_stmt.on_conflict_do_nothing( - ... index_elements=['id'] - ... ) + >>> do_nothing_stmt = insert_stmt.on_conflict_do_nothing(index_elements=["id"]) >>> print(do_nothing_stmt) {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) @@ -528,13 +552,13 @@ def set_sqlite_pragma(dbapi_connection, connection_record): .. sourcecode:: pycon+sql - >>> stmt = insert(my_table).values(user_email='a@b.com', data='inserted data') + >>> stmt = insert(my_table).values(user_email="a@b.com", data="inserted data") >>> do_update_stmt = stmt.on_conflict_do_update( ... index_elements=[my_table.c.user_email], - ... index_where=my_table.c.user_email.like('%@gmail.com'), - ... set_=dict(data=stmt.excluded.data) - ... ) + ... index_where=my_table.c.user_email.like("%@gmail.com"), + ... set_=dict(data=stmt.excluded.data), + ... ) >>> print(do_update_stmt) {printsql}INSERT INTO my_table (data, user_email) VALUES (?, ?) @@ -554,11 +578,10 @@ def set_sqlite_pragma(dbapi_connection, connection_record): .. sourcecode:: pycon+sql - >>> stmt = insert(my_table).values(id='some_id', data='inserted value') + >>> stmt = insert(my_table).values(id="some_id", data="inserted value") >>> do_update_stmt = stmt.on_conflict_do_update( - ... index_elements=['id'], - ... set_=dict(data='updated value') + ... index_elements=["id"], set_=dict(data="updated value") ... ) >>> print(do_update_stmt) @@ -586,14 +609,12 @@ def set_sqlite_pragma(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> stmt = insert(my_table).values( - ... id='some_id', - ... data='inserted value', - ... author='jlh' + ... id="some_id", data="inserted value", author="jlh" ... ) >>> do_update_stmt = stmt.on_conflict_do_update( - ... index_elements=['id'], - ... set_=dict(data='updated value', author=stmt.excluded.author) + ... index_elements=["id"], + ... set_=dict(data="updated value", author=stmt.excluded.author), ... ) >>> print(do_update_stmt) @@ -610,15 +631,13 @@ def set_sqlite_pragma(dbapi_connection, connection_record): .. sourcecode:: pycon+sql >>> stmt = insert(my_table).values( - ... id='some_id', - ... data='inserted value', - ... author='jlh' + ... id="some_id", data="inserted value", author="jlh" ... ) >>> on_update_stmt = stmt.on_conflict_do_update( - ... index_elements=['id'], - ... set_=dict(data='updated value', author=stmt.excluded.author), - ... where=(my_table.c.status == 2) + ... index_elements=["id"], + ... set_=dict(data="updated value", author=stmt.excluded.author), + ... where=(my_table.c.status == 2), ... ) >>> print(on_update_stmt) {printsql}INSERT INTO my_table (id, data, author) VALUES (?, ?, ?) @@ -635,8 +654,8 @@ def set_sqlite_pragma(dbapi_connection, connection_record): .. sourcecode:: pycon+sql - >>> stmt = insert(my_table).values(id='some_id', data='inserted value') - >>> stmt = stmt.on_conflict_do_nothing(index_elements=['id']) + >>> stmt = insert(my_table).values(id="some_id", data="inserted value") + >>> stmt = stmt.on_conflict_do_nothing(index_elements=["id"]) >>> print(stmt) {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT (id) DO NOTHING @@ -647,7 +666,7 @@ def set_sqlite_pragma(dbapi_connection, connection_record): .. sourcecode:: pycon+sql - >>> stmt = insert(my_table).values(id='some_id', data='inserted value') + >>> stmt = insert(my_table).values(id="some_id", data="inserted value") >>> stmt = stmt.on_conflict_do_nothing() >>> print(stmt) {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT DO NOTHING @@ -707,11 +726,16 @@ def set_sqlite_pragma(dbapi_connection, connection_record): A partial index, e.g. one which uses a WHERE clause, can be specified with the DDL system using the argument ``sqlite_where``:: - tbl = Table('testtbl', m, Column('data', Integer)) - idx = Index('test_idx1', tbl.c.data, - sqlite_where=and_(tbl.c.data > 5, tbl.c.data < 10)) + tbl = Table("testtbl", m, Column("data", Integer)) + idx = Index( + "test_idx1", + tbl.c.data, + sqlite_where=and_(tbl.c.data > 5, tbl.c.data < 10), + ) -The index will be rendered at create time as:: +The index will be rendered at create time as: + +.. sourcecode:: sql CREATE INDEX test_idx1 ON testtbl (data) WHERE data > 5 AND data < 10 @@ -731,7 +755,11 @@ def set_sqlite_pragma(dbapi_connection, connection_record): import sqlite3 - assert sqlite3.sqlite_version_info < (3, 10, 0), "bug is fixed in this version" + assert sqlite3.sqlite_version_info < ( + 3, + 10, + 0, + ), "bug is fixed in this version" conn = sqlite3.connect(":memory:") cursor = conn.cursor() @@ -741,17 +769,22 @@ def set_sqlite_pragma(dbapi_connection, connection_record): cursor.execute("insert into x (a, b) values (2, 2)") cursor.execute("select x.a, x.b from x") - assert [c[0] for c in cursor.description] == ['a', 'b'] + assert [c[0] for c in cursor.description] == ["a", "b"] - cursor.execute(''' + cursor.execute( + """ select x.a, x.b from x where a=1 union select x.a, x.b from x where a=2 - ''') - assert [c[0] for c in cursor.description] == ['a', 'b'], \ - [c[0] for c in cursor.description] + """ + ) + assert [c[0] for c in cursor.description] == ["a", "b"], [ + c[0] for c in cursor.description + ] + +The second assertion fails: -The second assertion fails:: +.. sourcecode:: text Traceback (most recent call last): File "test.py", line 19, in <module> @@ -779,11 +812,13 @@ def set_sqlite_pragma(dbapi_connection, connection_record): result = conn.exec_driver_sql("select x.a, x.b from x") assert result.keys() == ["a", "b"] - result = conn.exec_driver_sql(''' + result = conn.exec_driver_sql( + """ select x.a, x.b from x where a=1 union select x.a, x.b from x where a=2 - ''') + """ + ) assert result.keys() == ["a", "b"] Note that above, even though SQLAlchemy filters out the dots, *both @@ -807,16 +842,20 @@ def set_sqlite_pragma(dbapi_connection, connection_record): the ``sqlite_raw_colnames`` execution option may be provided, either on a per-:class:`_engine.Connection` basis:: - result = conn.execution_options(sqlite_raw_colnames=True).exec_driver_sql(''' + result = conn.execution_options(sqlite_raw_colnames=True).exec_driver_sql( + """ select x.a, x.b from x where a=1 union select x.a, x.b from x where a=2 - ''') + """ + ) assert result.keys() == ["x.a", "x.b"] or on a per-:class:`_engine.Engine` basis:: - engine = create_engine("sqlite://", execution_options={"sqlite_raw_colnames": True}) + engine = create_engine( + "sqlite://", execution_options={"sqlite_raw_colnames": True} + ) When using the per-:class:`_engine.Engine` execution option, note that **Core and ORM queries that use UNION may not function properly**. @@ -831,12 +870,18 @@ def set_sqlite_pragma(dbapi_connection, connection_record): Table("some_table", metadata, ..., sqlite_with_rowid=False) +* + ``STRICT``:: + + Table("some_table", metadata, ..., sqlite_strict=True) + + .. versionadded:: 2.0.37 + .. seealso:: `SQLite CREATE TABLE options <https://www.sqlite.org/lang_createtable.html>`_ - .. _sqlite_include_internal: Reflecting internal schema tables @@ -865,7 +910,7 @@ def set_sqlite_pragma(dbapi_connection, connection_record): `SQLite Internal Schema Objects <https://www.sqlite.org/fileformat2.html#intschema>`_ - in the SQLite documentation. -""" # noqa +''' # noqa from __future__ import annotations import datetime @@ -979,7 +1024,9 @@ class DATETIME(_DateTimeMixin, sqltypes.DateTime): "%(year)04d-%(month)02d-%(day)02d %(hour)02d:%(minute)02d:%(second)02d.%(microsecond)06d" - e.g.:: + e.g.: + + .. sourcecode:: text 2021-03-15 12:05:57.105542 @@ -995,9 +1042,11 @@ class DATETIME(_DateTimeMixin, sqltypes.DateTime): import re from sqlalchemy.dialects.sqlite import DATETIME - dt = DATETIME(storage_format="%(year)04d/%(month)02d/%(day)02d " - "%(hour)02d:%(minute)02d:%(second)02d", - regexp=r"(\d+)/(\d+)/(\d+) (\d+)-(\d+)-(\d+)" + dt = DATETIME( + storage_format=( + "%(year)04d/%(month)02d/%(day)02d %(hour)02d:%(minute)02d:%(second)02d" + ), + regexp=r"(\d+)/(\d+)/(\d+) (\d+)-(\d+)-(\d+)", ) :param storage_format: format string which will be applied to the dict @@ -1087,7 +1136,9 @@ class DATE(_DateTimeMixin, sqltypes.Date): "%(year)04d-%(month)02d-%(day)02d" - e.g.:: + e.g.: + + .. sourcecode:: text 2011-03-15 @@ -1105,9 +1156,9 @@ class DATE(_DateTimeMixin, sqltypes.Date): from sqlalchemy.dialects.sqlite import DATE d = DATE( - storage_format="%(month)02d/%(day)02d/%(year)04d", - regexp=re.compile("(?P<month>\d+)/(?P<day>\d+)/(?P<year>\d+)") - ) + storage_format="%(month)02d/%(day)02d/%(year)04d", + regexp=re.compile("(?P<month>\d+)/(?P<day>\d+)/(?P<year>\d+)"), + ) :param storage_format: format string which will be applied to the dict with keys year, month, and day. @@ -1161,7 +1212,9 @@ class TIME(_DateTimeMixin, sqltypes.Time): "%(hour)02d:%(minute)02d:%(second)02d.%(microsecond)06d" - e.g.:: + e.g.: + + .. sourcecode:: text 12:05:57.10558 @@ -1177,9 +1230,9 @@ class TIME(_DateTimeMixin, sqltypes.Time): import re from sqlalchemy.dialects.sqlite import TIME - t = TIME(storage_format="%(hour)02d-%(minute)02d-" - "%(second)02d-%(microsecond)06d", - regexp=re.compile("(\d+)-(\d+)-(\d+)-(?:-(\d+))?") + t = TIME( + storage_format="%(hour)02d-%(minute)02d-%(second)02d-%(microsecond)06d", + regexp=re.compile("(\d+)-(\d+)-(\d+)-(?:-(\d+))?"), ) :param storage_format: format string which will be applied to the dict @@ -1428,9 +1481,7 @@ def visit_not_regexp_match_op_binary(self, binary, operator, **kw): return self._generate_generic_binary(binary, " NOT REGEXP ", **kw) def _on_conflict_target(self, clause, **kw): - if clause.constraint_target is not None: - target_text = "(%s)" % clause.constraint_target - elif clause.inferred_target_elements is not None: + if clause.inferred_target_elements is not None: target_text = "(%s)" % ", ".join( ( self.preparer.quote(c) @@ -1444,7 +1495,7 @@ def _on_conflict_target(self, clause, **kw): clause.inferred_target_whereclause, include_table=False, use_schema=False, - literal_binds=True, + literal_execute=True, ) else: @@ -1707,9 +1758,12 @@ def visit_create_index( return text def post_create_table(self, table): + text = "" if table.dialect_options["sqlite"]["with_rowid"] is False: - return "\n WITHOUT ROWID" - return "" + text += "\n WITHOUT ROWID" + if table.dialect_options["sqlite"]["strict"] is True: + text += "\n STRICT" + return text class SQLiteTypeCompiler(compiler.GenericTypeCompiler): @@ -1944,6 +1998,7 @@ class SQLiteDialect(default.DefaultDialect): { "autoincrement": False, "with_rowid": True, + "strict": False, }, ), (sa_schema.Index, {"where": None}), diff --git a/libs/sqlalchemy/dialects/sqlite/dml.py b/libs/sqlalchemy/dialects/sqlite/dml.py index dcf5e4482..84cdb8bec 100644 --- a/libs/sqlalchemy/dialects/sqlite/dml.py +++ b/libs/sqlalchemy/dialects/sqlite/dml.py @@ -1,5 +1,5 @@ # dialects/sqlite/dml.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -7,6 +7,10 @@ from __future__ import annotations from typing import Any +from typing import List +from typing import Optional +from typing import Tuple +from typing import Union from .._typing import _OnConflictIndexElementsT from .._typing import _OnConflictIndexWhereT @@ -15,6 +19,7 @@ from ... import util from ...sql import coercions from ...sql import roles +from ...sql import schema from ...sql._typing import _DMLTableArgument from ...sql.base import _exclusive_against from ...sql.base import _generative @@ -22,7 +27,9 @@ from ...sql.base import ReadOnlyColumnCollection from ...sql.dml import Insert as StandardInsert from ...sql.elements import ClauseElement +from ...sql.elements import ColumnElement from ...sql.elements import KeyedColumnElement +from ...sql.elements import TextClause from ...sql.expression import alias from ...util.typing import Self @@ -141,11 +148,10 @@ def on_conflict_do_update( :paramref:`.Insert.on_conflict_do_update.set_` dictionary. :param where: - Optional argument. If present, can be a literal SQL - string or an acceptable expression for a ``WHERE`` clause - that restricts the rows affected by ``DO UPDATE SET``. Rows - not meeting the ``WHERE`` condition will not be updated - (effectively a ``DO NOTHING`` for those rows). + Optional argument. An expression object representing a ``WHERE`` + clause that restricts the rows affected by ``DO UPDATE SET``. Rows not + meeting the ``WHERE`` condition will not be updated (effectively a + ``DO NOTHING`` for those rows). """ @@ -184,9 +190,10 @@ def on_conflict_do_nothing( class OnConflictClause(ClauseElement): stringify_dialect = "sqlite" - constraint_target: None - inferred_target_elements: _OnConflictIndexElementsT - inferred_target_whereclause: _OnConflictIndexWhereT + inferred_target_elements: Optional[List[Union[str, schema.Column[Any]]]] + inferred_target_whereclause: Optional[ + Union[ColumnElement[Any], TextClause] + ] def __init__( self, @@ -194,11 +201,20 @@ def __init__( index_where: _OnConflictIndexWhereT = None, ): if index_elements is not None: - self.constraint_target = None - self.inferred_target_elements = index_elements - self.inferred_target_whereclause = index_where + self.inferred_target_elements = [ + coercions.expect(roles.DDLConstraintColumnRole, column) + for column in index_elements + ] + self.inferred_target_whereclause = ( + coercions.expect( + roles.WhereHavingRole, + index_where, + ) + if index_where is not None + else None + ) else: - self.constraint_target = self.inferred_target_elements = ( + self.inferred_target_elements = ( self.inferred_target_whereclause ) = None @@ -210,6 +226,9 @@ class OnConflictDoNothing(OnConflictClause): class OnConflictDoUpdate(OnConflictClause): __visit_name__ = "on_conflict_do_update" + update_values_to_set: List[Tuple[Union[schema.Column[Any], str], Any]] + update_whereclause: Optional[ColumnElement[Any]] + def __init__( self, index_elements: _OnConflictIndexElementsT = None, @@ -237,4 +256,8 @@ def __init__( (coercions.expect(roles.DMLColumnRole, key), value) for key, value in set_.items() ] - self.update_whereclause = where + self.update_whereclause = ( + coercions.expect(roles.WhereHavingRole, where) + if where is not None + else None + ) diff --git a/libs/sqlalchemy/dialects/sqlite/json.py b/libs/sqlalchemy/dialects/sqlite/json.py index ec2980297..02f4ea4c9 100644 --- a/libs/sqlalchemy/dialects/sqlite/json.py +++ b/libs/sqlalchemy/dialects/sqlite/json.py @@ -1,5 +1,5 @@ # dialects/sqlite/json.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/sqlite/provision.py b/libs/sqlalchemy/dialects/sqlite/provision.py index f18568b0b..97f882e7f 100644 --- a/libs/sqlalchemy/dialects/sqlite/provision.py +++ b/libs/sqlalchemy/dialects/sqlite/provision.py @@ -1,5 +1,5 @@ # dialects/sqlite/provision.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/dialects/sqlite/pysqlcipher.py b/libs/sqlalchemy/dialects/sqlite/pysqlcipher.py index 388a4dff8..7a3dc1bae 100644 --- a/libs/sqlalchemy/dialects/sqlite/pysqlcipher.py +++ b/libs/sqlalchemy/dialects/sqlite/pysqlcipher.py @@ -1,5 +1,5 @@ # dialects/sqlite/pysqlcipher.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -39,7 +39,7 @@ e = create_engine( "sqlite+pysqlcipher://:password@/dbname.db", - module=sqlcipher_compatible_driver + module=sqlcipher_compatible_driver, ) These drivers make use of the SQLCipher engine. This system essentially @@ -55,12 +55,12 @@ of the :mod:`~sqlalchemy.dialects.sqlite.pysqlite` driver, except that the "password" field is now accepted, which should contain a passphrase:: - e = create_engine('sqlite+pysqlcipher://:testing@/foo.db') + e = create_engine("sqlite+pysqlcipher://:testing@/foo.db") For an absolute file path, two leading slashes should be used for the database name:: - e = create_engine('sqlite+pysqlcipher://:testing@//path/to/foo.db') + e = create_engine("sqlite+pysqlcipher://:testing@//path/to/foo.db") A selection of additional encryption-related pragmas supported by SQLCipher as documented at https://www.zetetic.net/sqlcipher/sqlcipher-api/ can be passed @@ -68,7 +68,9 @@ new connection. Currently, ``cipher``, ``kdf_iter`` ``cipher_page_size`` and ``cipher_use_hmac`` are supported:: - e = create_engine('sqlite+pysqlcipher://:testing@/foo.db?cipher=aes-256-cfb&kdf_iter=64000') + e = create_engine( + "sqlite+pysqlcipher://:testing@/foo.db?cipher=aes-256-cfb&kdf_iter=64000" + ) .. warning:: Previous versions of sqlalchemy did not take into consideration the encryption-related pragmas passed in the url string, that were silently diff --git a/libs/sqlalchemy/dialects/sqlite/pysqlite.py b/libs/sqlalchemy/dialects/sqlite/pysqlite.py index 69a902c32..9dafda6d9 100644 --- a/libs/sqlalchemy/dialects/sqlite/pysqlite.py +++ b/libs/sqlalchemy/dialects/sqlite/pysqlite.py @@ -1,5 +1,5 @@ # dialects/sqlite/pysqlite.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -28,7 +28,9 @@ --------------- The file specification for the SQLite database is taken as the "database" -portion of the URL. Note that the format of a SQLAlchemy url is:: +portion of the URL. Note that the format of a SQLAlchemy url is: + +.. sourcecode:: text driver://user:pass@host/database @@ -37,28 +39,28 @@ looks like:: # relative path - e = create_engine('sqlite:///path/to/database.db') + e = create_engine("sqlite:///path/to/database.db") An absolute path, which is denoted by starting with a slash, means you need **four** slashes:: # absolute path - e = create_engine('sqlite:////path/to/database.db') + e = create_engine("sqlite:////path/to/database.db") To use a Windows path, regular drive specifications and backslashes can be used. Double backslashes are probably needed:: # absolute path on Windows - e = create_engine('sqlite:///C:\\path\\to\\database.db') + e = create_engine("sqlite:///C:\\path\\to\\database.db") To use sqlite ``:memory:`` database specify it as the filename using ``sqlite:///:memory:``. It's also the default if no filepath is present, specifying only ``sqlite://`` and nothing else:: # in-memory database (note three slashes) - e = create_engine('sqlite:///:memory:') + e = create_engine("sqlite:///:memory:") # also in-memory database - e2 = create_engine('sqlite://') + e2 = create_engine("sqlite://") .. _pysqlite_uri_connections: @@ -98,7 +100,9 @@ sqlite3.connect( "file:path/to/database?mode=ro&nolock=1", - check_same_thread=True, timeout=10, uri=True + check_same_thread=True, + timeout=10, + uri=True, ) Regarding future parameters added to either the Python or native drivers. new @@ -144,8 +148,11 @@ def regexp(a, b): return re.search(a, b) is not None + sqlite_connection.create_function( - "regexp", 2, regexp, + "regexp", + 2, + regexp, ) There is currently no support for regular expression flags as a separate @@ -186,10 +193,12 @@ def regexp(a, b): nor should be necessary, for use with SQLAlchemy, usage of PARSE_DECLTYPES can be forced if one configures "native_datetime=True" on create_engine():: - engine = create_engine('sqlite://', - connect_args={'detect_types': - sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES}, - native_datetime=True + engine = create_engine( + "sqlite://", + connect_args={ + "detect_types": sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES + }, + native_datetime=True, ) With this flag enabled, the DATE and TIMESTAMP types (but note - not the @@ -244,6 +253,7 @@ def regexp(a, b): parameter:: from sqlalchemy import NullPool + engine = create_engine("sqlite:///myfile.db", poolclass=NullPool) It's been observed that the :class:`.NullPool` implementation incurs an @@ -263,9 +273,12 @@ def regexp(a, b): as ``False``:: from sqlalchemy.pool import StaticPool - engine = create_engine('sqlite://', - connect_args={'check_same_thread':False}, - poolclass=StaticPool) + + engine = create_engine( + "sqlite://", + connect_args={"check_same_thread": False}, + poolclass=StaticPool, + ) Note that using a ``:memory:`` database in multiple threads requires a recent version of SQLite. @@ -284,14 +297,14 @@ def regexp(a, b): # maintain the same connection per thread from sqlalchemy.pool import SingletonThreadPool - engine = create_engine('sqlite:///mydb.db', - poolclass=SingletonThreadPool) + + engine = create_engine("sqlite:///mydb.db", poolclass=SingletonThreadPool) # maintain the same connection across all threads from sqlalchemy.pool import StaticPool - engine = create_engine('sqlite:///mydb.db', - poolclass=StaticPool) + + engine = create_engine("sqlite:///mydb.db", poolclass=StaticPool) Note that :class:`.SingletonThreadPool` should be configured for the number of threads that are to be used; beyond that number, connections will be @@ -320,13 +333,14 @@ def regexp(a, b): from sqlalchemy import String from sqlalchemy import TypeDecorator + class MixedBinary(TypeDecorator): impl = String cache_ok = True def process_result_value(self, value, dialect): if isinstance(value, str): - value = bytes(value, 'utf-8') + value = bytes(value, "utf-8") elif value is not None: value = bytes(value) @@ -367,12 +381,14 @@ def process_result_value(self, value, dialect): engine = create_engine("sqlite:///myfile.db") + @event.listens_for(engine, "connect") def do_connect(dbapi_connection, connection_record): # disable pysqlite's emitting of the BEGIN statement entirely. # also stops it from emitting COMMIT before any DDL. dbapi_connection.isolation_level = None + @event.listens_for(engine, "begin") def do_begin(conn): # emit our own BEGIN @@ -442,7 +458,6 @@ def connect(conn, rec): with engine.connect() as conn: print(conn.scalar(text("SELECT UDF()"))) - """ # noqa import math diff --git a/libs/sqlalchemy/engine/__init__.py b/libs/sqlalchemy/engine/__init__.py index af0f7ee8b..f4205d892 100644 --- a/libs/sqlalchemy/engine/__init__.py +++ b/libs/sqlalchemy/engine/__init__.py @@ -1,5 +1,5 @@ # engine/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/engine/_py_processors.py b/libs/sqlalchemy/engine/_py_processors.py index 2cc35b501..8536d53d7 100644 --- a/libs/sqlalchemy/engine/_py_processors.py +++ b/libs/sqlalchemy/engine/_py_processors.py @@ -1,5 +1,5 @@ # engine/_py_processors.py -# Copyright (C) 2010-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2010-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # Copyright (C) 2010 Gaetan de Menten gdementen@gmail.com # diff --git a/libs/sqlalchemy/engine/_py_row.py b/libs/sqlalchemy/engine/_py_row.py index 4e1dd7d43..38c60fcd2 100644 --- a/libs/sqlalchemy/engine/_py_row.py +++ b/libs/sqlalchemy/engine/_py_row.py @@ -1,5 +1,5 @@ # engine/_py_row.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/engine/_py_util.py b/libs/sqlalchemy/engine/_py_util.py index 2be4322ab..50badea2a 100644 --- a/libs/sqlalchemy/engine/_py_util.py +++ b/libs/sqlalchemy/engine/_py_util.py @@ -1,5 +1,5 @@ # engine/_py_util.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/engine/base.py b/libs/sqlalchemy/engine/base.py index 983bdae03..cbf11acf5 100644 --- a/libs/sqlalchemy/engine/base.py +++ b/libs/sqlalchemy/engine/base.py @@ -1,5 +1,5 @@ # engine/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -378,12 +378,11 @@ def execution_options(self, **opt: Any) -> Connection: :param stream_results: Available on: :class:`_engine.Connection`, :class:`_sql.Executable`. - Indicate to the dialect that results should be - "streamed" and not pre-buffered, if possible. For backends - such as PostgreSQL, MySQL and MariaDB, this indicates the use of - a "server side cursor" as opposed to a client side cursor. - Other backends such as that of Oracle may already use server - side cursors by default. + Indicate to the dialect that results should be "streamed" and not + pre-buffered, if possible. For backends such as PostgreSQL, MySQL + and MariaDB, this indicates the use of a "server side cursor" as + opposed to a client side cursor. Other backends such as that of + Oracle Database may already use server side cursors by default. The usage of :paramref:`_engine.Connection.execution_options.stream_results` is @@ -801,7 +800,6 @@ def begin(self) -> RootTransaction: with conn.begin() as trans: conn.execute(table.insert(), {"username": "sandy"}) - The returned object is an instance of :class:`_engine.RootTransaction`. This object represents the "scope" of the transaction, which completes when either the :meth:`_engine.Transaction.rollback` @@ -907,7 +905,7 @@ def begin_nested(self) -> NestedTransaction: trans.rollback() # rollback to savepoint # outer transaction continues - connection.execute( ... ) + connection.execute(...) If :meth:`_engine.Connection.begin_nested` is called without first calling :meth:`_engine.Connection.begin` or @@ -917,11 +915,11 @@ def begin_nested(self) -> NestedTransaction: with engine.connect() as connection: # begin() wasn't called - with connection.begin_nested(): will auto-"begin()" first - connection.execute( ... ) + with connection.begin_nested(): # will auto-"begin()" first + connection.execute(...) # savepoint is released - connection.execute( ... ) + connection.execute(...) # explicitly commit outer transaction connection.commit() @@ -1738,21 +1736,20 @@ def exec_driver_sql( conn.exec_driver_sql( "INSERT INTO table (id, value) VALUES (%(id)s, %(value)s)", - [{"id":1, "value":"v1"}, {"id":2, "value":"v2"}] + [{"id": 1, "value": "v1"}, {"id": 2, "value": "v2"}], ) Single dictionary:: conn.exec_driver_sql( "INSERT INTO table (id, value) VALUES (%(id)s, %(value)s)", - dict(id=1, value="v1") + dict(id=1, value="v1"), ) Single tuple:: conn.exec_driver_sql( - "INSERT INTO table (id, value) VALUES (?, ?)", - (1, 'v1') + "INSERT INTO table (id, value) VALUES (?, ?)", (1, "v1") ) .. note:: The :meth:`_engine.Connection.exec_driver_sql` method does @@ -2514,6 +2511,7 @@ class Transaction(TransactionalContext): :class:`_engine.Connection`:: from sqlalchemy import create_engine + engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test") connection = engine.connect() trans = connection.begin() @@ -3091,10 +3089,10 @@ def execution_options(self, **opt: Any) -> OptionEngine: shards = {"default": "base", "shard_1": "db1", "shard_2": "db2"} + @event.listens_for(Engine, "before_cursor_execute") - def _switch_shard(conn, cursor, stmt, - params, context, executemany): - shard_id = conn.get_execution_options().get('shard_id', "default") + def _switch_shard(conn, cursor, stmt, params, context, executemany): + shard_id = conn.get_execution_options().get("shard_id", "default") current_shard = conn.info.get("current_shard", None) if current_shard != shard_id: @@ -3220,9 +3218,7 @@ def begin(self) -> Iterator[Connection]: E.g.:: with engine.begin() as conn: - conn.execute( - text("insert into table (x, y, z) values (1, 2, 3)") - ) + conn.execute(text("insert into table (x, y, z) values (1, 2, 3)")) conn.execute(text("my_special_procedure(5)")) Upon successful operation, the :class:`.Transaction` @@ -3238,7 +3234,7 @@ def begin(self) -> Iterator[Connection]: :meth:`_engine.Connection.begin` - start a :class:`.Transaction` for a particular :class:`_engine.Connection`. - """ + """ # noqa: E501 with self.connect() as conn: with conn.begin(): yield conn diff --git a/libs/sqlalchemy/engine/characteristics.py b/libs/sqlalchemy/engine/characteristics.py index 97b17fbdf..322c28b5a 100644 --- a/libs/sqlalchemy/engine/characteristics.py +++ b/libs/sqlalchemy/engine/characteristics.py @@ -1,5 +1,5 @@ # engine/characteristics.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/engine/create.py b/libs/sqlalchemy/engine/create.py index 74a3cf801..920f620bd 100644 --- a/libs/sqlalchemy/engine/create.py +++ b/libs/sqlalchemy/engine/create.py @@ -1,5 +1,5 @@ # engine/create.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -133,8 +133,11 @@ def create_engine(url: Union[str, _url.URL], **kwargs: Any) -> Engine: and its underlying :class:`.Dialect` and :class:`_pool.Pool` constructs:: - engine = create_engine("mysql+mysqldb://scott:tiger@hostname/dbname", - pool_recycle=3600, echo=True) + engine = create_engine( + "mysql+mysqldb://scott:tiger@hostname/dbname", + pool_recycle=3600, + echo=True, + ) The string form of the URL is ``dialect[+driver]://user:password@host/dbname[?key=value..]``, where diff --git a/libs/sqlalchemy/engine/cursor.py b/libs/sqlalchemy/engine/cursor.py index b83cb4515..ff14ad8ee 100644 --- a/libs/sqlalchemy/engine/cursor.py +++ b/libs/sqlalchemy/engine/cursor.py @@ -1,5 +1,5 @@ # engine/cursor.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -1162,7 +1162,7 @@ class BufferedRowCursorFetchStrategy(CursorFetchStrategy): result = conn.execution_options( stream_results=True, max_row_buffer=50 - ).execute(text("select * from table")) + ).execute(text("select * from table")) .. versionadded:: 1.4 ``max_row_buffer`` may now exceed 1000 rows. @@ -1756,11 +1756,9 @@ def splice_horizontally(self, other): r1 = connection.execute( users.insert().returning( - users.c.user_name, - users.c.user_id, - sort_by_parameter_order=True + users.c.user_name, users.c.user_id, sort_by_parameter_order=True ), - user_values + user_values, ) r2 = connection.execute( @@ -1768,19 +1766,16 @@ def splice_horizontally(self, other): addresses.c.address_id, addresses.c.address, addresses.c.user_id, - sort_by_parameter_order=True + sort_by_parameter_order=True, ), - address_values + address_values, ) rows = r1.splice_horizontally(r2).all() - assert ( - rows == - [ - ("john", 1, 1, "foo@bar.com", 1), - ("jack", 2, 2, "bar@bat.com", 2), - ] - ) + assert rows == [ + ("john", 1, 1, "foo@bar.com", 1), + ("jack", 2, 2, "bar@bat.com", 2), + ] .. versionadded:: 2.0 @@ -1789,7 +1784,7 @@ def splice_horizontally(self, other): :meth:`.CursorResult.splice_vertically` - """ + """ # noqa: E501 clone = self._generate() total_rows = [ diff --git a/libs/sqlalchemy/engine/default.py b/libs/sqlalchemy/engine/default.py index d42a3138b..dd4250ffc 100644 --- a/libs/sqlalchemy/engine/default.py +++ b/libs/sqlalchemy/engine/default.py @@ -1,5 +1,5 @@ # engine/default.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -254,7 +254,7 @@ class DefaultDialect(Dialect): default_schema_name: Optional[str] = None # indicates symbol names are - # UPPERCASEd if they are case insensitive + # UPPERCASED if they are case insensitive # within the database. # if this is True, the methods normalize_name() # and denormalize_name() must be provided. @@ -392,7 +392,8 @@ def insert_executemany_returning(self): available if the dialect in use has opted into using the "use_insertmanyvalues" feature. If they haven't opted into that, then this attribute is False, unless the dialect in question overrides this - and provides some other implementation (such as the Oracle dialect). + and provides some other implementation (such as the Oracle Database + dialects). """ return self.insert_returning and self.use_insertmanyvalues @@ -415,7 +416,7 @@ def insert_executemany_returning_sort_by_parameter_order(self): If the dialect in use hasn't opted into that, then this attribute is False, unless the dialect in question overrides this and provides some - other implementation (such as the Oracle dialect). + other implementation (such as the Oracle Database dialects). """ return self.insert_returning and self.use_insertmanyvalues @@ -2050,10 +2051,11 @@ def _prepare_set_input_sizes( style of ``setinputsizes()`` on the cursor, using DB-API types from the bind parameter's ``TypeEngine`` objects. - This method only called by those dialects which set - the :attr:`.Dialect.bind_typing` attribute to - :attr:`.BindTyping.SETINPUTSIZES`. cx_Oracle is the only DBAPI - that requires setinputsizes(), pyodbc offers it as an option. + This method only called by those dialects which set the + :attr:`.Dialect.bind_typing` attribute to + :attr:`.BindTyping.SETINPUTSIZES`. Python-oracledb and cx_Oracle are + the only DBAPIs that requires setinputsizes(); pyodbc offers it as an + option. Prior to SQLAlchemy 2.0, the setinputsizes() approach was also used for pg8000 and asyncpg, which has been changed to inline rendering diff --git a/libs/sqlalchemy/engine/events.py b/libs/sqlalchemy/engine/events.py index b8e8936b9..b759382cb 100644 --- a/libs/sqlalchemy/engine/events.py +++ b/libs/sqlalchemy/engine/events.py @@ -1,5 +1,5 @@ # engine/events.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -54,19 +54,24 @@ class or instance, such as an :class:`_engine.Engine`, e.g.:: from sqlalchemy import event, create_engine - def before_cursor_execute(conn, cursor, statement, parameters, context, - executemany): + + def before_cursor_execute( + conn, cursor, statement, parameters, context, executemany + ): log.info("Received statement: %s", statement) - engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/test') + + engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test") event.listen(engine, "before_cursor_execute", before_cursor_execute) or with a specific :class:`_engine.Connection`:: with engine.begin() as conn: - @event.listens_for(conn, 'before_cursor_execute') - def before_cursor_execute(conn, cursor, statement, parameters, - context, executemany): + + @event.listens_for(conn, "before_cursor_execute") + def before_cursor_execute( + conn, cursor, statement, parameters, context, executemany + ): log.info("Received statement: %s", statement) When the methods are called with a `statement` parameter, such as in @@ -84,9 +89,11 @@ def before_cursor_execute(conn, cursor, statement, parameters, from sqlalchemy.engine import Engine from sqlalchemy import event + @event.listens_for(Engine, "before_cursor_execute", retval=True) - def comment_sql_calls(conn, cursor, statement, parameters, - context, executemany): + def comment_sql_calls( + conn, cursor, statement, parameters, context, executemany + ): statement = statement + " -- some comment" return statement, parameters @@ -316,8 +323,9 @@ def before_cursor_execute( returned as a two-tuple in this case:: @event.listens_for(Engine, "before_cursor_execute", retval=True) - def before_cursor_execute(conn, cursor, statement, - parameters, context, executemany): + def before_cursor_execute( + conn, cursor, statement, parameters, context, executemany + ): # do something with statement, parameters return statement, parameters @@ -766,9 +774,9 @@ def handle_error( @event.listens_for(Engine, "handle_error") def handle_exception(context): - if isinstance(context.original_exception, - psycopg2.OperationalError) and \ - "failed" in str(context.original_exception): + if isinstance( + context.original_exception, psycopg2.OperationalError + ) and "failed" in str(context.original_exception): raise MySpecialException("failed operation") .. warning:: Because the @@ -791,10 +799,13 @@ def handle_exception(context): @event.listens_for(Engine, "handle_error", retval=True) def handle_exception(context): - if context.chained_exception is not None and \ - "special" in context.chained_exception.message: - return MySpecialException("failed", - cause=context.chained_exception) + if ( + context.chained_exception is not None + and "special" in context.chained_exception.message + ): + return MySpecialException( + "failed", cause=context.chained_exception + ) Handlers that return ``None`` may be used within the chain; when a handler returns ``None``, the previous exception instance, @@ -836,7 +847,8 @@ def do_connect( e = create_engine("postgresql+psycopg2://user@host/dbname") - @event.listens_for(e, 'do_connect') + + @event.listens_for(e, "do_connect") def receive_do_connect(dialect, conn_rec, cargs, cparams): cparams["password"] = "some_password" @@ -845,7 +857,8 @@ def receive_do_connect(dialect, conn_rec, cargs, cparams): e = create_engine("postgresql+psycopg2://user@host/dbname") - @event.listens_for(e, 'do_connect') + + @event.listens_for(e, "do_connect") def receive_do_connect(dialect, conn_rec, cargs, cparams): return psycopg2.connect(*cargs, **cparams) @@ -928,7 +941,8 @@ def do_setinputsizes( The setinputsizes hook overall is only used for dialects which include the flag ``use_setinputsizes=True``. Dialects which use this - include cx_Oracle, pg8000, asyncpg, and pyodbc dialects. + include python-oracledb, cx_Oracle, pg8000, asyncpg, and pyodbc + dialects. .. note:: diff --git a/libs/sqlalchemy/engine/interfaces.py b/libs/sqlalchemy/engine/interfaces.py index 17a133f27..9fb39db78 100644 --- a/libs/sqlalchemy/engine/interfaces.py +++ b/libs/sqlalchemy/engine/interfaces.py @@ -1,5 +1,5 @@ # engine/interfaces.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -580,8 +580,8 @@ class BindTyping(Enum): """Use the pep-249 setinputsizes method. This is only implemented for DBAPIs that support this method and for which - the SQLAlchemy dialect has the appropriate infrastructure for that - dialect set up. Current dialects include cx_Oracle as well as + the SQLAlchemy dialect has the appropriate infrastructure for that dialect + set up. Current dialects include python-oracledb, cx_Oracle as well as optional support for SQL Server using pyodbc. When using setinputsizes, dialects also have a means of only using the @@ -871,12 +871,12 @@ def loaded_dbapi(self) -> ModuleType: the statement multiple times for a series of batches when large numbers of rows are given. - The parameter is False for the default dialect, and is set to - True for SQLAlchemy internal dialects SQLite, MySQL/MariaDB, PostgreSQL, - SQL Server. It remains at False for Oracle, which provides native - "executemany with RETURNING" support and also does not support - ``supports_multivalues_insert``. For MySQL/MariaDB, those MySQL - dialects that don't support RETURNING will not report + The parameter is False for the default dialect, and is set to True for + SQLAlchemy internal dialects SQLite, MySQL/MariaDB, PostgreSQL, SQL Server. + It remains at False for Oracle Database, which provides native "executemany + with RETURNING" support and also does not support + ``supports_multivalues_insert``. For MySQL/MariaDB, those MySQL dialects + that don't support RETURNING will not report ``insert_executemany_returning`` as True. .. versionadded:: 2.0 @@ -1060,11 +1060,7 @@ def loaded_dbapi(self) -> ModuleType: To implement, establish as a series of tuples, as in:: construct_arguments = [ - (schema.Index, { - "using": False, - "where": None, - "ops": None - }) + (schema.Index, {"using": False, "where": None, "ops": None}), ] If the above construct is established on the PostgreSQL dialect, @@ -1093,7 +1089,8 @@ def loaded_dbapi(self) -> ModuleType: established on a :class:`.Table` object which will be passed as "reflection options" when using :paramref:`.Table.autoload_with`. - Current example is "oracle_resolve_synonyms" in the Oracle dialect. + Current example is "oracle_resolve_synonyms" in the Oracle Database + dialects. """ @@ -1117,7 +1114,7 @@ def loaded_dbapi(self) -> ModuleType: supports_constraint_comments: bool """Indicates if the dialect supports comment DDL on constraints. - .. versionadded: 2.0 + .. versionadded:: 2.0 """ _has_events = False @@ -2498,7 +2495,7 @@ def get_isolation_level_values( ``REPEATABLE READ``. isolation level names will have underscores converted to spaces before being passed along to the dialect. * The names for the four standard isolation names to the extent that - they are supported by the backend should be ``READ UNCOMMITTED`` + they are supported by the backend should be ``READ UNCOMMITTED``, ``READ COMMITTED``, ``REPEATABLE READ``, ``SERIALIZABLE`` * if the dialect supports an autocommit option it should be provided using the isolation level name ``AUTOCOMMIT``. @@ -2684,11 +2681,14 @@ class CreateEnginePlugin: from sqlalchemy.engine import CreateEnginePlugin from sqlalchemy import event + class LogCursorEventsPlugin(CreateEnginePlugin): def __init__(self, url, kwargs): # consume the parameter "log_cursor_logging_name" from the # URL query - logging_name = url.query.get("log_cursor_logging_name", "log_cursor") + logging_name = url.query.get( + "log_cursor_logging_name", "log_cursor" + ) self.log = logging.getLogger(logging_name) @@ -2700,7 +2700,6 @@ def engine_created(self, engine): "attach an event listener after the new Engine is constructed" event.listen(engine, "before_cursor_execute", self._log_event) - def _log_event( self, conn, @@ -2708,19 +2707,19 @@ def _log_event( statement, parameters, context, - executemany): + executemany, + ): self.log.info("Plugin logged cursor event: %s", statement) - - Plugins are registered using entry points in a similar way as that of dialects:: - entry_points={ - 'sqlalchemy.plugins': [ - 'log_cursor_plugin = myapp.plugins:LogCursorEventsPlugin' + entry_points = { + "sqlalchemy.plugins": [ + "log_cursor_plugin = myapp.plugins:LogCursorEventsPlugin" ] + } A plugin that uses the above names would be invoked from a database URL as in:: @@ -2737,15 +2736,16 @@ def _log_event( in the URL:: engine = create_engine( - "mysql+pymysql://scott:tiger@localhost/test?" - "plugin=plugin_one&plugin=plugin_twp&plugin=plugin_three") + "mysql+pymysql://scott:tiger@localhost/test?" + "plugin=plugin_one&plugin=plugin_twp&plugin=plugin_three" + ) The plugin names may also be passed directly to :func:`_sa.create_engine` using the :paramref:`_sa.create_engine.plugins` argument:: engine = create_engine( - "mysql+pymysql://scott:tiger@localhost/test", - plugins=["myplugin"]) + "mysql+pymysql://scott:tiger@localhost/test", plugins=["myplugin"] + ) .. versionadded:: 1.2.3 plugin names can also be specified to :func:`_sa.create_engine` as a list @@ -2767,9 +2767,9 @@ def _log_event( class MyPlugin(CreateEnginePlugin): def __init__(self, url, kwargs): - self.my_argument_one = url.query['my_argument_one'] - self.my_argument_two = url.query['my_argument_two'] - self.my_argument_three = kwargs.pop('my_argument_three', None) + self.my_argument_one = url.query["my_argument_one"] + self.my_argument_two = url.query["my_argument_two"] + self.my_argument_three = kwargs.pop("my_argument_three", None) def update_url(self, url): return url.difference_update_query( @@ -2782,9 +2782,9 @@ def update_url(self, url): from sqlalchemy import create_engine engine = create_engine( - "mysql+pymysql://scott:tiger@localhost/test?" - "plugin=myplugin&my_argument_one=foo&my_argument_two=bar", - my_argument_three='bat' + "mysql+pymysql://scott:tiger@localhost/test?" + "plugin=myplugin&my_argument_one=foo&my_argument_two=bar", + my_argument_three="bat", ) .. versionchanged:: 1.4 @@ -2803,15 +2803,15 @@ class MyPlugin(CreateEnginePlugin): def __init__(self, url, kwargs): if hasattr(CreateEnginePlugin, "update_url"): # detect the 1.4 API - self.my_argument_one = url.query['my_argument_one'] - self.my_argument_two = url.query['my_argument_two'] + self.my_argument_one = url.query["my_argument_one"] + self.my_argument_two = url.query["my_argument_two"] else: # detect the 1.3 and earlier API - mutate the # URL directly - self.my_argument_one = url.query.pop('my_argument_one') - self.my_argument_two = url.query.pop('my_argument_two') + self.my_argument_one = url.query.pop("my_argument_one") + self.my_argument_two = url.query.pop("my_argument_two") - self.my_argument_three = kwargs.pop('my_argument_three', None) + self.my_argument_three = kwargs.pop("my_argument_three", None) def update_url(self, url): # this method is only called in the 1.4 version @@ -3382,11 +3382,14 @@ def run_async(self, fn: Callable[[Any], Awaitable[_T]]) -> _T: engine = create_async_engine(...) + @event.listens_for(engine.sync_engine, "connect") - def register_custom_types(dbapi_connection, ...): + def register_custom_types( + dbapi_connection, # ... + ): dbapi_connection.run_async( lambda connection: connection.set_type_codec( - 'MyCustomType', encoder, decoder, ... + "MyCustomType", encoder, decoder, ... ) ) diff --git a/libs/sqlalchemy/engine/mock.py b/libs/sqlalchemy/engine/mock.py index c9fa5eb31..08dba5a64 100644 --- a/libs/sqlalchemy/engine/mock.py +++ b/libs/sqlalchemy/engine/mock.py @@ -1,5 +1,5 @@ # engine/mock.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -90,10 +90,12 @@ def create_mock_engine( from sqlalchemy import create_mock_engine + def dump(sql, *multiparams, **params): print(sql.compile(dialect=engine.dialect)) - engine = create_mock_engine('postgresql+psycopg2://', dump) + + engine = create_mock_engine("postgresql+psycopg2://", dump) metadata.create_all(engine, checkfirst=False) :param url: A string URL which typically needs to contain only the diff --git a/libs/sqlalchemy/engine/processors.py b/libs/sqlalchemy/engine/processors.py index 610e03d5a..b3f933084 100644 --- a/libs/sqlalchemy/engine/processors.py +++ b/libs/sqlalchemy/engine/processors.py @@ -1,5 +1,5 @@ # engine/processors.py -# Copyright (C) 2010-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2010-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # Copyright (C) 2010 Gaetan de Menten gdementen@gmail.com # diff --git a/libs/sqlalchemy/engine/reflection.py b/libs/sqlalchemy/engine/reflection.py index 09b098803..5d754c670 100644 --- a/libs/sqlalchemy/engine/reflection.py +++ b/libs/sqlalchemy/engine/reflection.py @@ -1,5 +1,5 @@ # engine/reflection.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -193,7 +193,8 @@ class Inspector(inspection.Inspectable["Inspector"]): or a :class:`_engine.Connection`:: from sqlalchemy import inspect, create_engine - engine = create_engine('...') + + engine = create_engine("...") insp = inspect(engine) Where above, the :class:`~sqlalchemy.engine.interfaces.Dialect` associated @@ -630,7 +631,7 @@ def get_temp_table_names(self, **kw: Any) -> List[str]: r"""Return a list of temporary table names for the current bind. This method is unsupported by most dialects; currently - only Oracle, PostgreSQL and SQLite implements it. + only Oracle Database, PostgreSQL and SQLite implements it. :param \**kw: Additional keyword argument to pass to the dialect specific implementation. See the documentation of the dialect @@ -666,7 +667,7 @@ def get_table_options( given name was created. This currently includes some options that apply to MySQL and Oracle - tables. + Database tables. :param table_name: string name of the table. For special quoting, use :class:`.quoted_name`. @@ -1492,9 +1493,9 @@ def reflect_table( from sqlalchemy import create_engine, MetaData, Table from sqlalchemy import inspect - engine = create_engine('...') + engine = create_engine("...") meta = MetaData() - user_table = Table('user', meta) + user_table = Table("user", meta) insp = inspect(engine) insp.reflect_table(user_table, None) diff --git a/libs/sqlalchemy/engine/result.py b/libs/sqlalchemy/engine/result.py index 5ff41f1cb..7411fd74f 100644 --- a/libs/sqlalchemy/engine/result.py +++ b/libs/sqlalchemy/engine/result.py @@ -1,5 +1,5 @@ # engine/result.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -1099,17 +1099,15 @@ def columns(self, *col_expressions: _KeyIndexType) -> Self: statement = select(table.c.x, table.c.y, table.c.z) result = connection.execute(statement) - for z, y in result.columns('z', 'y'): - # ... - + for z, y in result.columns("z", "y"): + ... Example of using the column objects from the statement itself:: for z, y in result.columns( - statement.selected_columns.c.z, - statement.selected_columns.c.y + statement.selected_columns.c.z, statement.selected_columns.c.y ): - # ... + ... .. versionadded:: 1.4 diff --git a/libs/sqlalchemy/engine/row.py b/libs/sqlalchemy/engine/row.py index bcaffee44..da7ae9af2 100644 --- a/libs/sqlalchemy/engine/row.py +++ b/libs/sqlalchemy/engine/row.py @@ -1,5 +1,5 @@ # engine/row.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -340,12 +340,11 @@ class RowMapping(BaseRow, typing.Mapping["_KeyType", Any]): as iteration of keys, values, and items:: for row in result: - if 'a' in row._mapping: - print("Column 'a': %s" % row._mapping['a']) + if "a" in row._mapping: + print("Column 'a': %s" % row._mapping["a"]) print("Column b: %s" % row._mapping[table.c.b]) - .. versionadded:: 1.4 The :class:`.RowMapping` object replaces the mapping-like access previously provided by a database result row, which now seeks to behave mostly like a named tuple. diff --git a/libs/sqlalchemy/engine/strategies.py b/libs/sqlalchemy/engine/strategies.py index 30c331e8d..5dd7bca9a 100644 --- a/libs/sqlalchemy/engine/strategies.py +++ b/libs/sqlalchemy/engine/strategies.py @@ -1,5 +1,5 @@ # engine/strategies.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/engine/url.py b/libs/sqlalchemy/engine/url.py index 1eeb73a23..bb004f11c 100644 --- a/libs/sqlalchemy/engine/url.py +++ b/libs/sqlalchemy/engine/url.py @@ -1,5 +1,5 @@ # engine/url.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -122,7 +122,9 @@ class URL(NamedTuple): for keys and either strings or tuples of strings for values, e.g.:: >>> from sqlalchemy.engine import make_url - >>> url = make_url("postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt") + >>> url = make_url( + ... "postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt" + ... ) >>> url.query immutabledict({'alt_host': ('host1', 'host2'), 'ssl_cipher': '/path/to/crt'}) @@ -371,7 +373,9 @@ def update_query_string( >>> from sqlalchemy.engine import make_url >>> url = make_url("postgresql+psycopg2://user:pass@host/dbname") - >>> url = url.update_query_string("alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt") + >>> url = url.update_query_string( + ... "alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt" + ... ) >>> str(url) 'postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt' @@ -407,7 +411,13 @@ def update_query_pairs( >>> from sqlalchemy.engine import make_url >>> url = make_url("postgresql+psycopg2://user:pass@host/dbname") - >>> url = url.update_query_pairs([("alt_host", "host1"), ("alt_host", "host2"), ("ssl_cipher", "/path/to/crt")]) + >>> url = url.update_query_pairs( + ... [ + ... ("alt_host", "host1"), + ... ("alt_host", "host2"), + ... ("ssl_cipher", "/path/to/crt"), + ... ] + ... ) >>> str(url) 'postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt' @@ -489,7 +499,9 @@ def update_query_dict( >>> from sqlalchemy.engine import make_url >>> url = make_url("postgresql+psycopg2://user:pass@host/dbname") - >>> url = url.update_query_dict({"alt_host": ["host1", "host2"], "ssl_cipher": "/path/to/crt"}) + >>> url = url.update_query_dict( + ... {"alt_host": ["host1", "host2"], "ssl_cipher": "/path/to/crt"} + ... ) >>> str(url) 'postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt' @@ -527,14 +539,14 @@ def difference_update_query(self, names: Iterable[str]) -> URL: E.g.:: - url = url.difference_update_query(['foo', 'bar']) + url = url.difference_update_query(["foo", "bar"]) Equivalent to using :meth:`_engine.URL.set` as follows:: url = url.set( query={ key: url.query[key] - for key in set(url.query).difference(['foo', 'bar']) + for key in set(url.query).difference(["foo", "bar"]) } ) @@ -583,7 +595,9 @@ def normalized_query(self) -> Mapping[str, Sequence[str]]: >>> from sqlalchemy.engine import make_url - >>> url = make_url("postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt") + >>> url = make_url( + ... "postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt" + ... ) >>> url.query immutabledict({'alt_host': ('host1', 'host2'), 'ssl_cipher': '/path/to/crt'}) >>> url.normalized_query diff --git a/libs/sqlalchemy/engine/util.py b/libs/sqlalchemy/engine/util.py index 186ca4c32..e499efa91 100644 --- a/libs/sqlalchemy/engine/util.py +++ b/libs/sqlalchemy/engine/util.py @@ -1,5 +1,5 @@ # engine/util.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/event/__init__.py b/libs/sqlalchemy/event/__init__.py index 9b54f07fc..309b7bd33 100644 --- a/libs/sqlalchemy/event/__init__.py +++ b/libs/sqlalchemy/event/__init__.py @@ -1,5 +1,5 @@ # event/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/event/api.py b/libs/sqlalchemy/event/api.py index 230ec6986..b6ec8f6d3 100644 --- a/libs/sqlalchemy/event/api.py +++ b/libs/sqlalchemy/event/api.py @@ -1,5 +1,5 @@ # event/api.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -51,15 +51,14 @@ def listen( from sqlalchemy import event from sqlalchemy.schema import UniqueConstraint + def unique_constraint_name(const, table): - const.name = "uq_%s_%s" % ( - table.name, - list(const.columns)[0].name - ) + const.name = "uq_%s_%s" % (table.name, list(const.columns)[0].name) + + event.listen( - UniqueConstraint, - "after_parent_attach", - unique_constraint_name) + UniqueConstraint, "after_parent_attach", unique_constraint_name + ) :param bool insert: The default behavior for event handlers is to append the decorated user defined function to an internal list of registered @@ -139,12 +138,10 @@ def listens_for( from sqlalchemy import event from sqlalchemy.schema import UniqueConstraint + @event.listens_for(UniqueConstraint, "after_parent_attach") def unique_constraint_name(const, table): - const.name = "uq_%s_%s" % ( - table.name, - list(const.columns)[0].name - ) + const.name = "uq_%s_%s" % (table.name, list(const.columns)[0].name) A given function can also be invoked for only the first invocation of the event using the ``once`` argument:: @@ -153,7 +150,6 @@ def unique_constraint_name(const, table): def on_config(): do_config() - .. warning:: The ``once`` argument does not imply automatic de-registration of the listener function after it has been invoked a first time; a listener entry will remain associated with the target object. @@ -189,6 +185,7 @@ def remove(target: Any, identifier: str, fn: Callable[..., Any]) -> None: def my_listener_function(*arg): pass + # ... it's removed like this event.remove(SomeMappedClass, "before_insert", my_listener_function) diff --git a/libs/sqlalchemy/event/attr.py b/libs/sqlalchemy/event/attr.py index ef2b334d1..ec5d5822f 100644 --- a/libs/sqlalchemy/event/attr.py +++ b/libs/sqlalchemy/event/attr.py @@ -1,5 +1,5 @@ # event/attr.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/event/base.py b/libs/sqlalchemy/event/base.py index cddfc982a..a73e86bd2 100644 --- a/libs/sqlalchemy/event/base.py +++ b/libs/sqlalchemy/event/base.py @@ -1,5 +1,5 @@ # event/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/event/legacy.py b/libs/sqlalchemy/event/legacy.py index 57e561c39..e60fd9a5e 100644 --- a/libs/sqlalchemy/event/legacy.py +++ b/libs/sqlalchemy/event/legacy.py @@ -1,5 +1,5 @@ # event/legacy.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/event/registry.py b/libs/sqlalchemy/event/registry.py index 773620f8b..d7e4b3215 100644 --- a/libs/sqlalchemy/event/registry.py +++ b/libs/sqlalchemy/event/registry.py @@ -1,5 +1,5 @@ # event/registry.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -154,7 +154,11 @@ def _removed_from_collection( if owner_ref in _collection_to_key: listener_to_key = _collection_to_key[owner_ref] - listener_to_key.pop(listen_ref) + # see #12216 - this guards against a removal that already occurred + # here. however, I cannot come up with a test that shows any negative + # side effects occurring from this removal happening, even though an + # event key may still be referenced from a clsleveldispatch here + listener_to_key.pop(listen_ref, None) def _stored_in_collection_multi( diff --git a/libs/sqlalchemy/events.py b/libs/sqlalchemy/events.py index 8c3bf01cf..ce8324395 100644 --- a/libs/sqlalchemy/events.py +++ b/libs/sqlalchemy/events.py @@ -1,5 +1,5 @@ # events.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/exc.py b/libs/sqlalchemy/exc.py index 7d7eff360..71e5dd81e 100644 --- a/libs/sqlalchemy/exc.py +++ b/libs/sqlalchemy/exc.py @@ -1,5 +1,5 @@ # exc.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -432,14 +432,16 @@ class DontWrapMixin: from sqlalchemy.exc import DontWrapMixin + class MyCustomException(Exception, DontWrapMixin): pass + class MySpecialType(TypeDecorator): impl = String def process_bind_param(self, value, dialect): - if value == 'invalid': + if value == "invalid": raise MyCustomException("invalid!") """ diff --git a/libs/sqlalchemy/ext/__init__.py b/libs/sqlalchemy/ext/__init__.py index f03ed945f..2751bcf93 100644 --- a/libs/sqlalchemy/ext/__init__.py +++ b/libs/sqlalchemy/ext/__init__.py @@ -1,5 +1,5 @@ # ext/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/associationproxy.py b/libs/sqlalchemy/ext/associationproxy.py index 99cb266e3..8f2c19b87 100644 --- a/libs/sqlalchemy/ext/associationproxy.py +++ b/libs/sqlalchemy/ext/associationproxy.py @@ -1,5 +1,5 @@ # ext/associationproxy.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -458,7 +458,7 @@ def for_class( class User(Base): # ... - keywords = association_proxy('kws', 'keyword') + keywords = association_proxy("kws", "keyword") If we access this :class:`.AssociationProxy` from :attr:`_orm.Mapper.all_orm_descriptors`, and we want to view the @@ -778,9 +778,9 @@ def attr(self) -> Tuple[SQLORMOperations[Any], SQLORMOperations[_T]]: :attr:`.AssociationProxyInstance.remote_attr` attributes separately:: stmt = ( - select(Parent). - join(Parent.proxied.local_attr). - join(Parent.proxied.remote_attr) + select(Parent) + .join(Parent.proxied.local_attr) + .join(Parent.proxied.remote_attr) ) A future release may seek to provide a more succinct join pattern diff --git a/libs/sqlalchemy/ext/asyncio/__init__.py b/libs/sqlalchemy/ext/asyncio/__init__.py index 78c707b26..7d8a04bd7 100644 --- a/libs/sqlalchemy/ext/asyncio/__init__.py +++ b/libs/sqlalchemy/ext/asyncio/__init__.py @@ -1,5 +1,5 @@ # ext/asyncio/__init__.py -# Copyright (C) 2020-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2020-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/asyncio/base.py b/libs/sqlalchemy/ext/asyncio/base.py index 9899364d1..b53d53b1a 100644 --- a/libs/sqlalchemy/ext/asyncio/base.py +++ b/libs/sqlalchemy/ext/asyncio/base.py @@ -1,5 +1,5 @@ # ext/asyncio/base.py -# Copyright (C) 2020-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2020-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -224,7 +224,9 @@ def asyncstartablecontext( ``@contextlib.asynccontextmanager`` supports, and the usage pattern is different as well. - Typical usage:: + Typical usage: + + .. sourcecode:: text @asyncstartablecontext async def some_async_generator(<arguments>): diff --git a/libs/sqlalchemy/ext/asyncio/engine.py b/libs/sqlalchemy/ext/asyncio/engine.py index 8fc8e96db..2c9b499f5 100644 --- a/libs/sqlalchemy/ext/asyncio/engine.py +++ b/libs/sqlalchemy/ext/asyncio/engine.py @@ -1,5 +1,5 @@ # ext/asyncio/engine.py -# Copyright (C) 2020-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2020-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -198,6 +198,7 @@ class AsyncConnection( method of :class:`_asyncio.AsyncEngine`:: from sqlalchemy.ext.asyncio import create_async_engine + engine = create_async_engine("postgresql+asyncpg://user:pass@host/dbname") async with engine.connect() as conn: @@ -544,7 +545,7 @@ async def stream( E.g.:: - result = await conn.stream(stmt): + result = await conn.stream(stmt) async for row in result: print(f"{row}") @@ -821,7 +822,7 @@ async def run_sync( *arg: _P.args, **kw: _P.kwargs, ) -> _T: - """Invoke the given synchronous (i.e. not async) callable, + '''Invoke the given synchronous (i.e. not async) callable, passing a synchronous-style :class:`_engine.Connection` as the first argument. @@ -831,26 +832,26 @@ async def run_sync( E.g.:: def do_something_with_core(conn: Connection, arg1: int, arg2: str) -> str: - '''A synchronous function that does not require awaiting + """A synchronous function that does not require awaiting :param conn: a Core SQLAlchemy Connection, used synchronously :return: an optional return value is supported - ''' - conn.execute( - some_table.insert().values(int_col=arg1, str_col=arg2) - ) + """ + conn.execute(some_table.insert().values(int_col=arg1, str_col=arg2)) return "success" async def do_something_async(async_engine: AsyncEngine) -> None: - '''an async function that uses awaiting''' + """an async function that uses awaiting""" async with async_engine.begin() as async_conn: # run do_something_with_core() with a sync-style # Connection, proxied into an awaitable - return_code = await async_conn.run_sync(do_something_with_core, 5, "strval") + return_code = await async_conn.run_sync( + do_something_with_core, 5, "strval" + ) print(return_code) This method maintains the asyncio event loop all the way through @@ -881,7 +882,7 @@ async def do_something_async(async_engine: AsyncEngine) -> None: :ref:`session_run_sync` - """ # noqa: E501 + ''' # noqa: E501 return await greenlet_spawn( fn, self._proxied, *arg, _require_await=False, **kw @@ -1000,6 +1001,7 @@ class AsyncEngine(ProxyComparable[Engine], AsyncConnectable): :func:`_asyncio.create_async_engine` function:: from sqlalchemy.ext.asyncio import create_async_engine + engine = create_async_engine("postgresql+asyncpg://user:pass@host/dbname") .. versionadded:: 1.4 @@ -1056,7 +1058,6 @@ async def begin(self) -> AsyncIterator[AsyncConnection]: ) await conn.execute(text("my_special_procedure(5)")) - """ conn = self.connect() diff --git a/libs/sqlalchemy/ext/asyncio/exc.py b/libs/sqlalchemy/ext/asyncio/exc.py index 1cf6f3638..558187c0b 100644 --- a/libs/sqlalchemy/ext/asyncio/exc.py +++ b/libs/sqlalchemy/ext/asyncio/exc.py @@ -1,5 +1,5 @@ # ext/asyncio/exc.py -# Copyright (C) 2020-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2020-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/asyncio/result.py b/libs/sqlalchemy/ext/asyncio/result.py index 745a51b81..c51e166d9 100644 --- a/libs/sqlalchemy/ext/asyncio/result.py +++ b/libs/sqlalchemy/ext/asyncio/result.py @@ -1,5 +1,5 @@ # ext/asyncio/result.py -# Copyright (C) 2020-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2020-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/asyncio/scoping.py b/libs/sqlalchemy/ext/asyncio/scoping.py index 162f34eab..7ecab37b4 100644 --- a/libs/sqlalchemy/ext/asyncio/scoping.py +++ b/libs/sqlalchemy/ext/asyncio/scoping.py @@ -1,5 +1,5 @@ # ext/asyncio/scoping.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -364,7 +364,7 @@ def begin(self) -> AsyncSessionTransaction: object is entered:: async with async_session.begin(): - # .. ORM transaction is begun + ... # ORM transaction is begun Note that database IO will not normally occur when the session-level transaction is begun, as database transactions begin on an @@ -808,28 +808,28 @@ def get_bind( # construct async engines w/ async drivers engines = { - 'leader':create_async_engine("sqlite+aiosqlite:///leader.db"), - 'other':create_async_engine("sqlite+aiosqlite:///other.db"), - 'follower1':create_async_engine("sqlite+aiosqlite:///follower1.db"), - 'follower2':create_async_engine("sqlite+aiosqlite:///follower2.db"), + "leader": create_async_engine("sqlite+aiosqlite:///leader.db"), + "other": create_async_engine("sqlite+aiosqlite:///other.db"), + "follower1": create_async_engine("sqlite+aiosqlite:///follower1.db"), + "follower2": create_async_engine("sqlite+aiosqlite:///follower2.db"), } + class RoutingSession(Session): def get_bind(self, mapper=None, clause=None, **kw): # within get_bind(), return sync engines if mapper and issubclass(mapper.class_, MyOtherClass): - return engines['other'].sync_engine + return engines["other"].sync_engine elif self._flushing or isinstance(clause, (Update, Delete)): - return engines['leader'].sync_engine + return engines["leader"].sync_engine else: return engines[ - random.choice(['follower1','follower2']) + random.choice(["follower1", "follower2"]) ].sync_engine + # apply to AsyncSession using sync_session_class - AsyncSessionMaker = async_sessionmaker( - sync_session_class=RoutingSession - ) + AsyncSessionMaker = async_sessionmaker(sync_session_class=RoutingSession) The :meth:`_orm.Session.get_bind` method is called in a non-asyncio, implicitly non-blocking context in the same manner as ORM event hooks diff --git a/libs/sqlalchemy/ext/asyncio/session.py b/libs/sqlalchemy/ext/asyncio/session.py index c2a47d780..bb276943c 100644 --- a/libs/sqlalchemy/ext/asyncio/session.py +++ b/libs/sqlalchemy/ext/asyncio/session.py @@ -1,5 +1,5 @@ # ext/asyncio/session.py -# Copyright (C) 2020-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2020-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -341,7 +341,7 @@ async def run_sync( *arg: _P.args, **kw: _P.kwargs, ) -> _T: - """Invoke the given synchronous (i.e. not async) callable, + '''Invoke the given synchronous (i.e. not async) callable, passing a synchronous-style :class:`_orm.Session` as the first argument. @@ -351,25 +351,27 @@ async def run_sync( E.g.:: def some_business_method(session: Session, param: str) -> str: - '''A synchronous function that does not require awaiting + """A synchronous function that does not require awaiting :param session: a SQLAlchemy Session, used synchronously :return: an optional return value is supported - ''' + """ session.add(MyObject(param=param)) session.flush() return "success" async def do_something_async(async_engine: AsyncEngine) -> None: - '''an async function that uses awaiting''' + """an async function that uses awaiting""" with AsyncSession(async_engine) as async_session: # run some_business_method() with a sync-style # Session, proxied into an awaitable - return_code = await async_session.run_sync(some_business_method, param="param1") + return_code = await async_session.run_sync( + some_business_method, param="param1" + ) print(return_code) This method maintains the asyncio event loop all the way through @@ -391,7 +393,7 @@ async def do_something_async(async_engine: AsyncEngine) -> None: :meth:`.AsyncConnection.run_sync` :ref:`session_run_sync` - """ # noqa: E501 + ''' # noqa: E501 return await greenlet_spawn( fn, self.sync_session, *arg, _require_await=False, **kw @@ -877,28 +879,28 @@ def get_bind( # construct async engines w/ async drivers engines = { - 'leader':create_async_engine("sqlite+aiosqlite:///leader.db"), - 'other':create_async_engine("sqlite+aiosqlite:///other.db"), - 'follower1':create_async_engine("sqlite+aiosqlite:///follower1.db"), - 'follower2':create_async_engine("sqlite+aiosqlite:///follower2.db"), + "leader": create_async_engine("sqlite+aiosqlite:///leader.db"), + "other": create_async_engine("sqlite+aiosqlite:///other.db"), + "follower1": create_async_engine("sqlite+aiosqlite:///follower1.db"), + "follower2": create_async_engine("sqlite+aiosqlite:///follower2.db"), } + class RoutingSession(Session): def get_bind(self, mapper=None, clause=None, **kw): # within get_bind(), return sync engines if mapper and issubclass(mapper.class_, MyOtherClass): - return engines['other'].sync_engine + return engines["other"].sync_engine elif self._flushing or isinstance(clause, (Update, Delete)): - return engines['leader'].sync_engine + return engines["leader"].sync_engine else: return engines[ - random.choice(['follower1','follower2']) + random.choice(["follower1", "follower2"]) ].sync_engine + # apply to AsyncSession using sync_session_class - AsyncSessionMaker = async_sessionmaker( - sync_session_class=RoutingSession - ) + AsyncSessionMaker = async_sessionmaker(sync_session_class=RoutingSession) The :meth:`_orm.Session.get_bind` method is called in a non-asyncio, implicitly non-blocking context in the same manner as ORM event hooks @@ -954,7 +956,7 @@ def begin(self) -> AsyncSessionTransaction: object is entered:: async with async_session.begin(): - # .. ORM transaction is begun + ... # ORM transaction is begun Note that database IO will not normally occur when the session-level transaction is begun, as database transactions begin on an @@ -1631,16 +1633,22 @@ class async_sessionmaker(Generic[_AS]): from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import async_sessionmaker - async def run_some_sql(async_session: async_sessionmaker[AsyncSession]) -> None: + + async def run_some_sql( + async_session: async_sessionmaker[AsyncSession], + ) -> None: async with async_session() as session: session.add(SomeObject(data="object")) session.add(SomeOtherObject(name="other object")) await session.commit() + async def main() -> None: # an AsyncEngine, which the AsyncSession will use for connection # resources - engine = create_async_engine('postgresql+asyncpg://scott:tiger@localhost/') + engine = create_async_engine( + "postgresql+asyncpg://scott:tiger@localhost/" + ) # create a reusable factory for new AsyncSession instances async_session = async_sessionmaker(engine) @@ -1739,7 +1747,6 @@ async def main(): # commits transaction, closes session - """ session = self() @@ -1772,7 +1779,7 @@ def configure(self, **new_kw: Any) -> None: AsyncSession = async_sessionmaker(some_engine) - AsyncSession.configure(bind=create_async_engine('sqlite+aiosqlite://')) + AsyncSession.configure(bind=create_async_engine("sqlite+aiosqlite://")) """ # noqa E501 self.kw.update(new_kw) diff --git a/libs/sqlalchemy/ext/automap.py b/libs/sqlalchemy/ext/automap.py index 70b0fe62c..817f91d26 100644 --- a/libs/sqlalchemy/ext/automap.py +++ b/libs/sqlalchemy/ext/automap.py @@ -1,5 +1,5 @@ # ext/automap.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -192,8 +192,12 @@ def module_name_for_table(cls, tablename, table): Base = automap_base() Base.prepare(e, modulename_for_table=module_name_for_table) - Base.prepare(e, schema="test_schema", modulename_for_table=module_name_for_table) - Base.prepare(e, schema="test_schema_2", modulename_for_table=module_name_for_table) + Base.prepare( + e, schema="test_schema", modulename_for_table=module_name_for_table + ) + Base.prepare( + e, schema="test_schema_2", modulename_for_table=module_name_for_table + ) The same named-classes are organized into a hierarchical collection available at :attr:`.AutomapBase.by_module`. This collection is traversed using the @@ -550,7 +554,9 @@ class Engineer(Employee): id = Column(Integer, ForeignKey("employee.id"), primary_key=True) favorite_employee_id = Column(Integer, ForeignKey("employee.id")) - favorite_employee = relationship(Employee, foreign_keys=favorite_employee_id) + favorite_employee = relationship( + Employee, foreign_keys=favorite_employee_id + ) __mapper_args__ = { "polymorphic_identity": "engineer", @@ -587,12 +593,16 @@ class Engineer(Employee): We can resolve this conflict by using an underscore as follows:: - def name_for_scalar_relationship(base, local_cls, referred_cls, constraint): + def name_for_scalar_relationship( + base, local_cls, referred_cls, constraint + ): name = referred_cls.__name__.lower() local_table = local_cls.__table__ if name in local_table.columns: newname = name + "_" - warnings.warn("Already detected name %s present. using %s" % (name, newname)) + warnings.warn( + "Already detected name %s present. using %s" % (name, newname) + ) return newname return name diff --git a/libs/sqlalchemy/ext/baked.py b/libs/sqlalchemy/ext/baked.py index 60f7ae664..cd3e08793 100644 --- a/libs/sqlalchemy/ext/baked.py +++ b/libs/sqlalchemy/ext/baked.py @@ -1,5 +1,5 @@ # ext/baked.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -258,23 +258,19 @@ def to_query(self, query_or_session): is passed to the lambda:: sub_bq = self.bakery(lambda s: s.query(User.name)) - sub_bq += lambda q: q.filter( - User.id == Address.user_id).correlate(Address) + sub_bq += lambda q: q.filter(User.id == Address.user_id).correlate(Address) main_bq = self.bakery(lambda s: s.query(Address)) - main_bq += lambda q: q.filter( - sub_bq.to_query(q).exists()) + main_bq += lambda q: q.filter(sub_bq.to_query(q).exists()) In the case where the subquery is used in the first callable against a :class:`.Session`, the :class:`.Session` is also accepted:: sub_bq = self.bakery(lambda s: s.query(User.name)) - sub_bq += lambda q: q.filter( - User.id == Address.user_id).correlate(Address) + sub_bq += lambda q: q.filter(User.id == Address.user_id).correlate(Address) main_bq = self.bakery( - lambda s: s.query( - Address.id, sub_bq.to_query(q).scalar_subquery()) + lambda s: s.query(Address.id, sub_bq.to_query(q).scalar_subquery()) ) :param query_or_session: a :class:`_query.Query` object or a class @@ -285,7 +281,7 @@ def to_query(self, query_or_session): .. versionadded:: 1.3 - """ + """ # noqa: E501 if isinstance(query_or_session, Session): session = query_or_session diff --git a/libs/sqlalchemy/ext/compiler.py b/libs/sqlalchemy/ext/compiler.py index b870adce9..cc64477ed 100644 --- a/libs/sqlalchemy/ext/compiler.py +++ b/libs/sqlalchemy/ext/compiler.py @@ -1,5 +1,5 @@ # ext/compiler.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -17,9 +17,11 @@ from sqlalchemy.ext.compiler import compiles from sqlalchemy.sql.expression import ColumnClause + class MyColumn(ColumnClause): inherit_cache = True + @compiles(MyColumn) def compile_mycolumn(element, compiler, **kw): return "[%s]" % element.name @@ -31,10 +33,12 @@ def compile_mycolumn(element, compiler, **kw): from sqlalchemy import select - s = select(MyColumn('x'), MyColumn('y')) + s = select(MyColumn("x"), MyColumn("y")) print(str(s)) -Produces:: +Produces: + +.. sourcecode:: sql SELECT [x], [y] @@ -46,6 +50,7 @@ def compile_mycolumn(element, compiler, **kw): from sqlalchemy.schema import DDLElement + class AlterColumn(DDLElement): inherit_cache = False @@ -53,14 +58,18 @@ def __init__(self, column, cmd): self.column = column self.cmd = cmd + @compiles(AlterColumn) def visit_alter_column(element, compiler, **kw): return "ALTER COLUMN %s ..." % element.column.name - @compiles(AlterColumn, 'postgresql') + + @compiles(AlterColumn, "postgresql") def visit_alter_column(element, compiler, **kw): - return "ALTER TABLE %s ALTER COLUMN %s ..." % (element.table.name, - element.column.name) + return "ALTER TABLE %s ALTER COLUMN %s ..." % ( + element.table.name, + element.column.name, + ) The second ``visit_alter_table`` will be invoked when any ``postgresql`` dialect is used. @@ -80,6 +89,7 @@ def visit_alter_column(element, compiler, **kw): from sqlalchemy.sql.expression import Executable, ClauseElement + class InsertFromSelect(Executable, ClauseElement): inherit_cache = False @@ -87,20 +97,27 @@ def __init__(self, table, select): self.table = table self.select = select + @compiles(InsertFromSelect) def visit_insert_from_select(element, compiler, **kw): return "INSERT INTO %s (%s)" % ( compiler.process(element.table, asfrom=True, **kw), - compiler.process(element.select, **kw) + compiler.process(element.select, **kw), ) - insert = InsertFromSelect(t1, select(t1).where(t1.c.x>5)) + + insert = InsertFromSelect(t1, select(t1).where(t1.c.x > 5)) print(insert) -Produces:: +Produces (formatted for readability): + +.. sourcecode:: sql - "INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z - FROM mytable WHERE mytable.x > :x_1)" + INSERT INTO mytable ( + SELECT mytable.x, mytable.y, mytable.z + FROM mytable + WHERE mytable.x > :x_1 + ) .. note:: @@ -120,11 +137,10 @@ def visit_insert_from_select(element, compiler, **kw): @compiles(MyConstraint) def compile_my_constraint(constraint, ddlcompiler, **kw): - kw['literal_binds'] = True + kw["literal_binds"] = True return "CONSTRAINT %s CHECK (%s)" % ( constraint.name, - ddlcompiler.sql_compiler.process( - constraint.expression, **kw) + ddlcompiler.sql_compiler.process(constraint.expression, **kw), ) Above, we add an additional flag to the process step as called by @@ -152,6 +168,7 @@ def compile_my_constraint(constraint, ddlcompiler, **kw): from sqlalchemy.sql.expression import Insert + @compiles(Insert) def prefix_inserts(insert, compiler, **kw): return compiler.visit_insert(insert.prefix_with("some prefix"), **kw) @@ -167,17 +184,16 @@ def prefix_inserts(insert, compiler, **kw): ``compiler`` works for types, too, such as below where we implement the MS-SQL specific 'max' keyword for ``String``/``VARCHAR``:: - @compiles(String, 'mssql') - @compiles(VARCHAR, 'mssql') + @compiles(String, "mssql") + @compiles(VARCHAR, "mssql") def compile_varchar(element, compiler, **kw): - if element.length == 'max': + if element.length == "max": return "VARCHAR('max')" else: return compiler.visit_VARCHAR(element, **kw) - foo = Table('foo', metadata, - Column('data', VARCHAR('max')) - ) + + foo = Table("foo", metadata, Column("data", VARCHAR("max"))) Subclassing Guidelines ====================== @@ -215,18 +231,23 @@ class timestamp(ColumnElement): from sqlalchemy.sql.expression import FunctionElement + class coalesce(FunctionElement): - name = 'coalesce' + name = "coalesce" inherit_cache = True + @compiles(coalesce) def compile(element, compiler, **kw): return "coalesce(%s)" % compiler.process(element.clauses, **kw) - @compiles(coalesce, 'oracle') + + @compiles(coalesce, "oracle") def compile(element, compiler, **kw): if len(element.clauses) > 2: - raise TypeError("coalesce only supports two arguments on Oracle") + raise TypeError( + "coalesce only supports two arguments on " "Oracle Database" + ) return "nvl(%s)" % compiler.process(element.clauses, **kw) * :class:`.ExecutableDDLElement` - The root of all DDL expressions, @@ -280,6 +301,7 @@ def compile(element, compiler, **kw): class MyColumn(ColumnClause): inherit_cache = True + @compiles(MyColumn) def compile_mycolumn(element, compiler, **kw): return "[%s]" % element.name @@ -318,11 +340,12 @@ def __init__(self, table, select): self.table = table self.select = select + @compiles(InsertFromSelect) def visit_insert_from_select(element, compiler, **kw): return "INSERT INTO %s (%s)" % ( compiler.process(element.table, asfrom=True, **kw), - compiler.process(element.select, **kw) + compiler.process(element.select, **kw), ) While it is also possible that the above ``InsertFromSelect`` could be made to @@ -358,28 +381,32 @@ def visit_insert_from_select(element, compiler, **kw): from sqlalchemy.ext.compiler import compiles from sqlalchemy.types import DateTime + class utcnow(expression.FunctionElement): type = DateTime() inherit_cache = True - @compiles(utcnow, 'postgresql') + + @compiles(utcnow, "postgresql") def pg_utcnow(element, compiler, **kw): return "TIMEZONE('utc', CURRENT_TIMESTAMP)" - @compiles(utcnow, 'mssql') + + @compiles(utcnow, "mssql") def ms_utcnow(element, compiler, **kw): return "GETUTCDATE()" Example usage:: - from sqlalchemy import ( - Table, Column, Integer, String, DateTime, MetaData - ) + from sqlalchemy import Table, Column, Integer, String, DateTime, MetaData + metadata = MetaData() - event = Table("event", metadata, + event = Table( + "event", + metadata, Column("id", Integer, primary_key=True), Column("description", String(50), nullable=False), - Column("timestamp", DateTime, server_default=utcnow()) + Column("timestamp", DateTime, server_default=utcnow()), ) "GREATEST" function @@ -394,30 +421,30 @@ def ms_utcnow(element, compiler, **kw): from sqlalchemy.ext.compiler import compiles from sqlalchemy.types import Numeric + class greatest(expression.FunctionElement): type = Numeric() - name = 'greatest' + name = "greatest" inherit_cache = True + @compiles(greatest) def default_greatest(element, compiler, **kw): return compiler.visit_function(element) - @compiles(greatest, 'sqlite') - @compiles(greatest, 'mssql') - @compiles(greatest, 'oracle') + + @compiles(greatest, "sqlite") + @compiles(greatest, "mssql") + @compiles(greatest, "oracle") def case_greatest(element, compiler, **kw): arg1, arg2 = list(element.clauses) return compiler.process(case((arg1 > arg2, arg1), else_=arg2), **kw) Example usage:: - Session.query(Account).\ - filter( - greatest( - Account.checking_balance, - Account.savings_balance) > 10000 - ) + Session.query(Account).filter( + greatest(Account.checking_balance, Account.savings_balance) > 10000 + ) "false" expression ------------------ @@ -428,16 +455,19 @@ def case_greatest(element, compiler, **kw): from sqlalchemy.sql import expression from sqlalchemy.ext.compiler import compiles + class sql_false(expression.ColumnElement): inherit_cache = True + @compiles(sql_false) def default_false(element, compiler, **kw): return "false" - @compiles(sql_false, 'mssql') - @compiles(sql_false, 'mysql') - @compiles(sql_false, 'oracle') + + @compiles(sql_false, "mssql") + @compiles(sql_false, "mysql") + @compiles(sql_false, "oracle") def int_false(element, compiler, **kw): return "0" @@ -447,7 +477,7 @@ def int_false(element, compiler, **kw): exp = union_all( select(users.c.name, sql_false().label("enrolled")), - select(customers.c.name, customers.c.enrolled) + select(customers.c.name, customers.c.enrolled), ) """ diff --git a/libs/sqlalchemy/ext/declarative/__init__.py b/libs/sqlalchemy/ext/declarative/__init__.py index 37da40377..0383f9d34 100644 --- a/libs/sqlalchemy/ext/declarative/__init__.py +++ b/libs/sqlalchemy/ext/declarative/__init__.py @@ -1,5 +1,5 @@ # ext/declarative/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/declarative/extensions.py b/libs/sqlalchemy/ext/declarative/extensions.py index c0f7e3405..3dc6bf698 100644 --- a/libs/sqlalchemy/ext/declarative/extensions.py +++ b/libs/sqlalchemy/ext/declarative/extensions.py @@ -1,5 +1,5 @@ # ext/declarative/extensions.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -50,23 +50,26 @@ class ConcreteBase: from sqlalchemy.ext.declarative import ConcreteBase + class Employee(ConcreteBase, Base): - __tablename__ = 'employee' + __tablename__ = "employee" employee_id = Column(Integer, primary_key=True) name = Column(String(50)) __mapper_args__ = { - 'polymorphic_identity':'employee', - 'concrete':True} + "polymorphic_identity": "employee", + "concrete": True, + } + class Manager(Employee): - __tablename__ = 'manager' + __tablename__ = "manager" employee_id = Column(Integer, primary_key=True) name = Column(String(50)) manager_data = Column(String(40)) __mapper_args__ = { - 'polymorphic_identity':'manager', - 'concrete':True} - + "polymorphic_identity": "manager", + "concrete": True, + } The name of the discriminator column used by :func:`.polymorphic_union` defaults to the name ``type``. To suit the use case of a mapping where an @@ -75,7 +78,7 @@ class Manager(Employee): ``_concrete_discriminator_name`` attribute:: class Employee(ConcreteBase, Base): - _concrete_discriminator_name = '_concrete_discriminator' + _concrete_discriminator_name = "_concrete_discriminator" .. versionadded:: 1.3.19 Added the ``_concrete_discriminator_name`` attribute to :class:`_declarative.ConcreteBase` so that the @@ -168,23 +171,27 @@ class AbstractConcreteBase(ConcreteBase): from sqlalchemy.orm import DeclarativeBase from sqlalchemy.ext.declarative import AbstractConcreteBase + class Base(DeclarativeBase): pass + class Employee(AbstractConcreteBase, Base): pass + class Manager(Employee): - __tablename__ = 'manager' + __tablename__ = "manager" employee_id = Column(Integer, primary_key=True) name = Column(String(50)) manager_data = Column(String(40)) __mapper_args__ = { - 'polymorphic_identity':'manager', - 'concrete':True + "polymorphic_identity": "manager", + "concrete": True, } + Base.registry.configure() The abstract base class is handled by declarative in a special way; @@ -200,10 +207,12 @@ class Manager(Employee): from sqlalchemy.ext.declarative import AbstractConcreteBase + class Company(Base): - __tablename__ = 'company' + __tablename__ = "company" id = Column(Integer, primary_key=True) + class Employee(AbstractConcreteBase, Base): strict_attrs = True @@ -211,31 +220,31 @@ class Employee(AbstractConcreteBase, Base): @declared_attr def company_id(cls): - return Column(ForeignKey('company.id')) + return Column(ForeignKey("company.id")) @declared_attr def company(cls): return relationship("Company") + class Manager(Employee): - __tablename__ = 'manager' + __tablename__ = "manager" name = Column(String(50)) manager_data = Column(String(40)) __mapper_args__ = { - 'polymorphic_identity':'manager', - 'concrete':True + "polymorphic_identity": "manager", + "concrete": True, } + Base.registry.configure() When we make use of our mappings however, both ``Manager`` and ``Employee`` will have an independently usable ``.company`` attribute:: - session.execute( - select(Employee).filter(Employee.company.has(id=5)) - ) + session.execute(select(Employee).filter(Employee.company.has(id=5))) :param strict_attrs: when specified on the base class, "strict" attribute mode is enabled which attempts to limit ORM mapped attributes on the @@ -366,10 +375,12 @@ class DeferredReflection: from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import DeferredReflection + Base = declarative_base() + class MyClass(DeferredReflection, Base): - __tablename__ = 'mytable' + __tablename__ = "mytable" Above, ``MyClass`` is not yet mapped. After a series of classes have been defined in the above fashion, all tables @@ -391,17 +402,22 @@ class MyClass(DeferredReflection, Base): class ReflectedOne(DeferredReflection, Base): __abstract__ = True + class ReflectedTwo(DeferredReflection, Base): __abstract__ = True + class MyClass(ReflectedOne): - __tablename__ = 'mytable' + __tablename__ = "mytable" + class MyOtherClass(ReflectedOne): - __tablename__ = 'myothertable' + __tablename__ = "myothertable" + class YetAnotherClass(ReflectedTwo): - __tablename__ = 'yetanothertable' + __tablename__ = "yetanothertable" + # ... etc. diff --git a/libs/sqlalchemy/ext/horizontal_shard.py b/libs/sqlalchemy/ext/horizontal_shard.py index d8ee819f2..3ea3304eb 100644 --- a/libs/sqlalchemy/ext/horizontal_shard.py +++ b/libs/sqlalchemy/ext/horizontal_shard.py @@ -1,5 +1,5 @@ # ext/horizontal_shard.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -125,12 +125,9 @@ def set_shard(self, shard_id: ShardIdentifier) -> Self: The shard_id can be passed for a 2.0 style execution to the bind_arguments dictionary of :meth:`.Session.execute`:: - results = session.execute( - stmt, - bind_arguments={"shard_id": "my_shard"} - ) + results = session.execute(stmt, bind_arguments={"shard_id": "my_shard"}) - """ + """ # noqa: E501 return self.execution_options(_sa_shard_id=shard_id) @@ -321,7 +318,7 @@ def _choose_shard_and_assign( state.identity_token = shard_id return shard_id - def connection_callable( # type: ignore [override] + def connection_callable( self, mapper: Optional[Mapper[_T]] = None, instance: Optional[Any] = None, @@ -382,9 +379,9 @@ class set_shard_id(ORMOption): the :meth:`_sql.Executable.options` method of any executable statement:: stmt = ( - select(MyObject). - where(MyObject.name == 'some name'). - options(set_shard_id("shard1")) + select(MyObject) + .where(MyObject.name == "some name") + .options(set_shard_id("shard1")) ) Above, the statement when invoked will limit to the "shard1" shard diff --git a/libs/sqlalchemy/ext/hybrid.py b/libs/sqlalchemy/ext/hybrid.py index ee8d6a781..c1c46e7c5 100644 --- a/libs/sqlalchemy/ext/hybrid.py +++ b/libs/sqlalchemy/ext/hybrid.py @@ -1,5 +1,5 @@ # ext/hybrid.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -34,8 +34,9 @@ class level and at the instance level. class Base(DeclarativeBase): pass + class Interval(Base): - __tablename__ = 'interval' + __tablename__ = "interval" id: Mapped[int] = mapped_column(primary_key=True) start: Mapped[int] @@ -57,7 +58,6 @@ def contains(self, point: int) -> bool: def intersects(self, other: Interval) -> bool: return self.contains(other.start) | self.contains(other.end) - Above, the ``length`` property returns the difference between the ``end`` and ``start`` attributes. With an instance of ``Interval``, this subtraction occurs in Python, using normal Python descriptor @@ -150,6 +150,7 @@ def intersects(self, other: Interval) -> bool: from sqlalchemy import func from sqlalchemy import type_coerce + class Interval(Base): # ... @@ -214,6 +215,7 @@ def _radius_expression(cls) -> ColumnElement[float]: # correct use, however is not accepted by pep-484 tooling + class Interval(Base): # ... @@ -256,6 +258,7 @@ def radius(cls): # correct use which is also accepted by pep-484 tooling + class Interval(Base): # ... @@ -330,6 +333,7 @@ def _length_setter(self, value: int) -> None: ``Interval.start``, this could be substituted directly:: from sqlalchemy import update + stmt = update(Interval).values({Interval.start_point: 10}) However, when using a composite hybrid like ``Interval.length``, this @@ -340,6 +344,7 @@ def _length_setter(self, value: int) -> None: from typing import List, Tuple, Any + class Interval(Base): # ... @@ -352,10 +357,10 @@ def _length_setter(self, value: int) -> None: self.end = self.start + value @length.inplace.update_expression - def _length_update_expression(cls, value: Any) -> List[Tuple[Any, Any]]: - return [ - (cls.end, cls.start + value) - ] + def _length_update_expression( + cls, value: Any + ) -> List[Tuple[Any, Any]]: + return [(cls.end, cls.start + value)] Above, if we use ``Interval.length`` in an UPDATE expression, we get a hybrid SET expression: @@ -412,15 +417,16 @@ class Base(DeclarativeBase): class SavingsAccount(Base): - __tablename__ = 'account' + __tablename__ = "account" id: Mapped[int] = mapped_column(primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey('user.id')) + user_id: Mapped[int] = mapped_column(ForeignKey("user.id")) balance: Mapped[Decimal] = mapped_column(Numeric(15, 5)) owner: Mapped[User] = relationship(back_populates="accounts") + class User(Base): - __tablename__ = 'user' + __tablename__ = "user" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(100)) @@ -448,7 +454,10 @@ def _balance_setter(self, value: Optional[Decimal]) -> None: @balance.inplace.expression @classmethod def _balance_expression(cls) -> SQLColumnExpression[Optional[Decimal]]: - return cast("SQLColumnExpression[Optional[Decimal]]", SavingsAccount.balance) + return cast( + "SQLColumnExpression[Optional[Decimal]]", + SavingsAccount.balance, + ) The above hybrid property ``balance`` works with the first ``SavingsAccount`` entry in the list of accounts for this user. The @@ -471,8 +480,11 @@ def _balance_expression(cls) -> SQLColumnExpression[Optional[Decimal]]: .. sourcecode:: pycon+sql >>> from sqlalchemy import select - >>> print(select(User, User.balance). - ... join(User.accounts).filter(User.balance > 5000)) + >>> print( + ... select(User, User.balance) + ... .join(User.accounts) + ... .filter(User.balance > 5000) + ... ) {printsql}SELECT "user".id AS user_id, "user".name AS user_name, account.balance AS account_balance FROM "user" JOIN account ON "user".id = account.user_id @@ -487,8 +499,11 @@ def _balance_expression(cls) -> SQLColumnExpression[Optional[Decimal]]: >>> from sqlalchemy import select >>> from sqlalchemy import or_ - >>> print (select(User, User.balance).outerjoin(User.accounts). - ... filter(or_(User.balance < 5000, User.balance == None))) + >>> print( + ... select(User, User.balance) + ... .outerjoin(User.accounts) + ... .filter(or_(User.balance < 5000, User.balance == None)) + ... ) {printsql}SELECT "user".id AS user_id, "user".name AS user_name, account.balance AS account_balance FROM "user" LEFT OUTER JOIN account ON "user".id = account.user_id @@ -528,15 +543,16 @@ class Base(DeclarativeBase): class SavingsAccount(Base): - __tablename__ = 'account' + __tablename__ = "account" id: Mapped[int] = mapped_column(primary_key=True) - user_id: Mapped[int] = mapped_column(ForeignKey('user.id')) + user_id: Mapped[int] = mapped_column(ForeignKey("user.id")) balance: Mapped[Decimal] = mapped_column(Numeric(15, 5)) owner: Mapped[User] = relationship(back_populates="accounts") + class User(Base): - __tablename__ = 'user' + __tablename__ = "user" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(100)) @@ -546,7 +562,9 @@ class User(Base): @hybrid_property def balance(self) -> Decimal: - return sum((acc.balance for acc in self.accounts), start=Decimal("0")) + return sum( + (acc.balance for acc in self.accounts), start=Decimal("0") + ) @balance.inplace.expression @classmethod @@ -557,7 +575,6 @@ def _balance_expression(cls) -> SQLColumnExpression[Decimal]: .label("total_balance") ) - The above recipe will give us the ``balance`` column which renders a correlated SELECT: @@ -604,6 +621,7 @@ def _balance_expression(cls) -> SQLColumnExpression[Decimal]: from sqlalchemy.orm import Mapped from sqlalchemy.orm import mapped_column + class Base(DeclarativeBase): pass @@ -612,8 +630,9 @@ class CaseInsensitiveComparator(Comparator[str]): def __eq__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 return func.lower(self.__clause_element__()) == func.lower(other) + class SearchWord(Base): - __tablename__ = 'searchword' + __tablename__ = "searchword" id: Mapped[int] = mapped_column(primary_key=True) word: Mapped[str] @@ -675,6 +694,7 @@ def name(self) -> str: def _name_setter(self, value: str) -> None: self.first_name = value + class FirstNameLastName(FirstNameOnly): # ... @@ -684,11 +704,11 @@ class FirstNameLastName(FirstNameOnly): # of FirstNameOnly.name that is local to FirstNameLastName @FirstNameOnly.name.getter def name(self) -> str: - return self.first_name + ' ' + self.last_name + return self.first_name + " " + self.last_name @name.inplace.setter def _name_setter(self, value: str) -> None: - self.first_name, self.last_name = value.split(' ', 1) + self.first_name, self.last_name = value.split(" ", 1) Above, the ``FirstNameLastName`` class refers to the hybrid from ``FirstNameOnly.name`` to repurpose its getter and setter for the subclass. @@ -709,8 +729,7 @@ class FirstNameLastName(FirstNameOnly): @FirstNameOnly.name.overrides.expression @classmethod def name(cls): - return func.concat(cls.first_name, ' ', cls.last_name) - + return func.concat(cls.first_name, " ", cls.last_name) Hybrid Value Objects -------------------- @@ -751,7 +770,7 @@ def __clause_element__(self): def __str__(self): return self.word - key = 'word' + key = "word" "Label to apply to Query tuple results" Above, the ``CaseInsensitiveWord`` object represents ``self.word``, which may @@ -762,7 +781,7 @@ def __str__(self): ``CaseInsensitiveWord`` object unconditionally from a single hybrid call:: class SearchWord(Base): - __tablename__ = 'searchword' + __tablename__ = "searchword" id: Mapped[int] = mapped_column(primary_key=True) word: Mapped[str] @@ -983,6 +1002,7 @@ def __init__( from sqlalchemy.ext.hybrid import hybrid_method + class SomeClass: @hybrid_method def value(self, x, y): @@ -1080,6 +1100,7 @@ def __init__( from sqlalchemy.ext.hybrid import hybrid_property + class SomeClass: @hybrid_property def value(self): @@ -1158,6 +1179,7 @@ class SuperClass: def foobar(self): return self._foobar + class SubClass(SuperClass): # ... @@ -1367,10 +1389,7 @@ def fullname(self): @fullname.update_expression def fullname(cls, value): fname, lname = value.split(" ", 1) - return [ - (cls.first_name, fname), - (cls.last_name, lname) - ] + return [(cls.first_name, fname), (cls.last_name, lname)] .. versionadded:: 1.2 diff --git a/libs/sqlalchemy/ext/indexable.py b/libs/sqlalchemy/ext/indexable.py index 3c419308a..886069ce0 100644 --- a/libs/sqlalchemy/ext/indexable.py +++ b/libs/sqlalchemy/ext/indexable.py @@ -1,5 +1,5 @@ # ext/indexable.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -36,19 +36,19 @@ Base = declarative_base() + class Person(Base): - __tablename__ = 'person' + __tablename__ = "person" id = Column(Integer, primary_key=True) data = Column(JSON) - name = index_property('data', 'name') - + name = index_property("data", "name") Above, the ``name`` attribute now behaves like a mapped column. We can compose a new ``Person`` and set the value of ``name``:: - >>> person = Person(name='Alchemist') + >>> person = Person(name="Alchemist") The value is now accessible:: @@ -59,11 +59,11 @@ class Person(Base): and the field was set:: >>> person.data - {"name": "Alchemist'} + {'name': 'Alchemist'} The field is mutable in place:: - >>> person.name = 'Renamed' + >>> person.name = "Renamed" >>> person.name 'Renamed' >>> person.data @@ -87,18 +87,17 @@ class Person(Base): >>> person = Person() >>> person.name - ... AttributeError: 'name' Unless you set a default value:: >>> class Person(Base): - >>> __tablename__ = 'person' - >>> - >>> id = Column(Integer, primary_key=True) - >>> data = Column(JSON) - >>> - >>> name = index_property('data', 'name', default=None) # See default + ... __tablename__ = "person" + ... + ... id = Column(Integer, primary_key=True) + ... data = Column(JSON) + ... + ... name = index_property("data", "name", default=None) # See default >>> person = Person() >>> print(person.name) @@ -111,11 +110,11 @@ class Person(Base): >>> from sqlalchemy.orm import Session >>> session = Session() - >>> query = session.query(Person).filter(Person.name == 'Alchemist') + >>> query = session.query(Person).filter(Person.name == "Alchemist") The above query is equivalent to:: - >>> query = session.query(Person).filter(Person.data['name'] == 'Alchemist') + >>> query = session.query(Person).filter(Person.data["name"] == "Alchemist") Multiple :class:`.index_property` objects can be chained to produce multiple levels of indexing:: @@ -126,22 +125,25 @@ class Person(Base): Base = declarative_base() + class Person(Base): - __tablename__ = 'person' + __tablename__ = "person" id = Column(Integer, primary_key=True) data = Column(JSON) - birthday = index_property('data', 'birthday') - year = index_property('birthday', 'year') - month = index_property('birthday', 'month') - day = index_property('birthday', 'day') + birthday = index_property("data", "birthday") + year = index_property("birthday", "year") + month = index_property("birthday", "month") + day = index_property("birthday", "day") Above, a query such as:: - q = session.query(Person).filter(Person.year == '1980') + q = session.query(Person).filter(Person.year == "1980") -On a PostgreSQL backend, the above query will render as:: +On a PostgreSQL backend, the above query will render as: + +.. sourcecode:: sql SELECT person.id, person.data FROM person @@ -198,13 +200,14 @@ def expr(self, model): Base = declarative_base() + class Person(Base): - __tablename__ = 'person' + __tablename__ = "person" id = Column(Integer, primary_key=True) data = Column(JSON) - age = pg_json_property('data', 'age', Integer) + age = pg_json_property("data", "age", Integer) The ``age`` attribute at the instance level works as before; however when rendering SQL, PostgreSQL's ``->>`` operator will be used @@ -212,7 +215,8 @@ class Person(Base): >>> query = session.query(Person).filter(Person.age < 20) -The above query will render:: +The above query will render: +.. sourcecode:: sql SELECT person.id, person.data FROM person diff --git a/libs/sqlalchemy/ext/instrumentation.py b/libs/sqlalchemy/ext/instrumentation.py index 5f3c71282..8bb01985e 100644 --- a/libs/sqlalchemy/ext/instrumentation.py +++ b/libs/sqlalchemy/ext/instrumentation.py @@ -1,5 +1,5 @@ # ext/instrumentation.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/mutable.py b/libs/sqlalchemy/ext/mutable.py index 7da5075a1..ed618c381 100644 --- a/libs/sqlalchemy/ext/mutable.py +++ b/libs/sqlalchemy/ext/mutable.py @@ -1,5 +1,5 @@ # ext/mutable.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -21,6 +21,7 @@ from sqlalchemy.types import TypeDecorator, VARCHAR import json + class JSONEncodedDict(TypeDecorator): "Represents an immutable structure as a json-encoded string." @@ -48,6 +49,7 @@ def process_result_value(self, value, dialect): from sqlalchemy.ext.mutable import Mutable + class MutableDict(Mutable, dict): @classmethod def coerce(cls, key, value): @@ -101,9 +103,11 @@ class and associates a listener that will detect all future mappings from sqlalchemy import Table, Column, Integer - my_data = Table('my_data', metadata, - Column('id', Integer, primary_key=True), - Column('data', MutableDict.as_mutable(JSONEncodedDict)) + my_data = Table( + "my_data", + metadata, + Column("id", Integer, primary_key=True), + Column("data", MutableDict.as_mutable(JSONEncodedDict)), ) Above, :meth:`~.Mutable.as_mutable` returns an instance of ``JSONEncodedDict`` @@ -115,13 +119,17 @@ class and associates a listener that will detect all future mappings from sqlalchemy.orm import Mapped from sqlalchemy.orm import mapped_column + class Base(DeclarativeBase): pass + class MyDataClass(Base): - __tablename__ = 'my_data' + __tablename__ = "my_data" id: Mapped[int] = mapped_column(primary_key=True) - data: Mapped[dict[str, str]] = mapped_column(MutableDict.as_mutable(JSONEncodedDict)) + data: Mapped[dict[str, str]] = mapped_column( + MutableDict.as_mutable(JSONEncodedDict) + ) The ``MyDataClass.data`` member will now be notified of in place changes to its value. @@ -132,11 +140,11 @@ class MyDataClass(Base): >>> from sqlalchemy.orm import Session >>> sess = Session(some_engine) - >>> m1 = MyDataClass(data={'value1':'foo'}) + >>> m1 = MyDataClass(data={"value1": "foo"}) >>> sess.add(m1) >>> sess.commit() - >>> m1.data['value1'] = 'bar' + >>> m1.data["value1"] = "bar" >>> assert m1 in sess.dirty True @@ -153,15 +161,16 @@ class MyDataClass(Base): MutableDict.associate_with(JSONEncodedDict) + class Base(DeclarativeBase): pass + class MyDataClass(Base): - __tablename__ = 'my_data' + __tablename__ = "my_data" id: Mapped[int] = mapped_column(primary_key=True) data: Mapped[dict[str, str]] = mapped_column(JSONEncodedDict) - Supporting Pickling -------------------- @@ -180,7 +189,7 @@ class MyDataClass(Base): class MyMutableType(Mutable): def __getstate__(self): d = self.__dict__.copy() - d.pop('_parents', None) + d.pop("_parents", None) return d With our dictionary example, we need to return the contents of the dict itself @@ -213,13 +222,18 @@ def __setstate__(self, state): from sqlalchemy.orm import mapped_column from sqlalchemy import event + class Base(DeclarativeBase): pass + class MyDataClass(Base): - __tablename__ = 'my_data' + __tablename__ = "my_data" id: Mapped[int] = mapped_column(primary_key=True) - data: Mapped[dict[str, str]] = mapped_column(MutableDict.as_mutable(JSONEncodedDict)) + data: Mapped[dict[str, str]] = mapped_column( + MutableDict.as_mutable(JSONEncodedDict) + ) + @event.listens_for(MyDataClass.data, "modified") def modified_json(instance, initiator): @@ -247,6 +261,7 @@ class introduced in :ref:`mapper_composite` to include import dataclasses from sqlalchemy.ext.mutable import MutableComposite + @dataclasses.dataclass class Point(MutableComposite): x: int @@ -261,7 +276,6 @@ def __setattr__(self, key, value): # alert all parents to the change self.changed() - The :class:`.MutableComposite` class makes use of class mapping events to automatically establish listeners for any usage of :func:`_orm.composite` that specifies our ``Point`` type. Below, when ``Point`` is mapped to the ``Vertex`` @@ -271,6 +285,7 @@ def __setattr__(self, key, value): from sqlalchemy.orm import DeclarativeBase, Mapped from sqlalchemy.orm import composite, mapped_column + class Base(DeclarativeBase): pass @@ -280,8 +295,12 @@ class Vertex(Base): id: Mapped[int] = mapped_column(primary_key=True) - start: Mapped[Point] = composite(mapped_column("x1"), mapped_column("y1")) - end: Mapped[Point] = composite(mapped_column("x2"), mapped_column("y2")) + start: Mapped[Point] = composite( + mapped_column("x1"), mapped_column("y1") + ) + end: Mapped[Point] = composite( + mapped_column("x2"), mapped_column("y2") + ) def __repr__(self): return f"Vertex(start={self.start}, end={self.end})" @@ -391,6 +410,7 @@ def __setstate__(self, state): from ..orm.decl_api import DeclarativeAttributeIntercept from ..orm.state import InstanceState from ..orm.unitofwork import UOWTransaction +from ..sql._typing import _TypeEngineArgument from ..sql.base import SchemaEventTarget from ..sql.schema import Column from ..sql.type_api import TypeEngine @@ -638,7 +658,7 @@ def listen_for_type(mapper: Mapper[_O], class_: type) -> None: event.listen(Mapper, "mapper_configured", listen_for_type) @classmethod - def as_mutable(cls, sqltype: TypeEngine[_T]) -> TypeEngine[_T]: + def as_mutable(cls, sqltype: _TypeEngineArgument[_T]) -> TypeEngine[_T]: """Associate a SQL type with this mutable Python type. This establishes listeners that will detect ORM mappings against @@ -647,9 +667,11 @@ def as_mutable(cls, sqltype: TypeEngine[_T]) -> TypeEngine[_T]: The type is returned, unconditionally as an instance, so that :meth:`.as_mutable` can be used inline:: - Table('mytable', metadata, - Column('id', Integer, primary_key=True), - Column('data', MyMutableType.as_mutable(PickleType)) + Table( + "mytable", + metadata, + Column("id", Integer, primary_key=True), + Column("data", MyMutableType.as_mutable(PickleType)), ) Note that the returned type is always an instance, even if a class diff --git a/libs/sqlalchemy/ext/mypy/__init__.py b/libs/sqlalchemy/ext/mypy/__init__.py index de2c02ee9..b5827cb8d 100644 --- a/libs/sqlalchemy/ext/mypy/__init__.py +++ b/libs/sqlalchemy/ext/mypy/__init__.py @@ -1,5 +1,5 @@ # ext/mypy/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/mypy/apply.py b/libs/sqlalchemy/ext/mypy/apply.py index eb9019453..02908cc14 100644 --- a/libs/sqlalchemy/ext/mypy/apply.py +++ b/libs/sqlalchemy/ext/mypy/apply.py @@ -1,5 +1,5 @@ # ext/mypy/apply.py -# Copyright (C) 2021-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2021-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -199,11 +199,15 @@ class User(Base): To one that describes the final Python behavior to Mypy:: + ... format: off + class User(Base): # ... attrname : Mapped[Optional[int]] = <meaningless temp node> + ... format: on + """ left_node = lvalue.node assert isinstance(left_node, Var) diff --git a/libs/sqlalchemy/ext/mypy/decl_class.py b/libs/sqlalchemy/ext/mypy/decl_class.py index 3d578b346..2ce7ad56c 100644 --- a/libs/sqlalchemy/ext/mypy/decl_class.py +++ b/libs/sqlalchemy/ext/mypy/decl_class.py @@ -1,5 +1,5 @@ # ext/mypy/decl_class.py -# Copyright (C) 2021-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2021-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/mypy/infer.py b/libs/sqlalchemy/ext/mypy/infer.py index 09b3c443a..26a83cca8 100644 --- a/libs/sqlalchemy/ext/mypy/infer.py +++ b/libs/sqlalchemy/ext/mypy/infer.py @@ -1,5 +1,5 @@ # ext/mypy/infer.py -# Copyright (C) 2021-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2021-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -385,9 +385,9 @@ class MyClass: class MyClass: # ... - a : Mapped[int] + a: Mapped[int] - b : Mapped[str] + b: Mapped[str] c: Mapped[int] diff --git a/libs/sqlalchemy/ext/mypy/names.py b/libs/sqlalchemy/ext/mypy/names.py index fc3d708e7..319786288 100644 --- a/libs/sqlalchemy/ext/mypy/names.py +++ b/libs/sqlalchemy/ext/mypy/names.py @@ -1,5 +1,5 @@ # ext/mypy/names.py -# Copyright (C) 2021-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2021-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/mypy/plugin.py b/libs/sqlalchemy/ext/mypy/plugin.py index 00eb4d1cc..1ec2c02b9 100644 --- a/libs/sqlalchemy/ext/mypy/plugin.py +++ b/libs/sqlalchemy/ext/mypy/plugin.py @@ -1,5 +1,5 @@ # ext/mypy/plugin.py -# Copyright (C) 2021-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2021-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/mypy/util.py b/libs/sqlalchemy/ext/mypy/util.py index af0882bc3..16761b9ab 100644 --- a/libs/sqlalchemy/ext/mypy/util.py +++ b/libs/sqlalchemy/ext/mypy/util.py @@ -1,5 +1,5 @@ # ext/mypy/util.py -# Copyright (C) 2021-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2021-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/ext/orderinglist.py b/libs/sqlalchemy/ext/orderinglist.py index 1a12cf38c..3cc67b189 100644 --- a/libs/sqlalchemy/ext/orderinglist.py +++ b/libs/sqlalchemy/ext/orderinglist.py @@ -1,5 +1,5 @@ # ext/orderinglist.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -26,18 +26,20 @@ Base = declarative_base() + class Slide(Base): - __tablename__ = 'slide' + __tablename__ = "slide" id = Column(Integer, primary_key=True) name = Column(String) bullets = relationship("Bullet", order_by="Bullet.position") + class Bullet(Base): - __tablename__ = 'bullet' + __tablename__ = "bullet" id = Column(Integer, primary_key=True) - slide_id = Column(Integer, ForeignKey('slide.id')) + slide_id = Column(Integer, ForeignKey("slide.id")) position = Column(Integer) text = Column(String) @@ -57,19 +59,24 @@ class Bullet(Base): Base = declarative_base() + class Slide(Base): - __tablename__ = 'slide' + __tablename__ = "slide" id = Column(Integer, primary_key=True) name = Column(String) - bullets = relationship("Bullet", order_by="Bullet.position", - collection_class=ordering_list('position')) + bullets = relationship( + "Bullet", + order_by="Bullet.position", + collection_class=ordering_list("position"), + ) + class Bullet(Base): - __tablename__ = 'bullet' + __tablename__ = "bullet" id = Column(Integer, primary_key=True) - slide_id = Column(Integer, ForeignKey('slide.id')) + slide_id = Column(Integer, ForeignKey("slide.id")) position = Column(Integer) text = Column(String) @@ -151,14 +158,18 @@ def ordering_list( from sqlalchemy.ext.orderinglist import ordering_list + class Slide(Base): - __tablename__ = 'slide' + __tablename__ = "slide" id = Column(Integer, primary_key=True) name = Column(String) - bullets = relationship("Bullet", order_by="Bullet.position", - collection_class=ordering_list('position')) + bullets = relationship( + "Bullet", + order_by="Bullet.position", + collection_class=ordering_list("position"), + ) :param attr: Name of the mapped attribute to use for storage and retrieval of diff --git a/libs/sqlalchemy/ext/serializer.py b/libs/sqlalchemy/ext/serializer.py index 130d25374..b7032b659 100644 --- a/libs/sqlalchemy/ext/serializer.py +++ b/libs/sqlalchemy/ext/serializer.py @@ -1,5 +1,5 @@ # ext/serializer.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -28,13 +28,17 @@ Usage is nearly the same as that of the standard Python pickle module:: from sqlalchemy.ext.serializer import loads, dumps + metadata = MetaData(bind=some_engine) Session = scoped_session(sessionmaker()) # ... define mappers - query = Session.query(MyClass). - filter(MyClass.somedata=='foo').order_by(MyClass.sortkey) + query = ( + Session.query(MyClass) + .filter(MyClass.somedata == "foo") + .order_by(MyClass.sortkey) + ) # pickle the query serialized = dumps(query) @@ -42,7 +46,7 @@ # unpickle. Pass in metadata + scoped_session query2 = loads(serialized, metadata, Session) - print query2.all() + print(query2.all()) Similar restrictions as when using raw pickle apply; mapped classes must be themselves be pickleable, meaning they are importable from a module-level diff --git a/libs/sqlalchemy/future/__init__.py b/libs/sqlalchemy/future/__init__.py index 8ce36ccbc..ef9afb1a5 100644 --- a/libs/sqlalchemy/future/__init__.py +++ b/libs/sqlalchemy/future/__init__.py @@ -1,5 +1,5 @@ # future/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/future/engine.py b/libs/sqlalchemy/future/engine.py index b55cda08d..0449c3d9f 100644 --- a/libs/sqlalchemy/future/engine.py +++ b/libs/sqlalchemy/future/engine.py @@ -1,5 +1,5 @@ # future/engine.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/inspection.py b/libs/sqlalchemy/inspection.py index 30d531957..2e5b22018 100644 --- a/libs/sqlalchemy/inspection.py +++ b/libs/sqlalchemy/inspection.py @@ -1,5 +1,5 @@ # inspection.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/log.py b/libs/sqlalchemy/log.py index e6922b81a..849a0bfa0 100644 --- a/libs/sqlalchemy/log.py +++ b/libs/sqlalchemy/log.py @@ -1,5 +1,5 @@ # log.py -# Copyright (C) 2006-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2006-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # Includes alterations by Vinay Sajip vinay_sajip@yahoo.co.uk # diff --git a/libs/sqlalchemy/orm/__init__.py b/libs/sqlalchemy/orm/__init__.py index 70a112943..7771de47e 100644 --- a/libs/sqlalchemy/orm/__init__.py +++ b/libs/sqlalchemy/orm/__init__.py @@ -1,5 +1,5 @@ # orm/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/_orm_constructors.py b/libs/sqlalchemy/orm/_orm_constructors.py index 4c777b3b3..d9e3ec37b 100644 --- a/libs/sqlalchemy/orm/_orm_constructors.py +++ b/libs/sqlalchemy/orm/_orm_constructors.py @@ -1,5 +1,5 @@ # orm/_orm_constructors.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -823,7 +823,7 @@ def with_loader_criteria( stmt = select(User).options( selectinload(User.addresses), - with_loader_criteria(Address, Address.email_address != 'foo')) + with_loader_criteria(Address, Address.email_address != "foo"), ) Above, the "selectinload" for ``User.addresses`` will apply the @@ -833,8 +833,10 @@ def with_loader_criteria( ON clause of the join, in this example using :term:`1.x style` queries:: - q = session.query(User).outerjoin(User.addresses).options( - with_loader_criteria(Address, Address.email_address != 'foo')) + q = ( + session.query(User) + .outerjoin(User.addresses) + .options(with_loader_criteria(Address, Address.email_address != "foo")) ) The primary purpose of :func:`_orm.with_loader_criteria` is to use @@ -847,6 +849,7 @@ def with_loader_criteria( session = Session(bind=engine) + @event.listens_for("do_orm_execute", session) def _add_filtering_criteria(execute_state): @@ -858,8 +861,8 @@ def _add_filtering_criteria(execute_state): execute_state.statement = execute_state.statement.options( with_loader_criteria( SecurityRole, - lambda cls: cls.role.in_(['some_role']), - include_aliases=True + lambda cls: cls.role.in_(["some_role"]), + include_aliases=True, ) ) @@ -896,16 +899,19 @@ def _add_filtering_criteria(execute_state): ``A -> A.bs -> B``, the given :func:`_orm.with_loader_criteria` option will affect the way in which the JOIN is rendered:: - stmt = select(A).join(A.bs).options( - contains_eager(A.bs), - with_loader_criteria(B, B.flag == 1) + stmt = ( + select(A) + .join(A.bs) + .options(contains_eager(A.bs), with_loader_criteria(B, B.flag == 1)) ) Above, the given :func:`_orm.with_loader_criteria` option will affect the ON clause of the JOIN that is specified by ``.join(A.bs)``, so is applied as expected. The :func:`_orm.contains_eager` option has the effect that columns from - ``B`` are added to the columns clause:: + ``B`` are added to the columns clause: + + .. sourcecode:: sql SELECT b.id, b.a_id, b.data, b.flag, @@ -971,7 +977,7 @@ class of a particular set of mapped classes, to which the rule .. versionadded:: 1.4.0b2 - """ + """ # noqa: E501 return LoaderCriteriaOption( entity_or_base, where_criteria, @@ -1898,14 +1904,13 @@ def synonym( e.g.:: class MyClass(Base): - __tablename__ = 'my_table' + __tablename__ = "my_table" id = Column(Integer, primary_key=True) job_status = Column(String(50)) status = synonym("job_status") - :param name: the name of the existing mapped property. This can refer to the string name ORM-mapped attribute configured on the class, including column-bound attributes @@ -1933,11 +1938,13 @@ class MyClass(Base): :paramref:`.synonym.descriptor` parameter:: my_table = Table( - "my_table", metadata, - Column('id', Integer, primary_key=True), - Column('job_status', String(50)) + "my_table", + metadata, + Column("id", Integer, primary_key=True), + Column("job_status", String(50)), ) + class MyClass: @property def _job_status_descriptor(self): @@ -1945,11 +1952,15 @@ def _job_status_descriptor(self): mapper( - MyClass, my_table, properties={ + MyClass, + my_table, + properties={ "job_status": synonym( - "_job_status", map_column=True, - descriptor=MyClass._job_status_descriptor) - } + "_job_status", + map_column=True, + descriptor=MyClass._job_status_descriptor, + ) + }, ) Above, the attribute named ``_job_status`` is automatically @@ -2099,8 +2110,7 @@ def backref(name: str, **kwargs: Any) -> ORMBackrefArgument: E.g.:: - 'items':relationship( - SomeItem, backref=backref('parent', lazy='subquery')) + "items": relationship(SomeItem, backref=backref("parent", lazy="subquery")) The :paramref:`_orm.relationship.backref` parameter is generally considered to be legacy; for modern applications, using @@ -2112,7 +2122,7 @@ def backref(name: str, **kwargs: Any) -> ORMBackrefArgument: :ref:`relationships_backref` - background on backrefs - """ + """ # noqa: E501 return (name, kwargs) @@ -2373,17 +2383,21 @@ def aliased( aggregate functions:: class UnitPrice(Base): - __tablename__ = 'unit_price' + __tablename__ = "unit_price" ... unit_id = Column(Integer) price = Column(Numeric) - aggregated_unit_price = Session.query( - func.sum(UnitPrice.price).label('price') - ).group_by(UnitPrice.unit_id).subquery() - aggregated_unit_price = aliased(UnitPrice, - alias=aggregated_unit_price, adapt_on_names=True) + aggregated_unit_price = ( + Session.query(func.sum(UnitPrice.price).label("price")) + .group_by(UnitPrice.unit_id) + .subquery() + ) + + aggregated_unit_price = aliased( + UnitPrice, alias=aggregated_unit_price, adapt_on_names=True + ) Above, functions on ``aggregated_unit_price`` which refer to ``.price`` will return the @@ -2529,16 +2543,21 @@ def join( :meth:`_sql.Select.select_from` method, as in:: from sqlalchemy.orm import join - stmt = select(User).\ - select_from(join(User, Address, User.addresses)).\ - filter(Address.email_address=='foo@bar.com') + + stmt = ( + select(User) + .select_from(join(User, Address, User.addresses)) + .filter(Address.email_address == "foo@bar.com") + ) In modern SQLAlchemy the above join can be written more succinctly as:: - stmt = select(User).\ - join(User.addresses).\ - filter(Address.email_address=='foo@bar.com') + stmt = ( + select(User) + .join(User.addresses) + .filter(Address.email_address == "foo@bar.com") + ) .. warning:: using :func:`_orm.join` directly may not work properly with modern ORM options such as :func:`_orm.with_loader_criteria`. diff --git a/libs/sqlalchemy/orm/_typing.py b/libs/sqlalchemy/orm/_typing.py index f8ac0590a..ccb8413b5 100644 --- a/libs/sqlalchemy/orm/_typing.py +++ b/libs/sqlalchemy/orm/_typing.py @@ -1,5 +1,5 @@ # orm/_typing.py -# Copyright (C) 2022-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2022-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/attributes.py b/libs/sqlalchemy/orm/attributes.py index 33cca5649..8207b4cac 100644 --- a/libs/sqlalchemy/orm/attributes.py +++ b/libs/sqlalchemy/orm/attributes.py @@ -1,5 +1,5 @@ # orm/attributes.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -2663,7 +2663,7 @@ def init_collection(obj: object, key: str) -> CollectionAdapter: This function is used to provide direct access to collection internals for a previously unloaded attribute. e.g.:: - collection_adapter = init_collection(someobject, 'elements') + collection_adapter = init_collection(someobject, "elements") for elem in values: collection_adapter.append_without_event(elem) diff --git a/libs/sqlalchemy/orm/base.py b/libs/sqlalchemy/orm/base.py index b5f7dbbaf..c84f3b1b3 100644 --- a/libs/sqlalchemy/orm/base.py +++ b/libs/sqlalchemy/orm/base.py @@ -1,5 +1,5 @@ # orm/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/bulk_persistence.py b/libs/sqlalchemy/orm/bulk_persistence.py index 755192384..402d7bede 100644 --- a/libs/sqlalchemy/orm/bulk_persistence.py +++ b/libs/sqlalchemy/orm/bulk_persistence.py @@ -1,5 +1,5 @@ # orm/bulk_persistence.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/clsregistry.py b/libs/sqlalchemy/orm/clsregistry.py index 382d6aef9..70307ec76 100644 --- a/libs/sqlalchemy/orm/clsregistry.py +++ b/libs/sqlalchemy/orm/clsregistry.py @@ -1,5 +1,5 @@ # orm/clsregistry.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/collections.py b/libs/sqlalchemy/orm/collections.py index d713abb0e..336b1133d 100644 --- a/libs/sqlalchemy/orm/collections.py +++ b/libs/sqlalchemy/orm/collections.py @@ -1,5 +1,5 @@ # orm/collections.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -21,6 +21,8 @@ and return values to events:: from sqlalchemy.orm.collections import collection + + class MyClass: # ... @@ -32,7 +34,6 @@ def store(self, item): def pop(self): return self.data.pop() - The second approach is a bundle of targeted decorators that wrap appropriate append and remove notifiers around the mutation methods present in the standard Python ``list``, ``set`` and ``dict`` interfaces. These could be @@ -73,10 +74,11 @@ class InstrumentedList(list): method that's already instrumented. For example:: class QueueIsh(list): - def push(self, item): - self.append(item) - def shift(self): - return self.pop(0) + def push(self, item): + self.append(item) + + def shift(self): + return self.pop(0) There's no need to decorate these methods. ``append`` and ``pop`` are already instrumented as part of the ``list`` interface. Decorating them would fire @@ -195,9 +197,10 @@ def append(self, append): ... The recipe decorators all require parens, even those that take no arguments:: - @collection.adds('entity') + @collection.adds("entity") def insert(self, position, entity): ... + @collection.removes_return() def popitem(self): ... @@ -217,11 +220,13 @@ def appender(fn): @collection.appender def add(self, append): ... + # or, equivalently @collection.appender @collection.adds(1) def add(self, append): ... + # for mapping type, an 'append' may kick out a previous value # that occupies that slot. consider d['a'] = 'foo'- any previous # value in d['a'] is discarded. @@ -261,10 +266,11 @@ def remover(fn): @collection.remover def zap(self, entity): ... + # or, equivalently @collection.remover @collection.removes_return() - def zap(self, ): ... + def zap(self): ... If the value to remove is not present in the collection, you may raise an exception or return None to ignore the error. @@ -364,7 +370,8 @@ def adds(arg): @collection.adds(1) def push(self, item): ... - @collection.adds('entity') + + @collection.adds("entity") def do_stuff(self, thing, entity=None): ... """ diff --git a/libs/sqlalchemy/orm/context.py b/libs/sqlalchemy/orm/context.py index 6bacd77eb..c09c03b78 100644 --- a/libs/sqlalchemy/orm/context.py +++ b/libs/sqlalchemy/orm/context.py @@ -1,5 +1,5 @@ # orm/context.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -1570,10 +1570,10 @@ def _compound_eager_statement(self): ) statement._label_style = self.label_style - # Oracle however does not allow FOR UPDATE on the subquery, - # and the Oracle dialect ignores it, plus for PostgreSQL, MySQL - # we expect that all elements of the row are locked, so also put it - # on the outside (except in the case of PG when OF is used) + # Oracle Database however does not allow FOR UPDATE on the subquery, + # and the Oracle Database dialects ignore it, plus for PostgreSQL, + # MySQL we expect that all elements of the row are locked, so also put + # it on the outside (except in the case of PG when OF is used) if ( self._for_update_arg is not None and self._for_update_arg.of is None diff --git a/libs/sqlalchemy/orm/decl_api.py b/libs/sqlalchemy/orm/decl_api.py index 91f9539be..c32851dea 100644 --- a/libs/sqlalchemy/orm/decl_api.py +++ b/libs/sqlalchemy/orm/decl_api.py @@ -1,5 +1,5 @@ # orm/decl_api.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -14,7 +14,6 @@ import typing from typing import Any from typing import Callable -from typing import cast from typing import ClassVar from typing import Dict from typing import FrozenSet @@ -72,13 +71,16 @@ from ..util import hybridmethod from ..util import hybridproperty from ..util import typing as compat_typing +from ..util import warn_deprecated from ..util.typing import CallableReference +from ..util.typing import de_optionalize_union_types from ..util.typing import flatten_newtype from ..util.typing import is_generic from ..util.typing import is_literal from ..util.typing import is_newtype from ..util.typing import is_pep695 from ..util.typing import Literal +from ..util.typing import LITERAL_TYPES from ..util.typing import Self if TYPE_CHECKING: @@ -207,7 +209,7 @@ def synonym_for( :paramref:`.orm.synonym.descriptor` parameter:: class MyClass(Base): - __tablename__ = 'my_table' + __tablename__ = "my_table" id = Column(Integer, primary_key=True) _job_status = Column("job_status", String(50)) @@ -373,20 +375,21 @@ def __tablename__(cls) -> str: for subclasses:: class Employee(Base): - __tablename__ = 'employee' + __tablename__ = "employee" id: Mapped[int] = mapped_column(primary_key=True) type: Mapped[str] = mapped_column(String(50)) @declared_attr.directive def __mapper_args__(cls) -> Dict[str, Any]: - if cls.__name__ == 'Employee': + if cls.__name__ == "Employee": return { - "polymorphic_on":cls.type, - "polymorphic_identity":"Employee" + "polymorphic_on": cls.type, + "polymorphic_identity": "Employee", } else: - return {"polymorphic_identity":cls.__name__} + return {"polymorphic_identity": cls.__name__} + class Engineer(Employee): pass @@ -485,6 +488,7 @@ def declarative_mixin(cls: Type[_T]) -> Type[_T]: from sqlalchemy.orm import declared_attr from sqlalchemy.orm import declarative_mixin + @declarative_mixin class MyMixin: @@ -492,10 +496,11 @@ class MyMixin: def __tablename__(cls): return cls.__name__.lower() - __table_args__ = {'mysql_engine': 'InnoDB'} - __mapper_args__= {'always_refresh': True} + __table_args__ = {"mysql_engine": "InnoDB"} + __mapper_args__ = {"always_refresh": True} + + id = Column(Integer, primary_key=True) - id = Column(Integer, primary_key=True) class MyModel(MyMixin, Base): name = Column(String(1000)) @@ -638,10 +643,10 @@ class DeclarativeBase( from sqlalchemy.orm import DeclarativeBase + class Base(DeclarativeBase): pass - The above ``Base`` class is now usable as the base for new declarative mappings. The superclass makes use of the ``__init_subclass__()`` method to set up new classes and metaclasses aren't used. @@ -664,11 +669,12 @@ class Base(DeclarativeBase): bigint = Annotated[int, "bigint"] my_metadata = MetaData() + class Base(DeclarativeBase): metadata = my_metadata type_annotation_map = { str: String().with_variant(String(255), "mysql", "mariadb"), - bigint: BigInteger() + bigint: BigInteger(), } Class-level attributes which may be specified include: @@ -1221,49 +1227,33 @@ def update_type_annotation_map( self.type_annotation_map.update( { - sub_type: sqltype + de_optionalize_union_types(typ): sqltype for typ, sqltype in type_annotation_map.items() - for sub_type in compat_typing.expand_unions( - typ, include_union=True, discard_none=True - ) } ) def _resolve_type( - self, python_type: _MatchedOnType + self, python_type: _MatchedOnType, _do_fallbacks: bool = True ) -> Optional[sqltypes.TypeEngine[Any]]: - - python_type_to_check = python_type - while is_pep695(python_type_to_check): - python_type_to_check = python_type_to_check.__value__ - - check_is_pt = python_type is python_type_to_check - python_type_type: Type[Any] search: Iterable[Tuple[_MatchedOnType, Type[Any]]] - if is_generic(python_type_to_check): - if is_literal(python_type_to_check): - python_type_type = cast("Type[Any]", python_type_to_check) + if is_generic(python_type): + if is_literal(python_type): + python_type_type = python_type # type: ignore[assignment] - search = ( # type: ignore[assignment] + search = ( (python_type, python_type_type), - (Literal, python_type_type), + *((lt, python_type_type) for lt in LITERAL_TYPES), # type: ignore[arg-type] # noqa: E501 ) else: - python_type_type = python_type_to_check.__origin__ + python_type_type = python_type.__origin__ search = ((python_type, python_type_type),) - elif is_newtype(python_type_to_check): - python_type_type = flatten_newtype(python_type_to_check) - search = ((python_type, python_type_type),) - elif isinstance(python_type_to_check, type): - python_type_type = python_type_to_check - search = ( - (pt if check_is_pt else python_type, pt) - for pt in python_type_type.__mro__ - ) + elif isinstance(python_type, type): + python_type_type = python_type + search = ((pt, pt) for pt in python_type_type.__mro__) else: - python_type_type = python_type_to_check # type: ignore[assignment] + python_type_type = python_type # type: ignore[assignment] search = ((python_type, python_type_type),) for pt, flattened in search: @@ -1288,6 +1278,39 @@ def _resolve_type( if resolved_sql_type is not None: return resolved_sql_type + # 2.0 fallbacks + if _do_fallbacks: + python_type_to_check: Any = None + kind = None + if is_pep695(python_type): + # NOTE: assume there aren't type alias types of new types. + python_type_to_check = python_type + while is_pep695(python_type_to_check): + python_type_to_check = python_type_to_check.__value__ + python_type_to_check = de_optionalize_union_types( + python_type_to_check + ) + kind = "TypeAliasType" + if is_newtype(python_type): + python_type_to_check = flatten_newtype(python_type) + kind = "NewType" + + if python_type_to_check is not None: + res_after_fallback = self._resolve_type( + python_type_to_check, False + ) + if res_after_fallback is not None: + assert kind is not None + warn_deprecated( + f"Matching the provided {kind} '{python_type}' on " + "its resolved value without matching it in the " + "type_annotation_map is deprecated; add this type to " + "the type_annotation_map to allow it to match " + "explicitly.", + "2.0", + ) + return res_after_fallback + return None @property @@ -1480,6 +1503,7 @@ def generate_base( Base = mapper_registry.generate_base() + class MyClass(Base): __tablename__ = "my_table" id = Column(Integer, primary_key=True) @@ -1492,6 +1516,7 @@ class MyClass(Base): mapper_registry = registry() + class Base(metaclass=DeclarativeMeta): __abstract__ = True registry = mapper_registry @@ -1657,9 +1682,10 @@ def mapped(self, cls: Type[_O]) -> Type[_O]: mapper_registry = registry() + @mapper_registry.mapped class Foo: - __tablename__ = 'some_table' + __tablename__ = "some_table" id = Column(Integer, primary_key=True) name = Column(String) @@ -1699,15 +1725,17 @@ def as_declarative_base(self, **kw: Any) -> Callable[[Type[_T]], Type[_T]]: mapper_registry = registry() + @mapper_registry.as_declarative_base() class Base: @declared_attr def __tablename__(cls): return cls.__name__.lower() + id = Column(Integer, primary_key=True) - class MyMappedClass(Base): - # ... + + class MyMappedClass(Base): ... All keyword arguments passed to :meth:`_orm.registry.as_declarative_base` are passed @@ -1737,12 +1765,14 @@ def map_declaratively(self, cls: Type[_O]) -> Mapper[_O]: mapper_registry = registry() + class Foo: - __tablename__ = 'some_table' + __tablename__ = "some_table" id = Column(Integer, primary_key=True) name = Column(String) + mapper = mapper_registry.map_declaratively(Foo) This function is more conveniently invoked indirectly via either the @@ -1795,12 +1825,14 @@ def map_imperatively( my_table = Table( "my_table", mapper_registry.metadata, - Column('id', Integer, primary_key=True) + Column("id", Integer, primary_key=True), ) + class MyClass: pass + mapper_registry.map_imperatively(MyClass, my_table) See the section :ref:`orm_imperative_mapping` for complete background @@ -1847,15 +1879,17 @@ def as_declarative(**kw: Any) -> Callable[[Type[_T]], Type[_T]]: from sqlalchemy.orm import as_declarative + @as_declarative() class Base: @declared_attr def __tablename__(cls): return cls.__name__.lower() + id = Column(Integer, primary_key=True) - class MyMappedClass(Base): - # ... + + class MyMappedClass(Base): ... .. seealso:: diff --git a/libs/sqlalchemy/orm/decl_base.py b/libs/sqlalchemy/orm/decl_base.py index b069d23c0..c480994d8 100644 --- a/libs/sqlalchemy/orm/decl_base.py +++ b/libs/sqlalchemy/orm/decl_base.py @@ -1,5 +1,5 @@ # orm/decl_base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -65,11 +65,11 @@ from ..sql.schema import Table from ..util import topological from ..util.typing import _AnnotationScanType +from ..util.typing import get_args from ..util.typing import is_fwd_ref from ..util.typing import is_literal from ..util.typing import Protocol from ..util.typing import TypedDict -from ..util.typing import typing_get_args if TYPE_CHECKING: from ._typing import _ClassDict @@ -1308,10 +1308,8 @@ def _collect_annotation( type(attr_value), required=False, is_dataclass_field=is_dataclass_field, - expect_mapped=expect_mapped - and not is_dataclass, # self.allow_dataclass_fields, + expect_mapped=expect_mapped and not is_dataclass, ) - if extracted is None: # ClassVar can come out here return None @@ -1319,9 +1317,9 @@ def _collect_annotation( extracted_mapped_annotation, mapped_container = extracted if attr_value is None and not is_literal(extracted_mapped_annotation): - for elem in typing_get_args(extracted_mapped_annotation): - if isinstance(elem, str) or is_fwd_ref( - elem, check_generic=True + for elem in get_args(extracted_mapped_annotation): + if is_fwd_ref( + elem, check_generic=True, check_for_plain_string=True ): elem = de_stringify_annotation( self.cls, diff --git a/libs/sqlalchemy/orm/dependency.py b/libs/sqlalchemy/orm/dependency.py index 71c06fbeb..595306245 100644 --- a/libs/sqlalchemy/orm/dependency.py +++ b/libs/sqlalchemy/orm/dependency.py @@ -1,5 +1,5 @@ # orm/dependency.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/descriptor_props.py b/libs/sqlalchemy/orm/descriptor_props.py index faf287cce..f01cc1788 100644 --- a/libs/sqlalchemy/orm/descriptor_props.py +++ b/libs/sqlalchemy/orm/descriptor_props.py @@ -1,5 +1,5 @@ # orm/descriptor_props.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -53,9 +53,10 @@ from ..sql import expression from ..sql import operators from ..sql.elements import BindParameter +from ..util.typing import get_args from ..util.typing import is_fwd_ref from ..util.typing import is_pep593 -from ..util.typing import typing_get_args + if typing.TYPE_CHECKING: from ._typing import _InstanceDict @@ -364,7 +365,7 @@ def declarative_scan( argument = extracted_mapped_annotation if is_pep593(argument): - argument = typing_get_args(argument)[0] + argument = get_args(argument)[0] if argument and self.composite_class is None: if isinstance(argument, str) or is_fwd_ref( diff --git a/libs/sqlalchemy/orm/dynamic.py b/libs/sqlalchemy/orm/dynamic.py index ad1b239c1..3c81c396f 100644 --- a/libs/sqlalchemy/orm/dynamic.py +++ b/libs/sqlalchemy/orm/dynamic.py @@ -1,5 +1,5 @@ # orm/dynamic.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/evaluator.py b/libs/sqlalchemy/orm/evaluator.py index 2c10ec55a..57aae5a3c 100644 --- a/libs/sqlalchemy/orm/evaluator.py +++ b/libs/sqlalchemy/orm/evaluator.py @@ -1,5 +1,5 @@ # orm/evaluator.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/events.py b/libs/sqlalchemy/orm/events.py index f2eae852b..f161760e6 100644 --- a/libs/sqlalchemy/orm/events.py +++ b/libs/sqlalchemy/orm/events.py @@ -1,5 +1,5 @@ # orm/events.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -207,10 +207,12 @@ class InstanceEvents(event.Events[ClassManager[Any]]): from sqlalchemy import event + def my_load_listener(target, context): print("on load!") - event.listen(SomeClass, 'load', my_load_listener) + + event.listen(SomeClass, "load", my_load_listener) Available targets include: @@ -466,8 +468,7 @@ def load(self, target: _O, context: QueryContext) -> None: the existing loading context is maintained for the object after the event is called:: - @event.listens_for( - SomeClass, "load", restore_load_context=True) + @event.listens_for(SomeClass, "load", restore_load_context=True) def on_load(instance, context): instance.some_unloaded_attribute @@ -502,7 +503,7 @@ def on_load(instance, context): :meth:`.SessionEvents.loaded_as_persistent` - """ + """ # noqa: E501 def refresh( self, target: _O, context: QueryContext, attrs: Optional[Iterable[str]] @@ -749,6 +750,7 @@ class MapperEvents(event.Events[mapperlib.Mapper[Any]]): from sqlalchemy import event + def my_before_insert_listener(mapper, connection, target): # execute a stored procedure upon INSERT, # apply the value to the row to be inserted @@ -756,10 +758,10 @@ def my_before_insert_listener(mapper, connection, target): text("select my_special_function(%d)" % target.special_number) ).scalar() + # associate the listener function with SomeClass, # to execute during the "before_insert" hook - event.listen( - SomeClass, 'before_insert', my_before_insert_listener) + event.listen(SomeClass, "before_insert", my_before_insert_listener) Available targets include: @@ -925,9 +927,10 @@ class overall, or to any un-mapped class which serves as a base Base = declarative_base() + @event.listens_for(Base, "instrument_class", propagate=True) def on_new_class(mapper, cls_): - " ... " + "..." :param mapper: the :class:`_orm.Mapper` which is the target of this event. @@ -983,7 +986,7 @@ def before_mapper_configured( symbol which indicates to the :func:`.configure_mappers` call that this particular mapper (or hierarchy of mappers, if ``propagate=True`` is used) should be skipped in the current configuration run. When one or - more mappers are skipped, the he "new mappers" flag will remain set, + more mappers are skipped, the "new mappers" flag will remain set, meaning the :func:`.configure_mappers` function will continue to be called when mappers are used, to continue to try to configure all available mappers. @@ -992,7 +995,7 @@ def before_mapper_configured( :meth:`.MapperEvents.before_configured`, :meth:`.MapperEvents.after_configured`, and :meth:`.MapperEvents.mapper_configured`, the - :meth;`.MapperEvents.before_mapper_configured` event provides for a + :meth:`.MapperEvents.before_mapper_configured` event provides for a meaningful return value when it is registered with the ``retval=True`` parameter. @@ -1006,13 +1009,16 @@ def before_mapper_configured( DontConfigureBase = declarative_base() + @event.listens_for( DontConfigureBase, - "before_mapper_configured", retval=True, propagate=True) + "before_mapper_configured", + retval=True, + propagate=True, + ) def dont_configure(mapper, cls): return EXT_SKIP - .. seealso:: :meth:`.MapperEvents.before_configured` @@ -1094,9 +1100,9 @@ def before_configured(self) -> None: from sqlalchemy.orm import Mapper + @event.listens_for(Mapper, "before_configured") - def go(): - ... + def go(): ... Contrast this event to :meth:`.MapperEvents.after_configured`, which is invoked after the series of mappers has been configured, @@ -1114,10 +1120,9 @@ def go(): from sqlalchemy.orm import mapper - @event.listens_for(mapper, "before_configured", once=True) - def go(): - ... + @event.listens_for(mapper, "before_configured", once=True) + def go(): ... .. seealso:: @@ -1154,9 +1159,9 @@ def after_configured(self) -> None: from sqlalchemy.orm import Mapper + @event.listens_for(Mapper, "after_configured") - def go(): - # ... + def go(): ... Theoretically this event is called once per application, but is actually called any time new mappers @@ -1168,9 +1173,9 @@ def go(): from sqlalchemy.orm import mapper + @event.listens_for(mapper, "after_configured", once=True) - def go(): - # ... + def go(): ... .. seealso:: @@ -1557,9 +1562,11 @@ class SessionEvents(event.Events[Session]): from sqlalchemy import event from sqlalchemy.orm import sessionmaker + def my_before_commit(session): print("before commit!") + Session = sessionmaker() event.listen(Session, "before_commit", my_before_commit) @@ -1779,7 +1786,7 @@ def after_transaction_create( @event.listens_for(session, "after_transaction_create") def after_transaction_create(session, transaction): if transaction.parent is None: - # work with top-level transaction + ... # work with top-level transaction To detect if the :class:`.SessionTransaction` is a SAVEPOINT, use the :attr:`.SessionTransaction.nested` attribute:: @@ -1787,8 +1794,7 @@ def after_transaction_create(session, transaction): @event.listens_for(session, "after_transaction_create") def after_transaction_create(session, transaction): if transaction.nested: - # work with SAVEPOINT transaction - + ... # work with SAVEPOINT transaction .. seealso:: @@ -1820,7 +1826,7 @@ def after_transaction_end( @event.listens_for(session, "after_transaction_create") def after_transaction_end(session, transaction): if transaction.parent is None: - # work with top-level transaction + ... # work with top-level transaction To detect if the :class:`.SessionTransaction` is a SAVEPOINT, use the :attr:`.SessionTransaction.nested` attribute:: @@ -1828,8 +1834,7 @@ def after_transaction_end(session, transaction): @event.listens_for(session, "after_transaction_create") def after_transaction_end(session, transaction): if transaction.nested: - # work with SAVEPOINT transaction - + ... # work with SAVEPOINT transaction .. seealso:: @@ -2455,11 +2460,11 @@ class AttributeEvents(event.Events[QueryableAttribute[Any]]): from sqlalchemy import event - @event.listens_for(MyClass.collection, 'append', propagate=True) + + @event.listens_for(MyClass.collection, "append", propagate=True) def my_append_listener(target, value, initiator): print("received append event for target: %s" % target) - Listeners have the option to return a possibly modified version of the value, when the :paramref:`.AttributeEvents.retval` flag is passed to :func:`.event.listen` or :func:`.event.listens_for`, such as below, @@ -2468,11 +2473,12 @@ def my_append_listener(target, value, initiator): def validate_phone(target, value, oldvalue, initiator): "Strip non-numeric characters from a phone number" - return re.sub(r'\D', '', value) + return re.sub(r"\D", "", value) + # setup listener on UserContact.phone attribute, instructing # it to use the return value - listen(UserContact.phone, 'set', validate_phone, retval=True) + listen(UserContact.phone, "set", validate_phone, retval=True) A validation function like the above can also raise an exception such as :exc:`ValueError` to halt the operation. @@ -2482,7 +2488,7 @@ def validate_phone(target, value, oldvalue, initiator): as when using mapper inheritance patterns:: - @event.listens_for(MySuperClass.attr, 'set', propagate=True) + @event.listens_for(MySuperClass.attr, "set", propagate=True) def receive_set(target, value, initiator): print("value set: %s" % target) @@ -2715,10 +2721,12 @@ def bulk_replace( from sqlalchemy.orm.attributes import OP_BULK_REPLACE + @event.listens_for(SomeObject.collection, "bulk_replace") def process_collection(target, values, initiator): values[:] = [_make_value(value) for value in values] + @event.listens_for(SomeObject.collection, "append", retval=True) def process_collection(target, value, initiator): # make sure bulk_replace didn't already do it @@ -2866,16 +2874,18 @@ def init_scalar( SOME_CONSTANT = 3.1415926 + class MyClass(Base): # ... some_attribute = Column(Numeric, default=SOME_CONSTANT) + @event.listens_for( - MyClass.some_attribute, "init_scalar", - retval=True, propagate=True) + MyClass.some_attribute, "init_scalar", retval=True, propagate=True + ) def _init_some_attribute(target, dict_, value): - dict_['some_attribute'] = SOME_CONSTANT + dict_["some_attribute"] = SOME_CONSTANT return SOME_CONSTANT Above, we initialize the attribute ``MyClass.some_attribute`` to the @@ -2911,9 +2921,10 @@ def _init_some_attribute(target, dict_, value): SOME_CONSTANT = 3.1415926 + @event.listens_for( - MyClass.some_attribute, "init_scalar", - retval=True, propagate=True) + MyClass.some_attribute, "init_scalar", retval=True, propagate=True + ) def _init_some_attribute(target, dict_, value): # will also fire off attribute set events target.some_attribute = SOME_CONSTANT @@ -2950,7 +2961,7 @@ def _init_some_attribute(target, dict_, value): :ref:`examples_instrumentation` - see the ``active_column_defaults.py`` example. - """ + """ # noqa: E501 def init_collection( self, @@ -3088,8 +3099,8 @@ def before_compile(self, query: Query[Any]) -> None: @event.listens_for(Query, "before_compile", retval=True) def no_deleted(query): for desc in query.column_descriptions: - if desc['type'] is User: - entity = desc['entity'] + if desc["type"] is User: + entity = desc["entity"] query = query.filter(entity.deleted == False) return query @@ -3105,12 +3116,11 @@ def no_deleted(query): re-establish the query being cached, apply the event adding the ``bake_ok`` flag:: - @event.listens_for( - Query, "before_compile", retval=True, bake_ok=True) + @event.listens_for(Query, "before_compile", retval=True, bake_ok=True) def my_event(query): for desc in query.column_descriptions: - if desc['type'] is User: - entity = desc['entity'] + if desc["type"] is User: + entity = desc["entity"] query = query.filter(entity.deleted == False) return query @@ -3131,7 +3141,7 @@ def my_event(query): :ref:`baked_with_before_compile` - """ + """ # noqa: E501 def before_compile_update( self, query: Query[Any], update_context: BulkUpdate @@ -3151,12 +3161,12 @@ def before_compile_update( @event.listens_for(Query, "before_compile_update", retval=True) def no_deleted(query, update_context): for desc in query.column_descriptions: - if desc['type'] is User: - entity = desc['entity'] + if desc["type"] is User: + entity = desc["entity"] query = query.filter(entity.deleted == False) - update_context.values['timestamp'] = ( - datetime.datetime.now(datetime.UTC) + update_context.values["timestamp"] = datetime.datetime.now( + datetime.UTC ) return query @@ -3185,7 +3195,7 @@ def no_deleted(query, update_context): :meth:`.QueryEvents.before_compile_delete` - """ + """ # noqa: E501 def before_compile_delete( self, query: Query[Any], delete_context: BulkDelete @@ -3204,8 +3214,8 @@ def before_compile_delete( @event.listens_for(Query, "before_compile_delete", retval=True) def no_deleted(query, delete_context): for desc in query.column_descriptions: - if desc['type'] is User: - entity = desc['entity'] + if desc["type"] is User: + entity = desc["entity"] query = query.filter(entity.deleted == False) return query diff --git a/libs/sqlalchemy/orm/exc.py b/libs/sqlalchemy/orm/exc.py index 39dd54011..0494edf98 100644 --- a/libs/sqlalchemy/orm/exc.py +++ b/libs/sqlalchemy/orm/exc.py @@ -1,5 +1,5 @@ # orm/exc.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/identity.py b/libs/sqlalchemy/orm/identity.py index 23682f7ef..1808b2d5e 100644 --- a/libs/sqlalchemy/orm/identity.py +++ b/libs/sqlalchemy/orm/identity.py @@ -1,5 +1,5 @@ # orm/identity.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/instrumentation.py b/libs/sqlalchemy/orm/instrumentation.py index e9fe84336..f87023f18 100644 --- a/libs/sqlalchemy/orm/instrumentation.py +++ b/libs/sqlalchemy/orm/instrumentation.py @@ -1,5 +1,5 @@ # orm/instrumentation.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/interfaces.py b/libs/sqlalchemy/orm/interfaces.py index 094053fa0..b4462e545 100644 --- a/libs/sqlalchemy/orm/interfaces.py +++ b/libs/sqlalchemy/orm/interfaces.py @@ -1,5 +1,5 @@ # orm/interfaces.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -685,27 +685,37 @@ class PropComparator(SQLORMOperations[_T_co], Generic[_T_co], ColumnOperators): # definition of custom PropComparator subclasses - from sqlalchemy.orm.properties import \ - ColumnProperty,\ - Composite,\ - Relationship + from sqlalchemy.orm.properties import ( + ColumnProperty, + Composite, + Relationship, + ) + class MyColumnComparator(ColumnProperty.Comparator): def __eq__(self, other): return self.__clause_element__() == other + class MyRelationshipComparator(Relationship.Comparator): def any(self, expression): "define the 'any' operation" # ... + class MyCompositeComparator(Composite.Comparator): def __gt__(self, other): "redefine the 'greater than' operation" - return sql.and_(*[a>b for a, b in - zip(self.__clause_element__().clauses, - other.__composite_values__())]) + return sql.and_( + *[ + a > b + for a, b in zip( + self.__clause_element__().clauses, + other.__composite_values__(), + ) + ] + ) # application of custom PropComparator subclasses @@ -713,17 +723,22 @@ def __gt__(self, other): from sqlalchemy.orm import column_property, relationship, composite from sqlalchemy import Column, String + class SomeMappedClass(Base): - some_column = column_property(Column("some_column", String), - comparator_factory=MyColumnComparator) + some_column = column_property( + Column("some_column", String), + comparator_factory=MyColumnComparator, + ) - some_relationship = relationship(SomeOtherClass, - comparator_factory=MyRelationshipComparator) + some_relationship = relationship( + SomeOtherClass, comparator_factory=MyRelationshipComparator + ) some_composite = composite( - Column("a", String), Column("b", String), - comparator_factory=MyCompositeComparator - ) + Column("a", String), + Column("b", String), + comparator_factory=MyCompositeComparator, + ) Note that for column-level operator redefinition, it's usually simpler to define the operators at the Core level, using the @@ -865,8 +880,9 @@ def of_type(self, class_: _EntityType[Any]) -> PropComparator[_T_co]: e.g.:: - query.join(Company.employees.of_type(Engineer)).\ - filter(Engineer.name=='foo') + query.join(Company.employees.of_type(Engineer)).filter( + Engineer.name == "foo" + ) :param \class_: a class or mapper indicating that criterion will be against this specific subclass. @@ -892,11 +908,11 @@ def and_( stmt = select(User).join( - User.addresses.and_(Address.email_address != 'foo') + User.addresses.and_(Address.email_address != "foo") ) stmt = select(User).options( - joinedload(User.addresses.and_(Address.email_address != 'foo')) + joinedload(User.addresses.and_(Address.email_address != "foo")) ) .. versionadded:: 1.4 diff --git a/libs/sqlalchemy/orm/loading.py b/libs/sqlalchemy/orm/loading.py index 6176d72a6..679286f54 100644 --- a/libs/sqlalchemy/orm/loading.py +++ b/libs/sqlalchemy/orm/loading.py @@ -1,5 +1,5 @@ # orm/loading.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/mapped_collection.py b/libs/sqlalchemy/orm/mapped_collection.py index 0d3079fb5..ca085c403 100644 --- a/libs/sqlalchemy/orm/mapped_collection.py +++ b/libs/sqlalchemy/orm/mapped_collection.py @@ -1,5 +1,5 @@ # orm/mapped_collection.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/mapper.py b/libs/sqlalchemy/orm/mapper.py index 29659e6e8..11010efbc 100644 --- a/libs/sqlalchemy/orm/mapper.py +++ b/libs/sqlalchemy/orm/mapper.py @@ -1,5 +1,5 @@ # orm/mapper.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -329,7 +329,7 @@ class will overwrite all data within object instances that already class User(Base): __table__ = user_table - __mapper_args__ = {'column_prefix':'_'} + __mapper_args__ = {"column_prefix": "_"} The above mapping will assign the ``user_id``, ``user_name``, and ``password`` columns to attributes named ``_user_id``, @@ -545,14 +545,14 @@ class User(Base): base-most mapped :class:`.Table`:: class Employee(Base): - __tablename__ = 'employee' + __tablename__ = "employee" id: Mapped[int] = mapped_column(primary_key=True) discriminator: Mapped[str] = mapped_column(String(50)) __mapper_args__ = { - "polymorphic_on":discriminator, - "polymorphic_identity":"employee" + "polymorphic_on": discriminator, + "polymorphic_identity": "employee", } It may also be specified @@ -561,17 +561,18 @@ class Employee(Base): approach:: class Employee(Base): - __tablename__ = 'employee' + __tablename__ = "employee" id: Mapped[int] = mapped_column(primary_key=True) discriminator: Mapped[str] = mapped_column(String(50)) __mapper_args__ = { - "polymorphic_on":case( + "polymorphic_on": case( (discriminator == "EN", "engineer"), (discriminator == "MA", "manager"), - else_="employee"), - "polymorphic_identity":"employee" + else_="employee", + ), + "polymorphic_identity": "employee", } It may also refer to any attribute using its string name, @@ -579,14 +580,14 @@ class Employee(Base): configurations:: class Employee(Base): - __tablename__ = 'employee' + __tablename__ = "employee" id: Mapped[int] = mapped_column(primary_key=True) discriminator: Mapped[str] __mapper_args__ = { "polymorphic_on": "discriminator", - "polymorphic_identity": "employee" + "polymorphic_identity": "employee", } When setting ``polymorphic_on`` to reference an @@ -603,6 +604,7 @@ class Employee(Base): from sqlalchemy import event from sqlalchemy.orm import object_mapper + @event.listens_for(Employee, "init", propagate=True) def set_identity(instance, *arg, **kw): mapper = object_mapper(instance) @@ -3259,14 +3261,9 @@ def _equivalent_columns(self) -> _EquivalentColumnMap: The resulting structure is a dictionary of columns mapped to lists of equivalent columns, e.g.:: - { - tablea.col1: - {tableb.col1, tablec.col1}, - tablea.col2: - {tabled.col2} - } + {tablea.col1: {tableb.col1, tablec.col1}, tablea.col2: {tabled.col2}} - """ + """ # noqa: E501 result: _EquivalentColumnMap = {} def visit_binary(binary): @@ -3739,14 +3736,15 @@ def _would_selectin_load_only_from_given_mapper(self, super_mapper): given:: - class A: - ... + class A: ... + class B(A): __mapper_args__ = {"polymorphic_load": "selectin"} - class C(B): - ... + + class C(B): ... + class D(B): __mapper_args__ = {"polymorphic_load": "selectin"} diff --git a/libs/sqlalchemy/orm/path_registry.py b/libs/sqlalchemy/orm/path_registry.py index 4ee8ac71b..a15f7f61b 100644 --- a/libs/sqlalchemy/orm/path_registry.py +++ b/libs/sqlalchemy/orm/path_registry.py @@ -1,5 +1,5 @@ # orm/path_registry.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/persistence.py b/libs/sqlalchemy/orm/persistence.py index 369fc5998..cbe8557ad 100644 --- a/libs/sqlalchemy/orm/persistence.py +++ b/libs/sqlalchemy/orm/persistence.py @@ -1,5 +1,5 @@ # orm/persistence.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/properties.py b/libs/sqlalchemy/orm/properties.py index 5c49222be..a41c520cd 100644 --- a/libs/sqlalchemy/orm/properties.py +++ b/libs/sqlalchemy/orm/properties.py @@ -1,5 +1,5 @@ # orm/properties.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -43,7 +43,6 @@ from .interfaces import StrategizedProperty from .relationships import RelationshipProperty from .util import de_stringify_annotation -from .util import de_stringify_union_elements from .. import exc as sa_exc from .. import ForeignKey from .. import log @@ -55,13 +54,12 @@ from ..sql.schema import SchemaConst from ..sql.type_api import TypeEngine from ..util.typing import de_optionalize_union_types +from ..util.typing import get_args +from ..util.typing import includes_none from ..util.typing import is_fwd_ref -from ..util.typing import is_optional_union from ..util.typing import is_pep593 from ..util.typing import is_pep695 -from ..util.typing import is_union from ..util.typing import Self -from ..util.typing import typing_get_args if TYPE_CHECKING: from ._typing import _IdentityKeyType @@ -280,8 +278,8 @@ class File(Base): name = Column(String(64)) extension = Column(String(8)) - filename = column_property(name + '.' + extension) - path = column_property('C:/' + filename.expression) + filename = column_property(name + "." + extension) + path = column_property("C:/" + filename.expression) .. seealso:: @@ -738,52 +736,44 @@ def _init_column_for_annotation( ) -> None: sqltype = self.column.type - if isinstance(argument, str) or is_fwd_ref( - argument, check_generic=True + if is_fwd_ref( + argument, check_generic=True, check_for_plain_string=True ): assert originating_module is not None argument = de_stringify_annotation( cls, argument, originating_module, include_generic=True ) - if is_union(argument): - assert originating_module is not None - argument = de_stringify_union_elements( - cls, argument, originating_module - ) - - nullable = is_optional_union(argument) + nullable = includes_none(argument) if not self._has_nullable: self.column.nullable = nullable our_type = de_optionalize_union_types(argument) - use_args_from = None - - our_original_type = our_type - - if is_pep695(our_type): - our_type = our_type.__value__ + find_mapped_in: Tuple[Any, ...] = () + our_type_is_pep593 = False + raw_pep_593_type = None if is_pep593(our_type): our_type_is_pep593 = True - pep_593_components = typing_get_args(our_type) + pep_593_components = get_args(our_type) raw_pep_593_type = pep_593_components[0] - if is_optional_union(raw_pep_593_type): + if nullable: raw_pep_593_type = de_optionalize_union_types(raw_pep_593_type) - - nullable = True - if not self._has_nullable: - self.column.nullable = nullable - for elem in pep_593_components[1:]: - if isinstance(elem, MappedColumn): - use_args_from = elem - break + find_mapped_in = pep_593_components[1:] + elif is_pep695(argument) and is_pep593(argument.__value__): + # do not support nested annotation inside unions ets + find_mapped_in = get_args(argument.__value__)[1:] + + use_args_from: Optional[MappedColumn[Any]] + for elem in find_mapped_in: + if isinstance(elem, MappedColumn): + use_args_from = elem + break else: - our_type_is_pep593 = False - raw_pep_593_type = None + use_args_from = None if use_args_from is not None: if ( @@ -857,10 +847,11 @@ def _init_column_for_annotation( if sqltype._isnull and not self.column.foreign_keys: new_sqltype = None + checks: List[Any] if our_type_is_pep593: - checks = [our_original_type, raw_pep_593_type] + checks = [our_type, raw_pep_593_type] else: - checks = [our_original_type] + checks = [our_type] for check_type in checks: new_sqltype = registry._resolve_type(check_type) diff --git a/libs/sqlalchemy/orm/query.py b/libs/sqlalchemy/orm/query.py index 5c1a45b5f..c7e1ca8ad 100644 --- a/libs/sqlalchemy/orm/query.py +++ b/libs/sqlalchemy/orm/query.py @@ -1,5 +1,5 @@ # orm/query.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -672,41 +672,38 @@ def cte( from sqlalchemy.orm import aliased + class Part(Base): - __tablename__ = 'part' + __tablename__ = "part" part = Column(String, primary_key=True) sub_part = Column(String, primary_key=True) quantity = Column(Integer) - included_parts = session.query( - Part.sub_part, - Part.part, - Part.quantity).\ - filter(Part.part=="our part").\ - cte(name="included_parts", recursive=True) + + included_parts = ( + session.query(Part.sub_part, Part.part, Part.quantity) + .filter(Part.part == "our part") + .cte(name="included_parts", recursive=True) + ) incl_alias = aliased(included_parts, name="pr") parts_alias = aliased(Part, name="p") included_parts = included_parts.union_all( session.query( - parts_alias.sub_part, - parts_alias.part, - parts_alias.quantity).\ - filter(parts_alias.part==incl_alias.c.sub_part) - ) + parts_alias.sub_part, parts_alias.part, parts_alias.quantity + ).filter(parts_alias.part == incl_alias.c.sub_part) + ) q = session.query( - included_parts.c.sub_part, - func.sum(included_parts.c.quantity). - label('total_quantity') - ).\ - group_by(included_parts.c.sub_part) + included_parts.c.sub_part, + func.sum(included_parts.c.quantity).label("total_quantity"), + ).group_by(included_parts.c.sub_part) .. seealso:: :meth:`_sql.Select.cte` - v2 equivalent method. - """ + """ # noqa: E501 return ( self.enable_eagerloads(False) ._get_select_statement_only() @@ -941,9 +938,7 @@ def set_label_style(self, style: SelectLabelStyle) -> Self: :attr:`_query.Query.statement` using :meth:`.Session.execute`:: result = session.execute( - query - .set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL) - .statement + query.set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL).statement ) .. versionadded:: 1.4 @@ -1052,8 +1047,7 @@ def get(self, ident: _PKIdentityArgument) -> Optional[Any]: some_object = session.query(VersionedFoo).get((5, 10)) - some_object = session.query(VersionedFoo).get( - {"id": 5, "version_id": 10}) + some_object = session.query(VersionedFoo).get({"id": 5, "version_id": 10}) :meth:`_query.Query.get` is special in that it provides direct access to the identity map of the owning :class:`.Session`. @@ -1119,7 +1113,7 @@ def get(self, ident: _PKIdentityArgument) -> Optional[Any]: :return: The object instance, or ``None``. - """ + """ # noqa: E501 self._no_criterion_assertion("get", order_by=False, distinct=False) # we still implement _get_impl() so that baked query can override @@ -1563,19 +1557,22 @@ def with_entities( # Users, filtered on some arbitrary criterion # and then ordered by related email address - q = session.query(User).\ - join(User.address).\ - filter(User.name.like('%ed%')).\ - order_by(Address.email) + q = ( + session.query(User) + .join(User.address) + .filter(User.name.like("%ed%")) + .order_by(Address.email) + ) # given *only* User.id==5, Address.email, and 'q', what # would the *next* User in the result be ? - subq = q.with_entities(Address.email).\ - order_by(None).\ - filter(User.id==5).\ - subquery() - q = q.join((subq, subq.c.email < Address.email)).\ - limit(1) + subq = ( + q.with_entities(Address.email) + .order_by(None) + .filter(User.id == 5) + .subquery() + ) + q = q.join((subq, subq.c.email < Address.email)).limit(1) .. seealso:: @@ -1671,9 +1668,11 @@ def with_transformation( def filter_something(criterion): def transform(q): return q.filter(criterion) + return transform - q = q.with_transformation(filter_something(x==5)) + + q = q.with_transformation(filter_something(x == 5)) This allows ad-hoc recipes to be created for :class:`_query.Query` objects. @@ -1790,9 +1789,15 @@ def with_for_update( E.g.:: - q = sess.query(User).populate_existing().with_for_update(nowait=True, of=User) + q = ( + sess.query(User) + .populate_existing() + .with_for_update(nowait=True, of=User) + ) + + The above query on a PostgreSQL backend will render like: - The above query on a PostgreSQL backend will render like:: + .. sourcecode:: sql SELECT users.id AS users_id FROM users FOR UPDATE OF users NOWAIT @@ -1870,14 +1875,13 @@ def filter(self, *criterion: _ColumnExpressionArgument[bool]) -> Self: e.g.:: - session.query(MyClass).filter(MyClass.name == 'some name') + session.query(MyClass).filter(MyClass.name == "some name") Multiple criteria may be specified as comma separated; the effect is that they will be joined together using the :func:`.and_` function:: - session.query(MyClass).\ - filter(MyClass.name == 'some name', MyClass.id > 5) + session.query(MyClass).filter(MyClass.name == "some name", MyClass.id > 5) The criterion is any SQL expression object applicable to the WHERE clause of a select. String expressions are coerced @@ -1890,7 +1894,7 @@ def filter(self, *criterion: _ColumnExpressionArgument[bool]) -> Self: :meth:`_sql.Select.where` - v2 equivalent method. - """ + """ # noqa: E501 for crit in list(criterion): crit = coercions.expect( roles.WhereHavingRole, crit, apply_propagate_attrs=self @@ -1958,14 +1962,13 @@ def filter_by(self, **kwargs: Any) -> Self: e.g.:: - session.query(MyClass).filter_by(name = 'some name') + session.query(MyClass).filter_by(name="some name") Multiple criteria may be specified as comma separated; the effect is that they will be joined together using the :func:`.and_` function:: - session.query(MyClass).\ - filter_by(name = 'some name', id = 5) + session.query(MyClass).filter_by(name="some name", id=5) The keyword expressions are extracted from the primary entity of the query, or the last entity that was the @@ -2092,10 +2095,12 @@ def having(self, *having: _ColumnExpressionArgument[bool]) -> Self: HAVING criterion makes it possible to use filters on aggregate functions like COUNT, SUM, AVG, MAX, and MIN, eg.:: - q = session.query(User.id).\ - join(User.addresses).\ - group_by(User.id).\ - having(func.count(Address.id) > 2) + q = ( + session.query(User.id) + .join(User.addresses) + .group_by(User.id) + .having(func.count(Address.id) > 2) + ) .. seealso:: @@ -2119,8 +2124,8 @@ def union(self, *q: Query[Any]) -> Self: e.g.:: - q1 = sess.query(SomeClass).filter(SomeClass.foo=='bar') - q2 = sess.query(SomeClass).filter(SomeClass.bar=='foo') + q1 = sess.query(SomeClass).filter(SomeClass.foo == "bar") + q2 = sess.query(SomeClass).filter(SomeClass.bar == "foo") q3 = q1.union(q2) @@ -2129,7 +2134,9 @@ def union(self, *q: Query[Any]) -> Self: x.union(y).union(z).all() - will nest on each ``union()``, and produces:: + will nest on each ``union()``, and produces: + + .. sourcecode:: sql SELECT * FROM (SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y) UNION SELECT * FROM Z) @@ -2138,7 +2145,9 @@ def union(self, *q: Query[Any]) -> Self: x.union(y, z).all() - produces:: + produces: + + .. sourcecode:: sql SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y UNION SELECT * FROM Z) @@ -2250,7 +2259,9 @@ def join( q = session.query(User).join(User.addresses) Where above, the call to :meth:`_query.Query.join` along - ``User.addresses`` will result in SQL approximately equivalent to:: + ``User.addresses`` will result in SQL approximately equivalent to: + + .. sourcecode:: sql SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id @@ -2263,10 +2274,12 @@ def join( calls may be used. The relationship-bound attribute implies both the left and right side of the join at once:: - q = session.query(User).\ - join(User.orders).\ - join(Order.items).\ - join(Item.keywords) + q = ( + session.query(User) + .join(User.orders) + .join(Order.items) + .join(Item.keywords) + ) .. note:: as seen in the above example, **the order in which each call to the join() method occurs is important**. Query would not, @@ -2305,7 +2318,7 @@ def join( as the ON clause to be passed explicitly. A example that includes a SQL expression as the ON clause is as follows:: - q = session.query(User).join(Address, User.id==Address.user_id) + q = session.query(User).join(Address, User.id == Address.user_id) The above form may also use a relationship-bound attribute as the ON clause as well:: @@ -2320,11 +2333,13 @@ def join( a1 = aliased(Address) a2 = aliased(Address) - q = session.query(User).\ - join(a1, User.addresses).\ - join(a2, User.addresses).\ - filter(a1.email_address=='ed@foo.com').\ - filter(a2.email_address=='ed@bar.com') + q = ( + session.query(User) + .join(a1, User.addresses) + .join(a2, User.addresses) + .filter(a1.email_address == "ed@foo.com") + .filter(a2.email_address == "ed@bar.com") + ) The relationship-bound calling form can also specify a target entity using the :meth:`_orm.PropComparator.of_type` method; a query @@ -2333,11 +2348,13 @@ def join( a1 = aliased(Address) a2 = aliased(Address) - q = session.query(User).\ - join(User.addresses.of_type(a1)).\ - join(User.addresses.of_type(a2)).\ - filter(a1.email_address == 'ed@foo.com').\ - filter(a2.email_address == 'ed@bar.com') + q = ( + session.query(User) + .join(User.addresses.of_type(a1)) + .join(User.addresses.of_type(a2)) + .filter(a1.email_address == "ed@foo.com") + .filter(a2.email_address == "ed@bar.com") + ) **Augmenting Built-in ON Clauses** @@ -2348,7 +2365,7 @@ def join( with the default criteria using AND:: q = session.query(User).join( - User.addresses.and_(Address.email_address != 'foo@bar.com') + User.addresses.and_(Address.email_address != "foo@bar.com") ) .. versionadded:: 1.4 @@ -2361,29 +2378,28 @@ def join( appropriate ``.subquery()`` method in order to make a subquery out of a query:: - subq = session.query(Address).\ - filter(Address.email_address == 'ed@foo.com').\ - subquery() + subq = ( + session.query(Address) + .filter(Address.email_address == "ed@foo.com") + .subquery() + ) - q = session.query(User).join( - subq, User.id == subq.c.user_id - ) + q = session.query(User).join(subq, User.id == subq.c.user_id) Joining to a subquery in terms of a specific relationship and/or target entity may be achieved by linking the subquery to the entity using :func:`_orm.aliased`:: - subq = session.query(Address).\ - filter(Address.email_address == 'ed@foo.com').\ - subquery() + subq = ( + session.query(Address) + .filter(Address.email_address == "ed@foo.com") + .subquery() + ) address_subq = aliased(Address, subq) - q = session.query(User).join( - User.addresses.of_type(address_subq) - ) - + q = session.query(User).join(User.addresses.of_type(address_subq)) **Controlling what to Join From** @@ -2391,11 +2407,16 @@ def join( :class:`_query.Query` is not in line with what we want to join from, the :meth:`_query.Query.select_from` method may be used:: - q = session.query(Address).select_from(User).\ - join(User.addresses).\ - filter(User.name == 'ed') + q = ( + session.query(Address) + .select_from(User) + .join(User.addresses) + .filter(User.name == "ed") + ) + + Which will produce SQL similar to: - Which will produce SQL similar to:: + .. sourcecode:: sql SELECT address.* FROM user JOIN address ON user.id=address.user_id @@ -2499,11 +2520,16 @@ def select_from(self, *from_obj: _FromClauseArgument) -> Self: A typical example:: - q = session.query(Address).select_from(User).\ - join(User.addresses).\ - filter(User.name == 'ed') + q = ( + session.query(Address) + .select_from(User) + .join(User.addresses) + .filter(User.name == "ed") + ) + + Which produces SQL equivalent to: - Which produces SQL equivalent to:: + .. sourcecode:: sql SELECT address.* FROM user JOIN address ON user.id=address.user_id @@ -2866,7 +2892,7 @@ def column_descriptions(self) -> List[ORMColumnDescription]: Format is a list of dictionaries:: - user_alias = aliased(User, name='user2') + user_alias = aliased(User, name="user2") q = sess.query(User, User.id, user_alias) # this expression: @@ -2875,26 +2901,26 @@ def column_descriptions(self) -> List[ORMColumnDescription]: # would return: [ { - 'name':'User', - 'type':User, - 'aliased':False, - 'expr':User, - 'entity': User + "name": "User", + "type": User, + "aliased": False, + "expr": User, + "entity": User, }, { - 'name':'id', - 'type':Integer(), - 'aliased':False, - 'expr':User.id, - 'entity': User + "name": "id", + "type": Integer(), + "aliased": False, + "expr": User.id, + "entity": User, }, { - 'name':'user2', - 'type':User, - 'aliased':True, - 'expr':user_alias, - 'entity': user_alias - } + "name": "user2", + "type": User, + "aliased": True, + "expr": user_alias, + "entity": user_alias, + }, ] .. seealso:: @@ -3003,10 +3029,12 @@ def exists(self) -> Exists: e.g.:: - q = session.query(User).filter(User.name == 'fred') + q = session.query(User).filter(User.name == "fred") session.query(q.exists()) - Producing SQL similar to:: + Producing SQL similar to: + + .. sourcecode:: sql SELECT EXISTS ( SELECT 1 FROM users WHERE users.name = :name_1 @@ -3055,7 +3083,9 @@ def count(self) -> int: r"""Return a count of rows this the SQL formed by this :class:`Query` would return. - This generates the SQL for this Query as follows:: + This generates the SQL for this Query as follows: + + .. sourcecode:: sql SELECT count(1) AS count_1 FROM ( SELECT <rest of query follows...> @@ -3095,8 +3125,7 @@ def count(self) -> int: # return count of user "id" grouped # by "name" - session.query(func.count(User.id)).\ - group_by(User.name) + session.query(func.count(User.id)).group_by(User.name) from sqlalchemy import distinct @@ -3114,7 +3143,9 @@ def count(self) -> int: ) def delete( - self, synchronize_session: SynchronizeSessionArgument = "auto" + self, + synchronize_session: SynchronizeSessionArgument = "auto", + delete_args: Optional[Dict[Any, Any]] = None, ) -> int: r"""Perform a DELETE with an arbitrary WHERE clause. @@ -3122,11 +3153,11 @@ def delete( E.g.:: - sess.query(User).filter(User.age == 25).\ - delete(synchronize_session=False) + sess.query(User).filter(User.age == 25).delete(synchronize_session=False) - sess.query(User).filter(User.age == 25).\ - delete(synchronize_session='evaluate') + sess.query(User).filter(User.age == 25).delete( + synchronize_session="evaluate" + ) .. warning:: @@ -3139,6 +3170,13 @@ def delete( :ref:`orm_expression_update_delete` for a discussion of these strategies. + :param delete_args: Optional dictionary, if present will be passed + to the underlying :func:`_expression.delete` construct as the ``**kw`` + for the object. May be used to pass dialect-specific arguments such + as ``mysql_limit``. + + .. versionadded:: 2.0.37 + :return: the count of rows matched as returned by the database's "row count" feature. @@ -3146,9 +3184,9 @@ def delete( :ref:`orm_expression_update_delete` - """ + """ # noqa: E501 - bulk_del = BulkDelete(self) + bulk_del = BulkDelete(self, delete_args) if self.dispatch.before_compile_delete: for fn in self.dispatch.before_compile_delete: new_query = fn(bulk_del.query, bulk_del) @@ -3158,6 +3196,10 @@ def delete( self = bulk_del.query delete_ = sql.delete(*self._raw_columns) # type: ignore + + if delete_args: + delete_ = delete_.with_dialect_options(**delete_args) + delete_._where_criteria = self._where_criteria result: CursorResult[Any] = self.session.execute( delete_, @@ -3184,11 +3226,13 @@ def update( E.g.:: - sess.query(User).filter(User.age == 25).\ - update({User.age: User.age - 10}, synchronize_session=False) + sess.query(User).filter(User.age == 25).update( + {User.age: User.age - 10}, synchronize_session=False + ) - sess.query(User).filter(User.age == 25).\ - update({"age": User.age - 10}, synchronize_session='evaluate') + sess.query(User).filter(User.age == 25).update( + {"age": User.age - 10}, synchronize_session="evaluate" + ) .. warning:: @@ -3211,9 +3255,8 @@ def update( strategies. :param update_args: Optional dictionary, if present will be passed - to the underlying :func:`_expression.update` - construct as the ``**kw`` for - the object. May be used to pass dialect-specific arguments such + to the underlying :func:`_expression.update` construct as the ``**kw`` + for the object. May be used to pass dialect-specific arguments such as ``mysql_limit``, as well as other special arguments such as :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order`. @@ -3388,6 +3431,14 @@ def __init__( class BulkDelete(BulkUD): """BulkUD which handles DELETEs.""" + def __init__( + self, + query: Query[Any], + delete_kwargs: Optional[Dict[Any, Any]], + ): + super().__init__(query) + self.delete_kwargs = delete_kwargs + class RowReturningQuery(Query[Row[_TP]]): if TYPE_CHECKING: diff --git a/libs/sqlalchemy/orm/relationships.py b/libs/sqlalchemy/orm/relationships.py index b5e33ffdb..0d0bc7089 100644 --- a/libs/sqlalchemy/orm/relationships.py +++ b/libs/sqlalchemy/orm/relationships.py @@ -1,5 +1,5 @@ # orm/relationships.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -709,12 +709,16 @@ def in_(self, other: Any) -> NoReturn: def __eq__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 """Implement the ``==`` operator. - In a many-to-one context, such as:: + In a many-to-one context, such as: + + .. sourcecode:: text MyClass.some_prop == <some object> this will typically produce a - clause such as:: + clause such as: + + .. sourcecode:: text mytable.related_id == <some id> @@ -877,11 +881,12 @@ def any( An expression like:: session.query(MyClass).filter( - MyClass.somereference.any(SomeRelated.x==2) + MyClass.somereference.any(SomeRelated.x == 2) ) + Will produce a query like: - Will produce a query like:: + .. sourcecode:: sql SELECT * FROM my_table WHERE EXISTS (SELECT 1 FROM related WHERE related.my_id=my_table.id @@ -895,11 +900,11 @@ def any( :meth:`~.Relationship.Comparator.any` is particularly useful for testing for empty collections:: - session.query(MyClass).filter( - ~MyClass.somereference.any() - ) + session.query(MyClass).filter(~MyClass.somereference.any()) + + will produce: - will produce:: + .. sourcecode:: sql SELECT * FROM my_table WHERE NOT (EXISTS (SELECT 1 FROM related WHERE @@ -930,11 +935,12 @@ def has( An expression like:: session.query(MyClass).filter( - MyClass.somereference.has(SomeRelated.x==2) + MyClass.somereference.has(SomeRelated.x == 2) ) + Will produce a query like: - Will produce a query like:: + .. sourcecode:: sql SELECT * FROM my_table WHERE EXISTS (SELECT 1 FROM related WHERE @@ -973,7 +979,9 @@ def contains( MyClass.contains(other) - Produces a clause like:: + Produces a clause like: + + .. sourcecode:: sql mytable.id == <some id> @@ -993,7 +1001,9 @@ def contains( query(MyClass).filter(MyClass.contains(other)) - Produces a query like:: + Produces a query like: + + .. sourcecode:: sql SELECT * FROM my_table, my_association_table AS my_association_table_1 WHERE @@ -1089,11 +1099,15 @@ def adapt(col: _CE) -> _CE: def __ne__(self, other: Any) -> ColumnElement[bool]: # type: ignore[override] # noqa: E501 """Implement the ``!=`` operator. - In a many-to-one context, such as:: + In a many-to-one context, such as: + + .. sourcecode:: text MyClass.some_prop != <some object> - This will typically produce a clause such as:: + This will typically produce a clause such as: + + .. sourcecode:: sql mytable.related_id != <some id> diff --git a/libs/sqlalchemy/orm/scoping.py b/libs/sqlalchemy/orm/scoping.py index 283f4a022..a0e9f17e4 100644 --- a/libs/sqlalchemy/orm/scoping.py +++ b/libs/sqlalchemy/orm/scoping.py @@ -1,5 +1,5 @@ # orm/scoping.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -280,11 +280,13 @@ def query_property( Session = scoped_session(sessionmaker()) + class MyClass: query: QueryPropertyDescriptor = Session.query_property() + # after mappers are defined - result = MyClass.query.filter(MyClass.name=='foo').all() + result = MyClass.query.filter(MyClass.name == "foo").all() Produces instances of the session's configured query class by default. To override and use a custom implementation, provide @@ -730,9 +732,8 @@ def execute( E.g.:: from sqlalchemy import select - result = session.execute( - select(User).where(User.id == 5) - ) + + result = session.execute(select(User).where(User.id == 5)) The API contract of :meth:`_orm.Session.execute` is similar to that of :meth:`_engine.Connection.execute`, the :term:`2.0 style` version @@ -962,10 +963,7 @@ def get( some_object = session.get(VersionedFoo, (5, 10)) - some_object = session.get( - VersionedFoo, - {"id": 5, "version_id": 10} - ) + some_object = session.get(VersionedFoo, {"id": 5, "version_id": 10}) .. versionadded:: 1.4 Added :meth:`_orm.Session.get`, which is moved from the now legacy :meth:`_orm.Query.get` method. diff --git a/libs/sqlalchemy/orm/session.py b/libs/sqlalchemy/orm/session.py index eb81f16e0..6cd7cd633 100644 --- a/libs/sqlalchemy/orm/session.py +++ b/libs/sqlalchemy/orm/session.py @@ -1,5 +1,5 @@ # orm/session.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -1569,12 +1569,16 @@ def __init__( operation. The complete heuristics for resolution are described at :meth:`.Session.get_bind`. Usage looks like:: - Session = sessionmaker(binds={ - SomeMappedClass: create_engine('postgresql+psycopg2://engine1'), - SomeDeclarativeBase: create_engine('postgresql+psycopg2://engine2'), - some_mapper: create_engine('postgresql+psycopg2://engine3'), - some_table: create_engine('postgresql+psycopg2://engine4'), - }) + Session = sessionmaker( + binds={ + SomeMappedClass: create_engine("postgresql+psycopg2://engine1"), + SomeDeclarativeBase: create_engine( + "postgresql+psycopg2://engine2" + ), + some_mapper: create_engine("postgresql+psycopg2://engine3"), + some_table: create_engine("postgresql+psycopg2://engine4"), + } + ) .. seealso:: @@ -1769,7 +1773,7 @@ def __init__( # the idea is that at some point NO_ARG will warn that in the future # the default will switch to close_resets_only=False. - if close_resets_only or close_resets_only is _NoArg.NO_ARG: + if close_resets_only in (True, _NoArg.NO_ARG): self._close_state = _SessionCloseState.CLOSE_IS_RESET else: self._close_state = _SessionCloseState.ACTIVE @@ -2316,9 +2320,8 @@ def execute( E.g.:: from sqlalchemy import select - result = session.execute( - select(User).where(User.id == 5) - ) + + result = session.execute(select(User).where(User.id == 5)) The API contract of :meth:`_orm.Session.execute` is similar to that of :meth:`_engine.Connection.execute`, the :term:`2.0 style` version @@ -2970,7 +2973,7 @@ def _identity_lookup( e.g.:: - obj = session._identity_lookup(inspect(SomeClass), (1, )) + obj = session._identity_lookup(inspect(SomeClass), (1,)) :param mapper: mapper in use :param primary_key_identity: the primary key we are searching for, as @@ -3041,7 +3044,8 @@ def no_autoflush(self) -> Iterator[Session]: @util.langhelpers.tag_method_for_warnings( "This warning originated from the Session 'autoflush' process, " "which was invoked automatically in response to a user-initiated " - "operation.", + "operation. Consider using ``no_autoflush`` context manager if this " + "warning happended while initializing objects.", sa_exc.SAWarning, ) def _autoflush(self) -> None: @@ -3597,10 +3601,7 @@ def get( some_object = session.get(VersionedFoo, (5, 10)) - some_object = session.get( - VersionedFoo, - {"id": 5, "version_id": 10} - ) + some_object = session.get(VersionedFoo, {"id": 5, "version_id": 10}) .. versionadded:: 1.4 Added :meth:`_orm.Session.get`, which is moved from the now legacy :meth:`_orm.Query.get` method. @@ -3689,7 +3690,7 @@ def get( :return: The object instance, or ``None``. - """ + """ # noqa: E501 return self._get_impl( entity, ident, @@ -4942,7 +4943,7 @@ class sessionmaker(_SessionClassMethods, Generic[_S]): # an Engine, which the Session will use for connection # resources - engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/') + engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/") Session = sessionmaker(engine) @@ -4995,7 +4996,7 @@ class sessionmaker(_SessionClassMethods, Generic[_S]): with engine.connect() as connection: with Session(bind=connection) as session: - # work with session + ... # work with session The class also includes a method :meth:`_orm.sessionmaker.configure`, which can be used to specify additional keyword arguments to the factory, which @@ -5010,7 +5011,7 @@ class sessionmaker(_SessionClassMethods, Generic[_S]): # ... later, when an engine URL is read from a configuration # file or other events allow the engine to be created - engine = create_engine('sqlite:///foo.db') + engine = create_engine("sqlite:///foo.db") Session.configure(bind=engine) sess = Session() @@ -5148,7 +5149,7 @@ def configure(self, **new_kw: Any) -> None: Session = sessionmaker() - Session.configure(bind=create_engine('sqlite://')) + Session.configure(bind=create_engine("sqlite://")) """ self.kw.update(new_kw) diff --git a/libs/sqlalchemy/orm/state.py b/libs/sqlalchemy/orm/state.py index 9dfd7f64f..d4bbf9209 100644 --- a/libs/sqlalchemy/orm/state.py +++ b/libs/sqlalchemy/orm/state.py @@ -1,5 +1,5 @@ # orm/state.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/state_changes.py b/libs/sqlalchemy/orm/state_changes.py index 56963c6af..10e417e85 100644 --- a/libs/sqlalchemy/orm/state_changes.py +++ b/libs/sqlalchemy/orm/state_changes.py @@ -1,5 +1,5 @@ # orm/state_changes.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/strategies.py b/libs/sqlalchemy/orm/strategies.py index c89a12efd..f2d165145 100644 --- a/libs/sqlalchemy/orm/strategies.py +++ b/libs/sqlalchemy/orm/strategies.py @@ -1,5 +1,5 @@ # orm/strategies.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/strategy_options.py b/libs/sqlalchemy/orm/strategy_options.py index b4bfea147..f4f292ee7 100644 --- a/libs/sqlalchemy/orm/strategy_options.py +++ b/libs/sqlalchemy/orm/strategy_options.py @@ -1,5 +1,5 @@ # orm/strategy_options.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -109,9 +109,7 @@ def contains_eager( The option is used in conjunction with an explicit join that loads the desired rows, i.e.:: - sess.query(Order).join(Order.user).options( - contains_eager(Order.user) - ) + sess.query(Order).join(Order.user).options(contains_eager(Order.user)) The above query would join from the ``Order`` entity to its related ``User`` entity, and the returned ``Order`` objects would have the @@ -257,15 +255,11 @@ def joinedload( select(User).options(joinedload(User.orders)) # joined-load Order.items and then Item.keywords - select(Order).options( - joinedload(Order.items).joinedload(Item.keywords) - ) + select(Order).options(joinedload(Order.items).joinedload(Item.keywords)) # lazily load Order.items, but when Items are loaded, # joined-load the keywords collection - select(Order).options( - lazyload(Order.items).joinedload(Item.keywords) - ) + select(Order).options(lazyload(Order.items).joinedload(Item.keywords)) :param innerjoin: if ``True``, indicates that the joined eager load should use an inner join instead of the default of left outer join:: @@ -276,9 +270,7 @@ def joinedload( OUTER and others INNER, right-nested joins are used to link them:: select(A).options( - joinedload(A.bs, innerjoin=False).joinedload( - B.cs, innerjoin=True - ) + joinedload(A.bs, innerjoin=False).joinedload(B.cs, innerjoin=True) ) The above query, linking A.bs via "outer" join and B.cs via "inner" @@ -293,10 +285,7 @@ def joinedload( will render as LEFT OUTER JOIN. For example, supposing ``A.bs`` is an outerjoin:: - select(A).options( - joinedload(A.bs).joinedload(B.cs, innerjoin="unnested") - ) - + select(A).options(joinedload(A.bs).joinedload(B.cs, innerjoin="unnested")) The above join will render as "a LEFT OUTER JOIN b LEFT OUTER JOIN c", rather than as "a LEFT OUTER JOIN (b JOIN c)". @@ -326,7 +315,7 @@ def joinedload( :ref:`joined_eager_loading` - """ + """ # noqa: E501 loader = self._set_relationship_strategy( attr, {"lazy": "joined"}, @@ -357,10 +346,7 @@ def subqueryload(self, attr: _AttrType) -> Self: # lazily load Order.items, but when Items are loaded, # subquery-load the keywords collection - select(Order).options( - lazyload(Order.items).subqueryload(Item.keywords) - ) - + select(Order).options(lazyload(Order.items).subqueryload(Item.keywords)) .. seealso:: @@ -394,9 +380,7 @@ def selectinload( # lazily load Order.items, but when Items are loaded, # selectin-load the keywords collection - select(Order).options( - lazyload(Order.items).selectinload(Item.keywords) - ) + select(Order).options(lazyload(Order.items).selectinload(Item.keywords)) :param recursion_depth: optional int; when set to a positive integer in conjunction with a self-referential relationship, @@ -609,8 +593,7 @@ def defer(self, key: _AttrType, raiseload: bool = False) -> Self: from sqlalchemy.orm import defer session.query(MyClass).options( - defer(MyClass.attribute_one), - defer(MyClass.attribute_two) + defer(MyClass.attribute_one), defer(MyClass.attribute_two) ) To specify a deferred load of an attribute on a related class, @@ -630,7 +613,7 @@ def defer(self, key: _AttrType, raiseload: bool = False) -> Self: defaultload(MyClass.someattr).options( defer(RelatedClass.some_column), defer(RelatedClass.some_other_column), - defer(RelatedClass.another_column) + defer(RelatedClass.another_column), ) ) @@ -676,14 +659,10 @@ def undefer(self, key: _AttrType) -> Self: ) # undefer all columns specific to a single class using Load + * - session.query(MyClass, MyOtherClass).options( - Load(MyClass).undefer("*") - ) + session.query(MyClass, MyOtherClass).options(Load(MyClass).undefer("*")) # undefer a column on a related object - select(MyClass).options( - defaultload(MyClass.items).undefer(MyClass.text) - ) + select(MyClass).options(defaultload(MyClass.items).undefer(MyClass.text)) :param key: Attribute to be undeferred. @@ -696,7 +675,7 @@ def undefer(self, key: _AttrType) -> Self: :func:`_orm.undefer_group` - """ + """ # noqa: E501 return self._set_column_strategy( (key,), {"deferred": False, "instrument": True} ) @@ -1218,13 +1197,11 @@ def options(self, *opts: _AbstractLoad) -> Self: query = session.query(Author) query = query.options( - joinedload(Author.book).options( - load_only(Book.summary, Book.excerpt), - joinedload(Book.citations).options( - joinedload(Citation.author) - ) - ) - ) + joinedload(Author.book).options( + load_only(Book.summary, Book.excerpt), + joinedload(Book.citations).options(joinedload(Citation.author)), + ) + ) :param \*opts: A series of loader option objects (ultimately :class:`_orm.Load` objects) which should be applied to the path @@ -1668,13 +1645,17 @@ def _adjust_effective_path_for_current_path( loads, and adjusts the given path to be relative to the current_path. - E.g. given a loader path and current path:: + E.g. given a loader path and current path: + + .. sourcecode:: text lp: User -> orders -> Order -> items -> Item -> keywords -> Keyword cp: User -> orders -> Order -> items - The adjusted path would be:: + The adjusted path would be: + + .. sourcecode:: text Item -> keywords -> Keyword @@ -2155,11 +2136,11 @@ class _TokenStrategyLoad(_LoadElement): e.g.:: - raiseload('*') - Load(User).lazyload('*') - defer('*') + raiseload("*") + Load(User).lazyload("*") + defer("*") load_only(User.name, User.email) # will create a defer('*') - joinedload(User.addresses).raiseload('*') + joinedload(User.addresses).raiseload("*") """ diff --git a/libs/sqlalchemy/orm/sync.py b/libs/sqlalchemy/orm/sync.py index db09a3e90..8f85a41a2 100644 --- a/libs/sqlalchemy/orm/sync.py +++ b/libs/sqlalchemy/orm/sync.py @@ -1,5 +1,5 @@ # orm/sync.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/unitofwork.py b/libs/sqlalchemy/orm/unitofwork.py index 7e2df2b0e..80897f292 100644 --- a/libs/sqlalchemy/orm/unitofwork.py +++ b/libs/sqlalchemy/orm/unitofwork.py @@ -1,5 +1,5 @@ # orm/unitofwork.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/orm/util.py b/libs/sqlalchemy/orm/util.py index 69556751a..48282b2d5 100644 --- a/libs/sqlalchemy/orm/util.py +++ b/libs/sqlalchemy/orm/util.py @@ -1,5 +1,5 @@ # orm/util.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -86,15 +86,12 @@ from ..sql.selectable import FromClause from ..util.langhelpers import MemoizedSlots from ..util.typing import de_stringify_annotation as _de_stringify_annotation -from ..util.typing import ( - de_stringify_union_elements as _de_stringify_union_elements, -) from ..util.typing import eval_name_only as _eval_name_only from ..util.typing import fixup_container_fwd_refs +from ..util.typing import get_origin from ..util.typing import is_origin_of_cls from ..util.typing import Literal from ..util.typing import Protocol -from ..util.typing import typing_get_origin if typing.TYPE_CHECKING: from ._typing import _EntityType @@ -123,7 +120,6 @@ from ..sql.selectable import Selectable from ..sql.visitors import anon_map from ..util.typing import _AnnotationScanType - from ..util.typing import ArgsTypeProcotol _T = TypeVar("_T", bound=Any) @@ -140,7 +136,6 @@ ) ) - _de_stringify_partial = functools.partial( functools.partial, locals_=util.immutabledict( @@ -173,23 +168,6 @@ def __call__( ) -class _DeStringifyUnionElements(Protocol): - def __call__( - self, - cls: Type[Any], - annotation: ArgsTypeProcotol, - originating_module: str, - *, - str_cleanup_fn: Optional[Callable[[str, str], str]] = None, - ) -> Type[Any]: ... - - -de_stringify_union_elements = cast( - _DeStringifyUnionElements, - _de_stringify_partial(_de_stringify_union_elements), -) - - class _EvalNameOnly(Protocol): def __call__(self, name: str, module_name: str) -> Any: ... @@ -475,9 +453,7 @@ def identity_key( E.g.:: - >>> row = engine.execute(\ - text("select * from table where a=1 and b=2")\ - ).first() + >>> row = engine.execute(text("select * from table where a=1 and b=2")).first() >>> identity_key(MyClass, row=row) (<class '__main__.MyClass'>, (1, 2), None) @@ -488,7 +464,7 @@ def identity_key( .. versionadded:: 1.2 added identity_token - """ + """ # noqa: E501 if class_ is not None: mapper = class_mapper(class_) if row is None: @@ -666,9 +642,9 @@ class AliasedClass( # find all pairs of users with the same name user_alias = aliased(User) - session.query(User, user_alias).\ - join((user_alias, User.id > user_alias.id)).\ - filter(User.name == user_alias.name) + session.query(User, user_alias).join( + (user_alias, User.id > user_alias.id) + ).filter(User.name == user_alias.name) :class:`.AliasedClass` is also capable of mapping an existing mapped class to an entirely new selectable, provided this selectable is column- @@ -692,6 +668,7 @@ class to an entirely new selectable, provided this selectable is column- using :func:`_sa.inspect`:: from sqlalchemy import inspect + my_alias = aliased(MyClass) insp = inspect(my_alias) @@ -1544,7 +1521,7 @@ def _inspect_mc( def _inspect_generic_alias( class_: Type[_O], ) -> Optional[Mapper[_O]]: - origin = cast("Type[_O]", typing_get_origin(class_)) + origin = cast("Type[_O]", get_origin(class_)) return _inspect_mc(origin) @@ -1601,8 +1578,7 @@ def __init__( bn = Bundle("mybundle", MyClass.x, MyClass.y) - for row in session.query(bn).filter( - bn.c.x == 5).filter(bn.c.y == 4): + for row in session.query(bn).filter(bn.c.x == 5).filter(bn.c.y == 4): print(row.mybundle.x, row.mybundle.y) :param name: name of the bundle. @@ -1611,7 +1587,7 @@ def __init__( can be returned as a "single entity" outside of any enclosing tuple in the same manner as a mapped entity. - """ + """ # noqa: E501 self.name = self._label = name coerced_exprs = [ coercions.expect( @@ -1666,19 +1642,19 @@ def entity_namespace( Nesting of bundles is also supported:: - b1 = Bundle("b1", - Bundle('b2', MyClass.a, MyClass.b), - Bundle('b3', MyClass.x, MyClass.y) - ) + b1 = Bundle( + "b1", + Bundle("b2", MyClass.a, MyClass.b), + Bundle("b3", MyClass.x, MyClass.y), + ) - q = sess.query(b1).filter( - b1.c.b2.c.a == 5).filter(b1.c.b3.c.y == 9) + q = sess.query(b1).filter(b1.c.b2.c.a == 5).filter(b1.c.b3.c.y == 9) .. seealso:: :attr:`.Bundle.c` - """ + """ # noqa: E501 c: ReadOnlyColumnCollection[str, KeyedColumnElement[Any]] """An alias for :attr:`.Bundle.columns`.""" @@ -1744,25 +1720,24 @@ def create_row_processor( from sqlalchemy.orm import Bundle + class DictBundle(Bundle): def create_row_processor(self, query, procs, labels): - 'Override create_row_processor to return values as - dictionaries' + "Override create_row_processor to return values as dictionaries" def proc(row): - return dict( - zip(labels, (proc(row) for proc in procs)) - ) + return dict(zip(labels, (proc(row) for proc in procs))) + return proc A result from the above :class:`_orm.Bundle` will return dictionary values:: - bn = DictBundle('mybundle', MyClass.data1, MyClass.data2) - for row in session.execute(select(bn)).where(bn.c.data1 == 'd1'): - print(row.mybundle['data1'], row.mybundle['data2']) + bn = DictBundle("mybundle", MyClass.data1, MyClass.data2) + for row in session.execute(select(bn)).where(bn.c.data1 == "d1"): + print(row.mybundle["data1"], row.mybundle["data2"]) - """ + """ # noqa: E501 keyed_tuple = result_tuple(labels, [() for l in labels]) def proc(row: Row[Any]) -> Any: @@ -1988,7 +1963,6 @@ def with_parent( stmt = select(Address).where(with_parent(some_user, User.addresses)) - The SQL rendered is the same as that rendered when a lazy loader would fire off from the given parent on that attribute, meaning that the appropriate state is taken from the parent object in @@ -2001,9 +1975,7 @@ def with_parent( a1 = aliased(Address) a2 = aliased(Address) - stmt = select(a1, a2).where( - with_parent(u1, User.addresses.of_type(a2)) - ) + stmt = select(a1, a2).where(with_parent(u1, User.addresses.of_type(a2))) The above use is equivalent to using the :func:`_orm.with_parent.from_entity` argument:: @@ -2028,7 +2000,7 @@ def with_parent( .. versionadded:: 1.2 - """ + """ # noqa: E501 prop_t: RelationshipProperty[Any] if isinstance(prop, str): @@ -2122,14 +2094,13 @@ def _entity_corresponds_to_use_path_impl( someoption(A).someoption(C.d) # -> fn(A, C) -> False a1 = aliased(A) - someoption(a1).someoption(A.b) # -> fn(a1, A) -> False - someoption(a1).someoption(a1.b) # -> fn(a1, a1) -> True + someoption(a1).someoption(A.b) # -> fn(a1, A) -> False + someoption(a1).someoption(a1.b) # -> fn(a1, a1) -> True wp = with_polymorphic(A, [A1, A2]) someoption(wp).someoption(A1.foo) # -> fn(wp, A1) -> False someoption(wp).someoption(wp.A1.foo) # -> fn(wp, wp.A1) -> True - """ if insp_is_aliased_class(given): return ( @@ -2238,7 +2209,7 @@ def _cleanup_mapped_str_annotation( inner: Optional[Match[str]] - mm = re.match(r"^(.+?)\[(.+)\]$", annotation) + mm = re.match(r"^([^ \|]+?)\[(.+)\]$", annotation) if not mm: return annotation @@ -2278,7 +2249,7 @@ def _cleanup_mapped_str_annotation( while True: stack.append(real_symbol if mm is inner else inner.group(1)) g2 = inner.group(2) - inner = re.match(r"^(.+?)\[(.+)\]$", g2) + inner = re.match(r"^([^ \|]+?)\[(.+)\]$", g2) if inner is None: stack.append(g2) break @@ -2300,8 +2271,10 @@ def _cleanup_mapped_str_annotation( # ['Mapped', "'Optional[Dict[str, str]]'"] not re.match(r"""^["'].*["']$""", stack[-1]) # avoid further generics like Dict[] such as - # ['Mapped', 'dict[str, str] | None'] - and not re.match(r".*\[.*\]", stack[-1]) + # ['Mapped', 'dict[str, str] | None'], + # ['Mapped', 'list[int] | list[str]'], + # ['Mapped', 'Union[list[int], list[str]]'], + and not re.search(r"[\[\]]", stack[-1]) ): stripchars = "\"' " stack[-1] = ", ".join( @@ -2341,6 +2314,11 @@ def _extract_mapped_subtype( return None try: + # destringify the "outside" of the annotation. note we are not + # adding include_generic so it will *not* dig into generic contents, + # which will remain as ForwardRef or plain str under future annotations + # mode. The full destringify happens later when mapped_column goes + # to do a full lookup in the registry type_annotations_map. annotated = de_stringify_annotation( cls, raw_annotation, diff --git a/libs/sqlalchemy/orm/writeonly.py b/libs/sqlalchemy/orm/writeonly.py index 5680cc70e..ac034a09e 100644 --- a/libs/sqlalchemy/orm/writeonly.py +++ b/libs/sqlalchemy/orm/writeonly.py @@ -1,5 +1,5 @@ # orm/writeonly.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/pool/__init__.py b/libs/sqlalchemy/pool/__init__.py index 29fd65293..51bf0ec79 100644 --- a/libs/sqlalchemy/pool/__init__.py +++ b/libs/sqlalchemy/pool/__init__.py @@ -1,5 +1,5 @@ # pool/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/pool/base.py b/libs/sqlalchemy/pool/base.py index 98d202789..34d022543 100644 --- a/libs/sqlalchemy/pool/base.py +++ b/libs/sqlalchemy/pool/base.py @@ -1,5 +1,5 @@ # pool/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/pool/events.py b/libs/sqlalchemy/pool/events.py index 4b4f4e478..4ceb260f7 100644 --- a/libs/sqlalchemy/pool/events.py +++ b/libs/sqlalchemy/pool/events.py @@ -1,5 +1,5 @@ # pool/events.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -35,10 +35,12 @@ class PoolEvents(event.Events[Pool]): from sqlalchemy import event + def my_on_checkout(dbapi_conn, connection_rec, connection_proxy): "handle an on checkout event" - event.listen(Pool, 'checkout', my_on_checkout) + + event.listen(Pool, "checkout", my_on_checkout) In addition to accepting the :class:`_pool.Pool` class and :class:`_pool.Pool` instances, :class:`_events.PoolEvents` also accepts @@ -49,7 +51,7 @@ def my_on_checkout(dbapi_conn, connection_rec, connection_proxy): engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test") # will associate with engine.pool - event.listen(engine, 'checkout', my_on_checkout) + event.listen(engine, "checkout", my_on_checkout) """ # noqa: E501 diff --git a/libs/sqlalchemy/pool/impl.py b/libs/sqlalchemy/pool/impl.py index 157455cbe..f2b951d8e 100644 --- a/libs/sqlalchemy/pool/impl.py +++ b/libs/sqlalchemy/pool/impl.py @@ -1,5 +1,5 @@ # pool/impl.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/schema.py b/libs/sqlalchemy/schema.py index 9edca4e5c..32adc9bb2 100644 --- a/libs/sqlalchemy/schema.py +++ b/libs/sqlalchemy/schema.py @@ -1,5 +1,5 @@ # schema.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/__init__.py b/libs/sqlalchemy/sql/__init__.py index 9e0d2ca2a..188f709d7 100644 --- a/libs/sqlalchemy/sql/__init__.py +++ b/libs/sqlalchemy/sql/__init__.py @@ -1,5 +1,5 @@ # sql/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/_dml_constructors.py b/libs/sqlalchemy/sql/_dml_constructors.py index a7ead521f..0a6f60115 100644 --- a/libs/sqlalchemy/sql/_dml_constructors.py +++ b/libs/sqlalchemy/sql/_dml_constructors.py @@ -1,5 +1,5 @@ # sql/_dml_constructors.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -24,10 +24,7 @@ def insert(table: _DMLTableArgument) -> Insert: from sqlalchemy import insert - stmt = ( - insert(user_table). - values(name='username', fullname='Full Username') - ) + stmt = insert(user_table).values(name="username", fullname="Full Username") Similar functionality is available via the :meth:`_expression.TableClause.insert` method on @@ -78,7 +75,7 @@ def insert(table: _DMLTableArgument) -> Insert: :ref:`tutorial_core_insert` - in the :ref:`unified_tutorial` - """ + """ # noqa: E501 return Insert(table) @@ -90,9 +87,7 @@ def update(table: _DMLTableArgument) -> Update: from sqlalchemy import update stmt = ( - update(user_table). - where(user_table.c.id == 5). - values(name='user #5') + update(user_table).where(user_table.c.id == 5).values(name="user #5") ) Similar functionality is available via the @@ -109,7 +104,7 @@ def update(table: _DMLTableArgument) -> Update: :ref:`tutorial_core_update_delete` - in the :ref:`unified_tutorial` - """ + """ # noqa: E501 return Update(table) @@ -120,10 +115,7 @@ def delete(table: _DMLTableArgument) -> Delete: from sqlalchemy import delete - stmt = ( - delete(user_table). - where(user_table.c.id == 5) - ) + stmt = delete(user_table).where(user_table.c.id == 5) Similar functionality is available via the :meth:`_expression.TableClause.delete` method on diff --git a/libs/sqlalchemy/sql/_elements_constructors.py b/libs/sqlalchemy/sql/_elements_constructors.py index bdc0534ab..b628fcc9b 100644 --- a/libs/sqlalchemy/sql/_elements_constructors.py +++ b/libs/sqlalchemy/sql/_elements_constructors.py @@ -1,5 +1,5 @@ # sql/_elements_constructors.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -125,11 +125,8 @@ def and_( # type: ignore[empty-body] from sqlalchemy import and_ stmt = select(users_table).where( - and_( - users_table.c.name == 'wendy', - users_table.c.enrolled == True - ) - ) + and_(users_table.c.name == "wendy", users_table.c.enrolled == True) + ) The :func:`.and_` conjunction is also available using the Python ``&`` operator (though note that compound expressions @@ -137,9 +134,8 @@ def and_( # type: ignore[empty-body] operator precedence behavior):: stmt = select(users_table).where( - (users_table.c.name == 'wendy') & - (users_table.c.enrolled == True) - ) + (users_table.c.name == "wendy") & (users_table.c.enrolled == True) + ) The :func:`.and_` operation is also implicit in some cases; the :meth:`_expression.Select.where` @@ -147,9 +143,11 @@ def and_( # type: ignore[empty-body] times against a statement, which will have the effect of each clause being combined using :func:`.and_`:: - stmt = select(users_table).\ - where(users_table.c.name == 'wendy').\ - where(users_table.c.enrolled == True) + stmt = ( + select(users_table) + .where(users_table.c.name == "wendy") + .where(users_table.c.enrolled == True) + ) The :func:`.and_` construct must be given at least one positional argument in order to be valid; a :func:`.and_` construct with no @@ -159,6 +157,7 @@ def and_( # type: ignore[empty-body] specified:: from sqlalchemy import true + criteria = and_(true(), *expressions) The above expression will compile to SQL as the expression ``true`` @@ -190,11 +189,8 @@ def and_(*clauses): # noqa: F811 from sqlalchemy import and_ stmt = select(users_table).where( - and_( - users_table.c.name == 'wendy', - users_table.c.enrolled == True - ) - ) + and_(users_table.c.name == "wendy", users_table.c.enrolled == True) + ) The :func:`.and_` conjunction is also available using the Python ``&`` operator (though note that compound expressions @@ -202,9 +198,8 @@ def and_(*clauses): # noqa: F811 operator precedence behavior):: stmt = select(users_table).where( - (users_table.c.name == 'wendy') & - (users_table.c.enrolled == True) - ) + (users_table.c.name == "wendy") & (users_table.c.enrolled == True) + ) The :func:`.and_` operation is also implicit in some cases; the :meth:`_expression.Select.where` @@ -212,9 +207,11 @@ def and_(*clauses): # noqa: F811 times against a statement, which will have the effect of each clause being combined using :func:`.and_`:: - stmt = select(users_table).\ - where(users_table.c.name == 'wendy').\ - where(users_table.c.enrolled == True) + stmt = ( + select(users_table) + .where(users_table.c.name == "wendy") + .where(users_table.c.enrolled == True) + ) The :func:`.and_` construct must be given at least one positional argument in order to be valid; a :func:`.and_` construct with no @@ -224,6 +221,7 @@ def and_(*clauses): # noqa: F811 specified:: from sqlalchemy import true + criteria = and_(true(), *expressions) The above expression will compile to SQL as the expression ``true`` @@ -241,7 +239,7 @@ def and_(*clauses): # noqa: F811 :func:`.or_` - """ + """ # noqa: E501 return BooleanClauseList.and_(*clauses) @@ -307,9 +305,12 @@ def asc( e.g.:: from sqlalchemy import asc + stmt = select(users_table).order_by(asc(users_table.c.name)) - will produce SQL as:: + will produce SQL as: + + .. sourcecode:: sql SELECT id, name FROM user ORDER BY name ASC @@ -346,9 +347,11 @@ def collate( e.g.:: - collate(mycolumn, 'utf8_bin') + collate(mycolumn, "utf8_bin") + + produces: - produces:: + .. sourcecode:: sql mycolumn COLLATE utf8_bin @@ -373,9 +376,12 @@ def between( E.g.:: from sqlalchemy import between + stmt = select(users_table).where(between(users_table.c.id, 5, 7)) - Would produce SQL resembling:: + Would produce SQL resembling: + + .. sourcecode:: sql SELECT id, name FROM user WHERE id BETWEEN :id_1 AND :id_2 @@ -497,7 +503,9 @@ def bindparam( users_table.c.name == bindparam("username") ) - The above statement, when rendered, will produce SQL similar to:: + The above statement, when rendered, will produce SQL similar to: + + .. sourcecode:: sql SELECT id, name FROM user WHERE name = :username @@ -532,7 +540,7 @@ def bindparam( coerced into fixed :func:`.bindparam` constructs. For example, given a comparison operation such as:: - expr = users_table.c.name == 'Wendy' + expr = users_table.c.name == "Wendy" The above expression will produce a :class:`.BinaryExpression` construct, where the left side is the :class:`_schema.Column` object @@ -540,9 +548,11 @@ def bindparam( :class:`.BindParameter` representing the literal value:: print(repr(expr.right)) - BindParameter('%(4327771088 name)s', 'Wendy', type_=String()) + BindParameter("%(4327771088 name)s", "Wendy", type_=String()) - The expression above will render SQL such as:: + The expression above will render SQL such as: + + .. sourcecode:: sql user.name = :name_1 @@ -551,10 +561,12 @@ def bindparam( along where it is later used within statement execution. If we invoke a statement like the following:: - stmt = select(users_table).where(users_table.c.name == 'Wendy') + stmt = select(users_table).where(users_table.c.name == "Wendy") result = connection.execute(stmt) - We would see SQL logging output as:: + We would see SQL logging output as: + + .. sourcecode:: sql SELECT "user".id, "user".name FROM "user" @@ -574,7 +586,9 @@ def bindparam( stmt = users_table.insert() result = connection.execute(stmt, {"name": "Wendy"}) - The above will produce SQL output as:: + The above will produce SQL output as: + + .. sourcecode:: sql INSERT INTO "user" (name) VALUES (%(name)s) {'name': 'Wendy'} @@ -647,12 +661,12 @@ def bindparam( :param quote: True if this parameter name requires quoting and is not currently known as a SQLAlchemy reserved word; this currently - only applies to the Oracle backend, where bound names must + only applies to the Oracle Database backends, where bound names must sometimes be quoted. :param isoutparam: if True, the parameter should be treated like a stored procedure - "OUT" parameter. This applies to backends such as Oracle which + "OUT" parameter. This applies to backends such as Oracle Database which support OUT parameters. :param expanding: @@ -738,16 +752,17 @@ def case( from sqlalchemy import case - stmt = select(users_table).\ - where( - case( - (users_table.c.name == 'wendy', 'W'), - (users_table.c.name == 'jack', 'J'), - else_='E' - ) - ) + stmt = select(users_table).where( + case( + (users_table.c.name == "wendy", "W"), + (users_table.c.name == "jack", "J"), + else_="E", + ) + ) + + The above statement will produce SQL resembling: - The above statement will produce SQL resembling:: + .. sourcecode:: sql SELECT id, name FROM user WHERE CASE @@ -765,14 +780,9 @@ def case( compared against keyed to result expressions. The statement below is equivalent to the preceding statement:: - stmt = select(users_table).\ - where( - case( - {"wendy": "W", "jack": "J"}, - value=users_table.c.name, - else_='E' - ) - ) + stmt = select(users_table).where( + case({"wendy": "W", "jack": "J"}, value=users_table.c.name, else_="E") + ) The values which are accepted as result values in :paramref:`.case.whens` as well as with :paramref:`.case.else_` are @@ -787,20 +797,16 @@ def case( from sqlalchemy import case, literal_column case( - ( - orderline.c.qty > 100, - literal_column("'greaterthan100'") - ), - ( - orderline.c.qty > 10, - literal_column("'greaterthan10'") - ), - else_=literal_column("'lessthan10'") + (orderline.c.qty > 100, literal_column("'greaterthan100'")), + (orderline.c.qty > 10, literal_column("'greaterthan10'")), + else_=literal_column("'lessthan10'"), ) The above will render the given constants without using bound parameters for the result values (but still for the comparison - values), as in:: + values), as in: + + .. sourcecode:: sql CASE WHEN (orderline.qty > :qty_1) THEN 'greaterthan100' @@ -821,8 +827,8 @@ def case( resulting value, e.g.:: case( - (users_table.c.name == 'wendy', 'W'), - (users_table.c.name == 'jack', 'J') + (users_table.c.name == "wendy", "W"), + (users_table.c.name == "jack", "J"), ) In the second form, it accepts a Python dictionary of comparison @@ -830,10 +836,7 @@ def case( :paramref:`.case.value` to be present, and values will be compared using the ``==`` operator, e.g.:: - case( - {"wendy": "W", "jack": "J"}, - value=users_table.c.name - ) + case({"wendy": "W", "jack": "J"}, value=users_table.c.name) :param value: An optional SQL expression which will be used as a fixed "comparison point" for candidate values within a dictionary @@ -846,7 +849,7 @@ def case( expressions evaluate to true. - """ + """ # noqa: E501 return Case(*whens, value=value, else_=else_) @@ -864,7 +867,9 @@ def cast( stmt = select(cast(product_table.c.unit_price, Numeric(10, 4))) - The above statement will produce SQL resembling:: + The above statement will produce SQL resembling: + + .. sourcecode:: sql SELECT CAST(unit_price AS NUMERIC(10, 4)) FROM product @@ -933,11 +938,11 @@ def try_cast( from sqlalchemy import select, try_cast, Numeric - stmt = select( - try_cast(product_table.c.unit_price, Numeric(10, 4)) - ) + stmt = select(try_cast(product_table.c.unit_price, Numeric(10, 4))) - The above would render on Microsoft SQL Server as:: + The above would render on Microsoft SQL Server as: + + .. sourcecode:: sql SELECT TRY_CAST (product_table.unit_price AS NUMERIC(10, 4)) FROM product_table @@ -968,7 +973,9 @@ def column( id, name = column("id"), column("name") stmt = select(id, name).select_from("user") - The above statement would produce SQL like:: + The above statement would produce SQL like: + + .. sourcecode:: sql SELECT id, name FROM user @@ -1004,13 +1011,14 @@ def column( from sqlalchemy import table, column, select - user = table("user", - column("id"), - column("name"), - column("description"), + user = table( + "user", + column("id"), + column("name"), + column("description"), ) - stmt = select(user.c.description).where(user.c.name == 'wendy') + stmt = select(user.c.description).where(user.c.name == "wendy") A :func:`_expression.column` / :func:`.table` construct like that illustrated @@ -1057,7 +1065,9 @@ def desc( stmt = select(users_table).order_by(desc(users_table.c.name)) - will produce SQL as:: + will produce SQL as: + + .. sourcecode:: sql SELECT id, name FROM user ORDER BY name DESC @@ -1096,9 +1106,12 @@ def distinct(expr: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: an aggregate function, as in:: from sqlalchemy import distinct, func + stmt = select(users_table.c.id, func.count(distinct(users_table.c.name))) - The above would produce an statement resembling:: + The above would produce an statement resembling: + + .. sourcecode:: sql SELECT user.id, count(DISTINCT user.name) FROM user @@ -1170,9 +1183,10 @@ def extract(field: str, expr: _ColumnExpressionArgument[Any]) -> Extract: from sqlalchemy import extract from sqlalchemy import table, column - logged_table = table("user", - column("id"), - column("date_created"), + logged_table = table( + "user", + column("id"), + column("date_created"), ) stmt = select(logged_table.c.id).where( @@ -1184,9 +1198,9 @@ def extract(field: str, expr: _ColumnExpressionArgument[Any]) -> Extract: Similarly, one can also select an extracted component:: - stmt = select( - extract("YEAR", logged_table.c.date_created) - ).where(logged_table.c.id == 1) + stmt = select(extract("YEAR", logged_table.c.date_created)).where( + logged_table.c.id == 1 + ) The implementation of ``EXTRACT`` may vary across database backends. Users are reminded to consult their database documentation. @@ -1245,7 +1259,8 @@ def funcfilter( E.g.:: from sqlalchemy import funcfilter - funcfilter(func.count(1), MyClass.name == 'some name') + + funcfilter(func.count(1), MyClass.name == "some name") Would produce "COUNT(1) FILTER (WHERE myclass.name = 'some name')". @@ -1302,10 +1317,11 @@ def nulls_first(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: from sqlalchemy import desc, nulls_first - stmt = select(users_table).order_by( - nulls_first(desc(users_table.c.name))) + stmt = select(users_table).order_by(nulls_first(desc(users_table.c.name))) - The SQL expression from the above would resemble:: + The SQL expression from the above would resemble: + + .. sourcecode:: sql SELECT id, name FROM user ORDER BY name DESC NULLS FIRST @@ -1316,7 +1332,8 @@ def nulls_first(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: function version, as in:: stmt = select(users_table).order_by( - users_table.c.name.desc().nulls_first()) + users_table.c.name.desc().nulls_first() + ) .. versionchanged:: 1.4 :func:`.nulls_first` is renamed from :func:`.nullsfirst` in previous releases. @@ -1332,7 +1349,7 @@ def nulls_first(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: :meth:`_expression.Select.order_by` - """ + """ # noqa: E501 return UnaryExpression._create_nulls_first(column) @@ -1346,10 +1363,11 @@ def nulls_last(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: from sqlalchemy import desc, nulls_last - stmt = select(users_table).order_by( - nulls_last(desc(users_table.c.name))) + stmt = select(users_table).order_by(nulls_last(desc(users_table.c.name))) - The SQL expression from the above would resemble:: + The SQL expression from the above would resemble: + + .. sourcecode:: sql SELECT id, name FROM user ORDER BY name DESC NULLS LAST @@ -1359,8 +1377,7 @@ def nulls_last(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: rather than as its standalone function version, as in:: - stmt = select(users_table).order_by( - users_table.c.name.desc().nulls_last()) + stmt = select(users_table).order_by(users_table.c.name.desc().nulls_last()) .. versionchanged:: 1.4 :func:`.nulls_last` is renamed from :func:`.nullslast` in previous releases. @@ -1376,7 +1393,7 @@ def nulls_last(column: _ColumnExpressionArgument[_T]) -> UnaryExpression[_T]: :meth:`_expression.Select.order_by` - """ + """ # noqa: E501 return UnaryExpression._create_nulls_last(column) @@ -1391,11 +1408,8 @@ def or_( # type: ignore[empty-body] from sqlalchemy import or_ stmt = select(users_table).where( - or_( - users_table.c.name == 'wendy', - users_table.c.name == 'jack' - ) - ) + or_(users_table.c.name == "wendy", users_table.c.name == "jack") + ) The :func:`.or_` conjunction is also available using the Python ``|`` operator (though note that compound expressions @@ -1403,9 +1417,8 @@ def or_( # type: ignore[empty-body] operator precedence behavior):: stmt = select(users_table).where( - (users_table.c.name == 'wendy') | - (users_table.c.name == 'jack') - ) + (users_table.c.name == "wendy") | (users_table.c.name == "jack") + ) The :func:`.or_` construct must be given at least one positional argument in order to be valid; a :func:`.or_` construct with no @@ -1415,6 +1428,7 @@ def or_( # type: ignore[empty-body] specified:: from sqlalchemy import false + or_criteria = or_(false(), *expressions) The above expression will compile to SQL as the expression ``false`` @@ -1446,11 +1460,8 @@ def or_(*clauses): # noqa: F811 from sqlalchemy import or_ stmt = select(users_table).where( - or_( - users_table.c.name == 'wendy', - users_table.c.name == 'jack' - ) - ) + or_(users_table.c.name == "wendy", users_table.c.name == "jack") + ) The :func:`.or_` conjunction is also available using the Python ``|`` operator (though note that compound expressions @@ -1458,9 +1469,8 @@ def or_(*clauses): # noqa: F811 operator precedence behavior):: stmt = select(users_table).where( - (users_table.c.name == 'wendy') | - (users_table.c.name == 'jack') - ) + (users_table.c.name == "wendy") | (users_table.c.name == "jack") + ) The :func:`.or_` construct must be given at least one positional argument in order to be valid; a :func:`.or_` construct with no @@ -1470,6 +1480,7 @@ def or_(*clauses): # noqa: F811 specified:: from sqlalchemy import false + or_criteria = or_(false(), *expressions) The above expression will compile to SQL as the expression ``false`` @@ -1487,7 +1498,7 @@ def or_(*clauses): # noqa: F811 :func:`.and_` - """ + """ # noqa: E501 return BooleanClauseList.or_(*clauses) @@ -1508,7 +1519,9 @@ def over( func.row_number().over(order_by=mytable.c.some_column) - Would produce:: + Would produce: + + .. sourcecode:: sql ROW_NUMBER() OVER(ORDER BY some_column) @@ -1517,10 +1530,11 @@ def over( mutually-exclusive parameters each accept a 2-tuple, which contains a combination of integers and None:: - func.row_number().over( - order_by=my_table.c.some_column, range_=(None, 0)) + func.row_number().over(order_by=my_table.c.some_column, range_=(None, 0)) + + The above would produce: - The above would produce:: + .. sourcecode:: sql ROW_NUMBER() OVER(ORDER BY some_column RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) @@ -1531,19 +1545,19 @@ def over( * RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING:: - func.row_number().over(order_by='x', range_=(-5, 10)) + func.row_number().over(order_by="x", range_=(-5, 10)) * ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:: - func.row_number().over(order_by='x', rows=(None, 0)) + func.row_number().over(order_by="x", rows=(None, 0)) * RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING:: - func.row_number().over(order_by='x', range_=(-2, None)) + func.row_number().over(order_by="x", range_=(-2, None)) * RANGE BETWEEN 1 FOLLOWING AND 3 FOLLOWING:: - func.row_number().over(order_by='x', range_=(1, 3)) + func.row_number().over(order_by="x", range_=(1, 3)) :param element: a :class:`.FunctionElement`, :class:`.WithinGroup`, or other compatible construct. @@ -1572,7 +1586,7 @@ def over( :func:`_expression.within_group` - """ + """ # noqa: E501 return Over(element, partition_by, order_by, range_, rows) @@ -1621,9 +1635,11 @@ def text(text: str) -> TextClause: method allows specification of return columns including names and types:: - t = text("SELECT * FROM users WHERE id=:user_id").\ - bindparams(user_id=7).\ - columns(id=Integer, name=String) + t = ( + text("SELECT * FROM users WHERE id=:user_id") + .bindparams(user_id=7) + .columns(id=Integer, name=String) + ) for id, name in connection.execute(t): print(id, name) @@ -1705,9 +1721,7 @@ def tuple_( from sqlalchemy import tuple_ - tuple_(table.c.col1, table.c.col2).in_( - [(1, 2), (5, 12), (10, 19)] - ) + tuple_(table.c.col1, table.c.col2).in_([(1, 2), (5, 12), (10, 19)]) .. versionchanged:: 1.3.6 Added support for SQLite IN tuples. @@ -1757,10 +1771,9 @@ def type_coerce( :meth:`_expression.ColumnElement.label`:: stmt = select( - type_coerce(log_table.date_string, StringDateTime()).label('date') + type_coerce(log_table.date_string, StringDateTime()).label("date") ) - A type that features bound-value handling will also have that behavior take effect when literal values or :func:`.bindparam` constructs are passed to :func:`.type_coerce` as targets. @@ -1821,11 +1834,10 @@ def within_group( the :meth:`.FunctionElement.within_group` method, e.g.:: from sqlalchemy import within_group + stmt = select( department.c.id, - func.percentile_cont(0.5).within_group( - department.c.salary.desc() - ) + func.percentile_cont(0.5).within_group(department.c.salary.desc()), ) The above statement would produce SQL similar to diff --git a/libs/sqlalchemy/sql/_orm_types.py b/libs/sqlalchemy/sql/_orm_types.py index bccb533ca..c37d805ef 100644 --- a/libs/sqlalchemy/sql/_orm_types.py +++ b/libs/sqlalchemy/sql/_orm_types.py @@ -1,5 +1,5 @@ # sql/_orm_types.py -# Copyright (C) 2022-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2022-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/_py_util.py b/libs/sqlalchemy/sql/_py_util.py index df372bf5d..9e1a084a3 100644 --- a/libs/sqlalchemy/sql/_py_util.py +++ b/libs/sqlalchemy/sql/_py_util.py @@ -1,5 +1,5 @@ # sql/_py_util.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/_selectable_constructors.py b/libs/sqlalchemy/sql/_selectable_constructors.py index c2b5008c6..1660778c5 100644 --- a/libs/sqlalchemy/sql/_selectable_constructors.py +++ b/libs/sqlalchemy/sql/_selectable_constructors.py @@ -1,5 +1,5 @@ # sql/_selectable_constructors.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -155,16 +155,16 @@ def exists( :meth:`_sql.SelectBase.exists` method:: exists_criteria = ( - select(table2.c.col2). - where(table1.c.col1 == table2.c.col2). - exists() + select(table2.c.col2).where(table1.c.col1 == table2.c.col2).exists() ) The EXISTS criteria is then used inside of an enclosing SELECT:: stmt = select(table1.c.col1).where(exists_criteria) - The above statement will then be of the form:: + The above statement will then be of the form: + + .. sourcecode:: sql SELECT col1 FROM table1 WHERE EXISTS (SELECT table2.col2 FROM table2 WHERE table2.col2 = table1.col1) @@ -225,11 +225,14 @@ def join( E.g.:: - j = join(user_table, address_table, - user_table.c.id == address_table.c.user_id) + j = join( + user_table, address_table, user_table.c.id == address_table.c.user_id + ) stmt = select(user_table).select_from(j) - would emit SQL along the lines of:: + would emit SQL along the lines of: + + .. sourcecode:: sql SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id @@ -263,7 +266,7 @@ def join( :class:`_expression.Join` - the type of object produced. - """ + """ # noqa: E501 return Join(left, right, onclause, isouter, full) @@ -529,13 +532,14 @@ class via the from sqlalchemy import func selectable = people.tablesample( - func.bernoulli(1), - name='alias', - seed=func.random()) + func.bernoulli(1), name="alias", seed=func.random() + ) stmt = select(selectable.c.people_id) Assuming ``people`` with a column ``people_id``, the above - statement would render as:: + statement would render as: + + .. sourcecode:: sql SELECT alias.people_id FROM people AS alias TABLESAMPLE bernoulli(:bernoulli_1) @@ -613,12 +617,10 @@ def values( from sqlalchemy import values value_expr = values( - column('id', Integer), - column('name', String), - name="my_values" - ).data( - [(1, 'name1'), (2, 'name2'), (3, 'name3')] - ) + column("id", Integer), + column("name", String), + name="my_values", + ).data([(1, "name1"), (2, "name2"), (3, "name3")]) :param \*columns: column expressions, typically composed using :func:`_expression.column` objects. diff --git a/libs/sqlalchemy/sql/_typing.py b/libs/sqlalchemy/sql/_typing.py index 73ed88996..cf9129b47 100644 --- a/libs/sqlalchemy/sql/_typing.py +++ b/libs/sqlalchemy/sql/_typing.py @@ -1,5 +1,5 @@ # sql/_typing.py -# Copyright (C) 2022-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2022-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/annotation.py b/libs/sqlalchemy/sql/annotation.py index db382b874..bf445ff33 100644 --- a/libs/sqlalchemy/sql/annotation.py +++ b/libs/sqlalchemy/sql/annotation.py @@ -1,5 +1,5 @@ # sql/annotation.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/base.py b/libs/sqlalchemy/sql/base.py index e4a7256b5..6d409a9fb 100644 --- a/libs/sqlalchemy/sql/base.py +++ b/libs/sqlalchemy/sql/base.py @@ -1,5 +1,5 @@ # sql/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -480,7 +480,7 @@ def argument_for(cls, dialect_name, argument_name, default): Index.argument_for("mydialect", "length", None) - some_index = Index('a', 'b', mydialect_length=5) + some_index = Index("a", "b", mydialect_length=5) The :meth:`.DialectKWArgs.argument_for` method is a per-argument way adding extra arguments to the @@ -569,7 +569,7 @@ def dialect_options(self): and ``<argument_name>``. For example, the ``postgresql_where`` argument would be locatable as:: - arg = my_object.dialect_options['postgresql']['where'] + arg = my_object.dialect_options["postgresql"]["where"] .. versionadded:: 0.9.2 @@ -917,11 +917,7 @@ def from_execution_options( execution_options, ) = QueryContext.default_load_options.from_execution_options( "_sa_orm_load_options", - { - "populate_existing", - "autoflush", - "yield_per" - }, + {"populate_existing", "autoflush", "yield_per"}, execution_options, statement._execution_options, ) @@ -1224,6 +1220,7 @@ def execution_options(self, **kw: Any) -> Self: from sqlalchemy import event + @event.listens_for(some_engine, "before_execute") def _process_opt(conn, statement, multiparams, params, execution_options): "run a SQL function before invoking a statement" @@ -1475,14 +1472,14 @@ class ColumnCollection(Generic[_COLKEY, _COL_co]): mean either two columns with the same key, in which case the column returned by key access is **arbitrary**:: - >>> x1, x2 = Column('x', Integer), Column('x', Integer) + >>> x1, x2 = Column("x", Integer), Column("x", Integer) >>> cc = ColumnCollection(columns=[(x1.name, x1), (x2.name, x2)]) >>> list(cc) [Column('x', Integer(), table=None), Column('x', Integer(), table=None)] - >>> cc['x'] is x1 + >>> cc["x"] is x1 False - >>> cc['x'] is x2 + >>> cc["x"] is x2 True Or it can also mean the same column multiple times. These cases are @@ -2033,8 +2030,8 @@ def replace( e.g.:: - t = Table('sometable', metadata, Column('col1', Integer)) - t.columns.replace(Column('col1', Integer, key='columnone')) + t = Table("sometable", metadata, Column("col1", Integer)) + t.columns.replace(Column("col1", Integer, key="columnone")) will remove the original 'col1' from the collection, and add the new column under the name 'columnname'. diff --git a/libs/sqlalchemy/sql/cache_key.py b/libs/sqlalchemy/sql/cache_key.py index 1172d3c98..1f562f2e6 100644 --- a/libs/sqlalchemy/sql/cache_key.py +++ b/libs/sqlalchemy/sql/cache_key.py @@ -1,5 +1,5 @@ # sql/cache_key.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/coercions.py b/libs/sqlalchemy/sql/coercions.py index 1d11cbbd3..123b5c556 100644 --- a/libs/sqlalchemy/sql/coercions.py +++ b/libs/sqlalchemy/sql/coercions.py @@ -1,5 +1,5 @@ # sql/coercions.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -57,9 +57,9 @@ from .elements import ClauseElement from .elements import ColumnClause from .elements import ColumnElement - from .elements import DQLDMLClauseElement from .elements import NamedColumn from .elements import SQLCoreOperations + from .elements import TextClause from .schema import Column from .selectable import _ColumnsClauseElement from .selectable import _JoinTargetProtocol @@ -190,7 +190,7 @@ def expect( role: Type[roles.DDLReferredColumnRole], element: Any, **kw: Any, -) -> Column[Any]: ... +) -> Union[Column[Any], str]: ... @overload @@ -206,7 +206,7 @@ def expect( role: Type[roles.StatementOptionRole], element: Any, **kw: Any, -) -> DQLDMLClauseElement: ... +) -> Union[ColumnElement[Any], TextClause]: ... @overload @@ -846,15 +846,15 @@ def _warn_for_implicit_coercion(self, elem): def _literal_coercion(self, element, *, expr, operator, **kw): if util.is_non_string_iterable(element): non_literal_expressions: Dict[ - Optional[ColumnElement[Any]], - ColumnElement[Any], + Optional[_ColumnExpressionArgument[Any]], + _ColumnExpressionArgument[Any], ] = {} element = list(element) for o in element: if not _is_literal(o): if not isinstance( o, util.preloaded.sql_elements.ColumnElement - ): + ) and not hasattr(o, "__clause_element__"): self._raise_for_expected(element, **kw) else: diff --git a/libs/sqlalchemy/sql/compiler.py b/libs/sqlalchemy/sql/compiler.py index 634e5ce11..49e8ce500 100644 --- a/libs/sqlalchemy/sql/compiler.py +++ b/libs/sqlalchemy/sql/compiler.py @@ -1,5 +1,5 @@ # sql/compiler.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -2346,7 +2346,8 @@ def default_from(self): """Called when a SELECT statement has no froms, and no FROM clause is to be appended. - Gives Oracle a chance to tack on a ``FROM DUAL`` to the string output. + Gives Oracle Database a chance to tack on a ``FROM DUAL`` to the string + output. """ return "" @@ -6113,6 +6114,10 @@ def update_limit_clause(self, update_stmt): """Provide a hook for MySQL to add LIMIT to the UPDATE""" return None + def delete_limit_clause(self, delete_stmt): + """Provide a hook for MySQL to add LIMIT to the DELETE""" + return None + def update_tables_clause(self, update_stmt, from_table, extra_froms, **kw): """Provide a hook to override the initial table clause in an UPDATE statement. @@ -6405,6 +6410,10 @@ def visit_delete(self, delete_stmt, visiting_cte=None, **kw): if t: text += " WHERE " + t + limit_clause = self.delete_limit_clause(delete_stmt) + if limit_clause: + text += " " + limit_clause + if ( self.implicit_returning or delete_stmt._returning ) and not self.returning_precedes_values: diff --git a/libs/sqlalchemy/sql/crud.py b/libs/sqlalchemy/sql/crud.py index d14266582..19af40ff0 100644 --- a/libs/sqlalchemy/sql/crud.py +++ b/libs/sqlalchemy/sql/crud.py @@ -1,5 +1,5 @@ # sql/crud.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/ddl.py b/libs/sqlalchemy/sql/ddl.py index ab717e2b3..0950043bc 100644 --- a/libs/sqlalchemy/sql/ddl.py +++ b/libs/sqlalchemy/sql/ddl.py @@ -1,5 +1,5 @@ # sql/ddl.py -# Copyright (C) 2009-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2009-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -155,8 +155,8 @@ class ExecutableDDLElement(roles.DDLRole, Executable, BaseDDLElement): event.listen( users, - 'after_create', - AddConstraint(constraint).execute_if(dialect='postgresql') + "after_create", + AddConstraint(constraint).execute_if(dialect="postgresql"), ) .. seealso:: @@ -231,20 +231,20 @@ def execute_if( Used to provide a wrapper for event listening:: event.listen( - metadata, - 'before_create', - DDL("my_ddl").execute_if(dialect='postgresql') - ) + metadata, + "before_create", + DDL("my_ddl").execute_if(dialect="postgresql"), + ) :param dialect: May be a string or tuple of strings. If a string, it will be compared to the name of the executing database dialect:: - DDL('something').execute_if(dialect='postgresql') + DDL("something").execute_if(dialect="postgresql") If a tuple, specifies multiple dialect names:: - DDL('something').execute_if(dialect=('postgresql', 'mysql')) + DDL("something").execute_if(dialect=("postgresql", "mysql")) :param callable\_: A callable, which will be invoked with three positional arguments as well as optional keyword @@ -342,17 +342,19 @@ class DDL(ExecutableDDLElement): from sqlalchemy import event, DDL - tbl = Table('users', metadata, Column('uid', Integer)) - event.listen(tbl, 'before_create', DDL('DROP TRIGGER users_trigger')) + tbl = Table("users", metadata, Column("uid", Integer)) + event.listen(tbl, "before_create", DDL("DROP TRIGGER users_trigger")) - spow = DDL('ALTER TABLE %(table)s SET secretpowers TRUE') - event.listen(tbl, 'after_create', spow.execute_if(dialect='somedb')) + spow = DDL("ALTER TABLE %(table)s SET secretpowers TRUE") + event.listen(tbl, "after_create", spow.execute_if(dialect="somedb")) - drop_spow = DDL('ALTER TABLE users SET secretpowers FALSE') + drop_spow = DDL("ALTER TABLE users SET secretpowers FALSE") connection.execute(drop_spow) When operating on Table events, the following ``statement`` - string substitutions are available:: + string substitutions are available: + + .. sourcecode:: text %(table)s - the Table name, with any required quoting applied %(schema)s - the schema name, with any required quoting applied @@ -568,6 +570,7 @@ class CreateColumn(BaseDDLElement): from sqlalchemy import schema from sqlalchemy.ext.compiler import compiles + @compiles(schema.CreateColumn) def compile(element, compiler, **kw): column = element.element @@ -576,9 +579,9 @@ def compile(element, compiler, **kw): return compiler.visit_create_column(element, **kw) text = "%s SPECIAL DIRECTIVE %s" % ( - column.name, - compiler.type_compiler.process(column.type) - ) + column.name, + compiler.type_compiler.process(column.type), + ) default = compiler.get_column_default_string(column) if default is not None: text += " DEFAULT " + default @@ -588,8 +591,8 @@ def compile(element, compiler, **kw): if column.constraints: text += " ".join( - compiler.process(const) - for const in column.constraints) + compiler.process(const) for const in column.constraints + ) return text The above construct can be applied to a :class:`_schema.Table` @@ -600,17 +603,21 @@ def compile(element, compiler, **kw): metadata = MetaData() - table = Table('mytable', MetaData(), - Column('x', Integer, info={"special":True}, primary_key=True), - Column('y', String(50)), - Column('z', String(20), info={"special":True}) - ) + table = Table( + "mytable", + MetaData(), + Column("x", Integer, info={"special": True}, primary_key=True), + Column("y", String(50)), + Column("z", String(20), info={"special": True}), + ) metadata.create_all(conn) Above, the directives we've added to the :attr:`_schema.Column.info` collection - will be detected by our custom compilation scheme:: + will be detected by our custom compilation scheme: + + .. sourcecode:: sql CREATE TABLE mytable ( x SPECIAL DIRECTIVE INTEGER NOT NULL, @@ -635,18 +642,21 @@ def compile(element, compiler, **kw): from sqlalchemy.schema import CreateColumn + @compiles(CreateColumn, "postgresql") def skip_xmin(element, compiler, **kw): - if element.element.name == 'xmin': + if element.element.name == "xmin": return None else: return compiler.visit_create_column(element, **kw) - my_table = Table('mytable', metadata, - Column('id', Integer, primary_key=True), - Column('xmin', Integer) - ) + my_table = Table( + "mytable", + metadata, + Column("id", Integer, primary_key=True), + Column("xmin", Integer), + ) Above, a :class:`.CreateTable` construct will generate a ``CREATE TABLE`` which only includes the ``id`` column in the string; the ``xmin`` column diff --git a/libs/sqlalchemy/sql/default_comparator.py b/libs/sqlalchemy/sql/default_comparator.py index 76131bcaa..7fa5dafe9 100644 --- a/libs/sqlalchemy/sql/default_comparator.py +++ b/libs/sqlalchemy/sql/default_comparator.py @@ -1,5 +1,5 @@ # sql/default_comparator.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/dml.py b/libs/sqlalchemy/sql/dml.py index 779be1dac..0b92e38bc 100644 --- a/libs/sqlalchemy/sql/dml.py +++ b/libs/sqlalchemy/sql/dml.py @@ -1,5 +1,5 @@ # sql/dml.py -# Copyright (C) 2009-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2009-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -525,11 +525,11 @@ def return_defaults( E.g.:: - stmt = table.insert().values(data='newdata').return_defaults() + stmt = table.insert().values(data="newdata").return_defaults() result = connection.execute(stmt) - server_created_at = result.returned_defaults['created_at'] + server_created_at = result.returned_defaults["created_at"] When used against an UPDATE statement :meth:`.UpdateBase.return_defaults` instead looks for columns that @@ -1032,7 +1032,7 @@ def values( users.insert().values(name="some name") - users.update().where(users.c.id==5).values(name="some name") + users.update().where(users.c.id == 5).values(name="some name") :param \*args: As an alternative to passing key/value parameters, a dictionary, tuple, or list of dictionaries or tuples can be passed @@ -1062,13 +1062,17 @@ def values( this syntax is supported on backends such as SQLite, PostgreSQL, MySQL, but not necessarily others:: - users.insert().values([ - {"name": "some name"}, - {"name": "some other name"}, - {"name": "yet another name"}, - ]) + users.insert().values( + [ + {"name": "some name"}, + {"name": "some other name"}, + {"name": "yet another name"}, + ] + ) + + The above form would render a multiple VALUES statement similar to: - The above form would render a multiple VALUES statement similar to:: + .. sourcecode:: sql INSERT INTO users (name) VALUES (:name_1), @@ -1246,7 +1250,7 @@ def from_select( e.g.:: sel = select(table1.c.a, table1.c.b).where(table1.c.c > 5) - ins = table2.insert().from_select(['a', 'b'], sel) + ins = table2.insert().from_select(["a", "b"], sel) :param names: a sequence of string column names or :class:`_schema.Column` @@ -1535,9 +1539,7 @@ def ordered_values(self, *args: Tuple[_DMLColumnArgument, Any]) -> Self: E.g.:: - stmt = table.update().ordered_values( - ("name", "ed"), ("ident", "foo") - ) + stmt = table.update().ordered_values(("name", "ed"), ("ident", "foo")) .. seealso:: @@ -1550,7 +1552,7 @@ def ordered_values(self, *args: Tuple[_DMLColumnArgument, Any]) -> Self: :paramref:`_expression.update.preserve_parameter_order` parameter, which will be removed in SQLAlchemy 2.0. - """ + """ # noqa: E501 if self._values: raise exc.ArgumentError( "This statement already has values present" diff --git a/libs/sqlalchemy/sql/elements.py b/libs/sqlalchemy/sql/elements.py index 45c1674d9..f7d376770 100644 --- a/libs/sqlalchemy/sql/elements.py +++ b/libs/sqlalchemy/sql/elements.py @@ -1,5 +1,5 @@ # sql/elements.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -281,7 +281,7 @@ def compile( from sqlalchemy.sql import table, column, select - t = table('t', column('x')) + t = table("t", column("x")) s = select(t).where(t.c.x == 5) @@ -584,10 +584,10 @@ def params( :func:`_expression.bindparam` elements replaced with values taken from the given dictionary:: - >>> clause = column('x') + bindparam('foo') + >>> clause = column("x") + bindparam("foo") >>> print(clause.compile().params) {'foo':None} - >>> print(clause.params({'foo':7}).compile().params) + >>> print(clause.params({"foo": 7}).compile().params) {'foo':7} """ @@ -1286,9 +1286,9 @@ class ColumnElement( .. sourcecode:: pycon+sql >>> from sqlalchemy.sql import column - >>> column('a') + column('b') + >>> column("a") + column("b") <sqlalchemy.sql.expression.BinaryExpression object at 0x101029dd0> - >>> print(column('a') + column('b')) + >>> print(column("a") + column("b")) {printsql}a + b .. seealso:: @@ -1377,7 +1377,9 @@ def _non_anon_label(self) -> Optional[str]: SQL. Concretely, this is the "name" of a column or a label in a - SELECT statement; ``<columnname>`` and ``<labelname>`` below:: + SELECT statement; ``<columnname>`` and ``<labelname>`` below: + + .. sourcecode:: sql SELECT <columnmame> FROM table @@ -2232,7 +2234,6 @@ class TextClause( t = text("SELECT * FROM users") result = connection.execute(t) - The :class:`_expression.TextClause` construct is produced using the :func:`_expression.text` function; see that function for full documentation. @@ -2309,16 +2310,19 @@ def bindparams( Given a text construct such as:: from sqlalchemy import text - stmt = text("SELECT id, name FROM user WHERE name=:name " - "AND timestamp=:timestamp") + + stmt = text( + "SELECT id, name FROM user WHERE name=:name AND timestamp=:timestamp" + ) the :meth:`_expression.TextClause.bindparams` method can be used to establish the initial value of ``:name`` and ``:timestamp``, using simple keyword arguments:: - stmt = stmt.bindparams(name='jack', - timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5)) + stmt = stmt.bindparams( + name="jack", timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5) + ) Where above, new :class:`.BindParameter` objects will be generated with the names ``name`` and ``timestamp``, and @@ -2333,10 +2337,11 @@ def bindparams( argument, then an optional value and type:: from sqlalchemy import bindparam + stmt = stmt.bindparams( - bindparam('name', value='jack', type_=String), - bindparam('timestamp', type_=DateTime) - ) + bindparam("name", value="jack", type_=String), + bindparam("timestamp", type_=DateTime), + ) Above, we specified the type of :class:`.DateTime` for the ``timestamp`` bind, and the type of :class:`.String` for the ``name`` @@ -2346,8 +2351,9 @@ def bindparams( Additional bound parameters can be supplied at statement execution time, e.g.:: - result = connection.execute(stmt, - timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5)) + result = connection.execute( + stmt, timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5) + ) The :meth:`_expression.TextClause.bindparams` method can be called repeatedly, @@ -2357,15 +2363,15 @@ def bindparams( first with typing information, and a second time with value information, and it will be combined:: - stmt = text("SELECT id, name FROM user WHERE name=:name " - "AND timestamp=:timestamp") + stmt = text( + "SELECT id, name FROM user WHERE name=:name " + "AND timestamp=:timestamp" + ) stmt = stmt.bindparams( - bindparam('name', type_=String), - bindparam('timestamp', type_=DateTime) + bindparam("name", type_=String), bindparam("timestamp", type_=DateTime) ) stmt = stmt.bindparams( - name='jack', - timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5) + name="jack", timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5) ) The :meth:`_expression.TextClause.bindparams` @@ -2379,18 +2385,17 @@ def bindparams( object:: stmt1 = text("select id from table where name=:name").bindparams( - bindparam("name", value='name1', unique=True) + bindparam("name", value="name1", unique=True) ) stmt2 = text("select id from table where name=:name").bindparams( - bindparam("name", value='name2', unique=True) + bindparam("name", value="name2", unique=True) ) - union = union_all( - stmt1.columns(column("id")), - stmt2.columns(column("id")) - ) + union = union_all(stmt1.columns(column("id")), stmt2.columns(column("id"))) + + The above statement will render as: - The above statement will render as:: + .. sourcecode:: sql select id from table where name=:name_1 UNION ALL select id from table where name=:name_2 @@ -2400,7 +2405,7 @@ def bindparams( :func:`_expression.text` constructs. - """ + """ # noqa: E501 self._bindparams = new_params = self._bindparams.copy() for bind in binds: @@ -2431,7 +2436,9 @@ def bindparams( @util.preload_module("sqlalchemy.sql.selectable") def columns( - self, *cols: _ColumnExpressionArgument[Any], **types: TypeEngine[Any] + self, + *cols: _ColumnExpressionArgument[Any], + **types: _TypeEngineArgument[Any], ) -> TextualSelect: r"""Turn this :class:`_expression.TextClause` object into a :class:`_expression.TextualSelect` @@ -2452,12 +2459,13 @@ def columns( from sqlalchemy.sql import column, text stmt = text("SELECT id, name FROM some_table") - stmt = stmt.columns(column('id'), column('name')).subquery('st') + stmt = stmt.columns(column("id"), column("name")).subquery("st") - stmt = select(mytable).\ - select_from( - mytable.join(stmt, mytable.c.name == stmt.c.name) - ).where(stmt.c.id > 5) + stmt = ( + select(mytable) + .select_from(mytable.join(stmt, mytable.c.name == stmt.c.name)) + .where(stmt.c.id > 5) + ) Above, we pass a series of :func:`_expression.column` elements to the :meth:`_expression.TextClause.columns` method positionally. These @@ -2478,10 +2486,10 @@ def columns( stmt = text("SELECT id, name, timestamp FROM some_table") stmt = stmt.columns( - column('id', Integer), - column('name', Unicode), - column('timestamp', DateTime) - ) + column("id", Integer), + column("name", Unicode), + column("timestamp", DateTime), + ) for id, name, timestamp in connection.execute(stmt): print(id, name, timestamp) @@ -2490,11 +2498,7 @@ def columns( types alone may be used, if only type conversion is needed:: stmt = text("SELECT id, name, timestamp FROM some_table") - stmt = stmt.columns( - id=Integer, - name=Unicode, - timestamp=DateTime - ) + stmt = stmt.columns(id=Integer, name=Unicode, timestamp=DateTime) for id, name, timestamp in connection.execute(stmt): print(id, name, timestamp) @@ -2508,26 +2512,31 @@ def columns( the result set will match to those columns positionally, meaning the name or origin of the column in the textual SQL doesn't matter:: - stmt = text("SELECT users.id, addresses.id, users.id, " - "users.name, addresses.email_address AS email " - "FROM users JOIN addresses ON users.id=addresses.user_id " - "WHERE users.id = 1").columns( - User.id, - Address.id, - Address.user_id, - User.name, - Address.email_address - ) + stmt = text( + "SELECT users.id, addresses.id, users.id, " + "users.name, addresses.email_address AS email " + "FROM users JOIN addresses ON users.id=addresses.user_id " + "WHERE users.id = 1" + ).columns( + User.id, + Address.id, + Address.user_id, + User.name, + Address.email_address, + ) - query = session.query(User).from_statement(stmt).options( - contains_eager(User.addresses)) + query = ( + session.query(User) + .from_statement(stmt) + .options(contains_eager(User.addresses)) + ) The :meth:`_expression.TextClause.columns` method provides a direct route to calling :meth:`_expression.FromClause.subquery` as well as :meth:`_expression.SelectBase.cte` against a textual SELECT statement:: - stmt = stmt.columns(id=Integer, name=String).cte('st') + stmt = stmt.columns(id=Integer, name=String).cte("st") stmt = select(sometable).where(sometable.c.id == stmt.c.id) @@ -3272,14 +3281,13 @@ class Case(ColumnElement[_T]): from sqlalchemy import case - stmt = select(users_table).\ - where( - case( - (users_table.c.name == 'wendy', 'W'), - (users_table.c.name == 'jack', 'J'), - else_='E' - ) - ) + stmt = select(users_table).where( + case( + (users_table.c.name == "wendy", "W"), + (users_table.c.name == "jack", "J"), + else_="E", + ) + ) Details on :class:`.Case` usage is at :func:`.case`. @@ -3817,9 +3825,9 @@ class BinaryExpression(OperatorExpression[_T]): .. sourcecode:: pycon+sql >>> from sqlalchemy.sql import column - >>> column('a') + column('b') + >>> column("a") + column("b") <sqlalchemy.sql.expression.BinaryExpression object at 0x101029dd0> - >>> print(column('a') + column('b')) + >>> print(column("a") + column("b")) {printsql}a + b """ @@ -3908,7 +3916,7 @@ def __bool__(self): The rationale here is so that ColumnElement objects can be hashable. What? Well, suppose you do this:: - c1, c2 = column('x'), column('y') + c1, c2 = column("x"), column("y") s1 = set([c1, c2]) We do that **a lot**, columns inside of sets is an extremely basic @@ -4294,7 +4302,7 @@ class WithinGroup(ColumnElement[_T]): ``rank()``, ``dense_rank()``, etc. It's supported only by certain database backends, such as PostgreSQL, - Oracle and MS SQL Server. + Oracle Database and MS SQL Server. The :class:`.WithinGroup` construct extracts its type from the method :meth:`.FunctionElement.within_group_type`. If this returns @@ -4473,12 +4481,13 @@ def over( The expression:: - func.rank().filter(MyClass.y > 5).over(order_by='x') + func.rank().filter(MyClass.y > 5).over(order_by="x") is shorthand for:: from sqlalchemy import over, funcfilter - over(funcfilter(func.rank(), MyClass.y > 5), order_by='x') + + over(funcfilter(func.rank(), MyClass.y > 5), order_by="x") See :func:`_expression.over` for a full description. @@ -4840,7 +4849,9 @@ class ColumnClause( id, name = column("id"), column("name") stmt = select(id, name).select_from("user") - The above statement would produce SQL like:: + The above statement would produce SQL like: + + .. sourcecode:: sql SELECT id, name FROM user @@ -5170,7 +5181,7 @@ class quoted_name(util.MemoizedSlots, str): A :class:`.quoted_name` object with ``quote=True`` is also prevented from being modified in the case of a so-called "name normalize" option. Certain database backends, such as - Oracle, Firebird, and DB2 "normalize" case-insensitive names + Oracle Database, Firebird, and DB2 "normalize" case-insensitive names as uppercase. The SQLAlchemy dialects for these backends convert from SQLAlchemy's lower-case-means-insensitive convention to the upper-case-means-insensitive conventions of those backends. @@ -5191,11 +5202,11 @@ class quoted_name(util.MemoizedSlots, str): from sqlalchemy import inspect from sqlalchemy.sql import quoted_name - engine = create_engine("oracle+cx_oracle://some_dsn") + engine = create_engine("oracle+oracledb://some_dsn") print(inspect(engine).has_table(quoted_name("some_table", True))) - The above logic will run the "has table" logic against the Oracle backend, - passing the name exactly as ``"some_table"`` without converting to + The above logic will run the "has table" logic against the Oracle Database + backend, passing the name exactly as ``"some_table"`` without converting to upper case. .. versionchanged:: 1.2 The :class:`.quoted_name` construct is now @@ -5393,11 +5404,12 @@ class conv(_truncated_label): E.g. when we create a :class:`.Constraint` using a naming convention as follows:: - m = MetaData(naming_convention={ - "ck": "ck_%(table_name)s_%(constraint_name)s" - }) - t = Table('t', m, Column('x', Integer), - CheckConstraint('x > 5', name='x5')) + m = MetaData( + naming_convention={"ck": "ck_%(table_name)s_%(constraint_name)s"} + ) + t = Table( + "t", m, Column("x", Integer), CheckConstraint("x > 5", name="x5") + ) The name of the above constraint will be rendered as ``"ck_t_x5"``. That is, the existing name ``x5`` is used in the naming convention as the @@ -5410,11 +5422,15 @@ class conv(_truncated_label): use this explicitly as follows:: - m = MetaData(naming_convention={ - "ck": "ck_%(table_name)s_%(constraint_name)s" - }) - t = Table('t', m, Column('x', Integer), - CheckConstraint('x > 5', name=conv('ck_t_x5'))) + m = MetaData( + naming_convention={"ck": "ck_%(table_name)s_%(constraint_name)s"} + ) + t = Table( + "t", + m, + Column("x", Integer), + CheckConstraint("x > 5", name=conv("ck_t_x5")), + ) Where above, the :func:`_schema.conv` marker indicates that the constraint name here is final, and the name will render as ``"ck_t_x5"`` and not diff --git a/libs/sqlalchemy/sql/events.py b/libs/sqlalchemy/sql/events.py index 1a6a9a6a7..601092fd9 100644 --- a/libs/sqlalchemy/sql/events.py +++ b/libs/sqlalchemy/sql/events.py @@ -1,5 +1,5 @@ # sql/events.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -63,13 +63,14 @@ class DDLEvents(event.Events[SchemaEventTarget]): from sqlalchemy import Table, Column, Metadata, Integer m = MetaData() - some_table = Table('some_table', m, Column('data', Integer)) + some_table = Table("some_table", m, Column("data", Integer)) + @event.listens_for(some_table, "after_create") def after_create(target, connection, **kw): - connection.execute(text( - "ALTER TABLE %s SET name=foo_%s" % (target.name, target.name) - )) + connection.execute( + text("ALTER TABLE %s SET name=foo_%s" % (target.name, target.name)) + ) some_engine = create_engine("postgresql://scott:tiger@host/test") @@ -127,10 +128,11 @@ def after_create(target, connection, **kw): as listener callables:: from sqlalchemy import DDL + event.listen( some_table, "after_create", - DDL("ALTER TABLE %(table)s SET name=foo_%(table)s") + DDL("ALTER TABLE %(table)s SET name=foo_%(table)s"), ) **Event Propagation to MetaData Copies** @@ -149,7 +151,7 @@ def after_create(target, connection, **kw): some_table, "after_create", DDL("ALTER TABLE %(table)s SET name=foo_%(table)s"), - propagate=True + propagate=True, ) new_metadata = MetaData() @@ -169,7 +171,7 @@ def after_create(target, connection, **kw): :ref:`schema_ddl_sequences` - """ + """ # noqa: E501 _target_class_doc = "SomeSchemaClassOrObject" _dispatch_target = SchemaEventTarget @@ -358,16 +360,17 @@ def column_reflect( metadata = MetaData() - @event.listens_for(metadata, 'column_reflect') + + @event.listens_for(metadata, "column_reflect") def receive_column_reflect(inspector, table, column_info): # receives for all Table objects that are reflected # under this MetaData + ... # will use the above event hook my_table = Table("my_table", metadata, autoload_with=some_engine) - .. versionadded:: 1.4.0b2 The :meth:`_events.DDLEvents.column_reflect` hook may now be applied to a :class:`_schema.MetaData` object as well as the :class:`_schema.MetaData` class itself where it will @@ -379,9 +382,11 @@ def receive_column_reflect(inspector, table, column_info): from sqlalchemy import Table - @event.listens_for(Table, 'column_reflect') + + @event.listens_for(Table, "column_reflect") def receive_column_reflect(inspector, table, column_info): # receives for all Table objects that are reflected + ... It can also be applied to a specific :class:`_schema.Table` at the point that one is being reflected using the @@ -390,9 +395,7 @@ def receive_column_reflect(inspector, table, column_info): t1 = Table( "my_table", autoload_with=some_engine, - listeners=[ - ('column_reflect', receive_column_reflect) - ] + listeners=[("column_reflect", receive_column_reflect)], ) The dictionary of column information as returned by the diff --git a/libs/sqlalchemy/sql/expression.py b/libs/sqlalchemy/sql/expression.py index ba42445d0..f8ac3a9ec 100644 --- a/libs/sqlalchemy/sql/expression.py +++ b/libs/sqlalchemy/sql/expression.py @@ -1,5 +1,5 @@ # sql/expression.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/functions.py b/libs/sqlalchemy/sql/functions.py index 8ef7f75bc..ea02279d4 100644 --- a/libs/sqlalchemy/sql/functions.py +++ b/libs/sqlalchemy/sql/functions.py @@ -1,5 +1,5 @@ # sql/functions.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -246,9 +246,8 @@ def table_valued( .. sourcecode:: pycon+sql - >>> fn = ( - ... func.generate_series(1, 5). - ... table_valued("value", "start", "stop", "step") + >>> fn = func.generate_series(1, 5).table_valued( + ... "value", "start", "stop", "step" ... ) >>> print(select(fn)) @@ -265,7 +264,9 @@ def table_valued( .. sourcecode:: pycon+sql - >>> fn = func.generate_series(4, 1, -1).table_valued("gen", with_ordinality="ordinality") + >>> fn = func.generate_series(4, 1, -1).table_valued( + ... "gen", with_ordinality="ordinality" + ... ) >>> print(select(fn)) {printsql}SELECT anon_1.gen, anon_1.ordinality FROM generate_series(:generate_series_1, :generate_series_2, :generate_series_3) WITH ORDINALITY AS anon_1 @@ -377,7 +378,7 @@ def columns(self) -> ColumnCollection[str, KeyedColumnElement[Any]]: # type: ig .. sourcecode:: pycon+sql >>> from sqlalchemy import column, select, func - >>> stmt = select(column('x'), column('y')).select_from(func.myfunction()) + >>> stmt = select(column("x"), column("y")).select_from(func.myfunction()) >>> print(stmt) {printsql}SELECT x, y FROM myfunction() @@ -442,12 +443,13 @@ def over( The expression:: - func.row_number().over(order_by='x') + func.row_number().over(order_by="x") is shorthand for:: from sqlalchemy import over - over(func.row_number(), order_by='x') + + over(func.row_number(), order_by="x") See :func:`_expression.over` for a full description. @@ -511,6 +513,7 @@ def filter( is shorthand for:: from sqlalchemy import funcfilter + funcfilter(func.count(1), True) .. seealso:: @@ -567,7 +570,7 @@ def as_comparison( An ORM example is as follows:: class Venue(Base): - __tablename__ = 'venue' + __tablename__ = "venue" id = Column(Integer, primary_key=True) name = Column(String) @@ -575,9 +578,10 @@ class Venue(Base): "Venue", primaryjoin=func.instr( remote(foreign(name)), name + "/" - ).as_comparison(1, 2) == 1, + ).as_comparison(1, 2) + == 1, viewonly=True, - order_by=name + order_by=name, ) Above, the "Venue" class can load descendant "Venue" objects by @@ -881,8 +885,11 @@ class _FunctionGenerator: .. sourcecode:: pycon+sql - >>> print(func.my_string(u'hi', type_=Unicode) + ' ' + - ... func.my_string(u'there', type_=Unicode)) + >>> print( + ... func.my_string("hi", type_=Unicode) + ... + " " + ... + func.my_string("there", type_=Unicode) + ... ) {printsql}my_string(:my_string_1) || :my_string_2 || my_string(:my_string_3) The object returned by a :data:`.func` call is usually an instance of @@ -1367,10 +1374,12 @@ class that is instantiated automatically when called from sqlalchemy.sql.functions import GenericFunction from sqlalchemy.types import DateTime + class as_utc(GenericFunction): type = DateTime() inherit_cache = True + print(select(func.as_utc())) User-defined generic functions can be organized into @@ -1418,6 +1427,7 @@ class GeoBuffer(GenericFunction): from sqlalchemy.sql import quoted_name + class GeoBuffer(GenericFunction): type = Geometry() package = "geo" @@ -1657,7 +1667,7 @@ class concat(GenericFunction[str]): .. sourcecode:: pycon+sql - >>> print(select(func.concat('a', 'b'))) + >>> print(select(func.concat("a", "b"))) {printsql}SELECT concat(:concat_2, :concat_3) AS concat_1 String concatenation in SQLAlchemy is more commonly available using the @@ -1705,11 +1715,13 @@ class count(GenericFunction[int]): from sqlalchemy import select from sqlalchemy import table, column - my_table = table('some_table', column('id')) + my_table = table("some_table", column("id")) stmt = select(func.count()).select_from(my_table) - Executing ``stmt`` would emit:: + Executing ``stmt`` would emit: + + .. sourcecode:: sql SELECT count(*) AS count_1 FROM some_table @@ -2009,9 +2021,7 @@ class grouping_sets(GenericFunction[_T]): from sqlalchemy import tuple_ stmt = select( - func.sum(table.c.value), - table.c.col_1, table.c.col_2, - table.c.col_3 + func.sum(table.c.value), table.c.col_1, table.c.col_2, table.c.col_3 ).group_by( func.grouping_sets( tuple_(table.c.col_1, table.c.col_2), @@ -2019,10 +2029,9 @@ class grouping_sets(GenericFunction[_T]): ) ) - .. versionadded:: 1.2 - """ + """ # noqa: E501 _has_args = True inherit_cache = True diff --git a/libs/sqlalchemy/sql/lambdas.py b/libs/sqlalchemy/sql/lambdas.py index 7a6b7b8f7..8d70f800e 100644 --- a/libs/sqlalchemy/sql/lambdas.py +++ b/libs/sqlalchemy/sql/lambdas.py @@ -1,5 +1,5 @@ # sql/lambdas.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -278,7 +278,7 @@ def _retrieve_tracker_rec(self, fn, apply_propagate_attrs, opts): rec = AnalyzedFunction( tracker, self, apply_propagate_attrs, fn ) - rec.closure_bindparams = bindparams + rec.closure_bindparams = list(bindparams) lambda_cache[key] = rec else: rec = lambda_cache[key] @@ -518,7 +518,6 @@ class StatementLambdaElement( stmt += lambda s: s.where(table.c.col == parameter) - .. versionadded:: 1.4 .. seealso:: @@ -558,9 +557,7 @@ def add_criteria( ... stmt = lambda_stmt( ... lambda: select(table.c.x, table.c.y), ... ) - ... stmt = stmt.add_criteria( - ... lambda: table.c.x > parameter - ... ) + ... stmt = stmt.add_criteria(lambda: table.c.x > parameter) ... return stmt The :meth:`_sql.StatementLambdaElement.add_criteria` method is @@ -571,18 +568,15 @@ def add_criteria( >>> def my_stmt(self, foo): ... stmt = lambda_stmt( ... lambda: select(func.max(foo.x, foo.y)), - ... track_closure_variables=False - ... ) - ... stmt = stmt.add_criteria( - ... lambda: self.where_criteria, - ... track_on=[self] + ... track_closure_variables=False, ... ) + ... stmt = stmt.add_criteria(lambda: self.where_criteria, track_on=[self]) ... return stmt See :func:`_sql.lambda_stmt` for a description of the parameters accepted. - """ + """ # noqa: E501 opts = self.opts + dict( enable_tracking=enable_tracking, diff --git a/libs/sqlalchemy/sql/naming.py b/libs/sqlalchemy/sql/naming.py index 7213ddb29..58203e4b9 100644 --- a/libs/sqlalchemy/sql/naming.py +++ b/libs/sqlalchemy/sql/naming.py @@ -1,5 +1,5 @@ # sql/naming.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/operators.py b/libs/sqlalchemy/sql/operators.py index 5939f1249..d5f876cb0 100644 --- a/libs/sqlalchemy/sql/operators.py +++ b/libs/sqlalchemy/sql/operators.py @@ -1,5 +1,5 @@ # sql/operators.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -148,6 +148,7 @@ def __and__(self, other: Any) -> Operators: is equivalent to:: from sqlalchemy import and_ + and_(a, b) Care should be taken when using ``&`` regarding @@ -172,6 +173,7 @@ def __or__(self, other: Any) -> Operators: is equivalent to:: from sqlalchemy import or_ + or_(a, b) Care should be taken when using ``|`` regarding @@ -196,6 +198,7 @@ def __invert__(self) -> Operators: is equivalent to:: from sqlalchemy import not_ + not_(a) """ @@ -224,7 +227,7 @@ def op( This function can also be used to make bitwise operators explicit. For example:: - somecolumn.op('&')(0xff) + somecolumn.op("&")(0xFF) is a bitwise AND of the value in ``somecolumn``. @@ -275,7 +278,7 @@ def op( e.g.:: - >>> expr = column('x').op('+', python_impl=lambda a, b: a + b)('y') + >>> expr = column("x").op("+", python_impl=lambda a, b: a + b)("y") The operator for the above expression will also work for non-SQL left and right objects:: @@ -389,10 +392,9 @@ class custom_op(OperatorType, Generic[_T]): from sqlalchemy.sql import operators from sqlalchemy import Numeric - unary = UnaryExpression(table.c.somecolumn, - modifier=operators.custom_op("!"), - type_=Numeric) - + unary = UnaryExpression( + table.c.somecolumn, modifier=operators.custom_op("!"), type_=Numeric + ) .. seealso:: @@ -400,7 +402,7 @@ class custom_op(OperatorType, Generic[_T]): :meth:`.Operators.bool_op` - """ + """ # noqa: E501 __name__ = "custom_op" @@ -698,14 +700,15 @@ def like( ) -> ColumnOperators: r"""Implement the ``like`` operator. - In a column context, produces the expression:: + In a column context, produces the expression: + + .. sourcecode:: sql a LIKE other E.g.:: - stmt = select(sometable).\ - where(sometable.c.column.like("%foobar%")) + stmt = select(sometable).where(sometable.c.column.like("%foobar%")) :param other: expression to be compared :param escape: optional escape character, renders the ``ESCAPE`` @@ -725,18 +728,21 @@ def ilike( ) -> ColumnOperators: r"""Implement the ``ilike`` operator, e.g. case insensitive LIKE. - In a column context, produces an expression either of the form:: + In a column context, produces an expression either of the form: + + .. sourcecode:: sql lower(a) LIKE lower(other) - Or on backends that support the ILIKE operator:: + Or on backends that support the ILIKE operator: + + .. sourcecode:: sql a ILIKE other E.g.:: - stmt = select(sometable).\ - where(sometable.c.column.ilike("%foobar%")) + stmt = select(sometable).where(sometable.c.column.ilike("%foobar%")) :param other: expression to be compared :param escape: optional escape character, renders the ``ESCAPE`` @@ -748,7 +754,7 @@ def ilike( :meth:`.ColumnOperators.like` - """ + """ # noqa: E501 return self.operate(ilike_op, other, escape=escape) def bitwise_xor(self, other: Any) -> ColumnOperators: @@ -842,12 +848,15 @@ def in_(self, other: Any) -> ColumnOperators: The given parameter ``other`` may be: - * A list of literal values, e.g.:: + * A list of literal values, + e.g.:: stmt.where(column.in_([1, 2, 3])) In this calling form, the list of items is converted to a set of - bound parameters the same length as the list given:: + bound parameters the same length as the list given: + + .. sourcecode:: sql WHERE COL IN (?, ?, ?) @@ -855,16 +864,20 @@ def in_(self, other: Any) -> ColumnOperators: :func:`.tuple_` containing multiple expressions:: from sqlalchemy import tuple_ + stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)])) - * An empty list, e.g.:: + * An empty list, + e.g.:: stmt.where(column.in_([])) In this calling form, the expression renders an "empty set" expression. These expressions are tailored to individual backends and are generally trying to get an empty SELECT statement as a - subquery. Such as on SQLite, the expression is:: + subquery. Such as on SQLite, the expression is: + + .. sourcecode:: sql WHERE col IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1) @@ -874,10 +887,12 @@ def in_(self, other: Any) -> ColumnOperators: * A bound parameter, e.g. :func:`.bindparam`, may be used if it includes the :paramref:`.bindparam.expanding` flag:: - stmt.where(column.in_(bindparam('value', expanding=True))) + stmt.where(column.in_(bindparam("value", expanding=True))) In this calling form, the expression renders a special non-SQL - placeholder expression that looks like:: + placeholder expression that looks like: + + .. sourcecode:: sql WHERE COL IN ([EXPANDING_value]) @@ -887,7 +902,9 @@ def in_(self, other: Any) -> ColumnOperators: connection.execute(stmt, {"value": [1, 2, 3]}) - The database would be passed a bound parameter for each value:: + The database would be passed a bound parameter for each value: + + .. sourcecode:: sql WHERE COL IN (?, ?, ?) @@ -895,7 +912,9 @@ def in_(self, other: Any) -> ColumnOperators: If an empty list is passed, a special "empty list" expression, which is specific to the database in use, is rendered. On - SQLite this would be:: + SQLite this would be: + + .. sourcecode:: sql WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1) @@ -906,13 +925,12 @@ def in_(self, other: Any) -> ColumnOperators: correlated scalar select:: stmt.where( - column.in_( - select(othertable.c.y). - where(table.c.x == othertable.c.x) - ) + column.in_(select(othertable.c.y).where(table.c.x == othertable.c.x)) ) - In this calling form, :meth:`.ColumnOperators.in_` renders as given:: + In this calling form, :meth:`.ColumnOperators.in_` renders as given: + + .. sourcecode:: sql WHERE COL IN (SELECT othertable.y FROM othertable WHERE othertable.x = table.x) @@ -921,7 +939,7 @@ def in_(self, other: Any) -> ColumnOperators: construct, or a :func:`.bindparam` construct that includes the :paramref:`.bindparam.expanding` flag set to True. - """ + """ # noqa: E501 return self.operate(in_op, other) def not_in(self, other: Any) -> ColumnOperators: @@ -1065,14 +1083,15 @@ def startswith( r"""Implement the ``startswith`` operator. Produces a LIKE expression that tests against a match for the start - of a string value:: + of a string value: + + .. sourcecode:: sql column LIKE <other> || '%' E.g.:: - stmt = select(sometable).\ - where(sometable.c.column.startswith("foobar")) + stmt = select(sometable).where(sometable.c.column.startswith("foobar")) Since the operator uses ``LIKE``, wildcard characters ``"%"`` and ``"_"`` that are present inside the <other> expression @@ -1101,7 +1120,9 @@ def startswith( somecolumn.startswith("foo%bar", autoescape=True) - Will render as:: + Will render as: + + .. sourcecode:: sql somecolumn LIKE :param || '%' ESCAPE '/' @@ -1117,7 +1138,9 @@ def startswith( somecolumn.startswith("foo/%bar", escape="^") - Will render as:: + Will render as: + + .. sourcecode:: sql somecolumn LIKE :param || '%' ESCAPE '^' @@ -1137,7 +1160,7 @@ def startswith( :meth:`.ColumnOperators.like` - """ + """ # noqa: E501 return self.operate( startswith_op, other, escape=escape, autoescape=autoescape ) @@ -1152,14 +1175,15 @@ def istartswith( version of :meth:`.ColumnOperators.startswith`. Produces a LIKE expression that tests against an insensitive - match for the start of a string value:: + match for the start of a string value: + + .. sourcecode:: sql lower(column) LIKE lower(<other>) || '%' E.g.:: - stmt = select(sometable).\ - where(sometable.c.column.istartswith("foobar")) + stmt = select(sometable).where(sometable.c.column.istartswith("foobar")) Since the operator uses ``LIKE``, wildcard characters ``"%"`` and ``"_"`` that are present inside the <other> expression @@ -1188,7 +1212,9 @@ def istartswith( somecolumn.istartswith("foo%bar", autoescape=True) - Will render as:: + Will render as: + + .. sourcecode:: sql lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '/' @@ -1204,7 +1230,9 @@ def istartswith( somecolumn.istartswith("foo/%bar", escape="^") - Will render as:: + Will render as: + + .. sourcecode:: sql lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '^' @@ -1219,7 +1247,7 @@ def istartswith( .. seealso:: :meth:`.ColumnOperators.startswith` - """ + """ # noqa: E501 return self.operate( istartswith_op, other, escape=escape, autoescape=autoescape ) @@ -1233,14 +1261,15 @@ def endswith( r"""Implement the 'endswith' operator. Produces a LIKE expression that tests against a match for the end - of a string value:: + of a string value: + + .. sourcecode:: sql column LIKE '%' || <other> E.g.:: - stmt = select(sometable).\ - where(sometable.c.column.endswith("foobar")) + stmt = select(sometable).where(sometable.c.column.endswith("foobar")) Since the operator uses ``LIKE``, wildcard characters ``"%"`` and ``"_"`` that are present inside the <other> expression @@ -1269,7 +1298,9 @@ def endswith( somecolumn.endswith("foo%bar", autoescape=True) - Will render as:: + Will render as: + + .. sourcecode:: sql somecolumn LIKE '%' || :param ESCAPE '/' @@ -1285,7 +1316,9 @@ def endswith( somecolumn.endswith("foo/%bar", escape="^") - Will render as:: + Will render as: + + .. sourcecode:: sql somecolumn LIKE '%' || :param ESCAPE '^' @@ -1305,7 +1338,7 @@ def endswith( :meth:`.ColumnOperators.like` - """ + """ # noqa: E501 return self.operate( endswith_op, other, escape=escape, autoescape=autoescape ) @@ -1320,14 +1353,15 @@ def iendswith( version of :meth:`.ColumnOperators.endswith`. Produces a LIKE expression that tests against an insensitive match - for the end of a string value:: + for the end of a string value: + + .. sourcecode:: sql lower(column) LIKE '%' || lower(<other>) E.g.:: - stmt = select(sometable).\ - where(sometable.c.column.iendswith("foobar")) + stmt = select(sometable).where(sometable.c.column.iendswith("foobar")) Since the operator uses ``LIKE``, wildcard characters ``"%"`` and ``"_"`` that are present inside the <other> expression @@ -1356,7 +1390,9 @@ def iendswith( somecolumn.iendswith("foo%bar", autoescape=True) - Will render as:: + Will render as: + + .. sourcecode:: sql lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '/' @@ -1372,7 +1408,9 @@ def iendswith( somecolumn.iendswith("foo/%bar", escape="^") - Will render as:: + Will render as: + + .. sourcecode:: sql lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '^' @@ -1387,7 +1425,7 @@ def iendswith( .. seealso:: :meth:`.ColumnOperators.endswith` - """ + """ # noqa: E501 return self.operate( iendswith_op, other, escape=escape, autoescape=autoescape ) @@ -1396,14 +1434,15 @@ def contains(self, other: Any, **kw: Any) -> ColumnOperators: r"""Implement the 'contains' operator. Produces a LIKE expression that tests against a match for the middle - of a string value:: + of a string value: + + .. sourcecode:: sql column LIKE '%' || <other> || '%' E.g.:: - stmt = select(sometable).\ - where(sometable.c.column.contains("foobar")) + stmt = select(sometable).where(sometable.c.column.contains("foobar")) Since the operator uses ``LIKE``, wildcard characters ``"%"`` and ``"_"`` that are present inside the <other> expression @@ -1432,7 +1471,9 @@ def contains(self, other: Any, **kw: Any) -> ColumnOperators: somecolumn.contains("foo%bar", autoescape=True) - Will render as:: + Will render as: + + .. sourcecode:: sql somecolumn LIKE '%' || :param || '%' ESCAPE '/' @@ -1448,7 +1489,9 @@ def contains(self, other: Any, **kw: Any) -> ColumnOperators: somecolumn.contains("foo/%bar", escape="^") - Will render as:: + Will render as: + + .. sourcecode:: sql somecolumn LIKE '%' || :param || '%' ESCAPE '^' @@ -1469,7 +1512,7 @@ def contains(self, other: Any, **kw: Any) -> ColumnOperators: :meth:`.ColumnOperators.like` - """ + """ # noqa: E501 return self.operate(contains_op, other, **kw) def icontains(self, other: Any, **kw: Any) -> ColumnOperators: @@ -1477,14 +1520,15 @@ def icontains(self, other: Any, **kw: Any) -> ColumnOperators: version of :meth:`.ColumnOperators.contains`. Produces a LIKE expression that tests against an insensitive match - for the middle of a string value:: + for the middle of a string value: + + .. sourcecode:: sql lower(column) LIKE '%' || lower(<other>) || '%' E.g.:: - stmt = select(sometable).\ - where(sometable.c.column.icontains("foobar")) + stmt = select(sometable).where(sometable.c.column.icontains("foobar")) Since the operator uses ``LIKE``, wildcard characters ``"%"`` and ``"_"`` that are present inside the <other> expression @@ -1513,7 +1557,9 @@ def icontains(self, other: Any, **kw: Any) -> ColumnOperators: somecolumn.icontains("foo%bar", autoescape=True) - Will render as:: + Will render as: + + .. sourcecode:: sql lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '/' @@ -1529,7 +1575,9 @@ def icontains(self, other: Any, **kw: Any) -> ColumnOperators: somecolumn.icontains("foo/%bar", escape="^") - Will render as:: + Will render as: + + .. sourcecode:: sql lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '^' @@ -1545,7 +1593,7 @@ def icontains(self, other: Any, **kw: Any) -> ColumnOperators: :meth:`.ColumnOperators.contains` - """ + """ # noqa: E501 return self.operate(icontains_op, other, **kw) def match(self, other: Any, **kwargs: Any) -> ColumnOperators: @@ -1569,7 +1617,7 @@ def match(self, other: Any, **kwargs: Any) -> ColumnOperators: :class:`_mysql.match` - MySQL specific construct with additional features. - * Oracle - renders ``CONTAINS(x, y)`` + * Oracle Database - renders ``CONTAINS(x, y)`` * other backends may provide special implementations. * Backends without any special implementation will emit the operator as "MATCH". This is compatible with SQLite, for @@ -1586,7 +1634,7 @@ def regexp_match( E.g.:: stmt = select(table.c.some_column).where( - table.c.some_column.regexp_match('^(b|c)') + table.c.some_column.regexp_match("^(b|c)") ) :meth:`_sql.ColumnOperators.regexp_match` attempts to resolve to @@ -1597,7 +1645,7 @@ def regexp_match( Examples include: * PostgreSQL - renders ``x ~ y`` or ``x !~ y`` when negated. - * Oracle - renders ``REGEXP_LIKE(x, y)`` + * Oracle Database - renders ``REGEXP_LIKE(x, y)`` * SQLite - uses SQLite's ``REGEXP`` placeholder operator and calls into the Python ``re.match()`` builtin. * other backends may provide special implementations. @@ -1605,9 +1653,9 @@ def regexp_match( the operator as "REGEXP" or "NOT REGEXP". This is compatible with SQLite and MySQL, for example. - Regular expression support is currently implemented for Oracle, - PostgreSQL, MySQL and MariaDB. Partial support is available for - SQLite. Support among third-party dialects may vary. + Regular expression support is currently implemented for Oracle + Database, PostgreSQL, MySQL and MariaDB. Partial support is available + for SQLite. Support among third-party dialects may vary. :param pattern: The regular expression pattern string or column clause. @@ -1644,11 +1692,7 @@ def regexp_replace( E.g.:: stmt = select( - table.c.some_column.regexp_replace( - 'b(..)', - 'X\1Y', - flags='g' - ) + table.c.some_column.regexp_replace("b(..)", "X\1Y", flags="g") ) :meth:`_sql.ColumnOperators.regexp_replace` attempts to resolve to @@ -1658,8 +1702,8 @@ def regexp_replace( **not backend agnostic**. Regular expression replacement support is currently implemented for - Oracle, PostgreSQL, MySQL 8 or greater and MariaDB. Support among - third-party dialects may vary. + Oracle Database, PostgreSQL, MySQL 8 or greater and MariaDB. Support + among third-party dialects may vary. :param pattern: The regular expression pattern string or column clause. diff --git a/libs/sqlalchemy/sql/roles.py b/libs/sqlalchemy/sql/roles.py index ae70ac3a5..da69616dc 100644 --- a/libs/sqlalchemy/sql/roles.py +++ b/libs/sqlalchemy/sql/roles.py @@ -1,5 +1,5 @@ # sql/roles.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/schema.py b/libs/sqlalchemy/sql/schema.py index 65c12b308..173b38c5f 100644 --- a/libs/sqlalchemy/sql/schema.py +++ b/libs/sqlalchemy/sql/schema.py @@ -1,5 +1,5 @@ # sql/schema.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -320,9 +320,10 @@ class Table( e.g.:: mytable = Table( - "mytable", metadata, - Column('mytable_id', Integer, primary_key=True), - Column('value', String(50)) + "mytable", + metadata, + Column("mytable_id", Integer, primary_key=True), + Column("value", String(50)), ) The :class:`_schema.Table` @@ -632,11 +633,13 @@ def __init__( :class:`_schema.Column` named "y":: - Table("mytable", metadata, - Column('y', Integer), - extend_existing=True, - autoload_with=engine - ) + Table( + "mytable", + metadata, + Column("y", Integer), + extend_existing=True, + autoload_with=engine, + ) .. seealso:: @@ -733,12 +736,12 @@ def listen_for_reflect(table, column_info): "handle the column reflection event" # ... + t = Table( - 'sometable', + "sometable", autoload_with=engine, - listeners=[ - ('column_reflect', listen_for_reflect) - ]) + listeners=[("column_reflect", listen_for_reflect)], + ) .. seealso:: @@ -1345,7 +1348,7 @@ def to_metadata( m1 = MetaData() - user = Table('user', m1, Column('id', Integer, primary_key=True)) + user = Table("user", m1, Column("id", Integer, primary_key=True)) m2 = MetaData() user_copy = user.to_metadata(m2) @@ -1369,7 +1372,7 @@ def to_metadata( unless set explicitly:: - m2 = MetaData(schema='newschema') + m2 = MetaData(schema="newschema") # user_copy_one will have "newschema" as the schema name user_copy_one = user.to_metadata(m2, schema=None) @@ -1396,15 +1399,16 @@ def to_metadata( E.g.:: - def referred_schema_fn(table, to_schema, - constraint, referred_schema): - if referred_schema == 'base_tables': + def referred_schema_fn(table, to_schema, constraint, referred_schema): + if referred_schema == "base_tables": return referred_schema else: return to_schema - new_table = table.to_metadata(m2, schema="alt_schema", - referred_schema_fn=referred_schema_fn) + + new_table = table.to_metadata( + m2, schema="alt_schema", referred_schema_fn=referred_schema_fn + ) :param name: optional string name indicating the target table name. If not specified or None, the table name is retained. This allows @@ -1412,7 +1416,7 @@ def referred_schema_fn(table, to_schema, :class:`_schema.MetaData` target with a new name. - """ + """ # noqa: E501 if name is None: name = self.name @@ -1544,7 +1548,7 @@ def __init__( unless they are a reserved word. Names with any number of upper case characters will be quoted and sent exactly. Note that this behavior applies even for databases which standardize upper - case names as case insensitive such as Oracle. + case names as case insensitive such as Oracle Database. The name field may be omitted at construction time and applied later, at any time before the Column is associated with a @@ -1557,10 +1561,10 @@ def __init__( as well, e.g.:: # use a type with arguments - Column('data', String(50)) + Column("data", String(50)) # use no arguments - Column('level', Integer) + Column("level", Integer) The ``type`` argument may be the second positional argument or specified by keyword. @@ -1616,8 +1620,8 @@ def __init__( will imply that database-specific keywords such as PostgreSQL ``SERIAL``, MySQL ``AUTO_INCREMENT``, or ``IDENTITY`` on SQL Server should also be rendered. Not every database backend has an - "implied" default generator available; for example the Oracle - backend always needs an explicit construct such as + "implied" default generator available; for example the Oracle Database + backends alway needs an explicit construct such as :class:`.Identity` to be included with a :class:`.Column` in order for the DDL rendered to include auto-generating constructs to also be produced in the database. @@ -1662,8 +1666,12 @@ def __init__( # turn on autoincrement for this column despite # the ForeignKey() - Column('id', ForeignKey('other.id'), - primary_key=True, autoincrement='ignore_fk') + Column( + "id", + ForeignKey("other.id"), + primary_key=True, + autoincrement="ignore_fk", + ) It is typically not desirable to have "autoincrement" enabled on a column that refers to another via foreign key, as such a column is @@ -1691,7 +1699,7 @@ def __init__( is not included as this is unnecessary and not recommended by the database vendor. See the section :ref:`sqlite_autoincrement` for more background. - * Oracle - The Oracle dialect has no default "autoincrement" + * Oracle Database - The Oracle Database dialects have no default "autoincrement" feature available at this time, instead the :class:`.Identity` construct is recommended to achieve this (the :class:`.Sequence` construct may also be used). @@ -1708,10 +1716,10 @@ def __init__( (see `https://www.python.org/dev/peps/pep-0249/#lastrowid <https://www.python.org/dev/peps/pep-0249/#lastrowid>`_) - * PostgreSQL, SQL Server, Oracle - use RETURNING or an equivalent + * PostgreSQL, SQL Server, Oracle Database - use RETURNING or an equivalent construct when rendering an INSERT statement, and then retrieving the newly generated primary key values after execution - * PostgreSQL, Oracle for :class:`_schema.Table` objects that + * PostgreSQL, Oracle Database for :class:`_schema.Table` objects that set :paramref:`_schema.Table.implicit_returning` to False - for a :class:`.Sequence` only, the :class:`.Sequence` is invoked explicitly before the INSERT statement takes place so that the @@ -1780,7 +1788,7 @@ def __init__( "some_table", metadata, Column("x", Integer), - Index("ix_some_table_x", "x") + Index("ix_some_table_x", "x"), ) To add the :paramref:`_schema.Index.unique` flag to the @@ -1862,14 +1870,22 @@ def __init__( String types will be emitted as-is, surrounded by single quotes:: - Column('x', Text, server_default="val") + Column("x", Text, server_default="val") + + will render: + + .. sourcecode:: sql x TEXT DEFAULT 'val' A :func:`~sqlalchemy.sql.expression.text` expression will be rendered as-is, without quotes:: - Column('y', DateTime, server_default=text('NOW()')) + Column("y", DateTime, server_default=text("NOW()")) + + will render: + + .. sourcecode:: sql y DATETIME DEFAULT NOW() @@ -1884,20 +1900,21 @@ def __init__( from sqlalchemy.dialects.postgresql import array engine = create_engine( - 'postgresql+psycopg2://scott:tiger@localhost/mydatabase' + "postgresql+psycopg2://scott:tiger@localhost/mydatabase" ) metadata_obj = MetaData() tbl = Table( - "foo", - metadata_obj, - Column("bar", - ARRAY(Text), - server_default=array(["biz", "bang", "bash"]) - ) + "foo", + metadata_obj, + Column( + "bar", ARRAY(Text), server_default=array(["biz", "bang", "bash"]) + ), ) metadata_obj.create_all(engine) - The above results in a table created with the following SQL:: + The above results in a table created with the following SQL: + + .. sourcecode:: sql CREATE TABLE foo ( bar TEXT[] DEFAULT ARRAY['biz', 'bang', 'bash'] @@ -1962,12 +1979,7 @@ def __init__( :class:`_schema.UniqueConstraint` construct explicitly at the level of the :class:`_schema.Table` construct itself:: - Table( - "some_table", - metadata, - Column("x", Integer), - UniqueConstraint("x") - ) + Table("some_table", metadata, Column("x", Integer), UniqueConstraint("x")) The :paramref:`_schema.UniqueConstraint.name` parameter of the unique constraint object is left at its default value @@ -2738,8 +2750,10 @@ class ForeignKey(DialectKWArgs, SchemaItem): object, e.g.:: - t = Table("remote_table", metadata, - Column("remote_id", ForeignKey("main_table.id")) + t = Table( + "remote_table", + metadata, + Column("remote_id", ForeignKey("main_table.id")), ) Note that ``ForeignKey`` is only a marker object that defines @@ -3388,12 +3402,11 @@ class ColumnDefault(DefaultGenerator, ABC): For example, the following:: - Column('foo', Integer, default=50) + Column("foo", Integer, default=50) Is equivalent to:: - Column('foo', Integer, ColumnDefault(50)) - + Column("foo", Integer, ColumnDefault(50)) """ @@ -3680,9 +3693,14 @@ class Sequence(HasSchemaAttr, IdentityOptions, DefaultGenerator): The :class:`.Sequence` is typically associated with a primary key column:: some_table = Table( - 'some_table', metadata, - Column('id', Integer, Sequence('some_table_seq', start=1), - primary_key=True) + "some_table", + metadata, + Column( + "id", + Integer, + Sequence("some_table_seq", start=1), + primary_key=True, + ), ) When CREATE TABLE is emitted for the above :class:`_schema.Table`, if the @@ -3793,11 +3811,11 @@ def __init__( :param cache: optional integer value; number of future values in the sequence which are calculated in advance. Renders the CACHE keyword - understood by Oracle and PostgreSQL. + understood by Oracle Database and PostgreSQL. :param order: optional boolean value; if ``True``, renders the - ORDER keyword, understood by Oracle, indicating the sequence is - definitively ordered. May be necessary to provide deterministic + ORDER keyword, understood by Oracle Database, indicating the sequence + is definitively ordered. May be necessary to provide deterministic ordering using Oracle RAC. :param data_type: The type to be returned by the sequence, for @@ -3958,7 +3976,7 @@ class FetchedValue(SchemaEventTarget): E.g.:: - Column('foo', Integer, FetchedValue()) + Column("foo", Integer, FetchedValue()) Would indicate that some trigger or default generator will create a new value for the ``foo`` column during an @@ -4024,11 +4042,11 @@ class DefaultClause(FetchedValue): For example, the following:: - Column('foo', Integer, server_default="50") + Column("foo", Integer, server_default="50") Is equivalent to:: - Column('foo', Integer, DefaultClause("50")) + Column("foo", Integer, DefaultClause("50")) """ @@ -4207,6 +4225,10 @@ def __init__( ] = _gather_expressions if processed_expressions is not None: + + # this is expected to be an empty list + assert not processed_expressions + self._pending_colargs = [] for ( expr, @@ -4857,11 +4879,13 @@ class PrimaryKeyConstraint(ColumnCollectionConstraint): :class:`_schema.Column` objects corresponding to those marked with the :paramref:`_schema.Column.primary_key` flag:: - >>> my_table = Table('mytable', metadata, - ... Column('id', Integer, primary_key=True), - ... Column('version_id', Integer, primary_key=True), - ... Column('data', String(50)) - ... ) + >>> my_table = Table( + ... "mytable", + ... metadata, + ... Column("id", Integer, primary_key=True), + ... Column("version_id", Integer, primary_key=True), + ... Column("data", String(50)), + ... ) >>> my_table.primary_key PrimaryKeyConstraint( Column('id', Integer(), table=<mytable>, @@ -4875,13 +4899,14 @@ class PrimaryKeyConstraint(ColumnCollectionConstraint): the "name" of the constraint can also be specified, as well as other options which may be recognized by dialects:: - my_table = Table('mytable', metadata, - Column('id', Integer), - Column('version_id', Integer), - Column('data', String(50)), - PrimaryKeyConstraint('id', 'version_id', - name='mytable_pk') - ) + my_table = Table( + "mytable", + metadata, + Column("id", Integer), + Column("version_id", Integer), + Column("data", String(50)), + PrimaryKeyConstraint("id", "version_id", name="mytable_pk"), + ) The two styles of column-specification should generally not be mixed. An warning is emitted if the columns present in the @@ -4899,13 +4924,14 @@ class PrimaryKeyConstraint(ColumnCollectionConstraint): primary key column collection from the :class:`_schema.Table` based on the flags:: - my_table = Table('mytable', metadata, - Column('id', Integer, primary_key=True), - Column('version_id', Integer, primary_key=True), - Column('data', String(50)), - PrimaryKeyConstraint(name='mytable_pk', - mssql_clustered=True) - ) + my_table = Table( + "mytable", + metadata, + Column("id", Integer, primary_key=True), + Column("version_id", Integer, primary_key=True), + Column("data", String(50)), + PrimaryKeyConstraint(name="mytable_pk", mssql_clustered=True), + ) """ @@ -5102,19 +5128,21 @@ class Index( E.g.:: - sometable = Table("sometable", metadata, - Column("name", String(50)), - Column("address", String(100)) - ) + sometable = Table( + "sometable", + metadata, + Column("name", String(50)), + Column("address", String(100)), + ) Index("some_index", sometable.c.name) For a no-frills, single column index, adding :class:`_schema.Column` also supports ``index=True``:: - sometable = Table("sometable", metadata, - Column("name", String(50), index=True) - ) + sometable = Table( + "sometable", metadata, Column("name", String(50), index=True) + ) For a composite index, multiple columns can be specified:: @@ -5133,22 +5161,26 @@ class Index( the names of the indexed columns can be specified as strings:: - Table("sometable", metadata, - Column("name", String(50)), - Column("address", String(100)), - Index("some_index", "name", "address") - ) + Table( + "sometable", + metadata, + Column("name", String(50)), + Column("address", String(100)), + Index("some_index", "name", "address"), + ) To support functional or expression-based indexes in this form, the :func:`_expression.text` construct may be used:: from sqlalchemy import text - Table("sometable", metadata, - Column("name", String(50)), - Column("address", String(100)), - Index("some_index", text("lower(name)")) - ) + Table( + "sometable", + metadata, + Column("name", String(50)), + Column("address", String(100)), + Index("some_index", text("lower(name)")), + ) .. seealso:: @@ -5906,9 +5938,11 @@ class Computed(FetchedValue, SchemaItem): from sqlalchemy import Computed - Table('square', metadata_obj, - Column('side', Float, nullable=False), - Column('area', Float, Computed('side * side')) + Table( + "square", + metadata_obj, + Column("side", Float, nullable=False), + Column("area", Float, Computed("side * side")), ) See the linked documentation below for complete details. @@ -6013,9 +6047,11 @@ class Identity(IdentityOptions, FetchedValue, SchemaItem): from sqlalchemy import Identity - Table('foo', metadata_obj, - Column('id', Integer, Identity()) - Column('description', Text), + Table( + "foo", + metadata_obj, + Column("id", Integer, Identity()), + Column("description", Text), ) See the linked documentation below for complete details. @@ -6075,7 +6111,7 @@ def __init__( :param on_null: Set to ``True`` to specify ON NULL in conjunction with a ``always=False`` identity column. This option is only supported on - some backends, like Oracle. + some backends, like Oracle Database. :param start: the starting index of the sequence. :param increment: the increment value of the sequence. diff --git a/libs/sqlalchemy/sql/selectable.py b/libs/sqlalchemy/sql/selectable.py index c6aa8a188..7660a1dbc 100644 --- a/libs/sqlalchemy/sql/selectable.py +++ b/libs/sqlalchemy/sql/selectable.py @@ -1,5 +1,5 @@ # sql/selectable.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -392,8 +392,7 @@ def prefix_with( stmt = table.insert().prefix_with("LOW_PRIORITY", dialect="mysql") # MySQL 5.7 optimizer hints - stmt = select(table).prefix_with( - "/*+ BKA(t1) */", dialect="mysql") + stmt = select(table).prefix_with("/*+ BKA(t1) */", dialect="mysql") Multiple prefixes can be specified by multiple calls to :meth:`_expression.HasPrefixes.prefix_with`. @@ -440,8 +439,13 @@ def suffix_with( E.g.:: - stmt = select(col1, col2).cte().suffix_with( - "cycle empno set y_cycle to 1 default 0", dialect="oracle") + stmt = ( + select(col1, col2) + .cte() + .suffix_with( + "cycle empno set y_cycle to 1 default 0", dialect="oracle" + ) + ) Multiple suffixes can be specified by multiple calls to :meth:`_expression.HasSuffixes.suffix_with`. @@ -503,7 +507,7 @@ def with_statement_hint(self, text: str, dialect_name: str = "*") -> Self: :meth:`_expression.Select.prefix_with` - generic SELECT prefixing which also can suit some database-specific HINT syntaxes such as - MySQL or Oracle optimizer hints + MySQL or Oracle Database optimizer hints """ return self._with_hint(None, text, dialect_name) @@ -525,9 +529,9 @@ def with_hint( **specific to a single table** to a statement, in a location that is **dialect-specific**. To add generic optimizer hints to the **beginning** of a statement ahead of the SELECT keyword such as - for MySQL or Oracle, use the :meth:`_expression.Select.prefix_with` - method. To add optimizer hints to the **end** of a statement such - as for PostgreSQL, use the + for MySQL or Oracle Database, use the + :meth:`_expression.Select.prefix_with` method. To add optimizer + hints to the **end** of a statement such as for PostgreSQL, use the :meth:`_expression.Select.with_statement_hint` method. The text of the hint is rendered in the appropriate @@ -537,23 +541,24 @@ def with_hint( ``selectable`` argument. The dialect implementation typically uses Python string substitution syntax with the token ``%(name)s`` to render the name of - the table or alias. E.g. when using Oracle, the + the table or alias. E.g. when using Oracle Database, the following:: - select(mytable).\ - with_hint(mytable, "index(%(name)s ix_mytable)") + select(mytable).with_hint(mytable, "index(%(name)s ix_mytable)") - Would render SQL as:: + Would render SQL as: + + .. sourcecode:: sql select /*+ index(mytable ix_mytable) */ ... from mytable The ``dialect_name`` option will limit the rendering of a particular hint to a particular backend. Such as, to add hints for both Oracle - and Sybase simultaneously:: + Database and MSSql simultaneously:: - select(mytable).\ - with_hint(mytable, "index(%(name)s ix_mytable)", 'oracle').\ - with_hint(mytable, "WITH INDEX ix_mytable", 'mssql') + select(mytable).with_hint( + mytable, "index(%(name)s ix_mytable)", "oracle" + ).with_hint(mytable, "WITH INDEX ix_mytable", "mssql") .. seealso:: @@ -561,7 +566,7 @@ def with_hint( :meth:`_expression.Select.prefix_with` - generic SELECT prefixing which also can suit some database-specific HINT syntaxes such as - MySQL or Oracle optimizer hints + MySQL or Oracle Database optimizer hints """ @@ -665,11 +670,14 @@ def join( from sqlalchemy import join - j = user_table.join(address_table, - user_table.c.id == address_table.c.user_id) + j = user_table.join( + address_table, user_table.c.id == address_table.c.user_id + ) stmt = select(user_table).select_from(j) - would emit SQL along the lines of:: + would emit SQL along the lines of: + + .. sourcecode:: sql SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id @@ -715,15 +723,15 @@ def outerjoin( from sqlalchemy import outerjoin - j = user_table.outerjoin(address_table, - user_table.c.id == address_table.c.user_id) + j = user_table.outerjoin( + address_table, user_table.c.id == address_table.c.user_id + ) The above is equivalent to:: j = user_table.join( - address_table, - user_table.c.id == address_table.c.user_id, - isouter=True) + address_table, user_table.c.id == address_table.c.user_id, isouter=True + ) :param right: the right side of the join; this is any :class:`_expression.FromClause` object such as a @@ -745,7 +753,7 @@ def outerjoin( :class:`_expression.Join` - """ + """ # noqa: E501 return Join(self, right, onclause, True, full) @@ -756,7 +764,7 @@ def alias( E.g.:: - a2 = some_table.alias('a2') + a2 = some_table.alias("a2") The above code creates an :class:`_expression.Alias` object which can be used @@ -893,7 +901,7 @@ def entity_namespace(self) -> _EntityNamespace: This is the namespace that is used to resolve "filter_by()" type expressions, such as:: - stmt.filter_by(address='some address') + stmt.filter_by(address="some address") It defaults to the ``.c`` collection, however internally it can be overridden using the "entity_namespace" annotation to deliver @@ -1036,7 +1044,7 @@ def table_valued(self) -> TableValuedColumn[Any]: A :class:`_sql.TableValuedColumn` is a :class:`_sql.ColumnElement` that represents a complete row in a table. Support for this construct is backend dependent, and is supported in various forms by backends - such as PostgreSQL, Oracle and SQL Server. + such as PostgreSQL, Oracle Database and SQL Server. E.g.: @@ -1076,7 +1084,11 @@ class SelectLabelStyle(Enum): >>> from sqlalchemy import table, column, select, true, LABEL_STYLE_NONE >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) - >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_NONE)) + >>> print( + ... select(table1, table2) + ... .join(table2, true()) + ... .set_label_style(LABEL_STYLE_NONE) + ... ) {printsql}SELECT table1.columna, table1.columnb, table2.columna, table2.columnc FROM table1 JOIN table2 ON true @@ -1098,10 +1110,20 @@ class SelectLabelStyle(Enum): .. sourcecode:: pycon+sql - >>> from sqlalchemy import table, column, select, true, LABEL_STYLE_TABLENAME_PLUS_COL + >>> from sqlalchemy import ( + ... table, + ... column, + ... select, + ... true, + ... LABEL_STYLE_TABLENAME_PLUS_COL, + ... ) >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) - >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL)) + >>> print( + ... select(table1, table2) + ... .join(table2, true()) + ... .set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL) + ... ) {printsql}SELECT table1.columna AS table1_columna, table1.columnb AS table1_columnb, table2.columna AS table2_columna, table2.columnc AS table2_columnc FROM table1 JOIN table2 ON true @@ -1127,10 +1149,20 @@ class SelectLabelStyle(Enum): .. sourcecode:: pycon+sql - >>> from sqlalchemy import table, column, select, true, LABEL_STYLE_DISAMBIGUATE_ONLY + >>> from sqlalchemy import ( + ... table, + ... column, + ... select, + ... true, + ... LABEL_STYLE_DISAMBIGUATE_ONLY, + ... ) >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) - >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_DISAMBIGUATE_ONLY)) + >>> print( + ... select(table1, table2) + ... .join(table2, true()) + ... .set_label_style(LABEL_STYLE_DISAMBIGUATE_ONLY) + ... ) {printsql}SELECT table1.columna, table1.columnb, table2.columna AS columna_1, table2.columnc FROM table1 JOIN table2 ON true @@ -1528,7 +1560,9 @@ def select(self) -> Select[Any]: stmt = stmt.select() - The above will produce a SQL string resembling:: + The above will produce a SQL string resembling: + + .. sourcecode:: sql SELECT table_a.id, table_a.col, table_b.id, table_b.a_id FROM table_a JOIN table_b ON table_a.id = table_b.a_id @@ -1720,7 +1754,7 @@ class Alias(roles.DMLTableRole, FromClauseAlias): Represents an alias, as typically applied to any table or sub-select within a SQL statement using the ``AS`` keyword (or - without the keyword on certain databases such as Oracle). + without the keyword on certain databases such as Oracle Database). This object is constructed from the :func:`_expression.alias` module level function as well as the :meth:`_expression.FromClause.alias` @@ -1762,7 +1796,9 @@ class TableValuedAlias(LateralFromClause, Alias): .. sourcecode:: pycon+sql >>> from sqlalchemy import select, func - >>> fn = func.json_array_elements_text('["one", "two", "three"]').table_valued("value") + >>> fn = func.json_array_elements_text('["one", "two", "three"]').table_valued( + ... "value" + ... ) >>> print(select(fn.c.value)) {printsql}SELECT anon_1.value FROM json_array_elements_text(:json_array_elements_text_1) AS anon_1 @@ -1881,8 +1917,9 @@ def render_derived( >>> print( ... select( - ... func.unnest(array(["one", "two", "three"])). - table_valued("x", with_ordinality="o").render_derived() + ... func.unnest(array(["one", "two", "three"])) + ... .table_valued("x", with_ordinality="o") + ... .render_derived() ... ) ... ) {printsql}SELECT anon_1.x, anon_1.o @@ -1896,9 +1933,7 @@ def render_derived( >>> print( ... select( - ... func.json_to_recordset( - ... '[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]' - ... ) + ... func.json_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') ... .table_valued(column("a", Integer), column("b", String)) ... .render_derived(with_types=True) ... ) @@ -2455,16 +2490,20 @@ def add_cte(self, *ctes: CTE, nest_here: bool = False) -> Self: E.g.:: from sqlalchemy import table, column, select - t = table('t', column('c1'), column('c2')) + + t = table("t", column("c1"), column("c2")) ins = t.insert().values({"c1": "x", "c2": "y"}).cte() stmt = select(t).add_cte(ins) - Would render:: + Would render: + + .. sourcecode:: sql - WITH anon_1 AS - (INSERT INTO t (c1, c2) VALUES (:param_1, :param_2)) + WITH anon_1 AS ( + INSERT INTO t (c1, c2) VALUES (:param_1, :param_2) + ) SELECT t.c1, t.c2 FROM t @@ -2480,9 +2519,7 @@ def add_cte(self, *ctes: CTE, nest_here: bool = False) -> Self: t = table("t", column("c1"), column("c2")) - delete_statement_cte = ( - t.delete().where(t.c.c1 < 1).cte("deletions") - ) + delete_statement_cte = t.delete().where(t.c.c1 < 1).cte("deletions") insert_stmt = insert(t).values({"c1": 1, "c2": 2}) update_statement = insert_stmt.on_conflict_do_update( @@ -2495,10 +2532,13 @@ def add_cte(self, *ctes: CTE, nest_here: bool = False) -> Self: print(update_statement) - The above statement renders as:: + The above statement renders as: + + .. sourcecode:: sql - WITH deletions AS - (DELETE FROM t WHERE t.c1 < %(c1_1)s) + WITH deletions AS ( + DELETE FROM t WHERE t.c1 < %(c1_1)s + ) INSERT INTO t (c1, c2) VALUES (%(c1)s, %(c2)s) ON CONFLICT (c1) DO UPDATE SET c1 = excluded.c1, c2 = excluded.c2 @@ -2522,10 +2562,8 @@ def add_cte(self, *ctes: CTE, nest_here: bool = False) -> Self: :paramref:`.HasCTE.cte.nesting` - """ - opt = _CTEOpts( - nest_here, - ) + """ # noqa: E501 + opt = _CTEOpts(nest_here) for cte in ctes: cte = coercions.expect(roles.IsCTERole, cte) self._independent_ctes += (cte,) @@ -2593,95 +2631,123 @@ def cte( Example 1, non recursive:: - from sqlalchemy import (Table, Column, String, Integer, - MetaData, select, func) + from sqlalchemy import ( + Table, + Column, + String, + Integer, + MetaData, + select, + func, + ) metadata = MetaData() - orders = Table('orders', metadata, - Column('region', String), - Column('amount', Integer), - Column('product', String), - Column('quantity', Integer) + orders = Table( + "orders", + metadata, + Column("region", String), + Column("amount", Integer), + Column("product", String), + Column("quantity", Integer), ) - regional_sales = select( - orders.c.region, - func.sum(orders.c.amount).label('total_sales') - ).group_by(orders.c.region).cte("regional_sales") + regional_sales = ( + select(orders.c.region, func.sum(orders.c.amount).label("total_sales")) + .group_by(orders.c.region) + .cte("regional_sales") + ) - top_regions = select(regional_sales.c.region).\ - where( - regional_sales.c.total_sales > - select( - func.sum(regional_sales.c.total_sales) / 10 - ) - ).cte("top_regions") + top_regions = ( + select(regional_sales.c.region) + .where( + regional_sales.c.total_sales + > select(func.sum(regional_sales.c.total_sales) / 10) + ) + .cte("top_regions") + ) - statement = select( - orders.c.region, - orders.c.product, - func.sum(orders.c.quantity).label("product_units"), - func.sum(orders.c.amount).label("product_sales") - ).where(orders.c.region.in_( - select(top_regions.c.region) - )).group_by(orders.c.region, orders.c.product) + statement = ( + select( + orders.c.region, + orders.c.product, + func.sum(orders.c.quantity).label("product_units"), + func.sum(orders.c.amount).label("product_sales"), + ) + .where(orders.c.region.in_(select(top_regions.c.region))) + .group_by(orders.c.region, orders.c.product) + ) result = conn.execute(statement).fetchall() Example 2, WITH RECURSIVE:: - from sqlalchemy import (Table, Column, String, Integer, - MetaData, select, func) + from sqlalchemy import ( + Table, + Column, + String, + Integer, + MetaData, + select, + func, + ) metadata = MetaData() - parts = Table('parts', metadata, - Column('part', String), - Column('sub_part', String), - Column('quantity', Integer), + parts = Table( + "parts", + metadata, + Column("part", String), + Column("sub_part", String), + Column("quantity", Integer), ) - included_parts = select(\ - parts.c.sub_part, parts.c.part, parts.c.quantity\ - ).\ - where(parts.c.part=='our part').\ - cte(recursive=True) + included_parts = ( + select(parts.c.sub_part, parts.c.part, parts.c.quantity) + .where(parts.c.part == "our part") + .cte(recursive=True) + ) incl_alias = included_parts.alias() parts_alias = parts.alias() included_parts = included_parts.union_all( select( - parts_alias.c.sub_part, - parts_alias.c.part, - parts_alias.c.quantity - ).\ - where(parts_alias.c.part==incl_alias.c.sub_part) + parts_alias.c.sub_part, parts_alias.c.part, parts_alias.c.quantity + ).where(parts_alias.c.part == incl_alias.c.sub_part) ) statement = select( - included_parts.c.sub_part, - func.sum(included_parts.c.quantity). - label('total_quantity') - ).\ - group_by(included_parts.c.sub_part) + included_parts.c.sub_part, + func.sum(included_parts.c.quantity).label("total_quantity"), + ).group_by(included_parts.c.sub_part) result = conn.execute(statement).fetchall() Example 3, an upsert using UPDATE and INSERT with CTEs:: from datetime import date - from sqlalchemy import (MetaData, Table, Column, Integer, - Date, select, literal, and_, exists) + from sqlalchemy import ( + MetaData, + Table, + Column, + Integer, + Date, + select, + literal, + and_, + exists, + ) metadata = MetaData() - visitors = Table('visitors', metadata, - Column('product_id', Integer, primary_key=True), - Column('date', Date, primary_key=True), - Column('count', Integer), + visitors = Table( + "visitors", + metadata, + Column("product_id", Integer, primary_key=True), + Column("date", Date, primary_key=True), + Column("count", Integer), ) # add 5 visitors for the product_id == 1 @@ -2691,31 +2757,31 @@ def cte( update_cte = ( visitors.update() - .where(and_(visitors.c.product_id == product_id, - visitors.c.date == day)) + .where( + and_(visitors.c.product_id == product_id, visitors.c.date == day) + ) .values(count=visitors.c.count + count) .returning(literal(1)) - .cte('update_cte') + .cte("update_cte") ) upsert = visitors.insert().from_select( [visitors.c.product_id, visitors.c.date, visitors.c.count], - select(literal(product_id), literal(day), literal(count)) - .where(~exists(update_cte.select())) + select(literal(product_id), literal(day), literal(count)).where( + ~exists(update_cte.select()) + ), ) connection.execute(upsert) Example 4, Nesting CTE (SQLAlchemy 1.4.24 and above):: - value_a = select( - literal("root").label("n") - ).cte("value_a") + value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one - value_a_nested = select( - literal("nesting").label("n") - ).cte("value_a", nesting=True) + value_a_nested = select(literal("nesting").label("n")).cte( + "value_a", nesting=True + ) # Nesting CTEs takes ascendency locally # over the CTEs at a higher level @@ -2724,7 +2790,9 @@ def cte( value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b")) The above query will render the second CTE nested inside the first, - shown with inline parameters below as:: + shown with inline parameters below as: + + .. sourcecode:: sql WITH value_a AS @@ -2739,21 +2807,17 @@ def cte( The same CTE can be set up using the :meth:`.HasCTE.add_cte` method as follows (SQLAlchemy 2.0 and above):: - value_a = select( - literal("root").label("n") - ).cte("value_a") + value_a = select(literal("root").label("n")).cte("value_a") # A nested CTE with the same name as the root one - value_a_nested = select( - literal("nesting").label("n") - ).cte("value_a") + value_a_nested = select(literal("nesting").label("n")).cte("value_a") # Nesting CTEs takes ascendency locally # over the CTEs at a higher level value_b = ( - select(value_a_nested.c.n). - add_cte(value_a_nested, nest_here=True). - cte("value_b") + select(value_a_nested.c.n) + .add_cte(value_a_nested, nest_here=True) + .cte("value_b") ) value_ab = select(value_a.c.n.label("a"), value_b.c.n.label("b")) @@ -2768,9 +2832,7 @@ def cte( Column("right", Integer), ) - root_node = select(literal(1).label("node")).cte( - "nodes", recursive=True - ) + root_node = select(literal(1).label("node")).cte("nodes", recursive=True) left_edge = select(edge.c.left).join( root_node, edge.c.right == root_node.c.node @@ -2783,7 +2845,9 @@ def cte( subgraph = select(subgraph_cte) - The above query will render 2 UNIONs inside the recursive CTE:: + The above query will render 2 UNIONs inside the recursive CTE: + + .. sourcecode:: sql WITH RECURSIVE nodes(node) AS ( SELECT 1 AS node @@ -2801,7 +2865,7 @@ def cte( :meth:`_orm.Query.cte` - ORM version of :meth:`_expression.HasCTE.cte`. - """ + """ # noqa: E501 return CTE._construct( self, name=name, recursive=recursive, nesting=nesting ) @@ -2958,10 +3022,11 @@ class TableClause(roles.DMLTableRole, Immutable, NamedFromClause): from sqlalchemy import table, column - user = table("user", - column("id"), - column("name"), - column("description"), + user = table( + "user", + column("id"), + column("name"), + column("description"), ) The :class:`_expression.TableClause` construct serves as the base for @@ -3067,7 +3132,7 @@ def insert(self) -> util.preloaded.sql_dml.Insert: E.g.:: - table.insert().values(name='foo') + table.insert().values(name="foo") See :func:`_expression.insert` for argument and usage information. @@ -3082,7 +3147,7 @@ def update(self) -> Update: E.g.:: - table.update().where(table.c.id==7).values(name='foo') + table.update().where(table.c.id == 7).values(name="foo") See :func:`_expression.update` for argument and usage information. @@ -3098,7 +3163,7 @@ def delete(self) -> Delete: E.g.:: - table.delete().where(table.c.id==7) + table.delete().where(table.c.id == 7) See :func:`_expression.delete` for argument and usage information. @@ -3286,7 +3351,7 @@ def data(self, values: Sequence[Tuple[Any, ...]]) -> Self: E.g.:: - my_values = my_values.data([(1, 'value 1'), (2, 'value2')]) + my_values = my_values.data([(1, "value 1"), (2, "value2")]) :param values: a sequence (i.e. list) of tuples that map to the column expressions given in the :class:`_expression.Values` @@ -3631,7 +3696,9 @@ def subquery(self, name: Optional[str] = None) -> Subquery: stmt = select(table.c.id, table.c.name) - The above statement might look like:: + The above statement might look like: + + .. sourcecode:: sql SELECT table.id, table.name FROM table @@ -3642,7 +3709,9 @@ def subquery(self, name: Optional[str] = None) -> Subquery: subq = stmt.subquery() new_stmt = select(subq) - The above renders as:: + The above renders as: + + .. sourcecode:: sql SELECT anon_1.id, anon_1.name FROM (SELECT table.id, table.name FROM table) AS anon_1 @@ -3836,13 +3905,17 @@ def with_for_update( stmt = select(table).with_for_update(nowait=True) - On a database like PostgreSQL or Oracle, the above would render a - statement like:: + On a database like PostgreSQL or Oracle Database, the above would + render a statement like: + + .. sourcecode:: sql SELECT table.a, table.b FROM table FOR UPDATE NOWAIT on other backends, the ``nowait`` option is ignored and instead - would produce:: + would produce: + + .. sourcecode:: sql SELECT table.a, table.b FROM table FOR UPDATE @@ -3852,7 +3925,7 @@ def with_for_update( variants. :param nowait: boolean; will render ``FOR UPDATE NOWAIT`` on Oracle - and PostgreSQL dialects. + Database and PostgreSQL dialects. :param read: boolean; will render ``LOCK IN SHARE MODE`` on MySQL, ``FOR SHARE`` on PostgreSQL. On PostgreSQL, when combined with @@ -3861,13 +3934,13 @@ def with_for_update( :param of: SQL expression or list of SQL expression elements, (typically :class:`_schema.Column` objects or a compatible expression, for some backends may also be a table expression) which will render - into a ``FOR UPDATE OF`` clause; supported by PostgreSQL, Oracle, some - MySQL versions and possibly others. May render as a table or as a - column depending on backend. + into a ``FOR UPDATE OF`` clause; supported by PostgreSQL, Oracle + Database, some MySQL versions and possibly others. May render as a + table or as a column depending on backend. - :param skip_locked: boolean, will render ``FOR UPDATE SKIP LOCKED`` - on Oracle and PostgreSQL dialects or ``FOR SHARE SKIP LOCKED`` if - ``read=True`` is also specified. + :param skip_locked: boolean, will render ``FOR UPDATE SKIP LOCKED`` on + Oracle Database and PostgreSQL dialects or ``FOR SHARE SKIP LOCKED`` + if ``read=True`` is also specified. :param key_share: boolean, will render ``FOR NO KEY UPDATE``, or if combined with ``read=True`` will render ``FOR KEY SHARE``, @@ -4073,10 +4146,10 @@ def fetch( """Return a new selectable with the given FETCH FIRST criterion applied. - This is a numeric value which usually renders as - ``FETCH {FIRST | NEXT} [ count ] {ROW | ROWS} {ONLY | WITH TIES}`` - expression in the resulting select. This functionality is - is currently implemented for Oracle, PostgreSQL, MSSQL. + This is a numeric value which usually renders as ``FETCH {FIRST | NEXT} + [ count ] {ROW | ROWS} {ONLY | WITH TIES}`` expression in the resulting + select. This functionality is is currently implemented for Oracle + Database, PostgreSQL, MSSQL. Use :meth:`_sql.GenerativeSelect.offset` to specify the offset. @@ -4259,8 +4332,7 @@ def group_by( e.g.:: - stmt = select(table.c.name, func.max(table.c.stat)).\ - group_by(table.c.name) + stmt = select(table.c.name, func.max(table.c.stat)).group_by(table.c.name) :param \*clauses: a series of :class:`_expression.ColumnElement` constructs @@ -4273,7 +4345,7 @@ def group_by( :ref:`tutorial_order_by_label` - in the :ref:`unified_tutorial` - """ + """ # noqa: E501 if not clauses and __first is None: self._group_by_clauses = () @@ -5346,11 +5418,17 @@ def join( E.g.:: - stmt = select(user_table).join(address_table, user_table.c.id == address_table.c.user_id) + stmt = select(user_table).join( + address_table, user_table.c.id == address_table.c.user_id + ) - The above statement generates SQL similar to:: + The above statement generates SQL similar to: - SELECT user.id, user.name FROM user JOIN address ON user.id = address.user_id + .. sourcecode:: sql + + SELECT user.id, user.name + FROM user + JOIN address ON user.id = address.user_id .. versionchanged:: 1.4 :meth:`_expression.Select.join` now creates a :class:`_sql.Join` object between a :class:`_sql.FromClause` @@ -5454,7 +5532,9 @@ def join_from( user_table, address_table, user_table.c.id == address_table.c.user_id ) - The above statement generates SQL similar to:: + The above statement generates SQL similar to: + + .. sourcecode:: sql SELECT user.id, user.name, address.id, address.email, address.user_id FROM user JOIN address ON user.id = address.user_id @@ -6062,9 +6142,12 @@ def distinct(self, *expr: _ColumnExpressionArgument[Any]) -> Self: E.g.:: from sqlalchemy import select + stmt = select(users_table.c.id, users_table.c.name).distinct() - The above would produce an statement resembling:: + The above would produce an statement resembling: + + .. sourcecode:: sql SELECT DISTINCT user.id, user.name FROM user @@ -6100,12 +6183,11 @@ def select_from(self, *froms: _FromClauseArgument) -> Self: E.g.:: - table1 = table('t1', column('a')) - table2 = table('t2', column('b')) - s = select(table1.c.a).\ - select_from( - table1.join(table2, table1.c.a==table2.c.b) - ) + table1 = table("t1", column("a")) + table2 = table("t2", column("b")) + s = select(table1.c.a).select_from( + table1.join(table2, table1.c.a == table2.c.b) + ) The "from" list is a unique set on the identity of each element, so adding an already present :class:`_schema.Table` @@ -6124,7 +6206,7 @@ def select_from(self, *froms: _FromClauseArgument) -> Self: if desired, in the case that the FROM clause cannot be fully derived from the columns clause:: - select(func.count('*')).select_from(table1) + select(func.count("*")).select_from(table1) """ @@ -6277,8 +6359,8 @@ def selected_columns( :class:`_expression.ColumnElement` objects are directly present as they were given, e.g.:: - col1 = column('q', Integer) - col2 = column('p', Integer) + col1 = column("q", Integer) + col2 = column("p", Integer) stmt = select(col1, col2) Above, ``stmt.selected_columns`` would be a collection that contains @@ -6293,7 +6375,8 @@ def selected_columns( criteria, e.g.:: def filter_on_id(my_select, id): - return my_select.where(my_select.selected_columns['id'] == id) + return my_select.where(my_select.selected_columns["id"] == id) + stmt = select(MyModel) @@ -6742,7 +6825,9 @@ def select(self) -> Select[Tuple[bool]]: stmt = exists(some_table.c.id).where(some_table.c.id == 5).select() - This will produce a statement resembling:: + This will produce a statement resembling: + + .. sourcecode:: sql SELECT EXISTS (SELECT id FROM some_table WHERE some_table = :param) AS anon_1 diff --git a/libs/sqlalchemy/sql/sqltypes.py b/libs/sqlalchemy/sql/sqltypes.py index dd7110e88..ee471a6c4 100644 --- a/libs/sqlalchemy/sql/sqltypes.py +++ b/libs/sqlalchemy/sql/sqltypes.py @@ -1,5 +1,5 @@ # sql/sqltypes.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -59,9 +59,11 @@ from ..engine import processors from ..util import langhelpers from ..util import OrderedDict +from ..util import warn_deprecated +from ..util.typing import get_args from ..util.typing import is_literal +from ..util.typing import is_pep695 from ..util.typing import Literal -from ..util.typing import typing_get_args if TYPE_CHECKING: from ._typing import _ColumnExpressionArgument @@ -202,7 +204,7 @@ def __init__( .. sourcecode:: pycon+sql >>> from sqlalchemy import cast, select, String - >>> print(select(cast('some string', String(collation='utf8')))) + >>> print(select(cast("some string", String(collation="utf8")))) {printsql}SELECT CAST(:param_1 AS VARCHAR COLLATE utf8) AS anon_1 .. note:: @@ -274,8 +276,8 @@ class Unicode(String): The :class:`.Unicode` type is a :class:`.String` subclass that assumes input and output strings that may contain non-ASCII characters, and for some backends implies an underlying column type that is explicitly - supporting of non-ASCII data, such as ``NVARCHAR`` on Oracle and SQL - Server. This will impact the output of ``CREATE TABLE`` statements and + supporting of non-ASCII data, such as ``NVARCHAR`` on Oracle Database and + SQL Server. This will impact the output of ``CREATE TABLE`` statements and ``CAST`` functions at the dialect level. The character encoding used by the :class:`.Unicode` type that is used to @@ -306,7 +308,6 @@ class Unicode(String): :meth:`.DialectEvents.do_setinputsizes` - """ __visit_name__ = "unicode" @@ -634,16 +635,16 @@ def __init__( indicates a number of digits for the generic :class:`_sqltypes.Float` datatype. - .. note:: For the Oracle backend, the + .. note:: For the Oracle Database backend, the :paramref:`_sqltypes.Float.precision` parameter is not accepted - when rendering DDL, as Oracle does not support float precision + when rendering DDL, as Oracle Database does not support float precision specified as a number of decimal places. Instead, use the - Oracle-specific :class:`_oracle.FLOAT` datatype and specify the + Oracle Database-specific :class:`_oracle.FLOAT` datatype and specify the :paramref:`_oracle.FLOAT.binary_precision` parameter. This is new in version 2.0 of SQLAlchemy. To create a database agnostic :class:`_types.Float` that - separately specifies binary precision for Oracle, use + separately specifies binary precision for Oracle Database, use :meth:`_types.TypeEngine.with_variant` as follows:: from sqlalchemy import Column @@ -652,7 +653,7 @@ def __init__( Column( "float_data", - Float(5).with_variant(oracle.FLOAT(binary_precision=16), "oracle") + Float(5).with_variant(oracle.FLOAT(binary_precision=16), "oracle"), ) :param asdecimal: the same flag as that of :class:`.Numeric`, but @@ -754,7 +755,7 @@ def __init__(self, timezone: bool = False): to make use of the :class:`_types.TIMESTAMP` datatype directly when using this flag, as some databases include separate generic date/time-holding types distinct from the timezone-capable - TIMESTAMP datatype, such as Oracle. + TIMESTAMP datatype, such as Oracle Database. """ @@ -1227,15 +1228,14 @@ class Enum(String, SchemaType, Emulated, TypeEngine[Union[str, enum.Enum]]): import enum from sqlalchemy import Enum + class MyEnum(enum.Enum): one = 1 two = 2 three = 3 - t = Table( - 'data', MetaData(), - Column('value', Enum(MyEnum)) - ) + + t = Table("data", MetaData(), Column("value", Enum(MyEnum))) connection.execute(t.insert(), {"value": MyEnum.two}) assert connection.scalar(t.select()) is MyEnum.two @@ -1513,6 +1513,19 @@ def _resolve_for_python_type( native_enum = None + def process_literal(pt): + # for a literal, where we need to get its contents, parse it out. + enum_args = get_args(pt) + bad_args = [arg for arg in enum_args if not isinstance(arg, str)] + if bad_args: + raise exc.ArgumentError( + f"Can't create string-based Enum datatype from non-string " + f"values: {', '.join(repr(x) for x in bad_args)}. Please " + f"provide an explicit Enum datatype for this Python type" + ) + native_enum = False + return enum_args, native_enum + if not we_are_generic_form and python_type is matched_on: # if we have enumerated values, and the incoming python # type is exactly the one that matched in the type map, @@ -1521,16 +1534,32 @@ def _resolve_for_python_type( enum_args = self._enums_argument elif is_literal(python_type): - # for a literal, where we need to get its contents, parse it out. - enum_args = typing_get_args(python_type) - bad_args = [arg for arg in enum_args if not isinstance(arg, str)] - if bad_args: + enum_args, native_enum = process_literal(python_type) + elif is_pep695(python_type): + value = python_type.__value__ + if is_pep695(value): + new_value = value + while is_pep695(new_value): + new_value = new_value.__value__ + if is_literal(new_value): + value = new_value + warn_deprecated( + f"Mapping recursive TypeAliasType '{python_type}' " + "that resolve to literal to generate an Enum is " + "deprecated. SQLAlchemy 2.1 will not support this " + "use case. Please avoid using recursing " + "TypeAliasType.", + "2.0", + ) + if not is_literal(value): raise exc.ArgumentError( - f"Can't create string-based Enum datatype from non-string " - f"values: {', '.join(repr(x) for x in bad_args)}. Please " - f"provide an explicit Enum datatype for this Python type" + f"Can't associate TypeAliasType '{python_type}' to an " + "Enum since it's not a direct alias of a Literal. Only " + "aliases in this form `type my_alias = Literal['a', " + "'b']` are supported when generating Enums." ) - native_enum = False + enum_args, native_enum = process_literal(value) + elif isinstance(python_type, type) and issubclass( python_type, enum.Enum ): @@ -2030,10 +2059,9 @@ def _type_affinity(self) -> Type[Interval]: class Interval(Emulated, _AbstractInterval, TypeDecorator[dt.timedelta]): """A type for ``datetime.timedelta()`` objects. - The Interval type deals with ``datetime.timedelta`` objects. In - PostgreSQL and Oracle, the native ``INTERVAL`` type is used; for others, - the value is stored as a date which is relative to the "epoch" - (Jan. 1, 1970). + The Interval type deals with ``datetime.timedelta`` objects. In PostgreSQL + and Oracle Database, the native ``INTERVAL`` type is used; for others, the + value is stored as a date which is relative to the "epoch" (Jan. 1, 1970). Note that the ``Interval`` type does not currently provide date arithmetic operations on platforms which do not support interval types natively. Such @@ -2058,16 +2086,16 @@ def __init__( :param native: when True, use the actual INTERVAL type provided by the database, if - supported (currently PostgreSQL, Oracle). + supported (currently PostgreSQL, Oracle Database). Otherwise, represent the interval data as an epoch value regardless. :param second_precision: For native interval types which support a "fractional seconds precision" parameter, - i.e. Oracle and PostgreSQL + i.e. Oracle Database and PostgreSQL :param day_precision: for native interval types which - support a "day precision" parameter, i.e. Oracle. + support a "day precision" parameter, i.e. Oracle Database. """ super().__init__() @@ -2177,15 +2205,16 @@ class JSON(Indexable, TypeEngine[Any]): The :class:`_types.JSON` type stores arbitrary JSON format data, e.g.:: - data_table = Table('data_table', metadata, - Column('id', Integer, primary_key=True), - Column('data', JSON) + data_table = Table( + "data_table", + metadata, + Column("id", Integer, primary_key=True), + Column("data", JSON), ) with engine.connect() as conn: conn.execute( - data_table.insert(), - {"data": {"key1": "value1", "key2": "value2"}} + data_table.insert(), {"data": {"key1": "value1", "key2": "value2"}} ) **JSON-Specific Expression Operators** @@ -2195,7 +2224,7 @@ class JSON(Indexable, TypeEngine[Any]): * Keyed index operations:: - data_table.c.data['some key'] + data_table.c.data["some key"] * Integer index operations:: @@ -2203,7 +2232,7 @@ class JSON(Indexable, TypeEngine[Any]): * Path index operations:: - data_table.c.data[('key_1', 'key_2', 5, ..., 'key_n')] + data_table.c.data[("key_1", "key_2", 5, ..., "key_n")] * Data casters for specific JSON element types, subsequent to an index or path operation being invoked:: @@ -2258,13 +2287,12 @@ class JSON(Indexable, TypeEngine[Any]): from sqlalchemy import cast, type_coerce from sqlalchemy import String, JSON - cast( - data_table.c.data['some_key'], String - ) == type_coerce(55, JSON) + + cast(data_table.c.data["some_key"], String) == type_coerce(55, JSON) The above case now works directly as:: - data_table.c.data['some_key'].as_integer() == 5 + data_table.c.data["some_key"].as_integer() == 5 For details on the previous comparison approach within the 1.3.x series, see the documentation for SQLAlchemy 1.2 or the included HTML @@ -2295,6 +2323,7 @@ class JSON(Indexable, TypeEngine[Any]): should be SQL NULL as opposed to JSON ``"null"``:: from sqlalchemy import null + conn.execute(table.insert(), {"json_value": null()}) To insert or select against a value that is JSON ``"null"``, use the @@ -2327,7 +2356,8 @@ class JSON(Indexable, TypeEngine[Any]): engine = create_engine( "sqlite://", - json_serializer=lambda obj: json.dumps(obj, ensure_ascii=False)) + json_serializer=lambda obj: json.dumps(obj, ensure_ascii=False), + ) .. versionchanged:: 1.3.7 @@ -2345,7 +2375,7 @@ class JSON(Indexable, TypeEngine[Any]): :class:`sqlalchemy.dialects.sqlite.JSON` - """ + """ # noqa: E501 __visit_name__ = "JSON" @@ -2379,8 +2409,7 @@ class JSON(Indexable, TypeEngine[Any]): transparent method is to use :func:`_expression.text`:: Table( - 'my_table', metadata, - Column('json_data', JSON, default=text("'null'")) + "my_table", metadata, Column("json_data", JSON, default=text("'null'")) ) While it is possible to use :attr:`_types.JSON.NULL` in this context, the @@ -2392,7 +2421,7 @@ class JSON(Indexable, TypeEngine[Any]): generated defaults. - """ + """ # noqa: E501 def __init__(self, none_as_null: bool = False): """Construct a :class:`_types.JSON` type. @@ -2405,6 +2434,7 @@ def __init__(self, none_as_null: bool = False): as SQL NULL:: from sqlalchemy import null + conn.execute(table.insert(), {"data": null()}) .. note:: @@ -2546,15 +2576,13 @@ def as_boolean(self): e.g.:: - stmt = select( - mytable.c.json_column['some_data'].as_boolean() - ).where( - mytable.c.json_column['some_data'].as_boolean() == True + stmt = select(mytable.c.json_column["some_data"].as_boolean()).where( + mytable.c.json_column["some_data"].as_boolean() == True ) .. versionadded:: 1.3.11 - """ + """ # noqa: E501 return self._binary_w_type(Boolean(), "as_boolean") def as_string(self): @@ -2565,16 +2593,13 @@ def as_string(self): e.g.:: - stmt = select( - mytable.c.json_column['some_data'].as_string() - ).where( - mytable.c.json_column['some_data'].as_string() == - 'some string' + stmt = select(mytable.c.json_column["some_data"].as_string()).where( + mytable.c.json_column["some_data"].as_string() == "some string" ) .. versionadded:: 1.3.11 - """ + """ # noqa: E501 return self._binary_w_type(Unicode(), "as_string") def as_integer(self): @@ -2585,15 +2610,13 @@ def as_integer(self): e.g.:: - stmt = select( - mytable.c.json_column['some_data'].as_integer() - ).where( - mytable.c.json_column['some_data'].as_integer() == 5 + stmt = select(mytable.c.json_column["some_data"].as_integer()).where( + mytable.c.json_column["some_data"].as_integer() == 5 ) .. versionadded:: 1.3.11 - """ + """ # noqa: E501 return self._binary_w_type(Integer(), "as_integer") def as_float(self): @@ -2604,15 +2627,13 @@ def as_float(self): e.g.:: - stmt = select( - mytable.c.json_column['some_data'].as_float() - ).where( - mytable.c.json_column['some_data'].as_float() == 29.75 + stmt = select(mytable.c.json_column["some_data"].as_float()).where( + mytable.c.json_column["some_data"].as_float() == 29.75 ) .. versionadded:: 1.3.11 - """ + """ # noqa: E501 return self._binary_w_type(Float(), "as_float") def as_numeric(self, precision, scale, asdecimal=True): @@ -2623,16 +2644,13 @@ def as_numeric(self, precision, scale, asdecimal=True): e.g.:: - stmt = select( - mytable.c.json_column['some_data'].as_numeric(10, 6) - ).where( - mytable.c. - json_column['some_data'].as_numeric(10, 6) == 29.75 + stmt = select(mytable.c.json_column["some_data"].as_numeric(10, 6)).where( + mytable.c.json_column["some_data"].as_numeric(10, 6) == 29.75 ) .. versionadded:: 1.4.0b2 - """ + """ # noqa: E501 return self._binary_w_type( Numeric(precision, scale, asdecimal=asdecimal), "as_numeric" ) @@ -2645,7 +2663,7 @@ def as_json(self): e.g.:: - stmt = select(mytable.c.json_column['some_data'].as_json()) + stmt = select(mytable.c.json_column["some_data"].as_json()) This is typically the default behavior of indexed elements in any case. @@ -2763,26 +2781,21 @@ class ARRAY( An :class:`_types.ARRAY` type is constructed given the "type" of element:: - mytable = Table("mytable", metadata, - Column("data", ARRAY(Integer)) - ) + mytable = Table("mytable", metadata, Column("data", ARRAY(Integer))) The above type represents an N-dimensional array, meaning a supporting backend such as PostgreSQL will interpret values with any number of dimensions automatically. To produce an INSERT construct that passes in a 1-dimensional array of integers:: - connection.execute( - mytable.insert(), - {"data": [1,2,3]} - ) + connection.execute(mytable.insert(), {"data": [1, 2, 3]}) The :class:`_types.ARRAY` type can be constructed given a fixed number of dimensions:: - mytable = Table("mytable", metadata, - Column("data", ARRAY(Integer, dimensions=2)) - ) + mytable = Table( + "mytable", metadata, Column("data", ARRAY(Integer, dimensions=2)) + ) Sending a number of dimensions is optional, but recommended if the datatype is to represent arrays of more than one dimension. This number @@ -2816,10 +2829,9 @@ class ARRAY( as well as UPDATE statements when the :meth:`_expression.Update.values` method is used:: - mytable.update().values({ - mytable.c.data[5]: 7, - mytable.c.data[2:7]: [1, 2, 3] - }) + mytable.update().values( + {mytable.c.data[5]: 7, mytable.c.data[2:7]: [1, 2, 3]} + ) Indexed access is one-based by default; for zero-based index conversion, set :paramref:`_types.ARRAY.zero_indexes`. @@ -2841,6 +2853,7 @@ class ARRAY( from sqlalchemy import ARRAY from sqlalchemy.ext.mutable import MutableList + class SomeOrmClass(Base): # ... @@ -2879,7 +2892,7 @@ def __init__( E.g.:: - Column('myarray', ARRAY(Integer)) + Column("myarray", ARRAY(Integer)) Arguments are: @@ -2988,9 +3001,7 @@ def any(self, other, operator=None): from sqlalchemy.sql import operators conn.execute( - select(table.c.data).where( - table.c.data.any(7, operator=operators.lt) - ) + select(table.c.data).where(table.c.data.any(7, operator=operators.lt)) ) :param other: expression to be compared @@ -3004,7 +3015,7 @@ def any(self, other, operator=None): :meth:`.types.ARRAY.Comparator.all` - """ + """ # noqa: E501 elements = util.preloaded.sql_elements operator = operator if operator else operators.eq @@ -3037,9 +3048,7 @@ def all(self, other, operator=None): from sqlalchemy.sql import operators conn.execute( - select(table.c.data).where( - table.c.data.all(7, operator=operators.lt) - ) + select(table.c.data).where(table.c.data.all(7, operator=operators.lt)) ) :param other: expression to be compared @@ -3053,7 +3062,7 @@ def all(self, other, operator=None): :meth:`.types.ARRAY.Comparator.any` - """ + """ # noqa: E501 elements = util.preloaded.sql_elements operator = operator if operator else operators.eq @@ -3323,8 +3332,8 @@ class BIGINT(BigInteger): class TIMESTAMP(DateTime): """The SQL TIMESTAMP type. - :class:`_types.TIMESTAMP` datatypes have support for timezone - storage on some backends, such as PostgreSQL and Oracle. Use the + :class:`_types.TIMESTAMP` datatypes have support for timezone storage on + some backends, such as PostgreSQL and Oracle Database. Use the :paramref:`~types.TIMESTAMP.timezone` argument in order to enable "TIMESTAMP WITH TIMEZONE" for these backends. @@ -3376,7 +3385,7 @@ class TEXT(Text): class CLOB(Text): """The CLOB type. - This type is found in Oracle and Informix. + This type is found in Oracle Database and Informix. """ __visit_name__ = "CLOB" @@ -3542,14 +3551,13 @@ class Uuid(Emulated, TypeEngine[_UUID_RETURN]): t = Table( "t", metadata_obj, - Column('uuid_data', Uuid, primary_key=True), - Column("other_data", String) + Column("uuid_data", Uuid, primary_key=True), + Column("other_data", String), ) with engine.begin() as conn: conn.execute( - t.insert(), - {"uuid_data": uuid.uuid4(), "other_data", "some data"} + t.insert(), {"uuid_data": uuid.uuid4(), "other_data": "some data"} ) To have the :class:`_sqltypes.Uuid` datatype work with string-based @@ -3563,7 +3571,7 @@ class Uuid(Emulated, TypeEngine[_UUID_RETURN]): :class:`_sqltypes.UUID` - represents exactly the ``UUID`` datatype without any backend-agnostic behaviors. - """ + """ # noqa: E501 __visit_name__ = "uuid" diff --git a/libs/sqlalchemy/sql/traversals.py b/libs/sqlalchemy/sql/traversals.py index 8bb2939cb..13ad28996 100644 --- a/libs/sqlalchemy/sql/traversals.py +++ b/libs/sqlalchemy/sql/traversals.py @@ -1,5 +1,5 @@ # sql/traversals.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/sql/type_api.py b/libs/sqlalchemy/sql/type_api.py index 2f6494e61..aeb804d3f 100644 --- a/libs/sqlalchemy/sql/type_api.py +++ b/libs/sqlalchemy/sql/type_api.py @@ -1,5 +1,5 @@ # sql/type_api.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -311,11 +311,13 @@ def evaluates_none(self) -> Self: E.g.:: Table( - 'some_table', metadata, + "some_table", + metadata, Column( String(50).evaluates_none(), nullable=True, - server_default='no value') + server_default="no value", + ), ) The ORM uses this flag to indicate that a positive value of ``None`` @@ -641,7 +643,7 @@ def with_variant( string_type = String() string_type = string_type.with_variant( - mysql.VARCHAR(collation='foo'), 'mysql', 'mariadb' + mysql.VARCHAR(collation="foo"), "mysql", "mariadb" ) The variant mapping indicates that when this type is @@ -1128,7 +1130,7 @@ class ExternalType(TypeEngineMixin): """ cache_ok: Optional[bool] = None - """Indicate if statements using this :class:`.ExternalType` are "safe to + '''Indicate if statements using this :class:`.ExternalType` are "safe to cache". The default value ``None`` will emit a warning and then not allow caching @@ -1169,12 +1171,12 @@ def __init__(self, choices): series of tuples. Given a previously un-cacheable type as:: class LookupType(UserDefinedType): - '''a custom type that accepts a dictionary as a parameter. + """a custom type that accepts a dictionary as a parameter. this is the non-cacheable version, as "self.lookup" is not hashable. - ''' + """ def __init__(self, lookup): self.lookup = lookup @@ -1182,8 +1184,7 @@ def __init__(self, lookup): def get_col_spec(self, **kw): return "VARCHAR(255)" - def bind_processor(self, dialect): - # ... works with "self.lookup" ... + def bind_processor(self, dialect): ... # works with "self.lookup" ... Where "lookup" is a dictionary. The type will not be able to generate a cache key:: @@ -1219,7 +1220,7 @@ def bind_processor(self, dialect): to the ".lookup" attribute:: class LookupType(UserDefinedType): - '''a custom type that accepts a dictionary as a parameter. + """a custom type that accepts a dictionary as a parameter. The dictionary is stored both as itself in a private variable, and published in a public variable as a sorted tuple of tuples, @@ -1227,7 +1228,7 @@ class LookupType(UserDefinedType): two equivalent dictionaries. Note it assumes the keys and values of the dictionary are themselves hashable. - ''' + """ cache_ok = True @@ -1236,15 +1237,12 @@ def __init__(self, lookup): # assume keys/values of "lookup" are hashable; otherwise # they would also need to be converted in some way here - self.lookup = tuple( - (key, lookup[key]) for key in sorted(lookup) - ) + self.lookup = tuple((key, lookup[key]) for key in sorted(lookup)) def get_col_spec(self, **kw): return "VARCHAR(255)" - def bind_processor(self, dialect): - # ... works with "self._lookup" ... + def bind_processor(self, dialect): ... # works with "self._lookup" ... Where above, the cache key for ``LookupType({"a": 10, "b": 20})`` will be:: @@ -1262,7 +1260,7 @@ def bind_processor(self, dialect): :ref:`sql_caching` - """ # noqa: E501 + ''' # noqa: E501 @util.non_memoized_property def _static_cache_key( @@ -1304,10 +1302,11 @@ class UserDefinedType( import sqlalchemy.types as types + class MyType(types.UserDefinedType): cache_ok = True - def __init__(self, precision = 8): + def __init__(self, precision=8): self.precision = precision def get_col_spec(self, **kw): @@ -1316,19 +1315,23 @@ def get_col_spec(self, **kw): def bind_processor(self, dialect): def process(value): return value + return process def result_processor(self, dialect, coltype): def process(value): return value + return process Once the type is made, it's immediately usable:: - table = Table('foo', metadata_obj, - Column('id', Integer, primary_key=True), - Column('data', MyType(16)) - ) + table = Table( + "foo", + metadata_obj, + Column("id", Integer, primary_key=True), + Column("data", MyType(16)), + ) The ``get_col_spec()`` method will in most cases receive a keyword argument ``type_expression`` which refers to the owning expression @@ -1493,7 +1496,7 @@ def adapt_emulated_to_native( class TypeDecorator(SchemaEventTarget, ExternalType, TypeEngine[_T]): - """Allows the creation of types which add additional functionality + '''Allows the creation of types which add additional functionality to an existing type. This method is preferred to direct subclassing of SQLAlchemy's @@ -1504,10 +1507,11 @@ class TypeDecorator(SchemaEventTarget, ExternalType, TypeEngine[_T]): import sqlalchemy.types as types + class MyType(types.TypeDecorator): - '''Prefixes Unicode values with "PREFIX:" on the way in and + """Prefixes Unicode values with "PREFIX:" on the way in and strips it off on the way out. - ''' + """ impl = types.Unicode @@ -1599,6 +1603,7 @@ def coerce_compared_value(self, op, value): from sqlalchemy import JSON from sqlalchemy import TypeDecorator + class MyJsonType(TypeDecorator): impl = JSON @@ -1619,6 +1624,7 @@ def coerce_compared_value(self, op, value): from sqlalchemy import ARRAY from sqlalchemy import TypeDecorator + class MyArrayType(TypeDecorator): impl = ARRAY @@ -1627,8 +1633,7 @@ class MyArrayType(TypeDecorator): def coerce_compared_value(self, op, value): return self.impl.coerce_compared_value(op, value) - - """ + ''' __visit_name__ = "type_decorator" @@ -2315,11 +2320,10 @@ def to_instance( def adapt_type( - typeobj: TypeEngine[Any], + typeobj: _TypeEngineArgument[Any], colspecs: Mapping[Type[Any], Type[TypeEngine[Any]]], ) -> TypeEngine[Any]: - if isinstance(typeobj, type): - typeobj = typeobj() + typeobj = to_instance(typeobj) for t in typeobj.__class__.__mro__[0:-1]: try: impltype = colspecs[t] diff --git a/libs/sqlalchemy/sql/util.py b/libs/sqlalchemy/sql/util.py index 4a35bb217..29cd0e2b0 100644 --- a/libs/sqlalchemy/sql/util.py +++ b/libs/sqlalchemy/sql/util.py @@ -1,5 +1,5 @@ # sql/util.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -106,7 +106,7 @@ def join_condition( would produce an expression along the lines of:: - tablea.c.id==tableb.c.tablea_id + tablea.c.id == tableb.c.tablea_id The join is determined based on the foreign key relationships between the two selectables. If there are multiple ways @@ -268,7 +268,7 @@ def visit_binary_product( The function is of the form:: - def my_fn(binary, left, right) + def my_fn(binary, left, right): ... For each binary expression located which has a comparison operator, the product of "left" and @@ -277,12 +277,11 @@ def my_fn(binary, left, right) Hence an expression like:: - and_( - (a + b) == q + func.sum(e + f), - j == r - ) + and_((a + b) == q + func.sum(e + f), j == r) + + would have the traversal: - would have the traversal:: + .. sourcecode:: text a <eq> q a <eq> e @@ -528,9 +527,7 @@ def bind_values(clause): E.g.:: - >>> expr = and_( - ... table.c.foo==5, table.c.foo==7 - ... ) + >>> expr = and_(table.c.foo == 5, table.c.foo == 7) >>> bind_values(expr) [5, 7] """ @@ -1041,20 +1038,24 @@ class ClauseAdapter(visitors.ReplacingExternalTraversal): E.g.:: - table1 = Table('sometable', metadata, - Column('col1', Integer), - Column('col2', Integer) - ) - table2 = Table('someothertable', metadata, - Column('col1', Integer), - Column('col2', Integer) - ) + table1 = Table( + "sometable", + metadata, + Column("col1", Integer), + Column("col2", Integer), + ) + table2 = Table( + "someothertable", + metadata, + Column("col1", Integer), + Column("col2", Integer), + ) condition = table1.c.col1 == table2.c.col1 make an alias of table1:: - s = table1.alias('foo') + s = table1.alias("foo") calling ``ClauseAdapter(s).traverse(condition)`` converts condition to read:: diff --git a/libs/sqlalchemy/sql/visitors.py b/libs/sqlalchemy/sql/visitors.py index d1cd7a939..e758350ad 100644 --- a/libs/sqlalchemy/sql/visitors.py +++ b/libs/sqlalchemy/sql/visitors.py @@ -1,5 +1,5 @@ # sql/visitors.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -934,11 +934,13 @@ def traverse( from sqlalchemy.sql import visitors - stmt = select(some_table).where(some_table.c.foo == 'bar') + stmt = select(some_table).where(some_table.c.foo == "bar") + def visit_bindparam(bind_param): print("found bound value: %s" % bind_param.value) + visitors.traverse(stmt, {}, {"bindparam": visit_bindparam}) The iteration of objects uses the :func:`.visitors.iterate` function, diff --git a/libs/sqlalchemy/testing/__init__.py b/libs/sqlalchemy/testing/__init__.py index 7fa361c9b..4e574bbb2 100644 --- a/libs/sqlalchemy/testing/__init__.py +++ b/libs/sqlalchemy/testing/__init__.py @@ -1,5 +1,5 @@ # testing/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/assertions.py b/libs/sqlalchemy/testing/assertions.py index baef79d18..8364c15f8 100644 --- a/libs/sqlalchemy/testing/assertions.py +++ b/libs/sqlalchemy/testing/assertions.py @@ -1,5 +1,5 @@ # testing/assertions.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/assertsql.py b/libs/sqlalchemy/testing/assertsql.py index ae4d335a9..81c7138c4 100644 --- a/libs/sqlalchemy/testing/assertsql.py +++ b/libs/sqlalchemy/testing/assertsql.py @@ -1,5 +1,5 @@ # testing/assertsql.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/asyncio.py b/libs/sqlalchemy/testing/asyncio.py index f71ca57fe..28470ba21 100644 --- a/libs/sqlalchemy/testing/asyncio.py +++ b/libs/sqlalchemy/testing/asyncio.py @@ -1,5 +1,5 @@ # testing/asyncio.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/config.py b/libs/sqlalchemy/testing/config.py index e2623ead5..2eec642b7 100644 --- a/libs/sqlalchemy/testing/config.py +++ b/libs/sqlalchemy/testing/config.py @@ -1,5 +1,5 @@ # testing/config.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -122,7 +122,9 @@ def combinations( passed, each argument combination is turned into a pytest.param() object, mapping the elements of the argument tuple to produce an id based on a character value in the same position within the string template using the - following scheme:: + following scheme: + + .. sourcecode:: text i - the given argument is a string that is part of the id only, don't pass it as an argument @@ -146,7 +148,7 @@ def combinations( (operator.ne, "ne"), (operator.gt, "gt"), (operator.lt, "lt"), - id_="na" + id_="na", ) def test_operator(self, opfunc, name): pass @@ -228,14 +230,9 @@ def variation(argname_or_fn, cases=None): @testing.variation("querytyp", ["select", "subquery", "legacy_query"]) @testing.variation("lazy", ["select", "raise", "raise_on_sql"]) - def test_thing( - self, - querytyp, - lazy, - decl_base - ): + def test_thing(self, querytyp, lazy, decl_base): class Thing(decl_base): - __tablename__ = 'thing' + __tablename__ = "thing" # use name directly rel = relationship("Rel", lazy=lazy.name) @@ -250,7 +247,6 @@ class Thing(decl_base): else: querytyp.fail() - The variable provided is a slots object of boolean variables, as well as the name of the case itself under the attribute ".name" diff --git a/libs/sqlalchemy/testing/engines.py b/libs/sqlalchemy/testing/engines.py index 7cae807eb..51beed98b 100644 --- a/libs/sqlalchemy/testing/engines.py +++ b/libs/sqlalchemy/testing/engines.py @@ -1,5 +1,5 @@ # testing/engines.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -330,16 +330,18 @@ def testing_engine( url = url or config.db.url url = make_url(url) - if options is None: - if config.db is None or url.drivername == config.db.url.drivername: - options = config.db_opts - else: - options = {} - elif config.db is not None and url.drivername == config.db.url.drivername: - default_opt = config.db_opts.copy() - default_opt.update(options) - engine = create_engine(url, **options) + if ( + config.db is None or url.drivername == config.db.url.drivername + ) and config.db_opts: + use_options = config.db_opts.copy() + else: + use_options = {} + + if options is not None: + use_options.update(options) + + engine = create_engine(url, **use_options) if sqlite_savepoint and engine.name == "sqlite": # apply SQLite savepoint workaround @@ -370,9 +372,9 @@ def do_begin(conn): if ( isinstance(engine.pool, pool.QueuePool) - and "pool" not in options - and "pool_timeout" not in options - and "max_overflow" not in options + and "pool" not in use_options + and "pool_timeout" not in use_options + and "max_overflow" not in use_options ): engine.pool._timeout = 0 engine.pool._max_overflow = 0 diff --git a/libs/sqlalchemy/testing/entities.py b/libs/sqlalchemy/testing/entities.py index 8f0f36bd1..5bd4f7de2 100644 --- a/libs/sqlalchemy/testing/entities.py +++ b/libs/sqlalchemy/testing/entities.py @@ -1,5 +1,5 @@ # testing/entities.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/exclusions.py b/libs/sqlalchemy/testing/exclusions.py index addc4b759..8ff9b6443 100644 --- a/libs/sqlalchemy/testing/exclusions.py +++ b/libs/sqlalchemy/testing/exclusions.py @@ -1,5 +1,5 @@ # testing/exclusions.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/fixtures/__init__.py b/libs/sqlalchemy/testing/fixtures/__init__.py index 5981fb583..f2948dee8 100644 --- a/libs/sqlalchemy/testing/fixtures/__init__.py +++ b/libs/sqlalchemy/testing/fixtures/__init__.py @@ -1,5 +1,5 @@ # testing/fixtures/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/fixtures/base.py b/libs/sqlalchemy/testing/fixtures/base.py index 0697f4902..09d45a0a2 100644 --- a/libs/sqlalchemy/testing/fixtures/base.py +++ b/libs/sqlalchemy/testing/fixtures/base.py @@ -1,5 +1,5 @@ # testing/fixtures/base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/fixtures/mypy.py b/libs/sqlalchemy/testing/fixtures/mypy.py index 149df9f7d..0832d8924 100644 --- a/libs/sqlalchemy/testing/fixtures/mypy.py +++ b/libs/sqlalchemy/testing/fixtures/mypy.py @@ -1,5 +1,5 @@ # testing/fixtures/mypy.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/fixtures/orm.py b/libs/sqlalchemy/testing/fixtures/orm.py index 5ddd21ec6..77cb243a8 100644 --- a/libs/sqlalchemy/testing/fixtures/orm.py +++ b/libs/sqlalchemy/testing/fixtures/orm.py @@ -1,5 +1,5 @@ # testing/fixtures/orm.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/fixtures/sql.py b/libs/sqlalchemy/testing/fixtures/sql.py index 39e5b0844..44cf21c24 100644 --- a/libs/sqlalchemy/testing/fixtures/sql.py +++ b/libs/sqlalchemy/testing/fixtures/sql.py @@ -1,5 +1,5 @@ # testing/fixtures/sql.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/pickleable.py b/libs/sqlalchemy/testing/pickleable.py index 761891ad4..9317be63b 100644 --- a/libs/sqlalchemy/testing/pickleable.py +++ b/libs/sqlalchemy/testing/pickleable.py @@ -1,5 +1,5 @@ # testing/pickleable.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/plugin/__init__.py b/libs/sqlalchemy/testing/plugin/__init__.py index 0f9877731..ce960be96 100644 --- a/libs/sqlalchemy/testing/plugin/__init__.py +++ b/libs/sqlalchemy/testing/plugin/__init__.py @@ -1,5 +1,5 @@ # testing/plugin/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/plugin/bootstrap.py b/libs/sqlalchemy/testing/plugin/bootstrap.py index d0d375458..2ad4d9915 100644 --- a/libs/sqlalchemy/testing/plugin/bootstrap.py +++ b/libs/sqlalchemy/testing/plugin/bootstrap.py @@ -1,5 +1,5 @@ # testing/plugin/bootstrap.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/plugin/plugin_base.py b/libs/sqlalchemy/testing/plugin/plugin_base.py index a642668be..2dfa44141 100644 --- a/libs/sqlalchemy/testing/plugin/plugin_base.py +++ b/libs/sqlalchemy/testing/plugin/plugin_base.py @@ -1,5 +1,5 @@ # testing/plugin/plugin_base.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/plugin/pytestplugin.py b/libs/sqlalchemy/testing/plugin/pytestplugin.py index 1a4d4bb30..f6d47c631 100644 --- a/libs/sqlalchemy/testing/plugin/pytestplugin.py +++ b/libs/sqlalchemy/testing/plugin/pytestplugin.py @@ -1,5 +1,5 @@ # testing/plugin/pytestplugin.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/profiling.py b/libs/sqlalchemy/testing/profiling.py index b9093c901..0d90947e4 100644 --- a/libs/sqlalchemy/testing/profiling.py +++ b/libs/sqlalchemy/testing/profiling.py @@ -1,5 +1,5 @@ # testing/profiling.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/provision.py b/libs/sqlalchemy/testing/provision.py index c6dc43e53..3afcf119b 100644 --- a/libs/sqlalchemy/testing/provision.py +++ b/libs/sqlalchemy/testing/provision.py @@ -1,5 +1,5 @@ # testing/provision.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -108,7 +108,9 @@ def generate_db_urls(db_urls, extra_drivers): """Generate a set of URLs to test given configured URLs plus additional driver names. - Given:: + Given: + + .. sourcecode:: text --dburi postgresql://db1 \ --dburi postgresql://db2 \ @@ -116,7 +118,9 @@ def generate_db_urls(db_urls, extra_drivers): --dbdriver=psycopg2 --dbdriver=asyncpg?async_fallback=true Noting that the default postgresql driver is psycopg2, the output - would be:: + would be: + + .. sourcecode:: text postgresql+psycopg2://db1 postgresql+asyncpg://db1 @@ -133,6 +137,8 @@ def generate_db_urls(db_urls, extra_drivers): driver name. For example, to enable the async fallback option for asyncpg:: + .. sourcecode:: text + --dburi postgresql://db1 \ --dbdriver=asyncpg?async_fallback=true diff --git a/libs/sqlalchemy/testing/requirements.py b/libs/sqlalchemy/testing/requirements.py index a11e23631..bbf56a059 100644 --- a/libs/sqlalchemy/testing/requirements.py +++ b/libs/sqlalchemy/testing/requirements.py @@ -1,5 +1,5 @@ # testing/requirements.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -91,7 +91,9 @@ def unique_constraints_reflect_as_index(self): @property def table_value_constructor(self): - """Database / dialect supports a query like:: + """Database / dialect supports a query like: + + .. sourcecode:: sql SELECT * FROM VALUES ( (c1, c2), (c1, c2), ...) AS some_table(col1, col2) @@ -992,7 +994,9 @@ def binary_comparisons(self): @property def binary_literals(self): """target backend supports simple binary literals, e.g. an - expression like:: + expression like: + + .. sourcecode:: sql SELECT CAST('foo' AS BINARY) @@ -1173,9 +1177,7 @@ def implicit_decimal_binds(self): expr = decimal.Decimal("15.7563") - value = e.scalar( - select(literal(expr)) - ) + value = e.scalar(select(literal(expr))) assert value == expr @@ -1343,7 +1345,9 @@ def update_where_target_in_subquery(self): present in a subquery in the WHERE clause. This is an ANSI-standard syntax that apparently MySQL can't handle, - such as:: + such as: + + .. sourcecode:: sql UPDATE documents SET flag=1 WHERE documents.title IN (SELECT max(documents.title) AS title @@ -1376,7 +1380,11 @@ def order_by_col_from_union(self): """target database supports ordering by a column from a SELECT inside of a UNION - E.g. (SELECT id, ...) UNION (SELECT id, ...) ORDER BY id + E.g.: + + .. sourcecode:: sql + + (SELECT id, ...) UNION (SELECT id, ...) ORDER BY id """ return exclusions.open() @@ -1386,7 +1394,9 @@ def order_by_label_with_expression(self): """target backend supports ORDER BY a column label within an expression. - Basically this:: + Basically this: + + .. sourcecode:: sql select data as foo from test order by foo || 'bar' diff --git a/libs/sqlalchemy/testing/schema.py b/libs/sqlalchemy/testing/schema.py index 7dfd33d4d..0dd7de202 100644 --- a/libs/sqlalchemy/testing/schema.py +++ b/libs/sqlalchemy/testing/schema.py @@ -1,5 +1,5 @@ # testing/schema.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/__init__.py b/libs/sqlalchemy/testing/suite/__init__.py index a146cb316..8435aa004 100644 --- a/libs/sqlalchemy/testing/suite/__init__.py +++ b/libs/sqlalchemy/testing/suite/__init__.py @@ -1,5 +1,5 @@ # testing/suite/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_cte.py b/libs/sqlalchemy/testing/suite/test_cte.py index 5d37880e1..4e4d420fa 100644 --- a/libs/sqlalchemy/testing/suite/test_cte.py +++ b/libs/sqlalchemy/testing/suite/test_cte.py @@ -1,5 +1,5 @@ # testing/suite/test_cte.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_ddl.py b/libs/sqlalchemy/testing/suite/test_ddl.py index 3d9b8ec13..c7e7d817d 100644 --- a/libs/sqlalchemy/testing/suite/test_ddl.py +++ b/libs/sqlalchemy/testing/suite/test_ddl.py @@ -1,5 +1,5 @@ # testing/suite/test_ddl.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_deprecations.py b/libs/sqlalchemy/testing/suite/test_deprecations.py index 07970c03e..db0a9fc48 100644 --- a/libs/sqlalchemy/testing/suite/test_deprecations.py +++ b/libs/sqlalchemy/testing/suite/test_deprecations.py @@ -1,5 +1,5 @@ # testing/suite/test_deprecations.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_dialect.py b/libs/sqlalchemy/testing/suite/test_dialect.py index 696472037..ae67cc10a 100644 --- a/libs/sqlalchemy/testing/suite/test_dialect.py +++ b/libs/sqlalchemy/testing/suite/test_dialect.py @@ -1,5 +1,5 @@ # testing/suite/test_dialect.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_insert.py b/libs/sqlalchemy/testing/suite/test_insert.py index 1cff044bc..8467c3517 100644 --- a/libs/sqlalchemy/testing/suite/test_insert.py +++ b/libs/sqlalchemy/testing/suite/test_insert.py @@ -1,5 +1,5 @@ # testing/suite/test_insert.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_reflection.py b/libs/sqlalchemy/testing/suite/test_reflection.py index 91113be9b..54d0d449a 100644 --- a/libs/sqlalchemy/testing/suite/test_reflection.py +++ b/libs/sqlalchemy/testing/suite/test_reflection.py @@ -1,5 +1,5 @@ # testing/suite/test_reflection.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_results.py b/libs/sqlalchemy/testing/suite/test_results.py index 2b91a559d..a6179d855 100644 --- a/libs/sqlalchemy/testing/suite/test_results.py +++ b/libs/sqlalchemy/testing/suite/test_results.py @@ -1,5 +1,5 @@ # testing/suite/test_results.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_rowcount.py b/libs/sqlalchemy/testing/suite/test_rowcount.py index a7dbd364f..59953fff5 100644 --- a/libs/sqlalchemy/testing/suite/test_rowcount.py +++ b/libs/sqlalchemy/testing/suite/test_rowcount.py @@ -1,5 +1,5 @@ # testing/suite/test_rowcount.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_select.py b/libs/sqlalchemy/testing/suite/test_select.py index 8e1ae79b2..7eb5cd005 100644 --- a/libs/sqlalchemy/testing/suite/test_select.py +++ b/libs/sqlalchemy/testing/suite/test_select.py @@ -1,5 +1,5 @@ # testing/suite/test_select.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_sequence.py b/libs/sqlalchemy/testing/suite/test_sequence.py index 138616f13..f0e657537 100644 --- a/libs/sqlalchemy/testing/suite/test_sequence.py +++ b/libs/sqlalchemy/testing/suite/test_sequence.py @@ -1,5 +1,5 @@ # testing/suite/test_sequence.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_types.py b/libs/sqlalchemy/testing/suite/test_types.py index d4c5a2250..de3cd53e3 100644 --- a/libs/sqlalchemy/testing/suite/test_types.py +++ b/libs/sqlalchemy/testing/suite/test_types.py @@ -1,5 +1,5 @@ # testing/suite/test_types.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_unicode_ddl.py b/libs/sqlalchemy/testing/suite/test_unicode_ddl.py index 1f15ab564..c8dd33505 100644 --- a/libs/sqlalchemy/testing/suite/test_unicode_ddl.py +++ b/libs/sqlalchemy/testing/suite/test_unicode_ddl.py @@ -1,5 +1,5 @@ # testing/suite/test_unicode_ddl.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/suite/test_update_delete.py b/libs/sqlalchemy/testing/suite/test_update_delete.py index fd4757f9a..85a8d3933 100644 --- a/libs/sqlalchemy/testing/suite/test_update_delete.py +++ b/libs/sqlalchemy/testing/suite/test_update_delete.py @@ -1,5 +1,5 @@ # testing/suite/test_update_delete.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/testing/util.py b/libs/sqlalchemy/testing/util.py index f6fad11d0..42f077108 100644 --- a/libs/sqlalchemy/testing/util.py +++ b/libs/sqlalchemy/testing/util.py @@ -1,5 +1,5 @@ # testing/util.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -254,18 +254,19 @@ def flag_combinations(*combinations): dict(lazy=False, passive=True), dict(lazy=False, passive=True, raiseload=True), ) - + def test_fn(lazy, passive, raiseload): ... would result in:: @testing.combinations( - ('', False, False, False), - ('lazy', True, False, False), - ('lazy_passive', True, True, False), - ('lazy_passive', True, True, True), - id_='iaaa', - argnames='lazy,passive,raiseload' + ("", False, False, False), + ("lazy", True, False, False), + ("lazy_passive", True, True, False), + ("lazy_passive", True, True, True), + id_="iaaa", + argnames="lazy,passive,raiseload", ) + def test_fn(lazy, passive, raiseload): ... """ diff --git a/libs/sqlalchemy/testing/warnings.py b/libs/sqlalchemy/testing/warnings.py index baef037f7..9be0813b5 100644 --- a/libs/sqlalchemy/testing/warnings.py +++ b/libs/sqlalchemy/testing/warnings.py @@ -1,5 +1,5 @@ # testing/warnings.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/types.py b/libs/sqlalchemy/types.py index a5bb56cf6..c2b1ab194 100644 --- a/libs/sqlalchemy/types.py +++ b/libs/sqlalchemy/types.py @@ -1,5 +1,5 @@ # types.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/__init__.py b/libs/sqlalchemy/util/__init__.py index 33b7addb6..a9b4c3b1c 100644 --- a/libs/sqlalchemy/util/__init__.py +++ b/libs/sqlalchemy/util/__init__.py @@ -1,5 +1,5 @@ # util/__init__.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/_collections.py b/libs/sqlalchemy/util/_collections.py index 9755f8d99..12283eba9 100644 --- a/libs/sqlalchemy/util/_collections.py +++ b/libs/sqlalchemy/util/_collections.py @@ -1,5 +1,5 @@ # util/_collections.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -80,8 +80,8 @@ def merge_lists_w_ordering(a: List[Any], b: List[Any]) -> List[Any]: Example:: - >>> a = ['__tablename__', 'id', 'x', 'created_at'] - >>> b = ['id', 'name', 'data', 'y', 'created_at'] + >>> a = ["__tablename__", "id", "x", "created_at"] + >>> b = ["id", "name", "data", "y", "created_at"] >>> merge_lists_w_ordering(a, b) ['__tablename__', 'id', 'name', 'data', 'y', 'x', 'created_at'] diff --git a/libs/sqlalchemy/util/_concurrency_py3k.py b/libs/sqlalchemy/util/_concurrency_py3k.py index a19607cd0..718c077c0 100644 --- a/libs/sqlalchemy/util/_concurrency_py3k.py +++ b/libs/sqlalchemy/util/_concurrency_py3k.py @@ -1,5 +1,5 @@ # util/_concurrency_py3k.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/_has_cy.py b/libs/sqlalchemy/util/_has_cy.py index 7713e236a..21faed04e 100644 --- a/libs/sqlalchemy/util/_has_cy.py +++ b/libs/sqlalchemy/util/_has_cy.py @@ -1,5 +1,5 @@ # util/_has_cy.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/_py_collections.py b/libs/sqlalchemy/util/_py_collections.py index dfb9af2e1..f6aefcf67 100644 --- a/libs/sqlalchemy/util/_py_collections.py +++ b/libs/sqlalchemy/util/_py_collections.py @@ -1,5 +1,5 @@ # util/_py_collections.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/compat.py b/libs/sqlalchemy/util/compat.py index 7620a3645..c8b5e7a22 100644 --- a/libs/sqlalchemy/util/compat.py +++ b/libs/sqlalchemy/util/compat.py @@ -1,5 +1,5 @@ # util/compat.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/concurrency.py b/libs/sqlalchemy/util/concurrency.py index de6195de8..006340f5b 100644 --- a/libs/sqlalchemy/util/concurrency.py +++ b/libs/sqlalchemy/util/concurrency.py @@ -1,5 +1,5 @@ # util/concurrency.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/deprecations.py b/libs/sqlalchemy/util/deprecations.py index 3034715b5..88b687240 100644 --- a/libs/sqlalchemy/util/deprecations.py +++ b/libs/sqlalchemy/util/deprecations.py @@ -1,5 +1,5 @@ # util/deprecations.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -205,10 +205,10 @@ def deprecated_params(**specs: Tuple[str, str]) -> Callable[[_F], _F]: weak_identity_map=( "0.7", "the :paramref:`.Session.weak_identity_map parameter " - "is deprecated." + "is deprecated.", ) - ) + def some_function(**kwargs): ... """ diff --git a/libs/sqlalchemy/util/langhelpers.py b/libs/sqlalchemy/util/langhelpers.py index 9312976e7..b4086f1d5 100644 --- a/libs/sqlalchemy/util/langhelpers.py +++ b/libs/sqlalchemy/util/langhelpers.py @@ -1,5 +1,5 @@ # util/langhelpers.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -662,7 +662,9 @@ def format_argspec_init(method, grouped=True): """format_argspec_plus with considerations for typical __init__ methods Wraps format_argspec_plus with error handling strategies for typical - __init__ cases:: + __init__ cases: + + .. sourcecode:: text object.__init__ -> (self) other unreflectable (usually C) -> (self, *args, **kwargs) @@ -717,7 +719,9 @@ def decorate(cls): def getargspec_init(method): """inspect.getargspec with considerations for typical __init__ methods - Wraps inspect.getargspec with error handling for typical __init__ cases:: + Wraps inspect.getargspec with error handling for typical __init__ cases: + + .. sourcecode:: text object.__init__ -> (self) other unreflectable (usually C) -> (self, *args, **kwargs) @@ -1591,9 +1595,9 @@ def classlevel(self, func: Callable[..., Any]) -> hybridmethod[_T]: class symbol(int): """A constant symbol. - >>> symbol('foo') is symbol('foo') + >>> symbol("foo") is symbol("foo") True - >>> symbol('foo') + >>> symbol("foo") <symbol 'foo> A slight refinement of the MAGICCOOKIE=object() pattern. The primary diff --git a/libs/sqlalchemy/util/preloaded.py b/libs/sqlalchemy/util/preloaded.py index e91ce6854..4ea9aa90f 100644 --- a/libs/sqlalchemy/util/preloaded.py +++ b/libs/sqlalchemy/util/preloaded.py @@ -1,5 +1,5 @@ # util/preloaded.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/queue.py b/libs/sqlalchemy/util/queue.py index 99a68a317..3fb01a9a9 100644 --- a/libs/sqlalchemy/util/queue.py +++ b/libs/sqlalchemy/util/queue.py @@ -1,5 +1,5 @@ # util/queue.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/tool_support.py b/libs/sqlalchemy/util/tool_support.py index a203a2ab7..407c2d450 100644 --- a/libs/sqlalchemy/util/tool_support.py +++ b/libs/sqlalchemy/util/tool_support.py @@ -1,5 +1,5 @@ # util/tool_support.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/topological.py b/libs/sqlalchemy/util/topological.py index aebbb436c..393c855ab 100644 --- a/libs/sqlalchemy/util/topological.py +++ b/libs/sqlalchemy/util/topological.py @@ -1,5 +1,5 @@ # util/topological.py -# Copyright (C) 2005-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under diff --git a/libs/sqlalchemy/util/typing.py b/libs/sqlalchemy/util/typing.py index a3df97770..62fd47c6a 100644 --- a/libs/sqlalchemy/util/typing.py +++ b/libs/sqlalchemy/util/typing.py @@ -1,5 +1,5 @@ # util/typing.py -# Copyright (C) 2022-2024 the SQLAlchemy authors and contributors +# Copyright (C) 2022-2025 the SQLAlchemy authors and contributors # <see AUTHORS file> # # This module is part of SQLAlchemy and is released under @@ -9,6 +9,7 @@ from __future__ import annotations import builtins +from collections import deque import collections.abc as collections_abc import re import sys @@ -54,6 +55,7 @@ from typing_extensions import TypeGuard as TypeGuard # 3.10 from typing_extensions import Self as Self # 3.11 from typing_extensions import TypeAliasType as TypeAliasType # 3.12 + from typing_extensions import Never as Never # 3.11 _T = TypeVar("_T", bound=Any) _KT = TypeVar("_KT") @@ -65,9 +67,9 @@ if compat.py38: # typing_extensions.Literal is different from typing.Literal until # Python 3.10.1 - _LITERAL_TYPES = frozenset([typing.Literal, Literal]) + LITERAL_TYPES = frozenset([typing.Literal, Literal]) else: - _LITERAL_TYPES = frozenset([Literal]) + LITERAL_TYPES = frozenset([Literal]) if compat.py310: @@ -79,16 +81,13 @@ NoneFwd = ForwardRef("None") -typing_get_args = get_args -typing_get_origin = get_origin - _AnnotationScanType = Union[ Type[Any], str, ForwardRef, NewType, TypeAliasType, "GenericProtocol[Any]" ] -class ArgsTypeProcotol(Protocol): +class ArgsTypeProtocol(Protocol): """protocol for types that have ``__args__`` there's no public interface for this AFAIK @@ -209,7 +208,7 @@ def fixup_container_fwd_refs( if ( is_generic(type_) - and typing_get_origin(type_) + and get_origin(type_) in ( dict, set, @@ -229,11 +228,11 @@ def fixup_container_fwd_refs( ) ): # compat with py3.10 and earlier - return typing_get_origin(type_).__class_getitem__( # type: ignore + return get_origin(type_).__class_getitem__( # type: ignore tuple( [ ForwardRef(elem) if isinstance(elem, str) else elem - for elem in typing_get_args(type_) + for elem in get_args(type_) ] ) ) @@ -330,30 +329,8 @@ def resolve_name_to_real_class_name(name: str, module_name: str) -> str: return getattr(obj, "__name__", name) -def de_stringify_union_elements( - cls: Type[Any], - annotation: ArgsTypeProcotol, - originating_module: str, - locals_: Mapping[str, Any], - *, - str_cleanup_fn: Optional[Callable[[str, str], str]] = None, -) -> Type[Any]: - return make_union_type( - *[ - de_stringify_annotation( - cls, - anno, - originating_module, - {}, - str_cleanup_fn=str_cleanup_fn, - ) - for anno in annotation.__args__ - ] - ) - - -def is_pep593(type_: Optional[_AnnotationScanType]) -> bool: - return type_ is not None and typing_get_origin(type_) is Annotated +def is_pep593(type_: Optional[Any]) -> bool: + return type_ is not None and get_origin(type_) is Annotated def is_non_string_iterable(obj: Any) -> TypeGuard[Iterable[Any]]: @@ -362,8 +339,8 @@ def is_non_string_iterable(obj: Any) -> TypeGuard[Iterable[Any]]: ) -def is_literal(type_: _AnnotationScanType) -> bool: - return get_origin(type_) in _LITERAL_TYPES +def is_literal(type_: Any) -> bool: + return get_origin(type_) in LITERAL_TYPES def is_newtype(type_: Optional[_AnnotationScanType]) -> TypeGuard[NewType]: @@ -389,13 +366,59 @@ def flatten_newtype(type_: NewType) -> Type[Any]: return super_type # type: ignore[return-value] +def pep695_values(type_: _AnnotationScanType) -> Set[Any]: + """Extracts the value from a TypeAliasType, recursively exploring unions + and inner TypeAliasType to flatten them into a single set. + + Forward references are not evaluated, so no recursive exploration happens + into them. + """ + _seen = set() + + def recursive_value(type_): + if type_ in _seen: + # recursion are not supported (at least it's flagged as + # an error by pyright). Just avoid infinite loop + return type_ + _seen.add(type_) + if not is_pep695(type_): + return type_ + value = type_.__value__ + if not is_union(value): + return value + return [recursive_value(t) for t in value.__args__] + + res = recursive_value(type_) + if isinstance(res, list): + types = set() + stack = deque(res) + while stack: + t = stack.popleft() + if isinstance(t, list): + stack.extend(t) + else: + types.add(None if t in {NoneType, NoneFwd} else t) + return types + else: + return {res} + + def is_fwd_ref( - type_: _AnnotationScanType, check_generic: bool = False + type_: _AnnotationScanType, + check_generic: bool = False, + check_for_plain_string: bool = False, ) -> TypeGuard[ForwardRef]: - if isinstance(type_, ForwardRef): + if check_for_plain_string and isinstance(type_, str): + return True + elif isinstance(type_, ForwardRef): return True elif check_generic and is_generic(type_): - return any(is_fwd_ref(arg, True) for arg in type_.__args__) + return any( + is_fwd_ref( + arg, True, check_for_plain_string=check_for_plain_string + ) + for arg in type_.__args__ + ) else: return False @@ -420,13 +443,31 @@ def de_optionalize_union_types( """Given a type, filter out ``Union`` types that include ``NoneType`` to not include the ``NoneType``. + Contains extra logic to work on non-flattened unions, unions that contain + ``None`` (seen in py38, 37) + """ if is_fwd_ref(type_): - return de_optionalize_fwd_ref_union_types(type_) + return _de_optionalize_fwd_ref_union_types(type_, False) - elif is_optional(type_): - typ = set(type_.__args__) + elif is_union(type_) and includes_none(type_): + if compat.py39: + typ = set(type_.__args__) + else: + # py38, 37 - unions are not automatically flattened, can contain + # None rather than NoneType + stack_of_unions = deque([type_]) + typ = set() + while stack_of_unions: + u_typ = stack_of_unions.popleft() + for elem in u_typ.__args__: + if is_union(elem): + stack_of_unions.append(elem) + else: + typ.add(elem) + + typ.discard(None) # type: ignore typ.discard(NoneType) typ.discard(NoneFwd) @@ -437,9 +478,21 @@ def de_optionalize_union_types( return type_ -def de_optionalize_fwd_ref_union_types( - type_: ForwardRef, -) -> _AnnotationScanType: +@overload +def _de_optionalize_fwd_ref_union_types( + type_: ForwardRef, return_has_none: Literal[True] +) -> bool: ... + + +@overload +def _de_optionalize_fwd_ref_union_types( + type_: ForwardRef, return_has_none: Literal[False] +) -> _AnnotationScanType: ... + + +def _de_optionalize_fwd_ref_union_types( + type_: ForwardRef, return_has_none: bool +) -> Union[_AnnotationScanType, bool]: """return the non-optional type for Optional[], Union[None, ...], x|None, etc. without de-stringifying forward refs. @@ -451,68 +504,78 @@ def de_optionalize_fwd_ref_union_types( mm = re.match(r"^(.+?)\[(.+)\]$", annotation) if mm: - if mm.group(1) == "Optional": - return ForwardRef(mm.group(2)) - elif mm.group(1) == "Union": - elements = re.split(r",\s*", mm.group(2)) - return make_union_type( - *[ForwardRef(elem) for elem in elements if elem != "None"] - ) + g1 = mm.group(1).split(".")[-1] + if g1 == "Optional": + return True if return_has_none else ForwardRef(mm.group(2)) + elif g1 == "Union": + if "[" in mm.group(2): + # cases like "Union[Dict[str, int], int, None]" + elements: list[str] = [] + current: list[str] = [] + ignore_comma = 0 + for char in mm.group(2): + if char == "[": + ignore_comma += 1 + elif char == "]": + ignore_comma -= 1 + elif ignore_comma == 0 and char == ",": + elements.append("".join(current).strip()) + current.clear() + continue + current.append(char) + else: + elements = re.split(r",\s*", mm.group(2)) + parts = [ForwardRef(elem) for elem in elements if elem != "None"] + if return_has_none: + return len(elements) != len(parts) + else: + return make_union_type(*parts) if parts else Never # type: ignore[return-value] # noqa: E501 else: - return type_ + return False if return_has_none else type_ pipe_tokens = re.split(r"\s*\|\s*", annotation) - if "None" in pipe_tokens: - return ForwardRef("|".join(p for p in pipe_tokens if p != "None")) + has_none = "None" in pipe_tokens + if return_has_none: + return has_none + if has_none: + anno_str = "|".join(p for p in pipe_tokens if p != "None") + return ForwardRef(anno_str) if anno_str else Never # type: ignore[return-value] # noqa: E501 return type_ def make_union_type(*types: _AnnotationScanType) -> Type[Any]: - """Make a Union type. - - This is needed by :func:`.de_optionalize_union_types` which removes - ``NoneType`` from a ``Union``. - - """ - return cast(Any, Union).__getitem__(types) # type: ignore + """Make a Union type.""" + return Union.__getitem__(types) # type: ignore -def expand_unions( - type_: Type[Any], include_union: bool = False, discard_none: bool = False -) -> Tuple[Type[Any], ...]: - """Return a type as a tuple of individual types, expanding for - ``Union`` types.""" +def includes_none(type_: Any) -> bool: + """Returns if the type annotation ``type_`` allows ``None``. + This function supports: + * forward refs + * unions + * pep593 - Annotated + * pep695 - TypeAliasType (does not support looking into + fw reference of other pep695) + * NewType + * plain types like ``int``, ``None``, etc + """ + if is_fwd_ref(type_): + return _de_optionalize_fwd_ref_union_types(type_, True) if is_union(type_): - typ = set(type_.__args__) + return any(includes_none(t) for t in get_args(type_)) + if is_pep593(type_): + return includes_none(get_args(type_)[0]) + if is_pep695(type_): + return any(includes_none(t) for t in pep695_values(type_)) + if is_newtype(type_): + return includes_none(type_.__supertype__) + return type_ in (NoneFwd, NoneType, None) - if discard_none: - typ.discard(NoneType) - if include_union: - return (type_,) + tuple(typ) # type: ignore - else: - return tuple(typ) # type: ignore - else: - return (type_,) - - -def is_optional(type_: Any) -> TypeGuard[ArgsTypeProcotol]: - return is_origin_of( - type_, - "Optional", - "Union", - "UnionType", - ) - - -def is_optional_union(type_: Any) -> bool: - return is_optional(type_) and NoneType in typing_get_args(type_) - - -def is_union(type_: Any) -> TypeGuard[ArgsTypeProcotol]: - return is_origin_of(type_, "Union") +def is_union(type_: Any) -> TypeGuard[ArgsTypeProtocol]: + return is_origin_of(type_, "Union", "UnionType") def is_origin_of_cls( @@ -521,7 +584,7 @@ def is_origin_of_cls( """return True if the given type has an __origin__ that shares a base with the given class""" - origin = typing_get_origin(type_) + origin = get_origin(type_) if origin is None: return False @@ -534,7 +597,7 @@ def is_origin_of( """return True if the given type has an __origin__ with the given name and optional module.""" - origin = typing_get_origin(type_) + origin = get_origin(type_) if origin is None: return False @@ -624,6 +687,3 @@ def __get__(self, instance: object, owner: Any) -> _FN: ... def __set__(self, instance: Any, value: _FN) -> None: ... def __delete__(self, instance: Any) -> None: ... - - -# $def ro_descriptor_reference(fn: Callable[]) diff --git a/libs/version.txt b/libs/version.txt index 220a85d6b..3690c2697 100644 --- a/libs/version.txt +++ b/libs/version.txt @@ -1,7 +1,7 @@ # Bazarr dependencies alembic==1.14.0 -aniso8601==9.0.1 -apprise==1.9.1 +aniso8601==10.0.0 +apprise==1.9.2 apscheduler<=3.10.4 attrs==24.3.0 blinker==1.9.0 @@ -12,9 +12,9 @@ dynaconf==3.2.6 fese==0.3.0 ffsubsync==0.4.27 flask-cors==5.0.0 -flask-migrate==4.0.7 +flask-migrate==4.1.0 flask-restx==1.3.0 -Flask-SocketIO==5.5.0 +Flask-SocketIO==5.5.1 flask_sqlalchemy==3.1.1 Flask==3.1.0 ga4mp==2.0.4 @@ -28,8 +28,8 @@ Mako==1.3.8 pycountry==24.6.1 pyrsistent==0.20.0 pysubs2==1.8.0 -python-engineio==4.11.1 -python-socketio==5.12.0 +python-engineio==4.11.2 +python-socketio==5.12.1 pytz==2024.2 pytz_deprecation_shim==0.1.0.post0 rarfile==4.2 @@ -38,7 +38,7 @@ requests==2.32.3 semver==3.0.2 signalrcore==0.9.5 simple-websocket==1.1.0 -sqlalchemy==2.0.36 +sqlalchemy==2.0.37 textdistance==4.6.3 unidecode==1.3.8 waitress==3.0.2 @@ -76,7 +76,7 @@ werkzeug==3.1.3 # Required-by: guessit python-dateutil==2.9.0 -importlib_resources==6.4.5 +importlib_resources==6.5.2 rebulk==3.2.0 zipp==3.21.0 @@ -142,7 +142,7 @@ urllib3==2.3.0 # Required-by: rich colorama==0.4.6 commonmark==0.9.1 -Pygments==2.18.0 +Pygments==2.19.1 # Required-by: websocket pysocks==1.7.1 From 2b7ba46ef26ad757c43f82b4df5b3d815bd1a19e Mon Sep 17 00:00:00 2001 From: morpheus65535 <louis_vezina@hotmail.com> Date: Sat, 18 Jan 2025 09:56:13 -0500 Subject: [PATCH 7/7] wip --- libs/semver-3.0.3.dist-info/INSTALLER | 1 + libs/semver-3.0.3.dist-info/LICENSE.txt | 27 +++ libs/semver-3.0.3.dist-info/METADATA | 164 +++++++++++++++++++ libs/semver-3.0.3.dist-info/RECORD | 17 ++ libs/semver-3.0.3.dist-info/REQUESTED | 0 libs/semver-3.0.3.dist-info/WHEEL | 5 + libs/semver-3.0.3.dist-info/entry_points.txt | 2 + libs/semver-3.0.3.dist-info/top_level.txt | 1 + libs/semver/__about__.py | 2 +- libs/semver/__main__.py | 1 + libs/semver/_deprecated.py | 1 + libs/semver/version.py | 26 ++- libs/version.txt | 2 +- 13 files changed, 233 insertions(+), 16 deletions(-) create mode 100644 libs/semver-3.0.3.dist-info/INSTALLER create mode 100644 libs/semver-3.0.3.dist-info/LICENSE.txt create mode 100644 libs/semver-3.0.3.dist-info/METADATA create mode 100644 libs/semver-3.0.3.dist-info/RECORD create mode 100644 libs/semver-3.0.3.dist-info/REQUESTED create mode 100644 libs/semver-3.0.3.dist-info/WHEEL create mode 100644 libs/semver-3.0.3.dist-info/entry_points.txt create mode 100644 libs/semver-3.0.3.dist-info/top_level.txt diff --git a/libs/semver-3.0.3.dist-info/INSTALLER b/libs/semver-3.0.3.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/libs/semver-3.0.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/libs/semver-3.0.3.dist-info/LICENSE.txt b/libs/semver-3.0.3.dist-info/LICENSE.txt new file mode 100644 index 000000000..bbb09286b --- /dev/null +++ b/libs/semver-3.0.3.dist-info/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2013, Konstantine Rybnikov +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 python-semver org 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/libs/semver-3.0.3.dist-info/METADATA b/libs/semver-3.0.3.dist-info/METADATA new file mode 100644 index 000000000..ecfecb477 --- /dev/null +++ b/libs/semver-3.0.3.dist-info/METADATA @@ -0,0 +1,164 @@ +Metadata-Version: 2.1 +Name: semver +Version: 3.0.3 +Summary: Python helper for Semantic Versioning (https://semver.org) +Author-email: Kostiantyn Rybnikov <k-bx@k-bx.com>, Tom Schraitle <toms@suse.de> +Maintainer-email: Tom Schraitle <toms@suse.de>, Sebastien Celles <s.celles@gmail.com> +License: Copyright (c) 2013, Konstantine Rybnikov + 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 python-semver org 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. + +Project-URL: GitHub Homepage, https://github.com/python-semver/python-semver +Project-URL: Changelog, https://python-semver.readthedocs.io/en/latest/changelog.html +Project-URL: Documentation, https://python-semver.rtfd.io +Project-URL: Releases, https://github.com/python-semver/python-semver/releases +Project-URL: Bug Tracker, https://github.com/python-semver/python-semver/issues +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Development Status :: 5 - Production/Stable +Classifier: Operating System :: OS Independent +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 :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE.txt + +Quickstart +========== + +.. teaser-begin + +A Python module to simplify `semantic versioning`_. + +|GHAction| |python-support| |downloads| |license| |docs| |black| +|openissues| |GHDiscussion| + +.. teaser-end + +The module follows the ``MAJOR.MINOR.PATCH`` style: + +* ``MAJOR`` version when you make incompatible API changes, +* ``MINOR`` version when you add functionality in a backwards compatible manner, and +* ``PATCH`` version when you make backwards compatible bug fixes. + +Additional labels for pre-release and build metadata are supported. + +To import this library, use: + +.. code-block:: python + + >>> import semver + +Working with the library is quite straightforward. To turn a version string into the +different parts, use the ``semver.Version.parse`` function: + +.. code-block:: python + + >>> ver = semver.Version.parse('1.2.3-pre.2+build.4') + >>> ver.major + 1 + >>> ver.minor + 2 + >>> ver.patch + 3 + >>> ver.prerelease + 'pre.2' + >>> ver.build + 'build.4' + +To raise parts of a version, there are a couple of functions available for +you. The function ``semver.Version.bump_major`` leaves the original object untouched, but +returns a new ``semver.Version`` instance with the raised major part: + +.. code-block:: python + + >>> ver = semver.Version.parse("3.4.5") + >>> ver.bump_major() + Version(major=4, minor=0, patch=0, prerelease=None, build=None) + +It is allowed to concatenate different "bump functions": + +.. code-block:: python + + >>> ver.bump_major().bump_minor() + Version(major=4, minor=1, patch=0, prerelease=None, build=None) + +To compare two versions, semver provides the ``semver.compare`` function. +The return value indicates the relationship between the first and second +version: + +.. code-block:: python + + >>> semver.compare("1.0.0", "2.0.0") + -1 + >>> semver.compare("2.0.0", "1.0.0") + 1 + >>> semver.compare("2.0.0", "2.0.0") + 0 + + +There are other functions to discover. Read on! + + +.. |latest-version| image:: https://img.shields.io/pypi/v/semver.svg + :alt: Latest version on PyPI + :target: https://pypi.org/project/semver +.. |python-support| image:: https://img.shields.io/pypi/pyversions/semver.svg + :target: https://pypi.org/project/semver + :alt: Python versions +.. |downloads| image:: https://img.shields.io/pypi/dm/semver.svg + :alt: Monthly downloads from PyPI + :target: https://pypi.org/project/semver +.. |license| image:: https://img.shields.io/pypi/l/semver.svg + :alt: Software license + :target: https://github.com/python-semver/python-semver/blob/master/LICENSE.txt +.. |docs| image:: https://readthedocs.org/projects/python-semver/badge/?version=latest + :target: http://python-semver.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status +.. _semantic versioning: https://semver.org/ +.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Black Formatter +.. |Gitter| image:: https://badges.gitter.im/python-semver/community.svg + :target: https://gitter.im/python-semver/community + :alt: Gitter +.. |openissues| image:: http://isitmaintained.com/badge/open/python-semver/python-semver.svg + :target: http://isitmaintained.com/project/python-semver/python-semver + :alt: Percentage of open issues +.. |GHAction| image:: https://github.com/python-semver/python-semver/workflows/Python/badge.svg + :alt: Python +.. |GHDiscussion| image:: https://shields.io/badge/GitHub-%20Discussions-green?logo=github + :target: https://github.com/python-semver/python-semver/discussions + :alt: GitHub Discussion diff --git a/libs/semver-3.0.3.dist-info/RECORD b/libs/semver-3.0.3.dist-info/RECORD new file mode 100644 index 000000000..8b4509523 --- /dev/null +++ b/libs/semver-3.0.3.dist-info/RECORD @@ -0,0 +1,17 @@ +../../bin/pysemver,sha256=T_UCyWjf8mX-i7Yu0yebC7wo7V50JeJbv-9n9YAeQ-M,232 +semver-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +semver-3.0.3.dist-info/LICENSE.txt,sha256=zBAXnenO2GVdd2W9OorEZDimHmY9588cSNUC0rr589U,1499 +semver-3.0.3.dist-info/METADATA,sha256=Ef24P39KoAY1-_E45BgQyIbVSsf5h5SHWdoEIMeTeno,6777 +semver-3.0.3.dist-info/RECORD,, +semver-3.0.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +semver-3.0.3.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91 +semver-3.0.3.dist-info/entry_points.txt,sha256=QsWAwfEwq2bdJmY8lmGFjnvA1gi8_tHqQRZTyxr9CIg,45 +semver-3.0.3.dist-info/top_level.txt,sha256=oFJ1J3NJzsV1x-L91Xz4FBlYpVqO-Cr4UEfj-hGvqq0,7 +semver/__about__.py,sha256=lBkzYrR2i_6yRSVyQgNmsnlJMFs6h2k_IIrEqpZ9EF0,815 +semver/__init__.py,sha256=RRBj6kuuYaCY5B9gLxwE0h7meBwurYEbfQZnv7t1kKM,1269 +semver/__main__.py,sha256=msULq4Lb0AV8K4rulhm0FzzJO8oMCv52GjcTG2t8iws,593 +semver/_deprecated.py,sha256=OOX-AeaY-QqJK2gQGE8pdJExh_13TP-9ASZAkgqCmt4,11273 +semver/_types.py,sha256=-AfazZgnmmMe7WthSx_M-w1BCnq2dPFmysjmtTOm1oc,422 +semver/cli.py,sha256=HwvpnqcN95G3OINU4cLgouRHCtWhRsuKghfhPWtGOew,5189 +semver/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +semver/version.py,sha256=jpY4CRicE6pD0H-adnnEqQ-mjRkRtMY9XSPt6tneaL8,24041 diff --git a/libs/semver-3.0.3.dist-info/REQUESTED b/libs/semver-3.0.3.dist-info/REQUESTED new file mode 100644 index 000000000..e69de29bb diff --git a/libs/semver-3.0.3.dist-info/WHEEL b/libs/semver-3.0.3.dist-info/WHEEL new file mode 100644 index 000000000..9b78c4451 --- /dev/null +++ b/libs/semver-3.0.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.3.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/libs/semver-3.0.3.dist-info/entry_points.txt b/libs/semver-3.0.3.dist-info/entry_points.txt new file mode 100644 index 000000000..ae89e4366 --- /dev/null +++ b/libs/semver-3.0.3.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +pysemver = semver.cli:main diff --git a/libs/semver-3.0.3.dist-info/top_level.txt b/libs/semver-3.0.3.dist-info/top_level.txt new file mode 100644 index 000000000..f4ded6385 --- /dev/null +++ b/libs/semver-3.0.3.dist-info/top_level.txt @@ -0,0 +1 @@ +semver diff --git a/libs/semver/__about__.py b/libs/semver/__about__.py index a0d9cf90f..d971e0382 100644 --- a/libs/semver/__about__.py +++ b/libs/semver/__about__.py @@ -16,7 +16,7 @@ """ #: Semver version -__version__ = "3.0.2" +__version__ = "3.0.3" #: Original semver author __author__ = "Kostiantyn Rybnikov" diff --git a/libs/semver/__main__.py b/libs/semver/__main__.py index 6cb11f091..c6adb834c 100644 --- a/libs/semver/__main__.py +++ b/libs/semver/__main__.py @@ -9,6 +9,7 @@ $ python3 semver-3*-py3-none-any.whl/semver -h """ + import os.path import sys from typing import List, Optional diff --git a/libs/semver/_deprecated.py b/libs/semver/_deprecated.py index efbdf4395..df11bb022 100644 --- a/libs/semver/_deprecated.py +++ b/libs/semver/_deprecated.py @@ -3,6 +3,7 @@ .. autofunction: deprecated """ + import inspect import warnings from functools import partial, wraps diff --git a/libs/semver/version.py b/libs/semver/version.py index 29309ab40..0ff5b9f46 100644 --- a/libs/semver/version.py +++ b/libs/semver/version.py @@ -32,6 +32,7 @@ Comparator = Callable[["Version", Comparable], bool] T = TypeVar("T", bound="Version") +T_cmp = TypeVar("T_cmp", tuple, str, int) def _comparator(operator: Comparator) -> Comparator: @@ -40,7 +41,7 @@ def _comparator(operator: Comparator) -> Comparator: @wraps(operator) def wrapper(self: "Version", other: Comparable) -> bool: comparable_types = ( - Version, + type(self), dict, tuple, list, @@ -53,7 +54,7 @@ def wrapper(self: "Version", other: Comparable) -> bool: return wrapper -def _cmp(a, b): # TODO: type hints +def _cmp(a: T_cmp, b: T_cmp) -> int: """Return negative if a<b, zero if a==b, positive if a>b.""" return (a > b) - (a < b) @@ -137,7 +138,7 @@ def __init__( self._build = None if build is None else str(build) @classmethod - def _nat_cmp(cls, a, b): # TODO: type hints + def _nat_cmp(cls, a: Optional[str], b: Optional[str]) -> int: def cmp_prerelease_tag(a, b): if isinstance(a, int) and isinstance(b, int): return _cmp(a, b) @@ -148,16 +149,15 @@ def cmp_prerelease_tag(a, b): else: return _cmp(a, b) - a, b = a or "", b or "" - a_parts, b_parts = a.split("."), b.split(".") - a_parts = [int(x) if re.match(r"^\d+$", x) else x for x in a_parts] - b_parts = [int(x) if re.match(r"^\d+$", x) else x for x in b_parts] + a_parts = [int(x) if x.isdigit() else x for x in (a or "").split(".")] + b_parts = [int(x) if x.isdigit() else x for x in (b or "").split(".")] + for sub_a, sub_b in zip(a_parts, b_parts): cmp_result = cmp_prerelease_tag(sub_a, sub_b) if cmp_result != 0: return cmp_result - else: - return _cmp(len(a), len(b)) + + return _cmp(len(a_parts), len(b_parts)) @property def major(self) -> int: @@ -382,13 +382,11 @@ def compare(self, other: Comparable) -> int: :return: The return value is negative if ver1 < ver2, zero if ver1 == ver2 and strictly positive if ver1 > ver2 - >>> semver.compare("2.0.0") + >>> Version.parse("1.0.0").compare("2.0.0") -1 - >>> semver.compare("1.0.0") + >>> Version.parse("2.0.0").compare("1.0.0") 1 - >>> semver.compare("2.0.0") - 0 - >>> semver.compare(dict(major=2, minor=0, patch=0)) + >>> Version.parse("2.0.0").compare("2.0.0") 0 """ cls = type(self) diff --git a/libs/version.txt b/libs/version.txt index 3690c2697..7311ddbbc 100644 --- a/libs/version.txt +++ b/libs/version.txt @@ -35,7 +35,7 @@ pytz_deprecation_shim==0.1.0.post0 rarfile==4.2 referencing<=0.23.0 # newer version require other compiled dependency requests==2.32.3 -semver==3.0.2 +semver==3.0.3 signalrcore==0.9.5 simple-websocket==1.1.0 sqlalchemy==2.0.37